From b0428c897f6037e568fe1c3ddf2d936e14612dae Mon Sep 17 00:00:00 2001 From: Sebastiaan Jansen Date: Thu, 24 Sep 2026 11:30:05 +0200 Subject: [PATCH 1/7] feat: rebrand to MicroPythonOS IDE and add device workspace picker Generalizes the product from a Fri3d-badge-specific tool into a generic MicroPythonOS IDE: - Rename product identity across package.json, index.html, PWA manifest, docs (README/CONTRIBUTING/SECURITY/CHANGELOG), CSS brand tokens, internal event/storage-key constants, and English + 20 other locale files. - Replace the Fri3d-specific logo with a generic placeholder wordmark. - Add a device workspace picker on the Welcome page, letting users choose between a generic MicroPythonOS virtual device skin and the Fri3d Badge 2026 skin (persisted, defaults to Fri3d Badge 2026 for continuity). - Refactor public/vbadge/index.html to support both skins via a ?skin= query param while keeping shared DOM ids/button data-attributes. - Add real-device kind detection (generic MicroPython / MicroPythonOS / Fri3d Badge 2026) via mpos.DeviceInfo.get_hardware_id(), scoping app template warnings, side-menu doc links, and an About-panel device badge by the active device kind. - Update and extend tests (unit + e2e) accordingly. --- CHANGELOG.md | 19 +++- CONTRIBUTING.md | 30 +++--- README.md | 61 ++++++------ SECURITY.md | 12 +-- e2e/first_app_guide.spec.ts | 12 +-- e2e/production.spec.ts | 16 ++-- index.html | 30 +++--- package.json | 2 +- playwright.config.ts | 2 +- public/vbadge/index.html | 44 +++++++-- src/domain/rawmode.ts | 25 ++++- src/domain/virtualBadge.ts | 55 ++++++----- .../first-app-guide/FirstAppGuide.tsx | 2 +- src/features/onboarding/AppLogo.tsx | 25 +++++ src/features/onboarding/Fri3dLogo.tsx | 18 ---- src/features/onboarding/GuidedTour.tsx | 6 +- .../onboarding/OnboardingTargetChoice.tsx | 6 +- src/features/onboarding/WelcomeTab.tsx | 54 +++++++++-- src/features/onboarding/useTourSteps.ts | 4 +- src/features/side-menu/AboutPanel.tsx | 15 ++- src/features/side-menu/AppBrowser.tsx | 10 ++ src/features/side-menu/AppList.tsx | 2 +- src/features/side-menu/FileTree.tsx | 4 +- src/features/side-menu/SettingsPanel.tsx | 10 +- src/features/side-menu/SideMenu.tsx | 8 +- src/features/toolbar/ToolPanel.tsx | 6 +- src/i18n/locales/ar.json | 14 +-- src/i18n/locales/de.json | 12 +-- src/i18n/locales/el.json | 12 +-- src/i18n/locales/en.json | 94 ++++++++++--------- src/i18n/locales/es.json | 12 +-- src/i18n/locales/fr.json | 12 +-- src/i18n/locales/he.json | 12 +-- src/i18n/locales/hi.json | 12 +-- src/i18n/locales/id.json | 12 +-- src/i18n/locales/it.json | 12 +-- src/i18n/locales/ja.json | 12 +-- src/i18n/locales/ko.json | 12 +-- src/i18n/locales/nl.json | 26 ++--- src/i18n/locales/pl.json | 12 +-- src/i18n/locales/pt.json | 12 +-- src/i18n/locales/ro.json | 12 +-- src/i18n/locales/ru.json | 12 +-- src/i18n/locales/sv.json | 12 +-- src/i18n/locales/uk.json | 12 +-- src/i18n/locales/zh-CN.json | 16 ++-- src/i18n/locales/zh-TW.json | 16 ++-- src/index.css | 40 ++++---- src/services/changelog.service.ts | 2 +- src/services/device.service.ts | 25 +++-- src/services/diagnostics.ts | 2 +- src/stores/deviceKind.ts | 62 ++++++++++++ src/stores/editorTabs.ts | 4 +- src/stores/onboarding.ts | 8 +- tests/device_kind.test.ts | 46 +++++++++ tests/editor_tabs.test.ts | 2 +- tests/rawmode.test.ts | 30 ++++++ tests/virtual_badge.test.ts | 28 +++++- vite.config.ts | 4 +- 59 files changed, 710 insertions(+), 379 deletions(-) create mode 100644 src/features/onboarding/AppLogo.tsx delete mode 100644 src/features/onboarding/Fri3dLogo.tsx create mode 100644 src/stores/deviceKind.ts create mode 100644 tests/device_kind.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index a312d275..25acb09b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,23 @@ # Changelog -All notable user-facing changes to Fri3d-IDE. +All notable user-facing changes to MicroPythonOS IDE (formerly Fri3d-IDE). + +## Unreleased + +### Changed + +- **Renamed to MicroPythonOS IDE** — the project is now positioned as a + general MicroPythonOS IDE, with the Fri3d Camp badge as one supported + device among others. Product name, page title, PWA manifest, and + repository links were updated accordingly; the BadgeHub integration is + unchanged. +- **Virtual device picker** — the virtual device now offers a choice between + a generic MicroPythonOS device skin and the Fri3d Camp 2026 badge skin, + selectable from the Welcome page. +- **Device workspace auto-detection** — connecting a physical device now + detects whether it runs plain MicroPython, MicroPythonOS, or is + specifically a Fri3d Camp 2026 badge, and scopes app templates and + documentation links accordingly. ## v1.2.4 — 2026-08-14 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ba49e25f..18594532 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,8 +1,8 @@ -# Contributing to Fri3d-IDE +# Contributing to MicroPythonOS IDE -Thanks for your interest in contributing to **Fri3d-IDE**! +Thanks for your interest in contributing to **MicroPythonOS IDE**! -Fri3d-IDE is a browser-based IDE for developing software for Fri3d Camp boards and other MicroPython devices. It is based on the ViperIDE project and is built with React, TypeScript, Vite, CodeMirror, xterm.js, Tailwind CSS, Zustand, and browser device APIs. +MicroPythonOS IDE is a browser-based IDE for developing software for MicroPythonOS devices, including the Fri3d Camp badge, and other MicroPython devices. It is based on the ViperIDE project and is built with React, TypeScript, Vite, CodeMirror, xterm.js, Tailwind CSS, Zustand, and browser device APIs. Contributions of all sizes are welcome, including: @@ -24,10 +24,10 @@ For larger changes—especially changes to device transports, the MicroPython RE When working on an existing issue, leave a comment so others know that someone is investigating it. -Because Fri3d-IDE is derived from ViperIDE, please mention in your issue or pull request whether a change is: +Because MicroPythonOS IDE is derived from ViperIDE, please mention in your issue or pull request whether a change is: -* Specific to Fri3d Camp hardware or documentation -* A general MicroPython IDE improvement +* Specific to a particular device (e.g. Fri3d Camp hardware) or its documentation +* A general MicroPython/MicroPythonOS IDE improvement * Adapted from an upstream ViperIDE change Preserve existing copyright notices and attribution when moving or adapting upstream code. @@ -52,8 +52,8 @@ Web Serial and Web Bluetooth generally require a secure browser context. Use `lo Fork the repository and clone your fork: ```bash -git clone https://github.com/YOUR-USERNAME/Fri3d-IDE.git -cd Fri3d-IDE +git clone https://github.com/YOUR-USERNAME/MicroPythonOS-IDE.git +cd MicroPythonOS-IDE ``` Install the locked dependencies: @@ -330,7 +330,7 @@ Avoid logging complete terminal sessions by default. Device output may contain p ### Python formatting and linting -Fri3d-IDE uses Ruff compiled to WebAssembly for Python-related tooling. +MicroPythonOS IDE uses Ruff compiled to WebAssembly for Python-related tooling. When changing formatting or Python diagnostics: @@ -378,7 +378,7 @@ A translation-only pull request is welcome. Include the language and the parts o ### PWA and offline behaviour -Fri3d-IDE is configured as a progressive web application with an automatically updating service worker. +MicroPythonOS IDE is configured as a progressive web application with an automatically updating service worker. Test PWA changes using a production build: @@ -485,7 +485,7 @@ Tested: - npm run build - Chromium on Linux - Onboarding demo -- Web Serial with a Fri3d Camp badge +- Web Serial with a MicroPythonOS device - Open, edit, save, run and reconnect flows Not tested: @@ -553,7 +553,7 @@ Remove passwords, private source code, device identifiers, Wi-Fi credentials, to 6. Push the branch to your fork. -7. Open a pull request against `Fri3dCamp/Fri3d-IDE:main`. +7. Open a pull request against `DrSkunk/MicroPythonOS-IDE:main`. Your pull request should explain: @@ -564,7 +564,7 @@ Your pull request should explain: * Which devices and firmware versions were tested * Which connection methods were tested * What was not tested -* Whether the change is Fri3d-specific or generally applicable +* Whether the change is device-specific or generally applicable * Any user-visible, compatibility, security, or offline impact * Related issues @@ -595,6 +595,6 @@ work in progress Be respectful, patient, and constructive. -Fri3d Camp welcomes contributors with different levels of experience. Explain decisions clearly, help others learn, and assume good intentions during reviews and technical discussions. +The MicroPythonOS IDE community welcomes contributors with different levels of experience. Explain decisions clearly, help others learn, and assume good intentions during reviews and technical discussions. -Thank you for helping improve Fri3d-IDE! +Thank you for helping improve MicroPythonOS IDE! diff --git a/README.md b/README.md index 1bf8e327..5912ef2c 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,54 @@ -# Fri3d-IDE +# MicroPythonOS IDE [![StandWithUkraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) -[![CI](https://github.com/Fri3dCamp/Fri3d-IDE/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Fri3dCamp/Fri3d-IDE/actions/workflows/ci.yml) -[![Deploy](https://github.com/Fri3dCamp/Fri3d-IDE/actions/workflows/deploy-pages.yml/badge.svg?branch=main)](https://github.com/Fri3dCamp/Fri3d-IDE/actions/workflows/deploy-pages.yml) -[![License](https://img.shields.io/github/license/Fri3dCamp/Fri3d-IDE)](LICENSE) +[![CI](https://github.com/DrSkunk/MicroPythonOS-IDE/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/DrSkunk/MicroPythonOS-IDE/actions/workflows/ci.yml) +[![Deploy](https://github.com/DrSkunk/MicroPythonOS-IDE/actions/workflows/deploy-pages.yml/badge.svg?branch=main)](https://github.com/DrSkunk/MicroPythonOS-IDE/actions/workflows/deploy-pages.yml) +[![License](https://img.shields.io/github/license/DrSkunk/MicroPythonOS-IDE)](LICENSE) -Connect a Fri3d badge, write an app, run it, and publish it from your browser. +Connect a MicroPythonOS device, write an app, run it, and publish it from your browser. -[Launch Fri3d-IDE](https://fri3dcamp.github.io/Fri3d-IDE/) · [Contribute](CONTRIBUTING.md) · [Security](SECURITY.md) · [Report a problem](https://github.com/Fri3dCamp/Fri3d-IDE/issues) +[Launch MicroPythonOS IDE](https://drskunk.github.io/MicroPythonOS-IDE/) · [Contribute](CONTRIBUTING.md) · [Security](SECURITY.md) · [Report a problem](https://github.com/DrSkunk/MicroPythonOS-IDE/issues) -![Fri3d Camp badge](public/ide.png) +![MicroPythonOS device](public/ide.png) -Fri3d-IDE is the browser development environment for Fri3d Camp badges. It combines a Python editor, terminal, device file browser, package manager, USB/Serial and Bluetooth connections, a virtual badge, MicroPythonOS app packaging, and BadgeHub publishing. +MicroPythonOS IDE is the browser development environment for MicroPythonOS devices. It combines a Python editor, terminal, device file browser, package manager, USB/Serial and Bluetooth connections, a virtual device, MicroPythonOS app packaging, and BadgeHub publishing. -You can use a physical badge or the built-in virtual badge. Projects can be saved, run, packaged, and published without installing a desktop IDE. +You can use a physical device or the built-in virtual device, and pick between a generic MicroPythonOS device skin or the Fri3d Camp 2026 badge skin. Projects can be saved, run, packaged, and published without installing a desktop IDE. -Support for other MicroPython devices is welcome, but the Fri3d badge experience is the product priority. +The Fri3d Camp badge is one supported device among others; support for additional MicroPython/MicroPythonOS hardware is welcome. -> **Release status: Beta.** The core workflows are available, while the project is expanding automated browser coverage and its tested hardware/firmware matrix. Back up important badge files before destructive operations. +> **Release status: Beta.** The core workflows are available, while the project is expanding automated browser coverage and its tested hardware/firmware matrix. Back up important device files before destructive operations. ## Five-minute quick start -No desktop IDE or physical badge is required for the virtual path. +No desktop IDE or physical device is required for the virtual path. -1. Open [Fri3d-IDE](https://fri3dcamp.github.io/Fri3d-IDE/) in a current Chromium-based browser. -2. In the connection menu, choose **Connect to virtual badge**. Accept the preview notice. +1. Open [MicroPythonOS IDE](https://drskunk.github.io/MicroPythonOS-IDE/) in a current Chromium-based browser. +2. In the connection menu, choose **Connect to virtual device**. Accept the preview notice. 3. Open **Apps**, create an app, and select the **Hello World** template. 4. Open the generated Python file, make a small change, and select **Save & Run**. -5. Confirm the change on the badge, then launch the app from the Apps panel. +5. Confirm the change on the device, then launch the app from the Apps panel. -For a real badge, connect it with a data-capable USB-C cable, choose **USB/Serial**, and select the badge in the browser permission dialog. Web Serial and Web Bluetooth require HTTPS or `localhost`. +For a real device, connect it with a data-capable USB-C cable, choose **USB/Serial**, and select the device in the browser permission dialog. Web Serial and Web Bluetooth require HTTPS or `localhost`. ## What it includes - **Create:** CodeMirror editor, multiple tabs, Python formatting and in-browser Ruff analysis. -- **Get started:** Task-based onboarding for connecting, trying the virtual badge, building a first app, or installing from BadgeHub. -- **Connect:** USB/Serial, Bluetooth, WebREPL/WebSocket, WebRTC relay, and a virtual Fri3d badge. +- **Get started:** Task-based onboarding for connecting, trying the virtual device, building a first app, or installing from BadgeHub. +- **Connect:** USB/Serial, Bluetooth, WebREPL/WebSocket, WebRTC relay, and a virtual MicroPythonOS device (generic skin or Fri3d Camp 2026 badge skin). - **Operate:** Terminal/REPL, device files, screenshots, package management, and reconnect handling. - **Build apps:** MicroPythonOS templates, icons, manifests, install/uninstall, and MPK import/export. - **Publish:** BadgeHub sign-in, compatibility metadata, draft upload, and publishing. - **Use anywhere:** Localization, responsive UI, installable PWA, and offline shell support. - **Get support:** Copy a privacy-safe diagnostics report from the About panel. -Device access has explicit states for permission, connection, synchronization, ready, busy, recovery, and errors. Write operations are enabled only when the badge is ready. +Device access has explicit states for permission, connection, synchronization, ready, busy, recovery, and errors. Write operations are enabled only when the device is ready. ## Compatibility -This table describes current implementation support, not a completed certification matrix. If a combination is not listed as tested, treat it as experimental and include your browser, operating system, badge revision, and firmware version when reporting issues. +This table describes current implementation support, not a completed certification matrix. If a combination is not listed as tested, treat it as experimental and include your browser, operating system, device revision, and firmware version when reporting issues. -| Environment | USB/Serial | Bluetooth | WebREPL/relay | Virtual badge | +| Environment | USB/Serial | Bluetooth | WebREPL/relay | Virtual device | | --- | --- | --- | --- | --- | | Chrome / Edge on Windows, macOS, Linux, ChromeOS | Supported API path | Supported API path | Available | Available | | Other Chromium browsers | Experimental | Experimental | Available | Available | @@ -56,23 +56,24 @@ This table describes current implementation support, not a completed certificati | Safari on macOS | Not supported by browser | Not supported by browser | Experimental | Available | | iPhone / iPad browsers | Not supported | Not supported | Experimental | Preview only | -### Badge and firmware scope +### Device and firmware scope | Target | Status | Notes | | --- | --- | --- | -| Fri3d Camp 2026 + MicroPythonOS | Primary | Virtual badge models this target; physical compatibility testing is ongoing. | +| MicroPythonOS (generic device) | Primary | Virtual device models this target; physical compatibility testing is ongoing. | +| Fri3d Camp 2026 badge + MicroPythonOS | Primary | The virtual device includes a matching skin; physical compatibility testing is ongoing. | | Fri3d Camp 2022 / 2024 | Experimental | BadgeHub recognizes these targets, but capabilities depend on installed firmware. | -| Other MicroPython boards | Experimental | Editor, terminal, files, and packages may work; Fri3d app workflows can require MicroPythonOS. | +| Other MicroPython boards | Experimental | Editor, terminal, files, and packages may work; MicroPythonOS app workflows require the `mpos` module. | -There is not yet a published minimum firmware version. Until the matrix is certified, use the firmware recommended by the relevant Fri3d badge documentation and report the exact version with any issue. +There is not yet a published minimum firmware version. Until the matrix is certified, use the firmware recommended by the relevant device's documentation and report the exact version with any issue. -### Real versus virtual badge +### Real versus virtual device -The virtual badge runs MicroPythonOS in the browser and is useful for onboarding, app UI work, workshops, and repeatable testing. It does not fully reproduce Wi-Fi, sensors, audio, radio hardware, timing, or physical-device performance. Always verify hardware-dependent apps on the target badge. +The virtual device runs MicroPythonOS in the browser and is useful for onboarding, app UI work, workshops, and repeatable testing. It does not fully reproduce Wi-Fi, sensors, audio, radio hardware, timing, or physical-device performance. Always verify hardware-dependent apps on the target device. ## PWA and offline use -Fri3d-IDE can be installed from a supported browser. The application shell works offline after one successful load. The virtual badge is cached when you first open it because its WebAssembly assets are large. Open it once while online before using it offline. +MicroPythonOS IDE can be installed from a supported browser. The application shell works offline after one successful load. The virtual device is cached when you first open it because its WebAssembly assets are large. Open it once while online before using it offline. Network-dependent features remain unavailable offline, including BadgeHub, remote package downloads, authentication, and WebREPL endpoints. USB/Serial availability depends on the browser and operating system, not on internet access. @@ -106,8 +107,8 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for architecture, project structure, test - iOS browsers do not expose Web Serial or Web Bluetooth. - Separate **Save** and **Run** commands remain available for advanced workflows; beginners can use **Save & Run**. - Offline mode cannot provide network-backed packages, authentication, publishing, or remote connections. -- The compatibility matrix still needs repeatable testing across badge and firmware revisions. +- The compatibility matrix still needs repeatable testing across device and firmware revisions. ## Origin -Fri3d-IDE is forked from the excellent [ViperIDE](https://github.com/vshymanskyy/ViperIDE) project by [Volodymyr Shymanskyy](https://github.com/vshymanskyy). +MicroPythonOS IDE started as Fri3d-IDE, forked from the excellent [ViperIDE](https://github.com/vshymanskyy/ViperIDE) project by [Volodymyr Shymanskyy](https://github.com/vshymanskyy). diff --git a/SECURITY.md b/SECURITY.md index e3f19516..63f69a25 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,13 +2,13 @@ ## Reporting a vulnerability -Please report vulnerabilities privately through [GitHub Security Advisories](https://github.com/Fri3dCamp/Fri3d-IDE/security/advisories/new). Do not include badge credentials, Wi-Fi passwords, BadgeHub tokens, private source files, or terminal logs in a public issue. +Please report vulnerabilities privately through [GitHub Security Advisories](https://github.com/DrSkunk/MicroPythonOS-IDE/security/advisories/new). Do not include device credentials, Wi-Fi passwords, BadgeHub tokens, private source files, or terminal logs in a public issue. -For ordinary bugs without sensitive information, use the [public issue tracker](https://github.com/Fri3dCamp/Fri3d-IDE/issues). +For ordinary bugs without sensitive information, use the [public issue tracker](https://github.com/DrSkunk/MicroPythonOS-IDE/issues). ## Trust boundaries -Fri3d-IDE runs in the browser and can communicate with a physical or virtual badge. Users should treat these inputs as untrusted: +MicroPythonOS IDE runs in the browser and can communicate with a physical or virtual device. Users should treat these inputs as untrusted: - MPK archives and files selected for upload - BadgeHub descriptions, metadata, icons, and downloads @@ -16,12 +16,12 @@ Fri3d-IDE runs in the browser and can communicate with a physical or virtual bad - Device filenames, file contents, terminal output, and firmware responses - WebREPL, WebSocket, WebRTC, USB, and Bluetooth peers -The IDE must validate archive paths and layouts, reject traversal outside the intended app directory, limit archive expansion, sanitize rendered HTML, and avoid placing credentials in logs or diagnostics. An installed third-party app executes on the badge with the permissions provided by its firmware; the IDE does not sandbox badge applications. +The IDE must validate archive paths and layouts, reject traversal outside the intended app directory, limit archive expansion, sanitize rendered HTML, and avoid placing credentials in logs or diagnostics. An installed third-party app executes on the device with the permissions provided by its firmware; the IDE does not sandbox device applications. ## Diagnostics privacy -The **Copy diagnostics** action reports the IDE build, browser capabilities, connection type, detected badge/firmware, PWA state, and selected app identifier. It deliberately excludes source files, terminal output, connection URLs, authentication tokens, passwords, and account details. Review the report before attaching it to an issue. +The **Copy diagnostics** action reports the IDE build, browser capabilities, connection type, detected device/firmware, PWA state, and selected app identifier. It deliberately excludes source files, terminal output, connection URLs, authentication tokens, passwords, and account details. Review the report before attaching it to an issue. ## Deployment guidance -Deploy Fri3d-IDE over HTTPS. Configure security headers at the hosting layer, including a Content Security Policy compatible with the explicitly configured BadgeHub, authentication, WebREPL, relay, WebAssembly, worker, and image endpoints. Test device transports and PWA updates after changing those headers; an overly narrow policy can silently disable required browser APIs. +Deploy MicroPythonOS IDE over HTTPS. Configure security headers at the hosting layer, including a Content Security Policy compatible with the explicitly configured BadgeHub, authentication, WebREPL, relay, WebAssembly, worker, and image endpoints. Test device transports and PWA updates after changing those headers; an overly narrow policy can silently disable required browser APIs. diff --git a/e2e/first_app_guide.spec.ts b/e2e/first_app_guide.spec.ts index aece6544..2dd9c1eb 100644 --- a/e2e/first_app_guide.spec.ts +++ b/e2e/first_app_guide.spec.ts @@ -5,7 +5,7 @@ import { expect, test, type Page } from '@playwright/test' test.use({ actionTimeout: 15_000 }) const APP_ID = 'com.example.sparkgame' -const BADGE_IFRAME = '#virtual-badge-panel iframe[title="MicroPythonOS virtual badge"]' +const BADGE_IFRAME = '#virtual-badge-panel iframe[title="MicroPythonOS virtual device"]' /** Snapshot the badge screen pixels via the same-origin iframe canvas. */ async function badgeScreenSnapshot(page: Page): Promise { @@ -53,19 +53,19 @@ async function completeGuideStep(page: Page, stepNumber: number, totalSteps: num await expect(guide.getByRole('status')).toContainText('Code looks good', { timeout: 60_000 }) } -test('first-app guide builds a joystick game on the virtual badge', async ({ page }) => { +test('first-app guide builds a joystick game on the virtual device', async ({ page }) => { test.setTimeout(420_000) await page.goto('./') - // Onboarding: build my first app on the virtual badge, started from the + // Onboarding: build my first app on the virtual device, started from the // Welcome tab (the side menu repeats the button, so scope to the tab panel). const welcome = page.getByRole('tabpanel').filter({ - has: page.getByRole('heading', { name: 'Welcome to Fri3d-IDE' }), + has: page.getByRole('heading', { name: 'Welcome to MicroPythonOS IDE' }), }) await welcome.getByRole('button', { name: /Build my first app/ }).click() const targetChoice = page.getByRole('dialog', { name: 'Where should the app run?' }) - await targetChoice.getByRole('button', { name: /Virtual badge/ }).click() - // Virtual badge preview disclaimer. + await targetChoice.getByRole('button', { name: /Virtual device/ }).click() + // Virtual device preview disclaimer. await page.getByRole('button', { name: 'Confirm' }).click() await expect(page.locator(BADGE_IFRAME)).toBeVisible({ timeout: 30_000 }) diff --git a/e2e/production.spec.ts b/e2e/production.spec.ts index 1de5cea5..6ecee7fc 100644 --- a/e2e/production.spec.ts +++ b/e2e/production.spec.ts @@ -39,7 +39,7 @@ function isApplicationAsset(request: Request, page: Page): boolean { /** The Welcome tab greets every fresh session in the editor area. */ function welcomeTab(page: Page) { return page.getByRole('tabpanel').filter({ - has: page.getByRole('heading', { name: 'Welcome to Fri3d-IDE' }), + has: page.getByRole('heading', { name: 'Welcome to MicroPythonOS IDE' }), }) } @@ -65,7 +65,7 @@ test('production bundle boots without runtime or asset errors', async ({ page }) const response = await page.goto('./') expect(response?.ok()).toBe(true) - await expect(page.getByText('Fri3d-IDE', { exact: true }).first()).toBeVisible() + await expect(page.getByText('MicroPythonOS IDE', { exact: true }).first()).toBeVisible() await expect(welcomeTab(page)).toBeVisible() await expect(page.getByRole('tab', { name: 'Terminal' })).toBeVisible() await page.getByRole('button', { name: 'New file' }).click() @@ -78,15 +78,15 @@ test('production metadata supports rich social previews', async ({ page }) => { await expect(page.locator('link[rel="canonical"]')).toHaveAttribute( 'href', - 'https://fri3dcamp.github.io/Fri3d-IDE/', + 'https://drskunk.github.io/MicroPythonOS-IDE/', ) await expect(page.locator('meta[property="og:title"]')).toHaveAttribute( 'content', - 'Fri3d IDE — MicroPython in your browser', + 'MicroPythonOS IDE — MicroPython in your browser', ) await expect(page.locator('meta[property="og:image"]')).toHaveAttribute( 'content', - 'https://fri3dcamp.github.io/Fri3d-IDE/social-preview.png', + 'https://drskunk.github.io/MicroPythonOS-IDE/social-preview.png', ) await expect(page.locator('meta[name="twitter:card"]')).toHaveAttribute('content', 'summary_large_image') }) @@ -172,15 +172,15 @@ test('Web Serial and Bluetooth permission cancellation is handled safely', async expectNoBrowserProblems(problems, BADGEHUB_AUTH_CONSOLE_ERRORS) }) -test('virtual badge starts in the production shell', async ({ page }) => { +test('virtual device starts in the production shell', async ({ page }) => { const problems = watchForBrowserProblems(page) await page.goto('./') await page.getByRole('tab', { name: 'File Manager' }).click() - await page.getByLabel('Side menu').getByRole('button', { name: 'Connect to virtual badge' }).click() + await page.getByLabel('Side menu').getByRole('button', { name: 'Connect to virtual device' }).click() await page.getByRole('button', { name: 'Confirm' }).click() - const badge = page.locator('#virtual-badge-panel iframe[title="MicroPythonOS virtual badge"]') + const badge = page.locator('#virtual-badge-panel iframe[title="MicroPythonOS virtual device"]') await expect(badge).toBeVisible({ timeout: 15_000 }) await expect(badge).toHaveAttribute('src', /vbadge\/index\.html/) expectNoBrowserProblems(problems, [ diff --git a/index.html b/index.html index 83f331f6..cf92b35b 100644 --- a/index.html +++ b/index.html @@ -3,37 +3,37 @@ - - + + - + - - - - - + + + + + - + - - - - + + + + - - Fri3d-IDE + + MicroPythonOS IDE
diff --git a/package.json b/package.json index a03cf3e8..97cab557 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "fri3d-ide", + "name": "micropythonos-ide", "version": "1.2.4", "type": "module", "scripts": { diff --git a/playwright.config.ts b/playwright.config.ts index 6c8e16d4..2e5531bb 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,6 +1,6 @@ import { defineConfig, devices } from '@playwright/test' -const basePath = '/Fri3d-IDE/' +const basePath = '/MicroPythonOS-IDE/' const port = 4173 export default defineConfig({ diff --git a/public/vbadge/index.html b/public/vbadge/index.html index 86ef2d71..883fa901 100644 --- a/public/vbadge/index.html +++ b/public/vbadge/index.html @@ -9,7 +9,7 @@ - Fri3d Camp 2026 Virtual Badge + MicroPythonOS Virtual Device - + + +
+

+ {t('welcome.device-workspace', 'Device workspace')} +

+

+ {t('welcome.device-workspace-hint', 'Choose which virtual device to run — switch anytime.')} +

+
+ {deviceWorkspaces.map(({ kind, label }) => ( + + ))} +
+
+
{t('settings.editor', 'editor')}
diff --git a/src/features/side-menu/SideMenu.tsx b/src/features/side-menu/SideMenu.tsx index bec67a50..9db611de 100644 --- a/src/features/side-menu/SideMenu.tsx +++ b/src/features/side-menu/SideMenu.tsx @@ -27,6 +27,7 @@ import { refreshFileTree } from '../../services/files.service' import { useUploadFlow } from './UploadDialog' import { disconnectDevice } from '../../services/device.service' import { isConnectionActive, useConnectionStore } from '../../stores/connection' +import { useActiveDeviceKind } from '../../stores/deviceKind' import { installPkg, installPkgFromUrl } from '../../services/packages.service' import { prettifyCurrentFile } from '../../services/format.service' import { useConfirm, usePrompt } from '../../components/dialogs' @@ -234,12 +235,17 @@ function ToolsPanel() { const { t } = useTranslation() const confirm = useConfirm() const prompt = usePrompt() + const activeDeviceKind = useActiveDeviceKind() const linkClass = 'flex items-center gap-1.5 py-0.5 text-sm hover:text-fg-highlight' const docs: Array<[string, string]> = [ ['https://docs.micropython.org/en/latest/', 'MicroPython docs'], ['https://docs.micropythonos.com/', 'MicroPythonOS docs'], - ['https://fri3dcamp.github.io/badge_2026/', 'Fri3d Camp 2026 badge'], + // The Fri3d Badge 2026 doc link is only relevant to that specific + // device workspace; MicroPython/MicroPythonOS docs apply everywhere. + ...(activeDeviceKind === 'fri3d-badge-2026' + ? ([['https://fri3dcamp.github.io/badge_2026/', 'Fri3d Camp 2026 badge']] as Array<[string, string]>) + : []), ] return ( diff --git a/src/features/toolbar/ToolPanel.tsx b/src/features/toolbar/ToolPanel.tsx index 474a8a84..fe0a4a44 100644 --- a/src/features/toolbar/ToolPanel.tsx +++ b/src/features/toolbar/ToolPanel.tsx @@ -160,7 +160,7 @@ export function ToolPanel() { - Fri3d-IDE + MicroPythonOS IDE {canInstall && ( void install()} > diff --git a/src/i18n/locales/ar.json b/src/i18n/locales/ar.json index a1299135..addd84d9 100644 --- a/src/i18n/locales/ar.json +++ b/src/i18n/locales/ar.json @@ -45,7 +45,7 @@ "color-theme": "السمة" }, "about": { - "cta": "إذا أعجبك Fri3d-IDE، من فضلك امنحه نجمة على GitHub ⭐ وانشر الخبر على وسائل التواصل الاجتماعي 📢", + "cta": "إذا أعجبك MicroPythonOS IDE، من فضلك امنحه نجمة على GitHub ⭐ وانشر الخبر على وسائل التواصل الاجتماعي 📢", "report-bug": "يمكنك أيضًا الإبلاغ عن خطأ 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "لنبدأ! 🚀", "steps": { "welcome": { - "title": "مرحباً بك في Fri3d-IDE! 👋", - "text": "مرحباً! أنا دليلك في Fri3d. دعني أقدم لك جولة سريعة حتى تتمكن من البدء في البرمجة فوراً!" + "title": "مرحباً بك في MicroPythonOS IDE! 👋", + "text": "مرحباً! أنا دليلك. دعني أقدم لك جولة سريعة حتى تتمكن من البدء في البرمجة فوراً!" }, "toolbar": { "title": "شريط الأدوات الرئيسي", - "text": "هذا هو شريط أدواتك الرئيسي. احفظ الملفات، وشغّل الكود على الـbadge، وقم بتوصيل جهاز Fri3d الخاص بك من هنا." + "text": "هذا هو شريط أدواتك الرئيسي. احفظ الملفات، وشغّل الكود على الـbadge، وقم بتوصيل جهاز الخاص بك من هنا." }, "connect": { "title": "الاتصال عبر USB", - "text": "انقر على هذا الزر لتوصيل badge Fri3d عبر USB/المنفذ التسلسلي. يمكنك أيضاً استخدام Bluetooth 🦷 أو WebREPL 🌐!" + "text": "انقر على هذا الزر لتوصيل badge عبر USB/المنفذ التسلسلي. يمكنك أيضاً استخدام Bluetooth 🦷 أو WebREPL 🌐!" }, "side-menu": { "title": "القائمة الجانبية", @@ -101,7 +101,7 @@ }, "files": { "title": "مدير الملفات", - "text": "تصفح وإدارة الملفات على badge Fri3d المتصل. قم بتوصيل جهاز أولاً لرؤية ملفاته وتعديلها!" + "text": "تصفح وإدارة الملفات على badge المتصل. قم بتوصيل جهاز أولاً لرؤية ملفاته وتعديلها!" }, "editor": { "title": "محرر الكود", @@ -113,7 +113,7 @@ }, "done": { "title": "أنت جاهز الآن! 🚀", - "text": "هذه كانت الجولة! قم بتوصيل badge Fri3d وابدأ في بناء أشياء رائعة. برمجة سعيدة!" + "text": "هذه كانت الجولة! قم بتوصيل badge وابدأ في بناء أشياء رائعة. برمجة سعيدة!" } } } diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 206635a9..3fdf67c1 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -45,7 +45,7 @@ "color-theme": "Design" }, "about": { - "cta": "Wenn Ihnen Fri3d-IDE gefällt, geben Sie ihm bitte einen Stern auf GitHub ⭐ und verbreiten Sie die Nachricht in den sozialen Medien 📢", + "cta": "Wenn Ihnen MicroPythonOS IDE gefällt, geben Sie ihm bitte einen Stern auf GitHub ⭐ und verbreiten Sie die Nachricht in den sozialen Medien 📢", "report-bug": "Sie können auch einen Fehler melden 🐞" }, "editor": { @@ -101,16 +101,16 @@ "get-started": "Loslegen! 🚀", "steps": { "welcome": { - "title": "Willkommen bei Fri3d-IDE! 👋", - "text": "Hallo! Ich bin dein Fri3d-Guide. Lass mich dir eine kurze Tour geben, damit du sofort loslegen kannst!" + "title": "Willkommen bei MicroPythonOS IDE! 👋", + "text": "Hallo! Ich bin dein Guide. Lass mich dir eine kurze Tour geben, damit du sofort loslegen kannst!" }, "toolbar": { "title": "Hauptwerkzeugleiste", - "text": "Das ist deine Hauptwerkzeugleiste. Speichere Dateien, führe Code auf dem Badge aus und verbinde dein Fri3d-Gerät von hier aus." + "text": "Das ist deine Hauptwerkzeugleiste. Speichere Dateien, führe Code auf dem Badge aus und verbinde dein Gerät von hier aus." }, "connect": { "title": "Über USB verbinden", - "text": "Klicke diesen Button, um dein Fri3d-Badge über USB/Seriell zu verbinden. Du kannst auch Bluetooth 🦷 oder WebREPL 🌐 nutzen!" + "text": "Klicke diesen Button, um dein Badge über USB/Seriell zu verbinden. Du kannst auch Bluetooth 🦷 oder WebREPL 🌐 nutzen!" }, "side-menu": { "title": "Seitenmenü", @@ -130,7 +130,7 @@ }, "done": { "title": "Alles bereit! 🚀", - "text": "Das war die Tour! Verbinde dein Fri3d-Badge und fang an, tolle Dinge zu bauen. Viel Spaß beim Programmieren!" + "text": "Das war die Tour! Verbinde dein Badge und fang an, tolle Dinge zu bauen. Viel Spaß beim Programmieren!" } } } diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json index da02f4d6..2135ee2f 100644 --- a/src/i18n/locales/el.json +++ b/src/i18n/locales/el.json @@ -45,7 +45,7 @@ "color-theme": "Θέμα" }, "about": { - "cta": "Αν σας αρέσει το Fri3d-IDE, παρακαλώ δώστε του ένα αστέρι στο GitHub ⭐ και διαδώστε το στα κοινωνικά μέσα 📢", + "cta": "Αν σας αρέσει το MicroPythonOS IDE, παρακαλώ δώστε του ένα αστέρι στο GitHub ⭐ και διαδώστε το στα κοινωνικά μέσα 📢", "report-bug": "Μπορείτε επίσης να αναφέρετε ένα σφάλμα 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "Ας ξεκινήσουμε! 🚀", "steps": { "welcome": { - "title": "Καλώς ήρθατε στο Fri3d-IDE! 👋", - "text": "Γεια! Είμαι ο οδηγός σου στο Fri3d. Άσε με να σου κάνω μια γρήγορη ξενάγηση ώστε να μπορέσεις να αρχίσεις να προγραμματίζεις αμέσως!" + "title": "Καλώς ήρθατε στο MicroPythonOS IDE! 👋", + "text": "Γεια! Είμαι ο οδηγός σου. Άσε με να σου κάνω μια γρήγορη ξενάγηση ώστε να μπορέσεις να αρχίσεις να προγραμματίζεις αμέσως!" }, "toolbar": { "title": "Κύρια γραμμή εργαλείων", - "text": "Αυτή είναι η κύρια γραμμή εργαλείων σου. Αποθήκευσε αρχεία, εκτέλεσε τον κώδικά σου στο badge και σύνδεσε τη συσκευή Fri3d από εδώ." + "text": "Αυτή είναι η κύρια γραμμή εργαλείων σου. Αποθήκευσε αρχεία, εκτέλεσε τον κώδικά σου στο badge και σύνδεσε τη συσκευή από εδώ." }, "connect": { "title": "Σύνδεση μέσω USB", - "text": "Κάνε κλικ σε αυτό το κουμπί για να συνδέσεις το badge Fri3d μέσω USB/Σειριακής. Μπορείς επίσης να χρησιμοποιήσεις Bluetooth 🦷 ή WebREPL 🌐!" + "text": "Κάνε κλικ σε αυτό το κουμπί για να συνδέσεις το badge μέσω USB/Σειριακής. Μπορείς επίσης να χρησιμοποιήσεις Bluetooth 🦷 ή WebREPL 🌐!" }, "side-menu": { "title": "Πλαϊνό μενού", @@ -113,7 +113,7 @@ }, "done": { "title": "Είσαι έτοιμος! 🚀", - "text": "Αυτή ήταν η ξενάγηση! Σύνδεσε το badge Fri3d και άρχισε να φτιάχνεις εκπληκτικά πράγματα. Καλή προγραμματιστική!" + "text": "Αυτή ήταν η ξενάγηση! Σύνδεσε το badge και άρχισε να φτιάχνεις εκπληκτικά πράγματα. Καλή προγραμματιστική!" } } } diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index fc222100..6a7a6c5a 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -13,14 +13,14 @@ "save-run": "Save & Run", "stop": "Stop", "fullscreen": "Full Screen", - "install-app": "Install Fri3d-IDE as app", + "install-app": "Install MicroPythonOS IDE as app", "clear": "Clear", "conn": { "ws": "Connect WebREPL", "ble": "Connect Bluetooth", "usb": "Connect USB/Serial", - "vm": "Connect to virtual badge", - "vm-short": "Virtual badge" + "vm": "Connect to virtual device", + "vm-short": "Virtual device" }, "terminal": "Terminal", "display": "Display", @@ -149,32 +149,39 @@ "theme-system": "System", "theme-light": "Light", "theme-dark": "Dark", - "virtual-badge": "virtual badge", - "vbadge-reset": "Reset virtual badge", - "vbadge-reset-confirm": "Erase the virtual badge storage? All files and installed apps on the virtual device will be lost.", - "vbadge-reset-done": "Virtual badge storage erased", + "virtual-badge": "virtual device", + "vbadge-reset": "Reset virtual device", + "vbadge-reset-confirm": "Erase the virtual device storage? All files and installed apps on the virtual device will be lost.", + "vbadge-reset-done": "Virtual device storage erased", "vbadge-reset-failed": "Reset failed", - "vbadge-disconnect-first": "Disconnect the virtual badge first", + "vbadge-disconnect-first": "Disconnect the virtual device first", "vbadge-popout-default": "Open in separate window" }, "about": { "changelog": "What's new", - "cta": "If you like Fri3d-IDE, please give it a GitHub star ⭐ and spread the word on social media 📢", + "cta": "If you like MicroPythonOS IDE, please give it a GitHub star ⭐ and spread the word on social media 📢", "report-bug": "You can also report a bug 🐞", "by": "by", - "cta-pre": "If you like Fri3d-IDE, please", + "cta-pre": "If you like MicroPythonOS IDE, please", "cta-star": "give it a GitHub star", "copy-diagnostics": "Copy diagnostics", "diagnostics-copied": "Diagnostics copied", "diagnostics-failed": "Could not copy diagnostics" }, "welcome": { - "title": "Welcome to Fri3d-IDE", - "subtitle": "MicroPython IDE for the Fri3d Camp 2026 badge.", + "title": "Welcome to MicroPythonOS IDE", + "subtitle": "MicroPython IDE for MicroPythonOS devices, including the Fri3d Camp badge.", "tours-title": "Guided tours", "tours-text": "Step-by-step tours that walk you through the IDE.", "or-connect": "Or skip the tours and connect directly:", - "whats-new": "What's new in v{{version}}" + "whats-new": "What's new in v{{version}}", + "device-workspace": "Device workspace", + "device-workspace-hint": "Choose which virtual device to run — switch anytime." + }, + "device-kind": { + "generic-micropython": "Generic MicroPython", + "micropythonos": "MicroPythonOS", + "fri3d-badge-2026": "Fri3d Badge 2026" }, "onboarding": { "step": "Step {{current}} of {{total}}", @@ -183,23 +190,23 @@ "next": "Next", "continue-on-action": "Complete the highlighted action to continue", "get-started": "Continue to IDE", - "task-connect": "Connect my badge", - "task-connect-detail": "Use USB to connect a physical Fri3d badge.", - "task-virtual": "Try the virtual badge", + "task-connect": "Connect my device", + "task-connect-detail": "Use USB to connect a physical device.", + "task-virtual": "Try the virtual device", "task-virtual-detail": "Explore MicroPythonOS without hardware.", "task-build": "Build my first app", "task-build-detail": "Create an app with a step-by-step coding guide beside the editor.", "task-badgehub": "Install an app from BadgeHub", - "task-badgehub-detail": "Browse and install a compatible badge app.", + "task-badgehub-detail": "Browse and install a compatible app.", "target-build-title": "Where should the app run?", "target-badgehub-title": "Where should the app be installed?", - "target-text": "Choose a physical Fri3d badge or the virtual badge.", - "target-real": "Real Fri3d badge", - "target-real-detail": "Connect over USB and use the physical badge.", - "target-virtual": "Virtual badge", + "target-text": "Choose a physical device or the virtual device.", + "target-real": "Real device", + "target-real-detail": "Connect over USB and use the physical device.", + "target-virtual": "Virtual device", "target-virtual-detail": "Run it in the browser without hardware.", - "connecting-real": "Connecting your badge…", - "connecting-virtual": "Starting the virtual badge…", + "connecting-real": "Connecting your device…", + "connecting-virtual": "Starting the virtual device…", "connecting-wait": "Complete any browser permission prompt to continue.", "create-first-title": "Create your starter app", "create-first-text": "Click Create New App. The guide continues as soon as the dialog opens.", @@ -209,10 +216,10 @@ "badgehub-text": "Click Browse BadgeHub. The guide continues as soon as the store opens.", "browse-badgehub-title": "Choose and install an app", "browse-badgehub-text": "Search or browse for an app, then click Install. The tour continues after installation.", - "success-connect-title": "Badge connected!", - "success-connect": "Your physical badge is ready for files, apps, and the terminal.", - "success-virtual-title": "Virtual badge running!", - "success-virtual": "You can now experiment without changing a physical badge.", + "success-connect-title": "Device connected!", + "success-connect": "Your physical device is ready for files, apps, and the terminal.", + "success-virtual-title": "Virtual device running!", + "success-virtual": "You can now experiment without changing a physical device.", "success-build-title": "Your first app is ready!", "success-build": "You created an app and opened its code. Keep experimenting, then launch it from Apps.", "success-badgehub-title": "BadgeHub is ready!", @@ -220,11 +227,11 @@ "steps": { "connection": { "title": "You are connected", - "text": "This shows your connection status: the badge name and a blinking activity dot. Disconnect here; reconnect any time with the Connect button that appears in its place." + "text": "This shows your connection status: the device name and a blinking activity dot. Disconnect here; reconnect any time with the Connect button that appears in its place." }, "apps": { "title": "Your apps", - "text": "The Apps tab lists every app installed on the badge. Click an app to open its details — and “Create New App” scaffolds a fresh one from a template." + "text": "The Apps tab lists every app installed on the device. Click an app to open its details — and “Create New App” scaffolds a fresh one from a template." }, "open-app": { "title": "Inside an app", @@ -232,7 +239,7 @@ }, "launch": { "title": "Launch the app", - "text": "The 🚀 Launch app button starts the app on the badge, exactly like picking it from the badge menu." + "text": "The 🚀 Launch app button starts the app on the device, exactly like picking it from the device menu." }, "launch-toolbar": { "title": "Launch while editing", @@ -240,20 +247,20 @@ }, "terminal": { "title": "Terminal", - "text": "All output from your badge appears here. It is also a live MicroPython REPL: click it and type Python directly on the device." + "text": "All output from your device appears here. It is also a live MicroPython REPL: click it and type Python directly on the device." }, "files": { "title": "File browser — plain MicroPython", - "text": "Prefer working without the app structure? The File Manager shows every file on the badge. Open any .py file and run it directly — regular MicroPython, no packaging needed." + "text": "Prefer working without the app structure? The File Manager shows every file on the device. Open any .py file and run it directly — regular MicroPython, no packaging needed." }, "save-run": { "title": "Save & Run safely", - "text": "Use Save & Run to write your changes to badge storage and execute them. The separate Save (Ctrl/Cmd+S) and Run (F5) commands remain available; Run alone does not save changes." + "text": "Use Save & Run to write your changes to device storage and execute them. The separate Save (Ctrl/Cmd+S) and Run (F5) commands remain available; Run alone does not save changes." }, "done": { "title": "You're all set! 🚀", - "text": "That was the tour! Your badge is connected and ready. Start building amazing things. Happy coding!", - "text-demo": "That was the tour! The demo device will now disconnect — plug in your Fri3d badge with a USB-C cable and start building. Happy coding!" + "text": "That was the tour! Your device is connected and ready. Start building amazing things. Happy coding!", + "text-demo": "That was the tour! The demo device will now disconnect — plug in your device with a USB-C cable and start building. Happy coding!" } } }, @@ -285,7 +292,7 @@ "random": "MicroPython random numbers" }, "virtual-controls": { - "title": "Keep the virtual badge out of your way", + "title": "Keep the virtual device out of your way", "move": "Move it by dragging the purple handle.", "popout": "Click ⧉ to open it in a separate window.", "minimize": "Click ▾ to minimize it to the handle. Running a checkpoint restores it automatically." @@ -295,7 +302,7 @@ "copied": "Copied", "checking": "Checking and launching…", "check-launch": "Check, save & launch", - "check-success": "Code looks good. App was saved and launched—check it on your badge.", + "check-success": "Code looks good. App was saved and launched—check it on your device.", "back": "Previous", "next": "Next feature", "finish": "Finish", @@ -303,7 +310,7 @@ "start": { "title": "Run the starter app", "instruction": "Your new main.py is open in the editor on the right. Start by checking the untouched app and seeing it run.", - "goal": "A centered Hello World message appears on the badge." + "goal": "A centered Hello World message appears on the device." }, "greeting": { "title": "Make the greeting yours", @@ -327,12 +334,12 @@ }, "joystick": { "title": "Steer with the joystick", - "instruction": "Time to turn this into a game! Add this code below the progress bar code and above self.setContentView(screen). It creates a little ship you steer with the badge joystick. On the virtual badge, drag the joystick to steer.", + "instruction": "Time to turn this into a game! Add this code below the progress bar code and above self.setContentView(screen). It creates a little ship you steer with the joystick. On the virtual device, drag the joystick to steer.", "goal": "A small ship appears and flies around when you move the joystick." }, "game": { "title": "Catch the spark!", - "instruction": "The finale: a real game. Replace everything from def on_key down to screen.add_event_cb(on_key, lv.EVENT.KEY, None) with the code below. It hides the tap button (its job is done), drops a spark at a random spot, and teaches on_key one more trick: press the A button (Enter on the virtual badge) while your ship is close to catch the spark. Every catch fills the bar.", + "instruction": "The finale: a real game. Replace everything from def on_key down to screen.add_event_cb(on_key, lv.EVENT.KEY, None) with the code below. It hides the tap button (its job is done), drops a spark at a random spot, and teaches on_key one more trick: press the A button (Enter on the virtual device) while your ship is close to catch the spark. Every catch fills the bar.", "goal": "Catch 10 sparks to fill the bar and win the game." } }, @@ -417,7 +424,7 @@ "err-conn-type": "Unknown connection type", "device-disconnected": "Device disconnected", "device-connected": "Device connected", - "update-available": "New Fri3d-IDE version {{version}} is available", + "update-available": "New MicroPythonOS IDE version {{version}} is available", "connecting": "Connecting…", "cannot-connect": "Cannot connect", "reading-device": "Reading device…", @@ -427,7 +434,7 @@ "disconnect-device": "Disconnect device", "disconnect": "Disconnect", "connect-device": "Connect device", - "vbadge-disclaimer": "The virtual badge is a preview of what the real Fri3d badge can do. It runs the same MicroPythonOS, but not everything works the same: hardware like WiFi, sensors and sound is missing or behaves differently, and timing/performance differ from the real device." + "vbadge-disclaimer": "The virtual device is a preview of what real MicroPythonOS hardware can do. It runs the same MicroPythonOS, but not everything works the same: hardware like WiFi, sensors and sound is missing or behaves differently, and timing/performance differ from the real device." }, "pkg": { "installing": "Installing {{pkg}}…", @@ -533,6 +540,7 @@ "template-progress": "Progress bar", "template-settings": "Settings demo", "template-blank": "Blank", + "template-needs-mpos": "This template uses the mpos UI toolkit and needs MicroPythonOS — it may not run on plain MicroPython.", "icon-reset": "Reset", "icon-bg": "Background", "icon-bg-choice": "Icon background {{name}}", @@ -603,7 +611,7 @@ "sort-name": "App name", "status": "Status", "status-all": "All statuses", - "incompatible": "Not for this badge", + "incompatible": "Not for this device", "install-failed": "Install failed", "no-mpk": "This project has no installable .mpk file", "downloading": "Downloading {{name}}…" diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 4917d766..91428b5e 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -45,7 +45,7 @@ "color-theme": "Tema" }, "about": { - "cta": "Si te gusta Fri3d-IDE, por favor dale una estrella en GitHub ⭐ y difúndelo en las redes sociales 📢", + "cta": "Si te gusta MicroPythonOS IDE, por favor dale una estrella en GitHub ⭐ y difúndelo en las redes sociales 📢", "report-bug": "También puedes reportar un error 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "¡Empezar! 🚀", "steps": { "welcome": { - "title": "¡Bienvenido a Fri3d-IDE! 👋", - "text": "¡Hola! Soy tu guía Fri3d. ¡Déjame darte un rápido recorrido para que puedas empezar a programar de inmediato!" + "title": "¡Bienvenido a MicroPythonOS IDE! 👋", + "text": "¡Hola! Soy tu guía. ¡Déjame darte un rápido recorrido para que puedas empezar a programar de inmediato!" }, "toolbar": { "title": "Barra de herramientas principal", - "text": "Esta es tu barra de herramientas principal. Guarda archivos, ejecuta tu código en el badge y conecta tu dispositivo Fri3d desde aquí." + "text": "Esta es tu barra de herramientas principal. Guarda archivos, ejecuta tu código en el badge y conecta tu dispositivo desde aquí." }, "connect": { "title": "Conectar por USB", - "text": "Haz clic en este botón para conectar tu badge Fri3d a través de USB/Serie. ¡También puedes usar Bluetooth 🦷 o WebREPL 🌐!" + "text": "Haz clic en este botón para conectar tu badge a través de USB/Serie. ¡También puedes usar Bluetooth 🦷 o WebREPL 🌐!" }, "side-menu": { "title": "Menú lateral", @@ -113,7 +113,7 @@ }, "done": { "title": "¡Todo listo! 🚀", - "text": "¡Eso es el tour! Conecta tu badge Fri3d y empieza a construir cosas increíbles. ¡Feliz programación!" + "text": "¡Eso es el tour! Conecta tu badge y empieza a construir cosas increíbles. ¡Feliz programación!" } } } diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index fed3b805..09cf2569 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -45,7 +45,7 @@ "color-theme": "Thème" }, "about": { - "cta": "Si vous aimez Fri3d-IDE, veuillez lui donner une étoile sur GitHub ⭐ et en parler sur les réseaux sociaux 📢", + "cta": "Si vous aimez MicroPythonOS IDE, veuillez lui donner une étoile sur GitHub ⭐ et en parler sur les réseaux sociaux 📢", "report-bug": "Vous pouvez aussi signaler un bug 🐞" }, "editor": { @@ -101,16 +101,16 @@ "get-started": "C'est parti ! 🚀", "steps": { "welcome": { - "title": "Bienvenue dans Fri3d-IDE ! 👋", - "text": "Bonjour ! Je suis ton guide Fri3d. Laisse-moi te faire une visite rapide pour que tu puisses commencer à coder tout de suite !" + "title": "Bienvenue dans MicroPythonOS IDE ! 👋", + "text": "Bonjour ! Je suis ton guide. Laisse-moi te faire une visite rapide pour que tu puisses commencer à coder tout de suite !" }, "toolbar": { "title": "Barre d'outils principale", - "text": "C'est ta barre d'outils principale. Enregistre des fichiers, exécute ton code sur le badge et connecte ton appareil Fri3d depuis ici." + "text": "C'est ta barre d'outils principale. Enregistre des fichiers, exécute ton code sur le badge et connecte ton appareil depuis ici." }, "connect": { "title": "Connecter via USB", - "text": "Clique sur ce bouton pour connecter ton badge Fri3d via USB/Série. Tu peux aussi utiliser Bluetooth 🦷 ou WebREPL 🌐 !" + "text": "Clique sur ce bouton pour connecter ton badge via USB/Série. Tu peux aussi utiliser Bluetooth 🦷 ou WebREPL 🌐 !" }, "side-menu": { "title": "Menu latéral", @@ -130,7 +130,7 @@ }, "done": { "title": "Tout est prêt ! 🚀", - "text": "C'est la fin de la visite ! Connecte ton badge Fri3d et commence à créer des choses incroyables. Bon codage !" + "text": "C'est la fin de la visite ! Connecte ton badge et commence à créer des choses incroyables. Bon codage !" } } } diff --git a/src/i18n/locales/he.json b/src/i18n/locales/he.json index da38d6f5..2a451584 100644 --- a/src/i18n/locales/he.json +++ b/src/i18n/locales/he.json @@ -45,7 +45,7 @@ "color-theme": "ערכת נושא" }, "about": { - "cta": "אם אתה אוהב את Fri3d-IDE, אנא תן לו כוכב ב-GitHub ⭐ והפיץ את המילה ברשתות החברתיות 📢", + "cta": "אם אתה אוהב את MicroPythonOS IDE, אנא תן לו כוכב ב-GitHub ⭐ והפיץ את המילה ברשתות החברתיות 📢", "report-bug": "אתה יכול גם לדווח על באג 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "בואו נתחיל! 🚀", "steps": { "welcome": { - "title": "ברוכים הבאים ל-Fri3d-IDE! 👋", - "text": "שלום! אני המדריך שלך ב-Fri3d. הרשה לי להוביל אותך בסיור קצר כדי שתוכל להתחיל לתכנת מיד!" + "title": "ברוכים הבאים ל-MicroPythonOS IDE! 👋", + "text": "שלום! אני המדריך שלך. הרשה לי להוביל אותך בסיור קצר כדי שתוכל להתחיל לתכנת מיד!" }, "toolbar": { "title": "סרגל הכלים הראשי", - "text": "זה סרגל הכלים הראשי שלך. שמור קבצים, הרץ את הקוד על ה-badge וחבר את מכשיר ה-Fri3d שלך מכאן." + "text": "זה סרגל הכלים הראשי שלך. שמור קבצים, הרץ את הקוד על ה-badge וחבר את מכשיר ה-שלך מכאן." }, "connect": { "title": "התחברות דרך USB", - "text": "לחץ על כפתור זה כדי לחבר את badge Fri3d שלך דרך USB/סריאל. תוכל גם להשתמש ב-Bluetooth 🦷 או WebREPL 🌐!" + "text": "לחץ על כפתור זה כדי לחבר את badge שלך דרך USB/סריאל. תוכל גם להשתמש ב-Bluetooth 🦷 או WebREPL 🌐!" }, "side-menu": { "title": "תפריט צד", @@ -113,7 +113,7 @@ }, "done": { "title": "הכל מוכן! 🚀", - "text": "זה היה הסיור! חבר את badge Fri3d שלך והתחל לבנות דברים מדהימים. תכנות מהנה!" + "text": "זה היה הסיור! חבר את badge שלך והתחל לבנות דברים מדהימים. תכנות מהנה!" } } } diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json index 2a3c04ae..17699d92 100644 --- a/src/i18n/locales/hi.json +++ b/src/i18n/locales/hi.json @@ -45,7 +45,7 @@ "color-theme": "थीम" }, "about": { - "cta": "यदि आपको Fri3d-IDE पसंद है, कृपया GitHub पर इसे एक स्टार दें ⭐ और इसे सोशल मीडिया पर फैलाएं 📢", + "cta": "यदि आपको MicroPythonOS IDE पसंद है, कृपया GitHub पर इसे एक स्टार दें ⭐ और इसे सोशल मीडिया पर फैलाएं 📢", "report-bug": "आप एक बग भी रिपोर्ट कर सकते हैं 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "शुरू करें! 🚀", "steps": { "welcome": { - "title": "Fri3d-IDE में आपका स्वागत है! 👋", - "text": "नमस्ते! मैं आपका Fri3d गाइड हूं। मुझे एक त्वरित दौरा करने दीजिए ताकि आप तुरंत कोडिंग शुरू कर सकें!" + "title": "MicroPythonOS IDE में आपका स्वागत है! 👋", + "text": "नमस्ते! मैं आपका गाइड हूं। मुझे एक त्वरित दौरा करने दीजिए ताकि आप तुरंत कोडिंग शुरू कर सकें!" }, "toolbar": { "title": "मुख्य टूलबार", - "text": "यह आपका मुख्य टूलबार है। फाइलें सहेजें, badge पर कोड चलाएं और यहां से अपना Fri3d डिवाइस कनेक्ट करें।" + "text": "यह आपका मुख्य टूलबार है। फाइलें सहेजें, badge पर कोड चलाएं और यहां से अपना डिवाइस कनेक्ट करें।" }, "connect": { "title": "USB के माध्यम से कनेक्ट करें", - "text": "अपने Fri3d badge को USB/Serial के माध्यम से कनेक्ट करने के लिए इस बटन पर क्लिक करें। आप Bluetooth 🦷 या WebREPL 🌐 भी उपयोग कर सकते हैं!" + "text": "अपने badge को USB/Serial के माध्यम से कनेक्ट करने के लिए इस बटन पर क्लिक करें। आप Bluetooth 🦷 या WebREPL 🌐 भी उपयोग कर सकते हैं!" }, "side-menu": { "title": "साइड मेन्यू", @@ -113,7 +113,7 @@ }, "done": { "title": "सब तैयार है! 🚀", - "text": "यह था टूर! अपना Fri3d badge कनेक्ट करें और अद्भुत चीजें बनाना शुरू करें। हैप्पी कोडिंग!" + "text": "यह था टूर! अपना badge कनेक्ट करें और अद्भुत चीजें बनाना शुरू करें। हैप्पी कोडिंग!" } } } diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json index 4b083c4a..b4dc822d 100644 --- a/src/i18n/locales/id.json +++ b/src/i18n/locales/id.json @@ -45,7 +45,7 @@ "color-theme": "Tema" }, "about": { - "cta": "Jika Anda menyukai Fri3d-IDE, silakan beri bintang di GitHub ⭐ dan sebarkan berita di media sosial 📢", + "cta": "Jika Anda menyukai MicroPythonOS IDE, silakan beri bintang di GitHub ⭐ dan sebarkan berita di media sosial 📢", "report-bug": "Anda juga dapat melaporkan bug 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "Mari mulai! 🚀", "steps": { "welcome": { - "title": "Selamat datang di Fri3d-IDE! 👋", - "text": "Halo! Saya panduan Fri3d-mu. Biar saya tunjukkan tur singkat agar kamu bisa langsung mulai coding!" + "title": "Selamat datang di MicroPythonOS IDE! 👋", + "text": "Halo! Saya panduan mu. Biar saya tunjukkan tur singkat agar kamu bisa langsung mulai coding!" }, "toolbar": { "title": "Toolbar Utama", - "text": "Ini adalah toolbar utamamu. Simpan file, jalankan kode di badge, dan hubungkan perangkat Fri3d-mu dari sini." + "text": "Ini adalah toolbar utamamu. Simpan file, jalankan kode di badge, dan hubungkan perangkat mu dari sini." }, "connect": { "title": "Hubungkan melalui USB", - "text": "Klik tombol ini untuk menghubungkan badge Fri3d-mu melalui USB/Serial. Kamu juga bisa menggunakan Bluetooth 🦷 atau WebREPL 🌐!" + "text": "Klik tombol ini untuk menghubungkan badge mu melalui USB/Serial. Kamu juga bisa menggunakan Bluetooth 🦷 atau WebREPL 🌐!" }, "side-menu": { "title": "Menu Samping", @@ -113,7 +113,7 @@ }, "done": { "title": "Semua siap! 🚀", - "text": "Itulah turnya! Hubungkan badge Fri3d-mu dan mulai membangun hal-hal yang luar biasa. Selamat coding!" + "text": "Itulah turnya! Hubungkan badge mu dan mulai membangun hal-hal yang luar biasa. Selamat coding!" } } } diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index c8c68c88..243fac96 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -45,7 +45,7 @@ "color-theme": "Tema" }, "about": { - "cta": "Se ti piace Fri3d-IDE, per favore dagli una stella su GitHub ⭐ e spargi la voce sui social media 📢", + "cta": "Se ti piace MicroPythonOS IDE, per favore dagli una stella su GitHub ⭐ e spargi la voce sui social media 📢", "report-bug": "Puoi anche segnalare un bug 🐞" }, "editor": { @@ -101,16 +101,16 @@ "get-started": "Iniziamo! 🚀", "steps": { "welcome": { - "title": "Benvenuto in Fri3d-IDE! 👋", - "text": "Ciao! Sono la tua guida Fri3d. Lasciami fare un breve tour per farti iniziare a programmare subito!" + "title": "Benvenuto in MicroPythonOS IDE! 👋", + "text": "Ciao! Sono la tua guida. Lasciami fare un breve tour per farti iniziare a programmare subito!" }, "toolbar": { "title": "Barra degli strumenti principale", - "text": "Questa è la tua barra degli strumenti principale. Salva file, esegui il codice sul badge e connetti il tuo dispositivo Fri3d da qui." + "text": "Questa è la tua barra degli strumenti principale. Salva file, esegui il codice sul badge e connetti il tuo dispositivo da qui." }, "connect": { "title": "Connetti tramite USB", - "text": "Clicca questo pulsante per connettere il tuo badge Fri3d tramite USB/Seriale. Puoi anche usare Bluetooth 🦷 o WebREPL 🌐!" + "text": "Clicca questo pulsante per connettere il tuo badge tramite USB/Seriale. Puoi anche usare Bluetooth 🦷 o WebREPL 🌐!" }, "side-menu": { "title": "Menu laterale", @@ -130,7 +130,7 @@ }, "done": { "title": "Tutto pronto! 🚀", - "text": "Questo è il tour! Connetti il tuo badge Fri3d e inizia a costruire cose fantastiche. Buona programmazione!" + "text": "Questo è il tour! Connetti il tuo badge e inizia a costruire cose fantastiche. Buona programmazione!" } } } diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 7e894113..1d3ed749 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -45,7 +45,7 @@ "color-theme": "テーマ" }, "about": { - "cta": "Fri3d-IDEが気に入ったら、GitHubでスターを付けてください ⭐ そして、ソーシャルメディアで広めてください 📢", + "cta": "MicroPythonOS IDEが気に入ったら、GitHubでスターを付けてください ⭐ そして、ソーシャルメディアで広めてください 📢", "report-bug": "また、バグを報告する 🐞こともできます" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "始めましょう! 🚀", "steps": { "welcome": { - "title": "Fri3d-IDEへようこそ! 👋", - "text": "こんにちは!私はあなたのFri3dガイドです。すぐにコーディングを始められるよう、簡単なツアーをご案内します!" + "title": "MicroPythonOS IDEへようこそ! 👋", + "text": "こんにちは!私はあなたのガイドです。すぐにコーディングを始められるよう、簡単なツアーをご案内します!" }, "toolbar": { "title": "メインツールバー", - "text": "これがメインツールバーです。ここからファイルの保存、バッジへのコード実行、Fri3dデバイスの接続ができます。" + "text": "これがメインツールバーです。ここからファイルの保存、バッジへのコード実行、デバイスの接続ができます。" }, "connect": { "title": "USBで接続", - "text": "このボタンをクリックして、Fri3dバッジをUSB/シリアルで接続してください。Bluetooth 🦷 や WebREPL 🌐 も使えます!" + "text": "このボタンをクリックして、バッジをUSB/シリアルで接続してください。Bluetooth 🦷 や WebREPL 🌐 も使えます!" }, "side-menu": { "title": "サイドメニュー", @@ -113,7 +113,7 @@ }, "done": { "title": "準備完了! 🚀", - "text": "以上がツアーです!Fri3dバッジを接続して、素晴らしいものを作り始めましょう。ハッピーコーディング!" + "text": "以上がツアーです!バッジを接続して、素晴らしいものを作り始めましょう。ハッピーコーディング!" } } } diff --git a/src/i18n/locales/ko.json b/src/i18n/locales/ko.json index 6b7d6e93..493d8fa2 100644 --- a/src/i18n/locales/ko.json +++ b/src/i18n/locales/ko.json @@ -45,7 +45,7 @@ "color-theme": "테마" }, "about": { - "cta": "Fri3d-IDE가 마음에 들면 GitHub에서 별을 주세요 ⭐ 그리고 소셜 미디어에 소식을 전하세요 📢", + "cta": "MicroPythonOS IDE가 마음에 들면 GitHub에서 별을 주세요 ⭐ 그리고 소셜 미디어에 소식을 전하세요 📢", "report-bug": "또한 버그를 보고할 수 있습니다 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "시작하기! 🚀", "steps": { "welcome": { - "title": "Fri3d-IDE에 오신 것을 환영합니다! 👋", - "text": "안녕하세요! 저는 당신의 Fri3d 가이드입니다. 바로 코딩을 시작할 수 있도록 빠른 투어를 안내해 드리겠습니다!" + "title": "MicroPythonOS IDE에 오신 것을 환영합니다! 👋", + "text": "안녕하세요! 저는 당신의 가이드입니다. 바로 코딩을 시작할 수 있도록 빠른 투어를 안내해 드리겠습니다!" }, "toolbar": { "title": "메인 툴바", - "text": "이것이 메인 툴바입니다. 파일 저장, 배지에서 코드 실행, Fri3d 장치 연결을 여기에서 할 수 있습니다." + "text": "이것이 메인 툴바입니다. 파일 저장, 배지에서 코드 실행, 장치 연결을 여기에서 할 수 있습니다." }, "connect": { "title": "USB로 연결", - "text": "이 버튼을 클릭하여 Fri3d 배지를 USB/직렬로 연결하세요. Bluetooth 🦷 또는 WebREPL 🌐를 사용할 수도 있습니다!" + "text": "이 버튼을 클릭하여 배지를 USB/직렬로 연결하세요. Bluetooth 🦷 또는 WebREPL 🌐를 사용할 수도 있습니다!" }, "side-menu": { "title": "사이드 메뉴", @@ -113,7 +113,7 @@ }, "done": { "title": "모두 준비되었습니다! 🚀", - "text": "투어가 끝났습니다! Fri3d 배지를 연결하고 멋진 것들을 만들어 보세요. 즐거운 코딩 되세요!" + "text": "투어가 끝났습니다! 배지를 연결하고 멋진 것들을 만들어 보세요. 즐거운 코딩 되세요!" } } } diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json index 9f31fb16..7ce96d02 100644 --- a/src/i18n/locales/nl.json +++ b/src/i18n/locales/nl.json @@ -9,7 +9,7 @@ "run": "Bestand uitvoeren", "save": "Bestand opslaan", "fullscreen": "Volledig scherm", - "install-app": "Fri3d-IDE als App installeren", + "install-app": "MicroPythonOS IDE als App installeren", "clear": "Wissen", "conn": { "ws": "Verbind WebREPL", @@ -159,10 +159,10 @@ }, "about": { "changelog": "Wat is er nieuw", - "cta": "Als je Fri3d-IDE leuk vindt, geef het dan alsjeblieft een ster op GitHub ⭐ en vertel het verder op sociale media 📢", + "cta": "Als je MicroPythonOS IDE leuk vindt, geef het dan alsjeblieft een ster op GitHub ⭐ en vertel het verder op sociale media 📢", "report-bug": "Je kunt ook een fout melden 🐞", "by": "door", - "cta-pre": "Als je Fri3d-IDE leuk vindt,", + "cta-pre": "Als je MicroPythonOS IDE leuk vindt,", "cta-star": "geef het dan een GitHub-ster", "copy-diagnostics": "Diagnostiek kopiëren", "diagnostics-copied": "Diagnostiek gekopieerd", @@ -323,7 +323,7 @@ "err-conn-type": "Onbekend verbindingstype", "device-disconnected": "Verbinding met apparaat verbroken", "device-connected": "Apparaat verbonden", - "update-available": "Nieuwe Fri3d-IDE versie {{version}} is beschikbaar", + "update-available": "Nieuwe MicroPythonOS IDE versie {{version}} is beschikbaar", "confirm-disconnect": "Verbinding met huidig apparaat verbreken?", "offline": "Offline", "prompt-pkg-url": "Geef een pakketnaam of URL:", @@ -338,11 +338,11 @@ "not-responding": "Apparaat reageert niet", "reading-device": "Apparaat lezen…", "wrong-port-hint": "De gekozen poort reageerde niet als een MicroPython-apparaat. Kies een andere poort en probeer opnieuw.", - "vbadge-disclaimer": "De virtuele badge is een voorproefje van wat de echte Fri3d-badge kan. Hij draait hetzelfde MicroPythonOS, maar niet alles werkt hetzelfde: hardware zoals wifi, sensoren en geluid ontbreekt of gedraagt zich anders, en timing/prestaties verschillen van het echte apparaat." + "vbadge-disclaimer": "De virtuele badge is een voorproefje van wat de echte badge kan. Hij draait hetzelfde MicroPythonOS, maar niet alles werkt hetzelfde: hardware zoals wifi, sensoren en geluid ontbreekt of gedraagt zich anders, en timing/prestaties verschillen van het echte apparaat." }, "welcome": { - "title": "Welkom bij Fri3d-IDE", - "subtitle": "MicroPython-IDE voor de Fri3d Camp 2026-badge.", + "title": "Welkom bij MicroPythonOS IDE", + "subtitle": "MicroPython-IDE voor MicroPythonOS-apparaten, waaronder de Camp-badge.", "tours-title": "Rondleidingen", "tours-text": "Stapsgewijze rondleidingen door de IDE.", "or-connect": "Of sla de rondleidingen over en verbind direct:", @@ -356,7 +356,7 @@ "continue-on-action": "Voer de gemarkeerde actie uit om verder te gaan", "get-started": "Doorgaan naar IDE", "task-connect": "Mijn badge verbinden", - "task-connect-detail": "Verbind een fysieke Fri3d-badge via USB.", + "task-connect-detail": "Verbind een fysieke badge via USB.", "task-virtual": "De virtuele badge proberen", "task-virtual-detail": "Verken MicroPythonOS zonder hardware.", "task-build": "Mijn eerste app bouwen", @@ -365,8 +365,8 @@ "task-badgehub-detail": "Zoek en installeer een geschikte badge-app.", "target-build-title": "Waar moet de app draaien?", "target-badgehub-title": "Waar moet de app worden geïnstalleerd?", - "target-text": "Kies een fysieke Fri3d-badge of de virtuele badge.", - "target-real": "Echte Fri3d-badge", + "target-text": "Kies een fysieke badge of de virtuele badge.", + "target-real": "Echte badge", "target-real-detail": "Verbind via USB en gebruik de fysieke badge.", "target-virtual": "Virtuele badge", "target-virtual-detail": "Draai hem zonder hardware in de browser.", @@ -393,8 +393,8 @@ "choose-demo": "Probeer met een demo-apparaat", "fallback-demo": "Gebruik toch een demo-apparaat", "connect-title": "Verbind je badge", - "connect-text": "Sluit je Fri3d-badge met een USB-C-kabel aan op deze computer, klik daarna op de gemarkeerde knop “Verbind apparaat” en kies de seriële poort in de browser-popup. De tour gaat automatisch verder zodra je verbonden bent.", - "demo-device": "Fri3d Badge (demo)", + "connect-text": "Sluit je badge met een USB-C-kabel aan op deze computer, klik daarna op de gemarkeerde knop “Verbind apparaat” en kies de seriële poort in de browser-popup. De tour gaat automatisch verder zodra je verbonden bent.", + "demo-device": "Badge (demo)", "steps": { "connection": { "title": "Je bent verbonden", @@ -431,7 +431,7 @@ "done": { "title": "Je bent er klaar voor! 🚀", "text": "Dat was de tour! Je badge is verbonden en klaar. Begin met het bouwen van geweldige dingen. Veel programmeerplezier!", - "text-demo": "Dat was de tour! Het demo-apparaat wordt nu losgekoppeld — sluit je Fri3d-badge aan met een USB-C-kabel en begin met bouwen. Veel programmeerplezier!" + "text-demo": "Dat was de tour! Het demo-apparaat wordt nu losgekoppeld — sluit je badge aan met een USB-C-kabel en begin met bouwen. Veel programmeerplezier!" } } }, diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json index 0caefaf5..6f3eddc0 100644 --- a/src/i18n/locales/pl.json +++ b/src/i18n/locales/pl.json @@ -45,7 +45,7 @@ "color-theme": "Motyw" }, "about": { - "cta": "Jeśli podoba ci się Fri3d-IDE, proszę daj mu gwiazdkę na GitHub ⭐ i rozprzestrzeniaj informacje w mediach społecznościowych 📢", + "cta": "Jeśli podoba ci się MicroPythonOS IDE, proszę daj mu gwiazdkę na GitHub ⭐ i rozprzestrzeniaj informacje w mediach społecznościowych 📢", "report-bug": "Możesz także zgłosić błąd 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "Zaczynamy! 🚀", "steps": { "welcome": { - "title": "Witamy w Fri3d-IDE! 👋", - "text": "Cześć! Jestem twoim przewodnikiem po Fri3d. Pozwól, że oprowadzę cię, abyś mógł od razu zacząć kodować!" + "title": "Witamy w MicroPythonOS IDE! 👋", + "text": "Cześć! Jestem twoim przewodnikiem. Pozwól, że oprowadzę cię, abyś mógł od razu zacząć kodować!" }, "toolbar": { "title": "Główny pasek narzędzi", - "text": "To jest twój główny pasek narzędzi. Zapisuj pliki, uruchamiaj kod na badge i łącz urządzenie Fri3d stąd." + "text": "To jest twój główny pasek narzędzi. Zapisuj pliki, uruchamiaj kod na badge i łącz urządzenie stąd." }, "connect": { "title": "Podłącz przez USB", - "text": "Kliknij ten przycisk, aby podłączyć badge Fri3d przez USB/Szeregowy. Możesz też użyć Bluetooth 🦷 lub WebREPL 🌐!" + "text": "Kliknij ten przycisk, aby podłączyć badge przez USB/Szeregowy. Możesz też użyć Bluetooth 🦷 lub WebREPL 🌐!" }, "side-menu": { "title": "Menu boczne", @@ -113,7 +113,7 @@ }, "done": { "title": "Wszystko gotowe! 🚀", - "text": "To był przewodnik! Podłącz badge Fri3d i zacznij budować niesamowite rzeczy. Miłego kodowania!" + "text": "To był przewodnik! Podłącz badge i zacznij budować niesamowite rzeczy. Miłego kodowania!" } } } diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index 59b52c3b..50a54709 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -45,7 +45,7 @@ "color-theme": "Tema" }, "about": { - "cta": "Se você gosta do Fri3d-IDE, por favor dê uma estrela no GitHub ⭐ e divulgue nas redes sociais 📢", + "cta": "Se você gosta do MicroPythonOS IDE, por favor dê uma estrela no GitHub ⭐ e divulgue nas redes sociais 📢", "report-bug": "Você também pode relatar um bug 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "Começar! 🚀", "steps": { "welcome": { - "title": "Bem-vindo ao Fri3d-IDE! 👋", - "text": "Olá! Sou o seu guia Fri3d. Deixe-me fazer um tour rápido para que você possa começar a programar imediatamente!" + "title": "Bem-vindo ao MicroPythonOS IDE! 👋", + "text": "Olá! Sou o seu guia. Deixe-me fazer um tour rápido para que você possa começar a programar imediatamente!" }, "toolbar": { "title": "Barra de ferramentas principal", - "text": "Esta é a sua barra de ferramentas principal. Salve arquivos, execute seu código no badge e conecte seu dispositivo Fri3d a partir daqui." + "text": "Esta é a sua barra de ferramentas principal. Salve arquivos, execute seu código no badge e conecte seu dispositivo a partir daqui." }, "connect": { "title": "Conectar via USB", - "text": "Clique neste botão para conectar seu badge Fri3d via USB/Serial. Você também pode usar Bluetooth 🦷 ou WebREPL 🌐!" + "text": "Clique neste botão para conectar seu badge via USB/Serial. Você também pode usar Bluetooth 🦷 ou WebREPL 🌐!" }, "side-menu": { "title": "Menu lateral", @@ -113,7 +113,7 @@ }, "done": { "title": "Tudo pronto! 🚀", - "text": "Esse foi o tour! Conecte seu badge Fri3d e comece a construir coisas incríveis. Bom código!" + "text": "Esse foi o tour! Conecte seu badge e comece a construir coisas incríveis. Bom código!" } } } diff --git a/src/i18n/locales/ro.json b/src/i18n/locales/ro.json index 11e4952c..468489a2 100644 --- a/src/i18n/locales/ro.json +++ b/src/i18n/locales/ro.json @@ -45,7 +45,7 @@ "color-theme": "Temă" }, "about": { - "cta": "Dacă vă place Fri3d-IDE, vă rugăm dați-i o stea pe GitHub ⭐ și răspândiți vestea pe rețelele sociale 📢", + "cta": "Dacă vă place MicroPythonOS IDE, vă rugăm dați-i o stea pe GitHub ⭐ și răspândiți vestea pe rețelele sociale 📢", "report-bug": "Puteți de asemenea să raportați o eroare 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "Să începem! 🚀", "steps": { "welcome": { - "title": "Bun venit în Fri3d-IDE! 👋", - "text": "Salut! Eu sunt ghidul tău Fri3d. Lasă-mă să îți fac un tur rapid pentru a putea începe să programezi imediat!" + "title": "Bun venit în MicroPythonOS IDE! 👋", + "text": "Salut! Eu sunt ghidul tău. Lasă-mă să îți fac un tur rapid pentru a putea începe să programezi imediat!" }, "toolbar": { "title": "Bara de instrumente principală", - "text": "Aceasta este bara ta de instrumente principală. Salvează fișiere, rulează codul pe badge și conectează dispozitivul tău Fri3d de aici." + "text": "Aceasta este bara ta de instrumente principală. Salvează fișiere, rulează codul pe badge și conectează dispozitivul tău de aici." }, "connect": { "title": "Conectare prin USB", - "text": "Apasă acest buton pentru a conecta badge-ul Fri3d prin USB/Serial. Poți folosi și Bluetooth 🦷 sau WebREPL 🌐!" + "text": "Apasă acest buton pentru a conecta badge-ul prin USB/Serial. Poți folosi și Bluetooth 🦷 sau WebREPL 🌐!" }, "side-menu": { "title": "Meniu lateral", @@ -113,7 +113,7 @@ }, "done": { "title": "Totul e gata! 🚀", - "text": "Acesta a fost turul! Conectează badge-ul Fri3d și începe să construiești lucruri uimitoare. Programare plăcută!" + "text": "Acesta a fost turul! Conectează badge-ul și începe să construiești lucruri uimitoare. Programare plăcută!" } } } diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 8e3c8789..fd477756 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -45,7 +45,7 @@ "color-theme": "Тема" }, "about": { - "cta": "Если вам нравится Fri3d-IDE, поставьте ему звезду на GitHub ⭐ и расскажите о нем в социальных сетях 📢", + "cta": "Если вам нравится MicroPythonOS IDE, поставьте ему звезду на GitHub ⭐ и расскажите о нем в социальных сетях 📢", "report-bug": "Вы также можете сообщить об ошибке 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "Начать! 🚀", "steps": { "welcome": { - "title": "Добро пожаловать в Fri3d-IDE! 👋", - "text": "Привет! Я твой гид по Fri3d. Позволь провести тебе быструю экскурсию, чтобы ты мог сразу начать программировать!" + "title": "Добро пожаловать в MicroPythonOS IDE! 👋", + "text": "Привет! Я твой гид. Позволь провести тебе быструю экскурсию, чтобы ты мог сразу начать программировать!" }, "toolbar": { "title": "Главная панель инструментов", - "text": "Это твоя главная панель инструментов. Сохраняй файлы, запускай код на badge и подключай устройство Fri3d отсюда." + "text": "Это твоя главная панель инструментов. Сохраняй файлы, запускай код на badge и подключай устройство отсюда." }, "connect": { "title": "Подключение через USB", - "text": "Нажми эту кнопку, чтобы подключить Fri3d badge через USB/Последовательный порт. Ты также можешь использовать Bluetooth 🦷 или WebREPL 🌐!" + "text": "Нажми эту кнопку, чтобы подключить badge через USB/Последовательный порт. Ты также можешь использовать Bluetooth 🦷 или WebREPL 🌐!" }, "side-menu": { "title": "Боковое меню", @@ -113,7 +113,7 @@ }, "done": { "title": "Всё готово! 🚀", - "text": "Это был тур! Подключи Fri3d badge и начинай строить удивительные вещи. Счастливого кодинга!" + "text": "Это был тур! Подключи badge и начинай строить удивительные вещи. Счастливого кодинга!" } } } diff --git a/src/i18n/locales/sv.json b/src/i18n/locales/sv.json index 0beffb5f..3c174e83 100644 --- a/src/i18n/locales/sv.json +++ b/src/i18n/locales/sv.json @@ -45,7 +45,7 @@ "color-theme": "Tema" }, "about": { - "cta": "Om du gillar Fri3d-IDE, vänligen ge det en stjärna på GitHub ⭐ och sprid ordet på sociala medier 📢", + "cta": "Om du gillar MicroPythonOS IDE, vänligen ge det en stjärna på GitHub ⭐ och sprid ordet på sociala medier 📢", "report-bug": "Du kan också rapportera ett fel 🐞" }, "editor": { @@ -101,16 +101,16 @@ "get-started": "Kom igång! 🚀", "steps": { "welcome": { - "title": "Välkommen till Fri3d-IDE! 👋", - "text": "Hej! Jag är din Fri3d-guide. Låt mig ge dig en snabb rundtur så att du kan börja koda direkt!" + "title": "Välkommen till MicroPythonOS IDE! 👋", + "text": "Hej! Jag är din guide. Låt mig ge dig en snabb rundtur så att du kan börja koda direkt!" }, "toolbar": { "title": "Huvudverktygsfält", - "text": "Det här är ditt huvudverktygsfält. Spara filer, kör din kod på badget och anslut din Fri3d-enhet härifrån." + "text": "Det här är ditt huvudverktygsfält. Spara filer, kör din kod på badget och anslut din enhet härifrån." }, "connect": { "title": "Anslut via USB", - "text": "Klicka på den här knappen för att ansluta ditt Fri3d-badge via USB/Seriell. Du kan också använda Bluetooth 🦷 eller WebREPL 🌐!" + "text": "Klicka på den här knappen för att ansluta ditt badge via USB/Seriell. Du kan också använda Bluetooth 🦷 eller WebREPL 🌐!" }, "side-menu": { "title": "Sidomeny", @@ -130,7 +130,7 @@ }, "done": { "title": "Allt är klart! 🚀", - "text": "Det var rundturen! Anslut ditt Fri3d-badge och börja bygga fantastiska saker. Trevlig kodning!" + "text": "Det var rundturen! Anslut ditt badge och börja bygga fantastiska saker. Trevlig kodning!" } } } diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json index d875b13e..95dd5033 100644 --- a/src/i18n/locales/uk.json +++ b/src/i18n/locales/uk.json @@ -45,7 +45,7 @@ "color-theme": "Тема" }, "about": { - "cta": "Якщо вам подобається Fri3d-IDE, подаруйте йому зірку на GitHub ⭐ і поширюйте відгук в соціальних мережах 📢", + "cta": "Якщо вам подобається MicroPythonOS IDE, подаруйте йому зірку на GitHub ⭐ і поширюйте відгук в соціальних мережах 📢", "report-bug": "Ви також можете повідомити про ваду 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "Почати! 🚀", "steps": { "welcome": { - "title": "Ласкаво просимо до Fri3d-IDE! 👋", - "text": "Привіт! Я твій гід по Fri3d. Дозволь провести тебе швидкою екскурсією, щоб ти міг одразу почати програмувати!" + "title": "Ласкаво просимо до MicroPythonOS IDE! 👋", + "text": "Привіт! Я твій гід. Дозволь провести тебе швидкою екскурсією, щоб ти міг одразу почати програмувати!" }, "toolbar": { "title": "Головна панель інструментів", - "text": "Це твоя головна панель інструментів. Зберігай файли, запускай код на badge та підключай пристрій Fri3d звідси." + "text": "Це твоя головна панель інструментів. Зберігай файли, запускай код на badge та підключай пристрій звідси." }, "connect": { "title": "Підключення через USB", - "text": "Натисни цю кнопку, щоб підключити Fri3d badge через USB/Серійний порт. Ти також можеш використовувати Bluetooth 🦷 або WebREPL 🌐!" + "text": "Натисни цю кнопку, щоб підключити badge через USB/Серійний порт. Ти також можеш використовувати Bluetooth 🦷 або WebREPL 🌐!" }, "side-menu": { "title": "Бічне меню", @@ -113,7 +113,7 @@ }, "done": { "title": "Все готово! 🚀", - "text": "Це був тур! Підключи Fri3d badge та починай будувати дивовижні речі. Вдалого програмування!" + "text": "Це був тур! Підключи badge та починай будувати дивовижні речі. Вдалого програмування!" } } } diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 2d6fa660..32a75cb5 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -45,7 +45,7 @@ "color-theme": "主题" }, "about": { - "cta": "如果您喜欢 Fri3d-IDE,请在 GitHub 上给它一颗星 ⭐ 并在社交媒体上传播信息 📢", + "cta": "如果您喜欢 MicroPythonOS IDE,请在 GitHub 上给它一颗星 ⭐ 并在社交媒体上传播信息 📢", "report-bug": "您还可以报告错误 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "开始吧! 🚀", "steps": { "welcome": { - "title": "欢迎使用 Fri3d-IDE! 👋", - "text": "你好!我是你的 Fri3d 向导。让我给你快速导览一下,让你立刻开始编程!" + "title": "欢迎使用 MicroPythonOS IDE! 👋", + "text": "你好!我是你的 向导。让我给你快速导览一下,让你立刻开始编程!" }, "toolbar": { "title": "主工具栏", - "text": "这是你的主工具栏。在这里保存文件、在 Fri3d 徽章上运行代码并连接你的 Fri3d 设备。" + "text": "这是你的主工具栏。在这里保存文件、在 徽章上运行代码并连接你的 设备。" }, "connect": { "title": "通过 USB 连接", - "text": "点击此按钮通过 USB/串口连接你的 Fri3d 徽章。你也可以使用蓝牙 🦷 或 WebREPL 🌐!" + "text": "点击此按钮通过 USB/串口连接你的 徽章。你也可以使用蓝牙 🦷 或 WebREPL 🌐!" }, "side-menu": { "title": "侧边菜单", @@ -101,7 +101,7 @@ }, "files": { "title": "文件管理器", - "text": "在已连接的 Fri3d 徽章上浏览和管理文件。先连接设备,然后查看和编辑它的文件!" + "text": "在已连接的 徽章上浏览和管理文件。先连接设备,然后查看和编辑它的文件!" }, "editor": { "title": "代码编辑器", @@ -109,11 +109,11 @@ }, "terminal": { "title": "终端", - "text": "终端显示 Fri3d 徽章的输出。连接后你也可以直接在 REPL 中输入命令。" + "text": "终端显示 徽章的输出。连接后你也可以直接在 REPL 中输入命令。" }, "done": { "title": "一切就绪! 🚀", - "text": "导览结束!连接你的 Fri3d 徽章,开始构建精彩的项目吧。编程愉快!" + "text": "导览结束!连接你的 徽章,开始构建精彩的项目吧。编程愉快!" } } } diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json index fdc649a5..c915efc2 100644 --- a/src/i18n/locales/zh-TW.json +++ b/src/i18n/locales/zh-TW.json @@ -45,7 +45,7 @@ "color-theme": "主題" }, "about": { - "cta": "如果您喜歡 Fri3d-IDE,請在 GitHub 上給它一顆星 ⭐ 並在社交媒體上傳播信息 📢", + "cta": "如果您喜歡 MicroPythonOS IDE,請在 GitHub 上給它一顆星 ⭐ 並在社交媒體上傳播信息 📢", "report-bug": "您還可以報告錯誤 🐞" }, "editor": { @@ -84,16 +84,16 @@ "get-started": "開始吧! 🚀", "steps": { "welcome": { - "title": "歡迎使用 Fri3d-IDE! 👋", - "text": "你好!我是你的 Fri3d 嚮導。讓我帶你快速導覽,讓你立刻開始編程!" + "title": "歡迎使用 MicroPythonOS IDE! 👋", + "text": "你好!我是你的 嚮導。讓我帶你快速導覽,讓你立刻開始編程!" }, "toolbar": { "title": "主工具列", - "text": "這是你的主工具列。在這裡儲存檔案、在 Fri3d 徽章上執行程式碼並連接你的 Fri3d 裝置。" + "text": "這是你的主工具列。在這裡儲存檔案、在 徽章上執行程式碼並連接你的 裝置。" }, "connect": { "title": "透過 USB 連接", - "text": "點擊此按鈕透過 USB/序列埠連接你的 Fri3d 徽章。你也可以使用藍牙 🦷 或 WebREPL 🌐!" + "text": "點擊此按鈕透過 USB/序列埠連接你的 徽章。你也可以使用藍牙 🦷 或 WebREPL 🌐!" }, "side-menu": { "title": "側邊選單", @@ -101,7 +101,7 @@ }, "files": { "title": "檔案管理器", - "text": "在已連接的 Fri3d 徽章上瀏覽和管理檔案。先連接裝置,然後查看和編輯它的檔案!" + "text": "在已連接的 徽章上瀏覽和管理檔案。先連接裝置,然後查看和編輯它的檔案!" }, "editor": { "title": "程式碼編輯器", @@ -109,11 +109,11 @@ }, "terminal": { "title": "終端機", - "text": "終端機顯示 Fri3d 徽章的輸出。連接後你也可以直接在 REPL 中輸入指令。" + "text": "終端機顯示 徽章的輸出。連接後你也可以直接在 REPL 中輸入指令。" }, "done": { "title": "一切就緒! 🚀", - "text": "導覽結束!連接你的 Fri3d 徽章,開始構建精彩的專案吧。編程愉快!" + "text": "導覽結束!連接你的 徽章,開始構建精彩的專案吧。編程愉快!" } } } diff --git a/src/index.css b/src/index.css index b8f58e27..00357455 100644 --- a/src/index.css +++ b/src/index.css @@ -1,29 +1,29 @@ @import "tailwindcss"; /* - * Fri3d design tokens. Raw values flip with [data-theme]; Tailwind v4 @theme + * Design tokens. Raw values flip with [data-theme]; Tailwind v4 @theme * maps them to utilities (bg-menu, text-fg, shadow-brutal, …). */ :root { - --fri3d-purple: #8835c9; - --fri3d-orange: #ffad64; - --fri3d-mint: #3ce8b3; + --brand-purple: #8835c9; + --brand-orange: #ffad64; + --brand-mint: #3ce8b3; --raw-fg: #f0f0f0; - --raw-fg-highlight: var(--fri3d-orange); + --raw-fg-highlight: var(--brand-orange); --raw-bg: #141418; --raw-bg-menu: #1c1c22; --raw-bg-edit: #0a0a0e; - --raw-accent: var(--fri3d-purple); - --raw-accent-secondary: var(--fri3d-mint); - --raw-cta: var(--fri3d-orange); + --raw-accent: var(--brand-purple); + --raw-accent-secondary: var(--brand-mint); + --raw-cta: var(--brand-orange); --raw-cta-fg: #000000; --raw-toolbar-bg: #1c1c22; - --raw-toolbar-border: var(--fri3d-mint); - --raw-tab-active-bg: var(--fri3d-purple); + --raw-toolbar-border: var(--brand-mint); + --raw-tab-active-bg: var(--brand-purple); --raw-tab-active-fg: #ffffff; - --raw-connected-passive: var(--fri3d-mint); - --raw-connected-active: var(--fri3d-orange); + --raw-connected-passive: var(--brand-mint); + --raw-connected-active: var(--brand-orange); --raw-icon-warning: #ffcc4d; --raw-icon-success: #87c244; @@ -39,15 +39,15 @@ :root[data-theme="light"] { --raw-fg: #000000; - --raw-fg-highlight: var(--fri3d-purple); - --raw-bg: var(--fri3d-mint); + --raw-fg-highlight: var(--brand-purple); + --raw-bg: var(--brand-mint); --raw-bg-menu: #2acca0; --raw-bg-edit: #fafafa; - --raw-accent: var(--fri3d-orange); - --raw-accent-secondary: var(--fri3d-purple); - --raw-cta: var(--fri3d-purple); + --raw-accent: var(--brand-orange); + --raw-accent-secondary: var(--brand-purple); + --raw-cta: var(--brand-purple); --raw-cta-fg: #ffffff; - --raw-toolbar-bg: var(--fri3d-orange); + --raw-toolbar-bg: var(--brand-orange); --raw-toolbar-border: #000000; --raw-icon-warning: var(--raw-fg); @@ -148,7 +148,7 @@ body { } /* ---------------------------------------------------------------- */ -/* Guided tour: spotlight cutout, anchored card, animated Fri3d logo */ +/* Guided tour: spotlight cutout, anchored card, animated logo */ /* ---------------------------------------------------------------- */ @keyframes tour-pulse { 0%, @@ -157,7 +157,7 @@ body { outline-offset: 0px; } 50% { - outline-color: color-mix(in srgb, var(--fri3d-orange) 90%, transparent); + outline-color: color-mix(in srgb, var(--brand-orange) 90%, transparent); outline-offset: 3px; } } diff --git a/src/services/changelog.service.ts b/src/services/changelog.service.ts index 196100a3..ad6f1d59 100644 --- a/src/services/changelog.service.ts +++ b/src/services/changelog.service.ts @@ -1,7 +1,7 @@ import changelogText from '../../CHANGELOG.md?raw' import { useEditorTabsStore } from '../stores/editorTabs' -const CHANGELOG_SEEN_KEY = 'fri3d-ide-changelog-seen' +const CHANGELOG_SEEN_KEY = 'mpos-ide-changelog-seen' /** Open (or re-activate) the changelog as a read-only markdown tab. */ export function openChangelogTab(): void { diff --git a/src/services/device.service.ts b/src/services/device.service.ts index e65d6a69..88b684aa 100644 --- a/src/services/device.service.ts +++ b/src/services/device.service.ts @@ -31,6 +31,7 @@ import { useAppsStore } from '../stores/apps' import { useEditorTabsStore } from '../stores/editorTabs' import { useSettingsStore } from '../stores/settings' import { useUiStore, withLoader } from '../stores/ui' +import { useDeviceKindStore, deviceKindFromHardwareId } from '../stores/deviceKind' import { openFileContent } from './files.service' const t = (key: string, fallback: string, opts?: Record) => @@ -190,6 +191,7 @@ function resetDeviceState(): void { useAppsStore.getState().reset() useUiStore.getState().clearLoaders() useUiStore.getState().setRunning(false) + useDeviceKindStore.getState().setDetectedRealKind(null) } function handleUnexpectedDisconnect(port: Transport): void { @@ -222,7 +224,7 @@ export async function connectDevice(type: TransportType, ui: ConnectUi): Promise const ok = await ui.confirm( t( 'app.vbadge-disclaimer', - 'The virtual badge is a preview of what the real Fri3d badge can do. It runs the same MicroPythonOS, but not everything works the same: hardware like WiFi, sensors and sound is missing or behaves differently, and timing/performance differ from the real device.', + 'The virtual device is a preview of what real MicroPythonOS hardware can do. It runs the same MicroPythonOS, but not everything works the same: hardware like WiFi, sensors and sound is missing or behaves differently, and timing/performance differ from the real device.', ), ) if (!ok) return @@ -234,6 +236,7 @@ export async function connectDevice(type: TransportType, ui: ConnectUi): Promise port = new VirtualBadgeTransport(undefined, { attach: await hasOrphanBadgeWindow(), popOut: useSettingsStore.getState().vbadgePopOut, + skin: useDeviceKindStore.getState().virtualKind, }) } else port = prepareUsbPort() @@ -270,7 +273,7 @@ export async function connectDevice(type: TransportType, ui: ConnectUi): Promise useConnectionStore.getState().startSynchronizing(port) if (useSettingsStore.getState().interruptDevice) { - const syncError = await readDeviceOnConnect(port) + const syncError = await readDeviceOnConnect(port, type) if (syncError) { await closeFailedConnection(port) useConnectionStore.getState().setError(syncError) @@ -288,7 +291,7 @@ export async function connectDevice(type: TransportType, ui: ConnectUi): Promise } } -async function readDeviceOnConnect(port: Transport): Promise { +async function readDeviceOnConnect(port: Transport, type: TransportType): Promise { const loader = useUiStore.getState().showLoader(t('app.reading-device', 'Reading device…')) useFileStore.getState().setLoading(t('files.loading', 'Loading files…')) let raw: MpRawMode | null = null @@ -300,6 +303,16 @@ async function readDeviceOnConnect(port: Transport): Promise { description: `${devInfo.machine}\n${devInfo.version}`, }) + // Best-effort device-kind detection: probe for MicroPythonOS and its + // hardware id so kind-scoped UI (templates, doc links, labels) can + // reflect the connected device. Never blocks or fails the connect. + // Skipped for the virtual device, whose kind is the user's explicit + // skin choice rather than something to auto-detect. + if (type !== 'vm') { + const hardwareId = await raw.getMposHardwareId() + useDeviceKindStore.getState().setDetectedRealKind(deviceKindFromHardwareId(hardwareId)) + } + if (pendingInstallUrl) { loader.update(t('pkg.installing', 'Installing {{pkg}}…', { pkg: pendingInstallUrl })) await rawInstallPkg(raw, pendingInstallUrl, { @@ -570,7 +583,7 @@ function rgb565ToPngBlob(buf: Uint8Array, width: number, height: number): Promis } /** Capture the device screen over raw REPL (MicroPythonOS LVGL snapshot) - * and download it as a PNG. Virtual badge takes a direct canvas grab + * and download it as a PNG. Virtual device takes a direct canvas grab * instead (faster, no REPL round-trip). */ export async function takeScreenshot(): Promise { const { port } = useConnectionStore.getState() @@ -586,7 +599,7 @@ export async function takeScreenshot(): Promise { URL.revokeObjectURL(url) } - // Virtual badge: grab the canvas directly (popped-out badge falls + // Virtual device: grab the canvas directly (popped-out device falls // through to the REPL path — no same-document canvas available). if (port instanceof VirtualBadgeTransport) { try { @@ -609,7 +622,7 @@ export async function takeScreenshot(): Promise { await withLoader(t('tool.screenshot-taking', 'Taking screenshot…'), async () => { // capture_screenshot()'s width/height only size the buffer; the LVGL // snapshot always renders at the display's real resolution, so ask - // the device for it (e.g. Fri3d badge 2024 is 296x240, not 320x240). + // the device for it (e.g. Fri3d Camp 2024 badge is 296x240, not 320x240). const out = await withRawMode(async (raw) => { return await raw.exec( ` diff --git a/src/services/diagnostics.ts b/src/services/diagnostics.ts index 9fc7cab4..e3ee6038 100644 --- a/src/services/diagnostics.ts +++ b/src/services/diagnostics.ts @@ -38,7 +38,7 @@ export function createDiagnosticsReport(): string { const worker = navigator.serviceWorker?.controller?.state ?? 'not controlling' return [ - 'Fri3d-IDE diagnostics', + 'MicroPythonOS IDE diagnostics', `Version: ${VIPER_IDE_VERSION}`, `Commit: ${VIPER_IDE_COMMIT.slice(0, 12)}`, `Build: ${new Date(Number(VIPER_IDE_BUILD)).toISOString()}`, diff --git a/src/stores/deviceKind.ts b/src/stores/deviceKind.ts new file mode 100644 index 00000000..cbdad516 --- /dev/null +++ b/src/stores/deviceKind.ts @@ -0,0 +1,62 @@ +import { create } from 'zustand' +import { persist, createJSONStorage } from 'zustand/middleware' + +/** The three device "workspaces" the IDE can target: + * - `generic-micropython`: plain MicroPython, no `mpos` module (real + * devices only — the virtual device always runs the MicroPythonOS build). + * - `micropythonos`: MicroPythonOS without a recognized hardware id. + * - `fri3d-badge-2026`: MicroPythonOS on the Fri3d Camp 2026 badge, + * identified via `mpos.DeviceInfo.get_hardware_id() === 'fri3d_2026'`. */ +export type DeviceKind = 'generic-micropython' | 'micropythonos' | 'fri3d-badge-2026' + +/** Kinds the virtual device picker can offer (it never runs plain + * MicroPython — the wasm build is always MicroPythonOS). */ +export type VirtualDeviceKind = Extract + +/** Map a `mpos.DeviceInfo.get_hardware_id()` probe result to a `DeviceKind`. + * `hardwareId === null` means `mpos` isn't importable (plain MicroPython); + * `''`/unrecognized ids fall back to the generic MicroPythonOS kind. */ +export function deviceKindFromHardwareId(hardwareId: string | null): DeviceKind { + if (hardwareId === null) return 'generic-micropython' + if (hardwareId === 'fri3d_2026') return 'fri3d-badge-2026' + return 'micropythonos' +} + +interface DeviceKindStore { + /** User's choice of virtual device skin, persisted across sessions. */ + virtualKind: VirtualDeviceKind + /** Kind detected on the currently connected real device, or `null` when + * no real device is connected (or detection hasn't completed yet). */ + detectedRealKind: DeviceKind | null + setVirtualKind(kind: VirtualDeviceKind): void + setDetectedRealKind(kind: DeviceKind | null): void +} + +export const useDeviceKindStore = create()( + persist( + (set) => ({ + virtualKind: 'fri3d-badge-2026', + detectedRealKind: null, + setVirtualKind: (virtualKind) => set({ virtualKind }), + setDetectedRealKind: (detectedRealKind) => set({ detectedRealKind }), + }), + { + name: 'mpos-ide-device-kind', + storage: createJSONStorage(() => localStorage), + partialize: (s) => ({ virtualKind: s.virtualKind }), + }, + ), +) + +/** The device kind that should drive kind-scoped UI (templates, doc links, + * labels): the detected real device kind while one is connected, otherwise + * the user's persisted virtual device choice. */ +export function getActiveDeviceKind(): DeviceKind { + const { detectedRealKind, virtualKind } = useDeviceKindStore.getState() + return detectedRealKind ?? virtualKind +} + +/** Reactive hook version of {@link getActiveDeviceKind} for components. */ +export function useActiveDeviceKind(): DeviceKind { + return useDeviceKindStore((s) => s.detectedRealKind ?? s.virtualKind) +} diff --git a/src/stores/editorTabs.ts b/src/stores/editorTabs.ts index b21c8b9b..e3a5920e 100644 --- a/src/stores/editorTabs.ts +++ b/src/stores/editorTabs.ts @@ -42,14 +42,14 @@ interface EditorTabsStore { let tabSeq = 0 const newId = () => `tab-${++tabSeq}` -const RECOVERY_KEY = 'fri3d-ide-editor-recovery-v1' +const RECOVERY_KEY = 'mpos-ide-editor-recovery-v1' const RECOVERY_MAX_BYTES = 2 * 1024 * 1024 /** Boilerplate of the pre-Welcome-tab auto-created scratch tab. It was born * dirty, so every past visitor has it in recovery; drop it unedited so the * Welcome tab can appear. */ const LEGACY_SCRATCH_CONTENT = [ - '# Fri3d-IDE - MicroPython Web IDE', + '# MicroPythonOS IDE - MicroPython Web IDE', '# Read more: https://fri3dcamp.github.io/badge_2026/', '', '# Connect your device and start creating! 🤖👨‍💻🕹️', diff --git a/src/stores/onboarding.ts b/src/stores/onboarding.ts index 9bfaf322..aebdbccd 100644 --- a/src/stores/onboarding.ts +++ b/src/stores/onboarding.ts @@ -1,9 +1,9 @@ import { create } from 'zustand' -export const CREATE_APP_GUIDE_CANCELLED_EVENT = 'fri3d:onboarding:create-app-cancelled' -export const CREATE_APP_GUIDE_COMPLETED_EVENT = 'fri3d:onboarding:create-app-completed' -export const BADGEHUB_GUIDE_CANCELLED_EVENT = 'fri3d:onboarding:badgehub-cancelled' -export const BADGEHUB_GUIDE_INSTALLED_EVENT = 'fri3d:onboarding:badgehub-installed' +export const CREATE_APP_GUIDE_CANCELLED_EVENT = 'mpos-ide:onboarding:create-app-cancelled' +export const CREATE_APP_GUIDE_COMPLETED_EVENT = 'mpos-ide:onboarding:create-app-completed' +export const BADGEHUB_GUIDE_CANCELLED_EVENT = 'mpos-ide:onboarding:badgehub-cancelled' +export const BADGEHUB_GUIDE_INSTALLED_EVENT = 'mpos-ide:onboarding:badgehub-installed' interface OnboardingStore { guidedCreateApp: boolean diff --git a/tests/device_kind.test.ts b/tests/device_kind.test.ts new file mode 100644 index 00000000..e7012758 --- /dev/null +++ b/tests/device_kind.test.ts @@ -0,0 +1,46 @@ +import { beforeEach, describe, expect, it } from 'vitest' +import { deviceKindFromHardwareId, getActiveDeviceKind, useDeviceKindStore } from '../src/stores/deviceKind' + +describe('deviceKindFromHardwareId', () => { + it('maps a missing mpos module to generic-micropython', () => { + expect(deviceKindFromHardwareId(null)).toBe('generic-micropython') + }) + + it('maps the Fri3d Camp 2026 hardware id to fri3d-badge-2026', () => { + expect(deviceKindFromHardwareId('fri3d_2026')).toBe('fri3d-badge-2026') + }) + + it('maps mpos without a recognized hardware id to micropythonos', () => { + expect(deviceKindFromHardwareId('')).toBe('micropythonos') + expect(deviceKindFromHardwareId('some_other_board')).toBe('micropythonos') + }) +}) + +describe('device kind store', () => { + beforeEach(() => { + useDeviceKindStore.setState({ virtualKind: 'fri3d-badge-2026', detectedRealKind: null }) + }) + + it('defaults the virtual kind to the Fri3d Badge 2026 skin', () => { + expect(useDeviceKindStore.getState().virtualKind).toBe('fri3d-badge-2026') + }) + + it('derives the active kind from the persisted virtual choice when no real device is connected', () => { + useDeviceKindStore.getState().setVirtualKind('micropythonos') + expect(getActiveDeviceKind()).toBe('micropythonos') + }) + + it('prefers the detected real device kind over the virtual choice', () => { + useDeviceKindStore.getState().setVirtualKind('fri3d-badge-2026') + useDeviceKindStore.getState().setDetectedRealKind('generic-micropython') + expect(getActiveDeviceKind()).toBe('generic-micropython') + }) + + it('falls back to the virtual choice once the real device is cleared (e.g. on disconnect)', () => { + useDeviceKindStore.getState().setDetectedRealKind('micropythonos') + expect(getActiveDeviceKind()).toBe('micropythonos') + + useDeviceKindStore.getState().setDetectedRealKind(null) + expect(getActiveDeviceKind()).toBe('fri3d-badge-2026') + }) +}) diff --git a/tests/editor_tabs.test.ts b/tests/editor_tabs.test.ts index fb891b0f..46132409 100644 --- a/tests/editor_tabs.test.ts +++ b/tests/editor_tabs.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const RECOVERY_KEY = 'fri3d-ide-editor-recovery-v1' +const RECOVERY_KEY = 'mpos-ide-editor-recovery-v1' describe('editor tab recovery', () => { beforeEach(() => { diff --git a/tests/rawmode.test.ts b/tests/rawmode.test.ts index c3233dc6..3d17472c 100644 --- a/tests/rawmode.test.ts +++ b/tests/rawmode.test.ts @@ -38,3 +38,33 @@ describe('MpRawMode upload paths', () => { expect(exec.mock.calls[1][0]).toContain(`os.rename("/data/kid's-app/main.py.viper.tmp","/data/kid's-app/main.py")`) }) }) + +describe('MpRawMode.getMposHardwareId', () => { + it('returns null when mpos is not importable (plain MicroPython)', async () => { + const raw = Object.create(MpRawMode.prototype) as MpRawMode + vi.spyOn(raw, 'exec').mockResolvedValue('__no_mpos__\n') + + await expect(raw.getMposHardwareId()).resolves.toBeNull() + }) + + it('returns the hardware id reported by mpos.DeviceInfo', async () => { + const raw = Object.create(MpRawMode.prototype) as MpRawMode + vi.spyOn(raw, 'exec').mockResolvedValue('fri3d_2026\n') + + await expect(raw.getMposHardwareId()).resolves.toBe('fri3d_2026') + }) + + it('returns an empty string when mpos has no recognized hardware id', async () => { + const raw = Object.create(MpRawMode.prototype) as MpRawMode + vi.spyOn(raw, 'exec').mockResolvedValue('\n') + + await expect(raw.getMposHardwareId()).resolves.toBe('') + }) + + it('treats any exec failure as "no mpos" instead of throwing', async () => { + const raw = Object.create(MpRawMode.prototype) as MpRawMode + vi.spyOn(raw, 'exec').mockRejectedValue(new Error('Timeout')) + + await expect(raw.getMposHardwareId()).resolves.toBeNull() + }) +}) diff --git a/tests/virtual_badge.test.ts b/tests/virtual_badge.test.ts index a79d9ee7..cefedc55 100644 --- a/tests/virtual_badge.test.ts +++ b/tests/virtual_badge.test.ts @@ -6,7 +6,7 @@ describe('VirtualBadgeTransport display controls', () => { const transport = new VirtualBadgeTransport('/vbadge/') const container = document.createElement('div') const shown = vi.fn() - container.addEventListener('fri3d:vbadge:show', shown) + container.addEventListener('mpos-ide:vdevice:show', shown) transport.container = container transport.showBadge() @@ -24,3 +24,29 @@ describe('VirtualBadgeTransport display controls', () => { expect(focus).toHaveBeenCalledOnce() }) }) + +describe('VirtualBadgeTransport skin selection', () => { + it('defaults to the Fri3d Badge 2026 skin', () => { + const transport = new VirtualBadgeTransport('/vbadge/index.html') as unknown as { + skinnedUrl(extra?: string): string + } + expect(transport.skinnedUrl()).toBe('/vbadge/index.html?skin=fri3d-badge-2026') + }) + + it('passes the generic MicroPythonOS skin through as a query param', () => { + const transport = new VirtualBadgeTransport('/vbadge/index.html', { + skin: 'micropythonos', + }) as unknown as { skinnedUrl(extra?: string): string } + expect(transport.skinnedUrl()).toBe('/vbadge/index.html?skin=micropythonos') + }) + + it('appends extra params after the skin param', () => { + const transport = new VirtualBadgeTransport('/vbadge/index.html', { + skin: 'micropythonos', + }) as unknown as { skinnedUrl(extra?: string): string } + expect(transport.skinnedUrl('&popout=1&theme=dark')).toBe( + '/vbadge/index.html?skin=micropythonos&popout=1&theme=dark', + ) + }) +}) + diff --git a/vite.config.ts b/vite.config.ts index fb1fc83d..b8b98743 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -50,8 +50,8 @@ export default defineConfig({ includeAssets: ['favicon.ico', 'favicon.svg', 'favicon-96x96.png', 'apple-touch-icon.png'], manifestFilename: 'site.webmanifest', manifest: { - name: 'Fri3d IDE', - short_name: 'Fri3d IDE', + name: 'MicroPythonOS IDE', + short_name: 'MicroPythonOS IDE', description: 'Browser-based IDE for connected devices', // Resolve from the manifest URL so installs work both at / // and under a static-host subpath such as GitHub Pages. From 1a65fa0b88d6f00da486fcb14297e53e098f4aa8 Mon Sep 17 00:00:00 2001 From: Sebastiaan Jansen Date: Thu, 24 Sep 2026 11:38:30 +0200 Subject: [PATCH 2/7] feat(theme): add manual UI style setting (Fri3d classic vs MicroPythonOS) Adds a generic IDE-chrome theming system, independent from device workspace and light/dark color theme: - New settings.uiStyle ('fri3d' | 'micropythonos'), persisted like other settings, mirrored to by services/theme.ts. - 'fri3d' (default) keeps the existing neobrutalist look (hard black borders, brutal drop shadows, sharp corners) unchanged. - 'micropythonos' is a new, softer generic look: blue/teal palette, muted slate borders, diffuse shadows, rounded buttons/dialogs, and a plain system heading font. Implemented as attribute-scoped CSS overrides in index.css so existing component classNames don't need to change, and composes correctly with the existing light/dark toggle. - New 'Look' selector in Settings (next to the existing color Theme selector) lets users switch manually; nothing switches automatically. - Updated CHANGELOG.md and added the new i18n strings to en.json. --- CHANGELOG.md | 5 ++ src/features/side-menu/SettingsPanel.tsx | 10 +++ src/i18n/locales/en.json | 3 + src/index.css | 88 ++++++++++++++++++++++++ src/services/theme.ts | 10 +++ src/stores/settings.ts | 3 + 6 files changed, 119 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25acb09b..81a0e126 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,11 @@ All notable user-facing changes to MicroPythonOS IDE (formerly Fri3d-IDE). detects whether it runs plain MicroPython, MicroPythonOS, or is specifically a Fri3d Camp 2026 badge, and scopes app templates and documentation links accordingly. +- **UI style setting** — a new "Look" setting lets you switch the IDE's own + visual style between the classic Fri3d neobrutalist look and a softer, + generic MicroPythonOS look (colors, borders, shadows, and button/dialog + corner radius). This is a manual choice in Settings, independent of the + device workspace and color theme (light/dark). ## v1.2.4 — 2026-08-14 diff --git a/src/features/side-menu/SettingsPanel.tsx b/src/features/side-menu/SettingsPanel.tsx index 2dacda73..57e09353 100644 --- a/src/features/side-menu/SettingsPanel.tsx +++ b/src/features/side-menu/SettingsPanel.tsx @@ -59,6 +59,7 @@ export function SettingsPanel() { const confirm = useConfirm() const zoom = useSettingsStore((s) => s.zoom) const colorTheme = useSettingsStore((s) => s.colorTheme) + const uiStyle = useSettingsStore((s) => s.uiStyle) const set = useSettingsStore((s) => s.set) return ( @@ -151,6 +152,15 @@ export function SettingsPanel() { ]} onChange={(v) => set('colorTheme', v)} /> +