@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/chart.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Chart geometry: the same numbers whichever renderer draws the SVG. */
|
|
2
|
+
export declare const CHART_W = 600;
|
|
3
|
+
export declare const CHART_H = 240;
|
|
4
|
+
export declare const CHART_PAD: {
|
|
5
|
+
top: number;
|
|
6
|
+
right: number;
|
|
7
|
+
bottom: number;
|
|
8
|
+
left: number;
|
|
9
|
+
};
|
|
10
|
+
export declare const MARKERS: readonly ["circle", "square", "diamond", "triangle", "circle", "square"];
|
|
11
|
+
export declare const seriesColor: (i: number) => string;
|
|
12
|
+
export declare function niceMax(v: number): number;
|
|
13
|
+
/** Short axis labels: dates as "Apr" (or "3 Apr"), everything else as text. */
|
|
14
|
+
export declare function axisLabel(v: unknown, type: string | undefined, locale: string): string;
|
|
15
|
+
export interface Rect {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
w: number;
|
|
19
|
+
h: number;
|
|
20
|
+
}
|
|
21
|
+
/** Squarified treemap: tiles laid in rows along the shorter side, keeping them near square. */
|
|
22
|
+
export declare function treemap(values: number[], w: number, h: number): (Rect | null)[];
|
|
23
|
+
/** The vertical scale of a bar or line chart: its floor, ceiling and three ticks. */
|
|
24
|
+
export declare function verticalScale(all: number[], trend: boolean): {
|
|
25
|
+
lo: number;
|
|
26
|
+
max: number;
|
|
27
|
+
ticks: number[];
|
|
28
|
+
};
|
|
29
|
+
/** A marker's SVG: its element and attributes, by kind. */
|
|
30
|
+
export declare function markerShape(kind: string, x: number, y: number): {
|
|
31
|
+
tag: "rect" | "path" | "circle";
|
|
32
|
+
attrs: Record<string, number | string>;
|
|
33
|
+
};
|
|
34
|
+
/** Stacked flows from each x value (left) into each series (right): where every band starts. */
|
|
35
|
+
export declare function flowLayout(values: number[][], seriesCount: number, h: number): {
|
|
36
|
+
leftY: number[];
|
|
37
|
+
rightY: number[];
|
|
38
|
+
leftTotals: number[];
|
|
39
|
+
rightTotals: number[];
|
|
40
|
+
scale: number;
|
|
41
|
+
};
|
package/dist/chart.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/** Chart geometry: the same numbers whichever renderer draws the SVG. */
|
|
2
|
+
export const CHART_W = 600;
|
|
3
|
+
export const CHART_H = 240;
|
|
4
|
+
export const CHART_PAD = { top: 16, right: 16, bottom: 32, left: 56 };
|
|
5
|
+
export const MARKERS = ["circle", "square", "diamond", "triangle", "circle", "square"];
|
|
6
|
+
export const seriesColor = (i) => `var(--pxd-color-data-categorical-${(i % 6) + 1})`;
|
|
7
|
+
export function niceMax(v) {
|
|
8
|
+
if (v <= 0)
|
|
9
|
+
return 1;
|
|
10
|
+
const p = 10 ** Math.floor(Math.log10(v));
|
|
11
|
+
return Math.ceil(v / p) * p;
|
|
12
|
+
}
|
|
13
|
+
/** Short axis labels: dates as "Apr" (or "3 Apr"), everything else as text. */
|
|
14
|
+
export function axisLabel(v, type, locale) {
|
|
15
|
+
if (type === "date" || type === "datetime") {
|
|
16
|
+
const d = new Date(String(v));
|
|
17
|
+
if (!Number.isNaN(d.getTime())) {
|
|
18
|
+
const opts = d.getUTCDate() === 1 ? { month: "short", timeZone: "UTC" } : { month: "short", day: "numeric", timeZone: "UTC" };
|
|
19
|
+
return new Intl.DateTimeFormat(locale, opts).format(d);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return String(v ?? "").slice(0, 12);
|
|
23
|
+
}
|
|
24
|
+
/** Squarified treemap: tiles laid in rows along the shorter side, keeping them near square. */
|
|
25
|
+
export function treemap(values, w, h) {
|
|
26
|
+
const total = values.reduce((a, v) => a + v, 0);
|
|
27
|
+
const rects = values.map(() => null);
|
|
28
|
+
if (total <= 0)
|
|
29
|
+
return rects;
|
|
30
|
+
const order = values.map((_, i) => i).filter((i) => values[i] > 0).sort((a, c) => values[c] - values[a]);
|
|
31
|
+
const area = (i) => (values[i] / total) * w * h;
|
|
32
|
+
let x = 0;
|
|
33
|
+
let y = 0;
|
|
34
|
+
let cw = w;
|
|
35
|
+
let ch = h;
|
|
36
|
+
let i = 0;
|
|
37
|
+
while (i < order.length && cw > 0 && ch > 0) {
|
|
38
|
+
const vertical = cw >= ch;
|
|
39
|
+
const side = vertical ? ch : cw;
|
|
40
|
+
let row = [];
|
|
41
|
+
let rowArea = 0;
|
|
42
|
+
let best = Infinity;
|
|
43
|
+
while (i < order.length) {
|
|
44
|
+
const trial = [...row, order[i]];
|
|
45
|
+
const trialArea = rowArea + area(order[i]);
|
|
46
|
+
const thickness = trialArea / side;
|
|
47
|
+
const worst = Math.max(...trial.map((j) => {
|
|
48
|
+
const len = area(j) / thickness;
|
|
49
|
+
return Math.max(len / thickness, thickness / len);
|
|
50
|
+
}));
|
|
51
|
+
if (worst > best && row.length)
|
|
52
|
+
break;
|
|
53
|
+
row = trial;
|
|
54
|
+
rowArea = trialArea;
|
|
55
|
+
best = worst;
|
|
56
|
+
i++;
|
|
57
|
+
}
|
|
58
|
+
const thickness = rowArea / side;
|
|
59
|
+
let off = 0;
|
|
60
|
+
for (const j of row) {
|
|
61
|
+
const len = area(j) / thickness;
|
|
62
|
+
rects[j] = vertical ? { x, y: y + off, w: thickness, h: len } : { x: x + off, y, w: len, h: thickness };
|
|
63
|
+
off += len;
|
|
64
|
+
}
|
|
65
|
+
if (vertical)
|
|
66
|
+
(x += thickness), (cw -= thickness);
|
|
67
|
+
else
|
|
68
|
+
(y += thickness), (ch -= thickness);
|
|
69
|
+
}
|
|
70
|
+
return rects;
|
|
71
|
+
}
|
|
72
|
+
/** The vertical scale of a bar or line chart: its floor, ceiling and three ticks. */
|
|
73
|
+
export function verticalScale(all, trend) {
|
|
74
|
+
const max = niceMax(Math.max(0, ...all));
|
|
75
|
+
const min = trend ? Math.min(0, ...all) : 0;
|
|
76
|
+
const trendMin = trend && all.length ? Math.max(min, Math.min(...all) - (Math.max(...all) - Math.min(...all)) * 0.2) : min;
|
|
77
|
+
const lo = trend ? Math.floor(trendMin) : 0;
|
|
78
|
+
return { lo, max, ticks: [0, 0.5, 1].map((t) => lo + (max - lo) * t) };
|
|
79
|
+
}
|
|
80
|
+
/** A marker's SVG: its element and attributes, by kind. */
|
|
81
|
+
export function markerShape(kind, x, y) {
|
|
82
|
+
if (kind === "square")
|
|
83
|
+
return { tag: "rect", attrs: { x: x - 4, y: y - 4, width: 8, height: 8 } };
|
|
84
|
+
if (kind === "diamond")
|
|
85
|
+
return { tag: "path", attrs: { d: `M${x} ${y - 5}L${x + 5} ${y}L${x} ${y + 5}L${x - 5} ${y}Z` } };
|
|
86
|
+
if (kind === "triangle")
|
|
87
|
+
return { tag: "path", attrs: { d: `M${x} ${y - 5}L${x + 5} ${y + 4}L${x - 5} ${y + 4}Z` } };
|
|
88
|
+
return { tag: "circle", attrs: { cx: x, cy: y, r: 4 } };
|
|
89
|
+
}
|
|
90
|
+
/** Stacked flows from each x value (left) into each series (right): where every band starts. */
|
|
91
|
+
export function flowLayout(values, seriesCount, h) {
|
|
92
|
+
const leftTotals = values.map((row) => row.reduce((a, v) => a + v, 0));
|
|
93
|
+
const rightTotals = Array.from({ length: seriesCount }, (_, si) => values.reduce((a, row) => a + row[si], 0));
|
|
94
|
+
const total = leftTotals.reduce((a, v) => a + v, 0) || 1;
|
|
95
|
+
const gap = 6;
|
|
96
|
+
const usable = h - gap * (Math.max(values.length, seriesCount) - 1);
|
|
97
|
+
const scale = usable / total;
|
|
98
|
+
const leftY = [];
|
|
99
|
+
const rightY = [];
|
|
100
|
+
let yy = 0;
|
|
101
|
+
leftTotals.forEach((t) => (leftY.push(yy), (yy += t * scale + gap)));
|
|
102
|
+
yy = 0;
|
|
103
|
+
rightTotals.forEach((t) => (rightY.push(yy), (yy += t * scale + gap)));
|
|
104
|
+
return { leftY, rightY, leftTotals, rightTotals, scale };
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart.js","sourceRoot":"","sources":["../src/chart.ts"],"names":[],"mappings":"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"}
|
package/dist/choice.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Choice picks its control from the options' number and shape (the Choice rendering rules):
|
|
3
|
+
* people or things with faces → a picker (recent row, then a list); a few short options → chips
|
|
4
|
+
* (a segmented control); otherwise radios or checkboxes, searchable past 10. Every renderer
|
|
5
|
+
* makes the same call here, so a document reads the same whichever draws it.
|
|
6
|
+
*/
|
|
7
|
+
import type { Option } from "./options.ts";
|
|
8
|
+
export type ChoiceControl = "chips" | "people" | "list";
|
|
9
|
+
export interface ChoicePlan {
|
|
10
|
+
control: ChoiceControl;
|
|
11
|
+
multiple: boolean;
|
|
12
|
+
/** Past this many options a filter field sits above them */
|
|
13
|
+
searchable: boolean;
|
|
14
|
+
withFaces: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Chips hold this many short options at most; more become a list. */
|
|
17
|
+
export declare const CHIPS_MAX = 6;
|
|
18
|
+
/** The longest label a chip can carry. */
|
|
19
|
+
export declare const CHIP_LABEL_MAX = 24;
|
|
20
|
+
/** Past this many options the list gets a filter; with faces the threshold is the chips' limit. */
|
|
21
|
+
export declare const SEARCHABLE_PAST = 10;
|
|
22
|
+
export declare function planChoice(options: Option[], mode: string | undefined): ChoicePlan;
|
|
23
|
+
/** Values compare by their JSON: 1 and "1" are different options, {a:1} equals {a:1}. */
|
|
24
|
+
export declare const optionKey: (v: unknown) => string;
|
|
25
|
+
export declare const matchesQuery: (o: Option, query: string) => boolean;
|
|
26
|
+
/** People or places: recent ones as a row of faces, everyone else as a list. A search shows matches only. */
|
|
27
|
+
export declare function partitionRecent(options: Option[], query: string): {
|
|
28
|
+
recent: Option[];
|
|
29
|
+
rest: Option[];
|
|
30
|
+
};
|
|
31
|
+
/** A multiple choice's next selection after one option is toggled. */
|
|
32
|
+
export declare function toggleSelection(selected: unknown, value: unknown): unknown[];
|
|
33
|
+
export declare const isSelected: (selected: unknown, value: unknown) => boolean;
|
|
34
|
+
/** The placeholder for the filter field: by name for people, by text otherwise. */
|
|
35
|
+
export declare const searchPlaceholder: (withFaces: boolean) => string;
|
package/dist/choice.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Chips hold this many short options at most; more become a list. */
|
|
2
|
+
export const CHIPS_MAX = 6;
|
|
3
|
+
/** The longest label a chip can carry. */
|
|
4
|
+
export const CHIP_LABEL_MAX = 24;
|
|
5
|
+
/** Past this many options the list gets a filter; with faces the threshold is the chips' limit. */
|
|
6
|
+
export const SEARCHABLE_PAST = 10;
|
|
7
|
+
export function planChoice(options, mode) {
|
|
8
|
+
const withFaces = options.some((o) => o.avatar !== undefined);
|
|
9
|
+
const searchable = options.length > SEARCHABLE_PAST || (withFaces && options.length > CHIPS_MAX);
|
|
10
|
+
const chips = !withFaces && options.length <= CHIPS_MAX && options.every((o) => o.label.length <= CHIP_LABEL_MAX && !o.description);
|
|
11
|
+
return { control: chips ? "chips" : withFaces ? "people" : "list", multiple: mode === "multiple", searchable, withFaces };
|
|
12
|
+
}
|
|
13
|
+
/** Values compare by their JSON: 1 and "1" are different options, {a:1} equals {a:1}. */
|
|
14
|
+
export const optionKey = (v) => JSON.stringify(v);
|
|
15
|
+
export const matchesQuery = (o, query) => !query || `${o.label} ${o.description ?? ""}`.toLowerCase().includes(query.toLowerCase());
|
|
16
|
+
/** People or places: recent ones as a row of faces, everyone else as a list. A search shows matches only. */
|
|
17
|
+
export function partitionRecent(options, query) {
|
|
18
|
+
return { recent: query ? [] : options.filter((o) => o.recent), rest: options.filter((o) => (query ? matchesQuery(o, query) : !o.recent)) };
|
|
19
|
+
}
|
|
20
|
+
/** A multiple choice's next selection after one option is toggled. */
|
|
21
|
+
export function toggleSelection(selected, value) {
|
|
22
|
+
const cur = Array.isArray(selected) ? selected : [];
|
|
23
|
+
const k = optionKey(value);
|
|
24
|
+
return cur.some((x) => optionKey(x) === k) ? cur.filter((x) => optionKey(x) !== k) : [...cur, value];
|
|
25
|
+
}
|
|
26
|
+
export const isSelected = (selected, value) => {
|
|
27
|
+
const k = optionKey(value);
|
|
28
|
+
return Array.isArray(selected) ? selected.some((x) => optionKey(x) === k) : selected !== null && selected !== undefined && optionKey(selected) === k;
|
|
29
|
+
};
|
|
30
|
+
/** The placeholder for the filter field: by name for people, by text otherwise. */
|
|
31
|
+
export const searchPlaceholder = (withFaces) => (withFaces ? "Search by name" : "Filter options");
|
|
32
|
+
//# sourceMappingURL=choice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choice.js","sourceRoot":"","sources":["../src/choice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** Collection decisions: item values, people's order, the calendar's month. */
|
|
2
|
+
import type { Node } from "./document.ts";
|
|
3
|
+
/** Stable value used for selecting an item: its id when present, else its index. */
|
|
4
|
+
export declare const collectionItemValue: (item: unknown, index: number) => unknown;
|
|
5
|
+
/** Grid for visual items (a Card with media), list otherwise, unless the document says which. */
|
|
6
|
+
export declare function collectionLayout(node: Node, template: Node | undefined): {
|
|
7
|
+
grid: boolean;
|
|
8
|
+
timeline: boolean;
|
|
9
|
+
carousel: boolean;
|
|
10
|
+
calendar: boolean;
|
|
11
|
+
};
|
|
12
|
+
/** Items in the order people put them ('order' holds item values); unknown values keep host order at the end. */
|
|
13
|
+
export declare function orderedIndices(values: unknown[], order: unknown): number[];
|
|
14
|
+
/** Moves one position to another; the new order as item values. */
|
|
15
|
+
export declare function moveItem(indices: number[], values: unknown[], from: number, to: number): unknown[] | undefined;
|
|
16
|
+
/** ISO date → UTC parts, or undefined when it isn't one. */
|
|
17
|
+
export declare function dateParts(v: unknown): {
|
|
18
|
+
y: number;
|
|
19
|
+
m: number;
|
|
20
|
+
d: number;
|
|
21
|
+
} | undefined;
|
|
22
|
+
export interface CalendarMonth {
|
|
23
|
+
y: number;
|
|
24
|
+
m: number;
|
|
25
|
+
monthName: string;
|
|
26
|
+
weekdays: string[];
|
|
27
|
+
/** Rows of seven: a day of the month, or null outside it */
|
|
28
|
+
weeks: (number | null)[][];
|
|
29
|
+
}
|
|
30
|
+
/** The month shown starts at the first dated item (or today). */
|
|
31
|
+
export declare const monthToShow: (chosen: {
|
|
32
|
+
y: number;
|
|
33
|
+
m: number;
|
|
34
|
+
} | null, first: {
|
|
35
|
+
y: number;
|
|
36
|
+
m: number;
|
|
37
|
+
} | undefined, today?: Date) => {
|
|
38
|
+
y: number;
|
|
39
|
+
m: number;
|
|
40
|
+
};
|
|
41
|
+
export declare function shiftMonth(shown: {
|
|
42
|
+
y: number;
|
|
43
|
+
m: number;
|
|
44
|
+
}, by: number): {
|
|
45
|
+
y: number;
|
|
46
|
+
m: number;
|
|
47
|
+
};
|
|
48
|
+
/** The grid of one month; weeks start on Monday (2024-01-01 was one). */
|
|
49
|
+
export declare function calendarMonth(shown: {
|
|
50
|
+
y: number;
|
|
51
|
+
m: number;
|
|
52
|
+
}, locale: string): CalendarMonth;
|
|
53
|
+
/** Which slide is in view: the one whose left edge is nearest the scroll position. */
|
|
54
|
+
export declare function nearestSlide(offsets: number[], scrollLeft: number): number;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** Stable value used for selecting an item: its id when present, else its index. */
|
|
2
|
+
export const collectionItemValue = (item, index) => (item && typeof item === "object" && "id" in item ? item.id : index);
|
|
3
|
+
/** Grid for visual items (a Card with media), list otherwise, unless the document says which. */
|
|
4
|
+
export function collectionLayout(node, template) {
|
|
5
|
+
const layout = node.layout ?? "auto";
|
|
6
|
+
return { grid: layout === "grid" || (layout === "auto" && template?.component === "Card" && !!template.media), timeline: layout === "timeline", carousel: layout === "carousel", calendar: layout === "calendar" };
|
|
7
|
+
}
|
|
8
|
+
/** Items in the order people put them ('order' holds item values); unknown values keep host order at the end. */
|
|
9
|
+
export function orderedIndices(values, order) {
|
|
10
|
+
const indices = values.map((_, i) => i);
|
|
11
|
+
if (!Array.isArray(order))
|
|
12
|
+
return indices;
|
|
13
|
+
const rank = (i) => {
|
|
14
|
+
const r = order.indexOf(values[i]);
|
|
15
|
+
return r < 0 ? order.length + i : r;
|
|
16
|
+
};
|
|
17
|
+
return indices.sort((a, c) => rank(a) - rank(c));
|
|
18
|
+
}
|
|
19
|
+
/** Moves one position to another; the new order as item values. */
|
|
20
|
+
export function moveItem(indices, values, from, to) {
|
|
21
|
+
if (to < 0 || to >= indices.length || from === to)
|
|
22
|
+
return undefined;
|
|
23
|
+
const next = [...indices];
|
|
24
|
+
next.splice(to, 0, ...next.splice(from, 1));
|
|
25
|
+
return next.map((i) => values[i]);
|
|
26
|
+
}
|
|
27
|
+
/** ISO date → UTC parts, or undefined when it isn't one. */
|
|
28
|
+
export function dateParts(v) {
|
|
29
|
+
if (v === null || v === undefined || v === "")
|
|
30
|
+
return undefined;
|
|
31
|
+
const d = new Date(String(v));
|
|
32
|
+
return Number.isNaN(d.getTime()) ? undefined : { y: d.getUTCFullYear(), m: d.getUTCMonth(), d: d.getUTCDate() };
|
|
33
|
+
}
|
|
34
|
+
/** The month shown starts at the first dated item (or today). */
|
|
35
|
+
export const monthToShow = (chosen, first, today = new Date()) => chosen ?? (first ? { y: first.y, m: first.m } : { y: today.getUTCFullYear(), m: today.getUTCMonth() });
|
|
36
|
+
export function shiftMonth(shown, by) {
|
|
37
|
+
const d = new Date(Date.UTC(shown.y, shown.m + by, 1));
|
|
38
|
+
return { y: d.getUTCFullYear(), m: d.getUTCMonth() };
|
|
39
|
+
}
|
|
40
|
+
/** The grid of one month; weeks start on Monday (2024-01-01 was one). */
|
|
41
|
+
export function calendarMonth(shown, locale) {
|
|
42
|
+
const monthName = new Intl.DateTimeFormat(locale, { month: "long", year: "numeric", timeZone: "UTC" }).format(new Date(Date.UTC(shown.y, shown.m, 1)));
|
|
43
|
+
const weekdays = Array.from({ length: 7 }, (_, i) => new Intl.DateTimeFormat(locale, { weekday: "short", timeZone: "UTC" }).format(new Date(Date.UTC(2024, 0, 1 + i))));
|
|
44
|
+
const firstDay = (new Date(Date.UTC(shown.y, shown.m, 1)).getUTCDay() + 6) % 7;
|
|
45
|
+
const days = new Date(Date.UTC(shown.y, shown.m + 1, 0)).getUTCDate();
|
|
46
|
+
const cells = [...Array(firstDay).fill(null), ...Array.from({ length: days }, (_, i) => i + 1)];
|
|
47
|
+
while (cells.length % 7)
|
|
48
|
+
cells.push(null);
|
|
49
|
+
const weeks = Array.from({ length: cells.length / 7 }, (_, w) => cells.slice(w * 7, w * 7 + 7));
|
|
50
|
+
return { ...shown, monthName, weekdays, weeks };
|
|
51
|
+
}
|
|
52
|
+
/** Which slide is in view: the one whose left edge is nearest the scroll position. */
|
|
53
|
+
export function nearestSlide(offsets, scrollLeft) {
|
|
54
|
+
let best = 0;
|
|
55
|
+
offsets.forEach((o, i) => {
|
|
56
|
+
if (Math.abs(o - scrollLeft) < Math.abs(offsets[best] - scrollLeft))
|
|
57
|
+
best = i;
|
|
58
|
+
});
|
|
59
|
+
return best;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection.js","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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"}
|
package/dist/color.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Colour text a ColorInput reads and writes: hex, rgb()/rgba() and hsl()/hsla(). */
|
|
2
|
+
export type ColorFormat = "hex" | "rgb" | "hsl";
|
|
3
|
+
export interface RGBA {
|
|
4
|
+
r: number;
|
|
5
|
+
g: number;
|
|
6
|
+
b: number;
|
|
7
|
+
a: number;
|
|
8
|
+
}
|
|
9
|
+
export declare const clamp: (n: number, lo: number, hi: number) => number;
|
|
10
|
+
export declare function hslToRgb(h: number, s: number, l: number): [number, number, number];
|
|
11
|
+
export declare function rgbToHsl(r: number, g: number, b: number): [number, number, number];
|
|
12
|
+
/** Parse CSS hex, rgb()/rgba() and hsl()/hsla() text; null when it isn't a colour yet. */
|
|
13
|
+
export declare function parseColor(text: unknown): RGBA | null;
|
|
14
|
+
/** Write a colour as CSS text in the requested format; alpha appears only when allowed and below 1. */
|
|
15
|
+
export declare function formatColor(c: RGBA, format: ColorFormat, alpha: boolean): string;
|
|
16
|
+
/** The six-digit hex a native colour picker takes. */
|
|
17
|
+
export declare const toHex6: (c: RGBA | null) => string;
|
|
18
|
+
/** Whether two colours are the same to the eye (by channel, not by text: '#FFF' is 'rgb(255, 255, 255)'). */
|
|
19
|
+
export declare const sameColor: (a: RGBA | null, c: RGBA | null, alpha: boolean) => boolean;
|
|
20
|
+
export declare const colorPlaceholder: (format: ColorFormat) => string;
|
package/dist/color.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/** Colour text a ColorInput reads and writes: hex, rgb()/rgba() and hsl()/hsla(). */
|
|
2
|
+
export const clamp = (n, lo, hi) => Math.min(hi, Math.max(lo, n));
|
|
3
|
+
const hex2 = (n) => clamp(Math.round(n), 0, 255).toString(16).padStart(2, "0");
|
|
4
|
+
const parseAlpha = (t) => (t === undefined ? 1 : clamp(t.endsWith("%") ? parseFloat(t) / 100 : parseFloat(t), 0, 1));
|
|
5
|
+
const channel = (t) => (t.endsWith("%") ? (parseFloat(t) / 100) * 255 : parseFloat(t));
|
|
6
|
+
export function hslToRgb(h, s, l) {
|
|
7
|
+
const hh = (((h % 360) + 360) % 360) / 360;
|
|
8
|
+
if (s === 0)
|
|
9
|
+
return [l * 255, l * 255, l * 255];
|
|
10
|
+
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
11
|
+
const p = 2 * l - q;
|
|
12
|
+
const f = (t) => {
|
|
13
|
+
if (t < 0)
|
|
14
|
+
t += 1;
|
|
15
|
+
if (t > 1)
|
|
16
|
+
t -= 1;
|
|
17
|
+
if (t < 1 / 6)
|
|
18
|
+
return p + (q - p) * 6 * t;
|
|
19
|
+
if (t < 1 / 2)
|
|
20
|
+
return q;
|
|
21
|
+
if (t < 2 / 3)
|
|
22
|
+
return p + (q - p) * (2 / 3 - t) * 6;
|
|
23
|
+
return p;
|
|
24
|
+
};
|
|
25
|
+
return [f(hh + 1 / 3) * 255, f(hh) * 255, f(hh - 1 / 3) * 255];
|
|
26
|
+
}
|
|
27
|
+
export function rgbToHsl(r, g, b) {
|
|
28
|
+
const rr = r / 255;
|
|
29
|
+
const gg = g / 255;
|
|
30
|
+
const bb = b / 255;
|
|
31
|
+
const max = Math.max(rr, gg, bb);
|
|
32
|
+
const min = Math.min(rr, gg, bb);
|
|
33
|
+
const l = (max + min) / 2;
|
|
34
|
+
if (max === min)
|
|
35
|
+
return [0, 0, l];
|
|
36
|
+
const d = max - min;
|
|
37
|
+
const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
38
|
+
let h = max === rr ? (gg - bb) / d + (gg < bb ? 6 : 0) : max === gg ? (bb - rr) / d + 2 : (rr - gg) / d + 4;
|
|
39
|
+
h /= 6;
|
|
40
|
+
return [h * 360, s, l];
|
|
41
|
+
}
|
|
42
|
+
/** Parse CSS hex, rgb()/rgba() and hsl()/hsla() text; null when it isn't a colour yet. */
|
|
43
|
+
export function parseColor(text) {
|
|
44
|
+
if (typeof text !== "string")
|
|
45
|
+
return null;
|
|
46
|
+
const t = text.trim();
|
|
47
|
+
const hex = /^#([0-9a-f]{3,8})$/i.exec(t);
|
|
48
|
+
if (hex) {
|
|
49
|
+
const h = hex[1];
|
|
50
|
+
if (h.length === 3 || h.length === 4) {
|
|
51
|
+
const [r, g, b, a] = h.split("").map((c) => parseInt(c + c, 16));
|
|
52
|
+
return { r, g, b, a: h.length === 4 ? a / 255 : 1 };
|
|
53
|
+
}
|
|
54
|
+
if (h.length === 6 || h.length === 8) {
|
|
55
|
+
const at = (i) => parseInt(h.slice(i, i + 2), 16);
|
|
56
|
+
return { r: at(0), g: at(2), b: at(4), a: h.length === 8 ? at(6) / 255 : 1 };
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const fn = /^(rgba?|hsla?)\(\s*([^)]+?)\s*\)$/i.exec(t);
|
|
61
|
+
if (!fn)
|
|
62
|
+
return null;
|
|
63
|
+
const parts = fn[2].split(/\s*[,/]\s*|\s+/).filter(Boolean);
|
|
64
|
+
if (parts.length < 3 || parts.length > 4)
|
|
65
|
+
return null;
|
|
66
|
+
const a = parseAlpha(parts[3]);
|
|
67
|
+
if (Number.isNaN(a))
|
|
68
|
+
return null;
|
|
69
|
+
if (fn[1].toLowerCase().startsWith("rgb")) {
|
|
70
|
+
const [r, g, b] = parts.slice(0, 3).map(channel);
|
|
71
|
+
if ([r, g, b].some(Number.isNaN))
|
|
72
|
+
return null;
|
|
73
|
+
return { r: clamp(r, 0, 255), g: clamp(g, 0, 255), b: clamp(b, 0, 255), a };
|
|
74
|
+
}
|
|
75
|
+
const h = parseFloat(parts[0]);
|
|
76
|
+
const sat = parseFloat(parts[1]) / 100;
|
|
77
|
+
const light = parseFloat(parts[2]) / 100;
|
|
78
|
+
if ([h, sat, light].some(Number.isNaN))
|
|
79
|
+
return null;
|
|
80
|
+
const [r, g, b] = hslToRgb(h, clamp(sat, 0, 1), clamp(light, 0, 1));
|
|
81
|
+
return { r, g, b, a };
|
|
82
|
+
}
|
|
83
|
+
/** Write a colour as CSS text in the requested format; alpha appears only when allowed and below 1. */
|
|
84
|
+
export function formatColor(c, format, alpha) {
|
|
85
|
+
const a = alpha ? Math.round(c.a * 100) / 100 : 1;
|
|
86
|
+
const r = Math.round(c.r);
|
|
87
|
+
const g = Math.round(c.g);
|
|
88
|
+
const b = Math.round(c.b);
|
|
89
|
+
if (format === "rgb")
|
|
90
|
+
return a < 1 ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`;
|
|
91
|
+
if (format === "hsl") {
|
|
92
|
+
const [h, s, l] = rgbToHsl(r, g, b);
|
|
93
|
+
const hh = Math.round(h);
|
|
94
|
+
const ss = Math.round(s * 100);
|
|
95
|
+
const ll = Math.round(l * 100);
|
|
96
|
+
return a < 1 ? `hsla(${hh}, ${ss}%, ${ll}%, ${a})` : `hsl(${hh}, ${ss}%, ${ll}%)`;
|
|
97
|
+
}
|
|
98
|
+
return `#${hex2(r)}${hex2(g)}${hex2(b)}${a < 1 ? hex2(a * 255) : ""}`;
|
|
99
|
+
}
|
|
100
|
+
/** The six-digit hex a native colour picker takes. */
|
|
101
|
+
export const toHex6 = (c) => (c ? `#${hex2(c.r)}${hex2(c.g)}${hex2(c.b)}` : "#000000");
|
|
102
|
+
/** Whether two colours are the same to the eye (by channel, not by text: '#FFF' is 'rgb(255, 255, 255)'). */
|
|
103
|
+
export const sameColor = (a, c, alpha) => Boolean(a && c && Math.round(a.r) === Math.round(c.r) && Math.round(a.g) === Math.round(c.g) && Math.round(a.b) === Math.round(c.b) && (!alpha || Math.abs(a.a - c.a) < 0.005));
|
|
104
|
+
export const colorPlaceholder = (format) => (format === "hex" ? "#000000" : format === "rgb" ? "rgb(0, 0, 0)" : "hsl(0, 0%, 0%)");
|
|
105
|
+
//# sourceMappingURL=color.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.js","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Comparison decisions: the best item per attribute, attribute groups, and who comes first. */
|
|
2
|
+
/** Best item per attribute, when the attribute says which direction is better and one item wins outright. */
|
|
3
|
+
export declare function bestPerAttribute(attributes: any[], count: number, at: (path: string, i: number) => unknown): Map<string, number>;
|
|
4
|
+
/** Attributes under their group headings, in first-seen order. */
|
|
5
|
+
export declare function groupAttributes<T extends {
|
|
6
|
+
group?: unknown;
|
|
7
|
+
}>(attributes: T[], text: (v: unknown) => string): {
|
|
8
|
+
label?: string;
|
|
9
|
+
attributes: T[];
|
|
10
|
+
}[];
|
|
11
|
+
/** The recommended item comes first, so it's read (and seen on phones) first. */
|
|
12
|
+
export declare function recommendedFirst(titles: string[], recommended: string | undefined): number[];
|
|
13
|
+
/** Items under their group headings (Navigation), in first-seen order. */
|
|
14
|
+
export declare function groupItems<T extends {
|
|
15
|
+
group?: unknown;
|
|
16
|
+
}>(items: T[], text: (v: unknown) => string): {
|
|
17
|
+
label?: string;
|
|
18
|
+
items: T[];
|
|
19
|
+
}[];
|
|
20
|
+
/** A navigation's accessible name by kind, when the document gives none. */
|
|
21
|
+
export declare const navigationLabel: (kind: string) => string;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Comparison decisions: the best item per attribute, attribute groups, and who comes first. */
|
|
2
|
+
/** Best item per attribute, when the attribute says which direction is better and one item wins outright. */
|
|
3
|
+
export function bestPerAttribute(attributes, count, at) {
|
|
4
|
+
const best = new Map();
|
|
5
|
+
for (const a of attributes) {
|
|
6
|
+
if (!a.better || a.better === "none")
|
|
7
|
+
continue;
|
|
8
|
+
const vals = Array.from({ length: count }, (_, i) => Number(at(a.path, i)));
|
|
9
|
+
const target = a.better === "higher" ? Math.max(...vals) : Math.min(...vals);
|
|
10
|
+
if (vals.filter((v) => v === target).length === 1)
|
|
11
|
+
best.set(a.key, vals.indexOf(target));
|
|
12
|
+
}
|
|
13
|
+
return best;
|
|
14
|
+
}
|
|
15
|
+
/** Attributes under their group headings, in first-seen order. */
|
|
16
|
+
export function groupAttributes(attributes, text) {
|
|
17
|
+
const groups = [];
|
|
18
|
+
for (const a of attributes) {
|
|
19
|
+
const label = a.group !== undefined ? text(a.group) : undefined;
|
|
20
|
+
const g = groups.find((x) => x.label === label);
|
|
21
|
+
if (g)
|
|
22
|
+
g.attributes.push(a);
|
|
23
|
+
else
|
|
24
|
+
groups.push({ label, attributes: [a] });
|
|
25
|
+
}
|
|
26
|
+
return groups;
|
|
27
|
+
}
|
|
28
|
+
/** The recommended item comes first, so it's read (and seen on phones) first. */
|
|
29
|
+
export function recommendedFirst(titles, recommended) {
|
|
30
|
+
const order = titles.map((_, i) => i);
|
|
31
|
+
const ri = order.findIndex((i) => titles[i] === recommended);
|
|
32
|
+
if (ri > 0)
|
|
33
|
+
order.unshift(...order.splice(ri, 1));
|
|
34
|
+
return order;
|
|
35
|
+
}
|
|
36
|
+
/** Items under their group headings (Navigation), in first-seen order. */
|
|
37
|
+
export function groupItems(items, text) {
|
|
38
|
+
const groups = [];
|
|
39
|
+
for (const item of items) {
|
|
40
|
+
const g = item.group !== undefined ? text(item.group) : undefined;
|
|
41
|
+
const found = groups.find((x) => x.label === g);
|
|
42
|
+
if (found)
|
|
43
|
+
found.items.push(item);
|
|
44
|
+
else
|
|
45
|
+
groups.push({ label: g, items: [item] });
|
|
46
|
+
}
|
|
47
|
+
return groups;
|
|
48
|
+
}
|
|
49
|
+
/** A navigation's accessible name by kind, when the document gives none. */
|
|
50
|
+
export const navigationLabel = (kind) => (kind === "breadcrumb" ? "Breadcrumb" : kind === "toc" ? "On this page" : "Main");
|
|
51
|
+
//# sourceMappingURL=comparison.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparison.js","sourceRoot":"","sources":["../src/comparison.ts"],"names":[],"mappings":"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"}
|
package/dist/data.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** JSON Pointer helpers and binding resolution. Every binding resolves to an absolute pointer. */
|
|
2
|
+
export type Data = Record<string, unknown>;
|
|
3
|
+
/** Where relative paths resolve: the pointer of the current repeated item, or "" at top level. */
|
|
4
|
+
export interface Scope {
|
|
5
|
+
pointer: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const ROOT_SCOPE: Scope;
|
|
8
|
+
export declare const isBinding: (v: unknown) => v is {
|
|
9
|
+
path: string;
|
|
10
|
+
};
|
|
11
|
+
/** Absolute pointer for a path: absolute paths stay; relative ones join the item scope. */
|
|
12
|
+
export declare function absolute(path: string, scope: Scope): string;
|
|
13
|
+
export declare function childPointer(pointer: string, key: string | number): string;
|
|
14
|
+
export declare function get(data: unknown, pointer: string): unknown;
|
|
15
|
+
/** Immutable set; creates intermediate objects (or arrays for numeric keys). */
|
|
16
|
+
export declare function set(data: Data, pointer: string, value: unknown): Data;
|
|
17
|
+
/**
|
|
18
|
+
* Host data as a list. A binding that a component repeats over should point at an array; when the
|
|
19
|
+
* host (or a generated document) points it somewhere else, the component shows nothing instead of
|
|
20
|
+
* throwing. The validator reports the mismatch.
|
|
21
|
+
*/
|
|
22
|
+
export declare const asList: (value: unknown) => unknown[];
|
|
23
|
+
/** Resolves a literal-or-binding value. */
|
|
24
|
+
export declare function resolve<T = unknown>(value: unknown, data: unknown, scope: Scope): T;
|
|
25
|
+
/** Resolves every value in an action context. */
|
|
26
|
+
export declare function resolveContext(context: Record<string, unknown> | undefined, data: unknown, scope: Scope): Record<string, unknown>;
|
|
27
|
+
/** A value with bindings resolved wherever they sit in it (a Custom's props). */
|
|
28
|
+
export declare function resolveDeep(value: unknown, data: unknown, scope: Scope): unknown;
|
|
29
|
+
/** The scopes of a list binding's items, in order: what a repeated template renders in. */
|
|
30
|
+
export declare function itemScopes(data: unknown, path: string, scope: Scope): Scope[];
|