Skip to content

feat(genui/playground): introduce OpenUI#2561

Merged
gaoachao merged 7 commits into
mainfrom
feat/introduce-openui
May 8, 2026
Merged

feat(genui/playground): introduce OpenUI#2561
gaoachao merged 7 commits into
mainfrom
feat/introduce-openui

Conversation

@gaoachao
Copy link
Copy Markdown
Collaborator

@gaoachao gaoachao commented May 6, 2026

Summary by CodeRabbit

  • New Features

    • Added protocol-aware routing with support for A2UI and OpenUI protocols via URL hash navigation.
    • Introduced separate demo and components pages for OpenUI (components page coming soon).
    • Updated tab navigation to be protocol-scoped, with dedicated tabs for each protocol.
    • Added protocol selector dropdown in the top navigation.
  • Chores

    • Updated build entry configuration for improved routing support.

Checklist

  • Tests updated (or not required).
  • Documentation updated (or not required).
  • Changeset added, and when a BREAKING CHANGE occurs, it needs to be clearly marked (or not required).

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 6, 2026

Review Change Stack

📝 Walkthrough

Walkthrough

This PR implements protocol-aware routing and dual-protocol support (a2ui/openui) in the a2ui-playground app. The refactoring replaces a single hardcoded protocol version with a Protocol object model, adds protocol-scoped hash routes, introduces new OpenUI demo and component pages, and updates all existing pages to be protocol-aware.

Changes

Protocol-Aware A2UI Playground

