@echothink-ui/motion 0.1.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/README.md +5 -0
- package/dist/components/AgentThinkingAnimation.d.ts +2 -0
- package/dist/components/AttentionPulse.d.ts +2 -0
- package/dist/components/DAGStatusTransition.d.ts +2 -0
- package/dist/components/DocumentLockPulse.d.ts +2 -0
- package/dist/components/PipelineFlowAnimation.d.ts +2 -0
- package/dist/components/ProgressTransition.d.ts +2 -0
- package/dist/components/SkeletonLoadingPattern.d.ts +2 -0
- package/dist/components/StatusChangeAnimation.d.ts +2 -0
- package/dist/components/StepCompletionAnimation.d.ts +2 -0
- package/dist/components/StreamingText.d.ts +2 -0
- package/dist/components/SyncProgressAnimation.d.ts +2 -0
- package/dist/components/motionUtils.d.ts +5 -0
- package/dist/components/types.d.ts +82 -0
- package/dist/index.cjs +2381 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +2333 -0
- package/dist/index.js.map +1 -0
- package/package.json +38 -0
- package/src/components/AgentThinkingAnimation.tsx +59 -0
- package/src/components/AttentionPulse.tsx +57 -0
- package/src/components/DAGStatusTransition.tsx +292 -0
- package/src/components/DocumentLockPulse.tsx +72 -0
- package/src/components/PipelineFlowAnimation.tsx +243 -0
- package/src/components/ProgressTransition.tsx +51 -0
- package/src/components/SkeletonLoadingPattern.tsx +248 -0
- package/src/components/StatusChangeAnimation.test.tsx +20 -0
- package/src/components/StatusChangeAnimation.tsx +89 -0
- package/src/components/StepCompletionAnimation.tsx +75 -0
- package/src/components/StreamingText.tsx +77 -0
- package/src/components/SyncProgressAnimation.test.tsx +49 -0
- package/src/components/SyncProgressAnimation.tsx +256 -0
- package/src/components/motionUtils.tsx +942 -0
- package/src/components/types.ts +111 -0
- package/src/index.test.tsx +97 -0
- package/src/index.tsx +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/motionUtils.tsx","../src/components/AgentThinkingAnimation.tsx","../src/components/AttentionPulse.tsx","../src/components/DAGStatusTransition.tsx","../src/components/DocumentLockPulse.tsx","../src/components/PipelineFlowAnimation.tsx","../src/components/ProgressTransition.tsx","../src/components/SkeletonLoadingPattern.tsx","../src/components/StatusChangeAnimation.tsx","../src/components/StepCompletionAnimation.tsx","../src/components/StreamingText.tsx","../src/components/SyncProgressAnimation.tsx","../src/index.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type { EthOperationalStatus, EthSeverity } from \"@echothink-ui/core\";\n\nconst reducedMotionQuery = \"(prefers-reduced-motion: reduce)\";\n\nexport function usePrefersReducedMotion() {\n return React.useSyncExternalStore(\n subscribeToReducedMotion,\n getReducedMotionSnapshot,\n getReducedMotionServerSnapshot\n );\n}\n\nfunction subscribeToReducedMotion(onStoreChange: () => void) {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return () => {};\n }\n\n const media = window.matchMedia(reducedMotionQuery);\n const listener = () => onStoreChange();\n media.addEventListener?.(\"change\", listener);\n return () => media.removeEventListener?.(\"change\", listener);\n}\n\nfunction getReducedMotionSnapshot() {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return false;\n return window.matchMedia(reducedMotionQuery).matches;\n}\n\nfunction getReducedMotionServerSnapshot() {\n return false;\n}\n\nexport function MotionStyles() {\n return (\n <style>{`\n @keyframes eth-motion-flow-dash { to { stroke-dashoffset: -24; } }\n @keyframes eth-motion-pulse { 0% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.035); opacity: .72; } 100% { transform: scale(1); opacity: 1; } }\n @keyframes eth-motion-attention-ring { 0% { opacity: .52; transform: scale(.64); } 70%, 100% { opacity: 0; transform: scale(1.8); } }\n @keyframes eth-motion-flow-node-pulse { 0% { opacity: .42; stroke-width: 1; } 100% { opacity: 0; stroke-width: 7; } }\n @keyframes eth-motion-dot { 0%, 80%, 100% { opacity: .28; transform: translateY(0); } 40% { opacity: 1; transform: translateY(-3px); } }\n @keyframes eth-motion-spin { to { transform: rotate(360deg); } }\n @keyframes eth-motion-sync-sweep { 0% { transform: translateX(-120%); } 100% { transform: translateX(320%); } }\n @keyframes eth-motion-shimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } }\n @keyframes eth-motion-check { 0% { transform: scale(.78); opacity: 0; } 100% { transform: scale(1); opacity: 1; } }\n @keyframes eth-motion-step-check { 0% { stroke-dashoffset: 18; } 100% { stroke-dashoffset: 0; } }\n @keyframes eth-motion-step-current { 0% { box-shadow: 0 0 0 0 rgba(15, 98, 254, .24); } 100% { box-shadow: 0 0 0 .375rem rgba(15, 98, 254, 0); } }\n @keyframes eth-motion-status-ring { 0% { stroke-dashoffset: 18; opacity: .18; } 55% { opacity: .48; } 100% { stroke-dashoffset: 0; opacity: .32; } }\n @keyframes eth-motion-status-halo { 0% { opacity: .36; transform: scale(.68); } 100% { opacity: 0; transform: scale(1.85); } }\n @keyframes eth-motion-lock-pulse { 0% { opacity: .34; transform: scale(.72); } 70%, 100% { opacity: 0; transform: scale(1.72); } }\n @keyframes eth-motion-stream-cursor { 0%, 46% { opacity: 1; } 47%, 100% { opacity: 0; } }\n .eth-motion-streaming-text {\n align-items: baseline;\n color: var(--cds-text-primary, #161616);\n display: inline-flex;\n font-family: var(--cds-font-family, \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif);\n font-size: inherit;\n line-height: inherit;\n max-inline-size: 100%;\n min-inline-size: 0;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n .eth-motion-streaming-text__content {\n min-inline-size: 0;\n }\n .eth-motion-streaming-text__cursor {\n background: var(--cds-interactive, #0f62fe);\n block-size: 1em;\n display: inline-block;\n flex: 0 0 auto;\n inline-size: 2px;\n margin-inline-start: .125rem;\n transform: translateY(.125em);\n }\n .eth-motion-streaming-text--streaming .eth-motion-streaming-text__cursor {\n animation: eth-motion-stream-cursor 1s steps(1, end) infinite;\n }\n .eth-motion-streaming-text--complete .eth-motion-streaming-text__cursor {\n inline-size: 0;\n margin-inline-start: 0;\n opacity: 0;\n }\n .eth-motion-pipeline-flow {\n color: var(--cds-text-primary, #161616);\n display: block;\n font-family: var(--cds-font-family, \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif);\n inline-size: fit-content;\n max-inline-size: 100%;\n }\n .eth-motion-pipeline-flow__svg {\n block-size: auto;\n display: block;\n font-family: inherit;\n max-inline-size: 100%;\n overflow: visible;\n }\n .eth-motion-pipeline-flow__edge {\n stroke-linecap: round;\n stroke-linejoin: round;\n vector-effect: non-scaling-stroke;\n }\n .eth-motion-pipeline-flow__card {\n fill: var(--cds-layer-02, #ffffff);\n shape-rendering: crispEdges;\n stroke: var(--cds-border-subtle, #e0e0e0);\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n }\n .eth-motion-pipeline-flow__node--active .eth-motion-pipeline-flow__card {\n fill: var(--cds-layer-01, #f4f4f4);\n stroke: var(--cds-border-strong, #8d8d8d);\n }\n .eth-motion-pipeline-flow__stripe {\n shape-rendering: crispEdges;\n }\n .eth-motion-pipeline-flow__pulse {\n animation: eth-motion-flow-node-pulse 1.3s var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) infinite;\n vector-effect: non-scaling-stroke;\n }\n .eth-motion-pipeline-flow__dot {\n stroke: var(--cds-layer-02, #ffffff);\n stroke-width: 2;\n vector-effect: non-scaling-stroke;\n }\n .eth-motion-pipeline-flow__label {\n fill: var(--cds-text-primary, #161616);\n font-size: 13px;\n font-weight: 600;\n }\n .eth-motion-pipeline-flow__status {\n fill: var(--cds-text-secondary, #525252);\n font-size: 11px;\n }\n .eth-motion-pipeline-flow__empty {\n fill: var(--cds-text-secondary, #525252);\n font-size: 13px;\n }\n .eth-motion-pipeline-flow__fallback {\n block-size: 1px;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n inline-size: 1px;\n margin: 0;\n overflow: hidden;\n padding: 0;\n position: absolute;\n white-space: nowrap;\n }\n .eth-motion-dag-status {\n color: var(--cds-text-primary, #161616);\n display: block;\n max-inline-size: 100%;\n }\n .eth-motion-dag-status__svg {\n block-size: auto;\n display: block;\n font-family: var(--cds-font-family, \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif);\n max-inline-size: 100%;\n overflow: visible;\n }\n .eth-motion-dag-status__edge {\n stroke-linecap: round;\n stroke-linejoin: round;\n vector-effect: non-scaling-stroke;\n }\n .eth-motion-dag-status__card {\n shape-rendering: crispEdges;\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n }\n .eth-motion-dag-status__change-ring {\n animation: eth-motion-status-ring 700ms var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) 1;\n stroke-dasharray: 4 4;\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n }\n .eth-motion-dag-status__label {\n fill: var(--cds-text-primary, #161616);\n font-size: 13px;\n font-weight: 600;\n }\n .eth-motion-dag-status__status {\n fill: var(--cds-text-secondary, #525252);\n font-size: 11px;\n }\n .eth-motion-dag-status__fallback {\n block-size: 1px;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n inline-size: 1px;\n margin: 0;\n overflow: hidden;\n padding: 0;\n position: absolute;\n white-space: nowrap;\n }\n .eth-motion-sync-progress {\n --eth-motion-sync-accent: var(--cds-interactive, #0f62fe);\n --eth-motion-sync-accent-soft: var(--cds-highlight, #edf5ff);\n\n box-sizing: border-box;\n color: var(--cds-text-primary, #161616);\n font-family: var(--cds-font-family, \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif);\n line-height: 1.2857;\n max-inline-size: 100%;\n min-inline-size: 0;\n }\n .eth-motion-sync-progress *,\n .eth-motion-sync-progress *::before,\n .eth-motion-sync-progress *::after {\n box-sizing: border-box;\n }\n .eth-motion-sync-progress--compact {\n align-items: center;\n background: var(--cds-layer-01, #ffffff);\n border: 1px solid var(--cds-border-subtle-01, var(--cds-border-subtle, #e0e0e0));\n border-inline-start: 3px solid var(--eth-motion-sync-accent);\n display: inline-flex;\n gap: var(--cds-spacing-03, .5rem);\n inline-size: fit-content;\n min-block-size: 2rem;\n padding: .375rem .75rem .375rem .625rem;\n vertical-align: middle;\n }\n .eth-motion-sync-progress--detailed {\n align-items: stretch;\n background: var(--cds-layer-01, #ffffff);\n border: 1px solid var(--cds-border-subtle-01, var(--cds-border-subtle, #e0e0e0));\n border-inline-start: 4px solid var(--eth-motion-sync-accent);\n display: grid;\n grid-template-columns: 1.5rem minmax(0, 1fr);\n inline-size: 100%;\n max-inline-size: 52rem;\n min-block-size: 7.5rem;\n }\n .eth-motion-sync-progress__indicator {\n align-items: center;\n color: var(--eth-motion-sync-accent);\n display: inline-flex;\n flex: 0 0 auto;\n inline-size: 1.125rem;\n justify-content: center;\n }\n .eth-motion-sync-progress--detailed .eth-motion-sync-progress__indicator {\n align-items: start;\n inline-size: auto;\n justify-content: center;\n padding-block-start: var(--cds-spacing-05, 1rem);\n padding-inline-start: var(--cds-spacing-04, .75rem);\n }\n .eth-motion-sync-progress__spinner,\n .eth-motion-sync-progress__glyph {\n block-size: 1rem;\n border-radius: 50%;\n display: inline-block;\n inline-size: 1rem;\n }\n .eth-motion-sync-progress__spinner {\n animation: eth-motion-spin 850ms linear infinite;\n border: 2px solid var(--cds-border-subtle-01, #c6c6c6);\n border-block-start-color: var(--eth-motion-sync-accent);\n }\n .eth-motion-sync-progress__glyph {\n background: var(--eth-motion-sync-accent);\n box-shadow: inset 0 0 0 3px var(--cds-layer-01, #ffffff);\n }\n .eth-motion-sync-progress__compact-copy {\n align-items: baseline;\n display: inline-flex;\n gap: var(--cds-spacing-03, .5rem);\n min-inline-size: 0;\n }\n .eth-motion-sync-progress__label {\n color: var(--cds-text-primary, #161616);\n font-size: var(--cds-body-compact-01-font-size, .875rem);\n font-weight: 600;\n line-height: var(--cds-body-compact-01-line-height, 1.2857);\n min-inline-size: 0;\n overflow-wrap: anywhere;\n }\n .eth-motion-sync-progress__compact-state {\n color: var(--cds-text-secondary, #525252);\n flex: 0 0 auto;\n font-size: var(--cds-label-01-font-size, .75rem);\n line-height: var(--cds-label-01-line-height, 1.3333);\n white-space: nowrap;\n }\n .eth-motion-sync-progress__body {\n display: grid;\n gap: var(--cds-spacing-04, .75rem);\n min-inline-size: 0;\n padding: var(--cds-spacing-05, 1rem);\n }\n .eth-motion-sync-progress__header {\n align-items: start;\n display: flex;\n gap: var(--cds-spacing-04, .75rem);\n justify-content: space-between;\n min-inline-size: 0;\n }\n .eth-motion-sync-progress__title-group {\n display: grid;\n gap: var(--cds-spacing-01, .125rem);\n min-inline-size: 0;\n }\n .eth-motion-sync-progress__eyebrow,\n .eth-motion-sync-progress__description,\n .eth-motion-sync-progress__progress-copy,\n .eth-motion-sync-progress__meta dt {\n color: var(--cds-text-secondary, #525252);\n font-size: var(--cds-label-01-font-size, .75rem);\n line-height: var(--cds-label-01-line-height, 1.3333);\n }\n .eth-motion-sync-progress__eyebrow,\n .eth-motion-sync-progress__meta dt {\n font-weight: 600;\n text-transform: uppercase;\n }\n .eth-motion-sync-progress__description {\n margin: 0;\n max-inline-size: 38rem;\n overflow-wrap: anywhere;\n }\n .eth-motion-sync-progress__chip {\n align-items: center;\n background: var(--eth-motion-sync-accent-soft);\n border: 1px solid var(--cds-border-subtle-01, var(--cds-border-subtle, #e0e0e0));\n color: var(--cds-text-primary, #161616);\n display: inline-flex;\n flex: 0 0 auto;\n font-size: var(--cds-label-01-font-size, .75rem);\n font-weight: 600;\n gap: var(--cds-spacing-02, .25rem);\n line-height: var(--cds-label-01-line-height, 1.3333);\n min-block-size: 1.5rem;\n padding: .1875rem var(--cds-spacing-03, .5rem);\n white-space: nowrap;\n }\n .eth-motion-sync-progress__chip-dot {\n background: var(--eth-motion-sync-accent);\n block-size: .5rem;\n border-radius: 50%;\n display: inline-block;\n inline-size: .5rem;\n }\n .eth-motion-sync-progress__meter {\n display: grid;\n gap: var(--cds-spacing-03, .5rem);\n min-inline-size: 0;\n }\n .eth-motion-sync-progress__track {\n background: var(--cds-border-subtle-01, var(--cds-border-subtle, #e0e0e0));\n block-size: .5rem;\n inline-size: 100%;\n overflow: hidden;\n position: relative;\n }\n .eth-motion-sync-progress__bar {\n background: var(--eth-motion-sync-accent);\n block-size: 100%;\n display: block;\n min-inline-size: .25rem;\n transition: inline-size var(--cds-duration-fast-02, 110ms)\n var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9));\n }\n .eth-motion-sync-progress__bar--indeterminate {\n animation: eth-motion-sync-sweep 1.35s var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) infinite;\n inline-size: 34%;\n }\n .eth-motion-sync-progress__progress-copy {\n font-variant-numeric: tabular-nums;\n justify-self: end;\n }\n .eth-motion-sync-progress__meta {\n background: var(--cds-layer-02, #f4f4f4);\n border-block-start: 1px solid var(--cds-border-subtle-01, var(--cds-border-subtle, #e0e0e0));\n display: grid;\n gap: 0;\n grid-column: 1 / -1;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 10rem), 1fr));\n margin: 0;\n min-inline-size: 0;\n }\n .eth-motion-sync-progress__meta-item {\n display: grid;\n gap: var(--cds-spacing-02, .25rem);\n min-inline-size: 0;\n padding: var(--cds-spacing-04, .75rem) var(--cds-spacing-05, 1rem);\n }\n .eth-motion-sync-progress__meta-item + .eth-motion-sync-progress__meta-item {\n border-inline-start: 1px solid var(--cds-border-subtle-01, var(--cds-border-subtle, #e0e0e0));\n }\n .eth-motion-sync-progress__meta dd {\n color: var(--cds-text-primary, #161616);\n font-size: var(--cds-body-compact-01-font-size, .875rem);\n font-weight: 600;\n line-height: var(--cds-body-compact-01-line-height, 1.2857);\n margin: 0;\n min-inline-size: 0;\n overflow-wrap: anywhere;\n }\n .eth-motion-sync-progress.eth-motion-reduced .eth-motion-sync-progress__bar--indeterminate {\n animation: none;\n inline-size: 38%;\n }\n .eth-motion-skeleton-loading {\n color: var(--cds-text-primary, #161616);\n display: block;\n font-family: var(--cds-font-family, \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif);\n inline-size: 100%;\n max-inline-size: 100%;\n min-inline-size: 0;\n }\n .eth-motion-skeleton-loading__surface {\n background: var(--cds-layer-01, #f4f4f4);\n border: 1px solid var(--cds-border-subtle, #e0e0e0);\n display: grid;\n inline-size: 100%;\n min-inline-size: 0;\n overflow: hidden;\n }\n .eth-motion-skeleton-loading__block {\n background: var(--cds-skeleton-background, #e0e0e0);\n block-size: .875rem;\n display: block;\n inline-size: 100%;\n min-inline-size: .75rem;\n }\n .eth-motion-skeleton-loading:not(.eth-motion-reduced) .eth-motion-skeleton-loading__block {\n animation: eth-motion-shimmer 1.2s var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) infinite;\n background-image: linear-gradient(\n 90deg,\n var(--cds-skeleton-background, #e0e0e0) 0%,\n var(--cds-skeleton-element, #f4f4f4) 46%,\n var(--cds-skeleton-background, #e0e0e0) 82%\n );\n background-size: 200% 100%;\n }\n .eth-motion-skeleton-loading__surface--article {\n gap: var(--cds-spacing-05, 1rem);\n padding: var(--cds-spacing-05, 1rem);\n }\n .eth-motion-skeleton-loading__article-header,\n .eth-motion-skeleton-loading__article-body,\n .eth-motion-skeleton-loading__card-body,\n .eth-motion-skeleton-loading__list-copy {\n display: grid;\n gap: var(--cds-spacing-03, .5rem);\n min-inline-size: 0;\n }\n .eth-motion-skeleton-loading__article-body,\n .eth-motion-skeleton-loading__card-body {\n gap: var(--cds-spacing-04, .75rem);\n }\n .eth-motion-skeleton-loading__block--eyebrow {\n block-size: .5rem;\n }\n .eth-motion-skeleton-loading__block--title {\n block-size: 1.125rem;\n }\n .eth-motion-skeleton-loading__block--caption,\n .eth-motion-skeleton-loading__block--column {\n block-size: .625rem;\n }\n .eth-motion-skeleton-loading__surface--card {\n background: var(--cds-layer-01, #ffffff);\n }\n .eth-motion-skeleton-loading__block--media {\n block-size: 6rem;\n inline-size: 100%;\n }\n .eth-motion-skeleton-loading__card-body {\n padding: var(--cds-spacing-05, 1rem);\n }\n .eth-motion-skeleton-loading__card-metrics {\n border-block-start: 1px solid var(--cds-border-subtle, #e0e0e0);\n display: grid;\n gap: var(--cds-spacing-05, 1rem);\n grid-template-columns: repeat(3, minmax(0, 1fr));\n padding: var(--cds-spacing-04, .75rem) var(--cds-spacing-05, 1rem);\n }\n .eth-motion-skeleton-loading__block--metric {\n block-size: 1.5rem;\n }\n .eth-motion-skeleton-loading__list-row {\n align-items: center;\n display: grid;\n gap: var(--cds-spacing-04, .75rem);\n grid-template-columns: 2rem minmax(0, 1fr) minmax(3rem, 5rem);\n min-block-size: 4rem;\n padding: var(--cds-spacing-04, .75rem);\n }\n .eth-motion-skeleton-loading__list-row + .eth-motion-skeleton-loading__list-row {\n border-block-start: 1px solid var(--cds-border-subtle, #e0e0e0);\n }\n .eth-motion-skeleton-loading__block--avatar {\n block-size: 2rem;\n inline-size: 2rem;\n }\n .eth-motion-skeleton-loading__block--tag {\n block-size: 1.25rem;\n justify-self: end;\n }\n .eth-motion-skeleton-loading__surface--table {\n background: var(--cds-layer-01, #ffffff);\n }\n .eth-motion-skeleton-loading__table-header,\n .eth-motion-skeleton-loading__table-row {\n display: grid;\n gap: var(--cds-spacing-05, 1rem);\n min-inline-size: 0;\n }\n .eth-motion-skeleton-loading__table-header {\n align-items: center;\n background: var(--cds-layer-02, #f4f4f4);\n min-block-size: 2.5rem;\n padding: var(--cds-spacing-04, .75rem);\n }\n .eth-motion-skeleton-loading__table-row {\n align-items: center;\n border-block-start: 1px solid var(--cds-border-subtle, #e0e0e0);\n min-block-size: 3rem;\n padding: var(--cds-spacing-04, .75rem);\n }\n .eth-motion-skeleton-loading__block--cell {\n block-size: .75rem;\n }\n @media (max-width: 42rem) {\n .eth-motion-sync-progress__header {\n align-items: stretch;\n flex-direction: column;\n }\n .eth-motion-sync-progress__chip {\n align-self: start;\n }\n .eth-motion-sync-progress__meta {\n grid-template-columns: minmax(0, 1fr);\n }\n .eth-motion-sync-progress__meta-item + .eth-motion-sync-progress__meta-item {\n border-block-start: 1px solid var(--cds-border-subtle-01, var(--cds-border-subtle, #e0e0e0));\n border-inline-start: 0;\n }\n .eth-motion-skeleton-loading__list-row {\n grid-template-columns: 2rem minmax(0, 1fr);\n }\n .eth-motion-skeleton-loading__block--tag {\n display: none;\n }\n .eth-motion-skeleton-loading__table-header,\n .eth-motion-skeleton-loading__table-row {\n gap: var(--cds-spacing-04, .75rem);\n }\n }\n .eth-motion-status-change {\n --eth-motion-status-color: var(--cds-interactive, #0f62fe);\n --eth-motion-status-previous-color: var(--cds-text-secondary, #525252);\n\n align-items: center;\n background: var(--cds-layer-01, #ffffff);\n border: 1px solid var(--cds-border-subtle-01, var(--cds-border-subtle, #e0e0e0));\n border-inline-start: 3px solid var(--eth-motion-status-color);\n border-radius: var(--cds-radius-sm, 2px);\n box-sizing: border-box;\n color: var(--cds-text-primary, #161616);\n display: inline-flex;\n font-family: var(--cds-font-family, \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif);\n gap: var(--cds-spacing-04, .75rem);\n inline-size: fit-content;\n line-height: 1.2857;\n max-inline-size: 100%;\n min-block-size: 2.5rem;\n padding: .5rem .75rem .5rem .625rem;\n vertical-align: middle;\n }\n .eth-motion-status-change--changed {\n animation: eth-motion-pulse 650ms var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) 1;\n background: var(--cds-layer-02, #f4f4f4);\n }\n .eth-motion-status-change__indicator {\n align-items: center;\n display: inline-flex;\n flex: 0 0 auto;\n inline-size: 2.5rem;\n }\n .eth-motion-status-change__previous-dot,\n .eth-motion-status-change__current-dot {\n border-radius: 50%;\n box-sizing: border-box;\n display: inline-block;\n flex: 0 0 auto;\n }\n .eth-motion-status-change__previous-dot {\n background: var(--eth-motion-status-previous-color);\n block-size: .5rem;\n inline-size: .5rem;\n opacity: .64;\n }\n .eth-motion-status-change__connector {\n background: var(--cds-border-strong-01, #8d8d8d);\n block-size: 1px;\n flex: 1 1 auto;\n margin-inline: .25rem;\n min-inline-size: .625rem;\n }\n .eth-motion-status-change__current-dot {\n background: var(--eth-motion-status-color);\n block-size: .625rem;\n box-shadow: 0 0 0 2px var(--cds-layer-01, #ffffff);\n inline-size: .625rem;\n position: relative;\n }\n .eth-motion-status-change--changed .eth-motion-status-change__current-dot::after {\n animation: eth-motion-status-halo 700ms var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) 1;\n border: 1px solid var(--eth-motion-status-color);\n border-radius: 50%;\n content: \"\";\n inset: -.375rem;\n opacity: 0;\n position: absolute;\n }\n .eth-motion-status-change__content {\n display: grid;\n gap: var(--cds-spacing-01, .125rem);\n min-inline-size: 0;\n }\n .eth-motion-status-change__label {\n color: var(--cds-text-primary, #161616);\n font-size: var(--cds-body-compact-01-font-size, .875rem);\n font-weight: 600;\n line-height: var(--cds-body-compact-01-line-height, 1.2857);\n min-inline-size: 0;\n overflow-wrap: anywhere;\n }\n .eth-motion-status-change__state {\n align-items: center;\n color: var(--cds-text-secondary, #525252);\n display: flex;\n flex-wrap: wrap;\n font-size: var(--cds-label-01-font-size, .75rem);\n gap: var(--cds-spacing-02, .25rem);\n line-height: var(--cds-label-01-line-height, 1.3333);\n min-inline-size: 0;\n }\n .eth-motion-status-change__previous,\n .eth-motion-status-change__current {\n overflow-wrap: anywhere;\n }\n .eth-motion-status-change__current {\n color: var(--cds-text-primary, #161616);\n font-weight: 600;\n }\n .eth-motion-status-change__separator {\n color: var(--cds-text-secondary, #525252);\n }\n .eth-motion-attention-pulse {\n --eth-motion-attention-color: var(--cds-support-warning, #f1c21b);\n --eth-motion-attention-border: #8a6a00;\n --eth-motion-attention-ink: var(--cds-text-primary, #161616);\n --eth-motion-attention-repeat: infinite;\n\n align-items: center;\n background: var(--cds-layer-02, #ffffff);\n border: 1px solid var(--cds-border-subtle, #e0e0e0);\n border-radius: var(--cds-radius-sm, 2px);\n box-shadow: inset 3px 0 0 var(--eth-motion-attention-color);\n color: var(--cds-text-primary, #161616);\n display: inline-flex;\n font-size: .875rem;\n font-weight: 500;\n gap: var(--cds-spacing-03, .5rem);\n inline-size: fit-content;\n line-height: 1.2857;\n max-inline-size: 100%;\n min-block-size: 2rem;\n padding: .375rem .75rem .375rem .625rem;\n vertical-align: middle;\n }\n .eth-motion-attention-pulse__marker {\n align-items: center;\n block-size: 1rem;\n display: inline-flex;\n flex: 0 0 auto;\n inline-size: 1rem;\n justify-content: center;\n position: relative;\n }\n .eth-motion-attention-pulse__marker::before {\n animation: eth-motion-attention-ring 1.4s var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) var(--eth-motion-attention-repeat);\n border: 1px solid var(--eth-motion-attention-color);\n border-radius: 50%;\n content: \"\";\n inset: -.125rem;\n position: absolute;\n }\n .eth-motion-attention-pulse__dot {\n align-items: center;\n background: var(--eth-motion-attention-color);\n block-size: 1rem;\n border: 1px solid var(--eth-motion-attention-border);\n border-radius: 50%;\n color: var(--eth-motion-attention-ink);\n display: inline-flex;\n font-size: .6875rem;\n font-weight: 700;\n inline-size: 1rem;\n justify-content: center;\n line-height: 1;\n position: relative;\n }\n .eth-motion-attention-pulse__label {\n min-inline-size: 0;\n overflow-wrap: anywhere;\n }\n .eth-motion-attention-pulse.eth-motion-reduced .eth-motion-attention-pulse__marker::before {\n animation: none;\n opacity: .32;\n transform: scale(1);\n }\n .eth-motion-document-lock {\n --eth-motion-document-lock-accent: var(--cds-interactive, #0f62fe);\n\n align-items: center;\n background: var(--cds-layer-01, #ffffff);\n border: 1px solid var(--cds-border-subtle-01, var(--cds-border-subtle, #e0e0e0));\n border-inline-start: 3px solid var(--cds-border-strong-01, #8d8d8d);\n box-sizing: border-box;\n color: var(--cds-text-primary, #161616);\n display: inline-flex;\n font-family: var(--cds-font-family, \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif);\n gap: var(--cds-spacing-03, .5rem);\n inline-size: fit-content;\n line-height: 1.2857;\n max-inline-size: 100%;\n min-block-size: 2.5rem;\n padding: .375rem .75rem .375rem .625rem;\n vertical-align: middle;\n }\n .eth-motion-document-lock--active {\n background: var(--cds-layer-02, #f4f4f4);\n border-inline-start-color: var(--eth-motion-document-lock-accent);\n }\n .eth-motion-document-lock__indicator {\n align-items: center;\n block-size: 1.25rem;\n color: var(--cds-icon-secondary, #525252);\n display: inline-flex;\n flex: 0 0 auto;\n inline-size: 1.25rem;\n justify-content: center;\n position: relative;\n }\n .eth-motion-document-lock--active .eth-motion-document-lock__indicator {\n color: var(--eth-motion-document-lock-accent);\n }\n .eth-motion-document-lock__pulse {\n border: 1px solid currentColor;\n border-radius: 50%;\n inset: .125rem;\n opacity: 0;\n position: absolute;\n }\n .eth-motion-document-lock--active .eth-motion-document-lock__pulse {\n animation: eth-motion-lock-pulse 1.45s var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) infinite;\n opacity: .34;\n }\n .eth-motion-document-lock__icon {\n block-size: 1rem;\n inline-size: 1rem;\n position: relative;\n }\n .eth-motion-document-lock__content {\n display: grid;\n gap: 0;\n min-inline-size: 0;\n }\n .eth-motion-document-lock__state {\n color: var(--cds-text-secondary, #525252);\n font-size: .75rem;\n font-weight: 600;\n line-height: 1.3333;\n }\n .eth-motion-document-lock--active .eth-motion-document-lock__state {\n color: var(--cds-link-primary, #0f62fe);\n }\n .eth-motion-document-lock__owner {\n color: var(--cds-text-primary, #161616);\n font-size: .875rem;\n font-weight: 600;\n line-height: 1.2857;\n overflow-wrap: anywhere;\n }\n .eth-motion-document-lock.eth-motion-reduced .eth-motion-document-lock__pulse {\n animation: none;\n opacity: .18;\n transform: scale(1);\n }\n .eth-motion-step-completion {\n align-items: start;\n color: var(--cds-text-primary, #161616);\n display: inline-grid;\n font-family: var(--cds-font-family, \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif);\n font-size: var(--cds-body-compact-01-font-size, .875rem);\n gap: var(--cds-spacing-03, .5rem);\n grid-template-columns: 1.5rem minmax(0, 1fr);\n line-height: var(--cds-body-compact-01-line-height, 1.4286);\n max-inline-size: 100%;\n min-inline-size: 0;\n vertical-align: middle;\n }\n .eth-motion-step-completion__marker {\n align-items: center;\n background: var(--cds-layer-01, #ffffff);\n block-size: 1.5rem;\n border: 1px solid var(--cds-border-strong-01, #8d8d8d);\n border-radius: 50%;\n color: var(--cds-icon-secondary, #525252);\n display: inline-flex;\n flex: 0 0 auto;\n inline-size: 1.5rem;\n justify-content: center;\n margin-block-start: .0625rem;\n }\n .eth-motion-step-completion--completed .eth-motion-step-completion__marker {\n animation: eth-motion-check 220ms var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) 1;\n background: var(--cds-support-success, #24a148);\n border-color: var(--cds-support-success, #24a148);\n color: var(--cds-text-on-color, #ffffff);\n }\n .eth-motion-step-completion--current .eth-motion-step-completion__marker {\n animation: eth-motion-step-current 1.25s var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) infinite;\n background: var(--cds-highlight, #edf5ff);\n border-color: var(--cds-interactive, #0f62fe);\n color: var(--cds-interactive, #0f62fe);\n }\n .eth-motion-step-completion--pending .eth-motion-step-completion__marker {\n background: var(--cds-layer-02, #f4f4f4);\n border-color: var(--cds-border-strong-01, #8d8d8d);\n color: var(--cds-icon-secondary, #525252);\n }\n .eth-motion-step-completion__check {\n block-size: 1rem;\n display: block;\n inline-size: 1rem;\n }\n .eth-motion-step-completion__check-path {\n animation: eth-motion-step-check 260ms var(--cds-productive-standard-easing, cubic-bezier(.2, 0, .38, .9)) 90ms both;\n fill: none;\n stroke: currentColor;\n stroke-dasharray: 18;\n stroke-dashoffset: 18;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 2;\n }\n .eth-motion-step-completion__dot {\n background: currentColor;\n block-size: .4375rem;\n border-radius: 50%;\n display: block;\n inline-size: .4375rem;\n }\n .eth-motion-step-completion--current .eth-motion-step-completion__dot {\n block-size: .5rem;\n inline-size: .5rem;\n }\n .eth-motion-step-completion__content {\n display: grid;\n gap: .125rem;\n min-inline-size: 0;\n }\n .eth-motion-step-completion__label {\n color: var(--cds-text-primary, #161616);\n font-weight: 600;\n overflow-wrap: anywhere;\n }\n .eth-motion-step-completion__state {\n color: var(--cds-text-secondary, #525252);\n font-size: var(--cds-label-01-font-size, .75rem);\n font-weight: 600;\n line-height: var(--cds-label-01-line-height, 1.3333);\n }\n .eth-motion-step-completion--completed .eth-motion-step-completion__state {\n color: var(--cds-support-success-strong, #198038);\n }\n .eth-motion-step-completion--current .eth-motion-step-completion__state {\n color: var(--cds-link-primary, #0f62fe);\n }\n .eth-motion-step-completion__description {\n color: var(--cds-text-secondary, #525252);\n font-size: var(--cds-label-01-font-size, .75rem);\n line-height: var(--cds-label-01-line-height, 1.3333);\n overflow-wrap: anywhere;\n }\n .eth-motion-step-completion.eth-motion-reduced .eth-motion-step-completion__check-path {\n stroke-dashoffset: 0;\n }\n .eth-motion-reduced,\n .eth-motion-reduced * { animation: none !important; transition: none !important; }\n `}</style>\n );\n}\n\nexport function statusColor(status: EthOperationalStatus) {\n switch (status) {\n case \"succeeded\":\n case \"completed\":\n case \"synced\":\n return \"#24a148\";\n case \"failed\":\n case \"blocked\":\n return \"#da1e28\";\n case \"warning\":\n case \"pending-approval\":\n case \"approval-required\":\n return \"#f1c21b\";\n case \"running\":\n case \"in-progress\":\n case \"active\":\n return \"#0f62fe\";\n case \"paused\":\n case \"stale\":\n return \"#8d8d8d\";\n default:\n return \"#6f6f6f\";\n }\n}\n\nexport function severityColor(severity: EthSeverity | undefined) {\n switch (severity) {\n case \"danger\":\n return \"#da1e28\";\n case \"warning\":\n return \"#f1c21b\";\n case \"success\":\n return \"#24a148\";\n case \"info\":\n return \"#0f62fe\";\n default:\n return \"#6f6f6f\";\n }\n}\n","import * as React from \"react\";\nimport type { AgentThinkingAnimationProps } from \"./types\";\nimport { MotionStyles, usePrefersReducedMotion } from \"./motionUtils\";\n\nexport function AgentThinkingAnimation({\n label = \"Agent thinking\",\n className,\n style,\n ...props\n}: AgentThinkingAnimationProps) {\n const reduced = usePrefersReducedMotion();\n const classes = [\n \"eth-motion-agent-thinking\",\n reduced ? \"eth-motion-reduced\" : undefined,\n className\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <span\n {...props}\n className={classes}\n role=\"status\"\n aria-label={label}\n data-eth-component=\"AgentThinkingAnimation\"\n style={{\n alignItems: \"center\",\n color: \"var(--cds-interactive, #0f62fe)\",\n display: \"inline-flex\",\n justifyContent: \"center\",\n lineHeight: 1,\n minBlockSize: 16,\n verticalAlign: \"middle\",\n ...style\n }}\n >\n <MotionStyles />\n <span aria-hidden style={{ alignItems: \"center\", display: \"inline-flex\", gap: 4 }}>\n <span className=\"eth-motion-dot\" style={dotStyle(reduced, 0)} />\n <span className=\"eth-motion-dot\" style={dotStyle(reduced, 1)} />\n <span className=\"eth-motion-dot\" style={dotStyle(reduced, 2)} />\n </span>\n </span>\n );\n}\n\nfunction dotStyle(reduced: boolean, index: number): React.CSSProperties {\n return {\n display: \"inline-block\",\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"currentColor\",\n flex: \"0 0 auto\",\n animation: reduced ? undefined : \"eth-motion-dot 1s ease-in-out infinite\",\n animationDelay: reduced ? undefined : `${index * 120}ms`\n };\n}\n","import * as React from \"react\";\nimport type { AttentionPulseProps } from \"./types\";\nimport { MotionStyles, severityColor, usePrefersReducedMotion } from \"./motionUtils\";\n\nexport function AttentionPulse({\n severity = \"warning\",\n maxRepeats,\n className,\n children,\n role = \"status\",\n style,\n \"aria-label\": ariaLabel,\n ...props\n}: AttentionPulseProps) {\n const reduced = usePrefersReducedMotion();\n const hasLabel = React.Children.count(children) > 0;\n const classes = [\n \"eth-motion-attention-pulse\",\n `eth-motion-attention-pulse--${severity}`,\n reduced ? \"eth-motion-reduced\" : null,\n className\n ]\n .filter(Boolean)\n .join(\" \");\n const attentionStyle = {\n \"--eth-motion-attention-color\": severityColor(severity),\n \"--eth-motion-attention-border\": severityBorderColor(severity),\n \"--eth-motion-attention-ink\": severityInkColor(severity),\n \"--eth-motion-attention-repeat\": String(maxRepeats ?? \"infinite\"),\n ...style\n } as React.CSSProperties;\n\n return (\n <span\n {...props}\n aria-label={ariaLabel ?? (hasLabel ? undefined : \"Attention required\")}\n className={classes}\n data-eth-component=\"AttentionPulse\"\n role={role}\n style={attentionStyle}\n >\n <MotionStyles />\n <span className=\"eth-motion-attention-pulse__marker\" aria-hidden=\"true\">\n <span className=\"eth-motion-attention-pulse__dot\">!</span>\n </span>\n {hasLabel ? <span className=\"eth-motion-attention-pulse__label\">{children}</span> : null}\n </span>\n );\n}\n\nfunction severityBorderColor(severity: AttentionPulseProps[\"severity\"]) {\n return severity === \"warning\" ? \"#8a6a00\" : severityColor(severity);\n}\n\nfunction severityInkColor(severity: AttentionPulseProps[\"severity\"]) {\n return severity === \"warning\" ? \"#161616\" : \"#ffffff\";\n}\n","import * as React from \"react\";\nimport type { DAGStatusTransitionProps, MotionFlowNode } from \"./types\";\nimport { MotionStyles, statusColor, usePrefersReducedMotion } from \"./motionUtils\";\n\nexport function DAGStatusTransition({\n nodes,\n previousNodes,\n edges = [],\n className,\n ...props\n}: DAGStatusTransitionProps) {\n const reduced = usePrefersReducedMotion();\n const previousStatus = new Map(previousNodes?.map((node) => [node.id, node.status]) ?? []);\n const positions = layoutDag(nodes, edges);\n const frame = viewBoxFor(nodes, positions);\n const titleId = React.useId();\n const descriptionId = React.useId();\n const markerBaseId = React.useId();\n const changedCount = nodes.filter(\n (node) => previousStatus.has(node.id) && previousStatus.get(node.id) !== node.status\n ).length;\n\n return (\n <section\n {...props}\n className={`eth-motion-dag-status ${reduced ? \"eth-motion-reduced\" : \"\"} ${className ?? \"\"}`}\n data-eth-component=\"DAGStatusTransition\"\n aria-label=\"DAG status transition\"\n >\n <MotionStyles />\n <svg\n className=\"eth-motion-dag-status__svg\"\n viewBox={frame.viewBox}\n width={frame.width}\n height={frame.height}\n role=\"img\"\n aria-labelledby={`${titleId} ${descriptionId}`}\n >\n <title id={titleId}>DAG status transition</title>\n <desc id={descriptionId}>\n {`${nodes.length} nodes, ${edges.length} edges, ${changedCount} changed node statuses.`}\n </desc>\n <defs>\n {edges.map((edge, index) => {\n const to = positions.get(edge.to);\n if (!to) return null;\n const color = edgeColor(edge, nodes.find((node) => node.id === edge.to)?.status);\n return (\n <marker\n key={`${edge.from}-${edge.to}-${index}`}\n id={markerIdFromUseId(markerBaseId, index)}\n markerWidth=\"8\"\n markerHeight=\"8\"\n refX=\"7\"\n refY=\"3\"\n orient=\"auto\"\n markerUnits=\"strokeWidth\"\n >\n <path d=\"M0,0 L0,6 L7,3 z\" fill={color} />\n </marker>\n );\n })}\n </defs>\n {edges.map((edge, index) => {\n const from = positions.get(edge.from);\n const to = positions.get(edge.to);\n if (!from || !to) return null;\n const color = edgeColor(edge, nodes.find((node) => node.id === edge.to)?.status);\n const active = edge.active && !reduced;\n return (\n <path\n key={`${edge.from}-${edge.to}-${index}`}\n className=\"eth-motion-dag-status__edge\"\n d={edgePath(from, to)}\n fill=\"none\"\n stroke={color}\n strokeWidth={active ? 2 : 1.25}\n strokeDasharray={active ? \"6 6\" : undefined}\n markerEnd={`url(#${markerIdFromUseId(markerBaseId, index)})`}\n style={\n active ? { animation: \"eth-motion-flow-dash 900ms linear infinite\" } : undefined\n }\n />\n );\n })}\n {nodes.map((node) => {\n const point = positions.get(node.id);\n if (!point) return null;\n const previous = previousStatus.get(node.id);\n const changed = previous !== undefined && previous !== node.status;\n const statusText = changed\n ? `${compactLabelForStatus(previous)} -> ${compactLabelForStatus(node.status)}`\n : labelForStatus(node.status);\n return (\n <g\n key={node.id}\n className={`eth-motion-dag-status__node ${changed ? \"eth-motion-dag-status__node--changed\" : \"\"}`}\n transform={`translate(${point.x}, ${point.y})`}\n >\n {changed ? (\n <rect\n className=\"eth-motion-dag-status__change-ring\"\n x={-NODE_WIDTH / 2 - 4}\n y={-NODE_HEIGHT / 2 - 4}\n width={NODE_WIDTH + 8}\n height={NODE_HEIGHT + 8}\n rx={0}\n fill=\"none\"\n stroke={statusColor(node.status)}\n />\n ) : null}\n <rect\n className=\"eth-motion-dag-status__card\"\n x={-NODE_WIDTH / 2}\n y={-NODE_HEIGHT / 2}\n width={NODE_WIDTH}\n height={NODE_HEIGHT}\n rx={0}\n fill=\"var(--cds-layer-02, #ffffff)\"\n stroke=\"var(--cds-border-subtle, #e0e0e0)\"\n />\n <rect\n x={-NODE_WIDTH / 2}\n y={-NODE_HEIGHT / 2}\n width={4}\n height={NODE_HEIGHT}\n rx={0}\n fill={statusColor(node.status)}\n />\n <circle cx={-NODE_WIDTH / 2 + 20} cy={-9} r={4.5} fill={statusColor(node.status)} />\n <text className=\"eth-motion-dag-status__label\" x={-NODE_WIDTH / 2 + 34} y={-7}>\n {truncate(node.label, 18)}\n </text>\n <text className=\"eth-motion-dag-status__status\" x={-NODE_WIDTH / 2 + 34} y={15}>\n {truncate(statusText, 24)}\n </text>\n <title>\n {changed && previous\n ? `${node.label}: ${labelForStatus(previous)} to ${labelForStatus(node.status)}`\n : `${node.label}: ${labelForStatus(node.status)}`}\n </title>\n </g>\n );\n })}\n </svg>\n <ol className=\"eth-motion-dag-status__fallback\">\n {nodes.map((node) => {\n const previous = previousStatus.get(node.id);\n const changed = previous !== undefined && previous !== node.status;\n return (\n <li key={node.id}>\n {changed && previous\n ? `${node.label}: ${labelForStatus(previous)} to ${labelForStatus(node.status)}`\n : `${node.label}: ${labelForStatus(node.status)}`}\n </li>\n );\n })}\n </ol>\n </section>\n );\n}\n\nconst NODE_WIDTH = 160;\nconst NODE_HEIGHT = 64;\nconst NODE_GAP_X = 190;\nconst NODE_GAP_Y = 92;\n\nfunction layoutDag(\n nodes: MotionFlowNode[],\n edges: NonNullable<DAGStatusTransitionProps[\"edges\"]> = []\n) {\n const map = new Map<string, { x: number; y: number }>();\n const ids = new Set(nodes.map((node) => node.id));\n const ranks = new Map(nodes.map((node) => [node.id, 0]));\n const validEdges = edges.filter((edge) => ids.has(edge.from) && ids.has(edge.to));\n\n for (let pass = 0; pass < nodes.length; pass += 1) {\n for (const edge of validEdges) {\n const fromRank = ranks.get(edge.from) ?? 0;\n const toRank = ranks.get(edge.to) ?? 0;\n if (toRank < fromRank + 1) ranks.set(edge.to, fromRank + 1);\n }\n }\n\n const groups = new Map<number, MotionFlowNode[]>();\n for (const node of nodes) {\n const rank = ranks.get(node.id) ?? 0;\n groups.set(rank, [...(groups.get(rank) ?? []), node]);\n }\n const maxRows = Math.max(1, ...Array.from(groups.values()).map((group) => group.length));\n\n nodes.forEach((node, index) => {\n const rank = ranks.get(node.id) ?? index;\n const group = groups.get(rank) ?? [node];\n const rowIndex = Math.max(\n 0,\n group.findIndex((candidate) => candidate.id === node.id)\n );\n const row = group.length === 1 && maxRows > 1 ? (maxRows - 1) / 2 : rowIndex;\n map.set(node.id, {\n x: node.x ?? 88 + rank * NODE_GAP_X,\n y: node.y ?? 64 + row * NODE_GAP_Y\n });\n });\n return map;\n}\n\nfunction viewBoxFor(nodes: MotionFlowNode[], positions: Map<string, { x: number; y: number }>) {\n if (!nodes.length) {\n return { viewBox: \"0 0 320 120\", width: 320, height: 120 };\n }\n\n const points = nodes\n .map((node) => positions.get(node.id))\n .filter((point): point is { x: number; y: number } => Boolean(point));\n const minX = Math.floor(Math.min(...points.map((point) => point.x)) - NODE_WIDTH / 2 - 24);\n const minY = Math.floor(Math.min(...points.map((point) => point.y)) - NODE_HEIGHT / 2 - 20);\n const maxX = Math.ceil(Math.max(...points.map((point) => point.x)) + NODE_WIDTH / 2 + 30);\n const maxY = Math.ceil(Math.max(...points.map((point) => point.y)) + NODE_HEIGHT / 2 + 20);\n const width = maxX - minX;\n const height = maxY - minY;\n return { viewBox: `${minX} ${minY} ${width} ${height}`, width, height };\n}\n\nfunction edgePath(from: { x: number; y: number }, to: { x: number; y: number }) {\n const horizontal = Math.abs(to.x - from.x) >= Math.abs(to.y - from.y);\n if (horizontal) {\n const direction = to.x >= from.x ? 1 : -1;\n const start = { x: from.x + (NODE_WIDTH / 2) * direction, y: from.y };\n const end = { x: to.x - (NODE_WIDTH / 2) * direction, y: to.y };\n const controlOffset = Math.max(32, Math.abs(end.x - start.x) * 0.5);\n return `M ${start.x} ${start.y} C ${start.x + controlOffset * direction} ${start.y}, ${end.x - controlOffset * direction} ${end.y}, ${end.x} ${end.y}`;\n }\n\n const direction = to.y >= from.y ? 1 : -1;\n const start = { x: from.x, y: from.y + (NODE_HEIGHT / 2) * direction };\n const end = { x: to.x, y: to.y - (NODE_HEIGHT / 2) * direction };\n const controlOffset = Math.max(28, Math.abs(end.y - start.y) * 0.5);\n return `M ${start.x} ${start.y} C ${start.x} ${start.y + controlOffset * direction}, ${end.x} ${end.y - controlOffset * direction}, ${end.x} ${end.y}`;\n}\n\nfunction edgeColor(\n edge: NonNullable<DAGStatusTransitionProps[\"edges\"]>[number],\n toStatus?: MotionFlowNode[\"status\"]\n) {\n if (edge.status) return statusColor(edge.status);\n if (edge.active) return \"var(--cds-interactive, #0f62fe)\";\n if (toStatus === \"failed\" || toStatus === \"blocked\") return statusColor(toStatus);\n return \"var(--cds-border-strong, #8d8d8d)\";\n}\n\nfunction markerIdFromUseId(id: string, index: number) {\n return `eth-motion-dag-arrow-${id.replace(/[^a-zA-Z0-9_-]/g, \"\")}-${index}`;\n}\n\nfunction labelForStatus(status: MotionFlowNode[\"status\"]) {\n switch (status) {\n case \"approval-required\":\n return \"Approval required\";\n case \"pending-approval\":\n return \"Pending approval\";\n case \"in-progress\":\n return \"In progress\";\n case \"not-started\":\n return \"Not started\";\n default:\n return status\n .split(\"-\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n }\n}\n\nfunction compactLabelForStatus(status: MotionFlowNode[\"status\"]) {\n switch (status) {\n case \"approval-required\":\n return \"Approval\";\n case \"pending-approval\":\n return \"Pending\";\n case \"in-progress\":\n return \"Progress\";\n case \"not-started\":\n return \"Not started\";\n default:\n return labelForStatus(status);\n }\n}\n\nfunction truncate(value: string, maxLength: number) {\n if (value.length <= maxLength) return value;\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import * as React from \"react\";\nimport type { DocumentLockPulseProps } from \"./types\";\nimport { MotionStyles, usePrefersReducedMotion } from \"./motionUtils\";\n\nexport function DocumentLockPulse({\n lockedBy,\n active = true,\n className,\n children,\n role = \"status\",\n style,\n \"aria-label\": ariaLabel,\n ...props\n}: DocumentLockPulseProps) {\n const reduced = usePrefersReducedMotion();\n const owner = children ?? lockedBy ?? \"Document locked\";\n const ownerLabel = plainText(children ?? lockedBy);\n const classes = [\n \"eth-motion-document-lock\",\n active ? \"eth-motion-document-lock--active\" : \"eth-motion-document-lock--idle\",\n reduced ? \"eth-motion-reduced\" : undefined,\n className\n ]\n .filter(Boolean)\n .join(\" \");\n const defaultLabel = ownerLabel\n ? `Document lock ${active ? \"active\" : \"held\"} by ${ownerLabel}`\n : active\n ? \"Document lock active\"\n : \"Document locked\";\n\n return (\n <span\n {...props}\n aria-label={ariaLabel ?? defaultLabel}\n className={classes}\n data-eth-component=\"DocumentLockPulse\"\n role={role}\n style={style}\n >\n <MotionStyles />\n <span className=\"eth-motion-document-lock__indicator\" aria-hidden=\"true\">\n <span className=\"eth-motion-document-lock__pulse\" />\n <LockGlyph className=\"eth-motion-document-lock__icon\" />\n </span>\n <span className=\"eth-motion-document-lock__content\">\n <span className=\"eth-motion-document-lock__state\">\n {active ? \"Active edit\" : \"Lock held\"}\n </span>\n <span className=\"eth-motion-document-lock__owner\">{owner}</span>\n </span>\n </span>\n );\n}\n\nfunction LockGlyph(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props} aria-hidden=\"true\" focusable=\"false\" viewBox=\"0 0 16 16\">\n <path\n d=\"M5 7V5a3 3 0 0 1 6 0v2h1a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1h1Zm1.5 0h3V5a1.5 1.5 0 0 0-3 0v2Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction plainText(value: React.ReactNode): string | undefined {\n if (typeof value === \"string\" || typeof value === \"number\") {\n return String(value);\n }\n return undefined;\n}\n","import * as React from \"react\";\nimport type { MotionFlowEdge, MotionFlowNode, PipelineFlowAnimationProps } from \"./types\";\nimport { MotionStyles, statusColor, usePrefersReducedMotion } from \"./motionUtils\";\n\nexport function PipelineFlowAnimation({\n nodes,\n edges,\n className,\n \"aria-label\": ariaLabel = \"Pipeline flow\",\n ...props\n}: PipelineFlowAnimationProps) {\n const reduced = usePrefersReducedMotion();\n const positions = layoutNodes(nodes);\n const frame = viewBoxFor(nodes, positions);\n const titleId = React.useId();\n const descriptionId = React.useId();\n const markerBaseId = React.useId();\n const activeNodeIds = new Set(\n edges\n .filter((edge) => edge.active)\n .flatMap((edge) => [edge.from, edge.to])\n .concat(nodes.filter((node) => isActiveStatus(node.status)).map((node) => node.id))\n );\n\n return (\n <section\n {...props}\n className={`eth-motion-pipeline-flow ${reduced ? \"eth-motion-reduced\" : \"\"} ${className ?? \"\"}`}\n data-eth-component=\"PipelineFlowAnimation\"\n aria-label={ariaLabel}\n >\n <MotionStyles />\n <svg\n className=\"eth-motion-pipeline-flow__svg\"\n viewBox={frame.viewBox}\n width={frame.width}\n height={frame.height}\n role=\"img\"\n aria-labelledby={`${titleId} ${descriptionId}`}\n >\n <title id={titleId}>Pipeline flow</title>\n <desc id={descriptionId}>\n {nodes.length\n ? `${nodes.length} stages and ${edges.length} handoffs. ${nodes\n .map((node) => `${node.label}: ${labelForStatus(node.status)}`)\n .join(\", \")}.`\n : \"No pipeline stages.\"}\n </desc>\n <defs>\n {edges.map((edge, index) => {\n const toNode = nodes.find((node) => node.id === edge.to);\n const color = edgeColor(edge, toNode?.status);\n return (\n <marker\n key={`${edge.from}-${edge.to}-${index}`}\n id={markerIdFromUseId(markerBaseId, index)}\n markerWidth=\"7\"\n markerHeight=\"7\"\n refX=\"6\"\n refY=\"3.5\"\n orient=\"auto\"\n markerUnits=\"strokeWidth\"\n >\n <path d=\"M0,0 L0,7 L7,3.5 z\" fill={color} />\n </marker>\n );\n })}\n </defs>\n {edges.map((edge, index) => {\n const from = positions.get(edge.from);\n const to = positions.get(edge.to);\n if (!from || !to) return null;\n const toNode = nodes.find((node) => node.id === edge.to);\n const color = edgeColor(edge, toNode?.status);\n const active = Boolean(edge.active);\n return (\n <path\n key={`${edge.from}-${edge.to}-${index}`}\n className=\"eth-motion-pipeline-flow__edge\"\n d={edgePath(from, to)}\n fill=\"none\"\n markerEnd={`url(#${markerIdFromUseId(markerBaseId, index)})`}\n stroke={color}\n strokeWidth={active ? 2.5 : 1.5}\n strokeDasharray={active ? \"7 7\" : undefined}\n style={\n active && !reduced\n ? { animation: \"eth-motion-flow-dash 900ms linear infinite\" }\n : undefined\n }\n />\n );\n })}\n {!nodes.length ? (\n <text className=\"eth-motion-pipeline-flow__empty\" x=\"16\" y=\"52\">\n No pipeline stages\n </text>\n ) : null}\n {nodes.map((node) => {\n const point = positions.get(node.id);\n if (!point) return null;\n const active = activeNodeIds.has(node.id);\n const cardX = -NODE_WIDTH / 2;\n const cardY = -NODE_HEIGHT / 2;\n return (\n <g\n key={node.id}\n className={`eth-motion-pipeline-flow__node ${active ? \"eth-motion-pipeline-flow__node--active\" : \"\"}`}\n transform={`translate(${point.x}, ${point.y})`}\n >\n <rect\n className=\"eth-motion-pipeline-flow__card\"\n x={cardX}\n y={cardY}\n width={NODE_WIDTH}\n height={NODE_HEIGHT}\n rx={0}\n />\n <rect\n className=\"eth-motion-pipeline-flow__stripe\"\n x={cardX}\n y={cardY}\n width={4}\n height={NODE_HEIGHT}\n rx={0}\n fill={statusColor(node.status)}\n />\n {active && !reduced ? (\n <circle\n className=\"eth-motion-pipeline-flow__pulse\"\n cx={cardX + 22}\n cy={cardY + 20}\n r={9}\n fill=\"none\"\n stroke={statusColor(node.status)}\n />\n ) : null}\n <circle\n className=\"eth-motion-pipeline-flow__dot\"\n cx={cardX + 22}\n cy={cardY + 20}\n r={5}\n fill={statusColor(node.status)}\n />\n <text className=\"eth-motion-pipeline-flow__label\" x={cardX + 36} y={cardY + 24}>\n {truncate(node.label, 15)}\n </text>\n <text className=\"eth-motion-pipeline-flow__status\" x={cardX + 14} y={cardY + 48}>\n {truncate(labelForStatus(node.status), 20)}\n </text>\n <title>{`${node.label}: ${labelForStatus(node.status)}`}</title>\n </g>\n );\n })}\n </svg>\n <ol className=\"eth-motion-pipeline-flow__fallback\">\n {nodes.map((node) => (\n <li key={node.id}>\n {node.label}: {labelForStatus(node.status)}\n </li>\n ))}\n </ol>\n </section>\n );\n}\n\nconst NODE_WIDTH = 144;\nconst NODE_HEIGHT = 64;\nconst NODE_GAP_X = 188;\n\nfunction layoutNodes(nodes: MotionFlowNode[]) {\n const map = new Map<string, { x: number; y: number }>();\n nodes.forEach((node, index) => {\n map.set(node.id, {\n x: node.x ?? NODE_WIDTH / 2 + 20 + NODE_GAP_X * index,\n y: node.y ?? NODE_HEIGHT / 2 + 18\n });\n });\n return map;\n}\n\nfunction viewBoxFor(nodes: MotionFlowNode[], positions: Map<string, { x: number; y: number }>) {\n if (!nodes.length) {\n return { viewBox: \"0 0 320 96\", width: 320, height: 96 };\n }\n\n const points = nodes\n .map((node) => positions.get(node.id))\n .filter((point): point is { x: number; y: number } => Boolean(point));\n const minX = Math.floor(Math.min(...points.map((point) => point.x)) - NODE_WIDTH / 2 - 18);\n const minY = Math.floor(Math.min(...points.map((point) => point.y)) - NODE_HEIGHT / 2 - 16);\n const maxX = Math.ceil(Math.max(...points.map((point) => point.x)) + NODE_WIDTH / 2 + 26);\n const maxY = Math.ceil(Math.max(...points.map((point) => point.y)) + NODE_HEIGHT / 2 + 16);\n const width = maxX - minX;\n const height = maxY - minY;\n return { viewBox: `${minX} ${minY} ${width} ${height}`, width, height };\n}\n\nfunction edgePath(from: { x: number; y: number }, to: { x: number; y: number }) {\n const direction = to.x >= from.x ? 1 : -1;\n const start = { x: from.x + (NODE_WIDTH / 2) * direction, y: from.y };\n const end = { x: to.x - (NODE_WIDTH / 2) * direction, y: to.y };\n const controlOffset = Math.max(26, Math.abs(end.x - start.x) * 0.5);\n return `M ${start.x} ${start.y} C ${start.x + controlOffset * direction} ${start.y}, ${end.x - controlOffset * direction} ${end.y}, ${end.x} ${end.y}`;\n}\n\nfunction edgeColor(edge: MotionFlowEdge, toStatus?: MotionFlowNode[\"status\"]) {\n if (edge.status) return statusColor(edge.status);\n if (edge.active) return \"var(--cds-interactive, #0f62fe)\";\n if (toStatus === \"failed\" || toStatus === \"blocked\") return statusColor(toStatus);\n return \"var(--cds-border-strong, #8d8d8d)\";\n}\n\nfunction markerIdFromUseId(id: string, index: number) {\n return `eth-motion-pipeline-arrow-${id.replace(/[^a-zA-Z0-9_-]/g, \"\")}-${index}`;\n}\n\nfunction isActiveStatus(status: MotionFlowNode[\"status\"]) {\n return status === \"running\" || status === \"in-progress\" || status === \"active\";\n}\n\nfunction labelForStatus(status: MotionFlowNode[\"status\"]) {\n switch (status) {\n case \"approval-required\":\n return \"Approval required\";\n case \"pending-approval\":\n return \"Pending approval\";\n case \"in-progress\":\n return \"In progress\";\n case \"not-started\":\n return \"Not started\";\n default:\n return status\n .split(\"-\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n }\n}\n\nfunction truncate(value: string, maxLength: number) {\n if (value.length <= maxLength) return value;\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n","import * as React from \"react\";\nimport type { ProgressTransitionProps } from \"./types\";\nimport { MotionStyles, usePrefersReducedMotion } from \"./motionUtils\";\n\nexport function ProgressTransition({\n from,\n to,\n durationMs = 320,\n children,\n className,\n ...props\n}: ProgressTransitionProps) {\n const reduced = usePrefersReducedMotion();\n const [current, setCurrent] = React.useState(from ?? to);\n\n React.useEffect(() => {\n if (reduced || durationMs <= 0 || typeof window === \"undefined\") {\n setCurrent(to);\n return;\n }\n const startValue = from ?? current;\n const delta = to - startValue;\n const startedAt = performance.now();\n let frame = 0;\n const tick = (now: number) => {\n const progress = Math.min(1, (now - startedAt) / durationMs);\n const eased = 1 - Math.pow(1 - progress, 3);\n setCurrent(startValue + delta * eased);\n if (progress < 1) frame = window.requestAnimationFrame(tick);\n };\n frame = window.requestAnimationFrame(tick);\n return () => window.cancelAnimationFrame(frame);\n }, [to, from, durationMs, reduced]);\n\n return (\n <section\n {...props}\n className={`eth-motion-progress-transition ${reduced ? \"eth-motion-reduced\" : \"\"} ${className ?? \"\"}`}\n data-eth-component=\"ProgressTransition\"\n >\n <MotionStyles />\n {children ? (\n children(current)\n ) : (\n <progress value={current} max={100} aria-label=\"Progress\">\n {Math.round(current)}%\n </progress>\n )}\n </section>\n );\n}\n","import * as React from \"react\";\nimport type { SkeletonLoadingPatternProps, SkeletonLoadingPatternVariant } from \"./types\";\nimport { MotionStyles, usePrefersReducedMotion } from \"./motionUtils\";\n\nconst articleLineWidths = [\"96%\", \"88%\", \"100%\", \"92%\", \"76%\", \"84%\", \"68%\", \"80%\"];\nconst listLineWidths = [\"76%\", \"88%\", \"64%\", \"82%\", \"70%\", \"90%\"];\nconst tableCellWidths = [\"72%\", \"92%\", \"58%\", \"84%\", \"66%\", \"78%\"];\n\nexport function SkeletonLoadingPattern({\n columns = 4,\n label = \"Loading content\",\n lines = 3,\n rows,\n variant = \"article\",\n className,\n style,\n role = \"status\",\n \"aria-busy\": ariaBusy = true,\n \"aria-label\": ariaLabel,\n ...props\n}: SkeletonLoadingPatternProps) {\n const reduced = usePrefersReducedMotion();\n const pattern = normalizePattern(variant);\n const lineCount = clampCount(lines, 1, 8);\n const rowCount = clampCount(rows ?? (pattern === \"table\" ? 4 : 3), 1, 8);\n const columnCount = clampCount(columns, 2, 6);\n const classes = [\n \"eth-motion-skeleton-loading\",\n `eth-motion-skeleton-loading--${pattern}`,\n reduced ? \"eth-motion-reduced\" : undefined,\n className\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <section\n {...props}\n aria-busy={ariaBusy}\n aria-label={ariaLabel ?? label}\n className={classes}\n data-eth-component=\"SkeletonLoadingPattern\"\n data-pattern={pattern}\n role={role}\n style={style}\n >\n <MotionStyles />\n {renderPattern(pattern, lineCount, rowCount, columnCount)}\n </section>\n );\n}\n\nfunction renderPattern(\n pattern: SkeletonLoadingPatternVariant,\n lines: number,\n rows: number,\n columns: number\n) {\n switch (pattern) {\n case \"card\":\n return <CardPattern lines={lines} />;\n case \"list\":\n return <ListPattern rows={rows} />;\n case \"table\":\n return <TablePattern columns={columns} rows={rows} />;\n case \"article\":\n default:\n return <ArticlePattern lines={lines} />;\n }\n}\n\nfunction ArticlePattern({ lines }: { lines: number }) {\n return (\n <div\n aria-hidden=\"true\"\n className=\"eth-motion-skeleton-loading__surface eth-motion-skeleton-loading__surface--article\"\n >\n <div className=\"eth-motion-skeleton-loading__article-header\">\n <SkeletonBlock\n className=\"eth-motion-skeleton-loading__block--eyebrow\"\n segment=\"eyebrow\"\n style={{ inlineSize: \"7rem\" }}\n />\n <SkeletonBlock\n className=\"eth-motion-skeleton-loading__block--title\"\n segment=\"title\"\n style={{ inlineSize: \"min(22rem, 74%)\" }}\n />\n </div>\n <div className=\"eth-motion-skeleton-loading__article-body\">\n {Array.from({ length: lines }).map((_, index) => (\n <SkeletonBlock\n key={index}\n className=\"eth-motion-skeleton-loading__block--line\"\n segment=\"text-line\"\n style={{ inlineSize: articleLineWidths[index % articleLineWidths.length] }}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction CardPattern({ lines }: { lines: number }) {\n return (\n <div\n aria-hidden=\"true\"\n className=\"eth-motion-skeleton-loading__surface eth-motion-skeleton-loading__surface--card\"\n >\n <SkeletonBlock className=\"eth-motion-skeleton-loading__block--media\" segment=\"media\" />\n <div className=\"eth-motion-skeleton-loading__card-body\">\n <SkeletonBlock\n className=\"eth-motion-skeleton-loading__block--title\"\n segment=\"title\"\n style={{ inlineSize: \"78%\" }}\n />\n {Array.from({ length: lines }).map((_, index) => (\n <SkeletonBlock\n key={index}\n className=\"eth-motion-skeleton-loading__block--line\"\n segment=\"text-line\"\n style={{ inlineSize: articleLineWidths[(index + 2) % articleLineWidths.length] }}\n />\n ))}\n </div>\n <div className=\"eth-motion-skeleton-loading__card-metrics\">\n {Array.from({ length: 3 }).map((_, index) => (\n <SkeletonBlock\n key={index}\n className=\"eth-motion-skeleton-loading__block--metric\"\n segment=\"metric\"\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction ListPattern({ rows }: { rows: number }) {\n return (\n <div\n aria-hidden=\"true\"\n className=\"eth-motion-skeleton-loading__surface eth-motion-skeleton-loading__surface--list\"\n >\n {Array.from({ length: rows }).map((_, index) => (\n <div\n className=\"eth-motion-skeleton-loading__list-row\"\n data-skeleton-row=\"list\"\n key={index}\n >\n <SkeletonBlock className=\"eth-motion-skeleton-loading__block--avatar\" segment=\"avatar\" />\n <div className=\"eth-motion-skeleton-loading__list-copy\">\n <SkeletonBlock\n className=\"eth-motion-skeleton-loading__block--line\"\n segment=\"text-line\"\n style={{ inlineSize: listLineWidths[index % listLineWidths.length] }}\n />\n <SkeletonBlock\n className=\"eth-motion-skeleton-loading__block--caption\"\n segment=\"caption\"\n style={{ inlineSize: listLineWidths[(index + 2) % listLineWidths.length] }}\n />\n </div>\n <SkeletonBlock\n className=\"eth-motion-skeleton-loading__block--tag\"\n segment=\"tag\"\n style={{ inlineSize: index % 2 === 0 ? \"4.25rem\" : \"3.25rem\" }}\n />\n </div>\n ))}\n </div>\n );\n}\n\nfunction TablePattern({ columns, rows }: { columns: number; rows: number }) {\n const gridStyle = { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` };\n\n return (\n <div\n aria-hidden=\"true\"\n className=\"eth-motion-skeleton-loading__surface eth-motion-skeleton-loading__surface--table\"\n >\n <div className=\"eth-motion-skeleton-loading__table-header\" style={gridStyle}>\n {Array.from({ length: columns }).map((_, index) => (\n <SkeletonBlock\n key={index}\n className=\"eth-motion-skeleton-loading__block--column\"\n segment=\"column-header\"\n style={{ inlineSize: tableCellWidths[(index + 1) % tableCellWidths.length] }}\n />\n ))}\n </div>\n {Array.from({ length: rows }).map((_, rowIndex) => (\n <div\n className=\"eth-motion-skeleton-loading__table-row\"\n data-skeleton-row=\"table\"\n key={rowIndex}\n style={gridStyle}\n >\n {Array.from({ length: columns }).map((_, columnIndex) => (\n <SkeletonBlock\n cell\n key={columnIndex}\n className=\"eth-motion-skeleton-loading__block--cell\"\n segment=\"cell\"\n style={{\n inlineSize: tableCellWidths[(rowIndex + columnIndex) % tableCellWidths.length]\n }}\n />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nfunction SkeletonBlock({\n cell,\n className,\n segment,\n style\n}: {\n cell?: boolean;\n className?: string;\n segment: string;\n style?: React.CSSProperties;\n}) {\n return (\n <span\n className={`eth-motion-skeleton-loading__block ${className ?? \"\"}`}\n data-skeleton-cell={cell ? \"\" : undefined}\n data-skeleton-segment={segment}\n style={style}\n />\n );\n}\n\nfunction clampCount(value: number, min: number, max: number) {\n if (!Number.isFinite(value)) return min;\n return Math.min(max, Math.max(min, Math.floor(value)));\n}\n\nfunction normalizePattern(\n variant: SkeletonLoadingPatternProps[\"variant\"]\n): SkeletonLoadingPatternVariant {\n if (variant === \"card\" || variant === \"list\" || variant === \"table\") return variant;\n return \"article\";\n}\n","import * as React from \"react\";\nimport type { StatusChangeAnimationProps } from \"./types\";\nimport { MotionStyles, statusColor, usePrefersReducedMotion } from \"./motionUtils\";\n\nexport function StatusChangeAnimation({\n status,\n previousStatus,\n label,\n className,\n children,\n style,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ...props\n}: StatusChangeAnimationProps) {\n const reduced = usePrefersReducedMotion();\n const changed = previousStatus !== undefined && previousStatus !== status;\n const statusLabel = formatStatusLabel(status);\n const previousStatusLabel = previousStatus ? formatStatusLabel(previousStatus) : undefined;\n const displayLabel = children ?? label ?? \"Status\";\n const announcementLabel = textFromNode(label) ?? textFromNode(children) ?? \"Status\";\n const announcement =\n changed && previousStatusLabel\n ? `${announcementLabel} changed from ${previousStatusLabel} to ${statusLabel}`\n : `${announcementLabel} is ${statusLabel}`;\n const rootClassName = [\n \"eth-motion-status-change\",\n `eth-motion-status-change--${status}`,\n changed ? \"eth-motion-status-change--changed\" : null,\n reduced ? \"eth-motion-reduced\" : null,\n className\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <span\n {...props}\n aria-atomic=\"true\"\n aria-label={ariaLabel ?? (ariaLabelledBy ? undefined : announcement)}\n aria-labelledby={ariaLabelledBy}\n className={rootClassName}\n data-current-status={status}\n data-eth-component=\"StatusChangeAnimation\"\n data-previous-status={previousStatus}\n role=\"status\"\n style={{\n \"--eth-motion-status-color\": statusColor(status),\n \"--eth-motion-status-previous-color\": previousStatus\n ? statusColor(previousStatus)\n : statusColor(status),\n ...style\n } as React.CSSProperties}\n >\n <MotionStyles />\n <span className=\"eth-motion-status-change__indicator\" aria-hidden=\"true\">\n {changed ? <span className=\"eth-motion-status-change__previous-dot\" /> : null}\n {changed ? <span className=\"eth-motion-status-change__connector\" /> : null}\n <span className=\"eth-motion-status-change__current-dot\" />\n </span>\n <span className=\"eth-motion-status-change__content\">\n <span className=\"eth-motion-status-change__label\">{displayLabel}</span>\n <span className=\"eth-motion-status-change__state\">\n {changed && previousStatusLabel ? (\n <>\n <span className=\"eth-motion-status-change__previous\">{previousStatusLabel}</span>\n <span className=\"eth-motion-status-change__separator\">to</span>\n <span className=\"eth-motion-status-change__current\">{statusLabel}</span>\n </>\n ) : (\n <span className=\"eth-motion-status-change__current\">{statusLabel}</span>\n )}\n </span>\n </span>\n </span>\n );\n}\n\nfunction formatStatusLabel(status: string) {\n return status\n .split(\"-\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction textFromNode(node: React.ReactNode) {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n return undefined;\n}\n","import * as React from \"react\";\nimport type { StepCompletionAnimationProps } from \"./types\";\nimport { MotionStyles, usePrefersReducedMotion } from \"./motionUtils\";\n\nconst stateLabels = {\n completed: \"Completed\",\n current: \"In progress\",\n pending: \"Pending\"\n} as const;\n\nexport function StepCompletionAnimation({\n completed = true,\n description,\n label = \"Step completed\",\n state,\n className,\n children,\n role = \"status\",\n \"aria-live\": ariaLive = \"polite\",\n ...props\n}: StepCompletionAnimationProps) {\n const reduced = usePrefersReducedMotion();\n const resolvedState = state ?? (completed ? \"completed\" : \"pending\");\n const stateLabel = stateLabels[resolvedState];\n const stepClassName = [\n \"eth-motion-step-completion\",\n `eth-motion-step-completion--${resolvedState}`,\n reduced ? \"eth-motion-reduced\" : undefined,\n className\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <span\n {...props}\n aria-live={ariaLive}\n className={stepClassName}\n data-eth-component=\"StepCompletionAnimation\"\n data-state={resolvedState}\n role={role}\n >\n <MotionStyles />\n <span className=\"eth-motion-step-completion__marker\" aria-hidden=\"true\">\n {resolvedState === \"completed\" ? (\n <svg\n className=\"eth-motion-step-completion__check\"\n focusable=\"false\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n >\n <path\n className=\"eth-motion-step-completion__check-path\"\n d=\"M3.5 8.4 6.5 11.4 12.8 4.6\"\n />\n </svg>\n ) : (\n <span className=\"eth-motion-step-completion__dot\" />\n )}\n </span>\n <span className=\"eth-motion-step-completion__content\">\n {children ?? (\n <>\n <span className=\"eth-motion-step-completion__label\">{label}</span>\n <span className=\"eth-motion-step-completion__state\">{stateLabel}</span>\n {description ? (\n <span className=\"eth-motion-step-completion__description\">{description}</span>\n ) : null}\n </>\n )}\n </span>\n </span>\n );\n}\n","import * as React from \"react\";\nimport type { StreamingTextProps } from \"./types\";\nimport { MotionStyles, usePrefersReducedMotion } from \"./motionUtils\";\n\nexport function StreamingText({\n text,\n intervalMs = 18,\n onDone,\n className,\n role = \"status\",\n \"aria-busy\": ariaBusy,\n \"aria-live\": ariaLive = \"polite\",\n ...props\n}: StreamingTextProps) {\n const reduced = usePrefersReducedMotion();\n const shouldAnimate = !reduced && intervalMs > 0 && text.length > 0;\n const [visible, setVisible] = React.useState(shouldAnimate ? \"\" : text);\n const [done, setDone] = React.useState(!shouldAnimate);\n const onDoneRef = React.useRef(onDone);\n\n React.useEffect(() => {\n onDoneRef.current = onDone;\n }, [onDone]);\n\n React.useEffect(() => {\n if (!shouldAnimate) {\n setVisible(text);\n setDone(true);\n onDoneRef.current?.();\n return;\n }\n\n setVisible(\"\");\n setDone(false);\n let index = 0;\n const timer = window.setInterval(() => {\n index += 1;\n setVisible(text.slice(0, index));\n if (index >= text.length) {\n window.clearInterval(timer);\n setDone(true);\n onDoneRef.current?.();\n }\n }, intervalMs);\n return () => window.clearInterval(timer);\n }, [text, intervalMs, shouldAnimate]);\n\n const streaming = shouldAnimate && !done;\n const classes = [\n \"eth-motion-streaming-text\",\n streaming\n ? \"eth-motion-streaming-text--streaming\"\n : \"eth-motion-streaming-text--complete\",\n reduced ? \"eth-motion-reduced\" : undefined,\n className\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <>\n <MotionStyles />\n <span\n {...props}\n aria-busy={ariaBusy ?? streaming}\n aria-live={ariaLive}\n className={classes}\n data-eth-component=\"StreamingText\"\n data-streaming={streaming ? \"true\" : \"false\"}\n role={role}\n >\n <span className=\"eth-motion-streaming-text__content\">{visible}</span>\n <span aria-hidden=\"true\" className=\"eth-motion-streaming-text__cursor\" />\n </span>\n </>\n );\n}\n","import * as React from \"react\";\nimport type { SyncProgressAnimationProps, SyncProgressAnimationStatus } from \"./types\";\nimport { MotionStyles, usePrefersReducedMotion } from \"./motionUtils\";\n\nconst statusContent: Record<\n SyncProgressAnimationStatus,\n { accent: string; description: string; label: string; soft: string }\n> = {\n syncing: {\n accent: \"#0f62fe\",\n description: \"Replicating source updates and applying remote changes.\",\n label: \"Syncing\",\n soft: \"#edf5ff\"\n },\n synced: {\n accent: \"#24a148\",\n description: \"Replica is current with the source.\",\n label: \"Synced\",\n soft: \"#defbe6\"\n },\n paused: {\n accent: \"#8d8d8d\",\n description: \"Sync is paused. No changes are being applied.\",\n label: \"Paused\",\n soft: \"#f4f4f4\"\n },\n stale: {\n accent: \"#f1c21b\",\n description: \"Replica is outside the expected freshness window.\",\n label: \"Stale\",\n soft: \"#fcf4d6\"\n },\n failed: {\n accent: \"#da1e28\",\n description: \"Sync stopped before completion. Review the connection and retry.\",\n label: \"Failed\",\n soft: \"#fff1f1\"\n },\n error: {\n accent: \"#da1e28\",\n description: \"Sync stopped before completion. Review the connection and retry.\",\n label: \"Needs attention\",\n soft: \"#fff1f1\"\n }\n};\n\nexport function SyncProgressAnimation({\n children,\n className,\n completed,\n description,\n label = \"Syncing\",\n progress,\n rate,\n remaining,\n role = \"status\",\n source,\n stage,\n status = \"syncing\",\n style,\n target,\n total,\n variant,\n \"aria-busy\": ariaBusy,\n \"aria-label\": ariaLabel,\n \"aria-live\": ariaLive,\n ...props\n}: SyncProgressAnimationProps) {\n const reduced = usePrefersReducedMotion();\n const content = statusContent[status];\n const progressValue = normalizeProgress(progress ?? progressFromCounts(completed, total, status));\n const hasProgress = progressValue !== undefined;\n const progressText = hasProgress ? `${progressValue}% complete` : content.label;\n const countText = formatCountProgress(completed, total);\n const descriptionNode = description ?? children ?? content.description;\n const hasDetailedContent = [\n description,\n children,\n source,\n target,\n stage,\n rate,\n remaining,\n completed,\n total,\n progress\n ].some(hasValue);\n const resolvedVariant = variant ?? (hasDetailedContent ? \"detailed\" : \"compact\");\n const labelText = textFromNode(label) ?? \"Sync\";\n const announcement = [content.label, hasProgress ? progressText : undefined, countText]\n .filter(Boolean)\n .join(\", \");\n const classes = [\n \"eth-motion-sync-progress\",\n `eth-motion-sync-progress--${resolvedVariant}`,\n `eth-motion-sync-progress--${status}`,\n reduced ? \"eth-motion-reduced\" : undefined,\n className\n ]\n .filter(Boolean)\n .join(\" \");\n const rootStyle = {\n \"--eth-motion-sync-accent\": content.accent,\n \"--eth-motion-sync-accent-soft\": content.soft,\n ...style\n } as React.CSSProperties;\n const busy = ariaBusy ?? (status === \"syncing\" ? true : undefined);\n\n if (resolvedVariant === \"compact\") {\n return (\n <span\n {...props}\n aria-atomic=\"true\"\n aria-busy={busy}\n aria-label={ariaLabel ?? `${labelText} ${announcement}`}\n aria-live={ariaLive ?? (status === \"syncing\" ? \"polite\" : undefined)}\n className={classes}\n data-eth-component=\"SyncProgressAnimation\"\n data-sync-progress={progressValue}\n data-sync-status={status}\n role={role}\n style={rootStyle}\n >\n <MotionStyles />\n <SyncIndicator status={status} />\n <span className=\"eth-motion-sync-progress__compact-copy\">\n <span className=\"eth-motion-sync-progress__label\">{label}</span>\n <span className=\"eth-motion-sync-progress__compact-state\">\n {hasProgress ? `${progressValue}%` : content.label}\n </span>\n </span>\n </span>\n );\n }\n\n const metaItems = [\n { label: \"Source\", value: source },\n { label: \"Target\", value: target },\n { label: \"Rate\", value: rate },\n { label: \"Remaining\", value: remaining }\n ].filter((item) => hasValue(item.value));\n\n return (\n <section\n {...props}\n aria-atomic=\"true\"\n aria-busy={busy}\n aria-label={ariaLabel ?? `${labelText} ${announcement}`}\n aria-live={ariaLive ?? (status === \"syncing\" ? \"polite\" : undefined)}\n className={classes}\n data-eth-component=\"SyncProgressAnimation\"\n data-sync-progress={progressValue}\n data-sync-status={status}\n role={role}\n style={rootStyle}\n >\n <MotionStyles />\n <SyncIndicator status={status} />\n <div className=\"eth-motion-sync-progress__body\">\n <div className=\"eth-motion-sync-progress__header\">\n <div className=\"eth-motion-sync-progress__title-group\">\n <span className=\"eth-motion-sync-progress__eyebrow\">\n {stage ?? \"Replication\"}\n </span>\n <span className=\"eth-motion-sync-progress__label\">{label}</span>\n </div>\n <span className=\"eth-motion-sync-progress__chip\">\n <span className=\"eth-motion-sync-progress__chip-dot\" aria-hidden=\"true\" />\n {content.label}\n </span>\n </div>\n <p className=\"eth-motion-sync-progress__description\">{descriptionNode}</p>\n <div className=\"eth-motion-sync-progress__meter\">\n <div\n aria-label=\"Sync transfer progress\"\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={progressValue}\n aria-valuetext={hasProgress ? progressText : content.label}\n className=\"eth-motion-sync-progress__track\"\n role=\"progressbar\"\n >\n <span\n className={`eth-motion-sync-progress__bar ${\n hasProgress ? \"\" : \"eth-motion-sync-progress__bar--indeterminate\"\n }`}\n style={hasProgress ? { inlineSize: `${progressValue}%` } : undefined}\n />\n </div>\n <span className=\"eth-motion-sync-progress__progress-copy\">\n {[hasProgress ? `${progressValue}%` : content.label, countText]\n .filter(Boolean)\n .join(\" | \")}\n </span>\n </div>\n </div>\n {metaItems.length ? (\n <dl className=\"eth-motion-sync-progress__meta\" aria-label=\"Sync metadata\">\n {metaItems.map((item) => (\n <div className=\"eth-motion-sync-progress__meta-item\" key={item.label}>\n <dt>{item.label}</dt>\n <dd>{item.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n </section>\n );\n}\n\nfunction SyncIndicator({ status }: { status: SyncProgressAnimationStatus }) {\n return (\n <span className=\"eth-motion-sync-progress__indicator\" aria-hidden=\"true\">\n {status === \"syncing\" ? (\n <span className=\"eth-motion-sync-progress__spinner\" />\n ) : (\n <span className=\"eth-motion-sync-progress__glyph\" />\n )}\n </span>\n );\n}\n\nfunction progressFromCounts(\n completed: number | undefined,\n total: number | undefined,\n status: SyncProgressAnimationStatus\n) {\n if (status === \"synced\") return 100;\n if (!isFiniteNumber(completed) || !isFiniteNumber(total) || total <= 0) return undefined;\n return (completed / total) * 100;\n}\n\nfunction normalizeProgress(value: number | undefined) {\n if (!isFiniteNumber(value)) return undefined;\n return Math.min(100, Math.max(0, Math.round(value)));\n}\n\nfunction formatCountProgress(completed: number | undefined, total: number | undefined) {\n if (!isFiniteNumber(completed) || !isFiniteNumber(total) || total <= 0) return undefined;\n const safeCompleted = Math.max(0, Math.floor(completed));\n const safeTotal = Math.max(0, Math.floor(total));\n return `${safeCompleted} of ${safeTotal} items`;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction hasValue(value: unknown) {\n return value !== undefined && value !== null && value !== false && value !== \"\";\n}\n\nfunction textFromNode(node: React.ReactNode) {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n return undefined;\n}\n","export type {\n AgentThinkingAnimationProps,\n AttentionPulseProps,\n DAGStatusTransitionProps,\n DocumentLockPulseProps,\n MotionFlowEdge,\n MotionFlowNode,\n PipelineFlowAnimationProps,\n ProgressTransitionProps,\n SkeletonLoadingPatternVariant,\n SkeletonLoadingPatternProps,\n StatusChangeAnimationProps,\n StepCompletionAnimationProps,\n StepCompletionState,\n StreamingTextProps,\n SyncProgressAnimationProps,\n SyncProgressAnimationStatus\n} from \"./components/types\";\nexport { AgentThinkingAnimation } from \"./components/AgentThinkingAnimation\";\nexport { AttentionPulse } from \"./components/AttentionPulse\";\nexport { DAGStatusTransition } from \"./components/DAGStatusTransition\";\nexport { DocumentLockPulse } from \"./components/DocumentLockPulse\";\nexport { PipelineFlowAnimation } from \"./components/PipelineFlowAnimation\";\nexport { ProgressTransition } from \"./components/ProgressTransition\";\nexport { SkeletonLoadingPattern } from \"./components/SkeletonLoadingPattern\";\nexport { StatusChangeAnimation } from \"./components/StatusChangeAnimation\";\nexport { StepCompletionAnimation } from \"./components/StepCompletionAnimation\";\nexport { StreamingText } from \"./components/StreamingText\";\nexport { SyncProgressAnimation } from \"./components/SyncProgressAnimation\";\n\nexport const MotionComponentNames = [\n \"ProgressTransition\",\n \"PipelineFlowAnimation\",\n \"DAGStatusTransition\",\n \"AgentThinkingAnimation\",\n \"SyncProgressAnimation\",\n \"SkeletonLoadingPattern\",\n \"AttentionPulse\",\n \"DocumentLockPulse\",\n \"StreamingText\",\n \"StepCompletionAnimation\",\n \"StatusChangeAnimation\"\n] as const;\nexport type MotionComponentName = (typeof MotionComponentNames)[number];\n"],"mappings":";AAAA,YAAY,WAAW;AAmCnB;AAhCJ,IAAM,qBAAqB;AAEpB,SAAS,0BAA0B;AACxC,SAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,eAA2B;AAC3D,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,OAAO,WAAW,kBAAkB;AAClD,QAAM,WAAW,MAAM,cAAc;AACrC,QAAM,mBAAmB,UAAU,QAAQ;AAC3C,SAAO,MAAM,MAAM,sBAAsB,UAAU,QAAQ;AAC7D;AAEA,SAAS,2BAA2B;AAClC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,WAAY,QAAO;AACrF,SAAO,OAAO,WAAW,kBAAkB,EAAE;AAC/C;AAEA,SAAS,iCAAiC;AACxC,SAAO;AACT;AAEO,SAAS,eAAe;AAC7B,SACE,oBAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["jsx","React","jsx","jsxs","React","jsx","jsxs","direction","start","end","controlOffset","jsx","jsxs","React","jsx","jsxs","viewBoxFor","labelForStatus","edgeColor","markerIdFromUseId","edgePath","NODE_WIDTH","NODE_HEIGHT","truncate","NODE_GAP_X","React","jsx","jsxs","jsx","jsxs","_","jsx","jsxs","Fragment","jsx","jsxs","React","Fragment","jsx","jsxs","jsx","jsxs","textFromNode"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@echothink-ui/motion",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"src",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"peerDependencies": {
|
|
23
|
+
"react": ">=18.3.0",
|
|
24
|
+
"react-dom": ">=18.3.0"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@echothink-ui/core": "0.2.0"
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsup src/index.tsx --format esm,cjs --sourcemap --clean --external react --external react-dom && tsc -p tsconfig.json --declaration --emitDeclarationOnly --noEmit false --outDir dist",
|
|
34
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
35
|
+
"test": "vitest run --config ../../vitest.config.ts --passWithNoTests",
|
|
36
|
+
"lint": "eslint src"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { AgentThinkingAnimationProps } from "./types";
|
|
3
|
+
import { MotionStyles, usePrefersReducedMotion } from "./motionUtils";
|
|
4
|
+
|
|
5
|
+
export function AgentThinkingAnimation({
|
|
6
|
+
label = "Agent thinking",
|
|
7
|
+
className,
|
|
8
|
+
style,
|
|
9
|
+
...props
|
|
10
|
+
}: AgentThinkingAnimationProps) {
|
|
11
|
+
const reduced = usePrefersReducedMotion();
|
|
12
|
+
const classes = [
|
|
13
|
+
"eth-motion-agent-thinking",
|
|
14
|
+
reduced ? "eth-motion-reduced" : undefined,
|
|
15
|
+
className
|
|
16
|
+
]
|
|
17
|
+
.filter(Boolean)
|
|
18
|
+
.join(" ");
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<span
|
|
22
|
+
{...props}
|
|
23
|
+
className={classes}
|
|
24
|
+
role="status"
|
|
25
|
+
aria-label={label}
|
|
26
|
+
data-eth-component="AgentThinkingAnimation"
|
|
27
|
+
style={{
|
|
28
|
+
alignItems: "center",
|
|
29
|
+
color: "var(--cds-interactive, #0f62fe)",
|
|
30
|
+
display: "inline-flex",
|
|
31
|
+
justifyContent: "center",
|
|
32
|
+
lineHeight: 1,
|
|
33
|
+
minBlockSize: 16,
|
|
34
|
+
verticalAlign: "middle",
|
|
35
|
+
...style
|
|
36
|
+
}}
|
|
37
|
+
>
|
|
38
|
+
<MotionStyles />
|
|
39
|
+
<span aria-hidden style={{ alignItems: "center", display: "inline-flex", gap: 4 }}>
|
|
40
|
+
<span className="eth-motion-dot" style={dotStyle(reduced, 0)} />
|
|
41
|
+
<span className="eth-motion-dot" style={dotStyle(reduced, 1)} />
|
|
42
|
+
<span className="eth-motion-dot" style={dotStyle(reduced, 2)} />
|
|
43
|
+
</span>
|
|
44
|
+
</span>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function dotStyle(reduced: boolean, index: number): React.CSSProperties {
|
|
49
|
+
return {
|
|
50
|
+
display: "inline-block",
|
|
51
|
+
width: 6,
|
|
52
|
+
height: 6,
|
|
53
|
+
borderRadius: "50%",
|
|
54
|
+
background: "currentColor",
|
|
55
|
+
flex: "0 0 auto",
|
|
56
|
+
animation: reduced ? undefined : "eth-motion-dot 1s ease-in-out infinite",
|
|
57
|
+
animationDelay: reduced ? undefined : `${index * 120}ms`
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { AttentionPulseProps } from "./types";
|
|
3
|
+
import { MotionStyles, severityColor, usePrefersReducedMotion } from "./motionUtils";
|
|
4
|
+
|
|
5
|
+
export function AttentionPulse({
|
|
6
|
+
severity = "warning",
|
|
7
|
+
maxRepeats,
|
|
8
|
+
className,
|
|
9
|
+
children,
|
|
10
|
+
role = "status",
|
|
11
|
+
style,
|
|
12
|
+
"aria-label": ariaLabel,
|
|
13
|
+
...props
|
|
14
|
+
}: AttentionPulseProps) {
|
|
15
|
+
const reduced = usePrefersReducedMotion();
|
|
16
|
+
const hasLabel = React.Children.count(children) > 0;
|
|
17
|
+
const classes = [
|
|
18
|
+
"eth-motion-attention-pulse",
|
|
19
|
+
`eth-motion-attention-pulse--${severity}`,
|
|
20
|
+
reduced ? "eth-motion-reduced" : null,
|
|
21
|
+
className
|
|
22
|
+
]
|
|
23
|
+
.filter(Boolean)
|
|
24
|
+
.join(" ");
|
|
25
|
+
const attentionStyle = {
|
|
26
|
+
"--eth-motion-attention-color": severityColor(severity),
|
|
27
|
+
"--eth-motion-attention-border": severityBorderColor(severity),
|
|
28
|
+
"--eth-motion-attention-ink": severityInkColor(severity),
|
|
29
|
+
"--eth-motion-attention-repeat": String(maxRepeats ?? "infinite"),
|
|
30
|
+
...style
|
|
31
|
+
} as React.CSSProperties;
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<span
|
|
35
|
+
{...props}
|
|
36
|
+
aria-label={ariaLabel ?? (hasLabel ? undefined : "Attention required")}
|
|
37
|
+
className={classes}
|
|
38
|
+
data-eth-component="AttentionPulse"
|
|
39
|
+
role={role}
|
|
40
|
+
style={attentionStyle}
|
|
41
|
+
>
|
|
42
|
+
<MotionStyles />
|
|
43
|
+
<span className="eth-motion-attention-pulse__marker" aria-hidden="true">
|
|
44
|
+
<span className="eth-motion-attention-pulse__dot">!</span>
|
|
45
|
+
</span>
|
|
46
|
+
{hasLabel ? <span className="eth-motion-attention-pulse__label">{children}</span> : null}
|
|
47
|
+
</span>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function severityBorderColor(severity: AttentionPulseProps["severity"]) {
|
|
52
|
+
return severity === "warning" ? "#8a6a00" : severityColor(severity);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function severityInkColor(severity: AttentionPulseProps["severity"]) {
|
|
56
|
+
return severity === "warning" ? "#161616" : "#ffffff";
|
|
57
|
+
}
|