@@ -1193,7 +1193,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
11931193 await expect ( page . locator ( "#objectVectorStudioV2ExportJsonButton" ) ) . toBeDisabled ( ) ;
11941194 await expect ( page . locator ( "#objectVectorStudioV2ExportSvgButton" ) ) . toBeDisabled ( ) ;
11951195
1196- await expect ( page . locator ( ".tool-starter__panel--left > .accordion-v2 > .accordion-v2__header > span:first-child" ) ) . toHaveText ( [ "Object" , "Object Details (0 obj, 0 shapes)" , "Objects" ] ) ;
1196+ await expect ( page . locator ( ".tool-starter__panel--left > .accordion-v2 > .accordion-v2__header > span:first-child" ) ) . toHaveText ( [ "Object" , "Object Details (0 obj, 0 shapes)" , "Object Transform" , " Objects"] ) ;
11971197 await expect ( page . locator ( ".tool-starter__panel--right > .accordion-v2 > .accordion-v2__header > span:first-child" ) ) . toHaveText ( [ "Shape/Tools" , "Palette (0 swatches)" , "JSON Details" , "Dependency Graph" , "Status Log" ] ) ;
11981198 await expect ( page . locator ( ".tool-starter__panel--right > .accordion-v2" ) . first ( ) . locator ( ".accordion-v2__header > span:first-child" ) ) . toHaveText ( "Shape/Tools" ) ;
11991199 await expect ( page . locator ( "#objectVectorStudioV2JsonDetailsContent" ) ) . toBeHidden ( ) ;
@@ -1202,6 +1202,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
12021202 await expect ( page . locator ( "#objectVectorStudioV2PaletteSwatchCount" ) ) . toHaveText ( "(0 swatches)" ) ;
12031203 await expect ( page . locator ( "#objectVectorStudioV2ObjectTiles" ) ) . toContainText ( "No objects loaded" ) ;
12041204 await expect ( page . locator ( "#objectVectorStudioV2ObjectDetailsCount" ) ) . toHaveText ( "(0 obj, 0 shapes)" ) ;
1205+ await expect ( page . locator ( "#objectVectorStudioV2ObjectTransform" ) ) . toHaveText ( "No shape selected." ) ;
12051206 await expect ( page . locator ( "#objectVectorStudioV2RenameObjectButton" ) ) . toBeDisabled ( ) ;
12061207 await expect ( page . locator ( "#objectVectorStudioV2RenameObjectButton" ) ) . toHaveAttribute ( "data-disabled-reason" , "Disabled until a schema-valid object is selected." ) ;
12071208 await expect ( page . locator ( "#objectVectorStudioV2DeleteObjectButton" ) ) . toBeDisabled ( ) ;
@@ -1544,6 +1545,11 @@ test.describe("Workspace Manager V2 bootstrap", () => {
15441545 await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toContainText ( '"type": "rectangle"' ) ;
15451546 await expect ( page . locator ( "#objectVectorStudioV2ObjectDetails" ) ) . toContainText ( "Editable fields below are limited to schema-valid geometry" ) ;
15461547 await expect ( page . locator ( "#objectVectorStudioV2ObjectDetails" ) ) . toContainText ( "Selected Shaperectangle-1 (rectangle)" ) ;
1548+ await expect ( page . locator ( "#objectVectorStudioV2ObjectDetails" ) ) . not . toContainText ( "Transform" ) ;
1549+ await expect ( page . locator ( "#objectVectorStudioV2ObjectDetails #objectVectorStudioV2MoveShapeButton" ) ) . toHaveCount ( 0 ) ;
1550+ await expect ( page . locator ( "#objectVectorStudioV2ObjectTransform" ) ) . toContainText ( "Selected Shape: rectangle-1" ) ;
1551+ await expect ( page . locator ( "#objectVectorStudioV2ObjectTransform" ) ) . toContainText ( "Transform" ) ;
1552+ await expect ( page . locator ( "#objectVectorStudioV2ObjectTransform #objectVectorStudioV2MoveShapeButton" ) ) . toHaveCount ( 1 ) ;
15471553 await expect ( page . locator ( "#objectVectorStudioV2ObjectDetailsActions" ) ) . toHaveCount ( 0 ) ;
15481554 await expect ( page . locator ( "#objectVectorStudioV2ShapeVisibilityButton" ) ) . toHaveCount ( 0 ) ;
15491555 await expect ( page . locator ( "#objectVectorStudioV2ShapeLockButton" ) ) . toHaveCount ( 0 ) ;
@@ -1729,6 +1735,11 @@ test.describe("Workspace Manager V2 bootstrap", () => {
17291735 await clickPreviewShape ( "rectangle-1" ) ;
17301736 await expect ( page . locator ( "[data-palette-color='#6fd3ff']" ) ) . toHaveClass ( / i s - s e l e c t e d / ) ;
17311737 await expect ( page . locator ( "#objectVectorStudioV2ObjectDetails" ) ) . toContainText ( "Rectangle Geometry" ) ;
1738+ await expect ( page . locator ( "#objectVectorStudioV2ObjectTransform" ) ) . toContainText ( "Transform" ) ;
1739+ await page . locator ( 'button[aria-controls="objectVectorStudioV2ObjectTransformContent"]' ) . click ( ) ;
1740+ await expect ( page . locator ( "#objectVectorStudioV2ObjectTransformContent" ) ) . toBeHidden ( ) ;
1741+ await page . locator ( 'button[aria-controls="objectVectorStudioV2ObjectTransformContent"]' ) . click ( ) ;
1742+ await expect ( page . locator ( "#objectVectorStudioV2ObjectTransformContent" ) ) . toBeVisible ( ) ;
17321743 const reviewLayoutState = await page . evaluate ( ( ) => {
17331744 const jsonContent = document . querySelector ( "#objectVectorStudioV2JsonDetailsContent" ) ;
17341745 const statusSection = document . querySelector ( "#statusLogContent" ) . closest ( ".accordion-v2" ) ;
@@ -1980,10 +1991,22 @@ test.describe("Workspace Manager V2 bootstrap", () => {
19801991 await expect ( page . locator ( '[data-object-id="object.asteroids.object-1"]' ) ) . toHaveAttribute ( "aria-pressed" , "true" ) ;
19811992 await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K D e l e t e d o b j e c t S h i e l d P i c k u p \. / ) ;
19821993
1983- const leftOpenHeights = await page . locator ( ".tool-starter__panel--left .accordion-v2.is-open" ) . evaluateAll ( ( sections ) => (
1984- sections . map ( ( section ) => Math . round ( section . getBoundingClientRect ( ) . height ) )
1994+ const leftAccordionLayout = await page . locator ( ".tool-starter__panel--left > .accordion-v2" ) . evaluateAll ( ( sections ) => (
1995+ sections . map ( ( section ) => {
1996+ const content = section . querySelector ( ".accordion-v2__content" ) ;
1997+ const sectionRect = section . getBoundingClientRect ( ) ;
1998+ const contentRect = content ?. getBoundingClientRect ( ) ;
1999+ const style = getComputedStyle ( section ) ;
2000+ return {
2001+ contentReachesSectionBottom : ! content || content . hidden || Math . abs ( contentRect . bottom - sectionRect . bottom ) <= 2 ,
2002+ flexGrow : style . flexGrow ,
2003+ isOpen : section . classList . contains ( "is-open" ) ,
2004+ title : section . querySelector ( ".accordion-v2__header > span:first-child" ) ?. textContent . trim ( ) || ""
2005+ } ;
2006+ } )
19852007 ) ) ;
1986- expect ( Math . max ( ...leftOpenHeights ) - Math . min ( ...leftOpenHeights ) ) . toBeLessThanOrEqual ( 18 ) ;
2008+ expect ( leftAccordionLayout . map ( ( entry ) => entry . title ) ) . toEqual ( [ "Object" , "Object Details (18 obj, 2 shapes)" , "Object Transform" , "Objects" ] ) ;
2009+ expect ( leftAccordionLayout . slice ( 0 , 3 ) . every ( ( entry ) => entry . isOpen && entry . contentReachesSectionBottom && entry . flexGrow === "0" ) ) . toBe ( true ) ;
19872010
19882011 const tileScrollState = await page . locator ( "#objectVectorStudioV2ObjectsContent" ) . evaluate ( ( element ) => ( {
19892012 actionsInsideObjects : element . querySelector ( ":scope > .object-vector-studio-v2__objects-actions" ) !== null ,
0 commit comments