@ai-matrx/associations 0.13.22 → 0.13.25
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/CHANGELOG.md +27 -0
- package/dist/{CommentThread-DIGM3P6_.d.cts → CommentThread-CRR3jLBl.d.cts} +19 -4
- package/dist/{CommentThread-DIGM3P6_.d.ts → CommentThread-CRR3jLBl.d.ts} +19 -4
- package/dist/core/index.d.cts +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/{ports-D2Im-Tjl.d.cts → ports-vvtD75Sp.d.cts} +1 -1
- package/dist/{ports-D2Im-Tjl.d.ts → ports-vvtD75Sp.d.ts} +1 -1
- package/dist/react/index.cjs +217 -84
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +217 -84
- package/dist/react/index.js.map +1 -1
- package/dist/react/lazy/index.d.cts +1 -1
- package/dist/react/lazy/index.d.ts +1 -1
- package/package.json +3 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ElementType, ComponentType, ReactNode } from 'react';
|
|
2
2
|
|
|
3
|
-
declare const ASSOCIATION_TARGET_TYPES: readonly ["organization", "scope", "scope_type", "project", "task", "context_item", "thread", "war_room", "category", "conversation", "fc_set", "fc_card", "study_media", "assessment", "note", "file", "quiz_session", "agent", "agent_term_list", "research_tag", "skill", "surface", "plan_entity", "plan_node", "web_site", "seo_topic", "seo_keyword", "web_page", "web_screenshot", "party", "crm_outreach_list", "crm_deal", "rulebook", "research_topic", "media_source_library"];
|
|
3
|
+
declare const ASSOCIATION_TARGET_TYPES: readonly ["organization", "scope", "scope_type", "project", "task", "context_item", "thread", "war_room", "category", "conversation", "fc_set", "fc_card", "study_media", "assessment", "note", "file", "processed_document", "quiz_session", "agent", "agent_term_list", "research_tag", "skill", "surface", "plan_entity", "plan_node", "web_site", "seo_topic", "seo_keyword", "web_page", "web_screenshot", "party", "crm_outreach_list", "crm_deal", "rulebook", "research_topic", "media_source_library"];
|
|
4
4
|
type AssociationTargetType = (typeof ASSOCIATION_TARGET_TYPES)[number];
|
|
5
5
|
/** Runtime guard: is this token one of the deliberate container (target) types? */
|
|
6
6
|
declare function isAssociationTargetType(value: unknown): value is AssociationTargetType;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ElementType, ComponentType, ReactNode } from 'react';
|
|
2
2
|
|
|
3
|
-
declare const ASSOCIATION_TARGET_TYPES: readonly ["organization", "scope", "scope_type", "project", "task", "context_item", "thread", "war_room", "category", "conversation", "fc_set", "fc_card", "study_media", "assessment", "note", "file", "quiz_session", "agent", "agent_term_list", "research_tag", "skill", "surface", "plan_entity", "plan_node", "web_site", "seo_topic", "seo_keyword", "web_page", "web_screenshot", "party", "crm_outreach_list", "crm_deal", "rulebook", "research_topic", "media_source_library"];
|
|
3
|
+
declare const ASSOCIATION_TARGET_TYPES: readonly ["organization", "scope", "scope_type", "project", "task", "context_item", "thread", "war_room", "category", "conversation", "fc_set", "fc_card", "study_media", "assessment", "note", "file", "processed_document", "quiz_session", "agent", "agent_term_list", "research_tag", "skill", "surface", "plan_entity", "plan_node", "web_site", "seo_topic", "seo_keyword", "web_page", "web_screenshot", "party", "crm_outreach_list", "crm_deal", "rulebook", "research_topic", "media_source_library"];
|
|
4
4
|
type AssociationTargetType = (typeof ASSOCIATION_TARGET_TYPES)[number];
|
|
5
5
|
/** Runtime guard: is this token one of the deliberate container (target) types? */
|
|
6
6
|
declare function isAssociationTargetType(value: unknown): value is AssociationTargetType;
|
package/dist/react/index.cjs
CHANGED
|
@@ -1755,6 +1755,8 @@ var ASSOCIATION_TARGET_TYPES = [
|
|
|
1755
1755
|
// a note — the origin a converted study artifact links back to (artifact→note 'source' lineage, P4)
|
|
1756
1756
|
"file",
|
|
1757
1757
|
// a file (card→file media + source lineage)
|
|
1758
|
+
"processed_document",
|
|
1759
|
+
// a processed source document (study-aid source lineage and kit membership)
|
|
1758
1760
|
"quiz_session",
|
|
1759
1761
|
// a quiz a card is used in
|
|
1760
1762
|
"agent",
|
|
@@ -3867,11 +3869,61 @@ function AttachedItemsBody({
|
|
|
3867
3869
|
// src/react/components/AssociationCard.tsx
|
|
3868
3870
|
var import_react16 = require("react");
|
|
3869
3871
|
var import_design_system7 = require("@ai-matrx/design-system");
|
|
3870
|
-
var
|
|
3872
|
+
var import_buttons = require("@ai-matrx/tap-target/buttons");
|
|
3873
|
+
|
|
3874
|
+
// src/react/contentRoles.ts
|
|
3875
|
+
var CONTENT_ROLES = [
|
|
3876
|
+
{
|
|
3877
|
+
id: "utility",
|
|
3878
|
+
title: "Utilities",
|
|
3879
|
+
tagline: "The agents and tools that act on your knowledge.",
|
|
3880
|
+
accentText: "text-violet-600 dark:text-violet-400",
|
|
3881
|
+
accentBg: "bg-violet-500/10",
|
|
3882
|
+
accentBar: "bg-violet-500"
|
|
3883
|
+
},
|
|
3884
|
+
{
|
|
3885
|
+
id: "source",
|
|
3886
|
+
title: "Sources",
|
|
3887
|
+
tagline: "Incoming sources of truth (Knowledge In).",
|
|
3888
|
+
accentText: "text-sky-600 dark:text-sky-400",
|
|
3889
|
+
accentBg: "bg-sky-500/10",
|
|
3890
|
+
accentBar: "bg-sky-500"
|
|
3891
|
+
},
|
|
3892
|
+
{
|
|
3893
|
+
id: "destination",
|
|
3894
|
+
title: "Outputs",
|
|
3895
|
+
tagline: "Knowledge your team produces.",
|
|
3896
|
+
accentText: "text-emerald-600 dark:text-emerald-400",
|
|
3897
|
+
accentBg: "bg-emerald-500/10",
|
|
3898
|
+
accentBar: "bg-emerald-500"
|
|
3899
|
+
},
|
|
3900
|
+
{
|
|
3901
|
+
id: "hybrid",
|
|
3902
|
+
title: "Sources & Outputs",
|
|
3903
|
+
tagline: "Read from and written to.",
|
|
3904
|
+
accentText: "text-teal-600 dark:text-teal-400",
|
|
3905
|
+
accentBg: "bg-teal-500/10",
|
|
3906
|
+
accentBar: "bg-gradient-to-r from-sky-500 to-emerald-500"
|
|
3907
|
+
},
|
|
3908
|
+
{
|
|
3909
|
+
id: "container",
|
|
3910
|
+
title: "Workspaces",
|
|
3911
|
+
tagline: "How work is organized.",
|
|
3912
|
+
accentText: "text-amber-600 dark:text-amber-400",
|
|
3913
|
+
accentBg: "bg-amber-500/10",
|
|
3914
|
+
accentBar: "bg-amber-500"
|
|
3915
|
+
}
|
|
3916
|
+
];
|
|
3917
|
+
function getContentRoleMeta(role) {
|
|
3918
|
+
return CONTENT_ROLES.find((r) => r.id === role) ?? CONTENT_ROLES[2];
|
|
3919
|
+
}
|
|
3920
|
+
|
|
3921
|
+
// src/react/components/AssociationCard.tsx
|
|
3871
3922
|
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
3872
3923
|
function AssociationCard({
|
|
3873
3924
|
token,
|
|
3874
3925
|
container: containerProp,
|
|
3926
|
+
look = "tiles",
|
|
3875
3927
|
className
|
|
3876
3928
|
}) {
|
|
3877
3929
|
const store = useAssociationsStore();
|
|
@@ -3879,6 +3931,7 @@ function AssociationCard({
|
|
|
3879
3931
|
const container = containerProp ?? fromCtx;
|
|
3880
3932
|
const [open, setOpen] = (0, import_react16.useState)(false);
|
|
3881
3933
|
const info = store.registry.getEntityInfo(token);
|
|
3934
|
+
const role = getContentRoleMeta(info.contentRole);
|
|
3882
3935
|
const Icon = info.Icon ?? DefaultEntityIcon;
|
|
3883
3936
|
const [listOpen, setListOpen] = (0, import_react16.useState)(false);
|
|
3884
3937
|
const {
|
|
@@ -3904,43 +3957,132 @@ function AssociationCard({
|
|
|
3904
3957
|
const canAttach = info.canListCandidates && (!filing || isAssociationTargetType(token));
|
|
3905
3958
|
const canDrillIn = count > 0;
|
|
3906
3959
|
const countWord = filing ? "filed under" : "attached";
|
|
3960
|
+
const drillTitle = canDrillIn ? `View the ${info.labelPlural.toLowerCase()} attached to ${container.label ?? "this"}` : void 0;
|
|
3907
3961
|
return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
|
|
3908
|
-
|
|
3962
|
+
look !== "tiles" ? (
|
|
3963
|
+
// ONE-LINE LOOKS (opt-in, off by default): small icon, UPPERCASE name,
|
|
3964
|
+
// count, then the "+".
|
|
3965
|
+
// - "simplified": the classic square "+" (the same button the tiles
|
|
3966
|
+
// use), 6px from the card edge on every side at every width.
|
|
3967
|
+
// - "compact": the real PlusTapButton in its OUTLINE variant (never
|
|
3968
|
+
// glass — glass only reads over a see-through surface). Nothing
|
|
3969
|
+
// around it: no card padding on its side and no vertical padding,
|
|
3970
|
+
// so the tap target's own 44px box centers the 28px circle with
|
|
3971
|
+
// 8px on every side. Never pass a layout class to a tap button —
|
|
3972
|
+
// its className lands on the ICON (the 2026-09-27 crooked "+").
|
|
3973
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
|
|
3974
|
+
"div",
|
|
3975
|
+
{
|
|
3976
|
+
"data-association-card": token,
|
|
3977
|
+
"data-association-card-look": look,
|
|
3978
|
+
className: (0, import_design_system7.cn)(
|
|
3979
|
+
"flex items-center gap-x-1.5 rounded-md border border-border bg-card pl-2.5",
|
|
3980
|
+
look === "simplified" ? "py-1.5 pr-1.5" : "py-0 pr-0",
|
|
3981
|
+
className
|
|
3982
|
+
),
|
|
3983
|
+
children: [
|
|
3984
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
|
|
3985
|
+
"button",
|
|
3986
|
+
{
|
|
3987
|
+
type: "button",
|
|
3988
|
+
disabled: !canDrillIn,
|
|
3989
|
+
onClick: () => setListOpen(true),
|
|
3990
|
+
title: drillTitle,
|
|
3991
|
+
"aria-label": loading ? info.labelPlural : `${info.labelPlural}: ${count} ${countWord}`,
|
|
3992
|
+
className: (0, import_design_system7.cn)(
|
|
3993
|
+
"flex min-h-7 min-w-0 flex-1 items-center gap-x-1.5 text-left",
|
|
3994
|
+
canDrillIn ? "cursor-pointer hover:text-foreground" : "cursor-default"
|
|
3995
|
+
),
|
|
3996
|
+
children: [
|
|
3997
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Icon, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }),
|
|
3998
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "min-w-0 truncate text-xs font-semibold uppercase tracking-wider text-foreground", children: info.labelPlural }),
|
|
3999
|
+
loading ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SpinnerIcon, { className: "h-3 w-3 animate-spin text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "text-xs tabular-nums text-muted-foreground", children: count })
|
|
4000
|
+
]
|
|
4001
|
+
}
|
|
4002
|
+
),
|
|
4003
|
+
canAttach && (look === "compact" ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
4004
|
+
import_buttons.PlusTapButton,
|
|
4005
|
+
{
|
|
4006
|
+
variant: "outline",
|
|
4007
|
+
ariaLabel: `Attach ${info.labelPlural.toLowerCase()}`,
|
|
4008
|
+
tooltip: false,
|
|
4009
|
+
onClick: () => setOpen(true)
|
|
4010
|
+
}
|
|
4011
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
4012
|
+
"button",
|
|
4013
|
+
{
|
|
4014
|
+
type: "button",
|
|
4015
|
+
onClick: () => setOpen(true),
|
|
4016
|
+
"aria-label": `Attach ${info.labelPlural.toLowerCase()}`,
|
|
4017
|
+
title: `Attach ${info.labelPlural.toLowerCase()}`,
|
|
4018
|
+
className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-md border border-border text-muted-foreground transition-colors hover:border-primary/60 hover:text-foreground lg:h-7 lg:w-7",
|
|
4019
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(PlusIcon, { className: "h-4 w-4" })
|
|
4020
|
+
}
|
|
4021
|
+
))
|
|
4022
|
+
]
|
|
4023
|
+
}
|
|
4024
|
+
)
|
|
4025
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
|
|
3909
4026
|
"div",
|
|
3910
4027
|
{
|
|
3911
4028
|
"data-association-card": token,
|
|
4029
|
+
"data-association-card-look": "tiles",
|
|
3912
4030
|
className: (0, import_design_system7.cn)(
|
|
3913
|
-
"flex
|
|
4031
|
+
"group relative flex items-center gap-3 overflow-hidden rounded-xl border border-border bg-card transition-all hover:border-primary/30 hover:bg-accent/40",
|
|
3914
4032
|
className
|
|
3915
4033
|
),
|
|
3916
4034
|
children: [
|
|
4035
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
4036
|
+
"span",
|
|
4037
|
+
{
|
|
4038
|
+
className: (0, import_design_system7.cn)(
|
|
4039
|
+
"absolute inset-x-0 top-0 h-0.5 opacity-60",
|
|
4040
|
+
role.accentBar
|
|
4041
|
+
)
|
|
4042
|
+
}
|
|
4043
|
+
),
|
|
3917
4044
|
/* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
|
|
3918
4045
|
"button",
|
|
3919
4046
|
{
|
|
3920
4047
|
type: "button",
|
|
3921
4048
|
disabled: !canDrillIn,
|
|
3922
4049
|
onClick: () => setListOpen(true),
|
|
3923
|
-
title:
|
|
3924
|
-
"aria-label": loading ? info.labelPlural : `${info.labelPlural}: ${count} ${countWord}`,
|
|
4050
|
+
title: drillTitle,
|
|
3925
4051
|
className: (0, import_design_system7.cn)(
|
|
3926
|
-
"flex min-
|
|
3927
|
-
canDrillIn ? "cursor-pointer
|
|
4052
|
+
"flex min-w-0 flex-1 items-center gap-3 px-3 py-2.5 text-left",
|
|
4053
|
+
canDrillIn ? "cursor-pointer" : "cursor-default"
|
|
3928
4054
|
),
|
|
3929
4055
|
children: [
|
|
3930
|
-
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
3931
|
-
|
|
3932
|
-
|
|
4056
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
4057
|
+
"span",
|
|
4058
|
+
{
|
|
4059
|
+
className: (0, import_design_system7.cn)(
|
|
4060
|
+
"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg",
|
|
4061
|
+
role.accentBg,
|
|
4062
|
+
role.accentText
|
|
4063
|
+
),
|
|
4064
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Icon, { className: "h-4 w-4" })
|
|
4065
|
+
}
|
|
4066
|
+
),
|
|
4067
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: "min-w-0 flex-1", children: [
|
|
4068
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "block truncate text-sm font-medium text-foreground", children: info.labelPlural }),
|
|
4069
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "block text-xs text-muted-foreground tabular-nums", children: loading ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: "inline-flex items-center gap-1", children: [
|
|
4070
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SpinnerIcon, { className: "h-3 w-3 animate-spin" }),
|
|
4071
|
+
"Loading\u2026"
|
|
4072
|
+
] }) : `${count} ${countWord}` })
|
|
4073
|
+
] })
|
|
3933
4074
|
]
|
|
3934
4075
|
}
|
|
3935
4076
|
),
|
|
3936
4077
|
canAttach && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
3937
|
-
|
|
4078
|
+
"button",
|
|
3938
4079
|
{
|
|
3939
|
-
|
|
3940
|
-
tooltip: false,
|
|
4080
|
+
type: "button",
|
|
3941
4081
|
onClick: () => setOpen(true),
|
|
3942
|
-
|
|
3943
|
-
|
|
4082
|
+
"aria-label": `Attach ${info.labelPlural.toLowerCase()}`,
|
|
4083
|
+
title: `Attach ${info.labelPlural.toLowerCase()}`,
|
|
4084
|
+
className: "mr-2 flex h-11 w-11 shrink-0 items-center justify-center rounded-md border border-border text-muted-foreground transition-colors hover:border-primary/60 hover:text-foreground lg:mr-3 lg:h-7 lg:w-7",
|
|
4085
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(PlusIcon, { className: "h-4 w-4" })
|
|
3944
4086
|
}
|
|
3945
4087
|
)
|
|
3946
4088
|
]
|
|
@@ -3961,8 +4103,8 @@ function AssociationCard({
|
|
|
3961
4103
|
setOpen(true);
|
|
3962
4104
|
}
|
|
3963
4105
|
} : {},
|
|
3964
|
-
onDetach: (resourceId,
|
|
3965
|
-
onSetPinned: (resourceId, pinned,
|
|
4106
|
+
onDetach: (resourceId, role2) => detach(token, resourceId, role2 ?? void 0),
|
|
4107
|
+
onSetPinned: (resourceId, pinned, role2) => setPinned(token, resourceId, pinned, role2 ?? void 0)
|
|
3966
4108
|
}
|
|
3967
4109
|
),
|
|
3968
4110
|
canAttach && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
@@ -3984,61 +4126,29 @@ function AssociationCard({
|
|
|
3984
4126
|
|
|
3985
4127
|
// src/react/components/AssociationCardGrid.tsx
|
|
3986
4128
|
var import_design_system8 = require("@ai-matrx/design-system");
|
|
3987
|
-
|
|
3988
|
-
// src/react/contentRoles.ts
|
|
3989
|
-
var CONTENT_ROLES = [
|
|
3990
|
-
{
|
|
3991
|
-
id: "utility",
|
|
3992
|
-
title: "Utilities",
|
|
3993
|
-
tagline: "The agents and tools that act on your knowledge.",
|
|
3994
|
-
accentText: "text-violet-600 dark:text-violet-400",
|
|
3995
|
-
accentBg: "bg-violet-500/10",
|
|
3996
|
-
accentBar: "bg-violet-500"
|
|
3997
|
-
},
|
|
3998
|
-
{
|
|
3999
|
-
id: "source",
|
|
4000
|
-
title: "Sources",
|
|
4001
|
-
tagline: "Incoming sources of truth (Knowledge In).",
|
|
4002
|
-
accentText: "text-sky-600 dark:text-sky-400",
|
|
4003
|
-
accentBg: "bg-sky-500/10",
|
|
4004
|
-
accentBar: "bg-sky-500"
|
|
4005
|
-
},
|
|
4006
|
-
{
|
|
4007
|
-
id: "destination",
|
|
4008
|
-
title: "Outputs",
|
|
4009
|
-
tagline: "Knowledge your team produces.",
|
|
4010
|
-
accentText: "text-emerald-600 dark:text-emerald-400",
|
|
4011
|
-
accentBg: "bg-emerald-500/10",
|
|
4012
|
-
accentBar: "bg-emerald-500"
|
|
4013
|
-
},
|
|
4014
|
-
{
|
|
4015
|
-
id: "hybrid",
|
|
4016
|
-
title: "Sources & Outputs",
|
|
4017
|
-
tagline: "Read from and written to.",
|
|
4018
|
-
accentText: "text-teal-600 dark:text-teal-400",
|
|
4019
|
-
accentBg: "bg-teal-500/10",
|
|
4020
|
-
accentBar: "bg-gradient-to-r from-sky-500 to-emerald-500"
|
|
4021
|
-
},
|
|
4022
|
-
{
|
|
4023
|
-
id: "container",
|
|
4024
|
-
title: "Workspaces",
|
|
4025
|
-
tagline: "How work is organized.",
|
|
4026
|
-
accentText: "text-amber-600 dark:text-amber-400",
|
|
4027
|
-
accentBg: "bg-amber-500/10",
|
|
4028
|
-
accentBar: "bg-amber-500"
|
|
4029
|
-
}
|
|
4030
|
-
];
|
|
4031
|
-
function getContentRoleMeta(role) {
|
|
4032
|
-
return CONTENT_ROLES.find((r) => r.id === role) ?? CONTENT_ROLES[2];
|
|
4033
|
-
}
|
|
4034
|
-
|
|
4035
|
-
// src/react/components/AssociationCardGrid.tsx
|
|
4036
4129
|
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
4037
|
-
var
|
|
4038
|
-
var
|
|
4130
|
+
var SIMPLE_GROUP_LABEL = "mb-1 text-xs font-medium uppercase tracking-wider text-muted-foreground";
|
|
4131
|
+
var SIMPLE_TILE_ROW = "flex flex-wrap gap-2 [&>*]:min-w-[16rem] [&>*]:flex-1";
|
|
4132
|
+
var TILE_GRID = "grid grid-cols-1 gap-2 @md:grid-cols-2 @3xl:grid-cols-3";
|
|
4133
|
+
function GroupHeader({
|
|
4134
|
+
look,
|
|
4135
|
+
title,
|
|
4136
|
+
tagline,
|
|
4137
|
+
dotClassName
|
|
4138
|
+
}) {
|
|
4139
|
+
if (look !== "tiles") return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("h3", { className: SIMPLE_GROUP_LABEL, children: title });
|
|
4140
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "mb-2.5 flex items-baseline gap-3 pl-1.5", children: [
|
|
4141
|
+
dotClassName ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
4142
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: (0, import_design_system8.cn)("h-2.5 w-2.5 rounded-full", dotClassName) }),
|
|
4143
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("h3", { className: "text-sm font-semibold text-foreground", children: title })
|
|
4144
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("h3", { className: "text-sm font-semibold text-foreground", children: title }),
|
|
4145
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "hidden text-xs text-muted-foreground sm:block", children: tagline })
|
|
4146
|
+
] });
|
|
4147
|
+
}
|
|
4039
4148
|
function AssociationCardGrid({
|
|
4040
4149
|
tokens,
|
|
4041
4150
|
excludeTokens,
|
|
4151
|
+
look = "tiles",
|
|
4042
4152
|
className
|
|
4043
4153
|
}) {
|
|
4044
4154
|
const store = useAssociationsStore();
|
|
@@ -4061,22 +4171,45 @@ function AssociationCardGrid({
|
|
|
4061
4171
|
const role = store.registry.getEntityInfo(token).contentRole;
|
|
4062
4172
|
return !role || !roleIds.has(role);
|
|
4063
4173
|
}) : [];
|
|
4064
|
-
|
|
4065
|
-
|
|
4066
|
-
|
|
4067
|
-
|
|
4068
|
-
|
|
4069
|
-
|
|
4070
|
-
|
|
4071
|
-
|
|
4072
|
-
|
|
4073
|
-
|
|
4074
|
-
|
|
4075
|
-
|
|
4076
|
-
|
|
4077
|
-
|
|
4078
|
-
|
|
4079
|
-
|
|
4174
|
+
const rowClass = look !== "tiles" ? SIMPLE_TILE_ROW : TILE_GRID;
|
|
4175
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
4176
|
+
"div",
|
|
4177
|
+
{
|
|
4178
|
+
"data-association-grid-look": look,
|
|
4179
|
+
className: (0, import_design_system8.cn)("@container", look !== "tiles" ? "space-y-3" : "space-y-5", className),
|
|
4180
|
+
children: [
|
|
4181
|
+
CONTENT_ROLES.map((role) => {
|
|
4182
|
+
const inRole = list.filter(
|
|
4183
|
+
(token) => store.registry.getEntityInfo(token).contentRole === role.id
|
|
4184
|
+
);
|
|
4185
|
+
if (inRole.length === 0) return null;
|
|
4186
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("section", { children: [
|
|
4187
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
4188
|
+
GroupHeader,
|
|
4189
|
+
{
|
|
4190
|
+
look,
|
|
4191
|
+
title: role.title,
|
|
4192
|
+
tagline: role.tagline,
|
|
4193
|
+
dotClassName: role.accentBar
|
|
4194
|
+
}
|
|
4195
|
+
),
|
|
4196
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: rowClass, children: inRole.map((token) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(AssociationCard, { token, look }, token)) })
|
|
4197
|
+
] }, role.id);
|
|
4198
|
+
}),
|
|
4199
|
+
roleless.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("section", { children: [
|
|
4200
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
4201
|
+
GroupHeader,
|
|
4202
|
+
{
|
|
4203
|
+
look,
|
|
4204
|
+
title: "Filed under",
|
|
4205
|
+
tagline: "Libraries, topics and other places this is kept."
|
|
4206
|
+
}
|
|
4207
|
+
),
|
|
4208
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: rowClass, children: roleless.map((token) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(AssociationCard, { token, look }, token)) })
|
|
4209
|
+
] })
|
|
4210
|
+
]
|
|
4211
|
+
}
|
|
4212
|
+
);
|
|
4080
4213
|
}
|
|
4081
4214
|
|
|
4082
4215
|
// src/react/components/AssociationList.tsx
|