diff --git a/.github/workflows/build-publish-ephemeral.yaml b/.github/workflows/build-publish-ephemeral.yaml index 8a9b3132d6..036c84730e 100644 --- a/.github/workflows/build-publish-ephemeral.yaml +++ b/.github/workflows/build-publish-ephemeral.yaml @@ -26,6 +26,18 @@ jobs: id: commit_hash uses: prompt/actions-commit-hash@v3 + - name: Create .npmrc (Artifactory Authentication) + uses: rajpal-se/configure-npmrc@v1 + with: + scope: ${{ secrets.NPM_USER }} + registry: https://artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/ + authToken: ${{ secrets.NPM_TOKEN }} + registryAuthUrl: //artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/ + + - name: Show .npmrc redacted + run: | + sed -E 's/(_authToken=).*/\1***REDACTED***/' .npmrc + - name: Install and Build if: github.event.action != 'closed' env: @@ -33,16 +45,22 @@ jobs: REACT_APP_DOCS_NEXT_HOST: ${{ vars.DOCS_NEXT_HOST }} REACT_APP_DOCS_NEXT_ORG: ${{ vars.DOCS_NEXT_ORG }} REACT_APP_DOCUSAURUS_BASE_URL: ${{ vars.DOCUSAURUS_BASE_URL }}pr-${{ github.event.pull_request.number }} - REACT_APP_YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }} UMAMI_WEBSITE_ID: ${{ vars.UMAMI_WEBSITE_ID }} UMAMI_ANALYTICS_DOMAIN: ${{ vars.UMAMI_ANALYTICS_DOMAIN }} UMAMI_DATAHOST_URL: ${{ vars.UMAMI_DATAHOST_URL }} UMAMI_DATA_DOMAIN: ${{ vars.UMAMI_DATA_DOMAINS }} run: | - npm install - npm run build + yarn install + CI=true USE_SIMPLE_CSS_MINIFIER=true yarn build + + - name: Upload npm logs + if: failure() + uses: actions/upload-artifact@v4 + with: + name: npm-logs + path: /home/runner/.npm/_logs/ - name: Deploy preview uses: rossjrw/pr-preview-action@v1 with: - source-dir: ./build/ \ No newline at end of file + source-dir: ./build/ diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index cc096e543b..88e2a14abe 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -10,6 +10,14 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Create .npmrc (Artifactory Authentication) + uses: rajpal-se/configure-npmrc@v1 + with: + scope: ${{ secrets.NPM_USER }} + registry: https://artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/ + authToken: ${{ secrets.NPM_TOKEN }} + registryAuthUrl: //artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/ + - name: Use Node.js uses: actions/setup-node@v4 with: diff --git a/.gitignore b/.gitignore index e71fe895a4..a089aaa26c 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ yarn-error.log* #Migration Folders /static/_static/images + +#JFrog +/.npmrc diff --git a/docusaurus.config.ts b/docusaurus.config.ts index b24dd37d41..82c9af945b 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -25,7 +25,6 @@ const config: Config = { projectName: 'docs-next', // Usually your repo name. onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', // Even if you don't use internationalization, you can use this field to set // useful metadata like html lang. For example, if your site is Chinese, you @@ -177,7 +176,7 @@ const config: Config = { to: 'https://www.open-telekom-cloud.com/en/support/release-notes', }, { - label: 'Core Services Certifications', + label: 'Certifications & Attestations', to: 'https://www.open-telekom-cloud.com/en/products-services/core-services/certifications', }, ], @@ -193,14 +192,18 @@ const config: Config = { label: 'Community Portal', to: 'https://community.open-telekom-cloud.com/', }, + // { + // label: 'Webinars', + // to: '/webinars', + // }, { label: 'Webinars', - to: '/webinars', + href: 'https://www.youtube.com/playlist?list=PLS60dhorR-hgQ5n5L1boEQh0oVD-_k75p', + }, + { + label: 'Trainings & Certifications', + to: 'https://training.open-telekom-cloud.com/', }, - // { - // label: 'Webinars in YouTube', - // href: 'https://www.youtube.com/playlist?list=PLS60dhorR-hgQ5n5L1boEQh0oVD-_k75p', - // }, // { // label: 'Medium', // href: 'https://medium.com', @@ -219,17 +222,9 @@ const config: Config = { to: 'https://docs.otc.t-systems.com/developer/drivers.html', }, { - label: 'Terraform Provider', - href: 'https://registry.terraform.io/providers/opentelekomcloud/opentelekomcloud/latest/docs', - }, - { - label: 'Ansible Collections', - to: 'https://docs.otc.t-systems.com/ansible-collection-cloud/', - }, - { - label: 'Cloud Create', - to: 'https://designer.otc-service.com/', - }, + label: 'Infrastructure as Code', + to: 'https://docs.otc.t-systems.com/developer/iac.html', + } ], }, { @@ -252,6 +247,10 @@ const config: Config = { { title: 'Tools', items: [ + { + label: 'Cloud Create', + to: 'https://designer.otc-service.com/', + }, { label: 'Enterprise Dashboard', to: 'https://enterprise-dashboard.otc-service.com', @@ -318,7 +317,6 @@ const config: Config = { customFields: { version: process.env.REACT_APP_VERSION, - youtube_api_key: process.env.REACT_APP_YOUTUBE_API_KEY }, plugins: [ @@ -336,6 +334,12 @@ const config: Config = { } as UmamiOptions, ], ], + + markdown: { + hooks: { + onBrokenMarkdownLinks: 'warn', + }, + }, }; export default config; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 19b68f4a27..431937f3f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@docusaurus/plugin-content-docs": "^3.9.1", "@docusaurus/preset-classic": "^3.9.1", "@mdx-js/react": "^3.1.1", + "@telekom-ods/react-ui-kit": "^2.5.2", "@telekom/scale-components": "^3.0.0-beta.151", "@telekom/scale-components-react": "^3.0.0-beta.56", "clsx": "^2.1.1", @@ -37,7 +38,7 @@ "typescript-eslint": "^8.45.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@ai-sdk/gateway": { @@ -4636,28 +4637,56 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.1" + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.7.4", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz", + "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.5" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, "node_modules/@hapi/hoek": { @@ -4941,6 +4970,12 @@ "tslib": "2" } }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -5090,6 +5125,39 @@ "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", "license": "MIT" }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", + "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -5428,6 +5496,60 @@ "node": ">=14.16" } }, + "node_modules/@telekom-ods/design-tokens": { + "version": "2.1.0", + "resolved": "https://artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/@telekom-ods/design-tokens/-/@telekom-ods/design-tokens-2.1.0.tgz", + "integrity": "sha512-WJwiIC4jlbACndYU1wTkFE2r81nQoPTEj3EyUPr7dcyTHNDKpNH9ahz+G+vOgkUbPW2f9KirFrEZ7wrpet/qGA==", + "license": "UNLICENSED" + }, + "node_modules/@telekom-ods/design-tokens-base": { + "version": "2.0.1", + "resolved": "https://artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/@telekom-ods/design-tokens-base/-/@telekom-ods/design-tokens-base-2.0.1.tgz", + "integrity": "sha512-WEJHKYfWvVHO5JJX9KeeDE1cuV/LjzhksKynm9nSrxrVnAdbMLOVpyC1eYyBP7tk7m7/8kEGy3wu4/bZ1ZvXGA==" + }, + "node_modules/@telekom-ods/react-icons": { + "version": "1.0.4", + "resolved": "https://artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/@telekom-ods/react-icons/-/@telekom-ods/react-icons-1.0.4.tgz", + "integrity": "sha512-Qm4OSReMJoonsD66fsYExDWNHfwEI6Qc8ilScuY4WRC1OJYaDvCDgWJ4nSFIH4RjEBOiq6ct4nM7UsH2vBCfZg==", + "license": "MIT", + "dependencies": { + "classnames": "^2.5.1" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@telekom-ods/react-ui-kit": { + "version": "2.5.2", + "resolved": "https://artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/@telekom-ods/react-ui-kit/-/@telekom-ods/react-ui-kit-2.5.2.tgz", + "integrity": "sha512-GXwMndBDzSvhFmfj3iGRKWRI9bC1tZrYesN3wV6vvz8a9kto2Ph8IUhGIU9Zp/gjO+ajcIrf6Fv9AFtJqG2Iqg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@floating-ui/react": "0.26.28", + "@radix-ui/react-slot": "1.1.2", + "@telekom-ods/design-tokens": "2.1.0", + "@telekom-ods/design-tokens-base": "2.0.1", + "@telekom-ods/react-icons": "1.0.4", + "chart.js": "^4.5.0", + "dayjs": "1.11.13", + "react-chartjs-2": "5.3.0", + "react-intersection-observer": "9.16.0", + "scrollyfills": "1.0.3", + "tocbot": "4.35.0" + }, + "bin": { + "create-product-component": "scripts/component-boilerplate/create-product-component.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/@telekom/design-tokens": { "version": "1.0.0-beta.10", "resolved": "https://registry.npmjs.org/@telekom/design-tokens/-/design-tokens-1.0.0-beta.10.tgz", @@ -6937,12 +7059,15 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.10.tgz", - "integrity": "sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/batch": { @@ -7261,9 +7386,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001746", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", - "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==", + "version": "1.0.30001778", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz", + "integrity": "sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==", "funding": [ { "type": "opencollective", @@ -7355,6 +7480,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/cheerio": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", @@ -8456,6 +8593,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -18064,6 +18207,16 @@ "node": ">=0.10.0" } }, + "node_modules/react-chartjs-2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.0.tgz", + "integrity": "sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -18100,6 +18253,21 @@ "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-intersection-observer": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.16.0.tgz", + "integrity": "sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==", + "license": "MIT", + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -18973,6 +19141,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/scrollyfills": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/scrollyfills/-/scrollyfills-1.0.3.tgz", + "integrity": "sha512-lJCEJbk/o8BFJbJYKyQn1njf9o3U6O9mDpM8gOAsA+yKbXk6gFClfsChnbPPm1eb4pjaJmSwxka5im0cBoKefw==", + "license": "ISC" + }, "node_modules/search-insights": { "version": "2.17.3", "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", @@ -19983,6 +20157,12 @@ "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "license": "MIT" + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -20164,6 +20344,12 @@ "node": ">=8.0" } }, + "node_modules/tocbot": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.35.0.tgz", + "integrity": "sha512-i8FoSaP3u60D94e/dtzCk23PIEBnc/l8XqvlK4g8gUCa9XFY4RmyMLYP6X+yN+ljcEijFbmCtNHtBoeTsQkCPg==", + "license": "MIT" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", diff --git a/package.json b/package.json index 4e8e6d69e2..b8c89f4b83 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@docusaurus/plugin-content-docs": "^3.9.1", "@docusaurus/preset-classic": "^3.9.1", "@mdx-js/react": "^3.1.1", + "@telekom-ods/react-ui-kit": "^2.5.2", "@telekom/scale-components": "^3.0.0-beta.151", "@telekom/scale-components-react": "^3.0.0-beta.56", "clsx": "^2.1.1", diff --git a/src/components/HomePageHeroPromo/index.tsx b/src/components/HomePageHeroPromo/index.tsx new file mode 100644 index 0000000000..58c1c65272 --- /dev/null +++ b/src/components/HomePageHeroPromo/index.tsx @@ -0,0 +1,94 @@ +import clsx from 'clsx'; +import { ODSCardCarousel, ODSCardPromo, ODSSheetTitleLabel } from '@telekom-ods/react-ui-kit'; + +import bestPracticesSegment1 from '@site/static/img/assets/video/CardPromoVideo-CUxfusaj.mp4'; +import bestPracticesSegment2 from '@site/static/img/assets/video/T_background_runway.jpg'; +import blueprintsSegment1 from '@site/static/img/assets/video/T_background_wall.jpg'; + +import templatesSegment1 from '@site/static/img/assets/video/T_pattern_2023_abstract_tec_topview_hd.mp4'; + +export default function HomePageHeroPromo(): JSX.Element { + + return ( +
+ + } + actionButtonProps={{ + variant: 'primary', + label: 'Let\'s go', + href: '/docs/best-practices', + target: '_self' + + }} + /> + } + actionButtonProps={{ + variant: 'primary', + label: 'Let\'s go', + href: '/docs/blueprints', + target: '_self' + }} + /> + } + actionButtonProps={{ + variant: 'primary', + label: 'Let\'s go', + href: '/templates', + target: '_self' + }} + /> + + +
+ + ); +} \ No newline at end of file diff --git a/src/components/HomePageHeroPromo/styles.module.css b/src/components/HomePageHeroPromo/styles.module.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/components/HomePageNewArticles/NewArticleCard.tsx b/src/components/HomePageNewArticles/NewArticleCard.tsx new file mode 100644 index 0000000000..15ade5408e --- /dev/null +++ b/src/components/HomePageNewArticles/NewArticleCard.tsx @@ -0,0 +1,57 @@ +import React from 'react'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +import { ODSCardImage, ODSCardContentBasic } from '@telekom-ods/react-ui-kit'; +import clsx from 'clsx'; + +export type NewArticleItem = { + id: string; + title: string; + description: JSX.Element; + type?: string; + link?: string; + banner?: string; +}; + +const NewArticleCard: React.FC = ({ title, description, type, link, banner }) => { + const open = () => { + window.open(link, "_self", "noopener"); + }; + + if (!banner) { + banner = useBaseUrl('/img/templates/generic-template.png'); + } + + return ( + +
+ +
+ + + } + href={link} + showLogo={false} + role="link" + size="medium" + target="_self" + /> + ); +}; + +export default NewArticleCard; diff --git a/src/components/HomePageNewArticles/index.tsx b/src/components/HomePageNewArticles/index.tsx new file mode 100644 index 0000000000..f3d10f87d4 --- /dev/null +++ b/src/components/HomePageNewArticles/index.tsx @@ -0,0 +1,73 @@ +import clsx from 'clsx'; +import styles from './styles.module.css'; +import { ODSCardCarousel } from '@telekom-ods/react-ui-kit'; +import NewArticleCard from './NewArticleCard'; + +export default function HomePageNewArticles(): JSX.Element { + + return ( +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/HomePageNewArticles/styles.module.css b/src/components/HomePageNewArticles/styles.module.css new file mode 100644 index 0000000000..1cfe240bba --- /dev/null +++ b/src/components/HomePageNewArticles/styles.module.css @@ -0,0 +1,11 @@ +/* 2) Your 3-card layout inside a slide */ +.segmentRow { + display: block; + gap: 10px; + width: 52%; +} + +.card { + flex: 0 0 calc((100% - 16px) / 3); + min-width: 0; +} \ No newline at end of file diff --git a/src/components/HomepageAskAQuestion/index.tsx b/src/components/HomepageAskAQuestion/index.tsx index 131c699d01..798259d001 100644 --- a/src/components/HomepageAskAQuestion/index.tsx +++ b/src/components/HomepageAskAQuestion/index.tsx @@ -1,30 +1,36 @@ -import clsx from 'clsx'; -import styles from './styles.module.css'; import useBaseUrl from '@docusaurus/useBaseUrl'; +import { ODSButton, ODSCardContentBasic, ODSCardBasic } from '@telekom-ods/react-ui-kit'; export default function HomepageAskAQuestion(): JSX.Element { - const webinarsUrl = useBaseUrl('/webinars'); - - return ( -
-
-
-

- Ask a Technical Question -

-

- Connect with people sharing the same passion for Open Telekom Cloud. - Discover our exciting upcoming Events and Webinars! -

- - Join our Community Forum - - - Browse our Webinars - -
-
-
+ const webinarsUrl = useBaseUrl('/webinars'); + + return ( + + + + } + contentSlot={} + href="https://www.telekom.com/" + role="link" + size="large" + tabIndex={-1} + target="_blank" + /> // - ); - } \ No newline at end of file + ); +} \ No newline at end of file diff --git a/src/components/HomepageAskAQuestion/styles.module.css b/src/components/HomepageAskAQuestion/styles.module.css index 9392b37f0f..3f9bf16a91 100644 --- a/src/components/HomepageAskAQuestion/styles.module.css +++ b/src/components/HomepageAskAQuestion/styles.module.css @@ -27,10 +27,16 @@ html[data-theme='dark'] .item { align-items: center; display: flex; } -.item__inner div { +/* .item__inner div { padding: 3rem; -} +} */ .item__title span { display: block; font-size: 1.25rem; +} + +.action-slot { + display: flex; + gap: 8px; + align-items: center; } \ No newline at end of file diff --git a/src/components/HomepageContribute/index.tsx b/src/components/HomepageContribute/index.tsx index 7687b807cd..74645cd4ae 100644 --- a/src/components/HomepageContribute/index.tsx +++ b/src/components/HomepageContribute/index.tsx @@ -1,26 +1,18 @@ -import clsx from 'clsx'; -import styles from './styles.module.css'; +import { ODSButton, ODSCardContentBasic, ODSCardBasic } from '@telekom-ods/react-ui-kit'; export default function HomepageContribute(): JSX.Element { return ( - //
-
-
-
-

Contribute

-

- Share with our vibrant community all that cool staff you've built with Open Telekom Cloud. -

- - Join us on GitHub - - {/* - Join us on Medium - */} -
-
-
- //
+ } + contentSlot={} + href="https://www.telekom.com/" + role="link" + size="large" + tabIndex={-1} + target="_blank" + // data-scheme="jacuzzi" + /> ); } \ No newline at end of file diff --git a/src/components/HomepageFeaturedServices/index.tsx b/src/components/HomepageFeaturedServices/index.tsx index b003687581..4b03fa9070 100644 --- a/src/components/HomepageFeaturedServices/index.tsx +++ b/src/components/HomepageFeaturedServices/index.tsx @@ -3,27 +3,39 @@ import styles from './styles.module.css'; import FeaturedServices from '../ServiceCallouts/FeaturedServices'; import NewServices from '../ServiceCallouts/NewServices'; import useBaseUrl from '@docusaurus/useBaseUrl'; +import { ODSButton } from '@telekom-ods/react-ui-kit'; export default function HomepageFeaturedServices(): JSX.Element { return ( -
-
+
+

Explore our Featured Services

- Check out our collection of technical solutions, best practices and cool tips for the most popular services of Open Telekom Cloud. + Check out our collection of technical solutions, best practices and cool tips for the most popular services of T Cloud Public.

- + + {/* Open Portfolio Navigator - + */}
+ +
+ +
{/* */}
@@ -33,15 +45,23 @@ export default function HomepageFeaturedServices(): JSX.Element {

Explore the technical documentation of our brand new services in Help Center.

- + {/* Check the Portfolio Roadmap - + */}
-
); diff --git a/src/components/HomepageFeaturedServices/styles.module.css b/src/components/HomepageFeaturedServices/styles.module.css index 6935871313..732e6eb7dc 100644 --- a/src/components/HomepageFeaturedServices/styles.module.css +++ b/src/components/HomepageFeaturedServices/styles.module.css @@ -1,16 +1,16 @@ .item { - box-shadow: 0 1px 3px gray; - background-color: var(--telekom-color-background-surface); - border-radius: 2rem; + /* box-shadow: 0 1px 3px gray; */ + background-color: #f2f0f1; + border-radius: 1.5rem; color: black; overflow: hidden; } html[data-theme='dark'] .item { - box-shadow: 0px 1px 3px var(--ifm-color-primary); + /* box-shadow: 0px 1px 3px var(--ifm-color-primary); */ background-color: var(--telekom-color-background-surface); - border-radius: 2rem; + border-radius: 1.5rem; color: white; overflow: hidden; } @@ -25,4 +25,15 @@ html[data-theme='dark'] .item { .item__title span { display: block; font-size: 1.25rem; -} \ No newline at end of file +} + +.btn__inner { + margin-top: -3.5rem; + margin-left: 3rem; +} + +.btn2__inner { + margin-top: -5.5rem; + margin-left: 3rem; + margin-bottom: 3rem; +} diff --git a/src/components/HomepageFeatures/index.tsx b/src/components/HomepageFeatures/index.tsx index e42b04f4a8..d8fd4e6969 100644 --- a/src/components/HomepageFeatures/index.tsx +++ b/src/components/HomepageFeatures/index.tsx @@ -1,5 +1,4 @@ import clsx from 'clsx'; -import Heading from '@theme/Heading'; import styles from './styles.module.css'; import useBaseUrl from '@docusaurus/useBaseUrl'; @@ -8,11 +7,15 @@ import BlueprintsSvg from '@site/static/img/blueprints.svg'; import TemplatesSvg from '@site/static/img/templates.svg'; // import CafSvg from '@site/static/img/caf.svg'; +import { ODSCardContentBasic, ODSCardBasic } from '@telekom-ods/react-ui-kit'; + type FeatureItem = { title: string; Svg: React.ComponentType>; description: JSX.Element; + label?: string; link?: string; + scheme?: string; }; const FeatureList: FeatureItem[] = [ @@ -26,7 +29,9 @@ const FeatureList: FeatureItem[] = [ to ensure robust system performance. ), - link: '/docs/best-practices' + label: 'Consult our', + link: '/docs/best-practices', + scheme: 'grey' }, { title: 'Blueprints', @@ -35,57 +40,48 @@ const FeatureList: FeatureItem[] = [ <> Discover tailored out-of-the-box solutions and practical implementations for a range of scenarios. Explore real-world examples demonstrating the versatility and optimal - application and infrastructure design using Open Telekom Cloud. + application and infrastructure design using T Cloud Public. ), - link: '/docs/blueprints' + label: 'Explore our', + link: '/docs/blueprints', + scheme: 'grey' }, - { + { title: 'Templates', Svg: TemplatesSvg, description: ( <> - Use our turnkey solutions in Terraform and TOSCA to streamline both simple and complex infrastructure scenarios on Open Telekom Cloud; + Use our turnkey solutions in Terraform and TOSCA to streamline both simple and complex infrastructure scenarios on T Cloud Public; whether with Cloud Create, Resource Formation Service, or directly using Terraform or OpenTofu. ), - link: '/templates' + label: 'Browse the', + link: '/templates', + scheme: 'grey' }, - // { - // title: 'Cloud Adoption Framework', - // Svg: CafSvg, - // description: ( - // <> - // The Cloud Adoption Framework provides a structured approach for organizations to transition their business to - // Open Telekom Cloud. It covers various stages such as strategy, planning, readiness, migration, governance, and management. - // - // ), - // link: '/caf' - // }, ]; -function Feature({ title, Svg, description, link }: FeatureItem) { +function Feature({ title, Svg, description, link, scheme }: FeatureItem) { + const href = /^https?:\/\//.test(link) ? link : useBaseUrl(link); + + const open = () => { + window.location.href = href; + }; + return (
- -
-
- -
-
- {/*

{title}

*/} - {title} - - {description} - - {/* - Get Started - */} -
-
-
+ } + href={href} + role="link" + size="large" + target="_self" + data-scheme={scheme} + />
- ); + ); } export default function HomepageFeatures(): JSX.Element { diff --git a/src/components/HomepageFeatures/styles.module.css b/src/components/HomepageFeatures/styles.module.css index f8054676d6..cf147cffb0 100644 --- a/src/components/HomepageFeatures/styles.module.css +++ b/src/components/HomepageFeatures/styles.module.css @@ -20,4 +20,9 @@ .hideOnTouch { display: none !important; } +} + +.scale-telekom-feature-card { + margin-top: 15px; + margin-bottom: 15px; } \ No newline at end of file diff --git a/src/components/HomepageInlineSearch/index.tsx b/src/components/HomepageInlineSearch/index.tsx new file mode 100644 index 0000000000..cbc34cc95e --- /dev/null +++ b/src/components/HomepageInlineSearch/index.tsx @@ -0,0 +1,30 @@ +import clsx from 'clsx'; +import styles from './styles.module.css'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import { ODSInlineSearch, } from '@telekom-ods/react-ui-kit'; + +export default function HomepageInlineSearch(): JSX.Element { + const webinarsUrl = useBaseUrl('/webinars'); + + return ( +
+
+
+
+ console.log("clicked")} + size="large" + /> +
+ +
+
+
+ + ); +} \ No newline at end of file diff --git a/src/components/HomepageInlineSearch/styles.module.css b/src/components/HomepageInlineSearch/styles.module.css new file mode 100644 index 0000000000..cf147cffb0 --- /dev/null +++ b/src/components/HomepageInlineSearch/styles.module.css @@ -0,0 +1,28 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} + +/* @media (max-width: 768px) { + .hideOnMobile { + display: none; + } +} */ + +@media (hover: none) and (pointer: coarse) { + .hideOnTouch { + display: none !important; + } +} + +.scale-telekom-feature-card { + margin-top: 15px; + margin-bottom: 15px; +} \ No newline at end of file diff --git a/src/components/HomepageMarketplace/index.tsx b/src/components/HomepageMarketplace/index.tsx new file mode 100644 index 0000000000..42c8efd8f7 --- /dev/null +++ b/src/components/HomepageMarketplace/index.tsx @@ -0,0 +1,37 @@ +import useBaseUrl from '@docusaurus/useBaseUrl'; +import { ODSButton, ODSCardContentBasic, ODSCardBasic } from '@telekom-ods/react-ui-kit'; + +export default function HomepageMarketplace(): JSX.Element { + const webinarsUrl = useBaseUrl('/webinars'); + + return ( + + + +
} + contentSlot={} + href="https://www.telekom.com/" + role="link" + size="large" + tabIndex={-1} + target="_blank" + // data-scheme="basketball" + /> + //
+ ); +} \ No newline at end of file diff --git a/src/components/HomepageMarketplace/styles.module.css b/src/components/HomepageMarketplace/styles.module.css new file mode 100644 index 0000000000..3f9bf16a91 --- /dev/null +++ b/src/components/HomepageMarketplace/styles.module.css @@ -0,0 +1,42 @@ + +.item { + box-shadow: 0 1px 3px gray; + background-color: var(--telekom-color-background-surface); + border-radius: 2rem; + color: black; + overflow: hidden; + height: 100%; +} + +html[data-theme='dark'] .item { + box-shadow: 0px 1px 3px var(--ifm-color-primary); + background-color: var(--telekom-color-background-surface); + border-radius: 2rem; + color: white; + overflow: hidden; + height: 100%; +} + +@media (max-width: 996px) { + .item { + margin-top: 2rem; + } +} + +.item__inner { + align-items: center; + display: flex; +} +/* .item__inner div { + padding: 3rem; +} */ +.item__title span { + display: block; + font-size: 1.25rem; +} + +.action-slot { + display: flex; + gap: 8px; + align-items: center; +} \ No newline at end of file diff --git a/src/components/HomepageNewServices/index.tsx b/src/components/HomepageNewServices/index.tsx index 54be2af58f..12e6795ed0 100644 --- a/src/components/HomepageNewServices/index.tsx +++ b/src/components/HomepageNewServices/index.tsx @@ -15,7 +15,7 @@ export default function HomepageNewServices(): JSX.Element {

Meet the New Comers

-

+

Explore the new services added in Open Telekom Cloud portfolio.

diff --git a/src/components/PortfolioNavigator/PortfolioServices.tsx b/src/components/PortfolioNavigator/PortfolioServices.tsx new file mode 100644 index 0000000000..3b26192086 --- /dev/null +++ b/src/components/PortfolioNavigator/PortfolioServices.tsx @@ -0,0 +1,123 @@ +export type PortfolioCategory = + | "Application" + | "Data Analysis" + | "Computing" + | "Containers" + | "Databases" + | "Management & Deployment" + | "Network" + | "Security Services" + | "Storage" + | "Finance Services" + | "Sites"; + +export type Chip = "IaaS" | "PaaS" | "SaaS" | "Security" | "Management" | "Docs" | "Product" | "Community"; +export type Region = "eu-de" | "eu-nl" | "eu-ch" | "global"; + +export type PortfolioService = { + id: string; + symbol: string; + name: string; + category: PortfolioCategory; + description: string; + hc_url?: string; + rn_url?: string; + chips: Chip[]; + regions: Region[]; + icon?: string; +}; + +export const PortfolioServices: PortfolioService[] = [ + // Application + { id: "AOM", symbol: "AOM", name: "Application Operations Management", category: "Application", description: "Application Operations Management (AOM) is a one-stop, three-dimensional O&M management platform for cloud applications. It monitors your applications and related cloud resources in real time, collects and associates the data of resource metrics, logs, and events to analyze application health statuses, and provides flexible alarms and abundant data visualization functions. This helps you detect faults timely and master the real-time running statuses of applications, resources, and services.", hc_url: "https://docs.otc.t-systems.com/application-operations-management/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=77038a84-68a0-467e-b704-6f8e05cf0d8e", chips: ["Management"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/aom.svg" }, + { id: "APIG", symbol: "APIG", name: "API Gateway (APIG)", category: "Application", description: "API Gateway (APIG) is a high-performance, high-availability, and high-security API hosting service that helps you build, manage, and deploy APIs at any scale. With just a few clicks, you can integrate internal systems, and selectively expose capabilities with minimal costs and risks.", hc_url: "https://docs.otc.t-systems.com/api-gateway/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7b000957-ccfe-4d83-a6c9-aea6473178e2", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/apig.svg" }, + { id: "APM", symbol: "APM", name: "Application Performance Management", category: "Application", description: "The Application Performance Management (APM) monitors and manages the performance of cloud applications in real time. APM provides performance analysis of distributed applications, helping O&M personnel quickly locate and resolve faults and performance bottlenecks.", hc_url: "https://docs.otc.t-systems.com/application-performance-management/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e391a62c-9d30-43fd-bb7b-9b9d9044dd70", chips: ["Management"], regions: ["eu-de", "eu-nl"], icon: "/img/services/apm.svg" }, + { id: "DMS", symbol: "DMS", name: "Distributed Message Service", category: "Application", description: "Distributed Message Service (DMS) is a message middleware service based on distributed, high-availability clustering technology. It provides reliable, scalable, and fully managed queues for storing messages.", hc_url: "https://docs.otc.t-systems.com/distributed-message-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=b361d1fd-5a7f-4061-94ad-8490f82e9c12", chips: ["PaaS"], regions: ["eu-de", "eu-nl"], icon: "/img/services/DMS.svg" }, + { id: "SMN", symbol: "SMN", name: "Simple Message Notification", category: "Application", description: "Simple Message Notification (SMN) is a hosted simple message notification service that is flexible and large-scale. SMN allows you to send messages to email addresses, and HTTP/HTTPS applications in an efficient and inexpensive way.", hc_url: "https://docs.otc.t-systems.com/simple-message-notification/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=db2d3aeb-a14c-4bc3-abaa-e475b7941eb8", chips: ["PaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/SMN.svg" }, + + // "Data Analysis" + { id: "CSS", symbol: "CSS", name: "Cloud Search Service", category: "Data Analysis", description: "Cloud Search Service is a fully hosted distributed search service powered on Elasticsearch. It is fully compatible with Elasticsearch APIs and provides users with structured and unstructured data search, statistics, and report capabilities.", hc_url: "https://docs.otc.t-systems.com/cloud-search-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=8f2f3ca7-9eba-4e52-bd40-1481063e36ab", chips: ["PaaS"], regions: ["eu-de", "eu-nl"], icon: "/img/services/CSS.svg" }, + { id: "data-arts", symbol: "DataArts Studio", name: "DataArts Studio", category: "Data Analysis", description: "DataArts Studio is a one-stop data operations platform that drives digital transformation. It allows you to perform many operations, such as integrating and developing data, designing data architecture, controlling data quality, managing data assets, creating data services, and ensuring data security. Incorporating big data storage, computing and analytical engines, it can also construct industry knowledge bases and help your enterprise build an intelligent end-to-end data system. This system can eliminate data silos, unify data standards, accelerate data monetization, and accelerate your enterprise's digital transformation.", hc_url: "https://docs.otc.t-systems.com/data-arts-studio/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=6eec88d2-32d7-4eb2-83f1-711638cac5ba", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/dataarts_studio.svg" }, + { id: "DLI", symbol: "DLI", name: "Data Lake Insight", category: "Data Analysis", description: "Data Lake Insight (DLI) is a serverless data processing and analysis service fully compatible with Apache Spark and Apache Flink ecosystems. It frees you from managing any servers.", hc_url: "https://docs.otc.t-systems.com/data-lake-insight/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=834a3d83-3b1e-4019-8d5e-a6950dd9e391", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/dli.svg" }, + { id: "DWS", symbol: "DWS", name: "Data Warehouse Service", category: "Data Analysis", description: "Data Warehouse Service (DWS) provides a scalable, fully hosted, and out-of-the-box data warehouse. It is compatible with the PostgreSQL ecosystem and supports standard SQL statements and BI tools to help you economically and efficiently mine and analyze massive volumes of data, greatly reducing your cost.", hc_url: "https://docs.otc.t-systems.com/data-warehouse-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=cbe2bcd4-937d-4880-82e0-d13c7f954048", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/DWS.svg" }, + { id: "ModelArts", symbol: "ModelArts", name: "ModelArts", category: "Data Analysis", description: "ModelArts is a one-stop development platform for AI developers. With distributed training, automated model building, and model deployment, ModelArts helps AI developers build models quickly and manage the AI development lifecycle.", hc_url: "https://docs.otc.t-systems.com/modelarts/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=1ac69234-ddfb-4a73-b9ca-2a8301b26be9", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/ma.svg" }, + { id: "MRS", symbol: "MRS", name: "MapReduce Service", category: "Data Analysis", description: "MapReduce Service (MRS) provides enterprise-level big data clusters on the cloud, which are fully controlled by tenants and support the Hadoop, Spark, HBase, Kafka, and Storm components.", hc_url: "https://docs.otc.t-systems.com/mapreduce-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e5aefe94-44ec-45bb-9064-4882fc5ca367", chips: ["PaaS"], regions: ["eu-de", "eu-nl"], icon: "/img/services/mapReduce-MRS.svg" }, + { id: "OCR", symbol: "OCR", name: "Optical Character Recognition", category: "Data Analysis", description: "Optical Character Recognition (OCR) detects and extracts text from images and converts the recognition results into an editable JSON format.", hc_url: "https://docs.otc.t-systems.com/optical-character-recognition/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=657b5566-5b0d-416b-8bfa-05421411bc8a", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/ocr.svg" }, + + // Computing + { id: "AS", symbol: "AS", name: "Auto Scaling", category: "Computing", description: "Auto Scaling (AS) is a service that automatically adjusts service resources based on your service requirements and configured AS policies. You can specify scaling configurations and policies based on service requirements. These configurations and policies free you from having to repeatedly adjust resources to keep up with service changes and demand spikes, helping you reduce resources required and manpower costs.", hc_url: "https://docs.otc.t-systems.com/auto-scaling/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=d31d056a-6619-4751-8499-52a03d2478e7", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/AS.svg" }, + { id: "BMS", symbol: "BMS", name: "Bare Metal Services", category: "Computing", description: "A Bare Metal Server (BMS) is a physical server dedicated to individual tenants. It provides remarkable computing performance and stability for running key applications. The BMS service can be used in conjunction with other cloud services so that you can enjoy a consistent and stable performance of server hosting and the high scalability of cloud resources together that offer the computing performance and data security required by core databases, key application systems, high-performance computing (HPC), and Big Data.", hc_url: "https://docs.otc.t-systems.com/bare-metal-server/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e2a953d5-233e-4fc5-acb8-50178e62a167", chips: ["IaaS"], regions: ["eu-de"], icon: "/img/services/BMS.svg" }, + { id: "DeH", symbol: "DeH", name: "Dedicated Host", category: "Computing", description: "Dedicated Host (DeH) is a service that provides dedicated physical hosts. You can create Elastic Cloud Servers (ECSs) on a DeH to enhance the isolation, security, and performance of your ECSs. When you migrate services to a DeH, you can continue to use your server software licenses used before the migration. That is, you can use the Bring Your License (BYOL) feature on the DeH to reduce costs and independently manage your ECSs.", hc_url: "https://docs.otc.t-systems.com/dedicated-host/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=5061ab1f-e764-4157-933f-1f13e6cd8d29", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/DeH.svg" }, + { id: "ECS", symbol: "ECS", name: "Elastic Cloud Server", category: "Computing", description: "An ECS is a computing server consisting of CPUs, memory, images, and Elastic Volume Service (EVS) disks that allow on-demand allocation and elastic scaling. ECSs integrate virtual private cloud (VPC), virtual firewalls, and multi-data-copy capabilities to create an efficient, reliable, and secure computing environment. This ensures stable and uninterrupted operation of services.", hc_url: "https://docs.otc.t-systems.com/elastic-cloud-server/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=38cbc752-bffe-4ebd-ac0a-9433fe52f6bc", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/ECS.svg" }, + { id: "FGS", symbol: "FGS", name: "FunctionGraph", category: "Computing", description: "FunctionGraph allows to run a code without provisioning or managing servers, while ensuring high availability and scalability. All you need to do is to upload your code and set execution conditions. FunctionGraph will take care of the rest. In addition, you pay only for what you use and you are not charged when your code is not running.", hc_url: "https://docs.otc.t-systems.com/function-graph/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=1d5154ba-c2e4-4144-8f59-fa22727f7ff4", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/fg.svg" }, + { id: "IMS", symbol: "IMS", name: "Image Management Service", category: "Computing", description: "Image Management Service (IMS) provides flexible self-service and comprehensive image management capabilities. You can use a public image or create a private image to apply for an Elastic Cloud Server (ECS) or multiple ECSs in batches.", hc_url: "https://docs.otc.t-systems.com/image-management-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=96bd36e0-aab6-4b70-ab22-cbc0043bea4b", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/IMS.svg" }, + + // Containers + { id: "ASM", symbol: "ASM", name: "Application Service Mesh", category: "Containers", description: "Application Service Mesh (ASM) is a service mesh platform based on Istio. It seamlessly interconnects with Cloud Container Engine (CCE), an enterprise-grade Kubernetes cluster service. With better usability, reliability, and visualization, ASM provides you with out-of-the-box features and enhanced user experience.", hc_url: "https://docs.otc.t-systems.com/application-service-mesh/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=909feefe-3c1b-4611-a548-ccea112f8ff3", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/asm.svg" }, + { id: "CCE", symbol: "CCE", name: "Cloud Container Engine", category: "Containers", description: "CCE provides highly scalable, high-performance, enterprise-class Kubernetes clusters. It supports native Kubernetes applications, tools and easy setup of container runtime environment.", hc_url: "https://docs.otc.t-systems.com/cloud-container-engine/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=fe865562-a9ef-4933-b573-0f1447bae6b5", chips: ["PaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/CCE.svg" }, + { id: "CCI", symbol: "CCI", name: "Cloud Container Instance", category: "Containers", description: "Cloud Container Instance (CCI) is a serverless container engine that allows you to run containers without creating or managing server clusters.", hc_url: "https://docs.otc.t-systems.com/cloud-container-instance/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e202a850-2ab9-4439-b549-ecb736fb1030", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/cci.svg" }, + { id: "SWR", symbol: "SWR", name: "Software Repository for Containers", category: "Containers", description: "Software Repository for Container (SWR) provides full lifecycle container image management, which is easy-to-use, secure, and reliable. SWR enables users to uickly deploy containerized services.", hc_url: "https://docs.otc.t-systems.com/software-repository-container/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=d805eb70-4fbc-4663-89fd-2f90c06c8b8e", chips: ["PaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/swr.svg" }, + + // Databases + { id: "DCS", symbol: "DCS", name: "Distributed Cache Service", category: "Databases", description: "Distributed Cache Service (DCS) is an online, distributed, in-memory cache service. It is reliable, scalable, usable out of the box, and easy to manage. DCS makes it easy to deploy, operate, and scale in-memory data caches in the cloud.", hc_url: "https://docs.otc.t-systems.com/distributed-cache-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=79641c2a-b5d6-4ad0-8095-2284677e409f", chips: ["PaaS"], regions: ["eu-de", "eu-nl"], icon: "/img/services/DCS-redis.svg" }, + { id: "DDM", symbol: "DDM", name: "Distributed Database Middleware", category: "Databases", description: "Distributed Database Middleware (DDM) removes database capacity and performance bottlenecks and resolves distributed expansion issues. It provides database and table sharding, read/write splitting, and elastic scaling, helping you handle highly concurrent access to massive volumes of data and improving database read/write performance.", hc_url: "https://docs.otc.t-systems.com/distributed-database-middleware/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=045a432c-cb36-4511-89db-3db66e199a61", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/ddm.svg" }, + { id: "DDS", symbol: "DDS", name: "Document Database Service", category: "Databases", description: "Document Database Service (DDS) is a cloud computing-based NoSQL database featuring high performance storage, high availability architecture, and disaster recovery failover, along with online scaling, backup, and restoration capabilities. It has a mature performance monitoring system, a multi-level security protection mechanism, and a professional database management platform.", hc_url: "https://docs.otc.t-systems.com/document-database-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=b04c5484-1881-4dc4-8206-065e5ea9d50f", chips: ["PaaS"], regions: ["eu-de", "eu-nl"], icon: "/img/services/dds.svg" }, + { id: "DRS", symbol: "DRS", name: "Data Replication Service", category: "Databases", description: "Data Replication Service (DRS) is a stable, efficient, and easy-to-use cloud service for database online migration and synchronization. It simplifies data migration processes and reduces migration costs. You can use DRS to quickly transmit data between databases in various scenarios.", hc_url: "https://docs.otc.t-systems.com/data-replication-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7ee1981b-1e56-422b-a75f-c4e778cbf45e", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/drs.svg" }, + { id: "GeminiDB", symbol: "GeminiDB", name: "GeminiDB", category: "Databases", description: "GeminiDB is a distributed, multi-model NoSQL database service with decoupled compute and storage architecture. This high availability database is secure and scalable, can be deployed, backed up, or restored quickly, and includes monitoring and alarm management.", hc_url: "https://docs.otc.t-systems.com/geminidb/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=25e31cd8-23c8-464d-bb89-33daff0d56c0", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/geminidb.svg" }, + { id: "RDS", symbol: "RDS", name: "Relational Database Service", category: "Databases", description: "Relational Database Service (RDS) is an online relational database service based on the cloud computing platform. The RDS is reliable, scalable, secure, and easy to manage, allowing you to deploy a database within minutes.", hc_url: "https://docs.otc.t-systems.com/relational-database-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=48ef140f-ca49-4924-838b-11d4dfeb01db", chips: ["PaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/RDS.svg" }, + { id: "TaurusDB", symbol: "TaurusDB", name: "TaurusDB", category: "Databases", description: "TaurusDB is the latest generation enterprise-class distributed database. It is fully compatible with MySQL and provides high scalability and massive storage capacity. It uses a decoupled compute and storage architecture and supports up to 128 TB of storage. With TaurusDB, there is no need to deal with sharding, and no need to worry about data loss. It combines the performance and availability of commercial databases with the cost-effectiveness of open source databases.", hc_url: "https://docs.otc.t-systems.com/taurusdb/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=267f3c33-51f9-45f6-b5d5-5401c5fecb39", chips: ["PaaS"], regions: ["eu-de"], icon: "/img/services/taurusdb.svg" }, + + // Management & Deployment + { id: "CloudCreate", symbol: "Cloud-Create", name: "Cloud Create", category: "Management & Deployment", description: "Cloud Create is a free-to-use Development and Management Platform, which enables cloud developers to create applications on T Cloud Public fast.", hc_url: "https://docs.otc.t-systems.com/cloud-create/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=01fd864c-da31-4d86-8cdf-5782171991f7", chips: ["SaaS"], regions: ["eu-de", "eu-ch"], icon: "/img/services/cc.svg" }, + { id: "CloudEye", symbol: "Cloud-Eye", name: "Cloud Eye", category: "Management & Deployment", description: "Cloud Eye is a multi-dimensional monitoring platform that monitors your resources such as ECS and bandwidth. With Cloud Eye, users can fully understand the resource usage and running status of services running on the cloud platform, receive alarm notifications in a timely manner, and make response to ensure smooth running of services.", hc_url: "https://docs.otc.t-systems.com/cloud-eye/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=ec608703-3990-4dc8-b9cc-0e222ad232d6", chips: ["Management"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/ces.svg" }, + { id: "Config", symbol: "Config", name: "Config", category: "Management & Deployment", description: "With Config, you can search for, record, and continuously evaluate your resource configuration to make sure that your expectations are met.", hc_url: "https://docs.otc.t-systems.com/config/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=9db6d12d-828c-4c00-8896-8fcf211a2805", chips: ["Management"], regions: ["eu-de"], icon: "/img/services/config.svg" }, + { id: "CTS", symbol: "CTS", name: "Cloud Trace Service", category: "Management & Deployment", description: "Cloud Trace Service (CTS) provides operation records for cloud service resources. The operation records include resource operation requests initiated from the public cloud management console or open APIs and responses to the requests. You can query, audit, and backtrack the operation records. In addition, you can use the Object Storage Service (OBS) to synchronize operation records to the OBS buckets.", hc_url: "https://docs.otc.t-systems.com/cloud-trace-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=90fb59c4-856b-4105-8612-b5f31cb8d520", chips: ["Management"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/CTS.svg" }, + { id: "LTS", symbol: "LTS", name: "Log Tank Service", category: "Management & Deployment", description: "Log Tank Service (LTS) stores logs, allowing you to query and transfer them in real time. It simplifies real-time analysis for decision making and improves log processing efficiency.", hc_url: "https://docs.otc.t-systems.com/log-tank-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7967471f-f380-4742-81f5-6af3b8b351f0", chips: ["Management"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/LTS.svg" }, + { id: "RFS", symbol: "RFS", name: "Resource Formation Service", category: "Management & Deployment", description: "With Resource Formation Service, you can manage system and service resources (all physical or logical entities that can be located and described, such as databases, VPCs, pipelines, and IAM roles). You can automatically deploy specified cloud service resources based on the template which uses the HCL (an open ecosystem) syntax.", hc_url: "https://docs.otc.t-systems.com/resource-formation-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7be99f92-4f85-403c-8430-498572a6e4a7", chips: ["Management"], regions: ["eu-de"], icon: "/img/services/rfs.svg" }, + { id: "TMS", symbol: "TMS", name: "Tag Management Service", category: "Management & Deployment", description: "Tag Management Service (TMS) is a visualized service for fast, unified tag management that enables you to control your resource permissions and billing more efficiently. It allows you to tag and categorize cloud services across regions, and it can be accessed through the TMS console or using APIs.", hc_url: "https://docs.otc.t-systems.com/tag-management-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e7785c86-0449-4b20-ab6d-3f914d20f720", chips: ["Management"], regions: ["eu-de", "eu-ch"], icon: "/img/services/TMS.svg" }, + + // Network + { id: "DirectConnect", symbol: "DC", name: "Direct Connect", category: "Network", description: "A Direct Connect is a service that allows you to establish a dedicated network connection from your data center to the public cloud platform. You can establish a private connection between the public cloud platform and your data center, office, or collocation environment, which can reduce your network latency and provide a more consistent network experience than Internet-based connections.", hc_url: "https://docs.otc.t-systems.com/direct-connect/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=797b82d4-5d52-4908-99eb-66090ea4415f", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/DC_DirectConnect.svg" }, + { id: "DNS", symbol: "DNS", name: "Domain Name Service", category: "Network", description: "Domain Name Service (DNS) provides highly available and scalable authoritative DNS resolution services and domain name management services. It translates domain names or application resources into IP addresses required for network connection. By doing so, visitor's access requests are directed to the desired resources.", hc_url: "https://docs.otc.t-systems.com/domain-name-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=87d9d480-f65b-4b3e-be22-05c9186ae065", chips: ["IaaS"], regions: ["eu-de", "eu-ch"], icon: "/img/services/DNS.svg" }, + { id: "EIP", symbol: "EIP", name: "Elastic IP", category: "Network", description: "An EIP is a static, public IP address. You can bind an EIP to an ECS in your subnet to enable the ECS in your VPC to communicate with the Internet through a fixed public IP address.", hc_url: "https://docs.otc.t-systems.com/elastic-ip/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=f1b6a177-7b7c-4c22-a7ef-442e2b0676d5", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/IP-EIP.svg" }, + { id: "ELB", symbol: "ELB", name: "Elastic Load Balancing", category: "Network", description: "Elastic Load Balancing (ELB) is a service that automatically distributes access traffic to multiple Elastic Cloud Servers (ECSs) to balance their service load. ELB enables you to achieve higher levels of fault tolerance in your applications and expand application service capabilities.", hc_url: "https://docs.otc.t-systems.com/elastic-load-balancing/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7bce547e-309a-44ac-820d-b1ae9c3bfb57", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/ELB.svg" }, + { id: "ER", symbol: "ER", name: "Enterprise Router", category: "Network", description: "An Enterprise Router is a cloud router service that connects your VPCs and on-premises networks.", hc_url: "https://docs.otc.t-systems.com/enterprise-router/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=fc5de3cd-b308-4634-a475-31ef13ae9522", chips: ["IaaS"], regions: ["eu-de", "eu-nl"], icon: "/img/services/er.svg" }, + { id: "NATGW", symbol: "NATGW", name: "NAT Gateway", category: "Network", description: "The NAT Gateway service offers the Network Address Translation (NAT) function for computing instances, such as Elastic Cloud Servers (ECSs), in a Virtual Private Cloud (VPC), allowing these computing instances to access the Internet using elastic IP addresses (EIPs).", hc_url: "https://docs.otc.t-systems.com/nat-gateway/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e2ebf92f-d41e-407c-b3e2-8dcbac09d4b0", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/nat-nat-gateway.svg" }, + { id: "PLAS", symbol: "PLAS", name: "Private Link Access Service", category: "Network", description: "Private Link Access Service (PLAS) enables public cloud platform users to establish exclusive connections from their on-premise networks to VPCs on the public cloud platform.PLAS connections are established between carrier networks and Direct Connect gateways, reducing network latency. These connections outperform Internet connections in stability and security.", hc_url: "https://docs.otc.t-systems.com/private-link-access-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=797b82d4-5d52-4908-99eb-66090ea4415f", chips: ["IaaS"], regions: ["eu-de"], icon: "/img/services/plas.svg" }, + { id: "smg", symbol: "SMG", name: "Secure Mail Gateway", category: "Network", description: "The Secure Mail Gateway service provides anti-spam and anti-junk functions for outgoing email traffic and prevents EIPs from being blacklisted or abused.", hc_url: "https://docs.otc.t-systems.com/secure-mail-gateway/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=1dbbb2fe-027e-4b3c-9ee5-70045a7b80fd", chips: ["Security"], regions: ["eu-de"], icon: "/img/services/smg.svg" }, + { id: "VPC", symbol: "VPC", name: "Virtual Private Cloud", category: "Network", description: "The Virtual Private Cloud (VPC) service enables you to provision logically isolated, configurable, and manageable virtual networks for Elastic Cloud Servers (ECSs), improving the security of resources in the cloud system and simplifying network deployment.", hc_url: "https://docs.otc.t-systems.com/virtual-private-cloud/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=fc88afff-71ae-44df-96f0-47f38bc9b967", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/VPC.svg" }, + { id: "VPCEP", symbol: "VPCEP", name: "Virtual Private Cloud Endpoint", category: "Network", description: "The VPC Endpoint (VPCEP) service provides secure and private channels to connect your VPC to VPC endpoint services (cloud services on the current platform or your private services), providing flexible networking without having to use EIPs.", hc_url: "https://docs.otc.t-systems.com/vpc-endpoint/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=9e5f91dc-7bc3-44b1-9bbb-6f397267d253", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/Vpc Endpoint.svg" }, + { id: "VPN", symbol: "VPN", name: "Virtual Private Network", category: "Network", description: "A virtual private network (VPN) establishes an encrypted communication tunnel between a remote user and a Virtual Private Cloud (VPC). With VPN, you can connect to a VPC and access service resources in it.", hc_url: "https://docs.otc.t-systems.com/virtual-private-network/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=2c2c2468-5c1d-4e5e-83f7-86d450556921", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/VPN.svg" }, + + // Security Services + { id: "Anti-DDoS", symbol: "Anti-DDoS", name: "Anti-DDoS Service", category: "Security Services", description: "The Anti-DDoS traffic cleaning service (Anti-DDoS for short) is a network security service that defends IP addresses against distributed denial of service (DDoS) attacks.", hc_url: "https://docs.otc.t-systems.com/anti-ddos/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=2c2c2468-5c1d-4e5e-83f7-86d450556921", chips: ["Security"], regions: ["eu-de", "eu-nl"], icon: "/img/services/Anti-DDoS.svg" }, + { id: "CFW", symbol: "CFW", name: "Cloud Firewall", category: "Security Services", description: "Cloud Firewall (CFW) is a next-generation cloud-native firewall. It protects Internet and VPC borders on the cloud by real-time intrusion detection and prevention, global unified access control, full traffic analysis, log audit, and tracing. It employs AI for intelligent defense, and can be elastically scaled to meet changing business needs, helping you easily handle security threats. CFW is a basic service that provides network security protection for user services on the cloud.", hc_url: "https://docs.otc.t-systems.com/cloud-firewall/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=90d10b99-8573-410e-814a-c2ac30bd6bb6", chips: ["Security"], regions: ["eu-de"], icon: "/img/services/cfw.svg" }, + { id: "DSS", symbol: "DSS", name: "Database Security Service", category: "Security Services", description: "Database Security Service (DBSS) uses machine learning and big data technologies to protect your databases on the cloud, intelligently auditing them and detecting risky behaviors like SQL injection.", hc_url: "https://docs.otc.t-systems.com/database-security-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=eb901df0-2e83-40c2-828c-61488c5541d8", chips: ["Security"], regions: ["eu-de"], icon: "/img/services/dbss.svg" }, + { id: "HSS", symbol: "HSS", name: "Host Security Service", category: "Security Services", description: "Host Security Service (HSS) defends your Linux and Windows cloud servers from the inside out, with a suite of advanced security features including powerful brute-force protection, intrusion detection monitoring, and vulnerability fixes.", hc_url: "https://docs.otc.t-systems.com/host-security-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=43fcfa65-c589-425f-a844-f12463135324", chips: ["Security"], regions: ["eu-de"], icon: "/img/services/hss.svg" }, + { id: "IAM", symbol: "IAM", name: "Identity & Access Management", category: "Security Services", description: "Identity and Access Management (IAM) provides a public cloud system (T Cloud Public) with user identity management and access control.You can use IAM to manage user accounts (such as employee, system or application program accounts) and control the operation permissions of these user accounts on your resources (such as computing, storage, and network resources). In this way, IAM prevents these accounts from sharing your password or access key with other users. IAM also ensures user account security and reduces security risks for your enterprise information by allowing you to set login verification policies, password policies, and an access control list (ACL).", hc_url: "https://docs.otc.t-systems.com/identity-access-management/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7b5ccd9d-eb58-4c29-8d3e-f08fa5c341c4", chips: ["Security"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/IAM.svg" }, + { id: "KMS", symbol: "KMS", name: "Key Management Service", category: "Security Services", description: "Key Management Service (KMS) is a secure, reliable, and easy-to-use service that helps users centrally manage and safeguard their Customer Master Keys (CMKs).", hc_url: "https://docs.otc.t-systems.com/key-management-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=2717d962-028e-46f4-bb41-bec87dde30ff", chips: ["Security"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/Security-KMS.svg" }, + { id: "WAF", symbol: "WAF", name: "Web Application Firewall", category: "Security Services", description: "Web Application Firewall (WAF) keeps web services stable and secure. It examines all HTTP and HTTPS requests to detect and block the following attacks: Structured Query Language (SQL) injection, cross-site scripting (XSS), webshells, command and code injections, file inclusion, sensitive file access, third-party vulnerability exploits, Challenge Collapsar (CC) attacks, malicious crawlers, and cross-site request forgery (CSRF).", hc_url: "https://docs.otc.t-systems.com/web-application-firewall/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=9feaae4e-37c9-4326-9d3d-640c2d2628ae", chips: ["Security"], regions: ["eu-de", "eu-nl"], icon: "/img/services/web-WAF.svg" }, + { id: "DWAF", symbol: "DWAF", name: "Dedicated Web Application Firewall", category: "Security Services", description: "Web Application Firewall (WAF) keeps web services stable and secure. It examines all HTTP and HTTPS requests to detect and block the following attacks: Structured Query Language (SQL) injection, cross-site scripting (XSS), webshells, command and code injections, file inclusion, sensitive file access, third-party vulnerability exploits, Challenge Collapsar (CC) attacks, malicious crawlers, and cross-site request forgery (CSRF).", hc_url: "https://docs.otc.t-systems.com/web-application-firewall-dedicated/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=9feaae4e-37c9-4326-9d3d-640c2d2628ae", chips: ["Security"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/web-WAF.svg" }, + + // Storage + { id: "CBR", symbol: "CBR", name: "Cloud Backup & Recovery", category: "Storage", description: "Cloud Backup and Recovery (CBR) allows you to back up cloud disks, elastic cloud servers, and bare metal servers, protecting the security and accuracy of your data to the greatest extent for service security.", hc_url: "https://docs.otc.t-systems.com/cloud-backup-recovery/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=beb53dfb-3785-4985-9d2d-4a53b34f32ce", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/CBR.svg" }, + { id: "CSBS", symbol: "CSBS", name: "Cloud Server Backup Service", category: "Storage", description: "Cloud Server Backup Service (CSBS) offers the backup protection service for Elastic Cloud Servers (ECSs). It works based on the consistent snapshot technology for Elastic Volume Service (EVS) disks. With CSBS, you can use backup data to restore ECS data.", hc_url: "https://docs.otc.t-systems.com/cloud-server-backup-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=48a5eca4-1d71-4943-8ac0-aaa4e6aaa655", chips: ["IaaS"], regions: ["eu-de"], icon: "/img/services/CSBS.svg" }, + { id: "EVS", symbol: "EVS", name: "Elastic Volume Service", category: "Storage", description: "Elastic Volume Service (EVS) offers scalable block storage for servers. With high reliability, high performance, and rich specifications, EVS disks can be used for distributed file systems, development and testing environments, data warehouse applications, and high-performance computing (HPC) scenarios to meet diverse service requirements.", hc_url: "https://docs.otc.t-systems.com/elastic-volume-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7e039cc9-9583-49a8-a295-79aa757d2d02", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/EVS.svg" }, + { id: "OBS", symbol: "OBS", name: "Object Storage Service", category: "Storage", description: "Object Storage Service (OBS) is an object-based storage service that provides customers with massive, secure, reliable, and cost-effective data storage capabilities, such as bucket creation, modification, and deletion, as well as object upload, download, and deletion.", hc_url: "https://docs.otc.t-systems.com/object-storage-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=ee1d83da-e9e0-4f78-a7a4-9640694d033f", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/OBS.svg" }, + { id: "SDRS", symbol: "SDRS", name: "Storage Disaster Recovery Service", category: "Storage", description: "Storage Disaster Recovery Service (SDRS) provides disaster recovery (DR) services for many cloud services, such as Elastic Cloud Server (ECS) and Elastic Volume Service (EVS). SDRS uses multiple technologies, such as storage replication, data redundancy, and cache acceleration, to provide high data reliability and service continuity for users.", hc_url: "https://docs.otc.t-systems.com/storage-disaster-recovery-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=bf7d666b-2a2b-4b13-9861-9675a80e614d", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"], icon: "/img/services/sdrs.svg" }, + { id: "SFS", symbol: "SFS", name: "Scalable File Service", category: "Storage", description: "Scalable File Service (SFS) provides high-performance file storage that is scalable on demand. It can be shared with multiple Elastic Cloud Servers (ECS).", hc_url: "https://docs.otc.t-systems.com/scalable-file-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=46cb421a-537a-46ea-a561-f8f69ae4eec9", chips: ["IaaS"], regions: ["eu-de", "eu-nl"], icon: "/img/services/SFS.svg" }, + { id: "VBS", symbol: "VBS", name: "Volume Backup Service", category: "Storage", description: "Volume Backup Service (VBS) provides snapshot-based data protection service for Elastic Volume Service (EVS) disks. You can perform one-click backup and restoration for the EVS disks on Elastic Cloud Servers (ECSs) all through the online platform.", hc_url: "https://docs.otc.t-systems.com/volume-backup-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=19ad631e-c721-459e-93e6-df8f85dea16a", chips: ["IaaS"], regions: ["eu-de"], icon: "/img/services/VBS.svg" }, + + // Finance Services + { id: "ED", symbol: "ED", name: "Enterprise Dashboard", category: "Finance Services", description: "The Enterprise Dashboard (ED) helps you keep track of your cloud consumption data, as well as all billing information and financial metrics.", hc_url: "https://enterprise-dashboard.otc-service.com/", rn_url: "", chips: ["Management"], regions: ["global"], icon: "/img/services/ed.svg" }, + // { id: "INV", symbol: "INV", name: "Invoicing", category: "Finance Services", description: "", hc_url: "", rn_url: "", chips: ["Management"], regions: ["global"], icon: "/img/services/DMS.svg" }, + + // Sites Services + { id: "AC", symbol: "AC", name: "Architecture Center", category: "Sites", description: "The Architecture Center of T Cloud Public, is a knowledge-hub designed to guide architects, developers, and IT teams in building secure, scalable, and efficient cloud solutions. It provides curated best practices, detailed reference architectures, and blueprints for common workloads and use cases. The platform offers infrastructure templates in formats like Terraform and TOSCA to accelerate deployment and ensure consistency. Users can explore architectural guidance for networking, storage, compute, and security. The site focuses on reliability, compliance, and sustainability to meet enterprise and public sector needs. It serves as a central resource for designing and operating solutions on T Cloud Public effectively.", hc_url: "https://arch.otc-service.com/", rn_url: "", chips: ["Docs"], regions: ["global"], icon: "/img/services/sd.svg" }, + { id: "HC", symbol: "HC", name: "Help Center", category: "Sites", description: "Help Center is the official documentation hub for T Cloud Public, offering comprehensive user and developer guidance. It covers a full range of cloud services—including compute, storage, networking, application, data analysis, containers, databases, management, security, and more—with detailed API references, user guides, SDKs, and infrastructure-as-code resources. The site also includes developer-focused content like REST API guidance, SDK usage, automation tools, architecture best practices, regional endpoints, a glossary, FAQs, release notes, and status dashboards.", hc_url: "https://docs.otc.t-systems.com/", rn_url: "", chips: ["Docs"], regions: ["global"], icon: "/img/services/sd.svg" }, + { id: "OTC", symbol: "TCPub", name: "T Cloud Public", category: "Sites", description: "T Cloud Public, powered by Deutsche Telekom's T-Systems, is a European public cloud platform built on OpenStack. It offers secure, GDPR-compliant infrastructure services—including compute, storage, networking, and AI—from data centers in Germany, the Netherlands, and Switzerland. Designed for scalability and sovereignty, it supports enterprises and public organizations with flexible pricing, strong certifications, and 24/7 expert support.", hc_url: "https://open-telekom-cloud.com/en", rn_url: "", chips: ["Product"], regions: ["global"], icon: "/img/services/sd.svg" }, + { id: "CP", symbol: "CP", name: "Community Portal", category: "Sites", description: "The T Cloud Public Community is a user-driven forum where developers, architects, and users can share experiences, ask questions, find help, and discover blog entries and webinars. Serving as a practical support channel, it gathers collective knowledge to help with real-world cloud challenges and foster expert-to-user interactions.", hc_url: "https://community.open-telekom-cloud.com/", rn_url: "", chips: ["Community"], regions: ["global"], icon: "/img/services/sd.svg" }, + { id: "Console", symbol: "Console", name: "T Cloud Public Console", category: "Sites", description: "The T Cloud Public Console is a web-based management interface that provides users with centralized access to all T Cloud Public services and resources. It enables administrators and developers to create, configure, and monitor compute, storage, network, and security services through an intuitive dashboard. The console supports project-based organization, fine-grained identity and access management, and real-time resource monitoring. Designed for usability and transparency, the console offers a unified platform to manage infrastructure, automate workflows, and ensure compliance.", hc_url: "https://auth.otc.t-systems.com/", rn_url: "", chips: ["Management"], regions: ["global"], icon: "/img/services/sd.svg" }, + { id: "SD", symbol: "SD", name: "Status Dashboard", category: "Sites", description: "Status Dashboard is the official service status dashboard for T Cloud Public. It provides real-time information on the availability and performance of all cloud services across regions, helping users quickly identify incidents or maintenance activities. The site offers clear service indicators, detailed incident updates, and regional views, ensuring transparency and operational awareness for customers and administrators.", hc_url: "https://status.otc-service.com/", rn_url: "", chips: ["Product"], regions: ["global"], icon: "/img/services/sd.svg" }, + +]; diff --git a/src/components/PortfolioNavigator/index.tsx b/src/components/PortfolioNavigator/index.tsx index d37ac7420d..323080a464 100644 --- a/src/components/PortfolioNavigator/index.tsx +++ b/src/components/PortfolioNavigator/index.tsx @@ -1,415 +1,225 @@ -import React, { useMemo, useState, useRef, useEffect, KeyboardEvent } from "react"; +import { useMemo, useState, useCallback } from "react"; import styles from "./styles.module.css"; import 'flag-icons/css/flag-icons.min.css'; import useBaseUrl from '@docusaurus/useBaseUrl'; -export type OtcCategory = - | "Application" - | "Data Analysis" - | "Computing" - | "Containers" - | "Databases" - | "Management & Deployment" - | "Network" - | "Security Services" - | "Storage" - | "Finance Services" - | "Sites"; - -export type Chip = "IaaS" | "PaaS" | "SaaS" | "Security" | "Management" | "Docs" | "Product" | "Community"; -export type Region = "eu-de" | "eu-nl" | "eu-ch" | "global"; - -export type OtcService = { - id: string; - symbol: string; - name: string; - category: OtcCategory; - description: string; - hc_url?: string; - rn_url?: string; - chips: Chip[]; - regions: Region[]; -}; - -const SERVICES: OtcService[] = [ - // Application - { id: "AOM", symbol: "AOM", name: "Application Operations Management", category: "Application", description: "Application Operations Management (AOM) is a one-stop, three-dimensional O&M management platform for cloud applications. It monitors your applications and related cloud resources in real time, collects and associates the data of resource metrics, logs, and events to analyze application health statuses, and provides flexible alarms and abundant data visualization functions. This helps you detect faults timely and master the real-time running statuses of applications, resources, and services.", hc_url: "https://docs.otc.t-systems.com/application-operations-management/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=77038a84-68a0-467e-b704-6f8e05cf0d8e", chips: ["Management"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "APIG", symbol: "APIG", name: "API Gateway (APIG)", category: "Application", description: "API Gateway (APIG) is a high-performance, high-availability, and high-security API hosting service that helps you build, manage, and deploy APIs at any scale. With just a few clicks, you can integrate internal systems, and selectively expose capabilities with minimal costs and risks.", hc_url: "https://docs.otc.t-systems.com/api-gateway/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7b000957-ccfe-4d83-a6c9-aea6473178e2", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "APM", symbol: "APM", name: "Application Performance Management", category: "Application", description: "The Application Performance Management (APM) monitors and manages the performance of cloud applications in real time. APM provides performance analysis of distributed applications, helping O&M personnel quickly locate and resolve faults and performance bottlenecks.", hc_url: "https://docs.otc.t-systems.com/application-performance-management/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e391a62c-9d30-43fd-bb7b-9b9d9044dd70", chips: ["Management"], regions: ["eu-de", "eu-nl"] }, - { id: "DMS", symbol: "DMS", name: "Distributed Message Service", category: "Application", description: "Distributed Message Service (DMS) is a message middleware service based on distributed, high-availability clustering technology. It provides reliable, scalable, and fully managed queues for storing messages.", hc_url: "https://docs.otc.t-systems.com/distributed-message-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=b361d1fd-5a7f-4061-94ad-8490f82e9c12", chips: ["PaaS"], regions: ["eu-de", "eu-nl"] }, - { id: "SMN", symbol: "SMN", name: "Simple Message Notification", category: "Application", description: "Simple Message Notification (SMN) is a hosted simple message notification service that is flexible and large-scale. SMN allows you to send messages to email addresses, and HTTP/HTTPS applications in an efficient and inexpensive way.", hc_url: "https://docs.otc.t-systems.com/simple-message-notification/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=db2d3aeb-a14c-4bc3-abaa-e475b7941eb8", chips: ["PaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - - // "Data Analysis" - { id: "CSS", symbol: "CSS", name: "Cloud Search Service", category: "Data Analysis", description: "Cloud Search Service is a fully hosted distributed search service powered on Elasticsearch. It is fully compatible with Elasticsearch APIs and provides users with structured and unstructured data search, statistics, and report capabilities.", hc_url: "https://docs.otc.t-systems.com/cloud-search-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=8f2f3ca7-9eba-4e52-bd40-1481063e36ab", chips: ["PaaS"], regions: ["eu-de", "eu-nl"] }, - { id: "data-arts", symbol: "DataArts Studio", name: "DataArts Studio", category: "Data Analysis", description: "DataArts Studio is a one-stop data operations platform that drives digital transformation. It allows you to perform many operations, such as integrating and developing data, designing data architecture, controlling data quality, managing data assets, creating data services, and ensuring data security. Incorporating big data storage, computing and analytical engines, it can also construct industry knowledge bases and help your enterprise build an intelligent end-to-end data system. This system can eliminate data silos, unify data standards, accelerate data monetization, and accelerate your enterprise's digital transformation.", hc_url: "https://docs.otc.t-systems.com/data-arts-studio/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=6eec88d2-32d7-4eb2-83f1-711638cac5ba", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "DLI", symbol: "DLI", name: "Data Lake Insight", category: "Data Analysis", description: "Data Lake Insight (DLI) is a serverless data processing and analysis service fully compatible with Apache Spark and Apache Flink ecosystems. It frees you from managing any servers.", hc_url: "https://docs.otc.t-systems.com/data-lake-insight/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=834a3d83-3b1e-4019-8d5e-a6950dd9e391", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "DWS", symbol: "DWS", name: "Data Warehouse Service", category: "Data Analysis", description: "Data Warehouse Service (DWS) provides a scalable, fully hosted, and out-of-the-box data warehouse. It is compatible with the PostgreSQL ecosystem and supports standard SQL statements and BI tools to help you economically and efficiently mine and analyze massive volumes of data, greatly reducing your cost.", hc_url: "https://docs.otc.t-systems.com/data-warehouse-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=cbe2bcd4-937d-4880-82e0-d13c7f954048", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "ModelArts", symbol: "ModelArts", name: "ModelArts", category: "Data Analysis", description: "ModelArts is a one-stop development platform for AI developers. With distributed training, automated model building, and model deployment, ModelArts helps AI developers build models quickly and manage the AI development lifecycle.", hc_url: "https://docs.otc.t-systems.com/modelarts/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=1ac69234-ddfb-4a73-b9ca-2a8301b26be9", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "MRS", symbol: "MRS", name: "MapReduce Service", category: "Data Analysis", description: "MapReduce Service (MRS) provides enterprise-level big data clusters on the cloud, which are fully controlled by tenants and support the Hadoop, Spark, HBase, Kafka, and Storm components.", hc_url: "https://docs.otc.t-systems.com/mapreduce-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e5aefe94-44ec-45bb-9064-4882fc5ca367", chips: ["PaaS"], regions: ["eu-de", "eu-nl"] }, - { id: "OCR", symbol: "OCR", name: "Optical Character Recognition", category: "Data Analysis", description: "Optical Character Recognition (OCR) detects and extracts text from images and converts the recognition results into an editable JSON format.", hc_url: "https://docs.otc.t-systems.com/optical-character-recognition/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=657b5566-5b0d-416b-8bfa-05421411bc8a", chips: ["PaaS"], regions: ["eu-de"] }, - - // Computing - { id: "AS", symbol: "AS", name: "Auto Scaling", category: "Computing", description: "Auto Scaling (AS) is a service that automatically adjusts service resources based on your service requirements and configured AS policies. You can specify scaling configurations and policies based on service requirements. These configurations and policies free you from having to repeatedly adjust resources to keep up with service changes and demand spikes, helping you reduce resources required and manpower costs.", hc_url: "https://docs.otc.t-systems.com/auto-scaling/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=d31d056a-6619-4751-8499-52a03d2478e7", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "BMS", symbol: "BMS", name: "Bare Metal Services", category: "Computing", description: "A Bare Metal Server (BMS) is a physical server dedicated to individual tenants. It provides remarkable computing performance and stability for running key applications. The BMS service can be used in conjunction with other cloud services so that you can enjoy a consistent and stable performance of server hosting and the high scalability of cloud resources together that offer the computing performance and data security required by core databases, key application systems, high-performance computing (HPC), and Big Data.", hc_url: "https://docs.otc.t-systems.com/bare-metal-server/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e2a953d5-233e-4fc5-acb8-50178e62a167", chips: ["IaaS"], regions: ["eu-de"] }, - { id: "DeH", symbol: "DeH", name: "Dedicated Host", category: "Computing", description: "Dedicated Host (DeH) is a service that provides dedicated physical hosts. You can create Elastic Cloud Servers (ECSs) on a DeH to enhance the isolation, security, and performance of your ECSs. When you migrate services to a DeH, you can continue to use your server software licenses used before the migration. That is, you can use the Bring Your License (BYOL) feature on the DeH to reduce costs and independently manage your ECSs.", hc_url: "https://docs.otc.t-systems.com/dedicated-host/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=5061ab1f-e764-4157-933f-1f13e6cd8d29", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "ECS", symbol: "ECS", name: "Elastic Cloud Server", category: "Computing", description: "An ECS is a computing server consisting of CPUs, memory, images, and Elastic Volume Service (EVS) disks that allow on-demand allocation and elastic scaling. ECSs integrate virtual private cloud (VPC), virtual firewalls, and multi-data-copy capabilities to create an efficient, reliable, and secure computing environment. This ensures stable and uninterrupted operation of services.", hc_url: "https://docs.otc.t-systems.com/elastic-cloud-server/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=38cbc752-bffe-4ebd-ac0a-9433fe52f6bc", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "FGS", symbol: "FGS", name: "FunctionGraph", category: "Computing", description: "FunctionGraph allows to run a code without provisioning or managing servers, while ensuring high availability and scalability. All you need to do is to upload your code and set execution conditions. FunctionGraph will take care of the rest. In addition, you pay only for what you use and you are not charged when your code is not running.", hc_url: "https://docs.otc.t-systems.com/function-graph/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=1d5154ba-c2e4-4144-8f59-fa22727f7ff4", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "IMS", symbol: "IMS", name: "Image Management Service", category: "Computing", description: "Image Management Service (IMS) provides flexible self-service and comprehensive image management capabilities. You can use a public image or create a private image to apply for an Elastic Cloud Server (ECS) or multiple ECSs in batches.", hc_url: "https://docs.otc.t-systems.com/image-management-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=96bd36e0-aab6-4b70-ab22-cbc0043bea4b", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - - // Containers - { id: "ASM", symbol: "ASM", name: "Application Service Mesh", category: "Containers", description: "Application Service Mesh (ASM) is a service mesh platform based on Istio. It seamlessly interconnects with Cloud Container Engine (CCE), an enterprise-grade Kubernetes cluster service. With better usability, reliability, and visualization, ASM provides you with out-of-the-box features and enhanced user experience.", hc_url: "https://docs.otc.t-systems.com/application-service-mesh/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=909feefe-3c1b-4611-a548-ccea112f8ff3", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "CCE", symbol: "CCE", name: "Cloud Container Engine", category: "Containers", description: "CCE provides highly scalable, high-performance, enterprise-class Kubernetes clusters. It supports native Kubernetes applications, tools and easy setup of container runtime environment.", hc_url: "https://docs.otc.t-systems.com/cloud-container-engine/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=fe865562-a9ef-4933-b573-0f1447bae6b5", chips: ["PaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "CCI", symbol: "CCI", name: "Cloud Container Instance", category: "Containers", description: "Cloud Container Instance (CCI) is a serverless container engine that allows you to run containers without creating or managing server clusters.", hc_url: "https://docs.otc.t-systems.com/cloud-container-instance/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e202a850-2ab9-4439-b549-ecb736fb1030", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "SWR", symbol: "SWR", name: "Software Repository for Containers", category: "Containers", description: "Software Repository for Container (SWR) provides full lifecycle container image management, which is easy-to-use, secure, and reliable. SWR enables users to uickly deploy containerized services.", hc_url: "https://docs.otc.t-systems.com/software-repository-container/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=d805eb70-4fbc-4663-89fd-2f90c06c8b8e", chips: ["PaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - - // Databases - { id: "DCS", symbol: "DCS", name: "Distributed Cache Service", category: "Databases", description: "Distributed Cache Service (DCS) is an online, distributed, in-memory cache service. It is reliable, scalable, usable out of the box, and easy to manage. DCS makes it easy to deploy, operate, and scale in-memory data caches in the cloud.", hc_url: "https://docs.otc.t-systems.com/distributed-cache-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=79641c2a-b5d6-4ad0-8095-2284677e409f", chips: ["PaaS"], regions: ["eu-de", "eu-nl"] }, - { id: "DDM", symbol: "DDM", name: "Distributed Database Middleware", category: "Databases", description: "Distributed Database Middleware (DDM) removes database capacity and performance bottlenecks and resolves distributed expansion issues. It provides database and table sharding, read/write splitting, and elastic scaling, helping you handle highly concurrent access to massive volumes of data and improving database read/write performance.", hc_url: "https://docs.otc.t-systems.com/distributed-database-middleware/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=045a432c-cb36-4511-89db-3db66e199a61", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "DDS", symbol: "DDS", name: "Document Database Service", category: "Databases", description: "Document Database Service (DDS) is a cloud computing-based NoSQL database featuring high performance storage, high availability architecture, and disaster recovery failover, along with online scaling, backup, and restoration capabilities. It has a mature performance monitoring system, a multi-level security protection mechanism, and a professional database management platform.", hc_url: "https://docs.otc.t-systems.com/document-database-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=b04c5484-1881-4dc4-8206-065e5ea9d50f", chips: ["PaaS"], regions: ["eu-de", "eu-nl"] }, - { id: "DRS", symbol: "DRS", name: "Data Replication Service", category: "Databases", description: "Data Replication Service (DRS) is a stable, efficient, and easy-to-use cloud service for database online migration and synchronization. It simplifies data migration processes and reduces migration costs. You can use DRS to quickly transmit data between databases in various scenarios.", hc_url: "https://docs.otc.t-systems.com/data-replication-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7ee1981b-1e56-422b-a75f-c4e778cbf45e", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "GeminiDB", symbol: "GeminiDB", name: "GeminiDB", category: "Databases", description: "GeminiDB is a distributed, multi-model NoSQL database service with decoupled compute and storage architecture. This high availability database is secure and scalable, can be deployed, backed up, or restored quickly, and includes monitoring and alarm management.", hc_url: "https://docs.otc.t-systems.com/geminidb/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=25e31cd8-23c8-464d-bb89-33daff0d56c0", chips: ["PaaS"], regions: ["eu-de"] }, - { id: "RDS", symbol: "RDS", name: "Relational Database Service", category: "Databases", description: "Relational Database Service (RDS) is an online relational database service based on the cloud computing platform. The RDS is reliable, scalable, secure, and easy to manage, allowing you to deploy a database within minutes.", hc_url: "https://docs.otc.t-systems.com/relational-database-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=48ef140f-ca49-4924-838b-11d4dfeb01db", chips: ["PaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "TaurusDB", symbol: "TaurusDB", name: "TaurusDB", category: "Databases", description: "TaurusDB is the latest generation enterprise-class distributed database. It is fully compatible with MySQL and provides high scalability and massive storage capacity. It uses a decoupled compute and storage architecture and supports up to 128 TB of storage. With TaurusDB, there is no need to deal with sharding, and no need to worry about data loss. It combines the performance and availability of commercial databases with the cost-effectiveness of open source databases.", hc_url: "https://docs.otc.t-systems.com/taurusdb/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=267f3c33-51f9-45f6-b5d5-5401c5fecb39", chips: ["PaaS"], regions: ["eu-de"] }, - - // Management & Deployment - { id: "CloudCreate", symbol: "Cloud Create", name: "Cloud Create", category: "Management & Deployment", description: "Cloud Create is a free-to-use Development and Management Platform, which enables cloud developers to create applications on Open Telekom Cloud fast.", hc_url: "https://docs.otc.t-systems.com/cloud-create/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=01fd864c-da31-4d86-8cdf-5782171991f7", chips: ["SaaS"], regions: ["eu-de", "eu-ch"] }, - { id: "CloudEye", symbol: "Cloud Eye", name: "Cloud Eye", category: "Management & Deployment", description: "Cloud Eye is a multi-dimensional monitoring platform that monitors your resources such as ECS and bandwidth. With Cloud Eye, users can fully understand the resource usage and running status of services running on the cloud platform, receive alarm notifications in a timely manner, and make response to ensure smooth running of services.", hc_url: "https://docs.otc.t-systems.com/cloud-eye/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=ec608703-3990-4dc8-b9cc-0e222ad232d6", chips: ["Management"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "Config", symbol: "Config", name: "Config", category: "Management & Deployment", description: "With Config, you can search for, record, and continuously evaluate your resource configuration to make sure that your expectations are met.", hc_url: "https://docs.otc.t-systems.com/config/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=9db6d12d-828c-4c00-8896-8fcf211a2805", chips: ["Management"], regions: ["eu-de"] }, - { id: "CTS", symbol: "CTS", name: "Cloud Trace Service", category: "Management & Deployment", description: "Cloud Trace Service (CTS) provides operation records for cloud service resources. The operation records include resource operation requests initiated from the public cloud management console or open APIs and responses to the requests. You can query, audit, and backtrack the operation records. In addition, you can use the Object Storage Service (OBS) to synchronize operation records to the OBS buckets.", hc_url: "https://docs.otc.t-systems.com/cloud-trace-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=90fb59c4-856b-4105-8612-b5f31cb8d520", chips: ["Management"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "LTS", symbol: "LTS", name: "Log Tank Service", category: "Management & Deployment", description: "Log Tank Service (LTS) stores logs, allowing you to query and transfer them in real time. It simplifies real-time analysis for decision making and improves log processing efficiency.", hc_url: "https://docs.otc.t-systems.com/log-tank-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7967471f-f380-4742-81f5-6af3b8b351f0", chips: ["Management"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "RFS", symbol: "RFS", name: "Resource Formation Service", category: "Management & Deployment", description: "With Resource Formation Service, you can manage system and service resources (all physical or logical entities that can be located and described, such as databases, VPCs, pipelines, and IAM roles). You can automatically deploy specified cloud service resources based on the template which uses the HCL (an open ecosystem) syntax.", hc_url: "https://docs.otc.t-systems.com/resource-formation-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7be99f92-4f85-403c-8430-498572a6e4a7", chips: ["Management"], regions: ["eu-de"] }, - { id: "TMS", symbol: "TMS", name: "Tag Management Service", category: "Management & Deployment", description: "Tag Management Service (TMS) is a visualized service for fast, unified tag management that enables you to control your resource permissions and billing more efficiently. It allows you to tag and categorize cloud services across regions, and it can be accessed through the TMS console or using APIs.", hc_url: "https://docs.otc.t-systems.com/tag-management-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e7785c86-0449-4b20-ab6d-3f914d20f720", chips: ["Management"], regions: ["eu-de", "eu-ch"] }, - - // Network - { id: "DirectConnect", symbol: "DC", name: "Direct Connect", category: "Network", description: "A Direct Connect is a service that allows you to establish a dedicated network connection from your data center to the public cloud platform. You can establish a private connection between the public cloud platform and your data center, office, or collocation environment, which can reduce your network latency and provide a more consistent network experience than Internet-based connections.", hc_url: "https://docs.otc.t-systems.com/direct-connect/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=797b82d4-5d52-4908-99eb-66090ea4415f", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "DNS", symbol: "DNS", name: "Domain Name Service", category: "Network", description: "Domain Name Service (DNS) provides highly available and scalable authoritative DNS resolution services and domain name management services. It translates domain names or application resources into IP addresses required for network connection. By doing so, visitor's access requests are directed to the desired resources.", hc_url: "https://docs.otc.t-systems.com/domain-name-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=87d9d480-f65b-4b3e-be22-05c9186ae065", chips: ["IaaS"], regions: ["eu-de", "eu-ch"] }, - { id: "EIP", symbol: "EIP", name: "Elastic IP", category: "Network", description: "An EIP is a static, public IP address. You can bind an EIP to an ECS in your subnet to enable the ECS in your VPC to communicate with the Internet through a fixed public IP address.", hc_url: "https://docs.otc.t-systems.com/elastic-ip/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=f1b6a177-7b7c-4c22-a7ef-442e2b0676d5", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "ELB", symbol: "ELB", name: "Elastic Load Balancing", category: "Network", description: "Elastic Load Balancing (ELB) is a service that automatically distributes access traffic to multiple Elastic Cloud Servers (ECSs) to balance their service load. ELB enables you to achieve higher levels of fault tolerance in your applications and expand application service capabilities.", hc_url: "https://docs.otc.t-systems.com/elastic-load-balancing/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7bce547e-309a-44ac-820d-b1ae9c3bfb57", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "ER", symbol: "ER", name: "Enterprise Router", category: "Network", description: "An Enterprise Router is a cloud router service that connects your VPCs and on-premises networks.", hc_url: "https://docs.otc.t-systems.com/enterprise-router/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=fc5de3cd-b308-4634-a475-31ef13ae9522", chips: ["IaaS"], regions: ["eu-de", "eu-nl"] }, - { id: "NATGW", symbol: "NATGW", name: "NAT Gateway", category: "Network", description: "The NAT Gateway service offers the Network Address Translation (NAT) function for computing instances, such as Elastic Cloud Servers (ECSs), in a Virtual Private Cloud (VPC), allowing these computing instances to access the Internet using elastic IP addresses (EIPs).", hc_url: "https://docs.otc.t-systems.com/nat-gateway/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=e2ebf92f-d41e-407c-b3e2-8dcbac09d4b0", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "PLAS", symbol: "PLAS", name: "Private Link Access Service", category: "Network", description: "Private Link Access Service (PLAS) enables public cloud platform users to establish exclusive connections from their on-premise networks to VPCs on the public cloud platform.PLAS connections are established between carrier networks and Direct Connect gateways, reducing network latency. These connections outperform Internet connections in stability and security.", hc_url: "https://docs.otc.t-systems.com/private-link-access-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=797b82d4-5d52-4908-99eb-66090ea4415f", chips: ["IaaS"], regions: ["eu-de"] }, - { id: "smg", symbol: "SMG", name: "Secure Mail Gateway", category: "Network", description: "The Secure Mail Gateway service provides anti-spam and anti-junk functions for outgoing email traffic and prevents EIPs from being blacklisted or abused.", hc_url: "https://docs.otc.t-systems.com/secure-mail-gateway/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=1dbbb2fe-027e-4b3c-9ee5-70045a7b80fd", chips: ["Security"], regions: ["eu-de"] }, - { id: "VPC", symbol: "VPC", name: "Virtual Private Cloud", category: "Network", description: "The Virtual Private Cloud (VPC) service enables you to provision logically isolated, configurable, and manageable virtual networks for Elastic Cloud Servers (ECSs), improving the security of resources in the cloud system and simplifying network deployment.", hc_url: "https://docs.otc.t-systems.com/virtual-private-cloud/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=fc88afff-71ae-44df-96f0-47f38bc9b967", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "VPCEP", symbol: "VPCEP", name: "Virtual Private Cloud Endpoint", category: "Network", description: "The VPC Endpoint (VPCEP) service provides secure and private channels to connect your VPC to VPC endpoint services (cloud services on the current platform or your private services), providing flexible networking without having to use EIPs.", hc_url: "https://docs.otc.t-systems.com/vpc-endpoint/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=9e5f91dc-7bc3-44b1-9bbb-6f397267d253", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "VPN", symbol: "VPN", name: "Virtual Private Network", category: "Network", description: "A virtual private network (VPN) establishes an encrypted communication tunnel between a remote user and a Virtual Private Cloud (VPC). With VPN, you can connect to a VPC and access service resources in it.", hc_url: "https://docs.otc.t-systems.com/virtual-private-network/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=2c2c2468-5c1d-4e5e-83f7-86d450556921", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - - // Security Services - { id: "Anti-DDoS", symbol: "Anti-DDoS", name: "Anti-DDoS Service", category: "Security Services", description: "The Anti-DDoS traffic cleaning service (Anti-DDoS for short) is a network security service that defends IP addresses against distributed denial of service (DDoS) attacks.", hc_url: "https://docs.otc.t-systems.com/anti-ddos/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=2c2c2468-5c1d-4e5e-83f7-86d450556921", chips: ["Security"], regions: ["eu-de", "eu-nl"] }, - { id: "CFW", symbol: "CFW", name: "Cloud Firewall", category: "Security Services", description: "Cloud Firewall (CFW) is a next-generation cloud-native firewall. It protects Internet and VPC borders on the cloud by real-time intrusion detection and prevention, global unified access control, full traffic analysis, log audit, and tracing. It employs AI for intelligent defense, and can be elastically scaled to meet changing business needs, helping you easily handle security threats. CFW is a basic service that provides network security protection for user services on the cloud.", hc_url: "https://docs.otc.t-systems.com/cloud-firewall/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=90d10b99-8573-410e-814a-c2ac30bd6bb6", chips: ["Security"], regions: ["eu-de"] }, - { id: "DSS", symbol: "DSS", name: "Database Security Service", category: "Security Services", description: "Database Security Service (DBSS) uses machine learning and big data technologies to protect your databases on the cloud, intelligently auditing them and detecting risky behaviors like SQL injection.", hc_url: "https://docs.otc.t-systems.com/database-security-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=eb901df0-2e83-40c2-828c-61488c5541d8", chips: ["Security"], regions: ["eu-de"] }, - { id: "HSS", symbol: "HSS", name: "Host Security Service", category: "Security Services", description: "Host Security Service (HSS) defends your Linux and Windows cloud servers from the inside out, with a suite of advanced security features including powerful brute-force protection, intrusion detection monitoring, and vulnerability fixes.", hc_url: "https://docs.otc.t-systems.com/host-security-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=43fcfa65-c589-425f-a844-f12463135324", chips: ["Security"], regions: ["eu-de"] }, - { id: "IAM", symbol: "IAM", name: "Identity & Access Management", category: "Security Services", description: "Identity and Access Management (IAM) provides a public cloud system (Open Telekom Cloud) with user identity management and access control.You can use IAM to manage user accounts (such as employee, system or application program accounts) and control the operation permissions of these user accounts on your resources (such as computing, storage, and network resources). In this way, IAM prevents these accounts from sharing your password or access key with other users. IAM also ensures user account security and reduces security risks for your enterprise information by allowing you to set login verification policies, password policies, and an access control list (ACL).", hc_url: "https://docs.otc.t-systems.com/identity-access-management/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7b5ccd9d-eb58-4c29-8d3e-f08fa5c341c4", chips: ["Security"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "KMS", symbol: "KMS", name: "Key Management Service", category: "Security Services", description: "Key Management Service (KMS) is a secure, reliable, and easy-to-use service that helps users centrally manage and safeguard their Customer Master Keys (CMKs).", hc_url: "https://docs.otc.t-systems.com/key-management-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=2717d962-028e-46f4-bb41-bec87dde30ff", chips: ["Security"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "WAF", symbol: "WAF", name: "Web Application Firewall", category: "Security Services", description: "Web Application Firewall (WAF) keeps web services stable and secure. It examines all HTTP and HTTPS requests to detect and block the following attacks: Structured Query Language (SQL) injection, cross-site scripting (XSS), webshells, command and code injections, file inclusion, sensitive file access, third-party vulnerability exploits, Challenge Collapsar (CC) attacks, malicious crawlers, and cross-site request forgery (CSRF).", hc_url: "https://docs.otc.t-systems.com/web-application-firewall/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=9feaae4e-37c9-4326-9d3d-640c2d2628ae", chips: ["Security"], regions: ["eu-de", "eu-nl"] }, - { id: "DWAF", symbol: "DWAF", name: "Dedicated Web Application Firewall", category: "Security Services", description: "Web Application Firewall (WAF) keeps web services stable and secure. It examines all HTTP and HTTPS requests to detect and block the following attacks: Structured Query Language (SQL) injection, cross-site scripting (XSS), webshells, command and code injections, file inclusion, sensitive file access, third-party vulnerability exploits, Challenge Collapsar (CC) attacks, malicious crawlers, and cross-site request forgery (CSRF).", hc_url: "https://docs.otc.t-systems.com/web-application-firewall-dedicated/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=9feaae4e-37c9-4326-9d3d-640c2d2628ae", chips: ["Security"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - - // Storage - { id: "CBR", symbol: "CBR", name: "Cloud Backup & Recovery", category: "Storage", description: "Cloud Backup and Recovery (CBR) allows you to back up cloud disks, elastic cloud servers, and bare metal servers, protecting the security and accuracy of your data to the greatest extent for service security.", hc_url: "https://docs.otc.t-systems.com/cloud-backup-recovery/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=beb53dfb-3785-4985-9d2d-4a53b34f32ce", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "CSBS", symbol: "CSBS", name: "Cloud Server Backup Service", category: "Storage", description: "Cloud Server Backup Service (CSBS) offers the backup protection service for Elastic Cloud Servers (ECSs). It works based on the consistent snapshot technology for Elastic Volume Service (EVS) disks. With CSBS, you can use backup data to restore ECS data.", hc_url: "https://docs.otc.t-systems.com/cloud-server-backup-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=48a5eca4-1d71-4943-8ac0-aaa4e6aaa655", chips: ["IaaS"], regions: ["eu-de"] }, - { id: "EVS", symbol: "EVS", name: "Elastic Volume Service", category: "Storage", description: "Elastic Volume Service (EVS) offers scalable block storage for servers. With high reliability, high performance, and rich specifications, EVS disks can be used for distributed file systems, development and testing environments, data warehouse applications, and high-performance computing (HPC) scenarios to meet diverse service requirements.", hc_url: "https://docs.otc.t-systems.com/elastic-volume-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=7e039cc9-9583-49a8-a295-79aa757d2d02", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "OBS", symbol: "OBS", name: "Object Storage Service", category: "Storage", description: "Object Storage Service (OBS) is an object-based storage service that provides customers with massive, secure, reliable, and cost-effective data storage capabilities, such as bucket creation, modification, and deletion, as well as object upload, download, and deletion.", hc_url: "https://docs.otc.t-systems.com/object-storage-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=ee1d83da-e9e0-4f78-a7a4-9640694d033f", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "SDRS", symbol: "SDRS", name: "Storage Disaster Recovery Service", category: "Storage", description: "Storage Disaster Recovery Service (SDRS) provides disaster recovery (DR) services for many cloud services, such as Elastic Cloud Server (ECS) and Elastic Volume Service (EVS). SDRS uses multiple technologies, such as storage replication, data redundancy, and cache acceleration, to provide high data reliability and service continuity for users.", hc_url: "https://docs.otc.t-systems.com/storage-disaster-recovery-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=bf7d666b-2a2b-4b13-9861-9675a80e614d", chips: ["IaaS"], regions: ["eu-de", "eu-nl", "eu-ch"] }, - { id: "SFS", symbol: "SFS", name: "Scalable File Service", category: "Storage", description: "Scalable File Service (SFS) provides high-performance file storage that is scalable on demand. It can be shared with multiple Elastic Cloud Servers (ECS).", hc_url: "https://docs.otc.t-systems.com/scalable-file-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=46cb421a-537a-46ea-a561-f8f69ae4eec9", chips: ["IaaS"], regions: ["eu-de", "eu-nl"] }, - { id: "VBS", symbol: "VBS", name: "Volume Backup Service", category: "Storage", description: "Volume Backup Service (VBS) provides snapshot-based data protection service for Elastic Volume Service (EVS) disks. You can perform one-click backup and restoration for the EVS disks on Elastic Cloud Servers (ECSs) all through the online platform.", hc_url: "https://docs.otc.t-systems.com/volume-backup-service/index.html", rn_url: "https://www.open-telekom-cloud.com/en/support/release-notes?tag=19ad631e-c721-459e-93e6-df8f85dea16a", chips: ["IaaS"], regions: ["eu-de"] }, - - // Finance Services - { id: "ED", symbol: "ED", name: "Enterprise Dashboard", category: "Finance Services", description: "The Enterprise Dashboard (ED) helps you keep track of your cloud consumption data, as well as all billing information and financial metrics.", hc_url: "https://enterprise-dashboard.otc-service.com/", rn_url: "", chips: ["Management"], regions: ["global"] }, - // { id: "INV", symbol: "INV", name: "Invoicing", category: "Finance Services", description: "", hc_url: "", rn_url: "", chips: ["Management"], regions: ["global"] }, - - // Sites Services - { id: "AC", symbol: "AC", name: "Architecture Center", category: "Sites", description: "The Architecture Center for Open Telekom Cloud, is a knowledge-hub designed to guide architects, developers, and IT teams in building secure, scalable, and efficient cloud solutions. It provides curated best practices, detailed reference architectures, and blueprints for common workloads and use cases. The platform offers infrastructure templates in formats like Terraform and TOSCA to accelerate deployment and ensure consistency. Users can explore architectural guidance for networking, storage, compute, and security. The site focuses on reliability, compliance, and sustainability to meet enterprise and public sector needs. It serves as a central resource for designing and operating solutions on Open Telekom Cloud effectively.", hc_url: "https://arch.otc-service.com/", rn_url: "", chips: ["Docs"], regions: ["global"] }, - { id: "HC", symbol: "HC", name: "Help Center", category: "Sites", description: "Help Center is the official documentation hub for Open Telekom Cloud, offering comprehensive user and developer guidance. It covers a full range of cloud services—including compute, storage, networking, application, data analysis, containers, databases, management, security, and more—with detailed API references, user guides, SDKs, and infrastructure-as-code resources. The site also includes developer-focused content like REST API guidance, SDK usage, automation tools, architecture best practices, regional endpoints, a glossary, FAQs, release notes, and status dashboards.", hc_url: "https://docs.otc.t-systems.com/", rn_url: "", chips: ["Docs"], regions: ["global"] }, - { id: "OTC", symbol: "OTC", name: "Open Telekom Cloud", category: "Sites", description: "Open Telekom Cloud, powered by Deutsche Telekom's T-Systems, is a European public cloud platform built on OpenStack. It offers secure, GDPR-compliant infrastructure services—including compute, storage, networking, and AI—from data centers in Germany, the Netherlands, and Switzerland. Designed for scalability and sovereignty, it supports enterprises and public organizations with flexible pricing, strong certifications, and 24/7 expert support.", hc_url: "https://open-telekom-cloud.com/en", rn_url: "", chips: ["Product"], regions: ["global"] }, - { id: "CP", symbol: "CP", name: "Community Portal", category: "Sites", description: "The Open Telekom Cloud Community is a user-driven forum where developers, architects, and users can share experiences, ask questions, find help, and discover blog entries and webinars. Serving as a practical support channel, it gathers collective knowledge to help with real-world cloud challenges and foster expert-to-user interactions.", hc_url: "https://community.open-telekom-cloud.com/", rn_url: "", chips: ["Community"], regions: ["global"] }, - { id: "Console", symbol: "Console", name: "Open Telekom Cloud Console", category: "Sites", description: "The Open Telekom Cloud Console is a web-based management interface that provides users with centralized access to all Open Telekom Cloud services and resources. It enables administrators and developers to create, configure, and monitor compute, storage, network, and security services through an intuitive dashboard. The console supports project-based organization, fine-grained identity and access management, and real-time resource monitoring. Designed for usability and transparency, the console offers a unified platform to manage infrastructure, automate workflows, and ensure compliance.", hc_url: "https://auth.otc.t-systems.com/", rn_url: "", chips: ["Management"], regions: ["global"] }, - { id: "SD", symbol: "SD", name: "Status Dashboard", category: "Sites", description: "Status Dashboard is the official service status dashboard for Open Telekom Cloud. It provides real-time information on the availability and performance of all cloud services across regions, helping users quickly identify incidents or maintenance activities. The site offers clear service indicators, detailed incident updates, and regional views, ensuring transparency and operational awareness for customers and administrators.", hc_url: "https://status.otc-service.com/", rn_url: "", chips: ["Product"], regions: ["global"] }, +import { ODSButton, ODSToggleChip, ODSDropdownSelect, ODSAccordion, ODSText } from '@telekom-ods/react-ui-kit'; +import { Chip, Region, PortfolioService, PortfolioServices } from "./PortfolioServices"; +import { ODSCardFeature, ODSCardFeaturePreferredContent } from "@telekom-ods/react-ui-kit"; +import clsx from "clsx"; +// Pre-compute static data outside the component — runs once, never again +const ALL_CATS = Array.from(new Set(PortfolioServices.map(s => s.category))).sort(); +const DROPDOWN_ITEMS = [ + { label: "All Categories", value: "all" }, + ...ALL_CATS.map(c => ({ label: c, value: c })) ]; -export default function OtcServicesColumns() { +export default function PortfolioServicesColumns() { const [query] = useState(""); - const [chips, setChips] = useState>(new Set()); // OR - const [regionsSel, setRegionsSel] = useState>(new Set()); // OR - const [open, setOpen] = useState(null); // ← sleeve - // NEW: category filter state + options - const ALL_CATS = Array.from(new Set(SERVICES.map(s => s.category))).sort(); + const [chips, setChips] = useState>(new Set()); + const [regionsSel, setRegionsSel] = useState>(new Set()); + const [open, setOpen] = useState(null); const [categoryFilter, setCategoryFilter] = useState("all"); - const OTC_CATEGORY_OPTIONS: string[] = ["all", ...ALL_CATS]; + const [filterKey, setFilterKey] = useState(0); + + // All useBaseUrl calls at the top level — never inside loops/callbacks const noDataImg = useBaseUrl('/img/undraw_no-data_ig65.svg'); - const toggleChip = (c: Chip) => + const toggleCategoryFilter = useCallback((e: any) => { + const value = e?.value; + setCategoryFilter(!value || value === "" ? "all" : value); + }, []); + + const toggleChip = useCallback((c: Chip) => setChips((prev) => { const next = new Set(prev); - if (next.has(c)) { - next.delete(c); - } else { - next.add(c); - } + next.has(c) ? next.delete(c) : next.add(c); return next; - }); + }), []); - const toggleRegion = (r: Region) => + const toggleRegion = useCallback((r: Region) => setRegionsSel((prev) => { const next = new Set(prev); - if (next.has(r)) { - next.delete(r); - } else { - next.add(r); - } + next.has(r) ? next.delete(r) : next.add(r); return next; - }); - - const categorySelectRef = useRef(null); - - useEffect(() => { - const el = categorySelectRef.current; - if (!el) return; + }), []); - const onChange = (e: Event) => { - // SCALE emits CustomEvent with { detail: { value } } - const value = (e as CustomEvent).detail?.value ?? "all"; - setCategoryFilter(value); - }; - - el.addEventListener("scale-change", onChange); - // Some builds also dispatch a native 'change' — safe to listen to both: - el.addEventListener("change", onChange); - - return () => { - el.removeEventListener("scale-change", onChange); - el.removeEventListener("change", onChange); - }; - }, []); - - const resetFilters = () => { - // 1) category -> "all" + const resetFilters = useCallback(() => { setCategoryFilter("all"); - - // 2) chips + regions -> unchecked - // Use your existing setters for those two pieces of state. - // (If your state uses arrays, set [] instead of new Set().) - setChips?.(new Set()); // existing chips state - setRegionsSel?.(new Set()); // existing regions state - }; + setChips(new Set()); + setRegionsSel(new Set()); + setFilterKey(k => k + 1); + }, []); const isChipActive = (c: Chip) => chips.has(c); const isRegionActive = (r: Region) => regionsSel.has(r); - // React ONLY to chip toggles via capture; block the component's own handler to avoid double-toggles - const onChipRowClickCapture = (e: React.MouseEvent) => { - const host = (e.target as HTMLElement)?.closest("scale-chip") as HTMLElement | null; - if (!host) return; - const id = host.getAttribute("data-chip") as Chip | null; - if (!id) return; - e.preventDefault(); - e.stopPropagation(); - toggleChip(id); - }; - - const onRegionRowClickCapture = (e: React.MouseEvent) => { - const host = (e.target as HTMLElement)?.closest("scale-chip") as HTMLElement | null; - if (!host) return; - const id = host.getAttribute("data-region") as Region | null; - if (!id) return; - e.preventDefault(); - e.stopPropagation(); - toggleRegion(id); - }; - - // text + chips(OR) + regions(OR). If none selected -> show all. const filtered = useMemo(() => { const q = query.trim().toLowerCase(); - return SERVICES.filter((s) => { - const mq = - !q || - s.name.toLowerCase().includes(q) || - s.symbol.toLowerCase().includes(q) || - s.category.toLowerCase().includes(q); - if (!mq) return false; - + return PortfolioServices.filter((s) => { + if (q && !s.name.toLowerCase().includes(q) && !s.symbol.toLowerCase().includes(q) && !s.category.toLowerCase().includes(q)) return false; if (chips.size > 0 && !s.chips.some((c) => chips.has(c))) return false; if (regionsSel.size > 0 && !s.regions.some((r) => regionsSel.has(r))) return false; - - if ( - categoryFilter !== "all" && - s.category !== categoryFilter - ) { - return false; - } - + if (categoryFilter !== "all" && s.category !== categoryFilter) return false; return true; }); }, [query, chips, regionsSel, categoryFilter]); - // open sleeve on Enter/Space as well - function onTileKey(e: KeyboardEvent, s: OtcService) { - if (e.key === "Enter" || e.key === " ") { - e.preventDefault(); - setOpen(s); - } - } - const renderRegionChip = (region: Region) => { - if (region === "global") return null; - - const cls = - region === "eu-de" ? "fi fi-de" : - region === "eu-nl" ? "fi fi-nl" : - region === "eu-ch" ? "fi fi-ch fis" : ""; - - return ( - - ); + if (region === "global") return "🌐"; + return region === "eu-de" ? "🇩🇪" : region === "eu-nl" ? "🇳🇱" : region === "eu-ch" ? "🇨🇭" : "🌐"; }; const renderRegionFooter = (region: Region) => { - if (region === "global") { - return GLOBAL; - } - + if (region === "global") return GLOBAL; const cls = region === "eu-de" ? "fi fi-de" : region === "eu-nl" ? "fi fi-nl" : region === "eu-ch" ? "fi fi-ch fis" : ""; - - return ( - - ); + return ; }; - return ( -
-
-
-
{/* heading removed intentionally */}
+ // Memoize filters so they only re-render when filter state actually changes + const filtersContent = useMemo(() => ( + <> +
+
+ Filter by Category:
- {/* Filters: categories (single line) */} -
-
- - {OTC_CATEGORY_OPTIONS.map((opt) => ( - - {opt === "all" ? "All Categories" : opt} - - ))} - - - Reset Filters - -
+
+ +
+ +
+
+
+ Filter by Service Type: +
+
+ {(["IaaS", "PaaS", "SaaS", "Security", "Management"] as Chip[]).map((c) => ( + toggleChip(c)} + /> + ))}
+
- {/* Filters: chips | regions (single line) */} -
- {/* Capability chips (SCALE) */} -
- {(["IaaS", "PaaS", "SaaS", "Security", "Management"] as Chip[]).map((c) => ( - - {c} - - ))} -
+
+
+ Filter by Region: +
+
+ {(["eu-de", "eu-nl", "eu-ch", "global"] as Region[]).map((r) => ( + toggleRegion(r)} + /> + ))} +
+
- +
+
+ +
+
+ + ), [categoryFilter, chips, regionsSel, filterKey, toggleCategoryFilter, toggleChip, toggleRegion, resetFilters]); - {/* Region chips (SCALE) */} -
- {(["eu-de", "eu-nl", "eu-ch", "global"] as Region[]).map((r) => ( - - {renderRegionChip(r)} - {` ${r.toUpperCase()}`} - - ))} -
+ return ( +
+
+ +
+
- {/* Grid */} +
- {/* Sleeve */} + {/* Sleeve / detail panel */} {open && ( -
setOpen(null)} role="dialog" aria-modal="true"> +
setOpen(null)} + role="dialog" + aria-modal="true" + >
e.stopPropagation()}> -

