factcircuit
FactCircuit는 불변 출처와 단계별 검증, 제한된 검색, 재현 가능한 평가를 제공하는 감사 가능한 주장·증거 검증 루프입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Atomity Frontend Engineering Challenge
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
An original, animated, scroll-driven visualization of multi-cloud resource cost aggregation — four cloud providers feeding into a shared cost analysis, a focus transition onto one specific workload, and a savings conclusion. Built as a self-built, from-scratch frontend engineering exercise: every visual element (nodes, connectors, chart, cards, badges) is hand-built, with no pre-made UI component library.README 전문 보기 ↗An original, animated, scroll-driven visualization of multi-cloud resource cost aggregation — four cloud providers feeding into a shared cost analysis, a focus transition onto one specific workload, and a savings conclusion. Built as a self-built, from-scratch frontend engineering exercise: every visual element (nodes, connectors, chart, cards, badges) is hand-built, with no pre-made UI component library.
useScroll/useTransform primitives, which drive every stage off a single progress value so the whole sequence reverses correctly on scroll-up with no separate "undo" logicNo UI/component libraries, no icon packages, and no dependencies beyond what's listed above.
npm install
npm run dev
Then open http://localhost:3000. For a production build:
npm run build
npm run start
Other scripts: npm run lint (ESLint), npm run typecheck (tsc --noEmit).
The page is a single scroll-driven narrative, pinned to the viewport while you scroll through five stages:
Every stage is driven by a single scroll-progress value, so scrolling back up reverses the whole sequence exactly, rather than relying on one-shot "play on enter" animations.
On mobile widths and whenever the OS/browser's reduced-motion preference is on, the page switches to a simpler, non-pinned layout: the same content reveals as you scroll past it with a plain fade-and-slide-in, with no scroll-scrubbing, scaling, or zoom.
Data comes from the public DummyJSON products endpoint:
GET https://dummyjson.com/products?limit=10&select=id,title,price,rating,discountPercentage,stock
The fetched price, rating, discountPercentage, and stock fields are deterministically transformed (see src/lib/mapResourceData.ts) into this visualization's own domain model — cost figures per resource category, provider glyph "lit" states, and a computed savings figure. This is a genuine, dynamic fetch with real async state handling; the numbers are not presented as real cloud telemetry, just realistic-looking figures derived from a real API response, remapped honestly into the visualization's own language.
Loading / error / success states: a skeleton placeholder renders on first load; a network failure shows an explicit error message with a working Retry button; on success, the real values feed the animation and count-up numbers. TanStack Query caches responses for 5 minutes, so revisiting or remounting the section within that window shows data instantly with no redundant network request.
<section>, <h2>, <figure>/<figcaption>, <dl> for label/value pairs) rather than generic <div>s.prefers-reduced-motion is handled as a first-class alternate render path (see above), not a single disabled transition.<button> with a visible focus ring.aria-hidden; all meaningful content is real text in the DOM.src/app/globals.css (colors, spacing, radius, typography, motion durations/easing) are the single source of truth, referenced from components via Tailwind's arbitrary-value syntax (bg-[var(--color-bg-surface)]) rather than scattered hex values.CloudProviderNode, ResourceGlyph, ConnectionLayer, ResourceVisualization, ResourceMetric, SavingsDetail, plus generic Badge/Button/StatValue primitives) rather than one large monolithic section component; the orchestrating MultiCloudSection owns the scroll wiring and passes a single progress value down.@container) drive component-level responsiveness (e.g. the chart's bar layout), color-mix() produces accessible-contrast text variants of the accent color, and clamp() handles fluid type sizing.getBoundingClientRect measurement; this is robust for the current layout but would need to become measurement-based if the composition grew more dynamic.