@almadar/ui 6.27.0 → 6.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6983,6 +6983,13 @@ var init_slot_types = __esm({
6983
6983
  nextRefId = 1;
6984
6984
  }
6985
6985
  });
6986
+ var SlotContainedContext;
6987
+ var init_slotContained = __esm({
6988
+ "lib/slotContained.ts"() {
6989
+ "use client";
6990
+ SlotContainedContext = createContext(false);
6991
+ }
6992
+ });
6986
6993
  var ErrorState;
6987
6994
  var init_ErrorState = __esm({
6988
6995
  "components/core/molecules/ErrorState.tsx"() {
@@ -36897,7 +36904,6 @@ function TableView({
36897
36904
  columns,
36898
36905
  fields,
36899
36906
  itemActions,
36900
- maxInlineActions,
36901
36907
  itemClickEvent = "",
36902
36908
  selectable = false,
36903
36909
  selectEvent,
@@ -36931,8 +36937,7 @@ function TableView({
36931
36937
  const [localSelected, setLocalSelected] = React79__default.useState(/* @__PURE__ */ new Set());
36932
36938
  const colDefs = (Array.isArray(columns) ? columns : void 0) ?? (Array.isArray(fields) ? fields : void 0) ?? [];
36933
36939
  const actionDefs = Array.isArray(itemActions) ? itemActions : [];
36934
- const inlineActions = maxInlineActions != null ? actionDefs.slice(0, maxInlineActions) : [];
36935
- const overflowActions = maxInlineActions != null ? actionDefs.slice(maxInlineActions) : actionDefs;
36940
+ const overflowActions = actionDefs;
36936
36941
  const fireAction = (action, row) => eventBus.emit(`UI:${action.event}`, {
36937
36942
  id: row.id,
36938
36943
  row
@@ -37114,7 +37119,7 @@ function TableView({
37114
37119
  }
37115
37120
  return /* @__PURE__ */ jsx(Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsx("span", { className: "truncate text-foreground", children: formatCell(raw, col.format, relationsData?.[col.field ?? col.key]) }) }, col.key);
37116
37121
  }),
37117
- hasActions && /* @__PURE__ */ jsxs(
37122
+ hasActions && /* @__PURE__ */ jsx(
37118
37123
  HStack,
37119
37124
  {
37120
37125
  gap: "xs",
@@ -37128,38 +37133,20 @@ function TableView({
37128
37133
  "border-l border-[var(--color-border)]",
37129
37134
  lk.striped && index % 2 === 1 ? "bg-[var(--color-surface-subtle)]" : "bg-[var(--color-card)] group-hover:bg-[var(--color-surface-subtle)]"
37130
37135
  ),
37131
- children: [
37132
- inlineActions.map((action) => /* @__PURE__ */ jsxs(
37133
- Button,
37134
- {
37135
- variant: action.variant ?? "ghost",
37136
- size: "sm",
37137
- onClick: () => fireAction(action, row),
37138
- "data-testid": `action-${action.event}`,
37139
- "data-row-id": String(row.id),
37140
- className: cn(action.variant === "danger" && "text-error hover:bg-error/10"),
37141
- children: [
37142
- action.icon && renderIconInput3(action.icon, { size: "xs", className: "mr-1" }),
37143
- action.label
37144
- ]
37145
- },
37146
- action.event
37147
- )),
37148
- overflowActions.length > 0 && /* @__PURE__ */ jsx(
37149
- Menu,
37150
- {
37151
- position: "bottom-end",
37152
- trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", "data-row-id": String(row.id), children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
37153
- items: overflowActions.map((action) => ({
37154
- label: action.label,
37155
- icon: action.icon,
37156
- event: action.event,
37157
- variant: action.variant === "danger" ? "danger" : "default",
37158
- onClick: () => fireAction(action, row)
37159
- }))
37160
- }
37161
- )
37162
- ]
37136
+ children: overflowActions.length > 0 && /* @__PURE__ */ jsx(
37137
+ Menu,
37138
+ {
37139
+ position: "bottom-end",
37140
+ trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", "data-row-id": String(row.id), children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
37141
+ items: overflowActions.map((action) => ({
37142
+ label: action.label,
37143
+ icon: action.icon,
37144
+ event: action.event,
37145
+ variant: action.variant === "danger" ? "danger" : "default",
37146
+ onClick: () => fireAction(action, row)
37147
+ }))
37148
+ }
37149
+ )
37163
37150
  }
37164
37151
  )
37165
37152
  ]
@@ -46815,6 +46802,7 @@ var init_DetailPanel = __esm({
46815
46802
  init_EmptyState();
46816
46803
  init_cn();
46817
46804
  init_portalRoot();
46805
+ init_slotContained();
46818
46806
  init_format();
46819
46807
  init_getNestedValue();
46820
46808
  init_relationLabel();
@@ -46846,6 +46834,7 @@ var init_DetailPanel = __esm({
46846
46834
  }) => {
46847
46835
  const eventBus = useEventBus();
46848
46836
  const { t } = useTranslate();
46837
+ const contained = useContext(SlotContainedContext);
46849
46838
  const [titleDraft, setTitleDraft] = React79__default.useState(null);
46850
46839
  const isFieldDefArray = (arr) => {
46851
46840
  if (!arr || arr.length === 0) return false;
@@ -47233,8 +47222,9 @@ var init_DetailPanel = __esm({
47233
47222
  if (!slideOver) {
47234
47223
  return /* @__PURE__ */ jsx(Box, { className, children: content });
47235
47224
  }
47236
- const panel = /* @__PURE__ */ jsx(Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
47237
- return typeof document === "undefined" ? panel : createPortal(panel, getOrCreatePortalRoot());
47225
+ const panel = /* @__PURE__ */ jsx(Box, { className: cn(contained ? "absolute" : "fixed", "inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
47226
+ if (contained || typeof document === "undefined") return panel;
47227
+ return createPortal(panel, getOrCreatePortalRoot());
47238
47228
  };
47239
47229
  DetailPanel.displayName = "DetailPanel";
47240
47230
  }
@@ -53712,6 +53702,7 @@ var init_component_registry_generated = __esm({
53712
53702
  // components/core/organisms/UISlotRenderer.tsx
53713
53703
  var UISlotRenderer_exports = {};
53714
53704
  __export(UISlotRenderer_exports, {
53705
+ SlotContainedContext: () => SlotContainedContext,
53715
53706
  SlotContentRenderer: () => SlotContentRenderer,
53716
53707
  SuspenseConfigProvider: () => SuspenseConfigProvider,
53717
53708
  UISlotComponent: () => UISlotComponent,
@@ -53884,6 +53875,25 @@ function renderContainedPortal(t, slot, content, onDismiss) {
53884
53875
  }
53885
53876
  );
53886
53877
  case "drawer":
53878
+ if (content.pattern === "detail-panel" && content.props.slideOver === true) {
53879
+ return /* @__PURE__ */ jsx(
53880
+ Box,
53881
+ {
53882
+ id: slotId,
53883
+ className: "absolute inset-0 z-50 overflow-hidden",
53884
+ style: { backgroundColor: "rgba(0, 0, 0, 0.5)" },
53885
+ onClick: onDismiss,
53886
+ children: /* @__PURE__ */ jsx(
53887
+ Box,
53888
+ {
53889
+ className: "absolute inset-y-0 right-0 pointer-events-auto",
53890
+ onClick: (e) => e.stopPropagation(),
53891
+ children: slotContent
53892
+ }
53893
+ )
53894
+ }
53895
+ );
53896
+ }
53887
53897
  return /* @__PURE__ */ jsx(
53888
53898
  Box,
53889
53899
  {
@@ -54735,7 +54745,7 @@ function UISlotRenderer({
54735
54745
  }
54736
54746
  return wrapped;
54737
54747
  }
54738
- var scopeWrapLog, TRAIT_BINDING_RE, SuspenseConfigContext, SlotContainedContext, SLOT_SKELETON_MAP, CONTENT_NODE_SLOTS, PATTERNS_WITH_CHILDREN, traitRefPresenceCache;
54748
+ var scopeWrapLog, TRAIT_BINDING_RE, SuspenseConfigContext, SLOT_SKELETON_MAP, CONTENT_NODE_SLOTS, PATTERNS_WITH_CHILDREN, traitRefPresenceCache;
54739
54749
  var init_UISlotRenderer = __esm({
54740
54750
  "components/core/organisms/UISlotRenderer.tsx"() {
54741
54751
  "use client";
@@ -54750,6 +54760,7 @@ var init_UISlotRenderer = __esm({
54750
54760
  init_cn();
54751
54761
  init_format();
54752
54762
  init_portalRoot();
54763
+ init_slotContained();
54753
54764
  init_ErrorBoundary();
54754
54765
  init_Skeleton();
54755
54766
  init_renderer();
@@ -54759,7 +54770,6 @@ var init_UISlotRenderer = __esm({
54759
54770
  scopeWrapLog = createLogger("almadar:ui:scope-wrap");
54760
54771
  TRAIT_BINDING_RE = /^@trait\.([A-Z][A-Za-z0-9]*)$/;
54761
54772
  SuspenseConfigContext = createContext({ enabled: false });
54762
- SlotContainedContext = createContext(false);
54763
54773
  SuspenseConfigProvider.displayName = "SuspenseConfigProvider";
54764
54774
  SLOT_SKELETON_MAP = {
54765
54775
  main: "table",
@@ -2337,6 +2337,13 @@ var init_slot_types = __esm({
2337
2337
  nextRefId = 1;
2338
2338
  }
2339
2339
  });
2340
+ var SlotContainedContext;
2341
+ var init_slotContained = __esm({
2342
+ "lib/slotContained.ts"() {
2343
+ "use client";
2344
+ SlotContainedContext = React89.createContext(false);
2345
+ }
2346
+ });
2340
2347
  function buildForkPaths(x, y, branches, scale) {
2341
2348
  const inLength = 30 * scale;
2342
2349
  const outLength = 30 * scale;
@@ -35919,7 +35926,6 @@ function TableView({
35919
35926
  columns,
35920
35927
  fields,
35921
35928
  itemActions,
35922
- maxInlineActions,
35923
35929
  itemClickEvent = "",
35924
35930
  selectable = false,
35925
35931
  selectEvent,
@@ -35953,8 +35959,7 @@ function TableView({
35953
35959
  const [localSelected, setLocalSelected] = React89__namespace.default.useState(/* @__PURE__ */ new Set());
35954
35960
  const colDefs = (Array.isArray(columns) ? columns : void 0) ?? (Array.isArray(fields) ? fields : void 0) ?? [];
35955
35961
  const actionDefs = Array.isArray(itemActions) ? itemActions : [];
35956
- const inlineActions = maxInlineActions != null ? actionDefs.slice(0, maxInlineActions) : [];
35957
- const overflowActions = maxInlineActions != null ? actionDefs.slice(maxInlineActions) : actionDefs;
35962
+ const overflowActions = actionDefs;
35958
35963
  const fireAction = (action, row) => eventBus.emit(`UI:${action.event}`, {
35959
35964
  id: row.id,
35960
35965
  row
@@ -36136,7 +36141,7 @@ function TableView({
36136
36141
  }
36137
36142
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-foreground", children: formatCell(raw, col.format, relationsData?.[col.field ?? col.key]) }) }, col.key);
36138
36143
  }),
36139
- hasActions && /* @__PURE__ */ jsxRuntime.jsxs(
36144
+ hasActions && /* @__PURE__ */ jsxRuntime.jsx(
36140
36145
  HStack,
36141
36146
  {
36142
36147
  gap: "xs",
@@ -36150,38 +36155,20 @@ function TableView({
36150
36155
  "border-l border-[var(--color-border)]",
36151
36156
  lk.striped && index % 2 === 1 ? "bg-[var(--color-surface-subtle)]" : "bg-[var(--color-card)] group-hover:bg-[var(--color-surface-subtle)]"
36152
36157
  ),
36153
- children: [
36154
- inlineActions.map((action) => /* @__PURE__ */ jsxRuntime.jsxs(
36155
- Button,
36156
- {
36157
- variant: action.variant ?? "ghost",
36158
- size: "sm",
36159
- onClick: () => fireAction(action, row),
36160
- "data-testid": `action-${action.event}`,
36161
- "data-row-id": String(row.id),
36162
- className: cn(action.variant === "danger" && "text-error hover:bg-error/10"),
36163
- children: [
36164
- action.icon && renderIconInput3(action.icon, { size: "xs", className: "mr-1" }),
36165
- action.label
36166
- ]
36167
- },
36168
- action.event
36169
- )),
36170
- overflowActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
36171
- Menu,
36172
- {
36173
- position: "bottom-end",
36174
- trigger: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", "data-row-id": String(row.id), children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
36175
- items: overflowActions.map((action) => ({
36176
- label: action.label,
36177
- icon: action.icon,
36178
- event: action.event,
36179
- variant: action.variant === "danger" ? "danger" : "default",
36180
- onClick: () => fireAction(action, row)
36181
- }))
36182
- }
36183
- )
36184
- ]
36158
+ children: overflowActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
36159
+ Menu,
36160
+ {
36161
+ position: "bottom-end",
36162
+ trigger: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", "data-row-id": String(row.id), children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
36163
+ items: overflowActions.map((action) => ({
36164
+ label: action.label,
36165
+ icon: action.icon,
36166
+ event: action.event,
36167
+ variant: action.variant === "danger" ? "danger" : "default",
36168
+ onClick: () => fireAction(action, row)
36169
+ }))
36170
+ }
36171
+ )
36185
36172
  }
36186
36173
  )
36187
36174
  ]
@@ -45607,6 +45594,7 @@ var init_DetailPanel = __esm({
45607
45594
  init_EmptyState();
45608
45595
  init_cn();
45609
45596
  init_portalRoot();
45597
+ init_slotContained();
45610
45598
  init_format();
45611
45599
  init_getNestedValue();
45612
45600
  init_relationLabel();
@@ -45638,6 +45626,7 @@ var init_DetailPanel = __esm({
45638
45626
  }) => {
45639
45627
  const eventBus = useEventBus();
45640
45628
  const { t } = hooks.useTranslate();
45629
+ const contained = React89.useContext(SlotContainedContext);
45641
45630
  const [titleDraft, setTitleDraft] = React89__namespace.default.useState(null);
45642
45631
  const isFieldDefArray = (arr) => {
45643
45632
  if (!arr || arr.length === 0) return false;
@@ -46025,8 +46014,9 @@ var init_DetailPanel = __esm({
46025
46014
  if (!slideOver) {
46026
46015
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className, children: content });
46027
46016
  }
46028
- const panel = /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
46029
- return typeof document === "undefined" ? panel : reactDom.createPortal(panel, getOrCreatePortalRoot());
46017
+ const panel = /* @__PURE__ */ jsxRuntime.jsx(Box, { className: cn(contained ? "absolute" : "fixed", "inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
46018
+ if (contained || typeof document === "undefined") return panel;
46019
+ return reactDom.createPortal(panel, getOrCreatePortalRoot());
46030
46020
  };
46031
46021
  DetailPanel.displayName = "DetailPanel";
46032
46022
  }
@@ -52504,6 +52494,7 @@ var init_component_registry_generated = __esm({
52504
52494
  // components/core/organisms/UISlotRenderer.tsx
52505
52495
  var UISlotRenderer_exports = {};
52506
52496
  __export(UISlotRenderer_exports, {
52497
+ SlotContainedContext: () => SlotContainedContext,
52507
52498
  SlotContentRenderer: () => SlotContentRenderer,
52508
52499
  SuspenseConfigProvider: () => SuspenseConfigProvider,
52509
52500
  UISlotComponent: () => UISlotComponent,
@@ -52676,6 +52667,25 @@ function renderContainedPortal(t, slot, content, onDismiss) {
52676
52667
  }
52677
52668
  );
52678
52669
  case "drawer":
52670
+ if (content.pattern === "detail-panel" && content.props.slideOver === true) {
52671
+ return /* @__PURE__ */ jsxRuntime.jsx(
52672
+ Box,
52673
+ {
52674
+ id: slotId,
52675
+ className: "absolute inset-0 z-50 overflow-hidden",
52676
+ style: { backgroundColor: "rgba(0, 0, 0, 0.5)" },
52677
+ onClick: onDismiss,
52678
+ children: /* @__PURE__ */ jsxRuntime.jsx(
52679
+ Box,
52680
+ {
52681
+ className: "absolute inset-y-0 right-0 pointer-events-auto",
52682
+ onClick: (e) => e.stopPropagation(),
52683
+ children: slotContent
52684
+ }
52685
+ )
52686
+ }
52687
+ );
52688
+ }
52679
52689
  return /* @__PURE__ */ jsxRuntime.jsx(
52680
52690
  Box,
52681
52691
  {
@@ -53527,7 +53537,7 @@ function UISlotRenderer({
53527
53537
  }
53528
53538
  return wrapped;
53529
53539
  }
53530
- var scopeWrapLog, TRAIT_BINDING_RE, SuspenseConfigContext, SlotContainedContext, SLOT_SKELETON_MAP, CONTENT_NODE_SLOTS, PATTERNS_WITH_CHILDREN, traitRefPresenceCache;
53540
+ var scopeWrapLog, TRAIT_BINDING_RE, SuspenseConfigContext, SLOT_SKELETON_MAP, CONTENT_NODE_SLOTS, PATTERNS_WITH_CHILDREN, traitRefPresenceCache;
53531
53541
  var init_UISlotRenderer = __esm({
53532
53542
  "components/core/organisms/UISlotRenderer.tsx"() {
53533
53543
  "use client";
@@ -53542,6 +53552,7 @@ var init_UISlotRenderer = __esm({
53542
53552
  init_cn();
53543
53553
  init_format();
53544
53554
  init_portalRoot();
53555
+ init_slotContained();
53545
53556
  init_ErrorBoundary();
53546
53557
  init_Skeleton();
53547
53558
  init_renderer();
@@ -53551,7 +53562,6 @@ var init_UISlotRenderer = __esm({
53551
53562
  scopeWrapLog = logger.createLogger("almadar:ui:scope-wrap");
53552
53563
  TRAIT_BINDING_RE = /^@trait\.([A-Z][A-Za-z0-9]*)$/;
53553
53564
  SuspenseConfigContext = React89.createContext({ enabled: false });
53554
- SlotContainedContext = React89.createContext(false);
53555
53565
  SuspenseConfigProvider.displayName = "SuspenseConfigProvider";
53556
53566
  SLOT_SKELETON_MAP = {
53557
53567
  main: "table",
@@ -54890,7 +54900,7 @@ function createHttpTransport(serverUrl, getAccessToken) {
54890
54900
  } catch {
54891
54901
  }
54892
54902
  },
54893
- sendEvent: async (orbitalName, event, payload, clientId, tick, sourceTrait, results, entityByTrait, behaviorHint) => {
54903
+ sendEvent: async (orbitalName, event, payload, clientId, tick, sourceTrait, results, entityByTrait, behaviorHint, user) => {
54894
54904
  const traits2 = results?.map((r) => ({ trait: r.traitName, from: r.result.previousState }));
54895
54905
  const body = {
54896
54906
  event,
@@ -54911,7 +54921,8 @@ function createHttpTransport(serverUrl, getAccessToken) {
54911
54921
  // "do nothing" and break every organism's INIT on the stateless path.
54912
54922
  ...results !== void 0 ? { traits: traits2 ?? [] } : {},
54913
54923
  ...entityByTrait ? { entityByTrait } : {},
54914
- ...behaviorHint !== void 0 ? { behavior: behaviorHint } : {}
54924
+ ...behaviorHint !== void 0 ? { behavior: behaviorHint } : {},
54925
+ ...user ? { user } : {}
54915
54926
  };
54916
54927
  const res = await fetch(`${serverUrl}/${orbitalName}/events`, {
54917
54928
  method: "POST",
@@ -54973,7 +54984,7 @@ function ServerBridgeProvider({
54973
54984
  disposedRef.current = true;
54974
54985
  };
54975
54986
  }, []);
54976
- const sendEvent = React89.useCallback(async (orbitalName, event, payload, tick, sourceTrait, locallyEmitted, results, entityByTrait) => {
54987
+ const sendEvent = React89.useCallback(async (orbitalName, event, payload, tick, sourceTrait, locallyEmitted, results, entityByTrait, user) => {
54977
54988
  const emptyMeta = { success: false, transitioned: false, clientEffects: 0, dataEntities: {}, emittedEvents: [] };
54978
54989
  if (!connected) return { effects: [], meta: emptyMeta };
54979
54990
  if (tick !== void 0) {
@@ -54983,7 +54994,7 @@ function ServerBridgeProvider({
54983
54994
  return commandPump.enqueue(async () => {
54984
54995
  if (disposedRef.current) return { effects: [], meta: emptyMeta };
54985
54996
  try {
54986
- const result = await transport.sendEvent(orbitalName, event, payload, getTabClientId(), tick, sourceTrait, results, entityByTrait, schema.name);
54997
+ const result = await transport.sendEvent(orbitalName, event, payload, getTabClientId(), tick, sourceTrait, results, entityByTrait, schema.name, user);
54987
54998
  const effects = [];
54988
54999
  const responseData = result.data || {};
54989
55000
  const dataEntities = {};
@@ -54996,6 +55007,7 @@ function ServerBridgeProvider({
54996
55007
  clientEffects: result.clientEffects?.length ?? 0,
54997
55008
  dataEntities,
54998
55009
  data: responseData,
55010
+ entityByTrait: result.entityByTrait,
54999
55011
  emittedEvents: result.emittedEvents?.map((e) => e.event) ?? [],
55000
55012
  emitted: result.emittedEvents?.map((e) => ({ event: e.event, ...e.payload !== void 0 && { payload: e.payload } })) ?? [],
55001
55013
  effectResults: result.effectResults,
@@ -6,7 +6,7 @@ export { a as CurrentPagePathContext, b as CurrentPagePathProvider, c as Current
6
6
  import { b as UserData } from '../UserContext-D566nfWA.cjs';
7
7
  export { U as UserContext, a as UserContextValue, c as UserProvider, d as UserProviderProps, u as useHasPermission, e as useHasRole, f as useUser, g as useUserForEvaluation } from '../UserContext-D566nfWA.cjs';
8
8
  import { E as EventBusContextType } from '../event-bus-types-Bl78kokd.cjs';
9
- export { A as AccessTokenProvider, E as EntityBindingContext, a as EntityBindingSource, b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, S as SendEventResult, e as ServerBridgeContextValue, f as ServerBridgeProvider, g as ServerBridgeProviderProps, h as ServerBridgeTransport, i as ServerClientEffect, j as ServerResponseMeta, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, u as useEntityBindingSnapshot, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-CTZw2DbY.cjs';
9
+ export { A as AccessTokenProvider, E as EntityBindingContext, a as EntityBindingSource, b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, S as SendEventResult, e as ServerBridgeContextValue, f as ServerBridgeProvider, g as ServerBridgeProviderProps, h as ServerBridgeTransport, i as ServerClientEffect, j as ServerResponseMeta, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, u as useEntityBindingSnapshot, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-UyeCfEBS.cjs';
10
10
  import { i as UseOfflineExecutorResult, U as UseOfflineExecutorOptions } from '../offline-executor-DdV2o0Zu.cjs';
11
11
  export { N as NavigationContextValue, c as NavigationProvider, d as NavigationProviderProps, e as NavigationState, j as comparePathSpecificity, l as extractRouteParams, m as findPageByName, n as findPageByPath, o as getAllPages, p as getDefaultPage, q as matchPath, r as matchPathAmong, s as pathMatches, u as useActivePage, t as useInitPayload, v as useNavigateTo, w as useNavigation, x as useNavigationId, y as useNavigationState } from '../offline-executor-DdV2o0Zu.cjs';
12
12
  import '../verificationRegistry-DTrKDRoa.cjs';
@@ -6,7 +6,7 @@ export { a as CurrentPagePathContext, b as CurrentPagePathProvider, c as Current
6
6
  import { b as UserData } from '../UserContext-D566nfWA.js';
7
7
  export { U as UserContext, a as UserContextValue, c as UserProvider, d as UserProviderProps, u as useHasPermission, e as useHasRole, f as useUser, g as useUserForEvaluation } from '../UserContext-D566nfWA.js';
8
8
  import { E as EventBusContextType } from '../event-bus-types-Bl78kokd.js';
9
- export { A as AccessTokenProvider, E as EntityBindingContext, a as EntityBindingSource, b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, S as SendEventResult, e as ServerBridgeContextValue, f as ServerBridgeProvider, g as ServerBridgeProviderProps, h as ServerBridgeTransport, i as ServerClientEffect, j as ServerResponseMeta, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, u as useEntityBindingSnapshot, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-CTZw2DbY.js';
9
+ export { A as AccessTokenProvider, E as EntityBindingContext, a as EntityBindingSource, b as EntitySchemaContextValue, c as EntitySchemaProvider, d as EntitySchemaProviderProps, S as SendEventResult, e as ServerBridgeContextValue, f as ServerBridgeProvider, g as ServerBridgeProviderProps, h as ServerBridgeTransport, i as ServerClientEffect, j as ServerResponseMeta, T as TraitContext, k as TraitContextValue, l as TraitInstance, m as TraitProvider, n as TraitProviderProps, u as useEntityBindingSnapshot, o as useEntitySchema, p as useEntitySchemaOptional, q as useServerBridge, r as useTrait, s as useTraitContext } from '../EntityBindingContext-UyeCfEBS.js';
10
10
  import { i as UseOfflineExecutorResult, U as UseOfflineExecutorOptions } from '../offline-executor-DdV2o0Zu.js';
11
11
  export { N as NavigationContextValue, c as NavigationProvider, d as NavigationProviderProps, e as NavigationState, j as comparePathSpecificity, l as extractRouteParams, m as findPageByName, n as findPageByPath, o as getAllPages, p as getDefaultPage, q as matchPath, r as matchPathAmong, s as pathMatches, u as useActivePage, t as useInitPayload, v as useNavigateTo, w as useNavigation, x as useNavigationId, y as useNavigationState } from '../offline-executor-DdV2o0Zu.js';
12
12
  import '../verificationRegistry-Cwa52VyK.js';
@@ -2263,6 +2263,13 @@ var init_slot_types = __esm({
2263
2263
  nextRefId = 1;
2264
2264
  }
2265
2265
  });
2266
+ var SlotContainedContext;
2267
+ var init_slotContained = __esm({
2268
+ "lib/slotContained.ts"() {
2269
+ "use client";
2270
+ SlotContainedContext = createContext(false);
2271
+ }
2272
+ });
2266
2273
  function buildForkPaths(x, y, branches, scale) {
2267
2274
  const inLength = 30 * scale;
2268
2275
  const outLength = 30 * scale;
@@ -35845,7 +35852,6 @@ function TableView({
35845
35852
  columns,
35846
35853
  fields,
35847
35854
  itemActions,
35848
- maxInlineActions,
35849
35855
  itemClickEvent = "",
35850
35856
  selectable = false,
35851
35857
  selectEvent,
@@ -35879,8 +35885,7 @@ function TableView({
35879
35885
  const [localSelected, setLocalSelected] = React89__default.useState(/* @__PURE__ */ new Set());
35880
35886
  const colDefs = (Array.isArray(columns) ? columns : void 0) ?? (Array.isArray(fields) ? fields : void 0) ?? [];
35881
35887
  const actionDefs = Array.isArray(itemActions) ? itemActions : [];
35882
- const inlineActions = maxInlineActions != null ? actionDefs.slice(0, maxInlineActions) : [];
35883
- const overflowActions = maxInlineActions != null ? actionDefs.slice(maxInlineActions) : actionDefs;
35888
+ const overflowActions = actionDefs;
35884
35889
  const fireAction = (action, row) => eventBus.emit(`UI:${action.event}`, {
35885
35890
  id: row.id,
35886
35891
  row
@@ -36062,7 +36067,7 @@ function TableView({
36062
36067
  }
36063
36068
  return /* @__PURE__ */ jsx(Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsx("span", { className: "truncate text-foreground", children: formatCell(raw, col.format, relationsData?.[col.field ?? col.key]) }) }, col.key);
36064
36069
  }),
36065
- hasActions && /* @__PURE__ */ jsxs(
36070
+ hasActions && /* @__PURE__ */ jsx(
36066
36071
  HStack,
36067
36072
  {
36068
36073
  gap: "xs",
@@ -36076,38 +36081,20 @@ function TableView({
36076
36081
  "border-l border-[var(--color-border)]",
36077
36082
  lk.striped && index % 2 === 1 ? "bg-[var(--color-surface-subtle)]" : "bg-[var(--color-card)] group-hover:bg-[var(--color-surface-subtle)]"
36078
36083
  ),
36079
- children: [
36080
- inlineActions.map((action) => /* @__PURE__ */ jsxs(
36081
- Button,
36082
- {
36083
- variant: action.variant ?? "ghost",
36084
- size: "sm",
36085
- onClick: () => fireAction(action, row),
36086
- "data-testid": `action-${action.event}`,
36087
- "data-row-id": String(row.id),
36088
- className: cn(action.variant === "danger" && "text-error hover:bg-error/10"),
36089
- children: [
36090
- action.icon && renderIconInput3(action.icon, { size: "xs", className: "mr-1" }),
36091
- action.label
36092
- ]
36093
- },
36094
- action.event
36095
- )),
36096
- overflowActions.length > 0 && /* @__PURE__ */ jsx(
36097
- Menu,
36098
- {
36099
- position: "bottom-end",
36100
- trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", "data-row-id": String(row.id), children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
36101
- items: overflowActions.map((action) => ({
36102
- label: action.label,
36103
- icon: action.icon,
36104
- event: action.event,
36105
- variant: action.variant === "danger" ? "danger" : "default",
36106
- onClick: () => fireAction(action, row)
36107
- }))
36108
- }
36109
- )
36110
- ]
36084
+ children: overflowActions.length > 0 && /* @__PURE__ */ jsx(
36085
+ Menu,
36086
+ {
36087
+ position: "bottom-end",
36088
+ trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", "data-row-id": String(row.id), children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
36089
+ items: overflowActions.map((action) => ({
36090
+ label: action.label,
36091
+ icon: action.icon,
36092
+ event: action.event,
36093
+ variant: action.variant === "danger" ? "danger" : "default",
36094
+ onClick: () => fireAction(action, row)
36095
+ }))
36096
+ }
36097
+ )
36111
36098
  }
36112
36099
  )
36113
36100
  ]
@@ -45533,6 +45520,7 @@ var init_DetailPanel = __esm({
45533
45520
  init_EmptyState();
45534
45521
  init_cn();
45535
45522
  init_portalRoot();
45523
+ init_slotContained();
45536
45524
  init_format();
45537
45525
  init_getNestedValue();
45538
45526
  init_relationLabel();
@@ -45564,6 +45552,7 @@ var init_DetailPanel = __esm({
45564
45552
  }) => {
45565
45553
  const eventBus = useEventBus();
45566
45554
  const { t } = useTranslate();
45555
+ const contained = useContext(SlotContainedContext);
45567
45556
  const [titleDraft, setTitleDraft] = React89__default.useState(null);
45568
45557
  const isFieldDefArray = (arr) => {
45569
45558
  if (!arr || arr.length === 0) return false;
@@ -45951,8 +45940,9 @@ var init_DetailPanel = __esm({
45951
45940
  if (!slideOver) {
45952
45941
  return /* @__PURE__ */ jsx(Box, { className, children: content });
45953
45942
  }
45954
- const panel = /* @__PURE__ */ jsx(Box, { className: cn("fixed inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
45955
- return typeof document === "undefined" ? panel : createPortal(panel, getOrCreatePortalRoot());
45943
+ const panel = /* @__PURE__ */ jsx(Box, { className: cn(contained ? "absolute" : "fixed", "inset-y-0 right-0 w-full max-w-2xl bg-card shadow-lg z-50 overflow-y-auto p-6", className), children: content });
45944
+ if (contained || typeof document === "undefined") return panel;
45945
+ return createPortal(panel, getOrCreatePortalRoot());
45956
45946
  };
45957
45947
  DetailPanel.displayName = "DetailPanel";
45958
45948
  }
@@ -52430,6 +52420,7 @@ var init_component_registry_generated = __esm({
52430
52420
  // components/core/organisms/UISlotRenderer.tsx
52431
52421
  var UISlotRenderer_exports = {};
52432
52422
  __export(UISlotRenderer_exports, {
52423
+ SlotContainedContext: () => SlotContainedContext,
52433
52424
  SlotContentRenderer: () => SlotContentRenderer,
52434
52425
  SuspenseConfigProvider: () => SuspenseConfigProvider,
52435
52426
  UISlotComponent: () => UISlotComponent,
@@ -52602,6 +52593,25 @@ function renderContainedPortal(t, slot, content, onDismiss) {
52602
52593
  }
52603
52594
  );
52604
52595
  case "drawer":
52596
+ if (content.pattern === "detail-panel" && content.props.slideOver === true) {
52597
+ return /* @__PURE__ */ jsx(
52598
+ Box,
52599
+ {
52600
+ id: slotId,
52601
+ className: "absolute inset-0 z-50 overflow-hidden",
52602
+ style: { backgroundColor: "rgba(0, 0, 0, 0.5)" },
52603
+ onClick: onDismiss,
52604
+ children: /* @__PURE__ */ jsx(
52605
+ Box,
52606
+ {
52607
+ className: "absolute inset-y-0 right-0 pointer-events-auto",
52608
+ onClick: (e) => e.stopPropagation(),
52609
+ children: slotContent
52610
+ }
52611
+ )
52612
+ }
52613
+ );
52614
+ }
52605
52615
  return /* @__PURE__ */ jsx(
52606
52616
  Box,
52607
52617
  {
@@ -53453,7 +53463,7 @@ function UISlotRenderer({
53453
53463
  }
53454
53464
  return wrapped;
53455
53465
  }
53456
- var scopeWrapLog, TRAIT_BINDING_RE, SuspenseConfigContext, SlotContainedContext, SLOT_SKELETON_MAP, CONTENT_NODE_SLOTS, PATTERNS_WITH_CHILDREN, traitRefPresenceCache;
53466
+ var scopeWrapLog, TRAIT_BINDING_RE, SuspenseConfigContext, SLOT_SKELETON_MAP, CONTENT_NODE_SLOTS, PATTERNS_WITH_CHILDREN, traitRefPresenceCache;
53457
53467
  var init_UISlotRenderer = __esm({
53458
53468
  "components/core/organisms/UISlotRenderer.tsx"() {
53459
53469
  "use client";
@@ -53468,6 +53478,7 @@ var init_UISlotRenderer = __esm({
53468
53478
  init_cn();
53469
53479
  init_format();
53470
53480
  init_portalRoot();
53481
+ init_slotContained();
53471
53482
  init_ErrorBoundary();
53472
53483
  init_Skeleton();
53473
53484
  init_renderer();
@@ -53477,7 +53488,6 @@ var init_UISlotRenderer = __esm({
53477
53488
  scopeWrapLog = createLogger("almadar:ui:scope-wrap");
53478
53489
  TRAIT_BINDING_RE = /^@trait\.([A-Z][A-Za-z0-9]*)$/;
53479
53490
  SuspenseConfigContext = createContext({ enabled: false });
53480
- SlotContainedContext = createContext(false);
53481
53491
  SuspenseConfigProvider.displayName = "SuspenseConfigProvider";
53482
53492
  SLOT_SKELETON_MAP = {
53483
53493
  main: "table",
@@ -54816,7 +54826,7 @@ function createHttpTransport(serverUrl, getAccessToken) {
54816
54826
  } catch {
54817
54827
  }
54818
54828
  },
54819
- sendEvent: async (orbitalName, event, payload, clientId, tick, sourceTrait, results, entityByTrait, behaviorHint) => {
54829
+ sendEvent: async (orbitalName, event, payload, clientId, tick, sourceTrait, results, entityByTrait, behaviorHint, user) => {
54820
54830
  const traits2 = results?.map((r) => ({ trait: r.traitName, from: r.result.previousState }));
54821
54831
  const body = {
54822
54832
  event,
@@ -54837,7 +54847,8 @@ function createHttpTransport(serverUrl, getAccessToken) {
54837
54847
  // "do nothing" and break every organism's INIT on the stateless path.
54838
54848
  ...results !== void 0 ? { traits: traits2 ?? [] } : {},
54839
54849
  ...entityByTrait ? { entityByTrait } : {},
54840
- ...behaviorHint !== void 0 ? { behavior: behaviorHint } : {}
54850
+ ...behaviorHint !== void 0 ? { behavior: behaviorHint } : {},
54851
+ ...user ? { user } : {}
54841
54852
  };
54842
54853
  const res = await fetch(`${serverUrl}/${orbitalName}/events`, {
54843
54854
  method: "POST",
@@ -54899,7 +54910,7 @@ function ServerBridgeProvider({
54899
54910
  disposedRef.current = true;
54900
54911
  };
54901
54912
  }, []);
54902
- const sendEvent = useCallback(async (orbitalName, event, payload, tick, sourceTrait, locallyEmitted, results, entityByTrait) => {
54913
+ const sendEvent = useCallback(async (orbitalName, event, payload, tick, sourceTrait, locallyEmitted, results, entityByTrait, user) => {
54903
54914
  const emptyMeta = { success: false, transitioned: false, clientEffects: 0, dataEntities: {}, emittedEvents: [] };
54904
54915
  if (!connected) return { effects: [], meta: emptyMeta };
54905
54916
  if (tick !== void 0) {
@@ -54909,7 +54920,7 @@ function ServerBridgeProvider({
54909
54920
  return commandPump.enqueue(async () => {
54910
54921
  if (disposedRef.current) return { effects: [], meta: emptyMeta };
54911
54922
  try {
54912
- const result = await transport.sendEvent(orbitalName, event, payload, getTabClientId(), tick, sourceTrait, results, entityByTrait, schema.name);
54923
+ const result = await transport.sendEvent(orbitalName, event, payload, getTabClientId(), tick, sourceTrait, results, entityByTrait, schema.name, user);
54913
54924
  const effects = [];
54914
54925
  const responseData = result.data || {};
54915
54926
  const dataEntities = {};
@@ -54922,6 +54933,7 @@ function ServerBridgeProvider({
54922
54933
  clientEffects: result.clientEffects?.length ?? 0,
54923
54934
  dataEntities,
54924
54935
  data: responseData,
54936
+ entityByTrait: result.entityByTrait,
54925
54937
  emittedEvents: result.emittedEvents?.map((e) => e.event) ?? [],
54926
54938
  emitted: result.emittedEvents?.map((e) => ({ event: e.event, ...e.payload !== void 0 && { payload: e.payload } })) ?? [],
54927
54939
  effectResults: result.effectResults,