style: format code with Prettier and StandardJS#9
style: format code with Prettier and StandardJS#9deepsource-autofix[bot] wants to merge 1 commit intomainfrom
Conversation
This commit fixes the style issues introduced in 9b90eff according to the output from Prettier and StandardJS. Details: None
|
You've used up your 5 PR reviews for this month under the Korbit Starter Plan. You'll get 5 more reviews on October 14th, 2025 or you can upgrade to Pro for unlimited PR reviews and enhanced features in your Korbit Console. |
|
Here's the code health analysis summary for commits Analysis Summary
|
| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
Performance Optimization: Script Loading
The scripts are loaded synchronously at the end of the HTML document, which can block the page rendering and affect the user experience negatively. To improve performance, consider using the async or defer attributes for non-critical scripts. This allows the browser to continue parsing and rendering the page while the scripts are being loaded in the background.
Recommended Changes:
<script src="scripts/canvas/PixelCanvas.js" async></script>
<script src="scripts/canvas/dithering.js" async></script>
<!-- Add async to other script tags similarly -->This change will help in reducing the perceived load time of the page.
| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
Enhancing Robustness: Error Handling for Script Loading
Currently, there is no error handling mechanism visible for the script loading process. Implementing error handling can prevent the application from breaking if a script fails to load or encounters an error during execution.
Suggested Implementation:
Use the onerror attribute in script tags to handle errors gracefully. For example:
<script src="scripts/canvas/PixelCanvas.js" onerror="handleScriptError(this)"></script>And define a handleScriptError function in your JavaScript that logs the error or takes appropriate actions. This will enhance the robustness and reliability of your application.
| <link rel="stylesheet" href="styles/main.css" /> | ||
| <link | ||
| rel="stylesheet" | ||
| href="styles/themes/lain-dive.css" | ||
| id="theme-stylesheet" | ||
| /> | ||
| <link rel="stylesheet" href="styles/components/canvas.css" /> | ||
| <link rel="stylesheet" href="styles/components/timeline.css" /> | ||
| <link rel="stylesheet" href="styles/components/tools.css" /> | ||
| <link rel="stylesheet" href="styles/components/menus.css" /> |
There was a problem hiding this comment.
Multiple CSS Files
The HTML head includes multiple CSS files for different components and themes. This approach can increase the number of HTTP requests, potentially slowing down the page load time on slower networks.
Recommendation: Consider consolidating these CSS files into a single stylesheet or using CSS preprocessors like SASS or LESS, which can compile multiple files into one. This can reduce the number of HTTP requests and improve load times.
| <button id="minimize-button" class="title-bar-button">_</button> | ||
| <button id="maximize-button" class="title-bar-button">[]</button> | ||
| <button id="close-button" class="title-bar-button">x</button> |
There was a problem hiding this comment.
Inline Event Handlers
The buttons for minimizing, maximizing, and closing the application use inline event handlers (onclick). This practice mixes the presentation layer with the logic, making the code harder to maintain and debug.
Recommendation: Remove inline event handlers and attach event listeners using JavaScript. This approach separates the concerns and enhances maintainability. For example:
const closeButton = document.getElementById('close-button');
closeButton.addEventListener('click', closeApp);| <!-- Load Scripts --> | ||
| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
Performance Optimization Concern
The HTML file loads multiple JavaScript files individually which can lead to increased HTTP requests and potentially slow down the page load time. To improve performance, consider bundling these scripts into a single file. This reduces the number of HTTP requests and can significantly speed up loading times.
Recommendation:
Use a module bundler like Webpack or Rollup to bundle your JavaScript files. This not only improves loading times but also helps in managing dependencies more efficiently.
| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
The scripts are loaded synchronously, which can block the rendering of the page until all scripts are downloaded and executed. This can lead to performance issues, especially on slower networks or devices.
Recommendation: Consider using async or defer attributes in the script tags. This allows the browser to continue parsing and rendering the rest of the HTML page while the scripts are being downloaded, improving the load time and user experience.
Example:
<script async src="scripts/canvas/PixelCanvas.js"></script>| <input type="checkbox" id="effect-grain" /> | ||
| <span class="effect-name">Grain</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-static" /> | ||
| <span class="effect-name">Static</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-glitch" /> | ||
| <span class="effect-name">Glitch</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-crt" /> | ||
| <span class="effect-name">CRT</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-scanlines" /> | ||
| <span class="effect-name">Scanlines</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-vignette" /> | ||
| <span class="effect-name">Vignette</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-noise" /> | ||
| <span class="effect-name">Noise</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-pixelate" /> |
There was a problem hiding this comment.
The application includes various interactive elements such as checkboxes and buttons that could be susceptible to XSS (Cross-Site Scripting) attacks if not properly handled.
Recommendation: Ensure that any dynamic content or user input is properly sanitized before being rendered on the page. Additionally, consider implementing a Content Security Policy (CSP) to help mitigate the risk of XSS attacks by restricting the sources from which scripts can be loaded and executed.
Example CSP implementation:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted-source.com;">| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
Performance Issue: Synchronous Script Loading
The scripts are loaded synchronously at the end of the HTML document. This can block the page rendering until all scripts are downloaded and executed, potentially leading to performance issues on slower networks.
Recommendation:
Consider using the async or defer attributes in the script tags. This allows the browser to download the scripts in parallel to parsing the HTML, and execute them at an appropriate time without blocking the DOM construction:
<script src="scripts/app.js" async></script>| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
The script tags at the end of the document are loaded synchronously, which can lead to performance issues if these scripts are large, as they block the browser's main thread until they are fully downloaded and executed. To improve page load times and user experience, consider adding the async or defer attributes to these script tags. This allows the browser to download the scripts in parallel to parsing the HTML, and execute them at the appropriate time without blocking the rendering of the page.
For example:
<script async src="scripts/canvas/PixelCanvas.js"></script>| <input type="checkbox" id="effect-grain" /> | ||
| <span class="effect-name">Grain</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-static" /> | ||
| <span class="effect-name">Static</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-glitch" /> | ||
| <span class="effect-name">Glitch</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-crt" /> | ||
| <span class="effect-name">CRT</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-scanlines" /> | ||
| <span class="effect-name">Scanlines</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-vignette" /> | ||
| <span class="effect-name">Vignette</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-noise" /> | ||
| <span class="effect-name">Noise</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-pixelate" /> | ||
| <span class="effect-name">Pixelate</span> | ||
| </label> |
There was a problem hiding this comment.
The HTML file includes various user input elements such as checkboxes and buttons without any apparent sanitization or encoding mechanisms to prevent XSS (Cross-Site Scripting) attacks. It's crucial to ensure that any user input or external content is properly handled to avoid security vulnerabilities. Implementing content security policies (CSP), sanitizing inputs, and encoding outputs are recommended practices to enhance security. Additionally, consider using HTTP headers like X-Content-Type-Options and X-XSS-Protection to provide additional layers of security.
| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
Performance Optimization for Script Loading
The scripts are loaded sequentially at the end of the HTML document. This approach can delay the page's interactive state as browsers must parse and execute all scripts before the page becomes interactive.
Recommendation:
- Use the
asyncordeferattributes for non-critical scripts to allow the browser to continue parsing the HTML document while the scripts are being downloaded and executed. This can significantly improve the loading performance and user experience.
For example:
<script src="scripts/canvas/PixelCanvas.js" defer></script>This change ensures that the scripts do not block the HTML parsing, leading to a quicker interactive state.
| <link rel="stylesheet" href="styles/main.css" /> | ||
| <link | ||
| rel="stylesheet" | ||
| href="styles/themes/lain-dive.css" | ||
| id="theme-stylesheet" | ||
| /> | ||
| <link rel="stylesheet" href="styles/components/canvas.css" /> | ||
| <link rel="stylesheet" href="styles/components/timeline.css" /> | ||
| <link rel="stylesheet" href="styles/components/tools.css" /> | ||
| <link rel="stylesheet" href="styles/components/menus.css" /> | ||
| </head> |
There was a problem hiding this comment.
Optimization of Resource Loading
Multiple CSS files are linked in the <head> section, which can increase the number of HTTP requests and potentially delay the rendering of the page.
Recommendation:
- Consider combining CSS files into a single stylesheet to reduce HTTP requests. This can be achieved through a build process that concatenates and minifies CSS files.
- Alternatively, use HTTP/2 server push to efficiently load multiple resources.
This optimization will help in reducing the load time and improving the performance of the web application.
| <link rel="stylesheet" href="styles/main.css" /> | ||
| <link | ||
| rel="stylesheet" | ||
| href="styles/themes/lain-dive.css" | ||
| id="theme-stylesheet" | ||
| /> | ||
| <link rel="stylesheet" href="styles/components/canvas.css" /> | ||
| <link rel="stylesheet" href="styles/components/timeline.css" /> | ||
| <link rel="stylesheet" href="styles/components/tools.css" /> | ||
| <link rel="stylesheet" href="styles/components/menus.css" /> |
There was a problem hiding this comment.
Performance Optimization: Multiple CSS Files
The HTML includes several CSS files (lines 7-16), each loaded with a separate HTTP request. This can increase page load times, especially if these files are large or hosted on slow servers.
Recommendation: Consider combining these CSS files into a single stylesheet or using CSS preprocessors like SASS or LESS, which can compile multiple files into one. Additionally, ensure that these stylesheets are minified to reduce their size and improve loading times.
| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
Security and Maintainability: Multiple JavaScript Files
The HTML file loads multiple JavaScript files (lines 342-355), which could lead to performance issues and make the application harder to maintain. Each script tag generates an HTTP request, potentially delaying the interactive readiness of the page.
Recommendation: Bundle these JavaScript files into a single file using tools like Webpack or Rollup. This not only reduces the number of HTTP requests but also helps in managing dependencies more effectively. Additionally, ensure that scripts are loaded with the async or defer attributes to prevent blocking the rendering of the page.
| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
Performance Optimization: Script Loading
The scripts are loaded at the end of the body, which is good for preventing render-blocking. However, to further enhance the page load performance, consider using the async or defer attributes for external scripts. This allows the browser to download the scripts in parallel without blocking the document parsing.
Recommendation:
Add async or defer attributes to the script tags to improve loading times and user experience. For example:
<script async src="scripts/canvas/PixelCanvas.js"></script>
<script defer src="scripts/animation/Timeline.js"></script>This change will help in loading pages faster, especially if the scripts are large or depend on external network conditions.
| <input type="checkbox" id="effect-grain" /> | ||
| <span class="effect-name">Grain</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-static" /> | ||
| <span class="effect-name">Static</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-glitch" /> | ||
| <span class="effect-name">Glitch</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-crt" /> | ||
| <span class="effect-name">CRT</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-scanlines" /> | ||
| <span class="effect-name">Scanlines</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-vignette" /> | ||
| <span class="effect-name">Vignette</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-noise" /> | ||
| <span class="effect-name">Noise</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-pixelate" /> |
There was a problem hiding this comment.
The input elements such as checkboxes and range inputs in the document do not have any visible form of input validation or sanitization. This can pose a security risk, particularly from Cross-Site Scripting (XSS) attacks, if user inputs are processed or displayed without proper handling. It is recommended to implement input validation both client-side and server-side to ensure that only expected types of data are processed.
For instance, ensuring that numeric inputs do not accept non-numeric characters can be a start. Additionally, any user input that is reflected on the page should be properly escaped to prevent malicious scripts from being executed.
| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
Performance Optimization: Script Loading
The HTML file loads multiple JavaScript files synchronously, which can block the rendering of the page until all scripts are downloaded and executed. This can negatively impact the page's load time and user experience.
Recommendation:
- Consider combining these scripts into a single file or using JavaScript modules to reduce the number of HTTP requests and improve caching. Additionally, you can use the
asyncordeferattributes in the script tags to allow asynchronous or deferred loading of scripts, which can help in non-blocking behavior and faster page rendering.
| <script src="scripts/canvas/PixelCanvas.js"></script> | ||
| <script src="scripts/canvas/dithering.js"></script> | ||
| <script src="scripts/canvas/effects.js"></script> | ||
| <script src="scripts/animation/Timeline.js"></script> | ||
| <script src="scripts/animation/Frame.js"></script> | ||
| <script src="scripts/animation/GifExporter.js"></script> | ||
| <script src="scripts/tools/BrushEngine.js"></script> | ||
| <script src="scripts/tools/SymmetryTools.js"></script> | ||
| <script src="scripts/tools/PaletteTool.js"></script> | ||
| <script src="scripts/tools/GlitchTool.js"></script> | ||
| <script src="scripts/ui/UIManager.js"></script> | ||
| <script src="scripts/ui/ThemeManager.js"></script> | ||
| <script src="scripts/ui/MenuSystem.js"></script> | ||
| <script src="scripts/app.js"></script> |
There was a problem hiding this comment.
Enhancing Security: Content Security Policy (CSP)
The HTML file does not specify any Content Security Policy (CSP), which is a crucial security layer to help prevent cross-site scripting (XSS) attacks and other cross-site injections.
Recommendation:
- Implement a CSP by adding an appropriate
Content-Security-Policyheader in your server configuration or within a<meta>tag in the HTML file. This policy should restrict the sources from which scripts can be loaded, disallow inline scripts, and define other rules that fit the security needs of your application. This will help in mitigating potential XSS vulnerabilities and enhance the overall security of the web application.
| <link rel="stylesheet" href="styles/main.css" /> | ||
| <link | ||
| rel="stylesheet" | ||
| href="styles/themes/lain-dive.css" | ||
| id="theme-stylesheet" | ||
| /> | ||
| <link rel="stylesheet" href="styles/components/canvas.css" /> | ||
| <link rel="stylesheet" href="styles/components/timeline.css" /> | ||
| <link rel="stylesheet" href="styles/components/tools.css" /> | ||
| <link rel="stylesheet" href="styles/components/menus.css" /> |
There was a problem hiding this comment.
Performance Optimization: Combine CSS Files
Multiple CSS files are being loaded (lines 7-16), which can increase the number of HTTP requests and potentially slow down the page load time. Consider combining these files into a single stylesheet or using a CSS preprocessor like SASS, which can help manage stylesheets more efficiently while reducing the number of HTTP requests.
| <body class="theme-lain-dive"> | ||
| <div id="app-container"> | ||
| <!-- Custom Window Frame --> | ||
| <div id="title-bar"> | ||
| <div id="title-bar-text">Conjuration</div> | ||
| <div id="title-bar-controls"> | ||
| <button type="button" id="minimize-button" class="title-bar-button"> | ||
| _ | ||
| </button> | ||
| <button type="button" id="maximize-button" class="title-bar-button"> | ||
| [] | ||
| </button> | ||
| <button type="button" id="close-button" class="title-bar-button"> | ||
| x | ||
| </button> | ||
| </div> | ||
| </div> | ||
| </div> | ||
|
|
||
| <!-- Menu Bar (moved to top) --> | ||
| <div id="menu-bar"> | ||
| <button type="button" id="file-menu-button" class="menu-button">FILE</button> | ||
| <button type="button" id="edit-menu-button" class="menu-button">EDIT</button> | ||
| <button type="button" id="view-menu-button" class="menu-button">VIEW</button> | ||
| <button type="button" id="export-menu-button" class="menu-button">EXPORT</button> | ||
| <button type="button" id="lore-menu-button" class="menu-button">LORE</button> | ||
| <div id="status-bar"> | ||
| <span id="status-message">READY</span> | ||
| <!-- Menu Bar (moved to top) --> | ||
| <div id="menu-bar"> | ||
| <button type="button" id="file-menu-button" class="menu-button"> | ||
| FILE | ||
| </button> | ||
| <button type="button" id="edit-menu-button" class="menu-button"> | ||
| EDIT | ||
| </button> | ||
| <button type="button" id="view-menu-button" class="menu-button"> | ||
| VIEW | ||
| </button> | ||
| <button type="button" id="export-menu-button" class="menu-button"> | ||
| EXPORT | ||
| </button> | ||
| <button type="button" id="lore-menu-button" class="menu-button"> | ||
| LORE | ||
| </button> | ||
| <div id="status-bar"> | ||
| <span id="status-message">READY</span> | ||
| </div> | ||
| </div> | ||
| </div> | ||
|
|
||
| <!-- Main App Interface --> | ||
| <div id="app-content"> | ||
| <!-- Left Panel: Tools --> | ||
| <div id="tools-panel" class="side-panel"> | ||
| <div class="panel-content"> | ||
| <div class="panel-header"> | ||
| <span class="panel-title">TOOLS</span> | ||
| </div> | ||
|
|
||
| <div class="tool-section"> | ||
| <div class="section-title">BRUSH</div> | ||
| <div class="tool-grid"> | ||
| <button type="button" class="tool-button" id="brush-pencil" title="Pencil"> | ||
| <span class="tool-icon">+</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-brush" title="Brush"> | ||
| <span class="tool-icon">B</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-spray" title="Spray"> | ||
| <span class="tool-icon">S</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-pixel" title="Pixel"> | ||
| <span class="tool-icon">P</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-line" title="Line"> | ||
| <span class="tool-icon">/</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-rect" title="Rectangle"> | ||
| <span class="tool-icon">[]</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-ellipse" title="Ellipse"> | ||
| <span class="tool-icon">O</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-dither" title="Dither"> | ||
| <span class="tool-icon">D</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-pattern" title="Pattern"> | ||
| <span class="tool-icon">@</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-glitch" title="Glitch"> | ||
| <span class="tool-icon">%</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-static" title="Static"> | ||
| <span class="tool-icon">#</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-eraser" title="Eraser"> | ||
| <span class="tool-icon">X</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="brush-fill" title="Fill"> | ||
| <span class="tool-icon">■</span> | ||
| </button> | ||
| <!-- Main App Interface --> | ||
| <div id="app-content"> | ||
| <!-- Left Panel: Tools --> | ||
| <div id="tools-panel" class="side-panel"> | ||
| <div class="panel-content"> | ||
| <div class="panel-header"> | ||
| <span class="panel-title">TOOLS</span> | ||
| </div> | ||
|
|
||
| <div class="brush-size-control"> | ||
| <div class="brush-size-label"> | ||
| <span>Brush Size</span> | ||
| <span class="brush-size-value" id="brush-size-value">1</span> | ||
| <div class="tool-section"> | ||
| <div class="section-title">BRUSH</div> | ||
| <div class="tool-grid"> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-pencil" | ||
| title="Pencil" | ||
| > | ||
| <span class="tool-icon">+</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-brush" | ||
| title="Brush" | ||
| > | ||
| <span class="tool-icon">B</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-spray" | ||
| title="Spray" | ||
| > | ||
| <span class="tool-icon">S</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-pixel" | ||
| title="Pixel" | ||
| > | ||
| <span class="tool-icon">P</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-line" | ||
| title="Line" | ||
| > | ||
| <span class="tool-icon">/</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-rect" | ||
| title="Rectangle" | ||
| > | ||
| <span class="tool-icon">[]</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-ellipse" | ||
| title="Ellipse" | ||
| > | ||
| <span class="tool-icon">O</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-dither" | ||
| title="Dither" | ||
| > | ||
| <span class="tool-icon">D</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-pattern" | ||
| title="Pattern" | ||
| > | ||
| <span class="tool-icon">@</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-glitch" | ||
| title="Glitch" | ||
| > | ||
| <span class="tool-icon">%</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-static" | ||
| title="Static" | ||
| > | ||
| <span class="tool-icon">#</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-eraser" | ||
| title="Eraser" | ||
| > | ||
| <span class="tool-icon">X</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="brush-fill" | ||
| title="Fill" | ||
| > | ||
| <span class="tool-icon">■</span> | ||
| </button> | ||
| </div> | ||
| <input type="range" id="brush-size" min="1" max="10" value="1"> | ||
| </div> | ||
| </div> | ||
|
|
||
| <div class="tool-section"> | ||
| <div class="section-title">SYMMETRY</div> | ||
| <div class="tool-grid"> | ||
| <button type="button" class="tool-button" id="symmetry-none" title="No Symmetry"> | ||
| <span class="tool-icon">1</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="symmetry-horizontal" title="Horizontal Mirror"> | ||
| <span class="tool-icon">-</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="symmetry-vertical" title="Vertical Mirror"> | ||
| <span class="tool-icon">|</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="symmetry-quad" title="Quadrant"> | ||
| <span class="tool-icon">+</span> | ||
| </button> | ||
| <button type="button" class="tool-button" id="symmetry-octal" title="Octal"> | ||
| <span class="tool-icon">*</span> | ||
| </button> | ||
| <div class="brush-size-control"> | ||
| <div class="brush-size-label"> | ||
| <span>Brush Size</span> | ||
| <span class="brush-size-value" id="brush-size-value">1</span> | ||
| </div> | ||
| <input | ||
| type="range" | ||
| id="brush-size" | ||
| min="1" | ||
| max="10" | ||
| value="1" | ||
| /> | ||
| </div> | ||
| </div> | ||
| </div> | ||
|
|
||
| <div class="tool-section"> | ||
| <div class="section-title">PALETTE</div> | ||
| <div class="palette-selector"> | ||
| <div class="palette-option" id="palette-monochrome"> | ||
| <span class="palette-preview monochrome"></span> | ||
| <span class="palette-name">MONO</span> | ||
| </div> | ||
| <div class="palette-option" id="palette-lain"> | ||
| <span class="palette-preview lain"></span> | ||
| <span class="palette-name">LAIN</span> | ||
| </div> | ||
| <div class="palette-option" id="palette-red"> | ||
| <span class="palette-preview red"></span> | ||
| <span class="palette-name">RED</span> | ||
| </div> | ||
| <div class="palette-option" id="palette-green"> | ||
| <span class="palette-preview green"></span> | ||
| <span class="palette-name">GREEN</span> | ||
| <div class="tool-section"> | ||
| <div class="section-title">SYMMETRY</div> | ||
| <div class="tool-grid"> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="symmetry-none" | ||
| title="No Symmetry" | ||
| > | ||
| <span class="tool-icon">1</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="symmetry-horizontal" | ||
| title="Horizontal Mirror" | ||
| > | ||
| <span class="tool-icon">-</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="symmetry-vertical" | ||
| title="Vertical Mirror" | ||
| > | ||
| <span class="tool-icon">|</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="symmetry-quad" | ||
| title="Quadrant" | ||
| > | ||
| <span class="tool-icon">+</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| class="tool-button" | ||
| id="symmetry-octal" | ||
| title="Octal" | ||
| > | ||
| <span class="tool-icon">*</span> | ||
| </button> | ||
| </div> | ||
| </div> | ||
| </div> | ||
|
|
||
| <div class="tool-section"> | ||
| <div class="section-title">EFFECTS</div> | ||
| <div class="effect-options"> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-grain"> | ||
| <span class="effect-name">Grain</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-static"> | ||
| <span class="effect-name">Static</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-glitch"> | ||
| <span class="effect-name">Glitch</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-crt"> | ||
| <span class="effect-name">CRT</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-scanlines"> | ||
| <span class="effect-name">Scanlines</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-vignette"> | ||
| <span class="effect-name">Vignette</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-noise"> | ||
| <span class="effect-name">Noise</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-pixelate"> | ||
| <span class="effect-name">Pixelate</span> | ||
| </label> | ||
| </div> | ||
| <div class="effect-intensity"> | ||
| <span class="intensity-label">Intensity</span> | ||
| <input type="range" id="effect-intensity" min="0" max="100" value="50"> | ||
| <div class="tool-section"> | ||
| <div class="section-title">PALETTE</div> | ||
| <div class="palette-selector"> | ||
| <div class="palette-option" id="palette-monochrome"> | ||
| <span class="palette-preview monochrome"></span> | ||
| <span class="palette-name">MONO</span> | ||
| </div> | ||
| <div class="palette-option" id="palette-lain"> | ||
| <span class="palette-preview lain"></span> | ||
| <span class="palette-name">LAIN</span> | ||
| </div> | ||
| <div class="palette-option" id="palette-red"> | ||
| <span class="palette-preview red"></span> | ||
| <span class="palette-name">RED</span> | ||
| </div> | ||
| <div class="palette-option" id="palette-green"> | ||
| <span class="palette-preview green"></span> | ||
| <span class="palette-name">GREEN</span> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| </div> | ||
|
|
||
| <!-- Center: Canvas Area --> | ||
| <div id="canvas-container"> | ||
| <div id="canvas-wrapper"> | ||
| <canvas id="pixel-canvas"></canvas> | ||
| <canvas id="effects-canvas" class="overlay-canvas"></canvas> | ||
| <canvas id="ui-canvas" class="overlay-canvas"></canvas> | ||
| </div> | ||
| <div id="canvas-info"> | ||
| <div id="zoom-controls"> | ||
| <button type="button" id="zoom-out">-</button> | ||
| <span id="zoom-level">100%</span> | ||
| <button type="button" id="zoom-in">+</button> | ||
| <div class="tool-section"> | ||
| <div class="section-title">EFFECTS</div> | ||
| <div class="effect-options"> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-grain" /> | ||
| <span class="effect-name">Grain</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-static" /> | ||
| <span class="effect-name">Static</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-glitch" /> | ||
| <span class="effect-name">Glitch</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-crt" /> | ||
| <span class="effect-name">CRT</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-scanlines" /> | ||
| <span class="effect-name">Scanlines</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-vignette" /> | ||
| <span class="effect-name">Vignette</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-noise" /> | ||
| <span class="effect-name">Noise</span> | ||
| </label> | ||
| <label class="effect-checkbox"> | ||
| <input type="checkbox" id="effect-pixelate" /> | ||
| <span class="effect-name">Pixelate</span> | ||
| </label> | ||
| </div> | ||
| <div class="effect-intensity"> | ||
| <span class="intensity-label">Intensity</span> | ||
| <input | ||
| type="range" | ||
| id="effect-intensity" | ||
| min="0" | ||
| max="100" | ||
| value="50" | ||
| /> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| <div id="canvas-size">64x64</div> | ||
| <div id="cursor-position">X: 0 Y: 0</div> | ||
| </div> | ||
| </div> | ||
|
|
||
| <!-- Right Panel: Timeline & Animation --> | ||
| <div id="timeline-panel" class="side-panel"> | ||
| <div class="panel-content"> | ||
| <div class="panel-header"> | ||
| <span class="panel-title">FRAMES</span> | ||
| <!-- Center: Canvas Area --> | ||
| <div id="canvas-container"> | ||
| <div id="canvas-wrapper"> | ||
| <canvas id="pixel-canvas"></canvas> | ||
| <canvas id="effects-canvas" class="overlay-canvas"></canvas> | ||
| <canvas id="ui-canvas" class="overlay-canvas"></canvas> | ||
| </div> | ||
|
|
||
| <div class="timeline-controls"> | ||
| <button type="button" id="add-frame" class="control-button"> | ||
| <span class="button-icon">+</span> | ||
| </button> | ||
| <button type="button" id="duplicate-frame" class="control-button"> | ||
| <span class="button-icon">D</span> | ||
| </button> | ||
| <button type="button" id="delete-frame" class="control-button"> | ||
| <span class="button-icon">-</span> | ||
| </button> | ||
| <div id="canvas-info"> | ||
| <div id="zoom-controls"> | ||
| <button type="button" id="zoom-out">-</button> | ||
| <span id="zoom-level">100%</span> | ||
| <button type="button" id="zoom-in">+</button> | ||
| </div> | ||
| <div id="canvas-size">64x64</div> | ||
| <div id="cursor-position">X: 0 Y: 0</div> | ||
| </div> | ||
| </div> | ||
|
|
||
| <div id="frames-container"> | ||
| <!-- Frame thumbnails will be added here by JavaScript --> | ||
| </div> | ||
| <!-- Right Panel: Timeline & Animation --> | ||
| <div id="timeline-panel" class="side-panel"> | ||
| <div class="panel-content"> | ||
| <div class="panel-header"> | ||
| <span class="panel-title">FRAMES</span> | ||
| </div> | ||
|
|
||
| <div class="animation-controls"> | ||
| <div class="section-title">ANIMATION</div> | ||
| <div class="control-group"> | ||
| <button type="button" id="play-animation" class="control-button"> | ||
| <span class="button-icon">▶</span> | ||
| <div class="timeline-controls"> | ||
| <button type="button" id="add-frame" class="control-button"> | ||
| <span class="button-icon">+</span> | ||
| </button> | ||
| <button type="button" id="stop-animation" class="control-button"> | ||
| <span class="button-icon">■</span> | ||
| <button type="button" id="duplicate-frame" class="control-button"> | ||
| <span class="button-icon">D</span> | ||
| </button> | ||
| <button type="button" id="loop-animation" class="control-button toggle-button"> | ||
| <span class="button-icon">↻</span> | ||
| <button type="button" id="delete-frame" class="control-button"> | ||
| <span class="button-icon">-</span> | ||
| </button> | ||
| </div> | ||
| <div class="control-group"> | ||
| <label for="frame-delay">Delay (ms)</label> | ||
| <input type="number" id="frame-delay" min="10" max="1000" step="10" value="100"> | ||
|
|
||
| <div id="frames-container"> | ||
| <!-- Frame thumbnails will be added here by JavaScript --> | ||
| </div> | ||
| <div class="control-group"> | ||
| <label for="onion-skin">Onion Skin</label> | ||
| <input type="checkbox" id="onion-skin"> | ||
|
|
||
| <div class="animation-controls"> | ||
| <div class="section-title">ANIMATION</div> | ||
| <div class="control-group"> | ||
| <button | ||
| type="button" | ||
| id="play-animation" | ||
| class="control-button" | ||
| > | ||
| <span class="button-icon">▶</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| id="stop-animation" | ||
| class="control-button" | ||
| > | ||
| <span class="button-icon">■</span> | ||
| </button> | ||
| <button | ||
| type="button" | ||
| id="loop-animation" | ||
| class="control-button toggle-button" | ||
| > | ||
| <span class="button-icon">↻</span> | ||
| </button> | ||
| </div> | ||
| <div class="control-group"> | ||
| <label for="frame-delay">Delay (ms)</label> | ||
| <input | ||
| type="number" | ||
| id="frame-delay" | ||
| min="10" | ||
| max="1000" | ||
| step="10" | ||
| value="100" | ||
| /> | ||
| </div> | ||
| <div class="control-group"> | ||
| <label for="onion-skin">Onion Skin</label> | ||
| <input type="checkbox" id="onion-skin" /> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| </div> | ||
|
|
||
|
|
||
| <!-- Drop-down Menus --> | ||
| <div id="file-menu" class="menu-dropdown"> | ||
| <button type="button" class="menu-item" id="new-project"> | ||
| New Project | ||
| </button> | ||
| <button type="button" class="menu-item" id="open-project"> | ||
| Open Project | ||
| </button> | ||
| <button type="button" class="menu-item" id="save-project"> | ||
| Save Project | ||
| </button> | ||
| <button type="button" class="menu-item" id="save-project-as"> | ||
| Save Project As | ||
| </button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="exit-app">Exit</button> | ||
| </div> | ||
|
|
||
| <!-- Drop-down Menus --> | ||
| <div id="file-menu" class="menu-dropdown"> | ||
| <button type="button" class="menu-item" id="new-project">New Project</button> | ||
| <button type="button" class="menu-item" id="open-project">Open Project</button> | ||
| <button type="button" class="menu-item" id="save-project">Save Project</button> | ||
| <button type="button" class="menu-item" id="save-project-as">Save Project As</button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="exit-app">Exit</button> | ||
| </div> | ||
| <div id="edit-menu" class="menu-dropdown"> | ||
| <button type="button" class="menu-item" id="undo">Undo</button> | ||
| <button type="button" class="menu-item" id="redo">Redo</button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="cut">Cut</button> | ||
| <button type="button" class="menu-item" id="copy">Copy</button> | ||
| <button type="button" class="menu-item" id="paste">Paste</button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="select-all"> | ||
| Select All | ||
| </button> | ||
| <button type="button" class="menu-item" id="deselect">Deselect</button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="resize-canvas"> | ||
| Resize Canvas | ||
| </button> | ||
| </div> | ||
|
|
||
| <div id="edit-menu" class="menu-dropdown"> | ||
| <button type="button" class="menu-item" id="undo">Undo</button> | ||
| <button type="button" class="menu-item" id="redo">Redo</button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="cut">Cut</button> | ||
| <button type="button" class="menu-item" id="copy">Copy</button> | ||
| <button type="button" class="menu-item" id="paste">Paste</button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="select-all">Select All</button> | ||
| <button type="button" class="menu-item" id="deselect">Deselect</button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="resize-canvas">Resize Canvas</button> | ||
| </div> | ||
| <div id="view-menu" class="menu-dropdown"> | ||
| <button type="button" class="menu-item" id="theme-lain-dive"> | ||
| Lain Dive Theme | ||
| </button> | ||
| <button type="button" class="menu-item" id="theme-morrowind-glyph"> | ||
| Morrowind Glyph Theme | ||
| </button> | ||
| <button type="button" class="menu-item" id="theme-monolith"> | ||
| Monolith Theme | ||
| </button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="zoom-in-menu"> | ||
| Zoom In | ||
| </button> | ||
| <button type="button" class="menu-item" id="zoom-out-menu"> | ||
| Zoom Out | ||
| </button> | ||
| <button type="button" class="menu-item" id="zoom-reset"> | ||
| Reset Zoom | ||
| </button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="toggle-grid"> | ||
| Toggle Grid | ||
| </button> | ||
| <button type="button" class="menu-item" id="toggle-rulers"> | ||
| Toggle Rulers | ||
| </button> | ||
| </div> | ||
|
|
||
| <div id="view-menu" class="menu-dropdown"> | ||
| <button type="button" class="menu-item" id="theme-lain-dive">Lain Dive Theme</button> | ||
| <button type="button" class="menu-item" id="theme-morrowind-glyph">Morrowind Glyph Theme</button> | ||
| <button type="button" class="menu-item" id="theme-monolith">Monolith Theme</button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="zoom-in-menu">Zoom In</button> | ||
| <button type="button" class="menu-item" id="zoom-out-menu">Zoom Out</button> | ||
| <button type="button" class="menu-item" id="zoom-reset">Reset Zoom</button> | ||
| <div class="menu-separator"></div> | ||
| <button type="button" class="menu-item" id="toggle-grid">Toggle Grid</button> | ||
| <button type="button" class="menu-item" id="toggle-rulers">Toggle Rulers</button> | ||
| </div> | ||
| <div id="export-menu" class="menu-dropdown"> | ||
| <button type="button" class="menu-item" id="export-png"> | ||
| Export Current Frame (PNG) | ||
| </button> | ||
| <button type="button" class="menu-item" id="export-gif"> | ||
| Export Animation (GIF) | ||
| </button> | ||
| <button type="button" class="menu-item" id="export-sprite-sheet"> | ||
| Export Sprite Sheet | ||
| </button> | ||
| </div> | ||
|
|
||
| <div id="export-menu" class="menu-dropdown"> | ||
| <button type="button" class="menu-item" id="export-png">Export Current Frame (PNG)</button> | ||
| <button type="button" class="menu-item" id="export-gif">Export Animation (GIF)</button> | ||
| <button type="button" class="menu-item" id="export-sprite-sheet">Export Sprite Sheet</button> | ||
| </div> | ||
| <div id="lore-menu" class="menu-dropdown"> | ||
| <button type="button" class="menu-item" id="toggle-lore-layer"> | ||
| Toggle Lore Layer | ||
| </button> | ||
| <button type="button" class="menu-item" id="edit-metadata"> | ||
| Edit Metadata Ritual | ||
| </button> | ||
| <button type="button" class="menu-item" id="add-sigil"> | ||
| Add Hidden Sigil | ||
| </button> | ||
| <button type="button" class="menu-item" id="glitch-inject"> | ||
| Inject Glitch | ||
| </button> | ||
| </div> | ||
|
|
||
| <div id="lore-menu" class="menu-dropdown"> | ||
| <button type="button" class="menu-item" id="toggle-lore-layer">Toggle Lore Layer</button> | ||
| <button type="button" class="menu-item" id="edit-metadata">Edit Metadata Ritual</button> | ||
| <button type="button" class="menu-item" id="add-sigil">Add Hidden Sigil</button> | ||
| <button type="button" class="menu-item" id="glitch-inject">Inject Glitch</button> | ||
| </div> | ||
| <!-- Modal Dialogs --> | ||
| <div id="modal-container" class="hidden"> | ||
| <div id="modal-content"></div> | ||
| </div> | ||
|
|
||
| <!-- Modal Dialogs --> | ||
| <div id="modal-container" class="hidden"> | ||
| <div id="modal-content"></div> | ||
| <!-- Toast Notifications --> | ||
| <div id="toast-container"></div> | ||
| </div> |
There was a problem hiding this comment.
Maintainability Improvement: Use Semantic HTML and Component Breakdown
The current HTML structure is extensive and complex, making it difficult to maintain and debug. Consider using more semantic HTML tags (like <section>, <article>, <nav>, etc.) to improve the document's structure. Additionally, breaking down the file into smaller components (if using a framework like React or Angular) or partials (in server-side rendered applications) can enhance readability and maintainability.
This commit fixes the style issues introduced in 9b90eff according to the output
from Prettier and StandardJS.
Details: None