-
Notifications
You must be signed in to change notification settings - Fork 4
Extensions #385
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Extensions #385
Conversation
updazte branch
revert revert extensions
This comment has been minimized.
This comment has been minimized.
|
⏳ Code review in progress. Analyzing for code quality issues and best practices. You can monitor the review status in the checks section at the bottom of this pull request. Detailed findings will be posted upon completion. Using Amazon Q Developer for GitHubAmazon Q Developer1 is an AI-powered assistant that integrates directly into your GitHub workflow, enhancing your development process with intelligent features for code development, review, and transformation. Slash Commands
FeaturesAgentic Chat Code Review CustomizationYou can create project-specific rules for Amazon Q Developer to follow:
Example rule: FeedbackTo provide feedback on Amazon Q Developer, create an issue in the Amazon Q Developer public repository. For more detailed information, visit the Amazon Q for GitHub documentation. Footnotes
|
🎨 Visual Regression Test ResultsHi @supervoidcoder! Here are the visual comparison results: ✅ No Visual Changes DetectedAll screenshots match the base branch! 🎉 📊 All Screenshots Checked
💡 Tip: Download the artifacts to view detailed before/after comparisons! |
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/ 🧪 Test ResultsESLint: ❌ Found issues
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 136M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. WalkthroughAdds a runtime bridge and defensive stub for Blockly/ScratchBlocks FieldCustom, implements dual extension galleries (TurboWarp and OmniBlocks) with per-gallery fetchers and 750ms timeouts, adds OmniBlocks gallery exports plus a JavaScript V2 extension entry, and introduces an Unsandbox modal and canUnsandbox security manager method. Changes
Sequence DiagramsequenceDiagram
participant UI as Extension Library UI
participant EL as extension-library.jsx
participant TWFetch as fetchLibraryTW
participant OBFetch as fetchLibraryOB
participant TWApi as TurboWarp API
participant OBApi as OmniBlocks API
participant Render as Renderer
rect rgba(200, 220, 255, 0.5)
Note over EL: Dual-Gallery Load Initiated
EL->>EL: Initialize galleryTW & galleryOB state\nStart 750ms timers
end
par TurboWarp Gallery Loading
rect rgba(220, 240, 200, 0.5)
EL->>TWFetch: fetchLibraryTW()
TWFetch->>TWApi: Request TurboWarp extensions
alt TW Success
TWApi-->>TWFetch: Extension data
TWFetch-->>EL: populate galleryTW, clear timeout
else TW Timeout/Error
Note over EL: set galleryTWTimedOut or galleryTWError
end
end
and OmniBlocks Gallery Loading
rect rgba(240, 220, 200, 0.5)
EL->>OBFetch: fetchLibraryOB()
OBFetch->>OBApi: Request OmniBlocks extensions
alt OB Success
OBApi-->>OBFetch: Extension data
OBFetch-->>EL: populate galleryOB, clear timeout
else OB Timeout/Error
Note over EL: set galleryOBTimedOut or galleryOBError
end
end
end
rect rgba(200, 200, 220, 0.5)
Note over EL: Rendering Phase
EL->>Render: Render TW Gallery (or error/loading)
EL->>Render: Render separator
EL->>Render: Render OB Gallery (or error/loading)
Render-->>UI: Display dual galleries with separate error handling
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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 |
🔍 General Code Quality Feedback🔍 Comprehensive Code ReviewConsolidated Feedback
Overall Assessment: The pull request introduces new functionality and enhancements to the extension library, but it also contains several critical issues related to code quality, security, and maintainability that need to be addressed before merging. Critical Issues:
Improvements:
Positive Notes:
Next Steps:
By addressing these issues and suggestions, the code quality, security, and maintainability of the project will be significantly improved. 🤖 Generated by Wellcode.ai |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary
This PR adds support for dual extension galleries (TurboWarp and OmniBlocks) and includes a JavaScript V2 extension. While the functionality appears to work, there are several critical issues that need to be addressed before merging:
Critical Issues Found:
- Security Vulnerability: The JavaScript V2 extension allows arbitrary code execution without proper sandboxing or security warnings
- Logic Errors: Race condition in gallery loading timeout handling and inconsistent return types in fallback implementations
- Performance Issues: Complex SVG file that may impact rendering performance
Changes Overview:
- ✅ Adds dual gallery support for TurboWarp and OmniBlocks extensions
- ✅ Implements proper error handling and loading states for both galleries
- ✅ Adds FieldCustom bridging for JavaScript extensions
⚠️ Includes JavaScript V2 extension with security concerns⚠️ Contains race conditions and type inconsistencies
Recommendation:
Request Changes - The security vulnerability and logic errors need to be resolved before this can be safely merged. Please address the identified issues, particularly the JavaScript execution security concerns and race condition handling.
You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.
| width="600" | ||
| height="300" | ||
| viewBox="0 200 590 200"> | ||
| <defs><linearGradient x1="415.18966" y1="237.23724" x2="415.18966" y2="375.40225" gradientUnits="userSpaceOnUse" id="color-1"><stop offset="0" stop-color="#3b3500"/><stop offset="1" stop-color="#005f7b"/></linearGradient><linearGradient x1="415.18966" y1="237.23724" x2="415.18966" y2="375.40225" gradientUnits="userSpaceOnUse" id="color-2"><stop offset="0" stop-color="#ecff00" stop-opacity="0"/><stop offset="1" stop-color="#ecff00"/></linearGradient><linearGradient x1="415.18967" y1="237.23724" x2="415.18967" y2="375.40225" gradientUnits="userSpaceOnUse" id="color-3"><stop offset="0" stop-color="#3b3500"/><stop offset="1" stop-color="#005f7b"/></linearGradient><linearGradient x1="415.18966" y1="375.40225" x2="415.18966" y2="237.23724" gradientUnits="userSpaceOnUse" id="color-4"><stop offset="0" stop-color="#ecff00" stop-opacity="0"/><stop offset="1" stop-color="#ecff00"/></linearGradient><linearGradient x1="458.43293" y1="143.49311" x2="458.43293" y2="184.88996" gradientUnits="userSpaceOnUse" id="color-5"><stop offset="0" stop-color="#00caff" stop-opacity="0"/><stop offset="1" stop-color="#00caff"/></linearGradient><linearGradient x1="458.43293" y1="184.88996" x2="458.43293" y2="143.49311" gradientUnits="userSpaceOnUse" id="color-6"><stop offset="0" stop-color="#00caff" stop-opacity="0"/><stop offset="1" stop-color="#00caff"/></linearGradient><linearGradient x1="530.46404" y1="223.00649" x2="530.34442" y2="362.1403" gradientUnits="userSpaceOnUse" id="color-7"><stop offset="0" stop-color="#32ff00" stop-opacity="0"/><stop offset="1" stop-color="#32ff00" stop-opacity="0.72003"/></linearGradient><linearGradient x1="530.34442" y1="362.1403" x2="530.46404" y2="223.00649" gradientUnits="userSpaceOnUse" id="color-8"><stop offset="0" stop-color="#32ff00" stop-opacity="0"/><stop offset="1" stop-color="#32ff00" stop-opacity="0.72003"/></linearGradient><linearGradient x1="441.32559" y1="203.35782" x2="428.97627" y2="210.96925" gradientUnits="userSpaceOnUse" id="color-9"><stop offset="0" stop-color="#0067bb"/><stop offset="1" stop-color="#00ba87"/></linearGradient><linearGradient x1="518.60459" y1="203.71223" x2="506.25527" y2="211.32366" gradientUnits="userSpaceOnUse" id="color-10"><stop offset="0" stop-color="#0067bb"/><stop offset="1" stop-color="#00ba87"/></linearGradient><linearGradient x1="469.77156" y1="210.76632" x2="448.58355" y2="223.82539" gradientUnits="userSpaceOnUse" id="color-11"><stop offset="0" stop-color="#0067bb"/><stop offset="1" stop-color="#00ba87"/></linearGradient><linearGradient x1="448.64946" y1="223.53183" x2="439.54807" y2="229.1414" gradientUnits="userSpaceOnUse" id="color-12"><stop offset="0" stop-color="#0067bb"/><stop offset="1" stop-color="#00ba87"/></linearGradient><linearGradient x1="367.66935" y1="326.48509" x2="417.45011" y2="314.56574" gradientUnits="userSpaceOnUse" id="color-13"><stop offset="0" stop-color="#0004ff"/><stop offset="1" stop-color="#ff00e8"/></linearGradient><linearGradient x1="375.05764" y1="255.81627" x2="417.30897" y2="274.22279" gradientUnits="userSpaceOnUse" id="color-14"><stop offset="0" stop-color="#a5ff00"/><stop offset="1" stop-color="#33ff00"/></linearGradient><linearGradient x1="368.61393" y1="283.41896" x2="382.323" y2="293.1381" gradientUnits="userSpaceOnUse" id="color-15"><stop offset="0" stop-color="#a5ff00"/><stop offset="1" stop-color="#33ff00"/></linearGradient><linearGradient x1="425.30383" y1="297.77355" x2="445.7234" y2="311.22262" gradientUnits="userSpaceOnUse" id="color-16"><stop offset="0" stop-color="#00ffc5"/><stop offset="1" stop-color="#ff4200"/></linearGradient><radialGradient cx="446.82633" cy="273.28045" r="19.52122" gradientUnits="userSpaceOnUse" id="color-17"><stop offset="0" stop-color="#00ff2b"/><stop offset="1" stop-color="#00ff2b" stop-opacity="0"/></radialGradient><linearGradient x1="452.95362" y1="259.63717" x2="447.03752" y2="285.14669" gradientUnits="userSpaceOnUse" id="color-18"><stop offset="0" stop-color="#00ff1a" stop-opacity="0.81961"/><stop offset="1" stop-color="#00bbff" stop-opacity="0.88235"/></linearGradient></defs><g transform="translate(-160.72072,9.59956)"><g stroke-miterlimit="10"><path d="M160.72072,439.60959v-300h600v300z" fill="#59c0c0" fill-rule="nonzero" stroke="none" stroke-width="0.89803" stroke-linecap="butt"/><path d="M161.51153,289.60963c0,-165.24867 133.96051,-299.20919 299.20919,-299.20919c165.24865,0 299.2092,133.96053 299.2092,299.20919c0,165.24864 -133.96055,299.2092 -299.2092,299.2092c-165.24868,0 -299.20919,-133.96057 -299.20919,-299.2092z" fill="#94ffff" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M198.52101,289.60963c0,-144.80889 117.3908,-262.1997 262.19971,-262.1997c144.80889,0 262.1997,117.39081 262.1997,262.1997c0,144.80886 -117.3908,262.19969 -262.1997,262.19969c-144.80889,0 -262.19969,-117.39083 -262.19969,-262.19968z" fill="#59c0c0" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M235.99902,289.60963c0,-124.11039 100.61135,-224.72174 224.72174,-224.72174c124.11039,0 224.72172,100.61135 224.72172,224.72174c0,124.11036 -100.61136,224.72174 -224.72172,224.72174c-124.11038,0 -224.72173,-100.61138 -224.72174,-224.72174z" fill="#94ffff" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M273.94546,289.60963c0,-103.15314 83.62214,-186.77528 186.77529,-186.77528c103.15314,0 186.7753,83.62215 186.7753,186.77528c0,103.15314 -83.62216,186.7753 -186.7753,186.7753c-103.15313,0 -186.77527,-83.62216 -186.77527,-186.7753z" fill="#59c0c0" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M310.7207,289.60963c0,-82.84272 67.1573,-150.00001 150.00002,-150.00001c82.84271,0 150.00004,67.15729 150.00004,150.00001c0,82.84272 -67.15733,150.00002 -150,150.00002c-82.84274,0 -150.00003,-67.15729 -150.00003,-150.00001z" fill="#94ffff" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M348.90139,289.60963c0,-61.7561 50.06322,-111.81933 111.81933,-111.81933c61.7561,0 111.81936,50.06323 111.81936,111.81933c0,61.75611 -50.06323,111.81933 -111.81933,111.81933c-61.75612,0 -111.81935,-50.06322 -111.81935,-111.81933z" fill="#59c0c0" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><g><path d="M362.71556,289.60963c0,-54.12679 43.87841,-98.0052 98.00516,-98.0052c54.12679,0 98.0052,43.8784 98.0052,98.0052c0,54.12675 -43.87841,98.00515 -98.00515,98.00515c-54.12679,0 -98.00518,-43.8784 -98.00518,-98.00515z" fill="#94ffff" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M411.86448,289.60963c0,-26.98255 21.87367,-48.85621 48.85617,-48.85621c26.98251,0 48.85623,21.87367 48.85623,48.85621c0,26.98251 -21.87371,48.85617 -48.85623,48.85617c-26.9825,0 -48.85617,-21.87366 -48.85617,-48.85617z" fill="#59c0c0" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><g fill-rule="nonzero" stroke-width="10.5" stroke-linecap="butt"><path d="M349.87116,375.40225v-138.16501h130.637v138.16501z" fill="url(#color-1)" stroke="url(#color-2)"/><path d="M480.50817,237.23724v138.16501h-130.637v-138.16501z" fill="url(#color-3)" stroke="url(#color-4)"/></g><g fill="#00395c" fill-rule="nonzero" stroke-width="5" stroke-linecap="butt"><path d="M351.68555,232.66923l78.76697,-28.85224l137.60223,1.36582l-83.9178,28.69604z" stroke="url(#color-5)"/><path d="M566.24037,205.7876l-82.1034,28.09123l-132.4514,-1.2096c0,0 4.1397,-1.51636 8.22896,-3.01425c11.97248,-4.38551 70.53801,-25.83799 70.53801,-25.83799z" stroke="url(#color-6)"/></g><g fill="#0e3b11" fill-rule="nonzero" stroke-width="10.5" stroke-linecap="butt"><path d="M489.2382,374.46547l0.11959,-139.13381l82.21248,-24.65032l-0.11959,139.13381z" stroke="url(#color-7)"/><path d="M571.57028,210.68132l-0.11959,139.13381l-82.21248,24.65032l0.11959,-139.13381z" stroke="url(#color-8)"/></g><path d="M501.62181,252.25014l3.8189,-1.0696c0.31207,-0.08741 0.62056,0.06079 0.85786,0.41216l2.24454,3.32345c0.35846,0.53077 0.82469,0.75476 1.2964,0.62265l4.68391,-1.31188c0.4717,-0.13211 0.90991,-0.60942 1.21846,-1.32699l1.93202,-4.49324c0.20427,-0.47505 0.49419,-0.79084 0.80627,-0.87825l37.78743,-10.58358c0.64961,-0.18195 1.21579,0.65638 1.26445,1.87302l1.1051,27.64188c0.04863,1.21663 -0.43871,2.35004 -1.08834,2.532l-37.78743,10.58358c-0.4717,0.13211 -0.90991,0.60942 -1.21846,1.32699l-1.93202,4.49324c-0.20427,0.47505 -0.49419,0.79084 -0.80627,0.87825l-4.68391,1.31188c-0.31207,0.08741 -0.62056,-0.06079 -0.85786,-0.41216l-2.24454,-3.32345c-0.35846,-0.53077 -0.82469,-0.75476 -1.2964,-0.62265l-3.8189,1.0696c-0.64961,0.18195 -1.21579,-0.65638 -1.26445,-1.87302l-1.1051,-27.64188c-0.04863,-1.21663 0.43871,-2.35004 1.08834,-2.53198z" fill-opacity="0.44973" fill="#82ff00" fill-rule="evenodd" stroke="#9bff5a" stroke-width="1" stroke-linecap="butt"/><path d="M502.34161,284.17793l4.15538,-1.12209c0.33956,-0.09169 0.67306,0.05129 0.92741,0.39767l2.40576,3.27623c0.3842,0.52322 0.88824,0.73935 1.40151,0.60075l5.09661,-1.37626c0.51326,-0.13859 0.99335,-0.62047 1.33493,-1.33968l2.13881,-4.50341c0.22613,-0.47613 0.54377,-0.79493 0.88333,-0.88663l22.80263,-6.15747c0.70687,-0.19088 1.3137,0.63555 1.35526,1.84642l0.94399,27.51091c0.04154,1.21088 -0.49795,2.34685 -1.20482,2.53772l-22.80263,6.15747c-0.51326,0.13859 -0.99335,0.62047 -1.33493,1.33968l-2.13881,4.50341c-0.22613,0.47613 -0.54377,0.79493 -0.88333,0.88663l-5.09661,1.37626c-0.33956,0.09169 -0.67306,-0.05129 -0.92741,-0.39767l-2.40576,-3.27623c-0.3842,-0.52322 -0.88824,-0.73935 -1.40151,-0.60075l-4.15538,1.12209c-0.70687,0.19088 -1.3137,-0.63555 -1.35526,-1.84642l-0.94399,-27.51091c-0.04154,-1.21088 0.49795,-2.34685 1.20482,-2.53772z" fill-opacity="0.66747" fill="#0100ff" fill-rule="evenodd" stroke="#00d6ff" stroke-width="1" stroke-linecap="butt"/><path d="M502.51738,315.85871l4.33349,-1.18453c0.35411,-0.0968 0.70712,0.04214 0.98164,0.38642l2.59666,3.25629c0.4147,0.52004 0.94822,0.73004 1.48348,0.58373l5.31505,-1.45282c0.53526,-0.14631 1.02804,-0.63684 1.37025,-1.36377l2.14269,-4.55176c0.22653,-0.48124 0.55258,-0.80578 0.90671,-0.90258l35.37592,-9.66973c0.73715,-0.2015 1.39216,0.6199 1.46281,1.8352l1.60541,27.61135c0.07065,1.21529 -0.46982,2.36346 -1.20698,2.56496l-35.37592,9.66973c-0.53526,0.14631 -1.02804,0.63684 -1.37025,1.36377l-2.14269,4.55176c-0.22653,0.48124 -0.55258,0.80578 -0.90671,0.90258l-5.31505,1.45282c-0.35411,0.0968 -0.70712,-0.04214 -0.98164,-0.38642l-2.59666,-3.25629c-0.4147,-0.52004 -0.94822,-0.73004 -1.48348,-0.58373l-4.33349,1.18453c-0.73715,0.2015 -1.39216,-0.6199 -1.46281,-1.8352l-1.60541,-27.61135c-0.07065,-1.21529 0.46982,-2.36346 1.20698,-2.56496z" fill-opacity="0.60296" fill="#ffdb00" fill-rule="evenodd" stroke="#f7ff00" stroke-width="1" stroke-linecap="butt"/><g fill-rule="nonzero"><path d="M425.80219,204.66688l25.1113,6.40297" fill="none" stroke="url(#color-9)" stroke-width="3" stroke-linecap="round"/><path d="M529.68223,205.1433l-45.36418,6.07975" fill="none" stroke="url(#color-10)" stroke-width="3" stroke-linecap="round"/><path d="M403.97624,223.62082l21.18801,-13.05909l89.21462,0.40915l-21.18801,13.05909z" fill="#032500" stroke="url(#color-11)" stroke-width="3" stroke-linecap="butt"/><path d="M426.04255,215.52205l2.6212,-1.61556l9.33099,0.0428l-2.6212,1.61555z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M466.50332,215.75283l2.6212,-1.61556l9.33097,0.0428l-2.6212,1.61555z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M450.07765,219.02308l-2.6212,1.61555l-9.33099,-0.0428l2.6212,-1.61555z" fill="#00ff2a" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M436.79895,214.26028l2.6212,-1.61555l9.33097,0.0428l-2.6212,1.61555z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M477.25972,214.49104l2.6212,-1.61556l9.33097,0.0428l-2.6212,1.61556z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M456.61101,220.36414l-2.6212,1.61556l-9.33099,-0.0428l2.6212,-1.61556z" fill="#00ff2a" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M442.78342,215.59883l2.6212,-1.61556l9.33097,0.04278l-2.6212,1.61556z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M483.2442,215.82961l2.6212,-1.61556l9.33099,0.0428l-2.6212,1.61555z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M466.81853,219.09984l-2.6212,1.61555l-9.33099,-0.0428l2.6212,-1.61555z" fill="#00ff2a" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M386.89514,228.89993l9.10138,-5.60958l105.30585,0.48295l-9.10138,5.60958z" fill="#000000" stroke="url(#color-12)" stroke-width="3" stroke-linecap="butt"/><path d="M401.98388,225.16499l0.93614,-0.57699l8.14745,0.03736l-0.93614,0.57699z" fill="#ffcf00" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M473.99036,224.61684l2.61882,0.01201l-2.91244,1.79507l-2.61882,-0.01201z" fill="#00fff0" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M478.67516,224.63833l2.61882,0.01201l-5.02397,3.09649l-2.61883,-0.01201z" fill="#00fff0" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M483.56362,224.66074l2.61883,0.01201l-1.89309,1.16679l-2.61882,-0.01201z" fill="#00fff0" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M400.30922,226.19715l0.93614,-0.57699l8.14745,0.03736l-0.93614,0.57699z" fill="#ffcf00" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M398.63457,227.22931l0.93614,-0.57699l8.14745,0.03736l-0.93614,0.57699z" fill="#ffcf00" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M419.30755,225.99687c-0.66351,0.40894 -2.56928,0.73419 -4.25667,0.72644c-1.68739,-0.00774 -2.51742,-0.34552 -1.85391,-0.75447c0.66351,-0.40895 2.56928,-0.7342 4.25667,-0.72644c1.68739,0.00774 2.51742,0.34552 1.85391,0.75447z" fill="#00ff05" stroke="none" stroke-width="0" stroke-linecap="butt"/></g><path d="M364.68399,314.0168c-0.27479,-1.14767 0.41351,-2.29619 1.53739,-2.56529l4.06989,-0.97447c1.01748,-0.24362 1.6506,0.15409 2.28372,0.55178l2.53251,1.5908c0.63313,0.39771 1.26625,0.7954 2.28372,0.55178l6.10484,-1.46172c1.01748,-0.24362 1.40181,-0.88495 1.78617,-1.52626l1.53739,-2.56529c0.38435,-0.64132 0.76869,-1.28264 1.78617,-1.52626l23.32648,-5.58522c1.12386,-0.26909 2.25772,0.44313 2.53251,1.5908l4.97561,20.78047c0.27479,1.14767 -0.41351,2.29619 -1.53739,2.56529l-23.32648,5.58522c-1.01748,0.24362 -1.40181,0.88495 -1.78617,1.52626l-1.53739,2.56529c-0.38435,0.64132 -0.76869,1.28264 -1.78617,1.52626l-6.10484,1.46172c-1.01748,0.24362 -1.6506,-0.15409 -2.28372,-0.55178l-2.53251,-1.5908c-0.63313,-0.39771 -1.26625,-0.7954 -2.28372,-0.55178l-4.06989,0.97447c-1.12386,0.26909 -2.25772,-0.44313 -2.53251,-1.5908z" fill="#00ddff" fill-rule="nonzero" stroke="url(#color-13)" stroke-width="5" stroke-linecap="butt"/><path d="M377.74065,249.65753c13.97293,-5.02893 25.96984,5.50244 27.87871,12.14519l13.32831,5.80639c0.47447,0.15154 0.7014,0.58135 0.6808,1.28945l-5.75425,13.20861c-0.32182,0.57687 -0.74667,0.85089 -1.27461,0.82207l-28.01202,-12.20325c-1.29615,0.21406 -2.61127,1.42245 -3.88909,1.37193l-3.96626,-1.72789c-0.95885,-0.91416 -0.88408,-2.64341 -1.73297,-3.71894l-2.96636,-1.29227c-0.37105,-0.5575 -0.51983,-1.05547 -0.44633,-1.49392z" fill="#f1ff00" fill-rule="nonzero" stroke="url(#color-14)" stroke-width="5" stroke-linecap="butt"/><path d="M401.84461,354.11574c-0.20688,-0.59981 0.1674,-1.1882 1.12283,-1.76515l7.09538,-2.30823c2.9535,-0.152 5.26585,0.92597 8.32177,0.49696l9.05087,-2.92364c2.66526,-1.30776 2.35355,-3.25432 4.99717,-4.85056l17.94054,-5.83635c1.41556,-0.24965 2.46624,-0.11447 3.15206,0.40557l9.28464,13.32701c0.25948,0.77625 -0.22733,1.48075 -1.4604,2.11346l-46.83807,15.23716c-1.33945,0.32859 -2.40696,0.2248 -3.20248,-0.3114z" fill="#f1ff00" fill-rule="nonzero" stroke="#ff7300" stroke-width="5" stroke-linecap="butt"/><path d="M373.17533,286.62189l-1.38571,-7.68232l3.84417,-0.81478l1.39805,7.66371l7.78875,-1.27759l0.6712,3.89436l-7.74912,1.41116l1.42226,7.77619l-3.87235,0.70031l-1.42104,-7.71514l-7.69247,1.51283l-0.77439,-3.93736z" fill="#f1ff00" fill-rule="nonzero" stroke="url(#color-15)" stroke-width="5" stroke-linecap="butt"/><path d="M433.08574,294.93428l12.19456,7.99091l0.44193,8.29923l-7.79689,2.86772l-12.15935,-8.04436l-0.46334,-8.27243z" fill="#c0ff00" fill-rule="nonzero" stroke="url(#color-16)" stroke-width="5" stroke-linecap="butt"/><path d="M466.34755,273.28045c0,10.59538 -8.73994,19.18464 -19.52122,19.18464c-10.78128,0 -19.52122,-8.58926 -19.52122,-19.18464c0,-10.59538 8.73994,-19.18464 19.52122,-19.18464c10.78128,0 19.52122,8.58926 19.52122,19.18464z" fill="url(#color-17)" fill-rule="nonzero" stroke="none" stroke-width="10" stroke-linecap="butt"/><path d="M462.85549,275.33886l-10.73869,1.52665l-4.52859,8.40891l-2.08153,-10.19793l-9.67473,-5.96934l10.75372,0.35279l6.91864,-9.69504l-0.24264,11.84104z" fill="none" fill-rule="nonzero" stroke="url(#color-18)" stroke-width="10" stroke-linecap="butt"/><path d="M369.84662,350.88559l12.40651,3.42585c6.73447,2.84941 3.83238,12.63585 -3.19279,11.64427l-12.41776,-3.38481c-6.25002,-2.22316 -4.38552,-12.69528 3.20404,-11.68532z" fill="#00ffa6" fill-rule="nonzero" stroke="#ff42ff" stroke-width="5" stroke-linecap="butt"/></g></g></g></svg><!--rotationCenter:79.27927927927925:189.59955539039024--> No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Performance issue: This SVG contains extremely complex path data and numerous gradients on a single line, making it difficult to maintain and potentially causing rendering performance issues. Consider optimizing the SVG by simplifying paths, reducing gradient complexity, or using a more efficient format.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (3)
src/containers/extension-library.jsx (2)
45-51: Consider guarding async callbacks against unmount and tightening timeout semantics
loadGalleryWithTimeoutschedules a timeout and always runssuccessCallback/errorCallbackwhen the fetch settles, even if the component has unmounted, which can trigger React “setState on unmounted component” warnings, and also runs both the timeout callback and the eventual error callback on slow failures.A small guard would make this more robust:
class ExtensionLibrary extends React.PureComponent { + _isMounted = false; componentDidMount () { - // Fetch TurboWarp gallery if not cached + this._isMounted = true; + // Fetch TurboWarp gallery if not cached if (!this.state.galleryTW) { loadGalleryWithTimeout( fetchLibraryTW, - () => this.setState({ galleryTWTimedOut: true }), - gallery => { - cachedGalleryTW = gallery; - this.setState({ galleryTW: gallery }); - }, - error => this.setState({ galleryTWError: error }) + () => this._isMounted && this.setState({ galleryTWTimedOut: true }), + gallery => { + if (!this._isMounted) return; + cachedGalleryTW = gallery; + this.setState({ galleryTW: gallery }); + }, + error => this._isMounted && this.setState({ galleryTWError: error }) ); } @@ + componentWillUnmount () { + this._isMounted = false; + }and similarly for the OB gallery branch.
Also applies to: 138-155, 171-197
163-169: Separator placement and initial loading UX could be refinedRight now
library.push('---')is called twice unconditionally (once before TW, once between TW and OB), even when neither gallery has loaded nor timed out yet, which can yield multiple adjacent separators with no content and no “loading” item until the 750 ms timeout elapses.You could tighten this by only inserting separators when there is real content or a placeholder to show, e.g.:
- let library = extensionLibraryContent.map(toLibraryItem); - library.push('---'); + let library = extensionLibraryContent.map(toLibraryItem); + const locale = this.props.intl.locale; + + const twItems = []; + if (this.state.galleryTW) { + twItems.push(toLibraryItem(galleryMore)); + twItems.push( + ...this.state.galleryTW + .map(i => translateGalleryItem(i, locale)) + .map(toLibraryItem) + ); + } else if (this.state.galleryTWError) { + twItems.push(toLibraryItem(galleryError)); + } else if (this.state.galleryTWTimedOut) { + twItems.push(toLibraryItem(galleryLoading)); + } + + const obItems = []; + if (this.state.galleryOB) { + obItems.push(toLibraryItem(galleryMoreOB)); + obItems.push( + ...this.state.galleryOB + .map(i => translateGalleryItem(i, locale)) + .map(toLibraryItem) + ); + } else if (this.state.galleryOBError) { + obItems.push(toLibraryItem(galleryErrorOB)); + } else if (this.state.galleryOBTimedOut) { + obItems.push(toLibraryItem(galleryLoadingOB)); + } + + if (twItems.length) { + library.push('---', ...twItems); + } + if (obItems.length) { + library.push('---', ...obItems); + }This avoids empty separators and ensures users always see either actual gallery items, a loading placeholder (after timeout), or nothing at all.
Also applies to: 234-268
src/lib/libraries/extensions/index.jsx (1)
364-372: Minor:valuesprop no longer used in TurboWarp Blocks messageThe
defaultMessagefor the TurboWarp Blocks name is now the literal"TurboWarp Blocks", but theFormattedMessagestill passesvalues={{ APP_NAME: "TurboWarp" }}even thoughAPP_NAMEisn’t interpolated in that string anymore.You can simplify by dropping the
valuesprop (and, if not used elsewhere below, theAPP_NAMEimport) to make the intent clearer.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (2)
src/lib/libraries/extensions/gallery/obgallery.svgis excluded by!**/*.svgsrc/lib/libraries/extensions/javascript/javascript.pngis excluded by!**/*.png
📒 Files selected for processing (3)
src/containers/blocks.jsx(1 hunks)src/containers/extension-library.jsx(5 hunks)src/lib/libraries/extensions/index.jsx(7 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
src/lib/libraries/extensions/**
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Place extensions under src/lib/libraries/extensions/
Files:
src/lib/libraries/extensions/index.jsx
🧠 Learnings (15)
📓 Common learnings
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-18T22:18:13.164Z
Learning: For OmniBlocks/scratch-gui small features, supervoidcoder prefers GUI-only changes that avoid modifying scratch-blocks; deliver as a single, self-contained PR.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T21:20:08.837Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (“void”) prefers single, complete PRs over multi-part (“Part 1/2”) submissions. If a split is unavoidable, they want explicit linkage and gating before approval.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:48:23.435Z
Learning: OmniBlocks/scratch-gui workflow preference: Open tracking issues for CI/automation behavior changes; assign to supervoidcoder; include backlinks to the PR and the exact comment requesting the change.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:48:23.435Z
Learning: OmniBlocks/scratch-gui: For CI comment hygiene, prefer not mentioning bot/app requesters in the Mega PR Test & Analysis sticky comment; only mention humans. Track such behavior changes via a GitHub issue assigned to supervoidcoder with backlinks to the initiating PR and comment.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:40:39.943Z
Learning: In OmniBlocks/scratch-gui, supervoidcoder (“void”) prefers a collaboration model where CodeRabbit authors the code PRs and Amazon Q performs the review; follow-ups should be submitted as single, self-contained PRs when possible.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: When reviewing pull requests in the OmniBlocks/scratch-gui repository, take into consideration whether the pull request was made by team members of OmniBlocks/coders.
Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:49:51.378Z
Learning: OmniBlocks/scratch-gui: Update Mega PR Test & Analysis so the sticky PR comment only mentions the requester when github.event.sender.type == 'User' (i.e., human). Purpose: avoid bot loops and comment noise.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T20:16:15.537Z
Learning: OmniBlocks/scratch-gui has an existing workflow at .github/workflows/prtest.yml named "Mega PR Test & Analysis".
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-09T18:19:24.693Z
Learning: OmniBlocks/scratch-gui: The Blocks component now bridges FieldCustom in componentDidMount by assigning this.ScratchBlocks.FieldCustom = window.Blockly.FieldCustom immediately after ScratchMsgs.setLocale (added Nov 9, 2025 via PR #159). This enables SPjavascriptV2’s registerInput usage at runtime.
Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:50:28.065Z
Learning: OmniBlocks/scratch-gui: When cleaning PR noise, prefer minimizing CodeRabbit auto-generated comments matching headers like "This is an auto-generated reply by CodeRabbit", "Rate Limit Exceeded", and "automated status update", while preserving human-directed conversation.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-20T00:38:31.706Z
Learning: When integrating PenguinMod’s JS editor blocks, the FieldCustom plugin must run before opening the extension library. If using scratch-blocks develop-builds, either import 'scratch-blocks/core/field_customInput.js' early in scratch-gui (e.g., src/playground/import-first.js) and bridge Blockly.FieldCustom → ScratchBlocks.FieldCustom in Blocks.componentDidMount, or include the plugin in scratch-blocks’ bundle entry so the develop-builds dist executes it.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: In the OmniBlocks/scratch-gui repository, team member supervoidcoder can be called "void" in reviews and conversations.
Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T02:00:40.666Z
Learning: In OmniBlocks/scratch-gui, when cleanup is requested, supervoidcoder prefers deletion of CodeRabbit’s spam comments (not just minimizing) on the PR; for non-CodeRabbit bot comments, minimize unless a maintainer explicitly asks for hard deletion.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: The team members in OmniBlocks/coders include: supervoidcoder, Graison-P (gvyt), ampelectrecuted (amp), NotTheBaton (TheBaton), and kRxZykRxZy.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-28T03:09:05.973Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (void) is planning to add a 3D mode and is excited about using PlayCanvas as a full 3D game engine for OmniBlocks.
📚 Learning: 2025-10-06T23:37:51.374Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-06T23:37:51.374Z
Learning: In OmniBlocks scratch-gui, custom extension library items must include `extensionURL`; otherwise the loader tries to load `extensionId` as a URL/built-in id and fails.
Applied to files:
src/containers/extension-library.jsxsrc/lib/libraries/extensions/index.jsx
📚 Learning: 2025-11-09T18:19:24.693Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-09T18:19:24.693Z
Learning: OmniBlocks/scratch-gui: The Blocks component now bridges FieldCustom in componentDidMount by assigning this.ScratchBlocks.FieldCustom = window.Blockly.FieldCustom immediately after ScratchMsgs.setLocale (added Nov 9, 2025 via PR #159). This enables SPjavascriptV2’s registerInput usage at runtime.
Applied to files:
src/containers/blocks.jsxsrc/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-20T00:38:31.706Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-20T00:38:31.706Z
Learning: When integrating PenguinMod’s JS editor blocks, the FieldCustom plugin must run before opening the extension library. If using scratch-blocks develop-builds, either import 'scratch-blocks/core/field_customInput.js' early in scratch-gui (e.g., src/playground/import-first.js) and bridge Blockly.FieldCustom → ScratchBlocks.FieldCustom in Blocks.componentDidMount, or include the plugin in scratch-blocks’ bundle entry so the develop-builds dist executes it.
Applied to files:
src/containers/blocks.jsx
📚 Learning: 2025-11-06T21:34:01.602Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-06T21:34:01.602Z
Learning: In OmniBlocks scratch-blocks, field_customInput.js wasn't being compiled into develop-builds bundles because it was missing required goog.require() statements. The Closure compiler needs goog.require('Blockly.Field') and other dependencies declared at the top of the file for proper dependency resolution, even though goog.inherits() is used later in the file.
Applied to files:
src/containers/blocks.jsx
📚 Learning: 2025-10-20T01:34:10.747Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-20T01:34:10.747Z
Learning: Importing Closure source files from scratch-gui (e.g., 'scratch-blocks/core/field_customInput.js') causes 'goog is not defined'. FieldCustom must be compiled into scratch-blocks’ develop-builds bundle and then bridged in GUI; GUI should not import Closure sources directly.
Applied to files:
src/containers/blocks.jsx
📚 Learning: 2025-11-09T19:10:33.207Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-09T19:10:33.207Z
Learning: In OmniBlocks: FieldCustom (base class and registry) lives in scratch-blocks, but each extension must register its own editor via ScratchBlocks.FieldCustom.registerInput(key, html, onInit, onClick, onUpdate), and the block JSON must use type "custom" with the matching "custom" key and string defaultValue.
Applied to files:
src/containers/blocks.jsx
📚 Learning: 2025-10-21T11:30:02.766Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-21T11:30:02.766Z
Learning: In the OmniBlocks/TurboWarp Scratch GUI fork, custom addons must be manually registered in three files: src/addons/addons.js (add to both default and newAddons arrays), src/addons/generated/addon-manifests.js (add import and export), and src/addons/generated/addon-entries.js (add dynamic import entry). Running pull.js would overwrite custom addons.
Applied to files:
src/containers/blocks.jsxsrc/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-09T13:04:39.893Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-09T13:04:39.893Z
Learning: In OmniBlocks scratch-vm, initialize `this.runtime.extensionRuntimeOptions = {}` in the VM constructor (before loading extensions) to match PM/TW; otherwise SPjavascriptV2 crashes when reading `.javascriptUnsandboxed` during normal (non-packager) runs.
Applied to files:
src/containers/blocks.jsxsrc/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-06T23:37:51.374Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-06T23:37:51.374Z
Learning: The public SPjavascriptV2 (SharkPool) code found online uses CommonJS `require`, which won’t load via TurboWarp’s `loadExtensionURL`. It must be converted to a browser/TurboWarp extension that registers via `Scratch.extensions.register`.
Applied to files:
src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-09T22:53:52.699Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-09T22:53:52.699Z
Learning: PenguinMod VM registers the current JavaScript extension as jg_javascript (src/extension-support/extension-manager.js) and the extension folder is src/extensions/jg_javascript with getInfo().id = 'jg_javascript'.
Applied to files:
src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-07T19:27:27.244Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-07T19:27:27.244Z
Learning: In OmniBlocks scratch-vm SPjavascriptV2 (src/extensions/sp_javascriptV2/index.js), accessing `this.runtime.extensionRuntimeOptions.javascriptUnsandboxed` without a guard crashes in non-Packager runs; fix by using `this.runtime.extensionRuntimeOptions?.javascriptUnsandboxed === true`.
Applied to files:
src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-09T21:20:10.083Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-09T21:20:10.083Z
Learning: OmniBlocks scratch-vm must initialize runtime.extensionRuntimeOptions before loading extensions (e.g., in VM constructor or Runtime constructor) to avoid crashes when the extension reads .javascriptUnsandboxed, matching PenguinMod/TurboWarp behavior.
Applied to files:
src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-11-20T01:45:53.675Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-20T01:45:53.675Z
Learning: In OmniBlocks/scratch-gui, supervoidcoder is planning to expand OmniBlocks from a Scratch mod into a full IDE, requiring support for multiple file types beyond just block-based projects. The primary project format will use the `.omb` extension, with potential for additional extensions in the `omb` namespace (e.g., `.ombc`, `.ombs`) as IDE features are added.
Applied to files:
src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-11-20T01:50:09.301Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-20T01:50:09.301Z
Learning: In OmniBlocks/scratch-gui, for the IDE expansion supporting multiple programming languages (Python, JavaScript, C, etc.), the project will use a single `.omb` format for full project bundles that contains metadata specifying languages, project structure, and assets. Individual code files will use standard language extensions (.py, .js, .c) rather than custom extensions like `.pyboxy`. The `.omb` format is a zip archive containing code/, assets/, blocks/ directories plus project.json metadata.
Applied to files:
src/lib/libraries/extensions/index.jsx
🧬 Code graph analysis (1)
src/containers/extension-library.jsx (1)
src/lib/libraries/extensions/index.jsx (12)
galleryMore(454-475)galleryMore(454-475)galleryError(477-498)galleryError(477-498)galleryLoading(431-452)galleryLoading(431-452)galleryMoreOB(523-543)galleryMoreOB(523-543)galleryErrorOB(545-565)galleryErrorOB(545-565)galleryLoadingOB(501-521)galleryLoadingOB(501-521)
⏰ 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: visual-regression
- GitHub Check: mega-test
- GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (4)
src/containers/blocks.jsx (1)
147-152: LGTM! FieldCustom bridge correctly implemented.The conditional bridging of
window.Blockly.FieldCustomtothis.ScratchBlocks.FieldCustomproperly wires the Closure-compiled Blockly implementation to the ScratchBlocks API that extensions expect, enabling the JavaScript V2 extension'sregisterInputusage at runtime.Based on learnings
src/containers/extension-library.jsx (1)
8-15: Remote gallery mapping and extensionURL usage look correctThe TW/OB fetchers normalize metadata into library items with
extensionId,extensionURL,iconURL, tags, docs, samples, and credits, and then the library uses these viahandleItemSelect. This aligns with the requirement that custom/remote items always provideextensionURLso the loader doesn’t treatextensionIdas a URL/built‑in id, and the credits/docs/samples data flow is consistent with the existing gallery patterns.Also applies to: 52-93, 95-136
src/lib/libraries/extensions/index.jsx (2)
49-56: JS V2 extension entry: confirm VM registration matchesextensionIdAdding the JavaScript V2 entry with
extensionId: 'SPjavascriptV2',incompatibleWithScratch: true, and the custom icon looks consistent and tagged correctly as['ob'].Please just double‑check that:
getInfo().idinsrc/extensions/sp_javascriptV2/index.jsis exactly'SPjavascriptV2', and- the VM’s
extensionManager(or equivalent registration table) knows how to load this id, soloadExtensionURL('SPjavascriptV2')works without needing an explicitextensionURLhere.If either of those isn’t true, adding an
extensionURLpointing at the built/bundled JS file would be safer.Also applies to: 387-407
431-498: TurboWarp and OmniBlocks gallery metadata wiring looks consistentThe updated TurboWarp gallery exports now explicitly say “TurboWarp Extension Gallery”, and the new OmniBlocks gallery exports (
galleryLoadingOB,galleryMoreOB,galleryErrorOB) use:
- a consistent
nameid (ob.extensionGallery.name),href: 'https://omniblocks.github.io/extensions',extensionId: 'galleryOB', and- the
obgalleryIconplustags: ['ob'].This matches how
ExtensionLibraryis consuming them (checkingitem.hrefto avoid loading, using tags for filtering, and inserting them around the OB gallery items), so the metadata wiring looks correct.Also applies to: 500-565
|
/q i get your point about the svg being a one liner BUT YOU AREN'T GONNA MANUALLY EDIT THE SVG BRUH I MADE IT IN OMNIBLOCKS PAINT EDITOR (peak dogfooding) |
|
Tip For best results, initiate chat on the files or code changes. @supervoidcoder Absolutely right! 🎨 You make a great point - SVGs generated from a paint editor (especially your own OmniBlocks Paint Editor) are meant to be machine-generated and shouldn't be manually edited. The one-liner format is just the output of the tool, and trying to manually format or edit it would break that workflow. And yes, peak dogfooding indeed! Using OmniBlocks Paint Editor to create assets for OmniBlocks itself is exactly the kind of real-world testing and validation that makes the product better. Keep it up! 🚀 🧠 Learnings used |
|
I understand your point about the SVG being generated by OmniBlocks Paint Editor! You're absolutely right that tool-generated SVGs don't need to be manually readable since they're not intended for hand-editing. However, for maintainability and version control, consider formatting the SVG with proper line breaks. This makes diffs more meaningful when the file changes and helps with debugging if needed. Most SVG minifiers can be reversed, and the file size difference is minimal for a single icon. That said, if this is purely a generated asset that won't be modified, the current format is acceptable. Great work on the dogfooding with OmniBlocks Paint Editor! |
Co-authored-by: amazon-q-developer[bot] <208079219+amazon-q-developer[bot]@users.noreply.github.com>
🎨 Visual Regression Test ResultsHi @supervoidcoder! Here are the visual comparison results: ✅ No Visual Changes DetectedAll screenshots match the base branch! 🎉 📊 All Screenshots Checked
💡 Tip: Download the artifacts to view detailed before/after comparisons! |
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/ampelectrecuted/385/ 🧪 Test ResultsESLint: ❌ Found issues
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 136M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
Co-authored-by: amazon-q-developer[bot] <208079219+amazon-q-developer[bot]@users.noreply.github.com>
🎨 Visual Regression Test ResultsHi @supervoidcoder! Here are the visual comparison results: ✅ No Visual Changes DetectedAll screenshots match the base branch! 🎉 📊 All Screenshots Checked
💡 Tip: Download the artifacts to view detailed before/after comparisons! |
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/ampelectrecuted/385/ 🧪 Test ResultsESLint: ❌ Found issues
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 136M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/ 🧪 Test ResultsESLint: ❌ Found issues
To fix, click the checkbox below or type
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 185M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
🎬 ULTRA Visual Regression Test ResultsHi @supervoidcoder! Tested across 9 combinations (3 platforms × 3 browsers). 8/9 completed. 📊 Test Matrix Summary
|
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.42% (15424 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Windows + Chrome
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 41.48% (382304 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Windows + Firefox
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.01% (78 pixels)
Player View
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.00% (13 pixels)
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Windows + WebKit
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 1.46% (53705 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Apple + Chrome
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 3.58% (32959 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Apple + Firefox
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 2.38% (21970 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Apple + WebKit
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 1.18% (43466 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
📦 Resources
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
Copilot reviewed 7 out of 9 changed files in this pull request and generated 2 comments.
| if (this.ScratchBlocks && !this.ScratchBlocks.FieldCustom) { | ||
| this.ScratchBlocks.FieldCustom = { | ||
| registerInput: () => {}, | ||
| unregisterInput: () => {}, | ||
| getRegisteredInputs: () => new Map() | ||
| }; | ||
| log.warn('ScratchBlocks.FieldCustom is not available; using stub implementation. ' + | ||
| 'This usually means the Blockly → ScratchBlocks FieldCustom bridge is not configured correctly.'); | ||
| } |
Copilot
AI
Jan 17, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The conditional logic on line 154 creates a stub implementation only when ScratchBlocks exists but FieldCustom doesn't. However, if ScratchBlocks itself doesn't exist, this code won't run at all, which could lead to runtime errors later. Consider adding a check for when ScratchBlocks is undefined: if (!this.ScratchBlocks) { /* handle missing ScratchBlocks */ } else if (!this.ScratchBlocks.FieldCustom) { /* current stub logic */ }
🤖 Auto-Component Test Results✅ Detected 2 interactive components!📋 Components Found:
📸 Component Screenshots:💡 Note: If screenshots appear broken, they may still be processing. Check the screenshots branch for the latest images. 🧪 Test Status:
|
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/ 🧪 Test ResultsESLint: ❌ Found issues
To fix, click the checkbox below or type
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 185M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
🎬 ULTRA Visual Regression Test ResultsHi @supervoidcoder! Tested across 9 combinations (3 platforms × 3 browsers). 8/9 completed. 📊 Test Matrix Summary
|
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 5.84% (53792 pixels)
Player View
✅ No pixel difference detected.
Extension Library
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.28% (2538 pixels)
Advanced Settings
✅ No pixel difference detected.
Ubuntu + WebKit
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 1.99% (73308 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Windows + Chrome
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 41.40% (381533 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Windows + Firefox
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.49% (4503 pixels)
Player View
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 2.89% (48208 pixels)
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Windows + WebKit
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 1.55% (57204 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Apple + Chrome
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 24.78% (228375 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Apple + Firefox
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.21% (1094 pixels)
Stage Sprites
✅ No pixel difference detected.
Code Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.12% (1094 pixels)
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.00% (27 pixels)
Player View
✅ No pixel difference detected.
Extension Library
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.28% (2584 pixels)
Advanced Settings
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.12% (1094 pixels)
Apple + WebKit
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.28% (10287 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
📦 Resources
🤖 Auto-Component Test Results✅ Detected 2 interactive components!📋 Components Found:
📸 Component Screenshots:💡 Note: If screenshots appear broken, they may still be processing. Check the screenshots branch for the latest images. 🧪 Test Status:
|
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/ 🧪 Test ResultsESLint: ❌ Found issues
To fix, click the checkbox below or type
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 185M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
🎬 ULTRA Visual Regression Test ResultsHi @supervoidcoder! Tested across 9 combinations (3 platforms × 3 browsers). 8/9 completed. 📊 Test Matrix Summary
|
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.37% (3402 pixels)
Player View
✅ No pixel difference detected.
Extension Library
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.28% (2538 pixels)
Advanced Settings
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.00% (1 pixels)
Ubuntu + WebKit
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.36% (13447 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Windows + Chrome
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 41.25% (380160 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Windows + Firefox
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.12% (1114 pixels)
Player View
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 2.89% (48206 pixels)
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Windows + WebKit
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.29% (10756 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Apple + Chrome
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
✅ No pixel difference detected.
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Apple + Firefox
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 3.80% (34997 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Apple + WebKit
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
✅ No pixel difference detected.
Stage Sprites
✅ No pixel difference detected.
Code Tab
✅ No pixel difference detected.
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.16% (5889 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
📦 Resources
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
Copilot reviewed 7 out of 9 changed files in this pull request and generated 1 comment.
| const GALLERY_TIMEOUT_MS = 750; | ||
|
|
||
| const fetchLibrary = async () => { | ||
| // Common gallery fetcher function to reduce code duplication |
Copilot
AI
Jan 19, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The comment "Common gallery fetcher function to reduce code duplication" on line 48 is misleading because two separate functions fetchLibraryTW and fetchLibraryOB are implemented below, not a single common function. The actual common function is loadGalleryWithTimeout introduced later. Either update this comment to accurately describe the refactoring, or move it to line 138 where the truly common helper is defined.
| // Common gallery fetcher function to reduce code duplication | |
| // Gallery fetcher helpers and caches |
🕐 Stale PR ReminderHey @supervoidcoder! 👋 This PR has been quiet for a while. Need any help getting it across the finish line? Feel free to ask! 🚀 This is an automated friendly reminder. No pressure! 💙 |
|
@coderabbitai generate docstrings |
✅ Actions performedInitiated docstring generation; will generate only if new commits exist. |
|
Caution Docstrings generation - FAILED No docstrings were generated. |
🕐 Stale PR ReminderHey @supervoidcoder! 👋 This PR has been quiet for a while. Need any help getting it across the finish line? Feel free to ask! 🚀 This is an automated friendly reminder. No pressure! 💙 |


































































































Accidentally merged #159 but a refresh is good because the other pr reached nearly 400 comemnts
Progress: