@almadar/ui 6.8.0 → 6.9.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.
package/dist/lib/index.js CHANGED
@@ -2094,6 +2094,48 @@ var JAZARI_COLORS = {
2094
2094
  };
2095
2095
 
2096
2096
  // lib/editorMotions.ts
2097
+ var EDITOR_MOTIONS = [
2098
+ "left",
2099
+ "right",
2100
+ "up",
2101
+ "down",
2102
+ "word-forward",
2103
+ "word-back",
2104
+ "word-end",
2105
+ "line-start",
2106
+ "line-end",
2107
+ "first-nonblank",
2108
+ "doc-start",
2109
+ "doc-end",
2110
+ "paragraph-forward",
2111
+ "paragraph-back",
2112
+ "line",
2113
+ "selection",
2114
+ "match-bracket"
2115
+ ];
2116
+ var EDITOR_OPERATORS = [
2117
+ "delete",
2118
+ "yank",
2119
+ "change",
2120
+ "put",
2121
+ "put-before",
2122
+ "undo",
2123
+ "redo",
2124
+ "join",
2125
+ "toggle-case",
2126
+ "indent",
2127
+ "dedent",
2128
+ "replace"
2129
+ ];
2130
+ var EDITOR_MOTION_SET = new Set(EDITOR_MOTIONS);
2131
+ var EDITOR_OPERATOR_SET = new Set(EDITOR_OPERATORS);
2132
+ function isEditorMotion(value) {
2133
+ return EDITOR_MOTION_SET.has(value);
2134
+ }
2135
+ function isEditorOperator(value) {
2136
+ return EDITOR_OPERATOR_SET.has(value);
2137
+ }
2138
+ var INDENT_UNIT = " ";
2097
2139
  function clamp(value, min, max) {
2098
2140
  return Math.max(min, Math.min(max, value));
2099
2141
  }
@@ -2161,6 +2203,39 @@ function prevParagraphBoundary(lines, fromLineIdx) {
2161
2203
  }
2162
2204
  return 0;
2163
2205
  }
2206
+ var BRACKET_PARTNER = {
2207
+ "(": ")",
2208
+ ")": "(",
2209
+ "[": "]",
2210
+ "]": "[",
2211
+ "{": "}",
2212
+ "}": "{"
2213
+ };
2214
+ var OPEN_BRACKETS = /* @__PURE__ */ new Set(["(", "[", "{"]);
2215
+ function matchBracket(text, pos) {
2216
+ const ch = text[pos];
2217
+ const partner = ch !== void 0 ? BRACKET_PARTNER[ch] : void 0;
2218
+ if (partner === void 0) return null;
2219
+ let depth = 1;
2220
+ if (OPEN_BRACKETS.has(ch)) {
2221
+ for (let i = pos + 1; i < text.length; i++) {
2222
+ if (text[i] === ch) depth++;
2223
+ else if (text[i] === partner) {
2224
+ depth--;
2225
+ if (depth === 0) return i;
2226
+ }
2227
+ }
2228
+ } else {
2229
+ for (let i = pos - 1; i >= 0; i--) {
2230
+ if (text[i] === ch) depth++;
2231
+ else if (text[i] === partner) {
2232
+ depth--;
2233
+ if (depth === 0) return i;
2234
+ }
2235
+ }
2236
+ }
2237
+ return null;
2238
+ }
2164
2239
  function applyMotion(text, caret, motion, count) {
2165
2240
  const n = Math.max(1, count);
2166
2241
  const lines = computeLines(text);
@@ -2222,6 +2297,20 @@ function applyMotion(text, caret, motion, count) {
2222
2297
  }
2223
2298
  return pos;
2224
2299
  }
2300
+ case "match-bracket": {
2301
+ const chAtCaret = text[caret];
2302
+ if (chAtCaret !== void 0 && BRACKET_PARTNER[chAtCaret] !== void 0) {
2303
+ const target = matchBracket(text, caret);
2304
+ return target === null ? caret : target;
2305
+ }
2306
+ for (let i = caret; i < line.end; i++) {
2307
+ if (BRACKET_PARTNER[text[i]] !== void 0) {
2308
+ const target = matchBracket(text, i);
2309
+ return target === null ? caret : target;
2310
+ }
2311
+ }
2312
+ return caret;
2313
+ }
2225
2314
  case "line":
2226
2315
  case "selection":
2227
2316
  return caret;
@@ -2249,8 +2338,8 @@ function motionRange(text, caret, motion, count, selection) {
2249
2338
  const newCaret = applyMotion(text, caret, motion, count);
2250
2339
  let start = Math.min(caret, newCaret);
2251
2340
  let end = Math.max(caret, newCaret);
2252
- if (motion === "word-end" || motion === "line-end") {
2253
- end = Math.min(Math.max(start, newCaret) + 1, text.length);
2341
+ if ((motion === "word-end" || motion === "line-end" || motion === "match-bracket") && newCaret !== caret) {
2342
+ end = Math.min(Math.max(caret, newCaret) + 1, text.length);
2254
2343
  } else if (motion === "word-forward" && newCaret > caret) {
2255
2344
  const startLine = lineIndexAt(lines, caret);
2256
2345
  const endLine = lineIndexAt(lines, newCaret);
@@ -2260,14 +2349,149 @@ function motionRange(text, caret, motion, count, selection) {
2260
2349
  }
2261
2350
  return [start, end];
2262
2351
  }
2263
- function applyOperator(text, range, operator, register) {
2264
- const start = clamp(range[0], 0, text.length);
2265
- const end = clamp(range[1], start, text.length);
2266
- const removed = text.slice(start, end);
2267
- if (operator === "yank") {
2268
- return { text, caret: start, register: removed };
2352
+ function toggleCase(s) {
2353
+ return s.replace(/[a-zA-Z]/g, (c) => c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase());
2354
+ }
2355
+ function applyJoin(text, caret, count, register, registerLinewise) {
2356
+ const lines = computeLines(text);
2357
+ const startIdx = lineIndexAt(lines, caret);
2358
+ const n = Math.max(2, count);
2359
+ const endIdx = clamp(startIdx + n - 1, 0, lines.length - 1);
2360
+ if (endIdx <= startIdx) {
2361
+ return { text, caret, register, registerLinewise };
2362
+ }
2363
+ const joinCaret = lines[startIdx].end;
2364
+ let joined = text.slice(lines[startIdx].start, lines[startIdx].end);
2365
+ for (let i = startIdx + 1; i <= endIdx; i++) {
2366
+ const raw = text.slice(lines[i].start, lines[i].end);
2367
+ joined += " " + raw.replace(/^[ \t]+/, "");
2368
+ }
2369
+ const newText = text.slice(0, lines[startIdx].start) + joined + text.slice(lines[endIdx].end);
2370
+ return { text: newText, caret: joinCaret, register, registerLinewise };
2371
+ }
2372
+ function applyIndent(text, start, end, operator, register, registerLinewise) {
2373
+ const lines = computeLines(text);
2374
+ const startLineIdx = lineIndexAt(lines, start);
2375
+ const lastTouchedPos = end > start ? end - 1 : start;
2376
+ const endLineIdx = lineIndexAt(lines, lastTouchedPos);
2377
+ let result = text;
2378
+ for (let i = endLineIdx; i >= startLineIdx; i--) {
2379
+ const lineStart = lines[i].start;
2380
+ if (operator === "indent") {
2381
+ result = result.slice(0, lineStart) + INDENT_UNIT + result.slice(lineStart);
2382
+ } else if (result[lineStart] === " ") {
2383
+ result = result.slice(0, lineStart) + result.slice(lineStart + 1);
2384
+ } else {
2385
+ let removeCount = 0;
2386
+ while (removeCount < INDENT_UNIT.length && result[lineStart + removeCount] === " ") removeCount++;
2387
+ result = result.slice(0, lineStart) + result.slice(lineStart + removeCount);
2388
+ }
2389
+ }
2390
+ const newLines = computeLines(result);
2391
+ const caret = firstNonBlank(result, newLines[startLineIdx]);
2392
+ return { text: result, caret, register, registerLinewise };
2393
+ }
2394
+ function applyPut(text, caret, operator, register, registerLinewise, count) {
2395
+ if (register.length === 0) {
2396
+ return { text, caret, register, registerLinewise };
2397
+ }
2398
+ const content = register.repeat(count);
2399
+ const lines = computeLines(text);
2400
+ const line = lines[lineIndexAt(lines, caret)];
2401
+ if (registerLinewise) {
2402
+ if (operator === "put-before") {
2403
+ const insertPos3 = line.start;
2404
+ return {
2405
+ text: text.slice(0, insertPos3) + content + text.slice(insertPos3),
2406
+ caret: insertPos3,
2407
+ register,
2408
+ registerLinewise
2409
+ };
2410
+ }
2411
+ const nextLineIdx = lineIndexAt(lines, caret) + 1;
2412
+ if (nextLineIdx < lines.length) {
2413
+ const insertPos3 = lines[nextLineIdx].start;
2414
+ return {
2415
+ text: text.slice(0, insertPos3) + content + text.slice(insertPos3),
2416
+ caret: insertPos3,
2417
+ register,
2418
+ registerLinewise
2419
+ };
2420
+ }
2421
+ const insertPos2 = text.length;
2422
+ return {
2423
+ text: text.slice(0, insertPos2) + "\n" + content,
2424
+ caret: insertPos2 + 1,
2425
+ register,
2426
+ registerLinewise
2427
+ };
2428
+ }
2429
+ const insertPos = operator === "put-before" ? clamp(caret, 0, text.length) : clamp(caret + 1, line.start, line.end);
2430
+ return {
2431
+ text: text.slice(0, insertPos) + content + text.slice(insertPos),
2432
+ caret: insertPos + content.length - 1,
2433
+ register,
2434
+ registerLinewise
2435
+ };
2436
+ }
2437
+ function applyOperator(input) {
2438
+ const { text, caret, operator, motion, register, registerLinewise } = input;
2439
+ const count = Math.max(1, input.count);
2440
+ const start = clamp(input.range[0], 0, text.length);
2441
+ const end = clamp(input.range[1], start, text.length);
2442
+ switch (operator) {
2443
+ case "yank":
2444
+ return { text, caret: start, register: text.slice(start, end), registerLinewise: motion === "line" };
2445
+ case "delete":
2446
+ case "replace": {
2447
+ const removed = text.slice(start, end);
2448
+ return {
2449
+ text: text.slice(0, start) + text.slice(end),
2450
+ caret: start,
2451
+ register: removed,
2452
+ registerLinewise: motion === "line"
2453
+ };
2454
+ }
2455
+ case "change": {
2456
+ if (motion === "line") {
2457
+ const hasTrailingNewline = end > start && text[end - 1] === "\n";
2458
+ const removeEnd = hasTrailingNewline ? end - 1 : end;
2459
+ const removed2 = text.slice(start, removeEnd);
2460
+ return {
2461
+ text: text.slice(0, start) + text.slice(removeEnd),
2462
+ caret: start,
2463
+ register: removed2,
2464
+ registerLinewise: true
2465
+ };
2466
+ }
2467
+ const removed = text.slice(start, end);
2468
+ return {
2469
+ text: text.slice(0, start) + text.slice(end),
2470
+ caret: start,
2471
+ register: removed,
2472
+ registerLinewise: false
2473
+ };
2474
+ }
2475
+ case "put":
2476
+ case "put-before":
2477
+ return applyPut(text, caret, operator, register, registerLinewise, count);
2478
+ case "join":
2479
+ return applyJoin(text, caret, count, register, registerLinewise);
2480
+ case "toggle-case": {
2481
+ const toggled = toggleCase(text.slice(start, end));
2482
+ return { text: text.slice(0, start) + toggled + text.slice(end), caret: end, register, registerLinewise };
2483
+ }
2484
+ case "indent":
2485
+ case "dedent":
2486
+ return applyIndent(text, start, end, operator, register, registerLinewise);
2487
+ case "undo":
2488
+ case "redo":
2489
+ return { text, caret, register, registerLinewise };
2490
+ default: {
2491
+ const _exhaustive = operator;
2492
+ return _exhaustive;
2493
+ }
2269
2494
  }
2270
- return { text: text.slice(0, start) + text.slice(end), caret: start, register: removed };
2271
2495
  }
2272
2496
 
2273
- export { ApiError, DEFAULT_CONFIG, JAZARI_COLORS, apiClient, applyMotion, applyOperator, arrowheadPath, bindCanvasCapture, bindEventBus, bindLastDrawables, bindTraitStateGetter, brainIconPath, clearDebugEvents, clearEntityProvider, clearGuardHistory, clearTicks, clearTraits, clearVerification, cn, compareCellValues, computeJazariLayout, createCommandSendPump, createTickSendRelay, debug, debugCollision, debugError, debugGameState, debugGroup, debugGroupEnd, debugInput, debugPhysics, debugTable, debugTime, debugTimeEnd, debugWarn, eightPointedStarPath, extractOutputsFromTransitions, extractStateMachine, formatDate, formatDateTime, formatGuard, formatNestedFieldLabel, formatTime, formatValue, gearTeethPath, getAllChecks, getAllTicks, getAllTraits, getBridgeHealth, getDebugEvents, getEffectSummary, getEntitiesByType, getEntityById, getEntitySnapshot, getEventsBySource, getEventsByType, getGuardEvaluationsForTrait, getGuardHistory, getNestedValue, getRecentEvents, getRecentGuardEvaluations, getSnapshot, getSummary, getTick, getTrait, getTraitSnapshots, getTransitions, getTransitionsForTrait, humanizeEnumValue, humanizeFieldName, initDebugShortcut, isDebugEnabled, lockIconPath, logDebugEvent, logEffectExecuted, logError, logEventFired, logInfo, logStateChange, logWarning, motionRange, onDebugToggle, parseContentSegments, parseLessonSegments, parseMarkdownWithCodeBlocks, pipeIconPath, profilerOnRender, recordGuardEvaluation, recordServerResponse, recordTransition, registerCheck, registerTick, registerTrait, registerTraitSnapshot, renderStateMachineToDomData, renderStateMachineToSvg, resolveImageUrl, setDebugEnabled, setEntityProvider, setTickActive, sortRows, subscribeToDebugEvents, subscribeToGuardChanges, subscribeToTickChanges, subscribeToTraitChanges, subscribeToVerification, toggleDebug, unregisterTick, unregisterTrait, updateAssetStatus, updateBridgeHealth, updateCheck, updateGuardResult, updateTickExecution, updateTraitState, usePerfBuffer, waitForTransition };
2497
+ export { ApiError, DEFAULT_CONFIG, EDITOR_MOTIONS, EDITOR_OPERATORS, INDENT_UNIT, JAZARI_COLORS, apiClient, applyMotion, applyOperator, arrowheadPath, bindCanvasCapture, bindEventBus, bindLastDrawables, bindTraitStateGetter, brainIconPath, clearDebugEvents, clearEntityProvider, clearGuardHistory, clearTicks, clearTraits, clearVerification, cn, compareCellValues, computeJazariLayout, createCommandSendPump, createTickSendRelay, debug, debugCollision, debugError, debugGameState, debugGroup, debugGroupEnd, debugInput, debugPhysics, debugTable, debugTime, debugTimeEnd, debugWarn, eightPointedStarPath, extractOutputsFromTransitions, extractStateMachine, formatDate, formatDateTime, formatGuard, formatNestedFieldLabel, formatTime, formatValue, gearTeethPath, getAllChecks, getAllTicks, getAllTraits, getBridgeHealth, getDebugEvents, getEffectSummary, getEntitiesByType, getEntityById, getEntitySnapshot, getEventsBySource, getEventsByType, getGuardEvaluationsForTrait, getGuardHistory, getNestedValue, getRecentEvents, getRecentGuardEvaluations, getSnapshot, getSummary, getTick, getTrait, getTraitSnapshots, getTransitions, getTransitionsForTrait, humanizeEnumValue, humanizeFieldName, initDebugShortcut, isDebugEnabled, isEditorMotion, isEditorOperator, lockIconPath, logDebugEvent, logEffectExecuted, logError, logEventFired, logInfo, logStateChange, logWarning, motionRange, onDebugToggle, parseContentSegments, parseLessonSegments, parseMarkdownWithCodeBlocks, pipeIconPath, profilerOnRender, recordGuardEvaluation, recordServerResponse, recordTransition, registerCheck, registerTick, registerTrait, registerTraitSnapshot, renderStateMachineToDomData, renderStateMachineToSvg, resolveImageUrl, setDebugEnabled, setEntityProvider, setTickActive, sortRows, subscribeToDebugEvents, subscribeToGuardChanges, subscribeToTickChanges, subscribeToTraitChanges, subscribeToVerification, toggleDebug, unregisterTick, unregisterTrait, updateAssetStatus, updateBridgeHealth, updateCheck, updateGuardResult, updateTickExecution, updateTraitState, usePerfBuffer, waitForTransition };
@@ -3112,8 +3112,17 @@ var Typography = ({
3112
3112
  weight && weightStyles[weight],
3113
3113
  size && typographySizeStyles[size],
3114
3114
  align && `text-${align}`,
3115
- truncate && "truncate overflow-hidden text-ellipsis",
3116
- overflow && overflowStyles2[overflow],
3115
+ // `min-w-0` rides along with truncate/wrap/clamp: a flex or grid
3116
+ // item's default `min-width: auto` refuses to shrink below its
3117
+ // content's intrinsic width, so ellipsis/wrap silently does nothing
3118
+ // in the single most common placement (a row next to a fixed-width
3119
+ // control) unless the item can also shrink to zero. (Spelled out as
3120
+ // just "truncate", not "truncate overflow-hidden text-ellipsis" —
3121
+ // tailwind-merge treats those as the same conflict group and drops
3122
+ // "truncate" as the earlier-declared class, silently losing its
3123
+ // `white-space: nowrap`.)
3124
+ truncate && "truncate min-w-0",
3125
+ overflow && cn(overflowStyles2[overflow], overflow !== "visible" && "min-w-0"),
3117
3126
  className
3118
3127
  ),
3119
3128
  style
@@ -3491,7 +3500,7 @@ var variantStyles2 = {
3491
3500
  secondary: [
3492
3501
  "bg-transparent text-accent",
3493
3502
  "border border-accent",
3494
- "hover:bg-accent hover:text-white hover:border-accent",
3503
+ "hover:bg-accent hover:text-accent-foreground hover:border-accent",
3495
3504
  "active:scale-[var(--active-scale)]"
3496
3505
  ].join(" "),
3497
3506
  ghost: [
@@ -3091,8 +3091,17 @@ var Typography = ({
3091
3091
  weight && weightStyles[weight],
3092
3092
  size && typographySizeStyles[size],
3093
3093
  align && `text-${align}`,
3094
- truncate && "truncate overflow-hidden text-ellipsis",
3095
- overflow && overflowStyles2[overflow],
3094
+ // `min-w-0` rides along with truncate/wrap/clamp: a flex or grid
3095
+ // item's default `min-width: auto` refuses to shrink below its
3096
+ // content's intrinsic width, so ellipsis/wrap silently does nothing
3097
+ // in the single most common placement (a row next to a fixed-width
3098
+ // control) unless the item can also shrink to zero. (Spelled out as
3099
+ // just "truncate", not "truncate overflow-hidden text-ellipsis" —
3100
+ // tailwind-merge treats those as the same conflict group and drops
3101
+ // "truncate" as the earlier-declared class, silently losing its
3102
+ // `white-space: nowrap`.)
3103
+ truncate && "truncate min-w-0",
3104
+ overflow && cn(overflowStyles2[overflow], overflow !== "visible" && "min-w-0"),
3096
3105
  className
3097
3106
  ),
3098
3107
  style
@@ -3470,7 +3479,7 @@ var variantStyles2 = {
3470
3479
  secondary: [
3471
3480
  "bg-transparent text-accent",
3472
3481
  "border border-accent",
3473
- "hover:bg-accent hover:text-white hover:border-accent",
3482
+ "hover:bg-accent hover:text-accent-foreground hover:border-accent",
3474
3483
  "active:scale-[var(--active-scale)]"
3475
3484
  ].join(" "),
3476
3485
  ghost: [