@arbidocs/react 0.5.119 → 0.5.121
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/PdfViewerImpl-ZVJZ4KNW.cjs +22 -0
- package/dist/PdfViewerImpl-ZVJZ4KNW.cjs.map +1 -0
- package/dist/{PdfViewerImpl.d-B28hLEuj.d.ts → PdfViewerImpl.d-CqnEzQO7.d.ts} +9 -1
- package/dist/annotations/freeze/index.d.ts +1 -1
- package/dist/artifacts/artifact-kind.js +1 -0
- package/dist/artifacts/artifact-kind.js.map +2 -2
- package/dist/artifacts/index.cjs +3 -2
- package/dist/artifacts/index.cjs.map +1 -1
- package/dist/artifacts/index.d.ts +3 -2
- package/dist/calls/livekit/index.cjs +41 -41
- package/dist/chat/turn-flush.js +16 -0
- package/dist/chat/turn-flush.js.map +7 -0
- package/dist/chat/useConversationActions.js +3 -0
- package/dist/chat/useConversationActions.js.map +2 -2
- package/dist/{chunk-QP3WQSAA.cjs → chunk-4B2GW3AY.cjs} +3 -3
- package/dist/{chunk-QP3WQSAA.cjs.map → chunk-4B2GW3AY.cjs.map} +1 -1
- package/dist/{chunk-YMB6XUR2.cjs → chunk-7L7QRIQ2.cjs} +11 -7
- package/dist/chunk-7L7QRIQ2.cjs.map +1 -0
- package/dist/{chunk-LBAG7KL7.cjs → chunk-DLEHM4IA.cjs} +328 -180
- package/dist/chunk-DLEHM4IA.cjs.map +1 -0
- package/dist/{PdfViewerImpl-QUSDLNNM.cjs → chunk-ICBT2XGF.cjs} +5 -2
- package/dist/chunk-ICBT2XGF.cjs.map +1 -0
- package/dist/chunk-MAOGK7IC.cjs +61 -0
- package/dist/chunk-MAOGK7IC.cjs.map +1 -0
- package/dist/{chunk-5TRUFWKT.cjs → chunk-X5OZRLFZ.cjs} +5 -5
- package/dist/{chunk-5TRUFWKT.cjs.map → chunk-X5OZRLFZ.cjs.map} +1 -1
- package/dist/datasets/sources/documents.js +1 -1
- package/dist/datasets/sources/documents.js.map +2 -2
- package/dist/document-tools/images-to-pdf.js +43 -0
- package/dist/document-tools/images-to-pdf.js.map +7 -0
- package/dist/document-tools/index.cjs +104 -0
- package/dist/document-tools/index.cjs.map +1 -1
- package/dist/document-tools/index.d.ts +41 -1
- package/dist/document-tools/index.js +6 -1
- package/dist/document-tools/index.js.map +2 -2
- package/dist/document-tools/pdf-attachments.js +63 -0
- package/dist/document-tools/pdf-attachments.js.map +7 -0
- package/dist/entities/DocumentEntity.js +7 -2
- package/dist/entities/DocumentEntity.js.map +2 -2
- package/dist/entities/SharingEntity.js +85 -0
- package/dist/entities/SharingEntity.js.map +7 -0
- package/dist/entities/file-type.js +14 -2
- package/dist/entities/file-type.js.map +2 -2
- package/dist/entities/index.js +17 -1
- package/dist/entities/index.js.map +2 -2
- package/dist/icons/PresIcon.js +53 -0
- package/dist/icons/PresIcon.js.map +7 -0
- package/dist/icons/colors.js +2 -0
- package/dist/icons/colors.js.map +2 -2
- package/dist/icons/file-type.js +3 -0
- package/dist/icons/file-type.js.map +2 -2
- package/dist/icons/index.js +2 -0
- package/dist/icons/index.js.map +2 -2
- package/dist/index.cjs +834 -789
- package/dist/index.cjs.map +1 -1
- package/dist/{index.d-CYXcTKYt.d.ts → index.d-D2puqWeN.d.ts} +47 -3
- package/dist/index.d.ts +50 -8
- package/dist/index.js +1 -0
- package/dist/index.js.map +2 -2
- package/dist/pdf-region-impl-ZG5G2OX2.cjs +98 -0
- package/dist/pdf-region-impl-ZG5G2OX2.cjs.map +1 -0
- package/dist/session/documents.js +9 -5
- package/dist/session/documents.js.map +2 -2
- package/dist/ui/index.cjs +182 -158
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/slider.js +7 -1
- package/dist/ui/slider.js.map +2 -2
- package/dist/viewers/PdfViewer.cjs +3 -3
- package/dist/viewers/PdfViewer.d.ts +2 -2
- package/dist/viewers/PdfViewerImpl.js +4 -1
- package/dist/viewers/PdfViewerImpl.js.map +2 -2
- package/dist/viewers/index.cjs +30 -4
- package/dist/viewers/index.cjs.map +1 -1
- package/dist/viewers/index.d.ts +72 -2
- package/dist/viewers/index.js +14 -0
- package/dist/viewers/index.js.map +2 -2
- package/dist/viewers/pdf-region-impl.js +96 -0
- package/dist/viewers/pdf-region-impl.js.map +7 -0
- package/dist/viewers/pdf-region.js +57 -0
- package/dist/viewers/pdf-region.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +2 -1
- package/dist/viewers/useProcessedChunks.js.map +2 -2
- package/package.json +3 -3
- package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +0 -1
- package/dist/chunk-LBAG7KL7.cjs.map +0 -1
- package/dist/chunk-YMB6XUR2.cjs.map +0 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useState } from "react";
|
|
3
|
+
import { User, Users } from "lucide-react";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
import { HoverCard, HoverCardContent, HoverCardTrigger } from "../ui/hover-card.js";
|
|
6
|
+
import { EntityPill } from "./EntityPill.js";
|
|
7
|
+
let sharedMembers = null;
|
|
8
|
+
function configureSharingMembers(members) {
|
|
9
|
+
sharedMembers = members;
|
|
10
|
+
}
|
|
11
|
+
const SHARING_LABELS = { onlyMe: "Only me", workspace: "Workspace" };
|
|
12
|
+
function SharingEntity({
|
|
13
|
+
shared,
|
|
14
|
+
variant = "full",
|
|
15
|
+
size = "sm",
|
|
16
|
+
onToggle,
|
|
17
|
+
disabled = false,
|
|
18
|
+
disabledTooltip,
|
|
19
|
+
tooltipActive,
|
|
20
|
+
tooltipInactive,
|
|
21
|
+
members: membersProp,
|
|
22
|
+
className,
|
|
23
|
+
"data-testid": testId
|
|
24
|
+
}) {
|
|
25
|
+
const members = membersProp ?? sharedMembers;
|
|
26
|
+
const [open, setOpen] = useState(false);
|
|
27
|
+
const lastPointer = useRef("mouse");
|
|
28
|
+
const canToggle = !!onToggle && !disabled;
|
|
29
|
+
const label = shared ? SHARING_LABELS.workspace : SHARING_LABELS.onlyMe;
|
|
30
|
+
const hint = disabled ? disabledTooltip : shared ? tooltipActive : tooltipInactive;
|
|
31
|
+
const handleClick = (e) => {
|
|
32
|
+
e.stopPropagation();
|
|
33
|
+
if (shared && lastPointer.current === "touch") {
|
|
34
|
+
setOpen(true);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (canToggle) onToggle(!shared);
|
|
38
|
+
};
|
|
39
|
+
const pill = /* @__PURE__ */ jsx(
|
|
40
|
+
EntityPill,
|
|
41
|
+
{
|
|
42
|
+
shape: "pill",
|
|
43
|
+
size,
|
|
44
|
+
icon: shared ? /* @__PURE__ */ jsx(Users, { className: "size-3.5 shrink-0 text-primary", "aria-hidden": true }) : /* @__PURE__ */ jsx(User, { className: "size-3.5 shrink-0 text-muted-foreground", "aria-hidden": true }),
|
|
45
|
+
label,
|
|
46
|
+
labelClassName: cn(variant === "icon" && "sr-only", !shared && "text-muted-foreground"),
|
|
47
|
+
className: cn(shared && "text-primary", className),
|
|
48
|
+
onClick: handleClick,
|
|
49
|
+
tooltipContent: !shared && hint ? hint : void 0,
|
|
50
|
+
"data-testid": testId
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
if (!shared) return pill;
|
|
54
|
+
return /* @__PURE__ */ jsxs(HoverCard, { open, onOpenChange: setOpen, openDelay: 200, closeDelay: 100, children: [
|
|
55
|
+
/* @__PURE__ */ jsx(
|
|
56
|
+
HoverCardTrigger,
|
|
57
|
+
{
|
|
58
|
+
asChild: true,
|
|
59
|
+
onPointerDown: (e) => {
|
|
60
|
+
lastPointer.current = e.pointerType;
|
|
61
|
+
},
|
|
62
|
+
children: /* @__PURE__ */ jsx(
|
|
63
|
+
"span",
|
|
64
|
+
{
|
|
65
|
+
className: "inline-flex",
|
|
66
|
+
role: "group",
|
|
67
|
+
"aria-label": `${SHARING_LABELS.workspace}: shared with all workspace members`,
|
|
68
|
+
children: pill
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
),
|
|
73
|
+
open && /* @__PURE__ */ jsxs(HoverCardContent, { side: "left", align: "center", className: "w-60 space-y-2 p-3", children: [
|
|
74
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-semibold", children: "Workspace members" }),
|
|
75
|
+
members,
|
|
76
|
+
hint && /* @__PURE__ */ jsx("p", { className: "border-t pt-2 text-xs text-muted-foreground", children: hint })
|
|
77
|
+
] })
|
|
78
|
+
] });
|
|
79
|
+
}
|
|
80
|
+
export {
|
|
81
|
+
SHARING_LABELS,
|
|
82
|
+
SharingEntity,
|
|
83
|
+
configureSharingMembers
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=SharingEntity.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/entities/SharingEntity.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * SharingEntity\n *\n * The entity pill of who can see an item: \"Only me\" (one person) or \"Workspace\" (several people).\n * It is the one pill every sharing indicator uses, in two variants: `full` (icon + label) and `icon`\n * (the glyph alone, for a narrow cell or a header; the label stays as its accessible name).\n *\n * The \"Workspace\" pill owns its hover: a card (opened by hover, keyboard focus, or a tap on a touch\n * screen) with `members`, the workspace's member list. `members` is only mounted while the card is\n * open, so a data-reading list costs nothing until someone looks. \"Only me\" has no card.\n *\n * With `onToggle` a click flips the visibility (a tap on a touch screen opens the card instead, so\n * a stray tap never changes who can see an item); without, the pill is a plain indicator. A click never reaches a parent's\n * handler (a row or card selection).\n */\n\nimport { useRef, useState, type MouseEvent, type PointerEvent, type ReactNode } from 'react'\nimport { User, Users } from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '../ui/hover-card'\nimport { EntityPill } from './EntityPill'\n\nlet sharedMembers: ReactNode = null\n\n/**\n * Where every `SharingEntity` finds the member list of its card (the entity registry's seam: the\n * connected layer, which can read the workspace's members, registers it once; panels that portal\n * outside any one subtree still get it).\n */\nexport function configureSharingMembers(members: ReactNode): void {\n sharedMembers = members\n}\n\nexport const SHARING_LABELS = { onlyMe: 'Only me', workspace: 'Workspace' } as const\n\nexport interface SharingEntityProps {\n shared: boolean\n /** `full` (default) icon + label; `icon` the glyph alone. */\n variant?: 'full' | 'icon'\n size?: 'sm' | 'md'\n /** Called with true to share, false to make private. Omit for an indicator that is not clickable. */\n onToggle?: (shouldShare: boolean) => void\n disabled?: boolean\n /** Why the visibility cannot be changed (a line in the card, or the tooltip). */\n disabledTooltip?: string\n /** What a click does while shared / private. */\n tooltipActive?: string\n tooltipInactive?: string\n /** The member list of the Workspace card (default: the registered one, `configureSharingMembers`); mounted only while the card is open. */\n members?: ReactNode\n className?: string\n 'data-testid'?: string\n}\n\nexport function SharingEntity({\n shared,\n variant = 'full',\n size = 'sm',\n onToggle,\n disabled = false,\n disabledTooltip,\n tooltipActive,\n tooltipInactive,\n members: membersProp,\n className,\n 'data-testid': testId,\n}: SharingEntityProps) {\n const members = membersProp ?? sharedMembers\n const [open, setOpen] = useState(false)\n const lastPointer = useRef<string>('mouse')\n const canToggle = !!onToggle && !disabled\n const label = shared ? SHARING_LABELS.workspace : SHARING_LABELS.onlyMe\n const hint = disabled ? disabledTooltip : shared ? tooltipActive : tooltipInactive\n\n const handleClick = (e: MouseEvent) => {\n e.stopPropagation()\n // A touch screen has no hover: a tap on a Workspace pill shows who is in it (and never flips it).\n if (shared && lastPointer.current === 'touch') {\n setOpen(true)\n return\n }\n if (canToggle) onToggle(!shared)\n }\n\n const pill = (\n <EntityPill\n shape=\"pill\"\n size={size}\n icon={\n shared ? (\n <Users className=\"size-3.5 shrink-0 text-primary\" aria-hidden />\n ) : (\n <User className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n )\n }\n label={label}\n labelClassName={cn(variant === 'icon' && 'sr-only', !shared && 'text-muted-foreground')}\n className={cn(shared && 'text-primary', className)}\n onClick={handleClick}\n tooltipContent={!shared && hint ? hint : undefined}\n data-testid={testId}\n />\n )\n\n if (!shared) return pill\n\n return (\n <HoverCard open={open} onOpenChange={setOpen} openDelay={200} closeDelay={100}>\n <HoverCardTrigger\n asChild\n onPointerDown={(e: PointerEvent) => {\n lastPointer.current = e.pointerType\n }}\n >\n <span\n className=\"inline-flex\"\n role=\"group\"\n aria-label={`${SHARING_LABELS.workspace}: shared with all workspace members`}\n >\n {pill}\n </span>\n </HoverCardTrigger>\n {open && (\n <HoverCardContent side=\"left\" align=\"center\" className=\"w-60 space-y-2 p-3\">\n <p className=\"text-xs font-semibold\">Workspace members</p>\n {members}\n {hint && <p className=\"border-t pt-2 text-xs text-muted-foreground\">{hint}</p>}\n </HoverCardContent>\n )}\n </HoverCard>\n )\n}\n"],
|
|
5
|
+
"mappings": "AA0FU,cAiCF,YAjCE;AA1EV,SAAS,QAAQ,gBAAoE;AACrF,SAAS,MAAM,aAAa;AAC5B,SAAS,UAAU;AACnB,SAAS,WAAW,kBAAkB,wBAAwB;AAC9D,SAAS,kBAAkB;AAE3B,IAAI,gBAA2B;AAOxB,SAAS,wBAAwB,SAA0B;AAChE,kBAAgB;AAClB;AAEO,MAAM,iBAAiB,EAAE,QAAQ,WAAW,WAAW,YAAY;AAqBnE,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,eAAe;AACjB,GAAuB;AACrB,QAAM,UAAU,eAAe;AAC/B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,cAAc,OAAe,OAAO;AAC1C,QAAM,YAAY,CAAC,CAAC,YAAY,CAAC;AACjC,QAAM,QAAQ,SAAS,eAAe,YAAY,eAAe;AACjE,QAAM,OAAO,WAAW,kBAAkB,SAAS,gBAAgB;AAEnE,QAAM,cAAc,CAAC,MAAkB;AACrC,MAAE,gBAAgB;AAElB,QAAI,UAAU,YAAY,YAAY,SAAS;AAC7C,cAAQ,IAAI;AACZ;AAAA,IACF;AACA,QAAI,UAAW,UAAS,CAAC,MAAM;AAAA,EACjC;AAEA,QAAM,OACJ;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN;AAAA,MACA,MACE,SACE,oBAAC,SAAM,WAAU,kCAAiC,eAAW,MAAC,IAE9D,oBAAC,QAAK,WAAU,2CAA0C,eAAW,MAAC;AAAA,MAG1E;AAAA,MACA,gBAAgB,GAAG,YAAY,UAAU,WAAW,CAAC,UAAU,uBAAuB;AAAA,MACtF,WAAW,GAAG,UAAU,gBAAgB,SAAS;AAAA,MACjD,SAAS;AAAA,MACT,gBAAgB,CAAC,UAAU,OAAO,OAAO;AAAA,MACzC,eAAa;AAAA;AAAA,EACf;AAGF,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,qBAAC,aAAU,MAAY,cAAc,SAAS,WAAW,KAAK,YAAY,KACxE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAO;AAAA,QACP,eAAe,CAAC,MAAoB;AAClC,sBAAY,UAAU,EAAE;AAAA,QAC1B;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAY,GAAG,eAAe,SAAS;AAAA,YAEtC;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,IACC,QACC,qBAAC,oBAAiB,MAAK,QAAO,OAAM,UAAS,WAAU,sBACrD;AAAA,0BAAC,OAAE,WAAU,yBAAwB,+BAAiB;AAAA,MACrD;AAAA,MACA,QAAQ,oBAAC,OAAE,WAAU,+CAA+C,gBAAK;AAAA,OAC5E;AAAA,KAEJ;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -127,7 +127,16 @@ function extFromFileName(fileName) {
|
|
|
127
127
|
if (dot <= 0 || dot === fileName.length - 1) return void 0;
|
|
128
128
|
return fileName.slice(dot + 1);
|
|
129
129
|
}
|
|
130
|
-
|
|
130
|
+
const PRESENTATIONS_FOLDER = "Presentations";
|
|
131
|
+
const PRESENTATION_TEMPLATES_FOLDER = `${PRESENTATIONS_FOLDER}/Templates`;
|
|
132
|
+
function isPresentationFileName(fileName, folder) {
|
|
133
|
+
const name = (fileName ?? "").toLowerCase();
|
|
134
|
+
if (name.endsWith(".presentation.pdf") || name.endsWith(".presentation.json")) return true;
|
|
135
|
+
if (name.endsWith(".pptx")) return true;
|
|
136
|
+
return name.endsWith(".pdf") && (folder === PRESENTATIONS_FOLDER || folder === PRESENTATION_TEMPLATES_FOLDER);
|
|
137
|
+
}
|
|
138
|
+
function friendlyFileType(fileType, fileName, folder) {
|
|
139
|
+
if (isPresentationFileName(fileName, folder)) return "Presentation";
|
|
131
140
|
if (fileType) {
|
|
132
141
|
const trimmed = fileType.trim();
|
|
133
142
|
if (trimmed.includes("/")) {
|
|
@@ -146,6 +155,9 @@ function friendlyFileType(fileType, fileName) {
|
|
|
146
155
|
return "Other";
|
|
147
156
|
}
|
|
148
157
|
export {
|
|
149
|
-
|
|
158
|
+
PRESENTATIONS_FOLDER,
|
|
159
|
+
PRESENTATION_TEMPLATES_FOLDER,
|
|
160
|
+
friendlyFileType,
|
|
161
|
+
isPresentationFileName
|
|
150
162
|
};
|
|
151
163
|
//# sourceMappingURL=file-type.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/entities/file-type.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Friendly file-type label.\n *\n * `Doc.file_type` is populated from two unrelated upload paths in the\n * backend: sometimes it's a bare extension (``\"pdf\"``, ``\"docx\"``,\n * ``\"html\"``), sometimes it's a MIME type (``\"application/pdf\"``,\n * ``\"image/jpeg\"``). Showing the raw value as-is gives the grid a\n * mix of ``PDF`` and ``APPLICATION/PDF`` in the same column.\n *\n * This util normalises both shapes to a single short, capitalised\n * label. The classification is keyed off the MIME subtype (or the bare\n * extension) so adding a new entry only ever requires touching the\n * tables below.\n *\n * Falls back to the file name's extension when ``file_type`` is\n * missing or unrecognised, and finally to ``Other`` so the cell never\n * renders empty.\n */\n\n// Bare extension \u2192 friendly label. Lowercase keys, no leading dot.\nconst EXT_LABELS: Record<string, string> = {\n pdf: 'PDF',\n\n // Word / docs\n doc: 'Word',\n docx: 'Word',\n rtf: 'Word',\n odt: 'Word',\n\n // Spreadsheets\n xls: 'Excel',\n xlsx: 'Excel',\n ods: 'Excel',\n csv: 'CSV',\n tsv: 'CSV',\n\n // Slides\n ppt: 'PowerPoint',\n pptx: 'PowerPoint',\n odp: 'PowerPoint',\n\n // Plain text / markup\n txt: 'Text',\n log: 'Text',\n md: 'Markdown',\n markdown: 'Markdown',\n html: 'HTML',\n htm: 'HTML',\n xml: 'XML',\n json: 'JSON',\n yaml: 'YAML',\n yml: 'YAML',\n\n // Email\n eml: 'Email',\n msg: 'Email',\n mbox: 'Email',\n pst: 'Outlook',\n ost: 'Outlook',\n\n // Images\n jpg: 'Image',\n jpeg: 'Image',\n png: 'Image',\n gif: 'Image',\n bmp: 'Image',\n tif: 'Image',\n tiff: 'Image',\n webp: 'Image',\n svg: 'Image',\n heic: 'Image',\n heif: 'Image',\n\n // Audio\n mp3: 'Audio',\n wav: 'Audio',\n m4a: 'Audio',\n aac: 'Audio',\n ogg: 'Audio',\n flac: 'Audio',\n opus: 'Audio',\n\n // Video\n mp4: 'Video',\n webm: 'Video',\n mov: 'Video',\n avi: 'Video',\n mkv: 'Video',\n\n // Archives\n zip: 'Archive',\n tar: 'Archive',\n gz: 'Archive',\n rar: 'Archive',\n '7z': 'Archive',\n}\n\n// MIME subtype \u2192 friendly label. Keys are lowercase, no parameters\n// (i.e. anything after ``;`` is stripped before lookup). Used when\n// `file_type` looks like a MIME string (\"application/pdf\").\nconst MIME_SUBTYPE_LABELS: Record<string, string> = {\n // PDF\n pdf: 'PDF',\n 'x-pdf': 'PDF',\n\n // Word\n msword: 'Word',\n 'vnd.openxmlformats-officedocument.wordprocessingml.document': 'Word',\n 'vnd.oasis.opendocument.text': 'Word',\n rtf: 'Word',\n\n // Excel\n 'vnd.ms-excel': 'Excel',\n 'vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'Excel',\n 'vnd.oasis.opendocument.spreadsheet': 'Excel',\n csv: 'CSV',\n 'tab-separated-values': 'CSV',\n\n // PowerPoint\n 'vnd.ms-powerpoint': 'PowerPoint',\n 'vnd.openxmlformats-officedocument.presentationml.presentation': 'PowerPoint',\n 'vnd.oasis.opendocument.presentation': 'PowerPoint',\n\n // Plain text / markup\n plain: 'Text',\n html: 'HTML',\n xml: 'XML',\n json: 'JSON',\n markdown: 'Markdown',\n 'x-markdown': 'Markdown',\n yaml: 'YAML',\n 'x-yaml': 'YAML',\n\n // Email\n rfc822: 'Email',\n 'vnd.ms-outlook': 'Email',\n\n // Archives\n zip: 'Archive',\n 'x-zip-compressed': 'Archive',\n 'x-tar': 'Archive',\n gzip: 'Archive',\n 'x-7z-compressed': 'Archive',\n 'x-rar-compressed': 'Archive',\n}\n\n// Top-level MIME type \u2192 friendly label. Only used when neither the\n// extension table nor the subtype table matched, e.g. an unknown\n// image like ``image/avif``.\nconst MIME_TYPE_LABELS: Record<string, string> = {\n image: 'Image',\n audio: 'Audio',\n video: 'Video',\n text: 'Text',\n}\n\nfunction lookupExt(ext: string): string | undefined {\n return EXT_LABELS[ext.toLowerCase().replace(/^\\./, '')]\n}\n\nfunction lookupMime(mime: string): string | undefined {\n // Strip parameters: \"text/html; charset=utf-8\" \u2192 \"text/html\".\n const base = mime.toLowerCase().split(';')[0].trim()\n const slash = base.indexOf('/')\n if (slash <= 0) return undefined\n const top = base.slice(0, slash)\n const sub = base.slice(slash + 1)\n return MIME_SUBTYPE_LABELS[sub] ?? MIME_TYPE_LABELS[top]\n}\n\nfunction extFromFileName(fileName?: string | null): string | undefined {\n if (!fileName) return undefined\n const dot = fileName.lastIndexOf('.')\n if (dot <= 0 || dot === fileName.length - 1) return undefined\n return fileName.slice(dot + 1)\n}\n\n/**\n * Map a backend ``file_type`` value (extension OR MIME type) plus an\n * optional file name to a single short label suitable for a grid cell.\n *\n * Order:\n * 1. ``file_type`` looks like a MIME (\"a/b\") \u2192 MIME tables.\n * 2. ``file_type`` looks like a bare extension \u2192 extension table.\n * 3. ``file_name`` extension as a last-resort fallback.\n * 4. ``\"Other\"``.\n */\nexport function
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * Friendly file-type label.\n *\n * `Doc.file_type` is populated from two unrelated upload paths in the\n * backend: sometimes it's a bare extension (``\"pdf\"``, ``\"docx\"``,\n * ``\"html\"``), sometimes it's a MIME type (``\"application/pdf\"``,\n * ``\"image/jpeg\"``). Showing the raw value as-is gives the grid a\n * mix of ``PDF`` and ``APPLICATION/PDF`` in the same column.\n *\n * This util normalises both shapes to a single short, capitalised\n * label. The classification is keyed off the MIME subtype (or the bare\n * extension) so adding a new entry only ever requires touching the\n * tables below.\n *\n * Falls back to the file name's extension when ``file_type`` is\n * missing or unrecognised, and finally to ``Other`` so the cell never\n * renders empty.\n */\n\n// Bare extension \u2192 friendly label. Lowercase keys, no leading dot.\nconst EXT_LABELS: Record<string, string> = {\n pdf: 'PDF',\n\n // Word / docs\n doc: 'Word',\n docx: 'Word',\n rtf: 'Word',\n odt: 'Word',\n\n // Spreadsheets\n xls: 'Excel',\n xlsx: 'Excel',\n ods: 'Excel',\n csv: 'CSV',\n tsv: 'CSV',\n\n // Slides\n ppt: 'PowerPoint',\n pptx: 'PowerPoint',\n odp: 'PowerPoint',\n\n // Plain text / markup\n txt: 'Text',\n log: 'Text',\n md: 'Markdown',\n markdown: 'Markdown',\n html: 'HTML',\n htm: 'HTML',\n xml: 'XML',\n json: 'JSON',\n yaml: 'YAML',\n yml: 'YAML',\n\n // Email\n eml: 'Email',\n msg: 'Email',\n mbox: 'Email',\n pst: 'Outlook',\n ost: 'Outlook',\n\n // Images\n jpg: 'Image',\n jpeg: 'Image',\n png: 'Image',\n gif: 'Image',\n bmp: 'Image',\n tif: 'Image',\n tiff: 'Image',\n webp: 'Image',\n svg: 'Image',\n heic: 'Image',\n heif: 'Image',\n\n // Audio\n mp3: 'Audio',\n wav: 'Audio',\n m4a: 'Audio',\n aac: 'Audio',\n ogg: 'Audio',\n flac: 'Audio',\n opus: 'Audio',\n\n // Video\n mp4: 'Video',\n webm: 'Video',\n mov: 'Video',\n avi: 'Video',\n mkv: 'Video',\n\n // Archives\n zip: 'Archive',\n tar: 'Archive',\n gz: 'Archive',\n rar: 'Archive',\n '7z': 'Archive',\n}\n\n// MIME subtype \u2192 friendly label. Keys are lowercase, no parameters\n// (i.e. anything after ``;`` is stripped before lookup). Used when\n// `file_type` looks like a MIME string (\"application/pdf\").\nconst MIME_SUBTYPE_LABELS: Record<string, string> = {\n // PDF\n pdf: 'PDF',\n 'x-pdf': 'PDF',\n\n // Word\n msword: 'Word',\n 'vnd.openxmlformats-officedocument.wordprocessingml.document': 'Word',\n 'vnd.oasis.opendocument.text': 'Word',\n rtf: 'Word',\n\n // Excel\n 'vnd.ms-excel': 'Excel',\n 'vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'Excel',\n 'vnd.oasis.opendocument.spreadsheet': 'Excel',\n csv: 'CSV',\n 'tab-separated-values': 'CSV',\n\n // PowerPoint\n 'vnd.ms-powerpoint': 'PowerPoint',\n 'vnd.openxmlformats-officedocument.presentationml.presentation': 'PowerPoint',\n 'vnd.oasis.opendocument.presentation': 'PowerPoint',\n\n // Plain text / markup\n plain: 'Text',\n html: 'HTML',\n xml: 'XML',\n json: 'JSON',\n markdown: 'Markdown',\n 'x-markdown': 'Markdown',\n yaml: 'YAML',\n 'x-yaml': 'YAML',\n\n // Email\n rfc822: 'Email',\n 'vnd.ms-outlook': 'Email',\n\n // Archives\n zip: 'Archive',\n 'x-zip-compressed': 'Archive',\n 'x-tar': 'Archive',\n gzip: 'Archive',\n 'x-7z-compressed': 'Archive',\n 'x-rar-compressed': 'Archive',\n}\n\n// Top-level MIME type \u2192 friendly label. Only used when neither the\n// extension table nor the subtype table matched, e.g. an unknown\n// image like ``image/avif``.\nconst MIME_TYPE_LABELS: Record<string, string> = {\n image: 'Image',\n audio: 'Audio',\n video: 'Video',\n text: 'Text',\n}\n\nfunction lookupExt(ext: string): string | undefined {\n return EXT_LABELS[ext.toLowerCase().replace(/^\\./, '')]\n}\n\nfunction lookupMime(mime: string): string | undefined {\n // Strip parameters: \"text/html; charset=utf-8\" \u2192 \"text/html\".\n const base = mime.toLowerCase().split(';')[0].trim()\n const slash = base.indexOf('/')\n if (slash <= 0) return undefined\n const top = base.slice(0, slash)\n const sub = base.slice(slash + 1)\n return MIME_SUBTYPE_LABELS[sub] ?? MIME_TYPE_LABELS[top]\n}\n\nfunction extFromFileName(fileName?: string | null): string | undefined {\n if (!fileName) return undefined\n const dot = fileName.lastIndexOf('.')\n if (dot <= 0 || dot === fileName.length - 1) return undefined\n return fileName.slice(dot + 1)\n}\n\n/**\n * Map a backend ``file_type`` value (extension OR MIME type) plus an\n * optional file name to a single short label suitable for a grid cell.\n *\n * Order:\n * 1. ``file_type`` looks like a MIME (\"a/b\") \u2192 MIME tables.\n * 2. ``file_type`` looks like a bare extension \u2192 extension table.\n * 3. ``file_name`` extension as a last-resort fallback.\n * 4. ``\"Other\"``.\n */\n/** Where presentations are saved (Files \u203A Presentations), and their templates. */\nexport const PRESENTATIONS_FOLDER = 'Presentations'\nexport const PRESENTATION_TEMPLATES_FOLDER = `${PRESENTATIONS_FOLDER}/Templates`\n\n/**\n * A presentation: a PowerPoint file (`.pptx`; one saved by ARBI carries its editable data inside).\n * Presentations saved before they were PowerPoint files are known too: a PDF kept in Files \u203A\n * Presentations or its Templates, `\u2026.presentation.pdf`, or `\u2026.presentation.json` (the data alone).\n */\nexport function isPresentationFileName(fileName?: string | null, folder?: string | null): boolean {\n const name = (fileName ?? '').toLowerCase()\n if (name.endsWith('.presentation.pdf') || name.endsWith('.presentation.json')) return true\n // A presentation is a PowerPoint file.\n if (name.endsWith('.pptx')) return true\n return (\n name.endsWith('.pdf') &&\n (folder === PRESENTATIONS_FOLDER || folder === PRESENTATION_TEMPLATES_FOLDER)\n )\n}\n\nexport function friendlyFileType(\n fileType?: string | null,\n fileName?: string | null,\n /** The document's folder: a PDF in Presentations is a presentation. */\n folder?: string | null\n): string {\n if (isPresentationFileName(fileName, folder)) return 'Presentation'\n if (fileType) {\n const trimmed = fileType.trim()\n if (trimmed.includes('/')) {\n const fromMime = lookupMime(trimmed)\n if (fromMime) return fromMime\n } else {\n const fromExt = lookupExt(trimmed)\n if (fromExt) return fromExt\n }\n }\n\n const fnExt = extFromFileName(fileName)\n if (fnExt) {\n const fromExt = lookupExt(fnExt)\n if (fromExt) return fromExt\n }\n\n return 'Other'\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/entities/index.js
CHANGED
|
@@ -6,6 +6,11 @@ import {
|
|
|
6
6
|
getDocumentTitle,
|
|
7
7
|
isImageDocument
|
|
8
8
|
} from "./DocumentEntity.js";
|
|
9
|
+
import {
|
|
10
|
+
SharingEntity,
|
|
11
|
+
configureSharingMembers,
|
|
12
|
+
SHARING_LABELS
|
|
13
|
+
} from "./SharingEntity.js";
|
|
9
14
|
import { TagEntity } from "./TagEntity.js";
|
|
10
15
|
import { TAG_TYPE_ICONS, TAG_TYPE_LABELS, getTagTypeIcon, getTagTypeLabel } from "./tag-types.js";
|
|
11
16
|
import { tagKindTitle, tagKindNouns } from "./tag-kinds.js";
|
|
@@ -48,7 +53,12 @@ import {
|
|
|
48
53
|
isVideoFile,
|
|
49
54
|
usesOriginalBytesForViewer
|
|
50
55
|
} from "./media-type.js";
|
|
51
|
-
import {
|
|
56
|
+
import {
|
|
57
|
+
friendlyFileType,
|
|
58
|
+
isPresentationFileName,
|
|
59
|
+
PRESENTATIONS_FOLDER,
|
|
60
|
+
PRESENTATION_TEMPLATES_FOLDER
|
|
61
|
+
} from "./file-type.js";
|
|
52
62
|
export {
|
|
53
63
|
AgentBadge,
|
|
54
64
|
BASE_COLORS,
|
|
@@ -58,8 +68,12 @@ export {
|
|
|
58
68
|
EntityPill,
|
|
59
69
|
NEUTRAL_GRAY,
|
|
60
70
|
PLACEHOLDER_COLOR,
|
|
71
|
+
PRESENTATIONS_FOLDER,
|
|
72
|
+
PRESENTATION_TEMPLATES_FOLDER,
|
|
61
73
|
PresenceLabel,
|
|
62
74
|
ProjectEntity,
|
|
75
|
+
SHARING_LABELS,
|
|
76
|
+
SharingEntity,
|
|
63
77
|
ShieldIcon,
|
|
64
78
|
StatusPill,
|
|
65
79
|
TAG_TYPE_ICONS,
|
|
@@ -74,6 +88,7 @@ export {
|
|
|
74
88
|
configureEntityRegistry,
|
|
75
89
|
configureEntityVocabulary,
|
|
76
90
|
configureRagLabels,
|
|
91
|
+
configureSharingMembers,
|
|
77
92
|
configureStatusRegistry,
|
|
78
93
|
entityNoun,
|
|
79
94
|
friendlyFileType,
|
|
@@ -92,6 +107,7 @@ export {
|
|
|
92
107
|
isImageDocument,
|
|
93
108
|
isImageFile,
|
|
94
109
|
isMediaFile,
|
|
110
|
+
isPresentationFileName,
|
|
95
111
|
isVideoFile,
|
|
96
112
|
tagKindNouns,
|
|
97
113
|
tagKindTitle,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/entities/index.ts"],
|
|
4
|
-
"sourcesContent": ["export { ThreadVisibilityIcon } from './ThreadVisibilityIcon'\nexport { EntityPill, type EntitySize } from './EntityPill'\nexport {\n DocumentEntity,\n getDocIcon,\n getDocumentTitle,\n isImageDocument,\n type DocumentEntityProps,\n type DocumentLike,\n} from './DocumentEntity'\nexport { TagEntity, type TagEntityProps, type TagLike } from './TagEntity'\nexport { TAG_TYPE_ICONS, TAG_TYPE_LABELS, getTagTypeIcon, getTagTypeLabel } from './tag-types'\nexport { tagKindTitle, tagKindNouns } from './tag-kinds'\nexport { ProjectEntity, type ProjectEntityProps, type ProjectRelation } from './ProjectEntity'\nexport { UserEntity, type UserEntityProps, type PresenceDisplayStatus } from './UserEntity'\nexport { VerifiedBadge, type VerifiedBadgeProps } from './VerifiedBadge'\n// One agent stamp and one presence wording for every surface \u2014 see AgentMarkers.\nexport { AgentBadge, PresenceLabel } from './AgentMarkers'\n\n// Status pill + RAG dot \u2014 generic presentation, domain vocabulary INJECTED.\nexport {\n StatusPill,\n type StatusPillProps,\n type StatusVariant,\n type StatusBadgeProps,\n type StatusBadgeComponent,\n configureStatusRegistry,\n getStatusVariant,\n type Rag,\n configureRagLabels,\n} from './status'\n\n// Canonical entity registry \u2014 icons, names, and the deployment injection seam.\nexport {\n ENTITY_MAPPINGS,\n type EntityType,\n type EntityIconComponent,\n type EntityRegistryOverride,\n type EntityLabelForm,\n configureEntityRegistry,\n getEntityIcon,\n getEntityLabel,\n entityNoun,\n EntityIcon,\n VISIBILITY_ICONS,\n VisibilityIcon,\n} from './registry'\n\nexport { configureEntityVocabulary, type EntityNoun, type EntityVocabulary } from './vocabulary'\n\n// Entity colour system \u2014 deterministic id \u2192 colour derivation.\nexport {\n BASE_COLORS,\n PLACEHOLDER_COLOR,\n NEUTRAL_GRAY,\n getEntityColor,\n getEntityColorStyles,\n getWorkspaceColor,\n} from './colors'\n\n// Workspace square glyph (initial on a colour fill) and the outlined agent-avatar colours.\nexport { ShieldIcon, type ShieldIconProps } from './ShieldIcon'\nexport { agentAvatarColors } from './agent-avatar-colors'\n\n// What kind of file a document is: the viewer's choice of renderer and the short label of its type.\nexport {\n isAudioFile,\n isDownloadOnlyFile,\n isImageFile,\n isMediaFile,\n isVideoFile,\n usesOriginalBytesForViewer,\n} from './media-type'\nexport {
|
|
5
|
-
"mappings": "AAAA,SAAS,4BAA4B;AACrC,SAAS,kBAAmC;AAC5C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,iBAAoD;AAC7D,SAAS,gBAAgB,iBAAiB,gBAAgB,uBAAuB;AACjF,SAAS,cAAc,oBAAoB;AAC3C,SAAS,qBAAoE;AAC7E,SAAS,kBAAoE;AAC7E,SAAS,qBAA8C;AAEvD,SAAS,YAAY,qBAAqB;AAG1C;AAAA,EACE;AAAA,EAKA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAGP;AAAA,EACE;AAAA,EAKA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,iCAAyE;AAGlF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,kBAAwC;AACjD,SAAS,yBAAyB;AAGlC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,
|
|
4
|
+
"sourcesContent": ["export { ThreadVisibilityIcon } from './ThreadVisibilityIcon'\nexport { EntityPill, type EntitySize } from './EntityPill'\nexport {\n DocumentEntity,\n getDocIcon,\n getDocumentTitle,\n isImageDocument,\n type DocumentEntityProps,\n type DocumentLike,\n} from './DocumentEntity'\nexport {\n SharingEntity,\n configureSharingMembers,\n SHARING_LABELS,\n type SharingEntityProps,\n} from './SharingEntity'\nexport { TagEntity, type TagEntityProps, type TagLike } from './TagEntity'\nexport { TAG_TYPE_ICONS, TAG_TYPE_LABELS, getTagTypeIcon, getTagTypeLabel } from './tag-types'\nexport { tagKindTitle, tagKindNouns } from './tag-kinds'\nexport { ProjectEntity, type ProjectEntityProps, type ProjectRelation } from './ProjectEntity'\nexport { UserEntity, type UserEntityProps, type PresenceDisplayStatus } from './UserEntity'\nexport { VerifiedBadge, type VerifiedBadgeProps } from './VerifiedBadge'\n// One agent stamp and one presence wording for every surface \u2014 see AgentMarkers.\nexport { AgentBadge, PresenceLabel } from './AgentMarkers'\n\n// Status pill + RAG dot \u2014 generic presentation, domain vocabulary INJECTED.\nexport {\n StatusPill,\n type StatusPillProps,\n type StatusVariant,\n type StatusBadgeProps,\n type StatusBadgeComponent,\n configureStatusRegistry,\n getStatusVariant,\n type Rag,\n configureRagLabels,\n} from './status'\n\n// Canonical entity registry \u2014 icons, names, and the deployment injection seam.\nexport {\n ENTITY_MAPPINGS,\n type EntityType,\n type EntityIconComponent,\n type EntityRegistryOverride,\n type EntityLabelForm,\n configureEntityRegistry,\n getEntityIcon,\n getEntityLabel,\n entityNoun,\n EntityIcon,\n VISIBILITY_ICONS,\n VisibilityIcon,\n} from './registry'\n\nexport { configureEntityVocabulary, type EntityNoun, type EntityVocabulary } from './vocabulary'\n\n// Entity colour system \u2014 deterministic id \u2192 colour derivation.\nexport {\n BASE_COLORS,\n PLACEHOLDER_COLOR,\n NEUTRAL_GRAY,\n getEntityColor,\n getEntityColorStyles,\n getWorkspaceColor,\n} from './colors'\n\n// Workspace square glyph (initial on a colour fill) and the outlined agent-avatar colours.\nexport { ShieldIcon, type ShieldIconProps } from './ShieldIcon'\nexport { agentAvatarColors } from './agent-avatar-colors'\n\n// What kind of file a document is: the viewer's choice of renderer and the short label of its type.\nexport {\n isAudioFile,\n isDownloadOnlyFile,\n isImageFile,\n isMediaFile,\n isVideoFile,\n usesOriginalBytesForViewer,\n} from './media-type'\nexport {\n friendlyFileType,\n isPresentationFileName,\n PRESENTATIONS_FOLDER,\n PRESENTATION_TEMPLATES_FOLDER,\n} from './file-type'\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,4BAA4B;AACrC,SAAS,kBAAmC;AAC5C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,iBAAoD;AAC7D,SAAS,gBAAgB,iBAAiB,gBAAgB,uBAAuB;AACjF,SAAS,cAAc,oBAAoB;AAC3C,SAAS,qBAAoE;AAC7E,SAAS,kBAAoE;AAC7E,SAAS,qBAA8C;AAEvD,SAAS,YAAY,qBAAqB;AAG1C;AAAA,EACE;AAAA,EAKA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAGP;AAAA,EACE;AAAA,EAKA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,iCAAyE;AAGlF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,kBAAwC;AACjD,SAAS,yBAAyB;AAGlC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { FILE_TYPE_COLORS } from "./colors.js";
|
|
3
|
+
const PresIcon = ({ size = 16, className = "" }) => {
|
|
4
|
+
return /* @__PURE__ */ jsxs(
|
|
5
|
+
"svg",
|
|
6
|
+
{
|
|
7
|
+
width: size,
|
|
8
|
+
height: size,
|
|
9
|
+
viewBox: "0 0 24 24",
|
|
10
|
+
fill: "none",
|
|
11
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
12
|
+
className,
|
|
13
|
+
children: [
|
|
14
|
+
/* @__PURE__ */ jsx(
|
|
15
|
+
"path",
|
|
16
|
+
{
|
|
17
|
+
d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z",
|
|
18
|
+
fill: FILE_TYPE_COLORS.pres,
|
|
19
|
+
stroke: FILE_TYPE_COLORS.pres,
|
|
20
|
+
strokeWidth: "1",
|
|
21
|
+
strokeLinecap: "round",
|
|
22
|
+
strokeLinejoin: "round"
|
|
23
|
+
}
|
|
24
|
+
),
|
|
25
|
+
/* @__PURE__ */ jsx(
|
|
26
|
+
"path",
|
|
27
|
+
{
|
|
28
|
+
d: "M14 2v6h6",
|
|
29
|
+
fill: "none",
|
|
30
|
+
stroke: FILE_TYPE_COLORS.white,
|
|
31
|
+
strokeWidth: "1",
|
|
32
|
+
strokeLinecap: "round",
|
|
33
|
+
strokeLinejoin: "round"
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ jsx("rect", { x: "7", y: "11", width: "10", height: "6", rx: "0.75", fill: FILE_TYPE_COLORS.white }),
|
|
37
|
+
/* @__PURE__ */ jsx(
|
|
38
|
+
"path",
|
|
39
|
+
{
|
|
40
|
+
d: "M12 17v2.5",
|
|
41
|
+
stroke: FILE_TYPE_COLORS.white,
|
|
42
|
+
strokeWidth: "1.2",
|
|
43
|
+
strokeLinecap: "round"
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
};
|
|
50
|
+
export {
|
|
51
|
+
PresIcon
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=PresIcon.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/icons/PresIcon.tsx"],
|
|
4
|
+
"sourcesContent": ["/** Presentation file icon (fuchsia, a slide on it): a saved ARBI presentation, told apart from a PDF. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const PresIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.pres}\n stroke={FILE_TYPE_COLORS.pres}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n {/* A slide on a stand. */}\n <rect x=\"7\" y=\"11\" width=\"10\" height=\"6\" rx=\"0.75\" fill={FILE_TYPE_COLORS.white} />\n <path\n d=\"M12 17v2.5\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAYI,SAQE,KARF;AATJ,SAAS,wBAAwB;AAO1B,MAAM,WAAgC,CAAC,EAAE,OAAO,IAAI,YAAY,GAAG,MAAM;AAC9E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAM,iBAAiB;AAAA,YACvB,QAAQ,iBAAiB;AAAA,YACzB,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,gBAAe;AAAA;AAAA,QACjB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA,YACL,QAAQ,iBAAiB;AAAA,YACzB,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,gBAAe;AAAA;AAAA,QACjB;AAAA,QAEA,oBAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,MAAK,QAAO,KAAI,IAAG,QAAO,MAAM,iBAAiB,OAAO;AAAA,QACjF;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,QAAQ,iBAAiB;AAAA,YACzB,aAAY;AAAA,YACZ,eAAc;AAAA;AAAA,QAChB;AAAA;AAAA;AAAA,EACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/icons/colors.js
CHANGED
package/dist/icons/colors.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/icons/colors.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * File-type icon colors \u2014 the subset of the app's FILE_TYPE_COLORS used by the\n * promoted file-type icons. Kept self-contained so the SDK icons render with the\n * same palette as the ARBI app without depending on the app's style constants.\n */\n\nconst NEUTRAL_GRAY = '#64748b' // slate-500\n\nexport const FILE_TYPE_COLORS = {\n pdf: '#ef4444', // red\n doc: '#3b82f6', // blue (Word docs)\n docx: '#3b82f6', // blue\n html: '#0284c7', // sky-600 (web files)\n img: '#8b5cf6', // violet-500 (images)\n vid: '#10b981', // emerald-500 (video)\n aud: '#f59e0b', // amber-500 (audio)\n xls: '#16a34a', // green-600 (Excel)\n eml: '#0d9488', // teal-600 (email)\n txt: NEUTRAL_GRAY, // gray (plain text)\n generic: NEUTRAL_GRAY, // gray (unknown)\n white: '#ffffff', // for strokes/text on colored backgrounds\n}\n"],
|
|
5
|
-
"mappings": "AAMA,MAAM,eAAe;AAEd,MAAM,mBAAmB;AAAA,EAC9B,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,SAAS;AAAA;AAAA,EACT,OAAO;AAAA;AACT;",
|
|
4
|
+
"sourcesContent": ["/**\n * File-type icon colors \u2014 the subset of the app's FILE_TYPE_COLORS used by the\n * promoted file-type icons. Kept self-contained so the SDK icons render with the\n * same palette as the ARBI app without depending on the app's style constants.\n */\n\nconst NEUTRAL_GRAY = '#64748b' // slate-500\n\nexport const FILE_TYPE_COLORS = {\n pdf: '#ef4444', // red\n doc: '#3b82f6', // blue (Word docs)\n docx: '#3b82f6', // blue\n html: '#0284c7', // sky-600 (web files)\n img: '#8b5cf6', // violet-500 (images)\n vid: '#10b981', // emerald-500 (video)\n aud: '#f59e0b', // amber-500 (audio)\n xls: '#16a34a', // green-600 (Excel)\n eml: '#0d9488', // teal-600 (email)\n pres: '#c026d3', // fuchsia-600 (presentations)\n txt: NEUTRAL_GRAY, // gray (plain text)\n generic: NEUTRAL_GRAY, // gray (unknown)\n white: '#ffffff', // for strokes/text on colored backgrounds\n}\n"],
|
|
5
|
+
"mappings": "AAMA,MAAM,eAAe;AAEd,MAAM,mBAAmB;AAAA,EAC9B,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,MAAM;AAAA;AAAA,EACN,KAAK;AAAA;AAAA,EACL,SAAS;AAAA;AAAA,EACT,OAAO;AAAA;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/icons/file-type.js
CHANGED
|
@@ -4,6 +4,8 @@ import { EmlIcon } from "./EmlIcon.js";
|
|
|
4
4
|
import { HtmlIcon } from "./HtmlIcon.js";
|
|
5
5
|
import { ImgIcon } from "./ImgIcon.js";
|
|
6
6
|
import { PdfIcon } from "./PdfIcon.js";
|
|
7
|
+
import { PresIcon } from "./PresIcon.js";
|
|
8
|
+
import { isPresentationFileName } from "../entities/file-type.js";
|
|
7
9
|
import { VidIcon } from "./VidIcon.js";
|
|
8
10
|
import { XlsIcon } from "./XlsIcon.js";
|
|
9
11
|
import { FileText } from "lucide-react";
|
|
@@ -95,6 +97,7 @@ function iconFromMime(mime) {
|
|
|
95
97
|
return null;
|
|
96
98
|
}
|
|
97
99
|
function getFileTypeIcon(fileName, opts) {
|
|
100
|
+
if (isPresentationFileName(fileName, opts?.folder)) return PresIcon;
|
|
98
101
|
return iconFromExtension(getFileExtension(fileName)) ?? (opts?.mime ? iconFromMime(opts.mime) : null) ?? (opts?.defaultToPdf ? PdfIcon : TextIcon);
|
|
99
102
|
}
|
|
100
103
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/icons/file-type.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Maps a file name (by extension) to the matching branded file-type icon\n * component. Single source of truth so the document grid, navigator, and the\n * file-explorer view all show identical icons.\n *\n * The icon components share a `{ size?, className? }` signature, so callers can\n * render the returned component at any size.\n */\n\nimport { AudIcon } from './AudIcon'\nimport { DocIcon } from './DocIcon'\nimport { EmlIcon } from './EmlIcon'\nimport { HtmlIcon } from './HtmlIcon'\nimport { ImgIcon } from './ImgIcon'\nimport { PdfIcon } from './PdfIcon'\nimport { VidIcon } from './VidIcon'\nimport { XlsIcon } from './XlsIcon'\nimport type { ComponentType } from 'react'\nimport { FileText } from 'lucide-react'\n\nexport type FileTypeIcon = ComponentType<{ size?: number; className?: string }>\n\n/**\n * Neutral document icon for plain-text files and anything otherwise\n * unrecognised. Inherits `currentColor`, so callers can tint it (e.g.\n * `text-muted-foreground`); a friendlier explorer fallback than a \"?\" glyph.\n */\nconst TextIcon: FileTypeIcon = FileText\n\nconst IMAGE_EXTENSIONS = new Set(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tif', 'webp', 'svg'])\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'mpeg', 'mpg', 'webm', 'mov', 'avi', 'mkv'])\nconst AUDIO_EXTENSIONS = new Set(['mp3', 'wav', 'm4a', 'aac', 'ogg', 'flac'])\nconst DOCX_EXTENSIONS = new Set(['doc', 'docx', 'odt', 'rtf'])\nconst XLSX_EXTENSIONS = new Set(['xls', 'xlsx', 'csv', 'ods'])\nconst EMAIL_EXTENSIONS = new Set(['eml', 'msg'])\nconst HTML_EXTENSIONS = new Set(['html', 'htm', 'mhtml'])\nconst PDF_EXTENSIONS = new Set(['pdf'])\nconst TEXT_EXTENSIONS = new Set([\n 'txt',\n 'text',\n 'md',\n 'markdown',\n 'log',\n 'json',\n 'xml',\n 'yaml',\n 'yml',\n])\n\n/** Lower-cased extension (without the dot), or '' when there is none. */\nexport function getFileExtension(fileName?: string | null): string {\n if (!fileName) return ''\n const dot = fileName.lastIndexOf('.')\n if (dot <= 0 || dot === fileName.length - 1) return ''\n return fileName.slice(dot + 1).toLowerCase()\n}\n\n/** Canonical extensions for the MIME types we expect from the backend. */\nconst MIME_TO_EXTENSION: Record<string, string> = {\n 'application/pdf': 'pdf',\n 'text/plain': 'txt',\n 'text/markdown': 'md',\n 'text/html': 'html',\n 'text/csv': 'csv',\n 'application/json': 'json',\n 'application/xml': 'xml',\n 'application/msword': 'doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/rtf': 'rtf',\n 'application/vnd.oasis.opendocument.text': 'odt',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'application/vnd.oasis.opendocument.spreadsheet': 'ods',\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n 'image/tiff': 'tiff',\n 'image/bmp': 'bmp',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n 'video/quicktime': 'mov',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'audio/ogg': 'ogg',\n 'message/rfc822': 'eml',\n}\n\n/**\n * Best-effort file extension (no dot) for a MIME type, or '' when unknown.\n * Used to surface the real extension for documents stored with a display title\n * that has none.\n */\nexport function extensionFromMime(mime?: string | null): string {\n if (!mime) return ''\n return MIME_TO_EXTENSION[mime.toLowerCase()] ?? ''\n}\n\n/** Icon from a file extension, or null when the extension isn't recognised. */\nfunction iconFromExtension(ext: string): FileTypeIcon | null {\n if (VIDEO_EXTENSIONS.has(ext)) return VidIcon\n if (AUDIO_EXTENSIONS.has(ext)) return AudIcon\n if (IMAGE_EXTENSIONS.has(ext)) return ImgIcon\n if (DOCX_EXTENSIONS.has(ext)) return DocIcon\n if (XLSX_EXTENSIONS.has(ext)) return XlsIcon\n if (EMAIL_EXTENSIONS.has(ext)) return EmlIcon\n if (HTML_EXTENSIONS.has(ext)) return HtmlIcon\n if (PDF_EXTENSIONS.has(ext)) return PdfIcon\n if (TEXT_EXTENSIONS.has(ext)) return TextIcon\n return null\n}\n\n/**\n * Icon from a MIME type, or null when unrecognised. Used as a fallback for\n * documents whose stored `file_name` carries no extension (common when a\n * display title is used instead).\n */\nfunction iconFromMime(mime: string): FileTypeIcon | null {\n const m = mime.toLowerCase()\n if (m.startsWith('image/')) return ImgIcon\n if (m.startsWith('video/')) return VidIcon\n if (m.startsWith('audio/')) return AudIcon\n if (m === 'application/pdf') return PdfIcon\n if (m === 'text/html') return HtmlIcon\n if (m === 'message/rfc822' || m.includes('outlook')) return EmlIcon\n if (m.includes('word') || m === 'application/rtf' || m.includes('opendocument.text'))\n return DocIcon\n if (\n m.includes('sheet') ||\n m.includes('excel') ||\n m === 'text/csv' ||\n m.includes('opendocument.spreadsheet')\n )\n return XlsIcon\n if (m.startsWith('text/') || m === 'application/json' || m === 'application/xml') return TextIcon\n return null\n}\n\n/**\n * Returns the icon component for a document.\n *\n * Resolution order: file-name extension \u2192 MIME `file_type` \u2192 fallback. This\n * mirrors how documents are stored \u2014 many carry a display title without an\n * extension, so the MIME type is the reliable signal.\n *\n * @param fileName the document file name (uses its extension)\n * @param opts.mime the document `file_type` (MIME), used when the name has no\n * recognised extension\n * @param opts.defaultToPdf when true, an unresolved type falls back to the PDF\n * icon (preserves legacy grid/navigator behaviour). Defaults to the neutral\n * generic file icon.\n */\nexport function getFileTypeIcon(\n fileName?: string | null,\n opts?: { mime?: string | null; defaultToPdf?: boolean }\n): FileTypeIcon {\n return (\n iconFromExtension(getFileExtension(fileName)) ??\n (opts?.mime ? iconFromMime(opts.mime) : null) ??\n (opts?.defaultToPdf ? PdfIcon : TextIcon)\n )\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * Maps a file name (by extension) to the matching branded file-type icon\n * component. Single source of truth so the document grid, navigator, and the\n * file-explorer view all show identical icons.\n *\n * The icon components share a `{ size?, className? }` signature, so callers can\n * render the returned component at any size.\n */\n\nimport { AudIcon } from './AudIcon'\nimport { DocIcon } from './DocIcon'\nimport { EmlIcon } from './EmlIcon'\nimport { HtmlIcon } from './HtmlIcon'\nimport { ImgIcon } from './ImgIcon'\nimport { PdfIcon } from './PdfIcon'\nimport { PresIcon } from './PresIcon'\nimport { isPresentationFileName } from '../entities/file-type'\nimport { VidIcon } from './VidIcon'\nimport { XlsIcon } from './XlsIcon'\nimport type { ComponentType } from 'react'\nimport { FileText } from 'lucide-react'\n\nexport type FileTypeIcon = ComponentType<{ size?: number; className?: string }>\n\n/**\n * Neutral document icon for plain-text files and anything otherwise\n * unrecognised. Inherits `currentColor`, so callers can tint it (e.g.\n * `text-muted-foreground`); a friendlier explorer fallback than a \"?\" glyph.\n */\nconst TextIcon: FileTypeIcon = FileText\n\nconst IMAGE_EXTENSIONS = new Set(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tif', 'webp', 'svg'])\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'mpeg', 'mpg', 'webm', 'mov', 'avi', 'mkv'])\nconst AUDIO_EXTENSIONS = new Set(['mp3', 'wav', 'm4a', 'aac', 'ogg', 'flac'])\nconst DOCX_EXTENSIONS = new Set(['doc', 'docx', 'odt', 'rtf'])\nconst XLSX_EXTENSIONS = new Set(['xls', 'xlsx', 'csv', 'ods'])\nconst EMAIL_EXTENSIONS = new Set(['eml', 'msg'])\nconst HTML_EXTENSIONS = new Set(['html', 'htm', 'mhtml'])\nconst PDF_EXTENSIONS = new Set(['pdf'])\nconst TEXT_EXTENSIONS = new Set([\n 'txt',\n 'text',\n 'md',\n 'markdown',\n 'log',\n 'json',\n 'xml',\n 'yaml',\n 'yml',\n])\n\n/** Lower-cased extension (without the dot), or '' when there is none. */\nexport function getFileExtension(fileName?: string | null): string {\n if (!fileName) return ''\n const dot = fileName.lastIndexOf('.')\n if (dot <= 0 || dot === fileName.length - 1) return ''\n return fileName.slice(dot + 1).toLowerCase()\n}\n\n/** Canonical extensions for the MIME types we expect from the backend. */\nconst MIME_TO_EXTENSION: Record<string, string> = {\n 'application/pdf': 'pdf',\n 'text/plain': 'txt',\n 'text/markdown': 'md',\n 'text/html': 'html',\n 'text/csv': 'csv',\n 'application/json': 'json',\n 'application/xml': 'xml',\n 'application/msword': 'doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/rtf': 'rtf',\n 'application/vnd.oasis.opendocument.text': 'odt',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'application/vnd.oasis.opendocument.spreadsheet': 'ods',\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n 'image/tiff': 'tiff',\n 'image/bmp': 'bmp',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n 'video/quicktime': 'mov',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'audio/ogg': 'ogg',\n 'message/rfc822': 'eml',\n}\n\n/**\n * Best-effort file extension (no dot) for a MIME type, or '' when unknown.\n * Used to surface the real extension for documents stored with a display title\n * that has none.\n */\nexport function extensionFromMime(mime?: string | null): string {\n if (!mime) return ''\n return MIME_TO_EXTENSION[mime.toLowerCase()] ?? ''\n}\n\n/** Icon from a file extension, or null when the extension isn't recognised. */\nfunction iconFromExtension(ext: string): FileTypeIcon | null {\n if (VIDEO_EXTENSIONS.has(ext)) return VidIcon\n if (AUDIO_EXTENSIONS.has(ext)) return AudIcon\n if (IMAGE_EXTENSIONS.has(ext)) return ImgIcon\n if (DOCX_EXTENSIONS.has(ext)) return DocIcon\n if (XLSX_EXTENSIONS.has(ext)) return XlsIcon\n if (EMAIL_EXTENSIONS.has(ext)) return EmlIcon\n if (HTML_EXTENSIONS.has(ext)) return HtmlIcon\n if (PDF_EXTENSIONS.has(ext)) return PdfIcon\n if (TEXT_EXTENSIONS.has(ext)) return TextIcon\n return null\n}\n\n/**\n * Icon from a MIME type, or null when unrecognised. Used as a fallback for\n * documents whose stored `file_name` carries no extension (common when a\n * display title is used instead).\n */\nfunction iconFromMime(mime: string): FileTypeIcon | null {\n const m = mime.toLowerCase()\n if (m.startsWith('image/')) return ImgIcon\n if (m.startsWith('video/')) return VidIcon\n if (m.startsWith('audio/')) return AudIcon\n if (m === 'application/pdf') return PdfIcon\n if (m === 'text/html') return HtmlIcon\n if (m === 'message/rfc822' || m.includes('outlook')) return EmlIcon\n if (m.includes('word') || m === 'application/rtf' || m.includes('opendocument.text'))\n return DocIcon\n if (\n m.includes('sheet') ||\n m.includes('excel') ||\n m === 'text/csv' ||\n m.includes('opendocument.spreadsheet')\n )\n return XlsIcon\n if (m.startsWith('text/') || m === 'application/json' || m === 'application/xml') return TextIcon\n return null\n}\n\n/**\n * Returns the icon component for a document.\n *\n * Resolution order: file-name extension \u2192 MIME `file_type` \u2192 fallback. This\n * mirrors how documents are stored \u2014 many carry a display title without an\n * extension, so the MIME type is the reliable signal.\n *\n * @param fileName the document file name (uses its extension)\n * @param opts.mime the document `file_type` (MIME), used when the name has no\n * recognised extension\n * @param opts.defaultToPdf when true, an unresolved type falls back to the PDF\n * icon (preserves legacy grid/navigator behaviour). Defaults to the neutral\n * generic file icon.\n */\nexport function getFileTypeIcon(\n fileName?: string | null,\n opts?: { mime?: string | null; defaultToPdf?: boolean; folder?: string | null }\n): FileTypeIcon {\n // A saved presentation is a PDF by extension: its folder (or an older name) says what it is.\n if (isPresentationFileName(fileName, opts?.folder)) return PresIcon\n return (\n iconFromExtension(getFileExtension(fileName)) ??\n (opts?.mime ? iconFromMime(opts.mime) : null) ??\n (opts?.defaultToPdf ? PdfIcon : TextIcon)\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/icons/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PdfIcon } from "./PdfIcon.js";
|
|
2
|
+
import { PresIcon } from "./PresIcon.js";
|
|
2
3
|
import { DocIcon } from "./DocIcon.js";
|
|
3
4
|
import { HtmlIcon } from "./HtmlIcon.js";
|
|
4
5
|
import { TxtIcon } from "./TxtIcon.js";
|
|
@@ -44,6 +45,7 @@ export {
|
|
|
44
45
|
LinkedInIcon,
|
|
45
46
|
OpenAIIcon,
|
|
46
47
|
PdfIcon,
|
|
48
|
+
PresIcon,
|
|
47
49
|
ProviderIcon,
|
|
48
50
|
TxtIcon,
|
|
49
51
|
VidIcon,
|
package/dist/icons/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/icons/index.ts"],
|
|
4
|
-
"sourcesContent": ["// File-type icons\nexport { PdfIcon } from './PdfIcon'\nexport { DocIcon } from './DocIcon'\nexport { HtmlIcon } from './HtmlIcon'\nexport { TxtIcon } from './TxtIcon'\nexport { XlsIcon } from './XlsIcon'\nexport { AudIcon } from './AudIcon'\nexport { ImgIcon } from './ImgIcon'\nexport { VidIcon } from './VidIcon'\nexport { EmlIcon } from './EmlIcon'\nexport { FILE_TYPE_COLORS } from './colors'\nexport {\n getFileTypeIcon,\n getFileExtension,\n extensionFromMime,\n type FileTypeIcon,\n} from './file-type'\n\n// Brand / provider icons\nexport { AppleIcon } from './AppleIcon'\nexport { GoogleIcon } from './GoogleIcon'\nexport { GitHubIcon } from './GitHubIcon'\nexport { LinkedInIcon } from './LinkedInIcon'\nexport { OpenAIIcon } from './OpenAIIcon'\nexport { ClaudeIcon } from './ClaudeIcon'\nexport { GeminiIcon } from './GeminiIcon'\nexport { FireworksIcon } from './FireworksIcon'\nexport { ProviderIcon } from './ProviderIcon'\n\n// ARBI brand marks\nexport { ArbiIcon } from './ArbiIcon'\nexport { ARBI_MARK_SRC } from './arbi-mark'\nexport { ArbiBotHeadIcon } from './ArbiBotHeadIcon'\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,wBAAwB;AACjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAGP,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAG7B,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;",
|
|
4
|
+
"sourcesContent": ["// File-type icons\nexport { PdfIcon } from './PdfIcon'\nexport { PresIcon } from './PresIcon'\nexport { DocIcon } from './DocIcon'\nexport { HtmlIcon } from './HtmlIcon'\nexport { TxtIcon } from './TxtIcon'\nexport { XlsIcon } from './XlsIcon'\nexport { AudIcon } from './AudIcon'\nexport { ImgIcon } from './ImgIcon'\nexport { VidIcon } from './VidIcon'\nexport { EmlIcon } from './EmlIcon'\nexport { FILE_TYPE_COLORS } from './colors'\nexport {\n getFileTypeIcon,\n getFileExtension,\n extensionFromMime,\n type FileTypeIcon,\n} from './file-type'\n\n// Brand / provider icons\nexport { AppleIcon } from './AppleIcon'\nexport { GoogleIcon } from './GoogleIcon'\nexport { GitHubIcon } from './GitHubIcon'\nexport { LinkedInIcon } from './LinkedInIcon'\nexport { OpenAIIcon } from './OpenAIIcon'\nexport { ClaudeIcon } from './ClaudeIcon'\nexport { GeminiIcon } from './GeminiIcon'\nexport { FireworksIcon } from './FireworksIcon'\nexport { ProviderIcon } from './ProviderIcon'\n\n// ARBI brand marks\nexport { ArbiIcon } from './ArbiIcon'\nexport { ARBI_MARK_SRC } from './arbi-mark'\nexport { ArbiBotHeadIcon } from './ArbiBotHeadIcon'\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,wBAAwB;AACjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAGP,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAG7B,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|