refactor(webapp): remove styleguide (#9432)

This commit is contained in:
Ulf Gebhardt 2026-03-24 02:02:33 +01:00 committed by GitHub
parent 75c1232860
commit fa5c225138
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
33 changed files with 1130 additions and 81 deletions

View File

@ -10,8 +10,6 @@ services:
- NUXT_BUILD=/tmp/nuxt # avoid file permission issues when `rm -rf .nuxt/` - NUXT_BUILD=/tmp/nuxt # avoid file permission issues when `rm -rf .nuxt/`
volumes: volumes:
- ./webapp:/app - ./webapp:/app
- ./styleguide:/styleguide
- /styleguide/node_modules
- ./packages/ui:/packages/ui - ./packages/ui:/packages/ui
- /packages/ui/node_modules - /packages/ui/node_modules

View File

@ -1,14 +1,4 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM node:25.8.1-alpine AS styleguide
RUN apk --no-cache add git python3 make g++
RUN mkdir -p /app
WORKDIR /app
COPY styleguide/package.json styleguide/yarn.lock ./
RUN --mount=type=cache,target=/yarn-cache,sharing=locked \
yarn install --production=false --frozen-lockfile --non-interactive --cache-folder /yarn-cache
COPY styleguide/. .
RUN yarn run build:lib
FROM node:25.8.1-alpine AS ui-library FROM node:25.8.1-alpine AS ui-library
RUN apk --no-cache add git python3 make g++ RUN apk --no-cache add git python3 make g++
RUN mkdir -p /app RUN mkdir -p /app
@ -34,7 +24,6 @@ EXPOSE ${PORT}
RUN apk --no-cache add git python3 make g++ bash jq RUN apk --no-cache add git python3 make g++ bash jq
RUN mkdir -p /app RUN mkdir -p /app
WORKDIR /app WORKDIR /app
COPY --from=styleguide ./app/ /styleguide/
COPY --from=ui-library ./app/ /packages/ui/ COPY --from=ui-library ./app/ /packages/ui/
CMD ["/bin/bash", "-c", "yarn run start"] CMD ["/bin/bash", "-c", "yarn run start"]

View File

@ -9,15 +9,6 @@ LABEL org.label-schema.vendor="ocelot.social Community"
LABEL org.label-schema.schema-version="1.0" LABEL org.label-schema.schema-version="1.0"
LABEL maintainer="devops@ocelot.social" LABEL maintainer="devops@ocelot.social"
FROM node:25.8.1-alpine AS styleguide
RUN apk --no-cache add git python3 make g++
RUN mkdir -p /app
WORKDIR /app
COPY styleguide .
RUN --mount=type=cache,target=/yarn-cache,sharing=locked \
yarn install --production=false --frozen-lockfile --non-interactive --cache-folder /yarn-cache
RUN yarn run build:lib
FROM node:25.8.1-alpine AS ui-library FROM node:25.8.1-alpine AS ui-library
RUN apk --no-cache add git python3 make g++ RUN apk --no-cache add git python3 make g++
RUN mkdir -p /app RUN mkdir -p /app
@ -29,7 +20,6 @@ RUN npm run build
FROM node:25.8.1-alpine AS build FROM node:25.8.1-alpine AS build
ENV NODE_ENV="production" ENV NODE_ENV="production"
RUN apk --no-cache add git python3 make g++ bash jq RUN apk --no-cache add git python3 make g++ bash jq
COPY --from=styleguide ./app/ /styleguide/
COPY --from=ui-library ./app/ /packages/ui/ COPY --from=ui-library ./app/ /packages/ui/
RUN mkdir -p /app RUN mkdir -p /app
WORKDIR /app WORKDIR /app

View File

@ -1,7 +1,7 @@
// ========================================================== // ==========================================================
// DS-COMPAT: Temporäre Utility-Klassen für ds-* Migration // DS-COMPAT: Temporäre Utility-Klassen für ds-* Migration
// TODO(tailwind): Durch Tailwind-Utilities ersetzen // TODO(tailwind): Durch Tailwind-Utilities ersetzen
// Grep: ds-mb-, ds-mt-, ds-my-, ds-space-centered, ds-flex // Global resets + fonts are in resets.scss (loaded first)
// ========================================================== // ==========================================================
// ds-space Ersatz Margin-Bottom // ds-space Ersatz Margin-Bottom
@ -104,7 +104,7 @@
.ds-table-wrap { width: 100%; overflow: auto; } .ds-table-wrap { width: 100%; overflow: auto; }
.ds-table { width: 100%; border-collapse: collapse; } .ds-table { width: 100%; border-collapse: collapse; }
.ds-table-col { .ds-table-col {
vertical-align: middle; vertical-align: top;
padding: $space-small $space-xx-small; padding: $space-small $space-xx-small;
&:last-child { padding-right: 0; } &:last-child { padding-right: 0; }
} }
@ -125,3 +125,349 @@
&.ds-table-col-right, &.ds-table-head-col-right { text-align: right; } &.ds-table-col-right, &.ds-table-head-col-right { text-align: right; }
&.ds-table-col-center, &.ds-table-head-col-center { text-align: center; } &.ds-table-col-center, &.ds-table-head-col-center { text-align: center; }
} }
// ==========================================================
// Layout: Container, Section, Placeholder
// ==========================================================
.ds-container {
margin: 0 auto;
padding: 0 $space-small;
@media #{$media-query-medium} { padding: 0 $space-base; }
@media #{$media-query-large} { padding: 0 $space-x-large; }
}
.ds-container-small { max-width: #{$sm}px; }
.ds-container-medium { max-width: #{$md}px; }
.ds-container-x-large { max-width: #{$xl}px; }
.ds-section {
padding: $space-large 0;
}
.ds-placeholder {
color: $text-color-disabled;
font-style: italic;
text-align: center;
padding: $space-base;
}
// ==========================================================
// Typography: Heading
// ==========================================================
.ds-heading {
margin: 2em 0 .6em;
padding: 0;
font-family: $font-family-heading;
font-weight: $font-weight-bold;
line-height: 1.1;
letter-spacing: -0.01em;
}
.ds-heading:first-child { margin-top: 0; }
.ds-heading:last-child { margin-bottom: 0; }
.ds-heading-h1 { font-size: $font-size-xx-large; }
.ds-heading-h2 { font-size: $font-size-xx-large; }
.ds-heading-h3 { font-size: $font-size-x-large; }
.ds-heading-h4 { font-size: $font-size-large; }
@media #{$media-query-large} {
.ds-heading-h1 { font-size: $font-size-xxx-large; }
}
.ds-heading-soft { color: $text-color-softer; }
.ds-heading-no-margin { margin: 0; }
.ds-heading-align-center { text-align: center; }
// Tab Nav styles are in TabNavigation.vue (scoped), no global .ds-tab-nav needed
// ==========================================================
// List
// ==========================================================
.ds-list {
margin: 0 0 1em;
padding: 0;
list-style: none;
line-height: $line-height-base;
}
.ds-list:last-child { margin-bottom: 0; }
// ==========================================================
// Logo
// ==========================================================
.ds-logo {
display: inline-block;
}
.ds-logo-svg {
display: block;
height: auto;
}
.ds-logo-mobile { display: block; }
.ds-logo-tablet { display: none; }
.ds-logo-desktop { display: none; }
.ds-logo-inverse { display: none; }
@media screen and (min-width: 600px) {
.ds-logo-mobile { display: none; }
.ds-logo-tablet { display: block; }
}
@media screen and (min-width: 960px) {
.ds-logo-tablet { display: none; }
.ds-logo-desktop { display: block; }
}
// Footer styles are in PageFooter.vue (scoped), no global .ds-footer needed
// ==========================================================
// Form / Input (used by OcelotInput)
// ==========================================================
.ds-form-item {
position: relative;
margin-bottom: $space-small;
}
.ds-form-item:last-child { margin-bottom: 0; }
.ds-input-label {
padding-bottom: $space-xx-small;
color: $text-color-soft;
font-size: $font-size-base;
display: block;
}
.ds-input-error {
color: $color-danger;
font-size: $font-size-x-small;
position: absolute;
top: 100%;
}
.ds-input-error-enter-active {
transition: opacity $duration-base $ease-out, transform $duration-base $ease-out;
}
.ds-input-error-enter, .ds-input-error-leave-to {
opacity: 0;
transform: translateY(-2px);
}
.ds-input-wrap { position: relative; }
.ds-input {
appearance: none;
box-sizing: border-box;
font-size: $input-font-size-base;
line-height: $line-height-base;
font-family: $font-family-text;
width: 100%;
padding: $input-padding-vertical $space-x-small;
height: $input-height;
color: $text-color-base;
background: $background-color-soft;
border: $input-border-size solid $border-color-softer;
border-radius: $border-radius-base;
outline: none;
transition: all $duration-short $ease-out;
}
.ds-input::placeholder { color: $text-color-disabled; }
.ds-input-has-focus .ds-input, .ds-input:focus {
border-color: $border-color-active;
background: $background-color-base;
}
.ds-input-is-disabled .ds-input, .ds-input:disabled {
color: $text-color-disabled;
opacity: $opacity-disabled;
pointer-events: none;
cursor: not-allowed;
background-color: $background-color-disabled;
}
.ds-input-is-readonly .ds-input { pointer-events: none; }
.ds-input-has-error .ds-input { border-color: $border-color-danger; }
.ds-input-size-small {
font-size: $font-size-small;
.ds-input { font-size: $input-font-size-small; height: $input-height-small; padding: $input-padding-vertical-small $space-x-small; }
}
.ds-input-size-large {
font-size: $font-size-large;
.ds-input { font-size: $input-font-size-large; height: $input-height-large; padding: $input-padding-vertical-large $space-x-small; }
}
textarea.ds-input { height: auto; min-height: $input-height; resize: none; }
textarea.ds-input-size-small { min-height: $input-height-small; }
textarea.ds-input-size-large { min-height: $input-height-large; }
.ds-input-icon, .ds-input-icon-right {
position: absolute;
top: 0; bottom: 0; left: 0;
display: flex;
align-items: center;
justify-content: center;
width: $input-height;
color: $text-color-softer;
transition: color $duration-short $ease-out;
pointer-events: none;
}
.ds-input-has-focus .ds-input-icon,
.ds-input-has-focus .ds-input-icon-right { color: $text-color-base; }
.ds-input-size-small .ds-input-icon,
.ds-input-size-small .ds-input-icon-right { width: $input-height-small; }
.ds-input-size-large .ds-input-icon,
.ds-input-size-large .ds-input-icon-right { width: $input-height-large; }
.ds-input-icon-right { right: 0; left: auto; }
.ds-input-has-icon { padding-left: $input-height; }
.ds-input-size-small .ds-input-has-icon { padding-left: $input-height-small; }
.ds-input-size-large .ds-input-has-icon { padding-left: $input-height-large; }
.ds-input-has-icon-right { padding-right: $input-height; }
.ds-input-size-small .ds-input-has-icon-right { padding-right: $input-height-small; }
.ds-input-size-large .ds-input-has-icon-right { padding-right: $input-height-large; }
// ==========================================================
// Select (used by OcelotSelect)
// ==========================================================
.ds-select-wrap { position: relative; }
.ds-select {
appearance: none;
box-sizing: border-box;
font-size: $input-font-size-base;
line-height: $line-height-base;
font-family: $font-family-text;
width: 100%;
padding: $input-padding-vertical $space-x-small;
height: $input-height;
color: $text-color-base;
background: $background-color-soft;
border: $input-border-size solid $border-color-softer;
border-radius: $border-radius-base;
outline: none;
transition: all $duration-short $ease-out;
user-select: none;
}
.ds-select::placeholder { color: $text-color-disabled; }
.ds-input-has-focus .ds-select, .ds-select:focus {
border-color: $border-color-active;
background: $background-color-base;
}
.ds-input-is-disabled .ds-select, .ds-select:disabled {
color: $text-color-disabled;
opacity: $opacity-disabled;
pointer-events: none;
cursor: not-allowed;
background-color: $background-color-disabled;
}
.ds-input-is-readonly .ds-select { pointer-events: none; }
.ds-input-has-error .ds-select { border-color: $border-color-danger; }
.ds-select-is-open .ds-select {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
border-bottom: none;
}
.ds-input-size-small .ds-select { font-size: $input-font-size-small; height: $input-height-small; padding: $input-padding-vertical-small $space-x-small; }
.ds-input-size-large .ds-select { font-size: $input-font-size-large; height: $input-height-large; padding: $input-padding-vertical-large $space-x-small; }
.ds-select-multiple {
display: flex;
align-items: center;
max-width: 100%;
}
.ds-select-search, .ds-select-value {
box-sizing: border-box;
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
border: $input-border-size solid transparent;
padding: $input-padding-vertical $space-x-small;
line-height: $line-height-base;
}
.ds-input-size-small .ds-select-search,
.ds-input-size-small .ds-select-value { padding: $input-padding-vertical-small $space-x-small; }
.ds-input-size-large .ds-select-search,
.ds-input-size-large .ds-select-value { padding: $input-padding-vertical-large $space-x-small; }
.ds-select-has-icon .ds-select-search,
.ds-select-has-icon .ds-select-value { padding-left: $input-height; }
.ds-select-has-icon-right .ds-select-search,
.ds-select-has-icon-right .ds-select-value { padding-right: $input-height; }
.ds-select-search {
appearance: none;
font-size: inherit;
font-family: $font-family-text;
width: 100%;
background: transparent;
color: $text-color-base;
outline: none;
user-select: text;
opacity: 0;
}
.ds-select-search::placeholder { color: $text-color-disabled; }
.ds-select-is-open .ds-select-search { opacity: 1; }
.ds-select-multiple .ds-select-search {
position: relative;
display: inline-flex;
width: auto;
height: auto;
padding: 0;
opacity: 1;
}
.ds-select-placeholder, .ds-select-value { pointer-events: none; }
.ds-select-is-open .ds-select-placeholder,
.ds-select-is-open .ds-select-value { opacity: 0; }
.ds-select-placeholder { color: $text-color-disabled; }
.ds-selected-options { display: flex; max-width: 100%; overflow: hidden; }
.ds-selected-option { display: inline-flex; align-items: center; margin-right: $space-xx-small; }
.ds-select-dropdown {
position: absolute;
z-index: $z-index-dropdown;
top: 100%;
left: 0;
width: 100%;
background-color: $background-color-base;
border: $input-border-size solid $border-color-active;
border-top: 0;
border-bottom-left-radius: $border-radius-base;
border-bottom-right-radius: $border-radius-base;
visibility: hidden;
opacity: 0;
transition: all $duration-short $ease-out, border-bottom 0ms;
max-height: 240px;
overflow: auto;
}
.ds-select-is-open .ds-select-dropdown { visibility: visible; opacity: 1; }
.ds-select-dropdown-message {
padding: $input-padding-vertical $space-x-small;
color: $text-color-disabled;
}
.ds-select-options {
margin: 0;
padding: 0;
list-style: none;
}
.ds-select-option {
padding: $input-padding-vertical $space-x-small;
cursor: pointer;
transition: all $duration-short $ease-out;
}
.ds-select-option.ds-select-option-hover {
background-color: $background-color-softer;
color: $text-color-base;
}
.ds-select-option-is-selected {
background-color: $background-color-soft;
color: $text-color-primary;
}
.ds-select-icon, .ds-select-icon-right {
position: absolute;
top: 0; bottom: 0; left: 0;
display: flex;
align-items: center;
justify-content: center;
width: $input-height;
color: $text-color-softer;
transition: color $duration-short $ease-out;
pointer-events: none;
}
.ds-input-has-focus .ds-select-icon,
.ds-input-has-focus .ds-select-icon-right { color: $text-color-base; }
.ds-select-icon-right { right: 0; left: auto; }

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,126 @@
* { // Fonts (previously loaded via styleguide system.css)
@font-face {
font-family: LatoWeb;
src: url('/fonts/Lato-Regular.1f440a46.woff2') format('woff2'),
url('/fonts/Lato-Regular.ffb25090.woff') format('woff');
font-style: normal;
font-weight: 400;
font-display: swap;
text-rendering: optimizelegibility;
}
@font-face {
font-family: LatoWeb;
src: url('/fonts/Lato-Italic.a6774e2c.woff2') format('woff2'),
url('/fonts/Lato-Italic.ff8877c4.woff') format('woff');
font-style: italic;
font-weight: 400;
font-display: swap;
text-rendering: optimizelegibility;
}
@font-face {
font-family: LatoWeb;
src: url('/fonts/Lato-Bold.1e239003.woff2') format('woff2'),
url('/fonts/Lato-Bold.35be9fc3.woff') format('woff');
font-style: normal;
font-weight: 600;
font-display: swap;
text-rendering: optimizelegibility;
}
@font-face {
font-family: LatoWeb;
src: url('/fonts/Lato-BoldItalic.4ef02877.woff2') format('woff2'),
url('/fonts/Lato-BoldItalic.5171ee7d.woff') format('woff');
font-style: italic;
font-weight: 600;
font-display: swap;
text-rendering: optimizelegibility;
}
@font-face {
font-family: 'Gentium Basic';
src: local('Gentium Basic'), local('GentiumBasic'),
url('/fonts/GentiumBasic.aa23a915.woff2') format('woff2'),
url('/fonts/GentiumBasic.7775b109.woff') format('woff');
font-style: normal;
font-weight: 400;
font-display: swap;
unicode-range: U+00??, U+0131, U+0152-0153, U+02bb-02bc, U+02c6, U+02da, U+02dc, U+2000-206f, U+2074, U+20ac, U+2122, U+2191, U+2193, U+2212, U+2215, U+feff, U+fffd;
}
@font-face {
font-family: 'Gentium Basic';
src: local('Gentium Basic Italic'), local('GentiumBasic-Italic'),
url('/fonts/GentiumBasic-Italic.84c97b07.woff2') format('woff2'),
url('/fonts/GentiumBasic-Italic.b5afcc4e.woff') format('woff');
font-style: italic;
font-weight: 400;
font-display: swap;
unicode-range: U+00??, U+0131, U+0152-0153, U+02bb-02bc, U+02c6, U+02da, U+02dc, U+2000-206f, U+2074, U+20ac, U+2122, U+2191, U+2193, U+2212, U+2215, U+feff, U+fffd;
}
// Global resets
*,
::after,
::before {
box-sizing: border-box; box-sizing: border-box;
} }
html {
font-family: sans-serif;
font-size: 15px;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
-ms-overflow-style: scrollbar;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body {
margin: 0;
font-size: 15px;
line-height: 1.3;
font-family: $font-family-text;
font-variant-ligatures: none;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color: $text-color-base;
background-color: $background-color-disabled;
}
a {
text-decoration: none !important;
color: $color-primary;
}
textarea {
overflow: auto;
resize: vertical;
}
img {
border-style: none;
vertical-align: middle;
}
button, input, optgroup, select, textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button, input {
overflow: visible;
}
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box;
padding: 0;
}
[role="button"], a, area, button, input:not([type="range"]), label, select, summary, textarea {
touch-action: manipulation;
}
button { button {
padding: 0; padding: 0;
background: transparent; background: transparent;

View File

@ -1,12 +1,10 @@
import { mount, createLocalVue } from '@vue/test-utils' import { mount, createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex' import Vuex from 'vuex'
import VTooltip from 'v-tooltip' import VTooltip from 'v-tooltip'
import Styleguide from '@@/'
import ContentMenu from './ContentMenu.vue' import ContentMenu from './ContentMenu.vue'
const localVue = createLocalVue() const localVue = createLocalVue()
localVue.use(Styleguide)
localVue.use(VTooltip) localVue.use(VTooltip)
localVue.use(Vuex) localVue.use(Vuex)

View File

@ -1,12 +1,10 @@
import { mount, createLocalVue } from '@vue/test-utils' import { mount, createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex' import Vuex from 'vuex'
import VTooltip from 'v-tooltip' import VTooltip from 'v-tooltip'
import Styleguide from '@@/'
import ContentMenu from './ContentMenu.vue' import ContentMenu from './ContentMenu.vue'
const localVue = createLocalVue() const localVue = createLocalVue()
localVue.use(Styleguide)
localVue.use(VTooltip) localVue.use(VTooltip)
localVue.use(Vuex) localVue.use(Vuex)

View File

@ -1,14 +1,12 @@
import Vue from 'vue' import Vue from 'vue'
import LoginForm from './LoginForm.vue' import LoginForm from './LoginForm.vue'
import ShowPassword from '../ShowPassword/ShowPassword.vue' import ShowPassword from '../ShowPassword/ShowPassword.vue'
import Styleguide from '@@/'
import Vuex from 'vuex' import Vuex from 'vuex'
import { mount, createLocalVue } from '@vue/test-utils' import { mount, createLocalVue } from '@vue/test-utils'
import { ocelotIcons } from '@ocelot-social/ui/ocelot' import { ocelotIcons } from '@ocelot-social/ui/ocelot'
const localVue = createLocalVue() const localVue = createLocalVue()
localVue.use(Vuex) localVue.use(Vuex)
localVue.use(Styleguide)
const stubs = { const stubs = {
'nuxt-link': true, 'nuxt-link': true,

View File

@ -56,8 +56,6 @@ module.exports = {
'@mapbox/mapbox-gl-geocoder': 'identity-obj-proxy', '@mapbox/mapbox-gl-geocoder': 'identity-obj-proxy',
'vue2-datepicker/locale/undefined': 'vue2-datepicker/locale/en', 'vue2-datepicker/locale/undefined': 'vue2-datepicker/locale/en',
'^@/(.*)$': '<rootDir>/src/$1', '^@/(.*)$': '<rootDir>/src/$1',
// jest is unable to build the styleguide on its own, as it uses webpack.
'^@@/': '<rootDir>/../styleguide/dist/system.umd.min.js',
'^~/(.*)$': '<rootDir>/$1', '^~/(.*)$': '<rootDir>/$1',
}, },
moduleFileExtensions: ['js', 'mjs', 'json', 'vue'], moduleFileExtensions: ['js', 'mjs', 'json', 'vue'],

View File

@ -14,9 +14,6 @@
"@": [ "@": [
"*" "*"
], ],
"@@/*": [
"../styleguide/dist/system.umd.min.js"
],
} }
} }
} }

View File

@ -38,7 +38,6 @@ export default {
styleResources, styleResources,
plugins: [ plugins: [
{ src: `~/plugins/styleguide.js`, ssr: true },
{ src: '~/plugins/i18n.js', ssr: true }, { src: '~/plugins/i18n.js', ssr: true },
{ src: '~/plugins/v-tooltip.js', ssr: false }, { src: '~/plugins/v-tooltip.js', ssr: false },
], ],

View File

@ -16,12 +16,8 @@ const ogLocaleAlternates = locales
.filter((l) => l.enabled && l.code !== CONFIG.LANGUAGE_DEFAULT) .filter((l) => l.enabled && l.code !== CONFIG.LANGUAGE_DEFAULT)
.map((l) => l.iso.replace('-', '_')) .map((l) => l.iso.replace('-', '_'))
const styleguidePath = '../styleguide' // Design tokens (SCSS variables) — originally from styleguide, now local
const styleguideStyles = [ const designTokenStyles = ['~assets/_new/styles/_styleguide-tokens.scss']
// `${styleguidePath}/src/system/styles/main.scss`,
// `${styleguidePath}/src/system/styles/shared.scss`,
`${styleguidePath}/dist/shared.scss`,
]
export default { export default {
buildDir: CONFIG.NUXT_BUILD, buildDir: CONFIG.NUXT_BUILD,
@ -114,11 +110,12 @@ export default {
'~assets/_new/styles/resets.scss', '~assets/_new/styles/resets.scss',
'~assets/styles/main.scss', '~assets/styles/main.scss',
'~assets/styles/imports/_branding.scss', '~assets/styles/imports/_branding.scss',
// @ocelot-social/ui CSS variables (loaded before styleguide) // @ocelot-social/ui CSS variables
'~assets/_new/styles/ocelot-ui-variables.scss', '~assets/_new/styles/ocelot-ui-variables.scss',
// Utility classes replacing ds-* Vue components // Utility classes replacing ds-* Vue components
'~assets/_new/styles/_ds-compat.scss', '~assets/_new/styles/_ds-compat.scss',
// Note: @ocelot-social/ui/style.css is loaded via plugin after styleguide // UI library component styles (Tailwind utilities + OsMenu CSS)
'@ocelot-social/ui/style.css',
], ],
/* /*
@ -127,7 +124,7 @@ export default {
styleResources: { styleResources: {
scss: [ scss: [
'~assets/_new/styles/uses.scss', '~assets/_new/styles/uses.scss',
...styleguideStyles, ...designTokenStyles,
'~assets/_new/styles/tokens.scss', '~assets/_new/styles/tokens.scss',
'~assets/styles/imports/_branding.scss', '~assets/styles/imports/_branding.scss',
'~assets/_new/styles/export.scss', '~assets/_new/styles/export.scss',
@ -139,10 +136,6 @@ export default {
** Plugins to load before mounting the App ** Plugins to load before mounting the App
*/ */
plugins: [ plugins: [
{
src: `~/plugins/styleguide.js`,
ssr: true,
},
{ src: '~/plugins/i18n.js', ssr: true }, { src: '~/plugins/i18n.js', ssr: true },
{ src: '~/plugins/axios.js', ssr: false }, { src: '~/plugins/axios.js', ssr: false },
{ src: '~/plugins/keep-alive.js', ssr: false }, { src: '~/plugins/keep-alive.js', ssr: false },
@ -322,7 +315,6 @@ export default {
config.devtool = ctx.isDev ? 'eval-source-map' : 'hidden-source-map' config.devtool = ctx.isDev ? 'eval-source-map' : 'hidden-source-map'
} }
config.resolve.alias['@@'] = path.resolve(__dirname, `${styleguidePath}/dist`)
// Vue 2.7 has built-in Composition API - redirect old imports // Vue 2.7 has built-in Composition API - redirect old imports
config.resolve.alias['@vue/composition-api'] = 'vue' config.resolve.alias['@vue/composition-api'] = 'vue'
// Ensure vue-demi uses webapp's Vue 2.7 (not UI library's Vue 3) // Ensure vue-demi uses webapp's Vue 2.7 (not UI library's Vue 3)
@ -335,11 +327,6 @@ export default {
config.resolve.alias['@ocelot-social/ui$'] = path.join(uiLibraryPath, 'index.mjs') config.resolve.alias['@ocelot-social/ui$'] = path.join(uiLibraryPath, 'index.mjs')
config.resolve.alias['@ocelot-social/ui/ocelot$'] = path.join(uiLibraryPath, 'ocelot.mjs') config.resolve.alias['@ocelot-social/ui/ocelot$'] = path.join(uiLibraryPath, 'ocelot.mjs')
config.resolve.alias['@ocelot-social/ui/style.css$'] = path.join(uiLibraryPath, 'style.css') config.resolve.alias['@ocelot-social/ui/style.css$'] = path.join(uiLibraryPath, 'style.css')
config.module.rules.push({
resourceQuery: /blockType=docs/,
loader: require.resolve(`${styleguidePath}/src/loader/docs-trim-loader.js`),
})
const svgRule = config.module.rules.find((rule) => rule.test.test('.svg')) const svgRule = config.module.rules.find((rule) => rule.test.test('.svg'))
svgRule.test = /\.(png|jpe?g|gif|webp)$/ svgRule.test = /\.(png|jpe?g|gif|webp)$/
config.module.rules.push({ config.module.rules.push({

View File

@ -1,12 +1,10 @@
import { mount, createLocalVue } from '@vue/test-utils' import { mount, createLocalVue } from '@vue/test-utils'
import BlockedUsers from './blocked-users.vue' import BlockedUsers from './blocked-users.vue'
import Styleguide from '@@/'
import Filters from '~/plugins/vue-filters' import Filters from '~/plugins/vue-filters'
import { unblockUser } from '~/graphql/settings/BlockedUsers' import { unblockUser } from '~/graphql/settings/BlockedUsers'
const localVue = createLocalVue() const localVue = createLocalVue()
localVue.use(Styleguide)
localVue.use(Filters) localVue.use(Filters)
const stubs = { const stubs = {

View File

@ -1,12 +1,10 @@
import { mount, createLocalVue } from '@vue/test-utils' import { mount, createLocalVue } from '@vue/test-utils'
import MutedUsers from './muted-users.vue' import MutedUsers from './muted-users.vue'
import Styleguide from '@@/'
import Filters from '~/plugins/vue-filters' import Filters from '~/plugins/vue-filters'
import { unmuteUser } from '~/graphql/settings/MutedUsers' import { unmuteUser } from '~/graphql/settings/MutedUsers'
const localVue = createLocalVue() const localVue = createLocalVue()
localVue.use(Styleguide)
localVue.use(Filters) localVue.use(Filters)
const stubs = { const stubs = {

View File

@ -1,7 +0,0 @@
import Vue from 'vue'
import Styleguide from '@@/system.umd.min.js'
import '@@/system.css'
// Load UI library CSS after styleguide to ensure correct specificity
import '@ocelot-social/ui/style.css'
Vue.use(Styleguide)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,7 +1,6 @@
import Vue from 'vue' import Vue from 'vue'
import Vuex from 'vuex' import Vuex from 'vuex'
import vuexI18n from 'vuex-i18n/dist/vuex-i18n.umd.js' import vuexI18n from 'vuex-i18n/dist/vuex-i18n.umd.js'
import Styleguide from '@@/'
import { faker } from '@faker-js/faker' import { faker } from '@faker-js/faker'
import Filters from '~/plugins/vue-filters' import Filters from '~/plugins/vue-filters'
import Directives from '~/plugins/vue-directives' import Directives from '~/plugins/vue-directives'
@ -13,7 +12,6 @@ import '~/plugins/v-tooltip'
const helpers = { const helpers = {
init(options = {}) { init(options = {}) {
Vue.use(Vuex) Vue.use(Vuex)
Vue.use(Styleguide)
Vue.use(Filters) Vue.use(Filters)
Vue.use(IziToast) Vue.use(IziToast)
Vue.use(Directives) Vue.use(Directives)

View File

@ -5,8 +5,7 @@
</template> </template>
<style lang="scss"> <style lang="scss">
@import '../styleguide/src/system/styles/main.scss'; @import '~/assets/_new/styles/_styleguide-tokens.scss';
@import '../styleguide/src/system/styles/shared.scss';
@import '~/assets/styles/main.scss'; @import '~/assets/styles/main.scss';
.container { .container {

View File

@ -19,11 +19,7 @@ module.exports = async ({ config, mode }) => {
loader: 'style-resources-loader', loader: 'style-resources-loader',
options: { options: {
patterns: [ patterns: [
path.resolve( path.resolve(__dirname, '../assets/_new/styles/_styleguide-tokens.scss'),
__dirname,
'../styleguide/src/system/styles/main.scss',
'../styleguide/src/system/styles/shared.scss',
),
path.resolve(__dirname, '../assets/_new/styles/tokens.scss'), path.resolve(__dirname, '../assets/_new/styles/tokens.scss'),
], ],
injector: 'prepend', injector: 'prepend',

View File

@ -75,8 +75,12 @@ Module._load = function (request, parent, isMain) {
return originalLoad.apply(this, arguments) return originalLoad.apply(this, arguments)
} }
// Load the UI library dist // Load the UI library dist directly from packages/ui (not from node_modules copy)
const uiDistPath = path.resolve(__dirname, '../../../node_modules/@ocelot-social/ui/dist/index.cjs') // In Docker: /packages/ui/dist, locally: ../../../../packages/ui/dist
const fs = require('fs')
const dockerPath = '/packages/ui/dist/index.cjs'
const localPath = path.resolve(__dirname, '../../../../packages/ui/dist/index.cjs')
const uiDistPath = fs.existsSync(dockerPath) ? dockerPath : localPath
const ui = require(uiDistPath) const ui = require(uiDistPath)
// Export everything from the UI library // Export everything from the UI library

View File

@ -2,7 +2,6 @@ import Vue from 'vue'
import { createLocalVue } from '@vue/test-utils' import { createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex' import Vuex from 'vuex'
import VTooltip from 'v-tooltip' import VTooltip from 'v-tooltip'
import Styleguide from '@@/'
import Filters from '~/plugins/vue-filters' import Filters from '~/plugins/vue-filters'
import InfiniteLoading from '~/plugins/vue-infinite-loading' import InfiniteLoading from '~/plugins/vue-infinite-loading'
import Directives from '~/plugins/vue-directives' import Directives from '~/plugins/vue-directives'
@ -27,7 +26,6 @@ global.localVue = createLocalVue()
global.localVue.use(Vuex) global.localVue.use(Vuex)
global.localVue.use(VTooltip) global.localVue.use(VTooltip)
global.localVue.use(Styleguide)
global.localVue.use(Filters) global.localVue.use(Filters)
global.localVue.use(Directives) global.localVue.use(Directives)
global.localVue.use(InfiniteLoading) global.localVue.use(InfiniteLoading)