Skip to content

UI fixes#997

Merged
hatemhosny merged 3 commits into
developfrom
ui-fixes
Jun 19, 2026
Merged

UI fixes#997
hatemhosny merged 3 commits into
developfrom
ui-fixes

Conversation

@hatemhosny

@hatemhosny hatemhosny commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

Summary by CodeRabbit

  • Style

    • Enhanced focus styling and visual feedback for interactive elements across the application.
    • Updated color scheme consistency in modals and refined menu display behavior.
    • Removed unnecessary outline effects on editor components.
  • Accessibility

    • Added descriptive titles to application and embedded iframes for improved screen reader compatibility.

@netlify

netlify Bot commented Jun 19, 2026

Copy link
Copy Markdown

Deploy Preview for livecodes ready!

Name Link
🔨 Latest commit 49ce085
🔍 Latest deploy log https://app.netlify.com/projects/livecodes/deploys/6a3565aa77a2fa000883b07a
😎 Deploy Preview https://deploy-preview-997--livecodes.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 1.1 MB

ℹ️ View Unchanged
Filename Size Change
build/404.html 1.45 kB 0 B
build/app.html 250 B 0 B
build/index.html 1.57 kB -2 B (-0.13%)
build/livecodes/app.css 23.7 kB -48 B (-0.2%)
build/livecodes/app.js 113 kB +50 B (+0.04%)
build/livecodes/assets.js 8.66 kB +32 B (+0.37%)
build/livecodes/assets/noop.js 18 B 0 B
build/livecodes/assets/templates/diagrams-starter.html 2.19 kB 0 B
build/livecodes/backup.js 3.74 kB -3 B (-0.08%)
build/livecodes/blockly.js 15.1 kB 0 B
build/livecodes/broadcast.js 1.19 kB -1 B (-0.08%)
build/livecodes/bundle-types.js 4.41 kB 0 B
build/livecodes/code-to-image.js 11 kB +8 B (+0.07%)
build/livecodes/codejar.js 19.4 kB 0 B
build/livecodes/codemirror.js 17 kB 0 B
build/livecodes/compile.page.js 2.45 kB 0 B
build/livecodes/compile.worker.js 15.2 kB 0 B
build/livecodes/compiler-utils.js 3.17 kB 0 B
build/livecodes/custom-editor-utils.js 198 B 0 B
build/livecodes/deploy.js 6.91 kB -28 B (-0.4%)
build/livecodes/editor-settings.js 22.1 kB -25 B (-0.11%)
build/livecodes/embed-ui.js 5.51 kB -4 B (-0.07%)
build/livecodes/embed.js 91.4 kB -86 B (-0.09%)
build/livecodes/export.js 3.91 kB 0 B
build/livecodes/firebase.js 22.7 kB 0 B
build/livecodes/format.worker.js 14.4 kB 0 B
build/livecodes/google-fonts.js 7.12 kB 0 B
build/livecodes/headless.js 80 kB +12 B (+0.02%)
build/livecodes/i18n-ar-language-info.json 5.34 kB 0 B
build/livecodes/i18n-ar-translation.json 9.34 kB 0 B
build/livecodes/i18n-bn-language-info.json 5.76 kB 0 B
build/livecodes/i18n-bn-translation.json 9.68 kB 0 B
build/livecodes/i18n-de-language-info.json 5.4 kB 0 B
build/livecodes/i18n-de-translation.json 9.47 kB 0 B
build/livecodes/i18n-en-language-info.json 4.63 kB 0 B
build/livecodes/i18n-en-translation.json 8.06 kB 0 B
build/livecodes/i18n-es-language-info.json 5.12 kB 0 B
build/livecodes/i18n-es-translation.json 9.19 kB 0 B
build/livecodes/i18n-fa-language-info.json 5.52 kB 0 B
build/livecodes/i18n-fa-translation.json 9.5 kB 0 B
build/livecodes/i18n-fr-language-info.json 5.31 kB 0 B
build/livecodes/i18n-fr-translation.json 9.45 kB 0 B
build/livecodes/i18n-hi-language-info.json 5.93 kB 0 B
build/livecodes/i18n-hi-translation.json 9.99 kB 0 B
build/livecodes/i18n-hu-language-info.json 5.29 kB 0 B
build/livecodes/i18n-hu-translation.json 9.38 kB 0 B
build/livecodes/i18n-id-language-info.json 4.87 kB 0 B
build/livecodes/i18n-id-translation.json 8.71 kB 0 B
build/livecodes/i18n-it-language-info.json 5.17 kB 0 B
build/livecodes/i18n-it-translation.json 9.26 kB 0 B
build/livecodes/i18n-ja-language-info.json 5.72 kB 0 B
build/livecodes/i18n-ja-translation.json 9.64 kB 0 B
build/livecodes/i18n-nl-language-info.json 5.07 kB 0 B
build/livecodes/i18n-nl-translation.json 8.91 kB 0 B
build/livecodes/i18n-pt-language-info.json 5.16 kB 0 B
build/livecodes/i18n-pt-translation.json 9.38 kB 0 B
build/livecodes/i18n-ru-language-info.json 5.7 kB 0 B
build/livecodes/i18n-ru-translation.json 10.3 kB 0 B
build/livecodes/i18n-tr-language-info.json 5.3 kB 0 B
build/livecodes/i18n-tr-translation.json 9.29 kB 0 B
build/livecodes/i18n-ur-language-info.json 5.97 kB 0 B
build/livecodes/i18n-ur-translation.json 9.81 kB 0 B
build/livecodes/i18n-zh-CN-language-info.json 5.01 kB 0 B
build/livecodes/i18n-zh-CN-translation.json 8.67 kB 0 B
build/livecodes/i18n.js 20.5 kB -9 B (-0.04%)
build/livecodes/import-src.js 17.9 kB 0 B
build/livecodes/import.js 16.3 kB -34 B (-0.21%)
build/livecodes/index.js 5.51 kB -7 B (-0.13%)
build/livecodes/lang-art-template-compiler.js 1.68 kB 0 B
build/livecodes/lang-assemblyscript-compiler.js 290 B 0 B
build/livecodes/lang-assemblyscript-script.js 386 B 0 B
build/livecodes/lang-astro-compiler.js 2.37 kB 0 B
build/livecodes/lang-clio-compiler.js 1.58 kB 0 B
build/livecodes/lang-commonlisp-script.js 123 B 0 B
build/livecodes/lang-cpp-script.js 1.96 kB 0 B
build/livecodes/lang-cpp-wasm-script.js 2.88 kB 0 B
build/livecodes/lang-csharp-wasm-script.js 2.21 kB 0 B
build/livecodes/lang-diagrams-compiler-esm.js 5.11 kB 0 B
build/livecodes/lang-dot-compiler.js 1.69 kB 0 B
build/livecodes/lang-ejs-compiler.js 1.66 kB 0 B
build/livecodes/lang-eta-compiler.js 1.68 kB 0 B
build/livecodes/lang-fennel-compiler.js 1.64 kB 0 B
build/livecodes/lang-gleam-compiler.js 3.13 kB 0 B
build/livecodes/lang-go-wasm-script.js 3.29 kB 0 B
build/livecodes/lang-haml-compiler.js 1.69 kB 0 B
build/livecodes/lang-handlebars-compiler.js 1.98 kB 0 B
build/livecodes/lang-imba-compiler.js 147 B 0 B
build/livecodes/lang-java-script.js 4.09 kB 0 B
build/livecodes/lang-jinja-compiler.js 1.67 kB 0 B
build/livecodes/lang-julia-script.js 3.32 kB 0 B
build/livecodes/lang-liquid-compiler.js 1.71 kB 0 B
build/livecodes/lang-lua-wasm-script.js 205 B 0 B
build/livecodes/lang-malina-compiler.js 2.98 kB 0 B
build/livecodes/lang-markdown-compiler.js 1.7 kB 0 B
build/livecodes/lang-markdown-script.js 1.47 kB 0 B
build/livecodes/lang-minizinc-script.js 2.09 kB 0 B
build/livecodes/lang-mustache-compiler.js 1.68 kB 0 B
build/livecodes/lang-nunjucks-compiler.js 2 kB 0 B
build/livecodes/lang-perl-script.js 268 B 0 B
build/livecodes/lang-php-wasm-script.js 347 B 0 B
build/livecodes/lang-postgresql-compiler-esm.js 1.76 kB 0 B
build/livecodes/lang-prolog-script.js 204 B 0 B
build/livecodes/lang-pug-compiler.js 371 B 0 B
build/livecodes/lang-python-wasm-script.js 1.89 kB 0 B
build/livecodes/lang-r-script-esm.js 2.47 kB 0 B
build/livecodes/lang-rescript-compiler-esm.js 2.19 kB 0 B
build/livecodes/lang-rescript-formatter.js 1.55 kB 0 B
build/livecodes/lang-riot-compiler.js 2.85 kB 0 B
build/livecodes/lang-ruby-wasm-script.js 1.75 kB 0 B
build/livecodes/lang-scss-compiler.js 1.85 kB 0 B
build/livecodes/lang-solid-compiler.js 263 B 0 B
build/livecodes/lang-sql-compiler.js 1.67 kB 0 B
build/livecodes/lang-sql-script.js 2.08 kB 0 B
build/livecodes/lang-svelte-compiler.js 4.73 kB 0 B
build/livecodes/lang-tcl-script.js 1.86 kB 0 B
build/livecodes/lang-teal-compiler.js 1.75 kB 0 B
build/livecodes/lang-twig-compiler.js 1.68 kB 0 B
build/livecodes/lang-vento-compiler.js 1.73 kB 0 B
build/livecodes/lang-vue-compiler.js 6.13 kB 0 B
build/livecodes/lang-vue2-compiler.js 3.5 kB 0 B
build/livecodes/lang-wat-compiler.js 348 B 0 B
build/livecodes/lang-wat-script.js 1.98 kB 0 B
build/livecodes/language-info.js 7.92 kB +5 B (+0.06%)
build/livecodes/monaco.js 22.3 kB 0 B
build/livecodes/open.js 6.25 kB +2 B (+0.03%)
build/livecodes/processor-lightningcss-compiler.js 1.91 kB 0 B
build/livecodes/processor-postcss-compiler.js 2.06 kB 0 B
build/livecodes/processor-tailwindcss-compiler.js 5.29 kB 0 B
build/livecodes/processor-unocss-compiler.js 355 B 0 B
build/livecodes/processor-windicss-compiler.js 450 B 0 B
build/livecodes/quill.css 697 B 0 B
build/livecodes/quill.js 5.86 kB 0 B
build/livecodes/resources.js 3.43 kB 0 B
build/livecodes/result-utils.js 1.17 kB 0 B
build/livecodes/share.js 3.84 kB -1 B (-0.03%)
build/livecodes/snippets.js 6.07 kB -17 B (-0.28%)
build/livecodes/sync-ui.js 3.29 kB 0 B
build/livecodes/sync.js 3.56 kB 0 B
build/livecodes/sync.worker.js 29.8 kB 0 B
build/livecodes/templates.js 27 kB 0 B
build/sdk/livecodes.js 4.43 kB +16 B (+0.36%)
build/sdk/livecodes.umd.js 5.23 kB +23 B (+0.44%)
build/sdk/package.json 456 B 0 B
build/sdk/preact.js 4.81 kB +10 B (+0.21%)
build/sdk/react.js 4.78 kB -7 B (-0.15%)
build/sdk/solid.js 4.94 kB +27 B (+0.55%)
build/sdk/svelte.js 4.4 kB +19 B (+0.43%)
build/sdk/vue.js 4.81 kB +15 B (+0.31%)
build/sdk/web-components.js 5.83 kB -7 B (-0.12%)

