diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/package-lock.json b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/package-lock.json index 6643011e..cd67b0ef 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/package-lock.json +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/package-lock.json @@ -8,10 +8,13 @@ "name": "@qiming-ai/sgrobot-digital-embedded", "version": "0.1.0", "dependencies": { + "animejs": "^4.4.1", "lucide-react": "^0.468.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router-dom": "^7.1.1" + "react-markdown": "^10.1.0", + "react-router-dom": "^7.1.1", + "remark-gfm": "^4.0.1" }, "devDependencies": { "@tailwindcss/vite": "^4.3.0", @@ -1523,11 +1526,52 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, "node_modules/@types/node": { @@ -1544,7 +1588,6 @@ "version": "19.2.16", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.16.tgz", "integrity": "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -1560,6 +1603,18 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "license": "ISC" + }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", @@ -1581,6 +1636,26 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "node_modules/animejs": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/animejs/-/animejs-4.4.1.tgz", + "integrity": "sha512-XimhJw4vPb6tAd6Zaoa6BaspJ8UteQMKvL7Pvrt6MW/6u2UvJs0TB/LLqR1sigaiYvpVPC3Tokr9emcCMhWFhw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/juliangarnier" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.10.33", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", @@ -1649,6 +1724,66 @@ ], "license": "CC-BY-4.0" }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1673,14 +1808,12 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1694,6 +1827,28 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -1704,6 +1859,19 @@ "node": ">=8" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.368", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.368.tgz", @@ -1777,6 +1945,34 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -1827,6 +2023,118 @@ "dev": true, "license": "ISC" }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jiti": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", @@ -2143,6 +2451,16 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2172,11 +2490,853 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -2208,6 +3368,31 @@ "node": ">=18" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -2257,6 +3442,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/react": { "version": "19.2.7", "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", @@ -2278,6 +3473,33 @@ "react": "^19.2.7" } }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -2326,6 +3548,72 @@ "react-dom": ">=18" } }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rollup": { "version": "4.61.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", @@ -2403,6 +3691,48 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, "node_modules/tailwindcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", @@ -2441,6 +3771,26 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/typescript": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", @@ -2462,6 +3812,93 @@ "dev": true, "license": "MIT" }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -2493,6 +3930,34 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", @@ -2574,6 +4039,16 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/package.json b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/package.json index bd0c6e1c..bf067893 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/package.json +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/package.json @@ -8,10 +8,13 @@ "dev": "vite" }, "dependencies": { + "animejs": "^4.4.1", "lucide-react": "^0.468.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router-dom": "^7.1.1" + "react-markdown": "^10.1.0", + "react-router-dom": "^7.1.1", + "remark-gfm": "^4.0.1" }, "devDependencies": { "@tailwindcss/vite": "^4.3.0", diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/public/digital-assets/scenes/commander-profile.png b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/public/digital-assets/scenes/commander-profile.png new file mode 100644 index 00000000..bac0d14f Binary files /dev/null and b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/public/digital-assets/scenes/commander-profile.png differ diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/public/digital-assets/scenes/commander-work-scene-v2.png b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/public/digital-assets/scenes/commander-work-scene-v2.png new file mode 100644 index 00000000..59681dc7 Binary files /dev/null and b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/public/digital-assets/scenes/commander-work-scene-v2.png differ diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/public/digital-assets/scenes/commander-work-scene.png b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/public/digital-assets/scenes/commander-work-scene.png new file mode 100644 index 00000000..5024cab4 Binary files /dev/null and b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/public/digital-assets/scenes/commander-work-scene.png differ diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/components/digital/FlowDetailPanel.tsx b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/components/digital/FlowDetailPanel.tsx index 5704de6f..afc5904b 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/components/digital/FlowDetailPanel.tsx +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/components/digital/FlowDetailPanel.tsx @@ -1,4 +1,11 @@ import { useEffect, useMemo, useState } from 'react'; +import { + buildDemoFlowEvents, + buildDemoPlanMessages, + buildDemoRuns, + buildDemoTasks, + getDemoMissions, +} from '@/pages/digital/demoScenario'; import { displayBackendMessage, displayBusinessText, @@ -101,6 +108,20 @@ type DetailEvent = { message: string; }; +type ApprovalSummary = { + id: string; + status: string; + note: string; + requestedAt: string | null; + decidedAt: string | null; + decidedBy: string | null; + runId: string; + taskId: string | null; + planId: string | null; + targetKind: string; + targetId: string; +}; + function skillLabel(skillId: string | null | undefined): string { return displayBusinessText(skillId || '', skillId || '自动化技能'); } @@ -142,6 +163,29 @@ function latestByResultSubject(events: DetailEvent[]): DetailEvent[] { return Array.from(bySubject.values()); } +function approvalSummariesFromRuns(runs: DebugRun[]): ApprovalSummary[] { + const byId = new Map(); + for (const run of runs) { + for (const approval of run.approvals || []) { + const id = valueText(approval.approval_id) || `approval-${run.run_id}`; + byId.set(id, { + id, + status: valueText(approval.status) || 'requested', + note: valueText(approval.note) || '等待人工审批', + requestedAt: valueText(approval.requested_at) || null, + decidedAt: valueText(approval.decided_at) || null, + decidedBy: valueText(approval.decided_by) || null, + runId: valueText(approval.run_id) || run.run_id, + taskId: valueText(approval.task_id) || run.task_id || null, + planId: valueText(approval.plan_id) || run.plan_id || null, + targetKind: valueText(approval.target_kind) || 'task', + targetId: valueText(approval.target_id) || run.task_id || run.run_id, + }); + } + } + return Array.from(byId.values()).sort((a, b) => (b.requestedAt || '').localeCompare(a.requestedAt || '')); +} + function objectValue(value: unknown): Record | null { return value && typeof value === 'object' && !Array.isArray(value) ? value as Record : null; } @@ -303,20 +347,25 @@ export default function FlowDetailPanel({ mission, onClose }: FlowDetailPanelPro getPlanMessages(planId), ]).then(([tasksResult, flowResult, messagesResult]) => { if (cancelled) return; + const demoMission = getDemoMissions().find((item) => item.id === planId); + const fallbackTasks = demoMission ? buildDemoTasks([demoMission]) : []; + const fallbackRuns = fallbackTasks.length > 0 ? buildDemoRuns(fallbackTasks) : []; if (tasksResult.status === 'fulfilled') { - setTasks(tasksResult.value.tasks ?? []); - setRuns(tasksResult.value.runs ?? []); + setTasks(tasksResult.value.tasks && tasksResult.value.tasks.length > 0 ? tasksResult.value.tasks : fallbackTasks); + setRuns(tasksResult.value.runs && tasksResult.value.runs.length > 0 ? tasksResult.value.runs : fallbackRuns); } else { - setTasks([]); - setRuns([]); + setTasks(fallbackTasks); + setRuns(fallbackRuns); } if (flowResult.status === 'fulfilled' && flowResult.value?.events && flowResult.value.events.length > 0) { setFlow(flowResult.value); } else { - setFlow(null); + setFlow(demoMission ? { events: buildDemoFlowEvents(demoMission) } as FlowResponse : null); } if (messagesResult.status === 'fulfilled' && messagesResult.value.messages.length > 0) { setSessionMessages(messagesResult.value.messages); + } else if (demoMission) { + setSessionMessages(buildDemoPlanMessages(demoMission)); } else { setSessionMessages([]); } @@ -349,11 +398,18 @@ export default function FlowDetailPanel({ mission, onClose }: FlowDetailPanelPro if (data.messages && data.messages.length > 0) { setSessionMessages(data.messages); } else { - setSessionMessages([]); + const demoMission = getDemoMissions().find((item) => item.id === planId); + setSessionMessages(demoMission ? buildDemoPlanMessages(demoMission) : []); } } catch (err) { - setSessionMessages([]); - setSessionError(err instanceof Error ? err.message : '读取会话失败'); + const demoMission = getDemoMissions().find((item) => item.id === planId); + if (demoMission) { + setSessionMessages(buildDemoPlanMessages(demoMission)); + setSessionError(null); + } else { + setSessionMessages([]); + setSessionError(err instanceof Error ? err.message : '读取会话失败'); + } } finally { setSessionLoading(false); } @@ -384,6 +440,11 @@ export default function FlowDetailPanel({ mission, onClose }: FlowDetailPanelPro [eventTimeline], ); + const approvalSummaries = useMemo( + () => approvalSummariesFromRuns(runs), + [runs], + ); + const resultEvents = useMemo( () => { const facts = eventTimeline.filter((event) => ['artifact', 'task_summary'].includes(event.kind)); @@ -444,6 +505,30 @@ export default function FlowDetailPanel({ mission, onClose }: FlowDetailPanelPro + {approvalSummaries.length > 0 ? ( +
+
+

审批状态

+ {approvalSummaries.length} 项执行期审批 +
+
+ {approvalSummaries.map((approval) => ( +
+ {displayStatus(approval.status)} + + {approval.note} + {' '} + {approval.taskId ? `Task ${approval.taskId}` : `Target ${approval.targetKind}:${approval.targetId}`} + {approval.runId ? ` / Run ${approval.runId}` : ''} + {approval.decidedBy ? ` / ${approval.decidedBy}` : ''} + + +
+ ))} +
+
+ ) : null} +

业务过程

diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/components/shared/ApprovalActionCard.tsx b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/components/shared/ApprovalActionCard.tsx new file mode 100644 index 00000000..c67a9ba1 --- /dev/null +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/components/shared/ApprovalActionCard.tsx @@ -0,0 +1,119 @@ +import { CheckCircle, ExternalLink, ShieldAlert, XCircle } from 'lucide-react'; +import type { ApprovalDecisionView } from '@/types/api'; +import { approvalDecisionId, isApprovalOpen } from '@/lib/approvals'; + +interface ApprovalActionCardProps { + decision: ApprovalDecisionView; + busyAction?: string | null; + disabled?: boolean; + compact?: boolean; + className?: string; + onResolve: (decision: ApprovalDecisionView, actionId: string) => void; + onViewContext?: (decision: ApprovalDecisionView) => void; +} + +export default function ApprovalActionCard({ + decision, + busyAction, + disabled = false, + compact = false, + className = '', + onResolve, + onViewContext, +}: ApprovalActionCardProps) { + const approvalId = approvalDecisionId(decision); + const isOpen = isApprovalOpen(decision.status); + const hasBusyAction = busyAction != null; + const contextLabel = [decision.plan_title, decision.task_title] + .map((item) => item?.trim()) + .filter(Boolean) + .join(' / '); + + return ( +
+
+ +
+
+ + {decision.title || '真实执行事项需要确认'} + + + {decision.status_label || '待决策'} + +
+

+ {decision.scenario || '请确认下一步处理方式。'} +

+ {contextLabel && ( +

+ {contextLabel} +

+ )} +
+
+
+ {decision.actions.map((action) => { + const busy = busyAction === `${approvalId}:${action.id}`; + const primary = action.tone === 'primary'; + return ( + + ); + })} + {onViewContext && ( + + )} +
+
+ ); +} diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/contexts/RoleContext.tsx b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/contexts/RoleContext.tsx index 9ca28b42..a0f5a9de 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/contexts/RoleContext.tsx +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/contexts/RoleContext.tsx @@ -1,5 +1,4 @@ -import { createContext, useContext, useState, useCallback, useEffect, type ReactNode } from 'react'; -import { readDigitalEmployeeUiState, saveDigitalEmployeeUiStatePatch } from '@/lib/digitalUiStateBridge'; +import { createContext, useContext, useState, useCallback, type ReactNode } from 'react'; export type ConsoleRole = 'finance' | 'engineering' | 'executive' | 'hr' | 'sales'; export type MotionLevel = 'none' | 'minimal'; @@ -123,12 +122,11 @@ interface RoleContextValue { const RoleContext = createContext(null); -const STORAGE_KEY = 'qimingclaw:digital-console-role'; -const LEGACY_STORAGE_KEY = 'sgrobot-console-role'; +const STORAGE_KEY = 'sgrobot-console-role'; function getStoredRole(): ConsoleRole { try { - const stored = localStorage.getItem(STORAGE_KEY) ?? localStorage.getItem(LEGACY_STORAGE_KEY); + const stored = localStorage.getItem(STORAGE_KEY); if (stored && stored in ROLE_PROFILES) return stored as ConsoleRole; } catch { /* localStorage blocked */ } return 'sales'; @@ -137,32 +135,9 @@ function getStoredRole(): ConsoleRole { export function RoleProvider({ children }: { children: ReactNode }) { const [role, setRoleState] = useState(getStoredRole); - useEffect(() => { - let cancelled = false; - void readDigitalEmployeeUiState().then((state) => { - if (cancelled) return; - const storedRole = state?.consoleRole; - if (storedRole && storedRole in ROLE_PROFILES) { - setRoleState(storedRole as ConsoleRole); - try { - localStorage.setItem(STORAGE_KEY, storedRole); - localStorage.removeItem(LEGACY_STORAGE_KEY); - } catch { /* noop */ } - } - }); - return () => { cancelled = true; }; - }, []); - const setRole = useCallback((newRole: ConsoleRole) => { setRoleState(newRole); - try { - localStorage.setItem(STORAGE_KEY, newRole); - localStorage.removeItem(LEGACY_STORAGE_KEY); - } catch { /* noop */ } - void saveDigitalEmployeeUiStatePatch( - { consoleRole: newRole }, - { action: 'update_console_role', metadata: { role: newRole } }, - ); + try { localStorage.setItem(STORAGE_KEY, newRole); } catch { /* noop */ } }, []); const profile = ROLE_PROFILES[role]; diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/index.css b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/index.css index ec002351..1624286a 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/index.css +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/index.css @@ -612,221 +612,8 @@ color: #fff; background: rgba(255,255,255,0.12); cursor: pointer; transition: background 0.18s ease, transform 0.18s ease; } -.de-header-icon:hover, .de-header-icon.active { background: rgba(255,255,255,0.22); transform: translateY(-1px); } +.de-header-icon:hover { background: rgba(255,255,255,0.22); transform: translateY(-1px); } .de-header-close { background: rgba(255,255,255,0.18); } -.de-notification-anchor { position: relative; display: inline-flex; align-items: center; } -.de-notification-count { - position: absolute; - top: -5px; - right: -8px; - min-width: 17px; - height: 17px; - padding: 0 4px; - border-radius: 999px; - background: #ff5d73; - color: #fff; - border: 1px solid rgba(255,255,255,0.82); - font-size: 10px; - font-weight: 800; - line-height: 15px; - box-shadow: 0 4px 12px rgba(198,33,70,0.32); -} -.de-notification-popover { - position: absolute; - top: 38px; - right: 0; - z-index: 360; - width: min(380px, calc(100vw - 28px)); - max-height: min(620px, calc(100vh - 88px)); - display: grid; - grid-template-rows: auto auto minmax(0, 1fr); - overflow: hidden; - border-radius: 14px; - background: rgba(252,254,255,0.98); - border: 1px solid rgba(61,132,184,0.18); - box-shadow: 0 22px 60px rgba(18,52,79,0.24); -} -.de-notification-head { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - padding: 14px; - border-bottom: 1px solid rgba(61,132,184,0.12); -} -.de-notification-head-title { min-width: 0; display: grid; gap: 2px; } -.de-notification-head strong { color: #12344f; font-size: 15px; } -.de-notification-head span { color: #6a8094; font-size: 12px; } -.de-notification-head-actions { display: inline-flex; align-items: center; gap: 6px; } -.de-notification-close { width: 26px; height: 26px; color: #496a85; background: rgba(79,172,254,0.1); } -.de-notification-preferences { - display: grid; - gap: 10px; - padding: 10px 12px 12px; - border-bottom: 1px solid rgba(61,132,184,0.12); - background: rgba(247,251,255,0.86); -} -.de-notification-switch, -.de-notification-toggle-grid label { - display: inline-flex; - align-items: center; - gap: 7px; - color: #31526d; - font-size: 12px; - font-weight: 700; -} -.de-notification-switch input, -.de-notification-toggle-grid input { accent-color: #1684d8; } -.de-notification-desktop-status { - display: grid; - gap: 9px; - padding: 10px; - border-radius: 8px; - border: 1px solid rgba(61,132,184,0.14); - background: #fff; -} -.de-notification-desktop-status--success { border-color: rgba(35,128,93,0.2); background: rgba(240,250,246,0.9); } -.de-notification-desktop-status--warning { border-color: rgba(204,130,31,0.24); background: rgba(255,248,235,0.92); } -.de-notification-desktop-copy { min-width: 0; display: grid; gap: 3px; } -.de-notification-desktop-copy span { color: #7890a7; font-size: 11px; font-weight: 800; } -.de-notification-desktop-copy strong { color: #12344f; font-size: 13px; line-height: 1.35; } -.de-notification-desktop-copy small { color: #6a8094; font-size: 11px; line-height: 1.45; overflow-wrap: anywhere; } -.de-notification-desktop-actions { display: flex; flex-wrap: wrap; gap: 7px; } -.de-notification-desktop-btn { - min-height: 28px; - display: inline-flex; - align-items: center; - gap: 5px; - border: 1px solid rgba(61,132,184,0.16); - border-radius: 999px; - padding: 0 10px; - color: #31526d; - background: rgba(247,251,255,0.96); - font-size: 12px; - font-weight: 700; - cursor: pointer; -} -.de-notification-desktop-btn:disabled { cursor: not-allowed; opacity: 0.62; } -.de-notification-preference-group { display: grid; gap: 7px; } -.de-notification-preference-group > span { color: #7890a7; font-size: 11px; font-weight: 800; } -.de-notification-segment-row, -.de-notification-toggle-grid { display: flex; flex-wrap: wrap; gap: 7px; } -.de-notification-segment-row button { - min-height: 26px; - border: 1px solid rgba(61,132,184,0.16); - border-radius: 999px; - padding: 0 10px; - color: #31526d; - background: #fff; - font-size: 12px; - font-weight: 700; - cursor: pointer; -} -.de-notification-segment-row button.active { - color: #fff; - border-color: rgba(49,82,109,0.12); - background: #31526d; -} -.de-notification-toggle-grid label { - min-height: 26px; - padding: 0 9px; - border-radius: 999px; - background: #fff; - border: 1px solid rgba(61,132,184,0.12); -} -.de-notification-list { - min-height: 0; - overflow-y: auto; - display: grid; - gap: 10px; - padding: 12px; -} -.de-notification-empty { - min-height: 86px; - display: grid; - place-items: center; - color: #6a8094; - font-size: 13px; -} -.de-notification-item { - display: grid; - gap: 8px; - padding: 12px; - border-radius: 10px; - background: #fff; - border: 1px solid rgba(61,132,184,0.12); -} -.de-notification-item--action { border-color: rgba(79,172,254,0.3); } -.de-notification-item--warn { border-color: rgba(255,184,61,0.34); } -.de-notification-item--error { border-color: rgba(244,96,96,0.3); } -.de-notification-item-head, -.de-notification-title-row, -.de-notification-actions, -.de-notification-reply-row { - display: flex; - align-items: center; - gap: 8px; -} -.de-notification-item-head, -.de-notification-title-row { justify-content: space-between; } -.de-notification-level, -.de-notification-title-row span { - flex-shrink: 0; - min-height: 20px; - display: inline-flex; - align-items: center; - padding: 0 7px; - border-radius: 999px; - background: rgba(79,172,254,0.1); - color: #22659a; - font-size: 11px; - font-weight: 700; -} -.de-notification-time { color: #7890a7; font-size: 11px; } -.de-notification-title-row h3 { - min-width: 0; - margin: 0; - color: #12344f; - font-size: 14px; - line-height: 1.32; -} -.de-notification-item p, -.de-notification-reply { - margin: 0; - color: #536b80; - font-size: 12px; - line-height: 1.5; -} -.de-notification-reply { - padding: 8px; - border-radius: 8px; - background: rgba(79,172,254,0.08); - color: #31526d; -} -.de-notification-actions { justify-content: flex-end; } -.de-notification-icon-btn { - width: 28px; - height: 28px; - border: 1px solid rgba(61,132,184,0.16); - border-radius: 999px; - display: inline-flex; - align-items: center; - justify-content: center; - color: #31526d; - background: rgba(247,251,255,0.96); - cursor: pointer; -} -.de-notification-icon-btn:hover { background: rgba(79,172,254,0.14); } -.de-notification-reply-row input { - min-width: 0; - flex: 1; - height: 30px; - border-radius: 8px; - border: 1px solid rgba(61,132,184,0.18); - padding: 0 9px; - color: #12344f; - background: #fff; -} .de-digital-modal-close-hitbox { position: absolute; top: 8px; @@ -932,6 +719,43 @@ } @media (max-width: 767px) { .de-dashboard-grid { grid-template-columns: 1fr; } + .de-header-content { padding: 0 10px; gap: 6px; } + .de-header-left { min-width: 0; flex: 0 1 auto; gap: 8px; } + .de-header-accent-bar { width: 4px; height: 22px; } + .de-header-title { + max-width: 106px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + line-height: 1.2; + font-size: 14px; + letter-spacing: 0; + } + .de-header-center { + position: static; + transform: none; + max-width: none; + flex: 1 1 auto; + justify-content: center; + overflow: hidden; + } + .de-header-center .de-nav-btn:not(.active) { display: none; } + .de-header-center .de-nav-btn { + min-width: 54px; + padding: 5px 12px; + font-size: 12px; + } + .de-header-right { + min-width: auto; + flex: 0 0 auto; + gap: 6px; + } + .de-header-welcome, + .de-header-username, + .de-header-right .de-header-icon:not(.de-header-close) { + display: none; + } + .de-header-icon { width: 28px; height: 28px; } } /* ===== MissionCenter ===== */ @@ -1191,9 +1015,6 @@ .de-skill-card-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .de-skill-name { font-size: 15px; font-weight: 600; color: var(--de-text-primary); } .de-skill-desc { font-size: 13px; color: var(--de-text-body); line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; flex: 1; } -.de-skill-meta-row { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-height: 24px; } -.de-skill-meta-chip { display: inline-flex; align-items: center; max-width: 160px; min-height: 22px; padding: 0 8px; border-radius: 999px; border: 1px solid rgba(79,172,254,0.14); background: rgba(79,172,254,0.08); color: #41627f; font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.de-skill-recent { margin: 0; font-size: 12px; color: var(--de-text-muted); line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; } .de-skill-card-foot { display: flex; align-items: center; justify-content: space-between; } .de-skill-version { font-size: 11px; color: var(--de-text-muted); } .de-skill-status { font-size: 11px; font-weight: 600; } @@ -1323,7 +1144,7 @@ .de-right-panels { height: 100%; display: grid; - grid-template-rows: minmax(0, 1fr) minmax(178px, 0.34fr); + grid-template-rows: minmax(178px, 0.48fr) minmax(172px, 0.42fr) minmax(172px, 0.32fr); gap: 8px; overflow: hidden; } @@ -1405,45 +1226,6 @@ border: 1px solid rgba(79,172,254,0.18); color: #16324e; background: rgba(247,251,255,0.96); } -.de-management-sync-strip { - display: flex; align-items: center; gap: 8px; min-height: 34px; - margin: -2px 0 10px; padding: 7px 10px; border-radius: 12px; - font-size: 12px; line-height: 1.35; color: #315576; - border: 1px solid rgba(79,172,254,0.14); background: rgba(79,172,254,0.07); -} -.de-management-sync-strip > span:last-child { - min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; -} -.de-management-sync-strip--success { - color: #176a3a; border-color: rgba(27,156,90,0.2); background: rgba(27,156,90,0.08); -} -.de-management-sync-strip--warning { - color: #7a5509; border-color: rgba(245,173,45,0.22); background: rgba(245,173,45,0.1); -} -.de-management-sync-strip--danger { - color: #ad3434; border-color: rgba(224,72,72,0.2); background: rgba(224,72,72,0.08); -} -.de-management-sync-failures { - display: grid; gap: 6px; margin: -4px 0 10px; -} -.de-management-sync-failure { - width: 100%; font-family: inherit; text-align: left; cursor: pointer; - display: grid; grid-template-columns: 56px 54px minmax(54px, 0.7fr) minmax(0, 1.6fr); - align-items: center; gap: 8px; min-height: 28px; padding: 6px 9px; - border-radius: 10px; border: 1px solid rgba(224,72,72,0.14); - background: rgba(224,72,72,0.055); color: #7b4450; font-size: 11px; -} -.de-management-sync-failure:hover { - border-color: rgba(224,72,72,0.28); box-shadow: 0 0 0 2px rgba(224,72,72,0.06); -} -.de-management-sync-failure span, -.de-management-sync-failure em, -.de-management-sync-failure small { - min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; -} -.de-management-sync-failure strong { color: #ad3434; font-weight: 800; } -.de-management-sync-failure em { color: #59738b; font-style: normal; } -.de-management-sync-failure small { color: #6d5260; } .de-duty-card { min-height: 120px; } .de-duty-card--selected { border-color: rgba(32,191,107,0.42); @@ -1824,47 +1606,6 @@ border: 1px solid rgba(79,172,254,0.12); } .de-task-manager-decision-card p { margin: 0; color: #58728e; font-size: 12px; line-height: 1.48; } -.de-approval-summary-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 6px; - align-items: center; - color: #41627f; - font-size: 11px; -} -.de-approval-summary-grid > span { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.de-approval-action-fields { - display: grid; - grid-template-columns: minmax(0, 1.2fr) minmax(0, 0.9fr) minmax(0, 1fr); - gap: 6px; -} -.de-approval-action-fields input { - width: 100%; - min-width: 0; - height: 32px; - padding: 0 9px; - border-radius: 8px; - border: 1px solid rgba(79,172,254,0.18); - background: rgba(255,255,255,0.88); - color: #173550; - font-size: 12px; -} -.de-approval-action-fields input:focus { - outline: none; - border-color: rgba(79,172,254,0.48); - box-shadow: 0 0 0 2px rgba(79,172,254,0.12); -} -.de-approval-governance-actions button { - display: inline-flex; - align-items: center; - gap: 4px; -} -.de-approval-governance-actions svg { flex-shrink: 0; } .de-event-detail-modal, .de-event-history-modal { width: min(760px, calc(100vw - 52px)); @@ -1955,70 +1696,11 @@ font-size: 13px; line-height: 1.55; } -.de-sync-attempt-history { - display: grid; - gap: 8px; - padding: 14px; - border: 1px solid rgba(126,163,194,0.2); - border-radius: 14px; - background: rgba(247,251,255,0.82); -} -.de-sync-attempt-history > span { - color: #6f8196; - font-size: 12px; - font-weight: 800; -} -.de-sync-attempt-list { - display: grid; - gap: 8px; -} -.de-sync-attempt-row { - display: grid; - gap: 5px; - padding: 9px 10px; - border-radius: 12px; - background: rgba(255,255,255,0.72); -} -.de-sync-attempt-row > div { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: 8px; -} -.de-sync-attempt-row strong { - color: #153754; - font-size: 12px; -} -.de-sync-attempt-row em { - font-size: 12px; - font-style: normal; - font-weight: 800; -} -.de-sync-attempt-row span, -.de-sync-attempt-row small { - color: #667b90; - font-size: 12px; -} -.de-sync-attempt-row small { - line-height: 1.45; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.de-sync-attempt-row--success em { color: #23805d; } -.de-sync-attempt-row--danger em { color: #bb3b3b; } -.de-sync-attempt-row--info em { color: #2e6fa5; } .de-event-modal-actions { display: flex; justify-content: flex-end; - flex-wrap: wrap; gap: 8px; } -.de-event-modal-actions .de-btn-sm { - display: inline-flex; - align-items: center; - gap: 6px; -} .de-event-history-toolbar { display: flex; align-items: center; @@ -2103,7 +1785,7 @@ min-height: 0; overflow: hidden; display: grid; - grid-template-rows: auto auto minmax(96px, 0.58fr) auto minmax(0, 1fr); + grid-template-rows: auto minmax(96px, 0.58fr) auto minmax(0, 1fr); gap: 8px; } .de-execution-status-strip { @@ -2120,32 +1802,6 @@ } .de-execution-status-strip em { color: #5b7590; font-size: 11px; font-style: normal; white-space: nowrap; } .de-execution-status-strip strong { color: #12344f; font-size: 18px; line-height: 1; } -.de-observation-strip-stack { - display: grid; - gap: 6px; - min-width: 0; -} -.de-route-summary-strip, -.de-diagnostic-summary-strip { - display: grid; - grid-template-columns: repeat(3, minmax(54px, 0.36fr)) minmax(0, 1fr); - gap: 6px; - align-items: center; - padding: 7px 8px; - border-radius: 10px; - background: rgba(247,251,255,0.88); - border: 1px solid rgba(79,172,254,0.12); -} -.de-route-summary-strip span, -.de-diagnostic-summary-strip span { min-width: 0; display: grid; gap: 2px; } -.de-route-summary-strip em, -.de-diagnostic-summary-strip em { color: #5b7590; font-size: 10px; font-style: normal; white-space: nowrap; } -.de-route-summary-strip strong, -.de-diagnostic-summary-strip strong { color: #12344f; font-size: 14px; line-height: 1; } -.de-route-summary-strip .is-warning strong, -.de-diagnostic-summary-strip .is-warning strong { color: #a33b3b; } -.de-route-summary-strip small, -.de-diagnostic-summary-strip small { min-width: 0; color: #41627f; font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .de-task-summary-scroll { min-height: 0; overflow-y: auto; @@ -2219,100 +1875,6 @@ gap: 6px; min-width: 0; } -.de-task-agent-control-strip { - display: grid; - gap: 6px; - min-width: 0; -} -.de-task-agent-control { - min-width: 0; - display: grid; - grid-template-columns: minmax(0, 1fr) auto; - gap: 8px; - align-items: center; - padding: 7px 8px; - border-radius: 10px; - border: 1px solid rgba(79,172,254,0.14); - background: rgba(247,251,255,0.9); -} -.de-task-agent-control-main { - min-width: 0; - display: grid; - gap: 2px; -} -.de-task-agent-control-main span { - color: #0c5a85; - font-size: 10px; - font-weight: 800; - line-height: 1; -} -.de-task-agent-control-main strong { - min-width: 0; - overflow: hidden; - color: #143450; - font-size: 12px; - line-height: 1.25; - text-overflow: ellipsis; - white-space: nowrap; -} -.de-task-agent-control-main small { - min-width: 0; - overflow: hidden; - color: #58728e; - font-size: 10px; - line-height: 1.25; - text-overflow: ellipsis; - white-space: nowrap; -} -.de-task-agent-control-actions { - display: flex; - align-items: center; - gap: 5px; - min-width: 0; -} -.de-task-agent-control-actions .de-btn-sm { - min-width: 58px; - justify-content: center; -} -.de-task-agent-cancel-btn { - color: #b42318; - border-color: rgba(180,35,24,0.22); -} -.de-blocked-step-control-strip { - border-top: 1px solid rgba(180,35,24,0.12); - padding-top: 6px; -} -.de-blocked-step-control { - border-color: rgba(180,35,24,0.18); - background: rgba(255,248,247,0.92); -} -.de-blocked-step-control .de-task-agent-control-actions { - flex-wrap: wrap; - justify-content: flex-end; -} -.de-blocked-input-modal { max-width: 520px; } -.de-blocked-input-field { - display: grid; - gap: 8px; - margin-top: 12px; - color: #17344f; - font-size: 12px; - font-weight: 700; -} -.de-blocked-input-field textarea { - min-height: 120px; - resize: vertical; - border: 1px solid rgba(79,172,254,0.2); - border-radius: 10px; - padding: 10px 12px; - color: #12344f; - background: rgba(255,255,255,0.82); -} -.de-blocked-input-field textarea:focus { - outline: none; - border-color: rgba(79,172,254,0.55); - box-shadow: 0 0 0 3px rgba(79,172,254,0.14); -} .de-run-detail-list-scroll { overscroll-behavior: contain; scrollbar-gutter: stable; @@ -2348,44 +1910,873 @@ .de-workday-result { overflow: auto; min-height: 0; } .de-workday-result-summary { margin: 0; color: #173550; font-size: 13px; line-height: 1.55; } .de-artifact-pills { display: flex; flex-wrap: wrap; gap: 8px; } -.de-artifact-source-list { display: grid; gap: 8px; max-height: 320px; overflow-y: auto; padding-right: 4px; } -.de-artifact-source-row { display: grid; grid-template-columns: minmax(120px, 1fr) minmax(88px, 140px) auto; gap: 4px 10px; align-items: center; padding: 9px 10px; border-radius: 8px; border: 1px solid rgba(79,172,254,0.12); background: rgba(244,250,255,0.62); } -.de-artifact-source-row strong { min-width: 0; color: var(--de-text-primary); font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.de-artifact-source-row span { color: var(--de-text-muted); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: right; } -.de-artifact-source-row code, .de-artifact-source-row em { grid-column: 1 / -1; min-width: 0; color: var(--de-text-body); font-size: 12px; font-style: normal; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.de-artifact-source-actions { display: inline-flex; align-items: center; justify-content: flex-end; gap: 4px; } -.de-artifact-source-meta { grid-column: 1 / -1; display: flex; align-items: center; flex-wrap: wrap; gap: 6px; min-width: 0; } -.de-artifact-source-meta span { width: auto; max-width: 160px; padding: 2px 6px; border-radius: 6px; background: rgba(79,172,254,0.08); color: #315a78; text-align: left; } -.de-icon-btn { width: 28px; height: 28px; display: inline-grid; place-items: center; border: 1px solid rgba(79,172,254,0.18); border-radius: 6px; color: #275a82; background: rgba(255,255,255,0.78); cursor: pointer; } -.de-icon-btn:hover:not(:disabled) { border-color: rgba(79,172,254,0.45); background: #fff; } -.de-icon-btn:disabled { cursor: not-allowed; opacity: 0.42; } -.de-inline-notice { margin: 8px 0 0; color: var(--de-text-muted); font-size: 12px; } -.de-artifact-preview { margin-top: 10px; border: 1px solid rgba(79,172,254,0.14); border-radius: 8px; background: rgba(255,255,255,0.78); overflow: hidden; } -.de-artifact-preview > div { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 10px; border-bottom: 1px solid rgba(79,172,254,0.1); } -.de-artifact-preview pre { max-height: 220px; margin: 0; padding: 10px; overflow: auto; white-space: pre-wrap; word-break: break-word; color: var(--de-text-body); font-size: 12px; line-height: 1.55; } -.de-artifact-retention-actions { justify-content: flex-start !important; flex-wrap: wrap; } -.de-artifact-version-list { display: grid !important; gap: 6px; align-items: stretch !important; justify-content: stretch !important; border-bottom: 0 !important; } -.de-artifact-version-list div { display: grid; grid-template-columns: minmax(72px, 120px) minmax(90px, 1fr); gap: 2px 10px; align-items: center; padding: 8px; border-radius: 6px; background: rgba(244,250,255,0.78); } -.de-artifact-version-list strong { font-size: 12px; color: var(--de-text-primary); } -.de-artifact-version-list span, .de-artifact-version-list em { min-width: 0; color: var(--de-text-muted); font-size: 12px; font-style: normal; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.de-artifact-version-list em { grid-column: 1 / -1; } .de-decision-card { background: rgba(247,251,255,0.96); } .de-decision-chain-note { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-top: 8px; color: #60758a; font-size: 12px; line-height: 1.45; } -.de-decision-chain-note--conflict { - padding: 8px 10px; - border-radius: 8px; - color: #8c3434; - background: rgba(244,96,96,0.09); - border: 1px solid rgba(244,96,96,0.18); -} @keyframes deFeedIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } } +/* Digital Employee home: front-stage Plan execution */ +.de-work-scene-shell { + padding: 0 !important; + justify-content: stretch !important; + overflow: hidden !important; +} +.de-work-scene-card { + width: 100%; + height: 100%; + min-height: 0; + display: grid; + grid-template-rows: auto minmax(0, 1fr); + gap: 8px; + padding: 8px; + border-radius: 16px; + border: 1px solid rgba(79,172,254,0.18); + background: + radial-gradient(circle at 52% 24%, rgba(168,85,247,0.12), transparent 28%), + radial-gradient(circle at 66% 42%, rgba(0,240,255,0.18), transparent 34%), + linear-gradient(180deg, rgba(252,254,255,0.72), rgba(222,239,255,0.76)); + box-shadow: 0 18px 42px rgba(38, 125, 191, 0.14), inset 0 1px 0 rgba(255,255,255,0.64); + overflow: hidden; + position: relative; +} +.de-work-scene-card::before { + content: ""; + position: absolute; + inset: 42px 8px 8px; + pointer-events: none; + background: + linear-gradient(115deg, transparent 12%, rgba(0,240,255,0.13) 34%, transparent 56%), + linear-gradient(90deg, rgba(59,130,246,0.08) 1px, transparent 1px), + linear-gradient(rgba(59,130,246,0.08) 1px, transparent 1px); + background-size: auto, 44px 44px, 44px 44px; + opacity: 0.62; + animation: deAuroraDrift 18s ease-in-out infinite alternate; +} +.de-work-scene-tabs { + position: relative; + z-index: 2; + display: flex; + align-items: center; + justify-content: center; + gap: 0; +} +.de-work-scene-tabs button { + min-width: 128px; + min-height: 34px; + border: 1px solid rgba(79,172,254,0.16); + border-right: 0; + background: rgba(248,252,255,0.72); + color: #315c82; + font-size: 14px; + font-weight: 800; + cursor: pointer; +} +.de-work-scene-tabs button:first-child { border-radius: 999px 0 0 999px; } +.de-work-scene-tabs button:last-child { border-right: 1px solid rgba(79,172,254,0.16); border-radius: 0 999px 999px 0; } +.de-work-scene-tabs button.active { + color: #075b90; + background: linear-gradient(135deg, rgba(255,255,255,0.94), rgba(214,238,255,0.9)); + box-shadow: inset 0 -3px 0 rgba(59,130,246,0.86), 0 8px 22px rgba(59,130,246,0.14); +} +.de-standby-scene, +.de-working-scene { + position: relative; + z-index: 1; + min-height: 0; + overflow: hidden; +} +.de-standby-scene { + display: grid; + grid-template-columns: minmax(0, 1.08fr) minmax(220px, 0.72fr); + gap: 10px; + align-items: center; +} +.de-standby-avatar { + min-height: 0; + height: 100%; + display: flex; + align-items: flex-end; + justify-content: center; +} +.de-standby-avatar .de-avatar-container { min-height: 420px; } +.de-standby-avatar .de-avatar-img { height: 54vh; max-height: 460px; margin-bottom: -34px; } +.de-standby-panel { + display: grid; + gap: 10px; + padding: 14px; + border-radius: 14px; + border: 1px solid rgba(79,172,254,0.18); + background: rgba(248,252,255,0.84); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.66); +} +.de-scene-kicker { + color: #0c5a85; + font-size: 11px; + font-weight: 900; +} +.de-standby-panel h3 { + margin: 0; + color: #143450; + font-size: 20px; +} +.de-standby-panel p { + margin: 0; + color: #486a88; + font-size: 13px; + line-height: 1.52; +} +.de-standby-stats { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 7px; +} +.de-standby-stats span { + display: grid; + gap: 3px; + padding: 8px; + border-radius: 10px; + border: 1px solid rgba(79,172,254,0.12); + background: rgba(255,255,255,0.72); +} +.de-standby-stats em { + color: #60758a; + font-size: 10px; + font-style: normal; + white-space: nowrap; +} +.de-standby-stats strong { + color: #0c4a6e; + font-size: 20px; + line-height: 1; +} +.de-work-scene-primary { + min-height: 34px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; + border: 0; + border-radius: 999px; + color: #fff; + font-weight: 800; + background: linear-gradient(135deg, #2563eb, #06b6d4); + box-shadow: 0 8px 20px rgba(37,99,235,0.22); + cursor: pointer; +} +.de-working-scene { + display: grid; + grid-template-rows: minmax(250px, 0.94fr) minmax(142px, 0.48fr) minmax(64px, 0.18fr); + gap: 8px; +} +.de-working-stage { + position: relative; + min-height: 0; + display: grid; + grid-template-columns: minmax(128px, 0.52fr) minmax(0, 1fr) minmax(128px, 0.52fr); + gap: 8px; + padding: 8px; + overflow: hidden; + border-radius: 14px; + border: 1px solid rgba(79,172,254,0.13); + background: + radial-gradient(circle at 50% 58%, rgba(0,240,255,0.18), transparent 34%), + linear-gradient(180deg, rgba(246,251,255,0.68), rgba(219,237,255,0.58)); +} +.de-working-stage::after { + content: ""; + position: absolute; + left: 18%; + right: 18%; + top: 52%; + height: 2px; + background: linear-gradient(90deg, transparent, rgba(59,130,246,0.24), rgba(0,240,255,0.86), rgba(168,85,247,0.36), transparent); + box-shadow: 0 0 18px rgba(0,240,255,0.34); + animation: deRailFlow 2.8s linear infinite; +} +.de-work-action-stack { + position: relative; + z-index: 2; + display: flex; + flex-direction: column; + justify-content: center; + gap: 7px; + min-height: 0; +} +.de-work-action-card { + min-width: 0; + min-height: 54px; + display: grid; + grid-template-columns: 22px minmax(0, 1fr); + gap: 2px 7px; + align-content: center; + padding: 8px; + border-radius: 11px; + border: 1px solid rgba(79,172,254,0.15); + background: rgba(248,252,255,0.78); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.62); +} +.de-work-action-card svg { grid-row: 1 / span 2; align-self: center; color: #2563eb; } +.de-work-action-card span { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: #143450; + font-size: 12px; + font-weight: 900; +} +.de-work-action-card small { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: #58728e; + font-size: 10px; +} +.de-work-action-card--running { + border-color: rgba(59,130,246,0.42); + box-shadow: inset 3px 0 0 rgba(59,130,246,0.82), 0 0 18px rgba(59,130,246,0.15); +} +.de-work-action-card--success { + border-color: rgba(24,184,122,0.38); + box-shadow: inset 3px 0 0 rgba(24,184,122,0.74); +} +.de-work-action-card--warning { + border-color: rgba(245,166,35,0.46); + box-shadow: inset 3px 0 0 rgba(245,166,35,0.8), 0 0 16px rgba(245,166,35,0.16); +} +.de-work-action-card--danger { + border-color: rgba(232,77,79,0.42); + box-shadow: inset 3px 0 0 rgba(232,77,79,0.82); + animation: deErrorNudge 0.18s ease both; +} +.de-work-action-card--call svg { color: #6d7cff; } +.de-work-action-card--message svg { color: #18b87a; } +.de-work-action-card--browser svg { color: #06b6d4; } +.de-work-action-card--document svg { color: #f5a623; } +.de-work-action-card--confirm svg { color: #f5a623; } +.de-work-action-card--exception svg { color: #e84d4f; } +.de-work-action-card--report svg { color: #7c3aed; } +.de-work-agent-stage { + position: relative; + z-index: 2; + display: grid; + place-items: center; + min-height: 0; +} +.de-work-agent-beam { + position: absolute; + inset: 12% 9% 4%; + border-radius: 999px; + background: radial-gradient(ellipse at center, rgba(0,240,255,0.22), rgba(59,130,246,0.08) 46%, transparent 72%); + filter: blur(4px); + animation: deOnlinePulse 16s ease-in-out infinite; +} +.de-work-agent-avatar { + position: relative; + width: min(100%, 250px); + height: min(100%, 250px); +} +.de-work-agent-avatar .de-avatar-img { + height: 32vh; + max-height: 250px; + margin-bottom: -20px; + filter: drop-shadow(0 10px 28px rgba(30,144,255,0.3)); +} +.de-work-agent-avatar .de-avatar-glass-space { max-width: 230px; max-height: 280px; } +.de-work-agent-avatar .de-avatar-state-label { + top: 10%; + min-height: 24px; + font-size: 11px; +} +.de-current-step-card { + position: absolute; + left: 50%; + bottom: 8px; + z-index: 8; + width: min(280px, calc(100% - 18px)); + transform: translateX(-50%); + display: grid; + gap: 4px; + padding: 10px 11px; + border-radius: 12px; + border: 1px solid rgba(59,130,246,0.28); + background: rgba(248,252,255,0.88); + box-shadow: 0 12px 30px rgba(38, 125, 191, 0.18), inset 0 1px 0 rgba(255,255,255,0.68); +} +.de-current-step-card span { + color: #0c5a85; + font-size: 10px; + font-weight: 900; +} +.de-current-step-card strong { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: #143450; + font-size: 13px; +} +.de-current-step-card p { + margin: 0; + color: #58728e; + font-size: 10px; + line-height: 1.36; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} +.de-current-step-card small { + min-width: 0; + color: #0c5a85; + font-size: 10px; + line-height: 1.32; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-current-step-card--danger { border-color: rgba(232,77,79,0.44); } +.de-current-step-card--warning { border-color: rgba(245,166,35,0.5); } +.de-current-step-card--success { border-color: rgba(24,184,122,0.38); } +.de-current-step-progress { + height: 5px; + overflow: hidden; + border-radius: 999px; + background: rgba(145,181,210,0.22); +} +.de-current-step-progress span { + display: block; + height: 100%; + min-width: 8%; + border-radius: inherit; + background: linear-gradient(90deg, #3b82f6, #00f0ff, #a855f7); +} +.de-work-progress-grid { + min-height: 0; + display: grid; + grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr); + gap: 8px; +} +.de-execution-queue-panel, +.de-step-track-panel, +.de-work-event-rail { + min-height: 0; + display: grid; + grid-template-rows: auto minmax(0, 1fr); + gap: 7px; + padding: 9px; + border-radius: 13px; + border: 1px solid rgba(79,172,254,0.14); + background: rgba(248,252,255,0.76); + overflow: hidden; +} +.de-panel-mini-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; +} +.de-panel-mini-head strong { + color: #143450; + font-size: 13px; +} +.de-panel-mini-head span { + color: #5b7590; + font-size: 11px; +} +.de-execution-queue-list, +.de-step-track-list { + min-height: 0; + display: grid; + align-content: start; + gap: 6px; + overflow-y: auto; + padding-right: 3px; +} +.de-execution-queue-row { + position: relative; + min-width: 0; + display: grid; + grid-template-columns: 10px minmax(0, 1fr) auto 38px; + gap: 4px 7px; + align-items: center; + padding: 7px 8px; + border-radius: 10px; + border: 1px solid rgba(79,172,254,0.13); + background: rgba(255,255,255,0.72); + color: #173550; + text-align: left; + cursor: pointer; +} +.de-execution-queue-row.active { + border-color: rgba(59,130,246,0.46); + box-shadow: 0 0 0 2px rgba(59,130,246,0.09); +} +.de-queue-dot { + width: 8px; + height: 8px; + border-radius: 999px; + background: #3b82f6; + box-shadow: 0 0 0 4px rgba(59,130,246,0.1); +} +.de-execution-queue-row strong, +.de-execution-queue-row em { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-execution-queue-row strong { color: #143450; font-size: 11px; } +.de-execution-queue-row em { + color: #5b7590; + font-size: 10px; + font-style: normal; +} +.de-execution-queue-row small { + color: #0c5a85; + font-size: 10px; + font-weight: 800; + text-align: right; +} +.de-execution-queue-row i { + grid-column: 2 / -1; + height: 4px; + overflow: hidden; + border-radius: 999px; + background: rgba(145,181,210,0.2); +} +.de-execution-queue-row i span { + display: block; + height: 100%; + border-radius: inherit; + background: linear-gradient(90deg, #3b82f6, #00f0ff); +} +.de-step-track-row { + min-width: 0; + display: grid; + grid-template-columns: 22px minmax(0, 1fr) auto 42px; + align-items: center; + gap: 6px; + min-height: 34px; + padding: 6px 7px; + border-radius: 10px; + border: 1px solid rgba(79,172,254,0.13); + background: rgba(255,255,255,0.74); + color: #173550; + text-align: left; + cursor: pointer; +} +.de-step-track-row.active { + border-color: rgba(59,130,246,0.48); + box-shadow: inset 3px 0 0 rgba(59,130,246,0.86), 0 0 16px rgba(59,130,246,0.12); +} +.de-step-track-index { + display: inline-flex; + align-items: center; + justify-content: center; + color: #3b82f6; +} +.de-step-track-row--success .de-step-track-index { color: #18b87a; } +.de-step-track-row--warning .de-step-track-index { color: #f5a623; } +.de-step-track-row--danger .de-step-track-index { color: #e84d4f; } +.de-step-track-row strong, +.de-step-track-row em, +.de-step-track-row small { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-step-track-row strong { color: #143450; font-size: 11px; } +.de-step-track-row em { color: #5b7590; font-size: 10px; font-style: normal; } +.de-step-track-row small { color: #0c5a85; font-size: 10px; text-align: right; } +.de-work-event-rail { + grid-template-columns: auto minmax(0, 1fr); + grid-template-rows: auto; + align-items: center; +} +.de-work-event-rail > span { + color: #143450; + font-size: 12px; + font-weight: 900; +} +.de-work-event-rail > div { + min-width: 0; + display: flex; + gap: 6px; + overflow-x: auto; + padding-bottom: 1px; +} +.de-event-rail-node { + flex: 0 0 92px; + min-height: 42px; + display: grid; + gap: 2px; + padding: 6px 7px; + border-radius: 10px; + border: 1px solid rgba(79,172,254,0.14); + background: rgba(255,255,255,0.72); + text-align: left; + cursor: pointer; +} +.de-event-rail-node em, +.de-event-rail-node strong { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-event-rail-node em { color: #0c5a85; font-size: 10px; font-style: normal; } +.de-event-rail-node strong { color: #143450; font-size: 10px; } +.de-event-rail-node--success { border-left: 3px solid #18b87a; } +.de-event-rail-node--running { border-left: 3px solid #3b82f6; } +.de-event-rail-node--warning { border-left: 3px solid #f5a623; } +.de-event-rail-node--danger { border-left: 3px solid #e84d4f; } +.de-execution-overview-body { + grid-template-rows: auto auto minmax(34px, auto) minmax(0, 1fr) auto; +} +.de-health-ribbon { + min-height: 40px; + display: grid; + grid-template-columns: 26px minmax(0, 1fr) auto; + align-items: center; + gap: 8px; + padding: 8px 10px; + border-radius: 12px; + border: 1px solid rgba(79,172,254,0.14); + background: rgba(255,255,255,0.72); +} +.de-health-ribbon svg { color: #18b87a; } +.de-health-ribbon span { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: #143450; + font-size: 13px; + font-weight: 900; +} +.de-health-ribbon small { + color: #5b7590; + font-size: 10px; + white-space: nowrap; +} +.de-health-ribbon--warning svg { color: #f5a623; } +.de-health-ribbon--danger svg { color: #e84d4f; } +.de-execution-status-strip--compact { + grid-template-columns: repeat(5, minmax(0, 1fr)); +} +.de-execution-status-strip--compact span { + padding: 6px 7px; +} +.de-execution-status-strip--compact strong { + font-size: 16px; +} +.de-execution-micro-timeline { + min-height: 38px; + display: flex; + align-items: stretch; + gap: 5px; + overflow-x: auto; + padding-bottom: 2px; +} +.de-micro-node { + flex: 1 0 32px; + min-width: 32px; + display: grid; + align-content: center; + gap: 3px; + border: 0; + background: transparent; + color: #55718b; + font: inherit; + text-align: center; + cursor: pointer; +} +.de-micro-node span { + height: 8px; + border-radius: 999px; + background: rgba(145,181,210,0.38); +} +.de-micro-node em { + color: #6d8499; + font-size: 9px; + font-style: normal; +} +.de-micro-node--running span { background: #3b82f6; box-shadow: 0 0 10px rgba(59,130,246,0.34); } +.de-micro-node--success span { background: #18b87a; } +.de-micro-node--warning span { background: #f5a623; } +.de-micro-node--danger span { background: #e84d4f; } +.de-micro-node--empty { cursor: default; } +.de-execution-overview-list { + min-height: 0; + display: grid; + gap: 7px; + overflow: hidden; +} +.de-execution-overview-list > div { + min-width: 0; + display: grid; + gap: 3px; + padding: 8px 9px; + border-radius: 11px; + border: 1px solid rgba(79,172,254,0.12); + background: rgba(255,255,255,0.68); +} +.de-execution-overview-list span { + color: #0c5a85; + font-size: 10px; + font-weight: 900; +} +.de-execution-overview-list strong, +.de-execution-overview-list p { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-execution-overview-list strong { color: #143450; font-size: 12px; } +.de-execution-overview-list p { margin: 0; color: #58728e; font-size: 10px; } +.de-stage-feed-tools--overview { + padding-top: 0; +} +.de-plan-conversation-panel { + min-height: 0; + display: grid; + grid-template-rows: auto minmax(0, 1fr); + gap: 8px; + padding: 10px; + border-radius: 12px; + border: 1px solid rgba(79,172,254,0.16); + background: linear-gradient(180deg, hsla(0,0%,100%,0.78), rgba(234,243,255,0.92)); + overflow: hidden; +} +.de-plan-conversation-panel > .de-card-title-bar { + margin: -10px -10px 0; + min-height: 40px; + border-radius: 12px 12px 0 0; +} +.de-plan-conversation-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; +} +.de-plan-conversation-head .de-workbench-title-row span { + color: #5b7590; + font-size: 11px; + white-space: nowrap; +} +.de-plan-conversation-body { + min-height: 0; + display: grid; + grid-template-rows: minmax(0, 1fr) auto auto; + gap: 7px; +} +.de-plan-conversation-message { + min-height: 0; + display: grid; + grid-template-columns: 24px minmax(0, 1fr); + gap: 8px; + padding: 9px; + border-radius: 12px; + border: 1px solid rgba(168,85,247,0.16); + background: linear-gradient(135deg, rgba(255,255,255,0.76), rgba(236,232,255,0.62)); +} +.de-plan-conversation-message svg { color: #7c3aed; } +.de-plan-conversation-message p { + margin: 0; + color: #173550; + font-size: 12px; + line-height: 1.48; + display: -webkit-box; + -webkit-line-clamp: 4; + -webkit-box-orient: vertical; + overflow: hidden; +} +.de-plan-conversation-actions { + display: flex; + flex-wrap: wrap; + gap: 6px; +} +.de-plan-conversation-actions button { + min-height: 28px; + border: 0; + border-radius: 999px; + padding: 0 9px; + color: #22659a; + background: rgba(79,172,254,0.14); + font-size: 11px; + cursor: pointer; +} +.de-plan-conversation-actions button:disabled { + opacity: 0.48; + cursor: not-allowed; +} +.de-plan-conversation-input { + min-height: 34px; + display: grid; + grid-template-columns: minmax(0, 1fr) 24px; + align-items: center; + gap: 8px; + padding: 0 8px 0 12px; + border: 1px solid rgba(79,172,254,0.16); + border-radius: 999px; + background: rgba(255,255,255,0.78); + color: #6d8499; + font: inherit; + font-size: 12px; + text-align: left; + cursor: pointer; +} +.de-plan-conversation-input svg { color: #2563eb; } +.de-plan-chat-drawer { + width: min(720px, calc(100vw - 56px)); + max-height: min(760px, calc(100vh - 48px)); + display: grid; + grid-template-rows: auto auto minmax(0, 1fr) auto auto; + gap: 12px; + padding: 18px; + border-radius: 20px; + background: linear-gradient(180deg, rgba(252,254,255,0.98), rgba(232,244,255,0.96)); + border: 1px solid rgba(79,172,254,0.22); + box-shadow: 0 24px 70px rgba(21,55,84,0.24), inset 0 1px 0 rgba(255,255,255,0.62); +} +.dhv2-plan-chat-body--embedded { + min-height: 0 !important; + display: grid !important; + grid-template-rows: auto minmax(0, 1fr) !important; + gap: 0 !important; + overflow: hidden !important; + padding: 0 !important; +} +.dhv2-planb-chat-embed { + min-height: 0 !important; + height: auto !important; + overflow: hidden !important; + border: 0 !important; + border-radius: 0 !important; + background: #f8fbfe !important; +} +.de-plan-chat-context { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px; +} +.de-plan-chat-context > div { + min-width: 0; + display: grid; + gap: 4px; + padding: 10px 11px; + border-radius: 12px; + border: 1px solid rgba(79,172,254,0.14); + background: rgba(247,251,255,0.92); +} +.de-plan-chat-context span, +.de-plan-chat-input span { + color: #5b7590; + font-size: 11px; + font-weight: 800; +} +.de-plan-chat-context strong { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: #143450; + font-size: 13px; +} +.de-plan-chat-context p { + margin: 0; + color: #58728e; + font-size: 12px; + line-height: 1.42; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} +.de-plan-chat-messages { + min-height: 0; + display: grid; + align-content: start; + gap: 8px; + overflow-y: auto; +} +.de-plan-chat-message { + display: grid; + grid-template-columns: 24px minmax(0, 1fr); + gap: 8px; + padding: 10px; + border-radius: 12px; + border: 1px solid rgba(79,172,254,0.14); + background: rgba(248,252,255,0.94); +} +.de-plan-chat-message svg { color: #2563eb; } +.de-plan-chat-message--ai { border-color: rgba(168,85,247,0.18); } +.de-plan-chat-message--ai svg { color: #7c3aed; } +.de-plan-chat-message--system { border-color: rgba(245,166,35,0.25); } +.de-plan-chat-message--system svg { color: #f5a623; } +.de-plan-chat-message--event svg { color: #06b6d4; } +.de-plan-chat-message p { + margin: 0; + color: #173550; + font-size: 13px; + line-height: 1.48; +} +.de-plan-chat-input { + display: grid; + gap: 6px; +} +.de-plan-chat-input textarea { + width: 100%; + min-height: 104px; + resize: vertical; + padding: 10px 12px; + border-radius: 12px; + border: 1px solid rgba(79,172,254,0.18); + color: #173550; + background: rgba(255,255,255,0.86); + font: inherit; + font-size: 13px; + line-height: 1.45; +} +.de-plan-chat-actions { + flex-wrap: wrap; +} +@keyframes deAuroraDrift { + from { transform: translate3d(-2%, -1%, 0); opacity: 0.48; } + to { transform: translate3d(2%, 1%, 0); opacity: 0.72; } +} +@keyframes deRailFlow { + from { filter: hue-rotate(0deg); opacity: 0.58; } + to { filter: hue-rotate(18deg); opacity: 0.92; } +} +@keyframes deOnlinePulse { + 0%, 100% { opacity: 0.52; transform: scale(0.98); } + 50% { opacity: 0.82; transform: scale(1.03); } +} +@keyframes deErrorNudge { + 0% { transform: translateX(0); } + 40% { transform: translateX(-3px); } + 80% { transform: translateX(3px); } + 100% { transform: translateX(0); } +} +@media (prefers-reduced-motion: reduce) { + .de-work-scene-card::before, + .de-working-stage::after, + .de-work-agent-beam, + .de-work-action-card--danger { + animation: none !important; + } +} + /* Skill Manager */ .de-skill-manager-card { flex: 1; display: flex; flex-direction: column; min-height: 0; } .de-skill-manager-body { flex: 1; display: flex; flex-direction: column; min-height: 0; overflow: hidden; } @@ -2835,7 +3226,7 @@ } .de-right-panels { - grid-template-rows: minmax(0, 1fr) minmax(158px, 0.34fr); + grid-template-rows: minmax(168px, 0.48fr) minmax(160px, 0.42fr) minmax(158px, 0.32fr); gap: 8px; overflow: hidden; } @@ -3104,7 +3495,7 @@ .de-dashboard--compact .de-speech-workflow small { font-size: 10px; -webkit-line-clamp: 1; } .de-dashboard--compact .de-skin-row { gap: 5px; padding: 6px 8px; margin-top: 5px; } .de-dashboard--compact .de-right-panels { - grid-template-rows: minmax(0, 1fr) minmax(156px, 0.33fr); + grid-template-rows: minmax(160px, 0.46fr) minmax(148px, 0.4fr) minmax(150px, 0.32fr); gap: 8px; } .de-dashboard--compact .de-workbench, @@ -3125,7 +3516,7 @@ .de-dashboard--compact .de-report-summary-title-row h3 { font-size: 15px; } .de-dashboard--compact .de-workday-execution-body { gap: 6px; - grid-template-rows: auto auto minmax(80px, 0.48fr) auto minmax(0, 1fr); + grid-template-rows: auto minmax(80px, 0.48fr) auto minmax(0, 1fr); } .de-dashboard--compact .de-execution-status-strip { gap: 5px; } .de-dashboard--compact .de-execution-status-strip span { padding: 6px 7px; } @@ -3255,7 +3646,7 @@ .de-right-panels { height: auto; - grid-template-rows: auto auto; + grid-template-rows: auto auto auto; } .de-workbench, @@ -3265,7 +3656,7 @@ } .de-workday-execution-body { - grid-template-rows: auto auto auto auto auto; + grid-template-rows: auto auto auto auto; } .de-task-summary-scroll, @@ -3301,6 +3692,56 @@ .de-workbench-actions button:hover { background: rgba(79,172,254,0.22); } .de-workbench-actions button:disabled { opacity: 0.45; cursor: not-allowed; } +.de-dashboard--compact .de-work-scene-shell { + padding: 0 !important; + overflow: hidden !important; +} +.de-dashboard--compact .de-work-scene-card { + padding: 7px; + gap: 6px; +} +.de-dashboard--compact .de-working-scene { + grid-template-rows: minmax(220px, 0.92fr) minmax(128px, 0.48fr) minmax(56px, 0.18fr); + gap: 6px; +} +.de-dashboard--compact .de-working-stage { + grid-template-columns: minmax(112px, 0.5fr) minmax(0, 1fr) minmax(112px, 0.5fr); + gap: 6px; + padding: 7px; +} +.de-dashboard--compact .de-work-agent-avatar .de-avatar-img { + height: 30vh !important; + max-height: 228px !important; + margin-bottom: -18px !important; +} +.de-dashboard--compact .de-work-agent-avatar .de-avatar-glass-space { + max-width: 210px !important; + max-height: 260px !important; +} +.de-dashboard--compact .de-standby-avatar .de-avatar-img { + height: 50vh !important; + max-height: 420px !important; + margin-bottom: -28px !important; +} +.de-dashboard--compact .de-work-action-card { + min-height: 48px; + padding: 7px; +} +.de-dashboard--compact .de-current-step-card { + width: min(248px, calc(100% - 14px)); + padding: 8px 9px; +} +.de-dashboard--compact .de-plan-conversation-panel { + padding: 9px; + gap: 6px; +} +.de-dashboard--compact .de-plan-conversation-panel > .de-card-title-bar { + margin: -9px -9px 0; +} +.de-dashboard--compact .de-plan-conversation-message p { + -webkit-line-clamp: 3; +} + /* Digital Employee — real-time task indicators */ .de-status-dot--running { display: inline-block; width: 8px; height: 8px; border-radius: 50%; @@ -3396,27 +3837,11203 @@ } .de-schedule-btn-primary:disabled { opacity: 0.55; cursor: not-allowed; } -/* Management business view */ -.de-segmented-tabs { display: inline-flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; padding: 4px; border: 1px solid var(--de-glass-border-lighter); border-radius: 8px; background: rgba(244,250,255,0.68); } -.de-segmented-tabs button { min-width: 56px; height: 30px; padding: 0 10px; border: 0; border-radius: 6px; background: transparent; color: #41627f; font-size: 13px; cursor: pointer; } -.de-segmented-tabs button.active { color: #fff; background: #2477b8; box-shadow: 0 2px 8px rgba(36,119,184,0.18); } -.de-business-toolbar label { display: grid; gap: 4px; min-width: 0; } -.de-business-toolbar label span { color: var(--de-text-muted); font-size: 12px; } -.de-business-toolbar input, .de-business-toolbar select, .de-business-pagination select { width: 100%; min-width: 0; height: 32px; border: 1px solid var(--de-glass-border-lighter); border-radius: 6px; padding: 0 8px; color: var(--de-text-body); background: rgba(255,255,255,0.82); font-size: 13px; } -.de-business-actions { display: inline-flex; justify-content: flex-end; gap: 6px; } -.de-business-table th, .de-business-table td { padding: 9px 10px; border-bottom: 1px solid rgba(79,172,254,0.1); text-align: left; vertical-align: top; font-size: 12px; } -.de-business-table th { color: #315576; background: rgba(235,246,255,0.78); font-weight: 700; white-space: nowrap; } -.de-business-table td { color: var(--de-text-body); background: rgba(255,255,255,0.48); } -.de-business-table tr.active td { background: rgba(79,172,254,0.09); } -.de-business-table td strong { display: block; max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--de-text-primary); } -.de-business-table td code { display: block; max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--de-text-muted); font-size: 11px; } -.de-business-table td span { display: block; max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.de-business-json { border-top: 1px solid rgba(79,172,254,0.1); } -.de-business-json summary { padding: 9px 10px; color: #315576; cursor: pointer; font-size: 13px; } -.de-business-json pre { max-height: 280px; margin: 0; padding: 10px; overflow: auto; color: var(--de-text-body); background: rgba(244,250,255,0.62); font-size: 12px; line-height: 1.5; } -.de-business-pagination { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; margin-top: 12px; color: var(--de-text-muted); font-size: 12px; } -.de-business-pagination label { display: inline-flex; align-items: center; gap: 6px; } -@media (max-width: 960px) { - .de-business-toolbar { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } - .de-business-layout { grid-template-columns: 1fr !important; } +/* Commander custom digital employee home */ +.de-role-person-body { + display: grid; + grid-template-columns: 82px minmax(0, 1fr); + gap: 12px; + align-items: center; +} +.de-role-person-avatar { + width: 82px; + height: 96px; + object-fit: cover; + object-position: center top; + border-radius: 14px; + background: linear-gradient(180deg, rgba(255,255,255,0.88), rgba(216,235,255,0.7)); + border: 1px solid rgba(79,172,254,0.2); + box-shadow: 0 10px 26px rgba(42,108,174,0.16); +} +.de-role-person-copy { + min-width: 0; + display: grid; + gap: 8px; +} +.de-role-person-name { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; +} +.de-role-person-name strong { + min-width: 0; + color: #12344f; + font-size: 18px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.de-role-person-name span { + flex: 0 0 auto; + min-height: 24px; + padding: 4px 9px; + border-radius: 999px; + color: #075b90; + font-size: 12px; + font-weight: 700; + background: rgba(34,211,238,0.16); + border: 1px solid rgba(34,211,238,0.24); +} +.de-role-person-name span::before { + content: ""; + display: inline-block; + width: 6px; + height: 6px; + margin-right: 5px; + border-radius: 50%; + background: #1bbf6b; + box-shadow: 0 0 0 5px rgba(27,191,107,0.12); +} +.de-role-person-facts { + display: grid; + gap: 5px; + margin: 0; +} +.de-role-person-facts div { + display: grid; + grid-template-columns: 34px minmax(0, 1fr); + gap: 7px; + align-items: baseline; +} +.de-role-person-facts dt { + color: #69829b; + font-size: 11px; + font-weight: 700; +} +.de-role-person-facts dd { + margin: 0; + color: #234564; + font-size: 12px; + line-height: 1.35; + min-width: 0; +} +.de-role-task-summary { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)) auto; + gap: 7px; + align-items: stretch; + margin-bottom: 8px; +} +.de-role-task-summary span { + display: grid; + gap: 2px; + padding: 7px 8px; + border-radius: 10px; + background: rgba(255,255,255,0.72); + border: 1px solid rgba(79,172,254,0.12); +} +.de-role-task-summary em { + color: #667f98; + font-size: 10px; + font-style: normal; +} +.de-role-task-summary strong { + color: #1554d1; + font-size: 18px; + line-height: 1; +} +.de-role-task-tabs { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0; + margin-bottom: 8px; + border-radius: 10px; + overflow: hidden; + border: 1px solid rgba(79,172,254,0.14); +} +.de-role-task-tabs button { + min-height: 32px; + border: 0; + background: rgba(241,248,255,0.78); + color: #42627f; + font: inherit; + font-size: 12px; + font-weight: 700; + cursor: pointer; +} +.de-role-task-tabs button.active { + color: #075b90; + background: linear-gradient(135deg, rgba(255,255,255,0.96), rgba(219,239,255,0.88)); + box-shadow: inset 0 -2px 0 rgba(37,99,235,0.82); +} +.de-role-task-context { + margin: 0 0 8px !important; +} +.de-role-task-preview-head { + margin-bottom: 7px; + padding: 0 2px; +} +.de-role-task-list { + min-height: 0; + overflow: auto; + display: grid; + gap: 7px; + padding-right: 2px; +} +.de-role-task-row { + display: grid; + gap: 5px; + padding: 9px 10px; + border-radius: 11px; + background: rgba(255,255,255,0.62); + border: 1px solid rgba(79,172,254,0.12); +} +.de-role-task-row--selected { + background: linear-gradient(135deg, rgba(255,255,255,0.86), rgba(232,247,255,0.76)); + border-color: rgba(37,99,235,0.24); +} +.de-role-task-check { + min-width: 0; + display: grid; + grid-template-columns: 18px minmax(0, 1fr); + gap: 8px; + align-items: center; + color: #143450; + font-size: 13px; + font-weight: 700; +} +.de-role-task-check input { + width: 15px; + height: 15px; + accent-color: #2563eb; +} +.de-role-task-check span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-role-task-meta { + display: flex; + flex-wrap: wrap; + gap: 6px; + align-items: center; + padding-left: 26px; +} +.de-role-task-meta em, +.de-role-task-meta strong { + display: inline-flex; + align-items: center; + min-height: 22px; + padding: 3px 8px; + border-radius: 999px; + font-size: 11px; + line-height: 1; +} +.de-role-task-meta em { + color: #0f766e; + font-style: normal; + background: rgba(45,212,191,0.14); +} +.de-role-task-meta strong { + color: #7a4d05; + background: rgba(245,158,11,0.14); +} +.de-role-task-row p { + margin: 0; + padding-left: 26px; + color: #57718b; + font-size: 11px; + line-height: 1.36; +} +.de-role-confirm-btn { + width: 100%; + min-height: 40px; + margin-top: 9px; + border-radius: 10px; + box-shadow: 0 12px 22px rgba(37,99,235,0.22); +} +.de-role-working-scene { + grid-template-rows: minmax(280px, 0.88fr) minmax(250px, 0.72fr) !important; + gap: 8px !important; +} +.de-role-work-scene { + position: relative; + min-height: 0; + overflow: hidden; + border-radius: 14px; + border: 1px solid rgba(79,172,254,0.16); + background: + linear-gradient(120deg, rgba(80,124,255,0.13), transparent 28%), + linear-gradient(240deg, rgba(20,184,166,0.13), transparent 30%), + linear-gradient(180deg, rgba(255,255,255,0.82), rgba(223,238,255,0.74)); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.72), 0 14px 34px rgba(45,96,150,0.12); +} +.de-role-work-scene::before { + content: ""; + position: absolute; + inset: 14px; + border-radius: 12px; + background-image: + linear-gradient(rgba(37,99,235,0.07) 1px, transparent 1px), + linear-gradient(90deg, rgba(20,184,166,0.06) 1px, transparent 1px); + background-size: 42px 42px; + mask-image: linear-gradient(180deg, transparent, #000 18%, #000 82%, transparent); +} +.de-role-active-beam { + position: absolute; + inset: 16% 23% 13%; + border-radius: 50%; + background: + radial-gradient(ellipse at center, rgba(45,212,191,0.26), transparent 62%), + conic-gradient(from 115deg, rgba(37,99,235,0.08), rgba(45,212,191,0.22), rgba(168,85,247,0.12), rgba(37,99,235,0.08)); + filter: blur(1px); +} +.de-role-agent-zone { + position: absolute; + left: 50%; + top: 51%; + z-index: 3; + width: min(270px, 36%); + transform: translate(-50%, -50%); + display: grid; + justify-items: center; +} +.de-role-agent-avatar { + width: min(230px, 100%); + min-height: 210px; +} +.de-role-agent-avatar .de-avatar-wrapper { + min-height: 210px !important; +} +.de-role-agent-avatar .de-avatar-img { + height: 28vh !important; + max-height: 218px !important; + margin-bottom: -22px !important; +} +.de-role-agent-avatar .de-avatar-glass-space { + max-width: 208px !important; + max-height: 248px !important; +} +.de-role-agent-status { + width: min(250px, 100%); + display: grid; + gap: 4px; + margin-top: -8px; + padding: 9px 11px; + border-radius: 12px; + background: rgba(255,255,255,0.76); + border: 1px solid rgba(45,212,191,0.26); + box-shadow: 0 14px 28px rgba(20,184,166,0.16); + text-align: center; +} +.de-role-agent-status span { + color: #0f766e; + font-size: 11px; + font-weight: 800; +} +.de-role-agent-status strong { + color: #12344f; + font-size: 16px; + line-height: 1.1; +} +.de-role-agent-status em { + color: #4f6a85; + font-size: 11px; + font-style: normal; +} +.de-role-agent-status div { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 5px; +} +.de-role-agent-status .de-role-agent-workflow { + display: grid; + justify-items: center; + gap: 2px; + padding: 6px 8px; + border-radius: 10px; + background: rgba(37,99,235,0.08); +} +.de-role-agent-status .de-role-agent-workflow strong { + color: #1554d1; + font-size: 11px; +} +.de-role-agent-status .de-role-agent-workflow small { + color: #315576; + font-size: 11px; + line-height: 1.3; +} +.de-role-agent-status small { + padding: 3px 6px; + border-radius: 999px; + color: #075b90; + background: rgba(34,211,238,0.12); +} +.de-role-action-cloud { + position: absolute; + inset: 14px 18px; + z-index: 2; + display: grid; + grid-template-columns: minmax(150px, 0.92fr) minmax(230px, 1.12fr) minmax(150px, 0.92fr); + grid-template-rows: repeat(3, minmax(72px, 1fr)); + grid-template-areas: + "phone . mail" + "inspection . workOrder" + "report . handoff"; + gap: 10px 12px; + align-items: center; +} +.de-role-action-card { + position: relative; + min-width: 0; + min-height: 68px; + display: grid; + grid-template-columns: 28px minmax(0, 1fr); + grid-template-rows: auto auto; + gap: 3px 8px; + align-items: center; + padding: 10px 12px; + border-radius: 12px; + color: #445f7b; + background: rgba(255,255,255,0.58); + border: 1px solid rgba(113,134,156,0.16); + opacity: 0.64; +} +.de-role-action-card--phone { grid-area: phone; } +.de-role-action-card--mail { grid-area: mail; } +.de-role-action-card--inspection { grid-area: inspection; } +.de-role-action-card--workOrder { grid-area: workOrder; } +.de-role-action-card--report { grid-area: report; } +.de-role-action-card--handoff { grid-area: handoff; } +.de-role-action-card svg { + grid-row: 1 / span 2; + color: #8aa0b6; +} +.de-role-action-card strong { + min-width: 0; + color: #334e68; + font-size: 14px; + line-height: 1.1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-role-action-card em { + min-width: 0; + color: #667f98; + font-size: 11px; + font-style: normal; + line-height: 1.25; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-role-action-ring { + position: absolute; + inset: 7px; + border-radius: 10px; + pointer-events: none; +} +.de-role-action-card--active { + min-height: 90px; + opacity: 1; + color: #083344; + background: linear-gradient(135deg, rgba(255,255,255,0.96), rgba(211,250,240,0.92)); + border-color: rgba(20,184,166,0.56); + box-shadow: 0 0 0 1px rgba(45,212,191,0.32), 0 18px 36px rgba(20,184,166,0.28), 0 0 38px rgba(34,211,238,0.22); +} +.de-role-action-card--active svg { + color: #0f766e; + filter: drop-shadow(0 0 9px rgba(45,212,191,0.58)); +} +.de-role-action-card--active strong { color: #064e3b; } +.de-role-action-card--active em { + color: #0f766e; + font-weight: 700; + white-space: normal; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.de-role-action-card--active .de-role-action-ring { + border: 1px solid rgba(34,211,238,0.66); + border-top-color: rgba(37,99,235,0.18); + box-shadow: inset 0 0 16px rgba(45,212,191,0.22), 0 0 20px rgba(34,211,238,0.18); +} +.de-role-action-progress { + grid-column: 2; + height: 5px; + overflow: hidden; + border-radius: 999px; + background: rgba(15,118,110,0.13); +} +.de-role-action-progress span { + display: block; + height: 100%; + border-radius: inherit; + background: linear-gradient(90deg, #14b8a6, #22d3ee, #2563eb); + box-shadow: 0 0 16px rgba(34,211,238,0.52); +} +.de-role-run-board { + min-height: 0; + display: grid; + grid-template-rows: auto minmax(0, 1fr); + gap: 8px; + padding: 10px; + border-radius: 14px; + background: rgba(255,255,255,0.78); + border: 1px solid rgba(79,172,254,0.14); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.76); +} +.de-role-run-board-head { + display: flex; + justify-content: space-between; + gap: 10px; + align-items: center; +} +.de-role-run-board-head h3 { + margin: 0; + color: #143450; + font-size: 16px; +} +.de-role-run-board-head span { + color: #617991; + font-size: 11px; +} +.de-role-run-table { + min-height: 0; + overflow: auto; + display: grid; + gap: 7px; +} +.de-role-run-row { + min-width: 0; + display: grid; + grid-template-columns: minmax(118px, 1.05fr) minmax(102px, 0.94fr) minmax(84px, 0.72fr) minmax(126px, 1.18fr) minmax(62px, 0.58fr); + gap: 6px; + align-items: center; + padding: 7px 8px; + border-radius: 11px; + background: rgba(246,250,255,0.78); + border: 1px solid rgba(79,172,254,0.12); +} +.de-role-run-row--active { + background: linear-gradient(135deg, rgba(255,255,255,0.96), rgba(225,250,247,0.9)); + border-color: rgba(20,184,166,0.52); + box-shadow: inset 3px 0 0 rgba(20,184,166,0.9), 0 12px 24px rgba(20,184,166,0.16); +} +.de-role-run-title, +.de-role-run-frequency, +.de-role-run-time, +.de-role-run-state { + min-width: 0; + display: grid; + gap: 3px; +} +.de-role-run-title strong { + color: #143450; + font-size: 13px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.de-role-run-title span, +.de-role-run-frequency em, +.de-role-run-time span, +.de-role-run-state span { + color: #617991; + font-size: 11px; + font-style: normal; +} +.de-role-run-frequency small, +.de-role-run-time strong { + color: #234564; + font-size: 11px; + font-weight: 700; +} +.de-role-run-row p { + margin: 0; + min-width: 0; + color: #526b84; + font-size: 11px; + line-height: 1.32; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; +} +.de-role-run-state i { + height: 5px; + overflow: hidden; + border-radius: 999px; + background: rgba(15,118,110,0.12); +} +.de-role-run-state b { + display: block; + height: 100%; + border-radius: inherit; + background: linear-gradient(90deg, #14b8a6, #22d3ee, #2563eb); + animation: deRoleProgressFlow 1.8s ease-in-out infinite alternate; +} +.de-role-today-body { + min-height: 0; + display: grid; + grid-template-rows: auto minmax(0, 1fr) auto; + gap: 8px; +} +.de-role-today-hero { + display: grid; + grid-template-columns: 22px minmax(0, 1fr) auto auto; + gap: 5px 8px; + align-items: center; + padding: 10px; + border-radius: 12px; + background: linear-gradient(135deg, rgba(255,255,255,0.88), rgba(226,240,255,0.74)); + border: 1px solid rgba(79,172,254,0.16); +} +.de-role-today-hero svg { color: #2563eb; } +.de-role-today-hero span { + color: #143450; + font-size: 12px; + font-weight: 800; +} +.de-role-today-hero strong { + color: #1554d1; + font-size: 28px; + line-height: 1; +} +.de-role-today-hero em { + color: #617991; + font-size: 12px; + font-style: normal; +} +.de-role-today-hero small { + grid-column: 2 / -1; + color: #526b84; + font-size: 11px; +} +.de-role-metric-grid { + min-height: 0; + overflow: auto; + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 6px; +} +.de-role-metric { + min-width: 0; + display: grid; + gap: 4px; + padding: 7px 8px; + border-radius: 11px; + background: rgba(255,255,255,0.66); + border: 1px solid rgba(79,172,254,0.12); +} +.de-role-metric span { + color: #60788f; + font-size: 10px; +} +.de-role-metric strong { + color: #143450; + font-size: 16px; + line-height: 1; +} +.de-role-metric strong em { + margin-left: 2px; + color: #6b8198; + font-size: 10px; + font-style: normal; + font-weight: 700; +} +.de-role-metric i { + height: 4px; + overflow: hidden; + border-radius: 999px; + background: rgba(79,172,254,0.1); +} +.de-role-metric b { + display: block; + height: 100%; + border-radius: inherit; + background: linear-gradient(90deg, #2563eb, #22d3ee); +} +.de-role-metric--mailIn b, +.de-role-metric--mailOut b, +.de-role-metric--handoff b { background: linear-gradient(90deg, #10b981, #22d3ee); } +.de-role-metric--inspection b { background: linear-gradient(90deg, #06b6d4, #2563eb); } +.de-role-metric--report b, +.de-role-metric--workOrder b { background: linear-gradient(90deg, #f59e0b, #22d3ee); } +.de-role-metric--exception b { background: linear-gradient(90deg, #ef4444, #f59e0b); } +.de-role-diary-panel { + grid-template-rows: auto minmax(0, 1fr); +} +.de-role-diary-body { + min-height: 0; + display: grid; + gap: 8px; +} +.de-role-diary-schedule { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 8px; + align-items: center; +} +.de-role-diary-schedule label { + min-width: 0; + display: grid; + grid-template-columns: auto minmax(0, 1fr); + gap: 8px; + align-items: center; + color: #526b84; + font-size: 12px; + font-weight: 700; +} +.de-role-diary-schedule input { + min-width: 0; + height: 30px; + border-radius: 9px; + border: 1px solid rgba(79,172,254,0.18); + background: rgba(255,255,255,0.76); + color: #143450; + padding: 0 8px; +} +.de-role-diary-chips { + display: flex; + flex-wrap: wrap; + gap: 6px; +} +.de-role-diary-chips span { + min-height: 22px; + padding: 4px 8px; + border-radius: 999px; + color: #075b90; + font-size: 11px; + background: rgba(37,99,235,0.08); + border: 1px solid rgba(37,99,235,0.12); +} +.de-role-diary-actions { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 7px; +} +.de-role-diary-actions .de-btn-sm { + min-height: 30px; + border-radius: 9px; +} +.de-role-ai-panel { + grid-template-rows: auto minmax(0, 1fr); +} +.de-role-ai-body { + min-height: 0; + display: grid; + grid-template-rows: auto minmax(0, 1fr) auto; + gap: 8px; +} +.de-role-ai-tabs { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + border-radius: 10px; + overflow: hidden; + border: 1px solid rgba(79,172,254,0.14); +} +.de-role-ai-tabs button { + min-height: 28px; + border: 0; + color: #526b84; + background: rgba(241,248,255,0.78); + font: inherit; + font-size: 11px; + font-weight: 700; + cursor: pointer; +} +.de-role-ai-tabs button.active { + color: #075b90; + background: rgba(255,255,255,0.92); + box-shadow: inset 0 -2px 0 rgba(37,99,235,0.82); +} +.de-role-ai-chat { + min-height: 0; + overflow: auto; + display: grid; + align-content: start; + gap: 7px; +} +.de-role-ai-bubble { + display: grid; + gap: 6px; + max-width: 92%; + padding: 9px 10px; + border-radius: 12px; + color: #173550; + font-size: 12px; + line-height: 1.45; +} +.de-role-ai-bubble p { margin: 0; } +.de-role-ai-bubble--ai { + grid-template-columns: 20px minmax(0, 1fr); + background: linear-gradient(135deg, rgba(255,255,255,0.84), rgba(233,241,255,0.68)); + border: 1px solid rgba(37,99,235,0.14); +} +.de-role-ai-bubble--ai svg { color: #2563eb; } +.de-role-ai-bubble--user { + justify-self: end; + color: #0f766e; + background: rgba(45,212,191,0.12); + border: 1px solid rgba(20,184,166,0.16); +} +.de-role-ai-input { + border-radius: 10px; +} +@keyframes deRoleProgressFlow { + 0% { filter: brightness(1); transform: translateX(-2px); } + 100% { filter: brightness(1.25); transform: translateX(2px); } +} +@media (max-height: 820px) and (min-width: 1180px) { + .de-role-working-scene { + grid-template-rows: minmax(230px, 0.86fr) minmax(190px, 0.66fr) !important; + } + .de-role-action-cloud { + grid-template-rows: repeat(3, minmax(58px, 1fr)); + gap: 7px 9px; + } + .de-role-action-card { + min-height: 56px; + padding: 8px 10px; + } + .de-role-agent-avatar .de-avatar-img { + max-height: 186px !important; + } + .de-role-agent-status { + padding: 7px 9px; + } + .de-role-run-row { + padding: 7px 8px; + } + .de-role-metric { + padding: 7px 8px; + } +} +@media (max-width: 1100px) { + .de-role-action-cloud { + position: relative; + inset: auto; + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-areas: none; + } + .de-role-agent-zone { + position: relative; + left: auto; + top: auto; + transform: none; + width: 100%; + margin: 8px auto; + } + .de-role-action-card { + grid-area: auto !important; + } + .de-role-run-row { + grid-template-columns: 1fr; + } +} +@media (prefers-reduced-motion: reduce) { + .de-role-run-state b { + animation: none !important; + } +} + +/* Target draft alignment: sgRobot branded home, offline work-scene visual */ +.de-header { + height: 58px; + background: linear-gradient(90deg, #0b78ff 0%, #0768f2 52%, #049dff 100%); + box-shadow: 0 2px 14px rgba(3, 83, 191, 0.22); +} +.de-header-content { + padding: 0 28px; +} +.de-header-left { + min-width: 336px; + gap: 10px; +} +.de-header-logo { + width: 34px; + height: 34px; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 8px; + color: #fff; + background: linear-gradient(145deg, rgba(255,255,255,0.28), rgba(255,255,255,0.08)); + border: 1px solid rgba(255,255,255,0.42); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.42), 0 8px 18px rgba(0,48,140,0.18); +} +.de-header-title { + color: #fff; + font-size: 22px; + font-weight: 800; + letter-spacing: 0; + line-height: 1; +} +.de-nav-btn { + height: 58px; + min-width: 112px; + transform: none; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 18px; + border: 0; + border-radius: 0; + color: rgba(255,255,255,0.88); + background: transparent; + font-size: 15px; + font-weight: 700; + letter-spacing: 0; +} +.de-nav-btn span { + transform: none; + display: inline; +} +.de-nav-btn svg { + flex: 0 0 auto; +} +.de-nav-btn.active { + color: #fff; + background: rgba(255,255,255,0.12); + border: 0; + box-shadow: inset 0 -3px 0 #fff; +} +.de-nav-btn:hover:not(.active):not(:disabled) { + color: #fff; + background: rgba(255,255,255,0.09); +} +.de-nav-btn--disabled, +.de-nav-btn:disabled { + cursor: default; + opacity: 0.88; +} +.de-header-right { + min-width: 250px; + gap: 12px; +} +.de-header-icon { + width: 32px; + height: 32px; + color: #fff; + background: rgba(255,255,255,0.08); +} +.de-header-notify { + position: relative; +} +.de-header-notify span { + position: absolute; + top: -5px; + right: -6px; + min-width: 18px; + height: 18px; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0 4px; + border-radius: 999px; + color: #fff; + background: #ff4d4f; + font-size: 11px; + font-weight: 800; + line-height: 1; +} +.de-header-user { + display: inline-flex; + align-items: center; + gap: 7px; + color: #fff; +} +.de-header-user > svg { + flex: 0 0 auto; + filter: drop-shadow(0 2px 5px rgba(0,0,0,0.18)); +} +.de-header-user-avatar { + width: 30px; + height: 30px; + flex: 0 0 auto; + object-fit: cover; + object-position: center top; + border-radius: 999px; + background: #fff; + border: 1px solid rgba(255,255,255,0.78); + box-shadow: 0 2px 7px rgba(0,35,120,0.18); +} +.de-header-user div { + display: grid; + gap: 2px; +} +.de-header-user strong { + font-size: 13px; + line-height: 1; +} +.de-header-user span { + position: relative; + padding-left: 10px; + color: rgba(255,255,255,0.88); + font-size: 11px; + line-height: 1; +} +.de-header-user span::before { + content: ""; + position: absolute; + left: 0; + top: 50%; + width: 6px; + height: 6px; + border-radius: 999px; + background: #37e27d; + transform: translateY(-50%); + box-shadow: 0 0 0 3px rgba(55,226,125,0.16); +} +.de-role-person-avatar { + border-radius: 999px; + background: #eef6ff; + box-shadow: 0 8px 18px rgba(32,98,170,0.12); +} +.de-role-working-scene { + grid-template-rows: minmax(326px, 0.9fr) minmax(252px, 0.72fr) !important; + gap: 10px !important; +} +.de-role-work-scene--reference { + min-height: 326px; + border-radius: 8px; + border: 1px solid rgba(65,126,224,0.16); + background: #f7fbff; + box-shadow: inset 0 1px 0 rgba(255,255,255,0.84), 0 14px 32px rgba(34,78,132,0.11); +} +.de-role-work-scene--reference::before { + content: none; +} +.de-commander-scene-bg { + position: absolute; + inset: 0; + z-index: 0; + width: 100%; + height: 100%; + object-fit: fill; + object-position: center; + filter: saturate(1.05) contrast(1.02); +} +.de-commander-scene-beam { + inset: 42% 22% 6%; + z-index: 1; + opacity: 0.72; +} +.de-commander-focus-card.de-role-action-card--active { + position: absolute; + top: 10%; + right: 4.2%; + z-index: 4; + width: min(318px, 33%); + min-height: 94px; + display: grid; + grid-template-columns: 34px minmax(0, 1fr); + gap: 7px 10px; + align-items: center; + padding: 13px 15px; + border-radius: 8px; + color: #064e3b; + background: linear-gradient(135deg, rgba(255,255,255,0.88), rgba(198,249,231,0.78)); + border: 1px solid rgba(45,212,191,0.72); + box-shadow: 0 0 0 1px rgba(34,211,238,0.32), 0 20px 44px rgba(20,184,166,0.34), 0 0 46px rgba(34,211,238,0.24); + animation: deCommanderFocusPulse 2.4s ease-in-out infinite; +} +.de-commander-focus-card > svg { + color: #0f766e; + filter: drop-shadow(0 0 10px rgba(45,212,191,0.72)); +} +.de-commander-focus-card div { + min-width: 0; + display: grid; + gap: 3px; +} +.de-commander-focus-card span { + color: #0f766e; + font-size: 11px; + font-weight: 800; +} +.de-commander-focus-card strong { + min-width: 0; + color: #064e3b; + font-size: 18px; + line-height: 1.08; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-commander-focus-card em { + min-width: 0; + color: #0c7a67; + font-size: 12px; + font-style: normal; + font-weight: 700; + line-height: 1.25; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-commander-focus-card .de-role-action-progress { + grid-column: 1 / -1; + height: 7px; + background: rgba(15,118,110,0.16); +} +.de-commander-focus-card .de-role-action-progress span { + position: relative; + animation: deRoleProgressFlow 1.4s ease-in-out infinite alternate; +} +.de-commander-status-card { + position: absolute; + left: 50%; + bottom: 17px; + z-index: 3; + width: min(560px, 72%); + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 12px 16px; + border-radius: 8px; + background: rgba(255,255,255,0.78); + border: 1px solid rgba(37,99,235,0.14); + box-shadow: 0 14px 28px rgba(35,78,132,0.13); + transform: translateX(-50%); + backdrop-filter: blur(12px); +} +.de-commander-status-card > div { + min-width: 0; + display: grid; + gap: 3px; +} +.de-commander-status-card span { + color: #1554d1; + font-size: 11px; + font-weight: 800; +} +.de-commander-status-card strong { + min-width: 0; + color: #173550; + font-size: 14px; + line-height: 1.28; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-commander-status-card ul { + flex: 0 0 auto; + display: flex; + gap: 7px; + margin: 0; + padding: 0; + list-style: none; +} +.de-commander-status-card li { + padding: 5px 8px; + border-radius: 999px; + color: #075b90; + background: rgba(34,211,238,0.12); + font-size: 11px; + font-weight: 700; + white-space: nowrap; +} +.de-role-run-board { + border-radius: 8px; + padding: 12px; + background: rgba(255,255,255,0.86); + border: 1px solid rgba(65,126,224,0.12); +} +.de-role-run-table { + gap: 9px; +} +.de-role-run-row { + grid-template-columns: minmax(188px, 1.16fr) minmax(132px, 0.82fr) minmax(110px, 0.7fr) minmax(178px, 1.05fr) minmax(88px, 0.54fr); + min-height: 66px; + gap: 10px; + padding: 10px 12px; + border-radius: 8px; + background: rgba(255,255,255,0.88); + border: 1px solid rgba(85,112,142,0.12); + box-shadow: 0 8px 20px rgba(30,71,122,0.07); +} +.de-role-run-row--active { + background: linear-gradient(135deg, #fff, rgba(229,250,248,0.94)); + border-color: rgba(20,184,166,0.56); + box-shadow: inset 4px 0 0 rgba(20,184,166,0.95), 0 0 0 1px rgba(34,211,238,0.26), 0 16px 34px rgba(20,184,166,0.18); + animation: deCommanderRunPulse 2.2s ease-in-out infinite; +} +.de-role-run-title { + grid-template-columns: 40px minmax(0, 1fr); + align-items: center; + gap: 10px; +} +.de-role-run-title > div { + min-width: 0; + display: grid; + gap: 4px; +} +.de-role-run-icon { + width: 38px; + height: 38px; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 999px; + color: #2563eb; + background: rgba(37,99,235,0.09); + border: 1px solid rgba(37,99,235,0.18); +} +.de-role-run-row--active .de-role-run-icon { + color: #0f766e; + background: rgba(20,184,166,0.14); + border-color: rgba(20,184,166,0.36); + box-shadow: 0 0 0 5px rgba(20,184,166,0.08); +} +.de-role-run-title strong { + font-size: 14px; +} +.de-role-run-title span, +.de-role-run-frequency em, +.de-role-run-time span, +.de-role-run-state span { + font-size: 11px; +} +.de-role-run-state span { + justify-self: start; + padding: 5px 9px; + border-radius: 999px; + color: #1554d1; + background: rgba(37,99,235,0.08); + font-weight: 800; +} +.de-role-run-row--warning .de-role-run-state span { + color: #b45309; + background: rgba(245,158,11,0.12); +} +.de-role-run-state i { + height: 7px; +} +.de-role-today-hero { + border-radius: 8px; + background: linear-gradient(135deg, rgba(255,255,255,0.96), rgba(229,241,255,0.86)); + border-color: rgba(37,99,235,0.18); +} +.de-role-metric-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 7px; +} +.de-role-metric { + min-height: 58px; + padding: 7px 8px; + border-radius: 8px; + background: rgba(255,255,255,0.82); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.76); +} +.de-role-metric span { + font-size: 11px; +} +.de-role-metric strong { + font-size: 18px; +} +.de-role-metric strong em { + font-size: 11px; +} +@keyframes deCommanderFocusPulse { + 0%, 100% { transform: translateY(0); box-shadow: 0 0 0 1px rgba(34,211,238,0.3), 0 18px 38px rgba(20,184,166,0.28), 0 0 38px rgba(34,211,238,0.18); } + 50% { transform: translateY(-2px); box-shadow: 0 0 0 1px rgba(34,211,238,0.52), 0 22px 46px rgba(20,184,166,0.36), 0 0 56px rgba(34,211,238,0.28); } +} +@keyframes deCommanderRunPulse { + 0%, 100% { box-shadow: inset 4px 0 0 rgba(20,184,166,0.95), 0 0 0 1px rgba(34,211,238,0.2), 0 14px 30px rgba(20,184,166,0.14); } + 50% { box-shadow: inset 4px 0 0 rgba(20,184,166,1), 0 0 0 1px rgba(34,211,238,0.38), 0 18px 38px rgba(20,184,166,0.22); } +} +@media (max-height: 820px) and (min-width: 1180px) { + .de-role-work-scene--reference { + min-height: 272px; + } + .de-commander-focus-card.de-role-action-card--active { + top: 8%; + min-height: 82px; + padding: 10px 12px; + } + .de-commander-status-card { + bottom: 10px; + padding: 9px 12px; + } +} +@media (max-width: 1200px) { + .de-header-left { + min-width: 250px; + } + .de-nav-btn { + min-width: 92px; + padding: 0 12px; + font-size: 13px; + } + .de-commander-focus-card.de-role-action-card--active { + width: min(286px, 38%); + } + .de-commander-status-card { + width: min(520px, 82%); + } +} +@media (max-width: 1100px) { + .de-role-work-scene--reference { + min-height: 300px; + } + .de-commander-focus-card.de-role-action-card--active { + width: min(300px, 48%); + } + .de-role-run-row { + grid-template-columns: 1fr; + } +} +@media (max-width: 1023px) { + .de-header { + height: 52px; + } + .de-header-title { + font-size: 17px; + } + .de-header-user { + display: none; + } + .de-commander-status-card { + position: relative; + left: auto; + bottom: auto; + width: auto; + margin: 210px 12px 0; + transform: none; + } +} +@media (prefers-reduced-motion: reduce) { + .de-commander-focus-card.de-role-action-card--active, + .de-role-run-row--active, + .de-commander-focus-card .de-role-action-progress span { + animation: none !important; + } +} + +/* Frontend app builder pass: align to the accepted 1600px target concept */ +.de-shell { + background: #edf4fc; +} +.de-header { + height: 58px !important; +} +.de-header-content { + justify-content: flex-start; + gap: 0; + padding: 0 !important; +} +.de-header-left { + flex: 0 0 335px; + min-width: 335px !important; + height: 100%; + padding-left: 28px; + background: linear-gradient(90deg, rgba(0,85,220,0.22), rgba(255,255,255,0.04)); +} +.de-header-center { + position: static !important; + left: auto !important; + flex: 1 1 auto; + height: 100%; + justify-content: flex-start; + transform: none !important; +} +.de-header-right { + flex: 0 0 auto; + min-width: 0 !important; + height: 100%; + margin-left: auto; + padding-right: 16px; +} +.de-nav-btn { + height: 58px !important; + min-width: 112px; + padding: 0 18px !important; + font-size: 15px; +} +.de-dashboard-content, +.de-dashboard--compact .de-dashboard-content { + grid-template-columns: 312px minmax(0, 1fr) 360px !important; + gap: 10px 12px !important; + padding: 10px 15px 14px !important; + overflow: hidden !important; +} +.de-dashboard-left, +.de-dashboard--compact .de-dashboard-left { + gap: 10px !important; +} +.de-dashboard-center, +.de-dashboard--compact .de-dashboard-center { + align-items: stretch !important; + justify-content: stretch !important; + padding: 0 !important; + overflow: hidden !important; +} +.de-dashboard-right, +.de-dashboard--compact .de-dashboard-right { + overflow: hidden !important; +} +.de-card, +.de-workbench, +.de-report-summary, +.de-plan-conversation-panel { + border-radius: 8px !important; + border: 1px solid rgba(115, 151, 190, 0.18) !important; + background: rgba(255,255,255,0.9) !important; + box-shadow: 0 8px 22px rgba(41, 87, 138, 0.08) !important; +} +.de-dashboard-content .de-card-title-bar, +.de-right-panels .de-card-title-bar { + min-height: 45px !important; + margin: 0 !important; + padding: 12px 16px !important; + border-radius: 8px 8px 0 0 !important; + border-bottom: 1px solid rgba(115,151,190,0.14) !important; + background: rgba(255,255,255,0.78) !important; + box-shadow: none !important; +} +.de-dashboard-content .de-card-title-bar::before, +.de-dashboard-content .de-card-title-bar::after, +.de-right-panels .de-card-title-bar::before, +.de-right-panels .de-card-title-bar::after, +.de-workbench-head--bar::after, +.de-report-summary-head--bar::after { + content: none !important; +} +.de-card-title-bar-text, +.de-workbench-title-row h3, +.de-report-summary-title-row h3 { + color: #172f52 !important; + font-size: 18px !important; + font-weight: 800 !important; + letter-spacing: 0 !important; +} +.de-person-card--compact .de-card-title-bar button { + display: none !important; +} +.de-role-person-body { + grid-template-columns: 95px minmax(0, 1fr) !important; + padding: 14px 16px 16px !important; +} +.de-role-person-avatar { + width: 88px !important; + height: 106px !important; + border-radius: 999px !important; +} +.de-role-person-name strong { + font-size: 18px !important; +} +.de-role-person-facts div { + grid-template-columns: 32px minmax(0, 1fr) !important; +} +.de-role-person-facts dd { + font-size: 12px !important; +} +.de-role-task-summary { + grid-template-columns: repeat(3, minmax(0, 1fr)) auto !important; +} +.de-role-task-summary span { + border-radius: 8px !important; + background: #f7fbff !important; +} +.de-role-task-tabs { + border-radius: 8px !important; +} +.de-role-task-row { + border-radius: 8px !important; + background: rgba(255,255,255,0.88) !important; +} +.de-role-confirm-btn { + border-radius: 8px !important; + background: linear-gradient(180deg, #1f8dff, #1268ee) !important; +} +.de-work-scene-card { + height: 100% !important; + gap: 0 !important; + padding: 0 !important; + border-radius: 8px !important; + background: rgba(255,255,255,0.94) !important; + box-shadow: 0 8px 24px rgba(41,87,138,0.08) !important; +} +.de-work-scene-card::before { + content: none !important; +} +.de-work-scene-tabs { + height: 52px; + justify-content: flex-start !important; + padding-left: 32px; + border-bottom: 1px solid rgba(115,151,190,0.14); + background: rgba(255,255,255,0.78); +} +.de-work-scene-tabs button { + min-width: 118px !important; + min-height: 44px !important; + border: 0 !important; + border-radius: 0 !important; + color: #334b68 !important; + background: transparent !important; + box-shadow: none !important; +} +.de-work-scene-tabs button.active { + color: #075be8 !important; + background: transparent !important; + box-shadow: inset 0 -3px 0 #075be8 !important; +} +.de-role-working-scene, +.de-dashboard--compact .de-role-working-scene { + grid-template-rows: 330px minmax(0, 1fr) !important; + gap: 0 !important; + padding: 0 8px 8px; +} +.de-role-work-scene--reference { + min-height: 330px !important; + height: 330px !important; + border-radius: 0 !important; + border-width: 0 0 1px !important; + box-shadow: none !important; +} +.de-commander-scene-bg { + object-fit: fill !important; +} +.de-commander-focus-card.de-role-action-card--active { + top: 9% !important; + right: 4.4% !important; + width: min(298px, 34%) !important; + min-height: 78px !important; + padding: 10px 13px !important; + border-radius: 8px !important; +} +.de-commander-focus-card strong { + font-size: 17px !important; +} +.de-commander-status-card { + bottom: 16px !important; + width: min(520px, 70%) !important; + border-radius: 8px !important; +} +.de-role-run-board { + margin-top: 0 !important; + padding: 12px 14px !important; + border-width: 0 !important; + border-radius: 0 0 8px 8px !important; + background: #fff !important; + box-shadow: none !important; +} +.de-role-run-board-head { + min-height: 38px; +} +.de-role-run-board-head h3 { + font-size: 18px !important; +} +.de-role-run-row { + min-height: 78px !important; + grid-template-columns: minmax(188px, 1.1fr) minmax(124px, 0.74fr) minmax(108px, 0.66fr) minmax(168px, 1fr) minmax(86px, 0.52fr) !important; + padding: 10px 12px !important; + border-radius: 8px !important; +} +.de-role-run-row--active { + box-shadow: inset 4px 0 0 #14b8a6, 0 0 0 1px rgba(34,211,238,0.28), 0 14px 30px rgba(20,184,166,0.16) !important; +} +.de-right-panels, +.de-dashboard--compact .de-right-panels { + grid-template-rows: 350px 335px minmax(0, 1fr) !important; + gap: 10px !important; +} +.de-role-today-panel { + order: 1; +} +.de-role-ai-panel { + order: 2; +} +.de-role-diary-panel { + order: 3; +} +.de-role-today-body { + grid-template-rows: 70px minmax(0, 1fr) auto !important; + padding: 10px !important; +} +.de-role-today-hero { + border-radius: 8px !important; + padding: 10px 12px !important; +} +.de-role-metric-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)) !important; + gap: 6px !important; + overflow: hidden !important; +} +.de-role-metric { + min-height: 50px !important; + padding: 7px 7px !important; + border-radius: 8px !important; + background: #f8fbff !important; +} +.de-role-metric span { + font-size: 10px !important; +} +.de-role-metric strong { + font-size: 17px !important; +} +.de-role-metric strong em { + font-size: 9px !important; +} +.de-stage-feed-tools--overview { + min-height: 30px; + align-items: center; + justify-content: flex-end; +} +.de-stage-feed-tools--overview > span:not([hidden]) { + display: none !important; +} +.de-plan-conversation-panel, +.de-report-summary { + padding: 0 !important; +} +.de-role-ai-body, +.de-role-diary-body { + padding: 10px !important; +} +.de-role-diary-body { + gap: 8px !important; +} +.de-role-diary-chips { + max-height: 30px; + overflow: hidden; +} +.de-role-diary-chips span { + min-height: 24px !important; + padding: 4px 8px !important; +} +.de-role-ai-tabs { + border-radius: 8px !important; +} +.de-role-ai-bubble { + border-radius: 8px !important; +} +.de-role-diary-actions { + grid-template-columns: repeat(2, minmax(0, 1fr)) !important; +} +.de-role-diary-actions .de-btn-sm, +.de-plan-conversation-input { + border-radius: 8px !important; +} +@media (max-width: 1380px) { + .de-dashboard-content, + .de-dashboard--compact .de-dashboard-content { + grid-template-columns: 300px minmax(0, 1fr) 344px !important; + } + .de-right-panels, + .de-dashboard--compact .de-right-panels { + grid-template-rows: 335px 318px minmax(0, 1fr) !important; + } +} +@media (max-width: 1100px) { + .de-dashboard-content, + .de-dashboard--compact .de-dashboard-content { + grid-template-columns: 1fr !important; + overflow: auto !important; + } + .de-right-panels, + .de-dashboard--compact .de-right-panels { + grid-template-rows: auto auto auto !important; + } + .de-role-working-scene, + .de-dashboard--compact .de-role-working-scene { + grid-template-rows: 300px minmax(0, 1fr) !important; + } +} + +/* Latest accepted screenshot corrections: left breathing room, report middle, AI bottom */ +.de-role-person-body { + grid-template-columns: 145px minmax(0, 1fr) !important; + gap: 18px !important; + padding: 18px 20px 22px !important; +} +.de-role-person-avatar { + width: 132px !important; + height: 152px !important; + border-radius: 8px !important; +} +.de-role-person-copy { + gap: 10px !important; +} +.de-role-person-facts { + gap: 8px !important; +} +.de-role-person-facts div { + grid-template-columns: 34px minmax(0, 1fr) !important; +} +.de-template-manager-body { + grid-template-rows: auto auto minmax(0, 1fr) auto !important; + gap: 10px !important; +} +.de-workday-toolbar { + margin-bottom: 0 !important; +} +.de-role-task-tabs { + margin: 0 0 10px !important; +} +.de-role-task-list { + gap: 0 !important; +} +.de-role-task-row { + min-height: 66px !important; + padding: 10px 12px !important; + border-width: 0 0 1px !important; + border-radius: 0 !important; + background: transparent !important; +} +.de-role-task-row--selected { + background: rgba(248,251,255,0.86) !important; +} +.de-role-task-check { + font-size: 14px !important; +} +.de-role-task-row p { + font-size: 12px !important; +} +.de-role-task-actions { + display: flex; + align-items: center; + gap: 12px; + padding-top: 8px; +} +.de-role-confirm-btn { + flex: 1 1 auto; + width: auto !important; + min-height: 46px !important; + margin-top: 0 !important; +} +.de-role-rule-btn { + flex: 0 0 auto; + min-height: 42px; + padding: 0 8px; + border: 0 !important; + color: #0b63dc !important; + background: transparent !important; + box-shadow: none !important; + font-size: 13px !important; + font-weight: 800 !important; +} +.de-role-run-header { + display: grid; + grid-template-columns: minmax(188px, 1.1fr) minmax(124px, 0.74fr) minmax(108px, 0.66fr) minmax(168px, 1fr) minmax(86px, 0.52fr); + gap: 10px; + padding: 0 12px 6px; + color: #6b7f96; + font-size: 12px; + font-weight: 800; +} +.de-role-run-table { + gap: 0 !important; +} +.de-role-run-row { + border-radius: 8px !important; + margin-bottom: 9px; +} +.de-right-panels, +.de-dashboard--compact .de-right-panels { + grid-template-rows: 430px 190px minmax(0, 1fr) !important; + gap: 10px !important; +} +.de-role-today-panel { + order: 1 !important; +} +.de-role-diary-panel { + order: 2 !important; +} +.de-role-ai-panel { + order: 3 !important; +} +.de-role-today-body { + grid-template-rows: 70px 108px minmax(0, 1fr) auto !important; + gap: 8px !important; +} +.de-role-workload-chart { + min-height: 0; + display: grid; + grid-template-rows: auto minmax(0, 1fr); + gap: 6px; + padding: 8px 10px 6px; + border-radius: 8px; + border: 1px solid rgba(55, 111, 210, 0.12); + background: rgba(255,255,255,0.78); +} +.de-role-workload-chart-head { + display: flex; + justify-content: space-between; + align-items: center; + gap: 8px; +} +.de-role-workload-chart-head strong { + color: #172f52; + font-size: 13px; +} +.de-role-workload-chart-head span { + color: #6d8198; + font-size: 11px; +} +.de-role-workload-bars { + min-height: 0; + display: grid; + grid-template-columns: repeat(6, minmax(0, 1fr)); + align-items: end; + gap: 8px; + padding-top: 8px; + border-top: 1px dashed rgba(106,134,166,0.2); +} +.de-role-workload-bar { + min-width: 0; + height: 84px; + display: grid; + grid-template-rows: minmax(0, 1fr) auto auto; + justify-items: center; + gap: 3px; + color: #315576; + font-size: 10px; +} +.de-role-workload-bar span { + align-self: end; + width: 20px; + border-radius: 4px 4px 0 0; + background: linear-gradient(180deg, #2d7dff, #0d5fee); +} +.de-role-workload-bar--mailIn span { background: linear-gradient(180deg, #16c784, #059669); } +.de-role-workload-bar--inspection span { background: linear-gradient(180deg, #18c7d4, #0891b2); } +.de-role-workload-bar--workOrder span { background: linear-gradient(180deg, #ff9f1c, #ea580c); } +.de-role-workload-bar--report span { background: linear-gradient(180deg, #8b5cf6, #6d28d9); } +.de-role-workload-bar--handoff span { background: linear-gradient(180deg, #ef4444, #dc2626); } +.de-role-workload-bar em { + color: #172f52; + font-style: normal; + font-weight: 800; +} +.de-role-workload-bar small { + max-width: 100%; + overflow: hidden; + color: #6d8198; + text-overflow: ellipsis; + white-space: nowrap; +} +.de-role-diary-body { + gap: 8px !important; +} +.de-role-diary-chips { + max-height: 58px !important; +} +.de-role-ai-body { + grid-template-rows: auto minmax(0, 1fr) auto !important; +} +@media (max-width: 1380px) { + .de-right-panels, + .de-dashboard--compact .de-right-panels { + grid-template-rows: 410px 184px minmax(0, 1fr) !important; + } +} + +/* Match the latest 1680px reference: spacious left and right columns */ +.de-dashboard-content, +.de-dashboard--compact .de-dashboard-content { + grid-template-columns: 390px minmax(0, 1fr) 468px !important; + gap: 12px !important; + padding: 12px 15px 14px !important; +} +.de-role-working-scene, +.de-dashboard--compact .de-role-working-scene { + grid-template-rows: 380px minmax(0, 1fr) !important; +} +.de-role-work-scene--reference { + min-height: 380px !important; + height: 380px !important; +} +.de-role-run-row { + min-height: 72px !important; +} +.de-right-panels, +.de-dashboard--compact .de-right-panels { + grid-template-rows: 430px 190px minmax(0, 1fr) !important; +} +@media (max-width: 1500px) { + .de-dashboard-content, + .de-dashboard--compact .de-dashboard-content { + grid-template-columns: 360px minmax(0, 1fr) 420px !important; + } +} +@media (max-width: 1380px) { + .de-dashboard-content, + .de-dashboard--compact .de-dashboard-content { + grid-template-columns: 330px minmax(0, 1fr) 380px !important; + } +} + +/* Digital home v2: clean rebuild without old card/workbench components */ +.dhv2-home { + flex: 1; + min-height: 0; + display: grid; + grid-template-columns: 390px minmax(0, 1fr) 468px; + gap: 14px; + padding: 12px 15px 14px; + background: #eaf3fb; + overflow: hidden; + font-family: "Microsoft YaHei", "PingFang SC", "Segoe UI", Arial, sans-serif; +} +.dhv2-left, +.dhv2-center, +.dhv2-right { + min-width: 0; + min-height: 0; + display: grid; + gap: 12px; +} +.dhv2-left { + grid-template-rows: 248px minmax(0, 1fr); +} +.dhv2-center { + grid-template-rows: 486px minmax(0, 1fr); +} +.dhv2-right { + grid-template-areas: + "today" + "report" + "ai"; + grid-template-rows: 430px 206px minmax(214px, 1fr); +} +.dhv2-today { grid-area: today; } +.dhv2-report { grid-area: report; } +.dhv2-ai { + grid-area: ai; + align-self: stretch; +} +.dhv2-panel, +.dhv2-work-panel, +.dhv2-run-panel { + min-width: 0; + min-height: 0; + border: 1px solid rgba(109, 147, 188, 0.16); + border-radius: 10px; + background: rgba(255,255,255,0.93); + box-shadow: 0 10px 24px rgba(46, 88, 135, 0.08); + overflow: hidden; +} +.dhv2-panel-head { + min-height: 54px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 0 18px; + border-bottom: 1px solid rgba(109,147,188,0.13); +} +.dhv2-panel-head h2, +.dhv2-run-panel h2 { + margin: 0; + color: #142d50; + font-size: 20px; + font-weight: 800; + letter-spacing: 0; +} +.dhv2-panel-head button { + min-height: 30px; + padding: 0 12px; + border: 1px solid rgba(24, 126, 255, 0.2); + border-radius: 999px; + color: #0b63dc; + background: #f3f9ff; + font: inherit; + font-size: 13px; + font-weight: 800; + cursor: pointer; +} +.dhv2-employee-body { + height: calc(100% - 54px); + display: grid; + grid-template-columns: 148px minmax(0, 1fr); + gap: 18px; + align-items: center; + padding: 18px 22px; +} +.dhv2-employee-photo { + width: 132px; + height: 152px; + object-fit: cover; + object-position: center top; + border-radius: 8px; + background: #edf5ff; + border: 1px solid rgba(42,118,220,0.16); + box-shadow: 0 8px 18px rgba(36, 91, 156, 0.12); +} +.dhv2-employee-info { + min-width: 0; + display: grid; + gap: 12px; +} +.dhv2-employee-name { + display: flex; + align-items: center; + gap: 10px; +} +.dhv2-employee-name strong { + min-width: 0; + overflow: hidden; + color: #152844; + font-size: 21px; + font-weight: 900; + text-overflow: ellipsis; + white-space: nowrap; +} +.dhv2-employee-name span { + flex: 0 0 auto; + min-height: 24px; + padding: 3px 10px; + border: 1px solid rgba(20,184,166,0.26); + border-radius: 999px; + color: #0f8a74; + background: #ecfffa; + font-size: 13px; + font-weight: 800; +} +.dhv2-employee-info dl { + display: grid; + gap: 8px; + margin: 0; +} +.dhv2-employee-info dl div { + display: grid; + grid-template-columns: 36px minmax(0, 1fr); + gap: 8px; +} +.dhv2-employee-info dt { + color: #5d7189; + font-size: 13px; + font-weight: 800; +} +.dhv2-employee-info dd { + min-width: 0; + margin: 0; + color: #1f3858; + font-size: 13px; + line-height: 1.38; +} +.dhv2-tasks { + display: grid; + grid-template-rows: 54px auto auto minmax(0, 1fr) auto; +} +.dhv2-task-head { + align-items: center; +} +.dhv2-date-field { + height: 34px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 10px; + border: 1px solid rgba(46,126,235,0.16); + border-radius: 8px; + color: #30567e; + background: #f7fbff; +} +.dhv2-date-field input { + width: 132px; + border: 0; + outline: 0; + color: #173452; + background: transparent; + font: inherit; + font-size: 13px; + font-weight: 700; +} +.dhv2-task-tabs { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + margin: 12px 16px 8px; + overflow: hidden; + border: 1px solid rgba(46,126,235,0.14); + border-radius: 8px; +} +.dhv2-task-tabs button { + min-height: 36px; + border: 0; + color: #355a7a; + background: #f5faff; + font: inherit; + font-size: 14px; + font-weight: 800; + cursor: pointer; +} +.dhv2-task-tabs button.active { + color: #075be8; + background: #fff; + box-shadow: inset 0 -2px 0 #075be8; +} +.dhv2-task-list { + min-height: 0; + overflow: auto; + padding: 4px 16px 0; +} +.dhv2-task-row { + min-height: 72px; + display: grid; + grid-template-columns: 20px minmax(0, 1fr) auto auto; + gap: 10px; + align-items: center; + padding: 10px 0; + border-bottom: 1px solid rgba(79,116,156,0.13); + color: #173452; +} +.dhv2-task-row input { + width: 16px; + height: 16px; + accent-color: #155ff2; +} +.dhv2-task-main { + min-width: 0; + display: grid; + gap: 5px; +} +.dhv2-task-main strong { + min-width: 0; + overflow: hidden; + color: #102b4c; + font-size: 15px; + font-weight: 900; + text-overflow: ellipsis; + white-space: nowrap; +} +.dhv2-task-main small { + min-width: 0; + overflow: hidden; + color: #617b98; + font-size: 12px; + line-height: 1.3; + text-overflow: ellipsis; + white-space: nowrap; +} +.dhv2-task-chip, +.dhv2-task-row em { + min-height: 24px; + display: inline-flex; + align-items: center; + padding: 3px 8px; + border-radius: 999px; + font-size: 12px; + font-style: normal; + font-weight: 800; + white-space: nowrap; +} +.dhv2-task-chip--time { color: #0f766e; background: #e8fbf5; } +.dhv2-task-chip--trigger { color: #0b8a65; background: #e8fbf5; } +.dhv2-task-chip--delegate { color: #c46a08; background: #fff1dc; } +.dhv2-task-row em { + color: #9a5b08; + background: #fff2d9; +} +.dhv2-task-actions { + display: flex; + align-items: center; + gap: 14px; + padding: 14px 16px 18px; +} +.dhv2-primary { + min-height: 46px; + border: 0; + border-radius: 8px; + color: #fff; + background: linear-gradient(180deg, #188aff, #0d63e6); + box-shadow: 0 10px 18px rgba(13,99,230,0.22); + font: inherit; + font-size: 15px; + font-weight: 900; + cursor: pointer; +} +.dhv2-primary:disabled { + opacity: 0.58; + cursor: not-allowed; +} +.dhv2-task-actions .dhv2-primary { + flex: 1 1 auto; +} +.dhv2-link-button { + flex: 0 0 auto; + border: 0; + color: #0d63e6; + background: transparent; + font: inherit; + font-size: 14px; + font-weight: 900; + cursor: pointer; +} +.dhv2-work-panel { + display: grid; + grid-template-rows: 52px minmax(0, 1fr); +} +.dhv2-work-tabs { + display: flex; + align-items: center; + gap: 24px; + padding: 0 32px; + border-bottom: 1px solid rgba(109,147,188,0.13); +} +.dhv2-work-tabs button { + height: 52px; + border: 0; + color: #314c6c; + background: transparent; + font: inherit; + font-size: 16px; + font-weight: 800; + cursor: pointer; +} +.dhv2-work-tabs button.active { + color: #075be8; + box-shadow: inset 0 -3px 0 #075be8; +} +.dhv2-stage { + position: relative; + min-height: 0; + overflow: hidden; +} +.dhv2-stage::before { + content: ""; + position: absolute; + inset: 0; + z-index: 1; + pointer-events: none; + background: + linear-gradient(90deg, rgba(235, 245, 255, 0.6) 0%, rgba(235, 245, 255, 0.42) 29%, rgba(235, 245, 255, 0.06) 42%, rgba(235, 245, 255, 0.04) 58%, rgba(235, 245, 255, 0.48) 73%, rgba(235, 245, 255, 0.62) 100%), + radial-gradient(circle at 50% 62%, rgba(255,255,255,0) 0 28%, rgba(235,245,255,0.14) 58%, rgba(235,245,255,0.28) 100%); +} +.dhv2-stage-image { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: fill; + filter: saturate(0.95) brightness(1.04); +} +.dhv2-action-map { + position: absolute; + inset: 0; + z-index: 2; + pointer-events: none; +} +.dhv2-action-card { + --accent: #2d7dff; + --accent-soft: rgba(45,125,255,0.14); + position: absolute; + width: min(250px, 32%); + min-height: 68px; + display: grid; + grid-template-columns: 42px minmax(0, 1fr); + gap: 9px; + align-items: center; + padding: 12px 14px; + border: 1px solid rgba(97, 132, 176, 0.2); + border-radius: 12px; + color: #385a80; + background: rgba(246, 251, 255, 0.9); + box-shadow: 0 14px 30px rgba(37, 87, 139, 0.12); + backdrop-filter: blur(10px); + opacity: 0.78; +} +.dhv2-action-card--phone { + --accent: #5b6cff; + --accent-soft: rgba(91,108,255,0.15); + top: 7%; + left: 4%; +} +.dhv2-action-card--inspection { + --accent: #06b6d4; + --accent-soft: rgba(6,182,212,0.14); + top: 36%; + left: 3.5%; +} +.dhv2-action-card--report { + --accent: #64748b; + --accent-soft: rgba(100,116,139,0.14); + bottom: 14%; + left: 4%; +} +.dhv2-action-card--mail { + --accent: #14b8a6; + --accent-soft: rgba(20,184,166,0.18); + top: 9%; + right: 5%; + width: min(320px, 38%); + min-height: 104px; +} +.dhv2-action-card--workOrder { + --accent: #f59e0b; + --accent-soft: rgba(245,158,11,0.18); + top: 40%; + right: 4%; +} +.dhv2-action-card--handoff { + --accent: #718096; + --accent-soft: rgba(113,128,150,0.16); + bottom: 15%; + right: 5%; +} +.dhv2-action-card.is-active { + border-color: color-mix(in srgb, var(--accent) 70%, white 30%); + color: #064e3b; + background: rgba(218, 255, 247, 0.82); + box-shadow: + 0 0 0 1px rgba(34,211,238,0.24), + 0 0 48px color-mix(in srgb, var(--accent) 34%, transparent), + 0 18px 38px rgba(20,184,166,0.22); + opacity: 1; + animation: dhv2ActiveFloat 2.4s ease-in-out infinite; +} +.dhv2-action-card i { + width: 42px; + height: 42px; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 12px; + color: var(--accent); + background: var(--accent-soft); + font-style: normal; +} +.dhv2-action-card i svg { + filter: drop-shadow(0 0 8px color-mix(in srgb, var(--accent) 35%, transparent)); +} +.dhv2-action-card div { + min-width: 0; + display: grid; + gap: 4px; +} +.dhv2-action-card span { + color: var(--accent); + font-size: 12px; + font-weight: 900; +} +.dhv2-action-card strong { + min-width: 0; + overflow: hidden; + color: #163657; + font-size: 17px; + line-height: 1.05; + text-overflow: ellipsis; + white-space: nowrap; +} +.dhv2-action-card.is-active strong { + color: #064e3b; + font-size: 21px; +} +.dhv2-action-card em { + min-width: 0; + overflow: hidden; + color: #6c8198; + font-size: 12px; + font-style: normal; + font-weight: 800; + text-overflow: ellipsis; + white-space: nowrap; +} +.dhv2-action-card.is-active em { + color: #0f766e; +} +.dhv2-action-card b { + grid-column: 1 / -1; + height: 7px; + overflow: hidden; + border-radius: 999px; + background: rgba(15,118,110,0.16); +} +.dhv2-action-card b span { + display: block; + height: 100%; + border-radius: inherit; + background: linear-gradient(90deg, #14b8a6, #22d3ee, #2563eb); + animation: dhv2Progress 1.45s ease-in-out infinite alternate; +} +.dhv2-run-panel { + display: grid; + grid-template-rows: auto minmax(0, 1fr); + padding: 0 14px 14px; +} +.dhv2-run-panel > header { + min-height: 72px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 0 4px; +} +.dhv2-run-panel h2 { + font-size: 20px; +} +.dhv2-run-panel p { + margin: 5px 0 0; + color: #5e7894; + font-size: 12px; +} +.dhv2-run-panel header button { + min-height: 34px; + padding: 0 13px; + border: 1px solid rgba(24,126,255,0.2); + border-radius: 999px; + color: #0b63dc; + background: #f3f9ff; + font: inherit; + font-size: 13px; + font-weight: 800; + cursor: pointer; +} +.dhv2-run-table { + min-height: 0; + overflow: auto; +} +.dhv2-run-head, +.dhv2-run-row { + display: grid; + grid-template-columns: 1.28fr 0.78fr 0.82fr 1.16fr 0.9fr 1.18fr 0.62fr; + gap: 10px; + align-items: center; +} +.dhv2-run-head { + min-height: 34px; + padding: 0 12px; + color: #6a8098; + font-size: 12px; + font-weight: 900; +} +.dhv2-run-row { + min-height: 74px; + margin-bottom: 10px; + padding: 10px 12px; + border: 1px solid rgba(109,147,188,0.13); + border-radius: 8px; + color: #243e5e; + background: #fff; + font-size: 12px; +} +.dhv2-run-row.is-active { + border-color: rgba(20,184,166,0.54); + background: linear-gradient(90deg, rgba(231,255,251,0.9), #fff); + box-shadow: inset 4px 0 0 #14b8a6, 0 10px 24px rgba(20,184,166,0.12); +} +.dhv2-run-row span { + min-width: 0; +} +.dhv2-run-name { + display: flex; + align-items: center; + gap: 10px; +} +.dhv2-run-name i { + width: 38px; + height: 38px; + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + border-radius: 999px; + color: #0f8a74; + background: #e8fbf5; + border: 1px solid rgba(20,184,166,0.2); + font-style: normal; +} +.dhv2-run-name strong, +.dhv2-run-row span > strong { + color: #173452; + font-weight: 900; +} +.dhv2-run-row span > em { + display: inline-flex; + padding: 4px 8px; + border-radius: 999px; + color: #075be8; + background: #eef6ff; + font-style: normal; + font-weight: 800; +} +.dhv2-run-row small { + display: block; + color: #6b8198; + font-size: 12px; +} +.dhv2-run-progress { + display: grid; + gap: 5px; +} +.dhv2-run-progress i { + height: 5px; + overflow: hidden; + border-radius: 999px; + background: #d9e5f2; +} +.dhv2-run-progress b { + display: block; + height: 100%; + border-radius: inherit; + background: linear-gradient(90deg, #14b8a6, #2563eb); +} +.dhv2-run-row mark { + display: inline-flex; + justify-content: center; + min-width: 58px; + padding: 6px 9px; + border-radius: 999px; + color: #075be8; + background: #edf6ff; + font-weight: 900; +} +.dhv2-run-row--warning mark { + color: #b45309; + background: #fff4e6; +} +.dhv2-metrics { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 8px; + padding: 10px 16px 0; +} +.dhv2-total, +.dhv2-metric { + min-width: 0; + min-height: 56px; + display: grid; + gap: 3px; + padding: 8px 10px; + border: 1px solid rgba(46,126,235,0.14); + border-radius: 8px; + background: #f8fbff; +} +.dhv2-total { + grid-column: span 2; + grid-template-columns: 24px minmax(0, 1fr) auto; + align-items: center; +} +.dhv2-total svg { + color: #0d63e6; +} +.dhv2-total span, +.dhv2-metric span { + color: #526f8f; + font-size: 12px; + font-weight: 800; +} +.dhv2-total strong, +.dhv2-metric strong { + color: #0d63e6; + font-size: 22px; + line-height: 1; +} +.dhv2-total strong em, +.dhv2-metric strong em { + margin-left: 3px; + color: #526f8f; + font-size: 12px; + font-style: normal; +} +.dhv2-metric--mailIn strong, +.dhv2-metric--handoff strong { color: #079669; } +.dhv2-metric--workOrder strong { color: #ea580c; } +.dhv2-metric--report strong { color: #6d28d9; } +.dhv2-metric--exception strong { color: #dc2626; } +.dhv2-chart { + margin: 9px 16px 0; + padding: 9px 12px 10px; + border: 1px solid rgba(109,147,188,0.13); + border-radius: 8px; +} +.dhv2-chart header { + display: flex; + align-items: center; + justify-content: space-between; + color: #172f52; +} +.dhv2-chart header strong { + font-size: 14px; +} +.dhv2-chart header span { + color: #6d8198; + font-size: 12px; +} +.dhv2-chart > div { + height: 92px; + display: grid; + grid-template-columns: repeat(6, minmax(0, 1fr)); + align-items: end; + gap: 9px; + padding-top: 10px; + border-top: 1px dashed rgba(106,134,166,0.18); +} +.dhv2-bar { + min-width: 0; + height: 100%; + display: grid; + grid-template-rows: minmax(0, 1fr) 12px 14px; + justify-items: center; + gap: 2px; +} +.dhv2-bar i { + align-self: end; + width: 22px; + border-radius: 4px 4px 0 0; + background: linear-gradient(180deg, #2d7dff, #0d5fee); +} +.dhv2-bar--mailIn i { background: linear-gradient(180deg, #16c784, #059669); } +.dhv2-bar--inspection i { background: linear-gradient(180deg, #18c7d4, #0891b2); } +.dhv2-bar--workOrder i { background: linear-gradient(180deg, #ff9f1c, #ea580c); } +.dhv2-bar--report i { background: linear-gradient(180deg, #8b5cf6, #6d28d9); } +.dhv2-bar--handoff i { background: linear-gradient(180deg, #ef4444, #dc2626); } +.dhv2-bar strong { + color: #172f52; + font-size: 11px; +} +.dhv2-bar em { + max-width: 100%; + overflow: hidden; + color: #6d8198; + font-size: 10px; + font-style: normal; + text-overflow: ellipsis; + white-space: nowrap; +} +.dhv2-report { + display: grid; + grid-template-rows: 54px auto minmax(0, 1fr); +} +.dhv2-report .dhv2-panel-head > span { + padding: 6px 12px; + border-radius: 999px; + color: #a65c00; + background: #fff1dc; + font-size: 13px; + font-weight: 900; +} +.dhv2-report-time { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 8px; + padding: 12px 16px 8px; +} +.dhv2-report-time label { + min-width: 0; + display: grid; + grid-template-columns: auto minmax(0, 1fr); + gap: 8px; + align-items: center; + color: #526f8f; + font-size: 13px; + font-weight: 800; +} +.dhv2-report-time input { + min-width: 0; + height: 32px; + padding: 0 10px; + border: 1px solid rgba(46,126,235,0.14); + border-radius: 8px; + color: #173452; + background: #fbfdff; + font: inherit; + font-weight: 800; +} +.dhv2-report-time button, +.dhv2-report-actions button { + min-height: 34px; + border: 1px solid rgba(46,126,235,0.14); + border-radius: 8px; + color: #0b63dc; + background: #f8fbff; + font: inherit; + font-size: 13px; + font-weight: 900; + cursor: pointer; +} +.dhv2-report-time button:disabled, +.dhv2-report-actions button:disabled { + opacity: 0.5; + cursor: not-allowed; +} +.dhv2-report-actions { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 8px; + padding: 4px 16px 14px; + align-content: end; +} +.dhv2-report-actions .dhv2-primary { + grid-column: span 1; + min-height: 40px; +} +.dhv2-ai { + display: grid; + grid-template-rows: 54px auto minmax(0, 1fr) auto; +} +.dhv2-ai .dhv2-panel-head span { + color: #637b95; + font-size: 13px; +} +.dhv2-ai-tabs { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + margin: 12px 16px 8px; + overflow: hidden; + border: 1px solid rgba(46,126,235,0.14); + border-radius: 8px; +} +.dhv2-ai-tabs span { + min-height: 30px; + display: inline-flex; + align-items: center; + justify-content: center; + color: #526f8f; + background: #f8fbff; + font-size: 12px; + font-weight: 900; +} +.dhv2-ai-tabs .active { + color: #075be8; + background: #fff; + box-shadow: inset 0 -2px 0 #075be8; +} +.dhv2-ai-feed { + min-height: 0; + overflow: auto; + display: grid; + align-content: start; + gap: 10px; + padding: 0 16px; +} +.dhv2-ai-message { + max-width: 86%; + display: grid; + grid-template-columns: 28px minmax(0, 1fr); + gap: 8px; + align-items: start; +} +.dhv2-ai-message img { + width: 28px; + height: 28px; + object-fit: cover; + border-radius: 999px; +} +.dhv2-ai-message p { + margin: 0; + padding: 10px 12px; + border: 1px solid rgba(46,126,235,0.13); + border-radius: 8px; + color: #173452; + background: #f5f9ff; + font-size: 13px; + line-height: 1.45; +} +.dhv2-ai-message--user { + justify-self: end; + grid-template-columns: minmax(0, 1fr); +} +.dhv2-ai-message--user p { + color: #0f766e; + background: #e9fbf8; + border-color: rgba(20,184,166,0.18); +} +.dhv2-ai-input { + min-height: 38px; + display: flex; + align-items: center; + justify-content: space-between; + margin: 10px 16px 14px; + padding: 0 12px; + border: 1px solid rgba(46,126,235,0.14); + border-radius: 8px; + color: #7a90a8; + background: #fff; + font: inherit; + font-size: 13px; + cursor: pointer; +} +.dhv2-ai-input svg { + color: #075be8; +} +@keyframes dhv2ActiveFloat { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-3px); } +} +@keyframes dhv2Progress { + 0% { filter: brightness(1); transform: translateX(-2px); } + 100% { filter: brightness(1.25); transform: translateX(2px); } +} +@media (max-width: 1500px) { + .dhv2-home { + grid-template-columns: 360px minmax(0, 1fr) 420px; + } + .dhv2-center { + grid-template-rows: 456px minmax(0, 1fr); + } + .dhv2-left { + grid-template-rows: 238px minmax(0, 1fr); + } +} +@media (max-width: 1180px) { + .dhv2-home { + grid-template-columns: 1fr; + overflow: auto; + } + .dhv2-left, + .dhv2-center, + .dhv2-right { + min-height: 520px; + } +} +@media (prefers-reduced-motion: reduce) { + .dhv2-action-card.is-active, + .dhv2-action-card b span { + animation: none !important; + } +} + +.de-right-panels, +.de-dashboard--compact .de-right-panels { + grid-template-rows: 420px 214px minmax(0, 1fr) !important; +} +@media (max-width: 1380px) { + .de-right-panels, + .de-dashboard--compact .de-right-panels { + grid-template-rows: 400px 206px minmax(0, 1fr) !important; + } +} + +/* Digital home v2 enterprise polish */ +.de-shell { + background: #f5f8fc; +} +.de-header { + height: 56px !important; + background: linear-gradient(90deg, #1e3a8a 0%, #1d4ed8 58%, #2563eb 100%) !important; + box-shadow: 0 1px 10px rgba(15, 23, 42, 0.18) !important; +} +.de-header-logo { + background: rgba(255, 255, 255, 0.14); + border: 1px solid rgba(255, 255, 255, 0.22); + box-shadow: none; +} +.de-header-title { + font-size: 21px; + font-weight: 750; + letter-spacing: 0; + text-shadow: none; +} +.de-nav-btn { + height: 56px !important; + min-width: 108px; + color: rgba(255, 255, 255, 0.82); + font-size: 14px; + font-weight: 600; +} +.de-nav-btn.active { + color: #fff; + background: rgba(255, 255, 255, 0.13); + box-shadow: inset 0 -3px 0 rgba(255, 255, 255, 0.88); +} +.de-header-icon { + background: rgba(255, 255, 255, 0.1); + box-shadow: none; +} +.dhv2-home { + --dhv2-primary: #2563eb; + --dhv2-primary-dark: #1d4ed8; + --dhv2-auto: #14b8a6; + --dhv2-success: #10b981; + --dhv2-warning: #f59e0b; + --dhv2-danger: #ef4444; + --dhv2-bg: #f5f8fc; + --dhv2-card: #ffffff; + --dhv2-text: #0f172a; + --dhv2-muted: #64748b; + --dhv2-border: #e2e8f0; + --dhv2-soft-blue: #eff6ff; + background: var(--dhv2-bg); + color: var(--dhv2-text); + gap: 14px; +} +.dhv2-panel, +.dhv2-work-panel, +.dhv2-run-panel { + border: 1px solid var(--dhv2-border); + border-radius: 12px; + background: var(--dhv2-card); + box-shadow: 0 4px 12px rgba(15, 23, 42, 0.06); +} +.dhv2-panel-head { + min-height: 52px; + border-bottom: 1px solid var(--dhv2-border); +} +.dhv2-panel-head h2, +.dhv2-run-panel h2 { + color: var(--dhv2-text); + font-size: 20px; + font-weight: 650; +} +.dhv2-panel-head button, +.dhv2-run-panel header button { + border: 1px solid #bfdbfe; + color: var(--dhv2-primary-dark); + background: #f8fafc; + box-shadow: none; + font-weight: 650; +} +.dhv2-employee-name strong { + color: var(--dhv2-text); + font-weight: 700; +} +.dhv2-employee-name span { + border-color: #99f6e4; + color: #0f766e; + background: #f0fdfa; + font-weight: 650; +} +.dhv2-employee-info dt, +.dhv2-task-main small, +.dhv2-run-panel p, +.dhv2-run-head, +.dhv2-ai .dhv2-panel-head span { + color: var(--dhv2-muted); +} +.dhv2-task-tabs { + border-color: var(--dhv2-border); + background: #f8fafc; +} +.dhv2-task-tabs button { + color: #475569; + background: transparent; + font-weight: 650; +} +.dhv2-task-tabs button.active { + color: var(--dhv2-primary); + background: #fff; + box-shadow: inset 0 -2px 0 var(--dhv2-primary); +} +.dhv2-task-row { + min-height: 82px; + grid-template-columns: 20px minmax(0, 1fr); + gap: 10px 12px; + align-items: start; + padding: 11px 0; + border-bottom-color: var(--dhv2-border); +} +.dhv2-task-row input { + margin-top: 4px; + accent-color: var(--dhv2-primary); +} +.dhv2-task-main { + gap: 4px; +} +.dhv2-task-main strong { + color: var(--dhv2-text); + font-size: 15px; + font-weight: 650; +} +.dhv2-task-meta { + min-width: 0; + display: flex; + align-items: center; + gap: 8px; +} +.dhv2-task-chip { + min-height: 20px; + padding: 2px 7px; + border-radius: 6px; + font-weight: 600; +} +.dhv2-task-chip--time { + color: #1d4ed8; + background: #eff6ff; +} +.dhv2-task-chip--trigger { + color: #0f766e; + background: #ecfdf5; +} +.dhv2-task-chip--delegate { + color: #92400e; + background: #fffbeb; +} +.dhv2-task-row em { + min-width: 0; + overflow: hidden; + padding: 0; + color: var(--dhv2-muted); + background: transparent; + text-overflow: ellipsis; + white-space: nowrap; + font-weight: 500; +} +.dhv2-primary { + background: linear-gradient(180deg, var(--dhv2-primary), var(--dhv2-primary-dark)); + box-shadow: 0 8px 18px rgba(37, 99, 235, 0.16); + font-weight: 700; +} +.dhv2-link-button { + color: var(--dhv2-primary-dark); + font-weight: 650; +} +.dhv2-work-tabs { + border-bottom-color: var(--dhv2-border); +} +.dhv2-work-tabs button { + color: #475569; + font-size: 16px; + font-weight: 650; +} +.dhv2-work-tabs button.active { + color: var(--dhv2-primary); + box-shadow: inset 0 -3px 0 var(--dhv2-primary); +} +.dhv2-stage::before { + background: + linear-gradient(90deg, rgba(245, 248, 252, 0.76) 0%, rgba(245, 248, 252, 0.58) 31%, rgba(245, 248, 252, 0.18) 48%, rgba(245, 248, 252, 0.2) 58%, rgba(245, 248, 252, 0.6) 74%, rgba(245, 248, 252, 0.78) 100%), + radial-gradient(circle at 50% 60%, rgba(255,255,255,0) 0 24%, rgba(245,248,252,0.22) 55%, rgba(245,248,252,0.38) 100%); +} +.dhv2-stage-image { + opacity: 0.44; + filter: saturate(0.78) brightness(1.06); +} +.dhv2-action-card { + --accent: #64748b; + --accent-soft: rgba(100, 116, 139, 0.08); + border: 1px solid var(--dhv2-border); + border-radius: 10px; + color: #334155; + background: rgba(255, 255, 255, 0.9); + box-shadow: 0 4px 12px rgba(15, 23, 42, 0.06); + opacity: 0.74; + backdrop-filter: blur(8px); +} +.dhv2-action-card--phone, +.dhv2-action-card--report, +.dhv2-action-card--workOrder { + --accent: #2563eb; + --accent-soft: rgba(37, 99, 235, 0.08); +} +.dhv2-action-card--inspection, +.dhv2-action-card--mail { + --accent: #14b8a6; + --accent-soft: rgba(20, 184, 166, 0.1); +} +.dhv2-action-card--handoff { + --accent: #f59e0b; + --accent-soft: rgba(245, 158, 11, 0.12); +} +.dhv2-action-card.is-active { + border-color: rgba(20, 184, 166, 0.5); + background: rgba(240, 253, 250, 0.92); + box-shadow: 0 0 0 1px rgba(20, 184, 166, 0.12), 0 8px 24px rgba(20, 184, 166, 0.16); +} +.dhv2-action-card i { + border-radius: 10px; +} +.dhv2-action-card i svg { + filter: none; +} +.dhv2-action-card strong { + color: #334155; + font-weight: 650; +} +.dhv2-action-card.is-active strong { + color: #0f766e; + font-weight: 750; +} +.dhv2-action-card em, +.dhv2-action-card.is-active em { + color: var(--dhv2-muted); + font-weight: 550; +} +.dhv2-action-card span { + color: #0f766e; + font-weight: 650; +} +.dhv2-action-card b { + height: 6px; + background: rgba(20, 184, 166, 0.14); +} +.dhv2-action-card b span { + background: linear-gradient(90deg, #14b8a6, #2563eb); +} +.dhv2-run-row { + border-color: var(--dhv2-border); + color: #334155; + box-shadow: none; +} +.dhv2-run-row.is-active { + border-color: rgba(20, 184, 166, 0.45); + background: linear-gradient(90deg, rgba(240, 253, 250, 0.88), #fff); + box-shadow: inset 4px 0 0 var(--dhv2-auto), 0 4px 14px rgba(20, 184, 166, 0.1); +} +.dhv2-run-name strong, +.dhv2-run-row span > strong { + color: var(--dhv2-text); + font-weight: 650; +} +.dhv2-run-row span > em { + color: var(--dhv2-primary-dark); + background: #eff6ff; + font-weight: 650; +} +.dhv2-run-row mark { + color: var(--dhv2-primary-dark); + background: #eff6ff; + font-weight: 650; +} +.dhv2-run-row--warning mark { + color: #92400e; + background: #fffbeb; +} +.dhv2-metrics { + gap: 8px; +} +.dhv2-total, +.dhv2-metric { + border-color: var(--dhv2-border); + background: #fff; +} +.dhv2-total span, +.dhv2-metric span { + color: var(--dhv2-muted); + font-weight: 600; +} +.dhv2-total strong, +.dhv2-metric strong { + color: #1e293b; + font-weight: 750; + font-variant-numeric: tabular-nums; +} +.dhv2-total strong { + color: var(--dhv2-primary-dark); +} +.dhv2-metric--mailIn strong, +.dhv2-metric--mailOut strong, +.dhv2-metric--inspection strong { + color: #0f766e; +} +.dhv2-metric--handoff strong, +.dhv2-metric--workOrder strong { + color: #92400e; +} +.dhv2-metric--exception strong { + color: var(--dhv2-danger); +} +.dhv2-chart { + border-color: var(--dhv2-border); +} +.dhv2-chart header strong { + color: var(--dhv2-text); + font-weight: 650; +} +.dhv2-bar i { + background: linear-gradient(180deg, #60a5fa, #2563eb); +} +.dhv2-bar--mailIn i, +.dhv2-bar--inspection i { + background: linear-gradient(180deg, #2dd4bf, #14b8a6); +} +.dhv2-bar--workOrder i, +.dhv2-bar--handoff i { + background: linear-gradient(180deg, #fbbf24, #f59e0b); +} +.dhv2-bar em, +.dhv2-bar strong { + color: #475569; +} +.dhv2-report .dhv2-panel-head > span { + color: #92400e; + background: #fffbeb; + font-weight: 650; +} +.dhv2-report-time button, +.dhv2-report-actions button { + border-color: var(--dhv2-border); + color: #475569; + background: #fff; + box-shadow: none; + font-weight: 650; +} +.dhv2-report-actions .dhv2-primary { + color: #fff; + background: linear-gradient(180deg, var(--dhv2-primary), var(--dhv2-primary-dark)); +} +.dhv2-ai-tabs { + border-color: var(--dhv2-border); + background: #f8fafc; +} +.dhv2-ai-tabs span { + color: #64748b; + background: transparent; + font-weight: 650; +} +.dhv2-ai-tabs .active { + color: var(--dhv2-primary); + background: #fff; + box-shadow: inset 0 -2px 0 var(--dhv2-primary); +} +.dhv2-ai-message p, +.dhv2-ai-input { + border-color: var(--dhv2-border); + color: #334155; + background: #fff; +} +.dhv2-ai-message--user p { + color: #0f766e; + background: #f0fdfa; +} + +.dhv2-action-map { + pointer-events: none; +} +.dhv2-action-map:not(.is-ready) .dhv2-action-card { + opacity: 0; +} +.dhv2-action-card, +.dhv2-action-card--phone, +.dhv2-action-card--inspection, +.dhv2-action-card--report, +.dhv2-action-card--mail, +.dhv2-action-card--workOrder, +.dhv2-action-card--handoff { + top: auto; + right: auto; + bottom: auto; + left: auto; + width: auto; + min-height: 0; +} +.dhv2-action-card { + appearance: none; + box-sizing: border-box; + overflow: hidden; + border: 1px solid var(--dhv2-border); + text-align: left; + font: inherit; + cursor: pointer; + pointer-events: auto; + transform-origin: center; + will-change: left, top, width, height, opacity, transform; + transition: + border-color 180ms ease, + background 180ms ease, + box-shadow 180ms ease, + filter 180ms ease; +} +.dhv2-action-card::after { + content: ""; + position: absolute; + inset: -1px; + z-index: 0; + border-radius: inherit; + opacity: 0; + pointer-events: none; + background: radial-gradient(circle at var(--spot-x, 50%) var(--spot-y, 50%), rgba(37, 99, 235, 0.14), transparent 145px); + transition: opacity 180ms ease; +} +.dhv2-action-card.is-active::after { + opacity: 1; + background: radial-gradient(circle at var(--spot-x, 72%) var(--spot-y, 34%), rgba(20, 184, 166, 0.18), transparent 170px); +} +.dhv2-action-card:hover::after, +.dhv2-action-card:focus-visible::after { + opacity: 1; +} +.dhv2-action-card > * { + position: relative; + z-index: 1; +} +.dhv2-action-card:focus-visible { + outline: 2px solid rgba(37, 99, 235, 0.36); + outline-offset: 2px; +} +.dhv2-action-card.is-active { + animation: none; + border-color: rgba(20, 184, 166, 0.58); + box-shadow: 0 0 0 1px rgba(20, 184, 166, 0.12), 0 10px 28px rgba(20, 184, 166, 0.18); +} +.dhv2-action-card.is-active strong { + font-size: 20px; + line-height: 1.1; +} +.dhv2-action-map:has(.dhv2-action-card:hover) .dhv2-action-card:not(:hover):not(.is-active) { + filter: saturate(0.82) brightness(0.98); + box-shadow: 0 2px 8px rgba(15, 23, 42, 0.04); +} +@media (prefers-reduced-motion: reduce) { + .dhv2-action-card { + transition: none !important; + transform: none !important; + } + .dhv2-action-card::after { + transition: none !important; + } +} + +/* Digital home v3 Swiss / Yves Klein Blue pass */ +.de-shell { + background: #f7f8fb !important; +} + +.de-header { + height: 60px !important; + color: #0f172a !important; + background: rgba(255, 255, 255, 0.96) !important; + border-bottom: 1px solid #d8dee8 !important; + box-shadow: 0 1px 0 rgba(15, 23, 42, 0.04), 0 10px 24px rgba(15, 23, 42, 0.04) !important; + backdrop-filter: blur(14px); +} + +.de-header-logo { + color: #fff !important; + background: #002fa7 !important; + border-color: #002fa7 !important; + box-shadow: 0 10px 18px rgba(0, 47, 167, 0.18) !important; +} + +.de-header-title { + color: #0f172a !important; + font-size: 22px !important; + font-weight: 800 !important; + letter-spacing: 0 !important; +} + +.de-nav-btn { + height: 60px !important; + min-width: 112px !important; + color: #334155 !important; + background: transparent !important; + border-radius: 0 !important; + border-color: transparent !important; + box-shadow: none !important; + font-size: 14px !important; + font-weight: 700 !important; +} + +.de-nav-btn:hover:not(:disabled) { + color: #002fa7 !important; + background: #f2f6ff !important; +} + +.de-nav-btn.active { + color: #002fa7 !important; + background: #f2f6ff !important; + box-shadow: inset 0 -3px 0 #002fa7 !important; +} + +.de-nav-btn--disabled { + color: #64748b !important; + opacity: 0.72; +} + +.de-header-icon { + color: #334155 !important; + background: #f7f8fb !important; + border: 1px solid #d8dee8 !important; +} + +.de-header-icon:hover { + color: #002fa7 !important; + background: #eef4ff !important; + transform: translateY(-1px); +} + +.de-header-user { + color: #0f172a !important; +} + +.de-header-user strong { + color: #0f172a !important; +} + +.de-header-user span { + color: #059669 !important; +} + +.dhv2-home { + --dhv2-primary: #002fa7; + --dhv2-primary-dark: #00247d; + --dhv2-primary-soft: #eef4ff; + --dhv2-auto: #0f9f8f; + --dhv2-auto-2: #14b8a6; + --dhv2-phone: #4f46e5; + --dhv2-work: #475569; + --dhv2-report-tone: #64748b; + --dhv2-success: #059669; + --dhv2-warning: #d97706; + --dhv2-warning-soft: #fff7ed; + --dhv2-danger: #d92d20; + --dhv2-bg: #f7f8fb; + --dhv2-card: #ffffff; + --dhv2-text: #0f172a; + --dhv2-muted: #64748b; + --dhv2-border: #d8dee8; + --dhv2-hairline: rgba(15, 23, 42, 0.08); + background: var(--dhv2-bg) !important; + color: var(--dhv2-text); +} + +.dhv2-panel, +.dhv2-work-panel, +.dhv2-run-panel { + border-color: var(--dhv2-border) !important; + border-radius: 10px !important; + background: var(--dhv2-card) !important; + box-shadow: 0 8px 24px rgba(15, 23, 42, 0.05) !important; + transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease; +} + +.dhv2-panel:hover, +.dhv2-run-panel:hover, +.dhv2-work-panel:hover { + border-color: rgba(0, 47, 167, 0.2) !important; + box-shadow: 0 12px 30px rgba(15, 23, 42, 0.07) !important; +} + +.dhv2-panel-head, +.dhv2-work-tabs { + min-height: 52px !important; + border-bottom-color: var(--dhv2-border) !important; +} + +.dhv2-panel-head h2, +.dhv2-run-panel h2 { + color: var(--dhv2-text) !important; + font-size: 20px !important; + font-weight: 780 !important; +} + +.dhv2-panel-head button, +.dhv2-run-panel header button { + border-color: rgba(0, 47, 167, 0.18) !important; + color: var(--dhv2-primary) !important; + background: #fff !important; + transition: transform 160ms ease, border-color 160ms ease, background 160ms ease, box-shadow 160ms ease; +} + +.dhv2-panel-head button:hover, +.dhv2-run-panel header button:hover { + border-color: rgba(0, 47, 167, 0.32) !important; + background: var(--dhv2-primary-soft) !important; + box-shadow: 0 8px 18px rgba(0, 47, 167, 0.1) !important; + transform: translateY(-1px); +} + +.dhv2-task-tabs, +.dhv2-ai-tabs { + border-color: var(--dhv2-border) !important; + background: #f8fafc !important; +} + +.dhv2-task-tabs button, +.dhv2-ai-tabs span { + color: #475569 !important; +} + +.dhv2-task-tabs button.active, +.dhv2-ai-tabs .active, +.dhv2-work-tabs button.active { + color: var(--dhv2-primary) !important; + box-shadow: inset 0 -2px 0 var(--dhv2-primary) !important; +} + +.dhv2-work-tabs button { + color: #475569 !important; + font-weight: 720 !important; +} + +.dhv2-date-field, +.dhv2-report-time input, +.dhv2-report-time button, +.dhv2-report-actions button, +.dhv2-ai-input { + border-color: var(--dhv2-border) !important; +} + +.dhv2-primary { + position: relative; + overflow: hidden; + background: linear-gradient(180deg, #0038c8, #002fa7 58%, #00247d) !important; + box-shadow: 0 10px 22px rgba(0, 47, 167, 0.22) !important; + white-space: nowrap; +} + +.dhv2-primary::after, +.de-btn-primary::after { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient(110deg, transparent 0%, rgba(255,255,255,0.2) 38%, rgba(255,255,255,0.45) 50%, transparent 62%); + transform: translateX(-120%); + animation: dhv2ButtonSweep 2.2s linear infinite; + pointer-events: none; +} + +.dhv2-link-button { + color: var(--dhv2-primary) !important; +} + +.dhv2-employee-name span { + border-color: rgba(5, 150, 105, 0.26) !important; + color: #047857 !important; + background: #ecfdf5 !important; + animation: dhv2StatusPulse 2.4s ease-in-out infinite; +} + +.dhv2-stage::before { + background: + linear-gradient(90deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0.02) 16%, rgba(255,255,255,0) 34%, rgba(255,255,255,0) 66%, rgba(255,255,255,0.03) 84%, rgba(255,255,255,0.12) 100%) !important; +} + +.dhv2-stage-image { + opacity: 1 !important; + filter: saturate(1.22) brightness(1.03) contrast(1.14) !important; +} + +.dhv2-action-card { + --accent: #475569; + --accent-soft: rgba(71, 85, 105, 0.1); + border-color: rgba(216, 222, 232, 0.92) !important; + border-radius: 10px !important; + color: #334155 !important; + background: rgba(255, 255, 255, 0.86) !important; + box-shadow: 0 10px 24px rgba(15, 23, 42, 0.08) !important; + backdrop-filter: blur(12px) saturate(1.08) !important; +} + +.dhv2-action-card--phone { + --accent: #4f46e5; + --accent-soft: rgba(79, 70, 229, 0.12); +} + +.dhv2-action-card--mail, +.dhv2-action-card--inspection { + --accent: #0f9f8f; + --accent-soft: rgba(15, 159, 143, 0.12); +} + +.dhv2-action-card--workOrder { + --accent: #475569; + --accent-soft: rgba(71, 85, 105, 0.1); +} + +.dhv2-action-card--report { + --accent: #64748b; + --accent-soft: rgba(100, 116, 139, 0.1); +} + +.dhv2-action-card--handoff { + --accent: #d97706; + --accent-soft: rgba(217, 119, 6, 0.12); +} + +.dhv2-action-card i { + color: var(--accent) !important; + background: var(--accent-soft) !important; +} + +.dhv2-action-card strong { + color: #334155 !important; + font-weight: 760 !important; +} + +.dhv2-action-card em { + color: #64748b !important; +} + +.dhv2-action-card span { + color: var(--accent) !important; +} + +.dhv2-action-card::before { + content: ""; + position: absolute; + inset: 0; + border-radius: inherit; + background: linear-gradient(100deg, transparent 0 36%, rgba(255,255,255,0.46) 48%, transparent 60%); + opacity: 0; + transform: translateX(-115%); + pointer-events: none; +} + +.dhv2-action-card:hover::before, +.dhv2-action-card.is-active::before { + opacity: 1; + animation: dhv2CardScan 1.8s linear infinite; +} + +.dhv2-action-card.is-active { + border-color: rgba(0, 47, 167, 0.52) !important; + color: var(--dhv2-primary) !important; + background: linear-gradient(135deg, rgba(238,244,255,0.98), rgba(255,255,255,0.92)) !important; + box-shadow: + 0 0 0 1px rgba(0, 47, 167, 0.14), + 0 0 34px rgba(0, 47, 167, 0.16), + 0 16px 34px rgba(0, 47, 167, 0.2) !important; +} + +.dhv2-action-card.is-active i { + color: #fff !important; + background: #002fa7 !important; + box-shadow: 0 8px 18px rgba(0, 47, 167, 0.18); +} + +.dhv2-action-card.is-active strong, +.dhv2-action-card.is-active span { + color: var(--dhv2-primary) !important; +} + +.dhv2-action-card.is-active em { + color: #334155 !important; +} + +.dhv2-action-card::after { + background: radial-gradient(circle at var(--spot-x, 50%) var(--spot-y, 50%), rgba(0, 47, 167, 0.16), transparent 150px) !important; +} + +.dhv2-action-card.is-active::after { + background: radial-gradient(circle at var(--spot-x, 72%) var(--spot-y, 34%), rgba(0, 47, 167, 0.2), transparent 180px) !important; +} + +.dhv2-motion-progress { + position: relative; + display: block; + height: 6px; + overflow: hidden; + border-radius: 999px; + background: #e4eaf3; +} + +.dhv2-motion-progress > span { + position: relative; + display: block; + height: 100%; + min-width: 8px; + overflow: hidden; + border-radius: inherit; + background: linear-gradient(90deg, #0f9f8f, #14b8a6 38%, #002fa7 100%); + transition: width 420ms ease; +} + +.dhv2-motion-progress > span::after { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient(100deg, transparent 0%, rgba(255,255,255,0.68) 48%, transparent 100%); + transform: translateX(-110%); + animation: dhv2ProgressSweep 1.08s linear infinite; +} + +.dhv2-action-progress { + grid-column: 1 / -1; + height: 7px; + background: rgba(0, 47, 167, 0.12); +} + +.dhv2-run-progress .dhv2-motion-progress { + height: 5px; +} + +.dhv2-run-row { + border-color: var(--dhv2-border) !important; + transition: transform 170ms ease, border-color 170ms ease, box-shadow 170ms ease, background 170ms ease; +} + +.dhv2-run-row:hover { + transform: translateY(-1px); + border-color: rgba(0, 47, 167, 0.22) !important; + box-shadow: 0 10px 22px rgba(15, 23, 42, 0.07) !important; +} + +.dhv2-run-row.is-active { + border-color: rgba(0, 47, 167, 0.36) !important; + background: linear-gradient(90deg, rgba(238,244,255,0.96), #fff) !important; + box-shadow: inset 4px 0 0 #002fa7, 0 10px 24px rgba(0, 47, 167, 0.12) !important; +} + +.dhv2-run-row.is-active .dhv2-run-name i { + color: #fff; + background: #002fa7; + border-color: #002fa7; +} + +.dhv2-run-row mark { + color: var(--dhv2-primary) !important; + background: var(--dhv2-primary-soft) !important; +} + +.dhv2-run-row--warning mark { + color: var(--dhv2-warning) !important; + background: var(--dhv2-warning-soft) !important; +} + +.dhv2-total, +.dhv2-metric { + position: relative; + overflow: hidden; + border-color: var(--dhv2-border) !important; + background: #fff !important; + transition: transform 170ms ease, border-color 170ms ease, box-shadow 170ms ease; +} + +.dhv2-total::after, +.dhv2-metric::after { + content: ""; + position: absolute; + inset: 0; + opacity: 0; + background: radial-gradient(circle at 78% 22%, rgba(0, 47, 167, 0.1), transparent 88px); + pointer-events: none; + transition: opacity 180ms ease; +} + +.dhv2-total:hover, +.dhv2-metric:hover { + transform: translateY(-2px); + border-color: rgba(0, 47, 167, 0.22) !important; + box-shadow: 0 10px 22px rgba(0, 47, 167, 0.08) !important; +} + +.dhv2-total:hover::after, +.dhv2-metric:hover::after { + opacity: 1; +} + +.dhv2-animated-number { + display: inline-block; + min-width: 1ch; + color: inherit; + font-variant-numeric: tabular-nums; +} + +.dhv2-total strong, +.dhv2-metric strong, +.de-report-preview-summary strong { + color: var(--dhv2-primary) !important; + font-variant-numeric: tabular-nums; +} + +.dhv2-metric--mailIn strong, +.dhv2-metric--mailOut strong, +.dhv2-metric--inspection strong { + color: var(--dhv2-auto) !important; +} + +.dhv2-metric--phone strong { + color: var(--dhv2-phone) !important; +} + +.dhv2-metric--workOrder strong, +.dhv2-metric--report strong { + color: var(--dhv2-work) !important; +} + +.dhv2-metric--handoff strong { + color: var(--dhv2-warning) !important; +} + +.dhv2-metric--exception { + animation: dhv2DangerPulse 2.8s ease-in-out infinite; +} + +.dhv2-metric--exception strong { + color: var(--dhv2-danger) !important; +} + +.dhv2-chart { + border-color: var(--dhv2-border) !important; + background: #fff; +} + +.dhv2-bar i { + position: relative; + overflow: hidden; + background: linear-gradient(180deg, #3563ff, #002fa7) !important; + animation: dhv2BarRise 520ms ease both; +} + +.dhv2-bar i::after { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient(180deg, rgba(255,255,255,0.56), transparent 42%); + transform: translateY(-100%); + animation: dhv2BarSweep 1.3s linear infinite; +} + +.dhv2-bar--mailIn i, +.dhv2-bar--inspection i { + background: linear-gradient(180deg, #20c7b6, #0f9f8f) !important; +} + +.dhv2-bar--phone i { + background: linear-gradient(180deg, #756cff, #4f46e5) !important; +} + +.dhv2-bar--workOrder i, +.dhv2-bar--report i { + background: linear-gradient(180deg, #64748b, #475569) !important; +} + +.dhv2-bar--handoff i { + background: linear-gradient(180deg, #f59e0b, #d97706) !important; +} + +.dhv2-report { + grid-template-rows: 44px 40px 46px !important; +} + +.dhv2-right { + grid-template-rows: 430px 154px minmax(274px, 1fr) !important; +} + +.dhv2-report .dhv2-panel-head { + min-height: 44px !important; + padding-block: 0 !important; +} + +.dhv2-report .dhv2-panel-head > span { + color: var(--dhv2-warning) !important; + background: var(--dhv2-warning-soft) !important; + animation: dhv2BadgeBreathe 2.4s ease-in-out infinite; + padding: 4px 10px !important; +} + +.dhv2-report .dhv2-panel-head > span.is-ready { + color: #047857 !important; + background: #ecfdf5 !important; + animation: none; +} + +.dhv2-report-time { + align-items: center; + padding: 5px 16px 2px !important; +} + +.dhv2-report-time input, +.dhv2-report-time button, +.dhv2-report-actions button { + height: 31px; + min-height: 31px !important; + white-space: nowrap; +} + +.dhv2-report-actions { + grid-template-columns: 1.38fr 0.88fr 0.82fr 0.98fr !important; + align-items: center !important; + gap: 8px !important; + padding: 4px 16px 9px !important; +} + +.dhv2-report-actions button { + min-width: 0; + padding: 0 9px; + overflow: hidden; + text-overflow: ellipsis; + color: #475569 !important; + background: #fff !important; + box-shadow: none !important; + font-size: 12px !important; + font-weight: 720 !important; +} + +.dhv2-report-actions .dhv2-primary { + color: #fff !important; + background: linear-gradient(180deg, #0038c8, #002fa7 58%, #00247d) !important; +} + +.dhv2-ai-feed { + animation: dhv2FadeSlideIn 360ms ease both; +} + +.dhv2-ai-message { + animation: dhv2MessageIn 360ms ease both; +} + +.dhv2-ai-message:nth-child(2) { + animation-delay: 80ms; +} + +.dhv2-ai-input { + position: relative; + overflow: hidden; + transition: border-color 170ms ease, box-shadow 170ms ease, transform 170ms ease; +} + +.dhv2-ai-input:hover, +.dhv2-ai-input:focus-visible { + border-color: rgba(0, 47, 167, 0.34) !important; + box-shadow: 0 0 0 3px rgba(0, 47, 167, 0.08); + transform: translateY(-1px); +} + +.dhv2-ai-input svg { + color: var(--dhv2-primary) !important; +} + +.dhv2-overlay { + position: fixed; + inset: 0; + z-index: 360; + display: flex; + align-items: center; + justify-content: center; + padding: 28px; + background: rgba(15, 23, 42, 0.24); + backdrop-filter: blur(8px); + animation: dhv2OverlayIn 180ms ease both; +} + +.dhv2-overlay--drawer { + justify-content: flex-end; + padding: 0; +} + +.dhv2-overlay-surface { + width: min(720px, calc(100vw - 56px)); + max-height: min(760px, calc(100vh - 56px)); + display: grid !important; + grid-template-rows: auto minmax(0, 1fr) auto !important; + gap: 0 !important; + overflow: hidden; + padding: 0 !important; + border: 1px solid rgba(216, 222, 232, 0.96) !important; + border-radius: 12px !important; + background: #fff !important; + box-shadow: 0 24px 70px rgba(15, 23, 42, 0.22) !important; + animation: dhv2ModalIn 260ms cubic-bezier(0.2, 0.8, 0.2, 1) both; +} + +.dhv2-overlay-surface--small, +.dhv2-overlay-surface.de-profile-settings-modal, +.dhv2-overlay-surface.de-event-detail-modal { + width: min(560px, calc(100vw - 56px)) !important; +} + +.dhv2-overlay-surface--medium, +.dhv2-overlay-surface.de-plan-action-modal { + width: min(660px, calc(100vw - 56px)) !important; +} + +.dhv2-overlay-surface--wide, +.dhv2-overlay-surface.de-event-history-modal { + width: min(1080px, calc(100vw - 56px)) !important; +} + +.dhv2-overlay-surface--large, +.dhv2-overlay-surface.de-task-manager-modal, +.dhv2-overlay-surface.de-workday-guide-modal { + width: min(1120px, calc(100vw - 56px)) !important; + max-height: min(790px, calc(100vh - 48px)) !important; +} + +.dhv2-overlay-surface--document, +.dhv2-overlay-surface.de-report-preview-modal { + width: min(780px, calc(100vw - 56px)) !important; +} + +.dhv2-overlay-surface--drawer, +.dhv2-overlay-surface.dhv2-plan-chat-drawer { + width: min(720px, calc(100vw - 28px)) !important; + height: 100vh !important; + max-height: 100vh !important; + border-radius: 0 !important; + border-top: 0 !important; + border-right: 0 !important; + border-bottom: 0 !important; + animation: dhv2DrawerIn 300ms cubic-bezier(0.2, 0.8, 0.2, 1) both; +} + +.dhv2-overlay-head { + min-height: 76px; + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 16px; + align-items: start; + padding: 18px 20px 14px; + border-bottom: 1px solid var(--dhv2-border, #d8dee8); + background: linear-gradient(180deg, #fff, #f8fafc); +} + +.dhv2-overlay-head-actions { + min-width: 0; + align-self: center; +} + +.dhv2-overlay-eyebrow { + display: inline-flex; + margin-bottom: 5px; + color: #002fa7; + font-size: 12px; + font-weight: 780; +} + +.dhv2-overlay-head h3 { + margin: 0; + color: #0f172a; + font-size: 22px; + line-height: 1.15; + font-weight: 820; +} + +.dhv2-overlay-head p { + margin: 6px 0 0; + color: #64748b; + font-size: 13px; + line-height: 1.5; +} + +.dhv2-overlay-close { + width: 34px; + height: 34px; + border: 1px solid #d8dee8; + border-radius: 999px; + color: #475569; + background: #fff; + font-size: 20px; + line-height: 1; + cursor: pointer; + transition: transform 160ms ease, color 160ms ease, border-color 160ms ease, background 160ms ease; +} + +.dhv2-overlay-close:hover { + color: #002fa7; + border-color: rgba(0, 47, 167, 0.24); + background: #eef4ff; + transform: rotate(90deg); +} + +.dhv2-overlay-body { + min-height: 0; + overflow: auto; + padding: 16px 20px; +} + +.dhv2-overlay-actions { + min-height: 62px; + display: flex; + align-items: center; + justify-content: flex-end; + gap: 10px; + padding: 12px 20px 16px; + border-top: 1px solid var(--dhv2-border, #d8dee8); + background: #fff; +} + +.dhv2-overlay .de-btn-primary, +.dhv2-overlay .de-btn-secondary { + position: relative; + min-height: 36px; + border-radius: 8px; + font-weight: 760; + white-space: nowrap; +} + +.dhv2-overlay .de-btn-primary { + overflow: hidden; + border-color: #002fa7 !important; + color: #fff !important; + background: linear-gradient(180deg, #0038c8, #002fa7 58%, #00247d) !important; + box-shadow: 0 10px 22px rgba(0, 47, 167, 0.2) !important; +} + +.dhv2-overlay .de-btn-secondary { + border: 1px solid #d8dee8 !important; + color: #334155 !important; + background: #fff !important; +} + +.dhv2-plan-chat-body { + display: grid; + grid-template-rows: auto minmax(0, 1fr) auto; + gap: 14px; + padding: 16px 18px 0; +} + +.dhv2-plan-chat-overlay .dhv2-overlay-surface { + grid-template-rows: 72px minmax(0, 1fr) !important; +} + +.dhv2-plan-chat-overlay .dhv2-plan-chat-body--embedded { + min-height: 0 !important; + display: grid !important; + grid-template-rows: auto minmax(0, 1fr) !important; + gap: 0 !important; + overflow: hidden !important; + padding: 0 !important; +} + +.dhv2-plan-chat-overlay .dhv2-overlay-head { + min-height: 72px; + grid-template-columns: minmax(0, 1fr) auto auto; + align-items: center; + gap: 12px; + padding: 12px 20px; + background: #fff; +} + +.dhv2-plan-chat-overlay .dhv2-overlay-head > div:first-child { + min-width: 0; +} + +.dhv2-plan-chat-overlay .dhv2-overlay-head h3 { + font-size: 17px; + line-height: 1.2; +} + +.dhv2-plan-chat-overlay .dhv2-overlay-head p { + max-width: 250px; + margin-top: 4px; + overflow: hidden; + font-size: 11px; + line-height: 1.3; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dhv2-plan-chat-overlay .dhv2-overlay-close { + width: 32px; + height: 32px; + border-radius: 8px; + background: #f3f7fa; +} + +.dhv2-plan-chat-head-actions { + display: flex; + align-items: center; + gap: 8px; +} + +.dhv2-plan-chat-head-actions .de-btn-primary, +.dhv2-plan-chat-head-actions .de-btn-secondary { + min-height: 34px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; + padding-inline: 11px; +} + +.dhv2-plan-chat-status { + min-height: 28px; + display: inline-flex; + align-items: center; + gap: 5px; + padding: 0 9px; + border-radius: 7px; + color: #087b6c; + background: #e7f8f4; + font-size: 11px; + font-weight: 760; + white-space: nowrap; +} + +.dhv2-plan-chat-status svg { + fill: #10a892; + stroke: #10a892; +} + +.dhv2-plan-chat-context-strip { + min-width: 0; + min-height: 54px; + display: grid; + grid-template-columns: auto minmax(0, 1fr); + align-content: center; + gap: 4px 12px; + margin: 16px 20px; + padding: 9px 16px 9px 18px; + overflow: hidden; + border: 1px solid #d2e8f6; + border-radius: 8px; + background: #edf8ff; + position: relative; +} + +.dhv2-plan-chat-context-stack { + min-width: 0; +} + +.dhv2-plan-chat-context-stack .dhv2-plan-chat-approval { + margin: 0 20px 12px; + border-color: rgba(245, 158, 11, 0.3) !important; + background: #fff9ed !important; +} + +.dhv2-plan-chat-context-stack .dhv2-plan-chat-approval strong { + color: #3d4f63 !important; +} + +.dhv2-plan-chat-context-stack .dhv2-plan-chat-approval p { + color: #667c91 !important; +} + +.dhv2-plan-chat-context-strip::before { + content: ""; + position: absolute; + inset: 0 auto 0 0; + width: 4px; + background: linear-gradient(180deg, #168cff, #10b8a5); +} + +.dhv2-plan-chat-context-strip span { + grid-column: 1; + color: #365978; + font-size: 12px; + font-weight: 780; + white-space: nowrap; +} + +.dhv2-plan-chat-context-strip p { + grid-column: 2; + min-width: 0; + margin: 0; + overflow: hidden; + color: #526d88; + font-size: 12px; + line-height: 1.5; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dhv2-plan-chat-overlay .dhv2-planb-chat-embed { + min-height: 0; +} + +.dhv2-plan-chat-overlay .plan-chat--conversation { + background: #f8fbfe; +} + +.dhv2-plan-chat-overlay .plan-chat--conversation .plan-chat-messages { + padding-right: 24px; + padding-left: 24px; + scrollbar-gutter: stable; +} + +.dhv2-plan-chat-overlay .plan-chat--conversation .plan-chat-input { + padding: 18px 24px 20px; + background: #fff !important; + box-shadow: 0 -8px 22px rgba(44, 82, 112, 0.04); +} + +.dhv2-plan-chat-overlay .plan-chat--conversation .plan-chat-input > div { + max-width: none; +} + +.dhv2-plan-chat-overlay .plan-chat--conversation .plan-chat-input textarea { + border-radius: 9px; + background: #f7fbfe; +} + +.dhv2-plan-chat-overlay .plan-chat--conversation .plan-chat-input button { + border-radius: 8px !important; + background: linear-gradient(135deg, #168cff, #10b8a5) !important; +} + +.de-plan-chat-context { + display: grid; + grid-template-columns: 1fr; + gap: 10px; +} + +.de-plan-chat-context > div, +.de-event-detail-grid > div, +.de-report-preview-summary > div, +.de-workday-guide-summary, +.de-task-manager-column, +.de-plan-action-body, +.de-event-detail-result { + border-color: var(--dhv2-border, #d8dee8) !important; + background: #fff !important; +} + +.de-plan-chat-messages { + padding: 2px; +} + +.de-plan-chat-message { + animation: dhv2MessageIn 340ms ease both; +} + +.de-plan-chat-message:nth-child(2) { + animation-delay: 70ms; +} + +.de-plan-chat-message:nth-child(3) { + animation-delay: 130ms; +} + +.de-plan-chat-input { + position: sticky; + bottom: 0; + padding: 12px 0 16px; + background: linear-gradient(180deg, rgba(255,255,255,0.86), #fff 35%); +} + +.de-plan-chat-input textarea, +.de-plan-action-field input, +.de-profile-settings-grid input { + border-color: var(--dhv2-border, #d8dee8) !important; + background: #fff !important; +} + +.de-plan-chat-input textarea:focus, +.de-plan-action-field input:focus, +.de-profile-settings-grid input:focus { + border-color: rgba(0, 47, 167, 0.38) !important; + box-shadow: 0 0 0 3px rgba(0, 47, 167, 0.08); + outline: none; +} + +.dhv2-report-preview-body { + display: grid; + gap: 14px; +} + +.de-report-preview-summary { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 10px; +} + +.de-report-preview-summary > div { + padding: 12px; + border: 1px solid var(--dhv2-border, #d8dee8); + border-radius: 10px; +} + +.de-report-preview-content { + border: 1px solid var(--dhv2-border, #d8dee8); + border-radius: 10px; + background: #fcfdff; + box-shadow: inset 0 0 0 1px rgba(255,255,255,0.7); +} + +.dhv2-event-history-body { + display: grid; + grid-template-rows: auto minmax(0, 1fr); + gap: 12px; +} + +.de-event-history-toolbar { + border-bottom: 1px solid var(--dhv2-border, #d8dee8); + padding-bottom: 10px; +} + +.de-filter-chip.active { + color: #002fa7 !important; + background: #eef4ff !important; + box-shadow: inset 0 -2px 0 #002fa7; +} + +.de-event-history-row { + animation: dhv2ListIn 280ms ease both; +} + +.de-event-history-row:nth-child(2) { animation-delay: 35ms; } +.de-event-history-row:nth-child(3) { animation-delay: 70ms; } +.de-event-history-row:nth-child(4) { animation-delay: 105ms; } +.de-event-history-row:nth-child(5) { animation-delay: 140ms; } + +.dhv2-event-detail-body, +.dhv2-plan-action-body, +.dhv2-profile-settings-body { + display: grid; + gap: 14px; +} + +.de-event-detail-modal .de-event-detail-result { + border-left: 4px solid #002fa7; +} + +.dhv2-workday-guide-shell-body, +.dhv2-task-manager-shell-body { + display: grid; + gap: 14px; + padding: 16px 18px 18px; +} + +.de-workday-guide-steps { + animation: dhv2FadeSlideIn 280ms ease both; +} + +.de-workday-guide-step, +.de-task-manager-decision-card, +.de-duty-card { + transition: transform 170ms ease, border-color 170ms ease, box-shadow 170ms ease; +} + +.de-workday-guide-step:hover, +.de-task-manager-decision-card:hover, +.de-duty-card:hover { + transform: translateY(-1px); + border-color: rgba(0, 47, 167, 0.22) !important; + box-shadow: 0 10px 22px rgba(0, 47, 167, 0.07) !important; +} + +.de-profile-status-toggle button.active { + color: #fff !important; + background: #002fa7 !important; +} + +@keyframes dhv2OverlayIn { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes dhv2ModalIn { + from { opacity: 0; transform: translateY(12px) scale(0.985); } + to { opacity: 1; transform: translateY(0) scale(1); } +} + +@keyframes dhv2DrawerIn { + from { opacity: 0; transform: translateX(36px); } + to { opacity: 1; transform: translateX(0); } +} + +@keyframes dhv2FadeSlideIn { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes dhv2MessageIn { + from { opacity: 0; transform: translateY(10px) scale(0.985); } + to { opacity: 1; transform: translateY(0) scale(1); } +} + +@keyframes dhv2ListIn { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes dhv2ProgressSweep { + from { transform: translateX(-110%); } + to { transform: translateX(110%); } +} + +@keyframes dhv2ButtonSweep { + 0% { transform: translateX(-120%); } + 52%, 100% { transform: translateX(120%); } +} + +@keyframes dhv2CardScan { + from { transform: translateX(-115%); } + to { transform: translateX(115%); } +} + +@keyframes dhv2BarRise { + from { transform: scaleY(0.7); transform-origin: bottom; opacity: 0.65; } + to { transform: scaleY(1); transform-origin: bottom; opacity: 1; } +} + +@keyframes dhv2BarSweep { + from { transform: translateY(-100%); } + to { transform: translateY(120%); } +} + +@keyframes dhv2StatusPulse { + 0%, 100% { box-shadow: 0 0 0 0 rgba(5, 150, 105, 0); } + 50% { box-shadow: 0 0 0 4px rgba(5, 150, 105, 0.11); } +} + +@keyframes dhv2BadgeBreathe { + 0%, 100% { box-shadow: 0 0 0 0 rgba(217, 119, 6, 0); } + 50% { box-shadow: 0 0 0 5px rgba(217, 119, 6, 0.1); } +} + +@keyframes dhv2DangerPulse { + 0%, 100% { border-color: var(--dhv2-border); box-shadow: none; } + 50% { border-color: rgba(217, 45, 32, 0.26); box-shadow: 0 0 0 3px rgba(217, 45, 32, 0.06); } +} + +@media (prefers-reduced-motion: reduce) { + .dhv2-primary::after, + .de-btn-primary::after, + .dhv2-action-card::before, + .dhv2-motion-progress > span::after, + .dhv2-bar i, + .dhv2-bar i::after, + .dhv2-metric--exception, + .dhv2-employee-name span, + .dhv2-report .dhv2-panel-head > span, + .dhv2-overlay, + .dhv2-overlay-surface, + .dhv2-ai-feed, + .dhv2-ai-message, + .de-plan-chat-message, + .de-event-history-row { + animation: none !important; + } +} + +@media (max-width: 1180px) { + .dhv2-overlay { + padding: 16px; + } + + .dhv2-overlay-surface--drawer, + .dhv2-overlay-surface.dhv2-plan-chat-drawer { + width: min(100vw, 720px) !important; + } +} + +@media (max-width: 720px) { + .dhv2-plan-chat-overlay .dhv2-overlay-head { + grid-template-columns: minmax(0, 1fr) auto auto; + gap: 8px; + padding-inline: 12px; + } + + .dhv2-plan-chat-overlay .dhv2-overlay-head p { + max-width: 150px; + } + + .dhv2-plan-chat-head-actions { + gap: 6px; + } + + .dhv2-plan-chat-head-actions .de-btn-primary, + .dhv2-plan-chat-head-actions .de-btn-secondary { + width: 34px; + min-width: 34px; + padding: 0; + } + + .dhv2-plan-chat-head-actions .de-btn-primary span, + .dhv2-plan-chat-head-actions .de-btn-secondary span, + .dhv2-plan-chat-status span { + display: none; + } + + .dhv2-plan-chat-status { + width: 28px; + min-width: 28px; + justify-content: center; + padding: 0; + } + + .dhv2-plan-chat-context-strip { + margin: 12px; + } + + .dhv2-plan-chat-context-stack .dhv2-plan-chat-approval { + margin: 0 12px 10px; + } + + .dhv2-plan-chat-overlay .plan-chat--conversation .plan-chat-messages { + padding-right: 12px; + padding-left: 12px; + } + + .dhv2-plan-chat-overlay .plan-chat--conversation .plan-chat-input { + padding: 12px; + } +} + +/* Azure refresh: lighter than Klein blue, closer to the original sky-blue product tone. */ +.de-dashboard--compact, +.dhv2-home, +.dhv2-overlay { + --dhv2-primary: #1e90ff; + --dhv2-primary-dark: #1677d2; + --dhv2-primary-soft: #eaf6ff; + --dhv2-primary-glow: rgba(30, 144, 255, 0.18); + --dhv2-border: #d8e8f8; +} + +.de-header-logo { + background: linear-gradient(180deg, #60b5ff, #1e90ff) !important; + border-color: rgba(30, 144, 255, 0.62) !important; + box-shadow: 0 10px 20px rgba(30, 144, 255, 0.18) !important; +} + +.de-nav-btn:hover:not(:disabled), +.de-nav-btn.active { + color: #1677d2 !important; + background: #eaf6ff !important; + box-shadow: inset 0 -3px 0 #1e90ff !important; +} + +.de-header-icon:hover, +.de-profile-status-toggle button.active { + color: #1677d2 !important; + background: #eaf6ff !important; +} + +.de-btn-primary, +.dhv2-primary, +.dhv2-report-actions .dhv2-primary, +.dhv2-overlay .de-btn-primary { + border-color: #1e90ff !important; + color: #fff !important; + background: linear-gradient(180deg, #5bb7ff 0%, #1e90ff 58%, #1677d2 100%) !important; + box-shadow: 0 10px 22px rgba(30, 144, 255, 0.2) !important; +} + +.de-btn-primary:hover:not(:disabled), +.dhv2-primary:hover:not(:disabled), +.dhv2-overlay .de-btn-primary:hover:not(:disabled) { + background: linear-gradient(180deg, #72c3ff 0%, #2999ff 58%, #1677d2 100%) !important; + box-shadow: 0 12px 24px rgba(30, 144, 255, 0.24) !important; +} + +.dhv2-primary::after, +.de-btn-primary::after { + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.36), transparent) !important; +} + +.dhv2-overlay-eyebrow, +.dhv2-overlay-close:hover, +.dhv2-link-button, +.dhv2-ai-input svg, +.dhv2-ai-tab.active, +.de-filter-chip.active { + color: #1677d2 !important; +} + +.dhv2-overlay-close:hover, +.de-filter-chip.active, +.dhv2-ai-tab.active { + border-color: rgba(30, 144, 255, 0.26) !important; + background: #eaf6ff !important; + box-shadow: inset 0 -2px 0 #1e90ff !important; +} + +.de-plan-chat-input textarea:focus, +.de-plan-action-field input:focus, +.de-profile-settings-grid input:focus { + border-color: rgba(30, 144, 255, 0.42) !important; + box-shadow: 0 0 0 3px rgba(30, 144, 255, 0.1) !important; +} + +.dhv2-action-card.is-active { + color: #1677d2 !important; + border-color: rgba(30, 144, 255, 0.46) !important; + background: linear-gradient(135deg, #eaf6ff 0%, #ffffff 68%) !important; + box-shadow: + 0 0 0 1px rgba(30, 144, 255, 0.14), + 0 0 34px rgba(30, 144, 255, 0.14), + 0 20px 40px rgba(15, 23, 42, 0.08) !important; +} + +.dhv2-action-card.is-active i, +.dhv2-run-row.is-active .dhv2-run-name i { + background: #1e90ff !important; + border-color: #1e90ff !important; + box-shadow: 0 8px 18px rgba(30, 144, 255, 0.22) !important; +} + +.dhv2-run-row.is-active { + border-color: rgba(30, 144, 255, 0.34) !important; + background: linear-gradient(90deg, #eaf6ff, #ffffff 72%) !important; + box-shadow: inset 4px 0 0 #1e90ff, 0 10px 24px rgba(30, 144, 255, 0.11) !important; +} + +.dhv2-motion-progress > span { + background: linear-gradient(90deg, #14b8a6, #60b5ff 42%, #1e90ff) !important; +} + +.dhv2-bar i { + background: linear-gradient(180deg, #60b5ff, #1e90ff) !important; +} + +.de-event-detail-modal .de-event-detail-result { + border-left-color: #1e90ff !important; +} + +.de-workday-guide-duty-list .de-duty-card, +.de-task-manager-duty-list .de-duty-card { + min-height: 118px !important; + display: grid !important; + grid-template-columns: 74px minmax(0, 1fr) !important; + align-items: stretch !important; + padding: 0 !important; + overflow: hidden !important; + border: 1px solid #d8e8f8 !important; + border-radius: 12px !important; + background: linear-gradient(180deg, #ffffff 0%, #f8fcff 100%) !important; + box-shadow: 0 6px 16px rgba(15, 23, 42, 0.045) !important; +} + +.de-workday-guide-duty-list .de-duty-card:hover, +.de-task-manager-duty-list .de-duty-card:hover { + transform: translateY(-1px); + border-color: rgba(30, 144, 255, 0.26) !important; + box-shadow: 0 12px 24px rgba(30, 144, 255, 0.1) !important; +} + +.de-workday-guide-duty-list .de-duty-card--selected, +.de-task-manager-duty-list .de-duty-card--selected { + border-color: rgba(20, 184, 166, 0.38) !important; + background: linear-gradient(180deg, #ffffff, #f2fffd) !important; + box-shadow: inset 4px 0 0 #14b8a6, 0 10px 22px rgba(20, 184, 166, 0.08) !important; +} + +.de-workday-guide-duty-list .de-duty-card--running, +.de-task-manager-duty-list .de-duty-card--running { + border-color: rgba(30, 144, 255, 0.38) !important; + background: linear-gradient(180deg, #ffffff, #f2f9ff) !important; + box-shadow: inset 4px 0 0 #1e90ff, 0 10px 22px rgba(30, 144, 255, 0.1) !important; +} + +.de-workday-guide-duty-list .de-task-manager-duty-check, +.de-task-manager-duty-list .de-task-manager-duty-check { + min-width: 0 !important; + height: 100%; + display: grid !important; + place-items: center !important; + gap: 4px !important; + padding: 12px 8px !important; + border-right: 1px solid #d8e8f8 !important; + background: linear-gradient(180deg, #f3f9ff, #ffffff) !important; +} + +.de-task-manager-duty-check input { + width: 20px; + height: 20px; + accent-color: #14b8a6; +} + +.de-task-manager-duty-check span { + color: #64748b !important; + font-size: 12px !important; + font-weight: 760 !important; +} + +.de-workday-guide-duty-list .de-template-card-main, +.de-task-manager-duty-list .de-template-card-main { + min-width: 0; + padding: 12px 12px 10px !important; + gap: 8px !important; +} + +.de-template-card-head { + align-items: flex-start !important; + gap: 8px !important; +} + +.de-template-card-name { + color: #0f172a !important; + font-size: 15px !important; + line-height: 1.35 !important; +} + +.de-template-card-desc { + color: #475569 !important; + line-height: 1.48 !important; +} + +.de-template-card-meta { + justify-content: flex-start !important; + gap: 6px !important; +} + +.de-template-card-meta span { + max-width: 100%; + padding: 3px 8px; + border-radius: 999px; + color: #1677d2 !important; + background: #eef8ff !important; + font-size: 12px; + font-weight: 700; +} + +.de-duty-card-foot { + align-items: center !important; + margin-top: 2px !important; +} + +.de-duty-card-foot > .de-btn-secondary, +.de-duty-card-actions .de-btn-secondary { + border-color: #b9dcff !important; + color: #1677d2 !important; + background: #ffffff !important; +} + +.de-duty-card-foot > .de-btn-secondary:hover:not(:disabled), +.de-duty-card-actions .de-btn-secondary:hover:not(:disabled) { + background: #eaf6ff !important; + box-shadow: 0 8px 18px rgba(30, 144, 255, 0.1) !important; +} + +.de-duty-card-actions .de-btn-primary { + min-width: 66px; +} + +.dhv2-overlay-surface.de-plan-flow-modal { + width: min(900px, calc(100vw - 56px)) !important; + max-height: min(760px, calc(100vh - 48px)) !important; +} + +.dhv2-plan-flow-body { + display: grid; + gap: 14px; +} + +.de-plan-flow-head { + display: grid; + grid-template-columns: 1.2fr 1fr 0.82fr; + gap: 10px; +} + +.de-plan-flow-head > div { + min-width: 0; + padding: 12px; + border: 1px solid #d8e8f8; + border-radius: 12px; + background: #fff; +} + +.de-plan-flow-head span, +.de-plan-flow-card em { + display: block; + color: #64748b; + font-size: 12px; + font-style: normal; + font-weight: 760; +} + +.de-plan-flow-head strong, +.de-plan-flow-card strong { + display: block; + margin-top: 4px; + color: #0f172a; + font-size: 15px; + line-height: 1.35; +} + +.de-plan-flow-head p, +.de-plan-flow-card p, +.de-plan-flow-foot { + margin: 6px 0 0; + color: #64748b; + font-size: 12px; + line-height: 1.5; +} + +.de-plan-flow-map { + min-height: 206px; + display: flex; + align-items: stretch; + gap: 0; + overflow-x: auto; + padding: 18px 4px 22px; +} + +.de-plan-flow-step { + position: relative; + flex: 0 0 184px; + display: grid; + grid-template-rows: auto minmax(0, 1fr); + gap: 10px; +} + +.de-plan-flow-node { + position: relative; + z-index: 2; + width: 34px; + height: 34px; + display: inline-flex; + align-items: center; + justify-content: center; + border: 1px solid #cbd5e1; + border-radius: 999px; + color: #64748b; + background: #fff; + font-size: 13px; + font-weight: 820; + box-shadow: 0 4px 10px rgba(15, 23, 42, 0.06); +} + +.de-plan-flow-step.is-done .de-plan-flow-node { + color: #fff; + border-color: #10b981; + background: #10b981; +} + +.de-plan-flow-step.is-active .de-plan-flow-node { + color: #fff; + border-color: #1e90ff; + background: #1e90ff; + box-shadow: 0 0 0 6px rgba(30, 144, 255, 0.12), 0 8px 18px rgba(30, 144, 255, 0.18); + animation: dhv2FlowPulse 1.4s ease-in-out infinite; +} + +.de-plan-flow-card { + min-height: 132px; + margin-right: 12px; + padding: 12px; + border: 1px solid #d8e8f8; + border-radius: 12px; + background: #fff; + box-shadow: 0 8px 18px rgba(15, 23, 42, 0.05); +} + +.de-plan-flow-step.is-done .de-plan-flow-card { + border-color: rgba(16, 185, 129, 0.28); + background: linear-gradient(180deg, #f2fffd, #ffffff); +} + +.de-plan-flow-step.is-active .de-plan-flow-card { + border-color: rgba(30, 144, 255, 0.48); + background: linear-gradient(180deg, #f2f9ff 0%, #ffffff 78%); + box-shadow: 0 12px 28px rgba(30, 144, 255, 0.14); +} + +.de-plan-flow-connector { + position: absolute; + top: 17px; + left: 34px; + right: 10px; + height: 2px; + overflow: hidden; + background: #d8e8f8; +} + +.de-plan-flow-connector.is-done { + background: linear-gradient(90deg, #10b981, #60b5ff); +} + +.de-plan-flow-connector.is-active::after { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient(90deg, transparent, rgba(30, 144, 255, 0.78), transparent); + animation: dhv2ProgressSweep 1.2s linear infinite; +} + +.de-plan-flow-foot { + margin: 0; + padding: 10px 12px; + border: 1px solid #d8e8f8; + border-radius: 10px; + background: #f8fcff; +} + +@keyframes dhv2FlowPulse { + 0%, 100% { + box-shadow: 0 0 0 4px rgba(30, 144, 255, 0.1), 0 8px 18px rgba(30, 144, 255, 0.18); + } + 50% { + box-shadow: 0 0 0 9px rgba(30, 144, 255, 0.18), 0 12px 24px rgba(30, 144, 255, 0.22); + } +} + +@media (prefers-reduced-motion: reduce) { + .de-plan-flow-step.is-active .de-plan-flow-node, + .de-plan-flow-connector.is-active::after { + animation: none !important; + } +} + +@media (max-width: 1180px) { + .de-plan-flow-head { + grid-template-columns: 1fr; + } + + .de-plan-flow-step { + flex-basis: 172px; + } +} + +/* Business-state revision: five front-office work categories, not six technical actions. */ +.dhv2-secondary-action { + min-height: 46px; + border: 1px solid #b9dcff; + border-radius: 10px; + color: #1677d2; + background: #fff; + font-weight: 760; + cursor: pointer; + transition: transform 160ms ease, border-color 160ms ease, background 160ms ease, box-shadow 160ms ease; +} + +.dhv2-secondary-action:hover:not(:disabled) { + transform: translateY(-1px); + background: #eaf6ff; + box-shadow: 0 8px 18px rgba(30, 144, 255, 0.1); +} + +.dhv2-stage.is-working .dhv2-stage-image { + animation: dhv2AgentWorking 3.2s ease-in-out infinite; + transform-origin: 50% 72%; +} + +.dhv2-stage.is-standby .dhv2-stage-image { + filter: saturate(0.96) contrast(1.02); + animation: dhv2AgentStandby 4.2s ease-in-out infinite; +} + +.dhv2-stage--workOrder .dhv2-stage-image { + filter: saturate(1.05) contrast(1.04) drop-shadow(0 14px 24px rgba(30, 144, 255, 0.16)); +} + +.dhv2-stage--inspection .dhv2-stage-image { + filter: saturate(1.08) contrast(1.04) drop-shadow(0 14px 24px rgba(20, 184, 166, 0.16)); +} + +.dhv2-stage--phone .dhv2-stage-image { + filter: saturate(1.08) contrast(1.04) drop-shadow(0 14px 24px rgba(79, 70, 229, 0.16)); +} + +.dhv2-stage--mail .dhv2-stage-image { + filter: saturate(1.08) contrast(1.04) drop-shadow(0 14px 24px rgba(16, 185, 129, 0.16)); +} + +.dhv2-stage--collaboration .dhv2-stage-image { + filter: saturate(1.04) contrast(1.04) drop-shadow(0 14px 24px rgba(217, 119, 6, 0.16)); +} + +.dhv2-action-card--workOrder { --accent: #1e90ff !important; } +.dhv2-action-card--inspection { --accent: #14b8a6 !important; } +.dhv2-action-card--phone { --accent: #4f46e5 !important; } +.dhv2-action-card--mail { --accent: #10b981 !important; } +.dhv2-action-card--collaboration { --accent: #d97706 !important; } + +.dhv2-run-head, +.dhv2-run-row { + grid-template-columns: minmax(164px, 0.95fr) 112px 136px minmax(260px, 1.45fr) !important; +} + +.dhv2-run-head span:nth-child(n + 5), +.dhv2-run-row > span:nth-child(n + 5) { + display: none !important; +} + +.dhv2-run-total { + display: grid !important; + gap: 5px; +} + +.dhv2-run-total strong { + display: inline-flex; + align-items: baseline; + gap: 2px; + color: #0f172a !important; +} + +.dhv2-run-effect { + display: grid !important; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 6px; +} + +.dhv2-run-effect em { + display: inline-flex; + align-items: baseline; + justify-content: center; + gap: 2px; + padding: 4px 6px; + border-radius: 999px; + color: #0f766e !important; + background: #eefcf8 !important; + font-style: normal !important; + font-weight: 760; +} + +.dhv2-run-effect em:last-child { + color: #b42318 !important; + background: #fff1f0 !important; +} + +.dhv2-run-log { + display: grid !important; + gap: 7px; +} + +.dhv2-run-log strong { + color: #334155 !important; + font-size: 12px; + line-height: 1.42; +} + +.dhv2-metric--workOrder strong { color: #1677d2 !important; } +.dhv2-metric--inspection strong { color: #0f766e !important; } +.dhv2-metric--phone strong { color: #4f46e5 !important; } +.dhv2-metric--mail strong { color: #059669 !important; } +.dhv2-metric--collaboration strong { color: #d97706 !important; } + +.dhv2-bar--mail-check i { background: linear-gradient(180deg, #34d399, #10b981) !important; } +.dhv2-bar--device-monitoring i { background: linear-gradient(180deg, #2dd4bf, #14b8a6) !important; } +.dhv2-bar--fault-followup i { background: linear-gradient(180deg, #60b5ff, #1e90ff) !important; } +.dhv2-bar--risk-control-report i { background: linear-gradient(180deg, #fbbf24, #d97706) !important; } + +.dhv2-report { + grid-template-rows: 36px 30px 34px 36px !important; + gap: 7px !important; +} + +.dhv2-report .dhv2-panel-head { + min-height: 36px !important; +} + +.dhv2-report-modes { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 5px; +} + +.dhv2-report-modes button { + min-width: 0; + height: 28px; + border: 1px solid #d8e8f8; + border-radius: 8px; + color: #64748b; + background: #fff; + font-size: 12px; + font-weight: 760; + cursor: pointer; +} + +.dhv2-report-modes button.active { + color: #1677d2; + border-color: rgba(30, 144, 255, 0.36); + background: #eaf6ff; + box-shadow: inset 0 -2px 0 #1e90ff; +} + +.dhv2-report-time { + grid-template-columns: minmax(0, 1fr) auto !important; + gap: 7px !important; +} + +.dhv2-report-time:has(input[type="date"]) { + grid-template-columns: repeat(2, minmax(0, 1fr)) !important; +} + +.dhv2-report-time label { + height: 32px !important; +} + +.dhv2-report-time input, +.dhv2-report-time button, +.dhv2-report-actions button { + height: 32px !important; + min-height: 32px !important; +} + +.dhv2-report-actions { + grid-template-columns: 1.22fr 0.82fr 0.82fr 0.92fr !important; + gap: 7px !important; +} + +.dhv2-right { + grid-template-rows: 380px 154px minmax(0, 1fr) !important; +} + +.dhv2-run-log, +.dhv2-run-log strong { + overflow: visible !important; + text-overflow: clip !important; + white-space: normal !important; + word-break: break-word; +} + +.dhv2-run-log strong { + display: block !important; +} + +@keyframes dhv2AgentWorking { + 0%, 100% { transform: translate3d(0, 0, 0) scale(1); } + 38% { transform: translate3d(0, -4px, 0) scale(1.012); } + 72% { transform: translate3d(3px, -1px, 0) scale(1.006); } +} + +@keyframes dhv2AgentStandby { + 0%, 100% { transform: translate3d(0, 0, 0) scale(1); } + 50% { transform: translate3d(0, -2px, 0) scale(1.004); } +} + +@media (prefers-reduced-motion: reduce) { + .dhv2-stage.is-working .dhv2-stage-image, + .dhv2-stage.is-standby .dhv2-stage-image { + animation: none !important; + } +} + +/* Digital home v2 proportional scaling overrides. Keep this block last for cascade safety. */ +.de-dashboard--compact { + overflow: hidden !important; +} + +.dhv2-scale-viewport { + flex: 1 1 auto; + min-width: 0; + min-height: 0; + overflow: auto; + position: relative; + z-index: 1; + background: #eaf3fb; +} + +.dhv2-scale-stage { + width: calc(var(--dhv2-design-width) * var(--dhv2-scale)); + height: calc(var(--dhv2-design-height) * var(--dhv2-scale)); + min-width: calc(var(--dhv2-design-width) * var(--dhv2-scale)); + min-height: calc(var(--dhv2-design-height) * var(--dhv2-scale)); + margin-inline: auto; + overflow: visible; +} + +.dhv2-home { + width: var(--dhv2-design-width) !important; + height: var(--dhv2-design-height) !important; + min-width: var(--dhv2-design-width) !important; + min-height: var(--dhv2-design-height) !important; + display: grid !important; + grid-template-columns: 390px minmax(0, 1fr) 468px !important; + grid-template-areas: "left center right" !important; + grid-template-rows: minmax(0, 1fr) !important; + gap: 14px !important; + padding: 12px 15px 14px !important; + overflow: hidden !important; + box-sizing: border-box; + transform: scale(var(--dhv2-scale)); + transform-origin: top left; +} + +.dhv2-left { + grid-area: left !important; + width: auto !important; + min-width: 0 !important; + min-height: 0 !important; + grid-template-rows: 248px minmax(0, 1fr) !important; +} + +.dhv2-center { + grid-area: center !important; + width: auto !important; + min-width: 0 !important; + min-height: 0 !important; + grid-template-rows: 486px minmax(0, 1fr) !important; +} + +.dhv2-right { + grid-area: right !important; + width: auto !important; + min-width: 0 !important; + min-height: 0 !important; + grid-template-columns: minmax(0, 1fr) !important; + grid-template-areas: + "today" + "report" + "ai" !important; + grid-template-rows: 380px 154px minmax(0, 1fr) !important; +} + +.dhv2-employee, +.dhv2-tasks, +.dhv2-today, +.dhv2-report, +.dhv2-ai, +.dhv2-work-panel, +.dhv2-run-panel { + width: auto !important; + min-height: 0 !important; +} + +.dhv2-work-panel { + min-height: 0 !important; +} + +.dhv2-stage { + min-height: 0 !important; +} + +.dhv2-run-panel { + min-height: 0 !important; +} + +.dhv2-run-head { + display: grid !important; +} + +.dhv2-run-head, +.dhv2-run-row { + grid-template-columns: minmax(150px, 1.05fr) minmax(86px, 0.5fr) minmax(112px, 0.58fr) minmax(190px, 1.25fr) !important; +} + +.dhv2-run-effect, +.dhv2-run-log { + grid-column: auto !important; +} + +.dhv2-metrics { + grid-template-columns: repeat(auto-fit, minmax(104px, 1fr)) !important; +} + +.dhv2-chart > div { + grid-template-columns: repeat(auto-fit, minmax(58px, 1fr)) !important; +} + +/* Digital home v2 layout fix: keep business content readable instead of scaling the whole page. */ +.dhv2-scale-viewport { + display: flex !important; + overflow: auto !important; +} + +.dhv2-scale-stage { + flex: 1 1 auto !important; + width: max(1180px, 100%) !important; + height: max(760px, 100%) !important; + min-width: 1180px !important; + min-height: 760px !important; + margin: 0 !important; + overflow: visible !important; +} + +.dhv2-home { + width: 100% !important; + height: 100% !important; + min-width: 1180px !important; + min-height: 760px !important; + transform: none !important; + grid-template-columns: + clamp(320px, 26vw, 390px) + minmax(520px, 1fr) + clamp(320px, 28vw, 430px) !important; + gap: 12px !important; + padding: 12px !important; + overflow: visible !important; +} + +.dhv2-left { + grid-template-rows: minmax(220px, 250px) minmax(0, 1fr) !important; +} + +.dhv2-center { + grid-template-rows: minmax(390px, 0.56fr) minmax(250px, 0.44fr) !important; +} + +.dhv2-right { + grid-template-rows: minmax(292px, 0.45fr) minmax(170px, auto) minmax(220px, 0.55fr) !important; +} + +.dhv2-tasks, +.dhv2-work-panel, +.dhv2-run-panel, +.dhv2-today, +.dhv2-report, +.dhv2-ai { + display: grid !important; + min-height: 0 !important; + overflow: hidden !important; +} + +.dhv2-employee { + overflow: auto !important; +} + +.dhv2-employee-body { + min-height: 0 !important; + height: auto !important; + grid-template-columns: minmax(104px, 132px) minmax(0, 1fr) !important; + gap: 14px !important; + padding: 14px 18px !important; +} + +.dhv2-employee-photo { + width: min(116px, 100%) !important; + height: 136px !important; +} + +.dhv2-employee-info { + min-height: 0 !important; + gap: 8px !important; +} + +.dhv2-employee-info dl { + gap: 6px !important; +} + +.dhv2-employee-info dd { + overflow: visible !important; + word-break: break-word !important; +} + +.dhv2-task-list, +.dhv2-run-table, +.dhv2-ai-feed { + min-height: 0 !important; + overflow-y: auto !important; + overflow-x: hidden !important; +} + +.dhv2-task-row { + grid-template-columns: 20px minmax(0, 1fr) !important; + min-height: 76px !important; + align-items: start !important; +} + +.dhv2-task-main strong, +.dhv2-task-main small { + white-space: normal !important; + overflow: hidden !important; +} + +.dhv2-task-main strong { + display: -webkit-box !important; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + line-height: 1.25 !important; +} + +.dhv2-task-main small { + display: -webkit-box !important; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +.dhv2-task-meta { + display: flex !important; + flex-wrap: wrap !important; + gap: 6px !important; +} + +.dhv2-stage { + min-height: 0 !important; +} + +.dhv2-work-panel { + grid-template-rows: 48px minmax(0, 1fr) !important; +} + +.dhv2-work-tabs { + min-width: 0 !important; + overflow-x: auto !important; + overflow-y: hidden !important; + padding: 0 18px !important; +} + +.dhv2-work-tabs button { + flex: 0 0 auto !important; + white-space: nowrap !important; +} + +.dhv2-action-card { + width: clamp(170px, 28%, 230px); + min-height: 62px !important; + padding: 10px 12px !important; + gap: 8px !important; +} + +.dhv2-action-card--mail { + width: clamp(190px, 32%, 260px); + min-height: 78px !important; +} + +.dhv2-action-card.is-active strong { + font-size: 18px !important; +} + +.dhv2-action-card strong { + line-height: 1.18 !important; +} + +.dhv2-action-card em { + white-space: normal !important; + display: -webkit-box !important; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +.dhv2-run-head, +.dhv2-run-row { + grid-template-columns: minmax(180px, 1.1fr) minmax(90px, 0.48fr) minmax(108px, 0.56fr) minmax(220px, 1.28fr) !important; +} + +.dhv2-run-row { + min-height: 78px !important; +} + +.dhv2-run-name strong { + white-space: normal !important; + display: -webkit-box !important; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden !important; +} + +.dhv2-run-log strong { + display: -webkit-box !important; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden !important; + white-space: normal !important; +} + +.dhv2-today { + grid-template-rows: 52px minmax(0, auto) minmax(110px, 1fr) !important; + overflow: auto !important; +} + +.dhv2-metrics { + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + padding: 10px 14px 0 !important; +} + +.dhv2-total { + grid-column: span 3 !important; +} + +.dhv2-total, +.dhv2-metric { + min-height: 52px !important; + padding: 8px !important; +} + +.dhv2-chart { + min-height: 122px !important; + margin: 8px 14px 12px !important; + overflow: hidden !important; +} + +.dhv2-chart > div { + height: 82px !important; + grid-template-columns: repeat(auto-fit, minmax(48px, 1fr)) !important; + gap: 7px !important; +} + +.dhv2-bar em { + white-space: normal !important; + line-height: 1.12 !important; +} + +.dhv2-report { + grid-template-rows: 44px auto auto !important; + overflow: auto !important; +} + +.dhv2-report .dhv2-panel-head { + min-height: 44px !important; +} + +.dhv2-report-time { + grid-template-columns: minmax(0, 1fr) auto !important; + padding: 8px 14px 6px !important; +} + +.dhv2-report-actions { + grid-template-columns: repeat(2, minmax(0, 1fr)) !important; + padding: 6px 14px 12px !important; +} + +.dhv2-report-actions button, +.dhv2-report-time button, +.dhv2-report-time input { + min-width: 0 !important; +} + +.dhv2-ai { + grid-template-rows: 48px auto minmax(0, 1fr) auto !important; +} + +.dhv2-ai .dhv2-panel-head { + min-height: 48px !important; +} + +.dhv2-ai-message { + max-width: 96% !important; +} + +.dhv2-ai-message p { + overflow: visible !important; + word-break: break-word !important; +} + +@media (max-width: 1280px) { + .dhv2-scale-stage { + width: 1160px !important; + min-width: 1160px !important; + } + + .dhv2-home { + min-width: 1160px !important; + } + + .dhv2-home { + grid-template-columns: 300px minmax(500px, 1fr) 320px !important; + gap: 10px !important; + padding: 10px !important; + } + + .dhv2-action-card { + width: clamp(150px, 27%, 200px); + min-height: 58px !important; + } + + .dhv2-action-card--mail { + width: clamp(170px, 31%, 230px); + } +} + +/* Digital home v2 final large-screen rule: no scrollbars on the main dashboard. */ +.de-dashboard--compact { + overflow: hidden !important; +} + +.dhv2-scale-viewport { + flex: 1 1 auto !important; + min-width: 0 !important; + min-height: 0 !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + overflow: hidden !important; + background: #eaf3fb !important; +} + +.dhv2-scale-stage { + flex: 0 0 auto !important; + width: calc(var(--dhv2-design-width) * var(--dhv2-scale)) !important; + height: calc(var(--dhv2-design-height) * var(--dhv2-scale)) !important; + min-width: 0 !important; + min-height: 0 !important; + margin: 0 !important; + overflow: visible !important; +} + +.dhv2-home { + width: var(--dhv2-design-width) !important; + height: var(--dhv2-design-height) !important; + min-width: var(--dhv2-design-width) !important; + min-height: var(--dhv2-design-height) !important; + display: grid !important; + grid-template-columns: 380px minmax(0, 1fr) 430px !important; + grid-template-areas: "left center right" !important; + grid-template-rows: minmax(0, 1fr) !important; + gap: 14px !important; + padding: 12px 14px !important; + overflow: hidden !important; + box-sizing: border-box !important; + transform: scale(var(--dhv2-scale)) !important; + transform-origin: top left !important; +} + +.dhv2-left { + grid-area: left !important; + grid-template-rows: 240px minmax(0, 1fr) !important; + min-width: 0 !important; + min-height: 0 !important; +} + +.dhv2-center { + grid-area: center !important; + grid-template-rows: 458px minmax(0, 1fr) !important; + min-width: 0 !important; + min-height: 0 !important; +} + +.dhv2-right { + grid-area: right !important; + grid-template-columns: minmax(0, 1fr) !important; + grid-template-areas: + "today" + "report" + "ai" !important; + grid-template-rows: 340px 166px minmax(0, 1fr) !important; + min-width: 0 !important; + min-height: 0 !important; +} + +.dhv2-panel, +.dhv2-work-panel, +.dhv2-run-panel, +.dhv2-employee, +.dhv2-tasks, +.dhv2-today, +.dhv2-report, +.dhv2-ai { + min-width: 0 !important; + min-height: 0 !important; + overflow: hidden !important; +} + +.dhv2-employee-body { + height: calc(100% - 52px) !important; + min-height: 0 !important; + grid-template-columns: 126px minmax(0, 1fr) !important; + gap: 14px !important; + padding: 14px 18px !important; +} + +.dhv2-employee-photo { + width: 112px !important; + height: 132px !important; +} + +.dhv2-employee-info { + min-height: 0 !important; + gap: 8px !important; +} + +.dhv2-employee-info dl { + gap: 6px !important; +} + +.dhv2-employee-info dd { + line-height: 1.3 !important; +} + +.dhv2-tasks { + grid-template-rows: 52px auto minmax(0, 1fr) auto !important; +} + +.dhv2-task-tabs { + margin: 10px 16px 8px !important; +} + +.dhv2-task-list { + min-height: 0 !important; + overflow: hidden !important; + padding: 0 16px !important; +} + +.dhv2-task-row { + min-height: 68px !important; + grid-template-columns: 20px minmax(0, 1fr) !important; + gap: 8px !important; + align-items: start !important; + padding: 9px 0 !important; +} + +.dhv2-task-main { + gap: 4px !important; +} + +.dhv2-task-main strong, +.dhv2-task-main small { + display: -webkit-box !important; + -webkit-box-orient: vertical !important; + overflow: hidden !important; + white-space: normal !important; +} + +.dhv2-task-main strong { + -webkit-line-clamp: 1; + line-height: 1.22 !important; +} + +.dhv2-task-main small { + -webkit-line-clamp: 1; +} + +.dhv2-task-meta { + display: flex !important; + align-items: center !important; + gap: 6px !important; + min-width: 0 !important; +} + +.dhv2-task-row em { + min-width: 0 !important; + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-task-actions { + padding: 10px 16px 14px !important; +} + +.dhv2-task-more { + width: 100%; + height: 34px; + margin-top: 8px; + border: 1px dashed rgba(30, 144, 255, 0.32); + border-radius: 8px; + color: #1677d2; + background: #f5fbff; + font: inherit; + font-size: 13px; + font-weight: 700; + cursor: pointer; +} + +.dhv2-work-panel { + grid-template-rows: 48px minmax(0, 1fr) !important; +} + +.dhv2-work-tabs { + height: 48px !important; + padding: 0 24px !important; + overflow: hidden !important; +} + +.dhv2-work-tabs button { + height: 48px !important; + white-space: nowrap !important; +} + +.dhv2-stage { + min-height: 0 !important; + overflow: hidden !important; +} + +.dhv2-action-card { + width: 210px; + min-height: 58px !important; + padding: 10px 12px !important; + gap: 8px !important; +} + +.dhv2-action-card--mail { + width: 238px; + min-height: 72px !important; +} + +.dhv2-action-card strong { + font-size: 15px !important; + line-height: 1.15 !important; +} + +.dhv2-action-card.is-active strong { + font-size: 18px !important; +} + +.dhv2-action-card em { + display: -webkit-box !important; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical !important; + overflow: hidden !important; + white-space: normal !important; +} + +.dhv2-run-panel { + grid-template-rows: 62px minmax(0, 1fr) !important; + padding: 0 12px 12px !important; +} + +.dhv2-run-panel > header { + min-height: 62px !important; +} + +.dhv2-run-table { + min-height: 0 !important; + overflow: hidden !important; +} + +.dhv2-run-head, +.dhv2-run-row { + grid-template-columns: minmax(170px, 1.05fr) minmax(84px, 0.5fr) minmax(104px, 0.56fr) minmax(210px, 1.22fr) !important; +} + +.dhv2-run-head { + min-height: 30px !important; +} + +.dhv2-run-row { + min-height: 62px !important; + margin-bottom: 8px !important; + padding: 8px 10px !important; +} + +.dhv2-run-name strong, +.dhv2-run-log strong { + display: -webkit-box !important; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical !important; + overflow: hidden !important; + white-space: normal !important; +} + +.dhv2-today { + grid-template-rows: 48px 168px minmax(0, 1fr) !important; +} + +.dhv2-today .dhv2-panel-head, +.dhv2-ai .dhv2-panel-head, +.dhv2-report .dhv2-panel-head { + min-height: 48px !important; +} + +.dhv2-metrics { + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + gap: 7px !important; + padding: 8px 12px 0 !important; +} + +.dhv2-total { + grid-column: span 3 !important; + min-height: 48px !important; +} + +.dhv2-metric { + min-height: 48px !important; +} + +.dhv2-total, +.dhv2-metric { + padding: 7px 8px !important; +} + +.dhv2-chart { + min-height: 112px !important; + margin: 8px 12px 10px !important; + padding: 8px 10px !important; + overflow: hidden !important; +} + +.dhv2-chart > div { + height: 76px !important; + grid-template-columns: repeat(5, minmax(0, 1fr)) !important; + gap: 7px !important; +} + +.dhv2-bar em { + white-space: nowrap !important; +} + +.dhv2-report { + grid-template-rows: 42px 42px minmax(0, 1fr) !important; +} + +.dhv2-report-time { + grid-template-columns: minmax(0, 1fr) auto !important; + padding: 6px 12px 4px !important; +} + +.dhv2-report-actions { + grid-template-columns: 1.15fr 0.95fr 0.95fr 1.05fr !important; + gap: 6px !important; + padding: 5px 12px 10px !important; +} + +.dhv2-report-actions button, +.dhv2-report-time button, +.dhv2-report-time input { + min-width: 0 !important; + height: 30px !important; + min-height: 30px !important; + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-ai { + grid-template-rows: 48px 42px minmax(0, 1fr) 50px !important; +} + +.dhv2-ai-tabs { + margin: 8px 12px 6px !important; +} + +.dhv2-ai-feed { + min-height: 0 !important; + overflow: hidden !important; + gap: 8px !important; + padding: 0 12px !important; +} + +.dhv2-ai-message { + max-width: 92% !important; +} + +.dhv2-ai-message p { + display: -webkit-box !important; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical !important; + overflow: hidden !important; + word-break: break-word !important; +} + +.dhv2-ai-input { + min-height: 36px !important; + margin: 8px 12px 12px !important; +} + +/* Digital home v2 targeted refinements from dashboard review. */ +.dhv2-scale-viewport { + align-items: flex-start !important; + justify-content: flex-start !important; +} + +.dhv2-home { + grid-template-columns: 350px minmax(0, 1fr) 390px !important; + gap: 10px !important; + padding: 8px !important; +} + +.dhv2-left { + grid-template-rows: 224px minmax(0, 1fr) !important; +} + +.dhv2-center { + grid-template-rows: 462px minmax(0, 1fr) !important; +} + +.dhv2-right { + grid-template-rows: 334px 184px minmax(0, 1fr) !important; +} + +.dhv2-tasks { + grid-template-rows: 50px auto minmax(0, 1fr) auto !important; +} + +.dhv2-task-list { + overflow-y: auto !important; + overflow-x: hidden !important; + padding: 0 14px !important; +} + +.dhv2-task-row { + min-height: 70px !important; +} + +.dhv2-task-main strong { + -webkit-line-clamp: 2; +} + +.dhv2-task-main small { + -webkit-line-clamp: 1; +} + +.dhv2-stage { + overflow: hidden !important; +} + +.dhv2-action-card { + width: 218px; +} + +.dhv2-action-card--workOrder, +.dhv2-action-card--inspection, +.dhv2-action-card--phone { + left: auto; + right: auto; +} + +.dhv2-action-card--mail, +.dhv2-action-card--collaboration, +.dhv2-action-card--handoff, +.dhv2-action-card--report { + right: auto; + left: auto; +} + +.dhv2-action-card--workOrder { + top: auto; +} + +.dhv2-action-card--inspection { + top: auto; +} + +.dhv2-action-card--phone { + bottom: auto; +} + +.dhv2-action-card--mail { + top: auto; + width: 238px; +} + +.dhv2-action-card--collaboration { + top: auto; +} + +.dhv2-action-card--report, +.dhv2-action-card--handoff { + bottom: auto; +} + +.dhv2-report { + grid-template-rows: 42px 52px minmax(0, 1fr) !important; +} + +.dhv2-report-time { + min-height: 52px !important; + align-items: center !important; + padding: 8px 12px !important; +} + +.dhv2-report-time label { + min-width: 0 !important; + grid-template-columns: auto minmax(0, 1fr) !important; +} + +.dhv2-report-actions { + align-content: start !important; + padding: 6px 12px 10px !important; +} + +.dhv2-report-actions button, +.dhv2-report-time button, +.dhv2-report-time input { + height: 32px !important; + min-height: 32px !important; +} + +/* Digital home v2 report spacing fix. */ +.dhv2-report { + grid-template-rows: 42px 48px minmax(0, 1fr) !important; +} + +.dhv2-report-time { + min-height: 48px !important; + padding: 4px 12px 8px !important; + transform: translateY(-3px); +} + +.dhv2-report-actions { + padding-top: 4px !important; +} + +/* Digital home vNext current-style implementation. */ +.dhv2-home { + grid-template-columns: minmax(320px, 1fr) minmax(620px, 2fr) minmax(320px, 1fr) !important; + gap: 10px !important; + padding: 8px !important; +} + +.dhv2-left { + grid-template-rows: 210px minmax(0, 1fr) !important; +} + +.dhv2-center { + grid-template-rows: 456px minmax(0, 1fr) !important; +} + +.dhv2-right { + grid-template-rows: 318px 190px minmax(0, 1fr) !important; +} + +.dhv2-employee-body { + min-height: 0 !important; +} + +.dhv2-employee-photo, +.de-header-user-avatar { + object-fit: cover !important; + object-position: center top !important; +} + +.dhv2-employee-info dl { + gap: 5px !important; +} + +.dhv2-employee-info dd { + display: -webkit-box !important; + -webkit-line-clamp: 2 !important; + -webkit-box-orient: vertical !important; + overflow: hidden !important; + white-space: normal !important; +} + +.dhv2-task-list { + overflow-y: auto !important; + overflow-x: hidden !important; + padding-right: 10px !important; + scrollbar-width: thin; +} + +.dhv2-task-row { + position: relative; + cursor: pointer; +} + +.dhv2-task-row:hover, +.dhv2-task-row:focus-within { + border-color: rgba(30, 144, 255, 0.38) !important; + box-shadow: 0 10px 24px rgba(30, 144, 255, 0.12) !important; +} + +.dhv2-task-hover-panel { + position: fixed; + z-index: 1200; + width: 286px; + max-width: calc(100vw - 24px); + padding: 13px 14px; + border: 1px solid rgba(30, 144, 255, 0.28); + border-radius: 8px; + color: #16324e; + background: rgba(255, 255, 255, 0.96); + box-shadow: 0 16px 38px rgba(10, 72, 138, 0.18); + pointer-events: none; +} + +.dhv2-task-hover-panel::before { + content: ""; + position: absolute; + left: -7px; + top: 22px; + width: 12px; + height: 12px; + border-left: 1px solid rgba(30, 144, 255, 0.28); + border-bottom: 1px solid rgba(30, 144, 255, 0.28); + background: rgba(255, 255, 255, 0.96); + transform: rotate(45deg); +} + +.dhv2-task-hover-panel > strong { + display: block; + margin-bottom: 10px; + font-size: 14px; + line-height: 1.3; +} + +.dhv2-task-hover-panel dl { + display: grid; + gap: 8px; + margin: 0; +} + +.dhv2-task-hover-panel div { + display: grid; + grid-template-columns: 64px minmax(0, 1fr); + gap: 8px; +} + +.dhv2-task-hover-panel dt { + color: #5b7590; + font-size: 12px; +} + +.dhv2-task-hover-panel dd { + margin: 0; + color: #1e3a5c; + font-size: 12px; + line-height: 1.45; +} + +.dhv2-stage { + background: + radial-gradient(circle at 50% 54%, rgba(79, 172, 254, 0.16), transparent 34%), + linear-gradient(180deg, rgba(255, 255, 255, 0.72), rgba(236, 247, 255, 0.74)) !important; +} + +.dhv2-stage-image { + inset: 50% auto auto 50% !important; + width: min(34%, 240px) !important; + height: min(78%, 340px) !important; + object-fit: contain !important; + object-position: center bottom !important; + opacity: 1 !important; + transform: translate(-50%, -45%); + pointer-events: none; +} + +.dhv2-action-card { + min-height: 62px !important; + padding: 10px 12px !important; +} + +.dhv2-action-card.is-active { + overflow: visible !important; +} + +.dhv2-action-card.is-active::after { + content: ""; + position: absolute; + right: 12px; + top: 12px; + width: 18px; + height: 18px; + border: 2px solid rgba(30, 144, 255, 0.22); + border-top-color: #1e90ff; + border-radius: 50%; + background: transparent !important; + animation: dhv2Spin 900ms linear infinite; + opacity: 1 !important; +} + +.dhv2-action-card.is-active strong { + padding-right: 24px; +} + +.dhv2-action-progress { + display: none !important; +} + +.dhv2-run-effect { + display: inline-grid !important; + grid-template-columns: minmax(0, 1fr) !important; + justify-items: center; + gap: 2px !important; + padding: 5px 8px; + border-radius: 8px; + color: #0f766e; + background: #ecfdf5; +} + +.dhv2-run-effect strong { + color: #0f766e; + font-size: 14px; + line-height: 1; +} + +.dhv2-run-effect small { + color: #64748b; + font-size: 11px; + line-height: 1; +} + +.dhv2-metrics { + grid-template-columns: repeat(5, minmax(0, 1fr)) !important; + gap: 6px !important; + padding: 8px 12px 0 !important; +} + +.dhv2-total { + grid-column: 1 / -1 !important; + min-height: 46px !important; +} + +.dhv2-metric { + min-height: 42px !important; + padding: 6px 5px !important; +} + +.dhv2-metric span { + font-size: 11px !important; +} + +.dhv2-metric strong { + font-size: 14px !important; +} + +.dhv2-chart { + min-height: 110px !important; + margin: 8px 12px 10px !important; + padding: 8px 10px !important; +} + +.dhv2-chart > div { + height: 74px !important; + grid-template-columns: repeat(5, minmax(0, 1fr)) !important; + gap: 7px !important; +} + +.dhv2-bar { + grid-template-rows: minmax(0, 1fr) 14px 14px !important; +} + +.dhv2-bar > i { + display: none !important; +} + +.dhv2-bar-pair { + align-self: end; + display: inline-flex; + align-items: end; + justify-content: center; + gap: 4px; + height: 100%; + min-height: 28px; +} + +.dhv2-bar-pair i { + display: block !important; + width: 11px !important; + min-height: 8px; + border-radius: 4px 4px 1px 1px; + background: linear-gradient(180deg, #60b5ff, #1e90ff) !important; + animation: dhv2BarPulse 1.8s ease-in-out infinite; + transform-origin: bottom; +} + +.dhv2-bar-pair i.is-failure { + background: linear-gradient(180deg, #ff9f7a, #d94a4a) !important; + animation-delay: 220ms; +} + +.dhv2-bar strong { + font-size: 11px !important; + white-space: nowrap !important; +} + +.dhv2-bar em { + white-space: nowrap !important; +} + +@keyframes dhv2Spin { + to { transform: rotate(360deg); } +} + +@keyframes dhv2BarPulse { + 0%, 100% { transform: scaleY(0.92); filter: brightness(1); } + 50% { transform: scaleY(1.04); filter: brightness(1.12); } +} + +/* Digital home AI communication statistics. */ +.dhv2-ai { + grid-template-rows: 48px 96px minmax(0, 1fr) 50px !important; +} + +.dhv2-ai-stats { + display: grid; + grid-template-rows: repeat(2, minmax(0, 1fr)); + gap: 7px; + padding: 8px 12px 4px; + min-height: 0; +} + +.dhv2-ai-stat-group { + min-width: 0; + min-height: 0; + display: grid; + grid-template-columns: 56px minmax(0, 1fr); + align-items: center; + gap: 8px; + padding: 7px 8px; + border: 1px solid rgba(30, 144, 255, 0.16); + border-radius: 8px; + background: linear-gradient(135deg, rgba(245, 251, 255, 0.96), rgba(255, 255, 255, 0.92)); +} + +.dhv2-ai-stat-group > span { + color: #5b7590; + font-size: 12px; + font-weight: 700; + white-space: nowrap; +} + +.dhv2-ai-stat-group > div { + min-width: 0; + display: flex; + align-items: center; + gap: 6px; + overflow: hidden; +} + +.dhv2-ai-stat-group strong { + flex: 1 1 0; + min-width: 0; + display: inline-flex; + align-items: center; + justify-content: space-between; + gap: 3px; + padding: 4px 5px; + border-radius: 7px; + color: #1677d2; + background: #eef7ff; + font-size: 11px; + line-height: 1; + white-space: nowrap; +} + +.dhv2-ai-stat-group em { + color: #16324e; + font-style: normal; + font-weight: 800; +} + +/* Keep the center task avatar anchored while the working animation runs. */ +.dhv2-stage-image { + left: 50% !important; + top: 50% !important; + right: auto !important; + bottom: auto !important; + transform: translate3d(-50%, -45%, 0) scale(1) !important; +} + +.dhv2-stage.is-working .dhv2-stage-image { + animation: dhv2CenteredAgentWorking 3.2s ease-in-out infinite !important; +} + +.dhv2-stage.is-standby .dhv2-stage-image { + animation: dhv2CenteredAgentStandby 4.2s ease-in-out infinite !important; +} + +@keyframes dhv2CenteredAgentWorking { + 0%, 100% { transform: translate3d(-50%, -45%, 0) scale(1); } + 38% { transform: translate3d(-50%, calc(-45% - 4px), 0) scale(1.012); } + 72% { transform: translate3d(calc(-50% + 3px), calc(-45% - 1px), 0) scale(1.006); } +} + +@keyframes dhv2CenteredAgentStandby { + 0%, 100% { transform: translate3d(-50%, -45%, 0) scale(1); } + 50% { transform: translate3d(-50%, calc(-45% - 2px), 0) scale(1.004); } +} + +/* Digital home vNext visual spacing pass: match the approved mockup rhythm. */ +.dhv2-scale-viewport { + align-items: center !important; + justify-content: center !important; + background: #eaf3fb !important; +} + +.dhv2-home { + grid-template-columns: 330px minmax(640px, 1fr) 360px !important; + gap: 10px !important; + padding: 8px !important; +} + +.dhv2-left { + gap: 10px !important; + grid-template-rows: 190px minmax(0, 1fr) !important; +} + +.dhv2-center { + gap: 10px !important; + grid-template-rows: minmax(0, 1.45fr) minmax(230px, 0.75fr) !important; +} + +.dhv2-right { + gap: 10px !important; + grid-template-rows: 300px 158px minmax(0, 1fr) !important; +} + +.dhv2-panel, +.dhv2-work-panel, +.dhv2-run-panel { + border-radius: 10px !important; + box-shadow: 0 8px 22px rgba(44, 88, 132, 0.08) !important; +} + +.dhv2-panel-head { + min-height: 46px !important; + height: 46px !important; + padding: 0 14px !important; +} + +.dhv2-panel-head h2, +.dhv2-run-panel h2 { + font-size: 17px !important; +} + +.dhv2-employee-body { + height: calc(100% - 46px) !important; + grid-template-columns: 92px minmax(0, 1fr) !important; + gap: 12px !important; + align-items: center !important; + padding: 12px 14px !important; +} + +.dhv2-employee-photo { + width: 86px !important; + height: 108px !important; + border-radius: 8px !important; +} + +.dhv2-employee-name strong { + font-size: 19px !important; +} + +.dhv2-employee-name span { + padding: 4px 8px !important; +} + +.dhv2-employee-info dl { + display: block !important; +} + +.dhv2-employee-info dl div:not(:first-child) { + display: none !important; +} + +.dhv2-employee-info dt { + display: none !important; +} + +.dhv2-employee-info dd { + margin: 6px 0 0 !important; + color: #5b7590 !important; + font-size: 12px !important; + line-height: 1.45 !important; + -webkit-line-clamp: 3 !important; +} + +.dhv2-tasks { + grid-template-rows: 46px auto minmax(0, 1fr) auto !important; +} + +.dhv2-task-tabs { + margin: 10px 12px 8px !important; +} + +.dhv2-task-tabs button { + height: 32px !important; +} + +.dhv2-task-list { + padding: 0 12px 12px !important; +} + +.dhv2-task-row { + min-height: 72px !important; + padding: 10px 0 !important; + border-radius: 0 !important; + border: 0 !important; + border-bottom: 1px solid rgba(142, 183, 220, 0.22) !important; + background: transparent !important; + box-shadow: none !important; +} + +.dhv2-task-row:hover, +.dhv2-task-row:focus-within { + background: rgba(245, 251, 255, 0.9) !important; + box-shadow: none !important; +} + +.dhv2-task-main strong { + font-size: 14px !important; + line-height: 1.3 !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-task-main small { + margin-top: 4px !important; + font-size: 12px !important; + line-height: 1.35 !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-task-meta { + margin-top: 6px !important; +} + +.dhv2-task-chip { + padding: 3px 7px !important; +} + +.dhv2-task-actions { + padding: 8px 12px 12px !important; +} + +.dhv2-work-panel { + grid-template-rows: 44px minmax(0, 1fr) !important; + background: + radial-gradient(circle at 50% 50%, rgba(30, 144, 255, 0.08), transparent 42%), + linear-gradient(180deg, #f7fbff, #fff) !important; +} + +.dhv2-work-tabs { + height: 44px !important; + padding: 0 22px !important; + gap: 18px !important; +} + +.dhv2-work-tabs button { + height: 44px !important; +} + +.dhv2-stage { + background: transparent !important; +} + +.dhv2-stage-image { + left: 50% !important; + top: auto !important; + bottom: 18px !important; + width: min(42%, 330px) !important; + height: auto !important; + max-height: 82% !important; + transform: translate3d(-50%, 0, 0) scale(1) !important; + filter: drop-shadow(0 22px 28px rgba(15, 80, 150, 0.16)) !important; +} + +.dhv2-stage.is-working .dhv2-stage-image { + animation: dhv2MockupAgentWorking 2.8s ease-in-out infinite !important; +} + +.dhv2-stage.is-standby .dhv2-stage-image { + animation: dhv2MockupAgentStandby 3.6s ease-in-out infinite !important; +} + +.dhv2-action-card { + min-height: 70px !important; + padding: 10px 12px !important; + border-radius: 10px !important; + background: rgba(255, 255, 255, 0.92) !important; + box-shadow: 0 10px 24px rgba(30, 144, 255, 0.12) !important; +} + +.dhv2-action-card i { + width: 36px !important; + height: 36px !important; + border-radius: 10px !important; +} + +.dhv2-action-card strong, +.dhv2-action-card.is-active strong { + font-size: 15px !important; +} + +.dhv2-action-card em { + margin-top: 3px !important; + font-size: 12px !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-action-card.is-active { + box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.16), 0 0 36px rgba(30, 144, 255, 0.22) !important; +} + +.dhv2-run-panel { + grid-template-rows: 54px minmax(0, 1fr) !important; + padding: 0 12px 12px !important; +} + +.dhv2-run-panel > header { + min-height: 54px !important; +} + +.dhv2-run-panel > header p { + display: none !important; +} + +.dhv2-run-table { + display: grid !important; + grid-template-rows: 28px repeat(4, minmax(44px, 1fr)) !important; + gap: 7px !important; +} + +.dhv2-run-head, +.dhv2-run-row { + grid-template-columns: 1.15fr 0.55fr 0.62fr 1.7fr !important; + gap: 8px !important; +} + +.dhv2-run-row { + min-height: 44px !important; + margin: 0 !important; + padding: 8px 10px !important; +} + +.dhv2-run-name i { + width: 32px !important; + height: 32px !important; +} + +.dhv2-run-name strong, +.dhv2-run-log strong { + font-size: 12px !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-run-effect { + padding: 3px 6px !important; +} + +.dhv2-today { + grid-template-rows: 46px 126px minmax(0, 1fr) !important; +} + +.dhv2-metrics { + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + gap: 7px !important; + padding: 8px 12px 0 !important; +} + +.dhv2-total, +.dhv2-metric { + min-height: 52px !important; + padding: 8px !important; +} + +.dhv2-total { + grid-column: span 1 !important; +} + +.dhv2-total span, +.dhv2-metric span { + font-size: 12px !important; +} + +.dhv2-total strong, +.dhv2-metric strong { + margin-top: 4px !important; + font-size: 21px !important; +} + +.dhv2-chart { + margin: 8px 12px 10px !important; + padding: 8px 10px !important; +} + +.dhv2-chart > div { + height: 118px !important; + gap: 8px !important; + padding-top: 8px !important; +} + +.dhv2-bar { + grid-template-rows: minmax(0, 1fr) 16px 14px !important; +} + +.dhv2-bar-pair { + min-height: 46px !important; +} + +.dhv2-bar-pair i { + width: 18px !important; +} + +.dhv2-report { + grid-template-rows: 42px 46px minmax(0, 1fr) !important; +} + +.dhv2-report-time { + min-height: 46px !important; + transform: none !important; + padding: 4px 12px 6px !important; +} + +.dhv2-report-actions { + grid-template-columns: repeat(4, minmax(0, 1fr)) !important; + gap: 6px !important; + padding: 4px 12px 10px !important; +} + +.dhv2-ai { + grid-template-rows: 46px minmax(0, 1fr) 42px !important; +} + +.dhv2-ai-stats { + grid-template-rows: none !important; + grid-template-columns: repeat(2, minmax(0, 1fr)) !important; + gap: 7px !important; + padding: 10px 12px 6px !important; +} + +.dhv2-ai-stat-group { + display: block !important; + padding: 8px !important; +} + +.dhv2-ai-stat-group > span { + display: block !important; + font-size: 11px !important; +} + +.dhv2-ai-stat-group > div { + display: grid !important; + grid-template-columns: repeat(2, minmax(0, 1fr)) !important; + gap: 5px !important; + margin-top: 6px !important; +} + +.dhv2-ai-stat-group strong { + padding: 0 !important; + background: transparent !important; + font-size: 12px !important; +} + +.dhv2-ai-feed { + padding: 0 12px !important; +} + +.dhv2-ai-message p { + -webkit-line-clamp: 2 !important; +} + +.dhv2-ai-input { + min-height: 32px !important; + margin: 6px 12px 10px !important; +} + +@keyframes dhv2MockupAgentWorking { + 0%, 100% { transform: translate3d(-50%, 0, 0) scale(1); } + 50% { transform: translate3d(-50%, -5px, 0) scale(1.006); } +} + +@keyframes dhv2MockupAgentStandby { + 0%, 100% { transform: translate3d(-50%, 0, 0) scale(1); } + 50% { transform: translate3d(-50%, -3px, 0) scale(1.003); } +} + +/* Run detail table: show count only and keep latest step logs readable. */ +.dhv2-run-total { + display: flex !important; + align-items: center !important; + gap: 0 !important; +} + +.dhv2-run-total mark { + display: none !important; +} + +.dhv2-run-log .dhv2-motion-progress { + display: none !important; +} + +.dhv2-run-log strong { + display: -webkit-box !important; + -webkit-line-clamp: 2 !important; + -webkit-box-orient: vertical !important; + overflow: hidden !important; + line-height: 1.35 !important; +} + +/* Digital home vNext polish: restore complete profile, coordinated stats, report and AI panels. */ +.dhv2-employee-body { + grid-template-columns: 92px minmax(0, 1fr) !important; + align-items: center !important; +} + +.dhv2-employee-info { + gap: 7px !important; +} + +.dhv2-employee-info dl { + display: grid !important; + gap: 4px !important; +} + +.dhv2-employee-info dl div, +.dhv2-employee-info dl div:not(:first-child) { + display: grid !important; + grid-template-columns: 34px minmax(0, 1fr) !important; + gap: 6px !important; + align-items: start !important; +} + +.dhv2-employee-info dt { + display: block !important; + color: #5b7590 !important; + font-size: 11px !important; + font-weight: 800 !important; + line-height: 1.35 !important; +} + +.dhv2-employee-info dd { + display: -webkit-box !important; + margin: 0 !important; + color: #294463 !important; + font-size: 11px !important; + line-height: 1.35 !important; + -webkit-line-clamp: 1 !important; + -webkit-box-orient: vertical !important; + overflow: hidden !important; +} + +.dhv2-employee-info dl div:nth-child(3) dd { + -webkit-line-clamp: 2 !important; +} + +.dhv2-action-card::after { + inset: -1px !important; +} + +.dhv2-action-card.is-active::after { + content: "" !important; + position: absolute !important; + inset: auto !important; + top: 10px !important; + right: 10px !important; + left: auto !important; + bottom: auto !important; + z-index: 3 !important; + width: 18px !important; + height: 18px !important; + border: 2px solid rgba(30, 144, 255, 0.22) !important; + border-top-color: #1e90ff !important; + border-radius: 50% !important; + background: transparent !important; + opacity: 1 !important; + transform: none !important; + animation: dhv2Spin 900ms linear infinite !important; +} + +.dhv2-action-card.is-active strong { + padding-right: 24px !important; +} + +.dhv2-run-head, +.dhv2-run-row { + grid-template-columns: 1.08fr 0.48fr 0.58fr 1.95fr !important; +} + +.dhv2-run-log strong { + font-weight: 700 !important; +} + +.dhv2-today { + grid-template-rows: 46px 122px minmax(0, 1fr) !important; +} + +.dhv2-metrics { + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + gap: 7px !important; + padding: 8px 12px 0 !important; +} + +.dhv2-total, +.dhv2-metric { + min-height: 52px !important; + display: grid !important; + grid-template-columns: none !important; + gap: 2px !important; + align-content: center !important; + padding: 7px 8px !important; + border: 1px solid rgba(142, 183, 220, 0.35) !important; + border-radius: 8px !important; + background: #fff !important; +} + +.dhv2-total { + grid-column: span 1 !important; +} + +.dhv2-total svg { + display: none !important; +} + +.dhv2-total span, +.dhv2-metric span { + overflow: hidden !important; + color: #667992 !important; + font-size: 11px !important; + font-weight: 800 !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-total strong, +.dhv2-metric strong { + margin: 2px 0 0 !important; + color: #1e90ff !important; + font-size: 19px !important; + line-height: 1 !important; + font-weight: 900 !important; +} + +.dhv2-chart { + min-height: 0 !important; + margin: 7px 12px 10px !important; + padding: 8px 10px !important; + border: 1px solid rgba(142, 183, 220, 0.35) !important; + border-radius: 8px !important; + background: #fff !important; + overflow: visible !important; +} + +.dhv2-chart header { + min-height: 20px !important; +} + +.dhv2-chart header strong { + color: #12243d !important; + font-size: 13px !important; + font-weight: 900 !important; +} + +.dhv2-chart header span { + color: #667992 !important; + font-size: 11px !important; +} + +.dhv2-chart > div { + height: 112px !important; + display: grid !important; + grid-template-columns: repeat(5, minmax(0, 1fr)) !important; + align-items: end !important; + gap: 8px !important; + padding-top: 8px !important; + overflow: visible !important; +} + +.dhv2-bar { + position: relative !important; + height: 100% !important; + display: grid !important; + grid-template-rows: minmax(0, 1fr) 16px 14px !important; + justify-items: center !important; + gap: 3px !important; + cursor: help !important; +} + +.dhv2-bar:hover::after, +.dhv2-bar:focus-visible::after { + content: attr(data-tooltip) !important; + position: absolute !important; + left: 50% !important; + bottom: calc(100% + 8px) !important; + z-index: 20 !important; + width: max-content !important; + max-width: 220px !important; + transform: translateX(-50%) !important; + padding: 7px 9px !important; + border: 1px solid #b8dcff !important; + border-radius: 8px !important; + color: #173452 !important; + background: #fff !important; + box-shadow: 0 12px 28px rgba(30, 144, 255, 0.18) !important; + font-size: 12px !important; + line-height: 1.45 !important; + white-space: normal !important; +} + +.dhv2-bar-pair { + min-height: 52px !important; + height: 100% !important; + display: inline-flex !important; + align-items: end !important; + justify-content: center !important; + gap: 4px !important; +} + +.dhv2-bar-pair i { + width: 14px !important; + min-height: 7px !important; + border-radius: 4px 4px 1px 1px !important; + background: linear-gradient(180deg, #60b5ff, #1e90ff) !important; + transform-origin: bottom !important; + animation: dhv2BarPulse 1.8s ease-in-out infinite !important; +} + +.dhv2-bar-pair i.is-failure { + background: linear-gradient(180deg, #ff9f7a, #d94a4a) !important; +} + +.dhv2-bar strong { + color: #173452 !important; + font-size: 11px !important; + line-height: 1 !important; + white-space: nowrap !important; +} + +.dhv2-bar em { + max-width: 100% !important; + overflow: hidden !important; + color: #667992 !important; + font-size: 10px !important; + font-style: normal !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-report { + display: grid !important; + grid-template-rows: 42px 40px 42px minmax(0, 1fr) !important; + overflow: hidden !important; +} + +.dhv2-report-modes { + padding: 7px 12px 4px !important; +} + +.dhv2-report-time { + min-height: 42px !important; + display: grid !important; + grid-template-columns: minmax(0, 1fr) auto !important; + align-items: center !important; + gap: 8px !important; + padding: 3px 12px 5px !important; + transform: none !important; +} + +.dhv2-report-time label { + min-width: 0 !important; + align-items: center !important; + color: #667992 !important; + font-size: 12px !important; +} + +.dhv2-report-time input, +.dhv2-report-time button { + height: 30px !important; + min-height: 30px !important; +} + +.dhv2-report-actions { + display: grid !important; + grid-template-columns: repeat(4, minmax(0, 1fr)) !important; + align-content: center !important; + gap: 6px !important; + padding: 5px 12px 10px !important; +} + +.dhv2-report-actions button { + height: 32px !important; + min-height: 32px !important; + padding: 0 6px !important; + font-size: 12px !important; +} + +.dhv2-ai { + display: grid !important; + grid-template-rows: 46px minmax(0, 1fr) 42px !important; +} + +.dhv2-ai-body { + min-height: 0 !important; + display: grid !important; + grid-template-rows: 74px minmax(0, 1fr) !important; + gap: 8px !important; + padding: 10px 12px 8px !important; +} + +.dhv2-ai-stats { + display: grid !important; + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + gap: 7px !important; + padding: 0 !important; +} + +.dhv2-ai-stat { + min-width: 0 !important; + min-height: 0 !important; + display: grid !important; + gap: 3px !important; + align-content: center !important; + padding: 8px !important; + border: 1px solid rgba(142, 183, 220, 0.35) !important; + border-radius: 8px !important; + background: #fff !important; +} + +.dhv2-ai-stat span { + overflow: hidden !important; + color: #667992 !important; + font-size: 11px !important; + font-weight: 800 !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-ai-stat strong { + color: #1e90ff !important; + font-size: 20px !important; + line-height: 1 !important; + font-weight: 900 !important; +} + +.dhv2-ai-channels { + min-height: 0 !important; + display: grid !important; + gap: 7px !important; + align-content: start !important; + overflow: hidden !important; +} + +.dhv2-ai-channel { + min-width: 0 !important; + display: grid !important; + grid-template-columns: 54px minmax(0, 1fr) 34px !important; + gap: 8px !important; + align-items: center !important; + color: #294463 !important; + font-size: 12px !important; + font-weight: 800 !important; +} + +.dhv2-ai-channel span { + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-ai-channel i { + min-width: 4px !important; + height: 7px !important; + border-radius: 999px !important; + background: linear-gradient(90deg, #1e90ff, #14b8a6) !important; + animation: dhv2ChannelPulse 1.7s ease-in-out infinite !important; +} + +.dhv2-ai-channel b { + justify-self: end !important; + color: #173452 !important; + font-size: 12px !important; +} + +.dhv2-ai-feed { + display: none !important; +} + +.dhv2-ai-input { + min-height: 32px !important; + margin: 4px 12px 10px !important; +} + +@keyframes dhv2ChannelPulse { + 0%, 100% { filter: brightness(1); } + 50% { filter: brightness(1.16); } +} + +/* Digital home typography pass: align real page text rhythm with the vNext mockup. */ +.dhv2-home, +.dhv2-home button, +.dhv2-home input { + font-family: "Microsoft YaHei", "PingFang SC", "Segoe UI", Arial, sans-serif !important; + letter-spacing: 0 !important; +} + +.dhv2-panel-head h2, +.dhv2-run-panel h2 { + color: #12243d !important; + font-size: 17px !important; + line-height: 1.25 !important; + font-weight: 800 !important; +} + +.dhv2-panel-head span, +.dhv2-panel-head button, +.dhv2-run-panel > header button { + font-size: 12px !important; + line-height: 1.25 !important; + font-weight: 700 !important; +} + +.dhv2-employee-name strong { + color: #12243d !important; + font-size: 19px !important; + line-height: 1.25 !important; + font-weight: 800 !important; +} + +.dhv2-employee-name span { + font-size: 12px !important; + font-weight: 700 !important; +} + +.dhv2-employee-info dt, +.dhv2-task-chip, +.dhv2-total span, +.dhv2-metric span, +.dhv2-ai-stat span, +.dhv2-ai-channel, +.dhv2-report-time label { + font-weight: 700 !important; +} + +.dhv2-employee-info dd, +.dhv2-task-main small, +.dhv2-task-row em, +.dhv2-run-head, +.dhv2-run-log strong, +.dhv2-chart header span, +.dhv2-bar em { + color: #667992 !important; + font-weight: 500 !important; +} + +.dhv2-task-main strong { + color: #12243d !important; + font-size: 14px !important; + line-height: 1.32 !important; + font-weight: 700 !important; +} + +.dhv2-task-main small { + font-size: 12px !important; + line-height: 1.38 !important; +} + +.dhv2-task-chip { + font-size: 11px !important; + line-height: 1.25 !important; +} + +.dhv2-action-card span { + font-size: 12px !important; + line-height: 1.25 !important; + font-weight: 700 !important; +} + +.dhv2-action-card strong, +.dhv2-action-card.is-active strong { + color: #163657 !important; + font-size: 15px !important; + line-height: 1.28 !important; + font-weight: 800 !important; +} + +.dhv2-action-card em { + color: #667992 !important; + font-size: 12px !important; + line-height: 1.35 !important; + font-weight: 500 !important; +} + +.dhv2-run-head { + font-size: 12px !important; + line-height: 1.25 !important; + font-weight: 700 !important; +} + +.dhv2-run-name strong { + color: #12243d !important; + font-size: 12px !important; + line-height: 1.35 !important; + font-weight: 700 !important; +} + +.dhv2-run-total strong, +.dhv2-run-effect strong { + color: #1e90ff !important; + font-size: 13px !important; + line-height: 1.2 !important; + font-weight: 800 !important; +} + +.dhv2-run-effect small { + color: #667992 !important; + font-size: 10px !important; + line-height: 1.2 !important; + font-weight: 500 !important; +} + +.dhv2-run-log strong { + color: #34516f !important; + font-size: 12px !important; + line-height: 1.42 !important; +} + +.dhv2-total strong, +.dhv2-metric strong, +.dhv2-ai-stat strong { + color: #1e90ff !important; + font-size: 20px !important; + line-height: 1.08 !important; + font-weight: 800 !important; +} + +.dhv2-total span, +.dhv2-metric span, +.dhv2-ai-stat span { + font-size: 12px !important; + line-height: 1.25 !important; +} + +.dhv2-chart header strong { + color: #12243d !important; + font-size: 13px !important; + line-height: 1.25 !important; + font-weight: 800 !important; +} + +.dhv2-chart header span { + font-size: 12px !important; + line-height: 1.25 !important; +} + +.dhv2-bar strong { + color: #12243d !important; + font-size: 11px !important; + line-height: 1.2 !important; + font-weight: 700 !important; +} + +.dhv2-bar em { + font-size: 10px !important; + line-height: 1.2 !important; +} + +.dhv2-report-modes button, +.dhv2-report-time input, +.dhv2-report-time button, +.dhv2-report-actions button, +.dhv2-ai-input { + font-size: 12px !important; + line-height: 1.25 !important; + font-weight: 700 !important; +} + +.dhv2-ai-channel { + font-size: 12px !important; + line-height: 1.25 !important; +} + +.dhv2-ai-channel b { + font-size: 12px !important; + line-height: 1.25 !important; + font-weight: 800 !important; +} + +/* Digital home vNext parity pass: card list, softer typography, animated agent, and report spacing. */ +.dhv2-home, +.dhv2-home button, +.dhv2-home input { + font-family: "Microsoft YaHei UI", "Microsoft YaHei", "PingFang SC", "Segoe UI", Arial, sans-serif !important; + -webkit-font-smoothing: antialiased; + text-rendering: geometricPrecision; +} + +.dhv2-home { + color: #12243d !important; + font-size: 13px !important; +} + +.dhv2-panel-head h2, +.dhv2-run-panel h2 { + font-size: 17px !important; + font-weight: 700 !important; +} + +.dhv2-panel-head span, +.dhv2-panel-head button, +.dhv2-task-tabs button, +.dhv2-task-actions button, +.dhv2-run-panel > header button, +.dhv2-report-modes button, +.dhv2-report-actions button, +.dhv2-report-time button { + font-weight: 600 !important; +} + +.dhv2-task-list { + display: grid !important; + gap: 8px !important; + align-content: start !important; + padding: 0 12px 10px !important; + overflow-y: auto !important; + overflow-x: hidden !important; +} + +.dhv2-task-row { + min-height: 70px !important; + display: grid !important; + grid-template-columns: 18px minmax(0, 1fr) !important; + gap: 8px !important; + align-items: start !important; + padding: 10px !important; + border: 1px solid rgba(142, 183, 220, 0.52) !important; + border-radius: 8px !important; + background: rgba(255, 255, 255, 0.96) !important; + box-shadow: 0 6px 14px rgba(44, 88, 132, 0.06) !important; + cursor: pointer !important; + transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease, background 160ms ease !important; +} + +.dhv2-task-row:hover, +.dhv2-task-row:focus-within { + border-color: rgba(30, 144, 255, 0.46) !important; + background: #fff !important; + box-shadow: 0 10px 24px rgba(30, 144, 255, 0.13) !important; + transform: translateY(-1px) !important; +} + +.dhv2-task-row.is-selected { + border-color: rgba(30, 144, 255, 0.58) !important; + background: linear-gradient(180deg, #ffffff, #f3f9ff) !important; +} + +.dhv2-task-row input { + width: 16px !important; + height: 16px !important; + margin: 2px 0 0 !important; + accent-color: #1e90ff !important; + cursor: pointer !important; +} + +.dhv2-task-main { + gap: 4px !important; +} + +.dhv2-task-main strong { + color: #12243d !important; + font-size: 14px !important; + line-height: 1.34 !important; + font-weight: 650 !important; +} + +.dhv2-task-main small { + color: #667992 !important; + font-size: 12px !important; + line-height: 1.42 !important; + font-weight: 400 !important; +} + +.dhv2-task-chip, +.dhv2-task-row em { + min-height: 20px !important; + padding: 2px 7px !important; + font-size: 11px !important; + line-height: 1.25 !important; + font-weight: 500 !important; +} + +.dhv2-task-actions { + display: grid !important; + grid-template-columns: 1fr 1fr !important; + gap: 8px !important; + padding: 8px 12px 12px !important; +} + +.dhv2-task-actions button { + width: 100% !important; + height: 34px !important; + min-height: 34px !important; + justify-content: center !important; + margin: 0 !important; + font-size: 13px !important; +} + +.dhv2-stage { + background: + radial-gradient(circle at 50% 56%, rgba(30,144,255,0.1), transparent 42%), + linear-gradient(180deg, #f7fbff, #fff) !important; +} + +.dhv2-stage-image { + left: 50% !important; + bottom: 16px !important; + top: auto !important; + width: min(45%, 340px) !important; + max-height: 84% !important; + opacity: 1 !important; + object-fit: contain !important; + filter: drop-shadow(0 22px 28px rgba(15, 80, 150, 0.16)) saturate(1.02) !important; + transform: translate3d(-50%, 0, 0) scale(1) !important; +} + +.dhv2-stage.is-working .dhv2-stage-image { + animation: dhv2VNextAgentBreathe 2.8s ease-in-out infinite !important; +} + +.dhv2-stage.is-standby .dhv2-stage-image { + animation: dhv2VNextAgentIdle 3.8s ease-in-out infinite !important; +} + +.dhv2-stage.is-working::after { + content: "" !important; + position: absolute !important; + left: 50% !important; + bottom: 24px !important; + width: 220px !important; + height: 18px !important; + border-radius: 50% !important; + transform: translateX(-50%) !important; + background: radial-gradient(ellipse, rgba(30, 144, 255, 0.18), transparent 68%) !important; + animation: dhv2VNextShadow 2.8s ease-in-out infinite !important; + pointer-events: none !important; +} + +.dhv2-metrics { + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; +} + +.dhv2-total { + grid-column: 1 / -1 !important; + min-height: 48px !important; +} + +.dhv2-metric { + min-height: 48px !important; +} + +.dhv2-total strong, +.dhv2-metric strong, +.dhv2-ai-stat strong { + font-size: 20px !important; + font-weight: 700 !important; +} + +.dhv2-total span, +.dhv2-metric span, +.dhv2-ai-stat span, +.dhv2-chart header span { + font-weight: 500 !important; +} + +.dhv2-bar em { + display: block !important; + max-width: 100% !important; + color: #526f8f !important; + font-size: 11px !important; + line-height: 1.22 !important; + font-weight: 500 !important; + white-space: nowrap !important; +} + +.dhv2-report { + grid-template-rows: 42px 36px 38px minmax(0, 1fr) !important; +} + +.dhv2-report-modes { + padding: 5px 12px 2px !important; +} + +.dhv2-report-time { + min-height: 38px !important; + padding: 1px 12px 4px !important; +} + +.dhv2-report-time input, +.dhv2-report-time button { + height: 28px !important; + min-height: 28px !important; +} + +.dhv2-report-actions { + align-content: start !important; + padding: 2px 12px 8px !important; +} + +.dhv2-report-actions button { + height: 30px !important; + min-height: 30px !important; +} + +.dhv2-run-name strong, +.dhv2-run-log strong, +.dhv2-action-card em, +.dhv2-employee-info dd { + font-weight: 400 !important; +} + +@keyframes dhv2VNextAgentBreathe { + 0%, 100% { transform: translate3d(-50%, 0, 0) scale(1); } + 50% { transform: translate3d(-50%, -7px, 0) scale(1.012); } +} + +@keyframes dhv2VNextAgentIdle { + 0%, 100% { transform: translate3d(-50%, 0, 0) scale(1); } + 50% { transform: translate3d(-50%, -4px, 0) scale(1.004); } +} + +@keyframes dhv2VNextShadow { + 0%, 100% { opacity: 0.56; transform: translateX(-50%) scaleX(1); } + 50% { opacity: 0.36; transform: translateX(-50%) scaleX(0.86); } +} + +/* Digital home final parity pass: align the real packaged page with the approved vNext mockup. */ +.de-shell { + overflow: hidden !important; +} + +.de-shell-body { + overflow: hidden !important; +} + +.de-dashboard--compact { + overflow: hidden !important; + background: #eaf3fb !important; +} + +.dhv2-scale-viewport { + width: 100% !important; + height: 100% !important; + min-width: 0 !important; + min-height: 0 !important; + display: flex !important; + align-items: stretch !important; + justify-content: stretch !important; + overflow: hidden !important; + background: #eaf3fb !important; +} + +.dhv2-scale-stage { + flex: 1 1 auto !important; + width: 100% !important; + height: 100% !important; + min-width: 0 !important; + min-height: 0 !important; + overflow: hidden !important; +} + +.dhv2-home { + width: 100% !important; + height: 100% !important; + min-width: 0 !important; + min-height: 0 !important; + transform: none !important; + display: grid !important; + grid-template-columns: minmax(330px, 0.96fr) minmax(660px, 2fr) minmax(350px, 1fr) !important; + grid-template-rows: minmax(0, 1fr) !important; + gap: 10px !important; + padding: 8px 10px 10px !important; + overflow: hidden !important; + color: #12243d !important; + font-family: "Microsoft YaHei UI", "Microsoft YaHei", "PingFang SC", "Segoe UI", Arial, sans-serif !important; + font-size: 13px !important; + letter-spacing: 0 !important; +} + +.dhv2-panel, +.dhv2-work-panel, +.dhv2-run-panel { + border: 1px solid rgba(142, 183, 220, 0.56) !important; + border-radius: 10px !important; + background: rgba(255, 255, 255, 0.92) !important; + box-shadow: 0 8px 22px rgba(44, 88, 132, 0.08) !important; +} + +.dhv2-left, +.dhv2-center, +.dhv2-right { + min-width: 0 !important; + min-height: 0 !important; + gap: 10px !important; +} + +.dhv2-left { + grid-template-rows: 220px minmax(0, 1fr) !important; +} + +.dhv2-center { + grid-template-rows: minmax(0, 1.55fr) minmax(214px, 0.68fr) !important; +} + +.dhv2-right { + grid-template-rows: 338px 168px minmax(210px, 1fr) !important; +} + +.dhv2-panel-head { + height: 44px !important; + min-height: 44px !important; + padding: 0 14px !important; +} + +.dhv2-panel-head h2, +.dhv2-run-panel h2 { + color: #12243d !important; + font-size: 18px !important; + line-height: 1.25 !important; + font-weight: 800 !important; +} + +.dhv2-panel-head button, +.dhv2-panel-head span, +.dhv2-run-panel > header button { + font-size: 12px !important; + font-weight: 700 !important; +} + +.dhv2-employee { + overflow: hidden !important; +} + +.dhv2-employee-body { + height: calc(100% - 44px) !important; + min-height: 0 !important; + display: grid !important; + grid-template-columns: 104px minmax(0, 1fr) !important; + gap: 12px !important; + align-items: center !important; + padding: 12px 16px 14px !important; +} + +.dhv2-employee-photo { + width: 98px !important; + height: 124px !important; + border-radius: 8px !important; + object-fit: cover !important; + object-position: center top !important; +} + +.dhv2-employee-name { + gap: 8px !important; +} + +.dhv2-employee-name strong { + font-size: 20px !important; + line-height: 1.2 !important; + font-weight: 800 !important; +} + +.dhv2-employee-info dl { + display: grid !important; + gap: 4px !important; +} + +.dhv2-employee-info dl div, +.dhv2-employee-info dl div:not(:first-child) { + display: grid !important; + grid-template-columns: 34px minmax(0, 1fr) !important; + gap: 6px !important; + align-items: start !important; +} + +.dhv2-employee-info dt { + display: block !important; + color: #5b7590 !important; + font-size: 11px !important; + line-height: 1.25 !important; + font-weight: 800 !important; +} + +.dhv2-employee-info dd { + display: -webkit-box !important; + margin: 0 !important; + overflow: hidden !important; + color: #294463 !important; + font-size: 11px !important; + line-height: 1.35 !important; + font-weight: 500 !important; + -webkit-line-clamp: 1 !important; + -webkit-box-orient: vertical !important; +} + +.dhv2-employee-info dl div:nth-child(3) dd { + -webkit-line-clamp: 2 !important; +} + +.dhv2-tasks { + display: grid !important; + grid-template-rows: 44px 42px minmax(0, 1fr) 52px !important; + overflow: hidden !important; +} + +.dhv2-task-head .dhv2-date-field { + height: 34px !important; +} + +.dhv2-task-tabs { + height: 32px !important; + margin: 8px 14px 2px !important; +} + +.dhv2-task-tabs button { + height: 32px !important; + font-size: 13px !important; + font-weight: 700 !important; +} + +.dhv2-task-list { + min-height: 0 !important; + display: grid !important; + align-content: start !important; + gap: 8px !important; + padding: 8px 14px 8px !important; + overflow-y: auto !important; + overflow-x: hidden !important; +} + +.dhv2-task-row { + min-height: 72px !important; + display: grid !important; + grid-template-columns: 18px minmax(0, 1fr) !important; + gap: 8px !important; + align-items: start !important; + padding: 10px !important; + border: 1px solid rgba(142, 183, 220, 0.52) !important; + border-radius: 8px !important; + background: rgba(255, 255, 255, 0.96) !important; + box-shadow: 0 5px 12px rgba(44, 88, 132, 0.05) !important; + cursor: pointer !important; +} + +.dhv2-task-row:hover, +.dhv2-task-row:focus-within, +.dhv2-task-row.is-selected { + border-color: rgba(30, 144, 255, 0.62) !important; + background: linear-gradient(180deg, #fff, #f4faff) !important; +} + +.dhv2-task-row input { + width: 16px !important; + height: 16px !important; + margin: 2px 0 0 !important; + accent-color: #1e90ff !important; +} + +.dhv2-task-main { + min-width: 0 !important; + display: grid !important; + gap: 4px !important; +} + +.dhv2-task-main strong, +.dhv2-task-main small { + display: -webkit-box !important; + overflow: hidden !important; + white-space: normal !important; + -webkit-box-orient: vertical !important; +} + +.dhv2-task-main strong { + color: #12243d !important; + font-size: 14px !important; + line-height: 1.32 !important; + font-weight: 700 !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-task-main small { + color: #667992 !important; + font-size: 12px !important; + line-height: 1.36 !important; + font-weight: 400 !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-task-meta { + min-width: 0 !important; + display: flex !important; + align-items: center !important; + gap: 6px !important; +} + +.dhv2-task-chip, +.dhv2-task-row em { + min-height: 18px !important; + padding: 2px 7px !important; + border-radius: 999px !important; + font-size: 11px !important; + line-height: 1.25 !important; + font-weight: 500 !important; +} + +.dhv2-task-row em { + min-width: 0 !important; + overflow: hidden !important; + color: #667992 !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-task-actions { + display: grid !important; + grid-template-columns: 1fr 1fr !important; + gap: 8px !important; + padding: 8px 14px 12px !important; +} + +.dhv2-task-actions button { + width: 100% !important; + height: 34px !important; + min-height: 34px !important; + margin: 0 !important; + justify-content: center !important; + font-size: 13px !important; + font-weight: 700 !important; +} + +.dhv2-work-panel { + display: grid !important; + grid-template-rows: 44px minmax(0, 1fr) !important; + overflow: hidden !important; + background: + radial-gradient(circle at 50% 52%, rgba(30, 144, 255, 0.08), transparent 38%), + linear-gradient(180deg, #f7fbff, #fff) !important; +} + +.dhv2-work-tabs { + height: 44px !important; + padding: 0 24px !important; + gap: 20px !important; +} + +.dhv2-work-tabs button { + height: 44px !important; + font-size: 17px !important; + font-weight: 800 !important; +} + +.dhv2-stage { + position: relative !important; + min-height: 0 !important; + overflow: hidden !important; + background: transparent !important; +} + +.dhv2-stage-image { + position: absolute !important; + left: 50% !important; + top: auto !important; + right: auto !important; + bottom: 18px !important; + width: min(41%, 330px) !important; + height: auto !important; + max-height: 82% !important; + object-fit: contain !important; + object-position: center bottom !important; + opacity: 1 !important; + transform: translate3d(-50%, 0, 0) scale(1) !important; + filter: drop-shadow(0 22px 30px rgba(15, 80, 150, 0.16)) saturate(1.02) !important; + pointer-events: none !important; +} + +.dhv2-stage.is-working .dhv2-stage-image { + animation: dhv2FinalAgentBreathe 2.8s ease-in-out infinite !important; +} + +.dhv2-stage.is-standby .dhv2-stage-image { + animation: dhv2FinalAgentIdle 3.8s ease-in-out infinite !important; +} + +.dhv2-stage.is-working::after { + content: "" !important; + position: absolute !important; + left: 50% !important; + bottom: 18px !important; + width: 230px !important; + height: 18px !important; + border-radius: 50% !important; + transform: translateX(-50%) !important; + background: radial-gradient(ellipse, rgba(30, 144, 255, 0.18), transparent 68%) !important; + animation: dhv2FinalAgentShadow 2.8s ease-in-out infinite !important; + pointer-events: none !important; +} + +.dhv2-action-card { + min-height: 68px !important; + padding: 10px 12px !important; + border-radius: 10px !important; + background: rgba(255, 255, 255, 0.94) !important; + box-shadow: 0 10px 24px rgba(30, 144, 255, 0.12) !important; +} + +.dhv2-action-card i { + width: 36px !important; + height: 36px !important; + border-radius: 10px !important; +} + +.dhv2-action-card span { + font-size: 12px !important; + font-weight: 700 !important; +} + +.dhv2-action-card strong, +.dhv2-action-card.is-active strong { + color: #163657 !important; + font-size: 15px !important; + line-height: 1.25 !important; + font-weight: 800 !important; +} + +.dhv2-action-card em { + display: -webkit-box !important; + margin-top: 3px !important; + overflow: hidden !important; + color: #667992 !important; + font-size: 12px !important; + line-height: 1.35 !important; + font-weight: 500 !important; + -webkit-line-clamp: 1 !important; + -webkit-box-orient: vertical !important; +} + +.dhv2-action-card.is-active { + border-color: rgba(30, 144, 255, 0.55) !important; + box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.18), 0 0 34px rgba(30, 144, 255, 0.2) !important; +} + +.dhv2-action-card.is-active::after { + content: "" !important; + position: absolute !important; + inset: auto 10px auto auto !important; + top: 10px !important; + z-index: 3 !important; + width: 18px !important; + height: 18px !important; + border: 2px solid rgba(30, 144, 255, 0.22) !important; + border-top-color: #1e90ff !important; + border-radius: 50% !important; + background: transparent !important; + opacity: 1 !important; + transform: none !important; + animation: dhv2Spin 900ms linear infinite !important; +} + +.dhv2-action-card.is-active strong { + padding-right: 24px !important; +} + +.dhv2-action-progress { + display: none !important; +} + +.dhv2-run-panel { + display: grid !important; + grid-template-rows: 54px minmax(0, 1fr) !important; + padding: 0 12px 12px !important; + overflow: hidden !important; +} + +.dhv2-run-panel > header { + min-height: 54px !important; + padding: 0 4px !important; +} + +.dhv2-run-panel > header p { + display: none !important; +} + +.dhv2-run-table { + min-height: 0 !important; + display: grid !important; + grid-template-rows: 28px repeat(4, minmax(42px, 1fr)) !important; + gap: 7px !important; + overflow: hidden !important; +} + +.dhv2-run-head, +.dhv2-run-row { + display: grid !important; + grid-template-columns: 1.1fr 0.52fr 0.62fr 1.7fr !important; + gap: 8px !important; +} + +.dhv2-run-head { + min-height: 28px !important; + color: #526f8f !important; + font-size: 12px !important; + font-weight: 700 !important; +} + +.dhv2-run-row { + min-height: 42px !important; + margin: 0 !important; + padding: 7px 10px !important; + border-radius: 8px !important; +} + +.dhv2-run-name i { + width: 30px !important; + height: 30px !important; +} + +.dhv2-run-name strong, +.dhv2-run-log strong { + display: -webkit-box !important; + overflow: hidden !important; + color: #294463 !important; + font-size: 12px !important; + line-height: 1.35 !important; + font-weight: 500 !important; + white-space: normal !important; + -webkit-line-clamp: 1 !important; + -webkit-box-orient: vertical !important; +} + +.dhv2-run-total strong, +.dhv2-run-effect strong { + color: #1e90ff !important; + font-size: 13px !important; + font-weight: 800 !important; +} + +.dhv2-run-effect { + display: grid !important; + justify-items: center !important; + gap: 1px !important; + padding: 3px 6px !important; + border-radius: 8px !important; + background: #ecfdf5 !important; +} + +.dhv2-run-effect small { + color: #667992 !important; + font-size: 10px !important; +} + +.dhv2-today { + display: grid !important; + grid-template-rows: 44px 118px minmax(0, 1fr) !important; + overflow: hidden !important; +} + +.dhv2-metrics { + display: grid !important; + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + gap: 7px !important; + padding: 8px 12px 0 !important; +} + +.dhv2-total, +.dhv2-metric { + min-height: 50px !important; + display: grid !important; + align-content: center !important; + gap: 3px !important; + padding: 7px 8px !important; + border: 1px solid rgba(142, 183, 220, 0.35) !important; + border-radius: 8px !important; + background: #fff !important; +} + +.dhv2-total { + grid-column: 1 / -1 !important; +} + +.dhv2-total svg { + display: none !important; +} + +.dhv2-total span, +.dhv2-metric span, +.dhv2-ai-stat span { + overflow: hidden !important; + color: #667992 !important; + font-size: 12px !important; + line-height: 1.25 !important; + font-weight: 500 !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-total strong, +.dhv2-metric strong, +.dhv2-ai-stat strong { + margin: 0 !important; + color: #1e90ff !important; + font-size: 20px !important; + line-height: 1.05 !important; + font-weight: 700 !important; +} + +.dhv2-chart { + min-height: 0 !important; + margin: 8px 12px 10px !important; + padding: 8px 10px !important; + border: 1px solid rgba(142, 183, 220, 0.35) !important; + border-radius: 8px !important; + background: #fff !important; + overflow: visible !important; +} + +.dhv2-chart header { + min-height: 20px !important; +} + +.dhv2-chart header strong { + color: #12243d !important; + font-size: 13px !important; + font-weight: 800 !important; +} + +.dhv2-chart header span { + color: #667992 !important; + font-size: 12px !important; +} + +.dhv2-chart > div { + height: 118px !important; + display: grid !important; + grid-template-columns: repeat(5, minmax(0, 1fr)) !important; + align-items: end !important; + gap: 8px !important; + padding-top: 8px !important; + overflow: visible !important; +} + +.dhv2-bar { + position: relative !important; + height: 100% !important; + display: grid !important; + grid-template-rows: minmax(0, 1fr) 16px 16px !important; + justify-items: center !important; + gap: 3px !important; + cursor: help !important; +} + +.dhv2-bar:hover::after, +.dhv2-bar:focus-visible::after { + content: attr(data-tooltip) !important; + position: absolute !important; + left: 50% !important; + bottom: calc(100% + 8px) !important; + z-index: 20 !important; + width: max-content !important; + max-width: 220px !important; + transform: translateX(-50%) !important; + padding: 7px 9px !important; + border: 1px solid #b8dcff !important; + border-radius: 8px !important; + color: #173452 !important; + background: #fff !important; + box-shadow: 0 12px 28px rgba(30, 144, 255, 0.18) !important; + font-size: 12px !important; + line-height: 1.45 !important; + white-space: normal !important; +} + +.dhv2-bar-pair { + min-height: 50px !important; + height: 100% !important; + display: inline-flex !important; + align-items: end !important; + justify-content: center !important; + gap: 4px !important; +} + +.dhv2-bar-pair i { + width: 14px !important; + min-height: 7px !important; + border-radius: 4px 4px 1px 1px !important; + background: linear-gradient(180deg, #60b5ff, #1e90ff) !important; + transform-origin: bottom !important; + animation: dhv2BarPulse 1.8s ease-in-out infinite !important; +} + +.dhv2-bar-pair i.is-failure { + background: linear-gradient(180deg, #ff9f7a, #d94a4a) !important; + animation-delay: 220ms !important; +} + +.dhv2-bar strong { + color: #12243d !important; + font-size: 11px !important; + line-height: 1.2 !important; + font-weight: 700 !important; + white-space: nowrap !important; +} + +.dhv2-bar em { + max-width: 100% !important; + overflow: hidden !important; + color: #526f8f !important; + font-size: 10px !important; + line-height: 1.2 !important; + font-style: normal !important; + font-weight: 500 !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-report { + display: grid !important; + grid-template-rows: 42px 36px 40px minmax(0, 1fr) !important; + overflow: hidden !important; +} + +.dhv2-report-modes { + display: grid !important; + grid-template-columns: repeat(5, minmax(0, 1fr)) !important; + gap: 6px !important; + padding: 5px 12px 2px !important; +} + +.dhv2-report-modes button { + height: 30px !important; + min-height: 30px !important; + padding: 0 6px !important; + font-size: 12px !important; + font-weight: 700 !important; +} + +.dhv2-report-time { + min-height: 40px !important; + display: grid !important; + grid-template-columns: minmax(0, 1fr) auto !important; + align-items: center !important; + gap: 8px !important; + padding: 2px 12px 4px !important; + transform: none !important; +} + +.dhv2-report-time label { + min-width: 0 !important; + display: grid !important; + grid-template-columns: auto minmax(0, 1fr) !important; + gap: 7px !important; + align-items: center !important; + color: #667992 !important; + font-size: 12px !important; + font-weight: 700 !important; +} + +.dhv2-report-time input, +.dhv2-report-time button { + height: 28px !important; + min-height: 28px !important; + min-width: 0 !important; + font-size: 12px !important; + font-weight: 700 !important; +} + +.dhv2-report-actions { + display: grid !important; + grid-template-columns: 1.2fr 0.95fr 0.95fr 1.05fr !important; + align-content: start !important; + gap: 6px !important; + padding: 4px 12px 8px !important; +} + +.dhv2-report-actions button { + height: 30px !important; + min-height: 30px !important; + min-width: 0 !important; + overflow: hidden !important; + padding: 0 6px !important; + font-size: 12px !important; + font-weight: 700 !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-ai { + display: grid !important; + grid-template-rows: 44px minmax(0, 1fr) 40px !important; + overflow: hidden !important; +} + +.dhv2-ai-body { + min-height: 0 !important; + display: grid !important; + grid-template-rows: 74px minmax(0, 1fr) !important; + gap: 8px !important; + padding: 10px 12px 6px !important; +} + +.dhv2-ai-stats { + display: grid !important; + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + gap: 7px !important; + padding: 0 !important; +} + +.dhv2-ai-stat { + min-width: 0 !important; + min-height: 0 !important; + display: grid !important; + align-content: center !important; + gap: 4px !important; + padding: 8px !important; + border: 1px solid rgba(142, 183, 220, 0.35) !important; + border-radius: 8px !important; + background: #fff !important; +} + +.dhv2-ai-channels { + min-height: 0 !important; + display: grid !important; + align-content: start !important; + gap: 8px !important; + overflow: hidden !important; +} + +.dhv2-ai-channel { + min-width: 0 !important; + display: grid !important; + grid-template-columns: 54px minmax(0, 1fr) 34px !important; + gap: 8px !important; + align-items: center !important; + color: #294463 !important; + font-size: 12px !important; + line-height: 1.25 !important; + font-weight: 800 !important; +} + +.dhv2-ai-channel span { + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-ai-channel i { + min-width: 4px !important; + height: 7px !important; + border-radius: 999px !important; + background: linear-gradient(90deg, #1e90ff, #14b8a6) !important; + animation: dhv2ChannelPulse 1.7s ease-in-out infinite !important; +} + +.dhv2-ai-channel b { + justify-self: end !important; + color: #173452 !important; + font-size: 12px !important; + line-height: 1.25 !important; + font-weight: 800 !important; +} + +.dhv2-ai-feed { + display: none !important; +} + +.dhv2-ai-input { + min-height: 32px !important; + height: 32px !important; + margin: 0 12px 8px !important; + padding: 0 10px !important; + font-size: 12px !important; + font-weight: 700 !important; +} + +.dhv2-task-hover-panel { + z-index: 2000 !important; + width: 286px !important; + max-width: calc(100vw - 24px) !important; + padding: 13px 14px !important; + border: 1px solid rgba(30, 144, 255, 0.28) !important; + border-radius: 8px !important; + color: #16324e !important; + background: rgba(255, 255, 255, 0.98) !important; + box-shadow: 0 16px 38px rgba(10, 72, 138, 0.18) !important; + pointer-events: none !important; +} + +@media (max-width: 1360px) { + .dhv2-home { + grid-template-columns: minmax(310px, 0.95fr) minmax(610px, 1.95fr) minmax(330px, 1fr) !important; + gap: 8px !important; + padding: 8px !important; + } + + .dhv2-right { + grid-template-rows: 326px 164px minmax(200px, 1fr) !important; + } + + .dhv2-stage-image { + width: min(39%, 300px) !important; + } + + .dhv2-action-card { + min-height: 64px !important; + } +} + +@keyframes dhv2FinalAgentBreathe { + 0%, 100% { transform: translate3d(-50%, 0, 0) scale(1); } + 50% { transform: translate3d(-50%, -7px, 0) scale(1.012); } +} + +@keyframes dhv2FinalAgentIdle { + 0%, 100% { transform: translate3d(-50%, 0, 0) scale(1); } + 50% { transform: translate3d(-50%, -4px, 0) scale(1.004); } +} + +@keyframes dhv2FinalAgentShadow { + 0%, 100% { opacity: 0.56; transform: translateX(-50%) scaleX(1); } + 50% { opacity: 0.36; transform: translateX(-50%) scaleX(0.86); } +} + +/* Digital home screenshot fixes: keep chips inside cards, align run columns, and restore motion emphasis. */ +.dhv2-right { + grid-template-rows: 376px 182px minmax(190px, 1fr) !important; +} + +.dhv2-tasks { + grid-template-rows: 44px 42px minmax(0, 1fr) 52px !important; +} + +.dhv2-task-list { + gap: 8px !important; + padding: 8px 14px 10px !important; +} + +.dhv2-task-row { + min-height: 88px !important; + height: auto !important; + overflow: hidden !important; + box-sizing: border-box !important; + grid-template-columns: 18px minmax(0, 1fr) !important; + align-items: start !important; + padding: 10px !important; +} + +.dhv2-task-main { + min-height: 0 !important; + align-content: start !important; + gap: 5px !important; +} + +.dhv2-task-main strong { + min-height: 18px !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-task-main small { + min-height: 17px !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-task-meta { + position: static !important; + min-width: 0 !important; + max-width: 100% !important; + height: 20px !important; + min-height: 20px !important; + display: flex !important; + flex-wrap: nowrap !important; + align-items: center !important; + gap: 7px !important; + margin: 0 !important; + padding: 0 !important; + overflow: hidden !important; + transform: none !important; +} + +.dhv2-task-chip, +.dhv2-task-row em { + flex: 0 1 auto !important; + height: 20px !important; + min-height: 20px !important; + display: inline-flex !important; + align-items: center !important; + justify-content: center !important; + box-sizing: border-box !important; + margin: 0 !important; + line-height: 1 !important; +} + +.dhv2-task-row em { + flex: 1 1 auto !important; +} + +.dhv2-run-table { + grid-template-rows: 28px repeat(3, minmax(44px, 1fr)) !important; + gap: 7px !important; +} + +.dhv2-run-head, +.dhv2-run-row { + grid-template-columns: minmax(0, 1.16fr) 92px 126px minmax(0, 1.65fr) !important; + align-items: center !important; +} + +.dhv2-run-head span:nth-child(2), +.dhv2-run-head span:nth-child(3), +.dhv2-run-total, +.dhv2-run-effect { + justify-self: center !important; + text-align: center !important; +} + +.dhv2-run-effect { + width: 124px !important; + height: 34px !important; + box-sizing: border-box !important; + align-content: center !important; +} + +.dhv2-run-effect strong { + display: inline-flex !important; + align-items: baseline !important; + justify-content: center !important; + gap: 0 !important; +} + +.dhv2-run-effect small { + display: block !important; + text-align: center !important; +} + +.dhv2-today { + grid-template-rows: 44px 178px minmax(0, 1fr) !important; +} + +.dhv2-metrics { + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + grid-auto-rows: 50px !important; + gap: 8px !important; + padding: 8px 12px 0 !important; +} + +.dhv2-total, +.dhv2-metric { + min-height: 50px !important; + height: 50px !important; + border-color: rgba(30, 144, 255, 0.28) !important; + box-shadow: 0 8px 16px rgba(30, 144, 255, 0.08) !important; +} + +.dhv2-total { + grid-column: 1 / -1 !important; +} + +.dhv2-total span, +.dhv2-metric span { + display: block !important; + max-width: 100% !important; + overflow: hidden !important; + font-size: 11px !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-total strong, +.dhv2-metric strong { + display: flex !important; + align-items: baseline !important; + gap: 2px !important; + overflow: hidden !important; + font-size: 18px !important; + white-space: nowrap !important; +} + +.dhv2-chart { + margin-top: 10px !important; + overflow: hidden !important; +} + +.dhv2-chart > div { + height: 92px !important; + padding-top: 4px !important; +} + +.dhv2-bar-pair { + min-height: 36px !important; +} + +.dhv2-report { + grid-template-rows: 42px 38px 42px 52px !important; + overflow: hidden !important; +} + +.dhv2-report-modes { + padding: 5px 12px 3px !important; +} + +.dhv2-report-time { + min-height: 42px !important; + padding: 4px 12px !important; +} + +.dhv2-report-time label { + overflow: hidden !important; +} + +.dhv2-report-actions { + height: 52px !important; + min-height: 52px !important; + align-content: center !important; + padding: 8px 12px 10px !important; +} + +.dhv2-report-actions button { + height: 34px !important; + min-height: 34px !important; +} + +.dhv2-stage::before { + content: "" !important; + position: absolute !important; + left: 50% !important; + top: 53% !important; + z-index: 0 !important; + width: min(46%, 390px) !important; + aspect-ratio: 1 !important; + border: 1px solid rgba(30, 144, 255, 0.22) !important; + border-radius: 50% !important; + transform: translate(-50%, -50%) !important; + background: + radial-gradient(circle, rgba(30, 144, 255, 0.09) 0 38%, transparent 39%), + conic-gradient(from 0deg, rgba(30, 144, 255, 0), rgba(30, 144, 255, 0.36), rgba(20, 184, 166, 0.22), rgba(30, 144, 255, 0)) !important; + mask: radial-gradient(circle, transparent 0 54%, #000 55% 100%) !important; + animation: dhv2FinalHaloSpin 8s linear infinite !important; + pointer-events: none !important; +} + +/* Digital home task list: single-task execution appears inside the card on hover. */ +.dhv2-task-row { + grid-template-columns: 18px minmax(0, 1fr) 54px !important; + min-height: 70px !important; + align-items: start !important; +} + +.dhv2-task-run-button { + align-self: center !important; + justify-self: end !important; + width: 48px !important; + height: 28px !important; + min-height: 28px !important; + padding: 0 !important; + border: 1px solid rgba(30, 144, 255, 0.28) !important; + border-radius: 999px !important; + color: #1677d2 !important; + background: linear-gradient(180deg, #fff, #eef7ff) !important; + box-shadow: 0 5px 14px rgba(30, 144, 255, 0.12) !important; + font-size: 12px !important; + font-weight: 800 !important; + line-height: 1 !important; + opacity: 0 !important; + transform: translateX(6px) !important; + pointer-events: none !important; + transition: opacity 0.16s ease, transform 0.16s ease, color 0.16s ease, background 0.16s ease, box-shadow 0.16s ease !important; +} + +.dhv2-task-row:hover .dhv2-task-run-button, +.dhv2-task-row:focus-within .dhv2-task-run-button, +.dhv2-task-run-button.is-running { + opacity: 1 !important; + transform: translateX(0) !important; + pointer-events: auto !important; +} + +.dhv2-task-run-button:not(:disabled):hover { + color: #fff !important; + border-color: transparent !important; + background: linear-gradient(90deg, #1677d2, #1e90ff) !important; + box-shadow: 0 8px 20px rgba(30, 144, 255, 0.24) !important; +} + +.dhv2-task-run-button:disabled:not(.is-running) { + color: #8ba0b4 !important; + background: #eef3f8 !important; + box-shadow: none !important; + cursor: not-allowed !important; +} + +.dhv2-task-run-button.is-running { + position: relative !important; + width: 28px !important; + min-width: 28px !important; + border-color: rgba(18, 185, 129, 0.42) !important; + color: transparent !important; + background: #e9fbf5 !important; + box-shadow: 0 0 0 4px rgba(18, 185, 129, 0.08) !important; +} + +.dhv2-task-run-button.is-running span { + position: absolute !important; + inset: 6px !important; + border: 2px solid rgba(18, 185, 129, 0.24) !important; + border-top-color: #12b981 !important; + border-right-color: #1e90ff !important; + border-radius: 50% !important; + animation: dhv2TaskRunSpin 780ms linear infinite !important; +} + +/* Digital home latest design final override. */ +.dhv2-ai-body { + grid-template-rows: 52px minmax(0, 1fr) !important; + gap: 8px !important; +} + +.dhv2-ai-stats { + display: grid !important; + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + grid-template-rows: none !important; + height: 48px !important; + min-height: 48px !important; + gap: 7px !important; + padding: 0 !important; +} + +.dhv2-ai-stat { + min-width: 0 !important; + height: 48px !important; + min-height: 48px !important; + display: grid !important; + grid-template-columns: minmax(0, 1fr) auto !important; + align-items: center !important; + gap: 6px !important; + padding: 0 8px !important; +} + +.dhv2-ai-stat span { + overflow: hidden !important; + font-size: 12px !important; + line-height: 1.15 !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-ai-stat strong { + justify-self: end !important; + margin: 0 !important; + font-size: 18px !important; + line-height: 1 !important; + white-space: nowrap !important; +} + +.dhv2-ai-stat strong::after { + content: "次" !important; + margin-left: 2px !important; + color: #7890a6 !important; + font-size: 10px !important; + font-weight: 700 !important; +} + +.dhv2-run-log-text { + min-width: 0 !important; + display: inline-flex !important; + align-items: center !important; + overflow: hidden !important; + font-size: 12px !important; + line-height: 1.35 !important; +} + +.dhv2-run-log-text span { + min-width: 0 !important; + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-run-log-text > i { + flex: 0 0 auto !important; + width: 2px !important; + height: 17px !important; + margin-left: 3px !important; + border-radius: 999px !important; + background: #1e90ff !important; + box-shadow: 0 0 8px rgba(30, 144, 255, 0.45) !important; + animation: dhv2TypeCursorBlink 760ms steps(2, start) infinite !important; +} + +.dhv2-run-row.is-streaming .dhv2-run-log-text { + animation: dhv2TypeTextPop 240ms ease-out !important; +} + +.dhv2-action-card.is-active { + overflow: hidden !important; + isolation: isolate !important; + padding-right: 12px !important; + border-color: rgba(30, 144, 255, 0.42) !important; + background: linear-gradient(135deg, #eef7ff 0%, #ffffff 62%, #effcf8 100%) !important; + box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.16), 0 12px 34px rgba(30, 144, 255, 0.18) !important; + animation: dhv2ActiveCardEdgeGlow 1.9s ease-in-out infinite !important; +} + +.dhv2-action-card.is-active > * { + position: relative !important; + z-index: 2 !important; +} + +.dhv2-action-card.is-active::before { + content: "" !important; + position: absolute !important; + inset: 0 !important; + z-index: 3 !important; + display: block !important; + padding: 2px !important; + border-radius: inherit !important; + background: + conic-gradient( + from var(--dhv2-card-edge-angle, 0deg), + rgba(30, 144, 255, 0) 0deg, + rgba(30, 144, 255, 0) 42deg, + rgba(30, 144, 255, 0.95) 74deg, + rgba(20, 184, 166, 0.95) 106deg, + rgba(30, 144, 255, 0) 144deg, + rgba(30, 144, 255, 0) 360deg + ) !important; + -webkit-mask: + linear-gradient(#000 0 0) content-box, + linear-gradient(#000 0 0) !important; + -webkit-mask-composite: xor !important; + mask-composite: exclude !important; + animation: dhv2CardEdgeOrbit 1.35s linear infinite !important; + opacity: 1 !important; + pointer-events: none !important; +} + +.dhv2-action-card.is-active::after { + content: "" !important; + position: absolute !important; + inset: 2px !important; + z-index: 0 !important; + display: block !important; + width: auto !important; + height: auto !important; + border: 0 !important; + border-radius: calc(10px - 1px) !important; + background: + radial-gradient(circle at var(--spot-x, 72%) var(--spot-y, 34%), rgba(30, 144, 255, 0.14), transparent 145px), + linear-gradient(135deg, #eef7ff 0%, #ffffff 62%, #effcf8 100%) !important; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.74) !important; + opacity: 1 !important; + transform: none !important; + animation: none !important; + pointer-events: none !important; +} + +.dhv2-card-spinner, +.dhv2-card-loading, +.dhv2-action-card.is-active .dhv2-card-spinner, +.dhv2-action-card.is-active .dhv2-card-loading { + display: none !important; +} + +.dhv2-action-card.is-active strong { + padding-right: 0 !important; +} + +/* Final running-card edge loader override. Keep this block at the end of the file. */ +.dhv2-action-card.is-active::before, +.dhv2-action-card.is-active::after { + content: none !important; + display: none !important; + animation: none !important; +} + +.dhv2-action-card.is-active { + animation: none !important; +} + +.dhv2-action-card.is-running { + border-color: rgba(30, 144, 255, 0.34) !important; + box-shadow: + 0 0 0 1px rgba(30, 144, 255, 0.12), + 0 12px 34px rgba(30, 144, 255, 0.18) !important; + animation: dhv2RunningCardPulse 1.7s ease-in-out infinite !important; +} + +.dhv2-action-edge-loader { + position: absolute !important; + inset: 0 !important; + z-index: 5 !important; + display: block !important; + width: 100% !important; + height: 100% !important; + overflow: visible !important; + pointer-events: none !important; +} + +.dhv2-action-edge-loader rect { + fill: none !important; + vector-effect: non-scaling-stroke !important; +} + +.dhv2-action-edge-loader__track { + stroke: rgba(30, 144, 255, 0.18) !important; + stroke-width: 2px !important; +} + +.dhv2-action-edge-loader__pulse { + stroke: #1e90ff !important; + stroke-width: 2.4px !important; + stroke-linecap: round !important; + stroke-dasharray: 20 80 !important; + filter: drop-shadow(0 0 3px rgba(30, 144, 255, 0.9)) !important; + animation: dhv2ActionEdgeRun 1.15s linear infinite !important; +} + +/* Running action card: explicit SVG edge loader avoids legacy pseudo-element conflicts. */ +.dhv2-action-card.is-active::before, +.dhv2-action-card.is-active::after { + content: none !important; + display: none !important; + animation: none !important; +} + +.dhv2-action-card.is-active { + animation: none !important; +} + +.dhv2-action-card.is-running { + border-color: rgba(30, 144, 255, 0.34) !important; + box-shadow: + 0 0 0 1px rgba(30, 144, 255, 0.12), + 0 12px 34px rgba(30, 144, 255, 0.18) !important; + animation: dhv2RunningCardPulse 1.7s ease-in-out infinite !important; +} + +.dhv2-action-edge-loader { + position: absolute !important; + inset: 0 !important; + z-index: 5 !important; + display: block !important; + width: 100% !important; + height: 100% !important; + overflow: visible !important; + pointer-events: none !important; +} + +.dhv2-action-edge-loader rect { + fill: none !important; + vector-effect: non-scaling-stroke !important; +} + +.dhv2-action-edge-loader__track { + stroke: rgba(30, 144, 255, 0.18) !important; + stroke-width: 2px !important; +} + +.dhv2-action-edge-loader__pulse { + stroke: #1e90ff !important; + stroke-width: 2.4px !important; + stroke-linecap: round !important; + stroke-dasharray: 20 80 !important; + filter: drop-shadow(0 0 3px rgba(30, 144, 255, 0.9)) !important; + animation: dhv2ActionEdgeRun 1.15s linear infinite !important; +} + +@keyframes dhv2ActionEdgeRun { + from { stroke-dashoffset: 0; } + to { stroke-dashoffset: -100; } +} + +@keyframes dhv2RunningCardPulse { + 0%, 100% { + box-shadow: + 0 0 0 1px rgba(30, 144, 255, 0.12), + 0 12px 34px rgba(30, 144, 255, 0.18); + } + 50% { + box-shadow: + 0 0 0 1px rgba(20, 184, 166, 0.2), + 0 14px 40px rgba(30, 144, 255, 0.25); + } +} + +@media (prefers-reduced-motion: reduce) { + .dhv2-action-card.is-running, + .dhv2-action-edge-loader__pulse { + animation: none !important; + } + + .dhv2-action-edge-loader__pulse { + stroke-dasharray: none !important; + } +} + +@media (prefers-reduced-motion: reduce) { + .dhv2-action-card.is-active, + .dhv2-action-card.is-active::before, + .dhv2-run-log-text, + .dhv2-run-log-text > i { + animation: none !important; + } + + .dhv2-action-card.is-active::before { + background: rgba(30, 144, 255, 0.28) !important; + } + + .dhv2-run-log-text > i { + display: none !important; + } +} + +@media (prefers-reduced-motion: reduce) { + .dhv2-action-card.is-active, + .dhv2-action-card.is-active::before, + .dhv2-run-log-text, + .dhv2-run-log-text > i { + animation: none !important; + } + + .dhv2-action-card.is-active::before { + background: rgba(30, 144, 255, 0.28) !important; + } + + .dhv2-run-log-text > i { + display: none !important; + } +} + +@media (prefers-reduced-motion: reduce) { + .dhv2-action-card.is-active, + .dhv2-action-card.is-active::before, + .dhv2-run-log-text, + .dhv2-run-log-text > i { + animation: none !important; + } + + .dhv2-action-card.is-active::before { + background: rgba(30, 144, 255, 0.28) !important; + } + + .dhv2-run-log-text > i { + display: none !important; + } +} + +@media (prefers-reduced-motion: reduce) { + .dhv2-action-card.is-active, + .dhv2-action-card.is-active::before, + .dhv2-run-log-text, + .dhv2-run-log-text > i { + animation: none !important; + } + + .dhv2-action-card.is-active::before { + background: rgba(30, 144, 255, 0.28) !important; + } + + .dhv2-run-log-text > i { + display: none !important; + } +} + +/* Digital home V2 adjustments: horizontal AI stats, typewriter run log, edge-loading action card. */ +.dhv2-ai { + grid-template-rows: 44px minmax(0, 1fr) 40px !important; +} + +.dhv2-ai-body { + grid-template-rows: 52px minmax(0, 1fr) !important; + gap: 8px !important; + padding: 10px 12px 6px !important; +} + +.dhv2-ai-stats { + display: grid !important; + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + grid-template-rows: none !important; + gap: 7px !important; + min-height: 48px !important; + height: 48px !important; + padding: 0 !important; +} + +.dhv2-ai-stat { + min-width: 0 !important; + min-height: 48px !important; + height: 48px !important; + display: grid !important; + grid-template-columns: minmax(0, 1fr) auto !important; + align-items: center !important; + gap: 6px !important; + padding: 0 8px !important; + border: 1px solid rgba(142, 183, 220, 0.35) !important; + border-radius: 8px !important; + background: #fff !important; + box-shadow: none !important; +} + +.dhv2-ai-stat span { + min-width: 0 !important; + overflow: hidden !important; + color: #667992 !important; + font-size: 12px !important; + line-height: 1.15 !important; + font-weight: 700 !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-ai-stat strong { + justify-self: end !important; + margin: 0 !important; + color: #1e90ff !important; + font-size: 18px !important; + line-height: 1 !important; + font-weight: 850 !important; + white-space: nowrap !important; +} + +.dhv2-ai-stat strong::after { + content: "次" !important; + margin-left: 2px !important; + color: #7890a6 !important; + font-size: 10px !important; + font-weight: 700 !important; +} + +.dhv2-run-log-text { + min-width: 0 !important; + display: inline-flex !important; + align-items: center !important; + overflow: hidden !important; + color: #173452 !important; + font-size: 12px !important; + line-height: 1.35 !important; + font-weight: 750 !important; +} + +.dhv2-run-log-text span { + min-width: 0 !important; + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-run-log-text > i { + flex: 0 0 auto !important; + width: 2px !important; + height: 17px !important; + margin-left: 3px !important; + border-radius: 999px !important; + background: #1e90ff !important; + box-shadow: 0 0 8px rgba(30, 144, 255, 0.45) !important; + animation: dhv2TypeCursorBlink 760ms steps(2, start) infinite !important; +} + +.dhv2-run-row.is-streaming .dhv2-run-log { + background: rgba(30, 144, 255, 0.045) !important; + box-shadow: inset 0 0 0 1px rgba(30, 144, 255, 0.1) !important; +} + +.dhv2-run-row.is-streaming .dhv2-run-log-text { + animation: dhv2TypeTextPop 240ms ease-out !important; +} + +.dhv2-action-card { + position: absolute !important; +} + +.dhv2-action-card.is-active { + overflow: hidden !important; + isolation: isolate !important; + padding-right: 12px !important; + border-color: rgba(30, 144, 255, 0.42) !important; + background: linear-gradient(135deg, #eef7ff 0%, #ffffff 62%, #effcf8 100%) !important; + box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.16), 0 12px 34px rgba(30, 144, 255, 0.18) !important; + animation: dhv2ActiveCardEdgeGlow 1.9s ease-in-out infinite !important; +} + +.dhv2-action-card.is-active::before { + content: "" !important; + position: absolute !important; + inset: -2px !important; + z-index: -1 !important; + display: block !important; + opacity: 1 !important; + border-radius: inherit !important; + background: + conic-gradient( + from var(--dhv2-card-edge-angle, 0deg), + rgba(30, 144, 255, 0) 0deg, + rgba(30, 144, 255, 0) 42deg, + rgba(30, 144, 255, 0.95) 74deg, + rgba(20, 184, 166, 0.95) 106deg, + rgba(30, 144, 255, 0) 144deg, + rgba(30, 144, 255, 0) 360deg + ) !important; + animation: dhv2CardEdgeOrbit 1.35s linear infinite !important; + pointer-events: none !important; +} + +.dhv2-action-card.is-active::after { + content: "" !important; + position: absolute !important; + inset: 2px !important; + z-index: -1 !important; + display: block !important; + width: auto !important; + height: auto !important; + border: 0 !important; + border-radius: calc(10px - 1px) !important; + background: + radial-gradient(circle at var(--spot-x, 72%) var(--spot-y, 34%), rgba(30, 144, 255, 0.14), transparent 145px), + linear-gradient(135deg, #eef7ff 0%, #ffffff 62%, #effcf8 100%) !important; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.74) !important; + opacity: 1 !important; + transform: none !important; + animation: none !important; + pointer-events: none !important; +} + +.dhv2-card-spinner, +.dhv2-card-loading, +.dhv2-action-card.is-active .dhv2-card-spinner, +.dhv2-action-card.is-active .dhv2-card-loading { + display: none !important; +} + +.dhv2-action-card.is-active strong { + padding-right: 0 !important; +} + +@property --dhv2-card-edge-angle { + syntax: ""; + inherits: false; + initial-value: 0deg; +} + +@keyframes dhv2CardEdgeOrbit { + from { --dhv2-card-edge-angle: 0deg; } + to { --dhv2-card-edge-angle: 360deg; } +} + +@keyframes dhv2ActiveCardEdgeGlow { + 0%, 100% { + filter: brightness(1); + box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.16), 0 12px 34px rgba(30, 144, 255, 0.18); + } + 50% { + filter: brightness(1.045); + box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.28), 0 14px 42px rgba(20, 184, 166, 0.22); + } +} + +@keyframes dhv2TypeCursorBlink { + 0%, 45% { opacity: 1; } + 46%, 100% { opacity: 0; } +} + +@keyframes dhv2TypeTextPop { + from { + opacity: 0.78; + transform: translateY(3px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@media (prefers-reduced-motion: reduce) { + .dhv2-action-card.is-active, + .dhv2-action-card.is-active::before, + .dhv2-run-log-text, + .dhv2-run-log-text > i { + animation: none !important; + } + + .dhv2-action-card.is-active::before { + background: rgba(30, 144, 255, 0.28) !important; + } + + .dhv2-run-log-text > i { + display: none !important; + } +} + +/* Digital employee request final override: compact two-field task rows and live detail presentation. */ +.dhv2-task-list { + grid-auto-rows: 56px !important; +} + +.dhv2-task-row { + grid-template-columns: 18px minmax(0, 1fr) !important; + min-height: 56px !important; + height: 56px !important; + padding: 7px 10px !important; + align-items: center !important; + position: relative !important; +} + +.dhv2-task-main { + min-width: 0 !important; + display: grid !important; + grid-template-rows: 19px 17px !important; + gap: 4px !important; + align-content: center !important; + transition: padding-right 0.16s ease !important; +} + +.dhv2-task-main small { + color: #5f7894 !important; + font-size: 12px !important; + font-weight: 650 !important; +} + +.dhv2-today { + grid-template-rows: 44px 142px minmax(0, 1fr) !important; +} + +.dhv2-metrics { + grid-template-columns: repeat(2, minmax(0, 1fr)) !important; + grid-auto-rows: 42px !important; + align-content: start !important; + gap: 7px !important; +} + +.dhv2-run-row { + animation: dhv2RunRowAppend 260ms ease-out !important; +} + +.dhv2-run-row.is-streaming { + border-color: rgba(30, 144, 255, 0.38) !important; + box-shadow: inset 4px 0 0 #1e90ff, 0 8px 22px rgba(30, 144, 255, 0.1) !important; +} + +.dhv2-run-log { + display: grid !important; + grid-template-columns: auto minmax(0, 1fr) !important; + align-items: center !important; + gap: 7px !important; +} + +/* Digital employee requested compact task list, live run detail, execution cards and two-channel communication. */ +.dhv2-task-list { + grid-auto-rows: 56px !important; +} + +.dhv2-task-row { + min-height: 56px !important; + height: 56px !important; + padding: 7px 10px !important; + align-items: center !important; +} + +.dhv2-task-main { + grid-template-rows: 19px 17px !important; + gap: 4px !important; + align-content: center !important; +} + +.dhv2-task-main small { + color: #5f7894 !important; + font-size: 12px !important; + font-weight: 650 !important; +} + +.dhv2-today { + grid-template-rows: 44px 142px minmax(0, 1fr) !important; +} + +.dhv2-metrics { + grid-template-columns: repeat(2, minmax(0, 1fr)) !important; + grid-auto-rows: 42px !important; + align-content: start !important; + gap: 7px !important; + padding: 8px 12px 0 !important; +} + +.dhv2-metrics-title { + grid-column: 1 / -1 !important; + min-height: 26px !important; + display: flex !important; + align-items: center !important; + justify-content: space-between !important; + color: #244766 !important; + font-size: 12px !important; + font-weight: 850 !important; +} + +.dhv2-metrics-title strong { + display: inline-flex !important; + align-items: baseline !important; + gap: 2px !important; + color: #0f5ecb !important; + font-size: 16px !important; +} + +.dhv2-metric { + min-height: 42px !important; + grid-template-columns: minmax(0, 1fr) auto !important; + align-items: center !important; + padding: 6px 8px !important; +} + +.dhv2-metric span { + min-width: 0 !important; + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-metric strong { + justify-self: end !important; + font-size: 15px !important; +} + +.dhv2-chart { + min-height: 0 !important; + display: grid !important; + grid-template-rows: 30px minmax(0, 1fr) !important; + padding: 8px 12px 12px !important; +} + +.dhv2-chart > div { + min-height: 0 !important; + align-items: end !important; +} + +.dhv2-bar-pair { + height: 74px !important; +} + +.dhv2-run-row { + animation: dhv2RunRowAppend 260ms ease-out !important; +} + +.dhv2-run-row.is-streaming { + border-color: rgba(30, 144, 255, 0.38) !important; + box-shadow: inset 4px 0 0 #1e90ff, 0 8px 22px rgba(30, 144, 255, 0.1) !important; +} + +.dhv2-run-log { + position: relative !important; + display: grid !important; + grid-template-columns: auto minmax(0, 1fr) !important; + align-items: center !important; + gap: 7px !important; +} + +.dhv2-run-log > i { + width: 7px !important; + height: 7px !important; + border-radius: 999px !important; + background: #1e90ff !important; + box-shadow: 0 0 0 0 rgba(30, 144, 255, 0.35) !important; + animation: dhv2RunLiveDot 900ms ease-in-out infinite !important; +} + +.dhv2-run-log strong { + min-width: 0 !important; +} + +.dhv2-ai-channels { + grid-template-columns: repeat(2, minmax(0, 1fr)) !important; +} + +.dhv2-ai-channel { + min-height: 42px !important; +} + +.dhv2-ai-channel span { + display: grid !important; + gap: 2px !important; +} + +.dhv2-ai-channel small { + min-width: 0 !important; + overflow: hidden !important; + color: #64748b !important; + font-size: 10px !important; + font-weight: 650 !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +@keyframes dhv2RunRowAppend { + from { + opacity: 0.72; + transform: translateY(6px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes dhv2RunLiveDot { + 0%, 100% { + opacity: 0.55; + box-shadow: 0 0 0 0 rgba(30, 144, 255, 0.35); + } + 50% { + opacity: 1; + box-shadow: 0 0 0 5px rgba(30, 144, 255, 0); + } +} + +.dhv2-run-log { + cursor: help !important; + border-radius: 6px !important; + outline: none !important; +} + +.dhv2-run-log:hover, +.dhv2-run-log:focus-visible { + background: rgba(30, 144, 255, 0.07) !important; + box-shadow: inset 0 0 0 1px rgba(30, 144, 255, 0.16) !important; +} + +.dhv2-run-log-hover-panel { + position: fixed !important; + z-index: 2200 !important; + width: 340px !important; + max-width: calc(100vw - 24px) !important; + padding: 13px 14px !important; + border: 1px solid rgba(30, 144, 255, 0.28) !important; + border-radius: 8px !important; + color: #16324e !important; + background: rgba(255, 255, 255, 0.98) !important; + box-shadow: 0 16px 38px rgba(10, 72, 138, 0.18) !important; + pointer-events: none !important; +} + +.dhv2-run-log-hover-panel > strong { + display: block !important; + margin-bottom: 10px !important; + color: #102b4c !important; + font-size: 14px !important; + line-height: 1.3 !important; +} + +.dhv2-run-log-hover-panel dl { + display: grid !important; + gap: 8px !important; + margin: 0 !important; +} + +.dhv2-run-log-hover-panel div { + display: grid !important; + grid-template-columns: 64px minmax(0, 1fr) !important; + gap: 8px !important; +} + +.dhv2-run-log-hover-panel dt { + color: #5b7590 !important; + font-size: 12px !important; +} + +.dhv2-run-log-hover-panel dd { + margin: 0 !important; + max-height: 84px !important; + overflow: hidden !important; + color: #1e3a5c !important; + font-size: 12px !important; + line-height: 1.45 !important; + word-break: break-word !important; +} + +/* Digital home task-list final containment: optional/selected rows share the same compact card. */ +.dhv2-tasks { + grid-template-rows: 44px 42px minmax(0, 1fr) 52px !important; + overflow: hidden !important; +} + +.dhv2-task-list { + min-height: 0 !important; + max-height: 100% !important; + display: grid !important; + grid-auto-rows: 82px !important; + align-content: start !important; + gap: 8px !important; + overflow-y: auto !important; + overflow-x: hidden !important; + padding: 7px 14px 12px !important; + box-sizing: border-box !important; + scrollbar-gutter: stable !important; +} + +.dhv2-task-row { + height: 82px !important; + min-height: 82px !important; + max-height: 82px !important; + display: grid !important; + grid-template-columns: 18px minmax(0, 1fr) !important; + align-items: start !important; + gap: 8px !important; + padding: 10px 10px !important; + box-sizing: border-box !important; + overflow: hidden !important; +} + +.dhv2-task-main { + min-height: 0 !important; + display: grid !important; + grid-template-rows: 20px 18px 20px !important; + gap: 5px !important; + align-content: start !important; +} + +.dhv2-task-main strong, +.dhv2-task-main small { + min-height: 0 !important; + max-height: 100% !important; + line-height: 1.2 !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-task-meta { + min-height: 20px !important; + height: 20px !important; + max-height: 20px !important; + overflow: hidden !important; +} + +.dhv2-task-chip, +.dhv2-task-row em { + height: 20px !important; + min-height: 20px !important; + max-height: 20px !important; + line-height: 1 !important; +} + +@media (max-width: 1360px) { + .dhv2-task-row { + height: 82px !important; + min-height: 82px !important; + max-height: 82px !important; + } +} + +/* Digital home final task-list normalization: optional and selected tabs share one card height. */ +.dhv2-tasks { + min-height: 0 !important; + display: grid !important; + grid-template-rows: 50px 42px minmax(0, 1fr) 52px !important; + overflow: hidden !important; +} + +.dhv2-task-tabs { + height: 32px !important; + margin: 8px 14px 2px !important; +} + +.dhv2-task-list { + min-height: 0 !important; + max-height: 100% !important; + display: grid !important; + grid-auto-rows: 66px !important; + align-content: start !important; + gap: 7px !important; + overflow-y: auto !important; + overflow-x: hidden !important; + padding: 7px 14px 12px !important; + box-sizing: border-box !important; + scrollbar-gutter: stable !important; +} + +.dhv2-task-row { + min-height: 66px !important; + height: 66px !important; + display: grid !important; + grid-template-columns: 18px minmax(0, 1fr) !important; + gap: 8px !important; + align-items: start !important; + padding: 8px 10px !important; + box-sizing: border-box !important; + overflow: hidden !important; +} + +.dhv2-task-main { + min-height: 0 !important; + display: grid !important; + grid-template-rows: 18px 16px 18px !important; + gap: 3px !important; + align-content: start !important; +} + +.dhv2-task-main strong, +.dhv2-task-main small { + min-height: 0 !important; + max-height: 100% !important; + line-height: 1.2 !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-task-meta { + min-height: 18px !important; + height: 18px !important; + display: flex !important; + flex-wrap: nowrap !important; + align-items: center !important; + gap: 6px !important; + overflow: hidden !important; +} + +.dhv2-task-chip, +.dhv2-task-row em { + height: 18px !important; + min-height: 18px !important; + max-height: 18px !important; + padding: 2px 7px !important; + line-height: 1 !important; + box-sizing: border-box !important; +} + +.dhv2-task-row em { + flex: 1 1 auto !important; + min-width: 0 !important; + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-task-actions { + height: 52px !important; + min-height: 52px !important; + padding: 8px 14px 10px !important; + box-sizing: border-box !important; +} + +/* Digital home task list containment: keep all optional tasks inside the panel. */ +.dhv2-tasks { + min-height: 0 !important; + display: grid !important; + grid-template-rows: 44px 42px minmax(0, 1fr) 52px !important; + overflow: hidden !important; +} + +.dhv2-task-list { + min-height: 0 !important; + max-height: 100% !important; + display: grid !important; + align-content: start !important; + gap: 7px !important; + overflow-y: auto !important; + overflow-x: hidden !important; + padding: 7px 14px 12px !important; + box-sizing: border-box !important; + scrollbar-gutter: stable !important; +} + +.dhv2-task-list::-webkit-scrollbar { + width: 6px !important; +} + +.dhv2-task-list::-webkit-scrollbar-thumb { + border-radius: 999px !important; + background: rgba(86, 150, 220, 0.34) !important; +} + +.dhv2-task-list::-webkit-scrollbar-track { + background: rgba(211, 230, 246, 0.34) !important; +} + +.dhv2-task-row { + min-height: 66px !important; + padding: 8px 10px !important; + box-sizing: border-box !important; +} + +.dhv2-task-main { + min-height: 0 !important; + gap: 4px !important; +} + +.dhv2-task-main strong { + min-height: 18px !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-task-main small { + min-height: 16px !important; + -webkit-line-clamp: 1 !important; +} + +.dhv2-task-meta { + min-height: 18px !important; + height: 18px !important; +} + +.dhv2-task-chip, +.dhv2-task-row em { + height: 18px !important; + min-height: 18px !important; + padding: 2px 7px !important; + box-sizing: border-box !important; +} + +.dhv2-task-actions { + height: 52px !important; + min-height: 52px !important; + display: grid !important; + grid-template-columns: 1fr 1fr !important; + gap: 8px !important; + align-items: center !important; + padding: 8px 14px 10px !important; + box-sizing: border-box !important; +} + +.dhv2-task-actions button { + height: 34px !important; + min-height: 34px !important; +} + +@keyframes dhv2TaskRunSpin { + to { transform: rotate(360deg); } +} + +.dhv2-stage-image { + z-index: 1 !important; +} + +.dhv2-action-map { + z-index: 2 !important; +} + +.dhv2-action-card.is-active::after { + box-shadow: 0 0 0 4px rgba(30, 144, 255, 0.08) !important; + animation: dhv2Spin 900ms linear infinite, dhv2LoadingPulse 1.35s ease-in-out infinite !important; +} + +.dhv2-action-card.is-active { + animation: dhv2ActiveCardGlow 1.8s ease-in-out infinite !important; +} + +@media (max-width: 1360px) { + .dhv2-right { + grid-template-rows: 370px 180px minmax(186px, 1fr) !important; + } + + .dhv2-task-row { + min-height: 86px !important; + } + + .dhv2-run-head, + .dhv2-run-row { + grid-template-columns: minmax(0, 1.1fr) 82px 118px minmax(0, 1.48fr) !important; + } + + .dhv2-run-effect { + width: 116px !important; + } +} + +@keyframes dhv2FinalHaloSpin { + to { transform: translate(-50%, -50%) rotate(360deg); } +} + +@keyframes dhv2LoadingPulse { + 0%, 100% { filter: brightness(1); } + 50% { filter: brightness(1.25); } +} + +@keyframes dhv2ActiveCardGlow { + 0%, 100% { box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.18), 0 0 28px rgba(30, 144, 255, 0.18); } + 50% { box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.34), 0 0 42px rgba(30, 144, 255, 0.28); } +} + +/* Digital home effect-graph parity: report action row and active task motion. */ +.dhv2-right { + grid-template-rows: 368px 190px minmax(186px, 1fr) !important; +} + +.dhv2-report { + grid-template-rows: 42px 34px 38px 48px !important; + align-content: start !important; +} + +.dhv2-report-modes { + padding: 4px 12px 1px !important; +} + +.dhv2-report-modes button { + height: 28px !important; + min-height: 28px !important; +} + +.dhv2-report-time { + min-height: 38px !important; + padding: 2px 12px 3px !important; +} + +.dhv2-report-time input, +.dhv2-report-time button { + height: 28px !important; + min-height: 28px !important; +} + +.dhv2-report-actions { + height: 48px !important; + min-height: 48px !important; + align-content: start !important; + padding: 5px 12px 8px !important; +} + +.dhv2-report-actions button { + height: 32px !important; + min-height: 32px !important; +} + +.dhv2-stage { + background: + radial-gradient(circle at 50% 50%, rgba(30,144,255,0.08), transparent 42%), + linear-gradient(180deg, #f7fbff, #fff) !important; +} + +.dhv2-stage::before { + top: 54% !important; + width: min(43%, 370px) !important; + opacity: 0.86 !important; + background: + radial-gradient(circle, rgba(30, 144, 255, 0.08) 0 42%, transparent 43%), + conic-gradient(from 0deg, transparent 0deg, rgba(30, 144, 255, 0.34) 80deg, rgba(20, 184, 166, 0.26) 145deg, transparent 230deg, rgba(30, 144, 255, 0.28) 310deg, transparent 360deg) !important; + mask: radial-gradient(circle, transparent 0 52%, #000 53% 100%) !important; + animation: dhv2FinalHaloSpin 6.8s linear infinite !important; +} + +.dhv2-stage::after { + bottom: 18px !important; + width: 230px !important; + height: 18px !important; +} + +.dhv2-stage-image { + width: min(42%, 330px) !important; + max-height: 82% !important; +} + +.dhv2-action-card { + overflow: hidden !important; + transition: transform 0.2s ease, box-shadow 0.2s ease !important; +} + +.dhv2-action-card.is-active { + grid-template-rows: auto 5px !important; + animation: dhv2EffectActivePulse 1.8s ease-in-out infinite !important; +} + +.dhv2-action-card.is-active::after { + display: none !important; +} + +.dhv2-card-loading { + grid-column: 1 / -1 !important; + display: block !important; + height: 5px !important; + overflow: hidden !important; + border-radius: 999px !important; + background: #dbeafe !important; +} + +.dhv2-card-loading span { + display: block !important; + width: 46% !important; + height: 100% !important; + border-radius: inherit !important; + background: linear-gradient(90deg, #1e90ff, #14b8a6) !important; + animation: dhv2EffectProgress 1.1s ease-in-out infinite alternate !important; +} + +@media (max-width: 1360px) { + .dhv2-right { + grid-template-rows: 360px 188px minmax(184px, 1fr) !important; + } +} + +@keyframes dhv2EffectActivePulse { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-2px); } +} + +@keyframes dhv2EffectProgress { + from { transform: translateX(0); } + to { transform: translateX(116%); } +} + +/* Digital home loading correction: use a rotating circle, not a progress bar. */ +.dhv2-action-card.is-active { + grid-template-rows: none !important; + padding-right: 12px !important; + animation: dhv2ActiveCardRingGlow 1.65s ease-in-out infinite !important; +} + +.dhv2-action-card.is-active::after { + content: "" !important; + position: absolute !important; + display: block !important; + top: 10px !important; + right: 10px !important; + left: auto !important; + bottom: auto !important; + z-index: 3 !important; + width: 18px !important; + height: 18px !important; + border: 2px solid rgba(30, 144, 255, 0.22) !important; + border-top-color: #1e90ff !important; + border-right-color: #14b8a6 !important; + border-radius: 50% !important; + background: transparent !important; + box-shadow: 0 0 0 4px rgba(30, 144, 255, 0.08) !important; + opacity: 1 !important; + transform: none !important; + animation: dhv2Spin 780ms linear infinite !important; +} + +.dhv2-action-card.is-active strong { + padding-right: 24px !important; +} + +.dhv2-card-loading { + display: none !important; +} + +.dhv2-stage::before { + animation: dhv2FinalHaloSpin 5.8s linear infinite !important; +} + +.dhv2-stage.is-working .dhv2-stage-image { + animation: dhv2FinalAgentBreathe 2.35s ease-in-out infinite !important; +} + +@keyframes dhv2ActiveCardRingGlow { + 0%, 100% { filter: brightness(1); } + 50% { filter: brightness(1.06); } +} + +/* Digital home motion finalization: keep the real page moving like the mockup. */ +@property --dhv2-halo-angle { + syntax: ""; + inherits: false; + initial-value: 0deg; +} + +@property --dhv2-agent-y { + syntax: ""; + inherits: false; + initial-value: 0px; +} + +@property --dhv2-agent-scale { + syntax: ""; + inherits: false; + initial-value: 1; +} + +@property --dhv2-agent-saturate { + syntax: ""; + inherits: false; + initial-value: 1; +} + +@property --dhv2-agent-shadow { + syntax: ""; + inherits: false; + initial-value: 0.16; +} + +@property --dhv2-agent-idle-y { + syntax: ""; + inherits: false; + initial-value: 0px; +} + +@property --dhv2-agent-idle-scale { + syntax: ""; + inherits: false; + initial-value: 1; +} + +@property --dhv2-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 0.72; +} + +@property --dhv2-shadow-scale { + syntax: ""; + inherits: false; + initial-value: 1; +} + +@property --dhv2-stage-disk-scale { + syntax: ""; + inherits: false; + initial-value: 1; +} + +.dhv2-stage::before { + --dhv2-halo-angle: 0deg; + top: 53% !important; + width: min(46%, 390px) !important; + opacity: 0.9 !important; + transform: translate(-50%, -50%) rotate(var(--dhv2-halo-angle)) !important; + transform-origin: center center !important; + animation: dhv2StageHaloOrbit 5.4s linear infinite !important; + will-change: transform !important; +} + +.dhv2-stage.is-working::after { + --dhv2-shadow-scale: 1; + --dhv2-shadow-alpha: 0.72; + opacity: var(--dhv2-shadow-alpha) !important; + transform: translateX(-50%) scaleX(var(--dhv2-shadow-scale)) !important; + animation: dhv2StageShadowPulse 2.2s ease-in-out infinite !important; + will-change: transform, opacity !important; +} + +.dhv2-stage.is-working .dhv2-stage-image { + --dhv2-agent-y: 0px; + --dhv2-agent-scale: 1; + --dhv2-agent-saturate: 1.02; + --dhv2-agent-shadow: 0.16; + transform: translate3d(-50%, var(--dhv2-agent-y), 0) scale(var(--dhv2-agent-scale)) !important; + transform-origin: center bottom !important; + filter: drop-shadow(0 22px 30px rgba(15, 80, 150, var(--dhv2-agent-shadow))) saturate(var(--dhv2-agent-saturate)) !important; + animation: dhv2StageAgentLive 2.15s ease-in-out infinite !important; + will-change: transform, filter !important; +} + +.dhv2-stage.is-standby .dhv2-stage-image { + --dhv2-agent-idle-y: 0px; + --dhv2-agent-idle-scale: 1; + transform: translate3d(-50%, var(--dhv2-agent-idle-y), 0) scale(var(--dhv2-agent-idle-scale)) !important; + transform-origin: center bottom !important; + animation: dhv2StageAgentIdleLive 3.2s ease-in-out infinite !important; + will-change: transform !important; +} + +.dhv2-action-card.is-active { + animation: dhv2ActiveCardLiveGlow 1.55s ease-in-out infinite !important; +} + +.dhv2-action-card.is-active::after { + content: none !important; + display: none !important; + animation: none !important; +} + +.dhv2-card-spinner { + position: absolute !important; + top: 10px !important; + right: 10px !important; + z-index: 4 !important; + display: block !important; + width: 18px !important; + height: 18px !important; + border: 2px solid rgba(30, 144, 255, 0.2) !important; + border-top-color: #1e90ff !important; + border-right-color: #14b8a6 !important; + border-radius: 50% !important; + background: transparent !important; + box-shadow: 0 0 0 4px rgba(30, 144, 255, 0.08) !important; + transform-origin: center center !important; + animation: dhv2CardSpinnerRotate 720ms linear infinite !important; + pointer-events: none !important; + will-change: transform !important; +} + +.dhv2-action-card.is-active strong { + padding-right: 28px !important; +} + +.dhv2-card-loading { + display: none !important; +} + +@keyframes dhv2CardSpinnerRotate { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +@keyframes dhv2StageHaloOrbit { + from { --dhv2-halo-angle: 0deg; } + to { --dhv2-halo-angle: 360deg; } +} + +@keyframes dhv2StageAgentLive { + 0%, 100% { + --dhv2-agent-y: 0px; + --dhv2-agent-scale: 1; + --dhv2-agent-saturate: 1.02; + --dhv2-agent-shadow: 0.16; + } + 45% { + --dhv2-agent-y: -10px; + --dhv2-agent-scale: 1.018; + --dhv2-agent-saturate: 1.08; + --dhv2-agent-shadow: 0.2; + } + 70% { + --dhv2-agent-y: -4px; + --dhv2-agent-scale: 1.008; + } +} + +@keyframes dhv2StageAgentIdleLive { + 0%, 100% { + --dhv2-agent-idle-y: 0px; + --dhv2-agent-idle-scale: 1; + } + 50% { + --dhv2-agent-idle-y: -5px; + --dhv2-agent-idle-scale: 1.006; + } +} + +@keyframes dhv2StageShadowPulse { + 0%, 100% { + --dhv2-shadow-alpha: 0.72; + --dhv2-shadow-scale: 1; + } + 50% { + --dhv2-shadow-alpha: 0.42; + --dhv2-shadow-scale: 0.82; + } +} + +@keyframes dhv2ActiveCardLiveGlow { + 0%, 100% { + box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.18), 0 0 28px rgba(30, 144, 255, 0.16); + filter: brightness(1); + } + 50% { + box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.34), 0 0 44px rgba(30, 144, 255, 0.3); + filter: brightness(1.06); + } +} + +/* Digital home requested parity fixes: soft stage disk, scrollable run list, no chart tooltip. */ +.dhv2-stage { + background: + linear-gradient(rgba(30, 144, 255, 0.035) 1px, transparent 1px), + linear-gradient(90deg, rgba(30, 144, 255, 0.035) 1px, transparent 1px), + radial-gradient(circle at 50% 52%, rgba(216, 241, 252, 0.72) 0 24%, rgba(185, 225, 255, 0.48) 24% 44%, rgba(255,255,255,0) 45%), + linear-gradient(180deg, #f7fbff, #ffffff) !important; + background-size: 32px 32px, 32px 32px, auto, auto !important; +} + +.dhv2-stage::before { + top: 54% !important; + width: min(60%, 460px) !important; + aspect-ratio: 1 !important; + border: 0 !important; + border-radius: 50% !important; + opacity: 1 !important; + transform: translate(-50%, -50%) scale(var(--dhv2-stage-disk-scale, 1)) !important; + background: + radial-gradient(circle at 42% 36%, rgba(255,255,255,0.76) 0 9%, rgba(255,255,255,0) 28%), + radial-gradient(circle at 50% 50%, rgba(226, 245, 255, 0.7) 0 31%, rgba(174, 218, 255, 0.58) 32% 56%, rgba(172, 235, 226, 0.5) 57% 73%, rgba(255,255,255,0) 74%) !important; + -webkit-mask: none !important; + mask: none !important; + box-shadow: + inset 0 0 56px rgba(255, 255, 255, 0.7), + 0 20px 48px rgba(80, 145, 210, 0.12) !important; + animation: dhv2StageDiskBreathe 3.4s ease-in-out infinite !important; + pointer-events: none !important; + will-change: transform, opacity !important; +} + +.dhv2-run-table { + min-height: 0 !important; + display: grid !important; + grid-template-rows: 28px !important; + grid-auto-rows: minmax(48px, auto) !important; + align-content: start !important; + gap: 7px !important; + overflow-y: auto !important; + overflow-x: hidden !important; + padding-right: 4px !important; + scrollbar-gutter: stable !important; +} + +.dhv2-run-table::-webkit-scrollbar { + width: 6px; +} + +.dhv2-run-table::-webkit-scrollbar-thumb { + border-radius: 999px; + background: rgba(86, 150, 220, 0.34); +} + +.dhv2-run-table::-webkit-scrollbar-track { + background: rgba(211, 230, 246, 0.34); +} + +.dhv2-bar:hover::after, +.dhv2-bar:focus-visible::after { + content: none !important; + display: none !important; +} + +.dhv2-bar { + cursor: default !important; +} + +@keyframes dhv2StageDiskBreathe { + 0%, 100% { + --dhv2-stage-disk-scale: 1; + opacity: 0.96; + } + 50% { + --dhv2-stage-disk-scale: 1.025; + opacity: 1; + } +} + +/* Digital home final stage background: one soft disk only, matching the mockup. */ +.dhv2-stage { + background: linear-gradient(180deg, #f7fbff 0%, #ffffff 100%) !important; + background-size: auto !important; +} + +.dhv2-stage::before { + content: "" !important; + position: absolute !important; + left: 50% !important; + top: 54% !important; + z-index: 0 !important; + width: min(64%, 486px) !important; + height: auto !important; + aspect-ratio: 1 !important; + border: 0 !important; + border-radius: 50% !important; + opacity: 0.98 !important; + transform: translate(-50%, -50%) scale(var(--dhv2-stage-disk-scale, 1)) !important; + background: + radial-gradient(circle at 43% 34%, rgba(255,255,255,0.78) 0 10%, rgba(255,255,255,0) 30%), + radial-gradient(circle at 48% 48%, rgba(225,245,255,0.82) 0 31%, rgba(184,226,255,0.58) 32% 55%, rgba(177,235,226,0.5) 56% 73%, rgba(255,255,255,0) 74%) !important; + -webkit-mask: none !important; + mask: none !important; + box-shadow: + inset 0 0 58px rgba(255,255,255,0.74), + 0 22px 50px rgba(80,145,210,0.12) !important; + animation: dhv2StageDiskBreathe 3.4s ease-in-out infinite !important; + pointer-events: none !important; +} + +/* Digital home task execution final override: keep the card compact and reveal action only on hover. */ +.dhv2-task-row { + grid-template-columns: 18px minmax(0, 1fr) !important; + min-height: 70px !important; + height: auto !important; + align-items: start !important; + overflow: hidden !important; + position: relative !important; +} + +.dhv2-task-main { + min-width: 0 !important; + transition: padding-right 0.16s ease !important; +} + +.dhv2-task-row:hover .dhv2-task-main, +.dhv2-task-row:focus-within .dhv2-task-main { + padding-right: 56px !important; +} + +.dhv2-task-run-button { + position: absolute !important; + right: 10px !important; + top: 50% !important; + width: 48px !important; + height: 28px !important; + min-width: 0 !important; + min-height: 28px !important; + padding: 0 !important; + border: 1px solid rgba(30, 144, 255, 0.28) !important; + border-radius: 999px !important; + color: #1677d2 !important; + background: linear-gradient(180deg, #fff, #eef7ff) !important; + box-shadow: 0 5px 14px rgba(30, 144, 255, 0.12) !important; + font-size: 12px !important; + font-weight: 800 !important; + line-height: 1 !important; + opacity: 0 !important; + transform: translate(6px, -50%) !important; + pointer-events: none !important; + transition: opacity 0.16s ease, transform 0.16s ease, color 0.16s ease, background 0.16s ease, box-shadow 0.16s ease !important; +} + +.dhv2-task-row:hover .dhv2-task-run-button, +.dhv2-task-row:focus-within .dhv2-task-run-button, +.dhv2-task-run-button.is-running { + opacity: 1 !important; + transform: translate(0, -50%) !important; + pointer-events: auto !important; +} + +.dhv2-task-run-button:not(:disabled):hover { + color: #fff !important; + border-color: transparent !important; + background: linear-gradient(90deg, #1677d2, #1e90ff) !important; + box-shadow: 0 8px 20px rgba(30, 144, 255, 0.24) !important; +} + +.dhv2-task-run-button:disabled:not(.is-running) { + color: #8ba0b4 !important; + background: #eef3f8 !important; + box-shadow: none !important; + cursor: not-allowed !important; +} + +.dhv2-task-run-button.is-running { + position: absolute !important; + width: 28px !important; + min-width: 28px !important; + border-color: rgba(18, 185, 129, 0.42) !important; + color: transparent !important; + background: #e9fbf5 !important; + box-shadow: 0 0 0 4px rgba(18, 185, 129, 0.08) !important; +} + +.dhv2-task-run-button.is-running span { + position: absolute !important; + inset: 6px !important; + border: 2px solid rgba(18, 185, 129, 0.24) !important; + border-top-color: #12b981 !important; + border-right-color: #1e90ff !important; + border-radius: 50% !important; + animation: dhv2TaskRunSpin 780ms linear infinite !important; +} + +/* Digital home latest design final override. */ +.dhv2-ai-body { + grid-template-rows: 52px minmax(0, 1fr) !important; + gap: 8px !important; +} + +.dhv2-ai-stats { + display: grid !important; + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; + grid-template-rows: none !important; + height: 48px !important; + min-height: 48px !important; + gap: 7px !important; + padding: 0 !important; +} + +.dhv2-ai-stat { + min-width: 0 !important; + height: 48px !important; + min-height: 48px !important; + display: grid !important; + grid-template-columns: minmax(0, 1fr) auto !important; + align-items: center !important; + gap: 6px !important; + padding: 0 8px !important; +} + +.dhv2-ai-stat span { + overflow: hidden !important; + font-size: 12px !important; + line-height: 1.15 !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-ai-stat strong { + justify-self: end !important; + margin: 0 !important; + font-size: 18px !important; + line-height: 1 !important; + white-space: nowrap !important; +} + +.dhv2-ai-stat strong::after { + content: "次" !important; + margin-left: 2px !important; + color: #7890a6 !important; + font-size: 10px !important; + font-weight: 700 !important; +} + +.dhv2-run-log-text { + min-width: 0 !important; + display: inline-flex !important; + align-items: center !important; + overflow: hidden !important; + font-size: 12px !important; + line-height: 1.35 !important; +} + +.dhv2-run-log-text span { + min-width: 0 !important; + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.dhv2-run-log-text > i { + flex: 0 0 auto !important; + width: 2px !important; + height: 17px !important; + margin-left: 3px !important; + border-radius: 999px !important; + background: #1e90ff !important; + box-shadow: 0 0 8px rgba(30, 144, 255, 0.45) !important; + animation: dhv2TypeCursorBlink 760ms steps(2, start) infinite !important; +} + +.dhv2-run-row.is-streaming .dhv2-run-log-text { + animation: dhv2TypeTextPop 240ms ease-out !important; +} + +.dhv2-action-card.is-active { + overflow: hidden !important; + isolation: isolate !important; + padding-right: 12px !important; + border-color: rgba(30, 144, 255, 0.42) !important; + background: linear-gradient(135deg, #eef7ff 0%, #ffffff 62%, #effcf8 100%) !important; + box-shadow: 0 0 0 1px rgba(30, 144, 255, 0.16), 0 12px 34px rgba(30, 144, 255, 0.18) !important; + animation: dhv2ActiveCardEdgeGlow 1.9s ease-in-out infinite !important; +} + +.dhv2-action-card.is-active > * { + position: relative !important; + z-index: 2 !important; +} + +.dhv2-action-card.is-active::before { + content: "" !important; + position: absolute !important; + inset: 0 !important; + z-index: 3 !important; + display: block !important; + padding: 2px !important; + border-radius: inherit !important; + background: + conic-gradient( + from var(--dhv2-card-edge-angle, 0deg), + rgba(30, 144, 255, 0) 0deg, + rgba(30, 144, 255, 0) 42deg, + rgba(30, 144, 255, 0.95) 74deg, + rgba(20, 184, 166, 0.95) 106deg, + rgba(30, 144, 255, 0) 144deg, + rgba(30, 144, 255, 0) 360deg + ) !important; + -webkit-mask: + linear-gradient(#000 0 0) content-box, + linear-gradient(#000 0 0) !important; + -webkit-mask-composite: xor !important; + mask-composite: exclude !important; + animation: dhv2CardEdgeOrbit 1.35s linear infinite !important; + opacity: 1 !important; + pointer-events: none !important; +} + +.dhv2-action-card.is-active::after { + content: "" !important; + position: absolute !important; + inset: 2px !important; + z-index: 0 !important; + display: block !important; + width: auto !important; + height: auto !important; + border: 0 !important; + border-radius: calc(10px - 1px) !important; + background: + radial-gradient(circle at var(--spot-x, 72%) var(--spot-y, 34%), rgba(30, 144, 255, 0.14), transparent 145px), + linear-gradient(135deg, #eef7ff 0%, #ffffff 62%, #effcf8 100%) !important; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.74) !important; + opacity: 1 !important; + transform: none !important; + animation: none !important; + pointer-events: none !important; +} + +.dhv2-card-spinner, +.dhv2-card-loading, +.dhv2-action-card.is-active .dhv2-card-spinner, +.dhv2-action-card.is-active .dhv2-card-loading { + display: none !important; +} + +.dhv2-action-card.is-active strong { + padding-right: 0 !important; +} + +/* Final running-card edge loader override. */ +.dhv2-action-card.is-active::before, +.dhv2-action-card.is-active::after { + content: none !important; + display: none !important; + animation: none !important; +} + +.dhv2-action-card.is-active { + animation: none !important; +} + +.dhv2-action-card.is-running { + border-color: rgba(30, 144, 255, 0.34) !important; + box-shadow: + 0 0 0 1px rgba(30, 144, 255, 0.12), + 0 12px 34px rgba(30, 144, 255, 0.18) !important; + animation: dhv2RunningCardPulse 1.7s ease-in-out infinite !important; +} + +.dhv2-action-edge-loader { + position: absolute !important; + inset: 0 !important; + z-index: 5 !important; + display: block !important; + width: 100% !important; + height: 100% !important; + overflow: visible !important; + pointer-events: none !important; +} + +.dhv2-action-edge-loader rect { + fill: none !important; + vector-effect: non-scaling-stroke !important; +} + +.dhv2-action-edge-loader__track { + stroke: rgba(30, 144, 255, 0.18) !important; + stroke-width: 2px !important; +} + +.dhv2-action-edge-loader__pulse { + stroke: #1e90ff !important; + stroke-width: 2.4px !important; + stroke-linecap: round !important; + stroke-dasharray: 20 80 !important; + filter: drop-shadow(0 0 3px rgba(30, 144, 255, 0.9)) !important; + animation: dhv2ActionEdgeRun 1.15s linear infinite !important; +} + +/* Final today-execution compact metrics override. Keep at EOF. */ +.dhv2-today { + grid-template-rows: 44px 124px minmax(0, 1fr) !important; +} + +.dhv2-metrics { + grid-auto-rows: 28px !important; + gap: 4px !important; + padding: 4px 12px 0 !important; +} + +.dhv2-metrics-title { + min-height: 20px !important; + height: 20px !important; +} + +.dhv2-metrics-title strong { + font-size: 14px !important; +} + +.dhv2-metrics-title span { + font-size: 11px !important; +} + +.dhv2-metric { + min-height: 28px !important; + height: 28px !important; + gap: 2px !important; + padding: 2px 7px !important; +} + +.dhv2-metric span { + font-size: 11px !important; + line-height: 1 !important; +} + +.dhv2-metric strong { + font-size: 13px !important; + line-height: 1 !important; +} + +.dhv2-chart { + min-height: 0 !important; + margin-top: 4px !important; +} + +/* Final action-card perimeter loading override. Keep at EOF. */ +.dhv2-action-card.is-running { + overflow: visible !important; + isolation: isolate !important; + border-color: rgba(30, 144, 255, 0.22) !important; + box-shadow: + 0 0 0 1px rgba(30, 144, 255, 0.08), + 0 12px 34px rgba(30, 144, 255, 0.18) !important; +} + +.dhv2-action-card.is-running > i, +.dhv2-action-card.is-running > div { + position: relative !important; + z-index: 2 !important; +} + +.dhv2-action-edge-loader { + position: absolute !important; + inset: -4px !important; + z-index: 1 !important; + display: block !important; + width: calc(100% + 8px) !important; + height: calc(100% + 8px) !important; + overflow: visible !important; + pointer-events: none !important; + contain: none !important; +} + +.dhv2-action-edge-loader rect { + fill: none !important; + vector-effect: non-scaling-stroke !important; +} + +.dhv2-action-edge-loader__track { + stroke: rgba(30, 144, 255, 0.18) !important; + stroke-width: 1.4px !important; +} + +.dhv2-action-edge-loader__pulse { + stroke-width: 2.8px !important; + stroke-linecap: round !important; + filter: drop-shadow(0 0 5px rgba(30, 144, 255, 0.65)) !important; + animation: dhv2ActionEdgeOrbit 1.25s linear infinite !important; +} + +.dhv2-action-edge-loader__pulse--primary { + stroke: #1e90ff !important; + stroke-dasharray: 16 84 !important; +} + +.dhv2-action-edge-loader__pulse--secondary { + stroke: #14b8a6 !important; + stroke-dasharray: 12 88 !important; + stroke-dashoffset: -50 !important; + animation-name: dhv2ActionEdgeOrbitSecondary !important; +} + +@keyframes dhv2ActionEdgeOrbit { + from { stroke-dashoffset: 0; } + to { stroke-dashoffset: -100; } +} + +@keyframes dhv2ActionEdgeOrbitSecondary { + from { stroke-dashoffset: -50; } + to { stroke-dashoffset: -150; } +} + +@media (prefers-reduced-motion: reduce) { + .dhv2-action-edge-loader__pulse { + animation: none !important; + } +} + +/* Absolute perimeter loader wins over active-card child rules. Keep at EOF. */ +.dhv2-action-card.is-active.is-running > .dhv2-action-edge-loader { + position: absolute !important; + inset: -4px !important; + left: -4px !important; + top: -4px !important; + right: auto !important; + bottom: auto !important; + z-index: 1 !important; + display: block !important; + flex: none !important; + grid-column: 1 / -1 !important; + grid-row: 1 / -1 !important; + width: calc(100% + 8px) !important; + min-width: calc(100% + 8px) !important; + max-width: none !important; + height: calc(100% + 8px) !important; + min-height: calc(100% + 8px) !important; + max-height: none !important; + margin: 0 !important; + padding: 0 !important; + overflow: visible !important; + transform: none !important; + pointer-events: none !important; +} + +.dhv2-action-card.is-active.is-running > .dhv2-action-edge-loader + i, +.dhv2-action-card.is-active.is-running > .dhv2-action-edge-loader ~ div { + position: relative !important; + z-index: 2 !important; +} + +/* Final running-state motion polish. Keep at EOF. */ +.dhv2-action-card.is-active.is-running { + transform-origin: center center !important; + animation: dhv2ActionCardBreathe 1.85s ease-in-out infinite !important; +} + +.dhv2-action-card.is-active.is-running > i { + animation: dhv2ActionIconBreathe 1.85s ease-in-out infinite !important; +} + +.dhv2-run-row.is-streaming .dhv2-run-log { + grid-template-columns: 24px minmax(0, 1fr) !important; +} + +.dhv2-run-row.is-streaming .dhv2-run-log > i.dhv2-run-live-dots { + width: 22px !important; + height: 14px !important; + display: inline-flex !important; + align-items: center !important; + justify-content: center !important; + gap: 3px !important; + background: transparent !important; + box-shadow: none !important; + animation: none !important; +} + +.dhv2-run-row.is-streaming .dhv2-run-log > i.dhv2-run-live-dots b { + width: 5px !important; + height: 5px !important; + display: block !important; + border-radius: 999px !important; + background: #1e90ff !important; + box-shadow: 0 0 8px rgba(30, 144, 255, 0.4) !important; + animation: dhv2RunLiveDots 860ms ease-in-out infinite !important; +} + +.dhv2-run-row.is-streaming .dhv2-run-log > i.dhv2-run-live-dots b:nth-child(2) { + animation-delay: 120ms !important; +} + +.dhv2-run-row.is-streaming .dhv2-run-log > i.dhv2-run-live-dots b:nth-child(3) { + animation-delay: 240ms !important; +} + +@keyframes dhv2ActionCardBreathe { + 0%, 100% { + filter: brightness(1); + box-shadow: + 0 0 0 1px rgba(30, 144, 255, 0.08), + 0 12px 34px rgba(30, 144, 255, 0.18); + } + 50% { + filter: brightness(1.045); + box-shadow: + 0 0 0 1px rgba(20, 184, 166, 0.2), + 0 16px 42px rgba(30, 144, 255, 0.26); + } +} + +@keyframes dhv2ActionIconBreathe { + 0%, 100% { transform: scale(1); } + 50% { transform: scale(1.055); } +} + +@keyframes dhv2RunLiveDots { + 0%, 100% { + opacity: 0.36; + transform: translateY(0) scale(0.86); + } + 45% { + opacity: 1; + transform: translateY(-3px) scale(1); + } +} + +@media (prefers-reduced-motion: reduce) { + .dhv2-action-card.is-active.is-running, + .dhv2-action-card.is-active.is-running > i, + .dhv2-run-row.is-streaming .dhv2-run-log > i.dhv2-run-live-dots b { + animation: none !important; + } +} + +/* Task manager preview panel: hover a duty on the left, read handoff details on the right. */ +.de-task-manager-column--preview { + grid-template-rows: auto minmax(0, 1fr) !important; +} + +.de-task-manager-duty-list .de-duty-card--previewed { + border-color: rgba(30, 144, 255, 0.44) !important; + background: linear-gradient(180deg, #ffffff, #eef8ff) !important; + box-shadow: + inset 4px 0 0 #1e90ff, + 0 12px 26px rgba(30, 144, 255, 0.13) !important; +} + +.de-task-manager-preview-panel { + min-height: 0 !important; + display: grid !important; + grid-template-rows: auto auto auto auto minmax(0, auto) !important; + gap: 10px !important; + overflow-y: auto !important; + padding-right: 4px !important; +} + +.de-task-manager-preview-title { + display: grid !important; + gap: 7px !important; + padding: 13px 14px !important; + border: 1px solid rgba(30, 144, 255, 0.18) !important; + border-radius: 12px !important; + background: linear-gradient(135deg, #eef8ff 0%, #ffffff 68%) !important; +} + +.de-task-manager-preview-title span { + width: fit-content !important; + padding: 3px 8px !important; + border-radius: 999px !important; + color: #1677d2 !important; + background: rgba(30, 144, 255, 0.1) !important; + font-size: 11px !important; + font-weight: 800 !important; +} + +.de-task-manager-preview-title strong { + color: #102b4c !important; + font-size: 17px !important; + line-height: 1.32 !important; +} + +.de-task-manager-preview-title em { + width: fit-content !important; + max-width: 100% !important; + padding: 5px 10px !important; + border-radius: 999px !important; + color: #0f766e !important; + background: rgba(20, 184, 166, 0.12) !important; + font-size: 12px !important; + font-style: normal !important; + font-weight: 800 !important; +} + +.de-task-manager-brief-card { + display: grid !important; + gap: 7px !important; + padding: 12px 13px !important; + border: 1px solid rgba(142, 183, 220, 0.26) !important; + border-radius: 12px !important; + background: rgba(255, 255, 255, 0.78) !important; +} + +.de-task-manager-brief-card span { + color: #315576 !important; + font-size: 12px !important; + font-weight: 850 !important; +} + +.de-task-manager-brief-card p { + margin: 0 !important; + color: #455f7a !important; + font-size: 13px !important; + line-height: 1.58 !important; +} + +.de-task-manager-preview-meta { + display: grid !important; + gap: 8px !important; + margin: 0 !important; +} + +.de-task-manager-preview-meta div { + display: grid !important; + grid-template-columns: 76px minmax(0, 1fr) !important; + gap: 8px !important; + padding: 9px 10px !important; + border-radius: 10px !important; + background: rgba(238, 248, 255, 0.7) !important; +} + +.de-task-manager-preview-meta dt { + color: #6b8198 !important; + font-size: 12px !important; + font-weight: 800 !important; +} + +.de-task-manager-preview-meta dd { + min-width: 0 !important; + margin: 0 !important; + color: #1f3b58 !important; + font-size: 12px !important; + line-height: 1.45 !important; +} + +.de-task-manager-decision-summary { + display: grid !important; + gap: 8px !important; + margin-top: 2px !important; + padding-top: 10px !important; + border-top: 1px solid rgba(142, 183, 220, 0.22) !important; +} + +.de-task-manager-decision-summary > header { + display: flex !important; + justify-content: space-between !important; + gap: 10px !important; + align-items: center !important; +} + +.de-task-manager-decision-summary > header strong { + color: #143450 !important; + font-size: 13px !important; +} + +.de-task-manager-decision-summary > header span, +.de-task-manager-decision-summary > p { + margin: 0 !important; + color: #6b8198 !important; + font-size: 12px !important; +} + +.de-task-manager-decision-compact-list { + display: grid !important; + gap: 8px !important; +} + +.de-task-manager-decision-compact-card { + display: grid !important; + gap: 7px !important; + padding: 10px !important; + border: 1px solid rgba(245, 158, 11, 0.18) !important; + border-radius: 10px !important; + background: rgba(255, 251, 235, 0.78) !important; +} + +.de-task-manager-decision-compact-card div { + display: flex !important; + justify-content: space-between !important; + gap: 8px !important; +} + +.de-task-manager-decision-compact-card strong { + min-width: 0 !important; + overflow: hidden !important; + color: #3b2f12 !important; + font-size: 12px !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.de-task-manager-decision-compact-card span, +.de-task-manager-decision-compact-card p { + margin: 0 !important; + color: #8a6a16 !important; + font-size: 11px !important; + line-height: 1.45 !important; +} + +.de-task-manager-decision-compact-actions { + display: flex !important; + flex-wrap: wrap !important; + justify-content: flex-start !important; + gap: 6px !important; +} + +.de-task-manager-decision-compact-actions button { + width: fit-content !important; + display: inline-flex !important; + align-items: center !important; + gap: 4px !important; + padding: 4px 8px !important; + border: 1px solid rgba(245, 158, 11, 0.26) !important; + border-radius: 999px !important; + color: #9a5b00 !important; + background: #ffffff !important; + font-size: 11px !important; + font-weight: 800 !important; +} + +.de-task-manager-decision-compact-actions button:disabled { + opacity: 0.5 !important; + cursor: not-allowed !important; +} + +.de-blocked-input-field { + display: grid; + grid-template-columns: minmax(0, 1fr) auto auto auto; + gap: 8px; + align-items: center; +} + +/* qimingclaw display pass: overview no longer shows the employee info card. */ +.dhv2-home .dhv2-left { + grid-template-rows: minmax(0, 1fr) !important; } diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/api.ts b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/api.ts index 99410770..a5fbe661 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/api.ts +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/api.ts @@ -13,6 +13,7 @@ import type { ChannelDetail, BrowserSession, ApprovalSubscriptionPreferences, + ApprovalDecisionsResponse, BusinessViewResponse, DigitalEmployeeBusinessViewKind, DigitalEmployeeBusinessViewQuery, @@ -72,6 +73,7 @@ import { handleQimingclawDigitalApi } from './qimingclawAdapter'; const API_FETCH_TIMEOUT_MS = 9000; const DIGITAL_EMPLOYEE_WORKDAY_TIMEOUT_MS = 20000; +const DIGITAL_EMPLOYEE_REPORT_TIMEOUT_MS = 70000; type ApiFetchOptions = RequestInit & { timeoutMs?: number; @@ -695,6 +697,14 @@ export function governanceCommand( }); } +export function getApprovalDecisions( + status: 'open' | 'all' = 'open', +): Promise { + return apiFetch( + `/api/approvals?status=${encodeURIComponent(status)}`, + ); +} + export function runSchedulerNow(): Promise { const stamp = Date.now(); return governanceCommand({ @@ -1021,6 +1031,109 @@ export function postDigitalEmployeeWorkdayAction( }); } +export function syncDigitalEmployeeTaskSelection( + date: string, + dutyIds: string[], +): Promise { + return apiFetch('/api/digital-employee/workday/actions', { + method: 'POST', + body: JSON.stringify({ + action: 'update_task_selection', + date, + duty_ids: dutyIds, + }), + timeoutMs: DIGITAL_EMPLOYEE_WORKDAY_TIMEOUT_MS, + }); +} + +export function generateDigitalEmployeeDailyReport( + body: Omit, +): Promise { + return apiFetch('/api/digital-employee/workday/actions', { + method: 'POST', + body: JSON.stringify({ ...body, action: 'generate_daily_report' }), + timeoutMs: DIGITAL_EMPLOYEE_REPORT_TIMEOUT_MS, + }); +} + +export function digitalEmployeeReportPdfUrl(date: string): string { + return `${apiOrigin()}${apiBase}/api/digital-employee/reports/${encodeURIComponent(date)}/pdf`; +} + +export function revealDigitalEmployeeDailyReportFolder( + date: string, +): Promise<{ ok: boolean; folder?: string; path?: string }> { + return apiFetch<{ ok: boolean; folder?: string; path?: string }>( + `/api/digital-employee/reports/${encodeURIComponent(date)}/reveal`, + { + method: 'POST', + timeoutMs: DIGITAL_EMPLOYEE_REPORT_TIMEOUT_MS, + }, + ); +} + +export async function downloadDigitalEmployeeDailyReportPdf( + date: string, +): Promise<{ blob: Blob; filename: string }> { + const token = getToken(); + const headers = new Headers(); + if (token) { + headers.set('Authorization', `Bearer ${token}`); + } + const controller = new AbortController(); + const timeout = window.setTimeout(() => controller.abort(), DIGITAL_EMPLOYEE_REPORT_TIMEOUT_MS); + let response: Response; + try { + response = await fetch(digitalEmployeeReportPdfUrl(date), { + headers, + signal: controller.signal, + }); + } catch (error) { + if (error instanceof DOMException && error.name === 'AbortError') { + throw new Error(`API request timed out after ${DIGITAL_EMPLOYEE_REPORT_TIMEOUT_MS / 1000}s: /api/digital-employee/reports/${date}/pdf`); + } + throw error; + } finally { + window.clearTimeout(timeout); + } + if (!response.ok) { + const text = await response.text().catch(() => ''); + let message = text || response.statusText; + if (text) { + try { + const parsed = JSON.parse(text) as { message?: unknown; error?: unknown }; + if (typeof parsed.message === 'string' && parsed.message.trim()) { + message = parsed.message.trim(); + } else if (typeof parsed.error === 'string' && parsed.error.trim()) { + message = parsed.error.trim(); + } + } catch { + message = text; + } + } + throw new Error(`API ${response.status}: ${message}`); + } + const blob = await response.blob(); + if (blob.size === 0) { + throw new Error('日报 PDF 内容为空,请重新生成后再下载。'); + } + return { + blob, + filename: `智能数字人系统日报-${date}.pdf`, + }; +} + +export function triggerBrowserDownload(blob: Blob, filename: string): void { + const url = window.URL.createObjectURL(blob); + const anchor = document.createElement('a'); + anchor.href = url; + anchor.download = filename; + document.body.appendChild(anchor); + anchor.click(); + anchor.remove(); + window.setTimeout(() => window.URL.revokeObjectURL(url), 30_000); +} + export function restartManagedService( serviceId: string, body: { reason?: string; actor?: string } = {}, diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/approvals.ts b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/approvals.ts new file mode 100644 index 00000000..54e4dd4b --- /dev/null +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/approvals.ts @@ -0,0 +1,121 @@ +import type { + ApprovalDecisionView, + GovernanceCommandResponse, + UserNotification, +} from '@/types/api'; +import { governanceCommand } from './api'; + +export type ApprovalDecisionResolution = 'approve' | 'reject'; + +const REJECT_ACTION_IDS = new Set(['reject', 'rejected', 'defer', 'deferred']); +const APPROVE_SHORTCUTS = new Set(['同意', '批准', '通过', '同意执行', '批准执行', 'approve', 'approved', 'yes', 'ok']); +const REJECT_SHORTCUTS = new Set(['拒绝', '驳回', '不同意', '否决', '拒绝执行', '驳回执行', 'reject', 'rejected', 'no']); + +export function isApprovalOpen(status?: string | null): boolean { + return ['pending', 'requested'].includes(String(status || '').toLowerCase()); +} + +export function approvalDecisionId(decision: ApprovalDecisionView): string { + return decision.approval_id || decision.id; +} + +export function approvalResolutionFromAction(actionId: string): ApprovalDecisionResolution { + return REJECT_ACTION_IDS.has(actionId.toLowerCase()) ? 'reject' : 'approve'; +} + +export function parseApprovalShortcut(input: string): ApprovalDecisionResolution | null { + const normalized = input + .trim() + .toLowerCase() + .replace(/[\s。.!!??]/g, ''); + if (APPROVE_SHORTCUTS.has(normalized)) return 'approve'; + if (REJECT_SHORTCUTS.has(normalized)) return 'reject'; + return null; +} + +export function notificationToApprovalDecision( + notification: UserNotification, +): ApprovalDecisionView | null { + if (notification.kind !== 'need_approval' || notification.status !== 'unread') { + return null; + } + const approvalId = notification.approval_id || notification.correlation_id; + if (!approvalId) return null; + return { + id: approvalId, + approval_id: approvalId, + plan_id: notification.plan_id || null, + task_id: notification.task_id || null, + run_id: null, + target_kind: notification.task_id ? 'task' : null, + target_id: notification.task_id || notification.plan_id || approvalId, + title: notification.title || '真实执行事项需要确认', + scenario: notification.body || '请确认下一步处理方式。', + status: 'requested', + status_label: '待决策', + plan_title: notification.plan_id || '真实计划', + task_title: notification.task_id || approvalId, + actions: [ + { id: 'approve', label: '同意', tone: 'primary' }, + { id: 'reject', label: '驳回', tone: 'secondary' }, + ], + }; +} + +export function mergeApprovalDecisions( + canonical: ApprovalDecisionView[], + legacy: ApprovalDecisionView[], +): ApprovalDecisionView[] { + const merged = new Map(); + canonical.forEach((decision) => { + merged.set(approvalDecisionId(decision), decision); + }); + legacy.forEach((decision) => { + const id = approvalDecisionId(decision); + if (!merged.has(id)) merged.set(id, decision); + }); + return Array.from(merged.values()); +} + +export async function submitApprovalDecision( + decision: ApprovalDecisionView, + actionIdOrResolution: string, + options: { + source: string; + comment?: string; + correlationPrefix?: string; + }, +): Promise { + const approvalId = approvalDecisionId(decision); + if (!approvalId) { + throw new Error('缺少 approval_id,无法处理审批。'); + } + const resolution = approvalResolutionFromAction(actionIdOrResolution); + const action = decision.actions.find((item) => item.id === actionIdOrResolution); + const comment = options.comment || action?.label || (resolution === 'reject' ? '驳回' : '同意'); + const stamp = Date.now(); + const prefix = (options.correlationPrefix || options.source || 'approval') + .replace(/[^a-zA-Z0-9_-]/g, '-') + .replace(/-+/g, '-'); + const response = await governanceCommand({ + command_kind: resolution === 'reject' ? 'reject_approval' : 'approve_approval', + context_refs: { + approval_id: approvalId, + plan_id: decision.plan_id || undefined, + task_id: decision.task_id || undefined, + run_id: decision.run_id || undefined, + }, + payload: { + source: options.source, + comment, + target_kind: decision.target_kind || undefined, + target_id: decision.target_id || undefined, + }, + correlation_id: `${prefix}-${approvalId}-${resolution}-${stamp}`, + idempotency_key: `${prefix}-${approvalId}-${resolution}-${stamp}`, + }); + if (!response.accepted) { + throw new Error(response.message || `审批命令未被接受:${response.command_id || approvalId}`); + } + return response; +} diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/auth.ts b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/auth.ts index 8ee601c3..f7c80cb0 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/auth.ts +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/auth.ts @@ -1,12 +1,11 @@ -const TOKEN_KEY = 'qimingclaw_digital_token'; -const LEGACY_TOKEN_KEY = 'zeroclaw_token'; +const TOKEN_KEY = 'zeroclaw_token'; /** * Retrieve the stored authentication token. */ export function getToken(): string | null { try { - return localStorage.getItem(TOKEN_KEY) ?? localStorage.getItem(LEGACY_TOKEN_KEY); + return localStorage.getItem(TOKEN_KEY); } catch { return null; } @@ -18,7 +17,6 @@ export function getToken(): string | null { export function setToken(token: string): void { try { localStorage.setItem(TOKEN_KEY, token); - localStorage.removeItem(LEGACY_TOKEN_KEY); } catch { // localStorage may be unavailable (e.g. in some private browsing modes) } @@ -30,7 +28,6 @@ export function setToken(token: string): void { export function clearToken(): void { try { localStorage.removeItem(TOKEN_KEY); - localStorage.removeItem(LEGACY_TOKEN_KEY); } catch { // Ignore } diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/dateFormat.ts b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/dateFormat.ts new file mode 100644 index 00000000..a989e900 --- /dev/null +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/dateFormat.ts @@ -0,0 +1,47 @@ +const DAY_NAMES = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; + +function isSameDay(a: Date, b: Date): boolean { + return ( + a.getFullYear() === b.getFullYear() && + a.getMonth() === b.getMonth() && + a.getDate() === b.getDate() + ); +} + +function pad(n: number): string { + return n < 10 ? '0' + n : String(n); +} + +/** Format an ISO timestamp into a human-readable Chinese relative time. */ +export function formatRelativeTime(iso: string | undefined | null): string { + if (!iso) return ''; + const d = new Date(iso); + if (isNaN(d.getTime())) return ''; + const now = new Date(); + + const time = `${pad(d.getHours())}:${pad(d.getMinutes())}`; + + // Today + if (isSameDay(d, now)) return `今天 ${time}`; + + // Yesterday + const yesterday = new Date(now); + yesterday.setDate(yesterday.getDate() - 1); + if (isSameDay(d, yesterday)) return `昨天 ${time}`; + + // Within 7 days: show weekday + const diffDays = Math.floor( + (now.getTime() - d.getTime()) / (1000 * 60 * 60 * 24), + ); + if (diffDays < 7 && d.getDay() !== now.getDay()) { + return `${DAY_NAMES[d.getDay()]} ${time}`; + } + + // Same year: month-day + if (d.getFullYear() === now.getFullYear()) { + return `${d.getMonth() + 1}月${d.getDate()}日`; + } + + // Different year + return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日`; +} diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/uuid.ts b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/uuid.ts new file mode 100644 index 00000000..e45bc5da --- /dev/null +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/uuid.ts @@ -0,0 +1,27 @@ +/** + * Generate a UUID v4 string. + * + * Uses `crypto.randomUUID()` when available (modern browsers, secure contexts) + * and falls back to a manual implementation backed by `crypto.getRandomValues()` + * for older browsers (e.g. Safari < 15.4, some Electron/Raspberry-Pi builds). + * + * Closes #3303, #3261. + */ +export function generateUUID(): string { + if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') { + return crypto.randomUUID(); + } + + // Fallback: RFC 4122 version 4 UUID via getRandomValues + // crypto must exist if we reached here (only randomUUID is missing) + const c = globalThis.crypto; + const bytes = new Uint8Array(16); + c.getRandomValues(bytes); + + // Set version (4) and variant (10xx) bits per RFC 4122 + bytes[6] = (bytes[6]! & 0x0f) | 0x40; + bytes[8] = (bytes[8]! & 0x3f) | 0x80; + + const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join(''); + return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`; +} diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/ws.ts b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/ws.ts new file mode 100644 index 00000000..9136186e --- /dev/null +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/ws.ts @@ -0,0 +1,171 @@ +import type { WsMessage } from '../types/api'; +import { getToken } from './auth'; +import { apiOrigin, apiBase } from './basePath'; +import { isTauri } from './tauri'; +import { generateUUID } from './uuid'; + +export type WsMessageHandler = (msg: WsMessage) => void; +export type WsOpenHandler = () => void; +export type WsCloseHandler = (ev: CloseEvent) => void; +export type WsErrorHandler = (ev: Event) => void; + +export interface WebSocketClientOptions { + /** Base URL override. Defaults to current host with ws(s) protocol. */ + baseUrl?: string; + /** Delay in ms before attempting reconnect. Doubles on each failure up to maxReconnectDelay. */ + reconnectDelay?: number; + /** Maximum reconnect delay in ms. */ + maxReconnectDelay?: number; + /** Set to false to disable auto-reconnect. Default true. */ + autoReconnect?: boolean; + /** If set, route messages to the PlanAgent for this plan. */ + planId?: string; +} + +const DEFAULT_RECONNECT_DELAY = 1000; +const MAX_RECONNECT_DELAY = 30000; + +const SESSION_STORAGE_KEY = 'zeroclaw_session_id'; + +/** Return a stable session ID, persisted in sessionStorage across reconnects. */ +function getOrCreateSessionId(): string { + let id = sessionStorage.getItem(SESSION_STORAGE_KEY); + if (!id) { + id = generateUUID(); + sessionStorage.setItem(SESSION_STORAGE_KEY, id); + } + return id; +} + +export class WebSocketClient { + private ws: WebSocket | null = null; + private currentDelay: number; + private reconnectTimer: ReturnType | null = null; + private intentionallyClosed = false; + + public onMessage: WsMessageHandler | null = null; + public onOpen: WsOpenHandler | null = null; + public onClose: WsCloseHandler | null = null; + public onError: WsErrorHandler | null = null; + + private readonly baseUrl: string; + private readonly reconnectDelay: number; + private readonly maxReconnectDelay: number; + private readonly autoReconnect: boolean; + private planId: string | undefined; + + constructor(options: WebSocketClientOptions = {}) { + let defaultBase: string; + if (isTauri() && apiOrigin()) { + defaultBase = apiOrigin().replace(/^http/, 'ws'); + } else { + const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; + defaultBase = `${protocol}//${window.location.host}`; + } + this.baseUrl = options.baseUrl ?? defaultBase; + this.reconnectDelay = options.reconnectDelay ?? DEFAULT_RECONNECT_DELAY; + this.maxReconnectDelay = options.maxReconnectDelay ?? MAX_RECONNECT_DELAY; + this.autoReconnect = options.autoReconnect ?? true; + this.currentDelay = this.reconnectDelay; + this.planId = options.planId; + } + + /** Open the WebSocket connection. */ + connect(): void { + this.intentionallyClosed = false; + this.clearReconnectTimer(); + + const token = getToken(); + const sessionId = getOrCreateSessionId(); + const params = new URLSearchParams(); + if (token) params.set('token', token); + params.set('session_id', sessionId); + if (this.planId) params.set('plan_id', this.planId); + const url = `${this.baseUrl}${apiBase}/ws/chat?${params.toString()}`; + + const protocols: string[] = ['zeroclaw.v1']; + if (token) protocols.push(`bearer.${token}`); + this.ws = new WebSocket(url, protocols); + + this.ws.onopen = () => { + this.currentDelay = this.reconnectDelay; + this.onOpen?.(); + }; + + this.ws.onmessage = (ev: MessageEvent) => { + try { + const msg = JSON.parse(ev.data) as WsMessage; + this.onMessage?.(msg); + } catch { + // Ignore non-JSON frames + } + }; + + this.ws.onclose = (ev: CloseEvent) => { + this.onClose?.(ev); + this.scheduleReconnect(); + }; + + this.ws.onerror = (ev: Event) => { + this.onError?.(ev); + }; + } + + /** Switch the optional plan binding used by the next connection. */ + setPlanId(planId?: string | null): void { + this.planId = planId ?? undefined; + } + + /** Send a chat message to the agent. */ + sendMessage(content: string): void { + if (!this.ws || this.ws.readyState !== WebSocket.OPEN) { + throw new Error('WebSocket is not connected'); + } + const payload: Record = { type: 'message', content }; + if (this.planId) payload.plan_id = this.planId; + this.ws.send(JSON.stringify(payload)); + } + + /** Close the connection without auto-reconnecting. */ + disconnect(): void { + this.intentionallyClosed = true; + this.clearReconnectTimer(); + if (this.ws) { + const socket = this.ws; + this.ws = null; + if (socket.readyState === WebSocket.CONNECTING) { + socket.onopen = () => socket.close(); + socket.onmessage = null; + socket.onerror = null; + socket.onclose = null; + return; + } + socket.close(); + } + } + + /** Returns true if the socket is open. */ + get connected(): boolean { + return this.ws?.readyState === WebSocket.OPEN; + } + + // --------------------------------------------------------------------------- + // Reconnection logic + // --------------------------------------------------------------------------- + + private scheduleReconnect(): void { + if (this.intentionallyClosed || !this.autoReconnect) return; + + this.reconnectTimer = setTimeout(() => { + this.currentDelay = Math.min(this.currentDelay * 2, this.maxReconnectDelay); + this.connect(); + }, this.currentDelay); + } + + private clearReconnectTimer(): void { + if (this.reconnectTimer !== null) { + clearTimeout(this.reconnectTimer); + this.reconnectTimer = null; + } + } +} diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/pages/digital/CommandDeck.tsx b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/pages/digital/CommandDeck.tsx index 267d1764..5efa72a1 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/pages/digital/CommandDeck.tsx +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/pages/digital/CommandDeck.tsx @@ -1,14 +1,29 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import type { KeyboardEvent as ReactKeyboardEvent, MouseEvent as ReactMouseEvent } from 'react'; -import { Clipboard, Clock3, Download, Eye, MessageSquare, PlayCircle, RefreshCw, ShieldAlert, ShieldCheck, SkipForward, Square, TimerReset, UserRoundPlus } from 'lucide-react'; -import Avatar3D from '@/components/digital/Avatar3D'; +import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; +import type { CSSProperties, PointerEvent as ReactPointerEvent, ReactNode } from 'react'; +import { animate } from 'animejs'; +import { + CheckCircle2, + ChevronRight, + CircleDot, + Clock3, + ClipboardList, + ExternalLink, + FileText, + FolderOpen, + Handshake, + Mail, + MonitorCheck, + PhoneCall, + PlayCircle, +} from 'lucide-react'; import { basePath } from '@/lib/basePath'; import { dispatchPlanNow, dispatchPlanReadySteps, + downloadDigitalEmployeeDailyReportPdf, + generateDigitalEmployeeDailyReport, getDigitalEmployeeWorkday, getPlanStepGraph, - getRouteInterventions, getSchedulerJobs, governanceCommand, postDigitalEmployeeWorkdayAction, @@ -16,41 +31,109 @@ import { pullPlanStepDispatchPolicy, pullRiskApprovalPolicy, pullRouteDecisionPolicy, - recordApprovalAction, + revealDigitalEmployeeDailyReportFolder, resolveApprovalConflict, - decideRouteIntervention, - restartManagedService, + syncDigitalEmployeeTaskSelection, + triggerBrowserDownload, } from '@/lib/api'; +import { + approvalDecisionId, + submitApprovalDecision, +} from '@/lib/approvals'; import { isTauri } from '@/lib/tauri'; +import ApprovalActionCard from '@/components/shared/ApprovalActionCard'; import type { + ApprovalDecisionView, CronJob, - DigitalEmployeeDailyReport, - DigitalEmployeeDecision, DigitalEmployeeDuty, - DigitalEmployeeManagedService, DigitalEmployeeRunDetail, - DigitalEmployeeTaskAgentState, DigitalEmployeeTaskExecutionSummary, DigitalEmployeeWorkEvent, DigitalEmployeeWorkdayProjection, GovernanceCommandKind, PlanStepBusinessRow, PlanStepDependencyDetail, - RouteInterventionRecord, } from '@/types/api'; +import PlanChat from '@/planb/PlanChat'; import type { DigitalNavigationTarget } from './navigation'; const bp = basePath; const digitalAssetBase = isTauri() ? './digital-assets' : `${bp}/digital-assets`; const avatarAssetBase = `${digitalAssetBase}/avatars`; +const avatarStateAssetBase = `${avatarAssetBase}/states`; +const ROLE_COMMANDER_PROFILE = `${avatarAssetBase}/avatar-male-1.png`; const DIGITAL_EMPLOYEE_TIME_ZONE = 'Asia/Shanghai'; +const DIGITAL_HOME_DESIGN_WIDTH = 1440; +const DIGITAL_HOME_DESIGN_HEIGHT = 820; -type EmployeeVisualState = 'skill' | 'browser' | 'call' | 'redial' | 'evidence' | 'decision' | 'reporting'; type EventStatusFilter = 'all' | 'running' | 'success' | 'danger'; type TaskListFilter = 'all' | 'selected' | 'pending'; -type TaskAgentControlCommand = Extract; type BlockedPlanStepControlCommand = Extract; -type ApprovalActionKind = 'comment' | 'delegate' | 'mark_timeout' | 'mark_risk' | 'clear_risk'; +type WorkSceneTab = 'standby' | 'working'; +type RoleActionKind = 'workOrder' | 'inspection' | 'phone' | 'mail' | 'collaboration'; +type BusinessTypeKind = 'serviceWorkOrder' | 'monitorWarning' | 'reportStats' | 'systemInspection' | 'communication'; +type ReportRangePreset = 'instant' | 'today' | 'week' | 'month' | 'custom'; +type ActionAnimation = ReturnType; + +interface AnimatedNumberProps { + value: number | string; + unit?: string; + decimals?: number; + className?: string; +} + +interface MotionProgressProps { + value: number; + label?: string; + className?: string; +} + +interface DigitalOverlayShellProps { + title: string; + eyebrow?: string; + description?: ReactNode; + variant?: 'modal' | 'drawer'; + size?: 'small' | 'medium' | 'wide' | 'large' | 'document' | 'drawer'; + className?: string; + surfaceClassName?: string; + bodyClassName?: string; + headerActions?: ReactNode; + actions?: ReactNode; + onClose: () => void; + children: ReactNode; +} + +interface RoleActionSlot { + x: number; + y: number; + width: number; + height: number; +} + +interface TaskHoverPanel { + title: string; + audience: string; + description: string; + schedule: string; + top: number; + left: number; +} + +interface RunLogHoverPanel { + title: string; + time: string; + status: string; + detail: string; + raw: string; + top: number; + left: number; +} + +interface AiCommunicationMetric { + id: string; + label: string; + value: number; +} interface DigitalPlanItem { id: string; @@ -83,98 +166,85 @@ interface PlanStepOrchestrationSummary { leased: number; } -interface BlockedPlanStepInputTarget { - step: PlanStepBusinessRow; - dependency: PlanStepDependencyDetail | null; -} +type PlanFlowStepStatus = 'done' | 'active' | 'pending'; -interface ManagementSyncStatus { - running: boolean; - syncing: boolean; - enabled: boolean; - endpoint: string | null; - missingCredentials?: string[]; - pending: number; - failed: number; - lastSyncAt: string | null; - lastSyncError: string | null; - failureSummary?: ManagementSyncFailureSummary; - recentFailures?: ManagementSyncFailure[]; -} - -interface ManagementSyncFailureSummary { - total: number; - dueForRetry: number; - backoff: number; - byEntityType: Array<{ entityType: string; count: number }>; -} - -interface ManagementSyncAttempt { - attemptNo: number; - status: string; - error: string | null; - endpoint?: string | null; - startedAt: string; - finishedAt: string; -} - -interface ManagementSyncFailure { +interface PlanFlowStep { id: string; - entityType: string; - entityId: string; - entitySummary?: ManagementSyncEntitySummary | null; - operation: string; - attempts: number; - lastAttemptAt: string | null; - nextRetryAt?: string | null; - dueForRetry?: boolean; - managementRecordUrl?: string | null; - attemptHistory?: ManagementSyncAttempt[]; - error: string | null; - createdAt: string; - updatedAt: string; + title: string; + meta: string; + status: PlanFlowStepStatus; } -interface ManagementSyncEntitySummary { - title?: string | null; - status?: string | null; - summary?: string | null; +interface HomepageTaskRunRow { + id: string; + title: string; + total: number; + success: number; + failure: number; + log: string; + logTitle: string; + logTime: string; + logStatus: string; + logDetail: string; + logRaw: string; + logKey: string; + status: string; + tone: string; + active: boolean; + streaming: boolean; } -interface ApprovalActionDraft { - comment: string; - delegateTo: string; - dueAt: string; -} - -const EMPTY_APPROVAL_ACTION_DRAFT: ApprovalActionDraft = { - comment: '', - delegateTo: '', - dueAt: '', -}; - // 技术侧 PlanTemplate 是任务模板来源;用户侧只展示为“任务”,运行时 Task/PlanStep 展示为“步骤”。 -interface EmployeeVisualStateOption { - id: EmployeeVisualState; - label: string; - shortLabel: string; - phase: string; - src: string; - bubble: string; -} - -const EMPLOYEE_STATE_VALUES: EmployeeVisualState[] = ['skill', 'browser', 'call', 'redial', 'evidence', 'decision', 'reporting']; const EVENT_STATUS_FILTERS: Array<{ id: EventStatusFilter; label: string }> = [ { id: 'all', label: '全部' }, { id: 'running', label: '执行中' }, { id: 'success', label: '已完成' }, { id: 'danger', label: '异常' }, ]; -const WORKDAY_GUIDE_DISMISSED_STORAGE_KEY = 'qimingclaw:digital-workday-guide-dismissed-date'; -const LEGACY_WORKDAY_GUIDE_DISMISSED_STORAGE_KEY = 'sgrobot:digital-workday-guide-dismissed-date'; +const WORKDAY_GUIDE_DISMISSED_STORAGE_KEY = 'sgrobot:digital-workday-guide-dismissed-date'; const MAIN_RUN_DETAIL_LIMIT = 80; const EVENT_HISTORY_RENDER_LIMIT = 300; +const FULL_PROJECTION_REFRESH_INTERVAL_MS = 10000; +const RUN_DETAIL_TASK_POLL_INTERVAL_MS = 1100; +const RUN_DETAIL_TASK_POLL_STAGGER_MS = 220; +const RUN_DETAIL_TASK_POLL_LIMIT = 8; +const ROLE_ACTION_CARDS: Array<{ + id: RoleActionKind; + label: string; + detail: string; + progress?: number; +}> = [ + { id: 'workOrder', label: '工单处理', detail: '督办、审批、缺陷跟踪 9 项', progress: 60 }, + { id: 'inspection', label: '业务巡检', detail: '设备与系统巡检 12 轮', progress: 74 }, + { id: 'phone', label: '电话沟通', detail: '类型一、类型二沟通 6 次', progress: 52 }, + { id: 'mail', label: '信息处理', detail: '消息确认、材料同步 23 次', progress: 68 }, + { id: 'collaboration', label: '人+AI协同', detail: '2 项转人工确认', progress: 35 }, +]; +const BUSINESS_TYPE_CARDS: Array<{ + id: BusinessTypeKind; + label: string; +}> = [ + { id: 'serviceWorkOrder', label: '95598服务工单' }, + { id: 'monitorWarning', label: '监测预警' }, + { id: 'reportStats', label: '报表统计' }, + { id: 'systemInspection', label: '系统巡检' }, + { id: 'communication', label: '沟通协同' }, +]; +const ROLE_ACTION_STATE_IMAGE: Record = { + workOrder: `${avatarStateAssetBase}/employee-decision.png`, + inspection: `${avatarStateAssetBase}/employee-browser.png`, + phone: `${avatarStateAssetBase}/employee-redial.png`, + mail: `${avatarStateAssetBase}/employee-running.png`, + collaboration: `${avatarStateAssetBase}/employee-evidence.png`, +}; +const REPORT_RANGE_OPTIONS: Array<{ id: ReportRangePreset; label: string }> = [ + { id: 'instant', label: '即时' }, + { id: 'today', label: '当日' }, + { id: 'week', label: '本周' }, + { id: 'month', label: '本月' }, + { id: 'custom', label: '自定义' }, +] as const; const WORKDAY_GUIDE_STEPS = [ { title: '确认日期', body: '先确认今天的值班日期,避免把昨天或明天的任务混在一起。' }, { title: '选择任务', body: '从岗位职责里勾选今天要执行的任务,未接入能力保持待扩展。' }, @@ -182,65 +252,6 @@ const WORKDAY_GUIDE_STEPS = [ { title: '查看过程', body: '右侧滚动显示运行明细,任务中心可继续查看明细。' }, ]; -const EMPLOYEE_STATE_OPTIONS: Record = { - skill: { - id: 'skill', - label: '查看Skill', - shortLabel: '技能', - phase: '查看Skill与计划', - src: `${avatarAssetBase}/states/employee-idle.png`, - bubble: '我正在查看可用Skill、任务计划和今天要勾选的执行内容。', - }, - browser: { - id: 'browser', - label: '操作浏览器', - shortLabel: '浏览器', - phase: '操作浏览器执行', - src: `${avatarAssetBase}/states/employee-browser.png`, - bubble: '我正在打开页面、读取信息、填写表单,并把执行过程同步到右侧。', - }, - call: { - id: 'call', - label: '电话外呼', - shortLabel: '外呼', - phase: '电话外呼与重拨', - src: `${avatarAssetBase}/states/employee-running.png`, - bubble: '我正在按工单名单外呼现场人员,记录接通、未接通和后续重拨。', - }, - redial: { - id: 'redial', - label: '重拨跟进', - shortLabel: '重拨', - phase: '未接通人员重拨', - src: `${avatarAssetBase}/states/employee-redial.png`, - bubble: '我正在跟进未接通人员,按间隔重拨并更新每个人的通知状态。', - }, - evidence: { - id: 'evidence', - label: '数据核验', - shortLabel: '核验', - phase: '核验执行证据', - src: `${avatarAssetBase}/states/employee-evidence.png`, - bubble: '我正在核验页面数据、执行证据和任务结果,确认交付内容可信。', - }, - decision: { - id: 'decision', - label: '等待决策', - shortLabel: '决策', - phase: '等待人工确认', - src: `${avatarAssetBase}/states/employee-decision.png`, - bubble: '我已完成前置处理,现在需要人工确认后再继续推进。', - }, - reporting: { - id: 'reporting', - label: '汇报成果', - shortLabel: '汇报', - phase: '汇报今日成果', - src: `${avatarAssetBase}/states/employee-reporting.png`, - bubble: '我正在整理运行明细和日报,方便你直接查看成果和异常。', - }, -}; - function todayInputDate(): string { const date = new Date(); return [ @@ -261,77 +272,6 @@ function badgeClass(tone?: string): string { return 'de-badge-info'; } -function formatCompactNumber(value?: number | null): string { - const numeric = typeof value === 'number' && Number.isFinite(value) ? value : 0; - return new Intl.NumberFormat('zh-CN', { notation: 'compact', maximumFractionDigits: 1 }).format(numeric); -} - -function formatEstimatedCostUsd(value?: number | null): string { - const numeric = typeof value === 'number' && Number.isFinite(value) ? value : 0; - if (numeric > 0 && numeric < 0.01) return `$${numeric.toFixed(4)}`; - return `$${numeric.toFixed(2)}`; -} - -function approvalRiskTone(value?: string | null): string { - const normalized = compactText(value).toLowerCase(); - if (['high', 'critical', 'risk', 'marked'].includes(normalized)) return 'danger'; - if (['medium', 'warning'].includes(normalized)) return 'warning'; - if (['normal', 'low', 'clear'].includes(normalized)) return 'success'; - return 'info'; -} - -function approvalRiskLabel(value?: string | null): string { - const normalized = compactText(value).toLowerCase(); - if (['high', 'critical', 'risk', 'marked'].includes(normalized)) return '高风险'; - if (['medium', 'warning'].includes(normalized)) return '中风险'; - if (['normal', 'low', 'clear'].includes(normalized)) return '风险正常'; - return '未标记风险'; -} - -function approvalSlaTone(value?: string | null): string { - const normalized = compactText(value).toLowerCase(); - if (['timeout', 'overdue', 'expired'].includes(normalized)) return 'danger'; - if (['tracked', 'due_soon', 'warning'].includes(normalized)) return 'warning'; - if (['met', 'normal'].includes(normalized)) return 'success'; - return 'info'; -} - -function approvalSlaLabel(value?: string | null): string { - const normalized = compactText(value).toLowerCase(); - if (['timeout', 'overdue', 'expired'].includes(normalized)) return '已超时'; - if (['tracked', 'due_soon', 'warning'].includes(normalized)) return 'SLA跟踪'; - if (['met', 'normal'].includes(normalized)) return 'SLA正常'; - return '未设置SLA'; -} - -function approvalActionLabel(value?: string | null): string { - const normalized = compactText(value).toLowerCase(); - if (normalized === 'comment') return '评论'; - if (normalized === 'delegate') return '转交'; - if (normalized === 'mark_timeout') return '标记超时'; - if (normalized === 'mark_risk') return '标记风险'; - if (normalized === 'clear_risk') return '清除风险'; - return normalized || '暂无动作'; -} - -function approvalConflictReasonLabel(value?: string | null): string { - const normalized = compactText(value).toLowerCase(); - if (normalized === 'terminal_status_mismatch') return '终态不一致'; - if (normalized === 'local_newer_status_mismatch') return '本地状态较新'; - if (normalized === 'workflow_step_mismatch') return '审批步骤不一致'; - return normalized || '跨端状态不一致'; -} - -function approvalStatusShortLabel(value?: string | null): string { - const normalized = compactText(value).toLowerCase(); - if (normalized === 'approved') return '已同意'; - if (normalized === 'rejected') return '已驳回'; - if (normalized === 'cancelled') return '已取消'; - if (normalized === 'pending') return '待确认'; - if (normalized === 'dismissed') return '已忽略'; - return normalized || '未知'; -} - function dutyCardClass(planItem: DigitalPlanItem, selected: boolean): string { const classes = ['de-template-card-row', 'de-duty-card', 'de-duty-card--compact']; if (!planItem.implemented) classes.push('de-duty-card--disabled'); @@ -449,7 +389,7 @@ function buildPlanTemplateItem(job: CronJob, duties: DigitalEmployeeDuty[], sele statusLabel, statusTone, scheduleText: linkedDuty?.schedule_text ?? scheduleTextFromJob(job), - resultText: linkedDuty?.result_text ?? `${stepCount} 个步骤,${skillCount} 个Skill`, + resultText: linkedDuty?.result_text ?? `${stepCount} 个步骤`, conversationId: linkedDuty?.conversation_id ?? templateId, stepCount, taskCount: skillCount, @@ -462,20 +402,6 @@ function buildPlanTemplateItem(job: CronJob, duties: DigitalEmployeeDuty[], sele }; } -function isPlanItemExecutable(planItem: DigitalPlanItem): boolean { - return planItem.implemented; -} - -function planExecutionDisabledReason(planItem: DigitalPlanItem): string { - if (!planItem.implemented) return '当前任务未接入执行能力。'; - return ''; -} - -function planReadyStepActionLabel(planItem: DigitalPlanItem): string { - if (planItem.readyStepCount > 0) return `推进 ${planItem.readyStepCount}`; - return '推进'; -} - function planStepOrchestrationSummary(rows: PlanStepBusinessRow[]): Map { const summary = new Map(); rows.forEach((step) => { @@ -486,19 +412,86 @@ function planStepOrchestrationSummary(rows: PlanStepBusinessRow[]): Map part.trim()).filter(Boolean); + const readable = (parts[parts.length - 1] || normalized).replace(/[-_]+/g, ' '); + return readable || `步骤 ${index + 1}`; +} + +function currentStepIndexFromEvent(event: DigitalEmployeeWorkEvent | null | undefined): number | null { + const match = `${event?.step_title ?? ''} ${event?.task_title ?? ''}`.match(/(?:步骤|step)\s*(\d+)/i) + ?? `${event?.step_title ?? ''} ${event?.task_title ?? ''}`.match(/第\s*(\d+)\s*步/); + if (!match?.[1]) return null; + const parsed = Number(match[1]); + return Number.isFinite(parsed) && parsed > 0 ? parsed - 1 : null; +} + +function planFlowStepsForItem( + planItem: DigitalPlanItem, + currentEvent: DigitalEmployeeWorkEvent | null | undefined, + summary: DigitalEmployeeTaskExecutionSummary | null | undefined, +): PlanFlowStep[] { + const skillIds = planItem.schedulerJob?.skill_ids ?? []; + const stepCount = Math.max(planItem.stepCount, skillIds.length, 1); + const matchedEvent = currentEvent && eventMatchesPlanItem(currentEvent, planItem) ? currentEvent : null; + const explicitActiveIndex = currentStepIndexFromEvent(matchedEvent); + const activeIndex = explicitActiveIndex !== null + ? Math.min(explicitActiveIndex, stepCount - 1) + : summary?.latest_status_tone === 'success' + ? stepCount + : matchedEvent + ? Math.min(Math.max(summary?.success_count ?? 0, 0), stepCount - 1) + : -1; + + return Array.from({ length: stepCount }, (_, index) => { + const status: PlanFlowStepStatus = index < activeIndex || summary?.latest_status_tone === 'success' + ? 'done' + : index === activeIndex + ? 'active' + : 'pending'; + const skillId = skillIds[index]; + return { + id: `${planItem.id}-step-${index}`, + title: skillStepTitle(skillId, index), + meta: skillId ? `能力 ${skillId}` : `PlanTemplate 步骤 ${index + 1}`, + status, + }; + }); +} + function fallbackSummaryForPlanItem( planItem: DigitalPlanItem, events: DigitalEmployeeWorkEvent[], @@ -577,250 +570,29 @@ function eventScheduleTime(event: DigitalEmployeeWorkEvent): string { return fallback || '即时触发'; } -function formatBeijingDateTime(value?: string | null): string { +function formatBeijingClock(value?: string | null): string { const raw = compactText(value); if (!raw) return ''; const date = new Date(raw); if (Number.isNaN(date.getTime())) return ''; const parts = new Intl.DateTimeFormat('zh-CN', { timeZone: DIGITAL_EMPLOYEE_TIME_ZONE, - month: '2-digit', - day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false, }).formatToParts(date); const part = (type: string) => parts.find((item) => item.type === type)?.value ?? ''; - return `${part('month')}/${part('day')} ${part('hour')}:${part('minute')}`; -} - -function summarizeSyncError(value?: string | null): string { - const error = compactText(value); - if (!error) return ''; - return error.length > 140 ? `${error.slice(0, 140)}...` : error; -} - -function syncStatusTone(status: ManagementSyncStatus | null): 'info' | 'success' | 'warning' | 'danger' { - if (!status) return 'info'; - if (!status.enabled || !status.endpoint) return 'warning'; - if ((status.missingCredentials?.length ?? 0) > 0) return 'warning'; - if (status.failed > 0 || status.lastSyncError) return 'danger'; - if (status.syncing || status.pending > 0) return 'warning'; - return status.lastSyncAt ? 'success' : 'info'; -} - -function syncStatusLabel(status: ManagementSyncStatus | null): string { - if (!status) return '未连接'; - if (!status.enabled) return '已停用'; - if (!status.endpoint) return '未配置'; - if ((status.missingCredentials?.length ?? 0) > 0) return '缺少凭据'; - if (status.syncing) return '同步中'; - if (status.failed > 0 || status.lastSyncError) return '同步异常'; - if (status.pending > 0) return '待同步'; - return status.lastSyncAt ? '已同步' : '等待数据'; -} - -function syncStatusSummary(status: ManagementSyncStatus | null): string { - if (!status) return '当前环境未连接 qimingclaw 同步桥。'; - if (!status.enabled) return '管理端同步已停用。'; - if (!status.endpoint) return '管理端同步地址未配置。'; - if ((status.missingCredentials?.length ?? 0) > 0) { - return `管理端同步凭据未完整:${status.missingCredentials?.join('、')}`; - } - const error = summarizeSyncError(status.lastSyncError); - if (status.failed > 0 || error) { - const retrySummary = status.failureSummary - ? [ - status.failureSummary.dueForRetry > 0 - ? `${status.failureSummary.dueForRetry} 条可重试` - : '', - status.failureSummary.backoff > 0 - ? `${status.failureSummary.backoff} 条退避中` - : '', - failureGroupSummary(status.failureSummary), - ].filter(Boolean).join(',') - : ''; - return [ - status.failed > 0 ? `${status.failed} 条失败` : '', - status.pending > 0 ? `${status.pending} 条待同步` : '', - retrySummary, - error ? `失败原因:${error}` : '', - ].filter(Boolean).join(','); - } - if (status.syncing) return `正在同步,待同步 ${status.pending} 条。`; - if (status.pending > 0) return `仍有 ${status.pending} 条待同步记录。`; - return status.lastSyncAt - ? `最近同步:${formatBeijingDateTime(status.lastSyncAt) || status.lastSyncAt}` - : '等待本地 outbox 数据。'; -} - -function entityTypeLabel(entityType: string): string { - const labels: Record = { - plan: 'Plan', - task: 'Task', - run: 'Run', - event: 'Event', - artifact: 'Artifact', - approval: 'Approval', - }; - return labels[entityType] || entityType || 'Entity'; -} - -function failureGroupSummary(summary: ManagementSyncFailureSummary): string { - const groups = summary.byEntityType - .slice(0, 3) - .map((group) => `${entityTypeLabel(group.entityType)} ${group.count}`) - .join(' / '); - return groups ? `类型:${groups}` : ''; -} - -function syncFailureSummary(failure: ManagementSyncFailure): string { - const error = summarizeSyncError(failure.error); - const title = compactText(failure.entitySummary?.title); - return [ - title, - `${entityTypeLabel(failure.entityType)} / ${failure.operation}`, - `重试 ${failure.attempts} 次`, - failure.dueForRetry ? '等待补偿' : `下次 ${syncFailureRetryTime(failure)}`, - error, - ].filter(Boolean).join(' · '); -} - -function syncFailureTime(failure: ManagementSyncFailure): string { - return formatBeijingDateTime(failure.lastAttemptAt || failure.updatedAt || failure.createdAt) || '未尝试'; -} - -function syncFailureRetryTime(failure: ManagementSyncFailure): string { - if (failure.dueForRetry) return '可重试'; - return formatBeijingDateTime(failure.nextRetryAt) || '待计算'; -} - -function syncAttemptStatusLabel(status: string): string { - if (status === 'synced') return '已同步'; - if (status === 'failed') return '失败'; - return status || '未知'; -} - -function syncAttemptTone(status: string): 'success' | 'danger' | 'info' { - if (status === 'synced') return 'success'; - if (status === 'failed') return 'danger'; - return 'info'; -} - -function buildSyncFailureDiagnostic( - failure: ManagementSyncFailure, - status: ManagementSyncStatus | null, -): string { - return JSON.stringify( - { - generatedAt: new Date().toISOString(), - source: 'qimingclaw-digital-employee', - failure, - sync: status - ? { - running: status.running, - syncing: status.syncing, - enabled: status.enabled, - endpoint: status.endpoint, - missingCredentials: status.missingCredentials ?? [], - pending: status.pending, - failed: status.failed, - lastSyncAt: status.lastSyncAt, - lastSyncError: status.lastSyncError, - failureSummary: status.failureSummary ?? null, - } - : null, - }, - null, - 2, - ); -} - -function syncFailureDiagnosticFileName(failure: ManagementSyncFailure): string { - const entity = [failure.entityType, failure.entityId] - .filter(Boolean) - .join('-') - .replace(/[^a-z0-9._-]+/gi, '-') - .replace(/^-+|-+$/g, '') - .slice(0, 80); - return `qimingclaw-sync-failure-${entity || failure.id || 'diagnostic'}.json`; -} - -function downloadTextFile(filename: string, content: string, mimeType = 'application/json;charset=utf-8'): void { - const blob = new Blob([content], { type: mimeType }); - const url = URL.createObjectURL(blob); - const link = document.createElement('a'); - link.href = url; - link.download = filename; - document.body.appendChild(link); - link.click(); - link.remove(); - window.setTimeout(() => URL.revokeObjectURL(url), 1000); -} - -function dailyReportFileName(date: string): string { - return `qimingclaw-digital-report-${date}.txt`; -} - -function buildDailyReportDownloadText( - dateLabel: string, - report: DigitalEmployeeDailyReport, - summaries: DigitalEmployeeTaskExecutionSummary[], - details: DigitalEmployeeRunDetail[], -): string { - return [ - report.title || `${dateLabel} 数字员工日报`, - `日期:${dateLabel}`, - `生成时间:${report.generated_at ? formatBeijingDateTime(report.generated_at) : '暂未生成'}`, - `生成来源:${report.generated_by === 'ai' ? 'AI' : 'qimingclaw adapter'}`, - '', - '## 摘要', - report.summary || '暂无摘要。', - '', - '## 指标', - `任务总数:${report.totals.task_count}`, - `执行次数:${report.totals.execution_count}`, - `成功次数:${report.totals.success_count}`, - `失败次数:${report.totals.failure_count}`, - `运行中:${report.totals.running_count ?? 0}`, - '', - '## 任务汇总', - ...(summaries.length > 0 - ? summaries.map((summary) => `- ${summary.title}:${summary.latest_status_label},执行 ${summary.total_count} 次,成功 ${summary.success_count},失败 ${summary.failure_count}。${summary.ai_summary || summary.business_summary || ''}`) - : ['暂无任务汇总。']), - '', - '## 运行明细', - ...(details.length > 0 - ? details.map((detail) => `- ${detail.time || '--:--'} ${detail.task_name} / ${detail.step_name || detail.operation_name || '任务执行'}:${detail.status_label},${detail.business_detail}`) - : ['暂无运行明细。']), - '', - '## 详情', - ...((report.detail_lines ?? []).length > 0 ? report.detail_lines : ['暂无详情。']), - ].join('\n'); -} - -async function readManagementSyncStatus(): Promise { - const bridge = window.QimingClawBridge?.digital; - if (!bridge?.getSyncStatus) return null; - try { - return await bridge.getSyncStatus(); - } catch { - return null; - } + return `${part('hour')}:${part('minute')}`; } function eventDisplayTime(event: DigitalEmployeeWorkEvent): string { - const beijingTime = formatBeijingDateTime(event.updated_at); + const beijingTime = formatBeijingClock(event.updated_at); if (beijingTime) { return beijingTime; } return compactText(event.time) || '待同步'; } -function runDetailDisplayTime(detail: DigitalEmployeeRunDetail): string { - return formatBeijingDateTime(detail.updated_at) || compactText(detail.time) || '--:--'; -} - function eventBusinessResult(event: DigitalEmployeeWorkEvent): string { const detail = compactText(event.detail) .replace(/^触发来源[::]\s*$/u, '') @@ -849,6 +621,56 @@ function eventMatchesFilter(event: DigitalEmployeeWorkEvent, filter: EventStatus return isFailedEvent(event); } +function eventSortTime(event: DigitalEmployeeWorkEvent): number { + const updated = new Date(event.updated_at || '').getTime(); + if (Number.isFinite(updated)) return updated; + const fallback = new Date(event.time || '').getTime(); + return Number.isFinite(fallback) ? fallback : 0; +} + +function runDetailSortTime(detail: DigitalEmployeeRunDetail): number { + const updated = new Date(detail.updated_at || '').getTime(); + if (Number.isFinite(updated)) return updated; + const fallback = new Date(detail.time || '').getTime(); + return Number.isFinite(fallback) ? fallback : 0; +} + +function runDetailIdentity(detail: DigitalEmployeeRunDetail): string { + return [ + detail.id, + detail.conversation_id ?? '', + detail.updated_at ?? '', + detail.time ?? '', + detail.task_name, + detail.step_name ?? '', + detail.operation_name ?? '', + detail.status_label, + ].join('|'); +} + +function mergeRunDetails(details: DigitalEmployeeRunDetail[]): DigitalEmployeeRunDetail[] { + const byKey = new Map(); + details.forEach((detail) => { + byKey.set(runDetailIdentity(detail), detail); + }); + return Array.from(byKey.values()).sort((left, right) => runDetailSortTime(right) - runDetailSortTime(left)); +} + +function runDetailDisplayTime(detail: DigitalEmployeeRunDetail): string { + return formatBeijingClock(detail.updated_at) || formatBeijingClock(detail.time) || '待同步'; +} + +function runDetailStepLog(detail: DigitalEmployeeRunDetail): string { + const event = compactPlanText(detail.operation_name || detail.step_name || detail.task_name || '步骤'); + const result = compactPlanText(detail.business_detail || detail.raw_detail || '等待结果回传'); + return `${runDetailDisplayTime(detail)} ${event} ${result}`; +} + +function eventStepLog(event: DigitalEmployeeWorkEvent): string { + const step = compactPlanText(event.step_title || event.task_title || event.plan_title || '事件'); + return `${eventDisplayTime(event)} ${step} ${eventBusinessResult(event)}`; +} + function projectionSelectedDutyIds(projection: DigitalEmployeeWorkdayProjection): Set { return new Set( projection.duties @@ -857,65 +679,12 @@ function projectionSelectedDutyIds(projection: DigitalEmployeeWorkdayProjection) ); } -function managedServiceSummary(service: DigitalEmployeeManagedService): string { - const deps = service.dependent_tasks.length > 0 ? `,影响 ${service.dependent_tasks.slice(0, 2).join('、')}` : ''; - return `${service.name} ${service.status_label}${service.error ? `:${service.error}` : deps}`; -} - -function canRestartManagedService(service: DigitalEmployeeManagedService): boolean { - return service.service_id === 'fileServer' || service.service_id === 'guiServer'; -} - -function taskAgentSummary(agent: DigitalEmployeeTaskAgentState): string { - const next = agent.next_action === 'retry_or_skip' ? '重试或跳过' : agent.next_action === 'watch_progress' ? '观察进度' : agent.next_action; - return `${agent.title} ${agent.status_label},下一步 ${next}`; -} - -function taskAgentControlLabel(command: TaskAgentControlCommand): string { - switch (command) { - case 'retry_task': return '重试'; - case 'skip_task': return '跳过'; - case 'cancel_task': return '取消'; - default: return command; - } -} - -function blockedPlanStepControlLabel(command: BlockedPlanStepControlCommand): string { - switch (command) { - case 'retry_task': return '重试前置'; - case 'skip_task': return '跳过前置'; - case 'cancel_task': return '取消此步骤'; - case 'provide_task_input': return '补充输入'; - default: return command; - } -} - -function firstActionableBlockedDependency(step: PlanStepBusinessRow): PlanStepDependencyDetail | null { - return (step.blocked_dependency_details ?? []).find((dependency) => Boolean(dependency.task_id)) ?? null; -} - -function blockedPlanStepSummary(step: PlanStepBusinessRow): string { - const dependency = firstActionableBlockedDependency(step) ?? step.blocked_dependency_details?.[0] ?? null; - const dependencyLabel = dependency ? `${dependency.title} ${dependency.status}` : `阻塞依赖 ${step.blocked_dependencies.length} 个`; - return `${step.title} ${step.dependency_status || step.status},${dependencyLabel}`; -} - function isDecisionOpen(status?: string): boolean { return ['pending', 'requested'].includes(String(status || '').toLowerCase()); } -function isExecutionPanelInteractiveTarget(target: EventTarget | null): boolean { - if (!(target instanceof Element)) return false; - if (target.closest('button, a, input, select, textarea, [role="tab"]')) { - return true; - } - const roleButton = target.closest('[role="button"]'); - return Boolean(roleButton && !roleButton.classList.contains('de-workday-execution--clickable')); -} - -function rotateEvents(events: DigitalEmployeeWorkEvent[], offset: number): DigitalEmployeeWorkEvent[] { - if (events.length <= 4) return events; - return events.slice(offset).concat(events.slice(0, offset)).slice(0, 4); +function decisionContextMissionId(decision: ApprovalDecisionView): string { + return decision.plan_id || decision.task_id || decision.target_id || decision.id; } function isRunningEvent(event: DigitalEmployeeWorkEvent): boolean { @@ -933,52 +702,166 @@ function isFailedEvent(event: DigitalEmployeeWorkEvent): boolean { return status.includes('danger') || status.includes('fail') || status.includes('error') || status.includes('异常'); } -function isCallEvent(event: DigitalEmployeeWorkEvent): boolean { - const text = `${event.plan_title} ${event.task_title} ${event.step_title ?? ''} ${event.detail}`.toLowerCase(); - return ['外呼', '电话', '拨打', '接通', '未接通', '重拨', '人员'].some((keyword) => text.includes(keyword)); +function runDetailMatchesPlanItem(detail: DigitalEmployeeRunDetail, planItem: DigitalPlanItem): boolean { + const haystack = `${detail.conversation_id ?? ''} ${detail.task_name} ${detail.step_name ?? ''} ${detail.operation_name ?? ''} ${detail.business_detail} ${detail.raw_detail ?? ''}`; + return haystack.includes(planItem.id) || haystack.includes(planItem.planId) || haystack.includes(planItem.title); } -function isRedialEvent(event: DigitalEmployeeWorkEvent): boolean { - const text = `${event.plan_title} ${event.task_title} ${event.step_title ?? ''} ${event.detail}`.toLowerCase(); - return ['重拨', '未接通', '再拨', '回拨', 'retry', 'callback'].some((keyword) => text.includes(keyword)); +function statusToneClass(tone?: string | null): string { + if (tone === 'danger') return 'danger'; + if (tone === 'warning' || tone === 'waiting') return 'warning'; + if (tone === 'success') return 'success'; + if (tone === 'running') return 'running'; + return 'info'; } -function isEvidenceEvent(event: DigitalEmployeeWorkEvent): boolean { - const text = `${event.plan_title} ${event.task_title} ${event.step_title ?? ''} ${event.detail}`.toLowerCase(); - return ['核验', '校验', '证据', '汇总', '报告', '结果', '交付', '看板', '同步'].some((keyword) => text.includes(keyword)); +function roleActionIcon(kind: RoleActionKind) { + if (kind === 'phone') return PhoneCall; + if (kind === 'mail') return Mail; + if (kind === 'inspection') return MonitorCheck; + if (kind === 'workOrder') return ClipboardList; + if (kind === 'collaboration') return Handshake; + return ClipboardList; } -function getVisualStateOverride(): EmployeeVisualState | null { - if (typeof window === 'undefined') return null; - const value = new URLSearchParams(window.location.search).get('visual'); - return EMPLOYEE_STATE_VALUES.includes(value as EmployeeVisualState) ? (value as EmployeeVisualState) : null; +function roleRunIcon(rowId: string) { + if (rowId === 'phone') return PhoneCall; + if (rowId === 'mail') return Mail; + if (rowId === 'inspection') return MonitorCheck; + if (rowId === 'workOrder') return ClipboardList; + if (rowId === 'collaboration') return Handshake; + if (rowId === 'mail-check') return Mail; + if (rowId === 'device-monitoring') return MonitorCheck; + if (rowId === 'fault-followup') return PhoneCall; + if (rowId === 'risk-control-report') return FileText; + return ClipboardList; } -function visualStateForEvent(event: DigitalEmployeeWorkEvent): EmployeeVisualState { - if (isRedialEvent(event)) return 'redial'; - if (isCallEvent(event)) return 'call'; - if (isEvidenceEvent(event)) return 'evidence'; - return 'browser'; +function deriveRoleActionId(text: string, hasPendingDecision: boolean): RoleActionKind { + if (hasPendingDecision) return 'collaboration'; + if (/电话|外呼|重拨|拨打|通话|汇报/i.test(text)) return 'phone'; + if (/邮件|收件|发件|发送|短信|消息|即时通|mail|message/i.test(text)) return 'mail'; + if (/巡检|监测|设备|d5000|ecs|监控|浏览器|查询/i.test(text)) return 'inspection'; + if (/人工|协同|确认|决策|转人工/i.test(text)) return 'collaboration'; + if (/工单|督办|缺陷|异常|风险|作业|单据|审批|日报|报表|报告|汇总|分析|整理/i.test(text)) return 'workOrder'; + return 'mail'; } -function resolveEmployeeVisualState(args: { - confirmed: boolean; - currentEvent: DigitalEmployeeWorkEvent | null; - pendingDecisionCount: number; - eventsCount: number; -}): EmployeeVisualState { - if (args.currentEvent) return visualStateForEvent(args.currentEvent); - if (!args.confirmed && args.eventsCount === 0) return 'skill'; - if (args.pendingDecisionCount > 0) return 'decision'; - if (args.eventsCount > 0) return 'browser'; - return 'skill'; +function deriveBusinessTypeId(text: string): BusinessTypeKind { + if (/95598|客户|用户|满意率|不满意|工单|诉求|供电服务|服务事项|报备/i.test(text)) return 'serviceWorkOrder'; + if (/预警|监测|监控|异常|风险|到期|超期|故障|负荷|余额|停电|复电|费控/i.test(text)) return 'monitorWarning'; + if (/日报|周报|月报|报表|报告|统计|汇总|分析|导出|明细表/i.test(text)) return 'reportStats'; + if (/巡检|设备|系统|平台|门户|d5000|ecs|浏览器|查询|健康检查/i.test(text)) return 'systemInspection'; + if (/电话|外呼|通话|短信|消息|邮件|即时通|i国网|沟通|协同|人工|确认|审批|会话/i.test(text)) return 'communication'; + return 'monitorWarning'; +} + +function inferTaskAudience(planItem: DigitalPlanItem): string { + const text = `${planItem.title} ${planItem.summary} ${planItem.resultText}`.toLowerCase(); + if (/95598|客户|用户|工单|满意率|供电服务/i.test(text)) return '供电服务与工单处理人员'; + if (/电话|外呼|汇报|即时通|消息|同事|协同|人工/i.test(text)) return '本人及协同处理同事'; + if (/巡检|监控|设备|系统|d5000|ecs/i.test(text)) return '业务系统与设备运维人员'; + if (/日报|报告|报表|统计|分析/i.test(text)) return '管理人员与日报接收人'; + return '当前岗位职责关联人员'; +} + +function inferTaskCollaboration(planItem: DigitalPlanItem): string { + const text = `${planItem.title} ${planItem.summary} ${planItem.resultText}`.toLowerCase(); + const notes: string[] = []; + if (/人工|确认|审批|协同|同事|领导|会签|转人工|补充材料/i.test(text)) { + notes.push('需要人员协同或人工确认'); + } + if (/i国网|国网|95598|系统|平台|门户|浏览器|d5000|ecs|邮件|消息|短信|电话|外呼|接口/i.test(text)) { + notes.push('需要外部系统或沟通渠道协同'); + } + if (notes.length === 0) { + notes.push('数字员工自动执行为主'); + } + if (planItem.stepCount > 0) { + notes.push(`包含 ${planItem.stepCount} 个执行步骤`); + } + return notes.join(','); +} + +function communicationTextFromEvent(event: DigitalEmployeeWorkEvent): string { + return `${event.plan_title} ${event.task_title} ${event.step_title ?? ''} ${event.detail}`; +} + +function communicationTextFromRunDetail(detail: DigitalEmployeeRunDetail): string { + return `${detail.task_name} ${detail.step_name ?? ''} ${detail.operation_name ?? ''} ${detail.business_detail} ${detail.raw_detail ?? ''}`; +} + +function inferCommunicationChannel(text: string): 'message' | 'phoneTypeOne' | 'phoneTypeTwo' | null { + if (/电话|外呼|拨打|通话|重拨|call/i.test(text)) { + return /外呼|拨打|重拨|call/i.test(text) ? 'phoneTypeOne' : 'phoneTypeTwo'; + } + if (/邮件|邮箱|收件|发件|email|mail|i国网|国网|igw|i-gw|即时通|消息|短信|发送消息|message|sendmessage|ai|人工确认|确认继续|补充材料|会话|协同|决策/i.test(text)) { + return 'message'; + } + return null; +} + +function inferCommunicationTarget(text: string): 'self' | 'colleague' { + if (/同事|协同|人工|转人工|领导|管理人员|班组|部门|县公司|供电所|运维|设备部|接收人|汇报/i.test(text)) { + return 'colleague'; + } + return 'self'; +} + +function buildRoleActionSlots(width: number, height: number): RoleActionSlot[] { + const xInset = Math.max(width * 0.04, 26); + const activeWidth = Math.max(Math.min(width * 0.39, 330), 286); + const activeHeight = Math.max(Math.min(height * 0.26, 118), 104); + const normalWidth = Math.max(Math.min(width * 0.29, 252), 208); + const normalHeight = Math.max(Math.min(height * 0.18, 74), 66); + const lowerInset = Math.max(height * 0.13, 34); + const topY = Math.max(height * 0.09, 30); + const middleY = Math.max((height - normalHeight) / 2, 150); + const bottomY = height - normalHeight - lowerInset; + return [ + { + x: width - activeWidth - xInset, + y: Math.max(height * 0.08, 28), + width: activeWidth, + height: activeHeight, + }, + { + x: xInset, + y: topY, + width: normalWidth, + height: normalHeight, + }, + { + x: xInset, + y: middleY, + width: normalWidth, + height: normalHeight, + }, + { + x: xInset, + y: bottomY, + width: normalWidth, + height: normalHeight, + }, + { + x: width - normalWidth - xInset, + y: middleY, + width: normalWidth, + height: normalHeight, + }, + { + x: width - normalWidth - xInset, + y: bottomY, + width: normalWidth, + height: normalHeight, + }, + ]; } function readGuideDismissedDate(): string | null { if (typeof window === 'undefined') return null; try { - return window.sessionStorage.getItem(WORKDAY_GUIDE_DISMISSED_STORAGE_KEY) - ?? window.sessionStorage.getItem(LEGACY_WORKDAY_GUIDE_DISMISSED_STORAGE_KEY); + return window.sessionStorage.getItem(WORKDAY_GUIDE_DISMISSED_STORAGE_KEY); } catch { return null; } @@ -988,45 +871,219 @@ function rememberGuideDismissedDate(date: string): void { if (typeof window === 'undefined') return; try { window.sessionStorage.setItem(WORKDAY_GUIDE_DISMISSED_STORAGE_KEY, date); - window.sessionStorage.removeItem(LEGACY_WORKDAY_GUIDE_DISMISSED_STORAGE_KEY); } catch { // Session storage can be unavailable in restricted browser contexts. } } +function numericValue(value: number | string): number | null { + if (typeof value === 'number') return Number.isFinite(value) ? value : null; + const parsed = Number(String(value).replace(/[^\d.-]/g, '')); + return Number.isFinite(parsed) ? parsed : null; +} + +function formatAnimatedNumber(value: number, decimals: number): string { + return decimals > 0 ? value.toFixed(decimals) : String(Math.round(value)); +} + +function formatCompactNumber(value?: number | null): string { + const numeric = typeof value === 'number' && Number.isFinite(value) ? value : 0; + return new Intl.NumberFormat('zh-CN', { notation: 'compact', maximumFractionDigits: 1 }).format(numeric); +} + +function formatEstimatedCostUsd(value?: number | null): string { + const numeric = typeof value === 'number' && Number.isFinite(value) ? value : 0; + if (numeric > 0 && numeric < 0.01) return `$${numeric.toFixed(4)}`; + return `$${numeric.toFixed(2)}`; +} + +function blockedPlanStepControlLabel(command: BlockedPlanStepControlCommand): string { + switch (command) { + case 'retry_task': return '重试前置'; + case 'skip_task': return '跳过前置'; + case 'provide_task_input': return '补充输入'; + default: return command; + } +} + +function firstActionableBlockedDependency(step: PlanStepBusinessRow): PlanStepDependencyDetail | null { + return (step.blocked_dependency_details ?? []).find((dependency) => Boolean(dependency.task_id)) ?? null; +} + +function blockedPlanStepSummary(step: PlanStepBusinessRow): string { + const dependency = firstActionableBlockedDependency(step) ?? step.blocked_dependency_details?.[0] ?? null; + const dependencyLabel = dependency ? `${dependency.title} ${dependency.status}` : `阻塞依赖 ${step.blocked_dependencies.length} 个`; + return `${step.title} ${step.dependency_status || step.status},${dependencyLabel}`; +} + +function AnimatedNumber({ value, unit, decimals = 0, className }: AnimatedNumberProps) { + const targetValue = useMemo(() => numericValue(value), [value]); + const [displayValue, setDisplayValue] = useState(0); + const previousValueRef = useRef(0); + + useEffect(() => { + if (targetValue === null) return undefined; + const from = previousValueRef.current ?? 0; + previousValueRef.current = targetValue; + if (from === targetValue || typeof window === 'undefined' || window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + setDisplayValue(targetValue); + return undefined; + } + + const frame = { value: from }; + const animation = animate(frame, { + value: targetValue, + duration: 760, + ease: 'outCubic', + onUpdate: () => setDisplayValue(frame.value), + }); + return () => { + animation.cancel(); + }; + }, [targetValue]); + + if (targetValue === null) { + return ( + <> + {value} + {unit && {unit}} + + ); + } + + return ( + <> + {formatAnimatedNumber(displayValue, decimals)} + {unit && {unit}} + + ); +} + +function StreamingRunLogText({ text, active }: { text: string; active: boolean }) { + const [visibleLength, setVisibleLength] = useState(text.length); + + useEffect(() => { + if (!active || typeof window === 'undefined' || window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + setVisibleLength(text.length); + return undefined; + } + + setVisibleLength(0); + const stepMs = Math.max(18, Math.min(46, Math.floor(900 / Math.max(text.length, 1)))); + const timer = window.setInterval(() => { + setVisibleLength((current) => { + if (current >= text.length) { + window.clearInterval(timer); + return text.length; + } + return current + 1; + }); + }, stepMs); + + return () => window.clearInterval(timer); + }, [active, text]); + + const visibleText = active ? text.slice(0, visibleLength) : text; + const completed = visibleLength >= text.length; + + return ( + + {visibleText} + {active && !completed &&