@vibes.diy/base 14.3.45 → 14.3.47
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/components/FilesPanelView.d.ts +19 -1
- package/components/FilesPanelView.js +52 -2
- package/components/FilesPanelView.js.map +1 -1
- package/components/HandlePickerMenu.d.ts +1 -0
- package/components/HandlePickerMenu.js.map +1 -1
- package/components/ImgGen.d.ts +5 -1
- package/components/ImgGen.js +23 -5
- package/components/ImgGen.js.map +1 -1
- package/components/NotificationDetailView.d.ts +15 -0
- package/components/NotificationDetailView.js +41 -3
- package/components/NotificationDetailView.js.map +1 -1
- package/components/ViewerTagView.d.ts +5 -1
- package/components/ViewerTagView.js +58 -12
- package/components/ViewerTagView.js.map +1 -1
- package/components/vibe-menu/cards/ShareAppDrill.d.ts +21 -0
- package/components/vibe-menu/cards/ShareAppDrill.js +162 -0
- package/components/vibe-menu/cards/ShareAppDrill.js.map +1 -0
- package/components/vibe-menu/cards/ShareCard.js +4 -4
- package/components/vibe-menu/cards/ShareCard.js.map +1 -1
- package/components/vibe-menu/cards/ShareDrills.d.ts +2 -2
- package/components/vibe-menu/cards/ShareDrills.js +5 -0
- package/components/vibe-menu/cards/ShareDrills.js.map +1 -1
- package/components/vibe-menu/cards/ShareLinkRows.d.ts +3 -2
- package/components/vibe-menu/cards/ShareLinkRows.js +5 -3
- package/components/vibe-menu/cards/ShareLinkRows.js.map +1 -1
- package/components/vibe-menu/cards/share-card.styles.d.ts +1 -1
- package/components/vibe-menu/cards/share-card.styles.js +22 -0
- package/components/vibe-menu/cards/share-card.styles.js.map +1 -1
- package/components/vibe-menu/cards/share-copy.d.ts +5 -3
- package/components/vibe-menu/cards/share-copy.js +7 -6
- package/components/vibe-menu/cards/share-copy.js.map +1 -1
- package/components/vibe-menu/index.d.ts +2 -0
- package/components/vibe-menu/index.js +2 -0
- package/components/vibe-menu/index.js.map +1 -1
- package/components/vibe-menu/menu-state.d.ts +1 -1
- package/components/vibe-menu/menu-state.js +1 -0
- package/components/vibe-menu/menu-state.js.map +1 -1
- package/components/vibe-menu/parts/Glyph.d.ts +1 -1
- package/components/vibe-menu/parts/Glyph.js +5 -1
- package/components/vibe-menu/parts/Glyph.js.map +1 -1
- package/components/vibe-menu/share-fixtures.d.ts +3 -1
- package/components/vibe-menu/share-fixtures.js +11 -0
- package/components/vibe-menu/share-fixtures.js.map +1 -1
- package/components/vibe-menu/share-image.d.ts +17 -0
- package/components/vibe-menu/share-image.js +194 -0
- package/components/vibe-menu/share-image.js.map +1 -0
- package/components/vibe-menu/slices.d.ts +11 -0
- package/components/vibe-menu/slices.js.map +1 -1
- package/hooks/img-gen/local-pictures.d.ts +10 -0
- package/hooks/img-gen/local-pictures.js +31 -0
- package/hooks/img-gen/local-pictures.js.map +1 -0
- package/hooks/img-gen/picture-bytes.d.ts +54 -0
- package/hooks/img-gen/picture-bytes.js +312 -0
- package/hooks/img-gen/picture-bytes.js.map +1 -0
- package/hooks/img-gen/use-img-gen.d.ts +9 -1
- package/hooks/img-gen/use-img-gen.js +109 -8
- package/hooks/img-gen/use-img-gen.js.map +1 -1
- package/hooks/img-gen/use-picture-src.d.ts +13 -0
- package/hooks/img-gen/use-picture-src.js +94 -0
- package/hooks/img-gen/use-picture-src.js.map +1 -0
- package/package.json +5 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export type Section = "home" | "settings" | "vibe" | "share";
|
|
2
2
|
export declare const SECTIONS: readonly Section[];
|
|
3
3
|
export declare const SECTION_TITLES: Readonly<Record<Section, string>>;
|
|
4
|
-
export type Drill = "look" | "details" | "help" | "handles" | "choose" | "access" | "members" | "member" | "notifications";
|
|
4
|
+
export type Drill = "look" | "details" | "help" | "handles" | "choose" | "access" | "members" | "member" | "notifications" | "app";
|
|
5
5
|
export declare const DRILL_SECTION: Readonly<Record<Drill, Section>>;
|
|
6
6
|
export interface MenuView {
|
|
7
7
|
readonly drill: Drill;
|
|
@@ -16,6 +16,7 @@ export const DRILL_SECTION = Object.freeze({
|
|
|
16
16
|
members: "share",
|
|
17
17
|
member: "share",
|
|
18
18
|
notifications: "share",
|
|
19
|
+
app: "share",
|
|
19
20
|
});
|
|
20
21
|
export const INITIAL_MENU_STATE = Object.freeze({ phase: "collapsed", section: null, view: null, banner: null });
|
|
21
22
|
const STRIP = Object.freeze({ phase: "strip", section: null, view: null, banner: null });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-state.js","sourceRoot":"","sources":["../../../jsr/components/vibe-menu/menu-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AASnC,MAAM,CAAC,MAAM,QAAQ,GAAuB,MAAM,CAAC,MAAM,CAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE5G,MAAM,CAAC,MAAM,cAAc,GAAsC,MAAM,CAAC,MAAM,CAAC;IAC7E,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACf,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,aAAa,GAAqC,MAAM,CAAC,MAAM,CAAC;IAC3E,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,OAAO;IACf,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,OAAO;IACf,aAAa,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"menu-state.js","sourceRoot":"","sources":["../../../jsr/components/vibe-menu/menu-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
export type GlyphName = "home" | "settings" | "code" | "users" | "at-sign" | "plus" | "star" | "sliders" | "log-out" | "user-plus" | "arrow-right" | "arrow-left" | "check" | "chevron-right" | "layout-grid" | "key" | "palette" | "file" | "help-circle" | "braces" | "qr-code" | "paperclip" | "lock" | "globe" | "copy" | "refresh" | "database" | "line-chart" | "lines" | "bell" | "pin" | "user-minus" | "shield";
|
|
2
|
+
export type GlyphName = "home" | "settings" | "code" | "users" | "at-sign" | "plus" | "star" | "sliders" | "log-out" | "user-plus" | "arrow-right" | "arrow-left" | "check" | "chevron-right" | "layout-grid" | "key" | "palette" | "file" | "help-circle" | "braces" | "qr-code" | "paperclip" | "lock" | "globe" | "copy" | "refresh" | "database" | "line-chart" | "lines" | "bell" | "pin" | "user-minus" | "shield" | "app";
|
|
3
3
|
export declare const PORT_ADDED_GLYPHS: readonly GlyphName[];
|
|
4
4
|
export declare const GLYPH_NAMES: readonly GlyphName[];
|
|
5
5
|
export interface GlyphProps {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
export const PORT_ADDED_GLYPHS = ["bell", "pin", "user-minus", "shield"];
|
|
2
|
+
export const PORT_ADDED_GLYPHS = ["bell", "pin", "user-minus", "shield", "app"];
|
|
3
3
|
const GLYPH_SHAPES = {
|
|
4
4
|
home: React.createElement("path", { d: "M3 11l9-8 9 8v10a1 1 0 0 1-1 1h-5v-7H9v7H4a1 1 0 0 1-1-1z" }),
|
|
5
5
|
settings: (React.createElement(React.Fragment, null,
|
|
@@ -81,6 +81,9 @@ const GLYPH_SHAPES = {
|
|
|
81
81
|
React.createElement("circle", { cx: "9", cy: "7", r: "4" }),
|
|
82
82
|
React.createElement("path", { d: "M22 11h-6" }))),
|
|
83
83
|
shield: (React.createElement("path", { d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" })),
|
|
84
|
+
app: (React.createElement(React.Fragment, null,
|
|
85
|
+
React.createElement("rect", { width: "14", height: "20", x: "5", y: "2", rx: "2", ry: "2" }),
|
|
86
|
+
React.createElement("path", { d: "M12 18h.01" }))),
|
|
84
87
|
};
|
|
85
88
|
export const GLYPH_NAMES = [
|
|
86
89
|
"home",
|
|
@@ -116,6 +119,7 @@ export const GLYPH_NAMES = [
|
|
|
116
119
|
"pin",
|
|
117
120
|
"user-minus",
|
|
118
121
|
"shield",
|
|
122
|
+
"app",
|
|
119
123
|
];
|
|
120
124
|
export function Glyph(props) {
|
|
121
125
|
return (React.createElement("svg", { className: props.className ?? "vm-glyph", viewBox: "0 0 24 24", "aria-hidden": "true", focusable: "false", "data-glyph": props.name }, GLYPH_SHAPES[props.name]));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Glyph.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/Glyph.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Glyph.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/Glyph.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ViewerRole } from "./open-resolver.js";
|
|
2
|
-
import type { RosterMember, ShareSlice, ViewerSlice } from "./slices.js";
|
|
2
|
+
import type { AppClipCardStatus, ShareAppSlice, RosterMember, ShareSlice, ViewerSlice } from "./slices.js";
|
|
3
3
|
export declare const SAMPLE_ROSTER: readonly RosterMember[];
|
|
4
4
|
export declare const SAMPLE_LINK: {
|
|
5
5
|
readonly url: string;
|
|
@@ -10,6 +10,8 @@ export declare const SAMPLE_REQUEST: {
|
|
|
10
10
|
readonly handle: string;
|
|
11
11
|
};
|
|
12
12
|
export declare const SAMPLE_EMBED_SNIPPET = "<iframe src=\"https://vibes.diy/embed/marcus/my-to-do-app\" title=\"My To-Do App, made on vibes.diy\" style=\"width:100%;aspect-ratio:16/9;border:0\" loading=\"lazy\"></iframe>";
|
|
13
|
+
export declare const SAMPLE_APP: ShareAppSlice;
|
|
14
|
+
export declare function sampleOwnerApp(cardStatus: AppClipCardStatus | null): ShareAppSlice;
|
|
13
15
|
export declare function makeShareSlice(over?: Partial<ShareSlice>): ShareSlice;
|
|
14
16
|
export declare function makeVisitorShareSlice(over?: Partial<ShareSlice>): ShareSlice;
|
|
15
17
|
export declare function makeShareViewer(role: ViewerRole, over?: Partial<ViewerSlice>): ViewerSlice;
|
|
@@ -22,6 +22,16 @@ export const SAMPLE_LINK = {
|
|
|
22
22
|
};
|
|
23
23
|
export const SAMPLE_REQUEST = { key: "user:jo", handle: "jo" };
|
|
24
24
|
export const SAMPLE_EMBED_SNIPPET = '<iframe src="https://vibes.diy/embed/marcus/my-to-do-app" title="My To-Do App, made on vibes.diy" style="width:100%;aspect-ratio:16/9;border:0" loading="lazy"></iframe>';
|
|
25
|
+
const SAMPLE_SCREENSHOT = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==";
|
|
26
|
+
export const SAMPLE_APP = {
|
|
27
|
+
url: "https://vibes.diy/c/marcus/my-to-do-app",
|
|
28
|
+
screenshotUrl: SAMPLE_SCREENSHOT,
|
|
29
|
+
title: "My To-Do App",
|
|
30
|
+
handle: "marcus",
|
|
31
|
+
};
|
|
32
|
+
export function sampleOwnerApp(cardStatus) {
|
|
33
|
+
return { ...SAMPLE_APP, cardStatus, onRequestCard: noop };
|
|
34
|
+
}
|
|
25
35
|
export function makeShareSlice(over = {}) {
|
|
26
36
|
return {
|
|
27
37
|
posture: "public",
|
|
@@ -35,6 +45,7 @@ export function makeShareSlice(over = {}) {
|
|
|
35
45
|
qrValue: SAMPLE_LINK.url,
|
|
36
46
|
embed: null,
|
|
37
47
|
pinterestHref: null,
|
|
48
|
+
app: null,
|
|
38
49
|
canManage: true,
|
|
39
50
|
roster: SAMPLE_ROSTER,
|
|
40
51
|
members: { onData: ok, onCode: ok, onRemove: ok, onInvite: ok },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share-fixtures.js","sourceRoot":"","sources":["../../../jsr/components/vibe-menu/share-fixtures.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"share-fixtures.js","sourceRoot":"","sources":["../../../jsr/components/vibe-menu/share-fixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
export interface ShareImageInput {
|
|
3
|
+
readonly screenshotUrl: string | null;
|
|
4
|
+
readonly title: string;
|
|
5
|
+
readonly handle: string;
|
|
6
|
+
readonly url: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const SHARE_IMAGE_WIDTH = 1080;
|
|
9
|
+
export declare const SHARE_IMAGE_HEIGHT = 1350;
|
|
10
|
+
export declare function shareImageLayout(): {
|
|
11
|
+
qr: {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
size: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export declare function renderShareImage(input: ShareImageInput): Promise<Result<Blob>>;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { exception2Result, Result } from "@adviser/cement";
|
|
2
|
+
import qrcode from "qrcode-generator";
|
|
3
|
+
export const SHARE_IMAGE_WIDTH = 1080;
|
|
4
|
+
export const SHARE_IMAGE_HEIGHT = 1350;
|
|
5
|
+
const INK = "#1a1a1a";
|
|
6
|
+
const PAPER = "#fbfaf7";
|
|
7
|
+
const FLAT_BLOCK = "#f2efe9";
|
|
8
|
+
const MUTED = "#5c5850";
|
|
9
|
+
const PANEL_EDGE = "#e4dfd6";
|
|
10
|
+
const QR_LIGHT = "#ffffff";
|
|
11
|
+
const QR_QUIET_MODULES = 4;
|
|
12
|
+
const SHOT = { x: 60, y: 60, w: 960, h: 600, r: 32 };
|
|
13
|
+
const QR_BOX = { x: 600, y: 700, size: 420 };
|
|
14
|
+
const TEXT_LEFT = 60;
|
|
15
|
+
const TEXT_WIDTH = QR_BOX.x - TEXT_LEFT - 40;
|
|
16
|
+
export function shareImageLayout() {
|
|
17
|
+
return { qr: { x: QR_BOX.x, y: QR_BOX.y, size: QR_BOX.size } };
|
|
18
|
+
}
|
|
19
|
+
function loadImage(src) {
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
const img = new Image();
|
|
22
|
+
img.crossOrigin = "anonymous";
|
|
23
|
+
img.onload = () => resolve(img.naturalWidth === 0 || img.naturalHeight === 0 ? undefined : img);
|
|
24
|
+
img.onerror = () => resolve(undefined);
|
|
25
|
+
img.src = src;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function roundedRect(ctx, box) {
|
|
29
|
+
const { x, y, w, h, r } = box;
|
|
30
|
+
ctx.beginPath();
|
|
31
|
+
if (typeof ctx.roundRect === "function") {
|
|
32
|
+
ctx.roundRect(x, y, w, h, r);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
ctx.moveTo(x + r, y);
|
|
36
|
+
ctx.arcTo(x + w, y, x + w, y + h, r);
|
|
37
|
+
ctx.arcTo(x + w, y + h, x, y + h, r);
|
|
38
|
+
ctx.arcTo(x, y + h, x, y, r);
|
|
39
|
+
ctx.arcTo(x, y, x + w, y, r);
|
|
40
|
+
ctx.closePath();
|
|
41
|
+
}
|
|
42
|
+
function ellipsize(ctx, fit) {
|
|
43
|
+
const { text, maxWidth, truncated = false } = fit;
|
|
44
|
+
if (truncated === false && ctx.measureText(text).width <= maxWidth)
|
|
45
|
+
return text;
|
|
46
|
+
let cut = text;
|
|
47
|
+
while (cut.length > 0 && ctx.measureText(`${cut}…`).width > maxWidth)
|
|
48
|
+
cut = cut.slice(0, -1);
|
|
49
|
+
return `${cut.trimEnd()}…`;
|
|
50
|
+
}
|
|
51
|
+
function clampLines(ctx, fit) {
|
|
52
|
+
const { text, maxWidth, maxLines } = fit;
|
|
53
|
+
const words = text
|
|
54
|
+
.trim()
|
|
55
|
+
.split(/\s+/)
|
|
56
|
+
.filter((w) => w.length > 0);
|
|
57
|
+
const lines = [];
|
|
58
|
+
let current = "";
|
|
59
|
+
for (const word of words) {
|
|
60
|
+
const candidate = current === "" ? word : `${current} ${word}`;
|
|
61
|
+
if (ctx.measureText(candidate).width <= maxWidth) {
|
|
62
|
+
current = candidate;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (current !== "")
|
|
66
|
+
lines.push(current);
|
|
67
|
+
current = word;
|
|
68
|
+
while (ctx.measureText(current).width > maxWidth && current.length > 1) {
|
|
69
|
+
let head = current;
|
|
70
|
+
while (head.length > 1 && ctx.measureText(head).width > maxWidth)
|
|
71
|
+
head = head.slice(0, -1);
|
|
72
|
+
lines.push(head);
|
|
73
|
+
current = current.slice(head.length);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (current !== "")
|
|
77
|
+
lines.push(current);
|
|
78
|
+
if (lines.length <= maxLines)
|
|
79
|
+
return lines;
|
|
80
|
+
const kept = lines.slice(0, maxLines);
|
|
81
|
+
kept[maxLines - 1] = ellipsize(ctx, { text: kept[maxLines - 1], maxWidth, truncated: true });
|
|
82
|
+
return kept;
|
|
83
|
+
}
|
|
84
|
+
function drawScreenshot(ctx, img) {
|
|
85
|
+
const scale = Math.max(SHOT.w / img.naturalWidth, SHOT.h / img.naturalHeight);
|
|
86
|
+
const sw = SHOT.w / scale;
|
|
87
|
+
const sh = SHOT.h / scale;
|
|
88
|
+
const sx = (img.naturalWidth - sw) / 2;
|
|
89
|
+
const sy = (img.naturalHeight - sh) / 2;
|
|
90
|
+
ctx.save();
|
|
91
|
+
roundedRect(ctx, SHOT);
|
|
92
|
+
ctx.clip();
|
|
93
|
+
ctx.drawImage(img, sx, sy, sw, sh, SHOT.x, SHOT.y, SHOT.w, SHOT.h);
|
|
94
|
+
ctx.restore();
|
|
95
|
+
}
|
|
96
|
+
function drawFlatBlock(ctx, title, font) {
|
|
97
|
+
ctx.fillStyle = FLAT_BLOCK;
|
|
98
|
+
roundedRect(ctx, SHOT);
|
|
99
|
+
ctx.fill();
|
|
100
|
+
ctx.fillStyle = INK;
|
|
101
|
+
ctx.font = `bold 72px ${font}`;
|
|
102
|
+
ctx.textAlign = "center";
|
|
103
|
+
ctx.textBaseline = "middle";
|
|
104
|
+
const lines = clampLines(ctx, { text: title, maxWidth: SHOT.w - 120, maxLines: 2 });
|
|
105
|
+
const lineHeight = 84;
|
|
106
|
+
const top = SHOT.y + SHOT.h / 2 - ((lines.length - 1) * lineHeight) / 2;
|
|
107
|
+
lines.forEach((line, i) => ctx.fillText(line, SHOT.x + SHOT.w / 2, top + i * lineHeight));
|
|
108
|
+
ctx.textAlign = "left";
|
|
109
|
+
ctx.textBaseline = "alphabetic";
|
|
110
|
+
}
|
|
111
|
+
function drawQr(ctx, url) {
|
|
112
|
+
const qr = qrcode(0, "M");
|
|
113
|
+
qr.addData(url);
|
|
114
|
+
qr.make();
|
|
115
|
+
const count = qr.getModuleCount();
|
|
116
|
+
const m = QR_BOX.size / (count + QR_QUIET_MODULES * 2);
|
|
117
|
+
ctx.fillStyle = QR_LIGHT;
|
|
118
|
+
roundedRect(ctx, { x: QR_BOX.x, y: QR_BOX.y, w: QR_BOX.size, h: QR_BOX.size, r: 24 });
|
|
119
|
+
ctx.fill();
|
|
120
|
+
ctx.strokeStyle = PANEL_EDGE;
|
|
121
|
+
ctx.lineWidth = 2;
|
|
122
|
+
ctx.stroke();
|
|
123
|
+
function edge(origin, i) {
|
|
124
|
+
return Math.round(origin + (i + QR_QUIET_MODULES) * m);
|
|
125
|
+
}
|
|
126
|
+
ctx.fillStyle = INK;
|
|
127
|
+
for (let r = 0; r < count; r++) {
|
|
128
|
+
for (let c = 0; c < count; c++) {
|
|
129
|
+
if (qr.isDark(r, c) === false)
|
|
130
|
+
continue;
|
|
131
|
+
const x0 = edge(QR_BOX.x, c);
|
|
132
|
+
const y0 = edge(QR_BOX.y, r);
|
|
133
|
+
ctx.fillRect(x0, y0, edge(QR_BOX.x, c + 1) - x0, edge(QR_BOX.y, r + 1) - y0);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function pageFont() {
|
|
138
|
+
const family = typeof document === "undefined" ? "" : getComputedStyle(document.body).fontFamily;
|
|
139
|
+
return family === "" ? "system-ui, sans-serif" : family;
|
|
140
|
+
}
|
|
141
|
+
async function fontsReady() {
|
|
142
|
+
if (typeof document === "undefined" || document.fonts === undefined)
|
|
143
|
+
return;
|
|
144
|
+
await document.fonts.ready;
|
|
145
|
+
}
|
|
146
|
+
function encodePng(canvas) {
|
|
147
|
+
return new Promise((resolve) => {
|
|
148
|
+
canvas.toBlob((blob) => {
|
|
149
|
+
resolve(blob === null ? Result.Err(new Error("renderShareImage: canvas could not encode PNG")) : Result.Ok(blob));
|
|
150
|
+
}, "image/png");
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
export async function renderShareImage(input) {
|
|
154
|
+
const canvas = document.createElement("canvas");
|
|
155
|
+
canvas.width = SHARE_IMAGE_WIDTH;
|
|
156
|
+
canvas.height = SHARE_IMAGE_HEIGHT;
|
|
157
|
+
const ctx = canvas.getContext("2d");
|
|
158
|
+
if (ctx === null)
|
|
159
|
+
return Result.Err(new Error("renderShareImage: no 2d canvas context"));
|
|
160
|
+
await fontsReady();
|
|
161
|
+
const font = pageFont();
|
|
162
|
+
const screenshot = input.screenshotUrl === null ? undefined : await loadImage(input.screenshotUrl);
|
|
163
|
+
ctx.fillStyle = PAPER;
|
|
164
|
+
ctx.fillRect(0, 0, SHARE_IMAGE_WIDTH, SHARE_IMAGE_HEIGHT);
|
|
165
|
+
if (screenshot === undefined)
|
|
166
|
+
drawFlatBlock(ctx, input.title, font);
|
|
167
|
+
else
|
|
168
|
+
drawScreenshot(ctx, screenshot);
|
|
169
|
+
let y = QR_BOX.y + 58;
|
|
170
|
+
if (screenshot !== undefined) {
|
|
171
|
+
ctx.fillStyle = INK;
|
|
172
|
+
ctx.font = `bold 64px ${font}`;
|
|
173
|
+
for (const line of clampLines(ctx, { text: input.title, maxWidth: TEXT_WIDTH, maxLines: 2 })) {
|
|
174
|
+
ctx.fillText(line, TEXT_LEFT, y);
|
|
175
|
+
y += 74;
|
|
176
|
+
}
|
|
177
|
+
y += 6;
|
|
178
|
+
}
|
|
179
|
+
ctx.fillStyle = MUTED;
|
|
180
|
+
ctx.font = `36px ${font}`;
|
|
181
|
+
ctx.fillText(ellipsize(ctx, { text: `by @${input.handle}`, maxWidth: TEXT_WIDTH }), TEXT_LEFT, y);
|
|
182
|
+
const qr = exception2Result(() => drawQr(ctx, input.url));
|
|
183
|
+
if (qr.isErr())
|
|
184
|
+
return Result.Err(qr.Err());
|
|
185
|
+
ctx.fillStyle = INK;
|
|
186
|
+
ctx.font = `28px ${font}`;
|
|
187
|
+
ctx.textAlign = "center";
|
|
188
|
+
ctx.fillText("Scan to open, no download needed", QR_BOX.x + QR_BOX.size / 2, QR_BOX.y + QR_BOX.size + 56);
|
|
189
|
+
ctx.textAlign = "left";
|
|
190
|
+
ctx.font = `bold 56px ${font}`;
|
|
191
|
+
ctx.fillText("Vibes", TEXT_LEFT, SHARE_IMAGE_HEIGHT - 70);
|
|
192
|
+
return encodePng(canvas);
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=share-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-image.js","sourceRoot":"","sources":["../../../jsr/components/vibe-menu/share-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,6 +81,15 @@ export interface CodeSlice {
|
|
|
81
81
|
agentLog?: ReactNode;
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
|
+
export type AppClipCardStatus = "requested" | "submitted" | "in_review" | "live" | "rejected" | "failed" | "deactivated";
|
|
85
|
+
export interface ShareAppSlice {
|
|
86
|
+
readonly url: string;
|
|
87
|
+
readonly screenshotUrl: string | null;
|
|
88
|
+
readonly title: string;
|
|
89
|
+
readonly handle: string;
|
|
90
|
+
readonly cardStatus?: AppClipCardStatus | null;
|
|
91
|
+
readonly onRequestCard?: () => void;
|
|
92
|
+
}
|
|
84
93
|
export interface ShareSlice {
|
|
85
94
|
posture: Posture;
|
|
86
95
|
postureState: AccessToggleState;
|
|
@@ -96,12 +105,14 @@ export interface ShareSlice {
|
|
|
96
105
|
url: string;
|
|
97
106
|
display: string;
|
|
98
107
|
};
|
|
108
|
+
onCopyLink?: () => void;
|
|
99
109
|
qrValue: string;
|
|
100
110
|
embed: {
|
|
101
111
|
snippet: string;
|
|
102
112
|
autoHeightSnippet?: string;
|
|
103
113
|
} | null;
|
|
104
114
|
pinterestHref: string | null;
|
|
115
|
+
app: ShareAppSlice | null;
|
|
105
116
|
canManage: boolean;
|
|
106
117
|
roster: readonly RosterMember[];
|
|
107
118
|
members: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slices.js","sourceRoot":"","sources":["../../../jsr/components/vibe-menu/slices.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slices.js","sourceRoot":"","sources":["../../../jsr/components/vibe-menu/slices.ts"],"names":[],"mappings":"AA0MA,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7C,UAAU,EAAE,qDAAqD;IACjE,eAAe,EAAE,sDAAsD;CAC/D,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type PictureStore } from "./picture-bytes.js";
|
|
2
|
+
export interface LocalFileRef {
|
|
3
|
+
readonly dbName: string;
|
|
4
|
+
readonly docId: string;
|
|
5
|
+
readonly key: string;
|
|
6
|
+
readonly uploadId: string;
|
|
7
|
+
}
|
|
8
|
+
export type LocalFileUrl = (ref: LocalFileRef) => string;
|
|
9
|
+
export declare function registeredLocalFileUrl(): LocalFileUrl | undefined;
|
|
10
|
+
export declare function registeredPictureStore(): PictureStore | undefined;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getRegisteredVibeApi } from "@vibes.diy/vibe-runtime";
|
|
2
|
+
import { buildFilesUrl } from "@vibes.diy/vibe-types";
|
|
3
|
+
import { createPictureStore, idbPictureBytes } from "./picture-bytes.js";
|
|
4
|
+
function registeredApp() {
|
|
5
|
+
const app = getRegisteredVibeApi()?.svc?.vibeApp;
|
|
6
|
+
if (app === undefined || app.assetOrigin === undefined || app.assetOrigin === "")
|
|
7
|
+
return undefined;
|
|
8
|
+
return { ownerHandle: app.ownerHandle, appSlug: app.appSlug, assetOrigin: app.assetOrigin };
|
|
9
|
+
}
|
|
10
|
+
export function registeredLocalFileUrl() {
|
|
11
|
+
const app = registeredApp();
|
|
12
|
+
if (app === undefined)
|
|
13
|
+
return undefined;
|
|
14
|
+
return function mintLocalFileUrl(ref) {
|
|
15
|
+
return buildFilesUrl({ assetOrigin: app.assetOrigin, ownerHandle: app.ownerHandle, appSlug: app.appSlug, ...ref });
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
let storeFor;
|
|
19
|
+
export function registeredPictureStore() {
|
|
20
|
+
const app = registeredApp();
|
|
21
|
+
if (app === undefined)
|
|
22
|
+
return undefined;
|
|
23
|
+
if (storeFor === undefined || storeFor.assetOrigin !== app.assetOrigin) {
|
|
24
|
+
storeFor = {
|
|
25
|
+
assetOrigin: app.assetOrigin,
|
|
26
|
+
store: createPictureStore({ assetOrigin: app.assetOrigin, bytes: idbPictureBytes() }),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return storeFor.store;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=local-pictures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-pictures.js","sourceRoot":"","sources":["../../../jsr/hooks/img-gen/local-pictures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAqB,MAAM,oBAAoB,CAAC;AAyB5F,SAAS,aAAa;IAGpB,MAAM,GAAG,GAAG,oBAAoB,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC;IACjD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACnG,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;AAC9F,CAAC;AAID,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,SAAS,gBAAgB,CAAC,GAAiB;QAChD,OAAO,aAAa,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IACrH,CAAC,CAAC;AACJ,CAAC;AAED,IAAI,QAAoF,CAAC;AAGzF,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;QACvE,QAAQ,GAAG;YACT,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,KAAK,EAAE,kBAAkB,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC;SACtF,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type PictureFetcher = (input: string, init?: RequestInit) => Promise<Response>;
|
|
2
|
+
export type PictureWarn = (event: string, fields: Record<string, unknown>) => void;
|
|
3
|
+
export declare function isRasterImageType(mime: string): boolean;
|
|
4
|
+
export interface PictureByteStore {
|
|
5
|
+
get(uploadId: string): Promise<Blob | undefined>;
|
|
6
|
+
put(uploadId: string, blob: Blob): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export type PictureFill = {
|
|
9
|
+
readonly outcome: "kept";
|
|
10
|
+
readonly blob: Blob;
|
|
11
|
+
} | {
|
|
12
|
+
readonly outcome: "not-kept";
|
|
13
|
+
readonly blob: Blob;
|
|
14
|
+
readonly confirmed: boolean;
|
|
15
|
+
} | {
|
|
16
|
+
readonly outcome: "known-not-keepable";
|
|
17
|
+
readonly confirmed: boolean;
|
|
18
|
+
} | {
|
|
19
|
+
readonly outcome: "other-upload";
|
|
20
|
+
} | {
|
|
21
|
+
readonly outcome: "unavailable";
|
|
22
|
+
};
|
|
23
|
+
export type PictureConfirm = "kept" | "dropped" | "unknown" | "none";
|
|
24
|
+
export interface PictureStore {
|
|
25
|
+
peek(uploadId: string): Blob | undefined;
|
|
26
|
+
lookup(uploadId: string): Promise<Blob | undefined>;
|
|
27
|
+
fill(ref: {
|
|
28
|
+
readonly uploadId: string;
|
|
29
|
+
readonly url: string;
|
|
30
|
+
}): Promise<PictureFill>;
|
|
31
|
+
seed(uploadId: string, blob: Blob): Promise<void>;
|
|
32
|
+
isUnconfirmed(uploadId: string): boolean;
|
|
33
|
+
confirm(ref: {
|
|
34
|
+
readonly uploadId: string;
|
|
35
|
+
readonly url: string;
|
|
36
|
+
}): Promise<PictureConfirm>;
|
|
37
|
+
}
|
|
38
|
+
export interface CreatePictureStoreOpts {
|
|
39
|
+
readonly assetOrigin: string;
|
|
40
|
+
readonly bytes: PictureByteStore;
|
|
41
|
+
readonly fetcher?: PictureFetcher;
|
|
42
|
+
readonly warn?: PictureWarn;
|
|
43
|
+
readonly memoryBytes?: number;
|
|
44
|
+
readonly localLookupMs?: number;
|
|
45
|
+
}
|
|
46
|
+
export declare function createPictureStore(opts: CreatePictureStoreOpts): PictureStore;
|
|
47
|
+
export declare const PICTURE_BYTES_DB = "vibes-picture-bytes";
|
|
48
|
+
export interface IdbPictureBytesOpts {
|
|
49
|
+
readonly indexedDB?: IDBFactory;
|
|
50
|
+
readonly dbName?: string;
|
|
51
|
+
readonly maxBytes?: number;
|
|
52
|
+
readonly now?: () => number;
|
|
53
|
+
}
|
|
54
|
+
export declare function idbPictureBytes(opts?: IdbPictureBytesOpts): PictureByteStore;
|