From 021cdb28d0d27cc66a6862fa75cda64659188d0c Mon Sep 17 00:00:00 2001 From: Dmitriy Petrov Date: Tue, 11 Aug 2026 09:02:19 +0300 Subject: [PATCH] Preserve drawer during startup animation --- src/shared/versions.ts | 4 ++-- src/web/styles/layout.css | 2 +- src/web/styles/themes.css | 2 +- test/web/responsive-layout-contract.test.js | 5 +++-- test/web/style-boundaries.test.js | 14 +++++++------- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/shared/versions.ts b/src/shared/versions.ts index 5e2439e..16c26de 100644 --- a/src/shared/versions.ts +++ b/src/shared/versions.ts @@ -1,6 +1,6 @@ export const HARBOR_VERSIONS = Object.freeze({ - macClient: '0.23.9', - gatewayClient: '0.24.9', + macClient: '0.23.10', + gatewayClient: '0.24.10', gatewayBackend: '0.24.0', }); diff --git a/src/web/styles/layout.css b/src/web/styles/layout.css index 20c64a6..763a686 100644 --- a/src/web/styles/layout.css +++ b/src/web/styles/layout.css @@ -237,7 +237,7 @@ animation: harbor-startup-brand 760ms cubic-bezier(0.16, 1, 0.3, 1); } -.client-shell.is-intro .client-panel, +.client-shell.is-intro .client-panel > :not(.client-drawer), .client-shell.is-intro .client-secondary-menu, .client-shell.is-intro .harbor-versions { animation: harbor-startup-content 720ms 120ms cubic-bezier(0.16, 1, 0.3, 1) both; diff --git a/src/web/styles/themes.css b/src/web/styles/themes.css index 51b5486..c7f58bd 100644 --- a/src/web/styles/themes.css +++ b/src/web/styles/themes.css @@ -148,7 +148,7 @@ transition: none; } - .client-shell.is-intro .client-panel, + .client-shell.is-intro .client-panel > :not(.client-drawer), .client-shell.is-intro .client-secondary-menu, .client-shell.is-intro .harbor-versions { animation: none; diff --git a/test/web/responsive-layout-contract.test.js b/test/web/responsive-layout-contract.test.js index 6af0468..36a75ab 100644 --- a/test/web/responsive-layout-contract.test.js +++ b/test/web/responsive-layout-contract.test.js @@ -64,9 +64,10 @@ test('page reload plays one stable startup sequence', () => { assert.match(styles, /\.client-shell\.is-intro \.harbor-brand-content \{[\s\S]*harbor-startup-brand 760ms/); assert.match(styles, /@keyframes harbor-startup-brand[\s\S]*opacity: 0\.35;[\s\S]*filter: blur\(5px\)/); assert.doesNotMatch(/@keyframes harbor-startup-brand \{([\s\S]*?)\n\}/.exec(styles)?.[1] || '', /translate|scale/); - assert.match(styles, /\.client-shell\.is-intro \.client-panel,[\s\S]*\.client-secondary-menu,[\s\S]*\.harbor-versions \{[\s\S]*harbor-startup-content 720ms 120ms/); + assert.match(styles, /\.client-shell\.is-intro \.client-panel > :not\(\.client-drawer\),[\s\S]*\.client-secondary-menu,[\s\S]*\.harbor-versions \{[\s\S]*harbor-startup-content 720ms 120ms/); + assert.doesNotMatch(styles, /\.client-shell\.is-intro \.client-panel\s*,/); assert.match(styles, /@keyframes harbor-startup-content[\s\S]*opacity: 0;[\s\S]*filter: blur\(6px\)/); - assert.match(styles, /@media \(prefers-reduced-motion: reduce\)[\s\S]*\.client-shell\.is-intro \.client-panel,[\s\S]*animation: none/); + assert.match(styles, /@media \(prefers-reduced-motion: reduce\)[\s\S]*\.client-shell\.is-intro \.client-panel > :not\(\.client-drawer\),[\s\S]*animation: none/); }); test('server rows scroll inside the subscription drawer without moving the main layout', () => { diff --git a/test/web/style-boundaries.test.js b/test/web/style-boundaries.test.js index 9c83a3f..e8d433a 100644 --- a/test/web/style-boundaries.test.js +++ b/test/web/style-boundaries.test.js @@ -47,14 +47,14 @@ const acceptedLedger = { variableReferences: 788, }, hashes: { - cascadeEdges: '1f48ed1c4272092b7698d94ea8d0fc1ebfb66454a6a715c9b684515bbff74fb8', + cascadeEdges: 'a47dbf5212045c865de7a41d420e78df8b992a6ec1b06fb18a8d459cd480f0ae', customProperties: 'fc8401b40b8d2cc8a1fc1716360ba8e5baccb694cdabde68427d3c92c04a84d4', - declarations: '35919553b73a13a1690570968da5b5bd3b493a067cfe74834bbe0006e2861fd2', + declarations: 'a35a393a48727746d6e0a57c84ab118ae44a48fd0e37748307e1a2e9ffa88ff7', duplicateKeyframes: '4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945', duplicateSelectors: '419962e669cbfdf5c8186318cb26688477fc0199cae98df8e1cd9bf5cddd76c2', keyframes: 'fb859c4d0d1bfd2f5a18904e30a5f79c6ce6931d74fe88cbd506fb28c334b7ac', - ruleDeclarationSequences: '92b8ba9efa203d28b6f88809abb819541f3d85d92a891e1a9b93d768bee9760a', - selectors: '6dd352f47606c21b5c07817e185753baa8b3168ab92d3cfef4b28f772b989cc7', + ruleDeclarationSequences: 'e6d21f0272c35ef5909b3d6ced45e5bfba77d4cda6d3fc61728a9d97f9dd2736', + selectors: '8668def9103b02e94e3fcc53e5df9f2abc07c1d78d94517d0fefc9e2be54c8b4', variableReferences: '700137c05be5f12722a7ebec90d06be70dde203a754a9312d45c03ff05ff08ec', witnesses: 'f51f070cc2c7dba0f8d08518cdeee49eaf176aac82e3571cdd8498315ba8db83', }, @@ -405,8 +405,8 @@ test('main owns one public stylesheet and the regrouped production CSS is determ assert.equal((main.match(/import ['"][^'"]+\.css['"]/g) || []).length, 1); const assets = fs.readdirSync(path.join(root, 'dist/assets')).filter((file) => file.endsWith('.css')); - assert.deepEqual(assets, ['index-DTaZk39l.css']); + assert.deepEqual(assets, ['index-vw0VVUis.css']); const built = fs.readFileSync(path.join(root, 'dist/assets', assets[0])); - assert.equal(built.byteLength, 123200); - assert.equal(sha256(built), 'd2ab8641a6c7fedbcde0eb45d89b5a911a6e8a27b398e12693628ab742d59e12'); + assert.equal(built.byteLength, 123242); + assert.equal(sha256(built), '5bb8b7f5a82c2144a4f2c8bdb1543ca34f2d0738faeec97e2842175521862749'); });