@almadar/ui 5.28.0 → 5.28.1

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.
@@ -1,7 +1,4 @@
1
1
  export { ErrorBoundary, type ErrorBoundaryProps } from './ErrorBoundary';
2
- export { ArrayEditor, type ArrayEditorProps } from './ArrayEditor';
3
- export { ObjectEditor, type ObjectEditorProps } from './ObjectEditor';
4
- export { MapEditor, type MapEditorProps } from './MapEditor';
5
2
  export { JsonTreeEditor, type JsonTreeEditorProps } from './JsonTreeEditor';
6
3
  export { FileTree, type FileTreeProps, type FileTreeNode } from './FileTree';
7
4
  export { FormField, type FormFieldProps } from './FormField';
@@ -22224,422 +22224,6 @@ var init_DataList = __esm({
22224
22224
  DataList.displayName = "DataList";
22225
22225
  }
22226
22226
  });
22227
- function isTraitConfigObject(v) {
22228
- return v !== null && typeof v === "object" && !Array.isArray(v);
22229
- }
22230
- function LeafControl({
22231
- value,
22232
- onChange
22233
- }) {
22234
- if (typeof value === "boolean") {
22235
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Switch, { checked: value, onChange: (c) => onChange(c) });
22236
- }
22237
- if (typeof value === "number") {
22238
- const [draft2, setDraft2] = React74__namespace.default.useState(String(value));
22239
- React74__namespace.default.useEffect(() => setDraft2(String(value)), [value]);
22240
- const commit2 = () => {
22241
- const n = draft2.trim() === "" ? 0 : Number(draft2);
22242
- onChange(Number.isNaN(n) ? 0 : n);
22243
- };
22244
- return /* @__PURE__ */ jsxRuntime.jsx(
22245
- exports.Input,
22246
- {
22247
- inputType: "number",
22248
- value: draft2,
22249
- onChange: (e) => setDraft2(e.target.value),
22250
- onBlur: commit2,
22251
- onKeyDown: (e) => {
22252
- if (e.key === "Enter") commit2();
22253
- }
22254
- }
22255
- );
22256
- }
22257
- if (isTraitConfigObject(value)) {
22258
- const [draft2, setDraft2] = React74__namespace.default.useState(JSON.stringify(value));
22259
- React74__namespace.default.useEffect(() => setDraft2(JSON.stringify(value)), [value]);
22260
- const commit2 = () => {
22261
- try {
22262
- const parsed = JSON.parse(draft2);
22263
- onChange(parsed);
22264
- } catch {
22265
- }
22266
- };
22267
- return /* @__PURE__ */ jsxRuntime.jsx(
22268
- exports.Input,
22269
- {
22270
- inputType: "text",
22271
- value: draft2,
22272
- onChange: (e) => setDraft2(e.target.value),
22273
- onBlur: commit2,
22274
- onKeyDown: (e) => {
22275
- if (e.key === "Enter") commit2();
22276
- }
22277
- }
22278
- );
22279
- }
22280
- if (Array.isArray(value)) {
22281
- const [draft2, setDraft2] = React74__namespace.default.useState(JSON.stringify(value));
22282
- React74__namespace.default.useEffect(() => setDraft2(JSON.stringify(value)), [value]);
22283
- const commit2 = () => {
22284
- try {
22285
- const parsed = JSON.parse(draft2);
22286
- onChange(parsed);
22287
- } catch {
22288
- }
22289
- };
22290
- return /* @__PURE__ */ jsxRuntime.jsx(
22291
- exports.Input,
22292
- {
22293
- inputType: "text",
22294
- value: draft2,
22295
- onChange: (e) => setDraft2(e.target.value),
22296
- onBlur: commit2,
22297
- onKeyDown: (e) => {
22298
- if (e.key === "Enter") commit2();
22299
- }
22300
- }
22301
- );
22302
- }
22303
- const strVal = value === null ? "" : String(value);
22304
- const [draft, setDraft] = React74__namespace.default.useState(strVal);
22305
- React74__namespace.default.useEffect(() => setDraft(value === null ? "" : String(value)), [value]);
22306
- const commit = () => {
22307
- onChange(draft);
22308
- };
22309
- return /* @__PURE__ */ jsxRuntime.jsx(
22310
- exports.Input,
22311
- {
22312
- inputType: "text",
22313
- value: draft,
22314
- onChange: (e) => setDraft(e.target.value),
22315
- onBlur: commit,
22316
- onKeyDown: (e) => {
22317
- if (e.key === "Enter") commit();
22318
- }
22319
- }
22320
- );
22321
- }
22322
- function cloneElement(template) {
22323
- if (isTraitConfigObject(template)) {
22324
- const blank = {};
22325
- for (const k of Object.keys(template)) blank[k] = null;
22326
- return blank;
22327
- }
22328
- if (Array.isArray(template)) return [];
22329
- if (typeof template === "boolean") return false;
22330
- if (typeof template === "number") return 0;
22331
- return "";
22332
- }
22333
- exports.ArrayEditor = void 0;
22334
- var init_ArrayEditor = __esm({
22335
- "components/core/molecules/ArrayEditor.tsx"() {
22336
- "use client";
22337
- init_Stack();
22338
- init_Button();
22339
- init_Switch();
22340
- init_Input();
22341
- init_cn();
22342
- exports.ArrayEditor = ({ value, onChange, className }) => {
22343
- const arr = value;
22344
- const update = (idx, next) => {
22345
- const copy = [...arr];
22346
- copy[idx] = next;
22347
- onChange(copy);
22348
- };
22349
- const remove = (idx) => {
22350
- onChange(arr.filter((_, i) => i !== idx));
22351
- };
22352
- const add = () => {
22353
- const template = arr.length > 0 ? arr[0] : "";
22354
- onChange([...arr, cloneElement(template)]);
22355
- };
22356
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "xs", className: cn("w-full", className), children: [
22357
- arr.map((elem, idx) => /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
22358
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(LeafControl, { value: elem, onChange: (next) => update(idx, next) }) }),
22359
- /* @__PURE__ */ jsxRuntime.jsx(
22360
- exports.Button,
22361
- {
22362
- variant: "ghost",
22363
- size: "sm",
22364
- icon: "trash-2",
22365
- onClick: () => remove(idx),
22366
- "aria-label": "Remove item"
22367
- }
22368
- )
22369
- ] }, idx)),
22370
- /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", size: "sm", icon: "plus", label: "Add item", onClick: add })
22371
- ] });
22372
- };
22373
- }
22374
- });
22375
- function isTraitConfigObject2(v) {
22376
- return v !== null && typeof v === "object" && !Array.isArray(v);
22377
- }
22378
- function ScalarControl({
22379
- fieldKey,
22380
- value,
22381
- onFieldChange
22382
- }) {
22383
- if (typeof value === "boolean") {
22384
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Switch, { checked: value, onChange: (c) => onFieldChange(fieldKey, c) });
22385
- }
22386
- if (typeof value === "number") {
22387
- const [draft2, setDraft2] = React74__namespace.default.useState(String(value));
22388
- React74__namespace.default.useEffect(() => setDraft2(String(value)), [value]);
22389
- const commit2 = () => {
22390
- const n = draft2.trim() === "" ? 0 : Number(draft2);
22391
- onFieldChange(fieldKey, Number.isNaN(n) ? 0 : n);
22392
- };
22393
- return /* @__PURE__ */ jsxRuntime.jsx(
22394
- exports.Input,
22395
- {
22396
- inputType: "number",
22397
- value: draft2,
22398
- onChange: (e) => setDraft2(e.target.value),
22399
- onBlur: commit2,
22400
- onKeyDown: (e) => {
22401
- if (e.key === "Enter") commit2();
22402
- }
22403
- }
22404
- );
22405
- }
22406
- if (isTraitConfigObject2(value)) {
22407
- const [draft2, setDraft2] = React74__namespace.default.useState(JSON.stringify(value));
22408
- React74__namespace.default.useEffect(() => setDraft2(JSON.stringify(value)), [value]);
22409
- const commit2 = () => {
22410
- try {
22411
- onFieldChange(fieldKey, JSON.parse(draft2));
22412
- } catch {
22413
- }
22414
- };
22415
- return /* @__PURE__ */ jsxRuntime.jsx(
22416
- exports.Input,
22417
- {
22418
- inputType: "text",
22419
- value: draft2,
22420
- onChange: (e) => setDraft2(e.target.value),
22421
- onBlur: commit2,
22422
- onKeyDown: (e) => {
22423
- if (e.key === "Enter") commit2();
22424
- }
22425
- }
22426
- );
22427
- }
22428
- if (Array.isArray(value)) {
22429
- const [draft2, setDraft2] = React74__namespace.default.useState(JSON.stringify(value));
22430
- React74__namespace.default.useEffect(() => setDraft2(JSON.stringify(value)), [value]);
22431
- const commit2 = () => {
22432
- try {
22433
- onFieldChange(fieldKey, JSON.parse(draft2));
22434
- } catch {
22435
- }
22436
- };
22437
- return /* @__PURE__ */ jsxRuntime.jsx(
22438
- exports.Input,
22439
- {
22440
- inputType: "text",
22441
- value: draft2,
22442
- onChange: (e) => setDraft2(e.target.value),
22443
- onBlur: commit2,
22444
- onKeyDown: (e) => {
22445
- if (e.key === "Enter") commit2();
22446
- }
22447
- }
22448
- );
22449
- }
22450
- const [draft, setDraft] = React74__namespace.default.useState(value === null ? "" : String(value));
22451
- React74__namespace.default.useEffect(() => setDraft(value === null ? "" : String(value)), [value]);
22452
- const commit = () => {
22453
- onFieldChange(fieldKey, draft);
22454
- };
22455
- return /* @__PURE__ */ jsxRuntime.jsx(
22456
- exports.Input,
22457
- {
22458
- inputType: "text",
22459
- value: draft,
22460
- onChange: (e) => setDraft(e.target.value),
22461
- onBlur: commit,
22462
- onKeyDown: (e) => {
22463
- if (e.key === "Enter") commit();
22464
- }
22465
- }
22466
- );
22467
- }
22468
- exports.ObjectEditor = void 0;
22469
- var init_ObjectEditor = __esm({
22470
- "components/core/molecules/ObjectEditor.tsx"() {
22471
- "use client";
22472
- init_Stack();
22473
- init_Typography();
22474
- init_Switch();
22475
- init_Input();
22476
- init_cn();
22477
- exports.ObjectEditor = ({ value, onChange, className }) => {
22478
- const entries = Object.entries(value);
22479
- const handleFieldChange = (k, next) => {
22480
- onChange({ ...value, [k]: next });
22481
- };
22482
- if (entries.length === 0) {
22483
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "muted", children: "Empty object" });
22484
- }
22485
- return /* @__PURE__ */ jsxRuntime.jsx(exports.VStack, { gap: "xs", className: cn("w-full", className), children: entries.map(([k, v]) => /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "sm", align: "center", children: [
22486
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-24 shrink-0 truncate", title: k, children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-muted-foreground", children: k }) }),
22487
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(ScalarControl, { fieldKey: k, value: v, onFieldChange: handleFieldChange }) })
22488
- ] }, k)) });
22489
- };
22490
- }
22491
- });
22492
- function isTraitConfigObject3(v) {
22493
- return v !== null && typeof v === "object" && !Array.isArray(v);
22494
- }
22495
- function ValueControl({
22496
- value,
22497
- onChange
22498
- }) {
22499
- if (typeof value === "boolean") {
22500
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Switch, { checked: value, onChange: (c) => onChange(c) });
22501
- }
22502
- if (typeof value === "number") {
22503
- const [draft2, setDraft2] = React74__namespace.default.useState(String(value));
22504
- React74__namespace.default.useEffect(() => setDraft2(String(value)), [value]);
22505
- const commit2 = () => {
22506
- const n = draft2.trim() === "" ? 0 : Number(draft2);
22507
- onChange(Number.isNaN(n) ? 0 : n);
22508
- };
22509
- return /* @__PURE__ */ jsxRuntime.jsx(
22510
- exports.Input,
22511
- {
22512
- inputType: "number",
22513
- value: draft2,
22514
- onChange: (e) => setDraft2(e.target.value),
22515
- onBlur: commit2,
22516
- onKeyDown: (e) => {
22517
- if (e.key === "Enter") commit2();
22518
- }
22519
- }
22520
- );
22521
- }
22522
- if (isTraitConfigObject3(value) || Array.isArray(value)) {
22523
- const [draft2, setDraft2] = React74__namespace.default.useState(JSON.stringify(value));
22524
- React74__namespace.default.useEffect(() => setDraft2(JSON.stringify(value)), [value]);
22525
- const commit2 = () => {
22526
- try {
22527
- onChange(JSON.parse(draft2));
22528
- } catch {
22529
- }
22530
- };
22531
- return /* @__PURE__ */ jsxRuntime.jsx(
22532
- exports.Input,
22533
- {
22534
- inputType: "text",
22535
- value: draft2,
22536
- onChange: (e) => setDraft2(e.target.value),
22537
- onBlur: commit2,
22538
- onKeyDown: (e) => {
22539
- if (e.key === "Enter") commit2();
22540
- }
22541
- }
22542
- );
22543
- }
22544
- const [draft, setDraft] = React74__namespace.default.useState(value === null ? "" : String(value));
22545
- React74__namespace.default.useEffect(() => setDraft(value === null ? "" : String(value)), [value]);
22546
- const commit = () => {
22547
- onChange(draft);
22548
- };
22549
- return /* @__PURE__ */ jsxRuntime.jsx(
22550
- exports.Input,
22551
- {
22552
- inputType: "text",
22553
- value: draft,
22554
- onChange: (e) => setDraft(e.target.value),
22555
- onBlur: commit,
22556
- onKeyDown: (e) => {
22557
- if (e.key === "Enter") commit();
22558
- }
22559
- }
22560
- );
22561
- }
22562
- function KeyInput({
22563
- currentKey,
22564
- onRename
22565
- }) {
22566
- const [draft, setDraft] = React74__namespace.default.useState(currentKey);
22567
- React74__namespace.default.useEffect(() => setDraft(currentKey), [currentKey]);
22568
- const commit = () => {
22569
- const trimmed = draft.trim();
22570
- if (trimmed !== "" && trimmed !== currentKey) onRename(trimmed);
22571
- else setDraft(currentKey);
22572
- };
22573
- return /* @__PURE__ */ jsxRuntime.jsx(
22574
- exports.Input,
22575
- {
22576
- inputType: "text",
22577
- value: draft,
22578
- onChange: (e) => setDraft(e.target.value),
22579
- onBlur: commit,
22580
- onKeyDown: (e) => {
22581
- if (e.key === "Enter") commit();
22582
- },
22583
- className: "w-24 shrink-0 font-mono text-xs",
22584
- placeholder: "key"
22585
- }
22586
- );
22587
- }
22588
- exports.MapEditor = void 0;
22589
- var init_MapEditor = __esm({
22590
- "components/core/molecules/MapEditor.tsx"() {
22591
- "use client";
22592
- init_Stack();
22593
- init_Button();
22594
- init_Input();
22595
- init_Switch();
22596
- init_cn();
22597
- exports.MapEditor = ({ value, onChange, className }) => {
22598
- const entries = Object.entries(value);
22599
- const updateKey = (oldKey, newKey) => {
22600
- const next = {};
22601
- for (const [k, v] of Object.entries(value)) {
22602
- next[k === oldKey ? newKey : k] = v;
22603
- }
22604
- onChange(next);
22605
- };
22606
- const updateValue = (k, next) => {
22607
- onChange({ ...value, [k]: next });
22608
- };
22609
- const remove = (k) => {
22610
- const next = { ...value };
22611
- delete next[k];
22612
- onChange(next);
22613
- };
22614
- const add = () => {
22615
- let key = "key";
22616
- let i = 1;
22617
- while (key in value) {
22618
- key = `key${i}`;
22619
- i++;
22620
- }
22621
- onChange({ ...value, [key]: "" });
22622
- };
22623
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "xs", className: cn("w-full", className), children: [
22624
- entries.map(([k, v]) => /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
22625
- /* @__PURE__ */ jsxRuntime.jsx(KeyInput, { currentKey: k, onRename: (newKey) => updateKey(k, newKey) }),
22626
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(ValueControl, { value: v, onChange: (next) => updateValue(k, next) }) }),
22627
- /* @__PURE__ */ jsxRuntime.jsx(
22628
- exports.Button,
22629
- {
22630
- variant: "ghost",
22631
- size: "sm",
22632
- icon: "trash-2",
22633
- onClick: () => remove(k),
22634
- "aria-label": "Remove entry"
22635
- }
22636
- )
22637
- ] }, k)),
22638
- /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", size: "sm", icon: "plus", label: "Add entry", onClick: add })
22639
- ] });
22640
- };
22641
- }
22642
- });
22643
22227
  function kindOf(v) {
22644
22228
  if (v === null) return "null";
22645
22229
  if (isArr(v)) return "array";
@@ -22675,7 +22259,7 @@ function templateFrom(arr) {
22675
22259
  if (isArr(first)) return [];
22676
22260
  return emptyOf(kindOf(first));
22677
22261
  }
22678
- function ScalarControl2({
22262
+ function ScalarControl({
22679
22263
  value,
22680
22264
  onChange
22681
22265
  }) {
@@ -22736,7 +22320,7 @@ function ValueNode({
22736
22320
  if (kind === "object" || kind === "array") {
22737
22321
  return /* @__PURE__ */ jsxRuntime.jsx(ContainerNode, { value, onChange, depth });
22738
22322
  }
22739
- return /* @__PURE__ */ jsxRuntime.jsx(ScalarControl2, { value, onChange });
22323
+ return /* @__PURE__ */ jsxRuntime.jsx(ScalarControl, { value, onChange });
22740
22324
  }
22741
22325
  function Row({
22742
22326
  rowKey,
@@ -35629,7 +35213,7 @@ function TextLikeControl({
35629
35213
  }
35630
35214
  );
35631
35215
  }
35632
- function isTraitConfigObject4(v) {
35216
+ function isTraitConfigObject(v) {
35633
35217
  return v !== null && v !== void 0 && typeof v === "object" && !Array.isArray(v);
35634
35218
  }
35635
35219
  function FieldControl({
@@ -35671,8 +35255,8 @@ function FieldControl({
35671
35255
  } else if (decl.type.startsWith("[") || Array.isArray(effectiveValue)) {
35672
35256
  const arr = Array.isArray(effectiveValue) ? effectiveValue : [];
35673
35257
  control = /* @__PURE__ */ jsxRuntime.jsx(exports.JsonTreeEditor, { value: arr, onChange: (next) => onChange(name, next) });
35674
- } else if (decl.type === "object" || decl.type.startsWith("Map ") || !SCALAR_TYPES.has(decl.type) && isTraitConfigObject4(effectiveValue)) {
35675
- const obj = isTraitConfigObject4(effectiveValue) ? effectiveValue : {};
35258
+ } else if (decl.type === "object" || decl.type.startsWith("Map ") || !SCALAR_TYPES.has(decl.type) && isTraitConfigObject(effectiveValue)) {
35259
+ const obj = isTraitConfigObject(effectiveValue) ? effectiveValue : {};
35676
35260
  control = /* @__PURE__ */ jsxRuntime.jsx(exports.JsonTreeEditor, { value: obj, onChange: (next) => onChange(name, next) });
35677
35261
  } else {
35678
35262
  control = /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { variant: "caption", color: "muted", children: [
@@ -37596,9 +37180,6 @@ var init_GraphCanvas = __esm({
37596
37180
  var init_molecules2 = __esm({
37597
37181
  "components/core/molecules/index.ts"() {
37598
37182
  init_ErrorBoundary();
37599
- init_ArrayEditor();
37600
- init_ObjectEditor();
37601
- init_MapEditor();
37602
37183
  init_JsonTreeEditor();
37603
37184
  init_FileTree();
37604
37185
  init_FormField();
@@ -22176,422 +22176,6 @@ var init_DataList = __esm({
22176
22176
  DataList.displayName = "DataList";
22177
22177
  }
22178
22178
  });
22179
- function isTraitConfigObject(v) {
22180
- return v !== null && typeof v === "object" && !Array.isArray(v);
22181
- }
22182
- function LeafControl({
22183
- value,
22184
- onChange
22185
- }) {
22186
- if (typeof value === "boolean") {
22187
- return /* @__PURE__ */ jsx(Switch, { checked: value, onChange: (c) => onChange(c) });
22188
- }
22189
- if (typeof value === "number") {
22190
- const [draft2, setDraft2] = React74__default.useState(String(value));
22191
- React74__default.useEffect(() => setDraft2(String(value)), [value]);
22192
- const commit2 = () => {
22193
- const n = draft2.trim() === "" ? 0 : Number(draft2);
22194
- onChange(Number.isNaN(n) ? 0 : n);
22195
- };
22196
- return /* @__PURE__ */ jsx(
22197
- Input,
22198
- {
22199
- inputType: "number",
22200
- value: draft2,
22201
- onChange: (e) => setDraft2(e.target.value),
22202
- onBlur: commit2,
22203
- onKeyDown: (e) => {
22204
- if (e.key === "Enter") commit2();
22205
- }
22206
- }
22207
- );
22208
- }
22209
- if (isTraitConfigObject(value)) {
22210
- const [draft2, setDraft2] = React74__default.useState(JSON.stringify(value));
22211
- React74__default.useEffect(() => setDraft2(JSON.stringify(value)), [value]);
22212
- const commit2 = () => {
22213
- try {
22214
- const parsed = JSON.parse(draft2);
22215
- onChange(parsed);
22216
- } catch {
22217
- }
22218
- };
22219
- return /* @__PURE__ */ jsx(
22220
- Input,
22221
- {
22222
- inputType: "text",
22223
- value: draft2,
22224
- onChange: (e) => setDraft2(e.target.value),
22225
- onBlur: commit2,
22226
- onKeyDown: (e) => {
22227
- if (e.key === "Enter") commit2();
22228
- }
22229
- }
22230
- );
22231
- }
22232
- if (Array.isArray(value)) {
22233
- const [draft2, setDraft2] = React74__default.useState(JSON.stringify(value));
22234
- React74__default.useEffect(() => setDraft2(JSON.stringify(value)), [value]);
22235
- const commit2 = () => {
22236
- try {
22237
- const parsed = JSON.parse(draft2);
22238
- onChange(parsed);
22239
- } catch {
22240
- }
22241
- };
22242
- return /* @__PURE__ */ jsx(
22243
- Input,
22244
- {
22245
- inputType: "text",
22246
- value: draft2,
22247
- onChange: (e) => setDraft2(e.target.value),
22248
- onBlur: commit2,
22249
- onKeyDown: (e) => {
22250
- if (e.key === "Enter") commit2();
22251
- }
22252
- }
22253
- );
22254
- }
22255
- const strVal = value === null ? "" : String(value);
22256
- const [draft, setDraft] = React74__default.useState(strVal);
22257
- React74__default.useEffect(() => setDraft(value === null ? "" : String(value)), [value]);
22258
- const commit = () => {
22259
- onChange(draft);
22260
- };
22261
- return /* @__PURE__ */ jsx(
22262
- Input,
22263
- {
22264
- inputType: "text",
22265
- value: draft,
22266
- onChange: (e) => setDraft(e.target.value),
22267
- onBlur: commit,
22268
- onKeyDown: (e) => {
22269
- if (e.key === "Enter") commit();
22270
- }
22271
- }
22272
- );
22273
- }
22274
- function cloneElement(template) {
22275
- if (isTraitConfigObject(template)) {
22276
- const blank = {};
22277
- for (const k of Object.keys(template)) blank[k] = null;
22278
- return blank;
22279
- }
22280
- if (Array.isArray(template)) return [];
22281
- if (typeof template === "boolean") return false;
22282
- if (typeof template === "number") return 0;
22283
- return "";
22284
- }
22285
- var ArrayEditor;
22286
- var init_ArrayEditor = __esm({
22287
- "components/core/molecules/ArrayEditor.tsx"() {
22288
- "use client";
22289
- init_Stack();
22290
- init_Button();
22291
- init_Switch();
22292
- init_Input();
22293
- init_cn();
22294
- ArrayEditor = ({ value, onChange, className }) => {
22295
- const arr = value;
22296
- const update = (idx, next) => {
22297
- const copy = [...arr];
22298
- copy[idx] = next;
22299
- onChange(copy);
22300
- };
22301
- const remove = (idx) => {
22302
- onChange(arr.filter((_, i) => i !== idx));
22303
- };
22304
- const add = () => {
22305
- const template = arr.length > 0 ? arr[0] : "";
22306
- onChange([...arr, cloneElement(template)]);
22307
- };
22308
- return /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: cn("w-full", className), children: [
22309
- arr.map((elem, idx) => /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
22310
- /* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsx(LeafControl, { value: elem, onChange: (next) => update(idx, next) }) }),
22311
- /* @__PURE__ */ jsx(
22312
- Button,
22313
- {
22314
- variant: "ghost",
22315
- size: "sm",
22316
- icon: "trash-2",
22317
- onClick: () => remove(idx),
22318
- "aria-label": "Remove item"
22319
- }
22320
- )
22321
- ] }, idx)),
22322
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", icon: "plus", label: "Add item", onClick: add })
22323
- ] });
22324
- };
22325
- }
22326
- });
22327
- function isTraitConfigObject2(v) {
22328
- return v !== null && typeof v === "object" && !Array.isArray(v);
22329
- }
22330
- function ScalarControl({
22331
- fieldKey,
22332
- value,
22333
- onFieldChange
22334
- }) {
22335
- if (typeof value === "boolean") {
22336
- return /* @__PURE__ */ jsx(Switch, { checked: value, onChange: (c) => onFieldChange(fieldKey, c) });
22337
- }
22338
- if (typeof value === "number") {
22339
- const [draft2, setDraft2] = React74__default.useState(String(value));
22340
- React74__default.useEffect(() => setDraft2(String(value)), [value]);
22341
- const commit2 = () => {
22342
- const n = draft2.trim() === "" ? 0 : Number(draft2);
22343
- onFieldChange(fieldKey, Number.isNaN(n) ? 0 : n);
22344
- };
22345
- return /* @__PURE__ */ jsx(
22346
- Input,
22347
- {
22348
- inputType: "number",
22349
- value: draft2,
22350
- onChange: (e) => setDraft2(e.target.value),
22351
- onBlur: commit2,
22352
- onKeyDown: (e) => {
22353
- if (e.key === "Enter") commit2();
22354
- }
22355
- }
22356
- );
22357
- }
22358
- if (isTraitConfigObject2(value)) {
22359
- const [draft2, setDraft2] = React74__default.useState(JSON.stringify(value));
22360
- React74__default.useEffect(() => setDraft2(JSON.stringify(value)), [value]);
22361
- const commit2 = () => {
22362
- try {
22363
- onFieldChange(fieldKey, JSON.parse(draft2));
22364
- } catch {
22365
- }
22366
- };
22367
- return /* @__PURE__ */ jsx(
22368
- Input,
22369
- {
22370
- inputType: "text",
22371
- value: draft2,
22372
- onChange: (e) => setDraft2(e.target.value),
22373
- onBlur: commit2,
22374
- onKeyDown: (e) => {
22375
- if (e.key === "Enter") commit2();
22376
- }
22377
- }
22378
- );
22379
- }
22380
- if (Array.isArray(value)) {
22381
- const [draft2, setDraft2] = React74__default.useState(JSON.stringify(value));
22382
- React74__default.useEffect(() => setDraft2(JSON.stringify(value)), [value]);
22383
- const commit2 = () => {
22384
- try {
22385
- onFieldChange(fieldKey, JSON.parse(draft2));
22386
- } catch {
22387
- }
22388
- };
22389
- return /* @__PURE__ */ jsx(
22390
- Input,
22391
- {
22392
- inputType: "text",
22393
- value: draft2,
22394
- onChange: (e) => setDraft2(e.target.value),
22395
- onBlur: commit2,
22396
- onKeyDown: (e) => {
22397
- if (e.key === "Enter") commit2();
22398
- }
22399
- }
22400
- );
22401
- }
22402
- const [draft, setDraft] = React74__default.useState(value === null ? "" : String(value));
22403
- React74__default.useEffect(() => setDraft(value === null ? "" : String(value)), [value]);
22404
- const commit = () => {
22405
- onFieldChange(fieldKey, draft);
22406
- };
22407
- return /* @__PURE__ */ jsx(
22408
- Input,
22409
- {
22410
- inputType: "text",
22411
- value: draft,
22412
- onChange: (e) => setDraft(e.target.value),
22413
- onBlur: commit,
22414
- onKeyDown: (e) => {
22415
- if (e.key === "Enter") commit();
22416
- }
22417
- }
22418
- );
22419
- }
22420
- var ObjectEditor;
22421
- var init_ObjectEditor = __esm({
22422
- "components/core/molecules/ObjectEditor.tsx"() {
22423
- "use client";
22424
- init_Stack();
22425
- init_Typography();
22426
- init_Switch();
22427
- init_Input();
22428
- init_cn();
22429
- ObjectEditor = ({ value, onChange, className }) => {
22430
- const entries = Object.entries(value);
22431
- const handleFieldChange = (k, next) => {
22432
- onChange({ ...value, [k]: next });
22433
- };
22434
- if (entries.length === 0) {
22435
- return /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: "Empty object" });
22436
- }
22437
- return /* @__PURE__ */ jsx(VStack, { gap: "xs", className: cn("w-full", className), children: entries.map(([k, v]) => /* @__PURE__ */ jsxs(HStack, { gap: "sm", align: "center", children: [
22438
- /* @__PURE__ */ jsx("span", { className: "w-24 shrink-0 truncate", title: k, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-muted-foreground", children: k }) }),
22439
- /* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsx(ScalarControl, { fieldKey: k, value: v, onFieldChange: handleFieldChange }) })
22440
- ] }, k)) });
22441
- };
22442
- }
22443
- });
22444
- function isTraitConfigObject3(v) {
22445
- return v !== null && typeof v === "object" && !Array.isArray(v);
22446
- }
22447
- function ValueControl({
22448
- value,
22449
- onChange
22450
- }) {
22451
- if (typeof value === "boolean") {
22452
- return /* @__PURE__ */ jsx(Switch, { checked: value, onChange: (c) => onChange(c) });
22453
- }
22454
- if (typeof value === "number") {
22455
- const [draft2, setDraft2] = React74__default.useState(String(value));
22456
- React74__default.useEffect(() => setDraft2(String(value)), [value]);
22457
- const commit2 = () => {
22458
- const n = draft2.trim() === "" ? 0 : Number(draft2);
22459
- onChange(Number.isNaN(n) ? 0 : n);
22460
- };
22461
- return /* @__PURE__ */ jsx(
22462
- Input,
22463
- {
22464
- inputType: "number",
22465
- value: draft2,
22466
- onChange: (e) => setDraft2(e.target.value),
22467
- onBlur: commit2,
22468
- onKeyDown: (e) => {
22469
- if (e.key === "Enter") commit2();
22470
- }
22471
- }
22472
- );
22473
- }
22474
- if (isTraitConfigObject3(value) || Array.isArray(value)) {
22475
- const [draft2, setDraft2] = React74__default.useState(JSON.stringify(value));
22476
- React74__default.useEffect(() => setDraft2(JSON.stringify(value)), [value]);
22477
- const commit2 = () => {
22478
- try {
22479
- onChange(JSON.parse(draft2));
22480
- } catch {
22481
- }
22482
- };
22483
- return /* @__PURE__ */ jsx(
22484
- Input,
22485
- {
22486
- inputType: "text",
22487
- value: draft2,
22488
- onChange: (e) => setDraft2(e.target.value),
22489
- onBlur: commit2,
22490
- onKeyDown: (e) => {
22491
- if (e.key === "Enter") commit2();
22492
- }
22493
- }
22494
- );
22495
- }
22496
- const [draft, setDraft] = React74__default.useState(value === null ? "" : String(value));
22497
- React74__default.useEffect(() => setDraft(value === null ? "" : String(value)), [value]);
22498
- const commit = () => {
22499
- onChange(draft);
22500
- };
22501
- return /* @__PURE__ */ jsx(
22502
- Input,
22503
- {
22504
- inputType: "text",
22505
- value: draft,
22506
- onChange: (e) => setDraft(e.target.value),
22507
- onBlur: commit,
22508
- onKeyDown: (e) => {
22509
- if (e.key === "Enter") commit();
22510
- }
22511
- }
22512
- );
22513
- }
22514
- function KeyInput({
22515
- currentKey,
22516
- onRename
22517
- }) {
22518
- const [draft, setDraft] = React74__default.useState(currentKey);
22519
- React74__default.useEffect(() => setDraft(currentKey), [currentKey]);
22520
- const commit = () => {
22521
- const trimmed = draft.trim();
22522
- if (trimmed !== "" && trimmed !== currentKey) onRename(trimmed);
22523
- else setDraft(currentKey);
22524
- };
22525
- return /* @__PURE__ */ jsx(
22526
- Input,
22527
- {
22528
- inputType: "text",
22529
- value: draft,
22530
- onChange: (e) => setDraft(e.target.value),
22531
- onBlur: commit,
22532
- onKeyDown: (e) => {
22533
- if (e.key === "Enter") commit();
22534
- },
22535
- className: "w-24 shrink-0 font-mono text-xs",
22536
- placeholder: "key"
22537
- }
22538
- );
22539
- }
22540
- var MapEditor;
22541
- var init_MapEditor = __esm({
22542
- "components/core/molecules/MapEditor.tsx"() {
22543
- "use client";
22544
- init_Stack();
22545
- init_Button();
22546
- init_Input();
22547
- init_Switch();
22548
- init_cn();
22549
- MapEditor = ({ value, onChange, className }) => {
22550
- const entries = Object.entries(value);
22551
- const updateKey = (oldKey, newKey) => {
22552
- const next = {};
22553
- for (const [k, v] of Object.entries(value)) {
22554
- next[k === oldKey ? newKey : k] = v;
22555
- }
22556
- onChange(next);
22557
- };
22558
- const updateValue = (k, next) => {
22559
- onChange({ ...value, [k]: next });
22560
- };
22561
- const remove = (k) => {
22562
- const next = { ...value };
22563
- delete next[k];
22564
- onChange(next);
22565
- };
22566
- const add = () => {
22567
- let key = "key";
22568
- let i = 1;
22569
- while (key in value) {
22570
- key = `key${i}`;
22571
- i++;
22572
- }
22573
- onChange({ ...value, [key]: "" });
22574
- };
22575
- return /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: cn("w-full", className), children: [
22576
- entries.map(([k, v]) => /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
22577
- /* @__PURE__ */ jsx(KeyInput, { currentKey: k, onRename: (newKey) => updateKey(k, newKey) }),
22578
- /* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsx(ValueControl, { value: v, onChange: (next) => updateValue(k, next) }) }),
22579
- /* @__PURE__ */ jsx(
22580
- Button,
22581
- {
22582
- variant: "ghost",
22583
- size: "sm",
22584
- icon: "trash-2",
22585
- onClick: () => remove(k),
22586
- "aria-label": "Remove entry"
22587
- }
22588
- )
22589
- ] }, k)),
22590
- /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", icon: "plus", label: "Add entry", onClick: add })
22591
- ] });
22592
- };
22593
- }
22594
- });
22595
22179
  function kindOf(v) {
22596
22180
  if (v === null) return "null";
22597
22181
  if (isArr(v)) return "array";
@@ -22627,7 +22211,7 @@ function templateFrom(arr) {
22627
22211
  if (isArr(first)) return [];
22628
22212
  return emptyOf(kindOf(first));
22629
22213
  }
22630
- function ScalarControl2({
22214
+ function ScalarControl({
22631
22215
  value,
22632
22216
  onChange
22633
22217
  }) {
@@ -22688,7 +22272,7 @@ function ValueNode({
22688
22272
  if (kind === "object" || kind === "array") {
22689
22273
  return /* @__PURE__ */ jsx(ContainerNode, { value, onChange, depth });
22690
22274
  }
22691
- return /* @__PURE__ */ jsx(ScalarControl2, { value, onChange });
22275
+ return /* @__PURE__ */ jsx(ScalarControl, { value, onChange });
22692
22276
  }
22693
22277
  function Row({
22694
22278
  rowKey,
@@ -35581,7 +35165,7 @@ function TextLikeControl({
35581
35165
  }
35582
35166
  );
35583
35167
  }
35584
- function isTraitConfigObject4(v) {
35168
+ function isTraitConfigObject(v) {
35585
35169
  return v !== null && v !== void 0 && typeof v === "object" && !Array.isArray(v);
35586
35170
  }
35587
35171
  function FieldControl({
@@ -35623,8 +35207,8 @@ function FieldControl({
35623
35207
  } else if (decl.type.startsWith("[") || Array.isArray(effectiveValue)) {
35624
35208
  const arr = Array.isArray(effectiveValue) ? effectiveValue : [];
35625
35209
  control = /* @__PURE__ */ jsx(JsonTreeEditor, { value: arr, onChange: (next) => onChange(name, next) });
35626
- } else if (decl.type === "object" || decl.type.startsWith("Map ") || !SCALAR_TYPES.has(decl.type) && isTraitConfigObject4(effectiveValue)) {
35627
- const obj = isTraitConfigObject4(effectiveValue) ? effectiveValue : {};
35210
+ } else if (decl.type === "object" || decl.type.startsWith("Map ") || !SCALAR_TYPES.has(decl.type) && isTraitConfigObject(effectiveValue)) {
35211
+ const obj = isTraitConfigObject(effectiveValue) ? effectiveValue : {};
35628
35212
  control = /* @__PURE__ */ jsx(JsonTreeEditor, { value: obj, onChange: (next) => onChange(name, next) });
35629
35213
  } else {
35630
35214
  control = /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "muted", children: [
@@ -37548,9 +37132,6 @@ var init_GraphCanvas = __esm({
37548
37132
  var init_molecules2 = __esm({
37549
37133
  "components/core/molecules/index.ts"() {
37550
37134
  init_ErrorBoundary();
37551
- init_ArrayEditor();
37552
- init_ObjectEditor();
37553
- init_MapEditor();
37554
37135
  init_JsonTreeEditor();
37555
37136
  init_FileTree();
37556
37137
  init_FormField();
@@ -50180,4 +49761,4 @@ init_AboutPageTemplate();
50180
49761
  // components/index.ts
50181
49762
  init_cn();
50182
49763
 
50183
- export { ALL_PRESETS, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, ActionButton, ActionButtons, Card2 as ActionCard, ActionPalette, ActionTile, Alert, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArrayEditor, ArticleSection, Aside, AssetPicker, AuthLayout, Avatar, Badge, BattleBoard, BattleTemplate, BehaviorView, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, BuilderBoard, Button, ButtonGroup, CTABanner, CalendarGrid, CanvasEffect, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, CastleBoard, CastleTemplate, Center, Chart, ChartLegend, Checkbox, ChoiceButton, ClassifierBoard, Coachmark, CodeBlock, CollapsibleSection, CombatLog, ComboCounter, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, Container, ContentRenderer, ContentSection, ControlButton, CounterTemplate, CraftingRecipe, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DIAMOND_TOP_Y, DPad, DamageNumber, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DebuggerBoard, DetailPanel, Dialog, DialogueBox, DialogueBubble, Divider, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmptyState, EnemyPlate, EntityDisplayEvents, ErrorBoundary, ErrorState, EventHandlerBoard, EventLog, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FeatureRenderer2 as FeatureRenderer, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioContext, GameAudioProvider, GameAudioToggle, GameCanvas2D, GameHud, GameMenu, GameOverScreen, GameShell, GameTemplate, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, HStack, Header, HealthBar, HealthPanel, HeroOrganism, HeroSection, IDENTITY_BOOK_FIELDS, Icon, IconPicker, InfiniteScrollSentinel, Input, InputGroup, InstallBox, InventoryGrid, InventoryPanel, IsometricCanvas, ItemSlot, JazariStateMachine, JsonTreeEditor, Label, LandingPageTemplate, LawReferenceTooltip, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapEditor, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MatrixQuestion, MediaGallery, Menu, Meter, MiniMap, Modal, ModalSlot, ModuleCard, Navigation, NegotiatorBoard, NotifyListener, NumberStepper, ObjectEditor, ObjectRulePanel, OnboardingSpotlight, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, Pagination, PatternTile, PhysicsManager, PlatformerCanvas, Popover, PositionedCanvas, PowerupSlots, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PropertyInspector, PullQuote, PullToRefresh, QrScanner, QuestTracker, QuizBlock, Radio, RangeSlider, RelationSelect, RepeatableFormSection, ReplyTree, ResourceBar, ResourceCounter, RichBlockEditor, RuleEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreBoard, ScoreDisplay, SearchInput, Section, SectionHeader, Select, SequenceBar, SequencerBoard, ServiceCatalog, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, SimulationCanvas, SimulationControls, SimulationGraph, SimulatorBoard, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Sprite, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateArchitectBoard, StateIndicator, StateJsonView, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StatusEffect, StepFlow, StepFlowOrganism, 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, ThemeSelector, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TurnIndicator, TurnPanel, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UncontrolledBattleBoard, UnitCommandBar, UploadDropZone, VStack, VariablePanel, VersionDiff, ViolationAlert, VoteStack, WaypointMarker, WizardContainer, WizardNavigation, WizardProgress, WorldMapBoard, WorldMapTemplate, XPBar, applyTemporaryEffect, calculateAttackTargets, calculateDamage, calculateValidMoves, cn, combatAnimations, combatClasses, combatEffects, createInitialGameState, createUnitAnimationState, drawSprite, generateCombatMessage, getCurrentFrame, getTileDimensions, inferDirection, isoToScreen, mapBookData, pendulum, projectileMotion, resolveFieldMap, resolveFrame, resolveSheetDirection, screenToIso, springOscillator, tickAnimationState, toCodeLanguage, transitionAnimation, useAnchorRect, useBattleState, useCamera, useGameAudio, useGameAudioContext, useImageCache, usePhysics2D, useSpriteAnimations };
49764
+ export { ALL_PRESETS, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, ActionButton, ActionButtons, Card2 as ActionCard, ActionPalette, ActionTile, Alert, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AssetPicker, AuthLayout, Avatar, Badge, BattleBoard, BattleTemplate, BehaviorView, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, BuilderBoard, Button, ButtonGroup, CTABanner, CalendarGrid, CanvasEffect, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, CastleBoard, CastleTemplate, Center, Chart, ChartLegend, Checkbox, ChoiceButton, ClassifierBoard, Coachmark, CodeBlock, CollapsibleSection, CombatLog, ComboCounter, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, Container, ContentRenderer, ContentSection, ControlButton, CounterTemplate, CraftingRecipe, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DIAMOND_TOP_Y, DPad, DamageNumber, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DebuggerBoard, DetailPanel, Dialog, DialogueBox, DialogueBubble, Divider, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmptyState, EnemyPlate, EntityDisplayEvents, ErrorBoundary, ErrorState, EventHandlerBoard, EventLog, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FeatureRenderer2 as FeatureRenderer, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioContext, GameAudioProvider, GameAudioToggle, GameCanvas2D, GameHud, GameMenu, GameOverScreen, GameShell, GameTemplate, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, HStack, Header, HealthBar, HealthPanel, HeroOrganism, HeroSection, IDENTITY_BOOK_FIELDS, Icon, IconPicker, InfiniteScrollSentinel, Input, InputGroup, InstallBox, InventoryGrid, InventoryPanel, IsometricCanvas, ItemSlot, JazariStateMachine, JsonTreeEditor, Label, LandingPageTemplate, LawReferenceTooltip, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MatrixQuestion, MediaGallery, Menu, Meter, MiniMap, Modal, ModalSlot, ModuleCard, Navigation, NegotiatorBoard, NotifyListener, NumberStepper, ObjectRulePanel, OnboardingSpotlight, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, Pagination, PatternTile, PhysicsManager, PlatformerCanvas, Popover, PositionedCanvas, PowerupSlots, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PropertyInspector, PullQuote, PullToRefresh, QrScanner, QuestTracker, QuizBlock, Radio, RangeSlider, RelationSelect, RepeatableFormSection, ReplyTree, ResourceBar, ResourceCounter, RichBlockEditor, RuleEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreBoard, ScoreDisplay, SearchInput, Section, SectionHeader, Select, SequenceBar, SequencerBoard, ServiceCatalog, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, SimulationCanvas, SimulationControls, SimulationGraph, SimulatorBoard, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Sprite, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateArchitectBoard, StateIndicator, StateJsonView, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StatusEffect, StepFlow, StepFlowOrganism, 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, ThemeSelector, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TurnIndicator, TurnPanel, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UncontrolledBattleBoard, UnitCommandBar, UploadDropZone, VStack, VariablePanel, VersionDiff, ViolationAlert, VoteStack, WaypointMarker, WizardContainer, WizardNavigation, WizardProgress, WorldMapBoard, WorldMapTemplate, XPBar, applyTemporaryEffect, calculateAttackTargets, calculateDamage, calculateValidMoves, cn, combatAnimations, combatClasses, combatEffects, createInitialGameState, createUnitAnimationState, drawSprite, generateCombatMessage, getCurrentFrame, getTileDimensions, inferDirection, isoToScreen, mapBookData, pendulum, projectileMotion, resolveFieldMap, resolveFrame, resolveSheetDirection, screenToIso, springOscillator, tickAnimationState, toCodeLanguage, transitionAnimation, useAnchorRect, useBattleState, useCamera, useGameAudio, useGameAudioContext, useImageCache, usePhysics2D, useSpriteAnimations };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "5.28.0",
3
+ "version": "5.28.1",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -1,15 +0,0 @@
1
- import React from 'react';
2
- import type { TraitConfigValue } from '@almadar/core';
3
- export interface ArrayEditorProps {
4
- /** Current array value. */
5
- value: ReadonlyArray<TraitConfigValue>;
6
- /** Fired when the array changes. */
7
- onChange: (next: ReadonlyArray<TraitConfigValue>) => void;
8
- /** Additional CSS classes. */
9
- className?: string;
10
- }
11
- /**
12
- * ArrayEditor — edits a `ReadonlyArray<TraitConfigValue>` with add / remove per row.
13
- * Each row infers its editor from the element's runtime type.
14
- */
15
- export declare const ArrayEditor: React.FC<ArrayEditorProps>;
@@ -1,16 +0,0 @@
1
- import React from 'react';
2
- import type { TraitConfigObject } from '@almadar/core';
3
- export interface MapEditorProps {
4
- /** Current map value (object used as string-keyed map). */
5
- value: TraitConfigObject;
6
- /** Fired when an entry is added, removed, or its key/value is changed. */
7
- onChange: (next: TraitConfigObject) => void;
8
- /** Additional CSS classes. */
9
- className?: string;
10
- }
11
- /**
12
- * MapEditor — edits a `TraitConfigObject` as a dynamic key/value map.
13
- * Unlike ObjectEditor (fixed schema keys), MapEditor allows adding/removing entries
14
- * and renaming keys.
15
- */
16
- export declare const MapEditor: React.FC<MapEditorProps>;
@@ -1,15 +0,0 @@
1
- import React from 'react';
2
- import type { TraitConfigObject } from '@almadar/core';
3
- export interface ObjectEditorProps {
4
- /** Current object value. */
5
- value: TraitConfigObject;
6
- /** Fired when any field changes. */
7
- onChange: (next: TraitConfigObject) => void;
8
- /** Additional CSS classes. */
9
- className?: string;
10
- }
11
- /**
12
- * ObjectEditor — edits a `TraitConfigObject` showing one labeled row per key.
13
- * Keys are fixed (derived from the current object's shape).
14
- */
15
- export declare const ObjectEditor: React.FC<ObjectEditorProps>;