I have svg where I render seats of venue. All seats are grouped by sectors. I need on seat click event, zoom in those seats which are in that sector, when I click another sector it should zoom out and zoom in again on new sector. Here is an example what I want: https://observablehq.com/@d3/zoom-to-bounding-box?collection=@d3/d3-zoom.
Currently I use svgPanZoom.js library to manipulate svg (as I know it uses matrix instead of viewBox). D3 seemed a little hard, can you advice me an alternative for d3 with what I can do something like in example above?
Here is my code:
<svg width="100%"
xmlns="http://www.w3.org/2000/svg"
ref="venueMap" id="venue-map"
opacity="1"
class="seat-map"
@mousedown.prevent="startDrag"
@touchstart="startDrag"
@mousemove="updateEndDragPoint"
@mouseup="stopDrag"
@touchend="stopDrag"
@touchcancel="stopDrag">
<image :href="layoutImage.url"
:width="layoutImage.width - (+layoutImage.width * 0.01 * 60)"
:height="layoutImage.height - (+layoutImage.height * 0.01 * 60)">
</image>
<rect
class="selectArea"
v-show="shouldDisplaySelectRect"
:x="dragData.start.x < dragData.end.x ? dragData.start.x : dragData.end.x"
:y="dragData.start.y < dragData.end.y ? dragData.start.y : dragData.end.y"
:width="Math.abs(dragData.start.x - dragData.end.x)"
:height="Math.abs(dragData.start.y - dragData.end.y)">
</rect>
<g v-for="(sector,sectorIndex) in placements">
<g v-for="(row, rowIndex) in sector">
<rect v-for="(seat, seatIndex) in row"
:key="seatIndex + 'A'"
:x="seat.x"
:y="seat.y"
:class="seatStyle(seat)"
class="seat-rect"
height="9"
width="9"
@mouseover="mouseOverSeat(seat, $event)"
@mouseout="mouseOutFromSeat($event)"
@click="selectSeat(seat, {sectorIndex, rowIndex}, $event)">
</rect>
</g>
</g>
<PolygonComponent v-for="(sector, index) in sectors"
:key="index"
:sector-index="index"
:sector="sector"
:sector-text-positions="sectorTextPosition">
</PolygonComponent>
</svg>