@almadar/ui 5.152.0 → 5.154.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.
Files changed (35) hide show
  1. package/dist/{EntityBindingContext-CD9ZoXb4.d.cts → EntityBindingContext-BfZGeDfX.d.cts} +4 -2
  2. package/dist/{EntityBindingContext-CD9ZoXb4.d.ts → EntityBindingContext-BfZGeDfX.d.ts} +4 -2
  3. package/dist/NavStackContext-BoVV9nWb.d.cts +83 -0
  4. package/dist/NavStackContext-BoVV9nWb.d.ts +83 -0
  5. package/dist/avl/index.cjs +571 -76
  6. package/dist/avl/index.js +572 -77
  7. package/dist/{avl-schema-parser-Cx_4SVg9.d.ts → avl-schema-parser-CLIm28Wa.d.ts} +1 -1
  8. package/dist/{avl-schema-parser-CVzkNzg7.d.cts → avl-schema-parser-Do_LPV1o.d.cts} +1 -1
  9. package/dist/{cn-DJTUjk1M.d.ts → cn-CFurBb2q.d.ts} +1 -1
  10. package/dist/{cn-BnAJZcNb.d.cts → cn-TH-RHihd.d.cts} +1 -1
  11. package/dist/components/index.cjs +502 -52
  12. package/dist/components/index.d.cts +58 -9
  13. package/dist/components/index.d.ts +58 -9
  14. package/dist/components/index.js +501 -55
  15. package/dist/hooks/index.cjs +4 -0
  16. package/dist/hooks/index.d.cts +1 -0
  17. package/dist/hooks/index.d.ts +1 -0
  18. package/dist/hooks/index.js +1 -0
  19. package/dist/lib/drawable/three/index.cjs +212 -0
  20. package/dist/lib/drawable/three/index.d.cts +3 -3
  21. package/dist/lib/drawable/three/index.d.ts +3 -3
  22. package/dist/lib/drawable/three/index.js +212 -0
  23. package/dist/lib/index.d.cts +2 -2
  24. package/dist/lib/index.d.ts +2 -2
  25. package/dist/{paintDispatch-CxdLjHQq.d.ts → paintDispatch-B5n2DTB-.d.ts} +178 -2
  26. package/dist/{paintDispatch-BjZjUbcb.d.cts → paintDispatch-DgBctxIq.d.cts} +178 -2
  27. package/dist/providers/index.cjs +677 -59
  28. package/dist/providers/index.d.cts +2 -1
  29. package/dist/providers/index.d.ts +2 -1
  30. package/dist/providers/index.js +677 -62
  31. package/dist/runtime/index.cjs +570 -75
  32. package/dist/runtime/index.d.cts +12 -5
  33. package/dist/runtime/index.d.ts +12 -5
  34. package/dist/runtime/index.js +571 -76
  35. package/package.json +4 -4
@@ -3,8 +3,8 @@ import * as React77 from 'react';
3
3
  import React77__default, { createContext, useContext, useMemo, useRef, useEffect, useCallback, useState, useLayoutEffect, useId, Suspense, lazy, useSyncExternalStore } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
- import { EventBusContext, useTraitScopeChain, useCurrentPagePath, useGameAudioContextOptional, useEntitySchemaOptional, useEntityBindingSnapshot, useTraitScope, TraitScopeProvider } from '@almadar/ui/providers';
7
- export { GameAudioContext, GameAudioProvider, useGameAudioContext } from '@almadar/ui/providers';
6
+ import { EventBusContext, useTraitScopeChain, useCurrentPagePath, useGameAudioContextOptional, useEntitySchemaOptional, useEntityBindingSnapshot, useTraitScope, TraitScopeProvider, useNavStack } from '@almadar/ui/providers';
7
+ export { GameAudioContext, GameAudioProvider, useGameAudioContext, useNavStack } from '@almadar/ui/providers';
8
8
  import { createLogger, isLogLevelEnabled } from '@almadar/logger';
9
9
  import * as LucideIcons2 from 'lucide-react';
10
10
  import { X, List, Printer, ChevronRight, ChevronLeft, Check, Copy, RotateCcw, Play, Terminal, CheckCircle, XCircle, ChevronDown, Search, ChevronUp, MoreHorizontal, ArrowLeft, DollarSign, Package, Calendar, Pencil, Eye, Image as Image$1, Upload, ZoomIn, TrendingUp, TrendingDown, Minus, AlertCircle, Circle, Clock, CheckCircle2, Loader2, Code, FileText, WrapText, HelpCircle, Type, Heading1, Heading2, Heading3, ListOrdered, Quote, GitBranch, Plus, ArrowRight, Trash, Menu as Menu$1, AlertTriangle, Trash2, Eraser, ZoomOut, Download, Lightbulb, PauseCircle, Link2, Tag, User } from 'lucide-react';
@@ -5149,27 +5149,61 @@ var init_InfiniteScrollSentinel = __esm({
5149
5149
  InfiniteScrollSentinel.displayName = "InfiniteScrollSentinel";
5150
5150
  }
5151
5151
  });
