@arbidocs/blocks 0.5.48 → 0.5.50
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/DocumentReviewCard-DLR4XOIZ.cjs +516 -0
- package/dist/DocumentReviewCard-DLR4XOIZ.cjs.map +1 -0
- package/dist/DocumentReviewCard-Y67FFRPC.js +514 -0
- package/dist/DocumentReviewCard-Y67FFRPC.js.map +1 -0
- package/dist/calls/connected/ConnectedCallPage.d.ts +23 -0
- package/dist/calls/connected/index.d.ts +1 -0
- package/dist/calls/index.cjs +172 -0
- package/dist/calls/index.cjs.map +1 -1
- package/dist/calls/index.js +175 -4
- package/dist/calls/index.js.map +1 -1
- package/dist/chunk-3Y4UTPCD.js +1521 -0
- package/dist/chunk-3Y4UTPCD.js.map +1 -0
- package/dist/chunk-5TDGVOR5.js +142 -0
- package/dist/chunk-5TDGVOR5.js.map +1 -0
- package/dist/{chunk-QKOFQMAY.cjs → chunk-5YX3R6CK.cjs} +5 -4
- package/dist/chunk-5YX3R6CK.cjs.map +1 -0
- package/dist/chunk-63IH7V5F.js +13 -0
- package/dist/chunk-63IH7V5F.js.map +1 -0
- package/dist/chunk-C3VTWM74.js +123 -0
- package/dist/chunk-C3VTWM74.js.map +1 -0
- package/dist/chunk-DVE6NNZ2.cjs +15 -0
- package/dist/chunk-DVE6NNZ2.cjs.map +1 -0
- package/dist/{chunk-XBITXJZU.js → chunk-EQ433QPZ.js} +4 -3
- package/dist/chunk-EQ433QPZ.js.map +1 -0
- package/dist/{chunk-UAEYU2NN.cjs → chunk-H32DV7XS.cjs} +2 -136
- package/dist/chunk-H32DV7XS.cjs.map +1 -0
- package/dist/{chunk-EARQ2CUX.js → chunk-IQ3VDTR7.js} +6 -119
- package/dist/chunk-IQ3VDTR7.js.map +1 -0
- package/dist/chunk-NUQ3RY7M.cjs +130 -0
- package/dist/chunk-NUQ3RY7M.cjs.map +1 -0
- package/dist/{chunk-V2UQR7P6.cjs → chunk-QLY22ZZW.cjs} +9 -8
- package/dist/chunk-QLY22ZZW.cjs.map +1 -0
- package/dist/chunk-REH7PX3N.cjs +145 -0
- package/dist/chunk-REH7PX3N.cjs.map +1 -0
- package/dist/{chunk-VQHXVY26.cjs → chunk-RTS3B2W7.cjs} +2 -121
- package/dist/chunk-RTS3B2W7.cjs.map +1 -0
- package/dist/chunk-S7B5E3RU.cjs +1553 -0
- package/dist/chunk-S7B5E3RU.cjs.map +1 -0
- package/dist/{chunk-WZ63HE2C.js → chunk-XRL4R2TT.js} +4 -136
- package/dist/chunk-XRL4R2TT.js.map +1 -0
- package/dist/{chunk-E6EYRQC2.js → chunk-YYZH6VRP.js} +6 -5
- package/dist/chunk-YYZH6VRP.js.map +1 -0
- package/dist/connect/index.cjs +464 -1861
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +55 -1538
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +39 -39
- package/dist/connect/viewer.js +1 -1
- package/dist/connection/config/useDeveloperConfig.d.ts +1 -1
- package/dist/connection/files/fields/DocumentFieldParts.d.ts +2 -1
- package/dist/connection/files/fields/documentField.d.ts +1 -0
- package/dist/connection/files/grid/cells.d.ts +1 -0
- package/dist/connection/files/page/ConnectedFilesPage.d.ts +5 -2
- package/dist/connection/files/review/DocumentReviewCard.d.ts +32 -0
- package/dist/connection/files/review/useDocumentValueWrites.d.ts +15 -0
- package/dist/connection/files/review/useReviewColumns.d.ts +33 -0
- package/dist/files/cells/RelatedDocsCell.d.ts +3 -1
- package/dist/files/index.cjs +221 -221
- package/dist/files/index.js +1 -1
- package/dist/home/index.cjs +7 -6
- package/dist/home/index.cjs.map +1 -1
- package/dist/home/index.js +2 -1
- package/dist/home/index.js.map +1 -1
- package/dist/index.cjs +82 -82
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -8
- package/dist/index.js.map +1 -1
- package/dist/workspaces/index.cjs +29 -28
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.js +4 -3
- package/dist/workspaces/index.js.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/chunk-E6EYRQC2.js.map +0 -1
- package/dist/chunk-EARQ2CUX.js.map +0 -1
- package/dist/chunk-QKOFQMAY.cjs.map +0 -1
- package/dist/chunk-UAEYU2NN.cjs.map +0 -1
- package/dist/chunk-V2UQR7P6.cjs.map +0 -1
- package/dist/chunk-VQHXVY26.cjs.map +0 -1
- package/dist/chunk-WZ63HE2C.js.map +0 -1
- package/dist/chunk-XBITXJZU.js.map +0 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useDroppable } from '@dnd-kit/core';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
// src/components/DroppableContainer.tsx
|
|
6
|
+
function DroppableContainer({ id, children, className = "" }) {
|
|
7
|
+
const { setNodeRef } = useDroppable({ id });
|
|
8
|
+
return /* @__PURE__ */ jsx("div", { ref: setNodeRef, className, children });
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { DroppableContainer };
|
|
12
|
+
//# sourceMappingURL=chunk-63IH7V5F.js.map
|
|
13
|
+
//# sourceMappingURL=chunk-63IH7V5F.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/DroppableContainer.tsx"],"names":[],"mappings":";;;;AAQO,SAAS,mBAAmB,EAAE,EAAA,EAAI,QAAA,EAAU,SAAA,GAAY,IAAG,EAA4B;AAC5F,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,YAAA,CAAa,EAAE,IAAI,CAAA;AAC1C,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,UAAA,EAAY,WACnB,QAAA,EACH,CAAA;AAEJ","file":"chunk-63IH7V5F.js","sourcesContent":["import { useDroppable } from '@dnd-kit/core'\n\nexport interface DroppableContainerProps {\n id: string\n children: React.ReactNode\n className?: string\n}\n\nexport function DroppableContainer({ id, children, className = '' }: DroppableContainerProps) {\n const { setNodeRef } = useDroppable({ id })\n return (\n <div ref={setNodeRef} className={className}>\n {children}\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { memo } from 'react';
|
|
3
|
+
import { VisibilityToggle, cn } from '@arbidocs/react/ui';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/components/SharedCell.tsx
|
|
7
|
+
function SharedCellComponent({
|
|
8
|
+
item,
|
|
9
|
+
onToggle,
|
|
10
|
+
disabled = false,
|
|
11
|
+
disabledTooltip,
|
|
12
|
+
disablePrivate = false,
|
|
13
|
+
tooltipActive,
|
|
14
|
+
tooltipInactive,
|
|
15
|
+
workspaceLabel
|
|
16
|
+
}) {
|
|
17
|
+
const isShared = item.shared ?? item.is_shared ?? false;
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
"div",
|
|
20
|
+
{
|
|
21
|
+
className: "flex justify-center items-center h-full",
|
|
22
|
+
"data-testid": `shared-cell-${item.external_id}`,
|
|
23
|
+
children: /* @__PURE__ */ jsx(
|
|
24
|
+
VisibilityToggle,
|
|
25
|
+
{
|
|
26
|
+
items: item,
|
|
27
|
+
onToggle,
|
|
28
|
+
disabled,
|
|
29
|
+
disabledTooltip,
|
|
30
|
+
disablePrivate,
|
|
31
|
+
showLabel: false,
|
|
32
|
+
tooltipActive,
|
|
33
|
+
tooltipInactive,
|
|
34
|
+
workspaceLabel,
|
|
35
|
+
"data-testid": `${isShared ? "active-share-button" : "inactive-share-button"}`
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function arePropsEqual(prevProps, nextProps) {
|
|
42
|
+
if (prevProps.item.external_id !== nextProps.item.external_id) return false;
|
|
43
|
+
if (prevProps.item.shared !== nextProps.item.shared) return false;
|
|
44
|
+
if (prevProps.item.is_shared !== nextProps.item.is_shared) return false;
|
|
45
|
+
if (prevProps.disabled !== nextProps.disabled) return false;
|
|
46
|
+
if (prevProps.disabledTooltip !== nextProps.disabledTooltip) return false;
|
|
47
|
+
if (prevProps.disablePrivate !== nextProps.disablePrivate) return false;
|
|
48
|
+
if (prevProps.tooltipActive !== nextProps.tooltipActive) return false;
|
|
49
|
+
if (prevProps.tooltipInactive !== nextProps.tooltipInactive) return false;
|
|
50
|
+
if (prevProps.workspaceLabel !== nextProps.workspaceLabel) return false;
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
var SharedCell = memo(SharedCellComponent, arePropsEqual);
|
|
54
|
+
function EntityTooltip({
|
|
55
|
+
className,
|
|
56
|
+
children
|
|
57
|
+
}) {
|
|
58
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "entity-tooltip", className: cn("flex flex-col gap-2", className), children });
|
|
59
|
+
}
|
|
60
|
+
function EntityTooltipHeader({
|
|
61
|
+
lead,
|
|
62
|
+
title,
|
|
63
|
+
subtitle,
|
|
64
|
+
trailing,
|
|
65
|
+
titleAccessory
|
|
66
|
+
}) {
|
|
67
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
68
|
+
lead,
|
|
69
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
70
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
71
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-sm font-medium", children: title }),
|
|
72
|
+
titleAccessory
|
|
73
|
+
] }),
|
|
74
|
+
subtitle && /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-muted-foreground", children: subtitle })
|
|
75
|
+
] }),
|
|
76
|
+
trailing
|
|
77
|
+
] });
|
|
78
|
+
}
|
|
79
|
+
function EntityTooltipStats({ stats }) {
|
|
80
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-1.5 border-y border-border py-2", children: stats.map((s) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-sm", children: [
|
|
81
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
82
|
+
s.icon,
|
|
83
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: s.label })
|
|
84
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: s.value })
|
|
86
|
+
] }, s.key)) });
|
|
87
|
+
}
|
|
88
|
+
function EntityTooltipSection({
|
|
89
|
+
icon,
|
|
90
|
+
heading,
|
|
91
|
+
children
|
|
92
|
+
}) {
|
|
93
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5 border-t border-border pt-2", children: [
|
|
94
|
+
heading && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [
|
|
95
|
+
icon,
|
|
96
|
+
/* @__PURE__ */ jsx("span", { children: heading })
|
|
97
|
+
] }),
|
|
98
|
+
children
|
|
99
|
+
] });
|
|
100
|
+
}
|
|
101
|
+
function EntityTooltipHint({
|
|
102
|
+
icon,
|
|
103
|
+
children,
|
|
104
|
+
isRuled
|
|
105
|
+
}) {
|
|
106
|
+
return /* @__PURE__ */ jsxs(
|
|
107
|
+
"div",
|
|
108
|
+
{
|
|
109
|
+
className: cn(
|
|
110
|
+
"flex items-center gap-1.5 text-xs text-muted-foreground",
|
|
111
|
+
isRuled && "border-t border-border pt-1"
|
|
112
|
+
),
|
|
113
|
+
children: [
|
|
114
|
+
icon,
|
|
115
|
+
/* @__PURE__ */ jsx("span", { children })
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export { EntityTooltip, EntityTooltipHeader, EntityTooltipHint, EntityTooltipSection, EntityTooltipStats, SharedCell };
|
|
122
|
+
//# sourceMappingURL=chunk-C3VTWM74.js.map
|
|
123
|
+
//# sourceMappingURL=chunk-C3VTWM74.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/SharedCell.tsx","../src/components/EntityTooltip.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-C3VTWM74.js","sourcesContent":["/**\n * SharedCell Component\n *\n * Generic grid cell renderer for shared/private visibility state.\n * Works with any entity that has an external_id and shared/is_shared field.\n * Uses VisibilityToggle for consistent UI.\n */\n\nimport { memo } from 'react'\nimport { VisibilityToggle } from '@arbidocs/react/ui'\n\nexport interface SharedItem {\n external_id: string\n shared?: boolean | null\n is_shared?: boolean | null\n}\n\nexport interface SharedCellProps<T extends SharedItem> {\n item: T\n onToggle: (shouldShare: boolean) => void\n disabled?: boolean\n disabledTooltip?: string\n disablePrivate?: boolean\n /** Replaces the default tooltips (e.g. documents say who can see the file). */\n tooltipActive?: string\n tooltipInactive?: string\n /** The host's name for a workspace, used in the default tooltips. */\n workspaceLabel?: string\n}\n\nfunction SharedCellComponent<T extends SharedItem>({\n item,\n onToggle,\n disabled = false,\n disabledTooltip,\n disablePrivate = false,\n tooltipActive,\n tooltipInactive,\n workspaceLabel,\n}: SharedCellProps<T>) {\n const isShared = item.shared ?? item.is_shared ?? false\n\n return (\n <div\n className=\"flex justify-center items-center h-full\"\n data-testid={`shared-cell-${item.external_id}`}\n >\n <VisibilityToggle\n items={item}\n onToggle={onToggle}\n disabled={disabled}\n disabledTooltip={disabledTooltip}\n disablePrivate={disablePrivate}\n showLabel={false}\n tooltipActive={tooltipActive}\n tooltipInactive={tooltipInactive}\n workspaceLabel={workspaceLabel}\n data-testid={`${isShared ? 'active-share-button' : 'inactive-share-button'}`}\n />\n </div>\n )\n}\n\n// Type-safe memo wrapper\nfunction arePropsEqual<T extends SharedItem>(\n prevProps: SharedCellProps<T>,\n nextProps: SharedCellProps<T>\n): boolean {\n if (prevProps.item.external_id !== nextProps.item.external_id) return false\n if (prevProps.item.shared !== nextProps.item.shared) return false\n if (prevProps.item.is_shared !== nextProps.item.is_shared) return false\n if (prevProps.disabled !== nextProps.disabled) return false\n if (prevProps.disabledTooltip !== nextProps.disabledTooltip) return false\n if (prevProps.disablePrivate !== nextProps.disablePrivate) return false\n if (prevProps.tooltipActive !== nextProps.tooltipActive) return false\n if (prevProps.tooltipInactive !== nextProps.tooltipInactive) return false\n if (prevProps.workspaceLabel !== nextProps.workspaceLabel) return false\n // Note: onToggle is not compared as it should be stable (useCallback)\n return true\n}\n\nexport const SharedCell = memo(SharedCellComponent, arePropsEqual) as typeof SharedCellComponent\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/**\n * Parts for the hover card of an entity pill (workspace, user, tag, ...): a header, optional\n * stat rows, bordered sections and an action hint. The host fills them from its own data.\n */\n\nexport function EntityTooltip({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div data-slot=\"entity-tooltip\" className={cn('flex flex-col gap-2', className)}>\n {children}\n </div>\n )\n}\n\nexport interface EntityTooltipHeaderProps {\n /** Icon / avatar before the title. */\n lead: ReactNode\n title: ReactNode\n subtitle?: ReactNode\n /** Right-hand badge. */\n trailing?: ReactNode\n /** Extra glyph after the title (e.g. an agent mark). */\n titleAccessory?: ReactNode\n}\n\nexport function EntityTooltipHeader({\n lead,\n title,\n subtitle,\n trailing,\n titleAccessory,\n}: EntityTooltipHeaderProps) {\n return (\n <div className=\"flex items-center gap-2\">\n {lead}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium\">{title}</span>\n {titleAccessory}\n </div>\n {subtitle && <span className=\"truncate text-xs text-muted-foreground\">{subtitle}</span>}\n </div>\n {trailing}\n </div>\n )\n}\n\nexport interface EntityTooltipStat {\n key: string\n icon: ReactNode\n label: ReactNode\n value: ReactNode\n}\n\n/** Label/value rows between two rules. */\nexport function EntityTooltipStats({ stats }: { stats: EntityTooltipStat[] }) {\n return (\n <div className=\"flex flex-col gap-1.5 border-y border-border py-2\">\n {stats.map((s) => (\n <div key={s.key} className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-2\">\n {s.icon}\n <span className=\"text-muted-foreground\">{s.label}</span>\n </div>\n <span className=\"font-medium\">{s.value}</span>\n </div>\n ))}\n </div>\n )\n}\n\n/** A secondary section under a rule, optionally headed by an icon + text. */\nexport function EntityTooltipSection({\n icon,\n heading,\n children,\n}: {\n icon?: ReactNode\n heading?: ReactNode\n children?: ReactNode\n}) {\n return (\n <div className=\"flex flex-col gap-1.5 border-t border-border pt-2\">\n {heading && (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n {icon}\n <span>{heading}</span>\n </div>\n )}\n {children}\n </div>\n )\n}\n\n/** Muted one-liner at the foot of the card, e.g. \"Click to send message\". */\nexport function EntityTooltipHint({\n icon,\n children,\n isRuled,\n}: {\n icon?: ReactNode\n children: ReactNode\n /** Draw the rule above (the hint closes a card that already has sections). */\n isRuled?: boolean\n}) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1.5 text-xs text-muted-foreground',\n isRuled && 'border-t border-border pt-1'\n )}\n >\n {icon}\n <span>{children}</span>\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var core = require('@dnd-kit/core');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
// src/components/DroppableContainer.tsx
|
|
8
|
+
function DroppableContainer({ id, children, className = "" }) {
|
|
9
|
+
const { setNodeRef } = core.useDroppable({ id });
|
|
10
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: setNodeRef, className, children });
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
exports.DroppableContainer = DroppableContainer;
|
|
14
|
+
//# sourceMappingURL=chunk-DVE6NNZ2.cjs.map
|
|
15
|
+
//# sourceMappingURL=chunk-DVE6NNZ2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/DroppableContainer.tsx"],"names":["useDroppable","jsx"],"mappings":";;;;;;AAQO,SAAS,mBAAmB,EAAE,EAAA,EAAI,QAAA,EAAU,SAAA,GAAY,IAAG,EAA4B;AAC5F,EAAA,MAAM,EAAE,UAAA,EAAW,GAAIA,iBAAA,CAAa,EAAE,IAAI,CAAA;AAC1C,EAAA,uBACEC,cAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,UAAA,EAAY,WACnB,QAAA,EACH,CAAA;AAEJ","file":"chunk-DVE6NNZ2.cjs","sourcesContent":["import { useDroppable } from '@dnd-kit/core'\n\nexport interface DroppableContainerProps {\n id: string\n children: React.ReactNode\n className?: string\n}\n\nexport function DroppableContainer({ id, children, className = '' }: DroppableContainerProps) {\n const { setNodeRef } = useDroppable({ id })\n return (\n <div ref={setNodeRef} className={className}>\n {children}\n </div>\n )\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { getHumanUserCount, getWorkspaceTypeInfo, getVariantBgClass } from './chunk-57CG33XJ.js';
|
|
3
|
-
import {
|
|
3
|
+
import { CollapsibleSection } from './chunk-5TDGVOR5.js';
|
|
4
|
+
import { KeyValueRow } from './chunk-XRL4R2TT.js';
|
|
4
5
|
import { MemberAvatarStack } from './chunk-FUPAGAZB.js';
|
|
5
6
|
import { WorkspaceTypeBadgeView } from './chunk-NBV56SGU.js';
|
|
6
7
|
import { ActionLink } from './chunk-NXSGOC2M.js';
|
|
@@ -761,5 +762,5 @@ function WorkspaceGroup({
|
|
|
761
762
|
}
|
|
762
763
|
|
|
763
764
|
export { CommonWorkspaceToggle, DEFAULT_WORKSPACE_CARD_LABELS, ExpandableSection, FormActions, FormErrorBanner, ItalicNone, LeaveFooter, ModalActionRow, PageLoading, ProjectActionButton, ProjectOptionRow, ProjectPicker, WorkspaceAudienceLine, WorkspaceCard, WorkspaceFieldsView, WorkspaceFormModal, WorkspaceGroup, WorkspaceIdentityPanel, WorkspaceList, WorkspacePageFrame, WorkspaceProjectSlot, WorkspaceTypeBadge, formatRole, getRoleBadgeClass, getRoleDescription };
|
|
764
|
-
//# sourceMappingURL=chunk-
|
|
765
|
-
//# sourceMappingURL=chunk-
|
|
765
|
+
//# sourceMappingURL=chunk-EQ433QPZ.js.map
|
|
766
|
+
//# sourceMappingURL=chunk-EQ433QPZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/workspaces/WorkspaceSettingsParts.tsx","../src/workspaces/CommonWorkspaceToggle.tsx","../src/workspaces/workspace-roles.ts","../src/workspaces/WorkspaceFormParts.tsx","../src/workspaces/WorkspaceTypeBadge.tsx","../src/workspaces/WorkspaceCard.tsx","../src/workspaces/WorkspaceGroup.tsx"],"names":["jsx","jsxs","cn","Button","Globe","FileText","Users","ChevronRight"],"mappings":";;;;;;;;;;;;;AASO,SAAS,kBAAA,CAAmB,EAAE,MAAA,EAAQ,QAAA,EAAS,EAA6C;AACjG,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iCAAA;AAAA,MACV,WAAA,EAAU,gBAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MAGb,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,2EAAA,EACb,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAS,CAAA,EAC9D;AAAA;AAAA,GACF;AAEJ;AAGO,SAAS,sBAAA,CAAuB,EAAE,QAAA,EAAS,EAA4B;AAC5E,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,0BAAA;AAAA,MACV,SAAA,EAAU,mEAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAUO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAS,EAA8B;AAC7F,EAAA,uBACE,GAAA,CAAC,SAAI,SAAA,EAAU,iCAAA,EACb,+BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAyC,aAAA,EAAa,MAAA,EACnE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,IAClC;AAAA,GAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAGO,SAAS,UAAA,CAAW,EAAE,QAAA,EAAS,EAA4B;AAChE,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EAAwC,QAAA,EAAS,CAAA;AAC1E;AAoBO,SAAS,qBAAA,CAAsB,EAAE,UAAA,EAAY,OAAA,EAAS,OAAM,EAA+B;AAChG,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA8C,aAAU,oBAAA,EACtE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,aAAA,EAAa,WAAW,MAAA,EAChE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,UAAA,CAAW,OAAA,EAAQ,CAAA;AAAA,MAC7C,UAAA,CAAW,MAAA;AAAA,2BAEX,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,gNAAA,EACvB,QAAA,EAAA,UAAA,CAAW,SAAA,EACd,CAAA;AAAA,4BACC,cAAA,EAAA,EAAe,KAAA,EAAM,SAAQ,SAAA,EAAU,cAAA,EACrC,qBAAW,SAAA,EACd;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MACA,KAAA,oBACC,IAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,SAAA,EAAU,8CAAA;AAAA,UACV,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,eAAa,KAAA,CAAM,MAAA;AAAA,UAEnB,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,QAAA,EAAS,CAAA;AAAA,YAC5B,KAAA,CAAM;AAAA;AAAA;AAAA;AACT,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAMO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,+DAAA;AAAA,QACA,WAAW,iBAAA,GAAoB;AAAA,OACjC;AAAA,MACA,WAAA,EAAU,oBAAA;AAAA,MACV,eAAA,EAAe,QAAA;AAAA,MACf,aAAA,EAAa,MAAA;AAAA,MAEb,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,iBAAA,EACb,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAS,CAAA,EAC9D;AAAA;AAAA,GACF;AAEJ;AAGO,SAAS,WAAA,CAAY,EAAE,QAAA,EAAS,EAA4B;AACjE,EAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAS,CAAA;AAC1E;AAQO,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAqB;AAC/D,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAmB,WAAA,EAAU,cAAA,EAAe,eAAa,MAAA,EACtE,QAAA,kBAAA,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,IAAA;AAAA,MACL,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAA,EAAU,sGAAA;AAAA,MACV,eAAa,KAAA,CAAM,MAAA;AAAA,MAEnB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,eAAA,EAAgB,CAAA;AAAA,QACjC,KAAA,CAAM;AAAA;AAAA;AAAA,GACT,EACF,CAAA;AAEJ;ACxJA,IAAM,MAAA,GAAS;AAAA,EACb,IAAA,EAAM,uBAAA;AAAA,EACN,EAAA,EAAI;AACN,CAAA;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,eAAA;AAAA,EACA,aAAA,EAAe;AACjB,CAAA,EAA+B;AAC7B,EAAA,uBACEA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,KAAA;AAAA,MACN,QAAA,EAAU,QAAA;AAAA,MACV,QAAA;AAAA,MACA,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA,EAAc,8EAAA;AAAA,MACd,eAAA,EAAgB,oGAAA;AAAA,MAChB,aAAA,EAAa;AAAA;AAAA,GACf;AAEJ;;;ACpCO,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AACpD;AAEA,IAAM,kBAAA,GAAwD;AAAA,EAC5D,KAAA,EAAO,8DAAA;AAAA,EACP,YAAA,EAAc,oEAAA;AAAA,EACd,KAAA,EAAO;AACT,CAAA;AAGO,SAAS,kBAAkB,IAAA,EAAiC;AACjE,EAAA,OAAO,mBAAmB,IAAI,CAAA;AAChC;AAEA,IAAM,iBAAA,GAAuD;AAAA,EAC3D,KAAA,EACE,4IAAA;AAAA,EACF,YAAA,EACE,0JAAA;AAAA,EACF,KAAA,EACE;AACJ,CAAA;AAGO,SAAS,mBAAmB,IAAA,EAAiC;AAClE,EAAA,OAAO,kBAAkB,IAAI,CAAA;AAC/B;ACJO,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAU,YAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAWC,EAAAA;AAAA,QACT,iGAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,iBAAA,EAAkB,eAAY,MAAA,EAAO,CAAA;AAAA,QAC3D;AAAA;AAAA;AAAA,GACH;AAEJ;AAGO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,QAAA,EAAS,EAAgD;AAChG,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAWE,EAAAA,CAAG,2DAAA,EAA6D,SAAS,CAAA;AAAA,MAEnF;AAAA;AAAA,GACH;AAEJ;AAGO,SAAS,cAAA,CAAe,EAAE,QAAA,EAAS,EAA4B;AACpE,EAAA,uBACEF,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAU,wJAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAkBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,IAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA,GAAU,QAAA;AAAA,EACV,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,GAAc,CAAA,aAAA,EAAgB,UAAA,CAAW,WAAW,CAAC,CAAA,CAAA;AAAA,EACrD;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,IAAA,GAAO,WAAW,WAAW,CAAA;AACnC,EAAA,MAAM,OAAA,GACJ,KAAA,KACC,OAAA,KAAY,SAAA,GACT,CAAA,uCAAA,EAAqC,IAAI,CAAA,CAAA,GACzC,CAAA,WAAA,EAAc,cAAA,CAAe,WAAW,CAAC,CAAA,CAAA,CAAA;AAC/C,EAAA,MAAM,eACJ,KAAA,KACC,OAAA,KAAY,SAAA,GACT,CAAA,EAAA,EAAK,IAAI,CAAA,gJAAA,CAAA,GACT,MAAA,CAAA;AACN,EAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAY,cAClB,QAAA,kBAAAC,IAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAa,OAAA;AAAA,MACb,SAAA,EAAU,sEAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,eACC,QAAA,kBAAAA,GAAAA,CAAC,iBAAc,IAAA,EAAY,KAAA,EAAO,OAAA,EAAS,WAAA,EAA0B,CAAA,EACvE,CAAA;AAAA,wBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,YAAA,oBAAgBD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,UAChF;AAAA,SAAA,EACH;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACEC,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,IAAC,WAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,IAAA;AAAA,sBACDD,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EACf,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,WAAW,QAAA,EAAA,WAAA,EAAY;AAAA,GAAA,EACtD,CAAA;AAEJ;AAGO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAU,IAAA,EAAK,EAA2C;AAC3F,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,wBAAQD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAkD,QAAA,EAAA,IAAA,EAAK;AAAA,GAAA,EAClF,CAAA;AAEJ;AA0BA,IAAM,YAAA,GAAe,YAAA;AAId,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,MAAA;AAAA,EACV,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS;AAAA,IACP,WAAA,EAAa,CAAA,OAAA,EAAU,UAAA,CAAW,SAAS,CAAC,CAAA,CAAA;AAAA,IAC5C,MAAA,EAAQ,CAAA,WAAA,EAAc,UAAA,CAAW,SAAS,CAAC,CAAA,GAAA;AAAA,GAC7C;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,UAAU,OAAA,KAAY,SAAA;AAC5B,EAAA,uBACEC,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA,IAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA;AAAA,MAC5B,aAAA,EAAe,CAAC,CAAA,KAAO,CAAA,KAAM,eAAe,QAAA,IAAW,GAAI,SAAS,CAAC,CAAA;AAAA,MACrE,UAAU,QAAA,IAAY,QAAA;AAAA,MAEtB,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWE,EAAAA;AAAA,cACT,OAAA,IACE,4GAAA;AAAA,cACF,SAAA;AAAA,cACA,QAAA,IAAY;AAAA,aACd;AAAA,YACA,aAAA,EACE,MAAA,KAAW,OAAA,GAAU,8BAAA,GAAiC,0BAAA,CAAA;AAAA,YAGvD,QAAA,EAAA,OAAA,mBAAUF,GAAAA,CAAC,WAAA,EAAA,EAAY,CAAA,mBAAKA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAA,EAAa,MAAA,CAAO,WAAA,EAAa;AAAA;AAAA,SAC7E;AAAA,wBACAC,IAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,OAAA,GAAU,QAAQ,MAAA,EACrC,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZD,GAAAA,CAAC,UAAA,EAAA,EAAsB,KAAA,EAAO,CAAA,CAAE,EAAA,EAC7B,QAAA,EAAA,CAAA,CAAE,OAAA,EAAA,EADY,CAAA,CAAE,EAEnB,CACD,CAAA;AAAA,UACA,QAAA,oBACCC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAD,IAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,4BACjBA,IAAC,UAAA,EAAA,EAAW,KAAA,EAAO,cACjB,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,8BAC3BA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,CAAO,MAAA,EAAO;AAAA,aAAA,EACvB,CAAA,EACF;AAAA,WAAA,EACF;AAAA,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;AAGO,SAAS,mBAAA,CAAoB;AAAA,EAClC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,uBACEC,IAAAA;AAAA,IAACE,MAAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAK,IAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAWD,EAAAA;AAAA,QACT,iFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,aAAA,EAAa,MAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,QAClC;AAAA;AAAA;AAAA,GACH;AAEJ;AAmCA,IAAM,cAAA,GAAwC;AAAA,EAC5C,cAAA,EAAgB,qBAAA;AAAA,EAChB,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EAAa,aAAA;AAAA,EACb,UAAA,EAAY,YAAA;AAAA,EACZ,IAAI,OAAA,GAAU;AACZ,IAAA,OAAO,eAAe,SAAS,CAAA;AAAA,EACjC,CAAA;AAAA,EACA,IAAA,EAAM,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,KAAA,CAAA;AAAA,EACjB,SAAA,EAAW,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,WAAA;AACxB,CAAA;AAGO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA,GAAU,OAAA;AAAA,EACV,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,OAAA;AAAA,EACA,aAAA,GAAgB,EAAA;AAAA,EAChB,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,yBAAyB,KAAA,EAAM;AACrC,EAAA,MAAM,kBAAkB,KAAA,EAAM;AAC9B,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AACzC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,UAAU,OAAA,KAAY,OAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,gBAAgB,IAAA,CAAK,MAAA;AAEvC,EAAA,MAAM,iBAAiB,CAAC,QAAA,IAAY,WAAA,KAAgB,CAAC,WAAW,SAAA,IAAa,EAAA,CAAA;AAC7E,EAAA,MAAM,UAAA,GAAa,OAAA,GAAU,QAAA,GAAW,QAAA,IAAY,QAAA;AAEpD,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,aAAU,kBAAA,EAClC,QAAA,EAAA;AAAA,IAAA,QAAA,oBACCD,IAAC,KAAA,EAAA,EAAI,aAAA,EAAY,kCAAiC,SAAA,EAAU,SAAA,EACzD,YAAE,cAAA,EACL,CAAA;AAAA,oBAEFA,GAAAA,CAAC,WAAA,EAAA,EAAY,OAAO,CAAA,CAAE,IAAA,EAAM,sBAAMA,GAAAA,CAAC,YAAS,IAAA,EAAM,EAAA,EAAI,GAAI,OAAA,EAAS,eAAA,EACjE,0BAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,eAAA;AAAA,UACJ,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,IAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC5C,QAAQ,MAAM;AACZ,YAAA,cAAA,CAAe,KAAK,CAAA;AACpB,YAAA,UAAA,IAAa;AAAA,UACf,CAAA;AAAA,UACA,SAAS,MAAM;AACb,YAAA,cAAA,CAAe,IAAI,CAAA;AACnB,YAAA,WAAA,IAAc;AAAA,UAChB,CAAA;AAAA,UACA,SAAA,EAAW,aAAA;AAAA,UACX,QAAA;AAAA,UACA,QAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAWE,EAAAA;AAAA,YACT,UAAU,eAAA,GAAkB,YAAA;AAAA,YAC5B,QAAA,IAAY,oBAAA;AAAA,YACZ;AAAA,WACF;AAAA,UACA,QAAA,EAAQ,IAAA;AAAA,UACR,cAAA,EAAc,UAAU,IAAA,GAAO,MAAA;AAAA,UAC/B,kBAAA,EAAkB,OAAA;AAAA,UAClB,aAAA,EAAY;AAAA;AAAA,OACd;AAAA,MACC,kCACCF,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWE,EAAAA;AAAA,YACT,uFAAA;AAAA,YACA,SAAA,GAAY,IAAI,eAAA,GAAkB;AAAA,WACpC;AAAA,UAEC,QAAA,EAAA,SAAA,GAAY,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,SAAS,CAAA,GAAI,CAAA,CAAE,SAAA,CAAU,SAAS;AAAA;AAAA;AAC7D,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,oBAEAF,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAO,CAAA,CAAE,WAAA;AAAA,QACT,IAAA,kBAAMA,GAAAA,CAAC,SAAA,EAAA,EAAU,MAAM,EAAA,EAAI,CAAA;AAAA,QAC3B,OAAA,EAAS,sBAAA;AAAA,QAET,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,sBAAA;AAAA,YACJ,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAO,IAAA;AAAA,YACP,KAAA,EAAO,WAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACnD,MAAA,EAAQ,iBAAA;AAAA,YACR,QAAA;AAAA,YACA,QAAA,EAAU,UAAA;AAAA,YACV,SAAA,EAAWE,EAAAA,CAAG,OAAA,IAAW,eAAA,EAAiB,YAAY,oBAAoB,CAAA;AAAA,YAC1E,aAAA,EAAY;AAAA;AAAA;AACd;AAAA,KACF;AAAA,IAEC,UAAA,oBACCF,GAAAA,CAAC,WAAA,EAAA,EAAY,OAAO,CAAA,CAAE,UAAA,EAAY,IAAA,kBAAMA,IAACI,KAAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,GACtD,QAAA,EAAA,UAAA,EACH,CAAA;AAAA,IAED,OAAA,oBACCJ,GAAAA,CAAC,WAAA,EAAA,EAAY,OAAO,CAAA,CAAE,OAAA,EAAS,IAAA,kBAAMA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI,GACxD,QAAA,EAAA,OAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACraO,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,IAAA,GAAO,IAAA;AAAA,EACP,UAAA,GAAa,KAAA;AAAA,EACb;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,SAAA,CAAU,KAAK,CAAA;AACnD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,KAAY,oBAAA,CAAqB,SAAA,CAAU,WAAW,SAAS,CAAA;AAC7E,EAAA,MAAM,OAAO,SAAA,CAAU,SAAA,GAAYI,KAAAA,GAAQ,SAAA,GAAY,IAAI,KAAA,GAAQ,IAAA;AAEnE,EAAA,uBACEJ,GAAAA;AAAA,IAAC,sBAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,kBAAkB,OAAO,CAAA;AAAA,MAClC,SAAA,EAAW,IAAA;AAAA,MACX,WAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;ACKO,IAAM,6BAAA,GAAqD;AAAA,EAChE,aAAA,EAAe,CAAC,IAAA,KAAS,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA;AAAA,EAC/C,gBAAA,EAAkB,mBAAA;AAAA,EAClB,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,CAAC,QAAA,KAAa,CAAA,QAAA,EAAW,QAAQ,CAAA;AAC5C;AAQA,IAAM,cAAc,aAAA,CAAgC;AAAA,EAClD,OAAA,EAAS,KAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAC,CAAA;AA4BD,SAAS,iBAAA,CAAkB;AAAA,EACzB,OAAA,GAAU,KAAA;AAAA,EACV,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAO,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AAC9F,EAAA,MAAM,YAAA,GAAeE,EAAAA;AAAA,IACnB,kHAAA;AAAA,IACA,yEAAA;AAAA,IACA,UACI,kCAAA,GACA,kGAAA;AAAA,IACJ;AAAA,GACF;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyC;AAC9D,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,aAAA,EAAe;AAC1C,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC9C,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF,CAAA;AACA,EAAA,uBACEF,GAAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAa,EAClE,iCACCA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACE,GAAI,IAAA;AAAA,MACL,IAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA,EAAY,KAAA;AAAA,MACZ,cAAA,EAAc,UAAU,MAAA,GAAS,MAAA;AAAA,MACjC,WAAA,EAAU,gBAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MACb,eAAa,OAAA,IAAW,MAAA;AAAA,MACxB,SAAA,EAAW,YAAA;AAAA,MAEV;AAAA;AAAA,sBAGHA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACZ,cAAA,EAAc,UAAU,MAAA,GAAS,MAAA;AAAA,MACjC,WAAA,EAAU,gBAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MACb,eAAa,OAAA,IAAW,MAAA;AAAA,MACxB,OAAA,EAAS,QAAA;AAAA,MACT,SAAA,EAAW,aAAA;AAAA,MACX,SAAA,EAAW,YAAA;AAAA,MAEV;AAAA;AAAA,GACH,EAEJ,CAAA;AAEJ;AAGA,SAAS,oBAAoB,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,MAAK,EAAuC;AACjG,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,SAAA,EAAWE,EAAAA,CAAG,6CAAA,EAA+C,SAAS,CAAA;AAAA,MACtE,WAAA,EAAU,uBAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,SAAA,EAAU,EAAgD;AAChG,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,UAAA,CAAW,WAAW,CAAA;AACzC,EAAA,uBACEF,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWE,EAAAA;AAAA,QACT,gGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,WAAA,EAAU,sBAAA;AAAA,MACV,aAAA,EAAa,MAAA,IAAU,CAAA,EAAG,MAAM,CAAA,MAAA,CAAA;AAAA,MAE/B;AAAA;AAAA,GACH;AAEJ;AAMA,SAAS,oBAAA,CAAqB;AAAA,EAC5B,MAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,WAAW,WAAW,CAAA;AAClD,EAAA,uBACEF,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oFAAA;AAAA,MACV,WAAA,EAAU,yBAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MAEZ,QAAA,EAAA,OAAA;AAAA;AAAA;AAAA,wBAGCC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8HAAA,EACd,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,8CAAA,EAA+C,eAAY,MAAA,EAAO,CAAA;AAAA,0BACnFA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0CAAA,EACb,QAAA,EAAA,YAAA,IAAgB,OAAO,gBAAA,EAC1B;AAAA,SAAA,EACF;AAAA,0BAEAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS,eAAY,MAAA,EAAO;AAAA;AAAA,GAExD;AAEJ;AAEA,SAAS,wBAAA,CAAyB;AAAA,EAChC,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWE,EAAAA,CAAG,4CAAA,EAA8C,SAAS,CAAA;AAAA,MACrE,KAAA,EAAO,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AAAA,MACjD,WAAA,EAAU,4BAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAGA,SAAS,qBAAA,CAAsB;AAAA,EAC7B,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAuC;AACrC,EAAA,uBACEF,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,SAAA,EAAWE,EAAAA,CAAG,wCAAA,EAA0C,SAAS,CAAA;AAAA,MACjE,WAAA,EAAU,yBAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAGA,SAAS,oBAAoB,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,MAAK,EAAuC;AACjG,EAAA,uBACEF,GAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,WAAWE,EAAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA,EAClE,QAAA,EACH,CAAA;AAEJ;AAeA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAU,EAAC;AAAA,EACX,aAAA,GAAgB,KAAA;AAAA,EAChB,UAAA,GAAa,CAAA;AAAA,EACb;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAO,GAAI,WAAW,WAAW,CAAA;AAC1D,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,EAAAA,CAAG,gEAAA,EAAkE,SAAS,CAAA;AAAA,MACzF,WAAA,EAAU,sBAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAD,KAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAmC,KAAA,EAAO,OAAO,SAAA,EAC/D,QAAA,EAAA;AAAA,0BAAAD,IAACK,QAAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,eAAY,MAAA,EAAO,CAAA;AAAA,0BAChDL,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,QAAA,CAAS,gBAAe,EAAE;AAAA,SAAA,EAC5D,CAAA;AAAA,QACC,SAAA,KAAc,0BACbC,IAAAA,CAAC,UAAK,SAAA,EAAU,kCAAA,EAAmC,KAAA,EAAO,MAAA,CAAO,KAAA,EAC/D,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,QAAA,EAAS,eAAY,MAAA,EAAO,CAAA;AAAA,0BACtDA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,SAAA,CAAU,gBAAe,EAAE;AAAA,SAAA,EAC7D,CAAA;AAAA,wBAEFC,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kCAAA,EAAmC,KAAA,EAAO,OAAO,OAAA,EAC/D,QAAA,EAAA;AAAA,0BAAAD,IAACM,KAAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,eAAY,MAAA,EAAO,CAAA;AAAA,0BAC7CN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,aAAA,EAAa,MAAA,IAAU,CAAA,EAAG,MAAM,CAAA,aAAA,CAAA,EAC5D,QAAA,EAAA,aAAA,GAAgB,QAAA,GAAM,WAAA,EACzB;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,KAAA,EAAO,WAAA;AAAA,YACP,GAAA,EAAK,UAAA;AAAA,YACL,MAAA,EAAQ,aAAA;AAAA,YACR,aAAA,EAAe,UAAU,aAAA,GAAgB,YAAA;AAAA,YACzC,OAAO,MAAA,CAAO,OAAA;AAAA,YACd,SAAA,EAAU,SAAA;AAAA,YACV,MAAA,EAAQ,MAAA,IAAU,CAAA,EAAG,MAAM,CAAA,eAAA;AAAA;AAAA;AAC7B;AAAA;AAAA,GACF;AAEJ;AAGA,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAU,EAA0B;AAC/D,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,UAAA,CAAW,WAAW,CAAA;AACzC,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,sEAAA;AAAA,MACV,KAAA,EAAO,QAAQ,SAAS,CAAA;AAAA,MACxB,WAAA,EAAU,qBAAA;AAAA,MAET,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,SAAS,CAAC;AAAA;AAAA,GAC/C;AAEJ;AAoCA,SAAS,iBAAA,CAAkB;AAAA,EACzB,SAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,YAAA,GAAe,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO;AACnE,EAAA,uBACEC,IAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA,EAAO,YAAA,CAAa,aAAA,CAAc,SAAA,CAAU,IAAI,CAAA;AAAA,MAChD,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,KAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,0BACDD,GAAAA,CAAC,kBAAA,EAAA,EAAoB,QAAA,EAAA,SAAA,CAAU,IAAA,EAAK,CAAA;AAAA,0BACpCA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,aAAA,EAAe;AAAA,SAAA,EAC/C,CAAA;AAAA,QACC,UAAU,QAAA,oBAAYA,GAAAA,CAAC,qBAAA,EAAA,EAAuB,oBAAU,QAAA,EAAS,CAAA;AAAA,QACjE,UAAU,WAAA,oBACTA,GAAAA,CAAC,wBAAA,EAAA,EAA0B,oBAAU,WAAA,EAAY,CAAA;AAAA,wBAEnDC,KAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,KAAA,KAAU,yBACTD,GAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,UAAU,SAAA,CAAU,QAAA;AAAA,cACpB,WAAW,SAAA,CAAU,SAAA;AAAA,cACrB,aAAa,SAAA,CAAU,WAAA;AAAA,cACvB,SAAS,SAAA,CAAU,OAAA;AAAA,cACnB,eAAe,SAAA,CAAU,aAAA;AAAA,cACzB;AAAA;AAAA,WACF,GAEA,KAAA;AAAA,UAED,UAAU,SAAA,oBAAaA,IAAC,iBAAA,EAAA,EAAkB,SAAA,EAAW,UAAU,SAAA,EAAW;AAAA,SAAA,EAC7E;AAAA;AAAA;AAAA,GACF;AAEJ;AAEO,IAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,CAAO,iBAAA,EAAmB;AAAA,EAC5D,IAAA,EAAM,iBAAA;AAAA,EACN,MAAA,EAAQ,mBAAA;AAAA,EACR,KAAA,EAAO,kBAAA;AAAA,EACP,OAAA,EAAS,oBAAA;AAAA,EACT,QAAA,EAAU,qBAAA;AAAA,EACV,WAAA,EAAa,wBAAA;AAAA,EACb,MAAA,EAAQ,mBAAA;AAAA,EACR,KAAA,EAAO,kBAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAC;ACraM,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,SAAA,EAAW,QAAO,EAAuB;AACjF,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWE,EAAAA,CAAG,8CAAA,EAAgD,SAAS,CAAA;AAAA,MACvE,WAAA,EAAU,gBAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MAEZ;AAAA;AAAA,GACH;AAEJ;AAyBO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,uBACEF,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA,EAAe,MAAA;AAAA,MACf,cACE,MAAA,IAAU,SAAA,mBACRC,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4EAAA,EACb,QAAA,EAAA;AAAA,QAAA,SAAA;AAAA,wBACDD,GAAAA,CAACO,YAAAA,EAAA,EAAa,SAAA,EAAU,iBAAA,EAAkB,eAAY,MAAA,EAAO;AAAA,OAAA,EAC/D,CAAA,GACE,aAAA,IAAiB,CAAC,UAAA,mBACpBP,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,aAAA,EAAc,CAAA,GACtE,MAAA;AAAA,MAEN,SAAA,EAAWE,EAAAA,CAAG,OAAA,EAAS,SAAS,CAAA;AAAA,MAChC,eAAA,EAAgB,qEAAA;AAAA,MAChB,iBAAA,EAAkB,kDAAA;AAAA,MAEjB;AAAA;AAAA,GACH;AAEJ","file":"chunk-EQ433QPZ.js","sourcesContent":["import type { ReactNode } from 'react'\nimport { LogOut, UserPlus } from 'lucide-react'\nimport { Button, cn, Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\n\n/**\n * Page frame of a workspace's home: a bounded column whose ONE scroll region spans the full\n * width (scrollbar on the outer edge), the inset living on the content inside it. A container,\n * so children can use `@2xl:` queries.\n */\nexport function WorkspacePageFrame({ testId, children }: { testId?: string; children: ReactNode }) {\n return (\n <div\n className=\"flex h-full flex-col @container\"\n data-slot=\"workspace-page\"\n data-testid={testId}\n >\n {/* scrollbar-gutter:stable keeps the content from jumping when a scrollbar appears. */}\n <div className=\"scrollbar-subtle min-h-0 flex-1 overflow-y-auto [scrollbar-gutter:stable]\">\n <div className=\"space-y-6 px-4 pb-6 sm:px-6 pt-4\">{children}</div>\n </div>\n </div>\n )\n}\n\n/** Tinted card holding the identity bar and the expandable member list. */\nexport function WorkspaceIdentityPanel({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"workspace-identity-panel\"\n className=\"group rounded-lg border border-border bg-card px-4 py-3 shadow-xs\"\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceProjectSlotProps {\n testId: string\n /** Screen-reader caption (\"Project:\"): the chip says what it is without a word in front. */\n caption: string\n children: ReactNode\n}\n\n/** The project control / chip pinned to the end of the name row. */\nexport function WorkspaceProjectSlot({ testId, caption, children }: WorkspaceProjectSlotProps) {\n return (\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\" data-testid={testId}>\n <span className=\"sr-only\">{caption}</span>\n {children}\n </div>\n </div>\n )\n}\n\n/** Stated absence (\"None\") rather than a blank gap. */\nexport function ItalicNone({ children }: { children: ReactNode }) {\n return <span className=\"text-sm italic text-muted-foreground\">{children}</span>\n}\n\nexport interface WorkspaceAudienceLineProps {\n visibility: {\n testId: string\n caption: string\n /** The owner's visibility switch (developers only). */\n toggle?: ReactNode\n /** The state named in words, so the switch is never a puzzle. */\n stateText: string\n /** What the state means for who can see the workspace; opened by tapping the state words. */\n stateHelp: string\n }\n /** Member avatar stack. */\n members: ReactNode\n /** \"Share\" button (owners). */\n share?: { label: string; onClick: () => void; testId: string }\n}\n\n/** Visibility and members end the description line together: who can see and use the workspace. */\nexport function WorkspaceAudienceLine({ visibility, members, share }: WorkspaceAudienceLineProps) {\n return (\n <span className=\"flex flex-wrap items-center gap-x-4 gap-y-2\" data-slot=\"workspace-audience\">\n <span className=\"flex items-center gap-2\" data-testid={visibility.testId}>\n <span className=\"sr-only\">{visibility.caption}</span>\n {visibility.toggle}\n {/* Tap-to-explain, not hover-only: the words must answer a click on touch screens too. */}\n <Popover>\n <PopoverTrigger className=\"touch-hit cursor-pointer rounded-sm text-sm text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n {visibility.stateText}\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64 text-sm\">\n {visibility.stateHelp}\n </PopoverContent>\n </Popover>\n </span>\n {/* Faces first, then Share: \"these people ... add more\". */}\n <span className=\"flex items-center gap-1\">\n {members}\n {share && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-1.5 px-3 text-sm pointer-coarse:h-11\"\n onClick={share.onClick}\n data-testid={share.testId}\n >\n <UserPlus className=\"size-4\" />\n {share.label}\n </Button>\n )}\n </span>\n </span>\n )\n}\n\n/**\n * Collapsible block under the identity bar. Stays mounted and animates its height (grid-rows\n * 0fr to 1fr), so opening and closing glides instead of snapping.\n */\nexport function ExpandableSection({\n expanded,\n testId,\n children,\n}: {\n expanded: boolean\n testId?: string\n children: ReactNode\n}) {\n return (\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-300 ease-in-out',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n data-slot=\"expandable-section\"\n data-expanded={expanded}\n data-testid={testId}\n >\n <div className=\"overflow-hidden\">\n <div className=\"mt-4 border-t border-border pt-4\">{children}</div>\n </div>\n </div>\n )\n}\n\n/** Centered loading placeholder of a page body. */\nexport function PageLoading({ children }: { children: ReactNode }) {\n return <div className=\"flex h-64 items-center justify-center\">{children}</div>\n}\n\nexport interface LeaveFooterProps {\n testId?: string\n leave: { label: string; disabled?: boolean; onClick: () => void; testId?: string }\n}\n\n/** Leaving ENDS your part in the workspace, so it sits last and alone at the foot of the page. */\nexport function LeaveFooter({ testId, leave }: LeaveFooterProps) {\n return (\n <div className=\"flex justify-end\" data-slot=\"leave-footer\" data-testid={testId}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={leave.onClick}\n disabled={leave.disabled}\n className=\"h-7 px-2 text-sm text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:h-11\"\n data-testid={leave.testId}\n >\n <LogOut className=\"mr-1 size-3.5\" />\n {leave.label}\n </Button>\n </div>\n )\n}\n","/**\n * CommonWorkspaceToggle Component\n *\n * Toggle for workspace common/members-only visibility.\n * Takes isCommon and onToggle as props for form integration.\n */\n\nimport { Globe } from 'lucide-react'\nimport { IconToggle } from '@arbidocs/react/ui'\n\nexport interface CommonWorkspaceToggleProps {\n isCommon: boolean\n onToggle: (isCommon: boolean) => void\n disabled?: boolean\n /** Tooltip to show when disabled */\n disabledTooltip?: string\n 'data-testid'?: string\n}\n\nconst COLORS = {\n text: 'text-muted-foreground',\n bg: 'bg-gray-600',\n}\n\nexport function CommonWorkspaceToggle({\n isCommon,\n onToggle,\n disabled = false,\n disabledTooltip,\n 'data-testid': dataTestId,\n}: CommonWorkspaceToggleProps) {\n return (\n <IconToggle\n icon={Globe}\n isActive={isCommon}\n onToggle={onToggle}\n colors={COLORS}\n disabled={disabled}\n disabledTooltip={disabledTooltip}\n tooltipActive=\"On: everyone on this deployment can see it. Turn off to limit it to members.\"\n tooltipInactive=\"Off: only members of this workspace can see it. Turn on to let everyone on this deployment see it.\"\n data-testid={dataTestId}\n />\n )\n}\n","/**\n * A workspace role ('owner' | 'collaborator' | 'guest') as people see it: its name, its badge\n * colours and what it lets a member do.\n */\n\nexport type WorkspaceRoleName = 'owner' | 'collaborator' | 'guest'\n\n/** \"Owner\", \"Collaborator\", \"Guest\". */\nexport function formatRole(role: string): string {\n return role.charAt(0).toUpperCase() + role.slice(1)\n}\n\nconst ROLE_BADGE_CLASSES: Record<WorkspaceRoleName, string> = {\n owner: 'bg-primary text-white hover:bg-primary border border-primary',\n collaborator: 'bg-secondary text-white hover:bg-secondary border border-secondary',\n guest: 'bg-gray-600 text-white hover:bg-gray-600 border border-gray-600',\n}\n\n/** The badge classes of a role. */\nexport function getRoleBadgeClass(role: WorkspaceRoleName): string {\n return ROLE_BADGE_CLASSES[role]\n}\n\nconst ROLE_DESCRIPTIONS: Record<WorkspaceRoleName, string> = {\n owner:\n 'Owners have full control of the workspace, including adding and removing members, but cannot see private content created by other members.',\n collaborator:\n 'Collaborators can create and edit shared content, but cannot delete shared content created by others and cannot manage workspace settings or membership.',\n guest:\n 'Guests can create private content and view shared content, but cannot create or edit shared content.',\n}\n\n/** What a role lets a member do (a tooltip). */\nexport function getRoleDescription(role: WorkspaceRoleName): string {\n return ROLE_DESCRIPTIONS[role]\n}\n","import { useState, type ReactNode, useId } from 'react'\nimport {\n AlertCircle,\n AlignLeft,\n ArrowUpRight,\n CreditCard,\n FileText,\n Globe,\n Plus,\n} from 'lucide-react'\nimport {\n Button,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n entityNoun,\n getEntityLabel,\n} from '@arbidocs/react/ui'\nimport { KeyValueRow } from '../home/KeyValueRow'\nimport { ModalHeader } from '../settings/ModalScaffold'\n\n/** Inline error strip of a form. */\nexport function FormErrorBanner({\n message,\n testId,\n className,\n id,\n}: {\n message: string\n testId?: string\n className?: string\n /** Lets a field point at this message with `aria-describedby`. */\n id?: string\n}) {\n return (\n <div\n id={id}\n role=\"alert\"\n data-slot=\"form-error\"\n data-testid={testId}\n className={cn(\n 'flex items-center gap-2 rounded-md border border-red-border bg-red-bg p-3 text-sm text-red-text',\n className\n )}\n >\n <AlertCircle className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n {message}\n </div>\n )\n}\n\n/** Right-aligned footer row of a form (Cancel + submit). */\nexport function FormActions({ className, children }: { className?: string; children: ReactNode }) {\n return (\n <div\n data-slot=\"form-actions\"\n className={cn('sticky bottom-0 flex justify-end gap-2 bg-background pt-2', className)}\n >\n {children}\n </div>\n )\n}\n\n/** Footer row of a modal body, separated by a rule. */\nexport function ModalActionRow({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"modal-action-row\"\n className=\"sticky bottom-0 -mx-6 -mb-6 flex flex-col-reverse gap-2 border-t border-border bg-background px-6 pb-6 pt-3 sm:flex-row sm:items-center sm:justify-end\"\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceFormModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n variant?: 'create' | 'welcome' | 'forProject'\n title?: ReactNode\n /** Icon before the title. */\n icon?: ReactNode\n /** Optional intro paragraph above the form (first-run welcome). */\n intro?: ReactNode\n testId?: string\n /** Visually hidden description. */\n description?: string\n children: ReactNode\n}\n\n/** Dialog frame of the create-workspace form: header, optional intro, scrolling body. */\nexport function WorkspaceFormModal({\n open,\n onOpenChange,\n variant = 'create',\n title,\n icon,\n intro,\n testId,\n description = `Create a new ${entityNoun('WORKSPACE')}`,\n children,\n}: WorkspaceFormModalProps) {\n const noun = entityNoun('WORKSPACE')\n const heading =\n title ??\n (variant === 'welcome'\n ? `Welcome — let's create your first ${noun}`\n : `Create New ${getEntityLabel('WORKSPACE')}`)\n const introduction =\n intro ??\n (variant === 'welcome'\n ? `A ${noun} is an encrypted vault for storing information and collaborating with AI. Give it a name to get started — you can always create more later.`\n : undefined)\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"flex max-h-panel w-modal max-w-modal-vw flex-col overflow-hidden p-0\"\n data-testid={testId}\n >\n <ModalHeader>\n <ModalTitleRow icon={icon} title={heading} description={description} />\n </ModalHeader>\n <div className=\"min-h-0 flex-1 overflow-auto px-6 pb-6\">\n {introduction && <p className=\"pb-4 text-sm text-muted-foreground\">{introduction}</p>}\n {children}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction ModalTitleRow({\n icon,\n title,\n description,\n}: {\n icon?: ReactNode\n title: ReactNode\n description: string\n}) {\n return (\n <>\n <DialogTitle>\n <div className=\"flex items-center gap-2\">\n {icon}\n <span>{title}</span>\n </div>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n </>\n )\n}\n\n/** One entry of the project picker: identity on the left, optional quota summary on the right. */\nexport function ProjectOptionRow({ identity, meta }: { identity: ReactNode; meta?: string }) {\n return (\n <div className=\"flex w-full min-w-0 items-center gap-2\">\n {identity}\n {meta && <span className=\"ml-auto truncate text-sm text-muted-foreground\">{meta}</span>}\n </div>\n )\n}\n\nexport interface ProjectPickerOption {\n id: string\n content: ReactNode\n}\n\nexport interface ProjectPickerProps {\n value?: string\n options: ProjectPickerOption[]\n onChange: (id: string) => void\n /**\n * `form` (default): the full-width field of the workspace form. `welcome`: the compact switcher\n * in the welcome dialog's quota header (muted pill, menu aligned to its end).\n */\n variant?: 'form' | 'welcome'\n /** Adds a \"Create new project...\" entry. */\n onCreate?: () => void\n disabled?: boolean\n readOnly?: boolean\n className?: string\n labels?: { placeholder: string; create: string }\n /** Trigger test id (default `workspace-project-select`, or `welcome-modal-project-select`). */\n testId?: string\n}\n\nconst CREATE_VALUE = '__create__'\n\n/** The one project picker: a workspace's owning project (optionally with a create entry), or the\n * welcome dialog's project switcher (`variant=\"welcome\"`). */\nexport function ProjectPicker({\n value,\n options,\n onChange,\n variant = 'form',\n onCreate,\n disabled,\n readOnly,\n className,\n labels = {\n placeholder: `Select ${entityNoun('PROJECT')}`,\n create: `Create new ${entityNoun('PROJECT')}...`,\n },\n testId,\n}: ProjectPickerProps) {\n const welcome = variant === 'welcome'\n return (\n <Select\n value={value ?? options[0]?.id}\n onValueChange={(v) => (v === CREATE_VALUE ? onCreate?.() : onChange(v))}\n disabled={disabled || readOnly}\n >\n <SelectTrigger\n className={cn(\n welcome &&\n 'h-7 w-auto max-w-[9.5rem] shrink-0 gap-1 border-none bg-muted px-2 text-xs font-medium pointer-coarse:h-11',\n className,\n readOnly && 'cursor-not-allowed'\n )}\n data-testid={\n testId ?? (welcome ? 'welcome-modal-project-select' : 'workspace-project-select')\n }\n >\n {welcome ? <SelectValue /> : <SelectValue placeholder={labels.placeholder} />}\n </SelectTrigger>\n <SelectContent align={welcome ? 'end' : undefined}>\n {options.map((o) => (\n <SelectItem key={o.id} value={o.id}>\n {o.content}\n </SelectItem>\n ))}\n {onCreate && (\n <>\n <SelectSeparator />\n <SelectItem value={CREATE_VALUE}>\n <div className=\"flex items-center gap-1.5 text-primary\">\n <Plus className=\"size-3.5\" />\n <span>{labels.create}</span>\n </div>\n </SelectItem>\n </>\n )}\n </SelectContent>\n </Select>\n )\n}\n\n/** Compact CTA on a project row (e.g. Upgrade / Change plan). */\nexport function ProjectActionButton({\n label,\n onClick,\n className,\n testId,\n}: {\n label: string\n onClick: () => void\n className?: string\n testId?: string\n}) {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={onClick}\n className={cn(\n 'h-7 gap-1.5 whitespace-nowrap px-2 py-0 text-sm font-medium pointer-coarse:h-11',\n className\n )}\n data-testid={testId}\n >\n <ArrowUpRight className=\"size-3.5\" />\n {label}\n </Button>\n )\n}\n\nexport interface WorkspaceFieldsViewProps {\n /** `modal` (create flow) or `settings` (editing an existing workspace). */\n variant?: 'modal' | 'settings'\n name: string\n description: string\n onNameChange: (value: string) => void\n onDescriptionChange: (value: string) => void\n onNameBlur?: () => void\n onNameFocus?: () => void\n onDescriptionBlur?: () => void\n disabled?: boolean\n readOnly?: boolean\n maxNameLength?: number\n /** Id of the form's error message (a `FormErrorBanner id`): the name input is then `aria-invalid`\n * and described by it. */\n errorId?: string\n /** Content of the Visibility row (settings only); omit to hide the row. */\n visibility?: ReactNode\n /** Content of the Project row; omit to hide the row. */\n project?: ReactNode\n labels?: Partial<WorkspaceFieldsLabels>\n}\n\nexport interface WorkspaceFieldsLabels {\n readOnlyNotice: string\n name: string\n description: string\n visibility: string\n project: string\n over: (n: number) => string\n charsLeft: (n: number) => string\n}\n\nconst DEFAULT_LABELS: WorkspaceFieldsLabels = {\n readOnlyNotice: 'Read-only workspace',\n name: 'Name *',\n description: 'Description',\n visibility: 'Visibility',\n get project() {\n return getEntityLabel('PROJECT')\n },\n over: (n) => `${n} over`,\n charsLeft: (n) => `${n} chars left`,\n}\n\n/** Name / description / visibility / project rows shared by the create and settings forms. */\nexport function WorkspaceFieldsView({\n variant = 'modal',\n name,\n description,\n onNameChange,\n onDescriptionChange,\n onNameBlur,\n onNameFocus,\n onDescriptionBlur,\n disabled = false,\n readOnly = false,\n errorId,\n maxNameLength = 50,\n visibility,\n project,\n labels,\n}: WorkspaceFieldsViewProps) {\n const workspaceDescriptionId = useId()\n const workspaceNameId = useId()\n const l = { ...DEFAULT_LABELS, ...labels }\n const [nameFocused, setNameFocused] = useState(false)\n const isModal = variant === 'modal'\n const charsLeft = maxNameLength - name.length\n // The modal only surfaces the counter near the limit; settings shows it while focused.\n const counterVisible = !readOnly && nameFocused && (!isModal || charsLeft <= 10)\n const isDisabled = isModal ? disabled : disabled || readOnly\n\n return (\n <div className=\"space-y-1\" data-slot=\"workspace-fields\">\n {readOnly && (\n <div data-testid=\"workspace-form-readonly-notice\" className=\"sr-only\">\n {l.readOnlyNotice}\n </div>\n )}\n <KeyValueRow label={l.name} icon={<FileText size={14} />} htmlFor={workspaceNameId}>\n <div className=\"relative\">\n <Input\n id={workspaceNameId}\n type=\"text\"\n value={name}\n onChange={(e) => onNameChange(e.target.value)}\n onBlur={() => {\n setNameFocused(false)\n onNameBlur?.()\n }}\n onFocus={() => {\n setNameFocused(true)\n onNameFocus?.()\n }}\n maxLength={maxNameLength}\n readOnly={readOnly}\n disabled={isDisabled}\n className={cn(\n isModal ? 'bg-background' : 'capitalize',\n readOnly && 'cursor-not-allowed',\n 'pr-20'\n )}\n required\n aria-invalid={errorId ? true : undefined}\n aria-describedby={errorId}\n data-testid=\"workspace-form-name-input\"\n />\n {counterVisible && (\n <div\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-red-text' : 'text-muted-foreground'\n )}\n >\n {charsLeft < 0 ? l.over(-charsLeft) : l.charsLeft(charsLeft)}\n </div>\n )}\n </div>\n </KeyValueRow>\n\n <KeyValueRow\n label={l.description}\n icon={<AlignLeft size={14} />}\n htmlFor={workspaceDescriptionId}\n >\n <Input\n id={workspaceDescriptionId}\n type=\"text\"\n dictate\n value={description}\n onChange={(e) => onDescriptionChange(e.target.value)}\n onBlur={onDescriptionBlur}\n readOnly={readOnly}\n disabled={isDisabled}\n className={cn(isModal && 'bg-background', readOnly && 'cursor-not-allowed')}\n data-testid=\"workspace-form-description-input\"\n />\n </KeyValueRow>\n\n {visibility && (\n <KeyValueRow label={l.visibility} icon={<Globe size={14} />}>\n {visibility}\n </KeyValueRow>\n )}\n {project && (\n <KeyValueRow label={l.project} icon={<CreditCard size={14} />}>\n {project}\n </KeyValueRow>\n )}\n </div>\n )\n}\n","/**\n * WorkspaceTypeBadge: a workspace's type badge (private, shared or public: icon, colour, label).\n */\n\nimport { User, Users, Globe } from 'lucide-react'\nimport type { components } from '@arbidocs/client'\nimport { WorkspaceTypeBadgeView } from './WorkspaceBadges'\nimport { getHumanUserCount, getVariantBgClass, getWorkspaceTypeInfo } from './workspace-type'\n\ntype Workspace = Pick<components['schemas']['WorkspaceResponse'], 'is_public' | 'users'>\n\nexport interface WorkspaceTypeBadgeProps {\n workspace: Workspace\n showTooltip?: boolean\n size?: 'sm' | 'md'\n isSelected?: boolean\n className?: string\n}\n\nexport function WorkspaceTypeBadge({\n workspace,\n showTooltip = false,\n size = 'md',\n isSelected = false,\n className,\n}: WorkspaceTypeBadgeProps) {\n const userCount = getHumanUserCount(workspace.users)\n const { type, variant } = getWorkspaceTypeInfo(workspace.is_public, userCount)\n const icon = workspace.is_public ? Globe : userCount > 1 ? Users : User\n\n return (\n <WorkspaceTypeBadgeView\n icon={icon}\n bgClass={getVariantBgClass(variant)}\n typeLabel={type}\n showTooltip={showTooltip}\n size={size}\n isSelected={isSelected}\n className={className}\n />\n )\n}\n","import {\n createContext,\n useContext,\n type HTMLAttributes,\n useMemo,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { Check, ChevronRight, FileText, MessagesSquare, Users } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatRelativeTime } from '@arbidocs/react/ui'\nimport { fmtDate } from '../lib/format'\nimport { ActionLink } from '../components/ActionLink'\nimport { MemberAvatarStack, type StackedMember } from '../components/MemberAvatarStack'\n\n/** Everything a workspace tile shows, source-agnostic (not the raw SDK shape). */\nexport interface WorkspaceSummary {\n id: string\n name: string\n description?: string | null\n /** Host-supplied line under the name (a reference, a client, a status...). Not interpreted. */\n subtitle?: ReactNode\n docCount: number\n /** Hidden when undefined, so a host without chats shows no empty counter. */\n chatCount?: number\n /** Number of visible members (agents excluded by the caller). */\n memberCount: number\n members: StackedMember[]\n /** The viewer may not see who is here (RLS): renders an em dash, not a `0`. */\n membersHidden?: boolean\n /** ISO timestamp: rendered as \"Updated {relative}\". */\n updatedAt?: string | null\n}\n\n/** Every fixed string of the workspace tile. Pass a partial `labels` to translate or reword. */\nexport interface WorkspaceCardLabels {\n /** The tile's accessible name. */\n openWorkspace: (name: string) => string\n currentWorkspace: string\n documents: string\n chats: string\n members: string\n /** `relative` is the formatted \"3 days ago\". */\n updated: (relative: string) => string\n}\n\nexport const DEFAULT_WORKSPACE_CARD_LABELS: WorkspaceCardLabels = {\n openWorkspace: (name) => `Open workspace ${name}`,\n currentWorkspace: 'Current workspace',\n documents: 'Documents',\n chats: 'Tasks',\n members: 'Members',\n updated: (relative) => `Updated ${relative}`,\n}\n\ninterface CardContextValue {\n current: boolean\n testId?: string\n labels: WorkspaceCardLabels\n}\n\nconst CardContext = createContext<CardContextValue>({\n current: false,\n labels: DEFAULT_WORKSPACE_CARD_LABELS,\n})\n\ntype DivProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'>\n\n/* ------------------------------------------------------------------ */\n/* Parts */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceCardRootProps extends DivProps {\n /** This is the workspace you are in: accented surface, \"Current workspace\" cue. */\n current?: boolean\n onSelect: () => void\n /**\n * Real link target. The tile then renders as an anchor (ctrl-click / new tab, in-SPA through\n * the host environment's `linkComponent`); `onSelect` still fires on a plain click.\n */\n href?: string\n /** Accessible name; defaults to `labels.openWorkspace(name)` when composed via `WorkspaceCard`. */\n label: string\n testId?: string\n labels?: Partial<WorkspaceCardLabels>\n children: ReactNode\n}\n\n/**\n * The tile surface: one button that opens the workspace. A raised white card\n * (hairline border, soft shadow, hover lift); the current workspace takes the selection tint.\n */\nfunction WorkspaceCardRoot({\n current = false,\n onSelect,\n href,\n label,\n testId,\n labels,\n className,\n children,\n ...rest\n}: WorkspaceCardRootProps) {\n const mergedLabels = useMemo(() => ({ ...DEFAULT_WORKSPACE_CARD_LABELS, ...labels }), [labels])\n const surfaceClass = cn(\n '@container/ws-card flex min-h-40 w-full cursor-pointer flex-col gap-3 rounded-lg p-4 text-left transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n current\n ? 'bg-accent text-accent-foreground'\n : 'border border-border bg-card shadow-xs transition-colors hover:border-ring/50 hover:bg-accent/40',\n className\n )\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onSelect()\n }\n }\n return (\n <CardContext.Provider value={{ current, testId, labels: mergedLabels }}>\n {href ? (\n <ActionLink\n {...(rest as object)}\n href={href}\n onSelect={onSelect}\n aria-label={label}\n aria-current={current ? 'page' : undefined}\n data-slot=\"workspace-card\"\n data-testid={testId}\n data-active={current || undefined}\n className={surfaceClass}\n >\n {children}\n </ActionLink>\n ) : (\n <div\n {...rest}\n role=\"button\"\n tabIndex={0}\n aria-label={label}\n aria-current={current ? 'page' : undefined}\n data-slot=\"workspace-card\"\n data-testid={testId}\n data-active={current || undefined}\n onClick={onSelect}\n onKeyDown={handleKeyDown}\n className={surfaceClass}\n >\n {children}\n </div>\n )}\n </CardContext.Provider>\n )\n}\n\n/** Mark + name + open cue, on one row. Put the entity mark first. */\nfunction WorkspaceCardHeader({ className, children, ...rest }: DivProps & { children: ReactNode }) {\n return (\n <div\n {...rest}\n className={cn('flex flex-wrap items-center gap-x-3 gap-y-2', className)}\n data-slot=\"workspace-card-header\"\n >\n {children}\n </div>\n )\n}\n\nfunction WorkspaceCardTitle({ children, className }: { children: ReactNode; className?: string }) {\n const { testId } = useContext(CardContext)\n return (\n <h3\n className={cn(\n 'line-clamp-2 min-w-24 flex-1 break-words text-base font-semibold leading-tight text-foreground',\n className\n )}\n data-slot=\"workspace-card-title\"\n data-testid={testId && `${testId}-title`}\n >\n {children}\n </h3>\n )\n}\n\n/**\n * The open cue is always on screen (never hover-only): a chevron, or the words\n * \"Current workspace\" on the one you are in.\n */\nfunction WorkspaceCardOpenCue({\n testId,\n currentLabel,\n}: {\n /** Deliberately separate from the card id: suites count cards by prefix. */\n testId?: string\n /** Overrides `labels.currentWorkspace`. */\n currentLabel?: string\n}) {\n const { current, labels } = useContext(CardContext)\n return (\n <span\n className=\"inline-flex max-w-full min-w-0 shrink-0 items-center text-sm text-muted-foreground\"\n data-slot=\"workspace-card-open-cue\"\n data-testid={testId}\n >\n {current ? (\n // Never wider than the card: the words truncate, and in a card narrower than 20rem\n // the pill shrinks to a check (the words stay as the accessible name).\n <span className=\"inline-flex max-w-full min-w-0 items-center gap-1 rounded-full bg-background px-2 py-0.5 text-xs font-medium text-foreground\">\n <Check className=\"hidden size-3 shrink-0 @max-xs/ws-card:block\" aria-hidden=\"true\" />\n <span className=\"min-w-0 truncate @max-xs/ws-card:sr-only\">\n {currentLabel ?? labels.currentWorkspace}\n </span>\n </span>\n ) : (\n <ChevronRight className=\"size-4\" aria-hidden=\"true\" />\n )}\n </span>\n )\n}\n\nfunction WorkspaceCardDescription({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <p\n className={cn('line-clamp-2 text-sm text-muted-foreground', className)}\n title={typeof children === 'string' ? children : undefined}\n data-slot=\"workspace-card-description\"\n >\n {children}\n </p>\n )\n}\n\n/** Host-supplied line under the title. */\nfunction WorkspaceCardSubtitle({\n className,\n children,\n ...rest\n}: DivProps & { children: ReactNode }) {\n return (\n <div\n {...rest}\n className={cn('truncate text-xs text-muted-foreground', className)}\n data-slot=\"workspace-card-subtitle\"\n >\n {children}\n </div>\n )\n}\n\n/** Footer block: stats row and meta line, pinned to the bottom of the tile. */\nfunction WorkspaceCardFooter({ className, children, ...rest }: DivProps & { children: ReactNode }) {\n return (\n <div {...rest} className={cn('mt-auto flex flex-col gap-2', className)}>\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceCardStatsProps {\n docCount: number\n /** Omit to hide the chats counter. */\n chatCount?: number\n memberCount: number\n members?: StackedMember[]\n membersHidden?: boolean\n /** Faces before the rest collapse into `+N`. */\n maxAvatars?: number\n className?: string\n}\n\n/** Documents / chats / members counts, with the member faces at the trailing edge. */\nfunction WorkspaceCardStats({\n docCount,\n chatCount,\n memberCount,\n members = [],\n membersHidden = false,\n maxAvatars = 3,\n className,\n}: WorkspaceCardStatsProps) {\n const { current, testId, labels } = useContext(CardContext)\n return (\n <div\n className={cn('flex w-full items-center gap-x-4 text-sm text-muted-foreground', className)}\n data-slot=\"workspace-card-stats\"\n >\n <span className=\"inline-flex items-center gap-1.5\" title={labels.documents}>\n <FileText className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\">{docCount.toLocaleString()}</span>\n </span>\n {chatCount !== undefined && (\n <span className=\"inline-flex items-center gap-1.5\" title={labels.chats}>\n <MessagesSquare className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\">{chatCount.toLocaleString()}</span>\n </span>\n )}\n <span className=\"inline-flex items-center gap-1.5\" title={labels.members}>\n <Users className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\" data-testid={testId && `${testId}-member-count`}>\n {membersHidden ? '—' : memberCount}\n </span>\n </span>\n <MemberAvatarStack\n members={members}\n total={memberCount}\n max={maxAvatars}\n hidden={membersHidden}\n ringClassName={current ? 'ring-accent' : 'ring-muted'}\n label={labels.members}\n className=\"ml-auto\"\n testId={testId && `${testId}-member-avatars`}\n />\n </div>\n )\n}\n\n/** \"Updated 3 days ago\", with the exact date on the title. */\nfunction WorkspaceCardMeta({ updatedAt }: { updatedAt: string }) {\n const { labels } = useContext(CardContext)\n return (\n <span\n className=\"min-w-0 max-w-full self-start truncate text-xs text-muted-foreground\"\n title={fmtDate(updatedAt)}\n data-slot=\"workspace-card-meta\"\n >\n {labels.updated(formatRelativeTime(updatedAt))}\n </span>\n )\n}\n\n/* ------------------------------------------------------------------ */\n/* Default composition */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceCardProps {\n workspace: WorkspaceSummary\n current?: boolean\n onSelect: () => void\n /** Real link target; see `WorkspaceCard.Root`. */\n href?: string\n /** The entity mark shown before the name (the host's own workspace glyph). */\n mark?: ReactNode\n /** Card id; derived ids: `-title`, `-member-count`, `-member-avatars`. */\n testId?: string\n /** Id for the open cue (kept apart from `testId`, see `WorkspaceCard.OpenCue`). */\n openCueTestId?: string\n maxAvatars?: number\n /**\n * The stats row: omit for the default counts + member faces, `false` to hide it, or any node to\n * replace it.\n */\n stats?: ReactNode | false\n /** Reword the tile's fixed strings. */\n labels?: Partial<WorkspaceCardLabels>\n className?: string\n}\n\n/**\n * The workspace tile: mark + name + open cue, description, stats and meta.\n * The whole tile opens the workspace; nothing on it is hover-only.\n *\n * Need a different layout? Compose the parts: `WorkspaceCard.Root`, `.Header`,\n * `.Title`, `.OpenCue`, `.Subtitle`, `.Description`, `.Footer`, `.Stats`, `.Meta`.\n */\nfunction WorkspaceCardBase({\n workspace,\n current = false,\n onSelect,\n href,\n mark,\n testId,\n openCueTestId,\n maxAvatars,\n stats,\n labels,\n className,\n}: WorkspaceCardProps) {\n const mergedLabels = { ...DEFAULT_WORKSPACE_CARD_LABELS, ...labels }\n return (\n <WorkspaceCardRoot\n current={current}\n onSelect={onSelect}\n href={href}\n label={mergedLabels.openWorkspace(workspace.name)}\n labels={labels}\n testId={testId}\n className={className}\n >\n <WorkspaceCardHeader>\n {mark}\n <WorkspaceCardTitle>{workspace.name}</WorkspaceCardTitle>\n <WorkspaceCardOpenCue testId={openCueTestId} />\n </WorkspaceCardHeader>\n {workspace.subtitle && <WorkspaceCardSubtitle>{workspace.subtitle}</WorkspaceCardSubtitle>}\n {workspace.description && (\n <WorkspaceCardDescription>{workspace.description}</WorkspaceCardDescription>\n )}\n <WorkspaceCardFooter>\n {stats === undefined ? (\n <WorkspaceCardStats\n docCount={workspace.docCount}\n chatCount={workspace.chatCount}\n memberCount={workspace.memberCount}\n members={workspace.members}\n membersHidden={workspace.membersHidden}\n maxAvatars={maxAvatars}\n />\n ) : (\n stats\n )}\n {workspace.updatedAt && <WorkspaceCardMeta updatedAt={workspace.updatedAt} />}\n </WorkspaceCardFooter>\n </WorkspaceCardRoot>\n )\n}\n\nexport const WorkspaceCard = Object.assign(WorkspaceCardBase, {\n Root: WorkspaceCardRoot,\n Header: WorkspaceCardHeader,\n Title: WorkspaceCardTitle,\n OpenCue: WorkspaceCardOpenCue,\n Subtitle: WorkspaceCardSubtitle,\n Description: WorkspaceCardDescription,\n Footer: WorkspaceCardFooter,\n Stats: WorkspaceCardStats,\n Meta: WorkspaceCardMeta,\n})\n","import type { ReactNode } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { CollapsibleSection } from '../home/CollapsibleSection'\n\nexport interface WorkspaceListProps {\n children: ReactNode\n className?: string\n testId?: string\n}\n\n/** The column that stacks workspace groups (padding follows the page gutter). */\nexport function WorkspaceList({ children, className, testId }: WorkspaceListProps) {\n return (\n <div\n className={cn('flex w-full flex-col gap-2 px-4 py-4 sm:px-8', className)}\n data-slot=\"workspace-list\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceGroupProps {\n /** Group heading: name, count, badges. Plain text on the canvas, no band. */\n title: ReactNode\n isExpanded: boolean\n onToggle: () => void\n /**\n * Makes the whole header one target (e.g. open the project panel); the\n * chevron stays a separate toggle. Adds a trailing `openLabel` affordance.\n */\n onOpen?: () => void\n /** Words beside the trailing chevron when `onOpen` is set, e.g. \"Plans & Usage\". */\n openLabel?: string\n /** Muted words on the right of a collapsed group without `onOpen`, e.g. \"Show 11 shared workspaces\". */\n collapsedHint?: string\n /** The cards, laid out in a responsive grid (1 / 2 / 3 columns). */\n children: ReactNode\n className?: string\n}\n\n/**\n * One collapsible band of workspace tiles under a slim header. The open\n * affordance is always visible, so nothing is reachable by hover alone.\n */\nexport function WorkspaceGroup({\n title,\n isExpanded,\n onToggle,\n onOpen,\n openLabel,\n collapsedHint,\n children,\n className,\n}: WorkspaceGroupProps) {\n return (\n <CollapsibleSection\n title={title}\n isExpanded={isExpanded}\n onToggle={onToggle}\n onHeaderClick={onOpen}\n rightContent={\n onOpen && openLabel ? (\n <span className=\"flex shrink-0 items-center gap-1 text-sm font-medium text-muted-foreground\">\n {openLabel}\n <ChevronRight className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n </span>\n ) : collapsedHint && !isExpanded ? (\n <span className=\"shrink-0 text-sm text-muted-foreground\">{collapsedHint}</span>\n ) : undefined\n }\n className={cn('group', className)}\n headerClassName=\"mb-3 flex-wrap gap-y-2 rounded-md px-1 py-1 pointer-coarse:min-h-11\"\n childrenClassName=\"mb-8 grid gap-3 @xl:grid-cols-2 @5xl:grid-cols-3\"\n >\n {children}\n </CollapsibleSection>\n )\n}\n"]}
|
|
@@ -205,143 +205,9 @@ function KeyValueRow({
|
|
|
205
205
|
}
|
|
206
206
|
);
|
|
207
207
|
}
|
|
208
|
-
var DEFAULT_COLLAPSIBLE_SECTION_LABELS = {
|
|
209
|
-
collapseSection: "Collapse section",
|
|
210
|
-
expandSection: "Expand section"
|
|
211
|
-
};
|
|
212
|
-
function CollapsibleSection({
|
|
213
|
-
title,
|
|
214
|
-
icon,
|
|
215
|
-
isExpanded,
|
|
216
|
-
onToggle,
|
|
217
|
-
children,
|
|
218
|
-
count,
|
|
219
|
-
hasActiveFilters = false,
|
|
220
|
-
expandWhenEmpty = false,
|
|
221
|
-
childrenClassName,
|
|
222
|
-
headerClassName,
|
|
223
|
-
className,
|
|
224
|
-
rightContent,
|
|
225
|
-
collapsible = true,
|
|
226
|
-
onHeaderClick,
|
|
227
|
-
labels
|
|
228
|
-
}) {
|
|
229
|
-
const l = { ...DEFAULT_COLLAPSIBLE_SECTION_LABELS, ...labels };
|
|
230
|
-
const hasCount = count !== void 0;
|
|
231
|
-
const shouldBeExpanded = !collapsible ? true : hasCount ? count > 0 ? isExpanded : expandWhenEmpty && isExpanded : isExpanded;
|
|
232
|
-
const hasContent = hasCount ? count > 0 || expandWhenEmpty : true;
|
|
233
|
-
const chevron = /* @__PURE__ */ jsxRuntime.jsx(
|
|
234
|
-
lucideReact.ChevronRight,
|
|
235
|
-
{
|
|
236
|
-
className: ui.cn("size-4 shrink-0 transition-transform", shouldBeExpanded && "rotate-90")
|
|
237
|
-
}
|
|
238
|
-
);
|
|
239
|
-
const titleBlock = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
|
|
240
|
-
icon,
|
|
241
|
-
typeof title === "string" ? title && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: title }) : title,
|
|
242
|
-
hasCount && /* @__PURE__ */ jsxRuntime.jsx(
|
|
243
|
-
"span",
|
|
244
|
-
{
|
|
245
|
-
className: ui.cn(
|
|
246
|
-
"ml-1 text-xs tabular-nums",
|
|
247
|
-
hasActiveFilters ? "rounded-full bg-primary px-1.5 font-medium text-primary-foreground" : "font-normal text-muted-foreground"
|
|
248
|
-
),
|
|
249
|
-
children: count
|
|
250
|
-
}
|
|
251
|
-
)
|
|
252
|
-
] });
|
|
253
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cn("w-full", className), "data-slot": "collapsible-section", children: [
|
|
254
|
-
onHeaderClick ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
255
|
-
"div",
|
|
256
|
-
{
|
|
257
|
-
role: "button",
|
|
258
|
-
tabIndex: 0,
|
|
259
|
-
onClick: onHeaderClick,
|
|
260
|
-
onKeyDown: (e) => {
|
|
261
|
-
if (e.key === "Enter" || e.key === " ") {
|
|
262
|
-
e.preventDefault();
|
|
263
|
-
onHeaderClick();
|
|
264
|
-
}
|
|
265
|
-
},
|
|
266
|
-
className: ui.cn(
|
|
267
|
-
"mb-4 flex cursor-pointer items-center justify-between gap-2 font-semibold pointer-coarse:min-h-11 transition-colors hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
268
|
-
headerClassName
|
|
269
|
-
),
|
|
270
|
-
"data-slot": "collapsible-section-header",
|
|
271
|
-
children: [
|
|
272
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-2 text-left", children: [
|
|
273
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
274
|
-
"button",
|
|
275
|
-
{
|
|
276
|
-
type: "button",
|
|
277
|
-
"aria-expanded": shouldBeExpanded,
|
|
278
|
-
"aria-label": shouldBeExpanded ? l.collapseSection : l.expandSection,
|
|
279
|
-
disabled: !hasContent,
|
|
280
|
-
onClick: (e) => {
|
|
281
|
-
e.stopPropagation();
|
|
282
|
-
if (hasContent) onToggle();
|
|
283
|
-
},
|
|
284
|
-
className: "-ml-0.5 shrink-0 rounded-md p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40 pointer-coarse:p-3.5",
|
|
285
|
-
children: chevron
|
|
286
|
-
}
|
|
287
|
-
),
|
|
288
|
-
titleBlock
|
|
289
|
-
] }),
|
|
290
|
-
rightContent && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center", children: rightContent })
|
|
291
|
-
]
|
|
292
|
-
}
|
|
293
|
-
) : !collapsible ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
294
|
-
"div",
|
|
295
|
-
{
|
|
296
|
-
className: ui.cn("mb-4 flex items-center justify-between", headerClassName),
|
|
297
|
-
"data-slot": "collapsible-section-header",
|
|
298
|
-
children: [
|
|
299
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 items-center gap-2 text-left font-medium", children: titleBlock }),
|
|
300
|
-
rightContent && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center", children: rightContent })
|
|
301
|
-
]
|
|
302
|
-
}
|
|
303
|
-
) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
304
|
-
"div",
|
|
305
|
-
{
|
|
306
|
-
className: ui.cn("mb-4 flex items-center justify-between", headerClassName),
|
|
307
|
-
"data-slot": "collapsible-section-header",
|
|
308
|
-
children: [
|
|
309
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
310
|
-
"div",
|
|
311
|
-
{
|
|
312
|
-
role: "button",
|
|
313
|
-
tabIndex: hasContent ? 0 : -1,
|
|
314
|
-
"aria-expanded": shouldBeExpanded,
|
|
315
|
-
"aria-disabled": !hasContent,
|
|
316
|
-
onClick: hasContent ? onToggle : void 0,
|
|
317
|
-
onKeyDown: hasContent ? (e) => {
|
|
318
|
-
if (e.key === "Enter" || e.key === " ") {
|
|
319
|
-
e.preventDefault();
|
|
320
|
-
onToggle();
|
|
321
|
-
}
|
|
322
|
-
} : void 0,
|
|
323
|
-
className: ui.cn(
|
|
324
|
-
"touch-hit flex min-w-0 items-center gap-2 rounded-md text-left font-semibold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
325
|
-
hasContent ? "cursor-pointer hover:text-muted-foreground" : "cursor-default opacity-60"
|
|
326
|
-
),
|
|
327
|
-
children: [
|
|
328
|
-
chevron,
|
|
329
|
-
titleBlock
|
|
330
|
-
]
|
|
331
|
-
}
|
|
332
|
-
),
|
|
333
|
-
rightContent && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center", children: rightContent })
|
|
334
|
-
]
|
|
335
|
-
}
|
|
336
|
-
),
|
|
337
|
-
shouldBeExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: childrenClassName ?? "mb-8 flex flex-wrap justify-start gap-6", children })
|
|
338
|
-
] });
|
|
339
|
-
}
|
|
340
208
|
|
|
341
|
-
exports.CollapsibleSection = CollapsibleSection;
|
|
342
|
-
exports.DEFAULT_COLLAPSIBLE_SECTION_LABELS = DEFAULT_COLLAPSIBLE_SECTION_LABELS;
|
|
343
209
|
exports.DEFAULT_KEY_VALUE_ROW_LABELS = DEFAULT_KEY_VALUE_ROW_LABELS;
|
|
344
210
|
exports.KeyValueContainer = KeyValueContainer;
|
|
345
211
|
exports.KeyValueRow = KeyValueRow;
|
|
346
|
-
//# sourceMappingURL=chunk-
|
|
347
|
-
//# sourceMappingURL=chunk-
|
|
212
|
+
//# sourceMappingURL=chunk-H32DV7XS.cjs.map
|
|
213
|
+
//# sourceMappingURL=chunk-H32DV7XS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/home/KeyValueRow.tsx"],"names":["cn","Tooltip","jsx","TooltipTrigger","TooltipContent","jsxs","ArrowDownFromLine","ArrowUpFromLine","useSortable","GripVertical","CSS"],"mappings":"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","file":"chunk-H32DV7XS.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ArrowDownFromLine, ArrowUpFromLine, GripVertical } from 'lucide-react'\nimport { Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\n\n/** Fixed strings of the row controls. */\nexport interface KeyValueRowLabels {\n hideField: string\n showField: string\n dragToReorder: string\n}\n\nexport const DEFAULT_KEY_VALUE_ROW_LABELS: KeyValueRowLabels = {\n hideField: 'Hide this field',\n showField: 'Show this field',\n dragToReorder: 'Drag to reorder',\n}\n\nexport interface KeyValueRowProps {\n /** Label text; also the accessible name when `labelSlot` replaces it visually. */\n label: string\n /** Glyph before the label. */\n icon?: ReactNode\n /** Id of the control in the value: renders the label as a real `<label for>`. */\n htmlFor?: string\n /** Replaces the icon + label (e.g. a tag pill that is itself the label). */\n labelSlot?: ReactNode\n /** The value, on the right (or below the label when the container is narrow). */\n children: ReactNode\n className?: string\n 'data-testid'?: string\n /** Enables drag reordering; requires a parent `DndContext` + `SortableContext`. */\n sortableId?: string\n /** Shows a \"hide this field\" control on the label line. */\n onHide?: () => void\n /** Shows a \"show this field\" control (for hidden rows, rendered dimmed). */\n onShow?: () => void\n labels?: Partial<KeyValueRowLabels>\n}\n\n/**\n * Wrap rows in this to switch on container-query responsiveness: a row stacks\n * its label above its value in a narrow container and goes side by side when\n * wider, by the container's width and not the viewport's.\n */\nexport function KeyValueContainer({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return <div className={cn('@container', className)}>{children}</div>\n}\n\n/** Small square control, sized to sit on the label line (44px on touch). */\nfunction RowControlButton({\n onClick,\n label,\n icon,\n}: {\n onClick: () => void\n label: string\n icon: ReactNode\n}) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n className=\"flex size-5 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11\"\n >\n {icon}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>{label}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n\ninterface RowBodyProps {\n grip: ReactNode\n icon?: ReactNode\n htmlFor?: string\n labelSlot?: ReactNode\n label: string\n children: ReactNode\n onHide?: () => void\n onShow?: () => void\n labels: KeyValueRowLabels\n}\n\n/**\n * The shared row body: a label line (grip + hide/show + icon/label) beside the\n * value. Controls sit on the label's line so they align with the label even\n * when the value is a tall multi-line field.\n */\nfunction RowBody({\n grip,\n icon,\n htmlFor,\n labelSlot,\n label,\n children,\n onHide,\n onShow,\n labels,\n}: RowBodyProps) {\n const LabelText = htmlFor ? 'label' : 'span'\n return (\n <div className=\"flex min-w-0 flex-1 flex-col gap-1 py-1.5 @[400px]:flex-row @[400px]:items-start @[400px]:gap-4\">\n <div\n className=\"flex w-full shrink-0 items-center gap-1 @[400px]:w-44 @[400px]:pt-2\"\n data-slot=\"key-value-label\"\n >\n {grip}\n {onHide && (\n <RowControlButton\n onClick={onHide}\n label={labels.hideField}\n icon={<ArrowDownFromLine className=\"size-3.5\" />}\n />\n )}\n {onShow && (\n <RowControlButton\n onClick={onShow}\n label={labels.showField}\n icon={<ArrowUpFromLine className=\"size-3.5 text-primary\" />}\n />\n )}\n {labelSlot ?? (\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n {icon && (\n <span className=\"inline-flex shrink-0 items-center justify-center text-muted-foreground/60\">\n {icon}\n </span>\n )}\n <LabelText\n {...(htmlFor ? { htmlFor } : null)}\n className=\"truncate text-sm font-medium text-muted-foreground\"\n >\n {label}\n </LabelText>\n </span>\n )}\n </div>\n <div className=\"min-w-0 flex-1\" data-slot=\"key-value-value\">\n {children}\n </div>\n </div>\n )\n}\n\nconst ROW_CLASS =\n 'group flex items-start rounded-md pl-1 pr-1.5 transition-colors hover:bg-muted/50'\n\ntype SortableRowProps = Omit<KeyValueRowProps, 'data-testid' | 'labels'> & {\n labels: KeyValueRowLabels\n sortableId: string\n testId?: string\n}\n\nfunction SortableKeyValueRow({\n sortableId,\n label,\n icon,\n htmlFor,\n labelSlot,\n children,\n className,\n testId,\n onHide,\n onShow,\n labels,\n}: SortableRowProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: sortableId,\n })\n\n const grip = (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={labels.dragToReorder}\n className=\"flex size-5 shrink-0 cursor-grab touch-none items-center justify-center rounded-md text-muted-foreground/60 transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring active:cursor-grabbing pointer-coarse:size-11\"\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>{labels.dragToReorder}</p>\n </TooltipContent>\n </Tooltip>\n )\n\n return (\n <div\n ref={setNodeRef}\n style={{\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0 : 1,\n }}\n className={cn(ROW_CLASS, className)}\n data-slot=\"key-value-row\"\n data-testid={testId}\n >\n <RowBody\n grip={grip}\n icon={icon}\n htmlFor={htmlFor}\n labelSlot={labelSlot}\n label={label}\n onHide={onHide}\n onShow={onShow}\n labels={labels}\n >\n {children}\n </RowBody>\n </div>\n )\n}\n\n/**\n * A label/value row for forms, settings and detail views. Optionally sortable\n * (drag handle) and hideable (hide/show controls), all visible without hover.\n */\nexport function KeyValueRow({\n label,\n icon,\n htmlFor,\n labelSlot,\n children,\n className,\n 'data-testid': testId,\n sortableId,\n onHide,\n onShow,\n labels,\n}: KeyValueRowProps) {\n const mergedLabels = { ...DEFAULT_KEY_VALUE_ROW_LABELS, ...labels }\n if (sortableId) {\n return (\n <SortableKeyValueRow\n sortableId={sortableId}\n label={label}\n icon={icon}\n htmlFor={htmlFor}\n labelSlot={labelSlot}\n className={className}\n testId={testId}\n onHide={onHide}\n onShow={onShow}\n labels={mergedLabels}\n >\n {children}\n </SortableKeyValueRow>\n )\n }\n\n return (\n <div\n className={cn(ROW_CLASS, onShow && 'opacity-60', className)}\n data-slot=\"key-value-row\"\n data-testid={testId}\n >\n <RowBody\n grip={null}\n icon={icon}\n htmlFor={htmlFor}\n labelSlot={labelSlot}\n label={label}\n onShow={onShow}\n labels={mergedLabels}\n >\n {children}\n </RowBody>\n </div>\n )\n}\n"]}
|