Layer / File(s) Summary
Protocol Type System
src/utils/protocol.ts, src/utils/demoUrl.ts
Introduces ProtocolName, Protocol interface with name and version, PROTOCOLS registry for a2ui and openui, and replaces the single DEFAULT_DEMO_URL with protocol-specific constants DEFAULT_A2UI_DEMO_URL and DEFAULT_OPENUI_DEMO_URL.
Core Routing & Tab Configuration
src/App.tsx
Reworks hash parsing to extract protocol prefix; defines separate A2UI_TABS and OPENUI_TABS; computes active tabs based on selected protocol; enables protocol-scoped navigation where tab clicks and protocol selection both update the hash with protocol.name.
Protocol Selector UI
src/App.tsx, src/components/ProtocolSwitch.tsx, src/styles.css
Replaces prior version-selection ProtocolSwitch with a simple display button; introduces a <select> dropdown driven by protocol.name for protocol switching; adds CSS styling for .brandGroup and .protocolSelect with hover/focus states.
Existing Page Components Protocol Migration
src/pages/Home.tsx, src/pages/DemosPage.tsx, src/pages/AIChatPage.tsx, src/pages/ComponentsPage.tsx
Updates all pages to accept Protocol object instead of ProtocolVersion; generates protocol-scoped hash routes (e.g., #/protocol/tab/component); DemosPage and AIChatPage now use protocol.name in generated URLs; ComponentsPage routes and links include protocol scope.
New OpenUI Pages
src/pages/OpenUIDemosPage.tsx, src/pages/OpenUIComponentsPage.tsx
Adds OpenUIDemosPage with scenario selection, raw/parsed code views, responsive preview modes (phone/full), speed slider for re-rendering, and QR code generation for web and native Lynx dev URLs; adds OpenUIComponentsPage as a placeholder.
Component Catalog & OpenUI Scenarios
src/componentCatalog.ts, src/mock/openui-scenarios.ts
Updates ComponentDoc.usage to key by ProtocolName instead of version strings; each catalog entry now has a2ui (example props) and openui (empty) usage; introduces OpenUIScenario interface and OPENUI_SCENARIOS with pricing-cards demo data.
Render URL & Utility Updates
src/utils/renderUrl.ts, src/render.tsx
Changes RenderInit.protocol from ProtocolVersion to Protocol; buildRenderUrl now writes protocol query param using protocol.name; render.tsx imports and uses DEFAULT_A2UI_DEMO_URL as fallback.
Build Configuration & Documentation
lynx.config.ts, .github/a2ui-catalog.instructions.md
Updates lynx.config.ts to use a2ui entrypoint instead of main; adds routing guidance in catalog instructions to canonicalize protocol-prefixed hash routes and preserve tab names during routing changes.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • lynx-family/lynx-stack#2472: Both modify the a2ui-playground codebase with protocol-based changes; main PR evolves the initial playground to be protocol-object–aware.
  • lynx-family/lynx-stack#2566: Both modify the a2ui-playground app's tab/routing model and shared files including App.tsx, page components, and styles.
  • lynx-family/lynx-stack#2555: Both modify the playground rendering stack (render.tsx, renderUrl.ts, DemosPage, AIChatPage) to change how demos and AI chat links are built.

Suggested reviewers

  • Sherry-hue
  • HuJean
  • fzx2666-fz

Poem

🐰 Two protocols now dance in hash, 🎭
Where a2ui and openui clash,
With protocol objects, routes and names,
The playground embraces new routing games,
Scenarios render in full or phone's frame,
And QR codes join the protocol's fame! 📱✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(genui/playground): introduce OpenUI' directly matches the main objective of this PR, which is to introduce OpenUI support into the genui/playground module.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/introduce-openui

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

❤️ Share

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

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 6, 2026

⚠️ No Changeset found

Latest commit: f65bb7d

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

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

Click here to learn what changesets are, and how to add one.

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

@codecov
Copy link
Copy Markdown

codecov Bot commented May 6, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented May 6, 2026

Merging this PR will degrade performance by 16.22%

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

❌ 1 regressed benchmark
✅ 80 untouched benchmarks
⏩ 26 skipped benchmarks1

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Benchmark BASE HEAD Efficiency
008-many-use-state-destroyBackground 8 ms 9.5 ms -16.22%

Comparing feat/introduce-openui (f65bb7d) with main (dcd0b98)2

Open in CodSpeed

Footnotes

  1. 26 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

  2. No successful run was found on main (736ba38) during the generation of this report, so dcd0b98 was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

@relativeci
Copy link
Copy Markdown

relativeci Bot commented May 6, 2026

React External

#1040 Bundle Size — 690.27KiB (0%).

f65bb7d(current) vs dcd0b98 main#1010(baseline)

Bundle metrics  no changes
                 Current
#1040
     Baseline
#1010
No change  Initial JS 0B 0B
No change  Initial CSS 0B 0B
No change  Cache Invalidation 0% 0%
No change  Chunks 0 0
No change  Assets 3 3
No change  Modules 17 17
No change  Duplicate Modules 5 5
No change  Duplicate Code 8.59% 8.59%
No change  Packages 0 0
No change  Duplicate Packages 0 0
Bundle size by type  no changes
                 Current
#1040
     Baseline
#1010
No change  Other 690.27KiB 690.27KiB

Bundle analysis reportBranch feat/introduce-openuiProject dashboard


Generated by RelativeCIDocumentationReport issue

@relativeci
Copy link
Copy Markdown

relativeci Bot commented May 6, 2026

React Example

#7925 Bundle Size — 235.77KiB (0%).

f65bb7d(current) vs dcd0b98 main#7895(baseline)

Bundle metrics  no changes
                 Current
#7925
     Baseline
#7895
No change  Initial JS 0B 0B
No change  Initial CSS 0B 0B
No change  Cache Invalidation 0% 0%
No change  Chunks 0 0
No change  Assets 4 4
No change  Modules 197 197
No change  Duplicate Modules 80 80
No change  Duplicate Code 44.85% 44.85%
No change  Packages 2 2
No change  Duplicate Packages 0 0
Bundle size by type  no changes
                 Current
#7925
     Baseline
#7895
No change  IMG 145.76KiB 145.76KiB
No change  Other 90.01KiB 90.01KiB

Bundle analysis reportBranch feat/introduce-openuiProject dashboard


Generated by RelativeCIDocumentationReport issue

@relativeci
Copy link
Copy Markdown

relativeci Bot commented May 6, 2026

React MTF Example

#1055 Bundle Size — 206.69KiB (0%).

f65bb7d(current) vs dcd0b98 main#1025(baseline)

Bundle metrics  no changes
                 Current
#1055
     Baseline
#1025
No change  Initial JS 0B 0B
No change  Initial CSS 0B 0B
No change  Cache Invalidation 0% 0%
No change  Chunks 0 0
No change  Assets 3 3
No change  Modules 192 192
No change  Duplicate Modules 77 77
No change  Duplicate Code 44.36% 44.36%
No change  Packages 2 2
No change  Duplicate Packages 0 0
Bundle size by type  no changes
                 Current
#1055
     Baseline
#1025
No change  IMG 111.23KiB 111.23KiB
No change  Other 95.46KiB 95.46KiB

Bundle analysis reportBranch feat/introduce-openuiProject dashboard


Generated by RelativeCIDocumentationReport issue

@relativeci
Copy link
Copy Markdown

relativeci Bot commented May 6, 2026

Web Explorer

#9497 Bundle Size — 900.02KiB (0%).

f65bb7d(current) vs dcd0b98 main#9467(baseline)

Bundle metrics  no changes
                 Current
#9497
     Baseline
#9467
No change  Initial JS 44.46KiB 44.46KiB
No change  Initial CSS 2.22KiB 2.22KiB
No change  Cache Invalidation 0% 0%
No change  Chunks 9 9
No change  Assets 11 11
No change  Modules 229 229
No change  Duplicate Modules 11 11
No change  Duplicate Code 27.28% 27.28%
No change  Packages 10 10
No change  Duplicate Packages 0 0
Bundle size by type  no changes
                 Current
#9497
     Baseline
#9467
No change  JS 495.88KiB 495.88KiB
No change  Other 401.92KiB 401.92KiB
No change  CSS 2.22KiB 2.22KiB

Bundle analysis reportBranch feat/introduce-openuiProject dashboard


Generated by RelativeCIDocumentationReport issue

@relativeci
Copy link
Copy Markdown

relativeci Bot commented May 6, 2026

React Example with Element Template

#190 Bundle Size — 197.77KiB (-0.54%).

f65bb7d(current) vs dcd0b98 main#160(baseline)

Bundle metrics  Change 3 changes
                 Current
#190
     Baseline
#160
No change  Initial JS 0B 0B
No change  Initial CSS 0B 0B
Change  Cache Invalidation 26.7% 0%
No change  Chunks 0 0
No change  Assets 4 4
Change  Modules 79(+1.28%) 78
No change  Duplicate Modules 23 23
Change  Duplicate Code 40.42%(+0.22%) 40.33%
No change  Packages 2 2
No change  Duplicate Packages 0 0
Bundle size by type  Change 1 change Improvement 1 improvement
                 Current
#190
     Baseline
#160
No change  IMG 145.76KiB 145.76KiB
Improvement  Other 52.01KiB (-2.02%) 53.08KiB

Bundle analysis reportBranch feat/introduce-openuiProject dashboard


Generated by RelativeCIDocumentationReport issue

@gaoachao gaoachao force-pushed the feat/introduce-openui branch from 1c125c3 to 5dcfa19 Compare May 7, 2026 03:31
@gaoachao gaoachao force-pushed the feat/introduce-openui branch from ebbd89a to c89b2f8 Compare May 8, 2026 09:56
@gaoachao gaoachao changed the title feat(genui): introduce OpenUI feat(genui/playground): introduce OpenUI May 8, 2026
@gaoachao gaoachao marked this pull request as ready for review May 8, 2026 10:03
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (3)
packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx (3)

53-66: ⚡ Quick win

buildOpenUIRenderUrl bypasses src/utils/renderUrl.ts, violating the project coding guideline.

The guideline for packages/genui/a2ui-playground/src/**/*.tsx states: "The web preview must encode the initData payload as base64 in the render URL using the utility in src/utils/renderUrl.ts." This local function builds the render URL directly and passes rawText as a plain query string instead of using the shared utility.

If renderUrl.ts doesn't yet support OpenUI's rawText format, the right path is to extend it (e.g., add a rawText option) so this page can go through the same utility. As per coding guidelines, the playground's web preview encoding should be centralised in src/utils/renderUrl.ts.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx` around lines 53
- 66, buildOpenUIRenderUrl builds the render URL directly and passes rawText as
a plain query param, violating the guideline to centralize web preview encoding
in src/utils/renderUrl.ts; update the shared utility to accept a rawText (or
initData.rawText) option that base64-encodes the payload and returns the proper
render URL, then replace usage of buildOpenUIRenderUrl in OpenUIDemosPage.tsx
with a call to that utility (keep the same protocol/openui and speed handling
via the utility options) and remove the local buildOpenUIRenderUrl function.

130-152: ⚡ Quick win

Dead sequence-counter code should be removed.

lynxUrlSeqRef and seq are copied from DemosPage.tsx, where they guard against stale async callbacks (the /__a2ui_payload POST). There is no async callback in doRender here, so the counter is never actually checked and void seq merely silences the linter. This misleading pattern should be removed.

🧹 Proposed cleanup
-  const lynxUrlSeqRef = useRef(0);
+  // (no payload-store async path, so no sequence ref needed)
   ...
   const doRender = useCallback(
     (rawText: string) => {
       const url = buildOpenUIRenderUrl(rawText, networkBaseUrl, speed);
       setRenderUrl(url);
 
-      // Native Lynx dev URL
-      const seq = ++lynxUrlSeqRef.current;
+      // Native Lynx dev URL
       if (rspeedyDevUrl) {
         ...
-      void seq; // suppress unused warning
       }
     },
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx` around lines
130 - 152, Remove the dead sequence-counter pattern: in doRender (or the effect
shown) delete the increment and local var (const seq = ++lynxUrlSeqRef.current),
the unused void seq statement, and any remaining references to lynxUrlSeqRef; if
lynxUrlSeqRef becomes unused elsewhere in this module, remove its
declaration/import as well so there’s no misleading stale-callback guard left in
OpenUIDemosPage.tsx.

21-51: ⚡ Quick win

useRspeedyDevUrl and formatUrlForDisplay are duplicated from DemosPage.tsx.

Both functions are byte-for-byte identical to their counterparts in DemosPage.tsx (lines 39–62 and 31–37 respectively). Any future change to the URL-fetching logic or display truncation must now be made in two places.

Consider extracting them into shared utility modules, e.g. src/hooks/useRspeedyDevUrl.ts and src/utils/urlDisplay.ts.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx` around lines 21
- 51, These two functions (useRspeedyDevUrl and formatUrlForDisplay) are
duplicated; extract useRspeedyDevUrl into a shared hook (e.g., a new
useRspeedyDevUrl hook) and extract formatUrlForDisplay into a shared utility
(e.g., url display util), replace the local definitions in OpenUIDemosPage.tsx
and DemosPage.tsx with imports from those new modules, and ensure the hook
preserves the same behavior (state, effect, fetch to '/__rspeedy_url',
cancellation flag) and the util preserves the same truncation logic (44-char
head, 24-char tail, ellipsis when >80 chars).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/genui/a2ui-playground/lynx.config.ts`:
- Around line 22-26: The source.entry in lynx.config.ts is missing an entry for
OpenUI so the build never emits openui.web.js/openui.lynx.js; update
source.entry to include openui by adding an entry key like openui:
'./lynx-src/openui/index.tsx' (or alternatively confirm that OpenUI should reuse
the a2ui bundle and then update DEFAULT_OPENUI_DEMO_URL and
OpenUIDemosPage/OpenUIComponentsPage references to point at the a2ui bundle) so
that the OpenUI bundles are generated and <lynx-view url="./openui.web.js"> can
load at runtime.

In `@packages/genui/a2ui-playground/src/App.tsx`:
- Around line 149-154: The <select> for protocol lacks a programmatic label; add
an explicit association by either wrapping the text element with a <label> that
has htmlFor matching a new id on the select (e.g., give the select an id like
"protocolSelect" and use the existing protocolLabel as a <label
htmlFor="protocolSelect">) or add an aria-label/aria-labelledby to the select;
update the JSX around the protocolLabel/protocolSelect elements and keep
handleProtocolSelect and ProtocolName usage unchanged so the control remains
accessible to assistive tech.
- Around line 62-67: The current route resolution in App.tsx returns { protocol,
tab: 'create' } whenever rest[0] === 'chat' || rest[0] === 'create', which still
allows `#/openui/create` to produce an invalid tab; update the branch so that when
protocol.name === 'openui' you return { protocol, tab: 'examples' } instead of
'create' (i.e., when handling rest[0] === 'create' or 'chat', first check
protocol.name === 'openui' and normalize to 'examples'), ensuring the final
return and this conditional both map OpenUI to the 'examples' tab.

In `@packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx`:
- Around line 131-142: The pathname substitution using
u.pathname.replace('a2ui.lynx','openui.lynx') is fragile and can leave the URL
pointing to the wrong bundle; update the logic in OpenUIDemosPage.tsx where
rspeedyDevUrl is parsed: perform a safe replacement using the full segment (e.g.
'/a2ui.lynx') or test with a regex/wildcard to avoid partial matches, detect
whether the replace actually changed the pathname, and if it did not, either
construct the correct pathname by appending or replacing the final path segment
with '/openui.lynx' (or clear lynxDevUrl) before calling setLynxDevUrl;
reference variables/functions: rspeedyDevUrl, u.pathname, setLynxDevUrl.

In `@packages/genui/a2ui-playground/src/utils/renderUrl.ts`:
- Line 20: The protocol value sent by buildRenderUrl uses init.protocol.name
(e.g., 'a2ui' or 'openui') but render.tsx still checks for '0.9', causing
initData.protocol to be parsed as undefined; update the parsing logic in
render.tsx (where it computes protocolValue / initData.protocol) to accept
'a2ui' and 'openui' in addition to '0.9' (e.g., treat 'a2ui'|'openui'|'0.9' as
the legacy '0.9' value) or remove the protocol query param emitted by
buildRenderUrl (the url.searchParams.set('protocol', init.protocol.name) call)
if initData.protocol remains unused—modify either buildRenderUrl or render.tsx
accordingly, referencing buildRenderUrl and render.tsx (protocolValue /
initData.protocol) to keep formats consistent.

---

Nitpick comments:
In `@packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx`:
- Around line 53-66: buildOpenUIRenderUrl builds the render URL directly and
passes rawText as a plain query param, violating the guideline to centralize web
preview encoding in src/utils/renderUrl.ts; update the shared utility to accept
a rawText (or initData.rawText) option that base64-encodes the payload and
returns the proper render URL, then replace usage of buildOpenUIRenderUrl in
OpenUIDemosPage.tsx with a call to that utility (keep the same protocol/openui
and speed handling via the utility options) and remove the local
buildOpenUIRenderUrl function.
- Around line 130-152: Remove the dead sequence-counter pattern: in doRender (or
the effect shown) delete the increment and local var (const seq =
++lynxUrlSeqRef.current), the unused void seq statement, and any remaining
references to lynxUrlSeqRef; if lynxUrlSeqRef becomes unused elsewhere in this
module, remove its declaration/import as well so there’s no misleading
stale-callback guard left in OpenUIDemosPage.tsx.
- Around line 21-51: These two functions (useRspeedyDevUrl and
formatUrlForDisplay) are duplicated; extract useRspeedyDevUrl into a shared hook
(e.g., a new useRspeedyDevUrl hook) and extract formatUrlForDisplay into a
shared utility (e.g., url display util), replace the local definitions in
OpenUIDemosPage.tsx and DemosPage.tsx with imports from those new modules, and
ensure the hook preserves the same behavior (state, effect, fetch to
'/__rspeedy_url', cancellation flag) and the util preserves the same truncation
logic (44-char head, 24-char tail, ellipsis when >80 chars).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2e044444-27fa-49bc-a257-5abbc7e0df89

📥 Commits

Reviewing files that changed from the base of the PR and between 736ba38 and f65bb7d.

📒 Files selected for processing (20)
  • .github/a2ui-catalog.instructions.md
  • packages/genui/a2ui-playground/lynx-src/a2ui/App.tsx
  • packages/genui/a2ui-playground/lynx-src/a2ui/index.css
  • packages/genui/a2ui-playground/lynx-src/a2ui/index.tsx
  • packages/genui/a2ui-playground/lynx.config.ts
  • packages/genui/a2ui-playground/src/App.tsx
  • packages/genui/a2ui-playground/src/componentCatalog.ts
  • packages/genui/a2ui-playground/src/components/ProtocolSwitch.tsx
  • packages/genui/a2ui-playground/src/mock/openui-scenarios.ts
  • packages/genui/a2ui-playground/src/pages/AIChatPage.tsx
  • packages/genui/a2ui-playground/src/pages/ComponentsPage.tsx
  • packages/genui/a2ui-playground/src/pages/DemosPage.tsx
  • packages/genui/a2ui-playground/src/pages/Home.tsx
  • packages/genui/a2ui-playground/src/pages/OpenUIComponentsPage.tsx
  • packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx
  • packages/genui/a2ui-playground/src/render.tsx
  • packages/genui/a2ui-playground/src/styles.css
  • packages/genui/a2ui-playground/src/utils/demoUrl.ts
  • packages/genui/a2ui-playground/src/utils/protocol.ts
  • packages/genui/a2ui-playground/src/utils/renderUrl.ts

Comment thread packages/genui/a2ui-playground/lynx.config.ts
Comment thread packages/genui/a2ui-playground/src/App.tsx
Comment thread packages/genui/a2ui-playground/src/App.tsx
Comment thread packages/genui/a2ui-playground/src/pages/OpenUIDemosPage.tsx
Comment thread packages/genui/a2ui-playground/src/utils/renderUrl.ts
@gaoachao gaoachao merged commit 5b6a33d into main May 8, 2026
112 of 117 checks passed
@gaoachao gaoachao deleted the feat/introduce-openui branch May 8, 2026 12:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants