Conversation
🦋 Changeset detectedLatest commit: c69e38f The changes in this PR will be included in the next version bump. This PR includes no changesetsWhen 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 |
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
* 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>
…SInlineVariables option
) 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>
Alpha Preview (Stackflow SPA)
|
Alpha Preview (Storybook)
|
Alpha Preview (Docs)
|
…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>
aaec799 to
ee04806
Compare
- 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>
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>
No description provided.