Editor: the toolkit is a rail tab on desktop, and the rail is wider #133

Merged
steve merged 2 commits from feat/toolkit-in-the-rail into main 2026-08-23 07:05:20 +00:00
4 changed files with 12 additions and 17 deletions
Showing only changes of commit 7a5b9d2ea1 - Show all commits
+1 -3
View File
@@ -177,9 +177,7 @@ export const Canvas = forwardRef<
st.setSel(m ? null : { type: 'object', id: o.id })
st.setArmedKind(null)
st.setGhost(null)
// Focusing a bed is planting intent: the rail shows the plant palette
// (the toolkit's focused mode), not the inspector. A single click still
// selects into the Plot tab.
// Focusing is planting intent: the rail shows the toolkit's plant palette.
st.setTab('toolkit')
if (!el) return
const bw = o.rotationDeg % 180 ? o.heightCm : o.widthCm
+10 -12
View File
@@ -14,18 +14,18 @@ import { useEditorStore } from './store'
import type { EditorObject } from './types'
/**
* The desktop editor's toolkit. Out of focus: the seven object kinds as pill
* rows — click to arm (then click the plan), or drag one straight onto it. In a
* focused bed it swaps to the plant list with a search, same arm/drag behavior,
* plus the bed's bulk tools (fill, clear, scan a packet).
* The desktop editor's toolkit, the rail's first tab. Out of focus: the seven
* object kinds as pill rows — click to arm (then click the plan), or drag one
* straight onto it. In a focused bed it swaps to the plant list with a search,
* same arm/drag behavior, plus the bed's bulk tools (fill, clear, scan a
* packet).
*
* It started life as the workspace's left card (the handoff's layout) and now
* lives as the first tab of the rail, so the plan and the rail get the width
* the card took. `embedded` is that mode: no card chrome of its own, and no
* "Toolkit" heading — the tab is the heading.
* It started life as the workspace's left card (the handoff's layout) and
* moved into the rail so the plan and the rail get the width the card took;
* the rail's tab body provides the card chrome and the scrolling, and the tab
* is the heading.
*/
export function Toolkit({
embedded = false,
unit,
plants,
plantings,
@@ -40,7 +40,6 @@ export function Toolkit({
onClear,
onScan,
}: {
embedded?: boolean
unit: UnitPref
plants: Plant[]
plantings: EditorPlanting[]
@@ -62,10 +61,9 @@ export function Toolkit({
const [query, setQuery] = useState('')
return (
<div className={cn('flex min-h-0 flex-col gap-2 overflow-x-hidden', embedded ? 'flex-1' : 'panel overflow-y-auto p-3.5')}>
<div className="flex min-h-0 flex-1 flex-col gap-2 overflow-x-hidden">
{!focused ? (
<>
{!embedded && <h6 className="mx-1 mb-1.5 mt-1">Toolkit</h6>}
{OBJECT_KINDS.map((k) => {
const armed = armedKind === k.kind
return (
+1 -1
View File
@@ -85,7 +85,7 @@ const TRANSIENT = {
armedLotId: null,
ghost: null,
seasonYear: null,
tab: 'plot' as RailTab,
tab: 'plot' as RailTab, // the garden summary, not the first tab: a fresh editor shows what is there before how to add to it
mode: 'build' as PhoneMode,
journalScope: null,
liveObject: null,
-1
View File
@@ -585,7 +585,6 @@ function Editor({
const plot = inspector ?? <GardenSummary objects={objects} plantings={plantings} plantsById={plantsById} canEdit={canEdit} />
const toolkit = (
<Toolkit
embedded
unit={unit}
plants={plants}
plantings={plantings}