diff --git a/SKYMOON-BRANDING.md b/SKYMOON-BRANDING.md new file mode 100644 index 000000000000..20f4bbdc429f --- /dev/null +++ b/SKYMOON-BRANDING.md @@ -0,0 +1,56 @@ +# SkyMoon Cloud visual identity + +SkyMoon Cloud is built on a fork of Apache CloudStack. This initial change applies +SkyMoon branding to the existing Vue UI without changing CloudStack's API, +virtualization, networking, or resource management internals. + +## Brand source + +Existing, user-supplied brand files and design tokens were reused from the +private `SkyMoonTechnologies/SkyMoonTech` repository. + +| Asset | Original SkyMoonTech source | Destination | +| --- | --- | --- | +| Full SkyMoon logo | `public/skymoonlogo.png` | `ui/public/assets/skymoon/skymoonlogo.png` | +| Square product mark | `public/icon-192.png` | `ui/public/assets/skymoon/icon-192.png` | +| Small favicon | `public/favicon.png` | `ui/public/assets/skymoon/favicon.png` | +| 48px favicon | `public/favicon-48.png` | `ui/public/assets/skymoon/favicon-48.png` | + +Theme colors originate from the CSS HSL design tokens in +`SkyMoonTech/app/globals.css`. In particular: + +- Primary blue: `#0B4B6F` (202 82% 24%) +- Canvas background: `#F5F7FA` (210 29% 97%) +- Dark background: `#101419` (214 24% 8%) +- Body ink: `#0C0F13` (214 24% 6%) +- Muted text: `#44516A` (219 22% 34%) +- Border: `#E1E5EA` (213 18% 90%) + +No AI-generated images, artwork, or icons were used. + +## Changed UI files + +- `ui/public/config.json`: resource references, UI titles, light-theme tokens +- `ui/public/index.html` and `ui/index.html`: page title and favicon +- `ui/src/components/header/Logo.vue`: responsive existing-logo wordmark +- `ui/src/layouts/UserLayout.vue`: branded login identity +- `ui/src/style/vars.less`: matching fallback theme values + +## Run and test + +```bash +cd ui +npm ci +npm run lint +npm run build +``` + +See `ui/README.md` for details on running the frontend against a +CloudStack management server. Branding edits do not automatically configure +customer sign-up or multi-tenant product provisioning. + +## Attribution and licensing + +Apache CloudStack remains governed by its Apache License 2.0, with upstream +copyright notices, license files, and attribution retained. SkyMoon brand +artwork is derived from SkyMoonTech; do not mistake it for ASF artwork. diff --git a/compose.demo.yml b/compose.demo.yml new file mode 100644 index 000000000000..2f4f0ffe4f1a --- /dev/null +++ b/compose.demo.yml @@ -0,0 +1,9 @@ +services: + skymoon-ui: + build: + context: ./ui + dockerfile: Dockerfile.demo + container_name: skymoon-ui-demo + restart: unless-stopped + ports: + - "5080:80" diff --git a/ui/Dockerfile.demo b/ui/Dockerfile.demo new file mode 100644 index 000000000000..ec177981a763 --- /dev/null +++ b/ui/Dockerfile.demo @@ -0,0 +1,18 @@ +FROM node:24-bookworm AS build + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci --legacy-peer-deps --no-audit --no-fund + +COPY . . + +ENV NODE_OPTIONS=--openssl-legacy-provider +RUN npm run build + +FROM nginx:alpine + +COPY --from=build /app/dist/ /usr/share/nginx/html/ +COPY nginx/demo.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 diff --git a/ui/index.html b/ui/index.html index 355fdf2f5a1e..953703b5c01d 100644 --- a/ui/index.html +++ b/ui/index.html @@ -21,7 +21,7 @@
-You're in developer mode, please build and run UI using npm.
diff --git a/ui/nginx/demo.conf b/ui/nginx/demo.conf new file mode 100644 index 000000000000..ef5655239fcd --- /dev/null +++ b/ui/nginx/demo.conf @@ -0,0 +1,20 @@ +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + location /client/ { + proxy_pass https://qa.cloudstack.cloud; + proxy_ssl_server_name on; + proxy_set_header Host qa.cloudstack.cloud; + proxy_cookie_domain qa.cloudstack.cloud $host; + proxy_redirect https://qa.cloudstack.cloud/ /; + add_header Cache-Control "no-store" always; + } +} diff --git a/ui/public/assets/skymoon/favicon-48.png b/ui/public/assets/skymoon/favicon-48.png new file mode 100644 index 000000000000..84fe2593f949 Binary files /dev/null and b/ui/public/assets/skymoon/favicon-48.png differ diff --git a/ui/public/assets/skymoon/favicon.png b/ui/public/assets/skymoon/favicon.png new file mode 100644 index 000000000000..4ab3c8f18739 Binary files /dev/null and b/ui/public/assets/skymoon/favicon.png differ diff --git a/ui/public/assets/skymoon/icon-192.png b/ui/public/assets/skymoon/icon-192.png new file mode 100644 index 000000000000..3ab5d4a0d5e6 Binary files /dev/null and b/ui/public/assets/skymoon/icon-192.png differ diff --git a/ui/public/assets/skymoon/skymoonlogo.png b/ui/public/assets/skymoon/skymoonlogo.png new file mode 100644 index 000000000000..a29e4282bc39 Binary files /dev/null and b/ui/public/assets/skymoon/skymoonlogo.png differ diff --git a/ui/public/config.json b/ui/public/config.json index 1ca42f04b67c..7875d5b7d83c 100644 --- a/ui/public/config.json +++ b/ui/public/config.json @@ -8,16 +8,16 @@ } ], "docBase": "http://docs.cloudstack.apache.org/en/latest", - "appTitle": "CloudStack", + "appTitle": "SkyMoon Cloud", "footer": "Licensed under the Apache License, Version 2.0.", - "loginTitle": "CloudStack", - "loginFavicon": "assets/logo.svg", + "loginTitle": "SkyMoon Cloud", + "loginFavicon": "assets/skymoon/favicon.png", "loginFooter": "", "resetPasswordFooter": "", - "logo": "assets/logo.svg", - "minilogo": "assets/mini-logo.svg", - "banner": "assets/banner.svg", - "favicon": "cloud.ico", + "logo": "assets/skymoon/icon-192.png", + "minilogo": "assets/skymoon/icon-192.png", + "banner": "assets/skymoon/skymoonlogo.png", + "favicon": "assets/skymoon/favicon.png", "error": { "403": "assets/403.png", "404": "assets/404.png", @@ -25,34 +25,34 @@ }, "theme": { "@layout-mode": "light", - "@logo-background-color": "#ffffff", - "@mini-logo-background-color": "#ffffff", + "@logo-background-color": "#F5F7FA", + "@mini-logo-background-color": "#F5F7FA", "@navigation-background-color": "#ffffff", - "@project-nav-background-color": "#001529", + "@project-nav-background-color": "#131920", "@project-nav-text-color": "rgba(255, 255, 255, 0.65)", - "@navigation-text-color": "rgba(0, 0, 0, 0.65)", - "@primary-color": "#1890ff", - "@link-color": "#1890ff", - "@link-hover-color": "#40a9ff", - "@loading-color": "#1890ff", - "@processing-color": "#1890ff", + "@navigation-text-color": "#44516A", + "@primary-color": "#0B4B6F", + "@link-color": "#0B4B6F", + "@link-hover-color": "#146B9B", + "@loading-color": "#0B4B6F", + "@processing-color": "#0B4B6F", "@success-color": "#52c41a", "@warning-color": "#faad14", "@error-color": "#f5222d", "@font-size-base": "14px", - "@heading-color": "rgba(0, 0, 0, 0.85)", - "@text-color": "rgba(0, 0, 0, 0.65)", + "@heading-color": "#0C0F13", + "@text-color": "#44516A", "@text-color-secondary": "rgba(0, 0, 0, 0.45)", "@disabled-color": "rgba(0, 0, 0, 0.25)", - "@border-color-base": "#d9d9d9", - "@border-radius-base": "4px", + "@border-color-base": "#E1E5EA", + "@border-radius-base": "8px", "@box-shadow-base": "0 2px 8px rgba(0, 0, 0, 0.15)", - "@logo-width": "256px", + "@logo-width": "196px", "@logo-height": "64px", - "@mini-logo-width": "80px", + "@mini-logo-width": "64px", "@mini-logo-height": "64px", - "@banner-width": "700px", - "@banner-height": "110px", + "@banner-width": "104px", + "@banner-height": "104px", "@error-width": "256px", "@error-height": "256px" }, diff --git a/ui/public/index.html b/ui/public/index.html index 0f0bfe59397b..2e2d7f6256d3 100644 --- a/ui/public/index.html +++ b/ui/public/index.html @@ -22,12 +22,12 @@ - -Manage your cloud resources in one place.