compressed-size-action

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying livecodes with  Cloudflare Pages  Cloudflare Pages

Latest commit: 49ce085
Status: ✅  Deploy successful!
Preview URL: https://5e1eb93a.livecodes.pages.dev
Branch Preview URL: https://ui-fixes.livecodes.pages.dev

View logs

@coderabbitai

coderabbitai Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Three iframes (Result, LiveCodes App, LiveCodes Embedded Playground) receive explicit title attributes for accessibility. CSS changes update snackbar button focus styling to use a theme token, suppress Monaco editor outline flashes, simplify project submenu visibility selectors, and switch modal tab active color to var(--outline-color).

Changes

Accessibility and UI Styling Fixes

Layer / File(s) Summary
Iframe title attributes
src/livecodes/core.ts, src/livecodes/main.ts, src/sdk/index.ts
Sets title to "Result", "LiveCodes App", and "LiveCodes Embedded Playground" on the respective iframes after creation.
CSS focus styling and UI fixes
src/livecodes/styles/app.scss, src/livecodes/styles/inc-menu.scss, src/livecodes/styles/inc-modal.scss
Replaces .snackbar--button:focus { outline: auto !important } with a themed outline rule; adds .monaco-editor { outline: none } to prevent focus flashes; narrows submenu visibility to #app-menu-project li:hover and :focus-within only; changes modal tab active border-bottom from var(--brand-cyan) to var(--outline-color).

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

  • live-codes/livecodes#994: Also modifies src/livecodes/styles/inc-menu.scss submenu hover/focus-visible selectors and focus/outline-related styling, directly overlapping with this PR's CSS changes.
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'UI fixes' is too vague and generic. It uses a non-descriptive term that doesn't convey the specific changes made (iframe titles, focus styling, menu styling, border colors). Use a more descriptive title that summarizes the main changes, such as 'Add accessible titles to iframes and refine focus styling' or 'Improve accessibility: add iframe titles and update focus/border styles'.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ui-fixes

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 Stylelint (17.13.0)
src/livecodes/styles/app.scss

ConfigurationError: Could not find "stylelint-config-sass-guidelines". Do you need to install the package or use the "configBasedir" option?
at getModulePath (file:///usr/local/lib/node_modules/stylelint/lib/utils/getModulePath.mjs:29:9)
at loadExtendedConfig (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:285:21)
at extendConfig (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:252:25)
at augmentConfigBasic (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:85:26)
at augmentConfigFull (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:138:30)
at getConfigForFile (file:///usr/local/lib/node_modules/stylelint/lib/getConfigForFile.mjs:102:32)
at async resolveOptionValue (file:///usr/local/lib/node_modules/stylelint/lib/utils/resolveOptionValue.mjs:27:24)
at async standalone (file:///usr/local/lib/node_modules/stylelint/lib/standalone.mjs:127:22)

src/livecodes/styles/inc-modal.scss

ConfigurationError: Could not find "stylelint-config-sass-guidelines". Do you need to install the package or use the "configBasedir" option?
at getModulePath (file:///usr/local/lib/node_modules/stylelint/lib/utils/getModulePath.mjs:29:9)
at loadExtendedConfig (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:285:21)
at extendConfig (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:252:25)
at augmentConfigBasic (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:85:26)
at augmentConfigFull (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:138:30)
at getConfigForFile (file:///usr/local/lib/node_modules/stylelint/lib/getConfigForFile.mjs:102:32)
at async resolveOptionValue (file:///usr/local/lib/node_modules/stylelint/lib/utils/resolveOptionValue.mjs:27:24)
at async standalone (file:///usr/local/lib/node_modules/stylelint/lib/standalone.mjs:127:22)

src/livecodes/styles/inc-menu.scss

ConfigurationError: Could not find "stylelint-config-sass-guidelines". Do you need to install the package or use the "configBasedir" option?
at getModulePath (file:///usr/local/lib/node_modules/stylelint/lib/utils/getModulePath.mjs:29:9)
at loadExtendedConfig (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:285:21)
at extendConfig (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:252:25)
at augmentConfigBasic (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:85:26)
at augmentConfigFull (file:///usr/local/lib/node_modules/stylelint/lib/augmentConfig.mjs:138:30)
at getConfigForFile (file:///usr/local/lib/node_modules/stylelint/lib/getConfigForFile.mjs:102:32)
at async resolveOptionValue (file:///usr/local/lib/node_modules/stylelint/lib/utils/resolveOptionValue.mjs:27:24)
at async standalone (file:///usr/local/lib/node_modules/stylelint/lib/standalone.mjs:127:22)


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

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

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

Inline comments:
In `@src/livecodes/core.ts`:
- Line 290: The hardcoded string 'Result' assigned to iframe.title in the
core.ts file is a user-facing label that should be localized through the i18n
system instead of being a literal string. Replace the hardcoded 'Result' string
with an appropriate i18n key reference, add the text string to the i18n
resources, and then run npm run i18n-export to update the internationalization
exports as per the coding guidelines.

In `@src/livecodes/main.ts`:
- Line 87: The hardcoded string "LiveCodes App" in the iframe.title assignment
is user-facing text that should be localized through the i18n system. Extract
this string from the hardcoded literal in the iframe.title line and add it to
the i18n resources file. Replace the hardcoded string with a reference to the
i18n resource key. After adding the new text to the i18n resources, run npm run
i18n-export as per the coding guidelines to complete the internationalization
flow.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 25942888-2644-4fbb-8a0f-5c1a7f4a7675

📥 Commits

Reviewing files that changed from the base of the PR and between 71ed6c7 and 49ce085.

📒 Files selected for processing (6)
  • src/livecodes/core.ts
  • src/livecodes/main.ts
  • src/livecodes/styles/app.scss
  • src/livecodes/styles/inc-menu.scss
  • src/livecodes/styles/inc-modal.scss
  • src/sdk/index.ts

Comment thread src/livecodes/core.ts
iframe = document.createElement('iframe');
iframe.name = 'result';
iframe.id = 'result-frame';
iframe.title = 'Result';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Localize the iframe title instead of hardcoding it

This user-facing label should come from i18n resources, not a literal string.

Suggested change
-      iframe.title = 'Result';
+      iframe.title = window.deps.translateString('core.resultFrameTitle', 'Result');

As per coding guidelines, src/livecodes/**/*.{ts,tsx,html}: Export user-facing text strings for internationalization; run npm run i18n-export after adding new text.

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

In `@src/livecodes/core.ts` at line 290, The hardcoded string 'Result' assigned to
iframe.title in the core.ts file is a user-facing label that should be localized
through the i18n system instead of being a literal string. Replace the hardcoded
'Result' string with an appropriate i18n key reference, add the text string to
the i18n resources, and then run npm run i18n-export to update the
internationalization exports as per the coding guidelines.

Source: Coding guidelines

Comment thread src/livecodes/main.ts

const iframe = document.createElement('iframe');
iframe.name = 'app';
iframe.title = 'LiveCodes App';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Move iframe title text to i18n resources

"LiveCodes App" is user-facing and should be localized via existing i18n flow.

As per coding guidelines, src/livecodes/**/*.{ts,tsx,html}: Export user-facing text strings for internationalization; run npm run i18n-export after adding new text.

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

In `@src/livecodes/main.ts` at line 87, The hardcoded string "LiveCodes App" in
the iframe.title assignment is user-facing text that should be localized through
the i18n system. Extract this string from the hardcoded literal in the
iframe.title line and add it to the i18n resources file. Replace the hardcoded
string with a reference to the i18n resource key. After adding the new text to
the i18n resources, run npm run i18n-export as per the coding guidelines to
complete the internationalization flow.

Source: Coding guidelines

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ No new issues found.

Reviewed changes — UI polish and accessibility: focus outline consistency, menu CSS cleanup, modal tab color alignment, and iframe titles.

  • Focus outline consistency.snackbar--button:focus now uses the same var(--outline-color) outline as the global :focus-visible rule; Monaco editor gets outline: none to prevent flash on editor switch.
  • Menu submenu refactoring#app-menu-project submenu show rules simplified to li:hover > .submenu / li:focus-within > .submenu; stale selectors for #app-menu-help (no submenus) and #open-list (no matching ID) removed.
  • Modal tab accent color — Changed from var(--brand-cyan) to var(--outline-color) for consistency with the focus ring, adapting saturation for light theme.
  • Iframe titlestitle attributes added to app iframe (LiveCodes App), result iframe (Result), and SDK embed iframe (LiveCodes Embedded Playground) for screen reader accessibility.

Pullfrog  | View workflow run | Using DeepSeek Pro (free via Pullfrog for OSS) | 𝕏

@hatemhosny hatemhosny merged commit 1d722a9 into develop Jun 19, 2026
21 checks passed
@sonarqubecloud

Copy link
Copy Markdown

@hatemhosny hatemhosny deleted the ui-fixes branch June 19, 2026 21:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant