@w100n/documents 0.16.3 → 0.16.4

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/dist/index.d.cts CHANGED
@@ -56,6 +56,15 @@ declare function DocumentsWorkspace({ host, language, theme, place, onPlace, sta
56
56
  actions?: (doc: DocumentFile) => ReactNode;
57
57
  }): react.JSX.Element;
58
58
 
59
+ declare function FilePreview({ url, name, mimeType, size, bytes, pdfWorker }: {
60
+ url: string;
61
+ name: string;
62
+ mimeType?: string;
63
+ size?: number;
64
+ bytes?: (url: string) => Promise<ArrayBuffer>;
65
+ pdfWorker?: () => Worker;
66
+ }): react.JSX.Element | null;
67
+
59
68
  type GuestRefusal = 'missing' | 'ended' | 'password' | 'wrong' | 'name' | 'busy';
60
69
  declare class GuestRefused extends Error {
61
70
  readonly reason: GuestRefusal;
@@ -160,4 +169,4 @@ declare function SlidesView({ html, name, rights, language, theme, baseUrl, scri
160
169
  guard?: Guard;
161
170
  }): react.JSX.Element;
162
171
 
163
- export { type Deck, type DeckKind, DocumentFile, DocumentOverlay, DocumentsHost, DocumentsWorkspace, type DocxModel, GuestDocument, GuestHost, type GuestRefusal, GuestRefused, Language, Place, Rights, type Slide, SlidesView, readDeck, readDocx, writeDeck, writeDocx };
172
+ export { type Deck, type DeckKind, DocumentFile, DocumentOverlay, DocumentsHost, DocumentsWorkspace, type DocxModel, FilePreview, GuestDocument, GuestHost, type GuestRefusal, GuestRefused, Language, Place, Rights, type Slide, SlidesView, readDeck, readDocx, writeDeck, writeDocx };
package/dist/index.d.ts CHANGED
@@ -56,6 +56,15 @@ declare function DocumentsWorkspace({ host, language, theme, place, onPlace, sta
56
56
  actions?: (doc: DocumentFile) => ReactNode;
57
57
  }): react.JSX.Element;
58
58
 
59
+ declare function FilePreview({ url, name, mimeType, size, bytes, pdfWorker }: {
60
+ url: string;
61
+ name: string;
62
+ mimeType?: string;
63
+ size?: number;
64
+ bytes?: (url: string) => Promise<ArrayBuffer>;
65
+ pdfWorker?: () => Worker;
66
+ }): react.JSX.Element | null;
67
+
59
68
  type GuestRefusal = 'missing' | 'ended' | 'password' | 'wrong' | 'name' | 'busy';
60
69
  declare class GuestRefused extends Error {
61
70
  readonly reason: GuestRefusal;
@@ -160,4 +169,4 @@ declare function SlidesView({ html, name, rights, language, theme, baseUrl, scri
160
169
  guard?: Guard;
161
170
  }): react.JSX.Element;
162
171
 
163
- export { type Deck, type DeckKind, DocumentFile, DocumentOverlay, DocumentsHost, DocumentsWorkspace, type DocxModel, GuestDocument, GuestHost, type GuestRefusal, GuestRefused, Language, Place, Rights, type Slide, SlidesView, readDeck, readDocx, writeDeck, writeDocx };
172
+ export { type Deck, type DeckKind, DocumentFile, DocumentOverlay, DocumentsHost, DocumentsWorkspace, type DocxModel, FilePreview, GuestDocument, GuestHost, type GuestRefusal, GuestRefused, Language, Place, Rights, type Slide, SlidesView, readDeck, readDocx, writeDeck, writeDocx };
package/dist/index.js CHANGED
@@ -2409,8 +2409,8 @@ function PdfView({ bytes, t, language, worker, rights, host, documentId, onSaved
2409
2409
 
2410
2410
  // src/DocumentOverlay.tsx
2411
2411
  import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
2412
- var TextEditor = lazy(() => import("./TextEditor-RNHXPYJX.js"));
2413
- var SheetView = lazy(() => import("./SheetView-KXFUAILH.js"));
2412
+ var TextEditor = lazy(() => import("./TextEditor-5S7FSLIZ.js"));
2413
+ var SheetView = lazy(() => import("./SheetView-OEKOHMKW.js"));
2414
2414
  var icons = { docx: FileText, markdown: FileType, pdf: Files, sheet: FileSpreadsheet, slides: Presentation };
2415
2415
  var read = { view: true, comment: false, edit: false };
2416
2416
  var quiet = () => {
@@ -3124,14 +3124,14 @@ function Thumb({ host, item, label }) {
3124
3124
  /* @__PURE__ */ jsx8("i", {}),
3125
3125
  /* @__PURE__ */ jsx8("i", {})
3126
3126
  ] }) }),
3127
- /* @__PURE__ */ jsx8("span", { className: "w100n-docs-kind", "data-kind": item.kind, children: label })
3127
+ label && /* @__PURE__ */ jsx8("span", { className: "w100n-docs-kind", "data-kind": item.kind, children: label })
3128
3128
  ] });
3129
3129
  }
3130
3130
 
3131
3131
  // src/DocumentsWorkspace.tsx
3132
3132
  import { Fragment as Fragment8, jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
3133
- var TextEditor2 = lazy2(() => import("./TextEditor-RNHXPYJX.js"));
3134
- var SheetView2 = lazy2(() => import("./SheetView-KXFUAILH.js"));
3133
+ var TextEditor2 = lazy2(() => import("./TextEditor-5S7FSLIZ.js"));
3134
+ var SheetView2 = lazy2(() => import("./SheetView-OEKOHMKW.js"));
3135
3135
  var Compare = lazy2(() => import("./Compare-M57FG4R3.js"));
3136
3136
  var icons3 = { docx: FileText3, markdown: FileType3, pdf: Files2, sheet: FileSpreadsheet3, slides: Presentation3 };
3137
3137
  function DocumentsWorkspace({ host, language = "en", theme = "light", place, onPlace, start, end, aside, actions }) {
@@ -3408,8 +3408,8 @@ function DocumentsWorkspace({ host, language = "en", theme = "light", place, onP
3408
3408
  clearTimeout(hover.current);
3409
3409
  hover.current = window.setTimeout(() => {
3410
3410
  if (item.id === here.documentId) return;
3411
- if (item.kind === "docx" || item.kind === "markdown") void import("./TextEditor-RNHXPYJX.js");
3412
- if (item.kind === "sheet") void import("./SheetView-KXFUAILH.js");
3411
+ if (item.kind === "docx" || item.kind === "markdown") void import("./TextEditor-5S7FSLIZ.js");
3412
+ if (item.kind === "sheet") void import("./SheetView-OEKOHMKW.js");
3413
3413
  const kept2 = early.current.get(item.id);
3414
3414
  if (kept2 && Date.now() - kept2.at < 15e3 || item.size > 5e6) return;
3415
3415
  const next = { at: Date.now(), doc: host.document(item.id), bytes: host.content(item.id, null) };
@@ -4141,12 +4141,22 @@ function DocumentsWorkspace({ host, language = "en", theme = "light", place, onP
4141
4141
  ] });
4142
4142
  }
4143
4143
 
4144
+ // src/FilePreview.tsx
4145
+ import { useState as useState10 } from "react";
4146
+ import { jsx as jsx10 } from "react/jsx-runtime";
4147
+ function FilePreview({ url, name, mimeType, size = 0, bytes, pdfWorker }) {
4148
+ const [source] = useState10(() => ({ pdfWorker, content: () => bytes ? bytes(url) : fetch(url, { credentials: "include" }).then((res) => res.ok ? res.arrayBuffer() : Promise.reject(new Error(String(res.status)))) }));
4149
+ const kind = kindOf(name, mimeType);
4150
+ if (!kind) return null;
4151
+ return /* @__PURE__ */ jsx10("span", { className: "w100n-preview", children: /* @__PURE__ */ jsx10(Thumb, { host: source, item: { id: url.split("?")[0], spaceId: "", name, kind, size, updatedAt: "" } }) });
4152
+ }
4153
+
4144
4154
  // src/GuestDocument.tsx
4145
- import { lazy as lazy3, Suspense as Suspense3, useRef as useRef7, useState as useState10 } from "react";
4155
+ import { lazy as lazy3, Suspense as Suspense3, useRef as useRef7, useState as useState11 } from "react";
4146
4156
  import { Ban as Ban2, Download as Download4, Eye as Eye2, FileDown as FileDown2, FileSpreadsheet as FileSpreadsheet4, FileText as FileText4, FileType as FileType4, Files as Files3, Lock as Lock2, Presentation as Presentation4, UserRound } from "lucide-react";
4147
- import { Fragment as Fragment9, jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
4148
- var TextEditor3 = lazy3(() => import("./TextEditor-RNHXPYJX.js"));
4149
- var SheetView3 = lazy3(() => import("./SheetView-KXFUAILH.js"));
4157
+ import { Fragment as Fragment9, jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
4158
+ var TextEditor3 = lazy3(() => import("./TextEditor-5S7FSLIZ.js"));
4159
+ var SheetView3 = lazy3(() => import("./SheetView-OEKOHMKW.js"));
4150
4160
  var icons4 = { docx: FileText4, markdown: FileType4, pdf: Files3, sheet: FileSpreadsheet4, slides: Presentation4 };
4151
4161
  var GuestRefused = class extends Error {
4152
4162
  constructor(reason, file = "", sharedBy = "") {
@@ -4172,14 +4182,14 @@ var remember = (name) => {
4172
4182
  };
4173
4183
  function GuestDocument({ host, language = "en", theme = "light", brand }) {
4174
4184
  const t = texts[language];
4175
- const [ask, setAsk] = useState10(() => ({ name: remembered() || void 0 }));
4176
- const [typed, setTyped] = useState10("");
4177
- const [name, setName] = useState10(remembered);
4185
+ const [ask, setAsk] = useState11(() => ({ name: remembered() || void 0 }));
4186
+ const [typed, setTyped] = useState11("");
4187
+ const [name, setName] = useState11(remembered);
4178
4188
  const named = useRef7(name);
4179
- const [slot, setSlot] = useState10(null);
4180
- const [saving, setSaving] = useState10("idle");
4189
+ const [slot, setSlot] = useState11(null);
4190
+ const [saving, setSaving] = useState11("idle");
4181
4191
  const opened = useLoad((signal) => host.open(ask, { signal }), [host, ask]);
4182
- const [notes] = useState10(() => ({
4192
+ const [notes] = useState11(() => ({
4183
4193
  me: { id: "", name: "" },
4184
4194
  spaces: async () => [],
4185
4195
  documents: async () => [],
@@ -4207,14 +4217,14 @@ function GuestDocument({ host, language = "en", theme = "light", brand }) {
4207
4217
  const kind2 = file2 ? kindOf(file2.name, file2.mimeType) : null;
4208
4218
  const Kind = kind2 ? icons4[kind2] : FileText4;
4209
4219
  return /* @__PURE__ */ jsxs10("header", { className: "w100n-docs-bar w100n-guest-bar", children: [
4210
- brand && /* @__PURE__ */ jsx10("span", { className: "w100n-guest-brand", children: brand }),
4220
+ brand && /* @__PURE__ */ jsx11("span", { className: "w100n-guest-brand", children: brand }),
4211
4221
  file2 && /* @__PURE__ */ jsxs10(Fragment9, { children: [
4212
- /* @__PURE__ */ jsx10("span", { className: "w100n-docs-tile", "data-kind": kind2, children: /* @__PURE__ */ jsx10(Kind, { "aria-hidden": true }) }),
4222
+ /* @__PURE__ */ jsx11("span", { className: "w100n-docs-tile", "data-kind": kind2, children: /* @__PURE__ */ jsx11(Kind, { "aria-hidden": true }) }),
4213
4223
  /* @__PURE__ */ jsxs10("div", { className: "w100n-docs-heading", children: [
4214
- /* @__PURE__ */ jsx10("strong", { className: "w100n-docs-title", children: file2.name }),
4215
- file2.sharedBy && /* @__PURE__ */ jsx10("span", { className: "w100n-docs-crumbs", children: t.sharedBy.replace("{name}", file2.sharedBy) })
4224
+ /* @__PURE__ */ jsx11("strong", { className: "w100n-docs-title", children: file2.name }),
4225
+ file2.sharedBy && /* @__PURE__ */ jsx11("span", { className: "w100n-docs-crumbs", children: t.sharedBy.replace("{name}", file2.sharedBy) })
4216
4226
  ] }),
4217
- badge && /* @__PURE__ */ jsx10("span", { className: "w100n-docs-badge", "data-kind": kind2, children: badge }),
4227
+ badge && /* @__PURE__ */ jsx11("span", { className: "w100n-docs-badge", "data-kind": kind2, children: badge }),
4218
4228
  file2.download && /* @__PURE__ */ jsxs10("div", { className: "w100n-docs-end", children: [
4219
4229
  (kind2 === "docx" || kind2 === "markdown" || kind2 === "sheet" || kind2 === "slides") && /* @__PURE__ */ jsxs10(
4220
4230
  "button",
@@ -4227,14 +4237,14 @@ function GuestDocument({ host, language = "en", theme = "light", brand }) {
4227
4237
  "aria-label": t.pdfCopy,
4228
4238
  title: t.pdfCopy,
4229
4239
  children: [
4230
- /* @__PURE__ */ jsx10(FileDown2, { "aria-hidden": true }),
4231
- /* @__PURE__ */ jsx10("span", { children: t.pdfCopy })
4240
+ /* @__PURE__ */ jsx11(FileDown2, { "aria-hidden": true }),
4241
+ /* @__PURE__ */ jsx11("span", { children: t.pdfCopy })
4232
4242
  ]
4233
4243
  }
4234
4244
  ),
4235
4245
  /* @__PURE__ */ jsxs10("button", { type: "button", className: "w100n-docs-action", "data-tone": "blue", disabled: saving === "busy", onClick: () => void download("file"), "aria-label": t.download, title: t.download, children: [
4236
- /* @__PURE__ */ jsx10(Download4, { "aria-hidden": true }),
4237
- /* @__PURE__ */ jsx10("span", { children: t.download })
4246
+ /* @__PURE__ */ jsx11(Download4, { "aria-hidden": true }),
4247
+ /* @__PURE__ */ jsx11("span", { children: t.download })
4238
4248
  ] })
4239
4249
  ] })
4240
4250
  ] })
@@ -4242,10 +4252,10 @@ function GuestDocument({ host, language = "en", theme = "light", brand }) {
4242
4252
  };
4243
4253
  const gate = (tone, Icon, title, body, form) => /* @__PURE__ */ jsxs10("div", { className: "w100n-docs w100n-guest", "data-theme": theme, children: [
4244
4254
  top(null, null),
4245
- /* @__PURE__ */ jsx10("div", { className: "w100n-guest-gate", children: /* @__PURE__ */ jsxs10("div", { className: "w100n-guest-card", children: [
4246
- /* @__PURE__ */ jsx10("span", { className: "w100n-share-tile", "data-tone": tone, children: /* @__PURE__ */ jsx10(Icon, { "aria-hidden": true }) }),
4247
- /* @__PURE__ */ jsx10("h2", { children: title }),
4248
- /* @__PURE__ */ jsx10("p", { children: body }),
4255
+ /* @__PURE__ */ jsx11("div", { className: "w100n-guest-gate", children: /* @__PURE__ */ jsxs10("div", { className: "w100n-guest-card", children: [
4256
+ /* @__PURE__ */ jsx11("span", { className: "w100n-share-tile", "data-tone": tone, children: /* @__PURE__ */ jsx11(Icon, { "aria-hidden": true }) }),
4257
+ /* @__PURE__ */ jsx11("h2", { children: title }),
4258
+ /* @__PURE__ */ jsx11("p", { children: body }),
4249
4259
  form
4250
4260
  ] }) })
4251
4261
  ] });
@@ -4271,7 +4281,7 @@ function GuestDocument({ host, language = "en", theme = "light", brand }) {
4271
4281
  }
4272
4282
  setTyped("");
4273
4283
  }, children: [
4274
- /* @__PURE__ */ jsx10(
4284
+ /* @__PURE__ */ jsx11(
4275
4285
  "input",
4276
4286
  {
4277
4287
  className: "w100n-share-input",
@@ -4284,21 +4294,21 @@ function GuestDocument({ host, language = "en", theme = "light", brand }) {
4284
4294
  onChange: (e) => setTyped(e.target.value)
4285
4295
  }
4286
4296
  ),
4287
- refused.reason === "wrong" && /* @__PURE__ */ jsx10("p", { className: "w100n-docs-muted", role: "alert", children: t.wrongPassword }),
4297
+ refused.reason === "wrong" && /* @__PURE__ */ jsx11("p", { className: "w100n-docs-muted", role: "alert", children: t.wrongPassword }),
4288
4298
  /* @__PURE__ */ jsxs10("button", { type: "submit", className: "w100n-docs-action", disabled: !typed.trim(), children: [
4289
- /* @__PURE__ */ jsx10(Eye2, { "aria-hidden": true }),
4299
+ /* @__PURE__ */ jsx11(Eye2, { "aria-hidden": true }),
4290
4300
  t.openDoc
4291
4301
  ] })
4292
4302
  ] })
4293
4303
  );
4294
4304
  }
4295
4305
  if (refused?.reason === "busy") return gate("slate", Ban2, t.failed, t.tooMany);
4296
- return gate("slate", Ban2, t.failed, "", /* @__PURE__ */ jsx10("button", { type: "button", className: "w100n-docs-action", onClick: opened.retry, children: t.retry }));
4306
+ return gate("slate", Ban2, t.failed, "", /* @__PURE__ */ jsx11("button", { type: "button", className: "w100n-docs-action", onClick: opened.retry, children: t.retry }));
4297
4307
  }
4298
4308
  const file = opened.data;
4299
4309
  if (!file) return /* @__PURE__ */ jsxs10("div", { className: "w100n-docs w100n-guest", "data-theme": theme, children: [
4300
4310
  top(null, null),
4301
- /* @__PURE__ */ jsx10("div", { className: "w100n-docs-empty", children: t.loading })
4311
+ /* @__PURE__ */ jsx11("div", { className: "w100n-docs-empty", children: t.loading })
4302
4312
  ] });
4303
4313
  const kind = kindOf(file.name, file.mimeType);
4304
4314
  const text = kind === "docx" || kind === "markdown";
@@ -4306,23 +4316,23 @@ function GuestDocument({ host, language = "en", theme = "light", brand }) {
4306
4316
  const rights = { view: true, comment: talk, edit: false };
4307
4317
  const quiet2 = () => {
4308
4318
  };
4309
- let stage = /* @__PURE__ */ jsx10("div", { className: "w100n-docs-empty", children: t.unsupported });
4310
- if (text) stage = /* @__PURE__ */ jsx10(Suspense3, { fallback: /* @__PURE__ */ jsx10("div", { className: "w100n-docs-empty", children: t.loading }), children: /* @__PURE__ */ jsx10(TextEditor3, { kind, bytes: file.bytes, t, language, rights, host: talk ? notes : void 0, documentId: file.id, onOutline: quiet2, slot: talk ? slot : null }) });
4311
- else if (kind === "pdf") stage = /* @__PURE__ */ jsx10(PdfView, { bytes: file.bytes, t, language, worker: host.pdfWorker, rights, documentId: file.id, onOutline: quiet2 });
4312
- else if (kind === "slides") stage = /* @__PURE__ */ jsx10(SlidesView, { html: new TextDecoder().decode(file.bytes), name: file.name, rights, language, theme, onOutline: quiet2 });
4313
- else if (kind === "sheet") stage = /* @__PURE__ */ jsx10(Suspense3, { fallback: /* @__PURE__ */ jsx10("div", { className: "w100n-docs-empty", children: t.loading }), children: /* @__PURE__ */ jsx10(SheetView3, { bytes: file.bytes, name: file.name, kind: /\.csv$/i.test(file.name) || file.mimeType === "text/csv" ? "csv" : "xlsx", rights, language, theme, documentId: file.id }) });
4319
+ let stage = /* @__PURE__ */ jsx11("div", { className: "w100n-docs-empty", children: t.unsupported });
4320
+ if (text) stage = /* @__PURE__ */ jsx11(Suspense3, { fallback: /* @__PURE__ */ jsx11("div", { className: "w100n-docs-empty", children: t.loading }), children: /* @__PURE__ */ jsx11(TextEditor3, { kind, bytes: file.bytes, t, language, rights, host: talk ? notes : void 0, documentId: file.id, onOutline: quiet2, slot: talk ? slot : null }) });
4321
+ else if (kind === "pdf") stage = /* @__PURE__ */ jsx11(PdfView, { bytes: file.bytes, t, language, worker: host.pdfWorker, rights, documentId: file.id, onOutline: quiet2 });
4322
+ else if (kind === "slides") stage = /* @__PURE__ */ jsx11(SlidesView, { html: new TextDecoder().decode(file.bytes), name: file.name, rights, language, theme, onOutline: quiet2 });
4323
+ else if (kind === "sheet") stage = /* @__PURE__ */ jsx11(Suspense3, { fallback: /* @__PURE__ */ jsx11("div", { className: "w100n-docs-empty", children: t.loading }), children: /* @__PURE__ */ jsx11(SheetView3, { bytes: file.bytes, name: file.name, kind: /\.csv$/i.test(file.name) || file.mimeType === "text/csv" ? "csv" : "xlsx", rights, language, theme, documentId: file.id }) });
4314
4324
  return /* @__PURE__ */ jsxs10("div", { className: "w100n-docs w100n-guest", "data-theme": theme, children: [
4315
4325
  top(file, talk ? t.badgeComment : t.badgeRead),
4316
- saving === "failed" && /* @__PURE__ */ jsx10("p", { className: "w100n-docs-muted w100n-guest-note", role: "alert", children: t.exportFailed }),
4326
+ saving === "failed" && /* @__PURE__ */ jsx11("p", { className: "w100n-docs-muted w100n-guest-note", role: "alert", children: t.exportFailed }),
4317
4327
  /* @__PURE__ */ jsxs10("div", { className: "w100n-docs-body w100n-guest-body", children: [
4318
- /* @__PURE__ */ jsx10("main", { className: "w100n-docs-stage", children: /* @__PURE__ */ jsx10("div", { className: "w100n-docs-bare", children: stage }) }),
4319
- talk && /* @__PURE__ */ jsx10("aside", { className: "w100n-docs-side w100n-docs-panel w100n-guest-panel", "aria-label": t.comments, children: /* @__PURE__ */ jsxs10("div", { className: "w100n-docs-panel-body", children: [
4328
+ /* @__PURE__ */ jsx11("main", { className: "w100n-docs-stage", children: /* @__PURE__ */ jsx11("div", { className: "w100n-docs-bare", children: stage }) }),
4329
+ talk && /* @__PURE__ */ jsx11("aside", { className: "w100n-docs-side w100n-docs-panel w100n-guest-panel", "aria-label": t.comments, children: /* @__PURE__ */ jsxs10("div", { className: "w100n-docs-panel-body", children: [
4320
4330
  /* @__PURE__ */ jsxs10("label", { className: "w100n-share-field", children: [
4321
- /* @__PURE__ */ jsx10("span", { children: t.yourName }),
4322
- /* @__PURE__ */ jsx10("input", { className: "w100n-share-input", value: name, autoComplete: "name", placeholder: t.yourName, onChange: (e) => typeName(e.target.value) })
4331
+ /* @__PURE__ */ jsx11("span", { children: t.yourName }),
4332
+ /* @__PURE__ */ jsx11("input", { className: "w100n-share-input", value: name, autoComplete: "name", placeholder: t.yourName, onChange: (e) => typeName(e.target.value) })
4323
4333
  ] }),
4324
- /* @__PURE__ */ jsx10("p", { className: "w100n-docs-muted", children: name.trim() ? t.nameHint : t.nameNeeded }),
4325
- /* @__PURE__ */ jsx10("div", { ref: setSlot })
4334
+ /* @__PURE__ */ jsx11("p", { className: "w100n-docs-muted", children: name.trim() ? t.nameHint : t.nameNeeded }),
4335
+ /* @__PURE__ */ jsx11("div", { ref: setSlot })
4326
4336
  ] }) })
4327
4337
  ] })
4328
4338
  ] });
@@ -4330,6 +4340,7 @@ function GuestDocument({ host, language = "en", theme = "light", brand }) {
4330
4340
  export {
4331
4341
  DocumentOverlay,
4332
4342
  DocumentsWorkspace,
4343
+ FilePreview,
4333
4344
  GuestDocument,
4334
4345
  GuestRefused,
4335
4346
  SlidesView,