Skip to content

feat: Lynx#1310

Draft
junghyeonsu wants to merge 66 commits intodevfrom
lynx
Draft

feat: Lynx#1310
junghyeonsu wants to merge 66 commits intodevfrom
lynx

Conversation

@junghyeonsu
Copy link
Copy Markdown
Contributor

No description provided.

@junghyeonsu junghyeonsu self-assigned this Mar 6, 2026
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Mar 6, 2026

🦋 Changeset detected

Latest commit: c69e38f

The changes in this PR will be included in the next version bump.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 6, 2026

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 19ad04ef-bfe2-4b32-b2eb-2a49342461cf

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch lynx

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

junghyeonsu and others added 23 commits March 6, 2026 17:02
* feat(lynx-spa): add web preview support for docs iframe embedding

lynx-spa에 web 환경 빌드를 추가하고, <lynx-view> 웹 컴포넌트를 통한
브라우저 렌더링 호스트를 구성. docs에서 iframe으로 Lynx 앱 미리보기를
제공하기 위한 PoC.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(lynx-spa): add Cloudflare Pages deployment CI and docs overview page

Add production and alpha deployment workflows for lynx-spa web preview,
update iframe preview URL logic for dev/branch/prod environments,
and create Lynx overview page with embedded live preview.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: remove unnecessary import from lynx overview mdx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* add postcss

* add clamp override

* add token

* create action button recipe

* add ActionButton Component and playground

* @lynx-js/react로 import문 변경

* add disabled classes

* feat: systemize Lynx CSS generation via qvism pipeline

Replace hand-written Lynx CSS/recipes in lynx-spa with automated
generation through the qvism pipeline using a new PostCSS plugin.

- Add postcss-lynx-compat plugin (ecosystem/postcss-lynx-compat)
  - Declarative config: remove/transform/suggestions/supported lists
  - 4-phase CSS transformation (AtRule, Rule, Declaration, Value)
  - clamp() parser with nested parenthesis support
  - 24 tests passing
- Extend qvism Config with targets[] for multi-platform output
- Generate *.lynx.css + *.lynx.mjs for all recipes automatically
- Migrate lynx-spa to consume from @seed-design/css system
- Delete hand-written lynx-recipes/, lynx-overrides.css, lynx-components/

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: update bun.lock

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add text slot splitting for Lynx and create @seed-design/lynx package

PostCSS text slot splitting (Phase 5) separates CSS properties into
view-only and text-only classes (__text suffix) to fix Lynx background-color
rendering on <text> elements. qvism generates { root, text } slot output
for Lynx targets via deriveSlots config.

- postcss-lynx-compat: add textSlot config and Phase 5 splitting
- qvism-core: add generateRecipeJsWithSlots/generateRecipeDtsWithSlots
- qvism-cli: pass targetSlots for Lynx target MJS/DTS generation
- qvism-preset: add deriveSlots: ["root", "text"] to lynx target
- packages/lynx: new @seed-design/lynx package with ActionButton
- lynx-spa: migrate to @seed-design/lynx, delete local component
- Remove obsolete postcss-lynx@0.1.4 patch
- Fix outline-offset not supported in Lynx CSS parser

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: use workspace protocol for @seed-design/lynx (not published yet)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ci: build packages before lynx-spa deploy

@seed-design/lynx needs to be built (lib/) before lynx-spa can consume it.
Add build-packages: true to setup action and expand path triggers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ci: build only @seed-design/lynx instead of all packages

build-packages runs all packages including stackflow which has an
esbuild version mismatch. Build only the lynx package we need.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: propagate data attrs to text element and add Phase 5 tests

- Add data-disabled/data-loading to <text> element for CSS selector matching
- Add isInteractive guard to prevent tap events when disabled/loading
- Add 10 tests for Phase 5 text slot splitting in postcss-lynx-compat

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: rename @seed-design/lynx to @seed-design/lynx-react and fix build

- Rename package from @seed-design/lynx to @seed-design/lynx-react
- Move directory packages/lynx → packages/lynx-react
- Switch build from Vite to tsc with jsx: "preserve" to match
  lynx-ui patterns (output .jsx files instead of compiling JSX to
  react/jsx-runtime, which Lynx runtime cannot handle)
- Remove react from peerDependencies (Lynx uses @lynx-js/react)
- Remove unused devDependencies (vite, vite-plugin-dts, globby)
- Update all references in lynx-spa, CI workflows

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* bun i

* fix: guard against undefined flexGrow style in ActionButton

Lynx's web-core main thread calls .toString() on all style values,
which throws when flexGrow is undefined. Only pass the style object
when flexGrow is explicitly provided.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: use web recipe instead of lynx recipe for ActionButton

The .lynx recipe (action-button.lynx.mjs) uses Object.fromEntries +
Array.map with shared.mjs utilities that fail during Lynx web-core
main thread initialization (TypeError: Cannot read properties of
undefined reading 'toString'). The web recipe (action-button.mjs)
returns a simple string and works correctly in Lynx runtime.

Also removes clsx dependency as it's no longer needed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: use lynx CSS directly and inline className logic for ActionButton

The .lynx.mjs recipe imports shared.mjs utilities (Object.fromEntries,
Array.map) that fail in Lynx web-core main thread initialization.
The CSS side-effect import causes the entire module to be pulled into
the main thread chunk where these APIs aren't available.

Fix by:
- Importing action-button.lynx.css directly (Lynx-compatible
  [data-*] selectors instead of :pseudo selectors)
- Inlining className generation with template literals (no
  shared.mjs dependency)
- Keeping slot-based architecture (root + text)
- Using type-only import from .lynx recipe for ActionButtonVariantProps

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: use lynx recipe directly + clsx + touch active state for ActionButton

- Replace inline className workaround with direct actionButton recipe import
- Add clsx for cleaner className composition
- Add touch-based active state (bindtouchstart/end/cancel) for press feedback
- CSS already has [data-active] selectors for all variants but was unused

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: import all.lynx.css for design token variables in lynx-spa

base.lynx.css only contains utilities and animations but not color/size/font
token variables. action-button.lynx.css references var(--seed-color-*) tokens
that are defined in all.lynx.css, causing styles to not apply.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: expand inset shorthand and remove vendor prefixes for Lynx CSS compat

postcss-lynx-compat:
- Add expandShorthands config to expand inset → top/right/bottom/left
- Remove vendor prefix properties (-webkit-*, -moz-*, etc.)
- Move Declaration processing to OnceExit for proper postcss-nested compat

qvism-core:
- Apply user postcss plugins AFTER lightningcss transform to prevent
  shorthand re-generation (lightningcss was collapsing top/right/bottom/left
  back into inset)
- Split transpileRulesToCss into 2-pass: postcss-nested first, then plugins

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: remove object-fit, object-position, outline from Lynx CSS

These properties are not supported by Lynx CSS parser.
Moved from supportedProperties to remove list in postcss-lynx-compat.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: expand :is() selectors and add comprehensive Lynx CSS compat

