@inkandswitch/patchwork-pkg-base 0.0.135 → 0.0.136
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/module-settings-url +1 -1
- package/package.json +1 -1
- package/packages/account/dist/{ContactAvatar-IVYTJ7M4.js → ContactAvatar-IL5NSSA4.js} +2 -3
- package/packages/account/dist/{ContactAvatar-IVYTJ7M4.js.map → ContactAvatar-IL5NSSA4.js.map} +1 -1
- package/packages/account/dist/{ContactCursor-2FVKF5QA.js → ContactCursor-AAYWKZQ6.js} +2 -3
- package/packages/account/dist/{ContactCursor-2FVKF5QA.js.map → ContactCursor-AAYWKZQ6.js.map} +1 -1
- package/packages/account/dist/{ContactViewer-32NVB5LB.js → ContactViewer-XSBR3IGY.js} +1 -2
- package/packages/account/dist/{ContactViewer-32NVB5LB.js.map → ContactViewer-XSBR3IGY.js.map} +1 -1
- package/packages/account/dist/{InlineContactAvatar-6UAAJ73R.js → InlineContactAvatar-IWMTGVN7.js} +1 -2
- package/packages/account/dist/{InlineContactAvatar-6UAAJ73R.js.map → InlineContactAvatar-IWMTGVN7.js.map} +1 -1
- package/packages/account/dist/{chunk-L6JWPAD3.js → chunk-3744NRLE.js} +2 -25
- package/packages/account/dist/{chunk-L6JWPAD3.js.map → chunk-3744NRLE.js.map} +1 -1
- package/packages/account/dist/{datatype-Y52FEGOW.js → datatype-TO6U5DAY.js} +1 -3
- package/packages/account/dist/{datatype-Y52FEGOW.js.map → datatype-TO6U5DAY.js.map} +1 -1
- package/packages/account/dist/index.css +0 -507
- package/packages/account/dist/index.css.map +3 -3
- package/packages/account/dist/index.js +9 -22
- package/packages/account/dist/index.js.map +2 -2
- package/packages/account/dist/{styles-KCFZAQMN.js → styles-XU34T3AI.js} +1 -3
- package/packages/account/dist/{styles-KCFZAQMN.js.map → styles-XU34T3AI.js.map} +1 -1
- package/packages/account/package.json +1 -1
- package/packages/codemirror-markdown/dist/extensions/markdown.js +19 -5
- package/packages/codemirror-markdown/dist/extensions/markdown.js.map +2 -2
- package/packages/settings/dist/assets/Settings-Do_cRfv4.js +3 -0
- package/packages/settings/dist/assets/Settings-Do_cRfv4.js.map +1 -0
- package/packages/settings/dist/index.js +1 -1
- package/packages/settings/dist/index.js.map +1 -1
- package/packages/settings/package.json +1 -1
- package/packages/sideboard/dist/account-bar-F3MXGPYB.js +2 -0
- package/packages/sideboard/dist/chunk-4RJIKO65.js +2 -0
- package/packages/sideboard/dist/chunk-4RJIKO65.js.map +7 -0
- package/packages/sideboard/dist/index.js +1 -1
- package/packages/sideboard/dist/sideboard/sideboard.js +1 -1
- package/packages/threepane/dist/IsolatedDocumentArea-GDW25K5U.js +2 -0
- package/packages/threepane/dist/PatchworkFrame-Y342MRR3.js +2 -0
- package/packages/threepane/dist/PatchworkFrame-Y342MRR3.js.map +7 -0
- package/packages/threepane/dist/{chunk-UJ7QHTY6.js → chunk-2HSAKXXA.js} +106 -7
- package/packages/threepane/dist/{chunk-UJ7QHTY6.js.map → chunk-2HSAKXXA.js.map} +2 -2
- package/packages/threepane/dist/index.js +1 -1
- package/plugin-registry-url +1 -1
- package/packages/account/dist/AccountPicker-SBCGXHRS.js +0 -7008
- package/packages/account/dist/AccountPicker-SBCGXHRS.js.map +0 -7
- package/packages/account/dist/chunk-5WRI5ZAA.js +0 -31
- package/packages/settings/dist/assets/FrameConfigurator-M-u9az7g.js +0 -3
- package/packages/settings/dist/assets/FrameConfigurator-M-u9az7g.js.map +0 -1
- package/packages/sideboard/dist/account-bar-6WTRIGGE.js +0 -2
- package/packages/sideboard/dist/chunk-JE5VBSXY.js +0 -2
- package/packages/sideboard/dist/chunk-JE5VBSXY.js.map +0 -7
- package/packages/threepane/dist/IsolatedDocumentArea-ZF6AC4GB.js +0 -2
- package/packages/threepane/dist/IsolatedDocumentArea-ZF6AC4GB.js.map +0 -7
- package/packages/threepane/dist/PatchworkFrame-SEJC7VST.js +0 -2
- package/packages/threepane/dist/PatchworkFrame-SEJC7VST.js.map +0 -7
- /package/packages/{account/dist/chunk-5WRI5ZAA.js.map → sideboard/dist/account-bar-F3MXGPYB.js.map} +0 -0
- /package/packages/{sideboard/dist/account-bar-6WTRIGGE.js.map → threepane/dist/IsolatedDocumentArea-GDW25K5U.js.map} +0 -0
package/module-settings-url
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
automerge:
|
|
1
|
+
automerge:3633yPsrgw8iUoYHwKDpMASRcmtC
|
package/package.json
CHANGED
|
@@ -6,8 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-PLRZBPU4.js";
|
|
7
7
|
import {
|
|
8
8
|
themedColor
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-5WRI5ZAA.js";
|
|
9
|
+
} from "./chunk-3744NRLE.js";
|
|
11
10
|
|
|
12
11
|
// src/contact/ContactAvatar.ts
|
|
13
12
|
import { getImportableUrlFromAutomergeUrl } from "@inkandswitch/patchwork-filesystem";
|
|
@@ -109,4 +108,4 @@ function renderContactAvatar(handle, element) {
|
|
|
109
108
|
export {
|
|
110
109
|
renderContactAvatar
|
|
111
110
|
};
|
|
112
|
-
//# sourceMappingURL=ContactAvatar-
|
|
111
|
+
//# sourceMappingURL=ContactAvatar-IL5NSSA4.js.map
|
package/packages/account/dist/{ContactAvatar-IVYTJ7M4.js.map → ContactAvatar-IL5NSSA4.js.map}
RENAMED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/contact/ContactAvatar.ts"],
|
|
4
4
|
"sourcesContent": ["import type { AutomergeUrl, DocHandle } from \"@automerge/automerge-repo/slim\";\nimport type { ToolElement } from \"@inkandswitch/patchwork-plugins\";\nimport type { ContactDoc } from \"../types\";\nimport { themedColor } from \"../user-colors\";\nimport { createAvatar, setAvatarImage, setAvatarFallback, getInitials } from \"./Avatar\";\nimport { getImportableUrlFromAutomergeUrl } from \"@inkandswitch/patchwork-filesystem\";\nimport { subscribe } from \"@inkandswitch/patchwork-providers\";\n\ndeclare global {\n interface Window {\n accountDocHandle?: { url: AutomergeUrl };\n }\n}\n\ntype TinyPatchworkLayoutDoc = {\n contactUrl: AutomergeUrl;\n};\n\nexport function renderContactAvatar(\n handle: DocHandle<ContactDoc>,\n element: ToolElement\n) {\n const avatar = createAvatar(\"default\");\n element.appendChild(avatar);\n\n let selfName = \"me\";\n const cleanups: (() => void)[] = [];\n\n // Track presence via ephemeral messages\n const heartbeats: Record<string, number> = {};\n let presenceTimer: ReturnType<typeof setInterval>;\n\n function onEphemeralMessage(message: { senderId: string; message: unknown }) {\n // useRemoteAwareness tracks heartbeats from ephemeral messages\n if (message.senderId) {\n heartbeats[message.senderId] = Date.now();\n }\n updatePresence();\n }\n\n function updatePresence() {\n const now = Date.now();\n const timeout = 30000;\n const isPresent = Object.entries(heartbeats).some(\n ([id, ts]) => id !== selfName && now - ts < timeout\n );\n\n // The contact's chosen color; without one, the CSS fallback (neutral\n // gray) applies.\n const userColor = handle.doc()?.color;\n\n if (isPresent) {\n avatar.classList.add(\"contact-avatar--present\");\n if (userColor) {\n avatar.style.setProperty(\"--contact-presence-color\", themedColor(userColor));\n } else {\n avatar.style.removeProperty(\"--contact-presence-color\");\n }\n } else {\n avatar.classList.remove(\"contact-avatar--present\");\n avatar.style.removeProperty(\"--contact-presence-color\");\n }\n }\n\n handle.on(\"ephemeral-message\", onEphemeralMessage);\n cleanups.push(() => handle.off(\"ephemeral-message\", onEphemeralMessage));\n\n // Periodically clean up stale heartbeats\n presenceTimer = setInterval(updatePresence, 5000);\n cleanups.push(() => clearInterval(presenceTimer));\n\n // Get own contact via provider subscription\n const unsubscribe = subscribe<string>(\n element,\n { type: \"patchwork:contact\" },\n (contactUrl) => {\n element.repo\n .find<ContactDoc>(contactUrl as AutomergeUrl)\n .then((selfHandle) => {\n const selfDoc = selfHandle.doc();\n if (selfDoc?.type === \"registered\") {\n selfName = selfDoc.name;\n }\n });\n }\n );\n cleanups.push(unsubscribe);\n\n // Fallback: use window.accountDocHandle\n if (window.accountDocHandle) {\n element.repo\n .find<TinyPatchworkLayoutDoc>(window.accountDocHandle.url)\n .then((accountHandle) => {\n const accountDoc = accountHandle.doc();\n if (accountDoc?.contactUrl) {\n element.repo\n .find<ContactDoc>(accountDoc.contactUrl)\n .then((selfHandle) => {\n const selfDoc = selfHandle.doc();\n if (selfDoc?.type === \"registered\") {\n selfName = selfDoc.name;\n }\n });\n }\n });\n }\n\n async function update() {\n const contact = handle.doc();\n if (!contact) {\n avatar.style.display = \"none\";\n return;\n }\n avatar.style.display = \"\";\n\n const isRegistered = contact.type === \"registered\";\n const name = isRegistered ? contact.name : \"Anonymous\";\n\n // avatar image\n let avatarImgUrl: string | undefined;\n if (isRegistered && contact.avatarUrl) {\n try {\n const avatarHandle = await element.repo.find(contact.avatarUrl);\n avatarImgUrl = getImportableUrlFromAutomergeUrl(avatarHandle.url);\n } catch {\n // ignore failed avatar lookup\n }\n }\n setAvatarImage(avatar, avatarImgUrl, name);\n\n // fallback\n if (isRegistered && name) {\n setAvatarFallback(avatar, { initials: getInitials(name) });\n } else {\n setAvatarFallback(avatar, { iconSize: 20 });\n }\n\n updatePresence();\n }\n\n handle.on(\"change\", update);\n cleanups.push(() => handle.off(\"change\", update));\n update();\n\n return () => {\n for (const cleanup of cleanups) cleanup();\n };\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;AAKA,SAAS,wCAAwC;AACjD,SAAS,iBAAiB;AAYnB,SAAS,oBACd,QACA,SACA;AACA,QAAM,SAAS,aAAa,SAAS;AACrC,UAAQ,YAAY,MAAM;AAE1B,MAAI,WAAW;AACf,QAAM,WAA2B,CAAC;AAGlC,QAAM,aAAqC,CAAC;AAC5C,MAAI;AAEJ,WAAS,mBAAmB,SAAiD;AAE3E,QAAI,QAAQ,UAAU;AACpB,iBAAW,QAAQ,QAAQ,IAAI,KAAK,IAAI;AAAA,IAC1C;AACA,mBAAe;AAAA,EACjB;AAEA,WAAS,iBAAiB;AACxB,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,UAAU;AAChB,UAAM,YAAY,OAAO,QAAQ,UAAU,EAAE;AAAA,MAC3C,CAAC,CAAC,IAAI,EAAE,MAAM,OAAO,YAAY,MAAM,KAAK;AAAA,IAC9C;AAIA,UAAM,YAAY,OAAO,IAAI,GAAG;AAEhC,QAAI,WAAW;AACb,aAAO,UAAU,IAAI,yBAAyB;AAC9C,UAAI,WAAW;AACb,eAAO,MAAM,YAAY,4BAA4B,YAAY,SAAS,CAAC;AAAA,MAC7E,OAAO;AACL,eAAO,MAAM,eAAe,0BAA0B;AAAA,MACxD;AAAA,IACF,OAAO;AACL,aAAO,UAAU,OAAO,yBAAyB;AACjD,aAAO,MAAM,eAAe,0BAA0B;AAAA,IACxD;AAAA,EACF;AAEA,SAAO,GAAG,qBAAqB,kBAAkB;AACjD,WAAS,KAAK,MAAM,OAAO,IAAI,qBAAqB,kBAAkB,CAAC;AAGvE,kBAAgB,YAAY,gBAAgB,GAAI;AAChD,WAAS,KAAK,MAAM,cAAc,aAAa,CAAC;AAGhD,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,EAAE,MAAM,oBAAoB;AAAA,IAC5B,CAAC,eAAe;AACd,cAAQ,KACL,KAAiB,UAA0B,EAC3C,KAAK,CAAC,eAAe;AACpB,cAAM,UAAU,WAAW,IAAI;AAC/B,YAAI,SAAS,SAAS,cAAc;AAClC,qBAAW,QAAQ;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACF;AACA,WAAS,KAAK,WAAW;AAGzB,MAAI,OAAO,kBAAkB;AAC3B,YAAQ,KACL,KAA6B,OAAO,iBAAiB,GAAG,EACxD,KAAK,CAAC,kBAAkB;AACvB,YAAM,aAAa,cAAc,IAAI;AACrC,UAAI,YAAY,YAAY;AAC1B,gBAAQ,KACL,KAAiB,WAAW,UAAU,EACtC,KAAK,CAAC,eAAe;AACpB,gBAAM,UAAU,WAAW,IAAI;AAC/B,cAAI,SAAS,SAAS,cAAc;AAClC,uBAAW,QAAQ;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACL;AAEA,iBAAe,SAAS;AACtB,UAAM,UAAU,OAAO,IAAI;AAC3B,QAAI,CAAC,SAAS;AACZ,aAAO,MAAM,UAAU;AACvB;AAAA,IACF;AACA,WAAO,MAAM,UAAU;AAEvB,UAAM,eAAe,QAAQ,SAAS;AACtC,UAAM,OAAO,eAAe,QAAQ,OAAO;AAG3C,QAAI;AACJ,QAAI,gBAAgB,QAAQ,WAAW;AACrC,UAAI;AACF,cAAM,eAAe,MAAM,QAAQ,KAAK,KAAK,QAAQ,SAAS;AAC9D,uBAAe,iCAAiC,aAAa,GAAG;AAAA,MAClE,QAAQ;AAAA,MAER;AAAA,IACF;AACA,mBAAe,QAAQ,cAAc,IAAI;AAGzC,QAAI,gBAAgB,MAAM;AACxB,wBAAkB,QAAQ,EAAE,UAAU,YAAY,IAAI,EAAE,CAAC;AAAA,IAC3D,OAAO;AACL,wBAAkB,QAAQ,EAAE,UAAU,GAAG,CAAC;AAAA,IAC5C;AAEA,mBAAe;AAAA,EACjB;AAEA,SAAO,GAAG,UAAU,MAAM;AAC1B,WAAS,KAAK,MAAM,OAAO,IAAI,UAAU,MAAM,CAAC;AAChD,SAAO;AAEP,SAAO,MAAM;AACX,eAAW,WAAW,SAAU,SAAQ;AAAA,EAC1C;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
themedColor
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-5WRI5ZAA.js";
|
|
3
|
+
} from "./chunk-3744NRLE.js";
|
|
5
4
|
|
|
6
5
|
// src/contact/ContactCursor.ts
|
|
7
6
|
function renderContactCursor(handle, element) {
|
|
@@ -34,4 +33,4 @@ function renderContactCursor(handle, element) {
|
|
|
34
33
|
export {
|
|
35
34
|
renderContactCursor
|
|
36
35
|
};
|
|
37
|
-
//# sourceMappingURL=ContactCursor-
|
|
36
|
+
//# sourceMappingURL=ContactCursor-AAYWKZQ6.js.map
|
package/packages/account/dist/{ContactCursor-2FVKF5QA.js.map → ContactCursor-AAYWKZQ6.js.map}
RENAMED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/contact/ContactCursor.ts"],
|
|
4
4
|
"sourcesContent": ["import type { DocHandle } from \"@automerge/automerge-repo/slim\";\nimport type { ToolElement } from \"@inkandswitch/patchwork-plugins\";\nimport type { ContactDoc } from \"../types\";\nimport { themedColor } from \"../user-colors\";\n\n/**\n * A compact cursor token: the contact's name on a pill in their presence\n * color. Hosts that render remote cursors (text editors, canvases) mount it\n * next to their own cursor primitive (caret line, pointer arrow) via\n * `<patchwork-view doc-url={contactUrl} tool-id=\"contact-cursor\">`.\n */\nexport function renderContactCursor(\n handle: DocHandle<ContactDoc>,\n element: ToolElement\n) {\n const token = document.createElement(\"div\");\n token.className = \"contact-cursor-token\";\n element.appendChild(token);\n\n function update() {\n const contact = handle.doc();\n if (!contact) {\n token.style.display = \"none\";\n return;\n }\n token.style.display = \"\";\n const name = contact.type === \"registered\" ? contact.name : \"Anonymous\";\n // The contact's chosen color; without one, the CSS fallback (neutral\n // gray) applies.\n if (contact.color) {\n token.style.setProperty(\"--contact-cursor-color\", themedColor(contact.color));\n } else {\n token.style.removeProperty(\"--contact-cursor-color\");\n }\n token.textContent = name;\n token.title = name;\n }\n\n handle.on(\"change\", update);\n update();\n\n return () => {\n handle.off(\"change\", update);\n token.remove();\n };\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;AAWO,SAAS,oBACd,QACA,SACA;AACA,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,UAAQ,YAAY,KAAK;AAEzB,WAAS,SAAS;AAChB,UAAM,UAAU,OAAO,IAAI;AAC3B,QAAI,CAAC,SAAS;AACZ,YAAM,MAAM,UAAU;AACtB;AAAA,IACF;AACA,UAAM,MAAM,UAAU;AACtB,UAAM,OAAO,QAAQ,SAAS,eAAe,QAAQ,OAAO;AAG5D,QAAI,QAAQ,OAAO;AACjB,YAAM,MAAM,YAAY,0BAA0B,YAAY,QAAQ,KAAK,CAAC;AAAA,IAC9E,OAAO;AACL,YAAM,MAAM,eAAe,wBAAwB;AAAA,IACrD;AACA,UAAM,cAAc;AACpB,UAAM,QAAQ;AAAA,EAChB;AAEA,SAAO,GAAG,UAAU,MAAM;AAC1B,SAAO;AAEP,SAAO,MAAM;AACX,WAAO,IAAI,UAAU,MAAM;AAC3B,UAAM,OAAO;AAAA,EACf;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
setAvatarFallback,
|
|
5
5
|
setAvatarImage
|
|
6
6
|
} from "./chunk-PLRZBPU4.js";
|
|
7
|
-
import "./chunk-5WRI5ZAA.js";
|
|
8
7
|
|
|
9
8
|
// src/contact/ContactViewer.ts
|
|
10
9
|
import { automergeUrlToServiceWorkerUrl } from "@inkandswitch/patchwork-filesystem";
|
|
@@ -58,4 +57,4 @@ function renderContactViewer(handle, element) {
|
|
|
58
57
|
export {
|
|
59
58
|
renderContactViewer
|
|
60
59
|
};
|
|
61
|
-
//# sourceMappingURL=ContactViewer-
|
|
60
|
+
//# sourceMappingURL=ContactViewer-XSBR3IGY.js.map
|
package/packages/account/dist/{ContactViewer-32NVB5LB.js.map → ContactViewer-XSBR3IGY.js.map}
RENAMED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/contact/ContactViewer.ts"],
|
|
4
4
|
"sourcesContent": ["import type { DocHandle } from \"@automerge/automerge-repo/slim\";\nimport type { ToolElement } from \"@inkandswitch/patchwork-plugins\";\nimport type { ContactDoc } from \"../types\";\nimport { createAvatar, setAvatarImage, setAvatarFallback, getInitials } from \"./Avatar\";\nimport { automergeUrlToServiceWorkerUrl } from \"@inkandswitch/patchwork-filesystem\";\n\nexport function renderContactViewer(\n handle: DocHandle<ContactDoc>,\n element: ToolElement\n) {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"contact-viewer\";\n\n const avatar = createAvatar(\"lg\");\n const nameEl = document.createElement(\"h2\");\n nameEl.className = \"contact-viewer-name\";\n const labelEl = document.createElement(\"p\");\n labelEl.className = \"contact-viewer-label\";\n labelEl.textContent = \"Unregistered user\";\n\n wrapper.append(avatar, nameEl);\n element.appendChild(wrapper);\n\n async function update() {\n const contact = handle.doc();\n if (!contact) {\n wrapper.style.display = \"none\";\n return;\n }\n wrapper.style.display = \"\";\n\n const isRegistered = contact.type === \"registered\";\n const name = isRegistered ? contact.name : \"Anonymous\";\n\n nameEl.textContent = name;\n\n // avatar image\n let avatarImgUrl: string | undefined;\n if (isRegistered && contact.avatarUrl) {\n try {\n const avatarHandle = await element.repo.find(contact.avatarUrl);\n avatarImgUrl = automergeUrlToServiceWorkerUrl(avatarHandle.url);\n } catch {\n // ignore failed avatar lookup\n }\n }\n setAvatarImage(avatar, avatarImgUrl, name);\n\n // fallback\n if (isRegistered && name) {\n setAvatarFallback(avatar, { initials: getInitials(name) });\n } else {\n setAvatarFallback(avatar, { iconSize: 32 });\n }\n\n // label\n if (!isRegistered) {\n if (!wrapper.contains(labelEl)) wrapper.appendChild(labelEl);\n } else {\n labelEl.remove();\n }\n }\n\n handle.on(\"change\", update);\n update();\n\n return () => {\n handle.off(\"change\", update);\n };\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;AAIA,SAAS,sCAAsC;AAExC,SAAS,oBACd,QACA,SACA;AACA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAEpB,QAAM,SAAS,aAAa,IAAI;AAChC,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,SAAO,YAAY;AACnB,QAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,UAAQ,YAAY;AACpB,UAAQ,cAAc;AAEtB,UAAQ,OAAO,QAAQ,MAAM;AAC7B,UAAQ,YAAY,OAAO;AAE3B,iBAAe,SAAS;AACtB,UAAM,UAAU,OAAO,IAAI;AAC3B,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,UAAU;AACxB;AAAA,IACF;AACA,YAAQ,MAAM,UAAU;AAExB,UAAM,eAAe,QAAQ,SAAS;AACtC,UAAM,OAAO,eAAe,QAAQ,OAAO;AAE3C,WAAO,cAAc;AAGrB,QAAI;AACJ,QAAI,gBAAgB,QAAQ,WAAW;AACrC,UAAI;AACF,cAAM,eAAe,MAAM,QAAQ,KAAK,KAAK,QAAQ,SAAS;AAC9D,uBAAe,+BAA+B,aAAa,GAAG;AAAA,MAChE,QAAQ;AAAA,MAER;AAAA,IACF;AACA,mBAAe,QAAQ,cAAc,IAAI;AAGzC,QAAI,gBAAgB,MAAM;AACxB,wBAAkB,QAAQ,EAAE,UAAU,YAAY,IAAI,EAAE,CAAC;AAAA,IAC3D,OAAO;AACL,wBAAkB,QAAQ,EAAE,UAAU,GAAG,CAAC;AAAA,IAC5C;AAGA,QAAI,CAAC,cAAc;AACjB,UAAI,CAAC,QAAQ,SAAS,OAAO,EAAG,SAAQ,YAAY,OAAO;AAAA,IAC7D,OAAO;AACL,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,GAAG,UAAU,MAAM;AAC1B,SAAO;AAEP,SAAO,MAAM;AACX,WAAO,IAAI,UAAU,MAAM;AAAA,EAC7B;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/packages/account/dist/{InlineContactAvatar-6UAAJ73R.js → InlineContactAvatar-IWMTGVN7.js}
RENAMED
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
setAvatarFallback,
|
|
5
5
|
setAvatarImage
|
|
6
6
|
} from "./chunk-PLRZBPU4.js";
|
|
7
|
-
import "./chunk-5WRI5ZAA.js";
|
|
8
7
|
|
|
9
8
|
// src/contact/InlineContactAvatar.ts
|
|
10
9
|
import { automergeUrlToServiceWorkerUrl } from "@inkandswitch/patchwork-filesystem";
|
|
@@ -45,4 +44,4 @@ function renderInlineContactAvatar(handle, element) {
|
|
|
45
44
|
export {
|
|
46
45
|
renderInlineContactAvatar
|
|
47
46
|
};
|
|
48
|
-
//# sourceMappingURL=InlineContactAvatar-
|
|
47
|
+
//# sourceMappingURL=InlineContactAvatar-IWMTGVN7.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/contact/InlineContactAvatar.ts"],
|
|
4
4
|
"sourcesContent": ["import type { DocHandle } from \"@automerge/automerge-repo/slim\";\nimport type { ToolElement } from \"@inkandswitch/patchwork-plugins\";\nimport type { ContactDoc } from \"../types\";\nimport { createAvatar, setAvatarImage, setAvatarFallback, getInitials } from \"./Avatar\";\nimport { automergeUrlToServiceWorkerUrl } from \"@inkandswitch/patchwork-filesystem\";\n\nexport function renderInlineContactAvatar(\n handle: DocHandle<ContactDoc>,\n element: ToolElement\n) {\n const avatar = createAvatar(\"sm\");\n element.appendChild(avatar);\n\n async function update() {\n const contact = handle.doc();\n if (!contact) {\n avatar.style.display = \"none\";\n return;\n }\n avatar.style.display = \"\";\n\n const isRegistered = contact.type === \"registered\";\n const name = isRegistered ? contact.name : \"Anonymous\";\n avatar.title = name;\n\n // avatar image\n let avatarImgUrl: string | undefined;\n if (isRegistered && contact.avatarUrl) {\n try {\n const avatarHandle = await element.repo.find(contact.avatarUrl);\n avatarImgUrl = automergeUrlToServiceWorkerUrl(avatarHandle.url);\n } catch {\n // ignore failed avatar lookup\n }\n }\n setAvatarImage(avatar, avatarImgUrl, name);\n\n // fallback\n if (isRegistered && name) {\n setAvatarFallback(avatar, { initials: getInitials(name) });\n } else {\n setAvatarFallback(avatar, { iconSize: 16 });\n }\n }\n\n handle.on(\"change\", update);\n update();\n\n return () => {\n handle.off(\"change\", update);\n };\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;AAIA,SAAS,sCAAsC;AAExC,SAAS,0BACd,QACA,SACA;AACA,QAAM,SAAS,aAAa,IAAI;AAChC,UAAQ,YAAY,MAAM;AAE1B,iBAAe,SAAS;AACtB,UAAM,UAAU,OAAO,IAAI;AAC3B,QAAI,CAAC,SAAS;AACZ,aAAO,MAAM,UAAU;AACvB;AAAA,IACF;AACA,WAAO,MAAM,UAAU;AAEvB,UAAM,eAAe,QAAQ,SAAS;AACtC,UAAM,OAAO,eAAe,QAAQ,OAAO;AAC3C,WAAO,QAAQ;AAGf,QAAI;AACJ,QAAI,gBAAgB,QAAQ,WAAW;AACrC,UAAI;AACF,cAAM,eAAe,MAAM,QAAQ,KAAK,KAAK,QAAQ,SAAS;AAC9D,uBAAe,+BAA+B,aAAa,GAAG;AAAA,MAChE,QAAQ;AAAA,MAER;AAAA,IACF;AACA,mBAAe,QAAQ,cAAc,IAAI;AAGzC,QAAI,gBAAgB,MAAM;AACxB,wBAAkB,QAAQ,EAAE,UAAU,YAAY,IAAI,EAAE,CAAC;AAAA,IAC3D,OAAO;AACL,wBAAkB,QAAQ,EAAE,UAAU,GAAG,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,GAAG,UAAU,MAAM;AAC1B,SAAO;AAEP,SAAO,MAAM;AACX,WAAO,IAAI,UAAU,MAAM;AAAA,EAC7B;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -22,31 +22,8 @@ function themedColor(color) {
|
|
|
22
22
|
const token = TOKENS.get(squash(color));
|
|
23
23
|
return token ? `var(${token}, ${color})` : color;
|
|
24
24
|
}
|
|
25
|
-
function generateColorFromString(str) {
|
|
26
|
-
const hash = Math.abs(
|
|
27
|
-
str.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0)
|
|
28
|
-
);
|
|
29
|
-
const colorIndex = hash % USER_COLOR_PALETTE.length;
|
|
30
|
-
return USER_COLOR_PALETTE[colorIndex].value;
|
|
31
|
-
}
|
|
32
|
-
function getRandomUserColor() {
|
|
33
|
-
return USER_COLOR_PALETTE[Math.floor(Math.random() * USER_COLOR_PALETTE.length)].value;
|
|
34
|
-
}
|
|
35
|
-
function parseHslColor(color) {
|
|
36
|
-
const match = color.match(/^hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$/);
|
|
37
|
-
if (!match) return null;
|
|
38
|
-
return {
|
|
39
|
-
h: parseInt(match[1], 10),
|
|
40
|
-
s: parseInt(match[2], 10),
|
|
41
|
-
l: parseInt(match[3], 10)
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
25
|
|
|
45
26
|
export {
|
|
46
|
-
|
|
47
|
-
themedColor,
|
|
48
|
-
generateColorFromString,
|
|
49
|
-
getRandomUserColor,
|
|
50
|
-
parseHslColor
|
|
27
|
+
themedColor
|
|
51
28
|
};
|
|
52
|
-
//# sourceMappingURL=chunk-
|
|
29
|
+
//# sourceMappingURL=chunk-3744NRLE.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/user-colors.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * User color palette for presence indicators (cursors, avatars, etc.)\n *\n * Colors are selected to:\n * - Be easily distinguishable from each other\n * - Work well on both light and dark backgrounds\n * - Be accessible and readable\n * - Look professional and modern\n */\n\nexport const USER_COLOR_PALETTE = [\n { name: \"Sky Blue\", value: \"hsl(200, 70%, 50%)\" },\n { name: \"Coral\", value: \"hsl(10, 75%, 58%)\" },\n { name: \"Emerald\", value: \"hsl(145, 70%, 45%)\" },\n { name: \"Violet\", value: \"hsl(270, 70%, 55%)\" },\n { name: \"Amber\", value: \"hsl(38, 85%, 50%)\" },\n { name: \"Rose\", value: \"hsl(350, 70%, 55%)\" },\n { name: \"Teal\", value: \"hsl(178, 70%, 45%)\" },\n { name: \"Indigo\", value: \"hsl(235, 70%, 58%)\" },\n { name: \"Lime\", value: \"hsl(85, 70%, 45%)\" },\n { name: \"Fuchsia\", value: \"hsl(310, 70%, 55%)\" },\n { name: \"Orange\", value: \"hsl(25, 80%, 52%)\" },\n { name: \"Cyan\", value: \"hsl(188, 75%, 48%)\" },\n] as const;\n\n/** \"Sky Blue\" \u2192 \"sky-blue\": the palette colour's theme token suffix. */\nconst slug = (name: string) => name.toLowerCase().replace(/\\s+/g, \"-\");\nconst squash = (color: string) => color.replace(/\\s+/g, \"\").toLowerCase();\nconst TOKENS = new Map(\n USER_COLOR_PALETTE.map((c) => [squash(c.value), `--studio-presence-${slug(c.name)}`])\n);\n\n/**\n * A contact colour as it should be drawn: a palette colour becomes its theme\n * token (`--studio-presence-sky-blue`, see theming's theme.css), falling back\n * to the stored value, so a theme can restyle everyone's colours. Any other\n * colour (picked with the custom picker) is drawn as it is.\n */\nexport function themedColor(color: string): string {\n const token = TOKENS.get(squash(color));\n return token ? `var(${token}, ${color})` : color;\n}\n\n/**\n * Generate a deterministic color from a string (like a contact url).\n * Only used to seed `contact.color` at signup -- presence rendering never\n * derives colors, it reads `contact.color` from the account.\n */\nexport function generateColorFromString(str: string): string {\n const hash = Math.abs(\n str.split(\"\").reduce((acc, char) => acc + char.charCodeAt(0), 0)\n );\n const colorIndex = hash % USER_COLOR_PALETTE.length;\n return USER_COLOR_PALETTE[colorIndex].value;\n}\n\n/**\n * Get a default color for a user (picks from palette based on index)\n */\nexport function getDefaultUserColor(index: number): string {\n return USER_COLOR_PALETTE[index % USER_COLOR_PALETTE.length].value;\n}\n\nexport function getRandomUserColor(): string {\n return USER_COLOR_PALETTE[\n Math.floor(Math.random() * USER_COLOR_PALETTE.length)\n ].value;\n}\n\n/**\n * Validate if a string is a valid HSL color\n */\nexport function isValidHslColor(color: string): boolean {\n return /^hsl\\(\\s*\\d+\\s*,\\s*\\d+%\\s*,\\s*\\d+%\\s*\\)$/.test(color);\n}\n\n/**\n * Parse HSL values from a color string\n */\nexport function parseHslColor(\n color: string\n): { h: number; s: number; l: number } | null {\n const match = color.match(/^hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)$/);\n if (!match) return null;\n return {\n h: parseInt(match[1], 10),\n s: parseInt(match[2], 10),\n l: parseInt(match[3], 10),\n };\n}\n\n/**\n * Create an HSL color string from values\n */\nexport function createHslColor(h: number, s: number, l: number): string {\n return `hsl(${h}, ${s}%, ${l}%)`;\n}\n"],
|
|
5
|
-
"mappings": ";AAUO,IAAM,qBAAqB;AAAA,EAChC,EAAE,MAAM,YAAY,OAAO,qBAAqB;AAAA,EAChD,EAAE,MAAM,SAAS,OAAO,oBAAoB;AAAA,EAC5C,EAAE,MAAM,WAAW,OAAO,qBAAqB;AAAA,EAC/C,EAAE,MAAM,UAAU,OAAO,qBAAqB;AAAA,EAC9C,EAAE,MAAM,SAAS,OAAO,oBAAoB;AAAA,EAC5C,EAAE,MAAM,QAAQ,OAAO,qBAAqB;AAAA,EAC5C,EAAE,MAAM,QAAQ,OAAO,qBAAqB;AAAA,EAC5C,EAAE,MAAM,UAAU,OAAO,qBAAqB;AAAA,EAC9C,EAAE,MAAM,QAAQ,OAAO,oBAAoB;AAAA,EAC3C,EAAE,MAAM,WAAW,OAAO,qBAAqB;AAAA,EAC/C,EAAE,MAAM,UAAU,OAAO,oBAAoB;AAAA,EAC7C,EAAE,MAAM,QAAQ,OAAO,qBAAqB;AAC9C;AAGA,IAAM,OAAO,CAAC,SAAiB,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG;AACrE,IAAM,SAAS,CAAC,UAAkB,MAAM,QAAQ,QAAQ,EAAE,EAAE,YAAY;AACxE,IAAM,SAAS,IAAI;AAAA,EACjB,mBAAmB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,GAAG,qBAAqB,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;AACtF;AAQO,SAAS,YAAY,OAAuB;AACjD,QAAM,QAAQ,OAAO,IAAI,OAAO,KAAK,CAAC;AACtC,SAAO,QAAQ,OAAO,KAAK,KAAK,KAAK,MAAM;AAC7C;
|
|
5
|
+
"mappings": ";AAUO,IAAM,qBAAqB;AAAA,EAChC,EAAE,MAAM,YAAY,OAAO,qBAAqB;AAAA,EAChD,EAAE,MAAM,SAAS,OAAO,oBAAoB;AAAA,EAC5C,EAAE,MAAM,WAAW,OAAO,qBAAqB;AAAA,EAC/C,EAAE,MAAM,UAAU,OAAO,qBAAqB;AAAA,EAC9C,EAAE,MAAM,SAAS,OAAO,oBAAoB;AAAA,EAC5C,EAAE,MAAM,QAAQ,OAAO,qBAAqB;AAAA,EAC5C,EAAE,MAAM,QAAQ,OAAO,qBAAqB;AAAA,EAC5C,EAAE,MAAM,UAAU,OAAO,qBAAqB;AAAA,EAC9C,EAAE,MAAM,QAAQ,OAAO,oBAAoB;AAAA,EAC3C,EAAE,MAAM,WAAW,OAAO,qBAAqB;AAAA,EAC/C,EAAE,MAAM,UAAU,OAAO,oBAAoB;AAAA,EAC7C,EAAE,MAAM,QAAQ,OAAO,qBAAqB;AAC9C;AAGA,IAAM,OAAO,CAAC,SAAiB,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG;AACrE,IAAM,SAAS,CAAC,UAAkB,MAAM,QAAQ,QAAQ,EAAE,EAAE,YAAY;AACxE,IAAM,SAAS,IAAI;AAAA,EACjB,mBAAmB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,GAAG,qBAAqB,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;AACtF;AAQO,SAAS,YAAY,OAAuB;AACjD,QAAM,QAAQ,OAAO,IAAI,OAAO,KAAK,CAAC;AACtC,SAAO,QAAQ,OAAO,KAAK,KAAK,KAAK,MAAM;AAC7C;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import "./chunk-5WRI5ZAA.js";
|
|
2
|
-
|
|
3
1
|
// src/contact/datatype.ts
|
|
4
2
|
var init = (doc) => {
|
|
5
3
|
Object.assign(doc, {
|
|
@@ -26,4 +24,4 @@ export {
|
|
|
26
24
|
ContactDatatype,
|
|
27
25
|
init
|
|
28
26
|
};
|
|
29
|
-
//# sourceMappingURL=datatype-
|
|
27
|
+
//# sourceMappingURL=datatype-TO6U5DAY.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/contact/datatype.ts"],
|
|
4
4
|
"sourcesContent": ["import { type DatatypeImplementation } from \"@inkandswitch/patchwork-plugins\";\nimport type { ContactDoc } from \"../types\";\n\nexport const init = (doc: ContactDoc) => {\n Object.assign(doc, {\n type: \"anonymous\",\n } as ContactDoc);\n};\n\nconst getTitle = (doc: ContactDoc) => {\n if (doc.type === \"registered\") {\n return doc.name;\n }\n return \"Anonymous\";\n};\n\nconst setTitle = (doc: ContactDoc, title: string) => {\n if (doc.type === \"registered\") {\n doc.name = title;\n }\n};\n\nexport const ContactDatatype: DatatypeImplementation<ContactDoc> = {\n init,\n getTitle,\n setTitle,\n};\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";AAGO,IAAM,OAAO,CAAC,QAAoB;AACvC,SAAO,OAAO,KAAK;AAAA,IACjB,MAAM;AAAA,EACR,CAAe;AACjB;AAEA,IAAM,WAAW,CAAC,QAAoB;AACpC,MAAI,IAAI,SAAS,cAAc;AAC7B,WAAO,IAAI;AAAA,EACb;AACA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,KAAiB,UAAkB;AACnD,MAAI,IAAI,SAAS,cAAc;AAC7B,QAAI,OAAO;AAAA,EACb;AACF;AAEO,IAAM,kBAAsD;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|