Daily RC#478
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
WalkthroughAdds Docusaurus sitemap configs and blog dev script, new editor WG docs, a UI constant and viewport-driven resize-handle visibility gating, several sidecontrol button-size tweaks and corner-radius preset UI, and preserves the editor webfont list during reset. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes
Possibly related PRs
Suggested labels
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✨ 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 |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (2)
editor/scaffolds/sidecontrol/controls/corner-radius.tsx (1)
193-218: Consider specifying radix forparseInt.On line 196,
parseInt(_v)is called without specifying the radix parameter. While the value will always be a numeric string from the preset, explicitly specifying radix 10 is a safer practice.🔎 Suggested fix
onValueChange={(_v) => { - const value = parseInt(_v); + const value = parseInt(_v, 10); handleUniformChange(value); }}editor/grida-canvas/ASSERTIONS.md (1)
45-47: Minor grammar suggestion from static analysis.Consider hyphenating compound adjectives for better readability:
- "single node selections" → "single-node selections"
- "multiple node selection groups" → "multiple-node selection groups"
This is a minor stylistic improvement and doesn't affect the clarity of the assertion.
🔎 Proposed fix
-This behavior applies to both single node selections and multiple node selection groups, ensuring consistent interaction patterns across all selection types. +This behavior applies to both single-node selections and multiple-node selection groups, ensuring consistent interaction patterns across all selection types.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (3)
apps/blog/static/img/navbar-logo-dark.svgis excluded by!**/*.svgapps/blog/static/img/navbar-logo.svgis excluded by!**/*.svgpnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (17)
apps/blog/docusaurus.config.ts(2 hunks)apps/blog/package.json(2 hunks)apps/docs/docusaurus.config.ts(1 hunks)docs/wg/feat-editor/index.md(1 hunks)docs/wg/feat-editor/ux-surface/index.md(1 hunks)docs/wg/feat-editor/ux-surface/selection.md(1 hunks)editor/grida-canvas-react/ui-config.ts(1 hunks)editor/grida-canvas-react/viewport/surface.tsx(5 hunks)editor/grida-canvas/ASSERTIONS.md(1 hunks)editor/scaffolds/sidecontrol/chunks/chunk-paints.tsx(1 hunks)editor/scaffolds/sidecontrol/chunks/scale-tool.tsx(1 hunks)editor/scaffolds/sidecontrol/controls/blend-mode.tsx(1 hunks)editor/scaffolds/sidecontrol/controls/color-picker.tsx(1 hunks)editor/scaffolds/sidecontrol/controls/corner-radius.tsx(2 hunks)editor/scaffolds/sidecontrol/controls/font-size.tsx(1 hunks)editor/scaffolds/sidecontrol/sidecontrol-document-properties.tsx(2 hunks)editor/scaffolds/sidecontrol/sidecontrol-node-selection.tsx(2 hunks)
🧰 Additional context used
📓 Path-based instructions (7)
docs/**/*.md
📄 CodeRabbit inference engine (AGENTS.md)
Documentation source of truth is in the ./docs directory; deployment is handled by apps/docs
Files:
docs/wg/feat-editor/ux-surface/index.mddocs/wg/feat-editor/ux-surface/selection.mddocs/wg/feat-editor/index.md
docs/{wg,reference}/**/*.md
📄 CodeRabbit inference engine (AGENTS.md)
Only actively maintain docs/wg/** and docs/reference/** directories; see docs/AGENTS.md for contribution scope
Files:
docs/wg/feat-editor/ux-surface/index.mddocs/wg/feat-editor/ux-surface/selection.mddocs/wg/feat-editor/index.md
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Use TypeScript 5 as the main language for most apps
Use Lucide or Radix Icons for icons
Files:
editor/scaffolds/sidecontrol/chunks/chunk-paints.tsxeditor/scaffolds/sidecontrol/controls/font-size.tsxapps/docs/docusaurus.config.tseditor/scaffolds/sidecontrol/controls/blend-mode.tsxeditor/grida-canvas-react/ui-config.tseditor/scaffolds/sidecontrol/controls/corner-radius.tsxapps/blog/docusaurus.config.tseditor/scaffolds/sidecontrol/controls/color-picker.tsxeditor/scaffolds/sidecontrol/chunks/scale-tool.tsxeditor/scaffolds/sidecontrol/sidecontrol-document-properties.tsxeditor/scaffolds/sidecontrol/sidecontrol-node-selection.tsxeditor/grida-canvas-react/viewport/surface.tsx
**/*.{jsx,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
Use React.js 19 for web applications
Files:
editor/scaffolds/sidecontrol/chunks/chunk-paints.tsxeditor/scaffolds/sidecontrol/controls/font-size.tsxeditor/scaffolds/sidecontrol/controls/blend-mode.tsxeditor/scaffolds/sidecontrol/controls/corner-radius.tsxeditor/scaffolds/sidecontrol/controls/color-picker.tsxeditor/scaffolds/sidecontrol/chunks/scale-tool.tsxeditor/scaffolds/sidecontrol/sidecontrol-document-properties.tsxeditor/scaffolds/sidecontrol/sidecontrol-node-selection.tsxeditor/grida-canvas-react/viewport/surface.tsx
{editor/**/*.{ts,tsx},packages/grida-canvas-*/**/*.{ts,tsx}}
📄 CodeRabbit inference engine (AGENTS.md)
Use DOM (plain DOM as canvas) for website builder canvas, bound with React
Files:
editor/scaffolds/sidecontrol/chunks/chunk-paints.tsxeditor/scaffolds/sidecontrol/controls/font-size.tsxeditor/scaffolds/sidecontrol/controls/blend-mode.tsxeditor/grida-canvas-react/ui-config.tseditor/scaffolds/sidecontrol/controls/corner-radius.tsxeditor/scaffolds/sidecontrol/controls/color-picker.tsxeditor/scaffolds/sidecontrol/chunks/scale-tool.tsxeditor/scaffolds/sidecontrol/sidecontrol-document-properties.tsxeditor/scaffolds/sidecontrol/sidecontrol-node-selection.tsxeditor/grida-canvas-react/viewport/surface.tsx
editor/scaffolds/**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
Use /editor/scaffolds for feature-specific larger components, pages, and editors
Files:
editor/scaffolds/sidecontrol/chunks/chunk-paints.tsxeditor/scaffolds/sidecontrol/controls/font-size.tsxeditor/scaffolds/sidecontrol/controls/blend-mode.tsxeditor/scaffolds/sidecontrol/controls/corner-radius.tsxeditor/scaffolds/sidecontrol/controls/color-picker.tsxeditor/scaffolds/sidecontrol/chunks/scale-tool.tsxeditor/scaffolds/sidecontrol/sidecontrol-document-properties.tsxeditor/scaffolds/sidecontrol/sidecontrol-node-selection.tsx
editor/grida-*/**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
Use /editor/grida-* directories to isolate domain-specific modules; promote well-defined modules to /packages
Files:
editor/grida-canvas-react/ui-config.tseditor/grida-canvas-react/viewport/surface.tsx
🧠 Learnings (15)
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/main.rs : Update `grida-canvas-wasm.d.ts` TypeScript definitions file when new APIs are introduced via `main.rs`
Applied to files:
docs/wg/feat-editor/ux-surface/index.mdeditor/grida-canvas-react/ui-config.tseditor/grida-canvas-react/viewport/surface.tsx
📚 Learning: 2025-12-01T00:22:56.899Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: editor/app/(tools)/tools/halftone/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:56.899Z
Learning: Applies to editor/app/(tools)/tools/halftone/app/(tools)/tools/halftone/_page.tsx : When adding new shape types, update the Shape type union, add cases in drawShape() function, add cases in shapeToSVG() function, and add SelectItem in UI
Applied to files:
editor/scaffolds/sidecontrol/chunks/chunk-paints.tsxeditor/scaffolds/sidecontrol/controls/blend-mode.tsxeditor/scaffolds/sidecontrol/controls/corner-radius.tsxeditor/scaffolds/sidecontrol/controls/color-picker.tsxeditor/scaffolds/sidecontrol/chunks/scale-tool.tsxeditor/scaffolds/sidecontrol/sidecontrol-node-selection.tsxeditor/grida-canvas-react/viewport/surface.tsx
📚 Learning: 2025-12-01T00:22:56.899Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: editor/app/(tools)/tools/halftone/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:56.899Z
Learning: Applies to editor/app/(tools)/tools/halftone/app/(tools)/tools/halftone/_page.tsx : When adding new parameters to the halftone tool, add state with useState, include in useEffect dependency array, pass to renderHalftone() function, use in rendering logic, and add UI control
Applied to files:
editor/scaffolds/sidecontrol/chunks/chunk-paints.tsxeditor/scaffolds/sidecontrol/controls/corner-radius.tsxeditor/scaffolds/sidecontrol/chunks/scale-tool.tsx
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: For development and testing, use `just dev` command for debug builds with basic WebGL2 support
Applied to files:
apps/blog/package.json
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Applies to editor/components/ui/**/*.{ts,tsx} : Use /editor/components/ui for shadcn UI components
Applied to files:
editor/scaffolds/sidecontrol/controls/font-size.tsxeditor/scaffolds/sidecontrol/controls/corner-radius.tsxeditor/scaffolds/sidecontrol/sidecontrol-node-selection.tsx
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Applies to packages/grida-canvas-*/**/*.{ts,tsx,js,jsx} : Packages under /packages/grida-canvas-* power the canvas; some are published to npm, refer to individual package README
Applied to files:
editor/grida-canvas-react/ui-config.tseditor/grida-canvas-react/viewport/surface.tsx
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Applies to **/*.{ts,tsx} : Use Lucide or Radix Icons for icons
Applied to files:
editor/scaffolds/sidecontrol/controls/corner-radius.tsx
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Applies to **/components/ui/**/*.{ts,tsx} : Use Shadcn UI for UI component library
Applied to files:
editor/scaffolds/sidecontrol/controls/corner-radius.tsxeditor/scaffolds/sidecontrol/sidecontrol-node-selection.tsx
📚 Learning: 2025-12-01T00:22:56.899Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: editor/app/(tools)/tools/halftone/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:56.899Z
Learning: Applies to editor/app/(tools)/tools/halftone/app/(tools)/tools/halftone/_page.tsx : Use React hooks for state management (imageSrc, shape, grid, maxRadius, gamma, jitter, opacity, color, customShapeImage, imageDataRef, sizeRef)
Applied to files:
editor/scaffolds/sidecontrol/controls/corner-radius.tsxeditor/scaffolds/sidecontrol/chunks/scale-tool.tsxeditor/grida-canvas-react/viewport/surface.tsx
📚 Learning: 2025-12-14T23:30:50.384Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: docs/AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:50.384Z
Learning: Applies to docs/docs/wg/** : Actively maintain and edit documentation in `/docs/wg/**` (working group docs including design notes, architecture, proposals, and WIP)
Applied to files:
docs/wg/feat-editor/index.md
📚 Learning: 2025-12-01T00:22:56.899Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: editor/app/(tools)/tools/halftone/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:56.899Z
Learning: Applies to editor/app/(tools)/tools/halftone/app/(tools)/tools/halftone/_page.tsx : Image input should be automatically scaled down to a maximum of 1024px for performance
Applied to files:
editor/scaffolds/sidecontrol/chunks/scale-tool.tsxeditor/grida-canvas-react/viewport/surface.tsx
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Applies to editor/scaffolds/**/*.{ts,tsx} : Use /editor/scaffolds for feature-specific larger components, pages, and editors
Applied to files:
editor/scaffolds/sidecontrol/sidecontrol-document-properties.tsxeditor/scaffolds/sidecontrol/sidecontrol-node-selection.tsx
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Applies to editor/components/**/*.{ts,tsx} : Use /editor/components for generally reusable components
Applied to files:
editor/scaffolds/sidecontrol/sidecontrol-node-selection.tsx
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Applies to {editor/**/*.{ts,tsx},packages/grida-canvas-*/**/*.{ts,tsx}} : Use DOM (plain DOM as canvas) for website builder canvas, bound with React
Applied to files:
editor/grida-canvas-react/viewport/surface.tsx
📚 Learning: 2025-12-01T00:22:56.899Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: editor/app/(tools)/tools/halftone/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:56.899Z
Learning: Applies to editor/app/(tools)/tools/halftone/app/(tools)/tools/halftone/_page.tsx : Cache ImageData and dimensions in refs (imageDataRef, sizeRef) for efficient exports
Applied to files:
editor/grida-canvas-react/viewport/surface.tsx
🧬 Code graph analysis (2)
editor/scaffolds/sidecontrol/controls/corner-radius.tsx (2)
editor/scaffolds/sidecontrol/ui/number.tsx (1)
InputPropertyNumber(127-246)editor/components/ui/select.tsx (3)
Select(177-177)SelectContent(178-178)SelectItem(180-180)
editor/grida-canvas-react/viewport/surface.tsx (1)
editor/grida-canvas-react/ui-config.ts (1)
MIN_NODE_OVERLAY_RESIZE_HANDLES_VISIBLE_UI_SIZE(50-50)
🪛 LanguageTool
editor/grida-canvas/ASSERTIONS.md
[grammar] ~47-~47: Use a hyphen to join words.
Context: ...es. This behavior applies to both single node selections and multiple node select...
(QB_NEW_EN_HYPHEN)
[grammar] ~47-~47: Use a hyphen to join words.
Context: ...both single node selections and multiple node selection groups, ensuring consiste...
(QB_NEW_EN_HYPHEN)
docs/wg/feat-editor/ux-surface/selection.md
[style] ~23-~23: This phrase is redundant. Consider writing “space”.
Context: ...hanges (deferred to click) - Clicking empty space within the overlay clears selection (de...
(EMPTY_HOLE)
[style] ~55-~55: This phrase is redundant. Consider writing “space”.
Context: ... Shift) → adds to selection - Target is empty space (without Shift) → clears selection **R...
(EMPTY_HOLE)
[style] ~76-~76: This phrase is redundant. Consider writing “Space”.
Context: ..., selection changes ## Test Cases ### Empty Space Click Scenario: User clicks on emp...
(EMPTY_HOLE)
[style] ~78-~78: This phrase is redundant. Consider writing “space”.
Context: ...ace Click Scenario: User clicks on empty space (no target node) without Shift key. **...
(EMPTY_HOLE)
[style] ~160-~160: This phrase is redundant. Consider writing “Space”.
Context: ...rom drag intent. ### Multi-Selection - Empty Space Drag Within Overlay Scenario: - T...
(EMPTY_HOLE)
[style] ~165-~165: This phrase is redundant. Consider writing “space”.
Context: ... overlay - User presses pointer down on empty space within the selection overlay bounds (no...
(EMPTY_HOLE)
[style] ~174-~174: This phrase is redundant. Consider writing “space”.
Context: ...e selection group, not clear selection. Empty space within the overlay bounds is part of th...
(EMPTY_HOLE)
[style] ~176-~176: This phrase is redundant. Consider writing “Space”.
Context: ...election region. ### Multi-Selection - Empty Space Click Within Overlay Scenario: - ...
(EMPTY_HOLE)
[style] ~181-~181: This phrase is redundant. Consider writing “space”.
Context: ...roup overlay - User clicks (no drag) on empty space within the selection overlay bounds (no...
(EMPTY_HOLE)
[style] ~188-~188: This phrase is redundant. Consider writing “space”.
Context: ...ointerdown + pointerup without drag) on empty space is a clear intent to clear selection, e...
(EMPTY_HOLE)
[style] ~198-~198: This phrase is redundant. Consider writing “space”.
Context: ... node (with Shift) → add to selection - Empty space outside selection overlay (no Shift) → ...
(EMPTY_HOLE)
[style] ~205-~205: This phrase is redundant. Consider writing “space”.
Context: ...d node(s) → defer reset to that child - Empty space within selection overlay (no Shift) → d...
(EMPTY_HOLE)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: cargo test
🔇 Additional comments (22)
editor/scaffolds/sidecontrol/chunks/scale-tool.tsx (1)
184-184: LGTM: Button size standardization.The change from
size="xs"tosize="icon"aligns with the UI consistency updates across the sidecontrol components.editor/scaffolds/sidecontrol/controls/color-picker.tsx (1)
68-68: LGTM: Consistent button sizing.The eye dropper button now uses
size="icon", matching the UI standardization pattern across the PR.editor/scaffolds/sidecontrol/sidecontrol-document-properties.tsx (1)
171-171: LGTM: Icon button sizing updates.Both the gear and trash icon buttons now use
size="icon", maintaining consistency with the broader UI standardization effort.Also applies to: 191-191
editor/scaffolds/sidecontrol/controls/blend-mode.tsx (1)
152-152: LGTM: Blend mode trigger button sizing.The button size update to
size="icon"is consistent with the UI improvements across sidecontrol components.editor/scaffolds/sidecontrol/controls/font-size.tsx (1)
23-23: LGTM: Layout adjustment for responsive sizing.Adding
flex-1to the wrapper enables the font size control to grow and fill available space, improving the responsive layout behavior.apps/docs/docusaurus.config.ts (1)
147-152: LGTM: Sitemap configuration added.The sitemap configuration follows Docusaurus conventions with sensible defaults (weekly updates, 0.5 priority, date-based lastmod). Excluding
/tags/**is a standard practice to avoid indexing tag archive pages.editor/scaffolds/sidecontrol/sidecontrol-node-selection.tsx (1)
1532-1532: LGTM: Icon button sizing in text and effects sections.Both the SectionText dropdown trigger and SectionEffects add button now use
size="icon", completing the UI consistency updates across the sidecontrol scaffolds.Also applies to: 1844-1844
apps/blog/package.json (1)
8-8: LGTM: Dev script and sitemap plugin added.The
devscript provides a convenient alias fordocusaurus start, and the@docusaurus/plugin-sitemap@3.7.0dependency correctly matches the Docusaurus core version and supports the sitemap configuration added to the blog site.Also applies to: 20-20
docs/wg/feat-editor/ux-surface/selection.md (1)
1-218: Well-structured selection behavior documentation.This document provides comprehensive coverage of selection interactions, including the important distinction between immediate and deferred selection changes. The test cases effectively illustrate edge cases like child hover during drag and empty space interactions within overlay bounds.
The static analysis warnings about "empty space" being redundant are false positives—"empty space" is standard UX terminology for areas without interactive elements.
apps/blog/docusaurus.config.ts (2)
52-57: Sitemap configuration looks good.The sitemap settings with monthly change frequency and 0.5 priority are reasonable defaults. Excluding
/tags/**and/page/**from the sitemap is appropriate for pagination and tag listing pages.
66-70: Logo assets confirmed to exist. Thenavbar-logo.svgandnavbar-logo-dark.svgfiles are present inapps/blog/static/img/and match the paths referenced in the configuration.editor/scaffolds/sidecontrol/controls/corner-radius.tsx (2)
23-65: Good use of Tailwind-aligned presets.The
twradiusconstant provides a well-documented mapping of Tailwind CSS border-radius values. The reference to the official docs is helpful for maintainability.
200-204: Use the wrappedSelectTriggercomponent from@/components/ui-editor/selectinstead ofSelectPrimitive.SelectTrigger.The code imports the wrapped Select components but bypasses
SelectTriggerin favor of the raw Radix primitive. This loses the intended styling, data attributes, and consistent configuration applied by the wrapper. Use<SelectTrigger asChild>with your custom button to maintain component abstraction.Likely an incorrect or invalid review comment.
editor/scaffolds/sidecontrol/chunks/chunk-paints.tsx (1)
392-394: LGTM!The button size change from
"xs"to"icon"aligns with the broader UI standardization across sidecontrol components mentioned in the PR summary.docs/wg/feat-editor/ux-surface/index.md (1)
1-23: LGTM!This index file clearly defines the scope and purpose of the UX Surface documentation. The structure follows good documentation practices with explicit in-scope/out-of-scope boundaries. As per coding guidelines, the
docs/wg/**directory is actively maintained, making this the appropriate location for this content.docs/wg/feat-editor/index.md (1)
1-23: LGTM!Clear and well-structured working group documentation. The scope definition and characteristics align well with the practical UX focus described in the accompanying code changes. Based on learnings, this is the appropriate location for actively maintained working group documentation.
editor/grida-canvas-react/ui-config.ts (1)
35-50: LGTM!Well-documented constant with clear JSDoc explaining the calculation rationale. The threshold of 12px is appropriately small to allow resize handles on most visible nodes while hiding them for very thin elements where translate-drag should take priority.
editor/grida-canvas-react/viewport/surface.tsx (5)
78-78: LGTM!Import correctly added alongside related ui-config constants.
1050-1055: LGTM!Visibility calculation follows the established pattern in the file. The AND condition (
&&) ensures resize handles are hidden when either dimension is too small, which aligns with the documented behavior for thin nodes like text.
1065-1124: LGTM!All resize handles are correctly wrapped in the visibility conditional. The
DistributeButtonandSizeMeterLabelappropriately remain outside this block as they serve different UX purposes.
1227-1229: LGTM!Visibility calculation is consistent with
SelectionGroupOverlay. The reuse of the same pattern ensures uniform behavior across single and multiple selections.
1290-1290: LGTM!The visibility condition is correctly combined with the existing
is_resizable_nodecheck using short-circuit evaluation.
…es including camera transform and webfontlist
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
.github/workflows/test-crates.yml(1 hunks)
🧰 Additional context used
🧠 Learnings (13)
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/+(grida-canvas-wasm.js|grida-canvas-wasm.wasm) : Include WASM artifacts (`grida-canvas-wasm.js` and `grida-canvas-wasm.wasm`) in git for faster CI builds
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-20T08:11:16.201Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas/AGENTS.md:0-0
Timestamp: 2025-12-20T08:11:16.201Z
Learning: Applies to crates/grida-canvas/**/*.rs : Run `cargo clippy --no-deps --all-targets --all-features` for linting to check style, performance, and correctness suggestions
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-20T08:11:16.201Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas/AGENTS.md:0-0
Timestamp: 2025-12-20T08:11:16.201Z
Learning: Applies to crates/grida-canvas/**/*.rs : Run `cargo fmt` to maintain code formatting standards
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:06.800Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-fonts/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:06.800Z
Learning: Applies to crates/grida-canvas-fonts/**/*.rs : Run all tests with: `cargo test`
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/main.rs : Update `grida-canvas-wasm.d.ts` TypeScript definitions file when new APIs are introduced via `main.rs`
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/Cargo.toml : Set environment variables `CC=emcc`, `CXX=em++`, and `AR=emar` when building Rust code for WebAssembly targets
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/Cargo.toml : Use the target `wasm32-unknown-emscripten` when building Rust code for WebAssembly compilation
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/*.{js,ts,jsx,tsx} : Use Web Workers for heavy graphics operations to improve performance and responsiveness
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Run cargo test for Rust crates testing
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:36.510Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-dev/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:36.510Z
Learning: Applies to crates/grida-dev/grida-dev/Cargo.toml : The `grida-dev` crate is marked `publish = false` and is intended solely for local development workflows and devtools
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:06.800Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-fonts/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:06.800Z
Learning: Applies to crates/grida-canvas-fonts/**/serde_test.rs : Run tests with serde feature using: `cargo test --features serde`
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:36.510Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-dev/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:36.510Z
Learning: Use `cargo run -p grida-dev -- scene <path-or-url>` command to run local `.grida` files or remote scenes through the dev runtime
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:36.510Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-dev/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:36.510Z
Learning: Use `cargo run -p grida-dev -- figma` command with `--file-key`, `--api-key`, and `--scene-index` parameters to fetch and render Figma designs
Applied to files:
.github/workflows/test-crates.yml
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: test
- GitHub Check: build
- GitHub Check: cargo test
| env: | ||
| CARGO_BUILD_JOBS: 2 | ||
| run: cargo test --workspace | ||
| run: cargo test --workspace --exclude grida-canvas-wasm |
There was a problem hiding this comment.
Document the emscripten dependency and verify test coverage.
The grida-canvas-wasm crate requires emscripten environment variables (CC=emcc, CXX=em++, AR=emar) and the wasm32-unknown-emscripten target, which this workflow doesn't configure. The exclusion is justified, but should be documented inline to clarify intent for future maintainers.
Add an explanatory comment above the test command indicating why the crate is excluded, and confirm that separate CI coverage for grida-canvas-wasm exists or document plans to establish it.
🤖 Prompt for AI Agents
.github/workflows/test-crates.yml around line 59: the workflow excludes the
grida-canvas-wasm crate from cargo test but does not document why; add a concise
inline comment immediately above the `run: cargo test --workspace --exclude
grida-canvas-wasm` line stating that grida-canvas-wasm requires an emscripten
build environment (CC=emcc, CXX=em++, AR=emar and the wasm32-unknown-emscripten
target) which is not configured in this runner, and note that the crate is
excluded for that reason; also update the workflow or repository docs to confirm
where CI/test coverage for grida-canvas-wasm runs (or add a TODO linking to a
ticket/plan to add separate CI that sets up emscripten and the wasm target).
…ironment variable
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
.github/workflows/test-crates.yml(1 hunks)Cargo.toml(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- .github/workflows/test-crates.yml
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Applies to editor/app/(www)/**/*.{ts,tsx} : Landing page and SEO-purpose static pages are located in /editor/app/(www) directory; add new webpages here
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: cargo test
- GitHub Check: build
- GitHub Check: test
🔇 Additional comments (1)
Cargo.toml (1)
15-16: LGTM! Good optimization for test performance.Adding
opt-level = 1to the test profile is a solid practice. It speeds up test execution and reduces binary size (helping with CI memory constraints) while preserving debuggability withdebug = 1.
| ] | ||
|
|
||
| # Reduce debug information for tests to lower memory usage during linking in CI | ||
| # opt-level = 1 speeds up compilation while maintaining debuggability |
There was a problem hiding this comment.
Clarify the comment about compilation speed.
The comment states "speeds up compilation" but opt-level = 1 actually increases compilation time slightly. What it does is speed up test execution and reduce binary size, which helps with linking memory usage.
🔎 Suggested comment revision
-# opt-level = 1 speeds up compilation while maintaining debuggability
+# opt-level = 1 speeds up test execution and reduces binary size while maintaining debuggability📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| # opt-level = 1 speeds up compilation while maintaining debuggability | |
| # opt-level = 1 speeds up test execution and reduces binary size while maintaining debuggability |
🤖 Prompt for AI Agents
In Cargo.toml around line 13, the inline comment "opt-level = 1 speeds up
compilation while maintaining debuggability" is inaccurate; update the comment
to state that opt-level = 1 may slightly increase compilation time but improves
runtime (e.g., speeds up test execution), reduces binary size, and lowers linker
memory usage while preserving reasonable debuggability. Replace the existing
sentence with a concise corrected explanation reflecting those effects.
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
.github/workflows/test-crates.yml (1)
68-68: Add inline comment documenting the grida-canvas-wasm exclusion.The exclusion of
grida-canvas-wasmfrom the test run is justified (it requires emscripten environment:CC=emcc,CXX=em++,AR=emarandwasm32-unknown-emscriptentarget), but lacks inline documentation explaining why. This was flagged in a previous review and remains unaddressed.🔎 Suggested fix: Add explanatory comment
- name: Run cargo tests env: FORCE_SKIA_BINARIES_DOWNLOAD: "1" + # grida-canvas-wasm is excluded because it requires emscripten build environment + # (CC=emcc, CXX=em++, AR=emar) and wasm32-unknown-emscripten target. + # See .github/workflows/build-canvas.yml for dedicated WASM build workflow. run: cargo test --workspace --exclude grida-canvas-wasmBased on learnings, grida-canvas-wasm requires specific emscripten configuration.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
.github/workflows/build-canvas.yml(1 hunks).github/workflows/test-crates.yml(2 hunks)
🧰 Additional context used
🧠 Learnings (13)
📓 Common learnings
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Applies to editor/app/(www)/**/*.{ts,tsx} : Landing page and SEO-purpose static pages are located in /editor/app/(www) directory; add new webpages here
📚 Learning: 2025-12-01T00:22:06.800Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-fonts/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:06.800Z
Learning: Applies to crates/grida-canvas-fonts/**/*.rs : Run all tests with: `cargo test`
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/Cargo.toml : Set environment variables `CC=emcc`, `CXX=em++`, and `AR=emar` when building Rust code for WebAssembly targets
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/+(grida-canvas-wasm.js|grida-canvas-wasm.wasm) : Include WASM artifacts (`grida-canvas-wasm.js` and `grida-canvas-wasm.wasm`) in git for faster CI builds
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/Cargo.toml : Use the target `wasm32-unknown-emscripten` when building Rust code for WebAssembly compilation
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-20T08:11:16.201Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas/AGENTS.md:0-0
Timestamp: 2025-12-20T08:11:16.201Z
Learning: Applies to crates/grida-canvas/**/*.rs : Run `cargo clippy --no-deps --all-targets --all-features` for linting to check style, performance, and correctness suggestions
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-20T08:11:16.201Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas/AGENTS.md:0-0
Timestamp: 2025-12-20T08:11:16.201Z
Learning: Applies to crates/grida-canvas/**/*.rs : Run `cargo fmt` to maintain code formatting standards
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/*.{js,ts,jsx,tsx} : Use Web Workers for heavy graphics operations to improve performance and responsiveness
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:19.083Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-wasm/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:19.083Z
Learning: Applies to crates/grida-canvas-wasm/**/main.rs : Update `grida-canvas-wasm.d.ts` TypeScript definitions file when new APIs are introduced via `main.rs`
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Run cargo test for Rust crates testing
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Run cargo check for Rust crates checking
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-01T00:22:06.800Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: crates/grida-canvas-fonts/AGENTS.md:0-0
Timestamp: 2025-12-01T00:22:06.800Z
Learning: Applies to crates/grida-canvas-fonts/**/serde_test.rs : Run tests with serde feature using: `cargo test --features serde`
Applied to files:
.github/workflows/test-crates.yml
📚 Learning: 2025-12-14T23:30:42.112Z
Learnt from: CR
Repo: gridaco/grida PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-14T23:30:42.112Z
Learning: Run cargo clippy --no-deps for Rust crates linting
Applied to files:
.github/workflows/test-crates.yml
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: cargo test
- GitHub Check: build
- GitHub Check: test
🔇 Additional comments (4)
.github/workflows/build-canvas.yml (1)
13-15: LGTM! Concurrency control added.The concurrency block correctly groups runs by workflow and ref, canceling in-progress runs when new commits are pushed. This is a best practice that saves CI resources and provides faster feedback.
.github/workflows/test-crates.yml (3)
12-14: LGTM! Concurrency control added.The concurrency configuration correctly prevents redundant test runs, saving CI resources and providing faster feedback on the latest changes.
62-63: LGTM! Cache key added for better cache isolation.The explicit
key: testhelps differentiate this workflow's cache from other Rust build caches in the repository.
67-67: Verify the necessity of forcing Skia binary downloads.The new
FORCE_SKIA_BINARIES_DOWNLOAD: "1"environment variable suggests a change in how Skia binaries are handled. Confirm whether this was added to resolve a specific CI failure or if it's a preventive measure for reliability.#!/bin/bash # Description: Search for Skia-related dependencies and recent changes # Find Cargo.toml files with skia dependencies echo "=== Crates with Skia dependencies ===" fd Cargo.toml crates/ --exec rg -l 'skia' # Check for FORCE_SKIA_BINARIES_DOWNLOAD usage in codebase echo -e "\n=== Usage of FORCE_SKIA_BINARIES_DOWNLOAD in code ===" rg -n 'FORCE_SKIA_BINARIES_DOWNLOAD' --type rust --type toml # Check recent git history for Skia-related changes echo -e "\n=== Recent Skia-related commits ===" git log --oneline --all -20 --grep="skia" --grep="Skia" -i
| paths: | ||
| - ".github/workflows/*" | ||
| - "crates/*" |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Find all Rust files outside crates/ directory that might be dependencies
echo "=== Rust source files outside crates/ ==="
fd -e rs -E 'crates/**' -E 'target/**' -E 'node_modules/**' -E '.git/**'
echo ""
echo "=== Checking for workspace members in root Cargo.toml ==="
if [ -f Cargo.toml ]; then
cat Cargo.toml | head -50
fi
echo ""
echo "=== Directory structure (top level) ==="
ls -la | grep -E '^d'Repository: gridaco/grida
Length of output: 3542
🏁 Script executed:
#!/bin/bash
# Check if workspace crates reference third_party/usvg
echo "=== Searching for third_party references in workspace crate Cargo.toml files ==="
for crate in crates/grida-canvas crates/grida-canvas-wasm crates/grida-canvas-fonts crates/grida-dev crates/csscascade crates/math2; do
if [ -f "$crate/Cargo.toml" ]; then
echo "--- $crate/Cargo.toml ---"
grep -i "third.party\|usvg" "$crate/Cargo.toml" || echo "No third_party or usvg references found"
fi
done
echo ""
echo "=== Viewing test-crates.yml content ==="
if [ -f ".github/workflows/test-crates.yml" ]; then
cat ".github/workflows/test-crates.yml"
fiRepository: gridaco/grida
Length of output: 2307
Add third_party/usvg/* to path filters.
The path filters exclude third_party/usvg/, which crates/grida-canvas directly depends on. Pull requests that modify only third_party/usvg/ won't trigger this workflow, creating a testing gap for a critical crate dependency.
Update the path filters to:
paths:
- ".github/workflows/*"
- "crates/*"
- "third_party/usvg/*"🤖 Prompt for AI Agents
.github/workflows/test-crates.yml around lines 8 to 10: the workflow path
filters currently include ".github/workflows/*" and "crates/*" but omit
"third_party/usvg/*", which is a direct dependency of crates/grida-canvas;
update the paths array to add "third_party/usvg/*" so the workflow triggers when
that directory changes, ensuring the YAML paths section contains the three
entries ".github/workflows/*", "crates/*", and "third_party/usvg/*".
Summary by CodeRabbit
New Features
Documentation
Style
Chores
✏️ Tip: You can customize this high-level summary in your review settings.