5152
- function createParticles(count) {
5153
- return Array.from({ length: count }, () => {
5154
- particleIdCounter += 1;
5155
- return {
5156
- id: particleIdCounter,
5157
- color: CONFETTI_COLORS[Math.floor(Math.random() * CONFETTI_COLORS.length)],
5158
- left: 30 + Math.random() * 40,
5159
- delay: Math.random() * 300,
5160
- angle: Math.random() * 360,
5161
- distance: 40 + Math.random() * 80,
5162
- rotation: Math.random() * 720 - 360,
5163
- size: 4 + Math.random() * 6
5164
- };
5165
- });
5152
+
5153
+ // components/core/atoms/fx.ts
5154
+ function resolveFxView(item, presets) {
5155
+ const row = presets?.find((p) => p.type === item.type);
5156
+ if (!row) return item;
5157
+ return {
5158
+ ...item,
5159
+ space: item.space ?? row.space,
5160
+ effect: item.effect ?? row.effect,
5161
+ color: item.color ?? row.color,
5162
+ size: item.size ?? row.size,
5163
+ vx: item.vx ?? row.vx,
5164
+ vy: item.vy ?? row.vy,
5165
+ vz: item.vz ?? row.vz,
5166
+ particleCount: item.particleCount ?? row.particleCount,
5167
+ shape: row.shape,
5168
+ count: row.count,
5169
+ glow: row.glow,
5170
+ gravity: row.gravity,
5171
+ color2: row.color2
5172
+ };
5166
5173
  }
5167
- var CONFETTI_COLORS, particleIdCounter, ConfettiEffect;
5168
- var init_ConfettiEffect = __esm({
5169
- "components/core/atoms/ConfettiEffect.tsx"() {
5170
- "use client";
5171
- init_cn();
5172
- init_Box();
5174
+ function fxLifecycle(item, epochNowMs, tickMs) {
5175
+ const maxTtl = Math.max(item.maxTtl ?? item.ttl, item.ttl, 1);
5176
+ const lifeMs = maxTtl * tickMs;
5177
+ const ageMs = item.bornAt !== void 0 && epochNowMs > 0 ? Math.max(0, epochNowMs - item.bornAt) : (1 - item.ttl / maxTtl) * lifeMs;
5178
+ const progress = Math.min(1, Math.max(0, ageMs / lifeMs));
5179
+ return { lifeMs, ageMs, progress, fade: 1 - progress };
5180
+ }
5181
+ function fxHash01(seed, salt) {
5182
+ let h = 2166136261 ^ salt;
5183
+ for (let i = 0; i < seed.length; i++) {
5184
+ h ^= seed.charCodeAt(i);
5185
+ h = Math.imul(h, 16777619);
5186
+ }
5187
+ h ^= h >>> 13;
5188
+ h = Math.imul(h, 1274126177);
5189
+ h ^= h >>> 16;
5190
+ return (h >>> 0) / 4294967296;
5191
+ }
5192
+ function createConfettiParticles(count, seed) {
5193
+ return Array.from({ length: count }, (_, i) => ({
5194
+ id: i,
5195
+ color: CONFETTI_COLORS[Math.floor(fxHash01(seed, i * 7 + 1) * CONFETTI_COLORS.length)],
5196
+ left: 30 + fxHash01(seed, i * 7 + 2) * 40,
5197
+ delay: fxHash01(seed, i * 7 + 3) * 300,
5198
+ angle: fxHash01(seed, i * 7 + 4) * 360,
5199
+ distance: 40 + fxHash01(seed, i * 7 + 5) * 80,
5200
+ rotation: fxHash01(seed, i * 7 + 6) * 720 - 360,
5201
+ size: 4 + fxHash01(seed, i * 7 + 7) * 6
5202
+ }));
5203
+ }
5204
+ var CONFETTI_COLORS, CONFETTI_BURST_KEYFRAMES;
5205
+ var init_fx = __esm({
5206
+ "components/core/atoms/fx.ts"() {
5173
5207
  CONFETTI_COLORS = [
5174
5208
  "var(--color-primary)",
5175
5209
  "var(--color-success)",
@@ -5178,7 +5212,30 @@ var init_ConfettiEffect = __esm({
5178
5212
  "gold",
5179
5213
  "dodgerblue"
5180
5214
  ];
5181
- particleIdCounter = 0;
5215
+ CONFETTI_BURST_KEYFRAMES = `
5216
+ @keyframes confetti-burst {
5217
+ 0% {
5218
+ opacity: 1;
5219
+ transform: translate(0, 0) rotate(0deg) scale(1);
5220
+ }
5221
+ 70% {
5222
+ opacity: 1;
5223
+ }
5224
+ 100% {
5225
+ opacity: 0;
5226
+ transform: translate(var(--confetti-tx), var(--confetti-ty)) rotate(var(--confetti-rotate)) scale(0.5);
5227
+ }
5228
+ }
5229
+ `;
5230
+ }
5231
+ });
5232
+ var ConfettiEffect;
5233
+ var init_ConfettiEffect = __esm({
5234
+ "components/core/atoms/ConfettiEffect.tsx"() {
5235
+ "use client";
5236
+ init_cn();
5237
+ init_Box();
5238
+ init_fx();
5182
5239
  ConfettiEffect = ({
5183
5240
  trigger,
5184
5241
  duration = 2e3,
@@ -5187,11 +5244,13 @@ var init_ConfettiEffect = __esm({
5187
5244
  }) => {
5188
5245
  const [particles, setParticles] = useState([]);
5189
5246
  const previousTriggerRef = useRef(false);
5247
+ const burstRef = useRef(0);
5190
5248
  useEffect(() => {
5191
5249
  const wasFalse = !previousTriggerRef.current;
5192
5250
  previousTriggerRef.current = trigger;
5193
5251
  if (trigger && wasFalse) {
5194
- const newParticles = createParticles(particleCount);
5252
+ burstRef.current += 1;
5253
+ const newParticles = createConfettiParticles(particleCount, `confetti-${burstRef.current}`);
5195
5254
  setParticles(newParticles);
5196
5255
  const timer = window.setTimeout(() => {
5197
5256
  setParticles([]);
@@ -5239,21 +5298,7 @@ var init_ConfettiEffect = __esm({
5239
5298
  p.id
5240
5299
  );
5241
5300
  }),
5242
- /* @__PURE__ */ jsx("style", { children: `
5243
- @keyframes confetti-burst {
5244
- 0% {
5245
- opacity: 1;
5246
- transform: translate(0, 0) rotate(0deg) scale(1);
5247
- }
5248
- 70% {
5249
- opacity: 1;
5250
- }
5251
- 100% {
5252
- opacity: 0;
5253
- transform: translate(var(--confetti-tx), var(--confetti-ty)) rotate(var(--confetti-rotate)) scale(0.5);
5254
- }
5255
- }
5256
- ` })
5301
+ /* @__PURE__ */ jsx("style", { children: CONFETTI_BURST_KEYFRAMES })
5257
5302
  ]
5258
5303
  }
5259
5304
  );
@@ -16081,17 +16126,27 @@ var init_Breadcrumb = __esm({
16081
16126
  init_useEventBus();
16082
16127
  Breadcrumb = ({
16083
16128
  items,
16129
+ fromNavStack = false,
16130
+ itemEvent,
16084
16131
  separator = "chevron-right",
16085
16132
  maxItems,
16086
16133
  className
16087
16134
  }) => {
16088
16135
  const eventBus = useEventBus();
16089
16136
  const { t } = useTranslate();
16090
- const displayItems = maxItems && items.length > maxItems ? [
16091
- ...items.slice(0, 1),
16137
+ const navStack = useNavStack();
16138
+ const sourceItems = fromNavStack ? navStack.entries.map((entry, i) => ({
16139
+ label: entry.label,
16140
+ path: entry.href,
16141
+ isCurrent: i === navStack.entries.length - 1,
16142
+ event: itemEvent
16143
+ })) : items ?? [];
16144
+ if (fromNavStack && sourceItems.length === 0) return null;
16145
+ const displayItems = maxItems && sourceItems.length > maxItems ? [
16146
+ ...sourceItems.slice(0, 1),
16092
16147
  { label: "...", isCurrent: false },
16093
- ...items.slice(-maxItems + 1)
16094
- ] : items;
16148
+ ...sourceItems.slice(-maxItems + 1)
16149
+ ] : sourceItems;
16095
16150
  return /* @__PURE__ */ jsx(
16096
16151
  "nav",
16097
16152
  {
@@ -16101,7 +16156,7 @@ var init_Breadcrumb = __esm({
16101
16156
  const isLast = index === displayItems.length - 1;
16102
16157
  const isEllipsis = item.label === "...";
16103
16158
  return /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2", children: [
16104
- isEllipsis ? /* @__PURE__ */ jsx(Typography, { variant: "small", color: "muted", children: item.label }) : item.href || item.path ? /* @__PURE__ */ jsxs(
16159
+ isEllipsis ? /* @__PURE__ */ jsx(Typography, { variant: "small", color: "muted", children: item.label }) : (item.href || item.path) && !item.event && !fromNavStack ? /* @__PURE__ */ jsxs(
16105
16160
  "a",
16106
16161
  {
16107
16162
  href: item.href || item.path,
@@ -16127,7 +16182,12 @@ var init_Breadcrumb = __esm({
16127
16182
  {
16128
16183
  type: "button",
16129
16184
  onClick: () => {
16130
- if (item.event) eventBus.emit(`UI:${item.event}`, { label: item.label });
16185
+ const href = item.path ?? item.href;
16186
+ if (item.event) {
16187
+ eventBus.emit(`UI:${item.event}`, { label: item.label, href, index });
16188
+ } else if (fromNavStack && href) {
16189
+ navStack.goTo(href);
16190
+ }
16131
16191
  item.onClick?.();
16132
16192
  },
16133
16193
  className: cn(
@@ -18057,7 +18117,7 @@ var init_DrawShape = __esm({
18057
18117
  const cx = p.x + (node.offsetX ?? 0) * tw;
18058
18118
  const cy = p.y + (node.offsetY ?? 0) * tw;
18059
18119
  const rx = (node.radiusX ?? 0) * tw;
18060
- const ry = (node.radiusY ?? rx) * tw;
18120
+ const ry = (node.radiusY ?? node.radiusX ?? 0) * tw;
18061
18121
  if (pxFill) painter.fillEllipse(cx, cy, rx, ry, pxFill);
18062
18122
  if (patFill) painter.fillEllipse(cx, cy, rx, ry, patFill);
18063
18123
  if (pxStroke) painter.strokeEllipse(cx, cy, rx, ry, pxStroke, strokePx);
@@ -18247,6 +18307,172 @@ var init_DrawTextLayer = __esm({
18247
18307
  };
18248
18308
  }
18249
18309
  });
18310
+
18311
+ // components/game/molecules/DrawFxLayer.tsx
18312
+ function fxPosition(view, dim, ageSec) {
18313
+ const g = view.gravity ?? 0;
18314
+ const fall = 0.5 * g * ageSec * ageSec;
18315
+ {
18316
+ const base2 = view.position ?? { x: view.x, y: view.z ?? view.y ?? 0 };
18317
+ if (!Number.isFinite(base2.x) || !Number.isFinite(base2.y)) return void 0;
18318
+ return {
18319
+ x: base2.x + (view.vx ?? 0) * ageSec,
18320
+ y: base2.y + (view.vz ?? 0) * ageSec + fall
18321
+ };
18322
+ }
18323
+ }
18324
+ function sparkShape(view, pos, i, fade, progress) {
18325
+ const size = view.size ?? 0.5;
18326
+ const angle = fxHash01(view.id, i * 3) * Math.PI * 2;
18327
+ const dist = size * (0.4 + 0.6 * fxHash01(view.id, i * 3 + 1)) * easeOut2(progress);
18328
+ const r = size * (0.06 + 0.06 * fxHash01(view.id, i * 3 + 2));
18329
+ const color = view.color ?? DEFAULT_SPARK_COLOR;
18330
+ return {
18331
+ type: "draw-shape",
18332
+ shape: "ellipse",
18333
+ position: { ...pos, x: pos.x + Math.cos(angle) * dist, y: pos.y + Math.sin(angle) * dist },
18334
+ anchor: "center",
18335
+ radiusX: r,
18336
+ fill: color,
18337
+ blendMode: "lighter",
18338
+ opacity: fade,
18339
+ ...view.glow ? { shadow: { color, blur: view.glow } } : {}
18340
+ };
18341
+ }
18342
+ function proceduralShapes(view, pos, fade, progress) {
18343
+ const size = view.size ?? 0.5;
18344
+ const color = view.color ?? DEFAULT_SPARK_COLOR;
18345
+ switch (view.shape ?? "spark") {
18346
+ case "ring": {
18347
+ return [
18348
+ {
18349
+ type: "draw-shape",
18350
+ shape: "ellipse",
18351
+ position: pos,
18352
+ anchor: "center",
18353
+ radiusX: size * easeOut2(progress),
18354
+ stroke: view.color2 ?? color,
18355
+ strokeWidth: 2,
18356
+ blendMode: "lighter",
18357
+ opacity: fade,
18358
+ ...view.glow ? { shadow: { color, blur: view.glow } } : {}
18359
+ }
18360
+ ];
18361
+ }
18362
+ case "puff": {
18363
+ const count = view.count ?? 3;
18364
+ return Array.from({ length: count }, (_, i) => {
18365
+ const angle = fxHash01(view.id, i * 5) * Math.PI * 2;
18366
+ const drift = size * 0.3 * fxHash01(view.id, i * 5 + 1) * easeOut2(progress);
18367
+ return {
18368
+ type: "draw-shape",
18369
+ shape: "ellipse",
18370
+ position: { ...pos, x: pos.x + Math.cos(angle) * drift, y: pos.y + Math.sin(angle) * drift },
18371
+ anchor: "center",
18372
+ radiusX: size * (0.15 + 0.35 * progress) * (0.7 + 0.6 * fxHash01(view.id, i * 5 + 2)),
18373
+ fill: i === 0 && view.color2 ? view.color2 : color,
18374
+ opacity: fade * 0.6,
18375
+ ...view.glow ? { shadow: { color, blur: view.glow } } : {}
18376
+ };
18377
+ });
18378
+ }
18379
+ case "streak": {
18380
+ const count = view.count ?? 5;
18381
+ return Array.from({ length: count }, (_, i) => {
18382
+ const angle = fxHash01(view.id, i * 3) * Math.PI * 2;
18383
+ const inner = size * (0.2 + 0.8 * easeOut2(progress)) * (0.6 + 0.4 * fxHash01(view.id, i * 3 + 1));
18384
+ const len = size * 0.35;
18385
+ return {
18386
+ type: "draw-shape",
18387
+ shape: "ellipse",
18388
+ position: pos,
18389
+ anchor: "center",
18390
+ offsetX: inner + len / 2,
18391
+ offsetY: 0,
18392
+ radiusX: len / 2,
18393
+ radiusY: size * 0.04,
18394
+ rotate: angle,
18395
+ fill: color,
18396
+ blendMode: "lighter",
18397
+ opacity: fade,
18398
+ ...view.glow ? { shadow: { color, blur: view.glow } } : {}
18399
+ };
18400
+ });
18401
+ }
18402
+ default: {
18403
+ const count = view.count ?? 6;
18404
+ return Array.from({ length: count }, (_, i) => sparkShape(view, pos, i, fade, progress));
18405
+ }
18406
+ }
18407
+ }
18408
+ function expandFxItem(view, node, epochNowMs, dim) {
18409
+ if (view.space === "screen") return [];
18410
+ const tickMs = node.tickMs ?? DEFAULT_TICK_MS;
18411
+ const { ageMs, progress, fade } = fxLifecycle(view, epochNowMs, tickMs);
18412
+ if (progress >= 1) return [];
18413
+ const pos = fxPosition(view, dim, ageMs / 1e3);
18414
+ if (!pos) return [];
18415
+ const out = [];
18416
+ const artItems = node.art?.[view.type]?.["idle"];
18417
+ const sprite = node.sprites?.[view.type];
18418
+ if (Array.isArray(artItems)) {
18419
+ out.push({
18420
+ type: "draw-group",
18421
+ position: pos,
18422
+ opacity: fade,
18423
+ ...view.size !== void 0 ? { scale: view.size } : {},
18424
+ items: artItems
18425
+ });
18426
+ } else if (sprite?.url) {
18427
+ const spriteSize = view.size ?? 0.6;
18428
+ out.push({
18429
+ type: "draw-sprite",
18430
+ position: pos,
18431
+ asset: sprite,
18432
+ anchor: "center",
18433
+ width: spriteSize,
18434
+ height: spriteSize,
18435
+ opacity: fade
18436
+ });
18437
+ } else {
18438
+ out.push(...proceduralShapes(view, pos, fade, progress));
18439
+ }
18440
+ if (view.message) {
18441
+ const text = {
18442
+ type: "draw-text",
18443
+ text: view.message,
18444
+ position: pos,
18445
+ offsetY: -(0.15 + 0.55 * progress),
18446
+ color: view.color ?? node.textColor ?? DEFAULT_TEXT_COLOR,
18447
+ opacity: fade
18448
+ };
18449
+ out.push(text);
18450
+ }
18451
+ return out;
18452
+ }
18453
+ function expandFxLayer(node, epochNowMs, dim) {
18454
+ if (!Array.isArray(node.items)) return [];
18455
+ const out = [];
18456
+ for (const item of node.items) {
18457
+ if (!item || typeof item.id !== "string") continue;
18458
+ out.push(...expandFxItem(resolveFxView(item, node.presets), node, epochNowMs, dim));
18459
+ }
18460
+ return out;
18461
+ }
18462
+ function DrawFxLayer(_props) {
18463
+ return null;
18464
+ }
18465
+ var DEFAULT_TICK_MS, DEFAULT_TEXT_COLOR, DEFAULT_SPARK_COLOR, easeOut2;
18466
+ var init_DrawFxLayer = __esm({
18467
+ "components/game/molecules/DrawFxLayer.tsx"() {
18468
+ "use client";
18469
+ init_fx();
18470
+ DEFAULT_TICK_MS = 500;
18471
+ DEFAULT_TEXT_COLOR = "#ffe066";
18472
+ DEFAULT_SPARK_COLOR = "#ffffff";
18473
+ easeOut2 = (t) => 1 - (1 - t) * (1 - t);
18474
+ }
18475
+ });
18250
18476
  function paintDrawable(painter, node, dctx) {
18251
18477
  switch (node.type) {
18252
18478
  case "draw-sprite":
@@ -18294,6 +18520,11 @@ function paintDrawable(painter, node, dctx) {
18294
18520
  case "draw-text-layer":
18295
18521
  paintTextLayer(painter, node, dctx);
18296
18522
  break;
18523
+ case "draw-fx-layer": {
18524
+ const epochNow = dctx.time > 0 && typeof performance !== "undefined" ? performance.timeOrigin + dctx.time : 0;
18525
+ for (const child of expandFxLayer(node, epochNow, "2d")) paintDrawable(painter, child, dctx);
18526
+ break;
18527
+ }
18297
18528
  }
18298
18529
  }
18299
18530
  var paint2dLog, warnedUnsupported2d, warnUnsupported2d;
@@ -18308,6 +18539,7 @@ var init_paintDispatch = __esm({
18308
18539
  init_DrawSpriteLayer();
18309
18540
  init_DrawShapeLayer();
18310
18541
  init_DrawTextLayer();
18542
+ init_DrawFxLayer();
18311
18543
  paint2dLog = createLogger("almadar:ui:drawable-2d");
18312
18544
  warnedUnsupported2d = /* @__PURE__ */ new Set();
18313
18545
  warnUnsupported2d = (kind) => {
@@ -18556,6 +18788,7 @@ function Canvas2D({
18556
18788
  return isAnimatedGroup(node) || Array.isArray(node.items) && node.items.some(drawableIsAnimated);
18557
18789
  if (node.type === "draw-shape-layer") return Array.isArray(node.items) && node.items.some(isAnimatedShape);
18558
18790
  if (node.type === "draw-sprite-layer") return Array.isArray(node.items) && node.items.some(isAnimatedSprite);
18791
+ if (node.type === "draw-fx-layer") return Array.isArray(node.items) && node.items.length > 0;
18559
18792
  return false;
18560
18793
  };
18561
18794
  const animRafRef = useRef(0);
@@ -26478,6 +26711,196 @@ var init_PageTransition = __esm({
26478
26711
  PageTransition.displayName = "PageTransition";
26479
26712
  }
26480
26713
  });
26714
+ function ConfettiBurst({ item, lifeMs }) {
26715
+ const particles = createConfettiParticles(item.particleCount ?? 30, item.id);
26716
+ const left = (item.x ?? 0.5) * 100;
26717
+ const top = (item.z ?? item.y ?? 0.4) * 100;
26718
+ return /* @__PURE__ */ jsx(Box, { position: "absolute", style: { left: `${left}%`, top: `${top}%` }, children: particles.map((p) => {
26719
+ const rad = p.angle * Math.PI / 180;
26720
+ const tx = Math.cos(rad) * p.distance * (item.size ?? 1);
26721
+ const ty = Math.sin(rad) * p.distance * (item.size ?? 1) - 20;
26722
+ return /* @__PURE__ */ jsx(
26723
+ Box,
26724
+ {
26725
+ className: "absolute rounded-sm",
26726
+ style: {
26727
+ left: (p.left - 50) * 2,
26728
+ top: -10,
26729
+ width: p.size,
26730
+ height: p.size,
26731
+ backgroundColor: item.color ?? p.color,
26732
+ animation: `confetti-burst ${Math.max(lifeMs - p.delay, 200)}ms ease-out ${p.delay}ms forwards`,
26733
+ opacity: 0,
26734
+ "--confetti-tx": `${tx}px`,
26735
+ "--confetti-ty": `${ty}px`,
26736
+ "--confetti-rotate": `${p.rotation}deg`
26737
+ }
26738
+ },
26739
+ p.id
26740
+ );
26741
+ }) });
26742
+ }
26743
+ function SparkleBurst({ item, lifeMs }) {
26744
+ const count = item.particleCount ?? 8;
26745
+ const scale = item.size ?? 1;
26746
+ const left = (item.x ?? 0.5) * 100;
26747
+ const top = (item.z ?? item.y ?? 0.4) * 100;
26748
+ return /* @__PURE__ */ jsx(Box, { position: "absolute", style: { left: `${left}%`, top: `${top}%` }, children: Array.from({ length: count }, (_, i) => {
26749
+ const dx = (fxHash01(item.id, i * 4) - 0.5) * 160 * scale;
26750
+ const dy = (fxHash01(item.id, i * 4 + 1) - 0.5) * 120 * scale;
26751
+ const dot = (4 + fxHash01(item.id, i * 4 + 2) * 5) * scale;
26752
+ const delay = fxHash01(item.id, i * 4 + 3) * lifeMs * 0.4;
26753
+ return /* @__PURE__ */ jsx(
26754
+ Box,
26755
+ {
26756
+ className: "absolute rounded-full",
26757
+ style: {
26758
+ left: dx,
26759
+ top: dy,
26760
+ width: dot,
26761
+ height: dot,
26762
+ backgroundColor: item.color ?? "gold",
26763
+ opacity: 0,
26764
+ animation: `fx-overlay-sparkle ${Math.max(lifeMs - delay, 200)}ms ease-in-out ${delay}ms forwards`
26765
+ }
26766
+ },
26767
+ i
26768
+ );
26769
+ }) });
26770
+ }
26771
+ function OverlayFxNode({ item, tickMs }) {
26772
+ const lifeMs = lifeMsOf(item, tickMs);
26773
+ switch (item.effect ?? "sparkle") {
26774
+ case "confetti":
26775
+ return /* @__PURE__ */ jsx(ConfettiBurst, { item, lifeMs });
26776
+ case "flash":
26777
+ return /* @__PURE__ */ jsx(
26778
+ Box,
26779
+ {
26780
+ position: "absolute",
26781
+ className: "inset-0",
26782
+ style: {
26783
+ backgroundColor: item.color ?? "#ffffff",
26784
+ opacity: 0,
26785
+ animation: `fx-overlay-flash ${lifeMs}ms ease-out forwards`
26786
+ }
26787
+ }
26788
+ );
26789
+ case "streak-glow":
26790
+ return /* @__PURE__ */ jsx(
26791
+ Box,
26792
+ {
26793
+ position: "absolute",
26794
+ className: "inset-0",
26795
+ style: {
26796
+ boxShadow: `inset 0 0 ${60 * (item.size ?? 1)}px ${item.color ?? "var(--color-warning)"}`,
26797
+ opacity: 0,
26798
+ animation: `fx-overlay-glow ${lifeMs}ms ease-in-out forwards`
26799
+ }
26800
+ }
26801
+ );
26802
+ case "float-text": {
26803
+ if (!item.message) return null;
26804
+ return /* @__PURE__ */ jsx(
26805
+ Box,
26806
+ {
26807
+ position: "absolute",
26808
+ style: {
26809
+ left: `${(item.x ?? 0.5) * 100}%`,
26810
+ top: `${(item.z ?? item.y ?? 0.4) * 100}%`,
26811
+ color: item.color ?? "var(--color-success)",
26812
+ fontWeight: 700,
26813
+ fontSize: 16 * (item.size ?? 1),
26814
+ textShadow: "0 1px 2px rgba(0,0,0,0.4)",
26815
+ opacity: 0,
26816
+ animation: `fx-overlay-float ${lifeMs}ms ease-out forwards`,
26817
+ whiteSpace: "nowrap"
26818
+ },
26819
+ children: item.message
26820
+ }
26821
+ );
26822
+ }
26823
+ case "shake":
26824
+ return null;
26825
+ default:
26826
+ return /* @__PURE__ */ jsx(SparkleBurst, { item, lifeMs });
26827
+ }
26828
+ }
26829
+ var DEFAULT_TICK_MS2, FX_OVERLAY_KEYFRAMES, lifeMsOf, FxOverlay;
26830
+ var init_FxOverlay = __esm({
26831
+ "components/core/molecules/FxOverlay.tsx"() {
26832
+ "use client";
26833
+ init_cn();
26834
+ init_Box();
26835
+ init_fx();
26836
+ DEFAULT_TICK_MS2 = 500;
26837
+ FX_OVERLAY_KEYFRAMES = `
26838
+ ${CONFETTI_BURST_KEYFRAMES}
26839
+ @keyframes fx-overlay-flash {
26840
+ 0% { opacity: 0.75; }
26841
+ 100% { opacity: 0; }
26842
+ }
26843
+ @keyframes fx-overlay-glow {
26844
+ 0% { opacity: 0.9; }
26845
+ 60% { opacity: 0.6; }
26846
+ 100% { opacity: 0; }
26847
+ }
26848
+ @keyframes fx-overlay-sparkle {
26849
+ 0% { opacity: 0; transform: scale(0); }
26850
+ 30% { opacity: 1; transform: scale(1); }
26851
+ 100% { opacity: 0; transform: scale(0.3); }
26852
+ }
26853
+ @keyframes fx-overlay-float {
26854
+ 0% { opacity: 0; transform: translate(-50%, 8px); }
26855
+ 15% { opacity: 1; }
26856
+ 100% { opacity: 0; transform: translate(-50%, -40px); }
26857
+ }
26858
+ @keyframes fx-overlay-shake {
26859
+ 0% { transform: translateX(0); }
26860
+ 15% { transform: translateX(-6px); }
26861
+ 30% { transform: translateX(5px); }
26862
+ 45% { transform: translateX(-4px); }
26863
+ 60% { transform: translateX(3px); }
26864
+ 75% { transform: translateX(-2px); }
26865
+ 100% { transform: translateX(0); }
26866
+ }
26867
+ `;
26868
+ lifeMsOf = (it, tickMs) => Math.max(it.maxTtl ?? it.ttl, it.ttl, 1) * tickMs;
26869
+ FxOverlay = ({ items, tickMs = DEFAULT_TICK_MS2, children, className }) => {
26870
+ const screenItems = (Array.isArray(items) ? items : []).filter(
26871
+ (it) => Boolean(it) && typeof it.id === "string" && it.space !== "world"
26872
+ );
26873
+ const shakeItem = [...screenItems].reverse().find((it) => it.effect === "shake");
26874
+ const overlay = /* @__PURE__ */ jsxs(
26875
+ Box,
26876
+ {
26877
+ position: "absolute",
26878
+ className: cn("inset-0 pointer-events-none overflow-hidden z-50", !children && className),
26879
+ "aria-hidden": "true",
26880
+ children: [
26881
+ screenItems.map((it) => /* @__PURE__ */ jsx(OverlayFxNode, { item: it, tickMs }, it.id)),
26882
+ /* @__PURE__ */ jsx("style", { children: FX_OVERLAY_KEYFRAMES })
26883
+ ]
26884
+ }
26885
+ );
26886
+ if (children !== void 0 && children !== null) {
26887
+ return /* @__PURE__ */ jsxs(Box, { position: "relative", className, children: [
26888
+ /* @__PURE__ */ jsx(
26889
+ Box,
26890
+ {
26891
+ style: shakeItem ? { animation: `fx-overlay-shake ${Math.min(lifeMsOf(shakeItem, tickMs), 600)}ms ease-in-out` } : void 0,
26892
+ children
26893
+ },
26894
+ shakeItem?.id ?? "steady"
26895
+ ),
26896
+ overlay
26897
+ ] });
26898
+ }
26899
+ return overlay;
26900
+ };
26901
+ FxOverlay.displayName = "FxOverlay";
26902
+ }
26903
+ });
26481
26904
  function computePopoverStyle(position, triggerRect, popoverWidth) {
26482
26905
  if (position === "left" || position === "right") {
26483
26906
  return {
@@ -31167,7 +31590,7 @@ var init_MathCanvas = __esm({
31167
31590
  x: mapX((first.x + last.x) / 2),
31168
31591
  y: (mapY(region.samples[mid].y) + mapY(baseline)) / 2,
31169
31592
  text: region.label,
31170
- color: "#111827",
31593
+ color,
31171
31594
  fontSize: 11
31172
31595
  });
31173
31596
  }
@@ -31200,14 +31623,14 @@ var init_MathCanvas = __esm({
31200
31623
  const px = mapX(guide.at);
31201
31624
  out.push({ type: "line", x1: px, y1: margin, x2: px, y2: height - margin, color, dash });
31202
31625
  if (guide.label) {
31203
- out.push({ type: "text", x: px + 4, y: margin + 10, text: guide.label, color: "#111827", fontSize: 11 });
31626
+ out.push({ type: "text", x: px + 4, y: margin + 10, text: guide.label, color, fontSize: 11 });
31204
31627
  }
31205
31628
  } else {
31206
31629
  if (guide.at < yMin || guide.at > yMax) continue;
31207
31630
  const py = mapY(guide.at);
31208
31631
  out.push({ type: "line", x1: margin, y1: py, x2: width - margin, y2: py, color, dash });
31209
31632
  if (guide.label) {
31210
- out.push({ type: "text", x: width - margin - 4, y: py - 8, text: guide.label, color: "#111827", fontSize: 11, align: "right" });
31633
+ out.push({ type: "text", x: width - margin - 4, y: py - 8, text: guide.label, color, fontSize: 11, align: "right" });
31211
31634
  }
31212
31635
  }
31213
31636
  }
@@ -31273,7 +31696,7 @@ var init_MathCanvas = __esm({
31273
31696
  x: (x1 + x2) / 2,
31274
31697
  y: xAxisY - peak - 8,
31275
31698
  text: hop.label,
31276
- color: "#111827",
31699
+ color,
31277
31700
  fontSize: 10,
31278
31701
  align: "center"
31279
31702
  });
@@ -31300,7 +31723,7 @@ var init_MathCanvas = __esm({
31300
31723
  x: mapX(angle.x + 1.35 * radius * Math.cos(rad)),
31301
31724
  y: mapY(angle.y + 1.35 * radius * Math.sin(rad)),
31302
31725
  text: angle.label,
31303
- color: "#111827",
31726
+ color,
31304
31727
  fontSize: 11,
31305
31728
  align: "center"
31306
31729
  });
@@ -31318,7 +31741,7 @@ var init_MathCanvas = __esm({
31318
31741
  fill: isOpen ? "#ffffff" : p.color ?? "#dc2626"
31319
31742
  });
31320
31743
  if (p.label) {
31321
- out.push({ type: "text", x: mapX(p.x) + 8, y: mapY(p.y) - 8, text: p.label, color: "#111827", fontSize: 12 });
31744
+ out.push({ type: "text", x: mapX(p.x) + 8, y: mapY(p.y) - 8, text: p.label, color: p.color ?? "#111827", fontSize: 12 });
31322
31745
  }
31323
31746
  }
31324
31747
  for (const v of vectors) {
@@ -31329,7 +31752,7 @@ var init_MathCanvas = __esm({
31329
31752
  const y2 = mapY(v.y + v.vy);
31330
31753
  out.push({ type: "arrow", x1, y1, x2, y2, color: v.color ?? "#7c3aed", lineWidth: 2 });
31331
31754
  if (v.label) {
31332
- out.push({ type: "text", x: x2 + 6, y: y2 - 6, text: v.label, color: "#111827", fontSize: 12 });
31755
+ out.push({ type: "text", x: x2 + 6, y: y2 - 6, text: v.label, color: v.color ?? "#7c3aed", fontSize: 12 });
31333
31756
  }
31334
31757
  }
31335
31758
  out.push(...shapes);
@@ -42305,6 +42728,7 @@ var init_molecules2 = __esm({
42305
42728
  init_Menu();
42306
42729
  init_Modal();
42307
42730
  init_PageTransition();
42731
+ init_FxOverlay();
42308
42732
  init_Pagination();
42309
42733
  init_Popover();
42310
42734
  init_Coachmark();
@@ -43104,6 +43528,7 @@ var init_DetailPanel = __esm({
43104
43528
  init_Box();
43105
43529
  init_Stack();
43106
43530
  init_SimpleGrid();
43531
+ init_Menu();
43107
43532
  init_LoadingState();
43108
43533
  init_ErrorState();
43109
43534
  init_EmptyState();
@@ -43121,6 +43546,7 @@ var init_DetailPanel = __esm({
43121
43546
  avatar,
43122
43547
  sections: propSections,
43123
43548
  actions,
43549
+ maxInlineActions,
43124
43550
  backAction,
43125
43551
  footer,
43126
43552
  slideOver = false,
@@ -43355,7 +43781,7 @@ var init_DetailPanel = __esm({
43355
43781
  }
43356
43782
  ) }),
43357
43783
  /* @__PURE__ */ jsxs(HStack, { justify: "end", align: "center", gap: "xs", children: [
43358
- otherActions.map((action, idx) => /* @__PURE__ */ jsx(
43784
+ (maxInlineActions != null ? otherActions.slice(0, maxInlineActions) : otherActions).map((action, idx) => /* @__PURE__ */ jsx(
43359
43785
  Button,
43360
43786
  {
43361
43787
  variant: action.variant || "secondary",
@@ -43370,6 +43796,22 @@ var init_DetailPanel = __esm({
43370
43796
  },
43371
43797
  idx
43372
43798
  )),
43799
+ maxInlineActions != null && otherActions.length > maxInlineActions && /* @__PURE__ */ jsx(
43800
+ Menu,
43801
+ {
43802
+ position: "bottom-end",
43803
+ trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
43804
+ items: otherActions.slice(maxInlineActions).map((action) => ({
43805
+ // ONE firing path: onClick → handleActionClick (emits with
43806
+ // the {id, row} payload). Passing `event` too would make
43807
+ // Menu emit a second, payload-less copy of the same event.
43808
+ label: action.label,
43809
+ icon: action.icon,
43810
+ variant: action.variant === "danger" ? "danger" : "default",
43811
+ onClick: () => handleActionClick(action, normalizedData)
43812
+ }))
43813
+ }
43814
+ ),
43373
43815
  /* @__PURE__ */ jsx(
43374
43816
  Button,
43375
43817
  {
@@ -49226,6 +49668,7 @@ var init_component_registry_generated = __esm({
49226
49668
  init_DocSidebar();
49227
49669
  init_DocTOC();
49228
49670
  init_DocumentViewer();
49671
+ init_DrawFxLayer();
49229
49672
  init_DrawGroup();
49230
49673
  init_DrawMesh();
49231
49674
  init_DrawShape();
@@ -49256,6 +49699,7 @@ var init_component_registry_generated = __esm({
49256
49699
  init_FormField();
49257
49700
  init_FormSection();
49258
49701
  init_FormSectionHeader();
49702
+ init_FxOverlay();
49259
49703
  init_GameAudioToggle();
49260
49704
  init_GameHud();
49261
49705
  init_GameIcon();
@@ -49496,6 +49940,7 @@ var init_component_registry_generated = __esm({
49496
49940
  "DocSidebar": DocSidebar,
49497
49941
  "DocTOC": DocTOC,
49498
49942
  "DocumentViewer": DocumentViewer,
49943
+ "DrawFxLayer": DrawFxLayer,
49499
49944
  "DrawGroup": DrawGroup,
49500
49945
  "DrawMesh": DrawMesh,
49501
49946
  "DrawShape": DrawShape,
@@ -49526,6 +49971,7 @@ var init_component_registry_generated = __esm({
49526
49971
  "FormField": FormField,
49527
49972
  "FormLayout": FormLayout,
49528
49973
  "FormSectionHeader": FormSectionHeader,
49974
+ "FxOverlay": FxOverlay,
49529
49975
  "GameAudioToggle": GameAudioToggle,
49530
49976
  "GameHud": GameHud,
49531
49977
  "GameIcon": GameIcon,
@@ -53201,4 +53647,4 @@ function useGitHubBranches(owner, repo, enabled = true) {
53201
53647
  });
53202
53648
  }
53203
53649
 
53204
- export { ALL_PRESETS, ALMADAR_DND_MIME, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, Card2 as ActionCard, ActionPalette, ActionTile, ActivationBlock, Alert, AlgoGraphCanvas, AlgorithmCanvas, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AssetPicker, AtlasImage, AtlasPanel, AuthLayout, Avatar, Badge, BehaviorView, BiologyCanvas, BloomQuizBlock, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, Button, ButtonGroup, CTABanner, CalendarGrid, Canvas, Canvas2D, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, Center, Chart, ChartLegend, ChatBar, Checkbox, ChemistryCanvas, ChoiceButton, Coachmark, CodeBlock, CodeRunnerPanel, CollapsibleSection, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, ConnectionBlock, Container, ContentRenderer, ContentSection, ControlButton, ControlGrid, CounterTemplate, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DEFAULT_SLOTS, DIAMOND_TOP_Y, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DetailPanel, Dialog, DialogueBubble, Divider, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, ELEMENT_SELECTED_EVENT, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmojiPicker, EmptyState, EntityDisplayEvents, ErrorBoundary, ErrorState, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioToggle, GameHud, GameIcon, GameMenu, GameShell, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, HStack, Header, HealthBar, HeroOrganism, HeroSection, I18nProvider, IDENTITY_BOOK_FIELDS, Icon, IconPicker, ImportPreviewTree, ImportProgress, ImportSourcePicker, InfiniteScrollSentinel, Input, InputGroup, InstallBox, JazariStateMachine, JsonTreeEditor, Label, LandingPageTemplate, LawReferenceTooltip, LearningCanvas, LearningScene3D, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MathCanvas, MatrixQuestion, MediaGallery, Menu, Meter, Modal, ModalSlot, ModuleCard, Navigation, NodeSlotEditor, NotifyListener, NumberStepper, OnboardingSpotlight, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, PageTransition, Pagination, PatternTile, PhysicsCanvas, Popover, PositionedCanvas, Presence, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PropertyInspector, PullQuote, PullToRefresh, QrScanner, QuizBlock, Radio, RangeSlider, ReflectionBlock, RelationSelect, RepeatableFormSection, ReplyTree, RichBlockEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreDisplay, SearchInput, Section, SectionHeader, SegmentRenderer, Select, SequenceBar, ServiceCatalog, SharedEntityStoreContext, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateGraph, StateJsonView, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StepFlow, StepFlowOrganism, SubagentTracePanel, SvgBranch, SvgConnection, SvgFlow, SvgGrid, SvgLobe, SvgMesh, SvgMorph, SvgNode, SvgPulse, SvgRing, SvgShield, SvgStack, SwipeableRow, Switch, TERRAIN_COLORS, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, TableView, Tabs, TagCloud, TagInput, TeamCard, TeamOrganism, TerrainPalette, TextHighlight, Textarea, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UploadDropZone, VStack, VersionDiff, ViolationAlert, VoteStack, WizardContainer, WizardNavigation, WizardProgress, arrowBetween, billboardLabel, boardEntity, bool, calculateAttackTargets, calculateValidMoves, cn, createInitialGameState, createSharedEntityStore, createTranslate, createUnitAnimationState, cylinderBetween, get3DClickPayload, getCurrentFrame, getTileDimensions, inferDirection, isoToScreen, makeAsset, makeAssetMap, mapBookData, meshSphere, num, objAvailableActions, objAvailableEvents, objCurrentState, objIcon, objId, objMaxRules, objName, objRules, objStates, parseEditFocus, parseLessonSegments, parseMarkdownWithCodeBlocks, parseQueryBinding, pendulum, projectileMotion, registerCodeLanguageLoader, renderPatternValue, resolveFieldMap, resolveFrame, resolveSheetDirection, rows, runTickFrame, screenToIso, springOscillator, str, tickAnimationState, toCodeLanguage, transitionAnimation, unitHealth, unitPosition, unitTeam, useAgentChat, useAnchorRect, useAtlasSliceDataUrl, useAuthContext, useCamera, useCanvasGestures, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useDragReorder, useDraggable, useDropZone, useEmitEvent, useEventBus, useEventListener, useExtensions, useFileEditor, useFileSystem, useGameAudio, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useImageCache, useInfiniteScroll, useLongPress, useMediaQuery, useOrbitalHistory, usePresence, usePreview, usePullToRefresh, useQuerySingleton, useRenderInterpolation, useSharedEntitySnapshot, useSharedEntityStore, useSharedEntityStoreContext, useSwipeGesture, useTapReveal, useTraitListens, useTranslate114 as useTranslate, useUIEvents, useUISlotManager, useUnitSpriteAtlas, useValidation, vec2 };
53650
+ export { ALL_PRESETS, ALMADAR_DND_MIME, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, Card2 as ActionCard, ActionPalette, ActionTile, ActivationBlock, Alert, AlgoGraphCanvas, AlgorithmCanvas, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AssetPicker, AtlasImage, AtlasPanel, AuthLayout, Avatar, Badge, BehaviorView, BiologyCanvas, BloomQuizBlock, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, Button, ButtonGroup, CTABanner, CalendarGrid, Canvas, Canvas2D, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, Center, Chart, ChartLegend, ChatBar, Checkbox, ChemistryCanvas, ChoiceButton, Coachmark, CodeBlock, CodeRunnerPanel, CollapsibleSection, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, ConnectionBlock, Container, ContentRenderer, ContentSection, ControlButton, ControlGrid, CounterTemplate, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DEFAULT_SLOTS, DIAMOND_TOP_Y, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DetailPanel, Dialog, DialogueBubble, Divider, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, ELEMENT_SELECTED_EVENT, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmojiPicker, EmptyState, EntityDisplayEvents, ErrorBoundary, ErrorState, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, FxOverlay, GameAudioToggle, GameHud, GameIcon, GameMenu, GameShell, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, HStack, Header, HealthBar, HeroOrganism, HeroSection, I18nProvider, IDENTITY_BOOK_FIELDS, Icon, IconPicker, ImportPreviewTree, ImportProgress, ImportSourcePicker, InfiniteScrollSentinel, Input, InputGroup, InstallBox, JazariStateMachine, JsonTreeEditor, Label, LandingPageTemplate, LawReferenceTooltip, LearningCanvas, LearningScene3D, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MathCanvas, MatrixQuestion, MediaGallery, Menu, Meter, Modal, ModalSlot, ModuleCard, Navigation, NodeSlotEditor, NotifyListener, NumberStepper, OnboardingSpotlight, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, PageTransition, Pagination, PatternTile, PhysicsCanvas, Popover, PositionedCanvas, Presence, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PropertyInspector, PullQuote, PullToRefresh, QrScanner, QuizBlock, Radio, RangeSlider, ReflectionBlock, RelationSelect, RepeatableFormSection, ReplyTree, RichBlockEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreDisplay, SearchInput, Section, SectionHeader, SegmentRenderer, Select, SequenceBar, ServiceCatalog, SharedEntityStoreContext, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateGraph, StateJsonView, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StepFlow, StepFlowOrganism, SubagentTracePanel, SvgBranch, SvgConnection, SvgFlow, SvgGrid, SvgLobe, SvgMesh, SvgMorph, SvgNode, SvgPulse, SvgRing, SvgShield, SvgStack, SwipeableRow, Switch, TERRAIN_COLORS, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, TableView, Tabs, TagCloud, TagInput, TeamCard, TeamOrganism, TerrainPalette, TextHighlight, Textarea, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UploadDropZone, VStack, VersionDiff, ViolationAlert, VoteStack, WizardContainer, WizardNavigation, WizardProgress, arrowBetween, billboardLabel, boardEntity, bool, calculateAttackTargets, calculateValidMoves, cn, createInitialGameState, createSharedEntityStore, createTranslate, createUnitAnimationState, cylinderBetween, get3DClickPayload, getCurrentFrame, getTileDimensions, inferDirection, isoToScreen, makeAsset, makeAssetMap, mapBookData, meshSphere, num, objAvailableActions, objAvailableEvents, objCurrentState, objIcon, objId, objMaxRules, objName, objRules, objStates, parseEditFocus, parseLessonSegments, parseMarkdownWithCodeBlocks, parseQueryBinding, pendulum, projectileMotion, registerCodeLanguageLoader, renderPatternValue, resolveFieldMap, resolveFrame, resolveSheetDirection, rows, runTickFrame, screenToIso, springOscillator, str, tickAnimationState, toCodeLanguage, transitionAnimation, unitHealth, unitPosition, unitTeam, useAgentChat, useAnchorRect, useAtlasSliceDataUrl, useAuthContext, useCamera, useCanvasGestures, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useDragReorder, useDraggable, useDropZone, useEmitEvent, useEventBus, useEventListener, useExtensions, useFileEditor, useFileSystem, useGameAudio, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useImageCache, useInfiniteScroll, useLongPress, useMediaQuery, useOrbitalHistory, usePresence, usePreview, usePullToRefresh, useQuerySingleton, useRenderInterpolation, useSharedEntitySnapshot, useSharedEntityStore, useSharedEntityStoreContext, useSwipeGesture, useTapReveal, useTraitListens, useTranslate114 as useTranslate, useUIEvents, useUISlotManager, useUnitSpriteAtlas, useValidation, vec2 };