| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(autolevel): UI polish, i18n fixes, and Electron first-launch white screen (#967) * fix(electron): use ready-to-show on all platforms to prevent white screen on first launch * fix(autolevel): UI polish, i18n fixes, and code cleanup - Replace raw back buttons with compact Button component in SetupProbeView and ApplyView - Fix i18n interpolation in ZProbeDiagram and ProbeAreaDiagram using unescaped {{- units}} - Fix feedrate label using i18n._('mm/min') / i18n._('in/min') instead of split i18n._('min') - Add clearanceZ validation: show error when clearance Z is not above start Z - Update Autolevel widget description in WidgetManager - Update LandingView description text - Fix WidgetManager grid layout using CSS grid to prevent float wrapping issues - Remove unused CSS classes from ApplyView.styl, SetupProbeView.styl, LandingView.styl - Delete unused StartProbeModal.styl * i18n: translate new autolevel diagram labels and widget strings | 6 个月前 | |
feat(widgets/Axes): add controller-aware homing and zeroing for Grbl, Marlin, Smoothie, and TinyG (#963) * Add initial Marlin workspace zeroing support(doesnt fix dropdown) * refactor(widgets/Axes): sanitize inputs before branching in setWorkOffsets - Move axis/value normalization before the controller type branches so both Marlin and non-Marlin paths receive sanitized input - Use early return for Marlin branch for clearer control flow - Wrap G10 L20 path in a block scope to mirror Marlin block structure - Improve comments: URL and description on separate lines, label each branch * feat(widgets/Axes): map dropdown items to controller-supported commands Add SUPPORTED_COMMANDS map that declares which G-code commands each controller supports, and gate dropdown menu items and machine position taskbar buttons accordingly. - Add controllerType prop from Axes.jsx → DisplayPanel - Add SUPPORTED_COMMANDS capability map with can-prefixed boolean flags for GRBL, MARLIN, SMOOTHIE, and TINYG - Hide G10 L20 WCS offset items for Marlin (uses G92 instead) - Hide G92.1 cancel items for Marlin (requires CNC_COORDINATE_SYSTEMS) - Hide G28.3 / G28.2 items for all except TinyG/g2core - Render machine position taskbar buttons only for TinyG * feat(widgets/Axes): add controller-aware homing commands for all firmware types Add getHomeCommand and getAxisHomeCommand helpers that return the correct homing G-code for each controller type: - Grbl: $H (all axes), $HX/$HY/$HZ (single axis) - TinyG/g2core: G28.2 X0 Y0 Z0 (composed from reported axes) - Marlin: G28 (all axes), G28 X/Y/Z (single axis) - Smoothie: G28 (all axes), G28 X/Y/Z (single axis) Homing commands are now always shown in dropdown menus and taskbar buttons for all controllers, gated only by canClick (connection state). The dynamic {{command}} interpolation shows the actual G-code sent. Also adds translations for the new homing command labels across all 17 supported languages. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(widgets/Axes): add explicit TINYG check and empty string fallback in homing helpers Instead of assuming TinyG for unknown controller types, explicitly check for TINYG and return an empty string as the default fallback for getHomeCommand and getAxisHomeCommand. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: remove unnecessary line in DisplayPanel.jsx --------- Co-authored-by: cheton <cheton@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Cheton Wu <447801+cheton@users.noreply.github.com> | 7 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat: preserves partially typed Console commands while serial, jog, and macro output is rendered (#994) * fix: preserve console input during output * chore: add cncjs-pr-994.md changeset | 2 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat(gcode): show a progress bar for the running job (#1005) * feat(gcode): show a progress bar for the running job The widget already reports `sent`, `received` and `total`, but only as raw counts: reading "12483 / 41902" tells you how far along the job is only after you do the division. A bar answers the same question at a glance, which is what you want from across the shop. Driven by `received` rather than `sent`. Sent counts lines handed to the controller, and the controller runs several seconds behind while its planner buffer drains, so a bar driven by sent reads ahead of the tool and reaches 100% while the job is still cutting. Received counts lines the controller acknowledged, so it tracks the tool. Hidden when no file is loaded, since an empty bar next to em dashes is noise. Uses the same react-bootstrap ProgressBar the Autolevel widget already uses for its probing progress, so the two read alike. Adds .changeset/gcode-progress-bar.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * Remove default bottom margin from GCodeStats progress bar --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Co-authored-by: cheton <cheton@gmail.com> | 1 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
feat: add support for uploading files to the watch directory (#1008) * Add "Save to Watch Directory" checkbox * Add cross-env * Hide "Save to Watch Directory" if not configured * Rework Watch Directory modal with realtime upload support - Remove the "Save to Watch Directory" checkbox from the visualizer toolbar; uploading to the watch directory now happens from the Watch Directory modal itself - Add an Add button and a dropzone to the modal for uploading files to the configured watch directory, with an upload progress overlay - Refresh the file tree in real time: monitor service forwards file system events through an EventEmitter facade and CNCEngine broadcasts watchdir:change over Socket.IO; the modal re-lists on change events (debounced) instead of polling - Add a Refresh button whose spinner reflects the in-flight getFiles request - File tree UX: folders toggle expansion on single click and double-click loads files only, clicking outside the table deselects, long file names truncate with an ellipsis and a title tooltip, the name column keeps at least 40% of the table width and the size column reserves fixed padding for the vertical scrollbar - Make the modal width dynamic (80vw) instead of a fixed preset - Drop the server-side file deletion endpoint introduced earlier in this branch as deletion is out of scope for now * chore(i18n): complete missing translations * chore: update changeset file --------- Co-authored-by: cheton <cheton@gmail.com> Co-authored-by: Cheton Wu <447801+cheton@users.noreply.github.com> | 1 个月前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 7 个月前 | |
Enhance CI/CD workflow with Yarn 3, Node.js 14, and GitHub Actions (#799) * Publish package-lock file to Appveyor artifacts * chore: bump to Node.js 14 and Yarn 3 * ci: add GitHub workflow for CI build * ci: refactor build scripts for CI pipeline * chore: revert to use npm to run electron builder script * ci: omit Linux i386 support due to lack of Electron binary support * ci: add "export ARCHFLAGS="-arch x86_64" to overcome the issue of incompatible architecture with macOS 10.15 * ci: remove Windows x86 build * ci: bump electron dependencies * chore: update build scripts in package.json * ci: implement CI/CD with GitHub action workflow * ci: deprecate AppVeyor and use GitHub Actions * chore: target the next release version to 1.10.0 * ci: remove GITHUB_TOKEN environment variable from build.yml * chore: sync dependencies in src/package.json * chore: update Node.js engine version in package.json * chore: provide access to env.GITHUB_TOKEN when building packages * ci: update build-latest.sh * fix: upgrade serialport to v10 * docs: update README.md for Node.js support * fix: use named import for the SerialPort module * feat: upgrade Electron application * feat: change indentation from 4 spaces to 2 spaces * chore: rename `read-user-data` and `write-user-data` to `read-user-config` and `write-user-config` * chore: babel polyfill is no longer needed Co-authored-by: cheton <cheton@gmail.com> | 3 年前 |