@almadar/ui 4.50.16 → 4.50.18

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.
@@ -21048,6 +21048,7 @@ function useDataDnd(args) {
21048
21048
  sortable,
21049
21049
  dropEvent,
21050
21050
  reorderEvent,
21051
+ positionEvent,
21051
21052
  dndItemIdField = "id",
21052
21053
  dndRoot,
21053
21054
  items,
@@ -21115,8 +21116,8 @@ function useDataDnd(args) {
21115
21116
  const [activeDrag, setActiveDrag] = React80__default.useState(null);
21116
21117
  const [overZoneGroup, setOverZoneGroup] = React80__default.useState(null);
21117
21118
  const meta = React80__default.useMemo(
21118
- () => ({ group: ownGroup, dropEvent, reorderEvent, itemIds, rawItems: items, idField: dndItemIdField }),
21119
- [ownGroup, dropEvent, reorderEvent, itemIds, items, dndItemIdField]
21119
+ () => ({ group: ownGroup, dropEvent, reorderEvent, positionEvent, itemIds, rawItems: items, idField: dndItemIdField }),
21120
+ [ownGroup, dropEvent, reorderEvent, positionEvent, itemIds, items, dndItemIdField]
21120
21121
  );
21121
21122
  React80__default.useEffect(() => {
21122
21123
  const target = isRoot ? null : parentRoot;
@@ -21202,6 +21203,20 @@ function useDataDnd(args) {
21202
21203
  dndLog.warn("dragEnd:abort:no-zone-resolved", { activeId: active.id, hasSource: !!sourceMeta, hasTarget: !!targetMeta });
21203
21204
  return;
21204
21205
  }
21206
+ const emitPositions = (zoneMeta) => {
21207
+ if (!zoneMeta.positionEvent) {
21208
+ dndLog.debug("dragEnd:positions:no-event", { group: zoneMeta.group });
21209
+ return;
21210
+ }
21211
+ const evt = `UI:${zoneMeta.positionEvent}`;
21212
+ const order = optimisticOrdersRef.current.get(zoneMeta.group) ?? zoneMeta.rawItems;
21213
+ order.forEach((it, idx) => {
21214
+ const id = String(it[zoneMeta.idField]);
21215
+ const position = idx * 1e3;
21216
+ eventBus.emit(evt, { id, position });
21217
+ });
21218
+ dndLog.info("dragEnd:positions:emitted", { event: evt, group: zoneMeta.group, count: order.length });
21219
+ };
21205
21220
  if (sourceMeta.group !== targetMeta.group) {
21206
21221
  if (targetMeta.dropEvent) {
21207
21222
  const evt = `UI:${targetMeta.dropEvent}`;
@@ -21221,6 +21236,8 @@ function useDataDnd(args) {
21221
21236
  } else {
21222
21237
  dndLog.warn("dragEnd:cross-container:no-dropEvent-on-target", { targetGroup: targetMeta.group });
21223
21238
  }
21239
+ emitPositions(sourceMeta);
21240
+ emitPositions(targetMeta);
21224
21241
  return;
21225
21242
  }
21226
21243
  if (oldIndex === newIndex) {
@@ -21243,6 +21260,7 @@ function useDataDnd(args) {
21243
21260
  } else {
21244
21261
  dndLog.debug("dragEnd:reorder:no-reorderEvent", { sourceGroup: sourceMeta.group });
21245
21262
  }
21263
+ emitPositions(sourceMeta);
21246
21264
  },
21247
21265
  [eventBus]
21248
21266
  );
@@ -21547,6 +21565,7 @@ function DataGrid({
21547
21565
  sortable,
21548
21566
  dropEvent,
21549
21567
  reorderEvent,
21568
+ positionEvent,
21550
21569
  dndItemIdField,
21551
21570
  dndRoot
21552
21571
  }) {
@@ -21564,6 +21583,7 @@ function DataGrid({
21564
21583
  sortable,
21565
21584
  dropEvent,
21566
21585
  reorderEvent,
21586
+ positionEvent,
21567
21587
  dndItemIdField,
21568
21588
  dndRoot
21569
21589
  });
@@ -21956,6 +21976,7 @@ function DataList({
21956
21976
  sortable: sortableProp,
21957
21977
  dropEvent,
21958
21978
  reorderEvent: dndReorderEvent,
21979
+ positionEvent,
21959
21980
  dndItemIdField,
21960
21981
  dndRoot
21961
21982
  }) {
@@ -21972,6 +21993,7 @@ function DataList({
21972
21993
  sortable: sortableProp,
21973
21994
  dropEvent,
21974
21995
  reorderEvent: dndReorderEvent,
21996
+ positionEvent,
21975
21997
  dndItemIdField,
21976
21998
  dndRoot
21977
21999
  });
@@ -46152,6 +46174,74 @@ function ServerBridgeProvider({
46152
46174
  return /* @__PURE__ */ jsx(ServerBridgeContext.Provider, { value: { connected, sendEvent }, children });
46153
46175
  }
46154
46176
 
46177
+ // context/OrbitalThemeProvider.tsx
46178
+ init_ThemeContext();
46179
+
46180
+ // context/themeTokens.ts
46181
+ function themeTokensToCssVars(tokens, mode = "light", darkVariant) {
46182
+ const vars = {};
46183
+ const isDark = mode === "dark";
46184
+ const pickColors = isDark && darkVariant?.colors ? darkVariant.colors : tokens.colors;
46185
+ if (pickColors) {
46186
+ for (const [key, value] of Object.entries(pickColors)) {
46187
+ vars[`--color-${key}`] = value;
46188
+ }
46189
+ if (isDark && darkVariant?.colors && tokens.colors) {
46190
+ for (const [key, value] of Object.entries(tokens.colors)) {
46191
+ const varName = `--color-${key}`;
46192
+ if (!(varName in vars)) vars[varName] = value;
46193
+ }
46194
+ }
46195
+ }
46196
+ const pickRadii = isDark && darkVariant?.radii ? darkVariant.radii : tokens.radii;
46197
+ if (pickRadii) {
46198
+ for (const [key, value] of Object.entries(pickRadii)) {
46199
+ vars[`--radius-${key}`] = value;
46200
+ }
46201
+ }
46202
+ const pickSpacing = isDark && darkVariant?.spacing ? darkVariant.spacing : tokens.spacing;
46203
+ if (pickSpacing) {
46204
+ for (const [key, value] of Object.entries(pickSpacing)) {
46205
+ vars[`--space-${key}`] = value;
46206
+ }
46207
+ }
46208
+ const pickTypography = isDark && darkVariant?.typography ? darkVariant.typography : tokens.typography;
46209
+ if (pickTypography) {
46210
+ for (const [key, value] of Object.entries(pickTypography)) {
46211
+ vars[`--${key}`] = value;
46212
+ }
46213
+ }
46214
+ const pickShadows = isDark && darkVariant?.shadows ? darkVariant.shadows : tokens.shadows;
46215
+ if (pickShadows) {
46216
+ for (const [key, value] of Object.entries(pickShadows)) {
46217
+ vars[`--shadow-${key}`] = value;
46218
+ }
46219
+ }
46220
+ return vars;
46221
+ }
46222
+ function resolveThemeForRuntime(theme) {
46223
+ if (theme === void 0) return void 0;
46224
+ if (typeof theme === "string") return void 0;
46225
+ return theme;
46226
+ }
46227
+ function OrbitalThemeProvider({ theme, children }) {
46228
+ const resolved = resolveThemeForRuntime(theme);
46229
+ const { resolvedMode } = useTheme();
46230
+ if (!resolved) {
46231
+ return /* @__PURE__ */ jsx(Fragment, { children });
46232
+ }
46233
+ const vars = themeTokensToCssVars(resolved.tokens, resolvedMode, resolved.variants?.dark);
46234
+ return /* @__PURE__ */ jsx(
46235
+ "div",
46236
+ {
46237
+ "data-orbital-theme": resolved.name,
46238
+ style: { display: "contents", ...vars },
46239
+ children
46240
+ }
46241
+ );
46242
+ }
46243
+ OrbitalThemeProvider.displayName = "OrbitalThemeProvider";
46244
+
46155
46245
  // runtime/OrbPreview.tsx
46156
46246
  init_navigation();
46157
46247
  init_verificationRegistry();
@@ -46600,6 +46690,19 @@ function SchemaRunner({ schema, serverUrl, transport, mockData, pageName, onNavi
46600
46690
  });
46601
46691
  return set;
46602
46692
  }, [schema, pageName]);
46693
+ const activeOrbitalTheme = useMemo(() => {
46694
+ const parsed = schema;
46695
+ if (!parsed?.orbitals?.length) return void 0;
46696
+ if (pageName) {
46697
+ for (const orb of parsed.orbitals) {
46698
+ for (const pageRef of orb.pages ?? []) {
46699
+ const name = typeof pageRef === "object" && pageRef !== null ? pageRef.name : void 0;
46700
+ if (name === pageName) return orb.theme;
46701
+ }
46702
+ }
46703
+ }
46704
+ return parsed.orbitals[0]?.theme;
46705
+ }, [schema, pageName]);
46603
46706
  const inner = /* @__PURE__ */ jsx(VerificationProvider, { enabled: true, children: /* @__PURE__ */ jsxs(
46604
46707
  EntitySchemaProvider,
46605
46708
  {
@@ -46620,7 +46723,7 @@ function SchemaRunner({ schema, serverUrl, transport, mockData, pageName, onNavi
46620
46723
  persistence
46621
46724
  }
46622
46725
  ),
46623
- /* @__PURE__ */ jsx(Box, { className: "h-full p-4", children: /* @__PURE__ */ jsx(UISlotRenderer, { includeHud: true, hudMode: "inline", includeFloating: true }) })
46726
+ /* @__PURE__ */ jsx(OrbitalThemeProvider, { theme: activeOrbitalTheme, children: /* @__PURE__ */ jsx(Box, { className: "h-full p-4", children: /* @__PURE__ */ jsx(UISlotRenderer, { includeHud: true, hudMode: "inline", includeFloating: true }) }) })
46624
46727
  ]
46625
46728
  }
46626
46729
  ) });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "4.50.16",
3
+ "version": "4.50.18",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [