Files
solvecraft/docs/ribbon-layout.md
T
Karl Von Richter 27d2fe6ec0 Frames: profile library, members along frame sketch lines, and the Frame Member dialog (#4003) (#4004)
* claim: #4003

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Frames: the profile library (#4003)

The first slice of frames and weldments: the cross-sections structural members
will be made of, each SolidCraft's own parametric definition built in code
(no vendor or standard size tables are shipped).

- solidcraft_doc::frame: bar, round bar, rectangular and round tube, angle,
  channel, I-beam and a generic T-slot extrusion as exact line/arc regions,
  with defaults worked out from the profile's size, refusals that name the
  dimension that does not fit, anchors and placement, and exact section
  properties (area, centroid, Ixx/Iyy/Ixy by Green's theorem).
- frame.profile.list, frame.profile.properties (with mass per metre for a
  density) and frame.profile.insert (draws a profile into a sketch, locked by
  default, at a point, anchor and angle).
- Tests against hand-computed values (rectangles, circles, composite
  rectangles by the parallel-axis theorem, fillet spandrels), hostile input,
  extrusion volume, undo; catalog entries in every locale; docs/frames.md;
  ROADMAP M15.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Frames: drop the built-in T-slot profile (#4003)

Aluminium extrusions and other vendor sections come from the user's own
sketch (drawn or inserted from the vendor's DXF), so the library keeps the
plain steel shapes only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Frames: members along frame sketch lines (#4003)

frame.member lays one body per straight line of a frame sketch (2D lines or
3D sketch lines), its cross-section square to the line from end to end:

- profile: a built-in profile, or profile_sketch, a sketch whose material
  (nested loops alternating, so two circles make a tube) is the section in
  its own x and y around its origin; profiles picks override it.
- anchor (origin, centre, centroid or a bounding-box corner or edge middle),
  angle (an angle expression, so a parameter), mirror.
- Orientation: the profile's y as near world up as the line allows, x
  square to both; a vertical member's x is world X (frame::member_axes).
- Members follow sketch and parameter edits, undo as one step, save and
  reopen (format: pending/frame-members.rs), and are named after the profile
  (Rect Tube 40x40x3, (2)…), numbering on past names already taken.

Tests against hand-computed volumes and bounding boxes (rectangle, 3D
tower lines, parameter edit, sketch tube profile and picks, anchor/angle/
mirror), refusals, undo/redo and reopen; walk fixtures and goldens; docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Frames: fixes from the adversarial review (#4003)

- Default member lines are what was drawn: projected and other linked curves
  and 3D wires (a face sketch's edges) and lines of no length are left out.
- A profile sketch's material starts from its drawn profiles, as
  solid.extrude's "all" does, so a section sketched on a face works; the
  even-odd test uses outlines and boxes worked out once, capped at 256.
- Member names are pinned to their lines (`names`, by line id; `body_name`
  is the base): deleting or adding a line, or deleting another feature, no
  longer renames other members, and frame.member stores every name it gives.
  body.rename renames a member on its line (also for later member features);
  a copy whose body_names were set still names its members by position.
- Built-in profile dimensions are expressions (ProfileSpec): they follow
  parameters, bare numbers take the design's units, and they are feature
  inputs. frame.profile.properties/insert read them the same way.
- Default root/toe radii shrink to the room a thick section leaves; radii
  given are checked by name; a radius must be 0 or at least 0.01 mm; error
  messages report the wall or flange value given, not twice it.
- A line within 1e-6 rad of vertical orients as vertical, so rounding never
  turns a post a quarter turn.
- A 2D frame sketch in a differently placed component is mapped into the
  member's frame, and member features recompute when placements change.
- Caps before lookups for a design's `lines`; a line listed twice is
  refused; a 3D wire that runs back on itself is not a line.

Regression tests for each, from the review's scenarios.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Frames: the Frame Member dialog on the ribbon (#4003)

- Frame Member (MODEL > Create) opens a dialog: the frame sketch's lines
  picked in the view (or All Lines), a built-in profile and its dimensions or
  a section picked in another sketch, anchor, angle, mirror and name, with a
  live preview. Edit Feature reopens it filled in.
- Lines picked in the view keep their sketch (a SKETCH_LINES input picks
  ExternalSketchCurve): line ids are each sketch's own, so two 3D sketches
  both have a `w2`, and the members went on the newer sketch's lines.
- timeline.redefine takes frame.member. Members keep their names through an
  edit unless it gives them a new body_name; frame.member takes `names`.
- A member whose section is a whole profile sketch keeps it when edited
  (the dialog shows the sketch instead of picking every region, which would
  fill a tube's hole).
- An original frame_member icon, open for review, on the ribbon, timeline
  and browser.
- The angle profile is listed as L-Angle, and web and flange as Web/Flange
  thickness, so they translate apart from the existing Angle, Web and Flange;
  the dialog's labels are in en, ja and zh. en-GB no longer repeats the frame
  command labels it spells the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 14:22:41 +00:00

22 KiB
Raw Blame History

Ribbon structure

The UI layout in crates/ui-egui/src/workspace.rs maps the original engine registry placements into ribbon sections. docs/features.md continues to document registry placements; command registrations and ids are unchanged.

Always shown, in order: MODEL, SURFACE, ASSEMBLE, INSERT, INSPECT, MANAGE, VIEW, SHEET METAL. SKETCH appears during sketch editing. SHEET METAL is reachable in every document, so a sheet-metal part can start from a sketch or a solid; it takes the contextual style and selects itself when the selected body (or the last body of the active component) has evaluated sheet-metal data. Entering a context selects its tab; the other tabs remain available. RENDER belongs to the Render workspace.

Bold command ids are default promoted buttons. Every listed command remains in the section menu. Saved user pins can add buttons, as before.

Tab Section Command ids, in menu order
MODEL SKETCH sketch.create, sketch.edit, sketch.line3d, sketch.spline3d, sketch.point3d, sketch.move3d
MODEL CREATE solid.extrude, solid.revolve, solid.hole, solid.sweep, solid.loft, solid.box, solid.cylinder, solid.sphere, solid.torus, solid.pipe, solid.bounding_solid, solid.thread, solid.boundary_fill, solid.coil, solid.rib, solid.web, solid.emboss, plastic.boss, plastic.lip, plastic.snap_fit, plastic.rest, frame.member
MODEL MODIFY solid.fillet, solid.chamfer, solid.shell, solid.press_pull, sheet.convert, solid.combine, solid.scale, solid.offset_face, solid.draft, solid.split_face, solid.split_body, solid.replace_face, solid.remove, timeline.delete, face.delete
MODEL ARRANGE solid.move, solid.mirror, solid.pattern.rectangular, solid.align, solid.pattern.circular, solid.pattern.path
MODEL CONFIGURE parameters.change, config.table, config.configure
MODEL CONSTRUCT construct.plane.offset, construct.plane.at_angle, construct.axis.through_cylinder, construct.axis.normal_to_face, construct.axis.two_planes, construct.axis.two_points, construct.axis.edge, construct.point.vertex, construct.point.two_edges, construct.point.three_planes, construct.point.center, construct.point.edge_plane, construct.point.along_path, construct.plane.midplane, construct.plane.two_edges, construct.plane.three_points, construct.plane.tangent, construct.plane.along_path, construct.plane.perpendicular
SURFACE SKETCH sketch.create
SURFACE CREATE surface.extrude, surface.revolve, surface.sweep, surface.loft, surface.boundary, surface.patch, surface.offset, surface.ruled, surface.blend
SURFACE EDIT surface.trim, surface.untrim, surface.extend, surface.stitch, surface.unstitch, surface.reverse_normal, surface.fair, surface.fillet, surface.match
SURFACE CONVERT surface.thicken, mesh.convert
ASSEMBLE COMPONENTS component.create, component.from_bodies, component.insert_design, parts.library
ASSEMBLE JOINTS joint.create, joint.as_built, joint.origin, joint.rigid_group, joint.limits, joint.gear, joint.rack_pinion, joint.screw, joint.cam, joint.reach
ASSEMBLE POSITION occurrence.ground, component.capture_position, component.revert_position
ASSEMBLE MOTION joint.drive, joint.motion_link, motion.study, motion.trace, explode.create
ASSEMBLE CONTACT contact.enable_sets, contact.check, contact.enable_all, contact.disable_all, contact.create, contact.edit, contact.list
INSERT FILES file.insert_step, file.insert_mesh, component.insert_design, file.save_mesh
INSERT IMAGES canvas.insert, canvas.decal, canvas.edit
INSERT 2D sketch.insert_dxf, sketch.insert_svg
INSERT LIBRARY parts.fastener, parts.library, parts.resize, parts.insert
INSERT LINKS component.update_links, component.break_link
INSPECT MEASURE inspect.measure, inspect.center_of_mass, component.properties
INSPECT SECTION inspect.section
INSPECT CHECK inspect.interference, inspect.draft, inspect.accessibility, contact.check, inspect.compare
INSPECT SURFACE QUALITY inspect.zebra, inspect.curvature_map, inspect.curvature_comb, inspect.isocurve, inspect.minimum_radius, inspect.environment_map, inspect.continuity
INSPECT HISTORY timeline.dependents, document.inspect
MANAGE PARAMETERS parameters.change, parameters.graph, parameters.move, parameters.import, parameters.export
MANAGE CONFIGURATIONS config.table, config.configure, config.rules, config.preview
MANAGE MATERIALS material.assign, appearance.assign, material.properties.validate, library.inspect, library.export, library.apply
MANAGE RULES sheet.manage_rules, plastic.manage_rules, plastic.assign_rule
MANAGE DESIGN document.units, timeline.compute_all, edit.checkpoint, edit.restore_checkpoint
VIEW VIEWS view.apply, view.save, view.rename, view.delete, view.list, view.navigate
VIEW SELECT Selection-filter controls (existing UI, no command ids)
SKETCH CREATE sketch.line, sketch.rectangle.two_point, sketch.circle.center, sketch.arc.three_point, sketch.infinite, sketch.rectangle.three_point, sketch.rectangle.rounded, sketch.rectangle.center, sketch.circle.two_point, sketch.circle.three_point, sketch.arc.center_point, sketch.polygon.inscribed, sketch.polygon.circumscribed, sketch.polygon.edge, sketch.slot.center_to_center, sketch.slot.overall, sketch.point, sketch.line.midpoint, sketch.arc.tangent, sketch.circle.two_tangent, sketch.circle.three_tangent, sketch.slot.center_point, sketch.slot.arc_three_point, sketch.slot.arc_center, sketch.ellipse, sketch.spline.fit_point, sketch.spline.control_point, sketch.spline.control_point_5, sketch.conic, sketch.centerline, sketch.text
SKETCH MODIFY sketch.trim, sketch.offset, sketch.fillet, sketch.copy, sketch.cut, sketch.paste, sketch.blend_curve, sketch.chamfer.equal_distance, sketch.chamfer.distance_angle, sketch.chamfer.two_distance, sketch.extend, sketch.break, sketch.scale, sketch.move
SKETCH PATTERN sketch.mirror, sketch.pattern.circular, sketch.pattern.rectangular
SKETCH CONSTRAIN sketch.dimension, sketch.constraint.horizontal_vertical, sketch.constraint.coincident, sketch.constraint.tangent, sketch.constraint.equal, sketch.constraint.parallel, sketch.constraint.perpendicular, sketch.construction, sketch.constrainer, sketch.constraint.fix, sketch.constraint.midpoint, sketch.constraint.concentric, sketch.constraint.collinear, sketch.constraint.symmetry, sketch.constraint.curvature, sketch.constraint.polygon, sketch.auto_constrain, sketch.auto_constrain_from_datum
SKETCH REFERENCE sketch.project, sketch.intersect, sketch.include_3d, sketch.project_to_surface, sketch.intersection_curve, sketch.spun_profile, sketch.isoparametric_curve, sketch.fit_curves_to_section, sketch.insert_dxf, sketch.insert_svg, canvas.insert
SKETCH FINISH SKETCH sketch.finish, sketch.finish_auto_constrain
SHEET METAL SKETCH sketch.create
SHEET METAL CREATE sheet.flange, sheet.hem, sheet.fold, sheet.perforate, sheet.convert
SHEET METAL FLAT sheet.unfold, sheet.refold, sheet.flat_pattern
SHEET METAL OUTPUT sheet.export_dxf, sheet.export_bend_table
SHEET METAL RULES sheet.manage_rules
SHEET METAL CONFIGURE parameters.change, config.table, config.configure
SKETCH CONFIGURE parameters.change, config.table, config.configure
RENDER SCENE render.scene
RENDER IMAGE render.start

Original placements to ribbon destinations

Explicit command-id lists override the default placement mapping. Shared commands appear in every section that lists them above. This table includes every command with an original toolbar placement.

Original tab / panel New tab / section Command ids
MESH / MODIFY INSERT / FILES file.save_mesh
PLASTIC / CREATE MODEL / CREATE plastic.boss, plastic.lip, plastic.snap_fit, plastic.rest
PLASTIC / SETUP MANAGE / RULES plastic.manage_rules, plastic.assign_rule
RENDER / IMAGE RENDER / IMAGE render.start
RENDER / SCENE RENDER / SCENE render.scene
SHEET METAL / CREATE MODEL / MODIFY sheet.convert
SHEET METAL / CREATE SHEET METAL / SKETCH sketch.create
SHEET METAL / CREATE SHEET METAL / CREATE sheet.flange, sheet.perforate, sheet.hem, sheet.fold
SHEET METAL / CREATE SHEET METAL / FLAT sheet.flat_pattern
SHEET METAL / MODIFY MANAGE / RULES sheet.manage_rules
SHEET METAL / MODIFY SHEET METAL / FLAT sheet.unfold, sheet.refold
SKETCH / CONSTRAINTS SKETCH / CONSTRAIN sketch.constraint.horizontal_vertical, sketch.constraint.coincident, sketch.constraint.tangent, sketch.constraint.equal, sketch.constraint.parallel, sketch.constraint.perpendicular, sketch.constraint.fix, sketch.constraint.midpoint, sketch.constraint.concentric, sketch.constraint.collinear, sketch.constraint.symmetry, sketch.constraint.curvature, sketch.constraint.polygon, sketch.auto_constrain, sketch.auto_constrain_from_datum
SKETCH / CREATE SKETCH / CONSTRAIN sketch.dimension, sketch.construction, sketch.constrainer
SKETCH / CREATE SKETCH / CREATE sketch.line, sketch.rectangle.two_point, sketch.rectangle.three_point, sketch.rectangle.rounded, sketch.rectangle.center, sketch.circle.center, sketch.circle.two_point, sketch.circle.three_point, sketch.arc.three_point, sketch.arc.center_point, sketch.polygon.inscribed, sketch.polygon.circumscribed, sketch.polygon.edge, sketch.slot.center_to_center, sketch.slot.overall, sketch.point, sketch.line.midpoint, sketch.arc.tangent, sketch.circle.two_tangent, sketch.circle.three_tangent, sketch.slot.center_point, sketch.slot.arc_three_point, sketch.slot.arc_center, sketch.ellipse, sketch.spline.fit_point, sketch.spline.control_point, sketch.spline.control_point_5, sketch.conic, sketch.centerline, sketch.text
SKETCH / CREATE SKETCH / REFERENCE sketch.project, sketch.intersect, sketch.include_3d, sketch.project_to_surface, sketch.intersection_curve, sketch.spun_profile, sketch.isoparametric_curve, sketch.fit_curves_to_section
SKETCH / FINISH SKETCH SKETCH / FINISH SKETCH sketch.finish, sketch.finish_auto_constrain
SKETCH / INSERT INSERT / 2D sketch.insert_dxf, sketch.insert_svg
SKETCH / INSERT INSERT / IMAGES canvas.insert, canvas.decal, canvas.edit
SKETCH / INSPECT INSPECT / CHECK inspect.draft, inspect.accessibility
SKETCH / INSPECT INSPECT / MEASURE inspect.center_of_mass
SKETCH / INSPECT INSPECT / SURFACE QUALITY inspect.curvature_comb, inspect.minimum_radius, inspect.isocurve, inspect.zebra, inspect.environment_map, inspect.curvature_map
SKETCH / MODIFY SKETCH / MODIFY sketch.blend_curve, sketch.fillet, sketch.chamfer.equal_distance, sketch.chamfer.distance_angle, sketch.chamfer.two_distance, sketch.offset, sketch.trim, sketch.extend, sketch.break, sketch.scale, sketch.move
SKETCH / PATTERN SKETCH / PATTERN sketch.mirror, sketch.pattern.circular, sketch.pattern.rectangular
SOLID / ASSEMBLE ASSEMBLE / COMPONENTS component.create, component.insert_design
SOLID / ASSEMBLE ASSEMBLE / CONTACT contact.enable_sets, contact.enable_all, contact.disable_all, contact.create
SOLID / ASSEMBLE ASSEMBLE / JOINTS joint.create, joint.as_built, joint.rigid_group, joint.gear, joint.rack_pinion, joint.screw, joint.cam
SOLID / ASSEMBLE ASSEMBLE / MOTION joint.drive, joint.motion_link, explode.create, motion.study, motion.trace
SOLID / CONFIGURE MANAGE / CONFIGURATIONS config.configure, config.table
SOLID / CONSTRUCT MODEL / CONSTRUCT construct.plane.offset, construct.plane.at_angle, construct.axis.through_cylinder, construct.axis.normal_to_face, construct.axis.two_planes, construct.axis.two_points, construct.axis.edge, construct.point.vertex, construct.point.two_edges, construct.point.three_planes, construct.point.center, construct.point.edge_plane, construct.point.along_path, construct.plane.midplane, construct.plane.two_edges, construct.plane.three_points, construct.plane.tangent, construct.plane.along_path, construct.plane.perpendicular
SOLID / CREATE ASSEMBLE / JOINTS joint.origin
SOLID / CREATE MODEL / ARRANGE solid.pattern.rectangular, solid.pattern.circular, solid.pattern.path, solid.mirror
SOLID / CREATE MODEL / CREATE solid.extrude, solid.revolve, solid.sweep, solid.loft, solid.box, solid.cylinder, solid.sphere, solid.torus, solid.hole, solid.pipe, solid.bounding_solid, solid.thread, solid.boundary_fill, solid.coil, solid.rib, solid.web, solid.emboss, frame.member
SOLID / CREATE MODEL / SKETCH sketch.create
SOLID / INSERT INSERT / FILES file.insert_step, file.insert_mesh
SOLID / INSERT INSERT / LIBRARY parts.fastener
SOLID / INSPECT INSPECT / CHECK inspect.interference
SOLID / INSPECT INSPECT / MEASURE inspect.measure
SOLID / INSPECT INSPECT / SECTION inspect.section
SOLID / MODIFY MANAGE / DESIGN timeline.compute_all
SOLID / MODIFY MANAGE / MATERIALS appearance.assign, material.assign
SOLID / MODIFY MANAGE / PARAMETERS parameters.change
SOLID / MODIFY MODEL / ARRANGE solid.move, solid.align
SOLID / MODIFY MODEL / MODIFY solid.fillet, solid.chamfer, solid.combine, solid.scale, solid.offset_face, solid.shell, solid.draft, solid.split_face, solid.split_body, solid.press_pull, solid.replace_face, solid.remove, timeline.delete, face.delete
SOLID / POSITION ASSEMBLE / POSITION component.capture_position, component.revert_position
SURFACE / CREATE SURFACE / CONVERT surface.thicken
SURFACE / CREATE SURFACE / CREATE surface.boundary, surface.patch, surface.extrude, surface.revolve, surface.sweep, surface.loft, surface.offset, surface.ruled, surface.blend
SURFACE / INSPECT INSPECT / SURFACE QUALITY inspect.continuity
SURFACE / MODIFY SURFACE / EDIT surface.stitch, surface.extend, surface.trim, surface.untrim, surface.unstitch, surface.reverse_normal, surface.fair, surface.fillet, surface.match

Placement decisions and missing commands

  • Save As Mesh (file.save_mesh), previously MESH / MODIFY, is in INSERT / FILES. The existing File menu continues to offer it.
  • The selection filter, previously in SELECT on multiple tabs including UTILITIES, is in VIEW / SELECT. This is a populated control group, although it has no command ids.
  • MODEL’s Pattern button uses the existing solid.pattern.rectangular command; Circular and Path stay in its menu. No generic pattern command is registered.
  • There is no separate New 3D Sketch command. MODEL / SKETCH lists the existing 3D line, spline, point and move-point commands. Infinite Line (sketch.infinite) is in SKETCH / CREATE.
  • Physical Properties maps to the existing component.properties command. Material data checks map to material.properties.validate. Calibrate maps to the existing canvas editor (canvas.edit).
  • VIEW / VIEWS lists the existing named-view and navigation commands. Display, Show, Agent and Window are omitted: their requested settings have no engine commands. No Fit or Orientation commands were invented.
  • RENDER / IMAGE exposes the already registered render.start, which previously had no visible panel. The Render workspace and its existing SCENE command are preserved.
  • Constrain is the gallery exception to the four-promoted-button cap: the large Dimension button is followed by a 3 × 2 icon-only constraint gallery (Horizontal/Vertical, Coincident, Tangent; Equal, Parallel, Perpendicular). Every command remains in the section list and saved pins still apply.

Saved customizations

Legacy toolbar preferences are plain maps keyed by DESIGN/<tab>/<panel>. On load, known keys migrate using the same command destinations. Previously promoted buttons absent from a saved list remain removed. Merging panels retains saved order within each source; sources merge in sorted-key order, and duplicates are removed. New promoted defaults are retained unless an old saved removal applies. Unknown keys and unknown command ids are preserved. An existing new destination takes precedence over a legacy destination.

Preferences and shortcut exports now wrap the map as {"version":2,"panels":{...}}. The version prevents repeated migration of unchanged SKETCH, SURFACE and SHEET METAL keys. Legacy imports still migrate. Reset restores the new defaults.

Additional old panels used for shared layouts migrate as follows: SELECT on any old tab → VIEW / SELECT; ASSEMBLE → ASSEMBLE / JOINTS; CONSTRUCT → MODEL / CONSTRUCT; INSPECT → INSPECT / CHECK; INSERT → INSERT / FILES; PLASTIC / MODIFY → MODEL / MODIFY; MESH / CREATE or PREPARE → SURFACE / CONVERT; UTILITIES / MAKE, ADD-INS or UTILITY → MANAGE / DESIGN. Command-id destinations override these panel defaults.

Automation handles

The tab handle form stays tab:<UPPERCASE NAME>. Added: tab:MODEL, tab:ASSEMBLE, tab:INSERT, tab:INSPECT, tab:MANAGE, tab:VIEW. SURFACE and RENDER retain their names; SKETCH is available only in context; SHEET METAL is always available. Legacy aliases remain: tab:SOLID and tab:PLASTIC → MODEL; tab:MESH → SURFACE; tab:UTILITIES → MANAGE. The Home and document-tab handles are unchanged.

Section labels retain panel:<tab>:<section> and collapsed sections retain collapsed:<tab>:<section>, with destinations from the tables above. In particular, panel:SOLID:CREATE becomes panel:MODEL:CREATE, selection-filter panels become panel:VIEW:SELECT, and panel:SKETCH:CONSTRAINTS becomes panel:SKETCH:CONSTRAIN. Command button and menu handles keep their command ids.

Docked ribbon painting

The ribbon is a full-width surface immediately below the 34 px application bar, with no outer gap or rounding. toolbar::{TAB_ROW_HEIGHT,GROUP_HEIGHT,RIBBON_HEIGHT} reserve 30 + 86 + 1 px; browser and viewport placement follows the panel allocation. The workspace column is 88 px wide. Promoted buttons are 54 × 60 px with 3 px gaps (Sketch Create retains wider family selectors). Section labels occupy a 20 px row, inset 3 px, and retain the existing command lists, pin actions and drag targets.

Tab labels use normal word casing. Selected standard tabs use their soft accent; contextual tabs use their solid accent and add a row-wide line when selected. The existing TabAccent helper supplies all selection colours. Search is a 188 × 24 px launcher for the S box, using the existing zoom magnifier; it shrinks to 24 px before the tabs scroll horizontally. The selected tab scrolls into view after a context change or resize. Clicking Search or pressing S anchors the existing search popup below the field. The bottom command line is gone: the S box (and the ribbon search field) runs a command id typed with JSON parameters, e.g. solid.extrude {"distance": 20}, when you press Enter.

Sketch's Finish group reserves space at the far right even when other groups collapse. Its unfilled Finish Sketch button uses the existing finish icon. The chevron-free Exit row still opens the existing command list, preserving Finish with Auto-Constrain and saved pin customizations.

Additional handles: ribbon:workspace, ribbon:search, and ribbon:section:<TAB>:<SECTION>. Existing workspace, tab, panel, collapsed, family and command handles remain available. Layout evidence also publishes rectangles for these handles, button:<command id>, and the open ribbon:search_popup.

Workspace and section lists

The workspace popup is 470 px wide, anchored below the workspace column. Design and Render keep their existing menu actions and enablement; planned workspaces cannot be selected. Each row also publishes workspace:menu:<design|render|animation|simulation|manufacture|drawing>. The constraint cells publish ribbon:constraint:<command id> alongside their existing button: and toolbar: handles. No icon assets or command ids were added.

Section lists use 30 px command rows, 20 px semantic icons, monospace shortcuts, hover pins and a pinning footer. workspace::groups optionally supplies headings and command order. MODEL / MODIFY uses EDGES, FACES, BODIES and SPECIALISE; unlisted commands follow the final heading in their original order. This ordering does not change promoted buttons or saved pins.

Ribbon tooltips show the full command name in bold and its registered shortcut in a key cap. Existing Render catalog descriptions are reused; commands without prose descriptions show the header alone (and their existing disabled reason when applicable). Registry parameter syntax is not presented as a description.

The floating shell uses one Browser card with a title, body count and fold button. Its right edge resizes the same saved browser width as the Docked sidebar. The Browser preference “Float it over the workspace” switches the Docked sidebar to this card; in the Floating shell it keeps the card and enables the translucent overlay surface. With the left history enabled, the browser stays below that history unless the overlay preference is enabled, in which case only the history keeps its column. The bottom History card leaves a gap beneath the browser; the full viewport remains available through the gaps and below a short browser.