+

+
{open.symbol}:
{open.name}
@@ -421,55 +231,58 @@ export default function OtcServicesColumns() { {open.category === "Finance Services" || open.category === "Sites" ? (
- - Go to {open.name} - - + />
) : (
- + - Discover Best Practices & Blueprints - - - - + - Release Notes - - - - - Go to Help Center - - + />
)}
-
- ) - } -
+ )} +
); -} +} \ No newline at end of file diff --git a/src/components/PortfolioNavigator/styles.module.css b/src/components/PortfolioNavigator/styles.module.css index 592785fe1d..e2bb7f5b9f 100644 --- a/src/components/PortfolioNavigator/styles.module.css +++ b/src/components/PortfolioNavigator/styles.module.css @@ -1,4 +1,4 @@ -:root{ +:root { /* --bg: #f8fafc; */ /* --panel: #ffffff; */ /* --ink: #0f172a; */ @@ -11,8 +11,9 @@ --badge: #eef2ff; --badge-ink: #3730a3; --tile-radius: 4px; - --shadow: 0 1px 2px rgba(0,0,0,.06), 0 2px 4px rgba(0,0,0,.06); - --colW: 280px; /* base column width for smaller screens */ + --shadow: 0 1px 2px rgba(0, 0, 0, .06), 0 2px 4px rgba(0, 0, 0, .06); + --colW: 280px; + /* base column width for smaller screens */ --card-bg: #fff; --card-border: #ddd; --text-base: #000; @@ -21,151 +22,366 @@ --shadow-hover: rgba(0, 0, 0, 0.1); } -:root { --ifm-background-surface-color: #fbfbfb; } -html[data-theme='dark'] { --ifm-background-surface-color: #1c1c1e; } +:root { + --ifm-background-surface-color: #fbfbfb; +} + +html[data-theme='dark'] { + --ifm-background-surface-color: #1c1c1e; +} + +* { + box-sizing: border-box +} + +body { + color: var(--ink) +} -*{box-sizing:border-box} -body{color:var(--ink)} +.otcWrap { + min-height: 100vh; + background: linear-gradient(#fff, var(--bg)); + padding: 24px +} -.otcWrap{min-height:100vh;background:linear-gradient(#fff, var(--bg));padding:24px} -.otcMax{max-width:1280px;margin:0 auto} +.otcMax { + max-width: 1280px; + margin: 0 auto +} /* header */ -.header{display:flex;gap:16px;flex-wrap:wrap;align-items:flex-end;justify-content:space-between} -.titleBlock h1{margin:0;font-weight:700;font-size:clamp(24px,3vw,34px)} -.titleBlock p{margin:.25rem 0 0;color:var(--muted)} -.ctrls{display:flex;gap:12px;align-items:center} +.header { + display: flex; + gap: 16px; + flex-wrap: wrap; + align-items: flex-end; + justify-content: space-between +} + +.titleBlock h1 { + margin: 0; + font-weight: 700; + font-size: clamp(24px, 3vw, 34px) +} + +.titleBlock p { + margin: .25rem 0 0; + color: var(--muted) +} + +.ctrls { + display: flex; + gap: 12px; + align-items: center +} /* search */ -.search{position:relative} -.searchIcon{position:absolute;left:10px;top:50%;transform:translateY(-50%);opacity:.45} -.search input{ - height:36px; /* ↑ was 34 */ - width:260px;max-width:58vw;padding:8px 10px 8px 28px; - border:1px solid var(--line);border-radius:10px;outline:none;font-size:15px; /* ↑ was 14px */ +.search { + position: relative +} + +.searchIcon { + position: absolute; + left: 10px; + top: 50%; + transform: translateY(-50%); + opacity: .45 +} + +.search input { + height: 36px; + /* ↑ was 34 */ + width: 260px; + max-width: 58vw; + padding: 8px 10px 8px 28px; + border: 1px solid var(--line); + border-radius: 10px; + outline: none; + font-size: 15px; + /* ↑ was 14px */ } -.search input:focus{border-color:#818cf8; box-shadow:0 0 0 3px rgba(129,140,248,.25)} -.viewchip{display:inline-flex;align-items:center;gap:6px;background:#eef2ff;border:1px solid #e0e7ff;color:#3730a3;padding:6px 10px;border-radius:999px;font-size:13px} +.search input:focus { + border-color: #818cf8; + box-shadow: 0 0 0 3px rgba(129, 140, 248, .25) +} + +.viewchip { + display: inline-flex; + align-items: center; + gap: 6px; + background: #eef2ff; + border: 1px solid #e0e7ff; + color: #3730a3; + padding: 6px 10px; + border-radius: 999px; + font-size: 13px +} /* chips */ -.bucketsChips{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px} -.bucketsRegions{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px } +.bucketsChips { + display: flex; + gap: 8px; + flex-wrap: wrap; + margin-top: 12px; + align-items: center; + justify-content: flex-end; +} + +.bucketsRegions { + display: flex; + gap: 8px; + flex-wrap: wrap; + margin-top: 12px; + align-items: center; + justify-content: flex-end; +} -.chip{background:var(--chip);color:var(--chip-ink);border:1px solid var(--line);padding:4px 10px;border-radius:999px;font-size:13px;cursor:pointer} /* ↑ was 12px */ -.chipActive{background:var(--chip-active);color:var(--chip-active-ink);border-color:var(--chip-active)} +.chip { + background: var(--chip); + color: var(--chip-ink); + border: 1px solid var(--line); + padding: 4px 10px; + border-radius: 999px; + font-size: 13px; + cursor: pointer +} + +/* ↑ was 12px */ +.chipActive { + background: var(--chip-active); + color: var(--chip-active-ink); + border-color: var(--chip-active) +} .flags { background: transparent; border: 0; - padding: 7px 0 3px 0; + padding: 0px 0 3px 0; box-shadow: none; font-size: 11px; line-height: 1; } .flags span { - padding: 0 4px 0 0; /* Changed from left padding to right padding */ + padding: 0 4px 0 0; + /* Changed from left padding to right padding */ } /* Remove the .flag class since it's not being used */ /* columns (wrap on small screens; fixed 3 even columns on desktop) */ -.columns{ - display:grid; gap:10px; margin-top:10px; +.columns { + display: grid; + gap: 10px; + margin-top: 10px; grid-template-columns: repeat(auto-fit, minmax(var(--colW), 1fr)); - justify-content:stretch; + justify-content: stretch; } /* Desktop: exactly 9 columns per row (your current setting) */ @media (min-width: 1200px) { .columns { grid-template-columns: repeat(9, minmax(0, 1fr)); - gap:10px; + gap: 10px; } } /* Column container — borderless & compact */ -.col{ - position:relative; - background:transparent; /* remove panel */ - border:none; /* remove frame */ - border-radius:16px; - overflow:hidden; - box-shadow:none; -} -.col::before{content:""; position:absolute; inset:0; background:var(--stripe, transparent); opacity:0; pointer-events:none} /* hide stripe */ -.colHead{ - position:sticky; top:0; - background:transparent; /* lighter header */ - border-bottom:1px solid var(--line); - padding:6px 8px; font-weight:700; letter-spacing:.2px; color:var(--ink); z-index:1; - font-size:16px; /* ↑ was 15px */ -} -.colTitle{white-space:nowrap; overflow:hidden; text-overflow:ellipsis} -.colBody{display:flex; flex-direction:column; gap:8px; padding:8px 2px; min-height:100px} -.empty{ - border:1px dashed var(--line); border-radius:12px; padding:14px; - text-align:center; color:var(--muted); background:#fbfcfe; -} - -html[data-theme='dark'] .empty{ - border:1px dashed var(--ifm-color-emphasis-200); border-radius:12px; padding:14px; - text-align:center; color:var(--ifm-color-emphasis-400); background:var(--ifm-background-surface-color); +.col { + position: relative; + background: transparent; + /* remove panel */ + border: none; + /* remove frame */ + border-radius: 16px; + overflow: hidden; + box-shadow: none; +} + +.col::before { + content: ""; + position: absolute; + inset: 0; + background: var(--stripe, transparent); + opacity: 0; + pointer-events: none +} + +/* hide stripe */ +.colHead { + position: sticky; + top: 0; + background: transparent; + /* lighter header */ + border-bottom: 1px solid var(--line); + padding: 6px 8px; + font-weight: 700; + letter-spacing: .2px; + color: var(--ink); + z-index: 1; + font-size: 16px; + /* ↑ was 15px */ +} + +.colTitle { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.colBody { + display: flex; + flex-direction: column; + gap: 8px; + padding: 8px 2px; + min-height: 100px +} + +.empty { + border: 1px dashed var(--line); + border-radius: 12px; + padding: 14px; + text-align: center; + color: var(--muted); + background: #fbfcfe; +} + +html[data-theme='dark'] .empty { + border: 1px dashed var(--ifm-color-emphasis-200); + border-radius: 12px; + padding: 14px; + text-align: center; + color: var(--ifm-color-emphasis-400); + background: var(--ifm-background-surface-color); } /* tile */ -.tile{ +.tile { /* --accent: #e2e8f0; */ - background:var(--panel); - border: 1px solid var(--card-border, var(--ifm-color-emphasis-200));border-radius:10px; - padding:8px;display:flex;flex-direction:column;box-shadow:var(--shadow); - cursor:pointer;position:relative;transition:transform .15s ease, box-shadow .15s ease; + background: var(--panel); + border: 1px solid var(--card-border, var(--ifm-color-emphasis-200)); + border-radius: 10px; + padding: 8px; + display: flex; + flex-direction: column; + box-shadow: var(--shadow); + cursor: pointer; + position: relative; + transition: transform .15s ease, box-shadow .15s ease; box-shadow: var(--shadow), inset 0 2px 0 var(--accent); } -html[data-theme='dark'] .tile{ +html[data-theme='dark'] .tile { /* --accent: #e2e8f0; */ - background:var(--ifm-background-surface-color); - border:1px solid var(--ifm-color-emphasis-200);border-radius:10px; - padding:8px;display:flex;flex-direction:column;box-shadow:var(--shadow); - cursor:pointer;position:relative;transition:transform .15s ease, box-shadow .15s ease; + background: var(--ifm-background-surface-color); + border: 1px solid var(--ifm-color-emphasis-200); + border-radius: 10px; + padding: 8px; + display: flex; + flex-direction: column; + box-shadow: var(--shadow); + cursor: pointer; + position: relative; + transition: transform .15s ease, box-shadow .15s ease; box-shadow: var(--shadow), inset 0 2px 0 var(--accent); } .tile:hover { - text-decoration: none; - box-shadow: + text-decoration: none; + box-shadow: 0px 16px 64px 0px var(--shadow-hover, var(--telekom-shadow-raised-hover)), 0px 8px 16px 0px var(--shadow-hover, var(--telekom-shadow-raised-hover)) } + /* .tile:hover{transform:translateY(-2px);box-shadow:0 4px 4px rgba(0,0,0,.10), inset 0 4px 0 var(--accent)} */ -html[data-theme='dark'] .tile:hover{ - box-shadow: - 0px 16px 64px 0px #e20074, +html[data-theme='dark'] .tile:hover { + box-shadow: + 0px 16px 64px 0px #e20074, 0px 8px 16px 0px #e20074; } -.tileTop{display:flex;align-items:center;justify-content:space-between;gap:6px;padding-bottom: 6px;} -html[data-theme='dark'] .tileTop{display:flex;align-items:center;justify-content:space-between;gap:6px} +.tileTop { + display: flex; + align-items: center; + justify-content: space-between; + gap: 6px; + padding-bottom: 6px; +} -.cat{text-transform:uppercase;font-size:11px;letter-spacing:.05em;opacity:.7} /* ↑ was 9px */ -.symbol{flex:1;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:15px;line-height:1.1} /* ↑ was 12px */ +html[data-theme='dark'] .tileTop { + display: flex; + align-items: center; + justify-content: space-between; + gap: 6px +} -.tileBottom{display:flex;align-items:center;justify-content:space-between;gap:6px;margin-top:2px} -html[data-theme='dark'] .tileBottom{display:flex;align-items:center;justify-content:space-between;gap:6px;margin-top:2px} +.cat { + text-transform: uppercase; + font-size: 11px; + letter-spacing: .05em; + opacity: .7 +} +/* ↑ was 9px */ +.symbol { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + font-weight: 800; + font-size: 15px; + line-height: 1.1 +} + +/* ↑ was 12px */ + +.tileBottom { + display: flex; + align-items: center; + justify-content: space-between; + gap: 6px; + margin-top: 2px +} + +html[data-theme='dark'] .tileBottom { + display: flex; + align-items: center; + justify-content: space-between; + gap: 6px; + margin-top: 2px +} + + +.name { + font-size: 18px; + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: center; +} -.name{font-size:18px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align: center;} /* ↑ was 9px */ +/* ↑ was 9px */ /* .ext{opacity:.5} */ -.badge{background:var(--badge);color:var(--badge-ink);padding:1px 6px;border-radius:999px;font-size:12px;border:1px solid #e0e7ff} /* ↑ was 10px */ +.badge { + background: var(--badge); + color: var(--badge-ink); + padding: 1px 6px; + border-radius: 999px; + font-size: 12px; + border: 1px solid #e0e7ff +} + +/* ↑ was 10px */ /* External link icon — fixed, uniform size everywhere */ .ext { - opacity: .6; /* keep your style */ + opacity: .6; + /* keep your style */ display: inline-flex; align-items: center; justify-content: center; @@ -179,28 +395,46 @@ html[data-theme='dark'] .tileBottom{display:flex;align-items:center;justify-cont } .ext svg { - width: 12px !important; /* defeat global svg width/height */ + width: 12px !important; + /* defeat global svg width/height */ height: 12px !important; flex: 0 0 16px; - stroke-width: 2; /* optional: consistent weight */ + stroke-width: 2; + /* optional: consistent weight */ } /* tooltip */ -.tile[data-tooltip]:hover::after{ - content:attr(data-tooltip);position:absolute;left:8px;right:8px;bottom:100%; - transform:translateY(-6px);background:#0f172a;color:#fff;padding:8px 10px; - border-radius:10px;white-space:normal;font-size:12px;box-shadow:var(--shadow); +.tile[data-tooltip]:hover::after { + content: attr(data-tooltip); + position: absolute; + left: 8px; + right: 8px; + bottom: 100%; + transform: translateY(-6px); + background: #0f172a; + color: #fff; + padding: 8px 10px; + border-radius: 10px; + white-space: normal; + font-size: 12px; + box-shadow: var(--shadow); } -.tile[data-tooltip]:hover::before{ - content:"";position:absolute;left:20px;bottom:100%;transform:translateY(2px); - border:6px solid transparent;border-top-color:#0f172a + +.tile[data-tooltip]:hover::before { + content: ""; + position: absolute; + left: 20px; + bottom: 100%; + transform: translateY(2px); + border: 6px solid transparent; + border-top-color: #0f172a } /* ===== Sleeve (drawer) ===== */ -.sleeveBackdrop{ +.sleeveBackdrop { position: fixed; inset: 0; - background: rgba(2,6,23,.35); + background: rgba(2, 6, 23, .35); display: grid; place-items: stretch; z-index: 60; @@ -208,38 +442,62 @@ html[data-theme='dark'] .tileBottom{display:flex;align-items:center;justify-cont animation: otcFadeIn .12s ease-out; } -@keyframes otcFadeIn { from { opacity: 0 } to { opacity: 1 } } +@keyframes otcFadeIn { + from { + opacity: 0 + } -.sleeve{ - margin-left: auto; /* stick to right */ + to { + opacity: 1 + } +} + +.sleeve { + margin-left: auto; + /* stick to right */ width: min(420px, 90vw); height: 100%; background: #fff; border-left: 1px solid var(--line); - box-shadow: -8px 0 24px rgba(0,0,0,.15); - display: flex; flex-direction: column; + box-shadow: -8px 0 24px rgba(0, 0, 0, .15); + display: flex; + flex-direction: column; transform: translateX(8px); animation: otcSlideIn .16s ease-out forwards; } -html[data-theme='dark'] .sleeve{ - margin-left: auto; /* stick to right */ +html[data-theme='dark'] .sleeve { + margin-left: auto; + /* stick to right */ width: min(420px, 96vw); height: 100%; background: var(--ifm-background-surface-color); border-left: 1px solid var(--ifm-color-emphasis-200); box-shadow: -8px 0 24px var(--ifm-background-surface-color); - display: flex; flex-direction: column; + display: flex; + flex-direction: column; transform: translateX(8px); animation: otcSlideIn .16s ease-out forwards; } -@keyframes otcSlideIn { from { transform: translateX(24px); opacity: .8 } to { transform: translateX(0); opacity: 1 } } +@keyframes otcSlideIn { + from { + transform: translateX(24px); + opacity: .8 + } + + to { + transform: translateX(0); + opacity: 1 + } +} -.sleeveClose{ +.sleeveClose { position: absolute; - top: 10px; right: 10px; - width: 32px; height: 32px; + top: 10px; + right: 10px; + width: 32px; + height: 32px; border-radius: 8px; border: 1px solid var(--line); background: #fff; @@ -248,7 +506,7 @@ html[data-theme='dark'] .sleeve{ line-height: 1; } -.sleeveHeader{ +.sleeveHeader { padding: 20px 18px 10px 18px; border-bottom: 1px solid var(--line); display: grid; @@ -257,7 +515,7 @@ html[data-theme='dark'] .sleeve{ gap: 10px; } -html[data-theme='dark'] .sleeveHeader{ +html[data-theme='dark'] .sleeveHeader { padding: 20px 18px 10px 18px; border-bottom: 1px solid var(--ifm-color-emphasis-200); display: grid; @@ -266,18 +524,19 @@ html[data-theme='dark'] .sleeveHeader{ gap: 10px; } -.sleeveSymbol{ +.sleeveSymbol { font-weight: 800; font-size: 20px; letter-spacing: .02em; } -.sleeveTitle{ + +.sleeveTitle { font-weight: 700; font-size: 18px; color: var(--ink); } -.sleeveBody{ +.sleeveBody { padding: 16px 18px; color: var(--muted); line-height: 1.5; @@ -285,7 +544,7 @@ html[data-theme='dark'] .sleeveHeader{ flex: 1; } -html[data-theme='dark'] .sleeveBody{ +html[data-theme='dark'] .sleeveBody { padding: 16px 18px; color: white; line-height: 1.5; @@ -304,13 +563,16 @@ html[data-theme='dark'] .sleeveBody{ /* safety: if an old rule set justify-content, kill it */ justify-content: initial; - justify-items: stretch; /* ensure children stretch horizontally */ + justify-items: stretch; + /* ensure children stretch horizontally */ align-items: stretch; } -.sleeveFooter > * { - --width: 100%; /* <- this is the key */ - display: block; /* optional, makes the host behave like a block */ +.sleeveFooter>* { + --width: 100%; + /* <- this is the key */ + display: block; + /* optional, makes the host behave like a block */ justify-self: stretch; } @@ -322,29 +584,10 @@ html[data-theme='dark'] .sleeveBody{ border-top: 1px solid var(--line); } -.sleeveFooterSingle scale-button { - --width: 100%; /* <- this is the key */ - display: block; /* optional, makes the host behave like a block */ - justify-self: stretch; -} -html[data-theme='dark'] .sleeveFooter { - display: grid; - grid-template-columns: 1fr; - gap: 10px; - padding: 14px 18px 18px 18px; - border-top: 1px solid var(--ifm-color-emphasis-200); - - /* safety: if an old rule set justify-content, kill it */ - justify-content: initial; - justify-items: stretch; /* ensure children stretch horizontally */ - align-items: stretch; -} -html[data-theme='dark'] .sleeveFooter > * { - --width: 100%; /* <- this is the key */ - display: block; /* optional, makes the host behave like a block */ - justify-self: stretch; +html[data-theme='dark'] .sleeveFooter { + border-top: 1px solid var(--ifm-color-emphasis-200); } html[data-theme='dark'] .sleeveFooterSingle { @@ -357,11 +600,12 @@ html[data-theme='dark'] .sleeveFooterSingle { /* make the SCALE button host fill its grid cell */ .sleeveFooter scale-button { - display: block; /* not inline-block */ + display: block; + /* not inline-block */ width: 100%; } -.sleeveBtn{ +.sleeveBtn { display: inline-flex; align-items: center; justify-content: center; @@ -375,14 +619,19 @@ html[data-theme='dark'] .sleeveFooterSingle { font-weight: 600; font-size: 14px; } -.sleeveBtn:hover{ filter: brightness(1.06); transform: translateY(-1px); } -.sleeveBtnGhost{ +.sleeveBtn:hover { + filter: brightness(1.06); + transform: translateY(-1px); +} + +.sleeveBtnGhost { background: #fff; color: #111827; border-color: var(--line); } -.sleeveBtnGhost:hover{ + +.sleeveBtnGhost:hover { background: #f8fafc; } @@ -395,69 +644,82 @@ html[data-theme='dark'] .sleeveFooterSingle { .sleeveBtnGhost:hover, .sleeveBtnGhost:focus, .sleeveBtnGhost:active, -.sleeveBtnGhost:visited{ - width: 100%; /* fill each 1fr cell */ - text-decoration: none; /* no underline on any state */ - justify-content: center; /* keep label centered */ +.sleeveBtnGhost:visited { + width: 100%; + /* fill each 1fr cell */ + text-decoration: none; + /* no underline on any state */ + justify-content: center; + /* keep label centered */ } /* … your existing styles unchanged … */ /* enable pointer + inline layout for SCALE chips */ -.buckets scale-chip{display:inline-flex;cursor:pointer} +/* .buckets scale-chip { + display: inline-flex; + cursor: pointer +} */ + +.filtersRow { + display: flex; + gap: 10px; + align-items: center; + flex-wrap: wrap; + margin: 16px 0 10px +} + +.filtersSep { + opacity: .5; + padding: 0 6px; + user-select: none +} -.filtersRow{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:16px 0 10px} -.filtersSep{opacity:.5;padding:0 6px;user-select:none} /* Smaller font for filter chips only (pipe stays the same size) */ -.filtersRow .buckets { font-size: 8px; } +/* .filtersRow .buckets { + font-size: 8px; +} */ + /* fallback */ -.buckets scale-chip { font-size: 8px; } +/* .buckets scale-chip { + font-size: 8px; +} */ /* the row you already have */ -.filtersRow{ - display:flex; - gap:10px; - align-items:center; - flex-wrap:wrap; - margin:16px 0 10px; +.filtersRow { + display: flex; + gap: 10px; + align-items: center; + flex-wrap: wrap; + margin: 16px 0 10px; } /* keeps the text field on the right and sized neatly */ -.filtersSearchWrap{ +.filtersSearchWrap { padding-top: 10px; - margin-left:auto; /* pushes it to the right */ + margin-left: auto; + /* pushes it to the right */ min-width: 220px; max-width: 340px; - flex: 1 1 220px; /* lets it grow a bit when there’s room */ + flex: 1 1 220px; + /* lets it grow a bit when there’s room */ } -.filtersSearchWrap scale-text-field{ - display:block; - width:100%; - --transition: all var(--telekom-motion-duration-transition) var( - --telekom-motion-easing-standard - ); +.filtersSearchWrap scale-text-field { + display: block; + width: 100%; + --transition: all var(--telekom-motion-duration-transition) var(--telekom-motion-easing-standard); --radius: var(--telekom-radius-standard); - --border: var(--telekom-spacing-composition-space-01) solid var( - --telekom-color-ui-border-standard - ); - --border-error: var(--telekom-spacing-composition-space-02) solid var( - --telekom-color-functional-danger-standard - ); - --border-success: var(--telekom-spacing-composition-space-02) solid var( - --telekom-color-functional-success-standard - ); - --border-warning: var(--telekom-spacing-composition-space-02) solid var( - --telekom-color-functional-warning-standard - ); + --border: var(--telekom-spacing-composition-space-01) solid var(--telekom-color-ui-border-standard); + --border-error: var(--telekom-spacing-composition-space-02) solid var(--telekom-color-functional-danger-standard); + --border-success: var(--telekom-spacing-composition-space-02) solid var(--telekom-color-functional-success-standard); + --border-warning: var(--telekom-spacing-composition-space-02) solid var(--telekom-color-functional-warning-standard); --border-color-hover: var(--telekom-color-ui-border-hovered); --border-color-focus: var(--telekom-color-ui-border-hovered); --border-color-disabled: var(--telekom-color-ui-border-disabled); --background-color-hover: var(--telekom-color-ui-state-fill-hovered); --background-color-disabled: none; - --focus-outline: var(--telekom-line-weight-highlight) solid var( - --telekom-color-functional-focus-standard - ); + --focus-outline: var(--telekom-line-weight-highlight) solid var(--telekom-color-functional-focus-standard); --height: 44px; --spacing-x: var(--telekom-spacing-composition-space-05); --color-disabled: var(--telekom-color-text-and-icon-disabled); @@ -474,9 +736,7 @@ html[data-theme='dark'] .sleeveFooterSingle { --color-meta-error: var(--telekom-color-text-and-icon-functional-danger); /* control */ - --spacing-control: 1.125rem calc( - 2rem - var(--telekom-spacing-composition-space-01) - ) 0.25rem calc(0.75rem - var(--telekom-spacing-composition-space-01)); + --spacing-control: 1.125rem calc(2rem - var(--telekom-spacing-composition-space-01)) 0.25rem calc(0.75rem - var(--telekom-spacing-composition-space-01)); --transition-control: var(--transition); --background-control: var(--telekom-color-ui-state-fill-standard); --margin-bottom-control: var(--telekom-spacing-composition-space-03); @@ -489,16 +749,10 @@ html[data-theme='dark'] .sleeveFooterSingle { --font-size-helper-text: var(--telekom-typography-font-size-small); --line-height-helper-text: 0.8; --font-weight-helper-text: var(--telekom-typography-font-weight-bold); - --color-helper-text: var( - --telekom-color-text-and-icon-functional-informational - ); + --color-helper-text: var(--telekom-color-text-and-icon-functional-informational); --color-helper-text-error: var(--color-meta-error); - --color-helper-text-success: var( - --telekom-color-text-and-icon-functional-success - ); - --color-helper-text-warning: var( - --telekom-color-text-and-icon-functional-warning - ); + --color-helper-text-success: var(--telekom-color-text-and-icon-functional-success); + --color-helper-text-warning: var(--telekom-color-text-and-icon-functional-warning); --color-helper-text-neutral: var(--telekom-color-text-and-icon-additional); --helper-text-icon-size: 8px; @@ -514,28 +768,37 @@ html[data-theme='dark'] .sleeveFooterSingle { } /* Single grid for tiles — 4 per row on desktop */ -.tileGrid{ +.tileGrid { display: grid; gap: 10px; - grid-template-columns: repeat(4, minmax(0, 1fr)); + grid-template-columns: repeat(3, minmax(0, 1fr)); align-items: start; } /* Tweak columns responsively so it doesn’t overflow on smaller screens */ -@media (max-width: 1200px){ - .tileGrid { grid-template-columns: repeat(3, minmax(0, 1fr)); } +@media (max-width: 1200px) { + .tileGrid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } } -@media (max-width: 900px){ - .tileGrid { grid-template-columns: repeat(2, minmax(0, 1fr)); } + +@media (max-width: 900px) { + .tileGrid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } } -@media (max-width: 540px){ - .tileGrid { grid-template-columns: 1fr; } + +@media (max-width: 540px) { + .tileGrid { + grid-template-columns: 1fr; + } } .filterBarRight { width: 100%; - gap:10px; - display: block; /* ensures the custom element honors width */ + gap: 10px; + display: block; + /* ensures the custom element honors width */ min-width: 300px; } @@ -553,32 +816,69 @@ html[data-theme='dark'] .sleeveFooterSingle { /* one-row layout with a 90/10 split */ .filterRow { display: grid; - grid-template-columns: 8.5fr 1.5fr; /* 90% / 10% */ + grid-template-columns: 10fr 0fr; + /* 90% / 10% */ gap: 10px; align-items: center; width: 100%; } -/* ensure the custom element stretches */ -.fullWidthDropdown { +.filterCategoriesRow { + display: grid; + grid-template-columns: 4.5fr 5.5fr; + /* 90% / 10% */ + gap: 10px; + align-items: center; + width: 100%; +} + +.filterChipsRow { + display: grid; + grid-template-columns: 4.0fr 6.0fr; + /* 90% / 10% */ + gap: 10px; + align-items: center; width: 100%; - display: block; } -/* make the reset button fill its 10% column */ -.resetBtn { +/* one-row layout with a 90/10 split */ +.filterRegionsRow { + display: grid; + grid-template-columns: 4.0fr 6.0fr; + /* 90% / 10% */ + gap: 10px; + align-items: center; width: 100%; - height: 44px; /* match your input height if needed */ +} + + +/* one-row layout with a 90/10 split */ +.filterAccordionRow { + display: grid; + grid-template-columns: 10fr 0fr; + /* 90% / 10% */ + gap: 10px; + align-items: center; + width: 100%; +} + +/* ensure the custom element stretches */ +.fullWidthDropdown { + width: 100%; + display: block; } /* Span the full results grid and center content */ .emptyFill { - grid-column: 1 / -1; /* <-- key: occupy all grid columns */ + grid-column: 1 / -1; + /* <-- key: occupy all grid columns */ width: 100%; - display: grid; /* center both axes */ + display: grid; + /* center both axes */ place-items: center; - min-height: 50vh; /* or 100vh if you want true viewport centering */ + min-height: 50vh; + /* or 100vh if you want true viewport centering */ } .emptyState { @@ -594,3 +894,24 @@ html[data-theme='dark'] .sleeveFooterSingle { height: auto; margin-bottom: 10px; } + +.odstext_label { + padding: 0; + margin: 0; + display: flex; + align-items: center; + height: 100%; +} + +.bucketsResetFilters { + display: flex; + width: 100%; + gap: 8px; + flex-wrap: wrap; + margin-top: 12px +} + +.odsbutton__reset_filters { + width: 100%; + display: block; +} diff --git a/src/components/ServiceCallouts/FeaturedServices/index.tsx b/src/components/ServiceCallouts/FeaturedServices/index.tsx index 5da61d627b..d6c5a18b5f 100644 --- a/src/components/ServiceCallouts/FeaturedServices/index.tsx +++ b/src/components/ServiceCallouts/FeaturedServices/index.tsx @@ -11,60 +11,60 @@ import SwrSvg from '@site/static/img/services/swr.svg' import CcSvg from '@site/static/img/services/cc.svg' const calloutsList: Callout[] = [ - { - title: "VPC", - text: "Virtual Private Cloud", - link: "/docs/tags/vpc", - icon: VpcSvg - }, + // { + // title: "VPC", + // text: "Virtual Private Cloud", + // link: "/docs/tags/vpc", + // icon: "/img/services/VPC.svg" + // }, { title: "ECS", text: "Elastic Cloud Server", link: "/docs/tags/ecs", - icon: EcsSvg + icon: "/img/services/ECS.svg" }, { title: "OBS", text: "Object Storage Service", link: "/docs/tags/obs", - icon: ObsSvg + icon: "/img/services/OBS.svg" }, { title: "IAM", text: "Identity & Access Management", link: "/docs/tags/iam", - icon: IamSvg + icon: "/img/services/IAM.svg" }, { title: "ELB", text: "Elastic Load Balancing", link: "/docs/tags/elb", - icon: ElbSvg + icon: "/img/services/ELB.svg" }, { title: "DMS", text: "Distributed Message Service", link: "/docs/tags/dms", - icon: DmsSvg + icon: "/img/services/DMS.svg" }, { title: "CCE", text: "Cloud Container Engine", link: "/docs/tags/cce", - icon: CceSvg + icon: "/img/services/CCE.svg" }, - { - title: "SWR", - text: "Software Repository for Containers", - link: "/docs/tags/swr", - icon: SwrSvg - }, - { - title: "Cloud Create", - text: "Multi-Cloud Management Platform", - link: "/docs/tags/cloud-create", - icon: CcSvg - }, + // { + // title: "SWR", + // text: "Software Repository for Containers", + // link: "/docs/tags/swr", + // icon: "/img/services/swr.svg" + // }, + // { + // title: "Cloud Create", + // text: "Multi-Cloud Management Platform", + // link: "/docs/tags/cloud-create", + // icon: "/img/services/cc.svg" + // }, ]; export default function FeaturedServices(): JSX.Element { diff --git a/src/components/ServiceCallouts/NewServices/index.tsx b/src/components/ServiceCallouts/NewServices/index.tsx index b4dd11067f..d5e178e3e7 100644 --- a/src/components/ServiceCallouts/NewServices/index.tsx +++ b/src/components/ServiceCallouts/NewServices/index.tsx @@ -12,19 +12,19 @@ import CfwSvg from '@site/static/img/services/cfw.svg' title: "ASM", text: "Application Service Mesh (Istio-Based)", link: "https://docs.otc.t-systems.com/application-service-mesh/index.html", - icon: AsmSvg + icon: "/img/services/asm.svg" }, { title: "CCI", text: "Serverless Container Engine", link: "https://docs.otc.t-systems.com/cloud-container-instance/index.html", - icon: CciSvg + icon: "/img/services/cci.svg" }, { title: "RFS", text: "Resource Formation Service", link: "https://docs.otc.t-systems.com/resource-formation-service/index.html", - icon: RfsSvg + icon: "/img/services/rfs.svg" }, // { // title: "Config", @@ -36,19 +36,19 @@ import CfwSvg from '@site/static/img/services/cfw.svg' title: "OCR", text: "Optical Character Recognition", link: "https://docs.otc.t-systems.com/optical-character-recognition/index.html", - icon: OcrSvg + icon: "/img/services/ocr.svg" }, { title: "FGS", text: "FunctionGraph", link: "https://docs.otc.t-systems.com/function-graph/index.html", - icon: FgSvg + icon: "/img/services/fg.svg" }, { title: "CFW", text: "Cloud Firewall", link: "https://docs.otc.t-systems.com/cloud-firewall/index.html", - icon: CfwSvg + icon: "/img/services/cfw.svg" }, // { // title: "GeminiDB", diff --git a/src/components/ServiceCallouts/callout.tsx b/src/components/ServiceCallouts/callout.tsx index 6feb7c5493..d85c46ea53 100644 --- a/src/components/ServiceCallouts/callout.tsx +++ b/src/components/ServiceCallouts/callout.tsx @@ -1,8 +1,6 @@ import clsx from "clsx"; -import styles from "./styles.module.css"; -import { ComponentType, SVGProps } from 'react'; import useBaseUrl from '@docusaurus/useBaseUrl'; - +import { ODSCardFeature, ODSCardFeaturePreferredContent } from "@telekom-ods/react-ui-kit"; export interface Callout { title: string; @@ -10,27 +8,34 @@ export interface Callout { link: string; // icon: (props: React.ComponentProps<"svg">) => JSX.Element; - icon: ComponentType>; + // icon: ComponentType>; + icon: string; } function Callout(props: Callout): JSX.Element { return ( -
-
-
-

-

-
-
- -

- {props.text} -

-
-
-
-
+
+ + } + imageProps={{ src: useBaseUrl(props.icon), alt: props.title }} + buttonProps={{ + onClick: () => { + const currentDomain = window.location.hostname; + const linkDomain = new URL(props.link, window.location.origin).hostname; + + if (currentDomain === linkDomain) { + window.location.href = props.link; + } else { + window.open(props.link, '_blank'); + } + } + }} + /> +
); } @@ -40,10 +45,10 @@ export interface ServiceCalloutsProps { export default function ServiceCallouts({ callouts }: ServiceCalloutsProps): JSX.Element { return ( -
+
{callouts.map((c) => ( -
+
))} diff --git a/src/components/ServiceCallouts/styles.module.css b/src/components/ServiceCallouts/styles.module.css index 8ca9cf28ec..6d159406a5 100644 --- a/src/components/ServiceCallouts/styles.module.css +++ b/src/components/ServiceCallouts/styles.module.css @@ -19,6 +19,7 @@ position: relative; background-color: var(--telekom-color-background-surface-subtle); } + .callout__title { align-items: center; display: flex; @@ -26,20 +27,24 @@ font-size: smaller; margin-bottom: 0; } + .callout__icon { height: 1.25rem; margin-right: 0.5rem; width: 1.25rem; } + .callout__link { color: inherit; text-decoration: none; font-size: small; } + .callout__link:hover { color: inherit; text-decoration: none; } + .callout__bottom { background: var(--ifm-color-primary); height: 0.5rem; @@ -49,6 +54,7 @@ transition-duration: 150ms; width: 0; } + .callout:hover .callout__bottom { width: 100%; } @@ -67,4 +73,4 @@ html[data-theme='dark'] .callout__shadow { .video { box-shadow: 0 2px 6px var(--ifm-background-surface-color-dark); border-radius: 0.375rem; -} \ No newline at end of file +} diff --git a/src/components/Templates/TemplateCard.tsx b/src/components/Templates/TemplateCard.tsx index 3c105d796d..523732492e 100644 --- a/src/components/Templates/TemplateCard.tsx +++ b/src/components/Templates/TemplateCard.tsx @@ -1,61 +1,74 @@ import React from 'react'; -import styles from './styles.module.css'; +import { ODSCardImage, ODSCardContentBasic, ODSTagStatic } from '@telekom-ods/react-ui-kit'; +import { useColorMode } from '@docusaurus/theme-common'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import clsx from 'clsx'; export type TemplateItem = { + id: string; title: string; logo: string; description: JSX.Element; type?: string; link?: string; partner?: boolean; + banner?: string; }; -const TemplateCard: React.FC = ({ title, logo, description, type, link, partner }) => { - const Wrapper: React.ElementType = link ? 'a' : 'div'; - const wrapperProps = link - ? { - href: link, - target: '_blank', - rel: 'noopener noreferrer', - } - : {}; - +const TemplateCard: React.FC = ({ title, logo, description, type, link, banner , partner }) => { const tags = type .split(',') .map(t => t.trim()) .filter(Boolean) + const open = () => { + window.open(link, "_blank", "noopener"); + }; + + const { colorMode } = useColorMode(); // "light" | "dark" + + if (!banner) { + banner = useBaseUrl( + colorMode === 'dark' ? '/img/night_banner.png' : '/img/day_banner.png' + ); + } + return ( - -
-
- {`${title} -
- {partner && ( - - Partner Template - - )} -
- -
-
-
{title}
-
{description}
-
-
- {tags.map((tag, i) => ( - - {tag} - - ))} -
-
-
+ +
+ +
+ +
+ {tags.map((tag, i) => ( + + ))} +
+ + + } + href={link} + logoProps={{ src: logo, title: 'Telekom/Partner Logo', style: { maxHeight: '56px', maxWidth: '56px', objectFit: 'contain', backgroundColor: '#f1f1f1' } }} + showLogo={true} + role="link" + size="medium" + target="_blank" + /> ); }; diff --git a/src/components/Templates/TemplatesList.tsx b/src/components/Templates/TemplatesList.tsx index 759abb8e3c..10aedb01d8 100644 --- a/src/components/Templates/TemplatesList.tsx +++ b/src/components/Templates/TemplatesList.tsx @@ -2,9 +2,29 @@ import { TemplateItem } from './TemplateCard'; import telekomPng from '@site/static/img/templates/logos/telekom.png'; import iitsPng from '@site/static/img/templates/logos/iits.png'; +import nextCloudPng from '@site/static/img/templates/nextcloud.png'; +import prometheusPng from '@site/static/img/templates/prometheus.png'; +import openShiftPng from '@site/static/img/templates/openshift.png'; +import keycloakPng from '@site/static/img/templates/keycloak.png'; +import letsencrypt from '@site/static/img/templates/letsencrypt.png'; + export const TemplatesList: TemplateItem[] = [ { + id: 'argocdapp', + title: 'ArgoCD App', + logo: telekomPng, + description: ( + <> + With this template, deploying your cloud-native applications to the cloud has never been easier or faster, no OpenStack expertise knowledge required. + In just a few clicks, you can spin up a Cloud Container Engine (CCE) cluster and launch your apps using Argo CD, the leading GitOps tool. + + ), + type: 'Cloud Create', + link: 'https://designer.otc-service.com/#/applications/list', + }, + { + id: 'openshift', title: 'OpenShift', logo: telekomPng, description: ( @@ -15,8 +35,10 @@ export const TemplatesList: TemplateItem[] = [ ), type: 'Cloud Create', link: 'https://designer.otc-service.com/#/applications/list', + banner: openShiftPng, }, { + id: 'openshift-ha', title: 'OpenShift HA', logo: telekomPng, description: ( @@ -26,8 +48,10 @@ export const TemplatesList: TemplateItem[] = [ ), type: 'Cloud Create', link: 'https://designer.otc-service.com/#/applications/list', + banner: openShiftPng, }, { + id: 'nextcloud', title: 'Nextcloud', logo: telekomPng, description: ( @@ -37,8 +61,10 @@ export const TemplatesList: TemplateItem[] = [ ), type: 'Cloud Create', link: 'https://designer.otc-service.com/#/applications/list', + banner: nextCloudPng, }, { + id: 'cce', title: 'CCE', logo: telekomPng, description: ( @@ -50,6 +76,7 @@ export const TemplatesList: TemplateItem[] = [ link: 'https://designer.otc-service.com/#/applications/list', }, { + id: 'bastion-host', title: 'Bastion Host', logo: telekomPng, description: ( @@ -61,6 +88,7 @@ export const TemplatesList: TemplateItem[] = [ link: 'https://designer.otc-service.com/#/applications/list', }, { + id: 'prometheus', title: 'Prometheus', logo: telekomPng, description: ( @@ -70,8 +98,10 @@ export const TemplatesList: TemplateItem[] = [ ), type: 'Cloud Create', link: 'https://designer.otc-service.com/#/applications/list', + banner: prometheusPng, }, { + id: 'p2s-vpn', title: 'P2S VPN', logo: telekomPng, description: ( @@ -86,6 +116,7 @@ export const TemplatesList: TemplateItem[] = [ link: 'https://github.com/opentelekomcloud-blueprints/ovpn', }, { + id: 'acme', title: 'ACME', logo: iitsPng, description: ( @@ -98,8 +129,10 @@ export const TemplatesList: TemplateItem[] = [ type: 'Terraform', link: 'https://github.com/iits-consulting/terraform-opentelekomcloud-acme', partner: true, + banner: letsencrypt, }, { + id: 'cce', title: 'CCE', logo: iitsPng, description: ( @@ -114,6 +147,7 @@ export const TemplatesList: TemplateItem[] = [ partner: true, }, { + id: 'cce-gpu', title: 'CCE GPU Node Pool', logo: iitsPng, description: ( @@ -141,6 +175,7 @@ export const TemplatesList: TemplateItem[] = [ // link: 'https://github.com/iits-consulting/terraform-opentelekomcloud-cert-manager', // }, { + id: 'crd-installer', title: 'CRD Installer', logo: iitsPng, description: ( @@ -155,6 +190,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'cts', title: 'CTS', logo: iitsPng, description: ( @@ -171,6 +207,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'dedicated-elb', title: 'Dedicated ELB', logo: iitsPng, description: ( @@ -186,6 +223,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'enterprise-vpn-connection', title: 'Enterprise VPN Connection', logo: iitsPng, description: ( @@ -202,6 +240,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'enterprise-vpn-gateway', title: 'Enterprise VPN Gateway', logo: iitsPng, description: ( @@ -218,6 +257,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'evs', title: 'EVS', logo: iitsPng, description: ( @@ -233,6 +273,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'jumphost', title: 'Jumphosts', logo: iitsPng, description: ( @@ -250,6 +291,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'keycloak-oidc', title: 'Keycloak SSO (OIDC)', logo: iitsPng, description: ( @@ -262,9 +304,10 @@ export const TemplatesList: TemplateItem[] = [ type: 'Terraform', link: 'https://github.com/iits-consulting/terraform-opentelekomcloud-keycloak-sso-oidc', partner: true, - + banner: keycloakPng, }, { + id: 'keycloak-saml', title: 'Keycloak SSO (SAML)', logo: iitsPng, description: ( @@ -277,9 +320,10 @@ export const TemplatesList: TemplateItem[] = [ type: 'Terraform', link: 'https://github.com/iits-consulting/terraform-opentelekomcloud-keycloak-sso-saml', partner: true, - + banner: keycloakPng, }, { + id: 'elb', title: 'ELB', logo: iitsPng, description: ( @@ -295,6 +339,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'obs-bucket', title: 'Restricted OBS Bucket', logo: iitsPng, description: ( @@ -310,6 +355,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'obs-secrets-reader', title: 'OBS Secrets Reader', logo: iitsPng, description: ( @@ -325,6 +371,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'obs-secrets-writer', title: 'OBS Secrets Writer', logo: iitsPng, description: ( @@ -341,6 +388,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'private-dns', title: 'Private DNS', logo: iitsPng, description: ( @@ -356,6 +404,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'projects', title: 'Projects', logo: iitsPng, description: ( @@ -371,6 +420,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'public-dns', title: 'Public DNS', logo: iitsPng, description: ( @@ -387,6 +437,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'rds', title: 'RDS', logo: iitsPng, description: ( @@ -402,6 +453,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'sfs', title: 'SFS', logo: iitsPng, description: ( @@ -417,6 +469,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'snat', title: 'SNAT', logo: iitsPng, description: ( @@ -432,6 +485,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'terraform-remote-state', title: 'Encrypted Terraform Remote State', logo: iitsPng, description: ( @@ -447,6 +501,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'vpc-subnet', title: 'VPC/Subnet', logo: iitsPng, description: ( @@ -462,6 +517,7 @@ export const TemplatesList: TemplateItem[] = [ }, { + id: 'waf', title: 'WAF', logo: iitsPng, description: ( diff --git a/src/components/Templates/index.tsx b/src/components/Templates/index.tsx index f16fc1baa5..1c0beef79e 100644 --- a/src/components/Templates/index.tsx +++ b/src/components/Templates/index.tsx @@ -1,8 +1,9 @@ -import React, { useMemo, useState } from "react"; +import React, { useMemo, useState, useCallback } from "react"; import styles from "./styles.module.css"; import TemplateCard from "./TemplateCard"; import { TemplatesList } from "./TemplatesList"; import useBaseUrl from '@docusaurus/useBaseUrl'; +import { ODSButton, ODSChipSet, ODSToggleChip } from '@telekom-ods/react-ui-kit'; const FILTERS = [ { label: "Ansible", value: "ansible" }, @@ -12,7 +13,6 @@ const FILTERS = [ ] as const; type FilterType = (typeof FILTERS)[number]["value"]; - const normalize = (v: string) => v.trim().toLowerCase(); function splitTemplateTypes(typeField?: string): string[] { @@ -38,27 +38,23 @@ export default function Templates() { }); }; - const onChipRowClickCapture = (e: React.MouseEvent) => { - const host = (e.target as HTMLElement)?.closest("scale-chip") as HTMLElement | null; - if (!host) return; - - const value = host.getAttribute("data-chip") as FilterType | null; - if (!value) return; - - e.preventDefault(); - e.stopPropagation(); - toggleType(value); - }; + const resetFilters = useCallback(() => { + setActiveTypes(new Set()); + }, []); const filteredTemplates = useMemo(() => { - if (activeTypes.size === 0) return TemplatesList; - - return TemplatesList.filter((tpl) => { + let templates = activeTypes.size === 0 ? TemplatesList : TemplatesList.filter((tpl) => { const tplTypes = splitTemplateTypes(tpl.type); - for (const t of activeTypes) { - if (tplTypes.includes(t)) return true; - } - return false; + return Array.from(activeTypes).some(t => tplTypes.includes(t)); + }); + + // Deduplicate by id/link + const seen = new Set(); + return templates.filter(tpl => { + const key = tpl.id || tpl.link; + if (seen.has(key)) return false; + seen.add(key); + return true; }); }, [activeTypes]); @@ -67,48 +63,61 @@ export default function Templates() {
Filter by type: -
+ {FILTERS.map(({ label, value }) => { const isActive = activeTypes.has(value); + return ( - - {label} - + onClick={() => toggleType(value)} + /> ); })} -
- - setActiveTypes(new Set())} - > - Reset Filters - + + +
+
-
- {filteredTemplates.length === 0 ? ( -
-
- -

No results match your filters.

-
+ {filteredTemplates.length === 0 ? ( +
+
+ +

No results match your filters.

- - ) : ( - filteredTemplates.map((tpl) => ( - - )) - )} -
+
+ ) : ( +
+ {filteredTemplates.map((tpl, idx) => ( +
+ +
+ ))} +
+ )}
); } diff --git a/src/components/Templates/styles.module.css b/src/components/Templates/styles.module.css index b855780836..a2501f54f3 100644 --- a/src/components/Templates/styles.module.css +++ b/src/components/Templates/styles.module.css @@ -8,12 +8,17 @@ --shadow-hover: rgba(0, 0, 0, 0.1); } -:root { --ifm-background-surface-color: #fbfbfb; } -html[data-theme='dark'] { --ifm-background-surface-color: #1c1c1e; } +:root { + --ifm-background-surface-color: #fbfbfb; +} + +html[data-theme='dark'] { + --ifm-background-surface-color: #1c1c1e; +} .grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(480px, 3fr)); gap: 1.5rem; max-width: 1200px; margin: 0 auto; @@ -29,12 +34,12 @@ html[data-theme='dark'] { --ifm-background-surface-color: #1c1c1e; } color: var(--text-base, var(--ifm-font-color-base)); transition: box-shadow 0.2s ease; height: 100%; - text-decoration: none; + text-decoration: none; } .card:hover { - text-decoration: none; - box-shadow: + text-decoration: none; + box-shadow: 0px 16px 64px 0px var(--shadow-hover, var(--telekom-shadow-raised-hover)), 0px 8px 16px 0px var(--shadow-hover, var(--telekom-shadow-raised-hover)) } @@ -47,8 +52,8 @@ html[data-theme='dark'] .card { html[data-theme='dark'] .card:hover { /* your Telekom-pink shadow */ - box-shadow: - 0px 16px 64px 0px #e20074, + box-shadow: + 0px 16px 64px 0px #e20074, 0px 8px 16px 0px #e20074; } @@ -139,20 +144,19 @@ html[data-theme='dark'] .card { .tagsContainer { display: flex; - flex-wrap: nowrap; /* never wrap onto a second line */ - column-gap: 0.4rem; /* horizontal gap only */ - overflow-x: auto; /* scroll if they overflow */ -} - -.tagsContainer :global(scale-tag) { - display: inline-flex; /* reset any block-level margins */ - margin: 0; /* remove leftover bottom-margins */ + flex-wrap: nowrap; + /* never wrap onto a second line */ + column-gap: 0.4rem; + /* horizontal gap only */ + overflow-x: auto; + /* scroll if they overflow */ } /* ===== Filters (toggle chips) ===== */ .filtersLabel { + margin-top: 5px; font-size: 0.9rem; - font-weight: 600; + font-weight: 800; opacity: 0.8; } @@ -163,7 +167,8 @@ html[data-theme='dark'] .card { flex-wrap: wrap; width: 100%; max-width: 1200px; - margin: 0 auto 16px auto; /* center like the grid */ + margin: 0 auto 16px auto; + /* center like the grid */ } .chip { @@ -180,8 +185,10 @@ html[data-theme='dark'] .card { display: flex; gap: 8px; flex-wrap: wrap; - flex: 1 1 auto; /* <-- this is the key */ - min-width: 280px; /* keeps some space before button wraps */ + flex: 1 1 auto; + /* <-- this is the key */ + min-width: 280px; + /* keeps some space before button wraps */ } .chipActive { @@ -206,7 +213,7 @@ html[data-theme='dark'] .card { height: 44px; } -.tileGrid{ +.tileGrid { display: grid; gap: 10px; grid-template-columns: repeat(4, minmax(0, 1fr)); @@ -215,12 +222,15 @@ html[data-theme='dark'] .card { /* Span the full results grid and center content */ .emptyFill { - grid-column: 1 / -1; /* <-- key: occupy all grid columns */ + grid-column: 1 / -1; + /* <-- key: occupy all grid columns */ width: 100%; - display: grid; /* center both axes */ + display: grid; + /* center both axes */ place-items: center; - min-height: 50vh; /* or 100vh if you want true viewport centering */ + min-height: 50vh; + /* or 100vh if you want true viewport centering */ } .emptyState { @@ -236,5 +246,3 @@ html[data-theme='dark'] .card { height: auto; margin-bottom: 10px; } - - diff --git a/src/css/custom.css b/src/css/custom.css index cf8a9cb986..9c945d21c5 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -1,33 +1,7 @@ -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. - */ - -/* You can override the default Infima variables here. */ -/* :root { - --ifm-color-primary: #E20074; - --ifm-color-primary-dark: #E20074; - --ifm-color-primary-darker: #E20074; - --ifm-color-primary-darkest: #E20074; - --ifm-color-primary-light: #E20074; - --ifm-color-primary-lighter: #E20074; - --ifm-color-primary-lightest: #E20074; - --ifm-code-font-size: 95%; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); -} */ +/* Telekom ODS Components */ + +@import "./ods.custom.css"; -/* For readability concerns, you should choose a lighter palette in dark mode. */ -/* [data-theme='dark'] { - --ifm-color-primary: #7d94f9; - --ifm-color-primary-dark: #7d94f9; - --ifm-color-primary-darker: #7d94f9; - --ifm-color-primary-darkest: #7d94f9; - --ifm-color-primary-light: #7d94f9; - --ifm-color-primary-lighter: #7d94f9; - --ifm-color-primary-lightest: #7d94f9; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); -} */ :root, html { display: none; @@ -181,8 +155,13 @@ html[data-theme='dark'] .footer__link-item:hover { } .navbar__link { - /* font-size: larger; */ - /* font-weight: 700; */ + font-size: larger; + font-weight: 700; +} + +.DocSearch-Button { + font-size: larger; + font-family: var(--ifm-font-family-base); font-weight: 700; } @@ -348,4 +327,6 @@ html[data-theme='dark'] .navbar--discourse-link:before { .navbar--discord-link { display: none !important; } -} */ \ No newline at end of file +} */ + + diff --git a/src/css/ods.custom.css b/src/css/ods.custom.css new file mode 100644 index 0000000000..78dc02d63b --- /dev/null +++ b/src/css/ods.custom.css @@ -0,0 +1,314 @@ +/* HomePageHeroPromo */ + +.odsHeroWrapper__content .ODSCarouselTimer { + visibility: hidden; + position: absolute; + pointer-events: none; +} + +.odsHeroWrapper__content button[aria-label="button navigation right type standard"] { + display: none; +} + +.odsHeroWrapper__content button[aria-label="button navigation left type standard"] { + display: none; +} + +.odsHeroWrapper__content button[aria-label="play button resumed"] { + display: none; +} + +.odsHeroWrapper__content button[aria-label="play button paused"] { + display: none; +} + +/* HomePageNewArticles */ + +/* 1) Stop the “peek” */ +.carouselFix * { + box-sizing: border-box; +} + +/* Try Embla-style first (very common) */ +.carouselFix .embla__viewport { + overflow: hidden !important; +} + +.carouselFix .embla__container { + display: flex; +} + +/* FORCE: each slide (direct child) = 100% width */ +.carouselFix .embla__container > * { + flex: 0 0 100% !important; + min-width: 0; +} + +/* Portfolio Navigator */ + +.odscard__feature_content_pn_padding { + padding-top: 10px !important; +} + +.odscard__feature_content_pn .ODSCardFeature-ImageContainer { + width: 20% !important; + height: 100% !important; +} + +.odscard__feature_content_pn .ODSCardFeature-ImageContainer img { + width: 70% !important; + height: 100% !important; + object-fit: scale-down !important; + filter: invert(0); +} + +html[data-theme='dark'] .odscard__feature_content_pn .ODSCardFeature-ImageContainer img { + filter: invert(1); +} + +.odscard__feature_content_pn .ODSContainer-basic--horizontal.ODSCardFeature-ImageBg { + /* background-color: #4ad9cd !important; */ + background-color: #f2f0f1; +} + +html[data-theme='dark'] .odscard__feature_content_pn .ODSContainer-basic--horizontal.ODSCardFeature-ImageBg { + /* background-color: #4ad9cd !important; */ + background-color: var(--telekom-color-background-surface-subtle); +} + +.odscard__feature_content_pn .ODSContainer-basic--horizontal.ODSCardFeature { + height: 40px !important; + min-height: 96px !important; + margin-bottom: 10px !important; +} + +.odscard__feature_content_pn .ODSCardFeature-CardBg { + background-color: #f2f0f1; +} + +html[data-theme='dark'] .odscard__feature_content_pn .ODSCardFeature-CardBg { + background-color: var(--telekom-color-background-surface-subtle); +} + +.odscard__feature_content_pn .ODSCardFeaturePreferredContent { + color: red !important; + font-size: medium !important; +} + +.odscard__feature_content_pn .ODSCardFeaturePreferredContent-ProductName { + margin-top: 2px; + font-size: medium !important; +} + +.odscard__feature_content_pn .ODSCardFeaturePreferredContent-ProductPrice { + font-size: small !important; +} + +.odscard__feature_content_pn .ODSCardFeaturePreferredContent h2 { + margin: 0 !important; +} + +.odsaccordion_filters .ODSAccordion-Heading { + background-color: #e20074 !important; + border-radius: 20px; +} + +/* .odsbutton__reset_filters .ODSButton--buttonType-standard { + padding-top: 10px; +} */ + + + +/* .bucketsResetFilters .ODSButton { + width: 100%; +} */ + +/* ServiceCallouts */ + + +.odscard__feature_content_padding { + padding-top: 10px !important; +} + +.odscard__feature_content .ODSCardFeature-ImageContainer { + width: 20% !important; + height: 100% !important; +} + +.odscard__feature_content .ODSCardFeature-ImageContainer img { + width: 70% !important; + height: 100% !important; + object-fit: scale-down !important; + filter: invert(0); /* Put this to 1 to discover which SVGs are grey */ +} + +html[data-theme='dark'] .odscard__feature_content .ODSCardFeature-ImageContainer img { + filter: invert(1); +} + +.odscard__feature_content .ODSContainer-basic--horizontal.ODSCardFeature-ImageBg { + /* background-color: #4ad9cd !important; */ + background-color: #fbfbfb; +} + +html[data-theme='dark'] .odscard__feature_content .ODSContainer-basic--horizontal.ODSCardFeature-ImageBg { + /* background-color: #4ad9cd !important; */ + background-color: var(--telekom-color-background-surface-subtle); +} + +.odscard__feature_content .ODSContainer-basic--horizontal.ODSCardFeature { + height: 40px !important; + min-height: 96px !important; + margin-bottom: 10px !important; +} + +.odscard__feature_content .ODSCardFeature-CardBg { + background-color: #fbfbfb; +} + +html[data-theme='dark'] .odscard__feature_content .ODSCardFeature-CardBg { + background-color: var(--telekom-color-background-surface-subtle); +} + +.odscard__feature_content .ODSCardFeaturePreferredContent { + color: red !important; + font-size: medium !important; +} + +.odscard__feature_content .ODSCardFeaturePreferredContent-ProductName { + font-size: medium !important; +} + +.odscard__feature_content .ODSCardFeaturePreferredContent-ProductPrice { + font-size: small !important; +} + +.odscard__feature_content .ODSCardFeaturePreferredContent h2 { + margin: 0 !important; +} + +/* Templates */ + + +.odsCardImageWrapper__content .ODSCardContentBasic-BodyText { + font-weight: 400; + font-family: var(--ifm-font-family-base); + + /* “adjust size if necessary” (pragmatic approach) */ + font-size: clamp(0.8rem, 0.85rem + 0.2vw, 0.9rem); + line-height: 1.2rem; + +} + +.odsCardImageWrapper__content .ODSContainer-basic--vertical .ODSCardImage-ContentWrapper { + vertical-align: top; + /* padding-top: 20px; */ + display: flex; + flex-direction: column; + min-height: 250px; +} + +.odsCardImageWrapper__content_top { + flex: 1; +} + +.odsCardImageWrapper__tags_container { + padding-top: 10px; + margin-top: auto; + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +/* DocCard */ + + +/* If the rendered element has class "ODSCardQuickAction" */ +.quickActionWrapper__content .ODSCardQuickAction { + width: 100% !important; + max-width: 100% !important; + height: 100% !important; + display: block; +} + +/* If it renders as a web component tag like */ +.quickActionWrapper__content ods-card-quick-action { + width: 100% !important; + height: 100% !important; + display: block; +} +.quickActionWrapper__content .ODSQuickActionCardPreferredContent { + height: 100%; + display: flex; + flex-direction: column; + justify-content: flex-start; +} + +.quickActionWrapper__content .ODSQuickActionCardPreferredContent-Title { + display: flex !important; + align-items: center !important; + gap: 8px !important; + margin: 0 0 6px 0 !important; + font-size: 1rem !important; + line-height: 1.2rem !important; +} + +/* Subtitle clamps AND can shrink slightly if space is tight */ +.quickActionWrapper__content .ODSQuickActionCardPreferredContent-Subtitle { + font-weight: 400; + font-family: var(--ifm-font-family-base); + + /* “adjust size if necessary” (pragmatic approach) */ + font-size: clamp(0.8rem, 0.85rem + 0.2vw, 0.9rem); + line-height: 1.2rem; + + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: hidden; + word-break: break-word; + + /* ensures consistent card heights even with short text */ + min-height: calc(1.2rem * 3); +} + +.quickActionWrapper__content a, +.quickActionWrapper__content a:hover, +.quickActionWrapper__content a:focus { + text-decoration: none !important; +} + +/* DocCardList */ + + +.quickActionWrapper__content_list .ODSCardQuickAction { + --ODSCardQuickAction-width: 100% !important; + width: 100% !important; + max-width: 100% !important; + margin-top: 10px; +} + +.quickActionWrapper__content_list .ODSQuickActionCardPreferredContent-Subtitle { + font-weight: 400; + font-family: var(--ifm-font-family-base); + font-size: var(--ifm-code-font-size); + line-height: 1.3rem; + + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: hidden; + word-break: break-word; +} + +.quickActionWrapper__content_list .ODSQuickActionCardPreferredContent-Title { + display: flex !important; + align-items: center !important; + gap: 8px !important; +} + +.quickActionWrapper__content_list a, +.quickActionWrapper__content_list a:hover, +.quickActionWrapper__content_list a:focus { + text-decoration: none !important; +} \ No newline at end of file diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 20f410720e..e51607e18e 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,36 +1,11 @@ import clsx from 'clsx'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import Layout from '@theme/Layout'; -import HomepageFeatures from '@site/src/components/HomepageFeatures'; -// import Heading from '@theme/Heading'; -// import { useThemeConfig } from '@docusaurus/theme-common'; -// import useBaseUrl from '@docusaurus/useBaseUrl'; - -// import styles from './index.module.css'; import HomepageFeaturedServices from '../components/HomepageFeaturedServices'; -import HomepageAskAQuestion from '../components/HomepageAskAQuestion'; import HomepageContribute from '../components/HomepageContribute'; - -// function HomepageHeader() { -// const { siteConfig } = useDocusaurusContext(); -// const navbarStyle = useThemeConfig().navbar.style; -// const buttonVariant = navbarStyle === 'dark' ? "primary" : "secondary-white" -// return ( -//
-//
-// -// {siteConfig.title} -// -//

Open Telekom Cloud {siteConfig.tagline}

-//
-// -// Get Started -// -//
-//
-//
-// ); -// } +import HomepageMarketplace from '../components/HomepageMarketplace'; +import HomePageHeroPromo from '../components/HomePageHeroPromo'; +import HomePageNewArticles from '../components/HomePageNewArticles'; export default function Home(): JSX.Element { const { siteConfig } = useDocusaurusContext(); @@ -40,16 +15,28 @@ export default function Home(): JSX.Element { description={`${siteConfig.title}`}> {/* */}
- + +
+
+ +
+
+ -
+
+
+ +
+
+ +
- +
diff --git a/src/pages/markdown-page.md b/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b668..0000000000 --- a/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/src/pages/webinars.mdx b/src/pages/webinars.mdx deleted file mode 100644 index f0134266bb..0000000000 --- a/src/pages/webinars.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Webinars -description: webinars -hide_table_of_contents: true ---- - -import YouTubeWebinars from '@site/src/components/YouTubeWebinars'; - -# Webinars - -Welcome to our community-curated collection of webinars for Open Telekom Cloud. Here you'll find a variety of sessions created by our experts and our partners sharing practical knowledge, hands-on demos, -and insights around building with Open Telekom Cloud. Whether you're just getting started or exploring advanced use cases, these recordings are here to help you make the most of -Open Telekom Cloud and our partners solutions. - - - \ No newline at end of file diff --git a/src/theme/DocCard/index.tsx b/src/theme/DocCard/index.tsx index ee68d052f0..2a4104b2b4 100644 --- a/src/theme/DocCard/index.tsx +++ b/src/theme/DocCard/index.tsx @@ -20,6 +20,9 @@ import { File, FileStack } from 'lucide-react'; import styles from './styles.module.css'; +import { ODSCardQuickAction, ODSQuickActionCardPreferredContent } from '@telekom-ods/react-ui-kit'; + + function useCategoryItemsPlural() { const { selectMessage } = usePluralForm(); return (count: number) => @@ -49,6 +52,7 @@ export type CardLayoutProps = { icon: ReactNode; title: string; description?: string; + internal?: boolean; }; /** @@ -83,26 +87,37 @@ export function CardLayout({ icon, title, description, + internal, }: CardLayoutProps): JSX.Element { + const target = internal || internal === undefined ? '_self' : '_blank'; + return ( - - {/* Icon + one-line‐truncated title */} - - {icon} - {title} - - - {/* Description clamped to 3 lines (always 3 lines tall) */} - {description && ( -

- {description} -

- )} -
+
+ + + {/* {icon} */} + {title} +
+ } + titleType="text" + /> +
+ } + filled + href={href} + size="small" + target={target} + /> +
); } - function CardCategory({ item }: { item: PropSidebarItemCategory }): ReactNode { const href = findFirstSidebarItemLink(item); const categoryItemsPlural = useCategoryItemsPlural(); @@ -115,7 +130,7 @@ function CardCategory({ item }: { item: PropSidebarItemCategory }): ReactNode { return ( } + icon={} title={item.label} description={item.description ?? categoryItemsPlural(item.items.length)} /> @@ -126,12 +141,12 @@ function CardCategory({ item }: { item: PropSidebarItemCategory }): ReactNode { function CardLink({ item }: { item: PropSidebarItemLink }): ReactNode { const article = isInternalUrl(item.href) - const icon = article ? : ''; + const icon = article ? : ''; const doc = useDocById(item.docId ?? undefined); // temporarily suppress all sidebar links from being rendered if (!article) { - item.description = "For more information consult the Service & API Reference manuals in Open Telekom Cloud Help Center." + item.description = "For more information consult the Service & API Reference manuals in T Cloud Public Help Center." } return ( @@ -140,6 +155,7 @@ function CardLink({ item }: { item: PropSidebarItemLink }): ReactNode { icon={icon} title={item.label} description={item.description ?? doc?.description} + internal={article} /> ); } diff --git a/src/theme/DocCard/styles.module.css b/src/theme/DocCard/styles.module.css index 2e85d35791..03dd70fe96 100644 --- a/src/theme/DocCard/styles.module.css +++ b/src/theme/DocCard/styles.module.css @@ -63,4 +63,17 @@ html[data-theme='dark'] .cardContainer:hover { -webkit-line-clamp: 3; overflow: hidden; word-break: break-word; -} \ No newline at end of file +} + +.iconComponent { + margin-right: 8px; + /* flex-shrink: 0 !important; */ +} + +.quickActionWrapper__content { + width: 100%; + margin-bottom: 1rem; + + /* pick your fixed height */ + height: 132px; +} diff --git a/src/theme/DocTagDocListPage/index.tsx b/src/theme/DocTagDocListPage/index.tsx index e4e65517ff..cbb88baecb 100644 --- a/src/theme/DocTagDocListPage/index.tsx +++ b/src/theme/DocTagDocListPage/index.tsx @@ -1,18 +1,21 @@ // index.tsx -import Link from '@docusaurus/Link'; +import { translate } from '@docusaurus/Translate'; import { PageMetadata, HtmlClassNameProvider, ThemeClassNames, usePluralForm, } from '@docusaurus/theme-common'; -import Translate, { translate } from '@docusaurus/Translate'; import SearchMetadata from '@theme/SearchMetadata'; import type { Props } from '@theme/DocTagDocListPage'; import Heading from '@theme/Heading'; import { File, FlaskConical, Factory, FileCheck } from 'lucide-react'; import styles from './styles.module.css'; +import clsx from "clsx"; + +import { ODSButton, ODSCardQuickAction, ODSQuickActionCardPreferredContent } from '@telekom-ods/react-ui-kit'; + // Custom pluralization hook function useNDocsTaggedPlural() { @@ -56,21 +59,30 @@ function DocItem({ doc }: { doc: Props['tag']['items'][number] }): JSX.Element { : File; return ( -
-
-
- -
-
- - {doc.title} - - {doc.description && ( -

{doc.description}

- )} -
-
-
+
+ + + + {doc.title} +
+ } + titleType="text" + // tag1Props={{label: 'New props', type: 'strong'}} tag2Props={{label: 'V2', type: 'basic'}} + /> +
+ } + filled + href={doc.permalink} + size="small" + target="_self" + /> +
); } @@ -101,23 +113,30 @@ function DocTagDocListPageContent({
{title} {tag.description &&

{tag.description}

} - - - - View All Tags - - - - - - - Go to Portfolio Navigator - - +
+ + +
{tag.items.map((doc) => ( diff --git a/src/theme/DocTagDocListPage/styles.module.css b/src/theme/DocTagDocListPage/styles.module.css index 62fc4c5c73..6bb4ecb597 100644 --- a/src/theme/DocTagDocListPage/styles.module.css +++ b/src/theme/DocTagDocListPage/styles.module.css @@ -27,7 +27,7 @@ } .title:hover { - color: #e20074; + color: #e20074; } html[data-theme='dark'] .title:hover { @@ -41,7 +41,8 @@ html[data-theme='dark'] .title { .description { margin-top: 0px; font-size: 0.8rem; - line-height: 1.3rem; /* match your theme’s line-height */ + line-height: 1.3rem; + /* match your theme’s line-height */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; @@ -59,9 +60,21 @@ html[data-theme='dark'] .title { margin-bottom: 2rem; } -.viewAll { +.headerActions { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + align-items: center; +} +.iconComponent { + margin-right: 8px; + color: black; + filter: invert(0); + /* flex-shrink: 0 !important; */ } -.filtersSep{opacity:.5;padding:0 6px;user-select:none} +html[data-theme='dark'] .iconComponent { + filter: invert(1); +} diff --git a/src/theme/Navbar/Content/index.tsx b/src/theme/Navbar/Content/index.tsx index a76943209d..863b77f19b 100644 --- a/src/theme/Navbar/Content/index.tsx +++ b/src/theme/Navbar/Content/index.tsx @@ -1,10 +1,10 @@ -import {type ReactNode} from 'react'; -import {useThemeConfig, ErrorCauseBoundary} from '@docusaurus/theme-common'; +import { type ReactNode } from 'react'; +import { useThemeConfig, ErrorCauseBoundary } from '@docusaurus/theme-common'; import { splitNavbarItems, useNavbarMobileSidebar, } from '@docusaurus/theme-common/internal'; -import NavbarItem, {type Props as NavbarItemConfig} from '@theme/NavbarItem'; +import NavbarItem, { type Props as NavbarItemConfig } from '@theme/NavbarItem'; import NavbarColorModeToggle from '@theme/Navbar/ColorModeToggle'; import SearchBar from '@theme/SearchBar'; import NavbarMobileSidebarToggle from '@theme/Navbar/MobileSidebar/Toggle'; @@ -12,13 +12,14 @@ import NavbarLogo from '@theme/Navbar/Logo'; import NavbarSearch from '@theme/Navbar/Search'; import styles from './styles.module.css'; +import clsx from 'clsx'; function useNavbarItems() { // TODO temporary casting until ThemeConfig type is improved return useThemeConfig().navbar.items as NavbarItemConfig[]; } -function NavbarItems({items}: {items: NavbarItemConfig[]}): JSX.Element { +function NavbarItems({ items }: { items: NavbarItemConfig[] }): JSX.Element { return ( <> {items.map((item, i) => ( @@ -29,7 +30,7 @@ function NavbarItems({items}: {items: NavbarItemConfig[]}): JSX.Element { `A theme navbar item failed to render. Please double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config: ${JSON.stringify(item, null, 2)}`, - {cause: error}, + { cause: error }, ) }> @@ -47,7 +48,7 @@ function NavbarContentLayout({ right: ReactNode; }) { return ( -
+
{left}
{right}
diff --git a/src/theme/Navbar/Content/styles.module.css b/src/theme/Navbar/Content/styles.module.css index 4c9471e109..35918a66b8 100644 --- a/src/theme/Navbar/Content/styles.module.css +++ b/src/theme/Navbar/Content/styles.module.css @@ -6,3 +6,10 @@ Hide color mode toggle in small viewports display: none; } } + +/* .inner { + max-width: var(--ifm-container-width-xl); + margin: 0 auto; + padding: 0 var(--ifm-spacing-horizontal); + width: 100%; +} */ \ No newline at end of file diff --git a/src/theme/Navbar/Layout/index.tsx b/src/theme/Navbar/Layout/index.tsx index 16cad75d12..b8336617eb 100644 --- a/src/theme/Navbar/Layout/index.tsx +++ b/src/theme/Navbar/Layout/index.tsx @@ -52,19 +52,5 @@ export default function NavbarLayout({ children }: Props): JSX.Element { - - // - // - // - // Topic One - // - // - // ); } diff --git a/src/theme/NotFound/Content/index.tsx b/src/theme/NotFound/Content/index.tsx index 438dff73f6..ed696151ac 100644 --- a/src/theme/NotFound/Content/index.tsx +++ b/src/theme/NotFound/Content/index.tsx @@ -4,11 +4,16 @@ import type { Props } from '@theme/NotFound/Content'; import Heading from '@theme/Heading'; import styles from './styles.module.css'; +import { ODSButton } from '@telekom-ods/react-ui-kit'; +import { ODSIcon } from '@telekom-ods/react-icons'; + export default function NotFoundContent({ className }: Props): JSX.Element { return (
-
+
+ + +

- {/*

- - Please contact the owner of the site that linked you to the - original URL and let them know their link is broken. - -

*/} - - - - Go to Portfolio Navigator - - - - - - - View All Tags - - - - - - - Return Home - - +
+ + + + + +
+ +
diff --git a/src/theme/NotFound/Content/styles.module.css b/src/theme/NotFound/Content/styles.module.css index 11a4d450e2..556e203c7c 100644 --- a/src/theme/NotFound/Content/styles.module.css +++ b/src/theme/NotFound/Content/styles.module.css @@ -1 +1,20 @@ -.filtersSep{opacity:.5;padding:0 6px;user-select:none} +.filtersSep { + opacity: .5; + padding: 0 6px; + user-select: none +} + +.buttonGroup { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.buttonGroup .ODSButton { + width: 100%; +} + +.centerContent { + align-items: center; + justify-content: center; +} \ No newline at end of file diff --git a/src/theme/Root.js b/src/theme/Root.js index 59b6e16c35..2be94d83b4 100644 --- a/src/theme/Root.js +++ b/src/theme/Root.js @@ -1,5 +1,6 @@ import { defineCustomElements } from '@telekom/scale-components/loader'; import '@telekom/scale-components/dist/scale-components/scale-components.css'; +import "@telekom-ods/react-ui-kit/style.css"; defineCustomElements(); diff --git a/src/theme/Tag/index.tsx b/src/theme/Tag/index.tsx new file mode 100644 index 0000000000..d4b9257071 --- /dev/null +++ b/src/theme/Tag/index.tsx @@ -0,0 +1,35 @@ +import React, { type ReactNode } from 'react'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import type { Props } from '@theme/Tag'; + +import styles from './styles.module.css'; +import { ODSBadgeNumber, ODSTagStatic } from '@telekom-ods/react-ui-kit'; + +export default function Tag({ + permalink, + label, + count, + description, +}: Props): ReactNode { + return ( + + + + {count && ( + + + + )} + + ); +} \ No newline at end of file diff --git a/src/theme/Tag/styles.module.css b/src/theme/Tag/styles.module.css new file mode 100644 index 0000000000..b21fef6399 --- /dev/null +++ b/src/theme/Tag/styles.module.css @@ -0,0 +1,75 @@ +:root { + --docusaurus-tag-list-border: var(--ifm-color-emphasis-300); +} + +.tag { + border: 1px solid var(--docusaurus-tag-list-border); + transition: border var(--ifm-transition-fast); +} + +.tag:hover { + --docusaurus-tag-list-border: var(--ifm-link-color); + text-decoration: none; +} + +.tagRegular { + border-radius: var(--ifm-global-radius); + padding: 0.2rem 0.5rem 0.3rem; + font-size: 90%; +} + +.tagWithCount { + display: flex; + align-items: center; + position: relative; + padding: 0 0.5rem 0 1rem; + border-left: 0; +} + +.tagWithCount::before, +.tagWithCount::after { + content: ''; + position: absolute; + top: 50%; + border: 1px solid var(--docusaurus-tag-list-border); + transition: inherit; +} + +.tagWithCount::before { + right: 100%; + transform: translate(50%, -50%) rotate(-45deg); + width: 1.18rem; + height: 1.18rem; + border-right: 0; + border-bottom: 0; +} + +.tagWithCount::after { + left: 0; + transform: translateY(-50%); + width: 0.5rem; + height: 0.5rem; + border-radius: 50%; +} + +.tagWithCount span { + background: var(--ifm-color-secondary); + color: var(--ifm-color-black); + font-size: 0.7rem; + line-height: 1.2; + border-radius: var(--ifm-global-radius); + padding: 0.1rem 0.4rem; + margin-left: 0.3rem; +} + +.tagWrapper { + position: relative; + display: inline-block; +} + +.badge { + position: absolute; + top: -6px; + right: -6px; + transform: scale(1.0); +} diff --git a/static/img/TCloud_Public_en2.png b/static/img/TCloud_Public_en2.png new file mode 100644 index 0000000000..d8d117d27e Binary files /dev/null and b/static/img/TCloud_Public_en2.png differ diff --git a/static/img/assets/video/CardPromoVideo-CUxfusaj.mp4 b/static/img/assets/video/CardPromoVideo-CUxfusaj.mp4 new file mode 100644 index 0000000000..7c0cc6e518 Binary files /dev/null and b/static/img/assets/video/CardPromoVideo-CUxfusaj.mp4 differ diff --git a/static/img/assets/video/T_background_runway.jpg b/static/img/assets/video/T_background_runway.jpg new file mode 100644 index 0000000000..51d6e0817e Binary files /dev/null and b/static/img/assets/video/T_background_runway.jpg differ diff --git a/static/img/assets/video/T_background_wall.jpg b/static/img/assets/video/T_background_wall.jpg new file mode 100644 index 0000000000..6730118cc2 Binary files /dev/null and b/static/img/assets/video/T_background_wall.jpg differ diff --git a/static/img/assets/video/T_pattern_2023_abstract_tec_topview_hd.mp4 b/static/img/assets/video/T_pattern_2023_abstract_tec_topview_hd.mp4 new file mode 100644 index 0000000000..ee9edf1050 Binary files /dev/null and b/static/img/assets/video/T_pattern_2023_abstract_tec_topview_hd.mp4 differ diff --git a/static/img/assets/video/T_pattern_2023_abstract_tec_topview_rgb.jpg b/static/img/assets/video/T_pattern_2023_abstract_tec_topview_rgb.jpg new file mode 100644 index 0000000000..b958845105 Binary files /dev/null and b/static/img/assets/video/T_pattern_2023_abstract_tec_topview_rgb.jpg differ diff --git a/static/img/day_banner.png b/static/img/day_banner.png new file mode 100644 index 0000000000..21ed69b954 Binary files /dev/null and b/static/img/day_banner.png differ diff --git a/static/img/night_banner.png b/static/img/night_banner.png new file mode 100644 index 0000000000..ed77728feb Binary files /dev/null and b/static/img/night_banner.png differ diff --git a/static/img/services/CES.svg b/static/img/services/CES.svg deleted file mode 100644 index 5369a3b036..0000000000 --- a/static/img/services/CES.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - diff --git a/static/img/services/DDS.svg b/static/img/services/DDS.svg deleted file mode 100644 index 0f7833c63d..0000000000 --- a/static/img/services/DDS.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/static/img/services/RDS .svg b/static/img/services/RDS.svg similarity index 100% rename from static/img/services/RDS .svg rename to static/img/services/RDS.svg diff --git a/static/img/services/ces (1).svg b/static/img/services/ces.svg similarity index 100% rename from static/img/services/ces (1).svg rename to static/img/services/ces.svg diff --git a/static/img/services/config.svg b/static/img/services/config.svg new file mode 100644 index 0000000000..45d4260d9c --- /dev/null +++ b/static/img/services/config.svg @@ -0,0 +1 @@ + diff --git a/static/img/services/dds.svg b/static/img/services/dds.svg new file mode 100644 index 0000000000..935b4ba2f0 --- /dev/null +++ b/static/img/services/dds.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/services/ed.svg b/static/img/services/ed.svg new file mode 100644 index 0000000000..a2cd5af226 --- /dev/null +++ b/static/img/services/ed.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + diff --git a/static/img/services/geminidb.svg b/static/img/services/geminidb.svg new file mode 100644 index 0000000000..2795981dfe --- /dev/null +++ b/static/img/services/geminidb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/services/sd.svg b/static/img/services/sd.svg new file mode 100644 index 0000000000..e78b876724 --- /dev/null +++ b/static/img/services/sd.svg @@ -0,0 +1,32 @@ + + + + + + diff --git a/static/img/services/taurusdb.svg b/static/img/services/taurusdb.svg new file mode 100644 index 0000000000..a457c25d47 --- /dev/null +++ b/static/img/services/taurusdb.svg @@ -0,0 +1 @@ +GaussDB nosql diff --git a/static/img/templates/T_background_runway.jpg b/static/img/templates/T_background_runway.jpg new file mode 100644 index 0000000000..51d6e0817e Binary files /dev/null and b/static/img/templates/T_background_runway.jpg differ diff --git a/static/img/templates/T_background_wall.jpg b/static/img/templates/T_background_wall.jpg new file mode 100644 index 0000000000..6730118cc2 Binary files /dev/null and b/static/img/templates/T_background_wall.jpg differ diff --git a/static/img/templates/generic-telekom-bridge.jpg b/static/img/templates/generic-telekom-bridge.jpg new file mode 100644 index 0000000000..edc744c3a2 Binary files /dev/null and b/static/img/templates/generic-telekom-bridge.jpg differ diff --git a/static/img/templates/generic-template.png b/static/img/templates/generic-template.png new file mode 100644 index 0000000000..da4136fa98 Binary files /dev/null and b/static/img/templates/generic-template.png differ diff --git a/static/img/templates/jupyterhub.png b/static/img/templates/jupyterhub.png new file mode 100644 index 0000000000..14b6294af0 Binary files /dev/null and b/static/img/templates/jupyterhub.png differ diff --git a/static/img/templates/keycloak.png b/static/img/templates/keycloak.png new file mode 100644 index 0000000000..0a69822597 Binary files /dev/null and b/static/img/templates/keycloak.png differ diff --git a/static/img/templates/letsencrypt.png b/static/img/templates/letsencrypt.png new file mode 100644 index 0000000000..8eebc4a98d Binary files /dev/null and b/static/img/templates/letsencrypt.png differ diff --git a/static/img/templates/msentraid.png b/static/img/templates/msentraid.png new file mode 100644 index 0000000000..80db9455d4 Binary files /dev/null and b/static/img/templates/msentraid.png differ diff --git a/static/img/templates/nextcloud.png b/static/img/templates/nextcloud.png new file mode 100644 index 0000000000..7dfb5692dd Binary files /dev/null and b/static/img/templates/nextcloud.png differ diff --git a/static/img/templates/nvidia.png b/static/img/templates/nvidia.png new file mode 100644 index 0000000000..81c1ef3331 Binary files /dev/null and b/static/img/templates/nvidia.png differ diff --git a/static/img/templates/opendesk.png b/static/img/templates/opendesk.png new file mode 100644 index 0000000000..f12efa8657 Binary files /dev/null and b/static/img/templates/opendesk.png differ diff --git a/static/img/templates/openshift.png b/static/img/templates/openshift.png new file mode 100644 index 0000000000..26e2f86dde Binary files /dev/null and b/static/img/templates/openshift.png differ diff --git a/static/img/templates/prometheus.png b/static/img/templates/prometheus.png new file mode 100644 index 0000000000..e1d46eb5c3 Binary files /dev/null and b/static/img/templates/prometheus.png differ diff --git a/static/img/templates/telekom-4-quads.png b/static/img/templates/telekom-4-quads.png new file mode 100644 index 0000000000..147df1196d Binary files /dev/null and b/static/img/templates/telekom-4-quads.png differ diff --git a/static/img/templates/telekom.png b/static/img/templates/telekom.png new file mode 100644 index 0000000000..2a2e627174 Binary files /dev/null and b/static/img/templates/telekom.png differ diff --git a/telemetry.config.js b/telemetry.config.js new file mode 100644 index 0000000000..1e5be14af2 --- /dev/null +++ b/telemetry.config.js @@ -0,0 +1,8 @@ +// Auto-generated by @telekom-ods/react-ui-kit postinstall +// Adjust values as needed. Import this file once in your app entry (e.g. src/main.tsx). +window.__ODS_TELEMETRY__ = { projectName: "docs-next", includePath: true, disableTelemetry: false, }; +window.__ODS_TELEMETRY_ENDPOINT__ = "https://ods-telemetry-server.dev.oa.yo-digital.com/telemetry"; +window.__ODS_TELEMETRY_API_KEY__ = "pk_2fa5bb985cb82193e5291d6b838da57bc48e81e1ae3edeb18d08af202f60b586"; + +// To disable telemetry at runtime set: +// window._DISABLE_TELEMETRY_ = true; diff --git a/yarn.lock b/yarn.lock index ec5f68d906..a47a9cddc9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2395,25 +2395,41 @@ "@eslint/core" "^0.15.2" levn "^0.4.1" -"@floating-ui/core@^1.0.0": - version "1.6.0" - resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz" - integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== +"@floating-ui/core@^1.7.4": + version "1.7.4" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz" + integrity sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg== dependencies: - "@floating-ui/utils" "^0.2.1" + "@floating-ui/utils" "^0.2.10" -"@floating-ui/dom@^1.2.8": - version "1.6.3" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz" - integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== +"@floating-ui/dom@^1.2.8", "@floating-ui/dom@^1.7.5": + version "1.7.5" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz" + integrity sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg== dependencies: - "@floating-ui/core" "^1.0.0" - "@floating-ui/utils" "^0.2.0" + "@floating-ui/core" "^1.7.4" + "@floating-ui/utils" "^0.2.10" -"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": - version "0.2.1" - resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz" - integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@floating-ui/react-dom@^2.1.2": + version "2.1.7" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz" + integrity sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg== + dependencies: + "@floating-ui/dom" "^1.7.5" + +"@floating-ui/react@0.26.28": + version "0.26.28" + resolved "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz" + integrity sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== + dependencies: + "@floating-ui/react-dom" "^2.1.2" + "@floating-ui/utils" "^0.2.8" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.10", "@floating-ui/utils@^0.2.8": + version "0.2.10" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz" + integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ== "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" @@ -2558,6 +2574,11 @@ "@jsonjoy.com/buffers" "^1.0.0" "@jsonjoy.com/codegen" "^1.0.0" +"@kurkle/color@^0.3.0": + version "0.3.4" + resolved "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz" + integrity sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w== + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.5" resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz" @@ -2651,6 +2672,18 @@ resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz" integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== +"@radix-ui/react-compose-refs@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz" + integrity sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw== + +"@radix-ui/react-slot@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz" + integrity sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ== + dependencies: + "@radix-ui/react-compose-refs" "1.1.1" + "@sideway/address@^4.1.5": version "4.1.5" resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz" @@ -2815,6 +2848,40 @@ dependencies: defer-to-connect "^2.0.1" +"@telekom-ods/design-tokens-base@2.0.1": + version "2.0.1" + resolved "https://artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/@telekom-ods/design-tokens-base/-/@telekom-ods/design-tokens-base-2.0.1.tgz" + integrity sha512-WEJHKYfWvVHO5JJX9KeeDE1cuV/LjzhksKynm9nSrxrVnAdbMLOVpyC1eYyBP7tk7m7/8kEGy3wu4/bZ1ZvXGA== + +"@telekom-ods/design-tokens@2.1.0": + version "2.1.0" + resolved "https://artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/@telekom-ods/design-tokens/-/@telekom-ods/design-tokens-2.1.0.tgz" + integrity sha512-WJwiIC4jlbACndYU1wTkFE2r81nQoPTEj3EyUPr7dcyTHNDKpNH9ahz+G+vOgkUbPW2f9KirFrEZ7wrpet/qGA== + +"@telekom-ods/react-icons@1.0.4": + version "1.0.4" + resolved "https://artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/@telekom-ods/react-icons/-/@telekom-ods/react-icons-1.0.4.tgz" + integrity sha512-Qm4OSReMJoonsD66fsYExDWNHfwEI6Qc8ilScuY4WRC1OJYaDvCDgWJ4nSFIH4RjEBOiq6ct4nM7UsH2vBCfZg== + dependencies: + classnames "^2.5.1" + +"@telekom-ods/react-ui-kit@^2.5.2": + version "2.5.2" + resolved "https://artifactory.devops.telekom.de/artifactory/api/npm/one-design-system-npm/@telekom-ods/react-ui-kit/-/@telekom-ods/react-ui-kit-2.5.2.tgz" + integrity sha512-GXwMndBDzSvhFmfj3iGRKWRI9bC1tZrYesN3wV6vvz8a9kto2Ph8IUhGIU9Zp/gjO+ajcIrf6Fv9AFtJqG2Iqg== + dependencies: + "@floating-ui/react" "0.26.28" + "@radix-ui/react-slot" "1.1.2" + "@telekom-ods/design-tokens" "2.1.0" + "@telekom-ods/design-tokens-base" "2.0.1" + "@telekom-ods/react-icons" "1.0.4" + chart.js "^4.5.0" + dayjs "1.11.13" + react-chartjs-2 "5.3.0" + react-intersection-observer "9.16.0" + scrollyfills "1.0.3" + tocbot "4.35.0" + "@telekom/design-tokens@1.0.0-beta.10": version "1.0.0-beta.10" resolved "https://registry.npmjs.org/@telekom/design-tokens/-/design-tokens-1.0.0-beta.10.tgz" @@ -3787,9 +3854,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== baseline-browser-mapping@^2.8.9: - version "2.8.10" - resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.10.tgz" - integrity sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA== + version "2.10.0" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz" + integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== batch@0.6.1: version "0.6.1" @@ -3998,9 +4065,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001746: - version "1.0.30001746" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz" - integrity sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA== + version "1.0.30001778" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz" + integrity sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg== ccount@^2.0.0: version "2.0.1" @@ -4045,6 +4112,13 @@ character-reference-invalid@^2.0.0: resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== +chart.js@^4.1.1, chart.js@^4.5.0: + version "4.5.1" + resolved "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz" + integrity sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw== + dependencies: + "@kurkle/color" "^0.3.0" + cheerio-select@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" @@ -4095,7 +4169,7 @@ ci-info@^3.2.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -classnames@^2.2.6: +classnames@^2.2.6, classnames@^2.5.1: version "2.5.1" resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== @@ -4571,6 +4645,11 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" +dayjs@1.11.13: + version "1.11.13" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + debounce@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" @@ -9018,7 +9097,12 @@ rc@1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^18.3.1, "react-dom@>= 16.8.0 < 19.0.0", "react-dom@>= 16.8.0 < 20.0.0", react-dom@>=16.13.1: +react-chartjs-2@5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.0.tgz" + integrity sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw== + +react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^18.3.1, "react-dom@>= 16.8.0 < 19.0.0", "react-dom@>= 16.8.0 < 20.0.0", react-dom@>=16.13.1, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=18: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -9042,6 +9126,11 @@ react-fast-compare@^3.2.0: react-fast-compare "^3.2.0" shallowequal "^1.1.0" +react-intersection-observer@9.16.0: + version "9.16.0" + resolved "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.16.0.tgz" + integrity sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA== + react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" @@ -9101,7 +9190,7 @@ react-router@^5.3.4, react-router@>=5, react-router@5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react@*, "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", react@^18.3.1, "react@>= 16.8.0 < 19.0.0", "react@>= 16.8.0 < 20.0.0", react@>=15, react@>=16, react@>=16.0.0, react@>=16.13.1: +react@*, "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", react@^18.3.1, "react@>= 16.8.0 < 19.0.0", "react@>= 16.8.0 < 20.0.0", react@>=15, react@>=16, react@>=16.0.0, react@>=16.13.1, react@>=16.8, react@>=16.8.0, react@>=18: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -9527,6 +9616,11 @@ schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.2.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +scrollyfills@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/scrollyfills/-/scrollyfills-1.0.3.tgz" + integrity sha512-lJCEJbk/o8BFJbJYKyQn1njf9o3U6O9mDpM8gOAsA+yKbXk6gFClfsChnbPPm1eb4pjaJmSwxka5im0cBoKefw== + "search-insights@>= 1 < 3": version "2.17.3" resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz" @@ -10116,6 +10210,11 @@ swr@^2.2.5: dequal "^2.0.3" use-sync-external-store "^1.4.0" +tabbable@^6.0.0: + version "6.4.0" + resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz" + integrity sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg== + tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" @@ -10179,6 +10278,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tocbot@4.35.0: + version "4.35.0" + resolved "https://registry.npmjs.org/tocbot/-/tocbot-4.35.0.tgz" + integrity sha512-i8FoSaP3u60D94e/dtzCk23PIEBnc/l8XqvlK4g8gUCa9XFY4RmyMLYP6X+yN+ljcEijFbmCtNHtBoeTsQkCPg== + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz"