source dump of claude code
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 124 lines 14 kB view raw
1import { c as _c } from "react/compiler-runtime"; 2import * as React from 'react'; 3import { useEffect, useRef, useState } from 'react'; 4import { Box } from '../../ink.js'; 5import { getInitialSettings } from '../../utils/settings/settings.js'; 6import { Clawd, type ClawdPose } from './Clawd.js'; 7type Frame = { 8 pose: ClawdPose; 9 offset: number; 10}; 11 12/** Hold a pose for n frames (60ms each). */ 13function hold(pose: ClawdPose, offset: number, frames: number): Frame[] { 14 return Array.from({ 15 length: frames 16 }, () => ({ 17 pose, 18 offset 19 })); 20} 21 22// Offset semantics: marginTop in a fixed-height-3 container. 0 = normal, 23// 1 = crouched. Container height stays 3 so the layout never shifts; during 24// a crouch (offset=1) Clawd's feet row dips below the container and gets 25// clipped — reads as "ducking below the frame" before springing back up. 26 27// Click animation: crouch, then spring up with both arms raised. Twice. 28const JUMP_WAVE: readonly Frame[] = [...hold('default', 1, 2), 29// crouch 30...hold('arms-up', 0, 3), 31// spring! 32...hold('default', 0, 1), ...hold('default', 1, 2), 33// crouch again 34...hold('arms-up', 0, 3), 35// spring! 36...hold('default', 0, 1)]; 37 38// Click animation: glance right, then left, then back. 39const LOOK_AROUND: readonly Frame[] = [...hold('look-right', 0, 5), ...hold('look-left', 0, 5), ...hold('default', 0, 1)]; 40const CLICK_ANIMATIONS: readonly (readonly Frame[])[] = [JUMP_WAVE, LOOK_AROUND]; 41const IDLE: Frame = { 42 pose: 'default', 43 offset: 0 44}; 45const FRAME_MS = 60; 46const incrementFrame = (i: number) => i + 1; 47const CLAWD_HEIGHT = 3; 48 49/** 50 * Clawd with click-triggered animations (crouch-jump with arms up, or 51 * look-around). Container height is fixed at CLAWD_HEIGHT — same footprint 52 * as a bare `<Clawd />` — so the surrounding layout never shifts. During a 53 * crouch only the feet row clips (see comment above). Click only fires when 54 * mouse tracking is enabled (i.e. inside `<AlternateScreen>` / fullscreen); 55 * elsewhere this renders and behaves identically to plain `<Clawd />`. 56 */ 57export function AnimatedClawd() { 58 const $ = _c(8); 59 const { 60 pose, 61 bounceOffset, 62 onClick 63 } = useClawdAnimation(); 64 let t0; 65 if ($[0] !== pose) { 66 t0 = <Clawd pose={pose} />; 67 $[0] = pose; 68 $[1] = t0; 69 } else { 70 t0 = $[1]; 71 } 72 let t1; 73 if ($[2] !== bounceOffset || $[3] !== t0) { 74 t1 = <Box marginTop={bounceOffset} flexShrink={0}>{t0}</Box>; 75 $[2] = bounceOffset; 76 $[3] = t0; 77 $[4] = t1; 78 } else { 79 t1 = $[4]; 80 } 81 let t2; 82 if ($[5] !== onClick || $[6] !== t1) { 83 t2 = <Box height={CLAWD_HEIGHT} flexDirection="column" onClick={onClick}>{t1}</Box>; 84 $[5] = onClick; 85 $[6] = t1; 86 $[7] = t2; 87 } else { 88 t2 = $[7]; 89 } 90 return t2; 91} 92function useClawdAnimation(): { 93 pose: ClawdPose; 94 bounceOffset: number; 95 onClick: () => void; 96} { 97 // Read once at mount — no useSettings() subscription, since that would 98 // re-render on any settings change. 99 const [reducedMotion] = useState(() => getInitialSettings().prefersReducedMotion ?? false); 100 const [frameIndex, setFrameIndex] = useState(-1); 101 const sequenceRef = useRef<readonly Frame[]>(JUMP_WAVE); 102 const onClick = () => { 103 if (reducedMotion || frameIndex !== -1) return; 104 sequenceRef.current = CLICK_ANIMATIONS[Math.floor(Math.random() * CLICK_ANIMATIONS.length)]!; 105 setFrameIndex(0); 106 }; 107 useEffect(() => { 108 if (frameIndex === -1) return; 109 if (frameIndex >= sequenceRef.current.length) { 110 setFrameIndex(-1); 111 return; 112 } 113 const timer = setTimeout(setFrameIndex, FRAME_MS, incrementFrame); 114 return () => clearTimeout(timer); 115 }, [frameIndex]); 116 const seq = sequenceRef.current; 117 const current = frameIndex >= 0 && frameIndex < seq.length ? seq[frameIndex]! : IDLE; 118 return { 119 pose: current.pose, 120 bounceOffset: current.offset, 121 onClick 122 }; 123} 124//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiQm94IiwiZ2V0SW5pdGlhbFNldHRpbmdzIiwiQ2xhd2QiLCJDbGF3ZFBvc2UiLCJGcmFtZSIsInBvc2UiLCJvZmZzZXQiLCJob2xkIiwiZnJhbWVzIiwiQXJyYXkiLCJmcm9tIiwibGVuZ3RoIiwiSlVNUF9XQVZFIiwiTE9PS19BUk9VTkQiLCJDTElDS19BTklNQVRJT05TIiwiSURMRSIsIkZSQU1FX01TIiwiaW5jcmVtZW50RnJhbWUiLCJpIiwiQ0xBV0RfSEVJR0hUIiwiQW5pbWF0ZWRDbGF3ZCIsIiQiLCJfYyIsImJvdW5jZU9mZnNldCIsIm9uQ2xpY2siLCJ1c2VDbGF3ZEFuaW1hdGlvbiIsInQwIiwidDEiLCJ0MiIsInJlZHVjZWRNb3Rpb24iLCJwcmVmZXJzUmVkdWNlZE1vdGlvbiIsImZyYW1lSW5kZXgiLCJzZXRGcmFtZUluZGV4Iiwic2VxdWVuY2VSZWYiLCJjdXJyZW50IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwidGltZXIiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0Iiwic2VxIl0sInNvdXJjZXMiOlsiQW5pbWF0ZWRDbGF3ZC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IGdldEluaXRpYWxTZXR0aW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL3NldHRpbmdzL3NldHRpbmdzLmpzJ1xuaW1wb3J0IHsgQ2xhd2QsIHR5cGUgQ2xhd2RQb3NlIH0gZnJvbSAnLi9DbGF3ZC5qcydcblxudHlwZSBGcmFtZSA9IHsgcG9zZTogQ2xhd2RQb3NlOyBvZmZzZXQ6IG51bWJlciB9XG5cbi8qKiBIb2xkIGEgcG9zZSBmb3IgbiBmcmFtZXMgKDYwbXMgZWFjaCkuICovXG5mdW5jdGlvbiBob2xkKHBvc2U6IENsYXdkUG9zZSwgb2Zmc2V0OiBudW1iZXIsIGZyYW1lczogbnVtYmVyKTogRnJhbWVbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBmcmFtZXMgfSwgKCkgPT4gKHsgcG9zZSwgb2Zmc2V0IH0pKVxufVxuXG4vLyBPZmZzZXQgc2VtYW50aWNzOiBtYXJnaW5Ub3AgaW4gYSBmaXhlZC1oZWlnaHQtMyBjb250YWluZXIuIDAgPSBub3JtYWwsXG4vLyAxID0gY3JvdWNoZWQuIENvbnRhaW5lciBoZWlnaHQgc3RheXMgMyBzbyB0aGUgbGF5b3V0IG5ldmVyIHNoaWZ0czsgZHVyaW5nXG4vLyBhIGNyb3VjaCAob2Zmc2V0PTEpIENsYXdkJ3MgZmVldCByb3cgZGlwcyBiZWxvdyB0aGUgY29udGFpbmVyIGFuZCBnZXRzXG4vLyBjbGlwcGVkIOKAlCByZWFkcyBhcyBcImR1Y2tpbmcgYmVsb3cgdGhlIGZyYW1lXCIgYmVmb3JlIHNwcmluZ2luZyBiYWNrIHVwLlxuXG4vLyBDbGljayBhbmltYXRpb246IGNyb3VjaCwgdGhlbiBzcHJpbmcgdXAgd2l0aCBib3RoIGFybXMgcmFpc2VkLiBUd2ljZS5cbmNvbnN0IEpVTVBfV0FWRTogcmVhZG9ubHkgRnJhbWVbXSA9IFtcbiAgLi4uaG9sZCgnZGVmYXVsdCcsIDEsIDIpLCAvLyBjcm91Y2hcbiAgLi4uaG9sZCgnYXJtcy11cCcsIDAsIDMpLCAvLyBzcHJpbmchXG4gIC4uLmhvbGQoJ2RlZmF1bHQnLCAwLCAxKSxcbiAgLi4uaG9sZCgnZGVmYXVsdCcsIDEsIDIpLCAvLyBjcm91Y2ggYWdhaW5cbiAgLi4uaG9sZCgnYXJtcy11cCcsIDAsIDMpLCAvLyBzcHJpbmchXG4gIC4uLmhvbGQoJ2RlZmF1bHQnLCAwLCAxKSxcbl1cblxuLy8gQ2xpY2sgYW5pbWF0aW9uOiBnbGFuY2UgcmlnaHQsIHRoZW4gbGVmdCwgdGhlbiBiYWNrLlxuY29uc3QgTE9PS19BUk9VTkQ6IHJlYWRvbmx5IEZyYW1lW10gPSBbXG4gIC4uLmhvbGQoJ2xvb2stcmlnaHQnLCAwLCA1KSxcbiAgLi4uaG9sZCgnbG9vay1sZWZ0JywgMCwgNSksXG4gIC4uLmhvbGQoJ2RlZmF1bHQnLCAwLCAxKSxcbl1cblxuY29uc3QgQ0xJQ0tfQU5JTUFUSU9OUzogcmVhZG9ubHkgKHJlYWRvbmx5IEZyYW1lW10pW10gPSBbSlVNUF9XQVZFLCBMT09LX0FST1VORF1cblxuY29uc3QgSURMRTogRnJhbWUgPSB7IHBvc2U6ICdkZWZhdWx0Jywgb2Zmc2V0OiAwIH1cbmNvbnN0IEZSQU1FX01TID0gNjBcbmNvbnN0IGluY3JlbWVudEZyYW1lID0gKGk6IG51bWJlcikgPT4gaSArIDFcbmNvbnN0IENMQVdEX0hFSUdIVCA9IDNcblxuLyoqXG4gKiBDbGF3ZCB3aXRoIGNsaWNrLXRyaWdnZXJlZCBhbmltYXRpb25zIChjcm91Y2gtanVtcCB3aXRoIGFybXMgdXAsIG9yXG4gKiBsb29rLWFyb3VuZCkuIENvbnRhaW5lciBoZWlnaHQgaXMgZml4ZWQgYXQgQ0xBV0RfSEVJR0hUIOKAlCBzYW1lIGZvb3RwcmludFxuICogYXMgYSBiYXJlIGA8Q2xhd2QgLz5gIOKAlCBzbyB0aGUgc3Vycm91bmRpbmcgbGF5b3V0IG5ldmVyIHNoaWZ0cy4gRHVyaW5nIGFcbiAqIGNyb3VjaCBvbmx5IHRoZSBmZWV0IHJvdyBjbGlwcyAoc2VlIGNvbW1lbnQgYWJvdmUpLiBDbGljayBvbmx5IGZpcmVzIHdoZW5cbiAqIG1vdXNlIHRyYWNraW5nIGlzIGVuYWJsZWQgKGkuZS4gaW5zaWRlIGA8QWx0ZXJuYXRlU2NyZWVuPmAgLyBmdWxsc2NyZWVuKTtcbiAqIGVsc2V3aGVyZSB0aGlzIHJlbmRlcnMgYW5kIGJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8gcGxhaW4gYDxDbGF3ZCAvPmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBbmltYXRlZENsYXdkKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgcG9zZSwgYm91bmNlT2Zmc2V0LCBvbkNsaWNrIH0gPSB1c2VDbGF3ZEFuaW1hdGlvbigpXG4gIHJldHVybiAoXG4gICAgPEJveCBoZWlnaHQ9e0NMQVdEX0hFSUdIVH0gZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG9uQ2xpY2s9e29uQ2xpY2t9PlxuICAgICAgPEJveCBtYXJnaW5Ub3A9e2JvdW5jZU9mZnNldH0gZmxleFNocmluaz17MH0+XG4gICAgICAgIDxDbGF3ZCBwb3NlPXtwb3NlfSAvPlxuICAgICAgPC9Cb3g+XG4gICAgPC9Cb3g+XG4gIClcbn1cblxuZnVuY3Rpb24gdXNlQ2xhd2RBbmltYXRpb24oKToge1xuICBwb3NlOiBDbGF3ZFBvc2VcbiAgYm91bmNlT2Zmc2V0OiBudW1iZXJcbiAgb25DbGljazogKCkgPT4gdm9pZFxufSB7XG4gIC8vIFJlYWQgb25jZSBhdCBtb3VudCDigJQgbm8gdXNlU2V0dGluZ3MoKSBzdWJzY3JpcHRpb24sIHNpbmNlIHRoYXQgd291bGRcbiAgLy8gcmUtcmVuZGVyIG9uIGFueSBzZXR0aW5ncyBjaGFuZ2UuXG4gIGNvbnN0IFtyZWR1Y2VkTW90aW9uXSA9IHVzZVN0YXRlKFxuICAgICgpID0+IGdldEluaXRpYWxTZXR0aW5ncygpLnByZWZlcnNSZWR1Y2VkTW90aW9uID8/IGZhbHNlLFxuICApXG4gIGNvbnN0IFtmcmFtZUluZGV4LCBzZXRGcmFtZUluZGV4XSA9IHVzZVN0YXRlKC0xKVxuICBjb25zdCBzZXF1ZW5jZVJlZiA9IHVzZVJlZjxyZWFkb25seSBGcmFtZVtdPihKVU1QX1dBVkUpXG5cbiAgY29uc3Qgb25DbGljayA9ICgpID0+IHtcbiAgICBpZiAocmVkdWNlZE1vdGlvbiB8fCBmcmFtZUluZGV4ICE9PSAtMSkgcmV0dXJuXG4gICAgc2VxdWVuY2VSZWYuY3VycmVudCA9XG4gICAgICBDTElDS19BTklNQVRJT05TW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIENMSUNLX0FOSU1BVElPTlMubGVuZ3RoKV0hXG4gICAgc2V0RnJhbWVJbmRleCgwKVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZnJhbWVJbmRleCA9PT0gLTEpIHJldHVyblxuICAgIGlmIChmcmFtZUluZGV4ID49IHNlcXVlbmNlUmVmLmN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICBzZXRGcmFtZUluZGV4KC0xKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChzZXRGcmFtZUluZGV4LCBGUkFNRV9NUywgaW5jcmVtZW50RnJhbWUpXG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lcilcbiAgfSwgW2ZyYW1lSW5kZXhdKVxuXG4gIGNvbnN0IHNlcSA9IHNlcXVlbmNlUmVmLmN1cnJlbnRcbiAgY29uc3QgY3VycmVudCA9XG4gICAgZnJhbWVJbmRleCA+PSAwICYmIGZyYW1lSW5kZXggPCBzZXEubGVuZ3RoID8gc2VxW2ZyYW1lSW5kZXhdISA6IElETEVcbiAgcmV0dXJuIHsgcG9zZTogY3VycmVudC5wb3NlLCBib3VuY2VPZmZzZXQ6IGN1cnJlbnQub2Zmc2V0LCBvbkNsaWNrIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsU0FBUyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ25ELFNBQVNDLEdBQUcsUUFBUSxjQUFjO0FBQ2xDLFNBQVNDLGtCQUFrQixRQUFRLGtDQUFrQztBQUNyRSxTQUFTQyxLQUFLLEVBQUUsS0FBS0MsU0FBUyxRQUFRLFlBQVk7QUFFbEQsS0FBS0MsS0FBSyxHQUFHO0VBQUVDLElBQUksRUFBRUYsU0FBUztFQUFFRyxNQUFNLEVBQUUsTUFBTTtBQUFDLENBQUM7O0FBRWhEO0FBQ0EsU0FBU0MsSUFBSUEsQ0FBQ0YsSUFBSSxFQUFFRixTQUFTLEVBQUVHLE1BQU0sRUFBRSxNQUFNLEVBQUVFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRUosS0FBSyxFQUFFLENBQUM7RUFDdEUsT0FBT0ssS0FBSyxDQUFDQyxJQUFJLENBQUM7SUFBRUMsTUFBTSxFQUFFSDtF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