@polyxd/core 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/LICENSE +202 -0
- package/NOTICE +190 -0
- package/README.md +43 -0
- package/dist/actionbar.d.ts +20 -0
- package/dist/actionbar.js +34 -0
- package/dist/actionbar.js.map +1 -0
- package/dist/actions.d.ts +24 -0
- package/dist/actions.js +33 -0
- package/dist/actions.js.map +1 -0
- package/dist/avatar.d.ts +13 -0
- package/dist/avatar.js +63 -0
- package/dist/avatar.js.map +1 -0
- package/dist/chart.d.ts +41 -0
- package/dist/chart.js +106 -0
- package/dist/chart.js.map +1 -0
- package/dist/choice.d.ts +35 -0
- package/dist/choice.js +32 -0
- package/dist/choice.js.map +1 -0
- package/dist/collection.d.ts +54 -0
- package/dist/collection.js +61 -0
- package/dist/collection.js.map +1 -0
- package/dist/color.d.ts +20 -0
- package/dist/color.js +105 -0
- package/dist/color.js.map +1 -0
- package/dist/comparison.d.ts +21 -0
- package/dist/comparison.js +51 -0
- package/dist/comparison.js.map +1 -0
- package/dist/data.d.ts +30 -0
- package/dist/data.js +67 -0
- package/dist/data.js.map +1 -0
- package/dist/document.d.ts +64 -0
- package/dist/document.js +18 -0
- package/dist/document.js.map +1 -0
- package/dist/files.d.ts +18 -0
- package/dist/files.js +64 -0
- package/dist/files.js.map +1 -0
- package/dist/filter.d.ts +17 -0
- package/dist/filter.js +55 -0
- package/dist/filter.js.map +1 -0
- package/dist/format.d.ts +21 -0
- package/dist/format.js +81 -0
- package/dist/format.js.map +1 -0
- package/dist/frame.d.ts +21 -0
- package/dist/frame.js +30 -0
- package/dist/frame.js.map +1 -0
- package/dist/ids.d.ts +4 -0
- package/dist/ids.js +8 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/marks.d.ts +48 -0
- package/dist/marks.js +57 -0
- package/dist/marks.js.map +1 -0
- package/dist/mask.d.ts +10 -0
- package/dist/mask.js +40 -0
- package/dist/mask.js.map +1 -0
- package/dist/options.d.ts +11 -0
- package/dist/options.js +21 -0
- package/dist/options.js.map +1 -0
- package/dist/qr.d.ts +3 -0
- package/dist/qr.js +242 -0
- package/dist/qr.js.map +1 -0
- package/dist/richtext.d.ts +17 -0
- package/dist/richtext.js +59 -0
- package/dist/richtext.js.map +1 -0
- package/dist/shortcuts.d.ts +32 -0
- package/dist/shortcuts.js +59 -0
- package/dist/shortcuts.js.map +1 -0
- package/dist/skeleton.d.ts +22 -0
- package/dist/skeleton.js +32 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/split.d.ts +53 -0
- package/dist/split.js +55 -0
- package/dist/split.js.map +1 -0
- package/dist/steps.d.ts +32 -0
- package/dist/steps.js +24 -0
- package/dist/steps.js.map +1 -0
- package/dist/surface.d.ts +52 -0
- package/dist/surface.js +64 -0
- package/dist/surface.js.map +1 -0
- package/dist/table.d.ts +34 -0
- package/dist/table.js +30 -0
- package/dist/table.js.map +1 -0
- package/dist/tree.d.ts +58 -0
- package/dist/tree.js +93 -0
- package/dist/tree.js.map +1 -0
- package/dist/views.d.ts +11 -0
- package/dist/views.js +10 -0
- package/dist/views.js.map +1 -0
- package/package.json +36 -0
package/dist/marks.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** The small marks: a metric's change, a gauge's state, a rating's words, a code block's mask. */
|
|
2
|
+
import { type Format } from "./format.ts";
|
|
3
|
+
export interface MetricChange {
|
|
4
|
+
/** Shown: "▲ 8%" */
|
|
5
|
+
text: string;
|
|
6
|
+
/** Read: "up 8%" */
|
|
7
|
+
spoken: string;
|
|
8
|
+
tone: "positive" | "negative" | "neutral";
|
|
9
|
+
}
|
|
10
|
+
/** A change is good or bad depending on which way is favourable; zero is neither. */
|
|
11
|
+
export declare function metricChange(raw: unknown, favorable: string | undefined, format: Format | undefined, locale: string): MetricChange | undefined;
|
|
12
|
+
/** What a meter's tone means, said in words next to the readout. */
|
|
13
|
+
export declare function meterHint(fraction: number, thresholds: {
|
|
14
|
+
warning?: number;
|
|
15
|
+
danger?: number;
|
|
16
|
+
} | undefined): {
|
|
17
|
+
tone?: string;
|
|
18
|
+
hint?: string;
|
|
19
|
+
};
|
|
20
|
+
export interface GaugeState {
|
|
21
|
+
fraction: number;
|
|
22
|
+
percent: number;
|
|
23
|
+
/** The real amount and bound when there is one, otherwise a percentage */
|
|
24
|
+
valueProps: Record<string, number | string | boolean>;
|
|
25
|
+
readout: string;
|
|
26
|
+
tone?: string;
|
|
27
|
+
hint?: string;
|
|
28
|
+
valuetext: string;
|
|
29
|
+
indeterminate: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** A progress bar's or meter's numbers, from its value, bound and thresholds. */
|
|
32
|
+
export declare function gaugeState(node: {
|
|
33
|
+
kind?: string;
|
|
34
|
+
thresholds?: any;
|
|
35
|
+
tone?: string;
|
|
36
|
+
format?: Format;
|
|
37
|
+
}, rawValue: unknown, rawMax: unknown, indeterminate: boolean, caption: string | undefined, locale: string): GaugeState;
|
|
38
|
+
export declare const starsLabel: (n: number) => string;
|
|
39
|
+
/** A read-only rating as an image is named: "4.6 out of 5", or "not yet rated". */
|
|
40
|
+
export declare const ratingSaid: (scoreText: string | undefined, max: number) => string;
|
|
41
|
+
/** A secret is masked to the same length until shown. */
|
|
42
|
+
export declare const maskSecret: (text: string) => string;
|
|
43
|
+
/** The identity size names and their pixels. */
|
|
44
|
+
export declare const IDENTITY_SIZE: Record<string, number>;
|
|
45
|
+
/** A group's summary when the host gives none: first names and how many more. */
|
|
46
|
+
export declare function groupSummary(members: {
|
|
47
|
+
name: string;
|
|
48
|
+
}[], max: number): string;
|
package/dist/marks.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** The small marks: a metric's change, a gauge's state, a rating's words, a code block's mask. */
|
|
2
|
+
import { formatValue } from "./format.js";
|
|
3
|
+
/** A change is good or bad depending on which way is favourable; zero is neither. */
|
|
4
|
+
export function metricChange(raw, favorable, format, locale) {
|
|
5
|
+
if (typeof raw !== "number")
|
|
6
|
+
return undefined;
|
|
7
|
+
const fav = favorable ?? "increase";
|
|
8
|
+
const dir = raw > 0 ? "up" : raw < 0 ? "down" : "unchanged";
|
|
9
|
+
const tone = fav === "none" || raw === 0 ? "neutral" : (raw > 0) === (fav === "increase") ? "positive" : "negative";
|
|
10
|
+
const amount = formatValue(Math.abs(raw), format, locale);
|
|
11
|
+
return { text: `${raw > 0 ? "▲" : raw < 0 ? "▼" : "■"} ${amount}`, spoken: dir === "unchanged" ? "unchanged" : `${dir} ${amount}`, tone };
|
|
12
|
+
}
|
|
13
|
+
/** What a meter's tone means, said in words next to the readout. */
|
|
14
|
+
export function meterHint(fraction, thresholds) {
|
|
15
|
+
if (fraction >= 1)
|
|
16
|
+
return { tone: "danger", hint: "full" };
|
|
17
|
+
if (thresholds?.danger !== undefined && fraction >= thresholds.danger)
|
|
18
|
+
return { tone: "danger", hint: "nearly full" };
|
|
19
|
+
if (thresholds?.warning !== undefined && fraction >= thresholds.warning)
|
|
20
|
+
return { tone: "warning", hint: "getting full" };
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
/** A progress bar's or meter's numbers, from its value, bound and thresholds. */
|
|
24
|
+
export function gaugeState(node, rawValue, rawMax, indeterminate, caption, locale) {
|
|
25
|
+
const value = typeof rawValue === "number" ? rawValue : Number(rawValue);
|
|
26
|
+
const m = rawMax !== undefined ? Number(rawMax) : undefined;
|
|
27
|
+
const max = m !== undefined && Number.isFinite(m) && m > 0 ? m : undefined;
|
|
28
|
+
const fraction = Number.isFinite(value) ? Math.max(0, Math.min(1, max !== undefined ? value / max : value)) : 0;
|
|
29
|
+
const readout = node.format ? formatValue(rawValue, node.format, locale) : formatValue(fraction, { type: "percent", precision: 0 }, locale);
|
|
30
|
+
const meter = node.kind === "meter";
|
|
31
|
+
const byThreshold = meter ? meterHint(fraction, node.thresholds) : {};
|
|
32
|
+
const tone = node.tone ?? byThreshold.tone;
|
|
33
|
+
const hint = meter ? byThreshold.hint : undefined;
|
|
34
|
+
const valuetext = [readout, caption, hint].filter(Boolean).join(", ");
|
|
35
|
+
const percent = Math.round(fraction * 100);
|
|
36
|
+
const valueProps = indeterminate
|
|
37
|
+
? { "aria-busy": true }
|
|
38
|
+
: max !== undefined
|
|
39
|
+
? { "aria-valuemin": 0, "aria-valuemax": max, "aria-valuenow": Number.isFinite(value) ? value : 0, "aria-valuetext": valuetext }
|
|
40
|
+
: { "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": percent, "aria-valuetext": valuetext };
|
|
41
|
+
return { fraction, percent, valueProps, readout, tone, hint, valuetext, indeterminate };
|
|
42
|
+
}
|
|
43
|
+
export const starsLabel = (n) => `${n} ${n === 1 ? "star" : "stars"}`;
|
|
44
|
+
/** A read-only rating as an image is named: "4.6 out of 5", or "not yet rated". */
|
|
45
|
+
export const ratingSaid = (scoreText, max) => (scoreText !== undefined ? `${scoreText} out of ${max}` : "not yet rated");
|
|
46
|
+
/** A secret is masked to the same length until shown. */
|
|
47
|
+
export const maskSecret = (text) => text.replace(/[^\s]/g, "•");
|
|
48
|
+
/** The identity size names and their pixels. */
|
|
49
|
+
export const IDENTITY_SIZE = { small: 24, default: 40, large: 64 };
|
|
50
|
+
/** A group's summary when the host gives none: first names and how many more. */
|
|
51
|
+
export function groupSummary(members, max) {
|
|
52
|
+
const first = (n) => n.split(/\s+/)[0] || n;
|
|
53
|
+
const shown = members.slice(0, max);
|
|
54
|
+
const rest = members.slice(max);
|
|
55
|
+
return rest.length ? `${shown.map((m) => first(m.name)).join(", ")} and ${rest.length} more` : shown.map((m) => first(m.name)).join(", ");
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=marks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marks.js","sourceRoot":"","sources":["../src/marks.ts"],"names":[],"mappings":"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"}
|
package/dist/mask.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Fills a mask as you type: # takes a digit, A a letter, * either; other characters are typed for you. */
|
|
2
|
+
export declare function applyMask(mask: string, text: string, deleting?: boolean): string;
|
|
3
|
+
/** A mask of digits only gets the numeric keyboard. */
|
|
4
|
+
export declare const maskIsNumeric: (mask: string) => boolean;
|
|
5
|
+
/** What a numeric text field writes: the number typed, or null when nothing (or not a number) was. */
|
|
6
|
+
export declare function numericValue(text: string): number | null;
|
|
7
|
+
/** What a numeric field shows when not being typed in: currency to two places. */
|
|
8
|
+
export declare const storedText: (raw: unknown, kind: string) => string;
|
|
9
|
+
/** Several short values: Enter or a comma makes a chip; the same value twice is one chip. */
|
|
10
|
+
export declare function addTag(tags: string[], draft: string): string[];
|
package/dist/mask.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Fills a mask as you type: # takes a digit, A a letter, * either; other characters are typed for you. */
|
|
2
|
+
export function applyMask(mask, text, deleting = false) {
|
|
3
|
+
const chars = text.replace(/[^A-Za-z0-9]/g, "").split("");
|
|
4
|
+
let out = "";
|
|
5
|
+
let ci = 0;
|
|
6
|
+
for (const m of mask) {
|
|
7
|
+
if (ci >= chars.length)
|
|
8
|
+
break;
|
|
9
|
+
if (m === "#" || m === "A" || m === "*") {
|
|
10
|
+
const ok = m === "#" ? /\d/ : m === "A" ? /[A-Za-z]/ : /./;
|
|
11
|
+
while (ci < chars.length && !ok.test(chars[ci]))
|
|
12
|
+
ci++;
|
|
13
|
+
if (ci >= chars.length)
|
|
14
|
+
break;
|
|
15
|
+
out += chars[ci++];
|
|
16
|
+
}
|
|
17
|
+
else
|
|
18
|
+
out += m;
|
|
19
|
+
}
|
|
20
|
+
// Deleting past a literal would put it straight back; drop trailing literals so Backspace moves on.
|
|
21
|
+
if (deleting)
|
|
22
|
+
while (out.length && !/[#A*]/.test(mask[out.length - 1]))
|
|
23
|
+
out = out.slice(0, -1);
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
/** A mask of digits only gets the numeric keyboard. */
|
|
27
|
+
export const maskIsNumeric = (mask) => !/[A*]/.test(mask);
|
|
28
|
+
/** What a numeric text field writes: the number typed, or null when nothing (or not a number) was. */
|
|
29
|
+
export function numericValue(text) {
|
|
30
|
+
const n = Number(text.replace(/[^\d.-]/g, ""));
|
|
31
|
+
return text.trim() === "" || Number.isNaN(n) ? null : n;
|
|
32
|
+
}
|
|
33
|
+
/** What a numeric field shows when not being typed in: currency to two places. */
|
|
34
|
+
export const storedText = (raw, kind) => (raw === null || raw === undefined ? "" : kind === "currency" && typeof raw === "number" ? raw.toFixed(2) : String(raw));
|
|
35
|
+
/** Several short values: Enter or a comma makes a chip; the same value twice is one chip. */
|
|
36
|
+
export function addTag(tags, draft) {
|
|
37
|
+
const t = draft.trim().replace(/,$/, "").trim();
|
|
38
|
+
return t && !tags.includes(t) ? [...tags, t] : tags;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=mask.js.map
|
package/dist/mask.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask.js","sourceRoot":"","sources":["../src/mask.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,QAAQ,GAAG,KAAK;IACpE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM;QAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACxC,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3D,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAAE,EAAE,EAAE,CAAC;YACtD,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM;gBAAE,MAAM;YAC9B,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACrB,CAAC;;YAAM,GAAG,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,oGAAoG;IACpG,IAAI,QAAQ;QAAE,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE3E,sGAAsG;AACtG,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,IAAY,EAAU,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAE3L,6FAA6F;AAC7F,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,KAAa;IAClD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** A Choice's (or a ColorInput's swatches') options, from literal options or host data. */
|
|
2
|
+
import { type Scope } from "./data.ts";
|
|
3
|
+
import type { Node } from "./document.ts";
|
|
4
|
+
export interface Option {
|
|
5
|
+
value: string | number | boolean;
|
|
6
|
+
label: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
avatar?: unknown;
|
|
9
|
+
recent?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function optionsOf(node: Node, data: unknown, scope: Scope, text: (v: unknown) => string): Option[];
|
package/dist/options.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** A Choice's (or a ColorInput's swatches') options, from literal options or host data. */
|
|
2
|
+
import { absolute, asList, childPointer, get } from "./data.js";
|
|
3
|
+
export function optionsOf(node, data, scope, text) {
|
|
4
|
+
const o = node.options;
|
|
5
|
+
if (Array.isArray(o))
|
|
6
|
+
return o.map((x) => ({ value: x.value, label: text(x.label), description: x.description !== undefined ? text(x.description) : undefined }));
|
|
7
|
+
const pointer = absolute(o.path, scope);
|
|
8
|
+
const items = asList(get(data, pointer));
|
|
9
|
+
return items.map((_, i) => {
|
|
10
|
+
const p = { pointer: childPointer(pointer, i) };
|
|
11
|
+
const at = (path) => (path ? get(data, absolute(path, p)) : undefined);
|
|
12
|
+
return {
|
|
13
|
+
value: at(o.valuePath),
|
|
14
|
+
label: String(at(o.labelPath) ?? ""),
|
|
15
|
+
description: o.descriptionPath ? String(at(o.descriptionPath) ?? "") || undefined : undefined,
|
|
16
|
+
avatar: o.avatarPath || o.imagePath ? at(o.avatarPath ?? o.imagePath) ?? "" : undefined,
|
|
17
|
+
recent: o.recentPath ? Boolean(at(o.recentPath)) : false,
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAc,MAAM,WAAW,CAAC;AAW5E,MAAM,UAAU,SAAS,CAAC,IAAU,EAAE,IAAa,EAAE,KAAY,EAAE,IAA4B;IAC7F,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACvB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACvK,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,EAAE,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChF,OAAO;YACL,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAW;YAChC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACpC,WAAW,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS;YAC7F,MAAM,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;YACvF,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;SACzD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/qr.d.ts
ADDED
package/dist/qr.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/** QR codes drawn by the renderer itself, so no URL leaves the surface. */
|
|
2
|
+
/* ---- QR codes: byte mode, error correction level M, versions 1–10 (up to 213 bytes). ---- */
|
|
3
|
+
/** Per version at level M: error-correction codewords per block, then [blocks, data codewords] groups. */
|
|
4
|
+
const QR_BLOCKS = [
|
|
5
|
+
[10, [[1, 16]]],
|
|
6
|
+
[16, [[1, 28]]],
|
|
7
|
+
[26, [[1, 44]]],
|
|
8
|
+
[18, [[2, 32]]],
|
|
9
|
+
[24, [[2, 43]]],
|
|
10
|
+
[16, [[4, 27]]],
|
|
11
|
+
[18, [[4, 31]]],
|
|
12
|
+
[22, [[2, 38], [2, 39]]],
|
|
13
|
+
[22, [[3, 36], [2, 37]]],
|
|
14
|
+
[26, [[4, 43], [1, 44]]],
|
|
15
|
+
];
|
|
16
|
+
const QR_ALIGN = [[], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50]];
|
|
17
|
+
function gfMul(x, y) {
|
|
18
|
+
let z = 0;
|
|
19
|
+
for (let i = 7; i >= 0; i--) {
|
|
20
|
+
z = (z << 1) ^ ((z >>> 7) * 0x11d);
|
|
21
|
+
z ^= ((y >>> i) & 1) * x;
|
|
22
|
+
}
|
|
23
|
+
return z & 0xff;
|
|
24
|
+
}
|
|
25
|
+
function rsRemainder(data, degree) {
|
|
26
|
+
const divisor = new Array(degree).fill(0);
|
|
27
|
+
divisor[degree - 1] = 1;
|
|
28
|
+
let root = 1;
|
|
29
|
+
for (let i = 0; i < degree; i++) {
|
|
30
|
+
for (let j = 0; j < degree; j++) {
|
|
31
|
+
divisor[j] = gfMul(divisor[j], root);
|
|
32
|
+
if (j + 1 < degree)
|
|
33
|
+
divisor[j] ^= divisor[j + 1];
|
|
34
|
+
}
|
|
35
|
+
root = gfMul(root, 2);
|
|
36
|
+
}
|
|
37
|
+
const result = new Array(degree).fill(0);
|
|
38
|
+
for (const byte of data) {
|
|
39
|
+
const factor = byte ^ result.shift();
|
|
40
|
+
result.push(0);
|
|
41
|
+
divisor.forEach((coef, i) => (result[i] ^= gfMul(coef, factor)));
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
const QR_MASKS = [
|
|
46
|
+
(x, y) => (x + y) % 2 === 0,
|
|
47
|
+
(_x, y) => y % 2 === 0,
|
|
48
|
+
(x) => x % 3 === 0,
|
|
49
|
+
(x, y) => (x + y) % 3 === 0,
|
|
50
|
+
(x, y) => (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0,
|
|
51
|
+
(x, y) => ((x * y) % 2) + ((x * y) % 3) === 0,
|
|
52
|
+
(x, y) => (((x * y) % 2) + ((x * y) % 3)) % 2 === 0,
|
|
53
|
+
(x, y) => (((x + y) % 2) + ((x * y) % 3)) % 2 === 0,
|
|
54
|
+
];
|
|
55
|
+
/** The module grid for a text, or undefined when it is longer than version 10 holds. */
|
|
56
|
+
export function qrEncode(text) {
|
|
57
|
+
const bytes = Array.from(new TextEncoder().encode(text));
|
|
58
|
+
let version = 0;
|
|
59
|
+
let dataCodewords = 0;
|
|
60
|
+
for (let v = 1; v <= 10 && !version; v++) {
|
|
61
|
+
const total = QR_BLOCKS[v - 1][1].reduce((a, [n, len]) => a + n * len, 0);
|
|
62
|
+
if (4 + (v < 10 ? 8 : 16) + bytes.length * 8 <= total * 8)
|
|
63
|
+
(version = v), (dataCodewords = total);
|
|
64
|
+
}
|
|
65
|
+
if (!version)
|
|
66
|
+
return undefined;
|
|
67
|
+
const [ecPerBlock, groups] = QR_BLOCKS[version - 1];
|
|
68
|
+
// Bit stream: mode, count, data, terminator, byte alignment, pad codewords.
|
|
69
|
+
const bits = [];
|
|
70
|
+
const push = (val, n) => {
|
|
71
|
+
for (let i = n - 1; i >= 0; i--)
|
|
72
|
+
bits.push((val >>> i) & 1);
|
|
73
|
+
};
|
|
74
|
+
push(4, 4);
|
|
75
|
+
push(bytes.length, version < 10 ? 8 : 16);
|
|
76
|
+
for (const b of bytes)
|
|
77
|
+
push(b, 8);
|
|
78
|
+
const capacity = dataCodewords * 8;
|
|
79
|
+
push(0, Math.min(4, capacity - bits.length));
|
|
80
|
+
while (bits.length % 8)
|
|
81
|
+
bits.push(0);
|
|
82
|
+
for (let pad = 0xec; bits.length < capacity; pad ^= 0xec ^ 0x11)
|
|
83
|
+
push(pad, 8);
|
|
84
|
+
const data = [];
|
|
85
|
+
for (let i = 0; i < bits.length; i += 8)
|
|
86
|
+
data.push(bits.slice(i, i + 8).reduce((a, bit) => (a << 1) | bit, 0));
|
|
87
|
+
// Blocks with their error correction, interleaved.
|
|
88
|
+
const blocks = [];
|
|
89
|
+
let k = 0;
|
|
90
|
+
for (const [count, len] of groups) {
|
|
91
|
+
for (let i = 0; i < count; i++) {
|
|
92
|
+
const d = data.slice(k, k + len);
|
|
93
|
+
blocks.push({ d, e: rsRemainder(d, ecPerBlock) });
|
|
94
|
+
k += len;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const codewords = [];
|
|
98
|
+
const longest = Math.max(...blocks.map((bl) => bl.d.length));
|
|
99
|
+
for (let i = 0; i < longest; i++)
|
|
100
|
+
for (const bl of blocks)
|
|
101
|
+
if (i < bl.d.length)
|
|
102
|
+
codewords.push(bl.d[i]);
|
|
103
|
+
for (let i = 0; i < ecPerBlock; i++)
|
|
104
|
+
for (const bl of blocks)
|
|
105
|
+
codewords.push(bl.e[i]);
|
|
106
|
+
// The grid, with function patterns marked so data and masks leave them alone.
|
|
107
|
+
const size = version * 4 + 17;
|
|
108
|
+
const grid = Array.from({ length: size }, () => new Array(size).fill(false));
|
|
109
|
+
const isFn = Array.from({ length: size }, () => new Array(size).fill(false));
|
|
110
|
+
const set = (x, y, dark) => {
|
|
111
|
+
if (x >= 0 && y >= 0 && x < size && y < size)
|
|
112
|
+
(grid[y][x] = dark), (isFn[y][x] = true);
|
|
113
|
+
};
|
|
114
|
+
for (let i = 0; i < size; i++)
|
|
115
|
+
(set(6, i, i % 2 === 0), set(i, 6, i % 2 === 0));
|
|
116
|
+
const finder = (cx, cy) => {
|
|
117
|
+
for (let dy = -4; dy <= 4; dy++)
|
|
118
|
+
for (let dx = -4; dx <= 4; dx++) {
|
|
119
|
+
const dist = Math.max(Math.abs(dx), Math.abs(dy));
|
|
120
|
+
set(cx + dx, cy + dy, dist !== 2 && dist !== 4);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
finder(3, 3);
|
|
124
|
+
finder(size - 4, 3);
|
|
125
|
+
finder(3, size - 4);
|
|
126
|
+
const positions = QR_ALIGN[version - 1];
|
|
127
|
+
const last = positions.length - 1;
|
|
128
|
+
positions.forEach((px, i) => positions.forEach((py, j) => {
|
|
129
|
+
if ((i === 0 && j === 0) || (i === 0 && j === last) || (i === last && j === 0))
|
|
130
|
+
return;
|
|
131
|
+
for (let dy = -2; dy <= 2; dy++)
|
|
132
|
+
for (let dx = -2; dx <= 2; dx++)
|
|
133
|
+
set(px + dx, py + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);
|
|
134
|
+
}));
|
|
135
|
+
const formatBits = (mask) => {
|
|
136
|
+
const d = mask; // level M is 00
|
|
137
|
+
let rem = d;
|
|
138
|
+
for (let i = 0; i < 10; i++)
|
|
139
|
+
rem = (rem << 1) ^ ((rem >>> 9) * 0x537);
|
|
140
|
+
const f = ((d << 10) | rem) ^ 0x5412;
|
|
141
|
+
const bit = (i) => ((f >>> i) & 1) === 1;
|
|
142
|
+
for (let i = 0; i <= 5; i++)
|
|
143
|
+
set(8, i, bit(i));
|
|
144
|
+
set(8, 7, bit(6));
|
|
145
|
+
set(8, 8, bit(7));
|
|
146
|
+
set(7, 8, bit(8));
|
|
147
|
+
for (let i = 9; i < 15; i++)
|
|
148
|
+
set(14 - i, 8, bit(i));
|
|
149
|
+
for (let i = 0; i < 8; i++)
|
|
150
|
+
set(size - 1 - i, 8, bit(i));
|
|
151
|
+
for (let i = 8; i < 15; i++)
|
|
152
|
+
set(8, size - 15 + i, bit(i));
|
|
153
|
+
set(8, size - 8, true);
|
|
154
|
+
};
|
|
155
|
+
formatBits(0);
|
|
156
|
+
if (version >= 7) {
|
|
157
|
+
let rem = version;
|
|
158
|
+
for (let i = 0; i < 12; i++)
|
|
159
|
+
rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25);
|
|
160
|
+
const v = (version << 12) | rem;
|
|
161
|
+
for (let i = 0; i < 18; i++) {
|
|
162
|
+
const bit = ((v >>> i) & 1) === 1;
|
|
163
|
+
const a = size - 11 + (i % 3);
|
|
164
|
+
const c = Math.floor(i / 3);
|
|
165
|
+
set(a, c, bit);
|
|
166
|
+
set(c, a, bit);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Codewords zigzag upward and downward in two-module columns from the right, skipping the timing column.
|
|
170
|
+
let bi = 0;
|
|
171
|
+
for (let right = size - 1; right >= 1; right -= 2) {
|
|
172
|
+
if (right === 6)
|
|
173
|
+
right = 5;
|
|
174
|
+
for (let vert = 0; vert < size; vert++) {
|
|
175
|
+
for (let j = 0; j < 2; j++) {
|
|
176
|
+
const x = right - j;
|
|
177
|
+
const y = ((right + 1) & 2) === 0 ? size - 1 - vert : vert;
|
|
178
|
+
if (!isFn[y][x] && bi < codewords.length * 8) {
|
|
179
|
+
grid[y][x] = ((codewords[bi >>> 3] >>> (7 - (bi & 7))) & 1) === 1;
|
|
180
|
+
bi++;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// The mask with the lowest penalty.
|
|
186
|
+
const apply = (mask) => {
|
|
187
|
+
for (let y = 0; y < size; y++)
|
|
188
|
+
for (let x = 0; x < size; x++)
|
|
189
|
+
if (!isFn[y][x] && QR_MASKS[mask](x, y))
|
|
190
|
+
grid[y][x] = !grid[y][x];
|
|
191
|
+
};
|
|
192
|
+
const penalty = () => {
|
|
193
|
+
let p = 0;
|
|
194
|
+
const line = (cells) => {
|
|
195
|
+
let run = 0;
|
|
196
|
+
let prev = null;
|
|
197
|
+
cells.forEach((c, i) => {
|
|
198
|
+
if (c === prev) {
|
|
199
|
+
run++;
|
|
200
|
+
if (run === 5)
|
|
201
|
+
p += 3;
|
|
202
|
+
else if (run > 5)
|
|
203
|
+
p += 1;
|
|
204
|
+
}
|
|
205
|
+
else
|
|
206
|
+
(prev = c), (run = 1);
|
|
207
|
+
if (i + 7 <= cells.length) {
|
|
208
|
+
const seg = cells.slice(i, i + 7);
|
|
209
|
+
const finderLike = seg[0] && !seg[1] && seg[2] && seg[3] && seg[4] && !seg[5] && seg[6];
|
|
210
|
+
const lightBefore = i >= 4 && cells.slice(i - 4, i).every((c) => !c);
|
|
211
|
+
const lightAfter = i + 11 <= cells.length && cells.slice(i + 7, i + 11).every((c) => !c);
|
|
212
|
+
if (finderLike && (lightBefore || lightAfter))
|
|
213
|
+
p += 40;
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
};
|
|
217
|
+
for (let i = 0; i < size; i++)
|
|
218
|
+
(line(grid[i]), line(grid.map((row) => row[i])));
|
|
219
|
+
for (let y = 0; y < size - 1; y++)
|
|
220
|
+
for (let x = 0; x < size - 1; x++)
|
|
221
|
+
if (grid[y][x] === grid[y][x + 1] && grid[y][x] === grid[y + 1][x] && grid[y][x] === grid[y + 1][x + 1])
|
|
222
|
+
p += 3;
|
|
223
|
+
const dark = grid.flat().filter(Boolean).length;
|
|
224
|
+
const total = size * size;
|
|
225
|
+
p += (Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1) * 10;
|
|
226
|
+
return p;
|
|
227
|
+
};
|
|
228
|
+
let best = 0;
|
|
229
|
+
let bestScore = Infinity;
|
|
230
|
+
for (let m = 0; m < 8; m++) {
|
|
231
|
+
formatBits(m);
|
|
232
|
+
apply(m);
|
|
233
|
+
const score = penalty();
|
|
234
|
+
apply(m);
|
|
235
|
+
if (score < bestScore)
|
|
236
|
+
(bestScore = score), (best = m);
|
|
237
|
+
}
|
|
238
|
+
formatBits(best);
|
|
239
|
+
apply(best);
|
|
240
|
+
return grid;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=qr.js.map
|
package/dist/qr.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../src/qr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The limited markup of a 'rich' Text: **bold**, *italic*, `code` and [text](href). Parsed into
|
|
3
|
+
* tokens a renderer turns into elements, never injected as HTML, so anything else (including
|
|
4
|
+
* tags) is shown exactly as typed.
|
|
5
|
+
*/
|
|
6
|
+
export type RichToken = string | {
|
|
7
|
+
kind: "code";
|
|
8
|
+
text: string;
|
|
9
|
+
} | {
|
|
10
|
+
kind: "strong" | "em";
|
|
11
|
+
children: RichToken[];
|
|
12
|
+
} | {
|
|
13
|
+
kind: "link";
|
|
14
|
+
href?: string;
|
|
15
|
+
children: RichToken[];
|
|
16
|
+
};
|
|
17
|
+
export declare function richText(text: string): RichToken[];
|
package/dist/richtext.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The limited markup of a 'rich' Text: **bold**, *italic*, `code` and [text](href). Parsed into
|
|
3
|
+
* tokens a renderer turns into elements, never injected as HTML, so anything else (including
|
|
4
|
+
* tags) is shown exactly as typed.
|
|
5
|
+
*/
|
|
6
|
+
/** Only these link targets are live; anything else stays text. */
|
|
7
|
+
const LINK_OK = /^(https?:|mailto:|tel:|\/|#)/i;
|
|
8
|
+
export function richText(text) {
|
|
9
|
+
const out = [];
|
|
10
|
+
let buf = "";
|
|
11
|
+
let i = 0;
|
|
12
|
+
const flush = () => {
|
|
13
|
+
if (buf)
|
|
14
|
+
out.push(buf);
|
|
15
|
+
buf = "";
|
|
16
|
+
};
|
|
17
|
+
while (i < text.length) {
|
|
18
|
+
if (text[i] === "`") {
|
|
19
|
+
const end = text.indexOf("`", i + 1);
|
|
20
|
+
if (end > i + 1) {
|
|
21
|
+
flush();
|
|
22
|
+
out.push({ kind: "code", text: text.slice(i + 1, end) });
|
|
23
|
+
i = end + 1;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (text.startsWith("**", i)) {
|
|
28
|
+
const end = text.indexOf("**", i + 2);
|
|
29
|
+
if (end > i + 2) {
|
|
30
|
+
flush();
|
|
31
|
+
out.push({ kind: "strong", children: richText(text.slice(i + 2, end)) });
|
|
32
|
+
i = end + 2;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (text[i] === "*") {
|
|
37
|
+
const end = text.indexOf("*", i + 1);
|
|
38
|
+
if (end > i + 1) {
|
|
39
|
+
flush();
|
|
40
|
+
out.push({ kind: "em", children: richText(text.slice(i + 1, end)) });
|
|
41
|
+
i = end + 1;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (text[i] === "[") {
|
|
46
|
+
const m = /^\[([^\]]+)\]\(([^)\s]+)\)/.exec(text.slice(i));
|
|
47
|
+
if (m) {
|
|
48
|
+
flush();
|
|
49
|
+
out.push({ kind: "link", href: LINK_OK.test(m[2]) ? m[2] : undefined, children: richText(m[1]) });
|
|
50
|
+
i += m[0].length;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
buf += text[i++];
|
|
55
|
+
}
|
|
56
|
+
flush();
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=richtext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"richtext.js","sourceRoot":"","sources":["../src/richtext.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const SHORTCUT_KEYS: Record<string, [apple: string, other: string, aria: string, event: string]>;
|
|
2
|
+
export declare const MODIFIER_FLAGS: readonly ["metaKey", "ctrlKey", "altKey", "shiftKey"];
|
|
3
|
+
export type ModifierFlag = (typeof MODIFIER_FLAGS)[number];
|
|
4
|
+
export interface Shortcut {
|
|
5
|
+
/** The keys as shown, one per <kbd> */
|
|
6
|
+
hint: string[];
|
|
7
|
+
/** For aria-keyshortcuts */
|
|
8
|
+
aria: string;
|
|
9
|
+
flags: Set<ModifierFlag>;
|
|
10
|
+
/** What KeyboardEvent.key reports, lower-cased */
|
|
11
|
+
key: string;
|
|
12
|
+
}
|
|
13
|
+
/** Splits "mod+shift+d" into what to show, what to announce, and what to match on keydown. */
|
|
14
|
+
export declare function parseShortcut(shortcut: string, apple: boolean): Shortcut;
|
|
15
|
+
/** The parts of a keyboard event a shortcut is matched on. */
|
|
16
|
+
export interface KeyLike {
|
|
17
|
+
key: string;
|
|
18
|
+
code: string;
|
|
19
|
+
metaKey: boolean;
|
|
20
|
+
ctrlKey: boolean;
|
|
21
|
+
altKey: boolean;
|
|
22
|
+
shiftKey: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Whether a key event is this shortcut: the modifiers exactly, and the key by name, or by physical
|
|
26
|
+
* key for letters and digits (Alt on a Mac rewrites e.key to a symbol).
|
|
27
|
+
*/
|
|
28
|
+
export declare function shortcutMatches(s: Shortcut, e: KeyLike): boolean;
|
|
29
|
+
/** Typing into a field must never fire an unmodified shortcut (shift alone still types). */
|
|
30
|
+
export declare const unmodified: (s: Shortcut) => boolean;
|
|
31
|
+
/** Whether a platform string names an Apple device, where 'mod' is ⌘. */
|
|
32
|
+
export declare const isApplePlatform: (platform: string) => boolean;
|