feat(a2ui): refactor theme#2674
Conversation
|
📝 WalkthroughWalkthroughAdds a catalog tab and routing aliases, remaps playground theme overrides to color-focused A2UI tokens, updates many catalog component CSS files to fixed pixel spacing and explicit color tokens, adjusts catalog playground layout and examples, and adds a catalog build step plus maintenance instructions. ChangesA2UI Playground & Catalog Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 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 |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 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/package.json`:
- Line 111: The "build" script in package.json currently chains "build:catalog"
as a shell command which will fail; update the "build" script entry so it
invokes the package script correctly by using the package runner (e.g., change
the invocation to use "pnpm run build:catalog") so that the "build" script runs
"tsc --build" then runs the "build:catalog" script via pnpm rather than
expecting a system executable.
In `@packages/genui/a2ui/styles/catalog/Button.css`:
- Around line 25-27: The .button.ui-active rule currently forces
background-color: var(--a2ui-color-secondary-hover) for all buttons; restrict
this so primary buttons keep their primary pressed color by scoping the rule to
non-primary buttons (e.g., change the selector from .button.ui-active to
.button:not(.primary).ui-active) and add a separate .button.primary.ui-active
rule that preserves or adjusts the primary button's active background (using the
primary hover variable) instead of inheriting the secondary hover color.
In `@packages/genui/a2ui/styles/catalog/Modal.css`:
- Line 20: Replace the hardcoded backdrop color in Modal.css (background-color:
rgba(15, 23, 42, 0.28)) with a theme token so themes can override it; use the
existing token var(--a2ui-color-overlay) or introduce a new token like
--a2ui-modal-backdrop and reference that here (background-color:
var(--a2ui-modal-backdrop)); if you add a new token, also add default values in
the theme/variables place where other --a2ui- tokens are defined and update any
light/dark theme overrides to set the new token.
In `@packages/genui/a2ui/styles/catalog/RadioGroup.css`:
- Around line 72-77: The `.label` rule is currently global and should be scoped
to the radio group component to avoid leaking styles; update the selector in
RadioGroup.css to target the radio-group root (e.g., prefix with the component
root like `.a2ui-radio-group .label` or `.radio-group .label`) so only labels
inside the radio group are affected, and adjust any related markup/class names
in the RadioGroup component if needed to match the new scoped selector.
In `@packages/genui/a2ui/styles/catalog/Tabs.css`:
- Around line 35-36: Replace the foreground token used by .tabs-header-active:
it currently sets color to --a2ui-color-on-secondary while the header background
is transparent; change that to use --a2ui-color-on-surface instead. Update the
CSS rule for .tabs-header-active to reference --a2ui-color-on-surface (and leave
border-bottom-color using --a2ui-color-primary unchanged) so the text color
matches transparent/surface contexts per the design system.
🪄 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: 847d499f-4155-4b94-b5fe-f9ad26b8f77b
📒 Files selected for processing (21)
.github/a2ui-catalog.instructions.mdpackages/genui/a2ui-playground/lynx-src/a2ui/index.csspackages/genui/a2ui-playground/src/catalog/a2ui.tspackages/genui/a2ui/package.jsonpackages/genui/a2ui/src/react/A2UIRenderer.tsxpackages/genui/a2ui/styles/catalog/Button.csspackages/genui/a2ui/styles/catalog/Card.csspackages/genui/a2ui/styles/catalog/CheckBox.csspackages/genui/a2ui/styles/catalog/Column.csspackages/genui/a2ui/styles/catalog/Divider.csspackages/genui/a2ui/styles/catalog/Icon.csspackages/genui/a2ui/styles/catalog/Image.csspackages/genui/a2ui/styles/catalog/List.csspackages/genui/a2ui/styles/catalog/Modal.csspackages/genui/a2ui/styles/catalog/RadioGroup.csspackages/genui/a2ui/styles/catalog/Row.csspackages/genui/a2ui/styles/catalog/Slider.csspackages/genui/a2ui/styles/catalog/Tabs.csspackages/genui/a2ui/styles/catalog/Text.csspackages/genui/a2ui/styles/catalog/TextField.csspackages/genui/a2ui/styles/theme.css
4da3244 to
4201b68
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 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/src/pages/DemosPage.css`:
- Around line 22-27: The .examplePageHeader rule uses width: 100% plus padding
which can cause horizontal overflow; update the .examplePageHeader CSS to avoid
overflow by applying box-sizing: border-box to that selector (or remove the
explicit width: 100%) so the padding is included in the element’s width; modify
the .examplePageHeader style accordingly.
In `@packages/genui/a2ui-playground/src/pages/PlaybackPage.tsx`:
- Around line 322-330: The scenario <select> (className
'playbackScenarioSelect', value scenarioId, onChange handleSelectScenario) lacks
a programmatic label; add an accessible name by either adding an explicit
aria-label (e.g. aria-label="Scenario") on the <select> or by creating a <label>
element tied to the <select> via id/htmlFor and using that visible label text,
ensuring the selector for ALL_SCENARIOS options remains unchanged and the change
is applied where the select is rendered.
🪄 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: 2a19de0e-b040-424d-a753-c0eabb1e56ff
📒 Files selected for processing (28)
.github/a2ui-catalog.instructions.mdpackages/genui/a2ui-playground/lynx-src/a2ui/index.csspackages/genui/a2ui-playground/src/App.tsxpackages/genui/a2ui-playground/src/catalog/a2ui.tspackages/genui/a2ui-playground/src/pages/ComponentsPage.csspackages/genui/a2ui-playground/src/pages/ComponentsPage.tsxpackages/genui/a2ui-playground/src/pages/DemosListPage.tsxpackages/genui/a2ui-playground/src/pages/DemosPage.csspackages/genui/a2ui-playground/src/pages/PlaybackPage.csspackages/genui/a2ui-playground/src/pages/PlaybackPage.tsxpackages/genui/a2ui/package.jsonpackages/genui/a2ui/src/react/A2UIRenderer.tsxpackages/genui/a2ui/styles/catalog/Button.csspackages/genui/a2ui/styles/catalog/Card.csspackages/genui/a2ui/styles/catalog/CheckBox.csspackages/genui/a2ui/styles/catalog/Column.csspackages/genui/a2ui/styles/catalog/Divider.csspackages/genui/a2ui/styles/catalog/Icon.csspackages/genui/a2ui/styles/catalog/Image.csspackages/genui/a2ui/styles/catalog/List.csspackages/genui/a2ui/styles/catalog/Modal.csspackages/genui/a2ui/styles/catalog/RadioGroup.csspackages/genui/a2ui/styles/catalog/Row.csspackages/genui/a2ui/styles/catalog/Slider.csspackages/genui/a2ui/styles/catalog/Tabs.csspackages/genui/a2ui/styles/catalog/Text.csspackages/genui/a2ui/styles/catalog/TextField.csspackages/genui/a2ui/styles/theme.css
✅ Files skipped from review due to trivial changes (4)
- packages/genui/a2ui-playground/src/pages/DemosListPage.tsx
- packages/genui/a2ui/styles/catalog/List.css
- packages/genui/a2ui/src/react/A2UIRenderer.tsx
- .github/a2ui-catalog.instructions.md
4201b68 to
e743c6d
Compare
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/genui/a2ui-playground/src/pages/AIChatPage.tsx (1)
564-592:⚠️ Potential issue | 🟠 Major | ⚡ Quick winTheme toggle does not refresh an already-mounted preview iframe.
themeis included ininitData, but preview updates are only pushed whenpublishPreviewMessagesis invoked by message generation/load paths. Changing theme alone can leave the existing preview in the previous theme.💡 Proposed fix
const publishPreviewMessages = useCallback( (nextMessages: unknown[]) => { if (nextMessages.length === 0) return; @@ [baseUrl, protocol, theme], ); + useEffect(() => { + if (latestPreviewMessagesRef.current.length === 0) return; + publishPreviewMessages(latestPreviewMessagesRef.current); + }, [theme, publishPreviewMessages]); + const handlePreviewLoad = useCallback(() => { publishPreviewMessages(latestPreviewMessagesRef.current); }, [publishPreviewMessages]);🤖 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/AIChatPage.tsx` around lines 564 - 592, The preview iframe doesn't update when only theme changes; add a useEffect that watches theme (and protocol/baseUrl if needed) and, when an existing preview is mounted (check renderUrl/current and latestPreviewMessagesRef.current), build the same initData used in publishPreviewMessages (use protocol, DEFAULT_A2UI_DEMO_URL, messages from latestPreviewMessagesRef.current, theme, instant: true, liveAction: !!threadIdRef.current) and postMessage { type: 'INIT_LYNX_VIEW', data: initData } to previewFrameRef.current.contentWindow so the already-mounted iframe refreshes its theme without needing new messages or remounting.
♻️ Duplicate comments (2)
packages/genui/a2ui/styles/catalog/Button.css (1)
25-27:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winPreserve primary pressed color in the shared active rule.
Line 26 still applies a secondary active background to all buttons, so primary buttons can lose their primary pressed state.
Proposed minimal fix
-.button.ui-active { - background-color: var(--a2ui-color-secondary-hover); +.button:not(.button-primary).ui-active { + background-color: var(--a2ui-color-secondary-hover); transform: translateY(1px); } + +.button-primary.ui-active { + background-color: var(--a2ui-color-primary-hover); +}🤖 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/styles/catalog/Button.css` around lines 25 - 27, The shared rule .button.ui-active currently forces a secondary active background for all buttons; change the stylesheet so the generic .button.ui-active only handles shared properties (e.g., transform) and move or override background-color into specific selectors like .button.ui-secondary.ui-active (set the secondary hover color) and .button.ui-primary.ui-active (set the primary pressed color) so primary buttons keep their primary pressed state while secondary buttons keep the secondary color.packages/genui/a2ui/styles/catalog/Tabs.css (1)
34-36:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winUse a surface-context foreground token for active tab text.
Line 35 uses
--a2ui-color-on-secondaryeven though the tab header is transparent; this should use a surface-context foreground token.Proposed minimal fix
.tabs-header-active { - color: var(--a2ui-color-on-secondary); + color: var(--a2ui-color-on-surface); border-bottom-color: var(--a2ui-color-primary); }🤖 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/styles/catalog/Tabs.css` around lines 34 - 36, The active tab text is using the secondary-context token; update the .tabs-header-active rule to use the surface-context foreground token instead: replace the color value var(--a2ui-color-on-secondary) in the .tabs-header-active selector with the appropriate surface foreground token (e.g. var(--a2ui-color-on-surface) or your project's surface-context token) so the transparent tab header uses the correct foreground token for surface context.
🧹 Nitpick comments (2)
packages/genui/a2ui-playground/src/pages/ComponentsPage.css (1)
145-158: ⚡ Quick winAvoid
transition: allon component cards.Use property-specific transitions (
border-color,box-shadow, optionallytransform) to avoid unintended animated properties and reduce paint churn.Proposed diff
.compGridCard { display: block; padding: 16px; border: 1px solid var(--geist-border); border-radius: var(--geist-radius-lg); background: var(--geist-background); text-decoration: none; - transition: all var(--geist-transition); + transition: + border-color var(--geist-transition), + box-shadow var(--geist-transition); }🤖 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/ComponentsPage.css` around lines 145 - 158, The .compGridCard rule uses a broad "transition: all" which causes unnecessary repaints; replace it with property-specific transitions such as "transition: border-color var(--geist-transition), box-shadow var(--geist-transition)" (and optionally include "transform var(--geist-transition)" if you plan to animate transforms) so only border-color, box-shadow (and transform if needed) are animated; update the .compGridCard CSS declaration and leave the .compGridCard:hover rules unchanged so hover effects animate only the intended properties.packages/genui/a2ui-playground/src/pages/ComponentsPage.tsx (1)
223-230: ⚡ Quick winDeduplicate category grouping logic.
groupedByCategoryis built twice with identical logic. Extract one helper (or compute once in parent and pass down) to prevent drift between sidebar and grid behavior.Proposed direction
+function buildGroupedByCategory(): Map<string, ComponentDoc[]> { + const map = new Map<string, ComponentDoc[]>(); + for (const cat of CATEGORIES) { + const items = COMPONENT_CATALOG.filter((c) => c.category === cat.id); + if (items.length > 0) map.set(cat.id, items); + } + return map; +} ... - const groupedByCategory = useMemo(() => { ... }, []); + const groupedByCategory = useMemo(buildGroupedByCategory, []);Also applies to: 281-288
🤖 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/ComponentsPage.tsx` around lines 223 - 230, The category-grouping logic is duplicated (two instances of the groupedByCategory useMemo); extract a single helper function (e.g., buildGroupedByCategory) that accepts COMPONENT_CATALOG and CATEGORIES and returns a Map<string, ComponentDoc[]>, then replace both useMemo blocks (the groupedByCategory occurrences) to call that helper (or compute it once in the parent and pass it down) so sidebar and grid share the same source of truth.
🤖 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.
Outside diff comments:
In `@packages/genui/a2ui-playground/src/pages/AIChatPage.tsx`:
- Around line 564-592: The preview iframe doesn't update when only theme
changes; add a useEffect that watches theme (and protocol/baseUrl if needed)
and, when an existing preview is mounted (check renderUrl/current and
latestPreviewMessagesRef.current), build the same initData used in
publishPreviewMessages (use protocol, DEFAULT_A2UI_DEMO_URL, messages from
latestPreviewMessagesRef.current, theme, instant: true, liveAction:
!!threadIdRef.current) and postMessage { type: 'INIT_LYNX_VIEW', data: initData
} to previewFrameRef.current.contentWindow so the already-mounted iframe
refreshes its theme without needing new messages or remounting.
---
Duplicate comments:
In `@packages/genui/a2ui/styles/catalog/Button.css`:
- Around line 25-27: The shared rule .button.ui-active currently forces a
secondary active background for all buttons; change the stylesheet so the
generic .button.ui-active only handles shared properties (e.g., transform) and
move or override background-color into specific selectors like
.button.ui-secondary.ui-active (set the secondary hover color) and
.button.ui-primary.ui-active (set the primary pressed color) so primary buttons
keep their primary pressed state while secondary buttons keep the secondary
color.
In `@packages/genui/a2ui/styles/catalog/Tabs.css`:
- Around line 34-36: The active tab text is using the secondary-context token;
update the .tabs-header-active rule to use the surface-context foreground token
instead: replace the color value var(--a2ui-color-on-secondary) in the
.tabs-header-active selector with the appropriate surface foreground token (e.g.
var(--a2ui-color-on-surface) or your project's surface-context token) so the
transparent tab header uses the correct foreground token for surface context.
---
Nitpick comments:
In `@packages/genui/a2ui-playground/src/pages/ComponentsPage.css`:
- Around line 145-158: The .compGridCard rule uses a broad "transition: all"
which causes unnecessary repaints; replace it with property-specific transitions
such as "transition: border-color var(--geist-transition), box-shadow
var(--geist-transition)" (and optionally include "transform
var(--geist-transition)" if you plan to animate transforms) so only
border-color, box-shadow (and transform if needed) are animated; update the
.compGridCard CSS declaration and leave the .compGridCard:hover rules unchanged
so hover effects animate only the intended properties.
In `@packages/genui/a2ui-playground/src/pages/ComponentsPage.tsx`:
- Around line 223-230: The category-grouping logic is duplicated (two instances
of the groupedByCategory useMemo); extract a single helper function (e.g.,
buildGroupedByCategory) that accepts COMPONENT_CATALOG and CATEGORIES and
returns a Map<string, ComponentDoc[]>, then replace both useMemo blocks (the
groupedByCategory occurrences) to call that helper (or compute it once in the
parent and pass it down) so sidebar and grid share the same source of truth.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 26957dfa-515f-4366-ab76-36114576b017
📒 Files selected for processing (29)
.github/a2ui-catalog.instructions.mdpackages/genui/a2ui-playground/lynx-src/a2ui/index.csspackages/genui/a2ui-playground/src/App.tsxpackages/genui/a2ui-playground/src/catalog/a2ui.tspackages/genui/a2ui-playground/src/pages/AIChatPage.tsxpackages/genui/a2ui-playground/src/pages/ComponentsPage.csspackages/genui/a2ui-playground/src/pages/ComponentsPage.tsxpackages/genui/a2ui-playground/src/pages/DemosListPage.tsxpackages/genui/a2ui-playground/src/pages/DemosPage.csspackages/genui/a2ui-playground/src/pages/PlaybackPage.csspackages/genui/a2ui-playground/src/pages/PlaybackPage.tsxpackages/genui/a2ui/package.jsonpackages/genui/a2ui/src/react/A2UIRenderer.tsxpackages/genui/a2ui/styles/catalog/Button.csspackages/genui/a2ui/styles/catalog/Card.csspackages/genui/a2ui/styles/catalog/CheckBox.csspackages/genui/a2ui/styles/catalog/Column.csspackages/genui/a2ui/styles/catalog/Divider.csspackages/genui/a2ui/styles/catalog/Icon.csspackages/genui/a2ui/styles/catalog/Image.csspackages/genui/a2ui/styles/catalog/List.csspackages/genui/a2ui/styles/catalog/Modal.csspackages/genui/a2ui/styles/catalog/RadioGroup.csspackages/genui/a2ui/styles/catalog/Row.csspackages/genui/a2ui/styles/catalog/Slider.csspackages/genui/a2ui/styles/catalog/Tabs.csspackages/genui/a2ui/styles/catalog/Text.csspackages/genui/a2ui/styles/catalog/TextField.csspackages/genui/a2ui/styles/theme.css
✅ Files skipped from review due to trivial changes (7)
- packages/genui/a2ui/src/react/A2UIRenderer.tsx
- .github/a2ui-catalog.instructions.md
- packages/genui/a2ui/styles/catalog/Divider.css
- packages/genui/a2ui/styles/catalog/Row.css
- packages/genui/a2ui-playground/src/pages/PlaybackPage.css
- packages/genui/a2ui-playground/src/catalog/a2ui.ts
- packages/genui/a2ui/styles/catalog/Modal.css
Merging this PR will not alter performance
Comparing Footnotes
|
React External#1606 Bundle Size — 697.9KiB (0%).e743c6d(current) vs 3901c96 main#1601(baseline) Bundle metrics
|
| Current #1606 |
Baseline #1601 |
|
|---|---|---|
0B |
0B |
|
0B |
0B |
|
0% |
0% |
|
0 |
0 |
|
3 |
3 |
|
17 |
17 |
|
5 |
5 |
|
8.59% |
8.59% |
|
0 |
0 |
|
0 |
0 |
Bundle analysis report Branch p/a2ui-theme-refactor Project dashboard
Generated by RelativeCI Documentation Report issue
React MTF Example#1623 Bundle Size — 208.69KiB (0%).e743c6d(current) vs 3901c96 main#1619(baseline) Bundle metrics
|
| Current #1623 |
Baseline #1619 |
|
|---|---|---|
0B |
0B |
|
0B |
0B |
|
0% |
0% |
|
0 |
0 |
|
3 |
3 |
|
195 |
195 |
|
78 |
78 |
|
44.26% |
44.26% |
|
2 |
2 |
|
0 |
0 |
Bundle size by type no changes
| Current #1623 |
Baseline #1619 |
|
|---|---|---|
111.23KiB |
111.23KiB |
|
97.46KiB |
97.46KiB |
Bundle analysis report Branch p/a2ui-theme-refactor Project dashboard
Generated by RelativeCI Documentation Report issue
React Example with Element Template#760 Bundle Size — 204.53KiB (0%).e743c6d(current) vs 3901c96 main#755(baseline) Bundle metrics
|
| Current #760 |
Baseline #755 |
|
|---|---|---|
0B |
0B |
|
0B |
0B |
|
0% |
0% |
|
0 |
0 |
|
4 |
4 |
|
99 |
99 |
|
31 |
31 |
|
39.59% |
39.59% |
|
2 |
2 |
|
0 |
0 |
Bundle size by type no changes
| Current #760 |
Baseline #755 |
|
|---|---|---|
145.76KiB |
145.76KiB |
|
58.78KiB |
58.78KiB |
Bundle analysis report Branch p/a2ui-theme-refactor Project dashboard
Generated by RelativeCI Documentation Report issue
React Example#8490 Bundle Size — 237.74KiB (0%).e743c6d(current) vs 3901c96 main#8486(baseline) Bundle metrics
|
| Current #8490 |
Baseline #8486 |
|
|---|---|---|
0B |
0B |
|
0B |
0B |
|
0% |
0% |
|
0 |
0 |
|
4 |
4 |
|
200 |
200 |
|
81 |
81 |
|
44.76% |
44.76% |
|
2 |
2 |
|
0 |
0 |
Bundle size by type no changes
| Current #8490 |
Baseline #8486 |
|
|---|---|---|
145.76KiB |
145.76KiB |
|
91.98KiB |
91.98KiB |
Bundle analysis report Branch p/a2ui-theme-refactor Project dashboard
Generated by RelativeCI Documentation Report issue
Web Explorer#10065 Bundle Size — 903.53KiB (0%).e743c6d(current) vs 3901c96 main#10060(baseline) Bundle metrics
|
| Current #10065 |
Baseline #10060 |
|
|---|---|---|
45.06KiB |
45.06KiB |
|
2.22KiB |
2.22KiB |
|
0% |
0% |
|
9 |
9 |
|
11 |
11 |
|
231 |
231 |
|
11 |
11 |
|
27.12% |
27.12% |
|
10 |
10 |
|
0 |
0 |
Bundle size by type no changes
| Current #10065 |
Baseline #10060 |
|
|---|---|---|
499.15KiB |
499.15KiB |
|
402.16KiB |
402.16KiB |
|
2.22KiB |
2.22KiB |
Bundle analysis report Branch p/a2ui-theme-refactor Project dashboard
Generated by RelativeCI Documentation Report issue
Summary by CodeRabbit
Documentation
New Features
Chores
Style
Checklist