Skip to content

Releases

Kineto v0.12.3

Choose a tag to compare

@github-actions github-actions released this 27 Sep 05:58
04bc0c2

Kineto v0.12.3

English

  • ScrollTrigger is no longer refreshed while the page scrolls. The core refreshes ScrollTrigger when the document's height settles (src/layoutRefresh.js); it now also waits for scrolling to stop. A refresh re-measures every trigger in one long task (40–70 ms per refresh on WebKit) and puts the scroll position back, which stalls a scroll in progress and ends a touch fling on iOS — and a page whose blocks settle as they near the screen, like the demo since 0.12.2, refreshed about ten times in twelve screens of scrolling. Gate: tests/browser/layout-refresh.mjs (no refresh while scrolling, one once it stops).
  • Demo on phones: tapping a demo no longer makes the page jump. Found by tapping every one of the demo's 519 controls in an emulated iPhone (WebKit, touch), before and after. A tap was taken for the start of a fling, so a height change right after it was left unanchored. Measuring the blocks above the screen at rest used to draw each one for real, which woke every effect inside and held the page for up to half a second just as the reader tapped; it now lays them out without drawing — a few milliseconds each, exact to the pixel. Anchoring keeps the middle of the screen still, and it also watches the grids inside the block being read: a tall block (Loading Indicator holds six) folded its upper grids as they came near and pulled the tapped card up by 1,000 px. A link to a card in a block that was not planned yet (compare sheet, share link) now plans its fold first instead of landing on a card that folds away a moment later. In the frame of a jump, the block the jump went to is left alone together with its parts — a block drawn for the first time lays its parts out too, and anchoring them threw a scrollIntoView target a screen away. Measuring ahead now runs only for a reader who scrolls by touch (a wheel, a key or the scrollbar never coasts), so a desktop no longer spends frames on it.
  • Lazy: replaying a skeleton while the previous run's image is still loading keeps the replayed skeleton. When that image arrived, the previous run carried on with the new run's layers and faded the skeleton out at once, so the replay showed nothing (and a fade scheduled just before a replay removed the new layers). Each run is numbered and an outdated one stops at its next step; replay() cancels the previous run's pending timers and frame. Gate: tests/browser/lifecycle-edges.mjs (Chromium, WebKit, Firefox).
  • Cursor: a cursor on an element with content stays inside that element, however the element looked when Kineto started. The module decided "page-wide or scoped" by the element's size at creation, so a card cursor whose card was hidden at that moment (a closed tab panel, a collapsed accordion, a card not on the page yet) measured 0×0 and became page-wide — a second ring following the pointer everywhere, drawn over the page's own cursor. An element that is not drawn at all is now judged by its content; empty holders, global: true and tiny drawn holders stay page-wide as before (docs/modules/cursor.md). Gate: tests/browser/cursor-scope.mjs (Chromium, WebKit, Firefox).
  • Demo: closing a "모든 variant 비교" sheet no longer leaves effects behind. A tile is created when it nears the screen, and that notice can arrive after the sheet was closed; the tile was then created on a stage no longer on the page, where nothing would ever destroy it. On the Cursor sheet this left a second cursor — the orange Ring + Dot ring — following the pointer across the whole page. Tiles that are no longer on the page are not created, and a closed sheet clears its waiting tiles. Gate: tests/variant-compare.mjs (a late notice after closing creates nothing).
  • Demo: the page cursor is the orange dot and ring (the theme's accent, var(--accent)), one ring only. It was a white dot and a pale ring blended with difference, which drew black on the light theme.
  • Overflow Text Hover Roll works on touch. A phone has no hover, so a tapped Hover Roll link navigated before the roll could be seen. A touch tap on an ordinary same-window link now plays the roll first and replays that one click after rollDuration; mouse hover, keyboard activation, downloads, modifier clicks, links that open another window and clicks another script already cancelled keep their native timing. Table: docs/modules/overflow-text.md. Gate: tests/motion-regressions.mjs (from PR #50).
  • Hover-driven modules decide "can the reader hover?" in one place, utils.canHover() (any attached input can hover with a fine pointer). A touchscreen laptop, or a tablet with a trackpad, reports its primary input as coarse and non-hovering even while a mouse is moving, and has touch points: Cursor turned itself off there, and Tilt and Mouse Parallax waited for a gyroscope a laptop never fires, ignoring the mouse. They now follow the mouse; a finger on such a screen hides the page cursor until the mouse moves again. Phones keep the touch path (Cursor tap effects, gyroscope tilt and parallax, Card Glow press light). disableOnMobile (Tilt, Card Glow) and Vibrate's hover trigger use the same answer, and Mega Menu's existing check moved onto the helper. Policy and per-module table (desktop / touch / keyboard): docs/hover-touch-policy.md. Gate: tests/browser/hover-touch.mjs (desktop, touchscreen laptop and phone profiles; fails on 0.12.2).
  • Counter's delayed work obeys teardown: native Pop wakes every character from one shared animation frame (it asked for one per glyph) and owns its completion timeout, and Clock flip/fade track their delayed callbacks, clear them before a rebuild and cancel them on destroy — a destroyed counter no longer animates restored markup or reports onComplete late. Gate: tests/motion-regressions.mjs (from PR #46).
  • Fullpage transition fallbacks have one owner: a new programmatic navigation cancels the previous settle timeout, transitionend cancels its fallback, and destroy clears the settle timeout and the first section-measure frame, so an older transition can no longer unlock input in the middle of a newer one. Gate: tests/motion-regressions.mjs (from PR #47).
  • Kineto.observe() cleans up only the subtrees that were removed. Any child removal used to re-check every live instance on the page; it now walks the removed element trees, and an element moved elsewhere before the batched flush keeps its instance. Gate: tests/performance-runtime.mjs (from PR #41). The Lightbox CSS compaction (#43, #40) and Loading Indicator preset clean-up (#44) from the same PR stack were already on main.
  • README (all seven languages): installation leads with core + only the modules you use — npm, and native ES modules straight from the CDN (dist/modular/…) — then the full bundle as the quickest start, then React and Vue. What each module adds on top of core is a new generated table, docs/module-cost.md (npm run docs:module-cost, refreshed by release:prepare; core 14.9 KB gzip, median module about 2 KB), and the whole-app report docs/consumer-bundle-size.md is current again. Five localized READMEs and three agent docs still said 53 modules; every "N modules" phrase is now checked against the contract.
  • Tests: drawer-layout waits for the selected tab and a settled sheet height instead of fixed sleeps (it flaked once in a full 2-core lane), and states, slider-scroll-snap and glitch-wave honour KT_CHROME like every other browser suite.
  • Build: Vite 8.3.0 (the built files are byte-identical) and the QA fixtures' React 19.3.0, scheduler 0.28.0, Vue 3.5.43 and Rolldown 1.2.9 (Dependabot #18, #20, #22–#24, #31–#33). jsdom 30 is held back: its CSS serializer leaves background-position longhands behind, which the leak gate reads as a style Scroll Shadows did not restore; TypeScript 7, jQuery 4, Playwright 1.63 and actions/download-artifact 8 need their own compatibility runs.
  • Diagnostics: KT_ENGINE_UNAVAILABLE reports an on-demand engine that did not arrive — GSAP + ScrollTrigger for the scroll modules, Lenis for smooth scroll — with the engine, the loader's reason (blocked, SRI mismatch, timeout, disabled) and the modules that were waiting. The loaders never reject, so modules already degraded, but the reason was thrown away and a page behind a CSP or an ad blocker just got quieter effects. Debug-only like every diagnostic; page text never enters it. Docs: docs/diagnostics-and-deprecation.md, troubleshooting "스크롤 효과가 대체 경로로만 동작함". Gate: tests/engine-loader.mjs.

한국어

  • 페이지가 스크롤되는 동안에는 ScrollTrigger를 새로 고치지 않습니다. 코어는 문서 높이가 안정되면 ScrollTrigger를 새로 고치는데(src/layoutRefresh.js), 이제 스크롤이 멈출 때까지도 기다립니다. 새로 고침은 모든 트리거를 긴 작업 하나로 다시 재고(WebKit에서 한 번에 40~70ms) 스크롤 위치를 되돌려 놓아서, 진행 중인 스크롤을 멈칫하게 하고 iOS의 터치 플링을 끊습니다. 0.12.2부터의 데모처럼 블록이 화면에 가까워질 때 자리 잡는 페이지는 12화면 스크롤하는 동안 약 열 번 새로 고쳤습니다. 게이트: tests/browser/layout-refresh.mjs(스크롤 중에는 없음, 멈춘 뒤 한 번).
  • 휴대폰 데모: 데모를 탭해도 페이지가 튀지 않습니다. iPhone 에뮬레이션(WebKit, 터치)에서 데모 컨트롤 519개를 전부 눌러 보며 찾고 확인했습니다. 탭을 플링의 시작으로 여겨, 탭 직후의 높이 변화를 보정하지 않았습니다. 멈춰 있을 때 화면 위쪽 블록을 재던 작업은 블록을 실제로 그려서 그 안의 효과를 모두 깨웠고, 독자가 탭하는 순간 페이지를 최대 0.5초 붙잡았습니다. 이제 그리지 않고 레이아웃만 합니다 — 블록당 몇 ms, 오차 1px 이내. 앵커링은 화면 가운데를 고정하고, 읽고 있는 블록 안의 그리드도 봅니다: 그리드가 여섯 개인 Loading Indicator 같은 긴 블록은 위쪽 그리드가 가까워지며 접히면서 탭한 카드를 1,000px 끌어올렸습니다. 아직 배치되지 않은 블록의 카드로 가는 링크(비교 시트, 공유 링크)는 도착한 뒤 카드가 접혀 사라지는 대신 먼저 접기를 계획합니다. 점프한 프레임에서는 점프 목표 블록을 그 부분까지 함께 건드리지 않습니다 — 처음 그려지는 블록은 부분도 함께 레이아웃되므로, 그 부분을 보정하면 scrollIntoView 목표가 한 화면 밖으로 밀려났습니다. 미리 재는 작업은 터치로 스크롤하는 독자에게만 합니다(휠·키·스크롤바는 관성이 없음). 데스크톱은 여기에 프레임을 쓰지 않습니다.
  • Lazy: 이전 실행의 이미지가 아직 로딩 중일 때 스켈레톤을 다시 재생해도 새 스켈레톤이 유지됩니다. 그 이미지가 도착하면 이전 실행이 새 실행의 레이어로 마저 진행해 스켈레톤을 바로 사라지게 했고(다시 재생이 아무것도 안 보여 줌), 다시 재생 직전에 예약된 페이드가 새 레이어를 지우기도 했습니다. 실행마다 번호를 두어 낡은 실행은 다음 단계에서 멈추고, replay()는 이전 실행의 대기 중인 타이머와 프레임을 취소합니다. 게이트: tests/browser/lifecycle-edges.mjs(Chromium, WebKit, Firefox).
  • 커서: 내용이 있는 요소에 붙인 커서는 Kineto가 시작될 때 그 요소가 어떤 상태였든 그 요소 안에만 머뭅니다. 모듈은 "페이지 전체인가, 영역인가"를 생성 시점의 요소 크기로 정했기 때문에, 그 순간 카드가 숨겨...
Read more

Kineto v0.12.2

Choose a tag to compare

@github-actions github-actions released this 26 Sep 09:30
3cc58bb

Kineto v0.12.2

English

  • First published 0.12 release. v0.12.0 and v0.12.1 were tagged, but neither release run published anything — 0.12.0 stopped on a real Tabs bug, and for 0.12.1 CI passed while the release's identical re-run failed on one flaky browser test — so npm stayed on 0.11.0. Everything listed under 0.12.1 and 0.12.0 ships in this version, and the release workflow no longer re-runs CI (below).

  • Make CI and releases faster without dropping a gate. Every lane — test:node, test:browser, test:browser:cross — runs through scripts/run-lane.mjs straight from its package.json list: a failing test is retried on its own instead of re-running the whole lane (one flake used to cost about 7 minutes per retry), every failing test is reported in one pass with its time, and --shard k/n splits a lane across runners. CI runs one Node job and five browser shards (Chromium ×2, WebKit ×2, Firefox) at the same time, so it takes as long as its slowest shard (about 6–10 minutes) instead of about 25. The workflows no longer keep their own copies of the test lists; the Firefox/WebKit copy had drifted from npm run test:browser:cross, which now runs the same 28 files as CI.

  • The release workflow trusts CI instead of repeating it. It requires CI's green result for the tagged commit on main (scripts/require-green-ci.mjs, with the job's read-only token), then checks and packs the package — test:release-package, a Chromium smoke of every module from that build, the lockfile audit — in about 5 minutes instead of 25. For v0.12.1, CI passed and the identical re-run inside the release failed on one flaky test, burning the version; now a red CI can be re-run and the release re-run with the same tag, because nothing was published.

  • Flaky tests are reported, never hidden: a test that passes only on a retry prints Flaky:, leaves a CI warning annotation and is listed in the lane summary, and a test that times out on every attempt says so in an error annotation (a killed process cannot report for itself). Hunt a flake locally with node scripts/run-lane.mjs test:browser --only <name> --repeat 3, which turns retries off.

  • New npm run verify:push — lint, build with a check for stale generated files, every Node test, demo QA (about 4 minutes) — is the required check before any push; npm run hooks:install adds an opt-in pre-push hook that runs its fast form. 15 of the last 26 red CI runs failed on something it catches. AGENTS.md now states the push rules for every agent. A local build stamps the demo's build id as dev (CI, which builds what Pages deploys, stamps the commit), so the committed site/index.html no longer changes on every commit.

  • Demo: the Flip block no longer leaves a hole. Its two cards (FLIP grid and Fold) were .wide in a 3-up grid, so the first took two thirds of the row and the second a full row below it; they now sit side by side, and every row that cannot be completed is split evenly (not only the last one — planShortRows in demo/main.js). The opened Fold tiles shrink with the stage instead of spilling out of a half-width card or a phone. Gate: tests/browser/demo-blocks.mjs (no row holes at 1440 and 1024 px).

  • Demo: a block no longer ends on one stretched card after a row of three. The last two rows share their cards instead (Date Time 3+1 → 2+2; Overflow Text, Glitch and Stylize end on two pairs). After a row of two a lone card still fills its row, and deliberate full-row demos (.card.full) keep theirs. Gate: tests/browser/demo-blocks.mjs.

  • Demo: rebalancing a grid no longer trips WebKit's "ResizeObserver loop completed with undelivered notifications" page error. The observer rebalanced inside its own callback, which changed the grid's height and re-notified it in the same frame; it now reacts only to width changes and rebalances on the next frame. The CSS Scroll check in tests/browser/demo-blocks.mjs holds Lenis still while it scrolls by hand and starts from a card that is really in view (CI read the view timeline as 0 before and after), and its failure message now carries the scroll position, the card's box and its animations.

  • New Kineto.config({ defer: true }) (off by default): effects found by scan() are created only when their element comes within one viewport of the screen, for modules that declare defer: true — the visual effects (Reveal, the text modules, Glitch, Stylize, Squircle, Canvas Effect, Card Glow, Tilt, Magnetic, Mouse Parallax, Parallax, CSS Scroll, Scroll Velocity, Scroll Shadows, Cover Reveal, Brush Reveal, Counter, Marquee, Loading Indicator, Ripple, Vibrate, Confetti). Pins, page-level modules, components with keyboard/ARIA behaviour, Lazy and Ambient Media are still created at once, direct calls such as Kineto.reveal(el) are never deferred, options are read when the instance is finally created, and destroy() cancels queued work. Custom modules opt in with defer: true in their definition (typed on KinetoModule). Gate: tests/browser/deferred-create.mjs.

  • Overflow Text rebuilds after a width change at the next frame instead of inside its ResizeObserver callback. Rebuilding changes the element's own box, and doing it in the callback re-notified the observer in the same frame: WebKit reported "ResizeObserver loop completed with undelivered notifications" as a page error on the demo after a viewport resize.

  • Lazy and Stylize measure their media wrapper in one batch at the end of the creating task (measureThenApplyThisTask in src/utils.js) instead of reading style and layout between each image's DOM writes: 40 images created together now force 1 layout instead of 40, and the wrapper still has its box before the first paint (tests/browser/create-cost.mjs).

  • Demo: much faster on phones. Module blocks far from the viewport skip rendering (content-visibility: auto; blocks that pin keep rendering), rows and folds are measured only for blocks near the viewport, touch devices create effects as they come near (defer), and the ~240 playground titles attach their Overflow Text when their card nears. Emulated phone (iPhone 13 viewport, 4× CPU throttle): load event 7.5 → 2.7 s, long tasks in the first 10 s 9.8 → 3.4 s, instances right after load 520 → 102, main thread at rest 100% → about 30% busy; scrolling 12 screens at a steady speed ran at 11 fps (median frame 83 ms, 62 frames over 50 ms) and now at 39 fps (median 17 ms, 16 over 50 ms).

  • Demo: the page never shifts under the reader, however they got there. A skipped block is drawn at its real height only when it nears, so the demo anchors the scroll itself (the browser's anchoring is off there, and iOS has none): a block above the screen that changes height moves the page with it, before paint. It waits while another script's smooth scroll runs and while a touch fling coasts (moving the page would stop either); for the fling case, blocks above the screen that were never drawn are drawn once while the page rests. The side nav, #hash links, the compare sheet and share links jump through one KINETO_BLOCKS.jumpTo(), whose glide re-aims every frame and arrives a screen short at once when the target is far — it lands exactly without measuring the blocks in between first (that measuring held a phone for a third of a second).

  • Demo: a deep link such as /#mod-counter could open a different module. While the intro held the page still, blocks drawn under it moved, the scroll spy rewrote the address to whichever block was then in view, and the jump after the intro followed the rewritten address. The spies now wait until a deep link's jump has settled, and keeping the active side-nav link visible scrolls only the nav itself — scrollIntoView() had also pulled the locked page to the top (tests/browser/b2_navigation.mjs).

  • tests/browser/stylize.mjs opens a card's fold before pressing its motion switch: a card past a block's first two rows is inert behind "Show more demos", and the v0.12.2 CI run failed on it in all three engines after the demo's last rows were rebalanced. Browser tests that read a far grid or count instances around the Loader demo now bring it near first, the way a reader does (demo-polish.mjs, measure.mjs), and tests that go to a far demo use the demo's own KINETO_BLOCKS.jumpTo(): Playwright's scrollIntoViewIfNeeded() does not move WebKit to an element inside a block that skips rendering.

한국어

  • 처음 배포되는 0.12 릴리스입니다. v0.12.0·v0.12.1 태그는 만들어졌지만 두 릴리스 모두 아무것도 게시하지 못했습니다 — 0.12.0은 실제 Tabs 버그에서 멈췄고, 0.12.1은 CI가 통과한 뒤 릴리스가 같은 검사를 다시 돌리다 흔들리는 브라우저 테스트 하나에 실패했습니다. 그래서 npm은 0.11.0에 머물렀습니다. 0.12.1과 0.12.0에 적힌 내용은 모두 이 버전에 들어 있고, 릴리스 workflow는 더 이상 CI를 다시 돌리지 않습니다(아래).
  • 검사를 빼지 않고 CI와 릴리스를 빠르게 했습니다. 모든 레인(test:node·test:browser·test:browser:cross)이 package.json 목록 그대로 scripts/run-lane.mjs로 돕니다. 실패한 테스트만 따로 재시도하고(전에는 테스트 하나가 흔들리면 레인 전체를 다시 돌려 재시도마다 약 7분), 실패한 테스트를 한 번에 모두 시간과 함께 보고하며, --shard k/n으로 레인을 여러 러너에 나눕니다. CI는 Node 작업 하나와 브라우저 shard 다섯 개(Chromium 2·WebKit 2·Firefox 1)를 동시에 돌려, 약 25분 걸리던 시간이 가장 느린 shard 하나(약 6~10분)로 줄었습니다. workflow에 테스트 목록 사본을 따로 두지 않습니다. Firefox/WebKit 사본은 npm run test:browser:cross와 이미 어긋나 있었고, 이제 이 명령이 CI와 같은 28개 파일을 돌립니다.
  • 릴리스 workflow가 CI를 반복하지 않고 CI 결과를 믿습니다. 태그가 가리키는 main commit의 CI 성공을 확인한 뒤(scripts/require-green-ci.mjs, 작업의 읽기 전용 토큰) 패키지만 검사해 묶습니다(test:release-package, 그 빌드로 모든 모듈을 돌리는 Chromium smoke, lockfile 감사). 25분 걸리던 릴리스가 약 5분이 됩니다. v0.12.1은 CI가 통과한 commit을 릴리스가 똑같이 다시 돌리다 흔들리는 테스트 하나에 실패해 버전을 잃었습니다. 이제는 아무것도 배포되지 않았으므로, 실패한 CI를 다시 돌린 뒤 같은 태그로 릴리스를 다시 돌리면 됩니다.
  • 흔들리는 테스트를 숨기지 않고 알립니다. 재시도에서야 통과한 테스트는 Flaky:를 출력하고 CI warning annotation을 남기며 레인 요약에 나옵니다. 모든 시도에서 시간 초과된 테스트는 error annotation으로 그 사실을 남깁니다(강제 종료된 프로세스는 스스로 보고하지 못함). 로컬에서는 재시도를 끈 node scripts/run-lane.mjs test:browser --only <이름> --repeat 3으로 찾습니다.
  • 새 npm run verify:push(lint, 생성 파일이 낡았는지 확인하는 build, 모든 Node 테스트, 데모 QA — 약 4분)를 모든 push 전에 반드시 돌립니다. `npm run hooks:...
Read more

Kineto v0.11.0

Choose a tag to compare

@github-actions github-actions released this 19 Sep 06:55
7c9d9b0

Kineto v0.11.0

English

  • Add Kineto.observe(root?, { scan, attributes }), the 29th Core API: a MutationObserver-based live-DOM mode that scans the root once, attaches modules to data-kt-* elements added later (batched per microtask), releases the instances of elements that leave the DOM, optionally reacts to data-kt-* attribute changes, stays idempotent per root, returns an inert handle during SSR, and is disconnected by a global destroy(). Covered by tests/observe.mjs and typed in types/index.d.ts.
  • Add the integration map kineto.integrations.json (+ JSON schema): twelve ecosystems (vanilla, shadcn/ui, Tailwind, Bootstrap 5, MUI, Mantine, Chakra UI, Ant Design, daisyUI, Nuxt UI, PrimeVue, Vuetify) with attach patterns, what each library already provides and the combinations to avoid; thirty design intents (hero headline, section entrance, card hover, KPI number, image loading, dialog enter/exit, toast, marquee, page transition …) with contract-validated recipes, English/Korean keywords and Figma layer-name patterns; and a Figma MCP workflow. npm run integrations:build generates docs/integrations/*.md, the agent rules ai/kineto.rules.md, the Cursor rule ai/cursor/kineto.mdc, site/llms.txt and site/ai/kineto.rules.md; tests/integrations-contract.mjs checks every recipe, attribute and snippet against the feature contract and fails when a generated file is stale.
  • Publish a shadcn registry from the demo site (registry/ → site/r/registry.json + site/r/<name>.json, namespace @kineto → https://kineto.dongri.me/r/{name}.json): typed React wrappers provider (mounts Kineto.observe()), reveal, text-reveal, counter, image, marquee, tilt-card, magnetic-button, presence, page-reveal, the shared utils lib and an ai-rules item that installs the Cursor rule and Markdown rules into a project. scripts/build-registry.mjs validates the sources (kebab names, 'use client', URL-form registry dependencies, scoped package imports) and npm run build regenerates the site copies.
  • Prove the map against the real libraries in a new locked fixture tests/integrations/ (test:integrations): MUI, Mantine, Chakra UI and Ant Design components forward data-kt-* props (server render → jsdom → Kineto.scan()), a React client render is attached and released by Kineto.observe(), Vuetify and PrimeVue let attrs fall through under SSR, every registry component type-checks under strict TypeScript with the real React types, and the shadcn CLI installs the items into a fresh project both by URL and through the @kineto namespace.
  • Add a Bootstrap 5 coexistence example (examples/bootstrap/index.html: sticky navbar with a Kineto reading-progress bar, textSplit hero, modal trigger with ripple + magnetic, Bootstrap-only tooltip, staggered KPI counters, tilt/glow cards with lazy images, a Bootstrap carousel and accordion left to Bootstrap, a marquee, dynamic cards and toasts) and drive it in Chromium (tests/integrations/bootstrap-qa.mjs): the pinned CDN files must match the installed bootstrap package byte for byte (SRI verified offline), Bootstrap keeps owning modal focus, tooltip, accordion and carousel while Kineto instances live on the same elements, observe() attaches to and releases dynamic cards/toasts, destroy() leaves Bootstrap intact, and no library logs an error.
  • Add the Kineto MCP server package packages/kineto-mcp (@dong-gri/kineto-mcp, stdio only, not yet published): kineto_suggest, kineto_figma_layers, kineto_snippet, kineto_validate_options (with "did you mean" hints), kineto_module, kineto_list_modules, kineto_ecosystem; resources kineto://rules|integrations|features|meta; prompt kineto_apply_motion. It answers from contract copies synced by scripts/build-mcp.mjs (checked by the contract test), validates every input with bounded schemas, and is exercised end to end over stdio by npm run test:mcp in CI.
  • Scope the Pages deploy concurrency group to real deploys (demo-site-main for main pushes and manual dispatch, a run-scoped group otherwise): a Dependabot-branch CI completion previously entered the shared demo-site group as a skipped workflow_run and cancelled the in-flight v0.10.0 deploy, leaving kineto.dongri.me on the previous build. Locked by tests/release-automation.mjs; RELEASING documents the re-deploy path.
  • Extend the repository gates to the new packages: audited lockfiles, Dependabot, lockfile-boundary (publishable package kind) and supply-chain floors (picomatch is now checked per major line — the shadcn CLI still needs the patched 2.3.2 line via micromatch), test:observe/test:integrations/test:mcp in test:node and both workflows, ESLint over the fixture and the MCP package, and README (all seven languages), docs index, getting started and the AI prompt guide now cover observe(), the integration guides, the registry and the MCP server. The React/Vue/jQuery example READMEs install the scoped @dong-gri/kineto package instead of the unscoped name.
  • Record the verified v0.10.0 release: successful CI and Release runs, byte-identical npm/GitHub tarballs with matching provenance subject and release commit, and the cancelled canonical Pages deploy with its cause and fix.
  • Give the MCP server its own release path: scripts/release-targets.mjs maps tag prefixes to packages (v* → @dong-gri/kineto, mcp-v* → @dong-gri/kineto-mcp), npm run release:ship routes through it, scripts/check-mcp-release.mjs validates tag ↔ version, byte-identical contract copies, the package changelog and the bilingual note, and .github/workflows/release-mcp.yml verifies the tagged source, packs one digest-checked tarball and publishes it with provenance from a least-privilege job before creating the GitHub Release; release:prepare now also tracks the linked root version in tests/integrations/package-lock.json.

한국어

  • 29번째 Core API Kineto.observe(root?, { scan, attributes })를 추가했습니다. MutationObserver 기반 라이브 DOM 모드로, root를 한 번 스캔한 뒤 나중에 추가되는 data-kt-* 요소를 마이크로태스크 단위로 묶어 붙이고, DOM에서 빠진 요소의 인스턴스를 정리하며, 선택적으로 data-kt-* 속성 변경에 반응합니다. root당 한 번만 유지되고 SSR에서는 비활성 핸들을 돌려주며 전역 destroy()가 함께 해제합니다. tests/observe.mjs로 검증하고 types/index.d.ts에 타입을 추가했습니다.
  • 연동 지도 kineto.integrations.json(+ JSON 스키마)을 추가했습니다. 12개 생태계(vanilla, shadcn/ui, Tailwind, Bootstrap 5, MUI, Mantine, Chakra UI, Ant Design, daisyUI, Nuxt UI, PrimeVue, Vuetify)의 붙이는 방식·라이브러리가 이미 제공하는 것·피해야 할 조합, 30개 디자인 의도(히어로 헤드라인, 섹션 등장, 카드 호버, KPI 숫자, 이미지 로딩, 다이얼로그 진입/퇴장, 토스트, 마퀴, 페이지 전환 …)의 계약 검증 레시피와 영/한 키워드·Figma 레이어 이름 패턴, Figma MCP 워크플로우를 담습니다. npm run integrations:build가 docs/integrations/*.md, 에이전트 규칙 ai/kineto.rules.md, Cursor 규칙 ai/cursor/kineto.mdc, site/llms.txt, site/ai/kineto.rules.md를 생성하고, tests/integrations-contract.mjs가 모든 레시피·속성·스니펫을 기능 계약과 대조하며 생성물이 오래되면 실패합니다.
  • 데모 사이트에서 shadcn 레지스트리를 제공합니다(registry/ → site/r/registry.json + site/r/<name>.json, 네임스페이스 @kineto → https://kineto.dongri.me/r/{name}.json). 타입 지원 React 래퍼 provider(Kineto.observe() 마운트), reveal, text-reveal, counter, image, marquee, tilt-card, magnetic-button, presence, page-reveal, 공용 utils, 그리고 Cursor 규칙과 Markdown 규칙을 프로젝트에 설치하는 ai-rules 항목입니다. scripts/build-registry.mjs가 원본을 검증하고(kebab 이름, 'use client', URL 형식 registry 의존성, scoped 패키지 import) npm run build가 사이트 사본을 재생성합니다.
  • 새 잠금 fixture tests/integrations/(test:integrations)에서 지도를 실제 라이브러리로 증명합니다. MUI·Mantine·Chakra UI·Ant Design 컴포넌트가 data-kt-* prop을 DOM으로 전달하고(서버 렌더 → jsdom → Kineto.scan()), React 클라이언트 렌더를 Kineto.observe()가 붙이고 해제하며, Vuetify·PrimeVue가 SSR에서 attrs를 통과시키고, 모든 레지스트리 컴포넌트가 실제 React 타입으로 strict TypeScript를 통과하고, shadcn CLI가 URL과 @kineto 네임스페이스 두 방식으로 새 프로젝트에 항목을 설치합니다.
  • Bootstrap 5 공존 예제(examples/bootstrap/index.html: Kineto 읽기 진행 막대를 단 sticky 내비게이션, textSplit 히어로, ripple+magnetic 모달 트리거, Bootstrap 전용 툴팁, stagger KPI 카운터, lazy 이미지를 넣은 tilt/glow 카드, Bootstrap에 맡긴 캐러셀·아코디언, 마퀴, 동적 카드·토스트)를 추가하고 Chromium에서 구동합니다(tests/integrations/bootstrap-qa.mjs). 고정한 CDN 파일이 설치된 bootstrap 패키지와 바이트 단위로 일치해야 하고(SRI를 오프라인에서 검증), 모달 포커스·툴팁·아코디언·캐러셀은 Bootstrap이 계속 소유하면서 같은 요소에 Kineto 인스턴스가 살아 있고, observe()가 동적 카드·토스트를 붙이고 해제하며, destroy() 뒤에도 Bootstrap이 온전하고, 두 라이브러리 모두 오류를 남기지 않아야 합니다.
  • Kineto MCP 서버 패키지 packages/kineto-mcp(@dong-gri/kineto-mcp, stdio 전용, 아직 미게시)를 추가했습니다. kineto_suggest, kineto_figma_layers, kineto_snippet, kineto_validate_options(“혹시 이 옵션?” 힌트 포함), kineto_module, kineto_list_modules, kineto_ecosystem 도구와 kineto://rules|integrations|features|meta 리소스, kineto_apply_motion 프롬프트를 제공합니다. scripts/build-mcp.mjs가 동기화하는 계약 사본(계약 테스트가 검사)에서만 답하고, 모든 입력을 상한이 있는 스키마로 검증하며, CI의 npm run test:mcp가 stdio로 끝까지 실행합니다.
  • Pages 배포 concurrency 그룹을 실제 배포에만 적용합니다(main push·수동 dispatch는 demo-site-main, 그 외는 실행별 그룹). 이전에는 Dependabot 브랜치 CI 완료가 skip된 workflow_run으로 공용 demo-site 그룹에 들어와 진행 중이던 v0.10.0 배포를 취소했고, kineto.dongri.me는 이전 빌드에 머물렀습니다. tests/release-automation.mjs로 고정하고 RELEASING에 재배포 경로를 적었습니다.
  • 저장소 게이트를 새 패키지까지 넓혔습니다. 감사 대상 lockfile, Dependabot, lockfile 경계(게시용 패키지 종류), 공급망 하한(picomatch를 메이저 라인별로 검사 — shadcn CLI는 micromatch를 통해 패치된 2.3.2 라인이 여전히 필요), test:node와 두 워크플로우의 test:observe/test:integrations/test:mcp, fixture·MCP 패키지까지 ESLint, 그리고 README(7개 언어)·문서 인덱스·Getting Started·AI 프롬프트 가이드에 observe()·연동 가이드·레지스트리·MCP 서버를 반영했습니다. React/Vue/jQuery 예제 README는 unscoped 이름 대신 @dong-gri/kineto를 설치합니다.
  • 검증된 v0.10.0 릴리스를 기록했습니다: 성공한 CI·Release 실행, provenance subject·릴리스 커밋이 일치하는 동일 바이트 npm/GitHub tarball, 그리고 취소된 canonical Pages 배포의 원인과 수정.
  • MCP 서버에 독립 릴리스 경로를 만들었습니다. scripts/release-targets.mjs가 태그 접두사를 패키지에 매핑하고(v* → @dong-gri/kineto, mcp-v* → @dong-gri/kineto-mcp), npm run release:ship이 이를 거치며, scripts/check-mcp-release.mjs가 태그 ↔ 버전, 바이트 동일한 계약 사본, 패키지 changelog, 이중언어 ...
Read more

Kineto v0.10.0

Choose a tag to compare

@github-actions github-actions released this 19 Sep 04:20

Kineto v0.10.0

English

  • Add three stylized Lazy variants on one shared canvas rasterizer (src/modules/lazy/stylizedMedia.js): dither (Bayer 2×2/4×4/8×8, seeded random, Floyd–Steinberg and Atkinson error diffusion), ascii (a configurable glyph-density ramp), and halftone (dot, square, or line screens). Each reveals by shrinking its cells into the original picture and crossfading, or keeps the look permanently with persist; they apply to <img> (animated GIF/APNG/WebP keep re-rendering) and to <video> frame by frame, honour paperColor/inkColor/accentColor, originalColors + colorSteps, inverted, cellSize, renderFps/maxDpr and the low-performance frame cap, and leave the original media visible underneath when a cross-origin source cannot be read back. Locked as owner requirement MK-LAZY-008 (feature contract 1.4.0, requirements 3.2.0); proven by a three-engine pixel suite (tests/browser/lazy-stylized.mjs) and a Node unit suite for the rasterizer.
  • Declare a media variant capability (an <img> or a <video>) and use it for Lazy fade, dither, ascii, and halftone, so the demo drawer offers exactly the variants a <video> card can run.
  • Apply contract-derived variant gating the moment a settings drawer opens, not only after the first edit: opening the CRT card previously showed all 24 Lazy controls (pixelate steps, wave amplitude, …) and hid them on the first change. Groups whose every control is gated off no longer render an empty header. Guarded by two new drawer-layout checks.
  • Add four Lazy demo cards (two-tone dither reveal, colour error-diffusion reveal, persistent ASCII, persistent halftone video) with descriptions in seven languages, drawer controls and tooltips for the twelve new options, default values declared in the contract, and updated module docs; the cards opt out of legacy ?kt= ordinals so historical share links stay stable.
  • Guides: define what counts as real-usage evidence and when a variant graduates to its own module, add "canonical docs are the AI design system" and "the demo is the review surface" principles (derived from the 2026-09-18 Surfit article on AI-era product design), state that a push and a release are separate approvals (a push redeploys the public demo), document the data-demo-no-legacy-share rule, and unify the local Chromium override on KT_CHROME (MK_CHROMIUM stays as an alias).
  • Account for the measured cost of the stylized renderer (about 13 KB raw / 4.7 KB gzip in every full artifact): raise only the JS bundle, package and full/React/Vue consumer ceilings to the next measured KB; runner variance, CSS, modular core budgets and the 77-file package boundary are unchanged.
  • Record the verified v0.9.9 release: successful CI, Release, and canonical Pages runs on the new GitHub Actions majors, byte-identical npm/GitHub tarballs with matching provenance subject and release commit, and a canonical deployment whose 16 first-party assets (now including the minified demo bundle) byte-match the tested build.

한국어

  • 공용 canvas rasterizer(src/modules/lazy/stylizedMedia.js) 하나 위에 Lazy 스타일화 variant 세 개를 추가했습니다: dither(Bayer 2×2/4×4/8×8, seed 고정 random, Floyd–Steinberg·Atkinson 오차 확산), ascii(설정 가능한 글리프 밀도 ramp), halftone(점·사각·선 망점). 각 효과는 셀을 잘게 쪼개 원본으로 크로스페이드하는 리빌이거나 persist로 영구 필터가 되며, <img>(GIF/APNG/WebP는 계속 재렌더)와 <video>에 프레임 단위로 적용됩니다. paperColor/inkColor/accentColor, originalColors+colorSteps, inverted, cellSize, renderFps/maxDpr와 저성능 프레임 상한을 지원하고, CORS 없는 다른 origin 소스처럼 픽셀을 읽을 수 없으면 원본 미디어를 그대로 보여 줍니다. 소유자 요구사항 MK-LAZY-008로 고정했으며(기능 계약 1.4.0, 요구사항 3.2.0), 세 엔진 픽셀 검사(tests/browser/lazy-stylized.mjs)와 rasterizer Node 단위 검사로 증명합니다.
  • media variant 능력(<img> 또는 <video>)을 선언하고 Lazy fade·dither·ascii·halftone에 적용해, 데모 설정창이 <video> 카드에서 실제로 동작하는 variant만 제공합니다.
  • 계약에서 파생한 variant 옵션 gating을 첫 옵션 변경 뒤가 아니라 설정창이 열리는 순간부터 적용합니다. 이전에는 CRT 카드를 열면 Lazy 옵션 24개(픽셀 단계, 물결 진폭 등)가 모두 보였다가 첫 변경 때 숨겨졌습니다. 모든 옵션이 숨겨진 그룹은 빈 헤더를 그리지 않습니다. drawer-layout 검사 2건으로 보호합니다.
  • Lazy 데모 카드 4개(2색 디더 리빌, 원본색 오차 확산 리빌, ASCII 영구 필터, 망점 영상 영구 필터)와 7개 언어 설명, 새 옵션 12개의 설정창 컨트롤·도움말, 계약에 선언한 기본값, 모듈 문서를 추가했습니다. 새 카드는 과거 ?kt= 순번을 쓰지 않아 기존 공유 링크가 유지됩니다.
  • 가이드: 실사용 근거의 정의와 variant가 독립 모듈로 승격되는 기준을 명시하고, “정본 문서가 AI의 디자인 시스템”·“데모는 검수 화면” 원칙(2026-09-18 서핏 매거진의 AI 시대 프로덕트 디자인 글에서 도출)을 추가했습니다. push와 release는 별도 승인이라는 점(push는 공개 데모를 재배포), data-demo-no-legacy-share 규칙, 로컬 Chromium 지정 변수 KT_CHROME 통일(MK_CHROMIUM은 별칭)을 문서화했습니다.
  • 스타일화 렌더러의 측정 비용(모든 전체 산출물에서 약 13KB raw / 4.7KB gzip)을 반영해 JS 번들·패키지·full/React/Vue 소비자 상한만 다음 측정 KB로 올렸습니다. runner variance, CSS, 모듈형 core 예산과 77파일 패키지 경계는 그대로입니다.
  • 검증된 v0.9.9 릴리스를 기록했습니다: 새 GitHub Actions 메이저에서 성공한 CI·Release·canonical Pages 실행, provenance subject·릴리스 커밋이 일치하는 동일 바이트 npm/GitHub tarball, 그리고 (minify된 데모 번들을 포함한) 자체 자산 16개가 테스트된 빌드와 바이트 일치하는 canonical 배포.

Kineto v0.9.9

Choose a tag to compare

@github-actions github-actions released this 18 Sep 15:09

Kineto v0.9.9

English

  • Update the pinned GitHub Actions to checkout 7.0.1, setup-node 7.0.0, upload-artifact 7.0.1, upload-pages-artifact 5.0.0, and deploy-pages 5.0.1 — the open Dependabot proposals, with every SHA verified against the upstream tags before pinning.
  • Minify the demo's own scripts and stylesheets into the deployed site/ (about 220 KB raw / 58 KB gzip less per visit) while demo/ stays the readable QA source; demo:cdn --check, test:site, and a new Chromium site-smoke lane prove the deployed bytes are the current deterministic build and still boot, localize, open settings, apply live options, and restore share links.
  • Share one priority-preserving snapshotInlineStyles() across modules: restore keeps !important, removes properties the element never set, drops an empty style attribute the element did not have, and accepts camelCase or kebab-case names including vendor prefixes; Glitch uses it instead of a module-local copy.
  • Add subscribe(listener) to the Presence controller and keep the React/Vue status/result in sync through it, so a child driven by a parent's propagate: true exit reports finished instead of freezing at leaving; the framework QA nested-propagation assertion now passes deterministically instead of depending on timing. Record the measured package and Vue consumer cost of these correctness/security bytes by rounding the packed/unpacked and Vue ceilings by 1 KB with the same 77 files.
  • Treat demo ?kt= settings links as untrusted input: fields a module renders as HTML (Tooltip content/html, Cursor templates, Toast icon, Overflow Text items) are never serialized into or restored from a link, and resource URLs (Cursor images/sprites, Ambient source) restore only when they stay on the demo origin. A crafted link could previously execute script on the public demo; tests/browser/share-link-policy.mjs proves the payloads are inert while benign fields still restore.
  • Reuse a pre-existing engine <script> tag only when it carries the same SHA-384 integrity Kineto would inject, so an unverified tag for the GSAP/ScrollTrigger/Lenis URL can no longer bypass subresource integrity.
  • Make Glitch teardown terminal across text, image, CRT/VCR, and RGB Slice Burst renderers: prevent retained instances from restarting work or overwriting later edits, and restore owned image/host styles with their original priorities, opacity, and animation play state.
  • Record the Glitch correctness cost (~0.2 KiB UMD gzip); adjust only exceeded package, minified ESM, UMD raw, full-consumer and React ceilings while retaining runner variance, modular/Vue budgets and the 77-file package boundary.
  • Complete dedicated Reveal demo coverage with Blur, Rise, Soft, and Rotate comparisons, seven-language descriptions, settings/replay/share regressions, and a gate preventing any of the 23 public presets from losing its example; preserve runtime behavior and package budgets.
  • Add five directional Reveal comparisons (Fade Down/Left/Right and Slide Down/Right), with seven-language descriptions of the actual starting positions, connected controls, replay/copy/share coverage, and unchanged runtime behavior.
  • Add five matched Reveal comparison demos for Fade, Zoom In/Out and Flip X/Y, with seven-language descriptions, connected settings and replay, unique semantic sharing, and desktop/mobile layout regressions; preserve historical share links and the runtime package.
  • Honor opt-in Wave palettes and background blending without changing the default distortion; share the existing clock, resolve target-scoped CSS colors, restore author blending, and expose localized demo controls with rendered-pixel regressions.
  • Account for the measured Wave feature cost (~0.3 KiB UMD gzip, 534.0 KiB packed/1770.3 KiB unpacked), adjusting only affected ceilings while retaining 77 files and zero required runtime dependencies.
  • Synchronize React/Vue lifecycle QA with bounded state assertions instead of fixed mount/update sleeps; preserve completion, DOM removal and leak checks and test timeout diagnostics without changing the runtime package.
  • Restore native class-only Reveal observation after pause/resume; preserve completed once-only entrances and prevent destroyed instances from restarting, with normal/low-tier browser regressions.
  • Preserve all Reveal presets and class-only hooks in low-performance mode without using loaded GSAP/ScrollTrigger; avoid repeated full-list scans on native animation completion, batch class tokens, and correct the external-engine bundle documentation.
  • Support native Reveal pause/resume through owned Web Animations, preserving entrance delay, stagger, and existing easing without stopping author animations; cancel pending playback on replay/destroy and retain the legacy CSS fallback.
  • Unify Mask, Wipe, and Clock Reveal playback across GSAP/native paths: reversible re-entry, ordered boundary callbacks, stagger completion, pause/resume, clipped ancestor visibility, and safe replay/destroy.
  • Honor Glitch Wave trigger, one-shot looping, duration, delay, and randomness; preserve playback phase and original filter priority, stop hidden-tab work, and prevent destroyed instances from restarting.
  • Add a localized one-shot Wave demo and restore its seed/displacement controls and copied options; retain historical shared URLs and include Wave behavior checks in all browser gates.
  • Record the measured lifecycle cost (~1.2 KB full consumer gzip and ~4.2 KB packed archive), adjusting only affected budgets while preserving runner variance, modular budgets, zero required dependencies, and the 77-file package boundary.
  • Record the verified v0.9.8 release, byte-identical npm/GitHub packages and linked provenance metadata, successful CI, and canonical/backup parity for all twelve first-party scripts/styles and four click-media assets.
  • Preserve the QA report's source-package version marker for automated release preparation, separately from verified publication evidence.

한국어

  • 고정된 GitHub Actions를 checkout 7.0.1, setup-node 7.0.0, upload-artifact 7.0.1, upload-pages-artifact 5.0.0, deploy-pages 5.0.1로 갱신했습니다. 열려 있던 Dependabot 제안이며, 고정 전에 모든 SHA를 업스트림 태그와 대조했습니다.
  • 배포용 site/에 데모 자체 스크립트·스타일시트를 minify해 담습니다(방문당 약 220KB raw / 58KB gzip 절감). demo/는 읽기 쉬운 QA 원본으로 유지하고, demo:cdn --check·test:site·새 Chromium site-smoke 레인이 배포 바이트가 최신 결정적 빌드이며 부팅·다국어·설정 열기·실시간 옵션 적용·공유 링크 복원이 동작함을 검사합니다.
  • 우선순위를 보존하는 snapshotInlineStyles() 하나를 모듈이 공유합니다. 복원 시 !important를 유지하고, 요소가 설정하지 않았던 속성은 제거하며, 원래 없던 빈 style 속성을 남기지 않고, camelCase·kebab-case·vendor prefix 이름을 모두 받습니다. Glitch는 모듈 내부 복사본 대신 이 공용 함수를 사용합니다.
  • Presence 컨트롤러에 subscribe(listener)를 추가하고 React/Vue의 status·result를 이 구독으로 동기화합니다. 부모의 propagate: true exit로 끝난 자식이 leaving에 멈추지 않고 finished를 보고하며, framework QA의 중첩 전파 단언이 타이밍에 의존하지 않고 통과합니다. 이 정확성·보안 바이트의 측정된 패키지·Vue 소비자 비용을 기록해 packed/unpacked·Vue 상한만 1KB 반올림하고 77개 파일 범위는 유지합니다.
  • 데모의 ?kt= 설정 링크를 신뢰할 수 없는 입력으로 다룹니다. 모듈이 HTML로 렌더링하는 필드(Tooltip content/html, Cursor 템플릿, Toast icon, Overflow Text items)는 링크에 담지도 복원하지도 않고, 리소스 URL(Cursor 이미지·스프라이트, Ambient 소스)은 데모와 같은 origin일 때만 복원합니다. 이전에는 조작된 링크가 공개 데모에서 스크립트를 실행할 수 있었으며, tests/browser/share-link-policy.mjs가 페이로드 무력화와 일반 필드 복원을 함께 검사합니다.
  • 기존 엔진 <script> 태그는 Kineto가 주입할 SHA-384 integrity와 같은 값을 가진 경우에만 재사용합니다. 검증되지 않은 GSAP/ScrollTrigger/Lenis 태그로 subresource integrity를 우회할 수 없습니다.
  • Glitch 텍스트·이미지·CRT/VCR·RGB Slice Burst의 종료 후 재시작과 후속 편집 덮어쓰기를 막았습니다. 이미지·호스트의 소유 스타일을 원래 우선순위·투명도·애니메이션 재생 상태와 함께 복원합니다.
  • Glitch 수정 비용(UMD gzip 약 0.2KiB)을 기록하고 초과한 패키지·minified ESM·UMD raw·전체 소비자·React 상한만 조정했습니다. runner variance·모듈 조합/Vue 예산·77개 패키지 파일 범위는 유지합니다.
  • Blur·Rise·Soft·Rotate 비교 카드와 7개 언어 설명으로 Reveal 전용 데모 23개를 완성하고 설정·재생·공유 회귀 검사 및 예제 누락 방지 게이트를 추가했습니다. 런타임 동작과 패키지 예산은 유지합니다.
  • Fade Down/Left/Right·Slide Down/Right 방향 비교 데모 5개와 실제 시작 위치의 7개 언어 설명·설정·Replay·복사·공유 검사를 추가했습니다. 기존 런타임 동작은 변경하지 않습니다.
  • Fade·Zoom In/Out·Flip X/Y의 동일 조건 Reveal 비교 데모 5개와 7개 언어 설명·설정·Replay·고유 공유 링크·데스크톱/모바일 레이아웃 회귀 검사를 추가했습니다. 과거 공유 링크와 런타임 패키지는 유지합니다.
  • 기본 왜곡을 유지하면서 Wave의 선택적 색상 배열·배경 합성을 연결했습니다. 기존 타이머 공유·대상 문맥의 CSS 색상 해석·원래 합성 스타일 복원과 다국어 데모 설정·렌더링 픽셀 회귀 검사를 추가했습니다.
  • Wave 기능 비용(UMD gzip 약 0.3KiB 증가, 패키지 압축 534.0KiB·해제 1770.3KiB)을 측정해 해당 상한만 조정하고 77개 파일·필수 런타임 의존성 0개를 유지했습니다.
  • React/Vue lifecycle QA의 고정 mount/update 대기를 제한 시간 내 상태 단언으로 교체했습니다. 완료·DOM 제거·누수 검사를 유지하고 시간 초과 진단을 검사하며, 런타임 패키지는 변경하지 않습니다.
  • Native class-only Reveal의 일시 정지 후 viewport 관찰을 복구하고, 완료한 1회 진입과 destroy 후 재시작 방지를 보존합니다. 일반·저성능 티어 브라우저 회귀 검사를 추가했습니다.
  • 저성능 모드에서 로드된 GSAP·ScrollTrigger를 사용하지 않으면서 Reveal 프리셋과 class-only hook을 보존합니다. Native 애니메이션 완료 시 전체 목록 재검색을 없애고 class token을 묶어 처리하며, 외부 엔진 번들 설명을 바로잡았습니다.
  • Native Reveal이 소유한 Web Animation으로 대기 시간·stagger·기존 easing을 보존하는 일시 정지·재개를 지원하고, 작성자의 애니메이션은 유지합니다. replay/destroy 취소 처리를 보강하며 구형 CSS 대체 경로는 보존합니다.
  • Mask·Wipe·Clock Reveal의 GSAP/native 재생을 통합해 역재생·재진입, 경계 callback, stagger 완료, 일시 정지·재개, 조상 clipping 감지와 안전한 replay/destroy를 지원합니다.
  • Glitch Wave의 시작·1회 반복·시간·지연·변화 폭 설정을 연결하고, 진행률과 원본 filter priority 보존·숨김 탭 연산 정지·destroy 후 재시작 차단을 적용했습니다.
  • 다국어 Wave 1회 재생 데모와 seed·왜곡량 설정 및 복사 옵션을 복구하고, 과거 공유 URL을 보존하며 모든 브라우저 gate에 Wave 동작 검사를 연결했습니다.
  • 상태 관리 보강 비용(전체 소비자 gzip 약 1.2KB·압축 패키지 약 4.2KB 증가)을 기록하고 해당 예산만 조정했습니다. 러너 오차·모듈 조합 예산·필수 의존성 0개·77개 파일 경계는 유지합니다.
  • v0.9.8 릴리스의 npm/GitHub 동일 패키지와 provenance metadata 연결, CI 성공, 두 도메인의 자체 JS/CSS 12개·클릭 미디어 4개 일치 근거를 기록했습니다.
  • 자동 릴리스 준비가 사용하는 QA 보고서의 소스 패키지 버전 표식을 실제 게시 증거와 구분해 유지했습니다.

Kineto v0.9.8

Choose a tag to compare

@github-actions github-actions released this 12 Sep 04:57

Kineto v0.9.8

English

  • Restore Slider track/radial author state and sibling order, share native image-drag guards without overwriting unrelated image styles, and clean up grab-cursor listeners and queued auto-height writes; exercise all ten effects, image dragging, and replay in three browser engines.
  • Repair Reveal's clipped-target automatic entrance, unintended native vertical offset, mask/wipe defaults, final GSAP skew, and replay/destroy cleanup; honor native delay and completion timing and verify all 23 presets with and without GSAP in Chromium, Firefox, and WebKit.
  • Add six Slider and three Reveal comparison cards with all seven demo locales and semantic settings links that preserve historical shared URLs; restore missing Swing, Skew, and Wave settings choices, increase dedicated high-risk variant demos from 47/78 to 56/78, and synchronize the 1.0 readiness evidence to the verified v0.9.7 deployment.
  • Validate GitHub Actions by their actual action names and immutable full SHA pins instead of informational major-version comments, retaining negative checks for tags, branches, malformed hashes, and unpinned duplicates; permit stable dependency minor/patch updates within existing supported-major and minimum-version boundaries.
  • Rebuild animated hero copy on locale changes so visible text, accessible labels, replay, and destroy restoration retain the selected language.
  • Record the verified v0.9.7 release, matching npm/GitHub tarballs and provenance metadata, successful cross-browser workflows, and canonical/backup parity for all twelve first-party scripts/styles and four click-media assets.

한국어

  • Slider Track/Radial의 작성자 상태·원래 노드 순서를 복원하고, 다른 이미지 스타일을 덮어쓰지 않는 native drag 차단을 공유하며, grab cursor 리스너·예약된 자동 높이 쓰기를 정리합니다. 세 브라우저 엔진에서 10개 효과·이미지 드래그·Replay를 검사합니다.
  • Reveal의 완전 clip 대상 자동 진입·불필요한 native 세로 이동·Mask/Wipe 기본 방향·GSAP 종료 skew·replay/destroy 정리를 수정했습니다. native delay와 완료 시점을 지키고, 23개 프리셋의 GSAP 유무별 동작을 Chromium·Firefox·WebKit에서 검증합니다.
  • 데모 7개 언어와 과거 공유 URL을 유지하는 semantic 설정 링크를 갖춘 Slider 6개·Reveal 3개 비교 카드를 추가했습니다. 누락된 Swing·Skew·Wave 설정 선택을 복구하고, 고위험 variant 전용 데모를 47/78에서 56/78로 확대했으며 1.0 준비도 근거를 검증된 v0.9.7 배포로 최신화했습니다.
  • GitHub Actions의 참고용 major 버전 주석 대신 실제 action 이름과 불변 full SHA pin을 검사합니다. 태그·branch·잘못된 hash·고정되지 않은 중복 step을 거부하며, 의존성은 기존 지원 major·최소 버전 경계를 유지하는 안정 minor·patch 업데이트를 허용합니다.
  • 언어 전환 시 첫 화면 애니메이션 문구를 재생성해 화면 텍스트·접근성 이름·Replay·destroy 복원이 선택한 언어를 유지하도록 수정했습니다.
  • v0.9.7의 npm/GitHub 동일 tarball·provenance metadata, 교차 브라우저 workflow 성공과 두 도메인의 자체 JS/CSS 12개·클릭 미디어 4개 일치를 기록했습니다.

Kineto v0.9.7

Choose a tag to compare

@github-actions github-actions released this 06 Sep 08:37

Kineto v0.9.7

English

  • Account for the measured one-shot media and text/lifecycle fix cost in full-runtime and package budgets (about 3.3 KB additional Vite full-consumer gzip), while retaining core-plus-module budgets, zero runtime dependencies, and the 52-module/77-file release surface.
  • Check both GitHub workflows against the package test manifest, including exhaustive demo-control, click-media, and live-site-script checks; isolate nine external demo resources in offline QA and preserve historical npm versions, workflow IDs, and checksums during version preparation.
  • Normalize GIF, APNG, and animated WebP click images to one play, restart each click independently, and share pointer/touch cleanup; expose format examples and image/sprite controls with explicit CORS and lifetime behavior.
  • Consolidate Quad Dot Pulse into the Quad Dot Chase preset, remove duplicate public choices, and retain the old preset name and shared-link compatibility.
  • Keep the demo's one-gesture hero transition with a multi-frame ease-out landing, and consume the remaining wheel/touch gesture until it settles so native momentum and smooth scrolling cannot add a second jump.
  • Preserve authored <br> and programmatic \n line breaks across Text Split, Text Reveal, and Blur Text, including reduced motion and author-state restoration; cancel native flicker animations and stale completions on replay/destroy, and constrain Counter slot and clock reels to the consumer's computed line-height.
  • Verify cssScroll native scroll/view progress and ScrollTrigger fallback with real Chromium, Firefox, and WebKit scrolling; preserve authored animation and custom-property state on destroy, provide a reversible reduced-motion final state, and expose all three existing variants in the localized demo.
  • Replace the representative first-range demo check with a deterministic audit of every distinct rendered drawer control across 51 modules and seven input types, verifying option reflection, debounced rebuilds, and zero duplicate instances; also reject duplicate runtime field keys.
  • Expand the variant-distinctness gate from Page Reveal to all 78 public variants across Reveal, Lazy, Cursor, Overflow Text, Glitch, and Slider, enforcing unique source fingerprints plus direct-demo and generated-settings parity.
  • Record the v0.9.5 publish-stage path failure and the successful v0.9.6 end-to-end release evidence: cross-browser CI, npm SLSA provenance, byte-identical npm/GitHub tarballs, canonical Pages, and synchronized backup hosting.

한국어

  • 1회 재생 미디어와 텍스트·lifecycle 수정의 실측 비용(Vite 전체 소비자 gzip 약 3.3KB 증가)을 full runtime·패키지 예산에 반영하고, core+모듈 조합 예산·runtime 의존성 0개·52개 모듈/77개 배포 파일 범위는 유지합니다.
  • 데모 설정 전수·클릭 미디어·live-site-script 검사를 포함한 두 GitHub workflow의 등록 상태를 package test manifest와 대조합니다. 외부 데모 리소스 9개를 offline QA fixture로 격리하고, 새 버전 준비 중 과거 npm 버전·workflow ID·checksum 검증 기록을 유지합니다.
  • GIF·APNG·animated WebP 클릭 이미지를 1회 재생으로 정규화하고 클릭마다 독립 재시작하며 포인터·터치 cleanup을 통합했습니다. 포맷별 예제와 이미지·스프라이트 설정에 CORS 및 표시 수명 동작을 명시합니다.
  • Quad Dot Pulse를 Quad Dot Chase 프리셋에 통합해 중복 공개 선택지를 제거하고, 기존 프리셋 이름과 공유 링크 호환성을 유지했습니다.
  • 데모 첫 화면의 한 제스처 전환과 여러 프레임의 감속 착지를 유지하면서 남은 wheel·touch 입력을 정착까지 처리해 native 관성과 smooth scroll이 두 번째 점프를 만들지 않도록 수정했습니다.
  • Text Split·Text Reveal·Blur Text에서 작성한 <br>와 문자열의 \n을 모션 축소·원본 상태 복원까지 보존합니다. native flicker 애니메이션과 이전 실행의 완료 callback을 replay·destroy 시 정리하고, Counter Slot·Clock reel을 소비자 UI의 computed line-height 안으로 제한했습니다.
  • cssScroll의 native scroll/view 진행률과 ScrollTrigger fallback을 Chromium·Firefox·WebKit 실제 스크롤로 검증하고, destroy 시 작성자 animation·custom-property 상태를 복원하며, 되돌릴 수 있는 reduced-motion 완료 상태와 기존 variant 3개의 다국어 데모를 제공합니다.
  • 카드별 첫 range만 확인하던 데모 검사를 51개 모듈·7개 입력 타입의 렌더된 고유 drawer control 전수 검사로 교체해 옵션 반영·debounce 재빌드·중복 인스턴스 0건을 검증하고, 런타임 필드 키 중복도 차단합니다.
  • Page Reveal에 한정됐던 variant 구분 검사를 Reveal·Lazy·Cursor·Overflow Text·Glitch·Slider의 공개 variant 78개로 확대하고, 고유 source fingerprint와 전용 데모·생성형 설정의 정합성을 함께 검증합니다.
  • v0.9.5 게시 단계의 경로 해석 실패와 v0.9.6의 교차 브라우저 CI·npm SLSA provenance·npm/GitHub 동일 tarball·공식 Pages·백업 호스팅 동기화 성공 근거를 함께 기록했습니다.

Kineto v0.9.6

Choose a tag to compare

@github-actions github-actions released this 05 Sep 05:40

Kineto v0.9.6

English

  • Pass the checksum-verified release tarball to npm as an explicit local path, preventing npm 11 from interpreting release-artifact/...tgz as a GitHub package spec.

한국어

  • checksum 검증을 마친 릴리스 tarball을 명시적인 로컬 경로로 npm에 전달해 npm 11이 release-artifact/...tgz를 GitHub 패키지 명세로 오인하지 않도록 수정했습니다.

Kineto v0.9.3

Choose a tag to compare

@github-actions github-actions released this 31 Aug 13:48

Kineto v0.9.3

English

  • Bound the full Chromium browser QA lane to 240 seconds per attempt with three fresh retries in CI and release, and annotate test:browser when the gate still fails.

한국어

  • 전체 Chromium 브라우저 QA를 CI와 릴리스에서 시도당 240초·새 프로세스 3회로 제한하고, 재시도 후에도 실패하면 test:browser annotation을 남기도록 했습니다.

Kineto v0.8.105

Choose a tag to compare

@github-actions github-actions released this 24 Aug 17:08

Kineto v0.8.105

English

  • Fix Date Time ISO timestamps with fractional seconds so the Both · relative + absolute demo renders both values instead of retaining its placeholder text.
  • Preserve the module deep-link hash when opening a shared demo-settings URL, so restoring a card cannot override the requested #mod-… destination on mobile or Safari.
  • Add independent Slider track controls for release momentum, edge bounce, and sticky snap while preserving the existing fractional release target by default; document the native Scroll Snap and FLIP evidence gates in a dedicated RFC.
  • Record the successful hosted CI, Firefox/WebKit matrix, Pages deployment, and live-site verification for the Slider physics follow-up.
  • Add a pinned Rolldown consumer fixture alongside Vite, with separate gzip budgets and a generated report that distinguishes cross-bundler evidence from universal byte promises.
  • Bound Playwright Chromium binary installation to five minutes per attempt with three required retries and kept apt dependency provisioning out of the main lane, so a stalled browser or package mirror cannot leave CI running until its global timeout.
  • Annotate the exact consumer/framework subcommand when the hosted grouped check fails, preserving the hard gate while making remote-only failures actionable without private logs.
  • Emit failure annotations from locked nested installs and consumer/Rolldown budget checks so a hosted failure identifies its failing boundary even when job logs require authentication.
  • Account for the measured 0.3 KB Linux esbuild gzip delta at the full consumer fixture boundary while keeping the 130 KB product budget unchanged.
  • Keep Firefox/WebKit matrix lanes on bounded browser-binary installs without apt provisioning, while restoring the Chromium lane's required libraries behind a 10-minute timeout so full browser QA remains runnable without an unbounded package-mirror wait.
  • Connect cross-browser smoke servers through their originating Playwright engine instead of always using Chromium, restoring the WebKit smoke contract.
  • Provision WebKit's required runtime libraries in its bounded matrix lane while retaining the faster Firefox binary-only path.
  • Record the successful hosted v0.8.104 verification across Chromium, Firefox, WebKit, Pages, and both live-site hostnames.
  • Add an opt-in public diagnostics hub with stable KT_* codes, bounded history, sink/subscriber APIs, and validation while keeping default consumers silent.
  • Add an iOS Safari/Android Chrome physical-device QA runbook and evidence format without counting Playwright emulation as device success.
  • Audit all 16 Page Reveal variants against distinct source mechanisms and keep removed aliases out of the public contract.
  • Promote Cover Reveal gallery and Radial Carousel layer checks into the cross-engine heavy-layout regression checkpoint to catch clipping and ghost-image regressions.
  • Absorb the measured Node 24/npm 11 diagnostics package archive boundary without widening the release file allowlist.
  • Refresh the roadmap baseline to v0.8.104 and record the WebKit Tabs recovery, 52-module live-site check, and post-deploy verification evidence.
  • Add a Korean troubleshooting guide for modular imports, hidden layouts, mobile Mega Menu, Slider/Radial drag, Page Reveal distinctions, date parsing, Scroll Shadows, SSR, CDN/SRI/GTM, CI, and reduced motion.
  • Add a docs-navigation CI audit that keeps the package version, 52-module reference, module index, roadmap, and troubleshooting headings synchronized.
  • Document when to use the full entry versus core + module imports and link the troubleshooting path from both README indexes.
  • Absorb the measured 0.3 KB Node 24/npm 11 release-tarball boundary without widening the runtime file allowlist, and run the docs-navigation audit in the hosted CI group.
  • Add a single generated 52-module usage and quality matrix, neutral demo badges for accessibility/performance/reduced-motion status, and a CI completeness check that keeps the demo surface and docs aligned.
  • Bound Playwright Firefox/WebKit binary installation to five minutes per attempt with three required retries, so a stalled browser CDN cannot consume the full matrix job without producing a useful failure.
  • Promote transform, clip, fixed/sticky, mask, and 3D layer boundaries for pageReveal, pageTransition, slider, stickyStack, stickyHeader, lightbox, cursor, and fullpage into a cross-engine heavy-layout demo-polish checkpoint, verified in Chromium, Firefox, and WebKit.
  • Add a browser-layer QA matrix with module risk boundaries, used-value measurement rules, release triage categories, and criteria for promoting additional modules into the cross-engine checkpoint.
  • Add five roadmap decision documents covering QA history, FLIP shared-layout scope, 1.0 readiness, preset/runtime boundaries, and platform progressive enhancement.
  • Derive demo variant choices from the feature contract, remove stale Page Reveal/Loader effects, and add browser-support, consumer-bundle, module-status, and 1.0 diagnostics/deprecation audits.
  • Add contract-aware contribution and issue forms for reproducible bugs, gated feature proposals, and browser/device QA evidence, plus a case-study template and CI readiness check for the long-term 1.0 gate.
  • Record the successful b6dbc87 Node/Firefox/WebKit matrix and Pages deployment in the browser QA history.

한국어

  • 소수 초가 포함된 Date Time ISO 시각을 정상 파싱해 Both · relative + absolute 데모가 placeholder 대신 상대·절대 시각을 함께 표시하도록 수정했습니다.
  • 데모 설정 공유 URL의 #mod-… 모듈 딥링크를 보존해 카드 설정 복원이 모바일·Safari에서 요청한 이동 위치를 덮어쓰지 않도록 수정했습니다.
  • Slider track에 release momentum·edge bounce·sticky snap을 서로 독립적으로 설정할 수 있게 추가했습니다. 기본값은 기존 fractional release target을 보존하며, native Scroll Snap과 FLIP은 별도 RFC의 증거 gate로 문서화했습니다.
  • Slider physics 후속 변경의 hosted CI·Firefox/WebKit matrix·Pages 배포·live-site 검증 성공 결과를 기록했습니다.
  • Vite와 함께 고정된 Rolldown 소비자 fixture를 추가하고, bundler 간 근거와 모든 bundler의 절대 바이트 약속을 구분하는 gzip 예산·생성 보고서를 연결했습니다.
  • Playwright Chromium 바이너리 설치를 시도당 5분, 최대 3회로 제한하고 메인 lane에서는 apt 의존성 설치를 제외해 브라우저·패키지 mirror 정체가 CI를 전역 timeout까지 붙잡지 않도록 했습니다.
  • hosted grouped check가 실패하면 정확히 어떤 consumer/framework 하위 명령인지 annotation으로 남겨 private log 없이도 원격 전용 실패를 추적할 수 있게 했습니다. 테스트 gate 자체는 유지합니다.
  • locked nested install과 consumer/Rolldown 예산 검사가 실패할 때도 annotation을 남겨 job log 인증이 없어도 어느 경계에서 실패했는지 확인할 수 있게 했습니다.
  • full consumer fixture에서 측정된 Linux esbuild gzip 0.3KB 차이만 반영하고 130KB 제품 예산 자체는 유지했습니다.
  • Firefox/WebKit matrix lane은 apt 의존성 설치 없이 제한된 브라우저 바이너리를 사용하고, 전체 browser QA에 필요한 Chromium 라이브러리는 10분 timeout 안에서 복원해 package mirror 정체가 무기한 대기하지 않도록 했습니다.
  • 교차 브라우저 smoke server를 항상 Chromium client로 연결하지 않고 생성한 Playwright engine으로 연결해 WebKit smoke 계약을 복구했습니다.
  • WebKit matrix lane에는 필요한 runtime library를 제한 시간 안에 설치하고 Firefox는 빠른 바이너리-only 경로를 유지했습니다.
  • Chromium·Firefox·WebKit·Pages와 두 live-site hostname에서 v0.8.104 hosted 검증이 성공한 근거를 기록했습니다.
  • 기본 소비자는 조용하게 유지하면서 안정적인 KT_* 코드, 제한된 history, sink/subscriber API와 validation을 제공하는 opt-in 공개 diagnostics hub를 추가했습니다.
  • iOS Safari·Android Chrome 실기기 QA 실행표와 증거 형식을 추가했으며, Playwright emulation을 실기기 성공으로 집계하지 않습니다.
  • 16개 Page Reveal variant를 서로 다른 소스 메커니즘과 대조 감사하고, 제거된 alias가 공개 contract로 돌아오지 않도록 고정했습니다.
  • Cover Reveal gallery와 Radial Carousel 레이어 검사를 교차 엔진 heavy-layout 회귀 체크포인트로 승격해 clipping·고스트 이미지 회귀를 잡도록 했습니다.
  • release 파일 allowlist를 넓히지 않고 Node 24/npm 11 diagnostics 패키지 archive의 측정된 경계 차이만 흡수했습니다.
  • 로드맵 기준을 v0.8.104로 갱신하고 WebKit Tabs 복구, 52개 모듈 live-site 점검, 배포 후 검증 근거를 기록했습니다.
  • 모듈형 import, 숨겨진 레이아웃, 모바일 Mega Menu, Slider/Radial 드래그, Page Reveal 차이, 날짜 파싱, Scroll Shadows, SSR, CDN/SRI/GTM, CI, reduced motion을 증상별로 설명하는 한국어 troubleshooting 문서를 추가했습니다.
  • package 버전·52개 module reference·module index·로드맵·troubleshooting heading의 동기화를 유지하는 docs-navigation CI 감사를 추가했습니다.
  • 전체 엔트리와 core + 모듈 import를 언제 선택할지 문서화하고 두 README 색인에서 troubleshooting 경로를 연결했습니다.
  • Node 24/npm 11에서 측정된 release tarball 0.3KB 경계만 흡수하고 runtime 파일 allowlist는 넓히지 않았으며, hosted CI 그룹에도 docs-navigation 감사를 포함했습니다.
  • 52개 모듈의 사용 시점·피해야 할 상황·접근성·성능·reduced motion 상태를 단일 생성 매트릭스와 데모 뱃지로 연결하고, 데모·문서 누락을 잡는 CI completeness 검사를 추가했습니다.
  • Playwright Firefox/WebKit 바이너리 설치를 시도당 5분, 최대 3회로 제한해 브라우저 CDN이 멈춰도 matrix job 전체 시간을 소모하지 않고 원인을 남기도록 했습니다.
  • pageReveal·pageTransition·slider·stickyStack·stickyHeader·lightbox·cursor·fullpage의 transform·clip·fixed/sticky·mask·3D 레이어 경계를 demo-polish의 교차 엔진 heavy-layout 체크포인트로 승격하고 Chromium·Firefox·WebKit에서 검증했습니다.
  • 모듈별 레이어 위험, used value 측정 규칙, 릴리스 triage 분류, 추가 모듈 편입 조건을 정리한 브라우저 레이어 QA 매트릭스를 추가하고 docs-navigation CI에 연결했습니다.
  • 브라우저 QA 이력, FLIP shared-layout 범위, 1.0 계약 준비도, preset/runtime 경계, 플랫폼 progressive enhancement를 다루는 로드맵 문서 5개를 추가했습니다.
  • 기능 계약에서 데모 variant 선택지를 생성해 오래된 Page Reveal·Loader 효과를 제거하고, 브라우저 지원표·소비자 번들·모듈 상태·1.0 진단/deprecation 감사를 추가했습니다.
  • 계약 수치를 자동 감시하는 기여 가이드와 재현 가능한 버그·게이트가 포함된 기능 제안·브라우저/실기기 QA issue form, 실제 사용 사례 템플릿과 장기 1.0 readiness CI 검사를 추가했습니다.
  • b6dbc87의 Node·Firefox·WebKit matrix와 Pages 배포 성공 결과를 브라우저 QA 이력에 기록했습니다.