- Expand :is() pseudo-class selectors (Lynx CSS parser doesn't support them)
  - :is(a, b) → a, b (individual selectors)
  - :not(:is(a, b)) → :not(a):not(b)
- Add 60+ unsupported CSS properties to remove list based on reference doc
  - text-decoration-*, font-variant-*, place-*, scroll-*, etc.
  - SVG, multi-column, table, page-break properties
  - backdrop-filter, mix-blend-mode, container queries, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: filter unsupported pseudo-classes from Lynx CSS selectors

Lynx CSS parser rejects :checked, :indeterminate, :invalid, :autofill.
After :is() expansion, these appear in comma-separated selector groups
and cause the ENTIRE rule to be discarded (including data-* alternatives).

New filterPseudoClasses config removes only the individual selectors
containing unsupported pseudo-classes while keeping data-* alternatives:
  .seed-X:checked, .seed-X[data-checked] → .seed-X[data-checked]

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: transform :root and html selectors to page for Lynx CSS compat

Lynx has no <html> element, so :root and html selectors never match.
This means all CSS custom properties (design tokens) defined under
:root were never applied, causing no background colors, missing sizes,
and broken styling on ActionButton and all other components.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add working ActionButton comparison in lynx-spa

Side-by-side comparison of working (web recipe) vs lynx-react
(slot recipe) ActionButton to debug styling differences.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: remove WorkingActionButton comparison code

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: remove Lynx for Web infrastructure and add postcss-lynx workaround

- Delete web-host/, vite-web.config.ts, Cloudflare Pages deploy workflows
- Remove LynxIframePreview from docs (keep Lynx content/routes)
- Remove web-related scripts and devDeps from lynx-spa package.json
- Add postcss-lynx with patch as temporary workaround for Lynx styling

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add working ActionButton comparison in lynx-spa

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: sync postcss-lynx patch with full postcss-lynx-compat remove list

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* patch

* chore: remove postcss-lynx workaround

postcss-lynx was interfering with the CSS custom property cascade
and data-attribute selectors used by ActionButton. Remove the
workaround so that postcss-lynx-compat generated .lynx.css files
are used as-is by the Lynx engine.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* remove patched

* remove workaround

* fix: filter unsupported properties from transition values in postcss-lynx-compat

Lynx CSS parser fails on unsupported property names (e.g. outline-color)
inside transition values, causing all subsequent CSS rules to be skipped.
Added filterTransitionValue/filterTransitionPropertyValue helpers that
strip unsupported entries from transition and transition-property values.
Regenerated all .lynx.css files — 0 occurrences of outline-color remain.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: display Lynx engine version info on screen for debugging

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: add CSS variable isolation tests for Lynx debugging

Tests: direct value, single var(), nested var(), page tokens,
page nested tokens, CSS custom property cascade (initial → override)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: resolve nested CSS variables at build time in postcss-lynx-compat

Lynx 3.6 engine does not resolve nested var() references
(e.g. --a: var(--b) where --b: #fff). Added resolveNestedVars phase
that flattens all nested var() in page selectors to final values.
This enables background colors, padding, and other token-based
styles to render correctly on Lynx devices.

Also restored App.tsx to ActionButton test and removed debug files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: resolve token var() references in individual recipe CSS files

postcss-lynx-compat now accepts tokenCss option to resolve var()
references in recipe files that don't contain page selectors.
This fixes padding values like var(--seed-dimension-x4) being
unresolved in action-button.lynx.css.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test: add active state isolation tests for Lynx debugging

Test 1: Always data-active (CSS selector support test)
Test 2: Tap to toggle active (bindtap event test)
Test 3: ActionButton with bindtouchstart/end

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: 정현수 <hyeonsu.github@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
CI에서 esbuild JS API(0.27.2)와 native binary(0.27.0) 버전 불일치로
stackflow vite 빌드가 실패하는 문제 해결.

root package.json에 overrides를 추가하여 모든 esbuild ^0.27.0을
0.27.2로 통일.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nx-compatible classes (#1319)

* feat(postcss-lynx-compat): [data-*] 속성 셀렉터를 Lynx 호환 형태로 변환

Lynx CSS 엔진이 속성 셀렉터([data-*])를 지원하지 않아 상태별 스타일이
동작하지 않는 문제를 해결한다.

변환 전략:
- [data-active] → :active (Lynx 지원 pseudo-class)
- [data-disabled] → --disabled_true 클래스 (variant 패턴 활용)
- [data-loading] → --loading_true 클래스 (variant 패턴 활용)
- [data-hover] → 룰 제거 (모바일 터치 환경)

postcss-lynx-compat에 Phase 1 추가하여 [data-X] 속성 셀렉터를
--X_true BEM 클래스로 일괄 변환. ActionButton에서 data-* 속성 대신
recipe 함수에 상태를 직접 전달하도록 변경.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(qvism): add extraVariants support for Lynx disabled/loading styles

postcss-lynx-compat transforms [data-disabled] to class-based selectors
(e.g. --disabled_true), but the generated .lynx.mjs variantMap and
.lynx.d.ts types didn't include these variants. This caused TypeScript
errors and splitVariantProps to misclassify disabled/loading as otherProps.

Add extraVariants option to TargetConfig so CSS-derived state variants
can be declared in the target config and propagated to generated JS/DTS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(qvism): generate boolean type for extraVariants instead of true literal

extraVariants의 boolean 값을 generateVariantInterface와 동일한 패턴으로
처리하여 `disabled?: true` 대신 `disabled?: boolean`을 생성합니다.
이를 통해 lynx-react 컴포넌트에서 `disabled?: boolean`과의 타입 충돌을 해소합니다.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(postcss-lynx-compat): Lynx 테마 지원 — var() 유지 + selector 매핑

postcss-lynx-compat에 resolveVarScope와 selectorMappings 옵션을 추가하여
Lynx에서 light/dark 테마 전환을 지원한다.

- resolveVarScope: "page-only" — 토큰 정의만 flatten, 컴포넌트 var() 유지
- selectorMappings — [data-*] attribute selector를 class selector로 변환
- qvism-preset에 SEED 테마 매핑 설정 추가
- Ghost variant 텍스트 색상 문제 해결 (하드코딩 → var() 참조 유지)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(postcss-lynx-compat): selectorMappings 변환 후 빈 셀렉터 필터링

replace가 빈 문자열인 selectorMappings 항목이 [data-*] 단독 셀렉터를
빈 문자열로 변환하여 `page,  {` 같은 invalid CSS를 생성하는 버그 수정.

변환 후 빈 셀렉터를 필터링하고, 모든 셀렉터가 빈 경우 룰 자체를 제거.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(postcss-lynx-compat): page-only 모드에서 컴포넌트 커스텀 프로퍼티의 nested var() 해소

page-only 모드가 page 셀렉터 내에서만 var()를 해소하여, 컴포넌트 CSS의
`--seed-box-padding-left: var(--seed-dimension-x3_5)` 같은 커스텀 프로퍼티
정의가 미해소되어 Lynx에서 padding이 사라지는 버그 수정.

수정 후 동작:
- 커스텀 프로퍼티 정의 (--*: var()) → 모든 셀렉터에서 resolve
- 일반 프로퍼티의 var() 참조 (color: var()) → 보존 (테마 전환 가능)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(postcss-lynx-compat): var() 해소 시스템 통합 + Ghost 버그 수정

- 중복된 var() 정규식을 VAR_REGEX 상수로 통합 (4곳 → 1곳)
- replaceVarRefs, isBaseSelector, isPageSelector 유틸 함수 추출
- resolveMapIteratively / resolveEntriesIteratively로 해소 로직 통합
- buildTokenMap에서 dark 셀렉터 제외 (isBaseSelector) → Ghost 색상 버그 수정
- resolveNestedVars의 page-only/all 중복 분기 제거
- Phase 주석을 Step 1~5로 실행 순서에 맞게 정리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* debug: display lynx.__globalProps and SystemInfo on screen

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(rsbuild-plugin): add Lynx theming plugin and catalog app

Add a Lynx-specific rsbuild plugin entry (`@seed-design/rsbuild-plugin/lynx`)
that injects `__SEED_COLOR_MODE__` as a build-time define constant, and exports
`getThemeClassName()` to determine the correct theme class (`seed-theme-light`
or `seed-theme-dark`) based on the plugin's colorMode option and the device's
system theme from `lynx.__globalProps.theme`.

Restructure lynx-spa example into a catalog app with navigation (Home → Theming
/ ActionButton) and wrap root with `<page className={themeClass}>` for proper
theme application.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(lynx-spa): split pages, add safe area and dark mode bg

- Extract HomePage, ThemingPage, ActionButtonPage into src/pages/
- Apply safe area insets (top/bottom) to prevent notch overlap
- Add bg.layer-default token to page background for dark mode support

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(postcss-lynx-compat): add resolveVarScope "none" for Lynx 3.6+ nested var support

Lynx 3.6 introduced native nested CSS variable support. Add "none" option
to resolveVarScope to skip build-time flattening, and add a test page in
lynx-spa to verify nested vars and inline style CSS variable behavior.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(postcss-lynx-compat): unwrap @supports safe-area rules for Lynx

Lynx does not support the @supports CSS at-rule, causing safe-area
CSS variables to remain at 0px. This adds unwrapSupports config that:
- Removes @supports constant(safe-area-inset-*) blocks (legacy)
- Unwraps @supports env(safe-area-inset-*) blocks (keeps content)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(postcss-lynx-compat): add replaceVarWithEnv, remove :root→page transform, drop page-only scope

- Add replaceVarWithEnv to directly replace var(--seed-safe-area-*) with env(safe-area-inset-*, 0px) in Lynx CSS output, working around env() not evaluating inside custom property definitions
- Remove :root → page and html → page selector transforms since Lynx natively supports :root
- Add :root to isPageSelector for token collection
- Change resolveVarScope default from "page-only" to "all"
- Remove "page-only" option entirely (functionally identical to "all")
- Remove --seed-safe-area-* custom property definitions from :root/page selectors
- Clean up empty rules after safe-area property removal

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(postcss-lynx-compat): remove env() fallback for Lynx compatibility

Lynx supports env(safe-area-inset-top) but NOT env(safe-area-inset-top, 0px).
Remove fallback parameter from all env() calls in generated CSS output and
fix catalog app inline styles to use env() directly instead of var().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(postcss-lynx-compat): strip env() fallbacks for Lynx compatibility

Lynx supports env(safe-area-inset-top) but NOT env(safe-area-inset-top, 0px).
Instead of removing fallbacks from qvism-preset source (which would affect
web CSS too), strip env() fallbacks at the postcss-lynx-compat level so
only Lynx CSS output is affected. Web CSS retains fallback values.

- Add stripEnvFallbacks() function and Step 1.6 in plugin pipeline
- Revert snackbar.ts to keep original env() fallback values
- Add tests for env() fallback stripping

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(postcss-lynx-compat): strip env() fallback, skip theme text slots, remove empty rules

- env(name, fallback) → env(name) 변환 추가 (Lynx는 env fallback 미지원)
- .seed-theme-* 셀렉터를 text slot 분리에서 제외하여 잘못된 __text suffix 방지
- 모든 변환 후 빈 CSS 룰 자동 정리
- resolveVarScope "all" → Lynx용 기본 설정에서 사용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
)

Lynx 3.6+ natively supports CSS Variables (including nested var())
with enableCSSInlineVariables: true. Remove build-time var() flattening
that is no longer needed:

- Delete resolveNestedVars, buildTokenMap, resolveMapIteratively,
  resolveEntriesIteratively, replaceVarRefs, isBaseSelector functions
- Remove tokenCss and resolveVarScope config options and types
- Remove related test suites, add tests verifying var() preservation
- Regenerate CSS outputs

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
The esbuild override caused host/binary version conflicts in CI.
Regenerated bun.lock from dev branch base to restore proper
per-package esbuild isolation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Lynx does not support CSS attribute selectors ([data-*]), so
`.seed-color-mode-light-only` and `.seed-color-mode-dark-only` class
selectors are added alongside the existing attribute selectors to
enable scoped theme overriding in Lynx environments.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…#1341)

* feat(lynx-spa): add foundation catalog pages for color and typography

Add Color and Typography catalog pages under a new Foundation section
to visually verify @seed-design/css/vars tokens in Lynx environment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(lynx-spa): enable y-axis scrolling with scroll-view on catalog pages

Replace root <view> with <scroll-view scroll-y> so content that
overflows vertically becomes scrollable. Lynx does not support
overflow: scroll — the dedicated scroll-view element is required.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(lynx-spa): wrap all page components with scroll-view

Each page component now uses <scroll-view scroll-y> as its root
element to ensure vertical scrolling works independently per page.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(lynx-spa): resolve fontWeight type error in FoundationTypographyPage

Add CSSFontWeight type and cast weightVar to fix TS2322 error where
string type was not assignable to fontWeight style property.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 16, 2026

Alpha Preview (Stackflow SPA)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 16, 2026

Alpha Preview (Storybook)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 16, 2026

Alpha Preview (Docs)

junghyeonsu and others added 16 commits April 3, 2026 18:28
…ck, Text) (#1346)

* feat(lynx): add primitive layer and layout components (Box, Flex, Stack)

Add @seed-design/lynx-primitive package with Slot/asChild support and
layout components (Box, VStack, HStack) to @seed-design/lynx-react,
enabling token-based styling via CSS variables in Lynx.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(lynx-react): omit flexDirection from VStack/HStack props for consistency

Align with web Stack component pattern by using Omit<FlexProps, "flexDirection">
to prevent unintended direction overrides at the type level.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Squashed commit of the following:

commit 52c318d38600f03b9fe732e0e88373f5f9d00553
Author: 정현수 <hyeonsu.github@gmail.com>
Date:   Fri Mar 27 11:33:07 2026 +0900

    Update bun.lock

commit 952fc672cd7fe5f861def3fa996215dc54f43e75
Merge: 87ae7e3df 57464fda6
Author: 정현수 <hyeonsu.github@gmail.com>
Date:   Fri Mar 27 11:32:41 2026 +0900

    Merge branch 'dev' into lynx

commit 57464fda6371c1545c466ca8d01f338de0da3e4b
Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Date:   Thu Mar 26 19:53:06 2026 +0900

    release: version packages (#1389)

    * Version Packages

    * Update public rootage version

    ---------

    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

commit e78d460e840276f4afe3b5a10791d00d4ecceec9
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Thu Mar 26 18:46:18 2026 +0900

    docs: add missing changeset

commit 66b5d9e7d9e345319e228b2f75dbb9a5b5383ebd
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Thu Mar 26 18:00:34 2026 +0900

    feat: add avatar & avatar stack variant size=56 (#1390)

    * feat: add avatar & avatar stack variant size=56

    # Conflicts:
    #	packages/css/all.layered.min.css
    #	packages/css/all.min.css

    * docs: fix typo

    * docs

    * fix(ci): add esbuild override to fix version mismatch in packages:build

    bun installs esbuild@0.27.0 content into the esbuild@0.27.4 directory
    when multiple versions coexist in the lockfile (sanity pins 0.27.0,
    fumadocs-mdx requires ^0.27.3). This causes "Host version 0.27.0 does
    not match binary version 0.27.4" errors during packages:build.

    Force all esbuild consumers to 0.27.4 via overrides.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 846036b86fd4934aa52224e003db39a53dead97b
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Thu Mar 26 14:56:23 2026 +0900

    feat(stackflow): add AppBar.Slot component for custom element transitions (#1386)

    * feat(stackflow): add AppBar.Slot component for custom element transitions

    Add a `slot` slot to the appBar recipe and an `AppBarSlot` React component
    that applies stackflow transition animations to custom elements placed in
    the AppBar. Uses Radix Slot to merge className and stateProps onto the
    child without adding an extra DOM node.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs(stackflow): add AppBar.Slot usage guide to app-screen docs

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * feat: export AppBarSlot in registry snippet

    * refactor: rename css slot name

    * docs

    * docs: changeset

    * fix(example): set theme="cupertino" for AppBarSlot demo

    The slot transition only applies with slideFromRightIOS, which requires
    the cupertino theme to demonstrate swipe-back animation.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * chore(example): remove AppBarSlot from ActivityHome navigation

    Accessible via direct URL /app-bar-slot only, like other unlisted
    activities.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 72dfd8fab30d628057e8a60e0f4096ab4185f034
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Thu Mar 26 12:52:02 2026 +0900

    feat(figma): handle slot nodes; update bottom sheet & select box handlers (#1388)

    * chore: bump types

    * feat(figma): patch @figma/rest-api-spec and @figma/plugin-typings to add SLOT support

    Add SlotNode type and SLOT ComponentPropertyType to both packages via bun patch,
    since Figma's REST API already returns SLOT data but the official type packages
    haven't been updated yet.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * feat(figma): add SLOT node support to normalizer and codegen

    - Add NormalizedSlotNode type (extends NormalizedFrameTrait)
    - Handle "SLOT" case in both REST and Plugin normalizers
    - Add slotTransformer interface to CodeGeneratorDeps
    - Wire slotTransformer via frameTransformer delegation in both pipelines

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * feat(figma): add findSlotNode util and componentPropertyReferences to NormalizedSlotNode

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * chore: remove unused import in image frame handler

    * chore(figma): sync entities from Figma

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix: fix slot searching

    * fix(figma): filter out hidden paints in normalizer

    Move visible paint filtering from individual consumers (getFirstSolidFill,
    getFirstStroke, hasImageFill) into normalizePaints for both REST and Plugin
    normalizers. This fixes hidden IMAGE fills generating placeholder <img> elements.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * feat(figma): update BottomSheet handler to use findSlotNode

    Replace INSTANCE_SWAP-based content lookup (Contents#25320:0) with
    SLOT-based lookup (Contents Slot#6752:0) using findSlotNode.
    Traverse the SlotNode itself to preserve its layout properties.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * feat(figma): update SelectBox handlers to use findSlotNode for custom content

    Replace placeholder "Footer Placeholder" with actual slot content traversal
    for both horizontal (Content Slot#6752:6) and vertical (Content Slot#6765:0)
    SelectBox handlers. Only traverse when Show Custom Content is true.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * feat(figma): show slot content as children in figma pseudo-JSX output

    When an Instance has SLOT properties, find the corresponding SlotNodes
    and traverse them as children of the <Instance> element, making slot
    content visible in get_node_info results.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs: changeset

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit f0bd6a55e82113d2d10ec6bf6076ca735b17852b
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Wed Mar 25 21:33:08 2026 +0900

    fix(menu-sheet): change close button label from 취소 to 닫기 (#1384)

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 1ad597d33efed9c3ca41cb69fa5a9511aa2413fd
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Wed Mar 25 14:35:55 2026 +0900

    feat(docs): sync block preview theme with parent document (#1387)

    * feat(docs): sync block preview theme with parent document

    Add postMessage-based theme synchronization so block previews
    rendered in iframes reflect the current light/dark mode setting.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): use getComputedStyle for block theme sync

    Replace style.getPropertyValue with getComputedStyle to read computed
    color-scheme instead of only inline styles from parent document.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit fc40b90e78813e6e0f4122c49fdf7fed3a2c5a9f
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Wed Mar 25 11:33:41 2026 +0900

    docs: add AGENTS.md guidelines and update create-component skill (#1331)

    * docs: update AGENTS.md and create-component skill to prevent style and recipe mistakes

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * docs(create-component): add snippet layer decision guide to skill

    * docs: remove code blocks, keep prose-only descriptions in AGENTS.md and skills

    * docs: add splitVariantProps convention to AGENTS.md and create-component skill (#1363)

    Encode review feedback from karby/image-frame-fallback-slot into system:
    - Add variant props handling rules to packages/react/AGENTS.md
    - Document three patterns (direct splitVariantProps, createRecipeContext, createSlotRecipeContext)
    - Add AGENTS.md reference step to create-component skill
    - Add anti-pattern warnings for manual variant destructuring

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs(create-component): move package-specific conventions to nested AGENTS.md

    Move defineRecipe/defineSlotRecipe details, variant props patterns, and
    React component conventions from the skill into their respective package
    AGENTS.md files. The skill now references these files instead of
    duplicating the content, reducing context window usage while maintaining
    a single source of truth.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs(create-component): sync skills/ references with .agents/ changes

    Apply the same context separation to skills/create-component/references/
    that was done in .agents/skills/create-component/details/. Package-specific
    conventions now reference their respective AGENTS.md files.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

commit 6f09a547daa2686e51a5c695cc6f28e137f23c01
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Wed Mar 25 11:32:43 2026 +0900

    fix(docs): generate ai-integration llms.txt content instead of redirect (#1330)

    * fix(docs): generate ai-integration llms.txt content instead of redirect

    Response.redirect() produces an empty file in Next.js static export
    mode (output: "export"), causing /ai-integration/llms.txt to return
    blank content. Replace with direct content generation matching the
    pattern used by other sections (docs, react, breeze, lynx).

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): improve llms.txt formatting across all sections

    - Remove leading whitespace from bullet list items
    - Exclude progress-board category from docs/llms.txt
    - Disambiguate duplicate titles with parent slug context
      (e.g. "Overview (Iconography)" vs "Overview (Typography)")
    - Sort categories in logical order (getting-started first, etc.)

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * Update route.ts

    * remove changelog

    * fix(docs): add category fallback and extract shared llms.txt utils

    - Extract getDisplayTitle and sortCategories into shared _llms/utils.ts
    - Add fallback for unknown categories (appended alphabetically after known order)
    - Replace allowlist filter with excludedCategories denylist in docs route
    - Add disambiguator fallback for duplicate titles with same parent slug
    - Stabilize ai-integration category order with categoryOrder + remaining

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

commit 5f6dbf7bcddf43e482062c22c3cb46ff0dfab18d
Author: 유세은 <101736358+SeieunYoo@users.noreply.github.com>
Date:   Tue Mar 24 19:58:35 2026 +0900

    refactor(rootage): rootage validate (slot property - definitions) (#1269)

    * refactor(components): remove unused properties from various component schemas

    - Removed unused properties such as `color`, `gap`, `marginLeft`, and `minWidth` from the schemas of Checkbox, Extended Action Sheet Close Button, List Item, Menu Sheet Close Button, Page Banner, Snackbar, Text Button, and Toggle Button components.
    - Updated validation logic to ensure properties defined in schemas are utilized in component definitions.

    * feat(rootage): add validate command with auto-fix for unused schema properties

    Add `rootage:validate` CLI command that reads actual YAML files, validates
    them, and auto-removes unused schema properties from ComponentSpec files.
    Chain it into `rootage:test` so validation runs before unit tests.
    Expand CI trigger paths to include all rootage ecosystem and artifact files.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(rootage): build core before validate to fix CI module resolution

    Use `rootage:build` (which builds both core and cli) instead of only
    building cli, so rootage-core is available when validate runs in CI.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(rootage): address CodeRabbit review feedback for validate command

    - Track fixes per-file with modelFixed flag to avoid unnecessary writes
    - Consolidate duplicated buildContext + validate logic into single block
    - Remove unnecessary Record<string, unknown> type cast on Object.keys

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

commit 59a65247327c44dfc317e919481bc54f00d01916
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Tue Mar 24 14:46:55 2026 +0900

    chore(docs): apply chromatic viewport modes to layout stories

    Add chromatic: { modes: VIEWPORT_MODES } to Box, Flex, Grid, Stack
    stories to establish visual snapshot baselines across breakpoints.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 58e840a7c32c3f8def0452ff0da04a4c0263d55b
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Tue Mar 24 14:30:51 2026 +0900

    chore(docs): add chromatic viewport modes baseline

    Add VIEWPORT_MODES and viewport options to storybook for chromatic
    visual snapshot baselines across breakpoints. Hardcoded values will be
    replaced with @seed-design/css/breakpoints when responsive styling lands.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit bd2bbeedfd1ffae2def394dbedd56b590bf8610d
Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Date:   Mon Mar 23 17:18:24 2026 +0900

    release: version packages (#1369)

    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

commit 6e10b4cafa0f6d3c28960e73088dbbaf58a0dca4
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Mon Mar 23 17:06:09 2026 +0900

    chore: turn `useCalculatedVersion` off for snapshot releases

commit 4ae17c8720779c57eb52e1d28f8d77b7641488a9
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Mon Mar 23 11:17:37 2026 +0900

    feat: upgrade to Next.js 16 but without turbopack (#1380)

    * chore(docs): bump next to 16.x, fumadocs to 16.x

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * chore(docs): add example registry generation script

    Static import map for 427 example components, replacing fragile
    template-literal dynamic imports that Turbopack cannot analyze.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): replace dynamic example imports with static registry

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): replace dynamic block import with static notFound

    Block directory is currently empty. When blocks are added,
    a static registry (like example-registry) should be created.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): use fs.readFileSync for server-side dynamic imports

    Replace template-literal dynamic imports with fs.readFileSync in:
    - rootage.ts (rootage JSON files)
    - manual-installation.tsx (UI registry JSON)
    - breeze-manual-installation.tsx (breeze registry JSON)

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * chore(docs): update fumadocs v16 provider imports

    fumadocs-ui/provider → fumadocs-ui/provider/next in all 6 layout/page files.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): resolve build errors for Next.js 16 + fumadocs v16

    - Add local ThemeToggle component (removed from fumadocs-ui v16)
    - Add next-themes as direct dependency
    - Fix ImageZoom src type for React 19.2 Blob type
    - Fix MdxJsxFlowElement data type assertion
    - Fix BlockRenderer return type
    - Revert server-side fs.readFileSync (causes client bundle issues)
    - Fix example-registry: remove .tsx extension, relax types

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs: split upgrade plan into plan and record

    - plan: original implementation plan (what we intended)
    - record: what actually happened (deviations and learnings)

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * revert: revert registry generation

    * fix

    * refactor: remove unnecessary next-themes dependency

    * refactor: remove unnecessary assertions

    * refactor: replace custom type table with custom generator

    * chore: prevent package name being parsed as a jsdoc tag

    * chore

    * feat: style

    * fix

    * feat: prevent rows without content being collapsible

    * feat: style

    * docs: typo

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 6473f3b40b2aaab3769435a6cdb8b487e8234a4d
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Fri Mar 20 15:36:32 2026 +0900

    feat(docs): `BlockPreview` (#1376)

    * feat(docs): add BlockPreview component and block infrastructure

    - Add BlockPreview component with resizable viewport (desktop/tablet/mobile)
    - Add iframe route for block rendering (/blocks/[name])
    - Add CLI copy button (npx @seed-design/cli@latest add block:xxx)
    - Register BlockPreview as MDX component
    - Add react-resizable-panels dependency

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): remove footer-1 hardcoded import from block page route

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * Update docs/components/block-preview.tsx

    Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

    * fix(docs): change mobile viewport width from 375px to 390px

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): add placeholder param for empty block route with output export

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): use dynamic import and registry for block page route

    Use React.lazy with dynamic import instead of hardcoded block map.
    Read block list from registry-block for generateStaticParams.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): split block page into server/client components

    Separate generateStaticParams (server) from React.lazy (client)
    to fix "use client" + generateStaticParams conflict.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
    Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

commit 5205bb89603d70ce0574a484cd0cd7cd8ada947c
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Fri Mar 20 15:26:06 2026 +0900

    docs(agents): remove forwardRef rule from root AGENTS.md (#1379)

    The forwardRef + displayName rule is scoped to packages/react only,
    and is already documented in packages/react/AGENTS.md. Removing it
    from the root to follow the principle that folder-scoped rules belong
    in their respective AGENTS.md files.

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit b95a5c5cc9d82e06bee57744696d0942811cd074
Author: 유세은 <101736358+SeieunYoo@users.noreply.github.com>
Date:   Fri Mar 20 12:49:39 2026 +0900

    fix(docs): unify changelog URL params and centralize href generation (#1374)

    Replace scattered inline URL construction (tab/from params, hash fragments)
    with a single getChangelogHref utility using package/version params.

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

commit 9499943f76b3ef56368102ecd74bc1d3fe95a3f7
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Fri Mar 20 12:08:21 2026 +0900

    docs: update `앱` references

    @seed-design/css has updates but since they are jsdoc changes and don't have to trigger a release so not adding a changeset

commit 7b60db5c504c5ab9aecc24f5e08a6a86fd9e2f0b
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Fri Mar 20 11:33:47 2026 +0900

    docs: add content-placeholder & identity-placeholder docs; add guideline migrate skill (#1370)

    * chore(claude): migrate skill write-component-guideline to migrate-component-docs-from-figma

    * docs

    * docs

    * chore: refine skill

    * docs

    * docs: update react docs

commit a4be96cba83b7c25e19e3435c3234f7229f5fa66
Author: 유세은 <101736358+SeieunYoo@users.noreply.github.com>
Date:   Thu Mar 19 20:22:24 2026 +0900

    fix(docs): add changelog-page class to enable prose padding override (#1371)

commit 9f11b3136f50e49b1cdfa8a4404f3926331a641f
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Thu Mar 19 19:22:02 2026 +0900

    feat(mcp): add find_nodes tool for name-based layer search (#1368)

    * feat(mcp): add find_nodes tool for name-based layer search

    Add a new MCP tool that searches a Figma node's subtree by name using
    regex patterns and returns a flat array of matching nodes with their
    IDs. This enables efficient layer lookup without the overhead of full
    node info or codegen pipelines.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs(mcp): add find_nodes to tool list

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * chore: add changeset for find_nodes tool

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(mcp): use mode-aware schema and validate regex input in find_nodes

    - Use singleNodeParamsSchema instead of singleNodeBaseSchema to honor
      ToolMode constraints (websocket/rest/all)
    - Wrap RegExp construction in try/catch to handle invalid patterns
      gracefully

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 7cbe9f39887ca1145676cf5d1d3c36b701dec2a3
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Thu Mar 19 18:28:42 2026 +0900

    fix(figma): guard against missing styleOverrideTable entry in text node normalizer (#1367)

    * fix(figma): guard against missing styleOverrideTable entry in text node normalizer

    When a text node has characterStyleOverrides referencing a styleId
    that doesn't exist in styleOverrideTable, the normalizer would crash
    with "Cannot read properties of undefined (reading 'fontFamily')".

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * chore: add changeset for styleOverrideTable fix

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 2daf9f937250b64baeaaded20ec26b1bc36cf989
Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Date:   Thu Mar 19 16:29:39 2026 +0900

    release: version packages (#1335)

    * Version Packages

    * Update public rootage version

    ---------

    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

commit f0d75b65fd68127e1399845249e5006bf7a2b4f4
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Thu Mar 19 16:27:38 2026 +0900

    feat(registry): add block registry infrastructure (#1357)

    - Add registryBlock definition with empty items
    - Create docs/registry/block/ directory for block snippets
    - Integrate block registry into generate-registry.ts pipeline
    - Block registry now appears in CLI catalog with dynamic discovery

commit 534eb1c444972e54e88ad19f476ba3c0979253a8
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Thu Mar 19 16:25:42 2026 +0900

    feat(figma): implement content placeholder handler; update icon data (#1365)

    * chore: bump icon data

    * feat(figma): implement content placeholder component handler; attach to image frame handler

    * docs

commit 67a7780172b962a7b4cc31a612c2cf44c51d1af5
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Thu Mar 19 15:48:52 2026 +0900

    feat: add content-placeholder component (#1338)

    * feat(react): add `content-placeholder` component (#1231)

    * feat(content-placeholder): add component and fallback docs

    * refactor(content-placeholder): adopt root-container-asset anatomy

    * feat(content-placeholder): add preset asset types and docs

    * fix(stories): resolve content placeholder story type inference

    * fix(content-placeholder): use svg prop in docs wrapper and stories

    * Update packages/react/src/components/ContentPlaceholder/ContentPlaceholder.tsx

    Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

    * Revert "Merge branch 'codex/feat/content-placeholder' of github.com:daangn/seed-design into codex/feat/content-placeholder"

    This reverts commit 07012ac259ff4a35c4611dba97284fdfb6765f46, reversing
    changes made to 06e591d57c8ff63b429afb0f73cc959fb8fdcdb3.

    * add display name

    * generate all

    * docs(content-placeholder): registry snippet 기반으로 usage 예시 업데이트

    - image-frame Usage 섹션의 fallback을 registry snippet ContentPlaceholder로 교체
    - image-frame Usage 섹션에 Content Placeholder 문서 링크 추가
    - content-placeholder Usage 섹션을 registry snippet API로 교체
    - content-placeholder type/svg 각각의 ComponentExample 예시 추가

    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

    * docs

    * refactor(content-placeholder): move type concern to packages/react and improve docs

    - Add `ContentPlaceholderProps` to packages/react with literal union for `type`
      so fumadocs can display actual values in Props table
    - Export `Props` from namespace for registry snippet to extend
    - Simplify registry snippet to `extends SeedContentPlaceholder.Props` (remove local type defs)
    - Merge "Type과 Custom의 차이" section into each example section as bullets

    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

    * fix(content-placeholder): interface를 type으로 변경하고 잘못된 기본값 제거

    discriminated union 타입을 interface extends로 확장할 수 없어 type alias로 변경,
    svg 브랜치에서 type이 never인 상황의 기본값 할당 오류 수정

    * Update content-placeholder.json
    * fix(content-placeholder): specify minimum patch versions for dependencies

    * chore: regenerate after cherry-pick content-placeholder

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * docs: refactor ContentPlaceholder stories

    * chore: regenerate after cherry-pick stories refactor

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * docs: add custom svg case to ContentPlaceholder stories

    * refactor: refactor ContentPlaceholder to match the structure of IdentityPlaceholder (#1316)

    * refactor

    # Conflicts:
    #	packages/css/all.layered.min.css
    #	packages/css/all.min.css

    * docs: dry in stories

    * feat: rename type variant; add variant type=commerce

    * docs: stories

    * docs

    * feat(content-placeholder): simplify to root+asset 2-slot structure (#1329)

    * feat(content-placeholder): simplify asset slots

    * fix(content-placeholder): rename asset slot back to image

    * fix(content-placeholder): change maxWidth to number type in rootage

    * fix(content-placeholder): use dimension type with px values for min/maxWidth

    * docs(content-placeholder): fix asset->image rename leftover in docs and component

    * fix(content-placeholder): revert rootage/core changes and use widthFraction var in recipe

    * feat(content-placeholder): rename image to asset, widthFraction to heightFraction, set maxWidth 64px

    * docs(content-placeholder): add sizes example

    * refactor(content-placeholder): update asset dimensions and sizes in examples

    * remove script

    * chore: changeset

    * fix(content-placeholder): wrap asset in span to fix custom icon sizing

    * fix(content-placeholder): apply heightFraction to height instead of width

    * fix(content-placeholder): update spec description and build script

    * remove

    * Delete clever-deer-teach.md

    * change deps version

    * release: version packages (#1302)

    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

    * feat(release-noti): release noti slack format (#1332)

    * feat: refine release notification changelog formatting

    * chore: restore release notification team mention

    * fix(docs): prevent conditionMap keys from leaking to DOM in VariantTable

    When conditionMap used non-prop keys (e.g. "condition"), VariantTable
    passed them as props to the rendered component, causing non-standard
    DOM attributes. Now only spreads inner condition values, skipping the
    conditionMap key itself.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): add conditionMap keys to inner values for Avatar and ImageFrame

    After the VariantTable fix (9600026a0) that strips conditionMap keys
    from component props, Avatar's badgeMask and ImageFrame's caseLabel
    need to be explicitly included in inner values since they are real
    component props.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): prevent Figma API rate limit errors during build (#1333)

    Add semaphore to limit concurrent Figma API requests to 1 and retry on
    network errors (socket hang up, ECONNRESET, ETIMEDOUT).

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

    * feat(docs): changelog packages/version filter  (#1304)

    * feat(docs): add changelog page and viewer component

    - Introduced a new ChangelogPage component to display updates and changes.
    - Added ChangelogViewer component for filtering and displaying changelog entries by package and version.
    - Implemented parsing logic for changelog entries from markdown format in the parse-changelog module.

    * chore: update dependencies in bun.lock and package.json

    - Added rehype-stringify and remark-rehype to both bun.lock and package.json.
    - Updated rootage:generate script in package.json for consistency.

    * feat(docs): enhance changelog functionality and layout

    - Wrapped children in NuqsAdapter within the Layout component for improved context handling.
    - Refactored ChangelogPage to simplify changelog file reading.
    - Introduced ChangelogEntryItem component for better modularity in displaying changelog entries.
    - Updated ChangelogViewer to utilize the new ChangelogEntryItem component and refined package filtering logic.
    - Improved parsing logic in parse-changelog to enhance changelog entry structure documentation.

    * Merge branch 'dev' of github.com:daangn/seed-design into feat/changelog-docs-version

    * feat(docs): add Suspense wrapper to ChangelogViewer for improved loading handling

    * test(docs): add parse changelog parser tests

    * fix(docs): align changelog filter badge with package selection

    * feat(docs): enhance changelog layout and functionality

    - Updated ChangelogPage to include a wrapper for improved styling.
    - Adjusted padding for changelog entries and added options to hide date and packages.
    - Refactored ChangelogViewer to group entries by package and version, improving organization and readability.

    * feat(docs): add LLM options to ChangelogPage for enhanced interactivity

    - Integrated LLMOptions and ViewOptions components to provide users with markdown and GitHub links for the changelog.
    - Improved layout with a flex container for better alignment of options.

    * feat(docs): add @seed-design/stackflow to pinned packages in ChangelogViewer

    - Updated the PINNED_PACKAGES array to include "@seed-design/stackflow" for enhanced visibility in the changelog viewer.

    * feat(docs): enhance ChangelogViewer with query state history management

    - Added history management for selected package and version states in ChangelogViewer to improve navigation and user experience.

    * feat(docs): add changelog exact/range version filter modes

    * feat(docs): improve changelog version filters and affected package display

    * feat(docs): add compare mode to changelog viewer

    * refactor(docs): split changelog viewer into hooks and sections

    * feat(docs): refine changelog compare tab UX and filter state

    * chore(ci): retrigger pipeline

    * refactor(docs): drop legacy changelog version query state

    * style(docs): polish changelog control active and selected states

    * feat(docs): refine changelog viewer layout and filters

    * feat(docs): order changelog entries from selected version

    * refactor(docs): remove changelog generation script

    * copy(docs): clarify changelog related package label

    * feat(docs): parse package changelogs for changelog viewer

    * feat(docs): implement changelog API endpoint and integrate with full text response

    * refactor(docs): enhance changelog parsing and improve related package extraction

    * feat(docs): add changelog entry to updates category in llms route

    * refactor(docs): improve formatting of changelog entries for better readability

    * style(docs): fix changelog sticky header height and border-radius overflow

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): restore changelog sidebar link, fix sticky overflow, and add search indexing

    - Use overflow-clip instead of overflow-hidden to preserve sticky behavior
    - Add changelog to updates sidebar via meta.json external link
    - Index changelog entries in search API for content discoverability

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): use contentHtml property and strip HTML tags for search index

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * feat(docs): show dependency-only changelog entries instead of hiding them

    Versions with only dependency updates (e.g. react@1.2.3) were previously
    invisible. Now they appear with "하위 패키지 업데이트에 의한 버전 변경"
    label and linked package chips.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(docs): split changelog search index per package for clarity

    Search results now show "Changelog - react-slider" instead of a single
    "Changelog" title, making it clear which package each result belongs to.
    Clicking navigates to the changelog with the package tab pre-selected.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): fix changelog search result URLs to use from query param

    Search results now link to ?tab=...&from=version format instead of
    ?tab=...#package@version hash format, matching the changelog viewer's
    URL scheme. Each package-version pair gets its own search index entry.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): add required heading field to search index contents

    The Content type requires a heading property. Using empty string
    so Fumadocs won't append a hash fragment to the URL.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(docs): update ChangelogViewer layout and improve URL handling

    - Adjusted layout in ChangelogViewer to enhance the display of package information.
    - Removed unnecessary package rail duplication for cleaner structure.
    - Updated changelog group links to eliminate unused anchor IDs, streamlining the URL format.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(docs): enhance ChangelogGroups component with resolved package entries

    - Introduced a new function to extract top-level HTML from changelog entries.
    - Updated ChangelogGroups to utilize resolved related packages, improving the display of package updates.
    - Refactored the handling of related packages to streamline the rendering of changelog entries and their associated links.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(docs): structure changelog content blocks

    * fix(docs): keep changelog parser server-only

    * feat(docs): refine changelog sticky and related entries

    * refactor(docs): adopt section-list changelog layout

    * fix(docs): avoid duplicate changelog sticky header at top

    * refactor: remove changelog sticky header

    ---------

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(stackflow): prevent reverse swipe-back by clamping displacement (#1334)

    * fix(stackflow): prevent reverse swipe-back by clamping displacement

    Clamp swipe-back displacement to non-negative values so the screen
    cannot be dragged in the reverse (leftward) direction, matching iOS
    native swipe-back behavior.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * chore(changeset): add changeset for swipe-back fix

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

    * test: add visual snapshot stories for layout components (#1327)

    * test: add visual snapshot stories for layout components

    Add Storybook stories for Box, Flex, Grid, and VStack/HStack to establish
    visual baselines before the responsive-styling PR merge.

    DES-1355

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * test: add nested layout/stacks baseline stories for Box

    Add layout and nested stacks conditions to establish visual baselines
    before responsive-styling PR merge.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * docs

    ---------

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(content-placeholder): replace Primitive.span with Slot for asset

    - Use @radix-ui/react-slot Slot instead of Primitive.span in
      ContentPlaceholderAsset, eliminating unnecessary span wrapper DOM element
    - Remove inline-flex, alignItems, justifyContent from asset slot recipe
    - Remove & > svg and & > img child selectors, apply fill/stroke/objectFit
      directly on asset class
    - Fix incorrect svg prop usage in image-frame docs (use children pattern)

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * change asset height to width in recipe

    * change minor to patch

    * generate

    * generate

    ---------

    Co-authored-by: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
    Co-authored-by: 유세은 <101736358+SeieunYoo@users.noreply.github.com>

commit 3273312a9bd576974d0b93af4d821bb9a1e868d1
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Thu Mar 19 15:30:57 2026 +0900

    chore(css): remove stale tag-group-tag recipe files (#1362)

    * chore(css): remove stale tag-group-tag recipe files

    These generated files are no longer produced by qvism-preset since
    the component was renamed from tag-group-tag to tag-group-item.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 9d9b8911a45f15c86eacff82a6469d4065c60180
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Thu Mar 19 15:27:52 2026 +0900

    feat(image-frame): add fallback slot, fix iOS render issue, fix uncontrolled not work (#1313)

    * feat(image-frame): add fallback slot with 100% width and height

    - Convert image-frame recipe from defineRecipe to defineSlotRecipe
    - Add 'fallback' slot with width: 100%, height: 100% to fill container
    - Add ImageFrameFallback component that wraps fallback content
    - Wrap Image.Fallback children with ImageFrameFallback in ImageFrame
    - Export ImageFrameFallback from ImageFrame package

    Fixes visual gap/padding issue when using fallback prop with elements
    like ContentPlaceholder in ImageFrame component.

    * chore changeset

    * chore: changeset message

    * generate all

    * refactor(image-frame): apply withContext pattern and remove rootage fallback slot

    - Remove fallback slot from rootage YAML (React-only component)
    - Revert recipe from defineSlotRecipe to defineRecipe
    - Apply createSlotRecipeContext pattern (Avatar-like structure)
    - Split into ImageFrameRoot/Content/Fallback components
    - ImageFrameFallback applies width/height 100% via inline style

    * chore: remove image-frame.json changes and update changeset description

    * fix(image-frame): restore fallback slot recipe

    * docs: update AGENTS.md and create-component skill to prevent style and recipe mistakes

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * feat(image-frame): add snippet layer and update docs to use snippet

    * docs(create-component): add snippet layer decision guide to skill

    * refactor: decouple image frame from aspect ratio

    * refactor(image-frame): revert snippet/docs, add fallback-aware ImageFrame component, fix reaction button icon size

    * fix(image-frame): sync icon with internal toggle state in uncontrolled mode

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(image-frame): remove ratio prop deprecation, restore single component interface

    Remove compound component structure (ImageFrameRoot/Content/Fallback) and
    restore the original single ImageFrame component with ratio prop as a
    non-deprecated interface. The rounded prop deprecation is preserved.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * docs: update AGENTS.md and create-component skill to prevent style and recipe mistakes

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * feat(image-frame): add snippet layer and update docs to use snippet

    * docs(create-component): add snippet layer decision guide to skill

    * refactor: decouple image frame from aspect ratio

    * refactor(image-frame): revert snippet/docs, add fallback-aware ImageFrame component, fix reaction button icon size

    * fix(image-frame): sync icon with internal toggle state in uncontrolled mode

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(image-frame): remove ratio prop deprecation, restore single component interface

    Remove compound component structure (ImageFrameRoot/Content/Fallback) and
    restore the original single ImageFrame component with ratio prop as a
    non-deprecated interface. The rounded prop deprecation is preserved.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * chore: separate AGENTS.md and skills docs into different PR

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(image-frame): use InternalIcon + mergeProps for ReactionButtonIcon

    Replace public Icon component with InternalIcon + mergeProps pattern,
    consistent with CheckboxIndicator approach. Propagates toggle stateProps
    (data-pressed, data-disabled) to the icon element.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(image-frame): add fallback slot, fix ReactionButton icon and uncontrolled toggle

    - Add `fallback` prop to ImageFrame for showing content on image load failure
    - Fix SVG icon size inheritance via width="100%" height="100%"
    - Fix uncontrolled toggle state sync using InternalIcon + mergeProps pattern
    - Update recipe to include `fallback` slot styles

    * chore: remove non-image-frame changes from PR

    Revert skills docs and AGENTS.md changes that are unrelated to the
    image-frame fallback slot feature.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * add test; reaction-button slot

    * Update changeset message

    * generate

    * refactor(image-frame): use splitVariantProps instead of manual destructuring

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * minor to patch

    * generate

    ---------

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

commit 83a545810e595105e66b49c04b18fada60c5a34c
Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Date:   Thu Mar 19 15:20:17 2026 +0900

    chore(deps): update dependency rollup-plugin-visualizer to v7 (#1291)

    Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

commit 2bcb8e23a370c4d6da176586f933e09f3e26190a
Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Date:   Thu Mar 19 15:19:43 2026 +0900

    chore(deps): update dependency chromatic to v15 (#1290)

    Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

commit e3626dd8542059da7e7b1aade2dc142a56ae4e71
Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Date:   Thu Mar 19 15:19:20 2026 +0900

    chore(deps): update chromaui/action action to v15 (#1287)

    Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
    Co-authored-by: 정현수 <hyeonsu.github@gmail.com>

commit d53315265981c76e345d2d849593a3646bbfa826
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Thu Mar 19 14:26:13 2026 +0900

    docs(stackflow): add activity.isActive modal prop guide for nested BottomSheet (#1352)

    Enhance "Keeping Bottom Sheet Mounted" section with modal prop handling. When a BottomSheet Activity is nested behind another pushed Activity, setting modal={isActive} ensures that:
    - The parent Activity can scroll when BottomSheet is not active
    - Unintended Activity termination is prevented
    - Smooth interaction with activity stacks is maintained

    Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>

commit 32938de6a02bd990d7929745e80b8b9b5742f781
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Thu Mar 19 14:25:43 2026 +0900

    fix(help-bubble): add margin-bottom to close button for balanced spacing (#1356)

    * fix(help-bubble): add margin-bottom to close button for balanced spacing

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * chore: add changeset for help-bubble close button fix

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): set help-bubble story placement to bottom to prevent overlap

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): increase help-bubble story cell padding to prevent overlap

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 4f56e7602e8ddf35bd1590957e99a1ed92336389
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Wed Mar 18 17:35:34 2026 +0900

    feat: add missing variant type=singleLine in text-input rootage (#1353)

commit 9670fb20da083f93783bfbc0c7a1702b3f614e33
Author: 유세은 <101736358+SeieunYoo@users.noreply.github.com>
Date:   Tue Mar 17 22:05:55 2026 +0900

    feat(ci): add changelog link to release Slack notification (#1349)

    * feat(ci): add changelog link to release Slack notification

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(ci): encode version in changelog URL query param

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

commit 87ae7e3df5c90b246695d0b30d89bf701d23d780
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Tue Mar 17 20:02:02 2026 +0900

    feat(lynx-spa): add monochrome and multicolor icon pages (#1348)

    * feat(lynx-spa): add monochrome and multicolor icon pages

    - Add FoundationMonochromeIconPage (636 icons) and FoundationMulticolorIconPage (71 icons)
    - Configure SVG-to-WebP icon loader for Lynx platform
    - Move docs icon.mdx to foundation/iconography.mdx section

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * refactor(lynx-spa): add codegen script for icon pages

    Replace hardcoded icon imports with a generator script that reads
    available icons from installed packages. Run `bun generate:icons`
    to regenerate after icon package updates.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(lynx-spa): use 25% width grid for icon pages

    Change icon items from fixed 80px width to 25% for proper 4-column
    grid layout with center alignment. Remove container gap to prevent
    row overflow.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 9eb86f4e31abbe74a79c6daa03203ef67bfa31e2
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Tue Mar 17 18:54:31 2026 +0900

    feat(stackflow): support callback pattern for seedPlugin options (#1350)

    * feat(stackflow): support callback pattern for seedPlugin options

    Allow seedPlugin to accept a callback that receives `initialContext`
    from `<Stack>`, enabling SSR apps to dynamically resolve theme based
    on server-side user-agent or client-side bridge detection.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs

    * docs

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 9f039c5cc02303c41cabe075141495632a510725
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Tue Mar 17 16:02:46 2026 +0900

    fix(mcp): always send connection confirmation in WebSocket join handler (#1351)

    * fix(mcp): always send connection confirmation in WebSocket join handler

    The refactoring in 423d604b9 introduced an `if (id)` guard around the
    connection confirmation response, which broke the Figma plugin's join
    handshake. The plugin never sends an `id` field with its join message,
    so the server stopped sending the `{ result: ... }` response that the
    plugin requires to transition out of the "연결 중..." state.

    Remove the guard to restore the original behavior where the confirmation
    is always sent regardless of whether an `id` is present.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit a9af87b88c97c8ff35f4bcbdf20b48fc7ae51995
Author: 조은진 <whdmswls9207@gmail.com>
Date:   Tue Mar 17 15:38:51 2026 +0900

    feat(examples/lynx-spa): upgrade lynx-console and add LynxConsole component (#1337)

    * feat(examples/lynx-spa): upgrade lynx-console and add LynxConsole component

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * chore: update lockfile after rebase

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

commit 196d9270e33883174007f18fe35a0285f2e01189
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Tue Mar 17 14:55:09 2026 +0900

    docs(lynx): add ActionButton component documentation (#1347)

    * docs(lynx): add ActionButton component documentation

    Add Components section to Lynx docs with ActionButton page including
    installation, usage example, and auto-generated props via react-type-table.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): use manual props table for lynx ActionButton

    react-type-table fails at build time because packages/lynx-react
    does not exist on this branch yet. Use a markdown table instead.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * fix(docs): revert to react-type-table for lynx ActionButton props

    The PR targets the lynx branch where packages/lynx-react exists,
    so react-type-table will resolve correctly after merge.

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 836cff7db3407fd4c871a5af06ac2498ad3f2e36
Author: 유세은 <101736358+SeieunYoo@users.noreply.github.com>
Date:   Tue Mar 17 11:31:04 2026 +0900

    fix(docs): add changelog.mdx MDX Component (#1339)

    * fix(docs): add stub changelog.mdx for metadata indexing

    The changelog page moved from MDX-based to CHANGELOG.md parsing,
    but removing changelog.mdx broke metadata-dependent systems (sitemap,
    search, llms.txt, generate-docs-index). This stub provides frontmatter
    metadata while the actual rendering remains in page.tsx.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): remove manual changelog workarounds in meta.json and llms.txt

    With stub changelog.mdx in place, Fumadocs auto-discovers the page.
    Remove external link syntax from meta.json and manual changelogEntry
    injection from llms.txt route.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(docs): integrate changelog into Fumadocs MDX pipeline

    Move changelog rendering from standalone page.tsx to MDX-based
    ChangelogPage server component. This ensures changelog is properly
    indexed by search, sitemap, LLM text, and docs index without
    manual workarounds.

    - Add ChangelogPage server component that parses CHANGELOG.md
    - Register it in mdx-components for use in changelog.mdx
    - Delete standalone app/react/updates/changelog/page.tsx
    - Remove manual changelog handling from llms-full.txt route

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * feat(docs): add ChangelogPage LLM rule for changelog MDX component

    Transform <ChangelogPage /> in llms-full.txt output from raw JSX to
    actual changelog content by parsing CHANGELOG.md files, following the
    same rule pattern as other MDX components.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * feat(docs): support tab and from query params in changelog LLM endpoint

    Filter changelog output by package (?tab=@seed-design/react) and/or
    minimum version (?from=1.2.0) for more targeted LLM consumption.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): preserve original node on changelog init failure

    Return the original <ChangelogPage /> node instead of silently
    dropping it when CHANGELOG.md loading fails, matching the fallback
    convention used by other LLM rules.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(docs): rename changelog query params to package and version

    Rename tab→package and from→version for clarity in the LLM endpoint,
    as these are semantic API params not UI implementation details.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * refactor(docs): rename changelog UI query params to package and version

    Align UI query params (?tab→?package, ?from→?version) with the LLM
    endpoint for consistency across the changelog interface.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): use semver for version comparison and force-dynamic for changelog endpoint

    String comparison incorrectly orders semantic versions (e.g. "2.0.0" >= "10.0.0").
    Also switch from revalidate=false to dynamic=force-dynamic to support query params.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    * fix(docs): revert changelog endpoint to static export compatible

    output: export does not support force-dynamic. Remove query param filtering
    and semver dependency, returning full changelog as a static endpoint.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* Update bun.lock

* Update bun.lock

* feat(lynx): add Text component, Layout/Typography docs, and catalog pages (#1394)

* feat: breakpoint & responsive styling support (#1326)

* chore(docs): add chromatic viewport modes baseline

Add VIEWPORT_MODES and viewport options to storybook for chromatic
visual snapshot baselines across breakpoints. Hardcoded values will be
replaced with @seed-design/css/breakpoints when responsive styling lands.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore(docs): apply chromatic viewport modes to layout stories

Add chromatic: { modes: VIEWPORT_MODES } to Box, Flex, Grid, Stack
stories to establish visual snapshot baselines across breakpoints.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(css, react): add breakpoint constants and ResponsiveValue type

Introduce viewport breakpoint system for responsive styling support:
- Add @seed-design/css/breakpoints with breakpoint names, values, and media queries
- Add ResponsiveValue<T> type and isResponsiveObject type guard in react package
- Export ResponsiveValue type from @seed-design/react public API

Breakpoints: base(0), sm(480), md(768), lg(1280), xl(1440)

DES-1314, DES-1318

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(postcss-responsive): add PostCSS plugin for responsive CSS variable cascade chains

Introduce postcss-responsive plugin that transforms `--responsive` marker
suffixed CSS custom properties into breakpoint-aware cascade chains.
Register in qvism-preset and add markers to 20 Box style properties
(padding, bleed, width/height, display, flexDirection, gap).

Generated CSS includes per-breakpoint fallback vars and @media overrides.

Adapted from Reshaped (MIT) postcss.responsive.mjs

DES-1324, DES-1317

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(react): add responsive value support to useStyleProps

Extend useStyleProps to accept ResponsiveValue<T> for layout-related
props (width, height, padding, bleed, display, flexDirection, gap).
Single values now output -base suffixed CSS variables to work with
the postcss-responsive cascade chain.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(react): fix StyleProps consumer compatibility for responsive values

- Icon: use UnwrapResponsive<StyleProps["height"]> since --seed-icon-size
  is outside the --seed-box-* cascade chain (no responsive icon sizing yet)
- ResponsivePair: replace handleDimension(gap) with var(--seed-box-gap)
  CSS variable reference to support responsive gap values
- Export UnwrapResponsive utility type for external consumers
- Unexport handlePaddingWithSafeArea (internal only)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(react): add responsive utility props for layout components

Add responsive Grid columns/rows, hideFrom/showFrom visibility controls
for Box/Flex/Grid, and vStackFrom/hStackFrom direction switching for
Stack components. Export BreakpointThreshold type for consumers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor

* fix(react): move Grid display from .seed-grid CSS to Box's --seed-box-display

Previously .seed-grid hardcoded display:grid, which silently overrode
--seed-box-display and broke <Grid display="none">. Now Grid passes
display="grid" through Box like Flex does, unifying the pattern and
enabling hideFrom/showFrom to work correctly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(react): add JS runtime responsive hooks

Add useBreakpoint, useBreakpointValue hooks and optional BreakpointProvider
for JS-level responsive behavior (variant switching, conditional rendering).

- Module-level singleton matchMedia store with lazy init and ref counting
- useSyncExternalStore for tearing-safe concurrent mode support
- Hybrid: works without provider, optional BreakpointProvider for SSR defaults
- Cascade resolution matching CSS min-width semantics

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(react): replace resolveDisplay with generic resolveThreshold

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(react): restructure visibility utils with internal resolveThreshold

- resolveThreshold is now a generic internal utility (not exported)
- resolveDisplay wraps it with display-specific API ({base, hideFrom, showFrom})
- hideFrom takes precedence if both hideFrom and showFrom are provided

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(react): implement hideFrom via CSS variable cascade, remove showFrom

- hideFrom now directly injects `--seed-box-display-{bp}: none` into
  inline style, leveraging the existing CSS variable cascade chain.
  This makes hideFrom completely independent of the user's display prop.
- Remove showFrom from all components (Box, Flex, Grid) due to
  fundamental conflict with user's display prop — restoring the
  original display value at a breakpoint requires knowing what it is.
- Remove visibility.ts utility (no longer needed).
- Restore Flex/Grid to dev-branch pattern: hardcoded display default
  with ...rest spread allowing user override.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(react): allow responsive display values on Flex and Grid

Wrap Flex `display` and Grid `display` prop types with
ResponsiveValue<> so users can pass responsive objects directly:

  <Flex display={{ base: "none", md: "flex" }} />
  <Grid display={{ base: "none", lg: "grid" }} />

This naturally covers the showFrom use case without a dedicated prop.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(react): remove vStackFrom/hStackFrom from Stack components

Deferred to gradual introduction; users can use Flex with responsive
flexDirection directly for the same effect.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: add comment

* fix: better type ResponsiveObject<T>

* chore: format

* docs

* docs

* test: add tests for multiple viewports

* test: add nested layout composition stories for Box

Add layout and nested stacks conditions (both static and responsive)
to Box stories for visual regression testing with Chromatic viewport modes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: generate

* fix: fix recipes using box variables

* fix: fix ResponsivePair inline styles

* fix: revert changes in action button recipe since it doesn't have seed-box class

* fix: bleed* can take responsive objects

* fix(css, qvism-preset): use --responsive marker in recipes for style prop override

Recipes that expose style props via Pick<StyleProps, ...> need their own
CSS variable cascade chain so that resolveResponsive's -base suffix
inline styles can override recipe defaults. Without .seed-box class on
these components, the cascade chain from base.css is not available.

Using --responsive marker lets postcss-responsive generate the full
cascade chain (-base, -sm, -md, -lg, -xl + media queries) directly
in each recipe's CSS output.

Affected recipes: skeleton, bottom-sheet, help-bubble, list-item

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: fix reponsivepair

* fix

* docs

* test: remove unrelated case

* feat: add gap fallback to responsivepair

* fix: remove unsafe casting

* test: add ResponsivePair stories

* docs: changeset

* feat(qvism-preset): add breakpoint helper for recipes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: release alpha

* feat: breakpoint & responsive styling support (#1326)

* chore(docs): add chromat…
* docs(lynx): add feature flags configuration guide

Add comprehensive Lynx feature flags documentation for SEED Design:
- config.mdx: detailed guide for all recommended flags with before/after behavior
- installation.mdx: add configuration step with required flags
- index.mdx: add Configuration card link

Categorizes flags into "Always-On" (CSS selector, inheritance, strict mode,
text refactor, fixed layout, flex-basis) and "Situational" (gestures,
IntersectionObserver, VSync, performance optimizations).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(lynx): correct plugin API structure in config docs

- Remove incorrect `compilerOptions` nesting — all options are flat
- Replace `pluginLynxConfig: {}` (not a defineConfig field) with
  `pluginLynxConfig({})` plugin call
- Document that enableCSSSelector/enableCSSInvalidation are already
  enabled by default in pluginReactLynx
- Consolidate all flags into pluginLynxConfig for single-point config
- Add pluginLynxConfig package install step in installation guide

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs(lynx): rename config.mdx to feature-flags.mdx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
commit 14c7d11
Author: 정현수 <54893898+junghyeonsu@users.noreply.github.com>
Date:   Fri Apr 3 18:30:36 2026 +0900

    feat(ci): add supply chain security analysis to Renovate dependency review (#1409)

    Add multi-layered supply chain attack detection to the Renovate
    dependency review workflow:

    - Pre-scan steps: install scripts check and audit before Claude analysis
    - New Claude prompt stages for install script inspection (step-2.5)
      and supply chain trust analysis (step-3.5)
    - Detect malicious patterns: env exfiltration, network requests,
      dynamic code execution, obfuscation
    - Package trust signals: download count, age, maintainer changes,
      typosquatting detection
    - Enhanced prompt injection defenses for untrusted external sources
    - Extended allowedTools for security-related commands
    - Security analysis tables in output format

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit b1942cf
Author: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Date:   Fri Apr 3 14:15:18 2026 +0900

    docs: remove V3 references and use Sprout/SEED naming (#1404)

    * docs: remove V3 changelog sections from component docs

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs: replace V2/V3 references with Sprout/SEED in migration and codemod docs

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    * docs: rename V2/V3 table headers to 이전/SEED in migration components

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove `enableFlexBasisZeroPercent` and `enableTransformedTouchPosition`
from feature-flags and installation docs as these options are not defined
in `@lynx-js/type-config@3.6.0` CompilerOptions/Config types, causing
TypeScript errors when used with `pluginLynxConfig`.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat(lynx-css): add sp unit support for dynamic font scaling

Convert dynamic typography tokens (font-size, line-height) from px to sp
units in Lynx CSS output. Static tokens remain in px for fixed-size text.

When fontScaleEffectiveOnlyOnSp flag is enabled, only sp-unit text responds
to system font size changes while px-unit layout stays fixed.

- Add convertPxToSp() to postcss-lynx-compat plugin
- Keep static tokens (--seed-font-size-t{N}-static) in Lynx output
- Update examples with Dynamic(sp)/Static(px) sections
- Update typography and feature-flags docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(postcss-lynx-compat): remove dead guards in sp conversion

Remove -limit- and -multiplier string checks from the sp conversion
condition since removeCustomProperties already deletes those declarations
earlier in the same walkDecls pass.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* bump

* lint, feature-flags

* fix closing tag

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…tible defaults

Lynx does not support the CSS `initial` keyword (nor `inherit` or `unset`).
Add a transformation step in postcss-lynx-compat that replaces `initial` values
in CSS custom properties with their appropriate Lynx-compatible defaults:

- background/border-color → transparent
- width/height/min-* → auto, max-* → none
- position → relative (Lynx default, not static)
- flex-direction → row, flex-grow → 0, flex-shrink → 1
- overflow → visible, box-shadow/transform → none
- color → declaration removed (inherits from parent)

Regenerated all lynx-css output files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…lity issues (#1417)

enableCSSStrictMode causes many CSS properties to break in Lynx.
Changed recommendation from true to false across docs and example config.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat(lynx-spa): add Tailwind v3 setup and performance comparison pages

- Add tailwindcss v3 + @seed-design/tailwind3-plugin to lynx-spa
- Add postcss.config.js with tailwindcss plugin
- Add tailwind.config.ts with SEED Design plugin
- Add @tailwind directives to global.css
- Add 3-way comparison test pages: Native view vs SEED Box vs Tailwind Box
- Add additional comparison pages for ScrollView, List, Text

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(lynx-spa): remove obsolete test pages referencing removed components

Remove test pages that imported ScrollView, List, ListItem from
@seed-design/lynx-react — these components were removed during
the architecture pivot to Tailwind.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(lynx): remove layout components in favor of Tailwind + native elements

Remove Box, Text, Flex, VStack, HStack from @seed-design/lynx-react.
These components used runtime StyleProps (useStyleProps + dynamicStyle)
which caused 50-100ms performance overhead in Lynx's dual-thread model.

Instead, use Tailwind CSS v3 utility classes with @seed-design/tailwind3-plugin
directly on native <view> and <text> elements for zero runtime overhead.

Changes:
- Remove Box, Text, Flex, VStack, HStack components and StyleProps utilities
- Convert all lynx-spa layout pages to use Tailwind classes
- Replace component docs with Tailwind styling guide
- Remove typography folder (covered in styling guide)
- Keep ActionButton, ProgressCircle (behavior components)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Update styling.mdx

* refactor(lynx-spa): replace Layout section with Tailwind demo page

Remove old Layout pages (Box, Flex, Stack, Text) that used deleted
SEED components. Add unified TailwindDemoPage showcasing colors,
typography, layout, and borders with SEED tokens via Tailwind classes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs(lynx): add Tailwind v3 setup instructions to installation and theming

- Add tailwindcss@3 + @seed-design/tailwind3-plugin to installation steps
- Add Tailwind config (tailwind.config.ts, postcss.config.js) setup guide
- Add @tailwind directives to CSS setup
- Note that Tailwind v4 is not supported (Rsbuild limitation)
- Add Tailwind usage section to theming docs with link to plugin README

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(lynx-spa): add CSS selector support verification test page

Add a test page to verify which CSS selectors are natively supported
by Lynx engine with enableCSSSelector: true. Tests include:

- Data-attribute selectors ([data-*], [data-attr="value"])
- Attribute operators (*=, ^=, $=)
- Pseudo-classes (:active, :not(), :disabled)
- Combinators (>, space, +, ~)
- Compound selectors
- :root CSS variables

Uses tag selectors (view[data-*]) to bypass postcss-lynx-compat
Step 3 transformation, ensuring raw CSS selectors reach Lynx runtime.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(lynx): use correct Tailwind stroke class name (border-stroke-neutral-muted)

border-stroke-neutral doesn't exist in @seed-design/tailwind3-plugin.
Fixed to border-stroke-neutral-muted across docs and examples.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…oop (#1418)

* perf(lynx-react): optimize ProgressCircle animation with shared RAF loop

Replace per-instance setInterval + setState with a single shared
requestAnimationFrame loop on the main thread using setStyleProperty
for zero re-renders. This eliminates N independent timers and N×60
re-renders/sec when multiple ProgressCircles are on screen.

- Indeterminate: shared RAF loop drives all instances (1 timer for N circles)
- Determinate: individual RAF for short 300ms transitions
- All animations use 'main thread' directive + setStyleProperty()
- Animation math (cubicBezier, pieClipPath) unchanged for visual fidelity

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(lynx-react): extract geometry helper and simplify ProgressCircle

- Extract duplicated geometry calculation into computeRingGeometry()
- Precompute geometry at subscribe time instead of every frame
- Add from===to early return in animateDeterminateProgress
- Simplify DeterminateRange cleanup (remove unnecessary wrapper)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(lynx-react): fix ProgressCircle main thread errors and document known limitations

Replace shared RAF loop (Map-based) with per-instance RAF loops using
runOnMainThread bridge. Lynx main thread doesn't support Map/Set and
module-level functions without "main thread" directive aren't available
in the main thread bundle.

Key changes:
- Use runOnMainThread() to call main thread functions from useEffect
- Separate main-thread-only utils (with directive) from background-thread
  utils (bgPieClipPath for render)
- Document performance limitations: clip-path is not animatable in Lynx,
  requiring JS-based SVG path string generation every frame

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(lynx-react): remove per-frame constant style updates in ProgressCircle

- Remove tailCapEl/startCapEl setStyleProperties calls from RAF loops
  since these caps have fixed positions (set once via initial inline styles)
- Move JSDoc from RootProps interface to Root function
- Remove unused local variables (startCapEl, tailCapEl)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…supported feature docs (#1419)

* refactor(lynx-react): improve ActionButton API with forwardRef, Primitive, and unsupported feature docs

- Migrate from plain function to React.forwardRef
- Use Primitive.view for asChild (Slot) pattern support
- Spread native Lynx view props via rest props
- Remove loading/layout from types (SVG not supported in Lynx)
- Add JSDoc annotations documenting unsupported features and roadmap
- Add unsupported feature documentation convention to AGENTS.md
- Add component code conventions (forwardRef, Primitive, displayName)
- Document unsupported features in action-button.mdx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(lynx-react): correct unsupported feature rationale after cross-verification

- "SVG not supported" was inaccurate — Lynx supports SVG and image-based icons
- Actual reason: icon interface not yet finalized for Lynx recipe system
- Remove unnecessary `as Record<string, unknown>` type cast
- Remove redundant children separation (already destructured above)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore(lynx-react): use explicit boolean conversion for disabled prop

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(lynx-react): use splitVariantProps for ActionButton

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs(lynx-react): update unsupported feature rationale to Lynx 3.7 SVG timeline

- Change "아이콘 인터페이스 확정 후" to "Lynx 3.7 SVG 지원 후" across all docs
- Add asChild and ref forwarding to web difference section in MDX
- Update AGENTS.md convention template and unsupported feature table

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(lynx-react): replace Primitive.view with native view to fix BackgroundSnapshot error

Primitive.view's extra forwardRef wrapper layer causes Lynx runtime's
BackgroundSnapshot diff algorithm to fail with "BackgroundSnapshot not
found: view" error. Use native <view> element directly with manual ref
null guard instead.

Also documents this constraint in AGENTS.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ame (#1406)

Replace @seed-design/rsbuild-plugin/lynx with getSeedClassName() from
@seed-design/lynx-react. This eliminates the build-time __SEED_COLOR_MODE__
injection and consolidates theme + platform class resolution into a single
function call.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* docs: remove V3 references and use Sprout/SEED naming (#1404)

* docs: remove V3 changelog sections from component docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs: replace V2/V3 references with Sprout/SEED in migration and codemod docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs: rename V2/V3 table headers to 이전/SEED in migration components

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ci): add supply chain security analysis to Renovate dependency review (#1409)

Add multi-layered supply chain attack detection to the Renovate
dependency review workflow:

- Pre-scan steps: install scripts check and audit before Claude analysis
- New Claude prompt stages for install script inspection (step-2.5)
  and supply chain trust analysis (step-3.5)
- Detect malicious patterns: env exfiltration, network requests,
  dynamic code execution, obfuscation
- Package trust signals: download count, age, maintainer changes,
  typosquatting detection
- Enhanced prompt injection defenses for untrusted external sources
- Extended allowedTools for security-related commands
- Security analysis tables in output format

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: generate document index

* fix(lynx): correct docs-implementation inconsistencies

- Remove false asChild/Primitive.view claim from ActionButton docs
- Fix capitalized View/Text to lowercase native elements in theming docs
- Remove no-op ProgressCircle.Track from implementation, docs, and examples
- Add Track rendering difference to web comparison table

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Joo Chanhwi <56245920+te6-in@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Enter changeset pre-release mode with `alpha` tag
- Set lynx package versions to 0.0.0 (first publish will be 0.1.0-alpha.0)
- Add `lynx` branch to release-packages.yml triggers
- Add initial minor changeset for lynx-primitive, lynx-css, lynx-react
- Remove broken validation-reminder Stop hook from worktree settings

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@junghyeonsu junghyeonsu force-pushed the lynx branch 2 times, most recently from aaec799 to ee04806 Compare April 5, 2026 14:51
junghyeonsu and others added 3 commits April 5, 2026 23:53
- Enter changeset pre-release mode with `alpha` tag
- Set lynx package versions to 0.0.0 (first publish will be 0.1.0-alpha.0)
- Add `lynx` branch to release-packages.yml triggers
- Add initial minor changeset for lynx-primitive, lynx-css, lynx-react

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Enter changeset pre-release mode with `alpha` tag
- Set lynx package versions to 0.1.0 (first publish will be 0.1.1-alpha.0)
- Add `lynx` branch to release-packages.yml triggers
- Add initial patch changeset for lynx-primitive, lynx-css, lynx-react

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
github-actions bot and others added 8 commits April 6, 2026 00:25
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…baseUrl

- Add alpha stage Callout banner to installation guide
- Use @Alpha dist-tag for all lynx package and CLI installs
- Add --baseUrl for CLI snippet fetching from lynx docs site
- Mark all alpha-specific changes with TODO comments for dev merge cleanup

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ress-circle (#1433)

* feat(registry): add Lynx registry snippets for action-button and progress-circle

Extend the registry generation system to support multiple frameworks (React + Lynx).
Add Lynx wrapper snippets for ActionButton and ProgressCircle that re-export from
@seed-design/lynx-react with simplified APIs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(registry): add loading prop with ProgressCircle to Lynx action-button snippet

Loading state renders ProgressCircle directly instead of using a separate
LoadingIndicator component, keeping the Lynx snippet simpler than React's
three-layer chain (ActionButton → LoadingIndicator → ProgressCircle).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(lynx): restore loading prop in ActionButton package, simplify snippet to thin wrapper

- Remove loading from Omit in ActionButton props, add loading variant to CSS recipe call
- When loading=true, render children directly (not wrapped in <text>) so snippet can inject ProgressCircle
- Snippet now follows React pattern: import from @seed-design/lynx-react and wrap with ProgressCircle on loading

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(lynx-react): fix loading prop ignored in ActionButton, remove redundant declarations

- Move loading destructuring from restProps to variantProps (splitVariantProps
  extracts it as a variant key, so reading from restProps always yielded undefined)
- Remove redundant disabled/loading declarations from interface (already provided
  by ActionButtonVariantProps after Omit<..., "layout">)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(lynx-css): add inherit tone and small sizes (14/16/18) to progress-circle recipe

Add sizes matching action-button loading states (xsmall/small=14px,
medium=16px, large=18px) with computed clip-path ring geometries.
Add inherit tone variant that reads --track-color/--range-color from parent.

Update action-button snippet to map button size to progress-circle size
instead of using invalid "inherit" value.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Update bun.lock

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
#1454)

* docs(lynx-react): add component implementation roadmap and phase specs

Add per-phase TODO specs for 38 Lynx-feasible components with detailed
reference mappings to React styled, headless, lynx-ui, and CSS recipe sources.
Architecture decision: flat approach (no headless layer) due to Lynx 3.6
data-attribute CSS selector limitation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: gitignore docs/superpowers

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(lynx-react): review fixes for TODO specs

- Fix @lynx-js/lynx-ui-common package name (was bare lynx-ui-common)
- Replace all absolute paths with GitHub URLs (lynx-family/lynx-ui)
- Move Portal from Phase 5 to Phase 0 (overlay prerequisite)
- Add ChipTabs missing "brandSolid" variant (deprecated)
- Add deprecated component policy to README
- Add phase dependency column to README table
- Add common convention reminders to Phase 0

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs(lynx-react): remove unnecessary components from TODO specs

Remove VisuallyHidden (web CSS trick, Lynx uses accessibility-label),
Portal (web createPortal concept, Lynx uses overlay pattern),
and Celsius (string format function, not worth a component).

Actual implementation target: 28 components.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants