Compare commits
3 Commits
2c1949bf1e
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec97e1097c | ||
|
|
fce31ebcd7 | ||
|
|
118809bfae |
13
CHANGELOG.md
@@ -1,5 +1,18 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.7.0 - 2026-04-24
|
||||||
|
|
||||||
|
- Added template typing so approved templates can represent either QEMU VMs or LXC containers.
|
||||||
|
- Added LXC template discovery from Proxmox storage `vztmpl` content in the admin template manager.
|
||||||
|
- Added live LXC container provisioning through the Proxmox API with configurable rootfs storage and optional DHCP bridge.
|
||||||
|
- Routed start, stop, delete, expiration, status, and IP refresh operations through typed Proxmox VM/LXC API paths.
|
||||||
|
- Added Proxmox tags to newly created VMs and containers, including a sanitized per-user tag for easier PVE administration.
|
||||||
|
- Updated the admin and portal UI to show VM versus LXC template/deployment types and generic Proxmox resource IDs.
|
||||||
|
- Added schema upgrades for template provisioning type, LXC template references, and deployment resource type.
|
||||||
|
- Hardened admin template/settings saves against array-shaped POST values.
|
||||||
|
- Kept QEMU template management usable if the Proxmox token cannot list LXC-capable storages.
|
||||||
|
- Documented LXC setup, storage permissions, and the new Proxmox settings.
|
||||||
|
|
||||||
## 0.6.0 - 2026-04-24
|
## 0.6.0 - 2026-04-24
|
||||||
|
|
||||||
- Added deployment sharing with a dedicated `wp_spp_deployment_shares` table.
|
- Added deployment sharing with a dedicated `wp_spp_deployment_shares` table.
|
||||||
|
|||||||
64
README.md
@@ -1,6 +1,6 @@
|
|||||||
# Support Provisioning Portal
|
# Support Provisioning Portal
|
||||||
|
|
||||||
Internal WordPress plugin for support staff to provision standardized Proxmox VE VMs without direct Proxmox access.
|
Internal WordPress plugin for support staff to provision standardized Proxmox VE VMs and LXC containers without direct Proxmox access.
|
||||||
|
|
||||||
The application runs as a WordPress plugin and exposes both:
|
The application runs as a WordPress plugin and exposes both:
|
||||||
|
|
||||||
@@ -35,12 +35,12 @@ The application runs as a WordPress plugin and exposes both:
|
|||||||
- Audit log rows for every mutating action
|
- Audit log rows for every mutating action
|
||||||
- Optional `Never expire` deployments
|
- Optional `Never expire` deployments
|
||||||
- Per-user and global RAM contingents
|
- Per-user and global RAM contingents
|
||||||
- IP address display for deployments when available from the mock adapter or Proxmox guest agent
|
- IP address display for deployments when available from the mock adapter, Proxmox guest agent, or LXC interfaces
|
||||||
- Manual IP refresh action for deployments
|
- Manual IP refresh action for deployments
|
||||||
- Non-destructive expiration: expired VMs are stopped and locked, not deleted
|
- Non-destructive expiration: expired VMs and containers are stopped and locked, not deleted
|
||||||
- Plugin-owned per-user rights for portal access, lifecycle actions, settings, and user-rights management
|
- Plugin-owned per-user rights for portal access, lifecycle actions, settings, and user-rights management
|
||||||
- Admin-panel user rights management for WordPress and SSO-created users
|
- Admin-panel user rights management for WordPress and SSO-created users
|
||||||
- Admin-panel template management for importing QEMU templates from the configured Proxmox node
|
- Admin-panel template management for importing QEMU VM and LXC templates from the configured Proxmox node
|
||||||
- Owner/private deployment visibility with explicit per-deployment sharing
|
- Owner/private deployment visibility with explicit per-deployment sharing
|
||||||
- Minimal admin/frontend UI for:
|
- Minimal admin/frontend UI for:
|
||||||
- deployment dashboard
|
- deployment dashboard
|
||||||
@@ -108,9 +108,9 @@ Deployment creation supports either a TTL in hours or **Never expire**.
|
|||||||
When a deployment reaches its TTL:
|
When a deployment reaches its TTL:
|
||||||
|
|
||||||
- WordPress cron and REST requests detect the expiration.
|
- WordPress cron and REST requests detect the expiration.
|
||||||
- The plugin attempts to stop the VM.
|
- The plugin attempts to stop the VM or container.
|
||||||
- The deployment status becomes `EXPIRED`.
|
- The deployment status becomes `EXPIRED`.
|
||||||
- The VM cannot be started again until the user prolongs its TTL.
|
- The deployment cannot be started again until the user prolongs its TTL.
|
||||||
- The user can either prolong the TTL or delete the deployment.
|
- The user can either prolong the TTL or delete the deployment.
|
||||||
- Deleted deployments are hidden from the active deployment list, but audit rows remain.
|
- Deleted deployments are hidden from the active deployment list, but audit rows remain.
|
||||||
|
|
||||||
@@ -125,9 +125,9 @@ Per-user overrides are available in the **User Rights** section on the **Support
|
|||||||
|
|
||||||
## IP Addresses
|
## IP Addresses
|
||||||
|
|
||||||
Deployments include an `ipAddresses` field in REST responses and show those addresses in the UI. In mock mode, deterministic documentation-range IPs are assigned. In HTTP mode, the plugin reads IPs from the Proxmox guest-agent `network-get-interfaces` endpoint when available.
|
Deployments include an `ipAddresses` field in REST responses and show those addresses in the UI. In mock mode, deterministic documentation-range IPs are assigned. In HTTP mode, the plugin reads VM IPs from the Proxmox guest-agent `network-get-interfaces` endpoint when available and reads LXC IPs from the container interfaces endpoint.
|
||||||
|
|
||||||
If the guest agent reports IPs only after boot, use **Refresh IPs** in the deployment detail view.
|
If IPs are reported only after boot, use **Refresh IPs** in the deployment detail view.
|
||||||
|
|
||||||
## Proxmox Settings
|
## Proxmox Settings
|
||||||
|
|
||||||
@@ -138,6 +138,8 @@ The plugin defaults to mock mode. Configure live Proxmox access from the **Suppo
|
|||||||
- Token ID, for example `user@realm!token-name`
|
- Token ID, for example `user@realm!token-name`
|
||||||
- Token Secret. The saved secret is not rendered back into the settings form; leave the field blank to keep it unchanged.
|
- Token Secret. The saved secret is not rendered back into the settings form; leave the field blank to keep it unchanged.
|
||||||
- Node, for example `pve-01`
|
- Node, for example `pve-01`
|
||||||
|
- LXC rootfs storage, for example `local-lvm`. This is required before live LXC deployments can be created.
|
||||||
|
- LXC network bridge, for example `vmbr0`. Leave empty if containers should be created without an automatic DHCP `net0`.
|
||||||
|
|
||||||
No Proxmox secrets are committed to the repository.
|
No Proxmox secrets are committed to the repository.
|
||||||
|
|
||||||
@@ -147,16 +149,17 @@ Use this section when moving from mock mode to a real Proxmox VE node.
|
|||||||
|
|
||||||
### 1. Prepare Proxmox Templates
|
### 1. Prepare Proxmox Templates
|
||||||
|
|
||||||
The plugin only provisions from approved templates. Proxmox remains the source for actual VM templates, while the plugin stores an approved template policy row with display name, OS type, CPU, RAM, disk, default TTL, and Proxmox template VMID.
|
The plugin only provisions from approved templates. Proxmox remains the source for actual QEMU VM templates and LXC OS templates, while the plugin stores an approved template policy row with display name, OS type, CPU, RAM, disk, default TTL, template type, and either a Proxmox template VMID or an LXC `ostemplate` reference.
|
||||||
|
|
||||||
Open the **Templates** section on the **Support Provisioning** admin page to:
|
Open the **Templates** section on the **Support Provisioning** admin page to:
|
||||||
|
|
||||||
- see approved plugin templates
|
- see approved plugin templates
|
||||||
- import QEMU templates from the configured Proxmox node
|
- import QEMU VM templates from the configured Proxmox node
|
||||||
|
- import LXC templates from the configured node's storage `vztmpl` content
|
||||||
- edit the policy values used during provisioning
|
- edit the policy values used during provisioning
|
||||||
- remove templates from new provisioning without breaking historical deployment records
|
- remove templates from new provisioning without breaking historical deployment records
|
||||||
|
|
||||||
The plugin lists QEMU templates from the configured node via the Proxmox API. It does not provision from LXC templates.
|
The plugin lists QEMU templates from `/nodes/{node}/qemu` and LXC templates from storage content with `content=vztmpl`.
|
||||||
|
|
||||||
Seeded example template IDs:
|
Seeded example template IDs:
|
||||||
|
|
||||||
@@ -166,9 +169,9 @@ Seeded example template IDs:
|
|||||||
| Windows Support Client | `9002` |
|
| Windows Support Client | `9002` |
|
||||||
| Linux Utility VM | `9003` |
|
| Linux Utility VM | `9003` |
|
||||||
|
|
||||||
The fastest first test is to create one real Proxmox QEMU template, then import it from **Support Provisioning > Templates**.
|
The fastest first test is to create one real Proxmox QEMU template or download one LXC OS template, then import it from **Support Provisioning > Templates**.
|
||||||
|
|
||||||
Template requirements:
|
QEMU template requirements:
|
||||||
|
|
||||||
- The VM must be converted to a Proxmox template.
|
- The VM must be converted to a Proxmox template.
|
||||||
- The template must exist on the Proxmox node configured in the plugin.
|
- The template must exist on the Proxmox node configured in the plugin.
|
||||||
@@ -176,6 +179,13 @@ Template requirements:
|
|||||||
- CPU and memory are set by the plugin after clone based on the approved template policy row.
|
- CPU and memory are set by the plugin after clone based on the approved template policy row.
|
||||||
- For IP address display, install and enable `qemu-guest-agent` inside the guest and enable the guest agent option on the VM/template.
|
- For IP address display, install and enable `qemu-guest-agent` inside the guest and enable the guest agent option on the VM/template.
|
||||||
|
|
||||||
|
LXC template requirements:
|
||||||
|
|
||||||
|
- The OS template must be visible as `vztmpl` storage content on the configured Proxmox node.
|
||||||
|
- Configure **LXC rootfs storage** in the plugin before deploying live containers.
|
||||||
|
- Configure **LXC network bridge** if containers should receive a DHCP `eth0` during creation.
|
||||||
|
- The rootfs storage must have enough free capacity for the approved template disk size.
|
||||||
|
|
||||||
### 2. Create A Dedicated Proxmox API User
|
### 2. Create A Dedicated Proxmox API User
|
||||||
|
|
||||||
In Proxmox, create a dedicated user instead of using `root@pam` for the plugin.
|
In Proxmox, create a dedicated user instead of using `root@pam` for the plugin.
|
||||||
@@ -214,12 +224,16 @@ The plugin needs permissions for:
|
|||||||
|
|
||||||
- getting the next VMID
|
- getting the next VMID
|
||||||
- listing QEMU templates on the configured node
|
- listing QEMU templates on the configured node
|
||||||
|
- listing LXC template content on the node's storages
|
||||||
- cloning a template VM
|
- cloning a template VM
|
||||||
|
- creating LXC containers from an OS template
|
||||||
- changing CPU and memory after clone
|
- changing CPU and memory after clone
|
||||||
- starting and stopping VMs
|
- setting Proxmox tags on created VMs and containers
|
||||||
- deleting VMs
|
- starting and stopping VMs and containers
|
||||||
- reading VM status
|
- deleting VMs and containers
|
||||||
|
- reading VM and container status
|
||||||
- reading guest-agent network interfaces for IP display
|
- reading guest-agent network interfaces for IP display
|
||||||
|
- reading LXC interfaces for IP display
|
||||||
|
|
||||||
Practical first-test option:
|
Practical first-test option:
|
||||||
|
|
||||||
@@ -236,7 +250,7 @@ pveum aclmod /storage/local-lvm -user wp-support@pve -role PVEDatastoreAdmin
|
|||||||
For a tighter production setup, create a custom role with only the required privileges and assign it to the API token or user:
|
For a tighter production setup, create a custom role with only the required privileges and assign it to the API token or user:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pveum role add SupportProvisioner -privs "VM.Allocate VM.Audit VM.Clone VM.Config.CPU VM.Config.Memory VM.PowerMgmt Datastore.AllocateSpace Datastore.Audit Sys.Audit"
|
pveum role add SupportProvisioner -privs "VM.Allocate VM.Audit VM.Clone VM.Config.CPU VM.Config.Disk VM.Config.Memory VM.Config.Network VM.Config.Options VM.PowerMgmt Datastore.AllocateSpace Datastore.Audit Sys.Audit"
|
||||||
pveum aclmod / -user wp-support@pve -role SupportProvisioner
|
pveum aclmod / -user wp-support@pve -role SupportProvisioner
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -268,6 +282,8 @@ In WordPress admin, open **Support Provisioning** and use the **Proxmox Settings
|
|||||||
| Token ID | `wp-support@pve!support-portal` |
|
| Token ID | `wp-support@pve!support-portal` |
|
||||||
| Token Secret | token secret from Proxmox |
|
| Token Secret | token secret from Proxmox |
|
||||||
| Node | Proxmox node name, for example `pve-01` |
|
| Node | Proxmox node name, for example `pve-01` |
|
||||||
|
| LXC rootfs storage | target container rootfs storage, for example `local-lvm` |
|
||||||
|
| LXC network bridge | bridge for DHCP `net0`, for example `vmbr0` |
|
||||||
|
|
||||||
The **Node** value must match the Proxmox node name exactly as shown in the Proxmox UI under **Datacenter**.
|
The **Node** value must match the Proxmox node name exactly as shown in the Proxmox UI under **Datacenter**.
|
||||||
|
|
||||||
@@ -278,9 +294,10 @@ Before creating a deployment:
|
|||||||
- Confirm WordPress can reach Proxmox on TCP `8006`.
|
- Confirm WordPress can reach Proxmox on TCP `8006`.
|
||||||
- Confirm the Proxmox base URL opens from the WordPress server.
|
- Confirm the Proxmox base URL opens from the WordPress server.
|
||||||
- Confirm the configured node name is exact.
|
- Confirm the configured node name is exact.
|
||||||
- Confirm the selected plugin template points to a real Proxmox template VMID.
|
- Confirm the selected plugin template points to a real Proxmox template VMID or visible LXC `vztmpl` item.
|
||||||
- Confirm the token has clone, VM config, power, delete, audit, and datastore permissions.
|
- For LXC tests, confirm **LXC rootfs storage** is configured.
|
||||||
- Confirm target storage has enough capacity for a full clone.
|
- Confirm the token has clone/create, VM config, power, delete, audit, and datastore permissions.
|
||||||
|
- Confirm target storage has enough capacity for the VM clone or LXC rootfs.
|
||||||
- Confirm RAM contingents in WordPress are not blocking the selected template.
|
- Confirm RAM contingents in WordPress are not blocking the selected template.
|
||||||
|
|
||||||
Then test in this order:
|
Then test in this order:
|
||||||
@@ -302,16 +319,17 @@ Then test in this order:
|
|||||||
| `Missing Proxmox HTTP configuration` | One of Base URL, Token ID, Token Secret, or Node is empty. |
|
| `Missing Proxmox HTTP configuration` | One of Base URL, Token ID, Token Secret, or Node is empty. |
|
||||||
| `Proxmox request failed with HTTP 401` | Token ID/secret is wrong, token was deleted, or the secret was copied incorrectly. |
|
| `Proxmox request failed with HTTP 401` | Token ID/secret is wrong, token was deleted, or the secret was copied incorrectly. |
|
||||||
| `Proxmox request failed with HTTP 403` | Token exists but lacks permissions for clone/config/power/delete/storage. |
|
| `Proxmox request failed with HTTP 403` | Token exists but lacks permissions for clone/config/power/delete/storage. |
|
||||||
| `Proxmox request failed with HTTP 404` | Node name or template VMID is wrong, or the template is on a different node. |
|
| `Proxmox request failed with HTTP 404` | Node name, template VMID, or LXC template reference is wrong, or the template is on a different node/storage. |
|
||||||
|
| `Missing LXC rootfs storage configuration` | An LXC template was selected but no target rootfs storage is configured in plugin settings. |
|
||||||
| SSL/cURL certificate error | WordPress/PHP does not trust the Proxmox certificate. |
|
| SSL/cURL certificate error | WordPress/PHP does not trust the Proxmox certificate. |
|
||||||
| Deployment created but no IPs | Guest agent is missing, disabled, not running, or the VM has not finished booting. |
|
| Deployment created but no IPs | Guest agent is missing/disabled for a VM, the VM/container has not finished booting, or the LXC bridge/DHCP path is not configured. |
|
||||||
| Start is blocked | Deployment is `EXPIRED`; prolong the TTL first. |
|
| Start is blocked | Deployment is `EXPIRED`; prolong the TTL first. |
|
||||||
|
|
||||||
## Design Notes
|
## Design Notes
|
||||||
|
|
||||||
- Templates are the only provisioning path.
|
- Templates are the only provisioning path.
|
||||||
- Resource limits come from approved templates, not user input.
|
- Resource limits come from approved templates, not user input.
|
||||||
- Deployment lifecycle operations are routed through a dedicated Proxmox client interface.
|
- Deployment lifecycle operations are routed through a dedicated Proxmox client interface and include the stored resource type so VM and LXC actions use the correct Proxmox API path.
|
||||||
- Live Proxmox access can be replaced or expanded without changing REST or UI code.
|
- Live Proxmox access can be replaced or expanded without changing REST or UI code.
|
||||||
- WordPress users are used as actors for audit logging. Portal permissions are assigned per user inside the plugin so users created by SSO or external identity providers do not need WordPress author/editor roles.
|
- WordPress users are used as actors for audit logging. Portal permissions are assigned per user inside the plugin so users created by SSO or external identity providers do not need WordPress author/editor roles.
|
||||||
|
|
||||||
|
|||||||
36
obyte-qa-tool/README.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# o-Byte QA Tool WordPress Plugin
|
||||||
|
|
||||||
|
WordPress plugin version of the legacy `qa-tool` app.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Frontend shortcode: `[obyte_qa_tool]`
|
||||||
|
- WordPress backend settings for GitLab and DocBee configuration
|
||||||
|
- GitLab template loading through a WordPress REST proxy
|
||||||
|
- GitLab template writeback through WordPress REST, using only the token saved in the backend
|
||||||
|
- Local YAML/JSON template loading
|
||||||
|
- Full YAML parsing through `js-yaml` with a small built-in fallback parser
|
||||||
|
- Editable QA steps and groups with drag and drop
|
||||||
|
- Required-step validation
|
||||||
|
- Run save/load as JSON
|
||||||
|
- Markdown, CSV, printable PDF, and YAML template export
|
||||||
|
- Combined export: DocBee post, WordPress database storage, and protected PDF storage
|
||||||
|
- DocBee ticket posting through a server-side REST endpoint with optional ticket-status restoration
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
1. Copy or keep the `obyte-qa-tool` folder in `wp-content/plugins/`.
|
||||||
|
2. Activate **o-Byte QA Tool** in WordPress.
|
||||||
|
3. Open **QA Tool > Settings**.
|
||||||
|
4. Enter GitLab and DocBee settings. Secrets are stored as WordPress options and are not exposed to frontend JavaScript.
|
||||||
|
5. Add `[obyte_qa_tool]` to the page where the QA runner should appear.
|
||||||
|
6. Saved exports can be reviewed under **QA Tool > Reports**.
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Access control is expected to be handled by the site/OAuth tag layer before the shortcode is shown.
|
||||||
|
- The REST endpoints require a logged-in WordPress session, but no plugin-owned capability setting.
|
||||||
|
- GitLab and DocBee credentials are never hardcoded; secrets must be entered and stored through the backend settings.
|
||||||
|
- Reports are stored in WordPress-owned custom tables: `wp_obyte_qa_reports` and `wp_obyte_qa_steps` using the active site prefix.
|
||||||
|
- Exported PDFs are stored in protected plugin storage when enabled. Backend report links are short-lived one-time links.
|
||||||
|
- Client-side PDF generation uses jsPDF/AutoTable CDNs, matching the standalone tool's browser-based export model.
|
||||||
831
obyte-qa-tool/assets/css/qa-tool.css
Normal file
@@ -0,0 +1,831 @@
|
|||||||
|
@font-face {
|
||||||
|
font-family: "OByte Nunito";
|
||||||
|
src: url("../fonts/Nunito-VariableFont_wght.ttf") format("truetype");
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 200 900;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "OByte Gothic Demi";
|
||||||
|
src: url("../fonts/urw_gothic_l_demi.ttf") format("truetype");
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obyte-qa-tool-shell,
|
||||||
|
.obyte-qa-tool,
|
||||||
|
.obyte-qa-tool * {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obyte-qa-tool-shell {
|
||||||
|
width: 100vw;
|
||||||
|
max-width: 100vw;
|
||||||
|
margin-left: calc(50% - 50vw);
|
||||||
|
margin-right: calc(50% - 50vw);
|
||||||
|
padding: 0 clamp(16px, 3vw, 34px);
|
||||||
|
overflow-x: clip;
|
||||||
|
background: #f5fbfe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obyte-qa-tool {
|
||||||
|
--oqt-blue: #00a7e6;
|
||||||
|
--oqt-blue-soft: #33b9eb;
|
||||||
|
--oqt-blue-ink: #00648a;
|
||||||
|
--oqt-bg: #f5fbfe;
|
||||||
|
--oqt-surface: #ffffff;
|
||||||
|
--oqt-surface-soft: #f6fafc;
|
||||||
|
--oqt-line: #dbe6ec;
|
||||||
|
--oqt-line-strong: #c4d2da;
|
||||||
|
--oqt-text: #343537;
|
||||||
|
--oqt-text-soft: #68737c;
|
||||||
|
--oqt-text-faint: #89949d;
|
||||||
|
--oqt-success: #188f5c;
|
||||||
|
--oqt-warning: #f59c00;
|
||||||
|
--oqt-danger: #c43b3b;
|
||||||
|
--oqt-muted: #67717a;
|
||||||
|
--oqt-focus: 0 0 0 3px rgba(0, 167, 230, 0.28);
|
||||||
|
width: min(1240px, 100%);
|
||||||
|
max-width: 100%;
|
||||||
|
margin: 0 auto;
|
||||||
|
overflow: visible;
|
||||||
|
border: 1px solid var(--oqt-line);
|
||||||
|
border-radius: 8px;
|
||||||
|
background: var(--oqt-surface);
|
||||||
|
color: var(--oqt-text);
|
||||||
|
font-family: "OByte Nunito", "Segoe UI", Arial, sans-serif;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 1.45;
|
||||||
|
box-shadow: 0 18px 42px rgba(52, 53, 55, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.obyte-qa-tool-notice {
|
||||||
|
max-width: 920px;
|
||||||
|
margin: 0 auto;
|
||||||
|
border: 1px solid rgba(0, 167, 230, 0.4);
|
||||||
|
border-radius: 8px;
|
||||||
|
background: rgba(0, 167, 230, 0.1);
|
||||||
|
color: #343537;
|
||||||
|
padding: 14px 16px;
|
||||||
|
font-family: "OByte Nunito", "Segoe UI", Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obyte-qa-tool-notice a {
|
||||||
|
color: var(--oqt-blue-ink);
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-header {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: minmax(0, 1fr) auto;
|
||||||
|
gap: 20px;
|
||||||
|
align-items: center;
|
||||||
|
padding: 20px 22px;
|
||||||
|
border-radius: 8px 8px 0 0;
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.12);
|
||||||
|
background: linear-gradient(135deg, #343537 0%, #25292d 100%);
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-title-block {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-kicker {
|
||||||
|
margin: 0 0 4px;
|
||||||
|
color: rgba(245, 251, 254, 0.72);
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: 900;
|
||||||
|
letter-spacing: 0.12em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-header h1 {
|
||||||
|
margin: 0;
|
||||||
|
color: #ffffff;
|
||||||
|
font-family: "OByte Gothic Demi", "OByte Nunito", "Segoe UI", Arial, sans-serif;
|
||||||
|
font-size: 36px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 1.04;
|
||||||
|
letter-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-tags,
|
||||||
|
.oqt-service-tags,
|
||||||
|
.oqt-header-actions,
|
||||||
|
.oqt-template-actions,
|
||||||
|
.oqt-step-actions,
|
||||||
|
.oqt-action-group {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-tags {
|
||||||
|
margin-top: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-tag {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
min-height: 28px;
|
||||||
|
max-width: 100%;
|
||||||
|
border: 1px solid var(--oqt-line);
|
||||||
|
border-radius: 999px;
|
||||||
|
background: #ffffff;
|
||||||
|
color: var(--oqt-text-soft);
|
||||||
|
padding: 4px 10px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 800;
|
||||||
|
line-height: 1.2;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-tag[data-field="stepSummary"] {
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-header .oqt-tag {
|
||||||
|
border-color: rgba(255, 255, 255, 0.22);
|
||||||
|
background: rgba(255, 255, 255, 0.1);
|
||||||
|
color: rgba(255, 255, 255, 0.88);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-tag--muted {
|
||||||
|
background: var(--oqt-surface-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-tag.is-ok {
|
||||||
|
border-color: rgba(24, 143, 92, 0.42);
|
||||||
|
background: rgba(24, 143, 92, 0.12);
|
||||||
|
color: #126842;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-tag.is-warn {
|
||||||
|
border-color: rgba(245, 156, 0, 0.48);
|
||||||
|
background: rgba(245, 156, 0, 0.14);
|
||||||
|
color: #875600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-tag.is-bad {
|
||||||
|
border-color: rgba(196, 59, 59, 0.42);
|
||||||
|
background: rgba(196, 59, 59, 0.12);
|
||||||
|
color: #8f2424;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-header .oqt-tag.is-ok,
|
||||||
|
.oqt-header .oqt-tag.is-warn,
|
||||||
|
.oqt-header .oqt-tag.is-bad {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-panel {
|
||||||
|
padding: 20px 22px;
|
||||||
|
background: var(--oqt-surface);
|
||||||
|
border-bottom: 1px solid var(--oqt-line);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-panel--setup {
|
||||||
|
background: linear-gradient(180deg, #ffffff 0%, #fbfdfe 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-panel-head {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: minmax(0, 1fr) auto;
|
||||||
|
gap: 16px;
|
||||||
|
align-items: start;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-panel-head h2 {
|
||||||
|
margin: 0;
|
||||||
|
color: var(--oqt-text);
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 900;
|
||||||
|
line-height: 1.15;
|
||||||
|
letter-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-panel-head p {
|
||||||
|
margin: 4px 0 0;
|
||||||
|
color: var(--oqt-text-soft);
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-setup-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: minmax(260px, 0.95fr) minmax(0, 2fr);
|
||||||
|
gap: 16px;
|
||||||
|
align-items: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-template-card {
|
||||||
|
display: grid;
|
||||||
|
gap: 10px;
|
||||||
|
min-width: 0;
|
||||||
|
border: 1px solid var(--oqt-line);
|
||||||
|
border-radius: 8px;
|
||||||
|
background: var(--oqt-surface);
|
||||||
|
padding: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-meta-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(5, minmax(0, 1fr));
|
||||||
|
gap: 12px;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field {
|
||||||
|
display: grid;
|
||||||
|
gap: 6px;
|
||||||
|
min-width: 0;
|
||||||
|
color: var(--oqt-text-soft);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 850;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field--select {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field--wide-line {
|
||||||
|
grid-column: span 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field span,
|
||||||
|
.oqt-mini-label,
|
||||||
|
.oqt-group-label {
|
||||||
|
color: var(--oqt-text-soft);
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: 900;
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field input,
|
||||||
|
.oqt-field select,
|
||||||
|
.oqt-steps-table input,
|
||||||
|
.oqt-steps-table textarea,
|
||||||
|
.oqt-steps-table select {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 40px;
|
||||||
|
border: 1px solid var(--oqt-line-strong);
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #ffffff;
|
||||||
|
color: var(--oqt-text);
|
||||||
|
font: inherit;
|
||||||
|
padding: 9px 11px;
|
||||||
|
outline: none;
|
||||||
|
transition: border-color 0.16s ease, box-shadow 0.16s ease, background 0.16s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field input::placeholder,
|
||||||
|
.oqt-field select::placeholder,
|
||||||
|
.oqt-steps-table input::placeholder,
|
||||||
|
.oqt-steps-table textarea::placeholder {
|
||||||
|
color: #7a858e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field input:focus,
|
||||||
|
.oqt-field select:focus,
|
||||||
|
.oqt-steps-table input:focus,
|
||||||
|
.oqt-steps-table textarea:focus,
|
||||||
|
.oqt-steps-table select:focus,
|
||||||
|
.oqt-btn:focus,
|
||||||
|
.oqt-icon-btn:focus,
|
||||||
|
.oqt-status-btn:focus,
|
||||||
|
.oqt-drag-handle:focus {
|
||||||
|
outline: none;
|
||||||
|
box-shadow: var(--oqt-focus);
|
||||||
|
border-color: var(--oqt-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field input[readonly] {
|
||||||
|
background: #edf5f9;
|
||||||
|
color: var(--oqt-text-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-file {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-btn,
|
||||||
|
.oqt-icon-btn,
|
||||||
|
.oqt-status-btn {
|
||||||
|
border: 1px solid transparent;
|
||||||
|
cursor: pointer;
|
||||||
|
font: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: border-color 0.16s ease, background 0.16s ease, color 0.16s ease, filter 0.16s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-btn {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 7px;
|
||||||
|
min-height: 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 9px 13px;
|
||||||
|
font-family: "OByte Gothic Demi", "OByte Nunito", "Segoe UI", Arial, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 1;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-btn .dashicons {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-btn--primary {
|
||||||
|
background: linear-gradient(132deg, var(--oqt-blue) 0%, var(--oqt-blue-soft) 100%);
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-btn--primary:hover {
|
||||||
|
filter: brightness(1.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-btn--light {
|
||||||
|
background: #ffffff;
|
||||||
|
border-color: var(--oqt-line-strong);
|
||||||
|
color: var(--oqt-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-btn--light:hover {
|
||||||
|
border-color: rgba(0, 167, 230, 0.62);
|
||||||
|
color: #163441;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-btn[disabled],
|
||||||
|
.oqt-btn.is-busy {
|
||||||
|
opacity: 0.62;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-table-wrap {
|
||||||
|
overflow-x: auto;
|
||||||
|
border: 1px solid var(--oqt-line);
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-steps-table {
|
||||||
|
width: 100%;
|
||||||
|
min-width: 1080px;
|
||||||
|
border-collapse: separate;
|
||||||
|
border-spacing: 0;
|
||||||
|
table-layout: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-steps-table th,
|
||||||
|
.oqt-steps-table td {
|
||||||
|
border-bottom: 1px solid var(--oqt-line);
|
||||||
|
padding: 12px;
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-steps-table th {
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 1;
|
||||||
|
background: #eef8fc;
|
||||||
|
color: var(--oqt-text);
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: 900;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
line-height: 1.2;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-steps-table tbody tr:last-child td {
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-steps-table th:nth-child(1),
|
||||||
|
.oqt-steps-table td:nth-child(1) {
|
||||||
|
width: 36%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-steps-table th:nth-child(2),
|
||||||
|
.oqt-steps-table td:nth-child(2) {
|
||||||
|
width: 28%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-steps-table th:nth-child(3),
|
||||||
|
.oqt-steps-table td:nth-child(3) {
|
||||||
|
width: 12%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-steps-table th:nth-child(4),
|
||||||
|
.oqt-steps-table td:nth-child(4) {
|
||||||
|
width: 24%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-empty-row td {
|
||||||
|
padding: 28px 16px;
|
||||||
|
color: var(--oqt-text-soft);
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-step-head {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 108px minmax(150px, 1fr) minmax(34px, auto);
|
||||||
|
gap: 8px;
|
||||||
|
align-items: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-step-id-wrap,
|
||||||
|
.oqt-step-title-wrap,
|
||||||
|
.oqt-group-main {
|
||||||
|
display: grid;
|
||||||
|
gap: 5px;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-steps-table textarea {
|
||||||
|
min-height: 82px;
|
||||||
|
resize: vertical;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-steps-table .oqt-title {
|
||||||
|
min-height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-required {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 7px;
|
||||||
|
margin-top: 10px;
|
||||||
|
color: var(--oqt-text-soft);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-required input {
|
||||||
|
width: 16px;
|
||||||
|
min-height: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-pin {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 100%;
|
||||||
|
min-width: 34px;
|
||||||
|
min-height: 28px;
|
||||||
|
border: 1px solid rgba(245, 156, 0, 0.46);
|
||||||
|
border-radius: 999px;
|
||||||
|
background: rgba(245, 156, 0, 0.14);
|
||||||
|
color: #8b5900;
|
||||||
|
padding: 4px 7px;
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: 900;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-pin--off {
|
||||||
|
border-color: rgba(103, 113, 122, 0.28);
|
||||||
|
background: rgba(103, 113, 122, 0.08);
|
||||||
|
color: var(--oqt-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-evidence {
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-icon-btn,
|
||||||
|
.oqt-drag-handle {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 34px;
|
||||||
|
height: 34px;
|
||||||
|
border-radius: 8px;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-icon-btn {
|
||||||
|
border-color: var(--oqt-line-strong);
|
||||||
|
background: #ffffff;
|
||||||
|
color: var(--oqt-text-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-icon-btn:hover {
|
||||||
|
border-color: rgba(196, 59, 59, 0.46);
|
||||||
|
color: var(--oqt-danger);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-icon-btn .dashicons,
|
||||||
|
.oqt-drag-handle .dashicons {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-drag-handle {
|
||||||
|
border: 1px solid var(--oqt-line-strong);
|
||||||
|
background: rgba(0, 167, 230, 0.08);
|
||||||
|
color: var(--oqt-blue-ink);
|
||||||
|
cursor: grab;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-row-tools {
|
||||||
|
display: inline-flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: stretch;
|
||||||
|
justify-content: flex-start;
|
||||||
|
gap: 6px;
|
||||||
|
min-width: 34px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-row-tools .oqt-icon-btn,
|
||||||
|
.oqt-row-tools .oqt-drag-handle {
|
||||||
|
width: 34px;
|
||||||
|
height: 34px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-step-tools {
|
||||||
|
justify-self: end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-drag-handle:active {
|
||||||
|
cursor: grabbing;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-group-row td {
|
||||||
|
background: #f1f9fd;
|
||||||
|
border-left: 4px solid var(--oqt-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-group-row.is-ok td {
|
||||||
|
background: rgba(24, 143, 92, 0.09);
|
||||||
|
border-left-color: var(--oqt-success);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-group-row.is-bad td {
|
||||||
|
background: rgba(196, 59, 59, 0.09);
|
||||||
|
border-left-color: var(--oqt-danger);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-group-head {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: minmax(240px, 1fr) auto;
|
||||||
|
gap: 12px;
|
||||||
|
align-items: end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-group-actions {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
align-items: flex-start;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-set {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1px solid var(--oqt-line-strong);
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-btn {
|
||||||
|
min-height: 34px;
|
||||||
|
border-right: 1px solid var(--oqt-line);
|
||||||
|
background: #ffffff;
|
||||||
|
color: var(--oqt-text);
|
||||||
|
padding: 6px 9px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 900;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-btn:last-child {
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-btn:hover {
|
||||||
|
background: var(--oqt-surface-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-btn.is-pass {
|
||||||
|
color: var(--oqt-success);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-btn.is-fail {
|
||||||
|
color: var(--oqt-danger);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-btn.is-skip {
|
||||||
|
color: var(--oqt-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-btn.is-blocked {
|
||||||
|
color: #925d00;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-row-pass td {
|
||||||
|
background: rgba(24, 143, 92, 0.055);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-row-fail td {
|
||||||
|
background: rgba(196, 59, 59, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-row-skip td {
|
||||||
|
background: rgba(103, 113, 122, 0.055);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-row-blocked td {
|
||||||
|
background: rgba(245, 156, 0, 0.07);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-pass {
|
||||||
|
border-color: rgba(24, 143, 92, 0.46) !important;
|
||||||
|
background: rgba(24, 143, 92, 0.12) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-fail {
|
||||||
|
border-color: rgba(196, 59, 59, 0.46) !important;
|
||||||
|
background: rgba(196, 59, 59, 0.12) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-skip {
|
||||||
|
border-color: rgba(103, 113, 122, 0.46) !important;
|
||||||
|
background: rgba(103, 113, 122, 0.12) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-status-blocked {
|
||||||
|
border-color: rgba(245, 156, 0, 0.52) !important;
|
||||||
|
background: rgba(245, 156, 0, 0.14) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-dragging {
|
||||||
|
opacity: 0.58;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-drag-over {
|
||||||
|
outline: 2px dashed var(--oqt-blue);
|
||||||
|
outline-offset: -3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-drag-over[data-drop-pos="before"] {
|
||||||
|
box-shadow: inset 0 3px 0 var(--oqt-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-drag-over[data-drop-pos="after"] {
|
||||||
|
box-shadow: inset 0 -3px 0 var(--oqt-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
tr[data-hidden="1"] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-action-dock {
|
||||||
|
position: sticky;
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 3;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: minmax(0, auto) minmax(280px, 1fr);
|
||||||
|
gap: 14px;
|
||||||
|
align-items: center;
|
||||||
|
padding: 14px 22px;
|
||||||
|
border-top: 1px solid var(--oqt-line);
|
||||||
|
background: rgba(255, 255, 255, 0.94);
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-message {
|
||||||
|
min-height: 40px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: var(--oqt-surface-soft);
|
||||||
|
color: var(--oqt-text-soft);
|
||||||
|
padding: 10px 12px;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-message:empty {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-message a {
|
||||||
|
color: var(--oqt-blue-ink);
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-message.is-ok {
|
||||||
|
border-color: rgba(24, 143, 92, 0.28);
|
||||||
|
background: rgba(24, 143, 92, 0.1);
|
||||||
|
color: #126842;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-message.is-bad {
|
||||||
|
border-color: rgba(196, 59, 59, 0.28);
|
||||||
|
background: rgba(196, 59, 59, 0.1);
|
||||||
|
color: #8f2424;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1180px) {
|
||||||
|
.oqt-setup-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-meta-grid {
|
||||||
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field--wide-line {
|
||||||
|
grid-column: span 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 860px) {
|
||||||
|
.obyte-qa-tool {
|
||||||
|
border-left: 0;
|
||||||
|
border-right: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-header {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-header,
|
||||||
|
.oqt-panel-head,
|
||||||
|
.oqt-action-dock {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-header-actions,
|
||||||
|
.oqt-service-tags,
|
||||||
|
.oqt-step-actions,
|
||||||
|
.oqt-action-group {
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-header h1 {
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-meta-grid {
|
||||||
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field--wide-line {
|
||||||
|
grid-column: span 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 620px) {
|
||||||
|
.oqt-header,
|
||||||
|
.oqt-panel,
|
||||||
|
.oqt-action-dock {
|
||||||
|
padding-left: 14px;
|
||||||
|
padding-right: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-meta-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-field--wide-line {
|
||||||
|
grid-column: span 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-header-actions .oqt-btn,
|
||||||
|
.oqt-template-actions .oqt-btn,
|
||||||
|
.oqt-step-actions .oqt-btn,
|
||||||
|
.oqt-action-group .oqt-btn {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
.obyte-qa-tool {
|
||||||
|
border: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oqt-panel--setup,
|
||||||
|
.oqt-action-dock,
|
||||||
|
.oqt-step-actions,
|
||||||
|
.oqt-header-actions {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
obyte-qa-tool/assets/fonts/Nunito-VariableFont_wght.ttf
Normal file
BIN
obyte-qa-tool/assets/fonts/urw_gothic_l_demi.ttf
Normal file
47
obyte-qa-tool/assets/img/o-byte_Logo_2024_Dark.svg
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="Logo_Dark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 933.48 192.8">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #15a5e4;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g>
|
||||||
|
<polygon class="cls-1" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="cls-1" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="cls-1" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="cls-1" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="cls-1" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="cls-1" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="cls-1" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="cls-1" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="cls-1" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="cls-1" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="cls-1" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="cls-1" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="cls-1" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="cls-1" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="cls-1" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="cls-1" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="cls-1" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="cls-1" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="cls-1" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="cls-1" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="cls-1" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="cls-1" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="cls-1" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="cls-1" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="cls-1" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="cls-1" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="cls-1" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="cls-1" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-1" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="cls-1" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="cls-2" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
43
obyte-qa-tool/assets/img/o-byte_Logo_2024_White.svg
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="Weiß" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 933.48 192.8">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g>
|
||||||
|
<polygon class="cls-1" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="cls-1" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="cls-1" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="cls-1" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="cls-1" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="cls-1" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="cls-1" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="cls-1" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="cls-1" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="cls-1" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="cls-1" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="cls-1" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="cls-1" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="cls-1" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="cls-1" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="cls-1" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="cls-1" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="cls-1" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="cls-1" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="cls-1" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="cls-1" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="cls-1" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="cls-1" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="cls-1" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="cls-1" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="cls-1" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="cls-1" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="cls-1" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-1" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="cls-1" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="cls-1" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
1870
obyte-qa-tool/assets/js/qa-tool.js
Normal file
1835
obyte-qa-tool/obyte-qa-tool.php
Normal file
1094
styleguide/assets/css/style.css
Normal file
BIN
styleguide/assets/fonts/Nunito-Italic-VariableFont_wght.ttf
Normal file
BIN
styleguide/assets/fonts/Nunito-VariableFont_wght.ttf
Normal file
BIN
styleguide/assets/fonts/urw_gothic_l_book.ttf
Normal file
BIN
styleguide/assets/fonts/urw_gothic_l_demi.ttf
Normal file
25
styleguide/assets/img/o-Byte Favicon_Dark.svg
Normal file
|
After Width: | Height: | Size: 16 KiB |
21
styleguide/assets/img/o-Byte Favicon_Light.svg
Normal file
|
After Width: | Height: | Size: 15 KiB |
47
styleguide/assets/img/o-byte_Logo_2024_Dark.svg
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="Logo_Dark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 933.48 192.8">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #15a5e4;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g>
|
||||||
|
<polygon class="cls-1" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="cls-1" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="cls-1" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="cls-1" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="cls-1" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="cls-1" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="cls-1" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="cls-1" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="cls-1" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="cls-1" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="cls-1" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="cls-1" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="cls-1" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="cls-1" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="cls-1" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="cls-1" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="cls-1" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="cls-1" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="cls-1" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="cls-1" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="cls-1" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="cls-1" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="cls-1" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="cls-1" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="cls-1" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="cls-1" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="cls-1" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="cls-1" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-1" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="cls-1" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="cls-2" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
105
styleguide/assets/img/o-byte_Logo_2024_Dark_clean.svg
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 901.53 179.95">
|
||||||
|
<!-- Generator: Adobe Illustrator 29.8.5, SVG Export Plug-In . SVG Version: 2.1.1 Build 2) -->
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.st0 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st1 {
|
||||||
|
fill: #15a5e4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st2 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st3 {
|
||||||
|
fill: #222221;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g id="Logo_x5F_light" class="st2">
|
||||||
|
<g>
|
||||||
|
<polygon class="st3" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="st3" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st3" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="st3" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st3" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="st3" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st3" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st3" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st3" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="st3" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="st3" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="st3" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="st3" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="st3" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="st3" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="st3" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="st3" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="st3" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st3" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="st3" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st3" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st3" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st3" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st3" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="st3" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st3" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="st3" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="st3" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="st3" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="st3" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="st1" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
<g id="Logo_x5F_Dark">
|
||||||
|
<path class="st0" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st0" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st0" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st0" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="st0" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="st0" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="st0" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
<rect class="st1" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
<g id="Weiß" class="st2">
|
||||||
|
<g>
|
||||||
|
<polygon class="st0" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="st0" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="st0" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="st0" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="st0" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="st0" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="st0" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="st0" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="st0" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="st0" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="st0" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="st0" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="st0" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="st0" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st0" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st0" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st0" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="st0" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="st0" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="st0" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="st0" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="st0" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="st0" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 29 KiB |
47
styleguide/assets/img/o-byte_Logo_2024_Light.svg
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="Logo_light" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 933.48 192.8">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #15a5e4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #222221;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g>
|
||||||
|
<polygon class="cls-2" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="cls-2" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="cls-2" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="cls-2" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="cls-2" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="cls-2" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="cls-2" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="cls-2" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="cls-2" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="cls-2" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="cls-2" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="cls-2" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="cls-2" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="cls-2" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="cls-2" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="cls-2" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="cls-2" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="cls-2" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="cls-2" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="cls-2" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="cls-2" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="cls-2" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="cls-2" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="cls-2" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="cls-2" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="cls-2" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="cls-2" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="cls-2" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-2" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="cls-2" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="cls-1" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
105
styleguide/assets/img/o-byte_Logo_2024_Light_clean.svg
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 901.53 179.95">
|
||||||
|
<!-- Generator: Adobe Illustrator 29.8.5, SVG Export Plug-In . SVG Version: 2.1.1 Build 2) -->
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.st0 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st1 {
|
||||||
|
fill: #15a5e4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st2 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st3 {
|
||||||
|
fill: #222221;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g id="Logo_x5F_light">
|
||||||
|
<path class="st3" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st3" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st3" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st3" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st3" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="st3" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st3" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="st3" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="st3" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
<rect class="st1" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
<g id="Logo_x5F_Dark" class="st2">
|
||||||
|
<g>
|
||||||
|
<polygon class="st0" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="st0" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="st0" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="st0" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="st0" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="st0" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="st0" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="st0" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="st0" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="st0" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="st0" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="st0" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="st0" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="st0" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st0" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st0" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st0" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="st0" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="st0" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="st0" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="st0" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="st0" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="st1" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
<g id="Weiß" class="st2">
|
||||||
|
<g>
|
||||||
|
<polygon class="st0" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="st0" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="st0" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="st0" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="st0" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="st0" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="st0" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="st0" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="st0" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="st0" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="st0" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="st0" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="st0" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="st0" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st0" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st0" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st0" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="st0" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="st0" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="st0" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="st0" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="st0" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="st0" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 29 KiB |
113
styleguide/assets/img/o-byte_Logo_2024_Light_web_app.svg
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 901.69 250.97">
|
||||||
|
<!-- Generator: Adobe Illustrator 29.8.5, SVG Export Plug-In . SVG Version: 2.1.1 Build 2) -->
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.st0 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st1 {
|
||||||
|
fill: #15a5e4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st2 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st3 {
|
||||||
|
fill: #222221;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g id="Logo_x5F_light">
|
||||||
|
<path class="st3" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st3" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st3" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st3" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st3" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="st3" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st3" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="st3" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="st3" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
<rect class="st1" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
<g>
|
||||||
|
<path class="st3" d="M580.97,249.36v-91.69h22.7c10.34,0,17.78,1.2,22.33,3.6.41.17.79.37,1.12.62,7.44,4.55,11.54,11.62,12.28,21.22.08.91.12,1.86.12,2.85,0,8.93-2.73,16.09-8.19,21.46-1.24,1.16-2.52,2.15-3.85,2.98-4.05,2.48-10.38,3.85-18.98,4.09h-10.55v34.86h-17ZM597.97,198.24h4.96c6.62,0,11.25-.7,13.9-2.11,3.72-2.07,5.58-5.38,5.58-9.93,0-5.29-2.07-8.89-6.21-10.79-.58-.25-1.16-.45-1.74-.62-2.56-.58-6.16-.87-10.79-.87h-5.71v24.32Z"/>
|
||||||
|
<path class="st3" d="M679.61,179.01c10.75,0,19.68,3.76,26.8,11.29,6.62,6.95,9.93,15.34,9.93,25.19s-3.64,18.03-10.92,25.06c-7.2,6.95-15.76,10.42-25.68,10.42s-18.86-3.6-26.05-10.79c-6.95-7.03-10.42-15.42-10.42-25.19s3.64-18.53,10.92-25.56c7.11-6.95,15.59-10.42,25.43-10.42ZM679.73,194.15c-6.2,0-11.33,2.52-15.38,7.57-2.98,3.81-4.47,8.15-4.47,13.03,0,7.03,2.61,12.66,7.82,16.87,3.56,2.81,7.61,4.22,12.16,4.22,6.37,0,11.54-2.61,15.51-7.82,2.89-3.8,4.34-8.15,4.34-13.03,0-6.7-2.52-12.16-7.57-16.38-3.64-2.98-7.78-4.47-12.41-4.47Z"/>
|
||||||
|
<path class="st3" d="M725.64,249.36v-68.74h15.14v6.7c2.98-4.38,6.2-6.99,9.68-7.82,1.41-.33,3.14-.5,5.21-.5h1.24v15.88c-9.84.25-14.76,5.67-14.76,16.25v38.21h-16.5Z"/>
|
||||||
|
<path class="st3" d="M769.56,249.36v-53.72h-8.07v-15.01h8.07v-22.95h16.5v22.95h9.93v15.01h-9.93v53.72h-16.5Z"/>
|
||||||
|
<path class="st3" d="M872.91,180.62v68.74h-15.14v-8.93c-5.46,6.2-11.83,9.68-19.11,10.42-1.16.08-2.4.12-3.72.12-10.84,0-19.56-3.85-26.18-11.54-5.63-6.62-8.44-14.68-8.44-24.19,0-11.41,3.8-20.6,11.42-27.54,6.45-5.79,14.31-8.68,23.57-8.68s16.17,3.14,21.46,9.43c.33.42.66.87.99,1.36v-9.18h15.14ZM837.05,194.15c-7.28,0-12.78,2.9-16.5,8.68-2.4,3.64-3.6,7.9-3.6,12.78,0,7.69,2.89,13.36,8.69,17,3.31,2.15,7.2,3.23,11.66,3.23,6.53,0,11.54-2.07,15.01-6.2,3.06-4.13,4.71-8.85,4.96-14.14,0-7.86-2.81-13.77-8.44-17.74-3.39-2.4-7.32-3.6-11.79-3.6Z"/>
|
||||||
|
<path class="st3" d="M885.19,249.36v-91.69h16.5v91.69h-16.5Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Logo_x5F_Dark" class="st2">
|
||||||
|
<g>
|
||||||
|
<polygon class="st0" points="395.24 164.36 391.39 164.36 391.39 174.35 385.46 174.35 385.46 177.83 391.39 177.83 391.39 202.79 395.24 202.79 395.24 177.83 401.84 177.83 401.84 174.35 395.24 174.35 395.24 164.36 395.24 164.36"/>
|
||||||
|
<path class="st0" d="M408.08,186.46c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM433.12,184.3c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="438.71 202.79 442.56 202.79 442.56 164.36 438.71 164.36 438.71 202.79 438.71 202.79"/>
|
||||||
|
<path class="st0" d="M451.45,186.46c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.48,184.3c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="503.91 174.35 498.97 174.35 485.92 191.35 485.92 164.36 482.07 164.36 482.07 202.79 485.92 202.79 485.92 197.38 490.45 191.56 499.7 202.79 504.64 202.79 492.89 188.59 503.91 174.35 503.91 174.35"/>
|
||||||
|
<path class="st0" d="M529.45,196.44c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM521.59,173.72v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M580.98,178.09c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M629.34,178.09c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M659.34,189.43c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="st0" d="M691.89,178.51c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="st0" points="700.63 170.91 704.48 170.91 704.48 164.36 700.63 164.36 700.63 170.91 700.63 170.91"/>
|
||||||
|
<polygon class="st0" points="700.63 202.79 704.48 202.79 704.48 174.35 700.63 174.35 700.63 202.79 700.63 202.79"/>
|
||||||
|
<polygon class="st0" points="732.45 174.35 727.51 174.35 714.46 191.35 714.46 164.36 710.61 164.36 710.61 202.79 714.46 202.79 714.46 197.38 718.98 191.56 728.24 202.79 733.18 202.79 721.43 188.59 732.45 174.35 732.45 174.35"/>
|
||||||
|
<path class="st0" d="M758.3,196.52c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM761.57,179.75l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="st0" points="778.52 164.36 774.67 164.36 774.67 174.35 768.75 174.35 768.75 177.83 774.67 177.83 774.67 202.79 778.52 202.79 778.52 177.83 785.13 177.83 785.13 174.35 778.52 174.35 778.52 164.36 778.52 164.36"/>
|
||||||
|
<polygon class="st0" points="788.61 202.79 792.46 202.79 792.46 174.35 788.61 174.35 788.61 202.79 788.61 202.79"/>
|
||||||
|
<polygon class="st0" points="788.61 170.91 792.46 170.91 792.46 164.36 788.61 164.36 788.61 170.91 788.61 170.91"/>
|
||||||
|
<path class="st0" d="M820.28,196.44c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM812.43,173.72v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M854.81,178.51c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="st0" d="M678.76,110.53c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st0" d="M729.4,115.4c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM740.53,156.14c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st0" d="M836.67,98.73c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st0" d="M36.24,124.69c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM13.88,43.13c-15.85,0-29.35,5.6-40.5,16.81-11.15,11.21-16.72,24.77-16.72,40.69s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="88.98 109.82 142.98 109.82 142.98 86.99 88.98 86.99 88.98 109.82 88.98 109.82"/>
|
||||||
|
<path class="st0" d="M243.56,124.78c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM225.09,43.13c-12.95,0-24.35,4.33-34.2,12.98V10.83h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="379.4 46.73 364.83 46.73 338.53 117.01 338.41 117.01 313.94 46.73 284.74 46.73 324.11 144.73 304.17 190.62 331.54 190.62 394.06 46.73 379.4 46.73 379.4 46.73"/>
|
||||||
|
<polygon class="st0" points="452.96 46.73 437.33 46.73 437.33 10.67 411.47 10.67 411.47 46.73 399.06 46.73 399.06 69.46 411.47 69.46 411.47 154.34 437.33 154.34 437.33 69.46 452.96 69.46 452.96 46.73 452.96 46.73"/>
|
||||||
|
<path class="st0" d="M492.92,76.47c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM514.52,157.94c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="st0" d="M872.27,97.93v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM878.91,98.65c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="st0" d="M883.51,105.89c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM888.95,91.73c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="st1" x="582.84" y="97.34" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
<g id="Weiß" class="st2">
|
||||||
|
<g>
|
||||||
|
<polygon class="st0" points="395.24 164.36 391.39 164.36 391.39 174.35 385.46 174.35 385.46 177.83 391.39 177.83 391.39 202.79 395.24 202.79 395.24 177.83 401.84 177.83 401.84 174.35 395.24 174.35 395.24 164.36 395.24 164.36"/>
|
||||||
|
<path class="st0" d="M408.08,186.46c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM433.12,184.3c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="438.71 202.79 442.56 202.79 442.56 164.36 438.71 164.36 438.71 202.79 438.71 202.79"/>
|
||||||
|
<path class="st0" d="M451.45,186.46c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.48,184.3c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="503.91 174.35 498.97 174.35 485.92 191.35 485.92 164.36 482.07 164.36 482.07 202.79 485.92 202.79 485.92 197.38 490.45 191.56 499.7 202.79 504.64 202.79 492.89 188.59 503.91 174.35 503.91 174.35"/>
|
||||||
|
<path class="st0" d="M529.45,196.44c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM521.59,173.72v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M580.98,178.09c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M629.34,178.09c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M659.34,189.43c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="st0" d="M691.89,178.51c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="st0" points="700.63 170.91 704.48 170.91 704.48 164.36 700.63 164.36 700.63 170.91 700.63 170.91"/>
|
||||||
|
<polygon class="st0" points="700.63 202.79 704.48 202.79 704.48 174.35 700.63 174.35 700.63 202.79 700.63 202.79"/>
|
||||||
|
<polygon class="st0" points="732.45 174.35 727.51 174.35 714.46 191.35 714.46 164.36 710.61 164.36 710.61 202.79 714.46 202.79 714.46 197.38 718.98 191.56 728.24 202.79 733.18 202.79 721.43 188.59 732.45 174.35 732.45 174.35"/>
|
||||||
|
<path class="st0" d="M758.3,196.52c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM761.57,179.75l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="st0" points="778.52 164.36 774.67 164.36 774.67 174.35 768.75 174.35 768.75 177.83 774.67 177.83 774.67 202.79 778.52 202.79 778.52 177.83 785.13 177.83 785.13 174.35 778.52 174.35 778.52 164.36 778.52 164.36"/>
|
||||||
|
<polygon class="st0" points="788.61 202.79 792.46 202.79 792.46 174.35 788.61 174.35 788.61 202.79 788.61 202.79"/>
|
||||||
|
<polygon class="st0" points="788.61 170.91 792.46 170.91 792.46 164.36 788.61 164.36 788.61 170.91 788.61 170.91"/>
|
||||||
|
<path class="st0" d="M820.28,196.44c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM812.43,173.72v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M854.81,178.51c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="st0" d="M678.76,110.53c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st0" d="M729.4,115.4c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM740.53,156.14c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st0" d="M836.67,98.73c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st0" d="M36.24,124.69c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM13.88,43.13c-15.85,0-29.35,5.6-40.5,16.81-11.15,11.21-16.72,24.77-16.72,40.69s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="88.98 109.82 142.98 109.82 142.98 86.99 88.98 86.99 88.98 109.82 88.98 109.82"/>
|
||||||
|
<path class="st0" d="M243.56,124.78c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM225.09,43.13c-12.95,0-24.35,4.33-34.2,12.98V10.83h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="379.4 46.73 364.83 46.73 338.53 117.01 338.41 117.01 313.94 46.73 284.74 46.73 324.11 144.73 304.17 190.62 331.54 190.62 394.06 46.73 379.4 46.73 379.4 46.73"/>
|
||||||
|
<polygon class="st0" points="452.96 46.73 437.33 46.73 437.33 10.67 411.47 10.67 411.47 46.73 399.06 46.73 399.06 69.46 411.47 69.46 411.47 154.34 437.33 154.34 437.33 69.46 452.96 69.46 452.96 46.73 452.96 46.73"/>
|
||||||
|
<path class="st0" d="M492.92,76.47c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM514.52,157.94c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="st0" d="M872.27,97.93v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM878.91,98.65c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="st0" d="M883.51,105.89c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM888.95,91.73c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="st0" x="582.84" y="97.34" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 31 KiB |
43
styleguide/assets/img/o-byte_Logo_2024_White.svg
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="Weiß" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 933.48 192.8">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g>
|
||||||
|
<polygon class="cls-1" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="cls-1" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="cls-1" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="cls-1" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="cls-1" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="cls-1" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="cls-1" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="cls-1" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="cls-1" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="cls-1" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="cls-1" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="cls-1" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="cls-1" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="cls-1" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="cls-1" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="cls-1" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="cls-1" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="cls-1" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="cls-1" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="cls-1" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="cls-1" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="cls-1" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="cls-1" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="cls-1" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="cls-1" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="cls-1" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="cls-1" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="cls-1" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-1" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="cls-1" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="cls-1" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
105
styleguide/assets/img/o-byte_Logo_2024_White_clean.svg
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 901.53 179.95">
|
||||||
|
<!-- Generator: Adobe Illustrator 29.8.5, SVG Export Plug-In . SVG Version: 2.1.1 Build 2) -->
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.st0 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st1 {
|
||||||
|
fill: #15a5e4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st2 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.st3 {
|
||||||
|
fill: #222221;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g id="Logo_x5F_light" class="st2">
|
||||||
|
<g>
|
||||||
|
<polygon class="st3" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="st3" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st3" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="st3" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st3" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="st3" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st3" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st3" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st3" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="st3" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="st3" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="st3" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="st3" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="st3" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="st3" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="st3" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="st3" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="st3" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st3" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="st3" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st3" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st3" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st3" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st3" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="st3" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st3" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="st3" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="st3" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="st3" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="st3" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="st1" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
<g id="Logo_x5F_Dark" class="st2">
|
||||||
|
<g>
|
||||||
|
<polygon class="st0" points="438.57 153.7 434.72 153.7 434.72 163.68 428.79 163.68 428.79 167.16 434.72 167.16 434.72 192.12 438.57 192.12 438.57 167.16 445.17 167.16 445.17 163.68 438.57 163.68 438.57 153.7 438.57 153.7"/>
|
||||||
|
<path class="st0" d="M451.41,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM476.45,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4.01.05c-.83,1.91-2.18,3.42-4.05,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.03-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="482.04 192.12 485.89 192.12 485.89 153.7 482.04 153.7 482.04 192.12 482.04 192.12"/>
|
||||||
|
<path class="st0" d="M494.78,175.8c.48-2.62,1.78-4.77,3.87-6.46,2.1-1.69,4.48-2.53,7.15-2.53s4.98.88,7.05,2.63c2.06,1.75,3.34,3.87,3.82,6.37h-21.89ZM519.82,173.63c-.43-1.73-1.31-3.4-2.63-5.03-1.42-1.73-3.12-3.08-5.1-4.04-1.98-.97-4.09-1.45-6.34-1.45-4.13,0-7.63,1.45-10.5,4.34-2.88,2.89-4.32,6.41-4.32,10.53s1.45,7.67,4.34,10.53c2.89,2.86,6.42,4.29,10.58,4.29,3.02,0,5.83-.94,8.45-2.81,2.62-1.87,4.41-4.25,5.38-7.12l-4,.05c-.83,1.91-2.18,3.42-4.06,4.52-1.87,1.11-3.83,1.68-5.88,1.72h-.26c-2.64,0-5.05-.96-7.25-2.89-2.2-1.93-3.35-4.26-3.46-6.99h25.74c-.04-2.04-.27-3.92-.7-5.65h0Z"/>
|
||||||
|
<polygon class="st0" points="547.25 163.68 542.31 163.68 529.26 180.68 529.26 153.7 525.41 153.7 525.41 192.12 529.26 192.12 529.26 186.72 533.78 180.89 543.04 192.12 547.98 192.12 536.22 177.93 547.25 163.68 547.25 163.68"/>
|
||||||
|
<path class="st0" d="M572.78,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.48,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM564.93,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M624.31,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.3.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.04.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.66-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.05,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.04.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M672.67,167.42c-1.39-1.42-2.83-2.5-4.32-3.22-1.49-.73-3-1.09-4.52-1.09-.28,0-.56,0-.86.02-.29.02-.6.06-.91.13-1.39.21-2.73.67-4.03,1.38-1.3.71-2.37,1.64-3.2,2.78-.07.14-.14.27-.21.39-.07.12-.14.23-.21.34-.03.07-.06.13-.08.18-.02.05-.04.11-.08.18-.07-.1-.13-.2-.18-.29-.05-.09-.11-.18-.18-.29-.07-.07-.13-.15-.18-.23-.05-.09-.11-.18-.18-.29-1.14-1.39-2.5-2.45-4.06-3.2-1.56-.74-3.28-1.12-5.15-1.12-1.6,0-3.08.35-4.45,1.04-1.37.69-2.38,1.77-3.04,3.22h-.1v-3.69h-3.64v28.44h3.85v-16.22c0-1.11.06-2.17.18-3.17.12-1,.51-1.98,1.17-2.91.73-1.01,1.65-1.76,2.78-2.26,1.13-.5,2.28-.75,3.46-.75,1.28,0,2.49.31,3.61.94,1.13.62,2.05,1.46,2.78,2.5.21.28.38.55.52.83.14.28.24.55.31.83.24.66.39,1.31.44,1.95.05.64.08,1.31.08,2v16.28h3.85v-17.05c0-.35.02-.69.05-1.04.03-.69.13-1.39.29-2.08.16-.69.44-1.33.86-1.92.69-1.01,1.61-1.79,2.76-2.37,1.14-.57,2.32-.86,3.54-.86,1.32,0,2.53.29,3.64.86,1.11.57,2.04,1.41,2.81,2.52.45.62.77,1.31.96,2.05.19.74.32,1.5.39,2.26.03.31.05.62.05.91v16.72h3.85v-16.17c0-1.66-.16-3.21-.47-4.65-.31-1.44-1.04-2.73-2.18-3.87h0Z"/>
|
||||||
|
<path class="st0" d="M702.68,178.76c0,1.21-.11,2.42-.31,3.61-.21,1.2-.68,2.3-1.4,3.3-.83,1.11-1.85,1.97-3.07,2.57-1.21.61-2.51.91-3.9.91-1.56,0-2.99-.35-4.29-1.04-1.3-.69-2.35-1.71-3.15-3.07-.56-.97-.9-1.99-1.04-3.07-.14-1.07-.21-2.17-.21-3.28v-15.03h-3.85v15.08c0,1.87.12,3.61.36,5.23.24,1.61.8,2.87,1.66,3.77.28.31.55.61.81.88.26.28.53.56.81.83,1.32,1.25,2.66,2.12,4.03,2.6,1.37.48,2.82.73,4.34.73,1.97,0,3.8-.39,5.49-1.17,1.68-.78,2.96-2.09,3.82-3.93h.11v4.42h3.64v-28.44h-3.85v15.08h0Z"/>
|
||||||
|
<path class="st0" d="M735.23,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.61-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.66-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<polygon class="st0" points="743.96 160.25 747.81 160.25 747.81 153.7 743.96 153.7 743.96 160.25 743.96 160.25"/>
|
||||||
|
<polygon class="st0" points="743.96 192.12 747.81 192.12 747.81 163.68 743.96 163.68 743.96 192.12 743.96 192.12"/>
|
||||||
|
<polygon class="st0" points="775.79 163.68 770.85 163.68 757.79 180.68 757.79 153.7 753.95 153.7 753.95 192.12 757.79 192.12 757.79 186.72 762.32 180.89 771.57 192.12 776.51 192.12 764.76 177.93 775.79 163.68 775.79 163.68"/>
|
||||||
|
<path class="st0" d="M801.63,185.85c-2.18,2.21-4.77,3.31-7.75,3.31s-5.73-1.07-8.03-3.2c-2.31-2.13-3.46-4.76-3.46-7.88s1.12-5.82,3.35-8.01c2.24-2.18,4.91-3.29,8.03-3.33,3.19,0,5.84,1.1,7.96,3.31,2.11,2.21,3.17,4.89,3.17,8.05,0,2.95-1.09,5.53-3.28,7.74h0ZM804.9,169.09l-.1.05c-1.01-1.98-2.5-3.47-4.5-4.47-1.99-1.01-4.08-1.53-6.27-1.56h-.26c-2.43,0-4.55.42-6.37,1.27-1.82.85-3.41,1.98-4.76,3.41-1.25,1.28-2.24,2.78-2.99,4.5-.75,1.72-1.12,3.55-1.12,5.49,0,1.52.18,2.94.55,4.24.36,1.3.77,2.38,1.22,3.25.17.35.35.65.55.91.19.26.36.48.49.65,1.32,1.52,2.76,2.75,4.32,3.67,1.56.92,3.14,1.55,4.73,1.9.59.14,1.17.24,1.74.31.57.07,1.15.1,1.74.1,2.25,0,4.38-.49,6.37-1.48,1.99-.99,3.51-2.51,4.55-4.55h.1v5.36h3.69v-28.44h-3.69v5.41h0Z"/>
|
||||||
|
<polygon class="st0" points="821.86 153.7 818.01 153.7 818.01 163.68 812.08 163.68 812.08 167.16 818.01 167.16 818.01 192.12 821.86 192.12 821.86 167.16 828.46 167.16 828.46 163.68 821.86 163.68 821.86 153.7 821.86 153.7"/>
|
||||||
|
<polygon class="st0" points="831.94 192.12 835.79 192.12 835.79 163.68 831.94 163.68 831.94 192.12 831.94 192.12"/>
|
||||||
|
<polygon class="st0" points="831.94 160.25 835.79 160.25 835.79 153.7 831.94 153.7 831.94 160.25 831.94 160.25"/>
|
||||||
|
<path class="st0" d="M863.61,185.77c-2.05,2.26-4.66,3.39-7.85,3.39s-5.66-1.07-7.83-3.22c-2.17-2.15-3.25-4.75-3.25-7.8s1.06-5.75,3.17-7.98c2.11-2.24,4.75-3.37,7.9-3.41,1.42,0,2.79.28,4.11.83,1.32.56,2.48,1.32,3.49,2.29,1.14,1.08,1.98,2.27,2.52,3.57.54,1.3.81,2.74.81,4.3,0,3.09-1.02,5.77-3.07,8.03h0ZM855.76,163.06v.05c-4.16,0-7.69,1.47-10.58,4.42-2.9,2.95-4.34,6.48-4.34,10.61s1.48,7.56,4.45,10.4c2.96,2.84,6.46,4.26,10.48,4.26s7.62-1.49,10.48-4.47c2.86-2.98,4.29-6.5,4.29-10.56s-1.47-7.39-4.42-10.3c-2.95-2.91-6.4-4.39-10.35-4.42h0Z"/>
|
||||||
|
<path class="st0" d="M898.14,167.84c-1.28-1.52-2.81-2.69-4.58-3.51-1.77-.81-3.6-1.22-5.51-1.22s-3.54.41-4.99,1.22c-1.46.81-2.71,1.97-3.75,3.46h-.1v-4.11h-3.64v28.44h3.85v-15.81c0-.14.02-.28.05-.42,0-1.01.09-1.99.26-2.94.17-.95.57-1.85,1.2-2.68.73-1,1.65-1.81,2.78-2.42,1.13-.61,2.31-.96,3.56-1.07h.62c1.46,0,2.83.3,4.11.91,1.28.61,2.36,1.52,3.22,2.73.73,1.01,1.19,2.08,1.38,3.22.19,1.14.29,2.31.29,3.48v14.97h3.85v-14.92c0-1.8-.16-3.46-.47-4.99-.31-1.52-1.02-2.98-2.13-4.37h0Z"/>
|
||||||
|
<path class="st0" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st0" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st0" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st0" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="st0" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="st0" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="st0" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="st0" d="M915.6,87.26v-6.48h2.36c1.12,0,1.96.32,2.48.92.64.68.76,1.64.76,2.32s-.12,1.64-.76,2.32c-.52.6-1.36.92-2.48.92h-2.36ZM922.24,87.98c.92-1,1.4-2.4,1.4-3.96s-.48-2.96-1.4-3.96c-.68-.76-2-1.68-4.28-1.68h-5.04v17.04h2.68v-5.76h1.96l4.28,5.76h3l-4.56-6.16c.92-.32,1.56-.84,1.96-1.28h0Z"/>
|
||||||
|
<path class="st0" d="M926.84,95.22c-2.24,2.24-5.2,3.48-8.36,3.48s-6.12-1.24-8.36-3.48c-2.2-2.2-3.44-5.16-3.44-8.32s1.24-6.12,3.44-8.36c2.24-2.24,5.2-3.44,8.36-3.44s6.12,1.2,8.36,3.44c2.2,2.24,3.44,5.2,3.44,8.36s-1.24,6.12-3.44,8.32h0ZM932.28,81.06c-.72-1.8-1.8-3.4-3.2-4.76-1.36-1.4-2.96-2.48-4.76-3.24-1.84-.76-3.8-1.16-5.84-1.16s-4,.4-5.84,1.16c-1.8.76-3.4,1.84-4.76,3.24-1.4,1.36-2.48,2.96-3.24,4.76-.76,1.84-1.16,3.8-1.16,5.84s.4,3.96,1.16,5.84c.76,1.76,1.84,3.36,3.24,4.76,1.36,1.36,2.96,2.44,4.76,3.2,1.84.8,3.8,1.2,5.84,1.2s4-.4,5.84-1.2c1.8-.76,3.4-1.84,4.76-3.2,1.4-1.4,2.48-3,3.2-4.76.8-1.88,1.2-3.84,1.2-5.84s-.4-4-1.2-5.84h0Z"/>
|
||||||
|
<rect class="st1" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
<g id="Weiß">
|
||||||
|
<path class="st0" d="M722.09,99.86c2.97,0,5.55.66,7.74,1.99,2.19,1.33,3.91,3.25,5.14,5.78h14.4c-1.83-5.94-5.21-10.68-10.14-14.23-4.92-3.55-10.59-5.33-17-5.33-7.89,0-14.61,2.8-20.15,8.41-5.54,5.61-8.31,12.38-8.31,20.34s2.77,14.72,8.31,20.3c5.54,5.57,12.26,8.36,20.15,8.36,6.35,0,11.96-1.75,16.84-5.26,4.88-3.51,8.22-8.19,10.02-14.07h-14.4c-1.17,2.31-2.83,4.14-5,5.49-2.16,1.36-4.49,2.04-6.98,2.04-4.52,0-8.31-1.65-11.37-4.95-3.06-3.3-4.59-7.4-4.59-12.29,0-4.61,1.49-8.53,4.48-11.75,2.98-3.22,6.61-4.83,10.87-4.83h0Z"/>
|
||||||
|
<path class="st0" d="M772.74,104.74c3-3.25,6.71-4.88,11.13-4.88s8.18,1.63,11.18,4.88c3,3.25,4.5,7.28,4.5,12.08s-1.5,8.81-4.5,12.03c-3,3.22-6.73,4.83-11.18,4.83s-8.13-1.61-11.13-4.83c-3-3.22-4.5-7.23-4.5-12.03s1.5-8.82,4.5-12.08h0ZM783.87,145.47c7.96,0,14.72-2.79,20.29-8.36,5.57-5.57,8.36-12.34,8.36-20.3s-2.79-14.74-8.36-20.34c-5.57-5.6-12.34-8.41-20.29-8.41s-14.68,2.8-20.25,8.41c-5.57,5.61-8.36,12.38-8.36,20.34s2.79,14.72,8.36,20.3c5.57,5.57,12.32,8.36,20.25,8.36h0Z"/>
|
||||||
|
<path class="st0" d="M880,88.07c-6.67,0-12.11,2.27-16.31,6.82l-1.04,1.14-.95-1.14c-3.97-4.55-8.94-6.82-14.9-6.82-5.39-.03-10.06,2.05-14,6.25v-4.45h-12.03v53.8h12.93v-28.32c0-5.18.87-9.06,2.6-11.65,1.73-2.59,4.33-3.88,7.8-3.88s6.1,1.26,7.89,3.79c1.8,2.53,2.69,6.22,2.69,11.08v28.99h12.93v-28.32c0-5.18.89-9.06,2.66-11.65,1.77-2.59,4.45-3.88,8.02-3.88,3.35,0,5.91,1.14,7.67,3.41,1.76,2.27,2.64,5.6,2.64,9.99v30.45h12.93v-32.59c0-7.07-1.94-12.68-5.81-16.81-3.87-4.14-9.11-6.2-15.72-6.2h0Z"/>
|
||||||
|
<path class="st0" d="M79.57,114.02c-6,6.44-13.45,9.66-22.36,9.66s-16.26-3.22-22.26-9.66c-6-6.44-9-14.46-9-24.06s3-17.65,9-24.16c6-6.5,13.42-9.76,22.26-9.76s16.36,3.25,22.36,9.76c6,6.51,9,14.56,9,24.16s-3,17.62-9,24.06h0ZM57.22,32.46c-15.85,0-29.35,5.6-40.5,16.81C5.57,60.49,0,74.05,0,89.96s5.57,29.45,16.72,40.59c11.15,11.15,24.64,16.72,40.5,16.72s29.44-5.57,40.59-16.72c11.14-11.15,16.72-24.68,16.72-40.59s-5.57-29.47-16.72-40.69c-11.15-11.21-24.68-16.81-40.59-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="132.32 99.15 186.31 99.15 186.31 76.32 132.32 76.32 132.32 99.15 132.32 99.15"/>
|
||||||
|
<path class="st0" d="M286.89,114.12c-6.06,6.5-13.61,9.76-22.64,9.76s-16.45-3.25-22.45-9.76c-6.06-6.5-9.09-14.59-9.09-24.25s3.03-17.75,9.09-24.25c6.06-6.5,13.58-9.76,22.54-9.76s16.48,3.27,22.55,9.8c6.06,6.54,9.09,14.63,9.09,24.3s-3.03,17.65-9.09,24.16h0ZM268.42,32.46c-12.95,0-24.35,4.33-34.2,12.98V.16h-25.86v143.51h23.78v-11.37c10.1,9.91,22.17,14.9,36.19,14.97,14.9,0,27.57-5.57,37.99-16.72,10.42-11.15,15.63-24.68,15.63-40.59s-5.21-29.47-15.63-40.69c-10.42-11.21-23.05-16.81-37.89-16.81h0Z"/>
|
||||||
|
<polygon class="st0" points="422.73 36.06 408.16 36.06 381.86 106.35 381.75 106.35 357.28 36.06 328.08 36.06 367.44 134.06 347.51 179.95 374.87 179.95 437.39 36.06 422.73 36.06 422.73 36.06"/>
|
||||||
|
<polygon class="st0" points="496.29 36.06 480.66 36.06 480.66 0 454.8 0 454.8 36.06 442.4 36.06 442.4 58.8 454.8 58.8 454.8 143.67 480.66 143.67 480.66 58.8 496.29 58.8 496.29 36.06 496.29 36.06"/>
|
||||||
|
<path class="st0" d="M536.25,65.8c5.81-6.5,13.01-9.76,21.6-9.76s15.79,3.25,21.6,9.76c3.85,4.23,6.41,9.19,7.67,14.87h-58.64c1.45-5.62,4.04-10.58,7.77-14.87h0ZM557.85,147.27c12.57,0,23.65-3.4,33.25-10.18,9.6-6.79,16.13-15.9,19.61-27.33h-27.28c-2.15,4.23-5.48,7.61-9.99,10.14-4.52,2.53-9.49,3.79-14.92,3.79-8.78,0-16.1-3.22-21.98-9.66-3.41-3.79-5.84-8.02-7.29-12.69h83.93c.63-3.73.95-7.51.95-11.37,0-15.91-5.48-29.47-16.43-40.69-10.96-11.21-24.23-16.81-39.83-16.81s-28.78,5.6-39.74,16.81c-10.96,11.21-16.43,24.77-16.43,40.69s5.48,29.45,16.43,40.59c10.96,11.15,24.2,16.72,39.74,16.72h0Z"/>
|
||||||
|
<rect class="st0" x="626.17" y="86.67" width="57" height="57" rx="6.64" ry="6.64"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 29 KiB |
138
styleguide/assets/js/app.js
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
const $ = (selector, root = document) => root.querySelector(selector);
|
||||||
|
const $$ = (selector, root = document) => [...root.querySelectorAll(selector)];
|
||||||
|
|
||||||
|
const THEME_KEY = "obyte-theme";
|
||||||
|
const themeToggle = $("#themeToggle");
|
||||||
|
const toast = $("#toast");
|
||||||
|
let toastTimer = null;
|
||||||
|
|
||||||
|
function showToast(message) {
|
||||||
|
if (!toast) return;
|
||||||
|
toast.textContent = message;
|
||||||
|
toast.classList.add("is-on");
|
||||||
|
clearTimeout(toastTimer);
|
||||||
|
toastTimer = setTimeout(() => toast.classList.remove("is-on"), 1400);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function copyText(value) {
|
||||||
|
try {
|
||||||
|
await navigator.clipboard.writeText(value);
|
||||||
|
showToast("Kopiert: " + value);
|
||||||
|
} catch {
|
||||||
|
const fallback = document.createElement("textarea");
|
||||||
|
fallback.value = value;
|
||||||
|
fallback.style.position = "fixed";
|
||||||
|
fallback.style.left = "-9999px";
|
||||||
|
document.body.appendChild(fallback);
|
||||||
|
fallback.select();
|
||||||
|
document.execCommand("copy");
|
||||||
|
fallback.remove();
|
||||||
|
showToast("Kopiert: " + value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("click", (event) => {
|
||||||
|
const trigger = event.target.closest("[data-copy-value],[data-copy-block]");
|
||||||
|
if (!trigger) return;
|
||||||
|
|
||||||
|
const directValue = trigger.getAttribute("data-copy-value");
|
||||||
|
const blockSelector = trigger.getAttribute("data-copy-block");
|
||||||
|
|
||||||
|
if (directValue) {
|
||||||
|
copyText(directValue);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blockSelector) {
|
||||||
|
const block = $(blockSelector);
|
||||||
|
if (block) {
|
||||||
|
copyText(block.innerText.trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function applyTheme(theme) {
|
||||||
|
const isDark = theme === "dark";
|
||||||
|
document.documentElement.setAttribute("data-theme", isDark ? "dark" : "light");
|
||||||
|
|
||||||
|
if (themeToggle) {
|
||||||
|
themeToggle.setAttribute("aria-pressed", String(isDark));
|
||||||
|
themeToggle.textContent = isDark ? "Hell" : "Dunkel";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadInitialTheme() {
|
||||||
|
let savedTheme = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
savedTheme = localStorage.getItem(THEME_KEY);
|
||||||
|
} catch {
|
||||||
|
savedTheme = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (savedTheme === "light" || savedTheme === "dark") {
|
||||||
|
applyTheme(savedTheme);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
||||||
|
applyTheme(prefersDark ? "dark" : "light");
|
||||||
|
}
|
||||||
|
|
||||||
|
themeToggle?.addEventListener("click", () => {
|
||||||
|
const currentTheme = document.documentElement.getAttribute("data-theme");
|
||||||
|
const nextTheme = currentTheme === "dark" ? "light" : "dark";
|
||||||
|
|
||||||
|
applyTheme(nextTheme);
|
||||||
|
|
||||||
|
try {
|
||||||
|
localStorage.setItem(THEME_KEY, nextTheme);
|
||||||
|
} catch {
|
||||||
|
// Ignore storage errors in restrictive browser contexts.
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
loadInitialTheme();
|
||||||
|
|
||||||
|
const navToggle = $("#navToggle");
|
||||||
|
const navLinks = $("#navLinks");
|
||||||
|
|
||||||
|
navToggle?.addEventListener("click", () => {
|
||||||
|
const open = navLinks?.classList.toggle("is-open");
|
||||||
|
navToggle.setAttribute("aria-expanded", String(open));
|
||||||
|
});
|
||||||
|
|
||||||
|
$$(".navlink").forEach((link) => {
|
||||||
|
link.addEventListener("click", () => {
|
||||||
|
if (window.matchMedia("(max-width: 980px)").matches) {
|
||||||
|
navLinks?.classList.remove("is-open");
|
||||||
|
navToggle?.setAttribute("aria-expanded", "false");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const sections = $$(".section");
|
||||||
|
const links = $$(".navlink");
|
||||||
|
|
||||||
|
function setActive(id) {
|
||||||
|
links.forEach((link) => {
|
||||||
|
link.classList.toggle("is-active", link.getAttribute("href") === "#" + id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const observer = new IntersectionObserver(
|
||||||
|
(entries) => {
|
||||||
|
entries.forEach((entry) => {
|
||||||
|
if (entry.isIntersecting && entry.target.id) {
|
||||||
|
setActive(entry.target.id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ threshold: 0.28 }
|
||||||
|
);
|
||||||
|
|
||||||
|
sections.forEach((section) => observer.observe(section));
|
||||||
|
|
||||||
|
if (location.hash) {
|
||||||
|
setActive(location.hash.replace("#", ""));
|
||||||
|
}
|
||||||
886
styleguide/index.html
Normal file
@@ -0,0 +1,886 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||||
|
<meta name="color-scheme" content="light dark" />
|
||||||
|
<meta
|
||||||
|
name="description"
|
||||||
|
content="Styleguide für die Marke o-byte.com mit Regeln für Logo, Farben, Typografie, Tonalität, Bildsprache und UI-Komponenten."
|
||||||
|
/>
|
||||||
|
<title>o-byte.com - Styleguide</title>
|
||||||
|
<link rel="stylesheet" href="./assets/css/style.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<a class="skip-link" href="#content">Zum Inhalt springen</a>
|
||||||
|
<div class="app">
|
||||||
|
<aside class="sidenav" aria-label="Navigation">
|
||||||
|
<div class="sidenav__top">
|
||||||
|
<a class="brand" href="#intro" aria-label="o-byte.com Styleguide">
|
||||||
|
<img class="brand__logo" src="./assets/img/o-byte_Logo_2024_White.svg" alt="o-byte.com" />
|
||||||
|
</a>
|
||||||
|
<div class="sidenav__controls">
|
||||||
|
<button
|
||||||
|
class="btn btn--ghost btn--tiny"
|
||||||
|
id="themeToggle"
|
||||||
|
type="button"
|
||||||
|
aria-pressed="false"
|
||||||
|
aria-label="Farbmodus umschalten"
|
||||||
|
>
|
||||||
|
Dunkel
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="btn btn--ghost btn--tiny sidenav__toggle"
|
||||||
|
id="navToggle"
|
||||||
|
type="button"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="navLinks"
|
||||||
|
>
|
||||||
|
Menü
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<nav class="sidenav__nav" id="navLinks">
|
||||||
|
<a class="navlink" href="#intro">Intro</a>
|
||||||
|
<a class="navlink" href="#foundation">Marke</a>
|
||||||
|
<a class="navlink" href="#tone">Tonalität</a>
|
||||||
|
<a class="navlink" href="#logo">Logo</a>
|
||||||
|
<a class="navlink" href="#colors">Farben</a>
|
||||||
|
<a class="navlink" href="#typography">Typografie</a>
|
||||||
|
<a class="navlink" href="#imagery">Bildsprache</a>
|
||||||
|
<a class="navlink" href="#components">Komponenten</a>
|
||||||
|
<a class="navlink" href="#accessibility">Accessibility</a>
|
||||||
|
<a class="navlink" href="#tokens">Tokens</a>
|
||||||
|
</nav>
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
<main class="main" id="content">
|
||||||
|
<header class="hero section" id="intro">
|
||||||
|
<div class="hero__card">
|
||||||
|
<div class="hero__grid">
|
||||||
|
<div class="hero__main">
|
||||||
|
<p class="kicker">o-byte.com Brand Guide 2026</p>
|
||||||
|
<h1>Kommunikation, die im Alltag spürbar entlastet.</h1>
|
||||||
|
<p class="lead">
|
||||||
|
Dieser Styleguide übersetzt den Markenauftritt von o-byte.com in klare Regeln
|
||||||
|
für Design, Sprache und Anwendung. Technisch stark, visuell fokussiert und
|
||||||
|
konsequent serviceorientiert.
|
||||||
|
</p>
|
||||||
|
<div class="cluster">
|
||||||
|
<span class="pill pill--brand">ITK-Systemhaus</span>
|
||||||
|
<span class="pill">B2B</span>
|
||||||
|
<span class="pill">Telefonie & Integration</span>
|
||||||
|
<span class="pill">Gemeinsam erfolgreich</span>
|
||||||
|
</div>
|
||||||
|
<div class="row row--wrap hero__actions">
|
||||||
|
<a class="btn btn--primary" href="#colors">Farbsystem</a>
|
||||||
|
<a class="btn btn--light" href="#tokens">Tokens kopieren</a>
|
||||||
|
<a class="btn btn--light" href="./assets/img/o-byte_Logo_2024_Light.svg" download>Logo SVG</a>
|
||||||
|
<a class="btn btn--light" href="./assets/img/o-Byte%20Favicon_Light.svg" download>Favicon SVG</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<aside class="hero__signal" aria-label="Brand Snapshot">
|
||||||
|
<div class="hero__logo-stage">
|
||||||
|
<img src="./assets/img/o-byte_Logo_2024_Dark.svg" alt="o-byte.com Logo Dark" />
|
||||||
|
</div>
|
||||||
|
<div class="hero__metrics">
|
||||||
|
<div class="hero__metric">
|
||||||
|
<span class="hero__metric-chip" style="background:#00A7E6"></span>
|
||||||
|
<span class="hero__metric-label">Primary</span>
|
||||||
|
<strong>#00A7E6</strong>
|
||||||
|
</div>
|
||||||
|
<div class="hero__metric">
|
||||||
|
<span class="hero__metric-chip" style="background:#F59C00"></span>
|
||||||
|
<span class="hero__metric-label">Akzent</span>
|
||||||
|
<strong>#F59C00</strong>
|
||||||
|
</div>
|
||||||
|
<div class="hero__metric">
|
||||||
|
<span class="hero__metric-chip" style="background:#F5FBFE"></span>
|
||||||
|
<span class="hero__metric-label">Background</span>
|
||||||
|
<strong>#F5FBFE</strong>
|
||||||
|
</div>
|
||||||
|
<div class="hero__metric">
|
||||||
|
<span class="hero__metric-chip" style="background:#343537"></span>
|
||||||
|
<span class="hero__metric-label">Slate</span>
|
||||||
|
<strong>#343537</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="hero__tagline">
|
||||||
|
Leitmotiv: <strong>Gemeinsam erfolgreich</strong>.
|
||||||
|
</p>
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<section class="section" id="foundation">
|
||||||
|
<div class="section__head">
|
||||||
|
<h2>Markenfundament</h2>
|
||||||
|
<p class="muted">
|
||||||
|
Positionierung und Kernbotschaft als inhaltlicher Rahmen für Website, Vertrieb,
|
||||||
|
Support und Produktkommunikation.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--2">
|
||||||
|
<article class="card">
|
||||||
|
<h3>Positionierung</h3>
|
||||||
|
<p>
|
||||||
|
o-byte.com ist ein spezialisiertes ITK-Systemhaus für moderne Business-
|
||||||
|
Kommunikation mit Fokus auf IP-basierte Telefonie, STARFACE und
|
||||||
|
integrationsgetriebene Erweiterungen.
|
||||||
|
</p>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Von Planung und Umsetzung bis Support aus einer Hand.</li>
|
||||||
|
<li>Partnerorientiert mit konkretem Kundennutzen statt Buzzwords.</li>
|
||||||
|
<li>Technisch tief, in der Kommunikation trotzdem verständlich.</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Markenversprechen</h3>
|
||||||
|
<p>
|
||||||
|
Wir liefern lösungsorientierte Telekommunikation, die im Tagesgeschäft messbar
|
||||||
|
entlastet: bessere Erreichbarkeit, weniger Reibung, klare Prozesse.
|
||||||
|
</p>
|
||||||
|
<div class="quote">
|
||||||
|
<p class="quote__text">"Gemeinsam erfolgreich" ist Leitmotiv, nicht Claim-Dekoration.</p>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--3">
|
||||||
|
<article class="card metric">
|
||||||
|
<h3>Werte</h3>
|
||||||
|
<p>Verlässlichkeit, Erreichbarkeit, Pragmatismus und Qualität.</p>
|
||||||
|
</article>
|
||||||
|
<article class="card metric">
|
||||||
|
<h3>Zielgruppen</h3>
|
||||||
|
<p>KMU, Kanzleien, Praxen, Industrie und Partner mit Integrationsbedarf.</p>
|
||||||
|
</article>
|
||||||
|
<article class="card metric">
|
||||||
|
<h3>Markenton</h3>
|
||||||
|
<p>Sachlich positiv, kompetent, auf Augenhöhe.</p>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section" id="tone">
|
||||||
|
<div class="section__head">
|
||||||
|
<h2>Tonalität</h2>
|
||||||
|
<p class="muted">Wie o-byte.com spricht: serviceorientiert, klar und lösungsfokussiert.</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--2 voice-grid">
|
||||||
|
<article class="card">
|
||||||
|
<h3>Do</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Konkrete Ergebnisse und Nutzen zuerst benennen.</li>
|
||||||
|
<li>Aktive Sprache und direkte Handlungsangebote verwenden.</li>
|
||||||
|
<li>Technik erklären, ohne Überheblichkeit oder Jargon-Last.</li>
|
||||||
|
<li>Partnerschaftlich formulieren: gemeinsam, wir, zusammen.</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Don't</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Leere Marketingphrasen ohne Substanz oder Beispiel.</li>
|
||||||
|
<li>Unnötig komplizierte Fachterminologie in Standardtexten.</li>
|
||||||
|
<li>Reißerische Versprechen ohne realistische Einordnung.</li>
|
||||||
|
<li>Kühle Distanzsprache ohne Servicebezug.</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Textbausteine (Beispiele)</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Kontext</th>
|
||||||
|
<th>Empfohlen</th>
|
||||||
|
<th>Vermeiden</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>CTA</td>
|
||||||
|
<td>"IT-Systemhaus anfragen"</td>
|
||||||
|
<td>"Jetzt revolutionieren"</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Support</td>
|
||||||
|
<td>"Wir kümmern uns direkt um Ihr Anliegen."</td>
|
||||||
|
<td>"Bitte Ticket abwarten."</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Produkt</td>
|
||||||
|
<td>"Integration in DATEV und bestehende Prozesse."</td>
|
||||||
|
<td>"Disruptive End-to-End-Synergien."</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section" id="logo">
|
||||||
|
<div class="section__head">
|
||||||
|
<h2>Logo und Favicon</h2>
|
||||||
|
<p class="muted">Verbindliche Varianten für helle und dunkle Hintergründe.</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--2">
|
||||||
|
<article class="card">
|
||||||
|
<h3>Logo-Varianten</h3>
|
||||||
|
<div class="logo-grid">
|
||||||
|
<div class="logo-stage logo-stage--light">
|
||||||
|
<img src="./assets/img/o-byte_Logo_2024_Light.svg" alt="o-byte.com Logo light" />
|
||||||
|
</div>
|
||||||
|
<p class="muted small">Auf hellen Flächen: Light-Variante.</p>
|
||||||
|
<div class="logo-stage logo-stage--dark">
|
||||||
|
<img src="./assets/img/o-byte_Logo_2024_Dark.svg" alt="o-byte.com Logo dark" />
|
||||||
|
</div>
|
||||||
|
<div class="logo-stage logo-stage--dark">
|
||||||
|
<img src="./assets/img/o-byte_Logo_2024_White.svg" alt="o-byte.com Logo white" />
|
||||||
|
</div>
|
||||||
|
<p class="muted small">Auf dunklen Flächen: Dark oder White je nach Kontrast.</p>
|
||||||
|
</div>
|
||||||
|
<div class="row row--wrap asset-actions">
|
||||||
|
<a class="btn btn--light btn--sm" href="./assets/img/o-byte_Logo_2024_Light.svg" download>Logo Light</a>
|
||||||
|
<a class="btn btn--light btn--sm" href="./assets/img/o-byte_Logo_2024_Dark.svg" download>Logo Dark</a>
|
||||||
|
<a class="btn btn--light btn--sm" href="./assets/img/o-byte_Logo_2024_White.svg" download>Logo White</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<article class="card">
|
||||||
|
<h3>Favicon-Varianten</h3>
|
||||||
|
<div class="logo-grid">
|
||||||
|
<div class="logo-stage logo-stage--light logo-stage--icon">
|
||||||
|
<img src="./assets/img/o-Byte%20Favicon_Light.svg" alt="o-byte.com Favicon light" />
|
||||||
|
</div>
|
||||||
|
<p class="muted small">Auf hellen Flächen: Light-Favicon.</p>
|
||||||
|
<div class="logo-stage logo-stage--dark logo-stage--icon">
|
||||||
|
<img src="./assets/img/o-Byte%20Favicon_Dark.svg" alt="o-byte.com Favicon dark" />
|
||||||
|
</div>
|
||||||
|
<p class="muted small">Auf dunklen Flächen: Dark-Favicon.</p>
|
||||||
|
</div>
|
||||||
|
<div class="row row--wrap asset-actions">
|
||||||
|
<a class="btn btn--light btn--sm" href="./assets/img/o-Byte%20Favicon_Light.svg" download>Favicon Light</a>
|
||||||
|
<a class="btn btn--light btn--sm" href="./assets/img/o-Byte%20Favicon_Dark.svg" download>Favicon Dark</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Sondervariante: Clean</h3>
|
||||||
|
<div class="logo-grid">
|
||||||
|
<div class="logo-stage logo-stage--light">
|
||||||
|
<img src="./assets/img/o-byte_Logo_2024_Light_clean.svg" alt="o-byte.com Logo light clean" />
|
||||||
|
</div>
|
||||||
|
<div class="logo-stage logo-stage--dark">
|
||||||
|
<img src="./assets/img/o-byte_Logo_2024_Dark_clean.svg" alt="o-byte.com Logo dark clean" />
|
||||||
|
</div>
|
||||||
|
<div class="logo-stage logo-stage--dark">
|
||||||
|
<img src="./assets/img/o-byte_Logo_2024_White_clean.svg" alt="o-byte.com Logo white clean" />
|
||||||
|
</div>
|
||||||
|
<p class="muted small">
|
||||||
|
<strong>Clean:</strong> ohne Kennzeichnung der registrierten Marke und ohne
|
||||||
|
"Telekommunikation". Nur für technische Sonderfälle, wenn das reguläre Logo
|
||||||
|
prozessbedingt nicht nutzbar ist, und ausschließlich nach Rücksprache mit der
|
||||||
|
Marketingabteilung von o-byte.com.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="row row--wrap asset-actions">
|
||||||
|
<a class="btn btn--light btn--sm" href="./assets/img/o-byte_Logo_2024_Light_clean.svg" download>Logo Clean Light</a>
|
||||||
|
<a class="btn btn--light btn--sm" href="./assets/img/o-byte_Logo_2024_Dark_clean.svg" download>Logo Clean Dark</a>
|
||||||
|
<a class="btn btn--light btn--sm" href="./assets/img/o-byte_Logo_2024_White_clean.svg" download>Logo Clean White</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Sondervariante: Web-App</h3>
|
||||||
|
<div class="logo-grid">
|
||||||
|
<div class="logo-stage logo-stage--light">
|
||||||
|
<img src="./assets/img/o-byte_Logo_2024_Light_web_app.svg" alt="o-byte.com Logo light web app" />
|
||||||
|
</div>
|
||||||
|
<p class="muted small">
|
||||||
|
<strong>Web-App:</strong> Kennzeichnung der Plattform innerhalb von Webanwendungen
|
||||||
|
(z. B. Portal, OLM, Dashboard), um den aktuellen Produktkontext sichtbar zu machen.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="row row--wrap asset-actions">
|
||||||
|
<a class="btn btn--light btn--sm" href="./assets/img/o-byte_Logo_2024_Light_web_app.svg" download>Logo Web-App</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--2 logo-rules">
|
||||||
|
<article class="card">
|
||||||
|
<h3>Schutzzone und Mindestgröße</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Schutzzone: mindestens 0.5x der Signethöhe rund um das Zeichen.</li>
|
||||||
|
<li>Mindestbreite Logo digital: 140 px.</li>
|
||||||
|
<li>Mindestgröße Favicon digital: 24 x 24 px, empfohlen ab 32 px.</li>
|
||||||
|
<li>Nie auf unruhigen Hintergründen ohne Kontrastfläche platzieren.</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Unzulässige Nutzung</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Kein Verzerren, Kippen oder Rotieren.</li>
|
||||||
|
<li>Keine freien Umfärbungen außer den definierten Varianten.</li>
|
||||||
|
<li>Keine Schatten-, Glow- oder 3D-Effekte.</li>
|
||||||
|
<li>Keine Transparenzreduktion, die die Lesbarkeit mindert.</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section" id="colors">
|
||||||
|
<div class="section__head">
|
||||||
|
<h2>Farbsystem</h2>
|
||||||
|
<p class="muted">
|
||||||
|
o-byte Blue basiert auf festen Shades und Tints. Hauptfarbe, Hilfsfarbe und
|
||||||
|
Hintergrund sind auf die definierte Blau-Skala abgestimmt.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--3">
|
||||||
|
<article class="card swatch">
|
||||||
|
<div class="swatch__chip" style="background:#00A7E6"></div>
|
||||||
|
<div class="swatch__meta">
|
||||||
|
<strong>Hauptfarbe: o-byte Blue</strong>
|
||||||
|
<span>#00A7E6</span>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn--light btn--sm" data-copy-value="#00A7E6">HEX kopieren</button>
|
||||||
|
</article>
|
||||||
|
<article class="card swatch">
|
||||||
|
<div class="swatch__chip" style="background:#33B9EB"></div>
|
||||||
|
<div class="swatch__meta">
|
||||||
|
<strong>Hilfsfarbe: Blue Tint 1</strong>
|
||||||
|
<span>#33B9EB</span>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn--light btn--sm" data-copy-value="#33B9EB">HEX kopieren</button>
|
||||||
|
</article>
|
||||||
|
<article class="card swatch">
|
||||||
|
<div class="swatch__chip" style="background:#F5FBFE"></div>
|
||||||
|
<div class="swatch__meta">
|
||||||
|
<strong>Hintergrund</strong>
|
||||||
|
<span>#F5FBFE</span>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn--light btn--sm" data-copy-value="#F5FBFE">HEX kopieren</button>
|
||||||
|
</article>
|
||||||
|
<article class="card swatch">
|
||||||
|
<div class="swatch__chip" style="background:#F59C00"></div>
|
||||||
|
<div class="swatch__meta">
|
||||||
|
<strong>Akzentfarbe</strong>
|
||||||
|
<span>#F59C00</span>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn--light btn--sm" data-copy-value="#F59C00">HEX kopieren</button>
|
||||||
|
</article>
|
||||||
|
<article class="card swatch">
|
||||||
|
<div class="swatch__chip" style="background:#343537"></div>
|
||||||
|
<div class="swatch__meta">
|
||||||
|
<strong>Slate</strong>
|
||||||
|
<span>#343537</span>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn--light btn--sm" data-copy-value="#343537">HEX kopieren</button>
|
||||||
|
</article>
|
||||||
|
<article class="card swatch">
|
||||||
|
<div class="swatch__chip" style="background:#FFFFFF"></div>
|
||||||
|
<div class="swatch__meta">
|
||||||
|
<strong>White</strong>
|
||||||
|
<span>#FFFFFF</span>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn--light btn--sm" data-copy-value="#FFFFFF">HEX kopieren</button>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--2">
|
||||||
|
<article class="card">
|
||||||
|
<h3>20% Shades von #00A7E6</h3>
|
||||||
|
<div class="tone-swatches">
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#0086B8" aria-label="HEX kopieren #0086B8">
|
||||||
|
<span class="tone-swatch__chip" style="background:#0086B8"></span>
|
||||||
|
<span class="tone-swatch__value">#0086B8</span>
|
||||||
|
</button>
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#00648A" aria-label="HEX kopieren #00648A">
|
||||||
|
<span class="tone-swatch__chip" style="background:#00648A"></span>
|
||||||
|
<span class="tone-swatch__value">#00648A</span>
|
||||||
|
</button>
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#00435C" aria-label="HEX kopieren #00435C">
|
||||||
|
<span class="tone-swatch__chip" style="background:#00435C"></span>
|
||||||
|
<span class="tone-swatch__value">#00435C</span>
|
||||||
|
</button>
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#00212E" aria-label="HEX kopieren #00212E">
|
||||||
|
<span class="tone-swatch__chip" style="background:#00212E"></span>
|
||||||
|
<span class="tone-swatch__value">#00212E</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>20% Tints von #00A7E6</h3>
|
||||||
|
<div class="tone-swatches">
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#33B9EB" aria-label="HEX kopieren #33B9EB">
|
||||||
|
<span class="tone-swatch__chip" style="background:#33B9EB"></span>
|
||||||
|
<span class="tone-swatch__value">#33B9EB</span>
|
||||||
|
</button>
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#66CAF0" aria-label="HEX kopieren #66CAF0">
|
||||||
|
<span class="tone-swatch__chip" style="background:#66CAF0"></span>
|
||||||
|
<span class="tone-swatch__value">#66CAF0</span>
|
||||||
|
</button>
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#99DCF5" aria-label="HEX kopieren #99DCF5">
|
||||||
|
<span class="tone-swatch__chip" style="background:#99DCF5"></span>
|
||||||
|
<span class="tone-swatch__value">#99DCF5</span>
|
||||||
|
</button>
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#CCEDFA" aria-label="HEX kopieren #CCEDFA">
|
||||||
|
<span class="tone-swatch__chip" style="background:#CCEDFA"></span>
|
||||||
|
<span class="tone-swatch__value">#CCEDFA</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<article class="card color-usage">
|
||||||
|
<h3>Einsatzlogik</h3>
|
||||||
|
<div class="tone-swatches" aria-label="Einsatzlogik Farbswatches">
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#00A7E6" aria-label="HEX kopieren #00A7E6">
|
||||||
|
<span class="tone-swatch__chip" style="background:#00A7E6"></span>
|
||||||
|
<span class="tone-swatch__value">#00A7E6</span>
|
||||||
|
<span>Hauptfarbe: aktive Buttons, Links und Markenflächen</span>
|
||||||
|
</button>
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#33B9EB" aria-label="HEX kopieren #33B9EB">
|
||||||
|
<span class="tone-swatch__chip" style="background:#33B9EB"></span>
|
||||||
|
<span class="tone-swatch__value">#33B9EB</span>
|
||||||
|
<span>Hilfsfarbe: sekundäre Highlights und unterstützende Flächen</span>
|
||||||
|
</button>
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#F5FBFE" aria-label="HEX kopieren #F5FBFE">
|
||||||
|
<span class="tone-swatch__chip" style="background:#F5FBFE"></span>
|
||||||
|
<span class="tone-swatch__value">#F5FBFE</span>
|
||||||
|
<span>Hintergrund: ruhige, lesbare Content-Bereiche</span>
|
||||||
|
</button>
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#F59C00" aria-label="HEX kopieren #F59C00">
|
||||||
|
<span class="tone-swatch__chip" style="background:#F59C00"></span>
|
||||||
|
<span class="tone-swatch__value">#F59C00</span>
|
||||||
|
<span>Akzent: gezielte visuelle Priorisierung</span>
|
||||||
|
</button>
|
||||||
|
<button class="tone-swatch" type="button" data-copy-value="#343537" aria-label="HEX kopieren #343537">
|
||||||
|
<span class="tone-swatch__chip" style="background:#343537"></span>
|
||||||
|
<span class="tone-swatch__value">#343537</span>
|
||||||
|
<span>Slate: Headlines, Navigation und starke Kontraste</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<p class="muted small">Shades nur für mehr Tiefe und Kontrast, Tints nur für leichte Flächen nutzen.</p>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section" id="typography">
|
||||||
|
<div class="section__head">
|
||||||
|
<h2>Typografie</h2>
|
||||||
|
<p class="muted">Fließ- und Sekundärüberschriften in Nunito, Primär-Akzente weiterhin in URW Gothic L Demi.</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--2">
|
||||||
|
<article class="card">
|
||||||
|
<h3>Nunito live in der Anwendung</h3>
|
||||||
|
<div class="type-sample">
|
||||||
|
<p class="type-kicker">Einsatzbereich: H2-H4 + Fließtext</p>
|
||||||
|
<p class="type-h2-demo">Stabiler Betrieb im Tagesgeschäft</p>
|
||||||
|
<p class="type-body-demo">
|
||||||
|
Nunito ist die Standardschrift für längere Inhalte. Sie bleibt bei normaler
|
||||||
|
Lesedistanz ruhig, gut scanbar und belastet die Augen auch in längeren Texten nicht.
|
||||||
|
</p>
|
||||||
|
<p class="type-meta">Empfohlen: 17 px / 1.58 Zeilenhöhe / linksbündig</p>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>URW Demi live in der Anwendung</h3>
|
||||||
|
<div class="type-sample">
|
||||||
|
<p class="type-kicker">Einsatzbereich: H1 + CTA + Primärakzent</p>
|
||||||
|
<p class="type-h1-demo">Kommunikation, die entlastet.</p>
|
||||||
|
<div class="row row--wrap">
|
||||||
|
<button class="btn btn--primary" type="button">Beratung anfragen</button>
|
||||||
|
<button class="btn btn--light" type="button">Mehr erfahren</button>
|
||||||
|
</div>
|
||||||
|
<p class="type-meta">URW Demi bewusst punktuell nutzen, nicht für lange Lesetexte.</p>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Direkter Schriftvergleich</h3>
|
||||||
|
<div class="grid grid--2 type-compare">
|
||||||
|
<div class="type-sample">
|
||||||
|
<p class="type-kicker">Nunito (Body/H2-H4)</p>
|
||||||
|
<p class="type-compare-line type-compare-line--body">Kommunikation auf Augenhöhe. Klar, direkt, verlässlich.</p>
|
||||||
|
<p class="type-glyph-line type-glyph-line--body">Aa Bb Cc Dd Ee Ff Gg ÄÖÜ äöü ß 0123456789</p>
|
||||||
|
</div>
|
||||||
|
<div class="type-sample">
|
||||||
|
<p class="type-kicker">URW Gothic L Demi (H1/CTA)</p>
|
||||||
|
<p class="type-compare-line type-compare-line--strong">Kommunikation auf Augenhöhe. Klar, direkt, verlässlich.</p>
|
||||||
|
<p class="type-glyph-line type-glyph-line--strong">Aa Bb Cc Dd Ee Ff Gg ÄÖÜ äöü ß 0123456789</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Typografische Skala</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Element</th>
|
||||||
|
<th>Größe</th>
|
||||||
|
<th>Gewicht</th>
|
||||||
|
<th>Zeilenhöhe</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>H1</td>
|
||||||
|
<td>40-60 px (responsive)</td>
|
||||||
|
<td>600 (URW Gothic L Demi)</td>
|
||||||
|
<td>1.03</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>H2</td>
|
||||||
|
<td>30 px</td>
|
||||||
|
<td>700 (Nunito)</td>
|
||||||
|
<td>1.15</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>H3</td>
|
||||||
|
<td>21 px</td>
|
||||||
|
<td>700 (Nunito)</td>
|
||||||
|
<td>1.2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Body</td>
|
||||||
|
<td>17 px</td>
|
||||||
|
<td>400-700 (Nunito)</td>
|
||||||
|
<td>1.58</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<div class="grid grid--2">
|
||||||
|
<article class="card">
|
||||||
|
<h3>Verbindliche Satzregeln</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Fließtext standardmäßig 17 px in Nunito, niemals kleiner als 16 px.</li>
|
||||||
|
<li>Lesetexte mit Zeilenhöhe 1.5 bis 1.65 setzen; Headlines enger führen (1.03 bis 1.2).</li>
|
||||||
|
<li>Zeilenlänge für längere Texte zwischen 45 und 75 Zeichen halten.</li>
|
||||||
|
<li>Text linksbündig, kein Blocksatz in Fließtexten.</li>
|
||||||
|
<li>Versalien nur für kurze Labels/Kicker einsetzen, nicht für ganze Absätze.</li>
|
||||||
|
<li>Fettungen sparsam nutzen: maximal ein Fokuspunkt pro Satz oder UI-Element.</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Hierarchie-Definition</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>H1 ist der einzige visuelle Primäranker einer Seite und bleibt in URW Gothic L Demi.</li>
|
||||||
|
<li>H2 strukturiert Hauptabschnitte in Nunito 700 und muss inhaltlich scanbar formuliert sein.</li>
|
||||||
|
<li>H3 benennt konkrete Teilthemen, Komponenten oder Arbeitsschritte.</li>
|
||||||
|
<li>Body trägt die Information: neutral, klar, ohne dekorative Effekte.</li>
|
||||||
|
<li>Buttons und CTAs bleiben in URW Gothic L Demi, damit Handlungsaufforderungen sofort auffallen.</li>
|
||||||
|
<li>In einer Card nie mehr als drei Hierarchieebenen kombinieren (z. B. H3, Body, Label).</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Do / Don't Beispiele</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Kontext</th>
|
||||||
|
<th>Do</th>
|
||||||
|
<th>Don't</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Absatz</td>
|
||||||
|
<td>Kurze, klare Sätze mit 1-2 Kernaussagen pro Absatz.</td>
|
||||||
|
<td>Verschachtelte Satzkonstruktionen mit vielen Nebensätzen.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Headline</td>
|
||||||
|
<td>Nutzenorientiert und konkret, z. B. "Support in unter 2 Stunden".</td>
|
||||||
|
<td>Abstrakt oder werblich, z. B. "Kommunikation neu gedacht".</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>CTA</td>
|
||||||
|
<td>Verb + Ergebnis, z. B. "Angebot anfordern".</td>
|
||||||
|
<td>Unklare Labels wie "Mehr" oder "Weiter".</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Hervorhebung</td>
|
||||||
|
<td>Wichtige Begriffe punktuell fett markieren.</td>
|
||||||
|
<td>Ganze Absätze dauerhaft fett setzen.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Implementierungsbeispiele</h3>
|
||||||
|
<p class="muted small">Beispiel für saubere Text-Hierarchie mit den festgelegten Schriftrollen.</p>
|
||||||
|
<pre class="code"><code><section>
|
||||||
|
<h2>Service-Level und Erreichbarkeit</h2>
|
||||||
|
<p>Unser Support reagiert werktags innerhalb von zwei Stunden.</p>
|
||||||
|
<button class="btn btn--primary">Anfrage senden</button>
|
||||||
|
</section></code></pre>
|
||||||
|
<p class="muted small">Passende Token-Zuordnung in CSS.</p>
|
||||||
|
<pre class="code"><code>:root {
|
||||||
|
--ob-font-body: "Nunito", "Segoe UI", Arial, sans-serif;
|
||||||
|
--ob-font-heading: "Nunito", "Segoe UI", Arial, sans-serif;
|
||||||
|
--ob-font-strong: "URW Gothic L Demi", "Nunito", "Segoe UI", Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 { font-family: var(--ob-font-strong); }
|
||||||
|
h2, h3, h4 { font-family: var(--ob-font-heading); }
|
||||||
|
body { font-family: var(--ob-font-body); }</code></pre>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section" id="imagery">
|
||||||
|
<div class="section__head">
|
||||||
|
<h2>Bildsprache</h2>
|
||||||
|
<p class="muted">Abgeleitet aus dem Auftritt: Menschen, Teams, echte Situationen, klare Kontraste.</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--2">
|
||||||
|
<article class="card">
|
||||||
|
<h3>Bildprinzipien</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Authentische Team- und Kundenszenen statt generischer Stock-Inszenierung.</li>
|
||||||
|
<li>Fokus auf Beratung, Zusammenarbeit, Support und konkrete Arbeitssituationen.</li>
|
||||||
|
<li>Helle, aufgeräumte Motive mit natürlicher Farbtemperatur.</li>
|
||||||
|
<li>Personen klar erkennbar, freundliche aber professionelle Haltung.</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Nicht verwenden</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Überinszenierte Futuristik (neon, holografische Fake-Interfaces).</li>
|
||||||
|
<li>Stark entsättigte oder dramatisch dunkle Bildlooks ohne Markenbezug.</li>
|
||||||
|
<li>Beliebige Handschlag-Stockfotos ohne realen Kontext.</li>
|
||||||
|
<li>Unruhige Hintergründe, die Textlesbarkeit reduzieren.</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Bildbearbeitung und Overlay</h3>
|
||||||
|
<p class="muted">
|
||||||
|
Nur dezente Korrekturen: Kontrast +5 bis +10, Sättigung maximal +6, kein harter
|
||||||
|
Farbstich. Text auf Bildern immer mit Kontrastfläche (hell/dunkel) absichern.
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section" id="components">
|
||||||
|
<div class="section__head">
|
||||||
|
<h2>UI-Komponenten</h2>
|
||||||
|
<p class="muted">Robuste Standardbausteine für Website, Landingpages und Kundenportal.</p>
|
||||||
|
</div>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Hero</h3>
|
||||||
|
<div class="component-hero">
|
||||||
|
<p class="component-hero__kicker">Einstiegskomponente</p>
|
||||||
|
<p class="component-hero__title">Kommunikation, die im Alltag spürbar entlastet.</p>
|
||||||
|
<p class="component-hero__text">
|
||||||
|
Der Hero transportiert Nutzen, Positionierung und klare Handlungsoptionen innerhalb
|
||||||
|
der ersten Bildschirmansicht.
|
||||||
|
</p>
|
||||||
|
<div class="row row--wrap">
|
||||||
|
<button class="btn btn--primary" type="button">IT-Systemhaus anfragen</button>
|
||||||
|
<button class="btn btn--light" type="button">Mehr erfahren</button>
|
||||||
|
</div>
|
||||||
|
<div class="cluster">
|
||||||
|
<span class="pill">ITK-Systemhaus</span>
|
||||||
|
<span class="pill">B2B</span>
|
||||||
|
<span class="pill">Telefonie & Integration</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="muted small">
|
||||||
|
Einsatz: immer als erste inhaltliche Komponente einer Seite, mit 1 Primär-CTA und
|
||||||
|
maximal 1-2 Sekundäraktionen.
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
|
<div class="grid grid--2">
|
||||||
|
<article class="card">
|
||||||
|
<h3>Buttons</h3>
|
||||||
|
<div class="row row--wrap">
|
||||||
|
<button class="btn btn--primary" type="button">IT-Systemhaus anfragen</button>
|
||||||
|
<button class="btn btn--light" type="button">Mehr erfahren</button>
|
||||||
|
<button class="btn btn--light btn--sm" type="button">Sekundär</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Status</h3>
|
||||||
|
<div class="row row--wrap">
|
||||||
|
<span class="pill">Standard</span>
|
||||||
|
<span class="pill pill--brand">Aktiv</span>
|
||||||
|
<span class="pill pill--accent">Priorität</span>
|
||||||
|
<span class="pill pill--success">Verfügbar</span>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--2 component-stack">
|
||||||
|
<article class="card">
|
||||||
|
<h3>Kontaktformular</h3>
|
||||||
|
<form class="demo-form" action="#" method="post" onsubmit="return false">
|
||||||
|
<label class="field">
|
||||||
|
<span>Firma</span>
|
||||||
|
<input class="input" type="text" placeholder="Beispiel GmbH" />
|
||||||
|
</label>
|
||||||
|
<label class="field">
|
||||||
|
<span>E-Mail</span>
|
||||||
|
<input class="input" type="email" placeholder="kontakt@firma.de" />
|
||||||
|
</label>
|
||||||
|
<label class="field">
|
||||||
|
<span>Nachricht</span>
|
||||||
|
<textarea class="input" rows="4" placeholder="Wie können wir unterstützen?"></textarea>
|
||||||
|
</label>
|
||||||
|
<button class="btn btn--primary btn--sm" type="submit">Absenden</button>
|
||||||
|
</form>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Hinweis-Box</h3>
|
||||||
|
<div class="alert">
|
||||||
|
<strong>Service-Hinweis:</strong>
|
||||||
|
<span>Support-Anfragen immer mit Erreichbarkeit und kurzer Problembeschreibung einreichen.</span>
|
||||||
|
</div>
|
||||||
|
<p class="muted small">Alerts werden sachlich formuliert, ohne Alarmismus.</p>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Card-Prinzip</h3>
|
||||||
|
<p>
|
||||||
|
Cards nutzen weiße Flächen, feine Linien und moderate Tiefe. Inhalte bleiben
|
||||||
|
strukturiert, ohne visuelle Überladung. Keine dekorativen Verläufe in
|
||||||
|
Content-Flächen.
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section" id="accessibility">
|
||||||
|
<div class="section__head">
|
||||||
|
<h2>Accessibility und UX-Regeln</h2>
|
||||||
|
<p class="muted">Verbindliche Mindeststandards für digitale Touchpoints.</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid--2">
|
||||||
|
<article class="card">
|
||||||
|
<h3>Kontrast und Lesbarkeit</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Textkontrast mindestens WCAG AA (4.5:1 bei normalem Text).</li>
|
||||||
|
<li>Keine hellblauen Fließtexte auf weißem Hintergrund.</li>
|
||||||
|
<li>Interaktive Elemente mit klarer Fokusmarkierung versehen.</li>
|
||||||
|
<li>Alternativtexte für Grafiken und Bilder bereitstellen.</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<h3>Interaktion</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Klickflächen mindestens 40 x 40 px.</li>
|
||||||
|
<li>Buttons eindeutig benennen (Verb + Nutzen).</li>
|
||||||
|
<li>Navigation logisch und auf mobilen Geräten ohne Brüche.</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<article class="card">
|
||||||
|
<h3>MUSS-Checkliste (Release-Gate)</h3>
|
||||||
|
<ul class="bullets">
|
||||||
|
<li>Jede Seite MUSS genau eine <code>h1</code>, eine sinnvolle Überschriften-Hierarchie und semantische Landmarks (<code>header</code>, <code>nav</code>, <code>main</code>, <code>footer</code>) haben.</li>
|
||||||
|
<li>Jede Seite MUSS ein korrektes <code>lang</code>-Attribut und einen eindeutigen, aussagekräftigen <code>title</code> haben.</li>
|
||||||
|
<li>Alle Funktionen MÜSSEN vollständig per Tastatur bedienbar sein (Tab, Shift+Tab, Enter, Space, Escape) und dürfen keine Keyboard-Falle erzeugen.</li>
|
||||||
|
<li>Der Fokus MUSS immer sichtbar sein, logisch durch die Seite laufen und darf nie per CSS entfernt werden.</li>
|
||||||
|
<li>Textkontrast MUSS mindestens 4.5:1 betragen; Kontrast von UI-Komponenten/Fokusindikatoren MUSS mindestens 3:1 betragen.</li>
|
||||||
|
<li>Information darf NIE nur über Farbe vermittelt werden; es MUSS immer ein zweiter Hinweis vorhanden sein (Text, Icon, Muster oder Statuslabel).</li>
|
||||||
|
<li>Interaktive Elemente MÜSSEN einen eindeutigen Accessible Name haben (keine Buttons/Links nur mit "Hier" oder nur Icon ohne Label).</li>
|
||||||
|
<li>Klick- und Touch-Ziele MÜSSEN mindestens 44 x 44 px gross sein oder gleichwertig grossen Abstand besitzen.</li>
|
||||||
|
<li>Formulare MÜSSEN programmatisch verknüpfte Labels besitzen; Pflichtfelder, Fehler und Hilfetexte MÜSSEN für Screenreader auslesbar sein.</li>
|
||||||
|
<li>Fehlermeldungen MÜSSEN konkret sagen, was falsch ist und wie es zu korrigieren ist; der Fokus MUSS nach Submit zur Fehlerzusammenfassung springen.</li>
|
||||||
|
<li>Statusänderungen (z. B. "gespeichert", "geladen", "Fehler") MÜSSEN per <code>aria-live</code> oder gleichwertig angekündigt werden.</li>
|
||||||
|
<li>Bilder mit Informationswert MÜSSEN sinnvolle Alt-Texte haben; rein dekorative Bilder MÜSSEN als dekorativ markiert sein.</li>
|
||||||
|
<li>Video mit Sprache MUSS Untertitel haben; reine Audioinhalte MÜSSEN ein Transkript haben; Autoplay mit Ton ist nicht zulässig.</li>
|
||||||
|
<li>Inhalte MÜSSEN bei 200 % Zoom und bei 320 CSS-Pixel Breite ohne horizontalen Pflicht-Scroll funktionieren (ausser technisch notwendige Ausnahmen wie Datentabellen).</li>
|
||||||
|
<li>Animationen/Bewegungen MÜSSEN reduzierbar sein (<code>prefers-reduced-motion</code>); Inhalte dürfen nicht mehr als 3-mal pro Sekunde blinken.</li>
|
||||||
|
<li>Authentifizierung darf keine unzumutbare kognitive Hürde erzeugen; es MUSS eine barrierefreie Alternative zu rein visuellen Aufgaben geben.</li>
|
||||||
|
<li>Release-Freigabe nur, wenn Kernpfade bestanden sind: Navigation, Suche, Login, Formulare, Checkout, Zahlung und Fehlerszenarien.</li>
|
||||||
|
</ul>
|
||||||
|
<p class="muted small">Definition of Done: Kein Release ohne bestandenen Keyboard-Test, Screenreader-Schnelltest und dokumentierte Behebung aller kritischen A11y-Defekte.</p>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section" id="tokens">
|
||||||
|
<div class="section__head">
|
||||||
|
<h2>Design Tokens</h2>
|
||||||
|
<p class="muted">Copy-ready Basis für Webprojekte und UI-Implementierung.</p>
|
||||||
|
</div>
|
||||||
|
<article class="card">
|
||||||
|
<div class="row row--space row--wrap">
|
||||||
|
<h3>CSS Tokens</h3>
|
||||||
|
<button class="btn btn--light btn--sm" data-copy-block="#tokenCss">Block kopieren</button>
|
||||||
|
</div>
|
||||||
|
<pre class="code" id="tokenCss"><code>:root {
|
||||||
|
--ob-color-primary: #00A7E6;
|
||||||
|
--ob-color-primary-soft: #33B9EB;
|
||||||
|
--ob-color-primary-shade-1: #0086B8;
|
||||||
|
--ob-color-primary-shade-2: #00648A;
|
||||||
|
--ob-color-primary-shade-3: #00435C;
|
||||||
|
--ob-color-primary-shade-4: #00212E;
|
||||||
|
--ob-color-primary-tint-1: #33B9EB;
|
||||||
|
--ob-color-primary-tint-2: #66CAF0;
|
||||||
|
--ob-color-primary-tint-3: #99DCF5;
|
||||||
|
--ob-color-primary-tint-4: #CCEDFA;
|
||||||
|
--ob-color-accent: #F59C00;
|
||||||
|
--ob-color-dark: #343537;
|
||||||
|
--ob-color-slate: #343537;
|
||||||
|
--ob-color-bg: #F5FBFE;
|
||||||
|
--ob-color-surface: #FFFFFF;
|
||||||
|
|
||||||
|
--ob-font-body: "Nunito", "Segoe UI", Arial, sans-serif;
|
||||||
|
--ob-font-heading: "Nunito", "Segoe UI", Arial, sans-serif;
|
||||||
|
--ob-font-strong: "URW Gothic L Demi", "Nunito", "Segoe UI", Arial, sans-serif;
|
||||||
|
|
||||||
|
--ob-radius-sm: 10px;
|
||||||
|
--ob-radius-md: 14px;
|
||||||
|
--ob-radius-lg: 20px;
|
||||||
|
|
||||||
|
--ob-space-2: 8px;
|
||||||
|
--ob-space-3: 12px;
|
||||||
|
--ob-space-4: 16px;
|
||||||
|
--ob-space-6: 24px;
|
||||||
|
--ob-space-8: 32px;
|
||||||
|
}</code></pre>
|
||||||
|
</article>
|
||||||
|
<article class="card">
|
||||||
|
<div class="row row--space row--wrap">
|
||||||
|
<h3>JSON Tokens</h3>
|
||||||
|
<button class="btn btn--light btn--sm" data-copy-block="#tokenJson">Block kopieren</button>
|
||||||
|
</div>
|
||||||
|
<pre class="code" id="tokenJson"><code>{
|
||||||
|
"color": {
|
||||||
|
"primary": "#00A7E6",
|
||||||
|
"primarySoft": "#33B9EB",
|
||||||
|
"primaryShades": ["#0086B8", "#00648A", "#00435C", "#00212E"],
|
||||||
|
"primaryTints": ["#33B9EB", "#66CAF0", "#99DCF5", "#CCEDFA"],
|
||||||
|
"accent": "#F59C00",
|
||||||
|
"dark": "#343537",
|
||||||
|
"slate": "#343537",
|
||||||
|
"background": "#F5FBFE",
|
||||||
|
"surface": "#FFFFFF"
|
||||||
|
},
|
||||||
|
"font": {
|
||||||
|
"body": "Nunito",
|
||||||
|
"heading": "Nunito",
|
||||||
|
"strong": "URW Gothic L Demi"
|
||||||
|
},
|
||||||
|
"radius": {
|
||||||
|
"sm": "10px",
|
||||||
|
"md": "14px",
|
||||||
|
"lg": "20px"
|
||||||
|
}
|
||||||
|
}</code></pre>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<footer class="footer">
|
||||||
|
<p class="muted small">o-byte.com - Styleguide - Stand: Februar 2026</p>
|
||||||
|
</footer>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="toast" id="toast" role="status" aria-live="polite" aria-atomic="true"></div>
|
||||||
|
<script src="./assets/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -148,6 +148,8 @@
|
|||||||
return '<span class="spp-badge OWNER">OWNER</span>';
|
return '<span class="spp-badge OWNER">OWNER</span>';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const resourceTypeLabel = (type) => type === "lxc" ? "LXC" : "VM";
|
||||||
|
|
||||||
const actionButton = (permission, action, label, id, className = "", disabled = false) => {
|
const actionButton = (permission, action, label, id, className = "", disabled = false) => {
|
||||||
if (!can(permission)) {
|
if (!can(permission)) {
|
||||||
return "";
|
return "";
|
||||||
@@ -195,7 +197,7 @@
|
|||||||
<div class="spp-header">
|
<div class="spp-header">
|
||||||
<div>
|
<div>
|
||||||
<h2 class="spp-title">Support Provisioning Portal</h2>
|
<h2 class="spp-title">Support Provisioning Portal</h2>
|
||||||
<p class="spp-subtitle">Template-based VM provisioning for support work.</p>
|
<p class="spp-subtitle">Template-based VM and LXC provisioning for support work.</p>
|
||||||
${quotaLine()}
|
${quotaLine()}
|
||||||
</div>
|
</div>
|
||||||
<div class="spp-tabs">
|
<div class="spp-tabs">
|
||||||
@@ -215,7 +217,7 @@
|
|||||||
<div class="spp-panel">
|
<div class="spp-panel">
|
||||||
<table class="spp-table">
|
<table class="spp-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr><th>Name</th><th>Status</th><th>Access</th><th>Template</th><th>IP addresses</th><th>Expires</th><th></th></tr>
|
<tr><th>Name</th><th>Status</th><th>Access</th><th>Type</th><th>Template</th><th>IP addresses</th><th>Expires</th><th></th></tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
${state.deployments.map((deployment) => `
|
${state.deployments.map((deployment) => `
|
||||||
@@ -223,6 +225,7 @@
|
|||||||
<td><strong>${escapeHtml(deployment.name)}</strong></td>
|
<td><strong>${escapeHtml(deployment.name)}</strong></td>
|
||||||
<td>${statusBadge(deployment.status)}</td>
|
<td>${statusBadge(deployment.status)}</td>
|
||||||
<td>${accessLabel(deployment)}</td>
|
<td>${accessLabel(deployment)}</td>
|
||||||
|
<td>${resourceTypeLabel(deployment.provisioningType)}</td>
|
||||||
<td>${escapeHtml(deployment.templateName)}</td>
|
<td>${escapeHtml(deployment.templateName)}</td>
|
||||||
<td>${ipList(deployment.ipAddresses)}</td>
|
<td>${ipList(deployment.ipAddresses)}</td>
|
||||||
<td>${dateTime(deployment.expiresAt)}</td>
|
<td>${dateTime(deployment.expiresAt)}</td>
|
||||||
@@ -243,6 +246,7 @@
|
|||||||
<p>${escapeHtml(template.description)}</p>
|
<p>${escapeHtml(template.description)}</p>
|
||||||
<div class="spp-meta">
|
<div class="spp-meta">
|
||||||
<span>OS<strong>${template.osType}</strong></span>
|
<span>OS<strong>${template.osType}</strong></span>
|
||||||
|
<span>Type<strong>${resourceTypeLabel(template.provisioningType)}</strong></span>
|
||||||
<span>CPU<strong>${template.cpuCores} cores</strong></span>
|
<span>CPU<strong>${template.cpuCores} cores</strong></span>
|
||||||
<span>Memory<strong>${template.memoryMb} MB</strong></span>
|
<span>Memory<strong>${template.memoryMb} MB</strong></span>
|
||||||
<span>Disk<strong>${template.diskGb} GB</strong></span>
|
<span>Disk<strong>${template.diskGb} GB</strong></span>
|
||||||
@@ -263,7 +267,7 @@
|
|||||||
<form class="spp-form" id="spp-create-form">
|
<form class="spp-form" id="spp-create-form">
|
||||||
<label>Template
|
<label>Template
|
||||||
<select class="spp-select" name="templateId" required>
|
<select class="spp-select" name="templateId" required>
|
||||||
${state.templates.map((template) => `<option value="${template.id}">${escapeHtml(template.name)}</option>`).join("")}
|
${state.templates.map((template) => `<option value="${template.id}">[${resourceTypeLabel(template.provisioningType)}] ${escapeHtml(template.name)}</option>`).join("")}
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label>Deployment name
|
<label>Deployment name
|
||||||
@@ -313,9 +317,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="spp-meta">
|
<div class="spp-meta">
|
||||||
<span>Template<strong>${escapeHtml(deployment.templateName)}</strong></span>
|
<span>Template<strong>${escapeHtml(deployment.templateName)}</strong></span>
|
||||||
|
<span>Type<strong>${resourceTypeLabel(deployment.provisioningType)}</strong></span>
|
||||||
<span>Requested by<strong>${escapeHtml(deployment.requestedByName)}</strong></span>
|
<span>Requested by<strong>${escapeHtml(deployment.requestedByName)}</strong></span>
|
||||||
<span>Access<strong>${deployment.accessType ? escapeHtml(deployment.accessType) : "Owner"}</strong></span>
|
<span>Access<strong>${deployment.accessType ? escapeHtml(deployment.accessType) : "Owner"}</strong></span>
|
||||||
<span>Proxmox VM ID<strong>${deployment.proxmoxVmId || "Pending"}</strong></span>
|
<span>Proxmox ID<strong>${deployment.proxmoxResourceId || deployment.proxmoxVmId || "Pending"}</strong></span>
|
||||||
<span>IP addresses<strong>${ipList(deployment.ipAddresses)}</strong></span>
|
<span>IP addresses<strong>${ipList(deployment.ipAddresses)}</strong></span>
|
||||||
<span>CPU<strong>${deployment.cpuCores} cores</strong></span>
|
<span>CPU<strong>${deployment.cpuCores} cores</strong></span>
|
||||||
<span>Memory<strong>${deployment.memoryMb} MB</strong></span>
|
<span>Memory<strong>${deployment.memoryMb} MB</strong></span>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ if (!defined('ABSPATH')) {
|
|||||||
|
|
||||||
final class SPP_Activator
|
final class SPP_Activator
|
||||||
{
|
{
|
||||||
private const DB_VERSION = '0.6.0';
|
private const DB_VERSION = '0.7.0';
|
||||||
|
|
||||||
public static function activate(): void
|
public static function activate(): void
|
||||||
{
|
{
|
||||||
@@ -15,6 +15,8 @@ final class SPP_Activator
|
|||||||
|
|
||||||
add_option('spp_proxmox_mode', 'mock');
|
add_option('spp_proxmox_mode', 'mock');
|
||||||
add_option('spp_proxmox_node', 'pve-01');
|
add_option('spp_proxmox_node', 'pve-01');
|
||||||
|
add_option('spp_lxc_rootfs_storage', '');
|
||||||
|
add_option('spp_lxc_bridge', 'vmbr0');
|
||||||
add_option('spp_mock_next_vm_id', 10000);
|
add_option('spp_mock_next_vm_id', 10000);
|
||||||
add_option('spp_quota_user_memory_mb', 0);
|
add_option('spp_quota_user_memory_mb', 0);
|
||||||
add_option('spp_quota_global_memory_mb', 0);
|
add_option('spp_quota_global_memory_mb', 0);
|
||||||
@@ -63,7 +65,9 @@ final class SPP_Activator
|
|||||||
memory_mb int unsigned NOT NULL,
|
memory_mb int unsigned NOT NULL,
|
||||||
disk_gb int unsigned NOT NULL,
|
disk_gb int unsigned NOT NULL,
|
||||||
default_ttl_hours int unsigned NOT NULL,
|
default_ttl_hours int unsigned NOT NULL,
|
||||||
|
provisioning_type varchar(16) NOT NULL DEFAULT 'qemu',
|
||||||
proxmox_template_id int unsigned NOT NULL,
|
proxmox_template_id int unsigned NOT NULL,
|
||||||
|
proxmox_template_ref varchar(255) NULL,
|
||||||
is_active tinyint(1) NOT NULL DEFAULT 1,
|
is_active tinyint(1) NOT NULL DEFAULT 1,
|
||||||
created_at datetime NOT NULL,
|
created_at datetime NOT NULL,
|
||||||
updated_at datetime NOT NULL,
|
updated_at datetime NOT NULL,
|
||||||
@@ -75,6 +79,7 @@ final class SPP_Activator
|
|||||||
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
name varchar(160) NOT NULL,
|
name varchar(160) NOT NULL,
|
||||||
status varchar(32) NOT NULL,
|
status varchar(32) NOT NULL,
|
||||||
|
provisioning_type varchar(16) NOT NULL DEFAULT 'qemu',
|
||||||
proxmox_vm_id int unsigned DEFAULT NULL,
|
proxmox_vm_id int unsigned DEFAULT NULL,
|
||||||
ip_addresses longtext NULL,
|
ip_addresses longtext NULL,
|
||||||
error_message text NULL,
|
error_message text NULL,
|
||||||
@@ -92,6 +97,10 @@ final class SPP_Activator
|
|||||||
|
|
||||||
$wpdb->query("ALTER TABLE {$deployments} MODIFY expires_at datetime NULL");
|
$wpdb->query("ALTER TABLE {$deployments} MODIFY expires_at datetime NULL");
|
||||||
|
|
||||||
|
self::add_column_if_missing($templates, 'provisioning_type', "ALTER TABLE {$templates} ADD COLUMN provisioning_type varchar(16) NOT NULL DEFAULT 'qemu' AFTER default_ttl_hours");
|
||||||
|
self::add_column_if_missing($templates, 'proxmox_template_ref', "ALTER TABLE {$templates} ADD COLUMN proxmox_template_ref varchar(255) NULL AFTER proxmox_template_id");
|
||||||
|
self::add_column_if_missing($deployments, 'provisioning_type', "ALTER TABLE {$deployments} ADD COLUMN provisioning_type varchar(16) NOT NULL DEFAULT 'qemu' AFTER status");
|
||||||
|
|
||||||
$ip_column = $wpdb->get_var($wpdb->prepare("SHOW COLUMNS FROM {$deployments} LIKE %s", 'ip_addresses'));
|
$ip_column = $wpdb->get_var($wpdb->prepare("SHOW COLUMNS FROM {$deployments} LIKE %s", 'ip_addresses'));
|
||||||
if ($ip_column === null) {
|
if ($ip_column === null) {
|
||||||
$wpdb->query("ALTER TABLE {$deployments} ADD COLUMN ip_addresses longtext NULL AFTER proxmox_vm_id");
|
$wpdb->query("ALTER TABLE {$deployments} ADD COLUMN ip_addresses longtext NULL AFTER proxmox_vm_id");
|
||||||
@@ -138,6 +147,16 @@ final class SPP_Activator
|
|||||||
return $wpdb->prefix . 'spp_' . $name;
|
return $wpdb->prefix . 'spp_' . $name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static function add_column_if_missing(string $table, string $column, string $sql): void
|
||||||
|
{
|
||||||
|
global $wpdb;
|
||||||
|
|
||||||
|
$exists = $wpdb->get_var($wpdb->prepare("SHOW COLUMNS FROM {$table} LIKE %s", $column));
|
||||||
|
if ($exists === null) {
|
||||||
|
$wpdb->query($sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static function seed_templates(): void
|
private static function seed_templates(): void
|
||||||
{
|
{
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
@@ -154,7 +173,9 @@ final class SPP_Activator
|
|||||||
'memory_mb' => 2048,
|
'memory_mb' => 2048,
|
||||||
'disk_gb' => 24,
|
'disk_gb' => 24,
|
||||||
'default_ttl_hours' => 72,
|
'default_ttl_hours' => 72,
|
||||||
|
'provisioning_type' => 'qemu',
|
||||||
'proxmox_template_id' => 9001,
|
'proxmox_template_id' => 9001,
|
||||||
|
'proxmox_template_ref' => null,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'template_key' => 'windows-support-client',
|
'template_key' => 'windows-support-client',
|
||||||
@@ -165,7 +186,9 @@ final class SPP_Activator
|
|||||||
'memory_mb' => 8192,
|
'memory_mb' => 8192,
|
||||||
'disk_gb' => 80,
|
'disk_gb' => 80,
|
||||||
'default_ttl_hours' => 48,
|
'default_ttl_hours' => 48,
|
||||||
|
'provisioning_type' => 'qemu',
|
||||||
'proxmox_template_id' => 9002,
|
'proxmox_template_id' => 9002,
|
||||||
|
'proxmox_template_ref' => null,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'template_key' => 'linux-utility-vm',
|
'template_key' => 'linux-utility-vm',
|
||||||
@@ -176,7 +199,9 @@ final class SPP_Activator
|
|||||||
'memory_mb' => 2048,
|
'memory_mb' => 2048,
|
||||||
'disk_gb' => 32,
|
'disk_gb' => 32,
|
||||||
'default_ttl_hours' => 168,
|
'default_ttl_hours' => 168,
|
||||||
|
'provisioning_type' => 'qemu',
|
||||||
'proxmox_template_id' => 9003,
|
'proxmox_template_id' => 9003,
|
||||||
|
'proxmox_template_ref' => null,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ final class SPP_Admin_Page
|
|||||||
'settings_saved' => __('Settings saved.', 'support-provisioning-portal'),
|
'settings_saved' => __('Settings saved.', 'support-provisioning-portal'),
|
||||||
'template_saved' => __('Template saved.', 'support-provisioning-portal'),
|
'template_saved' => __('Template saved.', 'support-provisioning-portal'),
|
||||||
'template_removed' => __('Template removed from new provisioning.', 'support-provisioning-portal'),
|
'template_removed' => __('Template removed from new provisioning.', 'support-provisioning-portal'),
|
||||||
'template_error' => __('Template could not be saved. Check the fields and confirm the VMID exists as a Proxmox QEMU template on the configured node.', 'support-provisioning-portal'),
|
'template_error' => __('Template could not be saved. Check the fields and confirm the selected Proxmox VM or LXC template exists on the configured node.', 'support-provisioning-portal'),
|
||||||
'user_access_saved' => __('User rights saved.', 'support-provisioning-portal'),
|
'user_access_saved' => __('User rights saved.', 'support-provisioning-portal'),
|
||||||
'manager_required' => __('At least one user must keep the Manage user rights permission.', 'support-provisioning-portal'),
|
'manager_required' => __('At least one user must keep the Manage user rights permission.', 'support-provisioning-portal'),
|
||||||
];
|
];
|
||||||
@@ -169,6 +169,14 @@ final class SPP_Admin_Page
|
|||||||
<span>Node</span>
|
<span>Node</span>
|
||||||
<input name="spp_proxmox_node" type="text" value="<?php echo esc_attr(get_option('spp_proxmox_node', 'pve-01')); ?>">
|
<input name="spp_proxmox_node" type="text" value="<?php echo esc_attr(get_option('spp_proxmox_node', 'pve-01')); ?>">
|
||||||
</label>
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>LXC rootfs storage</span>
|
||||||
|
<input name="spp_lxc_rootfs_storage" type="text" value="<?php echo esc_attr(get_option('spp_lxc_rootfs_storage', '')); ?>" placeholder="local-lvm">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>LXC network bridge</span>
|
||||||
|
<input name="spp_lxc_bridge" type="text" value="<?php echo esc_attr(get_option('spp_lxc_bridge', 'vmbr0')); ?>" placeholder="vmbr0">
|
||||||
|
</label>
|
||||||
<h2><?php echo esc_html__('RAM Contingents', 'support-provisioning-portal'); ?></h2>
|
<h2><?php echo esc_html__('RAM Contingents', 'support-provisioning-portal'); ?></h2>
|
||||||
<p class="description"><?php echo esc_html__('Set 0 for unlimited. Active allocations include provisioning, stopped, running, and deleting deployments.', 'support-provisioning-portal'); ?></p>
|
<p class="description"><?php echo esc_html__('Set 0 for unlimited. Active allocations include provisioning, stopped, running, and deleting deployments.', 'support-provisioning-portal'); ?></p>
|
||||||
<label>
|
<label>
|
||||||
@@ -187,7 +195,7 @@ final class SPP_Admin_Page
|
|||||||
private function render_template_management(): void
|
private function render_template_management(): void
|
||||||
{
|
{
|
||||||
$approved_templates = $this->repository->admin_templates();
|
$approved_templates = $this->repository->admin_templates();
|
||||||
$active_proxmox_ids = $this->repository->active_proxmox_template_ids();
|
$active_template_keys = $this->repository->active_template_identity_keys();
|
||||||
$proxmox_error = null;
|
$proxmox_error = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -220,7 +228,7 @@ final class SPP_Admin_Page
|
|||||||
<div class="spp-template-row-head">
|
<div class="spp-template-row-head">
|
||||||
<div>
|
<div>
|
||||||
<strong><?php echo esc_html((string) $template['name']); ?></strong>
|
<strong><?php echo esc_html((string) $template['name']); ?></strong>
|
||||||
<span><?php echo esc_html(sprintf('PVE VMID %d', (int) $template['proxmoxTemplateId'])); ?></span>
|
<span><?php echo esc_html($this->template_identity_label($template)); ?></span>
|
||||||
</div>
|
</div>
|
||||||
<?php if (!empty($template['isActive'])) : ?>
|
<?php if (!empty($template['isActive'])) : ?>
|
||||||
<span class="spp-badge RUNNING"><?php echo esc_html__('Active', 'support-provisioning-portal'); ?></span>
|
<span class="spp-badge RUNNING"><?php echo esc_html__('Active', 'support-provisioning-portal'); ?></span>
|
||||||
@@ -229,12 +237,24 @@ final class SPP_Admin_Page
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="spp-template-fields">
|
<div class="spp-template-fields">
|
||||||
|
<input type="hidden" name="spp_provisioning_type" value="<?php echo esc_attr((string) $template['provisioningType']); ?>">
|
||||||
<label>Name
|
<label>Name
|
||||||
<input name="spp_template_name" type="text" required maxlength="160" value="<?php echo esc_attr((string) $template['name']); ?>">
|
<input name="spp_template_name" type="text" required maxlength="160" value="<?php echo esc_attr((string) $template['name']); ?>">
|
||||||
</label>
|
</label>
|
||||||
|
<label>Type
|
||||||
|
<input type="text" readonly value="<?php echo esc_attr($this->template_type_label((string) $template['provisioningType'])); ?>">
|
||||||
|
</label>
|
||||||
|
<?php if ((string) $template['provisioningType'] === 'lxc') : ?>
|
||||||
|
<input type="hidden" name="spp_proxmox_template_id" value="0">
|
||||||
|
<label>LXC template ref
|
||||||
|
<input name="spp_proxmox_template_ref" type="text" readonly required value="<?php echo esc_attr((string) $template['proxmoxTemplateRef']); ?>">
|
||||||
|
</label>
|
||||||
|
<?php else : ?>
|
||||||
|
<input type="hidden" name="spp_proxmox_template_ref" value="">
|
||||||
<label>PVE template VMID
|
<label>PVE template VMID
|
||||||
<input name="spp_proxmox_template_id" type="number" min="1" required value="<?php echo esc_attr((string) $template['proxmoxTemplateId']); ?>">
|
<input name="spp_proxmox_template_id" type="number" min="1" required value="<?php echo esc_attr((string) $template['proxmoxTemplateId']); ?>">
|
||||||
</label>
|
</label>
|
||||||
|
<?php endif; ?>
|
||||||
<label>OS type
|
<label>OS type
|
||||||
<?php $this->render_os_type_select((string) $template['osType']); ?>
|
<?php $this->render_os_type_select((string) $template['osType']); ?>
|
||||||
</label>
|
</label>
|
||||||
@@ -271,17 +291,27 @@ final class SPP_Admin_Page
|
|||||||
<p class="spp-error"><?php echo esc_html($proxmox_error); ?></p>
|
<p class="spp-error"><?php echo esc_html($proxmox_error); ?></p>
|
||||||
<?php elseif (empty($proxmox_templates)) : ?>
|
<?php elseif (empty($proxmox_templates)) : ?>
|
||||||
<div class="spp-panel spp-admin-notice">
|
<div class="spp-panel spp-admin-notice">
|
||||||
<p><?php echo esc_html__('No QEMU templates were returned by Proxmox for the configured node.', 'support-provisioning-portal'); ?></p>
|
<p><?php echo esc_html__('No QEMU VM or LXC templates were returned by Proxmox for the configured node.', 'support-provisioning-portal'); ?></p>
|
||||||
</div>
|
</div>
|
||||||
<?php else : ?>
|
<?php else : ?>
|
||||||
<div class="spp-pve-template-grid">
|
<div class="spp-pve-template-grid">
|
||||||
<?php foreach ($proxmox_templates as $template) : ?>
|
<?php foreach ($proxmox_templates as $template) : ?>
|
||||||
<?php $is_imported = in_array((int) $template['vmId'], $active_proxmox_ids, true); ?>
|
<?php
|
||||||
|
$provisioning_type = $this->normalise_template_type((string) ($template['provisioningType'] ?? 'qemu'));
|
||||||
|
$template_ref = (string) ($template['templateRef'] ?? '');
|
||||||
|
$is_imported = in_array(
|
||||||
|
$this->template_identity_key($provisioning_type, (int) ($template['vmId'] ?? 0), $template_ref),
|
||||||
|
$active_template_keys,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
?>
|
||||||
<form class="spp-pve-template" method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
|
<form class="spp-pve-template" method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
|
||||||
<input type="hidden" name="action" value="spp_save_template">
|
<input type="hidden" name="action" value="spp_save_template">
|
||||||
<input type="hidden" name="spp_template_action" value="import">
|
<input type="hidden" name="spp_template_action" value="import">
|
||||||
|
<input type="hidden" name="spp_provisioning_type" value="<?php echo esc_attr($provisioning_type); ?>">
|
||||||
<input type="hidden" name="spp_template_name" value="<?php echo esc_attr((string) $template['name']); ?>">
|
<input type="hidden" name="spp_template_name" value="<?php echo esc_attr((string) $template['name']); ?>">
|
||||||
<input type="hidden" name="spp_proxmox_template_id" value="<?php echo esc_attr((string) $template['vmId']); ?>">
|
<input type="hidden" name="spp_proxmox_template_id" value="<?php echo esc_attr((string) ($template['vmId'] ?? 0)); ?>">
|
||||||
|
<input type="hidden" name="spp_proxmox_template_ref" value="<?php echo esc_attr($template_ref); ?>">
|
||||||
<input type="hidden" name="spp_cpu_cores" value="<?php echo esc_attr((string) $template['cpuCores']); ?>">
|
<input type="hidden" name="spp_cpu_cores" value="<?php echo esc_attr((string) $template['cpuCores']); ?>">
|
||||||
<input type="hidden" name="spp_memory_mb" value="<?php echo esc_attr((string) $template['memoryMb']); ?>">
|
<input type="hidden" name="spp_memory_mb" value="<?php echo esc_attr((string) $template['memoryMb']); ?>">
|
||||||
<input type="hidden" name="spp_disk_gb" value="<?php echo esc_attr((string) $template['diskGb']); ?>">
|
<input type="hidden" name="spp_disk_gb" value="<?php echo esc_attr((string) $template['diskGb']); ?>">
|
||||||
@@ -289,13 +319,18 @@ final class SPP_Admin_Page
|
|||||||
<div class="spp-template-row-head">
|
<div class="spp-template-row-head">
|
||||||
<div>
|
<div>
|
||||||
<strong><?php echo esc_html((string) $template['name']); ?></strong>
|
<strong><?php echo esc_html((string) $template['name']); ?></strong>
|
||||||
<span><?php echo esc_html(sprintf('PVE VMID %d', (int) $template['vmId'])); ?></span>
|
<span><?php echo esc_html($this->template_identity_label([
|
||||||
|
'provisioningType' => $provisioning_type,
|
||||||
|
'proxmoxTemplateId' => (int) ($template['vmId'] ?? 0),
|
||||||
|
'proxmoxTemplateRef' => $template_ref,
|
||||||
|
])); ?></span>
|
||||||
</div>
|
</div>
|
||||||
<?php if ($is_imported) : ?>
|
<?php if ($is_imported) : ?>
|
||||||
<span class="spp-badge RUNNING"><?php echo esc_html__('Imported', 'support-provisioning-portal'); ?></span>
|
<span class="spp-badge RUNNING"><?php echo esc_html__('Imported', 'support-provisioning-portal'); ?></span>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="spp-meta">
|
<div class="spp-meta">
|
||||||
|
<span>Type<strong><?php echo esc_html($this->template_type_label($provisioning_type)); ?></strong></span>
|
||||||
<span>CPU<strong><?php echo esc_html((string) $template['cpuCores']); ?> cores</strong></span>
|
<span>CPU<strong><?php echo esc_html((string) $template['cpuCores']); ?> cores</strong></span>
|
||||||
<span>Memory<strong><?php echo esc_html((string) $template['memoryMb']); ?> MB</strong></span>
|
<span>Memory<strong><?php echo esc_html((string) $template['memoryMb']); ?> MB</strong></span>
|
||||||
<span>Disk<strong><?php echo esc_html((string) $template['diskGb']); ?> GB</strong></span>
|
<span>Disk<strong><?php echo esc_html((string) $template['diskGb']); ?> GB</strong></span>
|
||||||
@@ -309,7 +344,7 @@ final class SPP_Admin_Page
|
|||||||
<input name="spp_default_ttl_hours" type="number" min="1" max="720" value="168" required>
|
<input name="spp_default_ttl_hours" type="number" min="1" max="720" value="168" required>
|
||||||
</label>
|
</label>
|
||||||
<label>Description
|
<label>Description
|
||||||
<textarea name="spp_template_description" rows="2" required><?php echo esc_textarea(sprintf('Imported from Proxmox template VMID %d.', (int) $template['vmId'])); ?></textarea>
|
<textarea name="spp_template_description" rows="2" required><?php echo esc_textarea($provisioning_type === 'lxc' ? sprintf('Imported from Proxmox LXC template %s.', $template_ref) : sprintf('Imported from Proxmox template VMID %d.', (int) $template['vmId'])); ?></textarea>
|
||||||
</label>
|
</label>
|
||||||
<button class="button button-primary" type="submit"><?php echo esc_html__('Import Template', 'support-provisioning-portal'); ?></button>
|
<button class="button button-primary" type="submit"><?php echo esc_html__('Import Template', 'support-provisioning-portal'); ?></button>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
@@ -318,10 +353,12 @@ final class SPP_Admin_Page
|
|||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<h3><?php echo esc_html__('Add Template Manually', 'support-provisioning-portal'); ?></h3>
|
<h3><?php echo esc_html__('Add QEMU Template Manually', 'support-provisioning-portal'); ?></h3>
|
||||||
<form class="spp-template-row" method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
|
<form class="spp-template-row" method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
|
||||||
<input type="hidden" name="action" value="spp_save_template">
|
<input type="hidden" name="action" value="spp_save_template">
|
||||||
<input type="hidden" name="spp_template_action" value="import">
|
<input type="hidden" name="spp_template_action" value="import">
|
||||||
|
<input type="hidden" name="spp_provisioning_type" value="qemu">
|
||||||
|
<input type="hidden" name="spp_proxmox_template_ref" value="">
|
||||||
<?php wp_nonce_field('spp_save_template'); ?>
|
<?php wp_nonce_field('spp_save_template'); ?>
|
||||||
<div class="spp-template-fields">
|
<div class="spp-template-fields">
|
||||||
<label>Name
|
<label>Name
|
||||||
@@ -464,6 +501,8 @@ final class SPP_Admin_Page
|
|||||||
update_option('spp_proxmox_token_secret', $token_secret);
|
update_option('spp_proxmox_token_secret', $token_secret);
|
||||||
}
|
}
|
||||||
update_option('spp_proxmox_node', sanitize_text_field($this->posted_string('spp_proxmox_node')));
|
update_option('spp_proxmox_node', sanitize_text_field($this->posted_string('spp_proxmox_node')));
|
||||||
|
update_option('spp_lxc_rootfs_storage', $this->sanitize_proxmox_identifier($this->posted_string('spp_lxc_rootfs_storage')));
|
||||||
|
update_option('spp_lxc_bridge', $this->sanitize_proxmox_identifier($this->posted_string('spp_lxc_bridge')));
|
||||||
update_option('spp_quota_user_memory_mb', max(0, absint($this->posted_string('spp_quota_user_memory_mb'))));
|
update_option('spp_quota_user_memory_mb', max(0, absint($this->posted_string('spp_quota_user_memory_mb'))));
|
||||||
update_option('spp_quota_global_memory_mb', max(0, absint($this->posted_string('spp_quota_global_memory_mb'))));
|
update_option('spp_quota_global_memory_mb', max(0, absint($this->posted_string('spp_quota_global_memory_mb'))));
|
||||||
|
|
||||||
@@ -495,7 +534,11 @@ final class SPP_Admin_Page
|
|||||||
$this->redirect_to_admin_page('template_error');
|
$this->redirect_to_admin_page('template_error');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->proxmox_template_exists((int) $data['proxmox_template_id'])) {
|
if (!$this->proxmox_template_exists(
|
||||||
|
(string) $data['provisioning_type'],
|
||||||
|
(int) $data['proxmox_template_id'],
|
||||||
|
(string) $data['proxmox_template_ref']
|
||||||
|
)) {
|
||||||
$this->redirect_to_admin_page('template_error');
|
$this->redirect_to_admin_page('template_error');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -579,7 +622,13 @@ final class SPP_Admin_Page
|
|||||||
|
|
||||||
private function posted_string(string $key): string
|
private function posted_string(string $key): string
|
||||||
{
|
{
|
||||||
return isset($_POST[$key]) ? (string) wp_unslash($_POST[$key]) : '';
|
if (!isset($_POST[$key])) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = wp_unslash($_POST[$key]);
|
||||||
|
|
||||||
|
return is_scalar($value) ? (string) $value : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
private function sanitize_proxmox_base_url(string $value): string
|
private function sanitize_proxmox_base_url(string $value): string
|
||||||
@@ -593,11 +642,30 @@ final class SPP_Admin_Page
|
|||||||
return wp_parse_url($url, PHP_URL_SCHEME) === 'https' ? $url : '';
|
return wp_parse_url($url, PHP_URL_SCHEME) === 'https' ? $url : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
private function proxmox_template_exists(int $vm_id): bool
|
private function sanitize_proxmox_identifier(string $value): string
|
||||||
{
|
{
|
||||||
|
$value = sanitize_text_field($value);
|
||||||
|
$value = preg_replace('/[^A-Za-z0-9_.:-]/', '', $value);
|
||||||
|
|
||||||
|
return $value === null ? '' : $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function proxmox_template_exists(string $provisioning_type, int $vm_id, string $template_ref): bool
|
||||||
|
{
|
||||||
|
$provisioning_type = $this->normalise_template_type($provisioning_type);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
foreach ($this->proxmox->list_templates() as $template) {
|
foreach ($this->proxmox->list_templates() as $template) {
|
||||||
if ((int) $template['vmId'] === $vm_id) {
|
$candidate_type = $this->normalise_template_type((string) ($template['provisioningType'] ?? 'qemu'));
|
||||||
|
if ($candidate_type !== $provisioning_type) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($candidate_type === 'lxc' && (string) ($template['templateRef'] ?? '') === $template_ref) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($candidate_type === 'qemu' && (int) ($template['vmId'] ?? 0) === $vm_id) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -614,15 +682,25 @@ final class SPP_Admin_Page
|
|||||||
private function posted_template_data(): ?array
|
private function posted_template_data(): ?array
|
||||||
{
|
{
|
||||||
$name = sanitize_text_field($this->posted_string('spp_template_name'));
|
$name = sanitize_text_field($this->posted_string('spp_template_name'));
|
||||||
|
$provisioning_type = $this->normalise_template_type($this->posted_string('spp_provisioning_type'));
|
||||||
$proxmox_template_id = absint($this->posted_string('spp_proxmox_template_id'));
|
$proxmox_template_id = absint($this->posted_string('spp_proxmox_template_id'));
|
||||||
|
$proxmox_template_ref = sanitize_text_field($this->posted_string('spp_proxmox_template_ref'));
|
||||||
$description = sanitize_textarea_field($this->posted_string('spp_template_description'));
|
$description = sanitize_textarea_field($this->posted_string('spp_template_description'));
|
||||||
|
|
||||||
if ($name === '' || $proxmox_template_id < 1 || $description === '') {
|
if ($name === '' || $description === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($provisioning_type === 'qemu' && $proxmox_template_id < 1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($provisioning_type === 'lxc' && $proxmox_template_ref === '') {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'template_key' => 'pve-template-' . $proxmox_template_id . '-' . sanitize_title($name),
|
'template_key' => $this->template_identity_key($provisioning_type, $proxmox_template_id, $proxmox_template_ref) . '-' . sanitize_title($name),
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
'description' => $description,
|
'description' => $description,
|
||||||
'os_type' => $this->posted_os_type(),
|
'os_type' => $this->posted_os_type(),
|
||||||
@@ -630,7 +708,9 @@ final class SPP_Admin_Page
|
|||||||
'memory_mb' => max(128, absint($this->posted_string('spp_memory_mb'))),
|
'memory_mb' => max(128, absint($this->posted_string('spp_memory_mb'))),
|
||||||
'disk_gb' => max(1, absint($this->posted_string('spp_disk_gb'))),
|
'disk_gb' => max(1, absint($this->posted_string('spp_disk_gb'))),
|
||||||
'default_ttl_hours' => max(1, min(720, absint($this->posted_string('spp_default_ttl_hours')))),
|
'default_ttl_hours' => max(1, min(720, absint($this->posted_string('spp_default_ttl_hours')))),
|
||||||
|
'provisioning_type' => $provisioning_type,
|
||||||
'proxmox_template_id' => $proxmox_template_id,
|
'proxmox_template_id' => $proxmox_template_id,
|
||||||
|
'proxmox_template_ref' => $proxmox_template_ref,
|
||||||
'is_active' => $this->posted_string('spp_is_active') === '1',
|
'is_active' => $this->posted_string('spp_is_active') === '1',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -642,6 +722,37 @@ final class SPP_Admin_Page
|
|||||||
return in_array($os_type, ['LINUX', 'WINDOWS', 'APPLIANCE', 'OTHER'], true) ? $os_type : 'OTHER';
|
return in_array($os_type, ['LINUX', 'WINDOWS', 'APPLIANCE', 'OTHER'], true) ? $os_type : 'OTHER';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, mixed> $template
|
||||||
|
*/
|
||||||
|
private function template_identity_label(array $template): string
|
||||||
|
{
|
||||||
|
$type = $this->normalise_template_type((string) ($template['provisioningType'] ?? 'qemu'));
|
||||||
|
|
||||||
|
if ($type === 'lxc') {
|
||||||
|
return 'LXC ' . (string) ($template['proxmoxTemplateRef'] ?? $template['templateRef'] ?? '');
|
||||||
|
}
|
||||||
|
|
||||||
|
return sprintf('PVE VMID %d', (int) ($template['proxmoxTemplateId'] ?? $template['vmId'] ?? 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function template_type_label(string $type): string
|
||||||
|
{
|
||||||
|
return $this->normalise_template_type($type) === 'lxc' ? 'LXC container' : 'QEMU VM';
|
||||||
|
}
|
||||||
|
|
||||||
|
private function template_identity_key(string $provisioning_type, int $proxmox_template_id, string $proxmox_template_ref): string
|
||||||
|
{
|
||||||
|
return $this->normalise_template_type($provisioning_type) === 'lxc'
|
||||||
|
? 'lxc:' . $proxmox_template_ref
|
||||||
|
: 'qemu:' . $proxmox_template_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function normalise_template_type(string $type): string
|
||||||
|
{
|
||||||
|
return strtolower($type) === 'lxc' ? 'lxc' : 'qemu';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array<int, int>
|
* @return array<int, int>
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ final class SPP_Expiration_Service
|
|||||||
|
|
||||||
if (!empty($deployment['proxmox_vm_id']) && $deployment['status'] !== 'STOPPED') {
|
if (!empty($deployment['proxmox_vm_id']) && $deployment['status'] !== 'STOPPED') {
|
||||||
try {
|
try {
|
||||||
$this->proxmox->stop_vm((int) $deployment['proxmox_vm_id']);
|
$this->proxmox->stop_instance((string) ($deployment['provisioning_type'] ?? 'qemu'), (int) $deployment['proxmox_vm_id']);
|
||||||
} catch (Throwable $error) {
|
} catch (Throwable $error) {
|
||||||
$stop_error = $error->getMessage();
|
$stop_error = $error->getMessage();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,18 +6,81 @@ if (!defined('ABSPATH')) {
|
|||||||
|
|
||||||
final class SPP_Http_Proxmox_Client implements SPP_Proxmox_Client
|
final class SPP_Http_Proxmox_Client implements SPP_Proxmox_Client
|
||||||
{
|
{
|
||||||
/** @var array{base_url:string, token_id:string, token_secret:string, node:string} */
|
/** @var array{base_url:string, token_id:string, token_secret:string, node:string, lxc_rootfs_storage:string, lxc_bridge:string} */
|
||||||
private array $options;
|
private array $options;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array{base_url:string, token_id:string, token_secret:string, node:string} $options
|
* @param array{base_url:string, token_id:string, token_secret:string, node:string, lxc_rootfs_storage?:string, lxc_bridge?:string} $options
|
||||||
*/
|
*/
|
||||||
public function __construct(array $options)
|
public function __construct(array $options)
|
||||||
{
|
{
|
||||||
$this->options = $options;
|
$this->options = array_merge([
|
||||||
|
'lxc_rootfs_storage' => '',
|
||||||
|
'lxc_bridge' => 'vmbr0',
|
||||||
|
], $options);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function list_templates(): array
|
public function list_templates(): array
|
||||||
|
{
|
||||||
|
$templates = array_merge(
|
||||||
|
$this->list_qemu_templates(),
|
||||||
|
$this->list_lxc_templates()
|
||||||
|
);
|
||||||
|
|
||||||
|
usort(
|
||||||
|
$templates,
|
||||||
|
static function (array $left, array $right): int {
|
||||||
|
$type_compare = strcmp((string) $left['provisioningType'], (string) $right['provisioningType']);
|
||||||
|
|
||||||
|
return $type_compare !== 0
|
||||||
|
? $type_compare
|
||||||
|
: strcasecmp((string) $left['name'], (string) $right['name']);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return $templates;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provision_instance(array $input): array
|
||||||
|
{
|
||||||
|
return $this->normalise_type((string) ($input['provisioning_type'] ?? 'qemu')) === 'lxc'
|
||||||
|
? $this->create_lxc_container($input)
|
||||||
|
: $this->clone_qemu_vm($input);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function start_instance(string $type, int $vm_id): void
|
||||||
|
{
|
||||||
|
$this->request($this->guest_path($type, $vm_id) . '/status/start', 'POST');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function stop_instance(string $type, int $vm_id): void
|
||||||
|
{
|
||||||
|
$this->request($this->guest_path($type, $vm_id) . '/status/stop', 'POST');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete_instance(string $type, int $vm_id): void
|
||||||
|
{
|
||||||
|
$this->request($this->guest_path($type, $vm_id), 'DELETE');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get_status(string $type, int $vm_id): string
|
||||||
|
{
|
||||||
|
$data = $this->request($this->guest_path($type, $vm_id) . '/status/current', 'GET');
|
||||||
|
|
||||||
|
return is_array($data) && isset($data['status']) ? (string) $data['status'] : 'unknown';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get_ip_addresses(string $type, int $vm_id): array
|
||||||
|
{
|
||||||
|
return $this->normalise_type($type) === 'lxc'
|
||||||
|
? $this->get_lxc_ip_addresses($vm_id)
|
||||||
|
: $this->get_qemu_ip_addresses($vm_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<int, array<string, mixed>>
|
||||||
|
*/
|
||||||
|
private function list_qemu_templates(): array
|
||||||
{
|
{
|
||||||
$data = $this->request("/nodes/{$this->options['node']}/qemu", 'GET');
|
$data = $this->request("/nodes/{$this->options['node']}/qemu", 'GET');
|
||||||
$vms = is_array($data) ? $data : [];
|
$vms = is_array($data) ? $data : [];
|
||||||
@@ -29,7 +92,10 @@ final class SPP_Http_Proxmox_Client implements SPP_Proxmox_Client
|
|||||||
}
|
}
|
||||||
|
|
||||||
$templates[] = [
|
$templates[] = [
|
||||||
|
'provisioningType' => 'qemu',
|
||||||
'vmId' => (int) $vm['vmid'],
|
'vmId' => (int) $vm['vmid'],
|
||||||
|
'templateRef' => '',
|
||||||
|
'storage' => '',
|
||||||
'name' => isset($vm['name']) && $vm['name'] !== '' ? (string) $vm['name'] : 'template-' . (int) $vm['vmid'],
|
'name' => isset($vm['name']) && $vm['name'] !== '' ? (string) $vm['name'] : 'template-' . (int) $vm['vmid'],
|
||||||
'cpuCores' => max(1, (int) ($vm['cpus'] ?? 1)),
|
'cpuCores' => max(1, (int) ($vm['cpus'] ?? 1)),
|
||||||
'memoryMb' => $this->bytes_to_mb((int) ($vm['maxmem'] ?? 0)),
|
'memoryMb' => $this->bytes_to_mb((int) ($vm['maxmem'] ?? 0)),
|
||||||
@@ -38,15 +104,83 @@ final class SPP_Http_Proxmox_Client implements SPP_Proxmox_Client
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
usort(
|
return $templates;
|
||||||
$templates,
|
}
|
||||||
static fn(array $left, array $right): int => strcasecmp((string) $left['name'], (string) $right['name'])
|
|
||||||
|
/**
|
||||||
|
* @return array<int, array<string, mixed>>
|
||||||
|
*/
|
||||||
|
private function list_lxc_templates(): array
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$storages = $this->request("/nodes/{$this->options['node']}/storage", 'GET');
|
||||||
|
} catch (Throwable) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$storages = is_array($storages) ? $storages : [];
|
||||||
|
$templates = [];
|
||||||
|
|
||||||
|
foreach ($storages as $storage) {
|
||||||
|
if (!is_array($storage) || empty($storage['storage'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($storage['enabled']) && (int) $storage['enabled'] !== 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$content = is_array($storage['content'] ?? null)
|
||||||
|
? implode(',', $storage['content'])
|
||||||
|
: (string) ($storage['content'] ?? '');
|
||||||
|
|
||||||
|
if ($content !== '' && !str_contains(strtolower($content), 'vztmpl')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$storage_id = (string) $storage['storage'];
|
||||||
|
|
||||||
|
try {
|
||||||
|
$items = $this->request(
|
||||||
|
add_query_arg(['content' => 'vztmpl'], "/nodes/{$this->options['node']}/storage/" . rawurlencode($storage_id) . '/content'),
|
||||||
|
'GET'
|
||||||
);
|
);
|
||||||
|
} catch (Throwable) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (is_array($items) ? $items : [] as $item) {
|
||||||
|
if (!is_array($item)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$volid = (string) ($item['volid'] ?? $item['volume'] ?? '');
|
||||||
|
if ($volid === '' || (isset($item['content']) && (string) $item['content'] !== 'vztmpl')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$templates[] = [
|
||||||
|
'provisioningType' => 'lxc',
|
||||||
|
'vmId' => 0,
|
||||||
|
'templateRef' => $volid,
|
||||||
|
'storage' => $storage_id,
|
||||||
|
'name' => $this->template_name_from_volid($volid),
|
||||||
|
'cpuCores' => 1,
|
||||||
|
'memoryMb' => 1024,
|
||||||
|
'diskGb' => 8,
|
||||||
|
'status' => 'available',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $templates;
|
return $templates;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function clone_vm(array $input): array
|
/**
|
||||||
|
* @param array<string, mixed> $input
|
||||||
|
* @return array{vm_id:int}
|
||||||
|
*/
|
||||||
|
private function clone_qemu_vm(array $input): array
|
||||||
{
|
{
|
||||||
$vm_id = (int) $this->request('/cluster/nextid', 'GET');
|
$vm_id = (int) $this->request('/cluster/nextid', 'GET');
|
||||||
$template_id = (int) $input['template_vm_id'];
|
$template_id = (int) $input['template_vm_id'];
|
||||||
@@ -60,34 +194,46 @@ final class SPP_Http_Proxmox_Client implements SPP_Proxmox_Client
|
|||||||
$this->request("/nodes/{$this->options['node']}/qemu/{$vm_id}/config", 'PUT', [
|
$this->request("/nodes/{$this->options['node']}/qemu/{$vm_id}/config", 'PUT', [
|
||||||
'cores' => (int) $input['cpu_cores'],
|
'cores' => (int) $input['cpu_cores'],
|
||||||
'memory' => (int) $input['memory_mb'],
|
'memory' => (int) $input['memory_mb'],
|
||||||
|
'tags' => $this->tags_string($input['tags'] ?? []),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return ['vm_id' => $vm_id];
|
return ['vm_id' => $vm_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function start_vm(int $vm_id): void
|
/**
|
||||||
|
* @param array<string, mixed> $input
|
||||||
|
* @return array{vm_id:int}
|
||||||
|
*/
|
||||||
|
private function create_lxc_container(array $input): array
|
||||||
{
|
{
|
||||||
$this->request("/nodes/{$this->options['node']}/qemu/{$vm_id}/status/start", 'POST');
|
$rootfs_storage = $this->sanitize_proxmox_identifier((string) $this->options['lxc_rootfs_storage']);
|
||||||
|
if ($rootfs_storage === '') {
|
||||||
|
throw new RuntimeException('Missing LXC rootfs storage configuration.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function stop_vm(int $vm_id): void
|
$vm_id = (int) $this->request('/cluster/nextid', 'GET');
|
||||||
{
|
$body = [
|
||||||
$this->request("/nodes/{$this->options['node']}/qemu/{$vm_id}/status/stop", 'POST');
|
'vmid' => $vm_id,
|
||||||
|
'hostname' => $this->sanitize_hostname((string) $input['name']),
|
||||||
|
'ostemplate' => (string) $input['lxc_template_ref'],
|
||||||
|
'cores' => (int) $input['cpu_cores'],
|
||||||
|
'memory' => (int) $input['memory_mb'],
|
||||||
|
'rootfs' => $rootfs_storage . ':' . max(1, (int) $input['disk_gb']),
|
||||||
|
'unprivileged' => 1,
|
||||||
|
'tags' => $this->tags_string($input['tags'] ?? []),
|
||||||
|
];
|
||||||
|
|
||||||
|
$bridge = $this->sanitize_proxmox_identifier((string) $this->options['lxc_bridge']);
|
||||||
|
if ($bridge !== '') {
|
||||||
|
$body['net0'] = 'name=eth0,bridge=' . $bridge . ',ip=dhcp';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete_vm(int $vm_id): void
|
$this->request("/nodes/{$this->options['node']}/lxc", 'POST', $body);
|
||||||
{
|
|
||||||
$this->request("/nodes/{$this->options['node']}/qemu/{$vm_id}", 'DELETE');
|
return ['vm_id' => $vm_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get_status(int $vm_id): string
|
private function get_qemu_ip_addresses(int $vm_id): array
|
||||||
{
|
|
||||||
$data = $this->request("/nodes/{$this->options['node']}/qemu/{$vm_id}/status/current", 'GET');
|
|
||||||
|
|
||||||
return is_array($data) && isset($data['status']) ? (string) $data['status'] : 'unknown';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_ip_addresses(int $vm_id): array
|
|
||||||
{
|
{
|
||||||
$data = $this->request("/nodes/{$this->options['node']}/qemu/{$vm_id}/agent/network-get-interfaces", 'GET');
|
$data = $this->request("/nodes/{$this->options['node']}/qemu/{$vm_id}/agent/network-get-interfaces", 'GET');
|
||||||
$interfaces = is_array($data) && isset($data['result']) && is_array($data['result']) ? $data['result'] : [];
|
$interfaces = is_array($data) && isset($data['result']) && is_array($data['result']) ? $data['result'] : [];
|
||||||
@@ -115,6 +261,91 @@ final class SPP_Http_Proxmox_Client implements SPP_Proxmox_Client
|
|||||||
return array_values(array_unique($ips));
|
return array_values(array_unique($ips));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function get_lxc_ip_addresses(int $vm_id): array
|
||||||
|
{
|
||||||
|
$data = $this->request("/nodes/{$this->options['node']}/lxc/{$vm_id}/interfaces", 'GET');
|
||||||
|
$interfaces = is_array($data) ? $data : [];
|
||||||
|
$ips = [];
|
||||||
|
|
||||||
|
foreach ($interfaces as $interface) {
|
||||||
|
if (!is_array($interface)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (['inet', 'inet6'] as $key) {
|
||||||
|
if (empty($interface[$key])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ip = preg_replace('/\/\d+$/', '', (string) $interface[$key]);
|
||||||
|
if ($ip === null || $ip === '127.0.0.1' || $ip === '::1' || str_starts_with($ip, 'fe80:')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ips[] = $ip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_values(array_unique($ips));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function guest_path(string $type, int $vm_id): string
|
||||||
|
{
|
||||||
|
$guest_type = $this->normalise_type($type) === 'lxc' ? 'lxc' : 'qemu';
|
||||||
|
|
||||||
|
return "/nodes/{$this->options['node']}/{$guest_type}/{$vm_id}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private function normalise_type(string $type): string
|
||||||
|
{
|
||||||
|
return strtolower($type) === 'lxc' ? 'lxc' : 'qemu';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $tags
|
||||||
|
*/
|
||||||
|
private function tags_string($tags): string
|
||||||
|
{
|
||||||
|
if (!is_array($tags)) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$clean = [];
|
||||||
|
foreach ($tags as $tag) {
|
||||||
|
$tag = strtolower(sanitize_title((string) $tag));
|
||||||
|
if ($tag !== '') {
|
||||||
|
$clean[] = substr($tag, 0, 40);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode(';', array_values(array_unique($clean)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function sanitize_hostname(string $name): string
|
||||||
|
{
|
||||||
|
$hostname = strtolower(sanitize_title($name));
|
||||||
|
$hostname = preg_replace('/[^a-z0-9-]/', '-', $hostname);
|
||||||
|
$hostname = trim((string) $hostname, '-');
|
||||||
|
|
||||||
|
return substr($hostname !== '' ? $hostname : 'spp-lxc', 0, 63);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function sanitize_proxmox_identifier(string $value): string
|
||||||
|
{
|
||||||
|
$value = sanitize_text_field($value);
|
||||||
|
$value = preg_replace('/[^A-Za-z0-9_.-]/', '', $value);
|
||||||
|
|
||||||
|
return $value === null ? '' : $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function template_name_from_volid(string $volid): string
|
||||||
|
{
|
||||||
|
$name = basename(str_replace('\\', '/', $volid));
|
||||||
|
$name = preg_replace('/\.(tar\.zst|tar\.xz|tar\.gz|tar)$/', '', $name);
|
||||||
|
|
||||||
|
return $name !== null && $name !== '' ? $name : $volid;
|
||||||
|
}
|
||||||
|
|
||||||
private function bytes_to_mb(int $bytes): int
|
private function bytes_to_mb(int $bytes): int
|
||||||
{
|
{
|
||||||
if ($bytes < 1) {
|
if ($bytes < 1) {
|
||||||
|
|||||||
@@ -10,7 +10,10 @@ final class SPP_Mock_Proxmox_Client implements SPP_Proxmox_Client
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
[
|
[
|
||||||
|
'provisioningType' => 'qemu',
|
||||||
'vmId' => 9001,
|
'vmId' => 9001,
|
||||||
|
'templateRef' => '',
|
||||||
|
'storage' => '',
|
||||||
'name' => 'Turnkey PBX Test Appliance',
|
'name' => 'Turnkey PBX Test Appliance',
|
||||||
'cpuCores' => 2,
|
'cpuCores' => 2,
|
||||||
'memoryMb' => 2048,
|
'memoryMb' => 2048,
|
||||||
@@ -18,7 +21,10 @@ final class SPP_Mock_Proxmox_Client implements SPP_Proxmox_Client
|
|||||||
'status' => 'stopped',
|
'status' => 'stopped',
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
'provisioningType' => 'qemu',
|
||||||
'vmId' => 9002,
|
'vmId' => 9002,
|
||||||
|
'templateRef' => '',
|
||||||
|
'storage' => '',
|
||||||
'name' => 'Windows Support Client',
|
'name' => 'Windows Support Client',
|
||||||
'cpuCores' => 4,
|
'cpuCores' => 4,
|
||||||
'memoryMb' => 8192,
|
'memoryMb' => 8192,
|
||||||
@@ -26,51 +32,80 @@ final class SPP_Mock_Proxmox_Client implements SPP_Proxmox_Client
|
|||||||
'status' => 'stopped',
|
'status' => 'stopped',
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
'provisioningType' => 'qemu',
|
||||||
'vmId' => 9003,
|
'vmId' => 9003,
|
||||||
|
'templateRef' => '',
|
||||||
|
'storage' => '',
|
||||||
'name' => 'Linux Utility VM',
|
'name' => 'Linux Utility VM',
|
||||||
'cpuCores' => 2,
|
'cpuCores' => 2,
|
||||||
'memoryMb' => 2048,
|
'memoryMb' => 2048,
|
||||||
'diskGb' => 32,
|
'diskGb' => 32,
|
||||||
'status' => 'stopped',
|
'status' => 'stopped',
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
'provisioningType' => 'lxc',
|
||||||
|
'vmId' => 0,
|
||||||
|
'templateRef' => 'local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst',
|
||||||
|
'storage' => 'local',
|
||||||
|
'name' => 'debian-12-standard',
|
||||||
|
'cpuCores' => 1,
|
||||||
|
'memoryMb' => 1024,
|
||||||
|
'diskGb' => 8,
|
||||||
|
'status' => 'available',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'provisioningType' => 'lxc',
|
||||||
|
'vmId' => 0,
|
||||||
|
'templateRef' => 'local:vztmpl/ubuntu-24.04-standard_24.04-2_amd64.tar.zst',
|
||||||
|
'storage' => 'local',
|
||||||
|
'name' => 'ubuntu-24.04-standard',
|
||||||
|
'cpuCores' => 1,
|
||||||
|
'memoryMb' => 1024,
|
||||||
|
'diskGb' => 8,
|
||||||
|
'status' => 'available',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function clone_vm(array $input): array
|
public function provision_instance(array $input): array
|
||||||
{
|
{
|
||||||
$next_id = (int) get_option('spp_mock_next_vm_id', 10000);
|
$next_id = (int) get_option('spp_mock_next_vm_id', 10000);
|
||||||
update_option('spp_mock_next_vm_id', $next_id + 1, false);
|
update_option('spp_mock_next_vm_id', $next_id + 1, false);
|
||||||
update_option('spp_mock_vm_status_' . $next_id, 'stopped', false);
|
update_option('spp_mock_vm_status_' . $next_id, 'stopped', false);
|
||||||
|
update_option('spp_mock_vm_type_' . $next_id, $this->normalise_type((string) ($input['provisioning_type'] ?? 'qemu')), false);
|
||||||
|
update_option('spp_mock_vm_tags_' . $next_id, is_array($input['tags'] ?? null) ? array_values($input['tags']) : [], false);
|
||||||
update_option('spp_mock_vm_ips_' . $next_id, [sprintf('192.0.2.%d', (($next_id - 10000) % 200) + 10)], false);
|
update_option('spp_mock_vm_ips_' . $next_id, [sprintf('192.0.2.%d', (($next_id - 10000) % 200) + 10)], false);
|
||||||
|
|
||||||
return ['vm_id' => $next_id];
|
return ['vm_id' => $next_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function start_vm(int $vm_id): void
|
public function start_instance(string $type, int $vm_id): void
|
||||||
{
|
{
|
||||||
$this->ensure_vm($vm_id);
|
$this->ensure_vm($vm_id);
|
||||||
update_option('spp_mock_vm_status_' . $vm_id, 'running', false);
|
update_option('spp_mock_vm_status_' . $vm_id, 'running', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function stop_vm(int $vm_id): void
|
public function stop_instance(string $type, int $vm_id): void
|
||||||
{
|
{
|
||||||
$this->ensure_vm($vm_id);
|
$this->ensure_vm($vm_id);
|
||||||
update_option('spp_mock_vm_status_' . $vm_id, 'stopped', false);
|
update_option('spp_mock_vm_status_' . $vm_id, 'stopped', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete_vm(int $vm_id): void
|
public function delete_instance(string $type, int $vm_id): void
|
||||||
{
|
{
|
||||||
$this->ensure_vm($vm_id);
|
$this->ensure_vm($vm_id);
|
||||||
delete_option('spp_mock_vm_status_' . $vm_id);
|
delete_option('spp_mock_vm_status_' . $vm_id);
|
||||||
|
delete_option('spp_mock_vm_type_' . $vm_id);
|
||||||
|
delete_option('spp_mock_vm_tags_' . $vm_id);
|
||||||
delete_option('spp_mock_vm_ips_' . $vm_id);
|
delete_option('spp_mock_vm_ips_' . $vm_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get_status(int $vm_id): string
|
public function get_status(string $type, int $vm_id): string
|
||||||
{
|
{
|
||||||
return (string) get_option('spp_mock_vm_status_' . $vm_id, 'unknown');
|
return (string) get_option('spp_mock_vm_status_' . $vm_id, 'unknown');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get_ip_addresses(int $vm_id): array
|
public function get_ip_addresses(string $type, int $vm_id): array
|
||||||
{
|
{
|
||||||
$ips = get_option('spp_mock_vm_ips_' . $vm_id, []);
|
$ips = get_option('spp_mock_vm_ips_' . $vm_id, []);
|
||||||
|
|
||||||
@@ -80,7 +115,12 @@ final class SPP_Mock_Proxmox_Client implements SPP_Proxmox_Client
|
|||||||
private function ensure_vm(int $vm_id): void
|
private function ensure_vm(int $vm_id): void
|
||||||
{
|
{
|
||||||
if (get_option('spp_mock_vm_status_' . $vm_id, null) === null) {
|
if (get_option('spp_mock_vm_status_' . $vm_id, null) === null) {
|
||||||
throw new RuntimeException('Mock Proxmox VM does not exist.');
|
throw new RuntimeException('Mock Proxmox resource does not exist.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function normalise_type(string $type): string
|
||||||
|
{
|
||||||
|
return strtolower($type) === 'lxc' ? 'lxc' : 'qemu';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ final class SPP_Plugin
|
|||||||
'token_id' => (string) get_option('spp_proxmox_token_id', ''),
|
'token_id' => (string) get_option('spp_proxmox_token_id', ''),
|
||||||
'token_secret' => (string) get_option('spp_proxmox_token_secret', ''),
|
'token_secret' => (string) get_option('spp_proxmox_token_secret', ''),
|
||||||
'node' => (string) get_option('spp_proxmox_node', ''),
|
'node' => (string) get_option('spp_proxmox_node', ''),
|
||||||
|
'lxc_rootfs_storage' => (string) get_option('spp_lxc_rootfs_storage', ''),
|
||||||
|
'lxc_bridge' => (string) get_option('spp_lxc_bridge', 'vmbr0'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -157,6 +157,7 @@ final class SPP_Repository
|
|||||||
$wpdb->insert($table, [
|
$wpdb->insert($table, [
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
'status' => 'STOPPED',
|
'status' => 'STOPPED',
|
||||||
|
'provisioning_type' => $this->normalise_template_type((string) ($template['provisioning_type'] ?? 'qemu')),
|
||||||
'proxmox_vm_id' => $vm_id,
|
'proxmox_vm_id' => $vm_id,
|
||||||
'ip_addresses' => wp_json_encode(array_values($ip_addresses)),
|
'ip_addresses' => wp_json_encode(array_values($ip_addresses)),
|
||||||
'expires_at' => $expires_at,
|
'expires_at' => $expires_at,
|
||||||
@@ -169,6 +170,7 @@ final class SPP_Repository
|
|||||||
$deployment_id = (int) $wpdb->insert_id;
|
$deployment_id = (int) $wpdb->insert_id;
|
||||||
$this->audit('DEPLOYMENT_CREATED', 'deployment', $deployment_id, $actor_id, [
|
$this->audit('DEPLOYMENT_CREATED', 'deployment', $deployment_id, $actor_id, [
|
||||||
'template_id' => (int) $template['id'],
|
'template_id' => (int) $template['id'],
|
||||||
|
'provisioning_type' => $this->normalise_template_type((string) ($template['provisioning_type'] ?? 'qemu')),
|
||||||
'proxmox_vm_id' => $vm_id,
|
'proxmox_vm_id' => $vm_id,
|
||||||
'ip_addresses' => $ip_addresses,
|
'ip_addresses' => $ip_addresses,
|
||||||
'ttl_hours' => $ttl_hours,
|
'ttl_hours' => $ttl_hours,
|
||||||
@@ -439,15 +441,11 @@ final class SPP_Repository
|
|||||||
|
|
||||||
$table = SPP_Activator::table('templates');
|
$table = SPP_Activator::table('templates');
|
||||||
$now = current_time('mysql');
|
$now = current_time('mysql');
|
||||||
$template_key = $this->unique_template_key((string) $data['template_key'], (int) $data['proxmox_template_id']);
|
$provisioning_type = $this->normalise_template_type((string) ($data['provisioning_type'] ?? 'qemu'));
|
||||||
$existing_id = (int) $wpdb->get_var(
|
$proxmox_template_id = $provisioning_type === 'qemu' ? absint($data['proxmox_template_id']) : 0;
|
||||||
$wpdb->prepare(
|
$proxmox_template_ref = $provisioning_type === 'lxc' ? sanitize_text_field((string) ($data['proxmox_template_ref'] ?? '')) : null;
|
||||||
"SELECT id FROM {$table} WHERE proxmox_template_id = %d OR template_key = %s ORDER BY proxmox_template_id = %d DESC LIMIT 1",
|
$template_key = $this->unique_template_key((string) $data['template_key'], $provisioning_type, $proxmox_template_id, (string) $proxmox_template_ref);
|
||||||
(int) $data['proxmox_template_id'],
|
$existing_id = $this->template_existing_id($provisioning_type, $proxmox_template_id, (string) $proxmox_template_ref, $template_key);
|
||||||
$template_key,
|
|
||||||
(int) $data['proxmox_template_id']
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$row = [
|
$row = [
|
||||||
'template_key' => $template_key,
|
'template_key' => $template_key,
|
||||||
@@ -458,7 +456,9 @@ final class SPP_Repository
|
|||||||
'memory_mb' => max(128, absint($data['memory_mb'])),
|
'memory_mb' => max(128, absint($data['memory_mb'])),
|
||||||
'disk_gb' => max(1, absint($data['disk_gb'])),
|
'disk_gb' => max(1, absint($data['disk_gb'])),
|
||||||
'default_ttl_hours' => max(1, min(720, absint($data['default_ttl_hours']))),
|
'default_ttl_hours' => max(1, min(720, absint($data['default_ttl_hours']))),
|
||||||
'proxmox_template_id' => absint($data['proxmox_template_id']),
|
'provisioning_type' => $provisioning_type,
|
||||||
|
'proxmox_template_id' => $proxmox_template_id,
|
||||||
|
'proxmox_template_ref' => $proxmox_template_ref,
|
||||||
'is_active' => 1,
|
'is_active' => 1,
|
||||||
'updated_at' => $now,
|
'updated_at' => $now,
|
||||||
];
|
];
|
||||||
@@ -474,7 +474,9 @@ final class SPP_Repository
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->audit($action, 'template', $template_id, $actor_id, [
|
$this->audit($action, 'template', $template_id, $actor_id, [
|
||||||
|
'provisioning_type' => (string) $row['provisioning_type'],
|
||||||
'proxmox_template_id' => (int) $row['proxmox_template_id'],
|
'proxmox_template_id' => (int) $row['proxmox_template_id'],
|
||||||
|
'proxmox_template_ref' => (string) ($row['proxmox_template_ref'] ?? ''),
|
||||||
'name' => (string) $row['name'],
|
'name' => (string) $row['name'],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -489,6 +491,9 @@ final class SPP_Repository
|
|||||||
global $wpdb;
|
global $wpdb;
|
||||||
|
|
||||||
$table = SPP_Activator::table('templates');
|
$table = SPP_Activator::table('templates');
|
||||||
|
$provisioning_type = $this->normalise_template_type((string) ($data['provisioning_type'] ?? 'qemu'));
|
||||||
|
$proxmox_template_id = $provisioning_type === 'qemu' ? absint($data['proxmox_template_id']) : 0;
|
||||||
|
$proxmox_template_ref = $provisioning_type === 'lxc' ? sanitize_text_field((string) ($data['proxmox_template_ref'] ?? '')) : null;
|
||||||
$row = [
|
$row = [
|
||||||
'name' => sanitize_text_field((string) $data['name']),
|
'name' => sanitize_text_field((string) $data['name']),
|
||||||
'description' => sanitize_textarea_field((string) $data['description']),
|
'description' => sanitize_textarea_field((string) $data['description']),
|
||||||
@@ -497,7 +502,9 @@ final class SPP_Repository
|
|||||||
'memory_mb' => max(128, absint($data['memory_mb'])),
|
'memory_mb' => max(128, absint($data['memory_mb'])),
|
||||||
'disk_gb' => max(1, absint($data['disk_gb'])),
|
'disk_gb' => max(1, absint($data['disk_gb'])),
|
||||||
'default_ttl_hours' => max(1, min(720, absint($data['default_ttl_hours']))),
|
'default_ttl_hours' => max(1, min(720, absint($data['default_ttl_hours']))),
|
||||||
'proxmox_template_id' => absint($data['proxmox_template_id']),
|
'provisioning_type' => $provisioning_type,
|
||||||
|
'proxmox_template_id' => $proxmox_template_id,
|
||||||
|
'proxmox_template_ref' => $proxmox_template_ref,
|
||||||
'is_active' => empty($data['is_active']) ? 0 : 1,
|
'is_active' => empty($data['is_active']) ? 0 : 1,
|
||||||
'updated_at' => current_time('mysql'),
|
'updated_at' => current_time('mysql'),
|
||||||
];
|
];
|
||||||
@@ -505,7 +512,9 @@ final class SPP_Repository
|
|||||||
$wpdb->update($table, $row, ['id' => $id]);
|
$wpdb->update($table, $row, ['id' => $id]);
|
||||||
|
|
||||||
$this->audit('TEMPLATE_UPDATED', 'template', $id, $actor_id, [
|
$this->audit('TEMPLATE_UPDATED', 'template', $id, $actor_id, [
|
||||||
|
'provisioning_type' => (string) $row['provisioning_type'],
|
||||||
'proxmox_template_id' => (int) $row['proxmox_template_id'],
|
'proxmox_template_id' => (int) $row['proxmox_template_id'],
|
||||||
|
'proxmox_template_ref' => (string) ($row['proxmox_template_ref'] ?? ''),
|
||||||
'name' => (string) $row['name'],
|
'name' => (string) $row['name'],
|
||||||
'is_active' => (int) $row['is_active'],
|
'is_active' => (int) $row['is_active'],
|
||||||
]);
|
]);
|
||||||
@@ -529,16 +538,28 @@ final class SPP_Repository
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array<int, int>
|
* @return array<int, string>
|
||||||
*/
|
*/
|
||||||
public function active_proxmox_template_ids(): array
|
public function active_template_identity_keys(): array
|
||||||
{
|
{
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
|
|
||||||
$table = SPP_Activator::table('templates');
|
$table = SPP_Activator::table('templates');
|
||||||
$ids = $wpdb->get_col("SELECT proxmox_template_id FROM {$table} WHERE is_active = 1");
|
$rows = $wpdb->get_results(
|
||||||
|
"SELECT provisioning_type, proxmox_template_id, proxmox_template_ref FROM {$table} WHERE is_active = 1",
|
||||||
|
ARRAY_A
|
||||||
|
);
|
||||||
|
$keys = [];
|
||||||
|
|
||||||
return array_values(array_map('intval', is_array($ids) ? $ids : []));
|
foreach (is_array($rows) ? $rows : [] as $row) {
|
||||||
|
$keys[] = $this->template_identity_key(
|
||||||
|
(string) ($row['provisioning_type'] ?? 'qemu'),
|
||||||
|
(int) ($row['proxmox_template_id'] ?? 0),
|
||||||
|
(string) ($row['proxmox_template_ref'] ?? '')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_values(array_unique($keys));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -617,17 +638,58 @@ final class SPP_Repository
|
|||||||
return is_array($row) ? $this->template_dto($row) : null;
|
return is_array($row) ? $this->template_dto($row) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function unique_template_key(string $raw_key, int $proxmox_template_id): string
|
private function unique_template_key(string $raw_key, string $provisioning_type, int $proxmox_template_id, string $proxmox_template_ref): string
|
||||||
{
|
{
|
||||||
$key = sanitize_title($raw_key);
|
$key = sanitize_title($raw_key);
|
||||||
|
|
||||||
if ($key === '') {
|
if ($key === '') {
|
||||||
$key = 'pve-template-' . $proxmox_template_id;
|
$key = $this->template_identity_key($provisioning_type, $proxmox_template_id, $proxmox_template_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
return substr($key, 0, 80);
|
return substr($key, 0, 80);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function template_existing_id(string $provisioning_type, int $proxmox_template_id, string $proxmox_template_ref, string $template_key): int
|
||||||
|
{
|
||||||
|
global $wpdb;
|
||||||
|
|
||||||
|
$table = SPP_Activator::table('templates');
|
||||||
|
|
||||||
|
if ($provisioning_type === 'lxc') {
|
||||||
|
return (int) $wpdb->get_var(
|
||||||
|
$wpdb->prepare(
|
||||||
|
"SELECT id FROM {$table}
|
||||||
|
WHERE (provisioning_type = 'lxc' AND proxmox_template_ref = %s) OR template_key = %s
|
||||||
|
LIMIT 1",
|
||||||
|
$proxmox_template_ref,
|
||||||
|
$template_key
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int) $wpdb->get_var(
|
||||||
|
$wpdb->prepare(
|
||||||
|
"SELECT id FROM {$table}
|
||||||
|
WHERE (provisioning_type = 'qemu' AND proxmox_template_id = %d) OR template_key = %s
|
||||||
|
LIMIT 1",
|
||||||
|
$proxmox_template_id,
|
||||||
|
$template_key
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function template_identity_key(string $provisioning_type, int $proxmox_template_id, string $proxmox_template_ref): string
|
||||||
|
{
|
||||||
|
return $this->normalise_template_type($provisioning_type) === 'lxc'
|
||||||
|
? 'lxc:' . $proxmox_template_ref
|
||||||
|
: 'qemu:' . $proxmox_template_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function normalise_template_type(string $type): string
|
||||||
|
{
|
||||||
|
return strtolower($type) === 'lxc' ? 'lxc' : 'qemu';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array<string, mixed> $metadata
|
* @param array<string, mixed> $metadata
|
||||||
*/
|
*/
|
||||||
@@ -661,7 +723,9 @@ final class SPP_Repository
|
|||||||
'memoryMb' => (int) $row['memory_mb'],
|
'memoryMb' => (int) $row['memory_mb'],
|
||||||
'diskGb' => (int) $row['disk_gb'],
|
'diskGb' => (int) $row['disk_gb'],
|
||||||
'defaultTtlHours' => (int) $row['default_ttl_hours'],
|
'defaultTtlHours' => (int) $row['default_ttl_hours'],
|
||||||
|
'provisioningType' => $this->normalise_template_type((string) ($row['provisioning_type'] ?? 'qemu')),
|
||||||
'proxmoxTemplateId' => (int) $row['proxmox_template_id'],
|
'proxmoxTemplateId' => (int) $row['proxmox_template_id'],
|
||||||
|
'proxmoxTemplateRef' => (string) ($row['proxmox_template_ref'] ?? ''),
|
||||||
'isActive' => (int) $row['is_active'] === 1,
|
'isActive' => (int) $row['is_active'] === 1,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -676,6 +740,7 @@ final class SPP_Repository
|
|||||||
'id' => (int) $row['id'],
|
'id' => (int) $row['id'],
|
||||||
'name' => (string) $row['name'],
|
'name' => (string) $row['name'],
|
||||||
'status' => (string) $row['status'],
|
'status' => (string) $row['status'],
|
||||||
|
'provisioningType' => $this->normalise_template_type((string) ($row['provisioning_type'] ?? 'qemu')),
|
||||||
'templateName' => (string) $row['template_name'],
|
'templateName' => (string) $row['template_name'],
|
||||||
'requestedById' => (int) $row['requested_by'],
|
'requestedById' => (int) $row['requested_by'],
|
||||||
'requestedByName' => (string) $row['requested_by_name'],
|
'requestedByName' => (string) $row['requested_by_name'],
|
||||||
@@ -695,6 +760,8 @@ final class SPP_Repository
|
|||||||
return array_merge($this->deployment_summary_dto($row), [
|
return array_merge($this->deployment_summary_dto($row), [
|
||||||
'templateId' => (int) $row['template_id'],
|
'templateId' => (int) $row['template_id'],
|
||||||
'proxmoxVmId' => isset($row['proxmox_vm_id']) ? (int) $row['proxmox_vm_id'] : null,
|
'proxmoxVmId' => isset($row['proxmox_vm_id']) ? (int) $row['proxmox_vm_id'] : null,
|
||||||
|
'proxmoxResourceType' => $this->normalise_template_type((string) ($row['provisioning_type'] ?? 'qemu')),
|
||||||
|
'proxmoxResourceId' => isset($row['proxmox_vm_id']) ? (int) $row['proxmox_vm_id'] : null,
|
||||||
'cpuCores' => (int) $row['cpu_cores'],
|
'cpuCores' => (int) $row['cpu_cores'],
|
||||||
'memoryMb' => (int) $row['memory_mb'],
|
'memoryMb' => (int) $row['memory_mb'],
|
||||||
'diskGb' => (int) $row['disk_gb'],
|
'diskGb' => (int) $row['disk_gb'],
|
||||||
|
|||||||
@@ -222,22 +222,27 @@ final class SPP_REST_Controller
|
|||||||
return $quota_error;
|
return $quota_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$provisioning_type = $this->normalise_template_type((string) ($template['provisioning_type'] ?? 'qemu'));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$clone = $this->proxmox->clone_vm([
|
$instance = $this->proxmox->provision_instance([
|
||||||
|
'provisioning_type' => $provisioning_type,
|
||||||
'template_vm_id' => (int) $template['proxmox_template_id'],
|
'template_vm_id' => (int) $template['proxmox_template_id'],
|
||||||
|
'lxc_template_ref' => (string) ($template['proxmox_template_ref'] ?? ''),
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
'cpu_cores' => (int) $template['cpu_cores'],
|
'cpu_cores' => (int) $template['cpu_cores'],
|
||||||
'memory_mb' => (int) $template['memory_mb'],
|
'memory_mb' => (int) $template['memory_mb'],
|
||||||
'disk_gb' => (int) $template['disk_gb'],
|
'disk_gb' => (int) $template['disk_gb'],
|
||||||
|
'tags' => $this->deployment_tags(wp_get_current_user()),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$vm_id = (int) $clone['vm_id'];
|
$vm_id = (int) $instance['vm_id'];
|
||||||
$deployment = $this->repository->create_deployment(
|
$deployment = $this->repository->create_deployment(
|
||||||
$template,
|
$template,
|
||||||
$name,
|
$name,
|
||||||
$ttl_hours,
|
$ttl_hours,
|
||||||
$vm_id,
|
$vm_id,
|
||||||
$this->safe_ip_addresses($vm_id),
|
$this->safe_ip_addresses($provisioning_type, $vm_id),
|
||||||
get_current_user_id()
|
get_current_user_id()
|
||||||
);
|
);
|
||||||
} catch (Throwable $error) {
|
} catch (Throwable $error) {
|
||||||
@@ -278,17 +283,17 @@ final class SPP_REST_Controller
|
|||||||
|
|
||||||
public function start_deployment(WP_REST_Request $request): WP_REST_Response|WP_Error
|
public function start_deployment(WP_REST_Request $request): WP_REST_Response|WP_Error
|
||||||
{
|
{
|
||||||
return $this->apply_lifecycle_action((int) $request['id'], 'RUNNING', 'DEPLOYMENT_STARTED', 'start_vm');
|
return $this->apply_lifecycle_action((int) $request['id'], 'RUNNING', 'DEPLOYMENT_STARTED', 'start');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function stop_deployment(WP_REST_Request $request): WP_REST_Response|WP_Error
|
public function stop_deployment(WP_REST_Request $request): WP_REST_Response|WP_Error
|
||||||
{
|
{
|
||||||
return $this->apply_lifecycle_action((int) $request['id'], 'STOPPED', 'DEPLOYMENT_STOPPED', 'stop_vm');
|
return $this->apply_lifecycle_action((int) $request['id'], 'STOPPED', 'DEPLOYMENT_STOPPED', 'stop');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete_deployment(WP_REST_Request $request): WP_REST_Response|WP_Error
|
public function delete_deployment(WP_REST_Request $request): WP_REST_Response|WP_Error
|
||||||
{
|
{
|
||||||
return $this->apply_lifecycle_action((int) $request['id'], 'DELETED', 'DEPLOYMENT_DELETED', 'delete_vm');
|
return $this->apply_lifecycle_action((int) $request['id'], 'DELETED', 'DEPLOYMENT_DELETED', 'delete');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function prolong_deployment(WP_REST_Request $request): WP_REST_Response|WP_Error
|
public function prolong_deployment(WP_REST_Request $request): WP_REST_Response|WP_Error
|
||||||
@@ -351,13 +356,16 @@ final class SPP_REST_Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (empty($record['proxmox_vm_id'])) {
|
if (empty($record['proxmox_vm_id'])) {
|
||||||
return new WP_Error('spp_missing_vm_id', 'Deployment is missing a Proxmox VM id.', ['status' => 409]);
|
return new WP_Error('spp_missing_vm_id', 'Deployment is missing a Proxmox resource id.', ['status' => 409]);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->repository->update_deployment_ips(
|
$this->repository->update_deployment_ips(
|
||||||
$id,
|
$id,
|
||||||
$this->proxmox->get_ip_addresses((int) $record['proxmox_vm_id']),
|
$this->proxmox->get_ip_addresses(
|
||||||
|
(string) ($record['provisioning_type'] ?? 'qemu'),
|
||||||
|
(int) $record['proxmox_vm_id']
|
||||||
|
),
|
||||||
get_current_user_id()
|
get_current_user_id()
|
||||||
);
|
);
|
||||||
} catch (Throwable $error) {
|
} catch (Throwable $error) {
|
||||||
@@ -442,11 +450,11 @@ final class SPP_REST_Controller
|
|||||||
return new WP_Error('spp_not_found', 'Deployment not found.', ['status' => 404]);
|
return new WP_Error('spp_not_found', 'Deployment not found.', ['status' => 404]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($method === 'delete_vm' && !$this->user_can_delete_deployment($id)) {
|
if ($method === 'delete' && !$this->user_can_delete_deployment($id)) {
|
||||||
return new WP_Error('spp_forbidden', 'Only the owner or a deployment manager can delete this deployment.', ['status' => 403]);
|
return new WP_Error('spp_forbidden', 'Only the owner or a deployment manager can delete this deployment.', ['status' => 403]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($method === 'start_vm' && $record['status'] === 'EXPIRED') {
|
if ($method === 'start' && $record['status'] === 'EXPIRED') {
|
||||||
return new WP_Error(
|
return new WP_Error(
|
||||||
'spp_expired_deployment',
|
'spp_expired_deployment',
|
||||||
'This deployment is expired. Prolong its TTL before starting it again.',
|
'This deployment is expired. Prolong its TTL before starting it again.',
|
||||||
@@ -455,27 +463,33 @@ final class SPP_REST_Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (empty($record['proxmox_vm_id'])) {
|
if (empty($record['proxmox_vm_id'])) {
|
||||||
return new WP_Error('spp_missing_vm_id', 'Deployment is missing a Proxmox VM id.', ['status' => 409]);
|
return new WP_Error('spp_missing_vm_id', 'Deployment is missing a Proxmox resource id.', ['status' => 409]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$provisioning_type = $this->normalise_template_type((string) ($record['provisioning_type'] ?? 'qemu'));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->proxmox->{$method}((int) $record['proxmox_vm_id']);
|
if ($method === 'start') {
|
||||||
if ($method === 'start_vm') {
|
$this->proxmox->start_instance($provisioning_type, (int) $record['proxmox_vm_id']);
|
||||||
$this->repository->update_deployment_status_and_ips(
|
$this->repository->update_deployment_status_and_ips(
|
||||||
$id,
|
$id,
|
||||||
$status,
|
$status,
|
||||||
$this->safe_ip_addresses((int) $record['proxmox_vm_id']),
|
$this->safe_ip_addresses($provisioning_type, (int) $record['proxmox_vm_id']),
|
||||||
$audit_action,
|
$audit_action,
|
||||||
get_current_user_id()
|
get_current_user_id()
|
||||||
);
|
);
|
||||||
|
} elseif ($method === 'stop') {
|
||||||
|
$this->proxmox->stop_instance($provisioning_type, (int) $record['proxmox_vm_id']);
|
||||||
|
$this->repository->update_deployment_status($id, $status, $audit_action, get_current_user_id());
|
||||||
} else {
|
} else {
|
||||||
|
$this->proxmox->delete_instance($provisioning_type, (int) $record['proxmox_vm_id']);
|
||||||
$this->repository->update_deployment_status($id, $status, $audit_action, get_current_user_id());
|
$this->repository->update_deployment_status($id, $status, $audit_action, get_current_user_id());
|
||||||
}
|
}
|
||||||
} catch (Throwable $error) {
|
} catch (Throwable $error) {
|
||||||
return new WP_Error('spp_proxmox_error', $error->getMessage(), ['status' => 502]);
|
return new WP_Error('spp_proxmox_error', $error->getMessage(), ['status' => 502]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($method === 'delete_vm') {
|
if ($method === 'delete') {
|
||||||
return rest_ensure_response(['deleted' => true]);
|
return rest_ensure_response(['deleted' => true]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -553,12 +567,32 @@ final class SPP_REST_Controller
|
|||||||
/**
|
/**
|
||||||
* @return array<int, string>
|
* @return array<int, string>
|
||||||
*/
|
*/
|
||||||
private function safe_ip_addresses(int $vm_id): array
|
private function safe_ip_addresses(string $provisioning_type, int $vm_id): array
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
return $this->proxmox->get_ip_addresses($vm_id);
|
return $this->proxmox->get_ip_addresses($provisioning_type, $vm_id);
|
||||||
} catch (Throwable) {
|
} catch (Throwable) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<int, string>
|
||||||
|
*/
|
||||||
|
private function deployment_tags(WP_User $user): array
|
||||||
|
{
|
||||||
|
$login = $user->user_login !== '' ? $user->user_login : $user->display_name;
|
||||||
|
$user_tag = strtolower(sanitize_title($login));
|
||||||
|
|
||||||
|
if ($user_tag === '') {
|
||||||
|
$user_tag = (string) $user->ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ['support-portal', 'user-' . $user_tag];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function normalise_template_type(string $type): string
|
||||||
|
{
|
||||||
|
return strtolower($type) === 'lxc' ? 'lxc' : 'qemu';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,26 +7,26 @@ if (!defined('ABSPATH')) {
|
|||||||
interface SPP_Proxmox_Client
|
interface SPP_Proxmox_Client
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @return array<int, array{vmId:int,name:string,cpuCores:int,memoryMb:int,diskGb:int,status:string}>
|
* @return array<int, array<string, mixed>>
|
||||||
*/
|
*/
|
||||||
public function list_templates(): array;
|
public function list_templates(): array;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array<string, int|string> $input
|
* @param array<string, mixed> $input
|
||||||
* @return array{vm_id:int}
|
* @return array{vm_id:int}
|
||||||
*/
|
*/
|
||||||
public function clone_vm(array $input): array;
|
public function provision_instance(array $input): array;
|
||||||
|
|
||||||
public function start_vm(int $vm_id): void;
|
public function start_instance(string $type, int $vm_id): void;
|
||||||
|
|
||||||
public function stop_vm(int $vm_id): void;
|
public function stop_instance(string $type, int $vm_id): void;
|
||||||
|
|
||||||
public function delete_vm(int $vm_id): void;
|
public function delete_instance(string $type, int $vm_id): void;
|
||||||
|
|
||||||
public function get_status(int $vm_id): string;
|
public function get_status(string $type, int $vm_id): string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array<int, string>
|
* @return array<int, string>
|
||||||
*/
|
*/
|
||||||
public function get_ip_addresses(int $vm_id): array;
|
public function get_ip_addresses(string $type, int $vm_id): array;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* Plugin Name: Support Provisioning Portal
|
* Plugin Name: Support Provisioning Portal
|
||||||
* Description: Internal self-service portal for provisioning standardized Proxmox VE VMs.
|
* Description: Internal self-service portal for provisioning standardized Proxmox VE VMs and LXC containers.
|
||||||
* Version: 0.6.0
|
* Version: 0.7.0
|
||||||
* Author: Internal Support
|
* Author: Internal Support
|
||||||
* Requires PHP: 8.0
|
* Requires PHP: 8.0
|
||||||
* Requires at least: 6.2
|
* Requires at least: 6.2
|
||||||
@@ -13,7 +13,7 @@ if (!defined('ABSPATH')) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
define('SPP_VERSION', '0.6.0');
|
define('SPP_VERSION', '0.7.0');
|
||||||
define('SPP_PLUGIN_FILE', __FILE__);
|
define('SPP_PLUGIN_FILE', __FILE__);
|
||||||
define('SPP_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
define('SPP_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
||||||
define('SPP_PLUGIN_URL', plugin_dir_url(__FILE__));
|
define('SPP_PLUGIN_URL', plugin_dir_url(__FILE__));
|
||||||
|
|||||||