@w100n/documents 0.19.0 → 0.20.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.
@@ -5,7 +5,7 @@ import {
5
5
  pending,
6
6
  save,
7
7
  seed
8
- } from "./chunk-JSJEB2CO.js";
8
+ } from "./chunk-2JGDV5HG.js";
9
9
 
10
10
  // src/editor/live.ts
11
11
  import { HocuspocusProvider } from "@hocuspocus/provider";
@@ -190,7 +190,52 @@ ${id}`, id, kind, doc, host2, { id: me.id, name: me.name, language }, edit) : ne
190
190
  return url ? { ...state, wire, save: save2 } : null;
191
191
  }
192
192
 
193
+ // src/Swatches.tsx
194
+ import { Check } from "lucide-react";
195
+ import { jsx, jsxs } from "react/jsx-runtime";
196
+ var neutrals = ["#000000", "#475569", "#94a3b8", "#e2e8f0", "#ffffff"];
197
+ var hues = [
198
+ ["#fecaca", "#dc2626", "#991b1b"],
199
+ ["#fed7aa", "#ea580c", "#9a3412"],
200
+ ["#fde68a", "#d97706", "#92400e"],
201
+ ["#fef08a", "#ca8a04", "#854d0e"],
202
+ ["#bbf7d0", "#16a34a", "#166534"],
203
+ ["#99f6e4", "#0d9488", "#115e59"],
204
+ ["#bae6fd", "#0284c7", "#075985"],
205
+ ["#bfdbfe", "#2563eb", "#1e40af"],
206
+ ["#ddd6fe", "#7c3aed", "#5b21b6"],
207
+ ["#fbcfe8", "#db2777", "#9d174d"]
208
+ ];
209
+ var light = (hex) => {
210
+ const n = parseInt(hex.slice(1), 16);
211
+ return ((n >> 16) * 299 + (n >> 8 & 255) * 587 + (n & 255) * 114) / 1e3 > 150;
212
+ };
213
+ function Swatches({ current, none, onPick, onNone }) {
214
+ const chosen = current?.toLowerCase() ?? null;
215
+ const swatch = (c) => /* @__PURE__ */ jsx(
216
+ "button",
217
+ {
218
+ type: "button",
219
+ className: "w100n-swatch",
220
+ "aria-label": c,
221
+ "aria-pressed": chosen === c,
222
+ "data-light": light(c) || void 0,
223
+ style: { background: c },
224
+ onClick: () => onPick(c),
225
+ children: chosen === c && /* @__PURE__ */ jsx(Check, { "aria-hidden": true })
226
+ },
227
+ c
228
+ );
229
+ return /* @__PURE__ */ jsxs("span", { className: "w100n-swatches", role: "group", children: [
230
+ /* @__PURE__ */ jsx("button", { type: "button", className: "w100n-swatches-none", "aria-pressed": !chosen, onClick: onNone, children: none }),
231
+ neutrals.map(swatch),
232
+ /* @__PURE__ */ jsx("span", { className: "w100n-swatches-gap" }),
233
+ [0, 1, 2].flatMap((tone) => hues.map((h) => swatch(h[tone])))
234
+ ] });
235
+ }
236
+
193
237
  export {
194
- useLive
238
+ useLive,
239
+ Swatches
195
240
  };
196
- //# sourceMappingURL=chunk-ZQYSBWLK.js.map
241
+ //# sourceMappingURL=chunk-KIKKIOW6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editor/live.ts","../src/room.ts","../src/Swatches.tsx"],"sourcesContent":["import { HocuspocusProvider } from '@hocuspocus/provider';\nimport type { JSONContent } from '@tiptap/core';\nimport { useEffect, useRef, useState } from 'react';\nimport type { Awareness } from 'y-protocols/awareness';\nimport * as Y from 'yjs';\nimport { filled, seed, type Kind } from '../collab';\nimport { Link } from '../room';\nimport type { DocumentsHost, Language, Person } from '../types';\n\ntype Peer = Person & { color: string; me: boolean; selection?: { sheet: string; range: string } };\n\ntype Wire = {\n awareness: Awareness | null;\n isSynced: boolean;\n unsyncedChanges: number;\n on(name: string, fn: (payload: never) => void): unknown;\n off(name: string, fn: (payload: never) => void): unknown;\n sendStateless(payload: string): void;\n destroy(): void;\n};\n\ntype State = { synced: boolean; ready: boolean; online: boolean; late: boolean; denied: boolean; readonly: boolean; people: Peer[]; pending: boolean; unsynced: boolean };\n\nconst colors = ['#1d4ed8', '#be185d', '#15803d', '#c2410c', '#6d28d9', '#0e7490', '#a16207', '#b91c1c'];\nconst colorOf = (id: string) => colors[[...id].reduce((h, c) => (Math.imul(h, 31) + c.charCodeAt(0)) >>> 0, 7) % colors.length];\n\nconst idle: State = { synced: false, ready: false, online: false, late: false, denied: false, readonly: false, people: [], pending: false, unsynced: false };\n\nexport function useLive(host: DocumentsHost | undefined, id: string, kind: Kind, bytes: ArrayBuffer, json: JSONContent | undefined, language: Language, edit: boolean, onSaved?: () => void) {\n const url = host?.collab?.url;\n const owner = useRef(host);\n const [wire, setWire] = useState<{ doc: Y.Doc; link: Wire; user: Record<string, string> } | null>(null);\n const [state, setState] = useState(idle);\n const waiting = useRef<((ok: boolean) => void) | null>(null);\n const saved = useRef(onSaved);\n\n useEffect(() => {\n owner.current = host;\n saved.current = onSaved;\n });\n\n useEffect(() => {\n const host = owner.current;\n if (!host?.collab || !url) return;\n const doc = new Y.Doc();\n const me = host.me;\n const user = { id: me.id, name: me.name, avatar: me.avatarUrl ?? '', color: colorOf(me.id) };\n const wire = new URL(url, location.href);\n wire.protocol = wire.protocol.replace('http', 'ws');\n wire.searchParams.set('lang', language);\n const link: Wire = url.startsWith('memory:')\n ? new Link(`${url}\\n${id}`, id, kind, doc, host, { id: me.id, name: me.name, language }, edit)\n : new HocuspocusProvider({ url: wire.href, name: id, document: doc, token: () => owner.current!.collab!.token() });\n const set = (next: Partial<State>) => setState(s => ({ ...s, ...next }));\n const editors = doc.getMap('editors');\n const meta = doc.getMap('meta');\n const people = () => {\n const seen = new Map<string, Peer>();\n link.awareness?.getStates().forEach((s, client) => {\n const u = s.user as { id?: string; name?: string; avatar?: string; color?: string } | undefined;\n if (u?.id && u.name && !seen.has(u.id)) seen.set(u.id, { id: u.id, name: u.name, avatarUrl: u.avatar || null, color: u.color ?? colorOf(u.id), me: client === doc.clientID, selection: s.selection });\n });\n set({ people: [...seen.values()] });\n };\n const on = <T,>(name: string, fn: (payload: T) => void) => link.on(name, fn as (payload: never) => void);\n on<{ state: boolean }>('synced', ({ state }) => { if (state) set({ synced: true, online: true }); });\n on<{ status: string }>('status', ({ status }) => set({ online: status === 'connected' && link.isSynced }));\n on<{ scope: string }>('authenticated', ({ scope }) => set({ readonly: scope === 'readonly' }));\n on('authenticationFailed', () => set({ denied: true }));\n on<{ number: number }>('unsyncedChanges', ({ number }) => set({ unsynced: number > 0 }));\n on<{ payload: string }>('stateless', ({ payload }) => {\n const reply = JSON.parse(payload) as { saved?: string | null; failed?: boolean };\n if (!('saved' in reply) && !reply.failed) return;\n waiting.current?.(!reply.failed);\n waiting.current = null;\n });\n link.awareness?.on('change', people);\n editors.observe(() => set({ pending: editors.size > 0 }));\n meta.observe(e => { if (e.keysChanged.has('version')) saved.current?.(); });\n const late = setTimeout(() => set({ late: true }), 4000);\n setWire({ doc, link, user });\n return () => {\n clearTimeout(late);\n waiting.current?.(false);\n link.destroy();\n doc.destroy();\n setWire(null);\n setState(idle);\n };\n }, [url, id, kind, edit, language]);\n\n useEffect(() => {\n if (!wire || !state.synced || state.ready) return;\n if (filled(wire.doc) || ((json || kind === 'xlsx' || kind === 'csv') && seed(wire.doc, kind, bytes, json))) setState(s => ({ ...s, ready: true }));\n }, [wire, state.synced, state.ready, json, bytes, kind]);\n\n const save = () => new Promise<boolean>(done => {\n if (!wire) return done(false);\n waiting.current?.(false);\n waiting.current = done;\n wire.link.sendStateless(JSON.stringify({ save: true }));\n setTimeout(() => { if (waiting.current === done) { waiting.current = null; done(false); } }, 30000);\n });\n\n return url ? { ...state, wire, save } : null;\n}\n","import { applyAwarenessUpdate, Awareness, encodeAwarenessUpdate, removeAwarenessStates } from 'y-protocols/awareness';\nimport * as Y from 'yjs';\nimport { follow, pending, save, type Author, type Kind } from './collab';\nimport type { DocumentsHost } from './types';\n\ntype Room = { doc: Y.Doc; links: Set<Link>; base: ArrayBuffer | null; busy: Promise<unknown> };\ntype Listener = (payload: never) => void;\n\nexport const rooms = new Map<string, Room>();\n\nexport class Link {\n awareness: Awareness;\n isSynced = false;\n unsyncedChanges = 0;\n authorizedScope: 'read-write' | 'readonly';\n private room: Room;\n private live = false;\n private stop: () => void;\n private events = new Map<string, Set<Listener>>();\n\n constructor(key: string, private id: string, private kind: Kind, readonly document: Y.Doc, private host: DocumentsHost, readonly author: Author, edit: boolean) {\n this.awareness = new Awareness(document);\n this.authorizedScope = edit ? 'read-write' : 'readonly';\n if (!rooms.has(key)) rooms.set(key, { doc: new Y.Doc(), links: new Set(), base: null, busy: Promise.resolve() });\n this.room = rooms.get(key)!;\n this.room.links.add(this);\n this.stop = follow(this.room.doc, origin => origin === this && edit ? this.author : null);\n document.on('update', this.local);\n this.awareness.on('update', this.presence);\n this.room.doc.on('update', this.remote);\n queueMicrotask(() => this.online(true));\n }\n\n on(name: string, fn: Listener) {\n if (!this.events.has(name)) this.events.set(name, new Set());\n this.events.get(name)!.add(fn);\n }\n\n off(name: string, fn: Listener) {\n this.events.get(name)?.delete(fn);\n }\n\n private emit(name: string, payload: unknown) {\n this.events.get(name)?.forEach(fn => (fn as (p: unknown) => void)(payload));\n }\n\n private peers = () => [...this.room.links].filter(l => l !== this && l.live);\n\n online(on: boolean) {\n if (on === this.live || !this.room.links.has(this)) return;\n this.live = on;\n if (on) {\n Y.applyUpdate(this.document, Y.encodeStateAsUpdate(this.room.doc, Y.encodeStateVector(this.document)), this.room);\n if (this.authorizedScope === 'read-write') Y.applyUpdate(this.room.doc, Y.encodeStateAsUpdate(this.document, Y.encodeStateVector(this.room.doc)), this);\n for (const peer of this.peers()) {\n applyAwarenessUpdate(this.awareness, encodeAwarenessUpdate(peer.awareness, [peer.awareness.clientID]), this.room);\n applyAwarenessUpdate(peer.awareness, encodeAwarenessUpdate(this.awareness, [this.awareness.clientID]), this.room);\n }\n this.isSynced = true;\n } else for (const peer of this.peers()) removeAwarenessStates(peer.awareness, [this.awareness.clientID], this.room);\n this.emit('status', { status: on ? 'connected' : 'disconnected' });\n if (on) this.emit('synced', { state: true });\n }\n\n private local = (update: Uint8Array, origin: unknown) => {\n if (this.live && origin !== this.room && this.authorizedScope === 'read-write') Y.applyUpdate(this.room.doc, update, this);\n };\n\n private remote = (update: Uint8Array, origin: unknown) => {\n if (this.live && origin !== this) Y.applyUpdate(this.document, update, this.room);\n };\n\n private presence = ({ added, updated, removed }: { added: number[]; updated: number[]; removed: number[] }, origin: unknown) => {\n if (!this.live || origin === this.room) return;\n const update = encodeAwarenessUpdate(this.awareness, [...added, ...updated, ...removed]);\n for (const peer of this.peers()) applyAwarenessUpdate(peer.awareness, update, this.room);\n };\n\n private store() {\n const room = this.room;\n const run = room.busy.then(async () => {\n const done = await save(room.doc, this.kind, room.base ?? await this.host.content(this.id), async (bytes, note) => (await this.host.save!(this.id, bytes, note)).versionId);\n if (done) room.base = done.bytes;\n return done;\n });\n room.busy = run.catch(() => null);\n return run;\n }\n\n sendStateless(payload: string) {\n if (!this.live || this.authorizedScope !== 'read-write' || !(JSON.parse(payload) as { save?: boolean }).save) return;\n this.store().then(\n done => this.emit('stateless', { payload: JSON.stringify({ saved: done?.version ?? null }) }),\n () => this.emit('stateless', { payload: JSON.stringify({ failed: true }) }),\n );\n }\n\n destroy() {\n this.online(false);\n this.room.links.delete(this);\n this.stop();\n this.document.off('update', this.local);\n this.awareness.off('update', this.presence);\n this.room.doc.off('update', this.remote);\n this.awareness.destroy();\n if (!this.room.links.size && pending(this.room.doc) && this.authorizedScope === 'read-write') this.store().catch(() => null);\n }\n}\n","import { Check } from 'lucide-react';\n\nexport const neutrals = ['#000000', '#475569', '#94a3b8', '#e2e8f0', '#ffffff'];\nexport const hues = [\n ['#fecaca', '#dc2626', '#991b1b'], ['#fed7aa', '#ea580c', '#9a3412'], ['#fde68a', '#d97706', '#92400e'], ['#fef08a', '#ca8a04', '#854d0e'], ['#bbf7d0', '#16a34a', '#166534'],\n ['#99f6e4', '#0d9488', '#115e59'], ['#bae6fd', '#0284c7', '#075985'], ['#bfdbfe', '#2563eb', '#1e40af'], ['#ddd6fe', '#7c3aed', '#5b21b6'], ['#fbcfe8', '#db2777', '#9d174d'],\n];\n\nconst light = (hex: string) => {\n const n = parseInt(hex.slice(1), 16);\n return ((n >> 16) * 299 + ((n >> 8) & 255) * 587 + (n & 255) * 114) / 1000 > 150;\n};\n\nexport default function Swatches({ current, none, onPick, onNone }: { current: string | null; none: string; onPick: (color: string) => void; onNone: () => void }) {\n const chosen = current?.toLowerCase() ?? null;\n const swatch = (c: string) => <button key={c} type=\"button\" className=\"w100n-swatch\" aria-label={c} aria-pressed={chosen === c} data-light={light(c) || undefined}\n style={{ background: c }} onClick={() => onPick(c)}>{chosen === c && <Check aria-hidden />}</button>;\n return <span className=\"w100n-swatches\" role=\"group\">\n <button type=\"button\" className=\"w100n-swatches-none\" aria-pressed={!chosen} onClick={onNone}>{none}</button>\n {neutrals.map(swatch)}\n <span className=\"w100n-swatches-gap\" />\n {[0, 1, 2].flatMap(tone => hues.map(h => swatch(h[tone])))}\n </span>;\n}\n"],"mappings":"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","names":["Y","host","wire","state","save"]}
package/dist/collab.cjs CHANGED
@@ -32,6 +32,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
32
32
  var collab_exports = {};
33
33
  __export(collab_exports, {
34
34
  Refusal: () => Refusal,
35
+ addSheet: () => addSheet,
35
36
  appendRows: () => appendRows,
36
37
  applyCells: () => applyCells,
37
38
  applySteps: () => applySteps,
@@ -45,7 +46,8 @@ __export(collab_exports, {
45
46
  parse: () => parse3,
46
47
  pending: () => pending,
47
48
  save: () => save,
48
- seed: () => seed
49
+ seed: () => seed,
50
+ where: () => where
49
51
  });
50
52
  module.exports = __toCommonJS(collab_exports);
51
53
  var import_core3 = require("@tiptap/core");
@@ -54,7 +56,7 @@ var import_y_tiptap2 = require("@tiptap/y-tiptap");
54
56
  var Y3 = __toESM(require("yjs"), 1);
55
57
 
56
58
  // package.json
57
- var version = "0.19.0";
59
+ var version = "0.20.0";
58
60
 
59
61
  // src/docx/xml.ts
60
62
  function parse(s) {
@@ -6086,6 +6088,9 @@ var en = {
6086
6088
  loading: "Opening the sheet",
6087
6089
  failed: "This sheet could not be opened",
6088
6090
  retry: "Try again",
6091
+ fontSize: "Font size",
6092
+ smaller: "Smaller text",
6093
+ bigger: "Bigger text",
6089
6094
  undo: "Undo",
6090
6095
  redo: "Redo",
6091
6096
  bold: "Bold",
@@ -6159,6 +6164,9 @@ var pl = {
6159
6164
  loading: "Otwieranie arkusza",
6160
6165
  failed: "Nie uda\u0142o si\u0119 otworzy\u0107 tego arkusza",
6161
6166
  retry: "Spr\xF3buj ponownie",
6167
+ fontSize: "Rozmiar czcionki",
6168
+ smaller: "Mniejszy tekst",
6169
+ bigger: "Wi\u0119kszy tekst",
6162
6170
  undo: "Cofnij",
6163
6171
  redo: "Pon\xF3w",
6164
6172
  bold: "Pogrubienie",
@@ -6232,6 +6240,9 @@ var uk = {
6232
6240
  loading: "\u0412\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0454\u043C\u043E \u0442\u0430\u0431\u043B\u0438\u0446\u044E",
6233
6241
  failed: "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0446\u044E \u0442\u0430\u0431\u043B\u0438\u0446\u044E",
6234
6242
  retry: "\u0421\u043F\u0440\u043E\u0431\u0443\u0432\u0430\u0442\u0438 \u0449\u0435",
6243
+ fontSize: "\u0420\u043E\u0437\u043C\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0443",
6244
+ smaller: "\u041C\u0435\u043D\u0448\u0438\u0439 \u0442\u0435\u043A\u0441\u0442",
6245
+ bigger: "\u0411\u0456\u043B\u044C\u0448\u0438\u0439 \u0442\u0435\u043A\u0441\u0442",
6235
6246
  undo: "\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438",
6236
6247
  redo: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438",
6237
6248
  bold: "\u0416\u0438\u0440\u043D\u0438\u0439",
@@ -7478,6 +7489,23 @@ function clashes(doc, kind, seen, list) {
7478
7489
  old.destroy();
7479
7490
  return out;
7480
7491
  }
7492
+ function addSheet(doc, name, origin) {
7493
+ if (sheetId(doc, name)) return false;
7494
+ const { order: order2, sheets } = parts(doc);
7495
+ const sid = fresh("sheet");
7496
+ doc.transact(() => {
7497
+ sheets.set(sid, made({ id: sid, name }, { rows: Array.from({ length: 1e3 }, () => fresh("n")), cols: Array.from({ length: 26 }, () => fresh("n")) }));
7498
+ order2.push([sid]);
7499
+ }, origin);
7500
+ return true;
7501
+ }
7502
+ function where(doc, sheet, refs3) {
7503
+ const sid = sheetId(doc, sheet);
7504
+ const at3 = refs3.flatMap((r) => r.split(":")).map(cell).filter(([r]) => r >= 0);
7505
+ if (!sid || !at3.length) return null;
7506
+ const rows = at3.map((x) => x[0]), cols = at3.map((x) => x[1]);
7507
+ return { sheet: sid, range: span({ startRow: Math.min(...rows), endRow: Math.max(...rows), startColumn: Math.min(...cols), endColumn: Math.max(...cols) }) };
7508
+ }
7481
7509
  function appendRows(doc, sheet, lines2, origin) {
7482
7510
  const sid = sheetId(doc, sheet);
7483
7511
  if (!sid || !lines2.length) return null;
@@ -7719,6 +7747,7 @@ async function workbook(doc, kind, base, put, who, note) {
7719
7747
  // Annotate the CommonJS export names for ESM import in node:
7720
7748
  0 && (module.exports = {
7721
7749
  Refusal,
7750
+ addSheet,
7722
7751
  appendRows,
7723
7752
  applyCells,
7724
7753
  applySteps,
@@ -7732,6 +7761,7 @@ async function workbook(doc, kind, base, put, who, note) {
7732
7761
  parse,
7733
7762
  pending,
7734
7763
  save,
7735
- seed
7764
+ seed,
7765
+ where
7736
7766
  });
7737
7767
  //# sourceMappingURL=collab.cjs.map