diff --git a/src/shared/versions.ts b/src/shared/versions.ts index 16c26de..49f8015 100644 --- a/src/shared/versions.ts +++ b/src/shared/versions.ts @@ -1,6 +1,6 @@ export const HARBOR_VERSIONS = Object.freeze({ - macClient: '0.23.10', - gatewayClient: '0.24.10', + macClient: '0.23.11', + gatewayClient: '0.24.11', gatewayBackend: '0.24.0', }); diff --git a/src/web/styles/features/subscription.css b/src/web/styles/features/subscription.css index 734f8c8..a49ea83 100644 --- a/src/web/styles/features/subscription.css +++ b/src/web/styles/features/subscription.css @@ -163,6 +163,8 @@ .client-profile-delete { width: 36px; height: 36px; + display: grid; + place-items: center; padding: 0; border: 0; background: transparent; @@ -364,6 +366,9 @@ } .client-profile-activate { + font: var(--type-micro); + letter-spacing: var(--type-micro-tracking); + text-transform: var(--type-micro-transform); white-space: nowrap; } @@ -428,6 +433,13 @@ border-bottom-color: oklch(0.68 0.15 28); } +.client-profile-form-status { + color: oklch(0.68 0.15 28); + font: var(--type-control); + letter-spacing: var(--type-control-tracking); + text-transform: var(--type-control-transform); +} + .client-profile-form-actions { display: flex; justify-content: flex-end; diff --git a/test/web/style-boundaries.test.js b/test/web/style-boundaries.test.js index e8d433a..53bef48 100644 --- a/test/web/style-boundaries.test.js +++ b/test/web/style-boundaries.test.js @@ -37,25 +37,25 @@ const expectedImports = [ const sha256 = (value) => crypto.createHash('sha256').update(value).digest('hex'); const acceptedLedger = { counts: { - cascadeEdges: 749, + cascadeEdges: 752, customProperties: 103, - declarations: 3193, + declarations: 3202, important: 0, keyframes: 56, media: 13, - rules: 916, - variableReferences: 788, + rules: 917, + variableReferences: 794, }, hashes: { - cascadeEdges: 'a47dbf5212045c865de7a41d420e78df8b992a6ec1b06fb18a8d459cd480f0ae', + cascadeEdges: '5c09bfa1ab715bdd522969d017f4ff974e2a8fc391305e68943e39612245f815', customProperties: 'fc8401b40b8d2cc8a1fc1716360ba8e5baccb694cdabde68427d3c92c04a84d4', - declarations: 'a35a393a48727746d6e0a57c84ab118ae44a48fd0e37748307e1a2e9ffa88ff7', + declarations: '0cacb55296aad8af6790036c75831f7a87429ec055481d9eb71d564e4d8a828c', duplicateKeyframes: '4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945', duplicateSelectors: '419962e669cbfdf5c8186318cb26688477fc0199cae98df8e1cd9bf5cddd76c2', keyframes: 'fb859c4d0d1bfd2f5a18904e30a5f79c6ce6931d74fe88cbd506fb28c334b7ac', - ruleDeclarationSequences: 'e6d21f0272c35ef5909b3d6ced45e5bfba77d4cda6d3fc61728a9d97f9dd2736', - selectors: '8668def9103b02e94e3fcc53e5df9f2abc07c1d78d94517d0fefc9e2be54c8b4', - variableReferences: '700137c05be5f12722a7ebec90d06be70dde203a754a9312d45c03ff05ff08ec', + ruleDeclarationSequences: 'b2b02e78df98c48405a5243bb07e0cd6dfcfac83f7fea7847e82041741a56e14', + selectors: 'e4c3dc48d8998e9fc76a0a3eb147fe6366ebfc93e22ba9ebe77f08f1fe84de2f', + variableReferences: '252702ab07ce1c790d77a60f8e674cb3b55f7ffe6e52329a50b69e5306442f1f', 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-vw0VVUis.css']); + assert.deepEqual(assets, ['index-dA_YmbDB.css']); const built = fs.readFileSync(path.join(root, 'dist/assets', assets[0])); - assert.equal(built.byteLength, 123242); - assert.equal(sha256(built), '5bb8b7f5a82c2144a4f2c8bdb1543ca34f2d0738faeec97e2842175521862749'); + assert.equal(built.byteLength, 123538); + assert.equal(sha256(built), '7c506bdd5d073515239a4d779f6f5365a07ef245c057772ba6a343b6d90838e7'); }); diff --git a/test/web/subscription-feature-contract.test.js b/test/web/subscription-feature-contract.test.js index 970629d..bb2a364 100644 --- a/test/web/subscription-feature-contract.test.js +++ b/test/web/subscription-feature-contract.test.js @@ -57,6 +57,7 @@ test('local validation, scoped refresh and drawer focus remain feature-owned', ( assert.match(feature, /className="client-profile-delete"[\s\S]*client-profile-delete-lid/); assert.match(feature, /placeholder="https:\/\/…"[\s\S]*aria-label="Ссылка подписки"/); assert.doesNotMatch(feature, /Ссылка подписки<\/span>/); + assert.match(styles, /\.client-profile-form-status\s*\{[\s\S]*color:\s*oklch\(0\.68 0\.15 28\)[\s\S]*font:\s*var\(--type-control\)/); assert.doesNotMatch(feature, /cancelRename|client-profile-menu|onRename/); }); @@ -120,5 +121,7 @@ test('profiles render as flat accordion groups with scoped controls', () => { assert.match(styles, /\.client-profile-body \{[\s\S]*grid-template-rows: 0fr[\s\S]*\.client-profile-body\.is-open \{[\s\S]*grid-template-rows: 1fr/); assert.match(styles, /@media \(prefers-reduced-motion: reduce\)[\s\S]*\.client-profile-body \*/); assert.match(styles, /\.client-profile-refresh\.is-refreshing/); + assert.match(styles, /\.client-profile-refresh,[\s\S]*\.client-profile-delete\s*\{[\s\S]*width:\s*36px;[\s\S]*height:\s*36px;[\s\S]*display:\s*grid;[\s\S]*place-items:\s*center/); + assert.match(styles, /\.client-profile-activate\s*\{[\s\S]*font:\s*var\(--type-micro\)/); assert.doesNotMatch(feature, /client-subscription-card|role="tab"/); });