- {/* The panel's tab: a flap on its edge while open, a raised accent tile once it is tucked away. */}
-
setSelectedPlaceId(null)}
onEdit={() => openPlaceEditor(selectedPlace, selectedAssignmentId)}
onDelete={() => handleDeletePlace(selectedPlace.id)}
- onAssignToDay={handleAssignToDay}
- onRemoveAssignment={handleRemoveAssignment}
- files={files}
- onFileUpload={canUploadFiles ? (fd) => tripActions.addFile(tripId, fd) : undefined}
- tripMembers={tripMembers}
- onSetParticipants={placeActions.setParticipants}
- onUpdatePlace={placeActions.updatePlace}
- onUploadImage={async (placeId, file) => { await tripActions.uploadPlaceImage(tripId, placeId, file) }}
- onImageFromFile={async (placeId, fileId) => { await tripActions.setPlaceImageFromFile(tripId, placeId, fileId) }}
- onRate={placeActions.ratePlace}
leftWidth={isMobile ? 0 : leftPanelPx}
rightWidth={isMobile ? 0 : rightPanelPx}
/>
@@ -593,30 +585,10 @@ function TripPlannerPageDesktop(): React.ReactElement | null {
setSelectedPlaceId(null)}>
e.stopPropagation()}>
setSelectedPlaceId(null)}
onEdit={() => { openPlaceEditor(selectedPlace, selectedAssignmentId); setSelectedPlaceId(null) }}
onDelete={() => { handleDeletePlace(selectedPlace.id); setSelectedPlaceId(null) }}
- onAssignToDay={handleAssignToDay}
- onRemoveAssignment={handleRemoveAssignment}
- files={files}
- onFileUpload={canUploadFiles ? (fd) => tripActions.addFile(tripId, fd) : undefined}
- tripMembers={tripMembers}
- onSetParticipants={placeActions.setParticipants}
- onUpdatePlace={placeActions.updatePlace}
- onUploadImage={async (placeId, file) => { await tripActions.uploadPlaceImage(tripId, placeId, file) }}
- onImageFromFile={async (placeId, fileId) => { await tripActions.setPlaceImageFromFile(tripId, placeId, fileId) }}
- onRate={placeActions.ratePlace}
leftWidth={0}
rightWidth={0}
/>
@@ -630,19 +602,10 @@ function TripPlannerPageDesktop(): React.ReactElement | null {
tour={selectedTour}
desktopNonModal
desktopFocusReturnTarget={tourDetails.openerRef.current?.placeId === selectedTour.place_id ? tourDetails.openerRef.current.element : null}
+ {...tourDetailProps}
canEdit={canPlaceEdit}
canAssign={canDayEdit}
place={selectedPlace}
- days={days}
- selectedDayId={selectedDayId}
- selectedAssignmentId={selectedAssignmentId}
- assignments={assignments}
- files={files}
- onClose={() => setSelectedPlaceId(null)}
- onUpdatePlace={async (placeId, data) => { await tripActions.updatePlace(tripId, placeId, data); await reloadTourPlaceIds() }}
- onFileUpload={canUploadFiles ? (formData) => tripActions.addFile(tripId, formData) : undefined}
- onAssignToDay={handleAssignToDay}
- onRemoveAssignment={handleRemoveAssignment}
leftWidth={leftPanelPx}
rightWidth={rightPanelPx}
/>
@@ -653,19 +616,10 @@ function TripPlannerPageDesktop(): React.ReactElement | null {
event.stopPropagation()}>
setSelectedPlaceId(null)}
- onUpdatePlace={async (placeId, data) => { await tripActions.updatePlace(tripId, placeId, data); await reloadTourPlaceIds() }}
- onFileUpload={canUploadFiles ? (formData) => tripActions.addFile(tripId, formData) : undefined}
- onAssignToDay={handleAssignToDay}
- onRemoveAssignment={handleRemoveAssignment}
/>
,
@@ -717,21 +671,7 @@ function TripPlannerPageDesktop(): React.ReactElement | null {
onViewBaseLayerChange={tourPlanner.setMapBaseLayer}
/>
-
-
- {leftHidden ? : }
-
-
+
)
}
+
+interface LeftPanelTabProps {
+ hidden: boolean
+ label: string
+ onToggle: () => void
+ /** Also states whether the panel is open and shows a focus ring (the tour planner's tab). */
+ announced?: boolean
+}
+
+/** The left panel's tab: a flap on its edge while open, a raised accent tile once it is tucked away. */
+export function LeftPanelTab({ hidden, label, onToggle, announced = false }: LeftPanelTabProps): React.ReactElement {
+ const look = hidden ? 'bg-accent text-accent-text shadow-md hover:opacity-90' : 'text-content-faint hover:text-content'
+ return (
+
+
+ {hidden ? : }
+
+
+ )
+}