Merge branch 'main' into feature/manual-parameters

This commit is contained in:
arthurpro 2025-02-15 21:41:19 -05:00 committed by GitHub
commit 3608dbb828
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
91 changed files with 3356 additions and 2861 deletions

View file

@ -162,7 +162,7 @@ linters:
- makezero
- rowserrcheck
- sqlclosecheck
- tenv
- usetesting
- unconvert
- unparam
- wastedassign

View file

@ -10,7 +10,7 @@ repos:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/golangci/golangci-lint
rev: v1.63.4
rev: v1.64.5
hooks:
- id: golangci-lint
- repo: https://github.com/igorshubovych/markdownlint-cli
@ -28,7 +28,7 @@ repos:
hooks:
- id: hadolint
- repo: https://github.com/rbubley/mirrors-prettier
rev: v3.4.2
rev: v3.5.1
hooks:
- id: prettier
- repo: https://github.com/adrienverge/yamllint.git

View file

@ -7,9 +7,9 @@ when:
- .woodpecker/binaries.yaml
variables:
- &golang_image 'docker.io/golang:1.23'
- &golang_image 'docker.io/golang:1.24'
- &node_image 'docker.io/node:23-alpine'
- &xgo_image 'docker.io/techknowlogick/xgo:go-1.23.x'
- &xgo_image 'docker.io/techknowlogick/xgo:go-1.24.x'
# cspell:words bindata netgo
@ -99,7 +99,7 @@ steps:
release:
depends_on:
- checksums
image: woodpeckerci/plugin-release:0.2.3
image: woodpeckerci/plugin-release:0.2.4
settings:
api_key:
from_secret: github_token

View file

@ -1,7 +1,7 @@
variables:
- &golang_image 'docker.io/golang:1.23'
- &golang_image 'docker.io/golang:1.24'
- &node_image 'docker.io/node:23-alpine'
- &xgo_image 'docker.io/techknowlogick/xgo:go-1.23.x'
- &xgo_image 'docker.io/techknowlogick/xgo:go-1.24.x'
- &buildx_plugin 'docker.io/woodpeckerci/plugin-docker-buildx:5.2.1'
- &platforms_release 'linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/amd64,linux/ppc64le,linux/riscv64,linux/s390x,freebsd/arm64,freebsd/amd64,openbsd/arm64,openbsd/amd64'
- &platforms_server 'linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le,linux/riscv64'

View file

@ -1,5 +1,5 @@
variables:
- &golang_image 'docker.io/golang:1.23'
- &golang_image 'docker.io/golang:1.24'
- &node_image 'docker.io/node:23-alpine'
- &alpine_image 'docker.io/alpine:3.21'
- path: &when_path

View file

@ -1,5 +1,5 @@
variables:
- &golang_image 'docker.io/golang:1.23'
- &golang_image 'docker.io/golang:1.24'
- &when
- path: &when_path # related config files
- '.woodpecker/test.yaml'

View file

@ -40,7 +40,7 @@ CGO_ENABLED ?= 1 # only used to compile server
HAS_GO = $(shell hash go > /dev/null 2>&1 && echo "GO" || echo "NOGO" )
ifeq ($(HAS_GO),GO)
# renovate: datasource=docker depName=docker.io/techknowlogick/xgo
XGO_VERSION ?= go-1.23.x
XGO_VERSION ?= go-1.24.x
CGO_CFLAGS ?= $(shell go env CGO_CFLAGS)
endif
CGO_CFLAGS ?=

View file

@ -84,7 +84,7 @@ func TestMetadataFromContext(t *testing.T) {
})
t.Run("InvalidFile", func(t *testing.T) {
tempFile, err := os.CreateTemp("", "invalid.json")
tempFile, err := os.CreateTemp(t.TempDir(), "invalid.json")
require.NoError(t, err)
t.Cleanup(func() { os.Remove(tempFile.Name()) })
@ -132,7 +132,7 @@ func TestMetadataFromContext(t *testing.T) {
func createTempFile(t *testing.T, content any) string {
t.Helper()
tempFile, err := os.CreateTemp("", "metadata.json")
tempFile, err := os.CreateTemp(t.TempDir(), "metadata.json")
require.NoError(t, err)
t.Cleanup(func() { os.Remove(tempFile.Name()) })

View file

@ -26,7 +26,7 @@ func TestReadAgentIDFileNotExists(t *testing.T) {
}
func TestReadAgentIDFileExists(t *testing.T) {
tmpF, errTmpF := os.CreateTemp("", "tmp_")
tmpF, errTmpF := os.CreateTemp(t.TempDir(), "tmp_")
if !assert.NoError(t, errTmpF) {
return
}
@ -48,7 +48,7 @@ func TestReadAgentIDFileExists(t *testing.T) {
actual = readAgentConfig(tmpF.Name())
assert.EqualValues(t, 33, actual.AgentID)
tmpF2, errTmpF := os.CreateTemp("", "tmp_")
tmpF2, errTmpF := os.CreateTemp(t.TempDir(), "tmp_")
if !assert.NoError(t, errTmpF) {
return
}

View file

@ -3,7 +3,7 @@ version: '3'
services:
gitea-database:
image: postgres:17.2-alpine
image: postgres:17.3-alpine
environment:
POSTGRES_USER: gitea
POSTGRES_PASSWORD: 123456

View file

@ -1,4 +1,4 @@
FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS build
FROM --platform=$BUILDPLATFORM docker.io/golang:1.24 AS build
WORKDIR /src
COPY . .

View file

@ -1,4 +1,4 @@
FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS build
FROM --platform=$BUILDPLATFORM docker.io/golang:1.24 AS build
RUN groupadd -g 1000 woodpecker && \
useradd -u 1000 -g 1000 woodpecker && \

View file

@ -1,4 +1,4 @@
FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS build
FROM --platform=$BUILDPLATFORM docker.io/golang:1.24 AS build
WORKDIR /src
COPY . .

View file

@ -1,4 +1,4 @@
FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS build
FROM --platform=$BUILDPLATFORM docker.io/golang:1.24 AS build
RUN groupadd -g 1000 woodpecker && \
useradd -u 1000 -g 1000 woodpecker

View file

@ -1,5 +1,5 @@
# docker build --rm -f docker/Dockerfile.make -t woodpecker/make:local .
FROM docker.io/golang:1.23-alpine AS golang_image
FROM docker.io/golang:1.24-alpine AS golang_image
FROM docker.io/node:23-alpine
RUN apk add --no-cache --update make gcc binutils-gold musl-dev protoc && \

View file

@ -1,4 +1,4 @@
FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS build
FROM --platform=$BUILDPLATFORM docker.io/golang:1.24 AS build
RUN groupadd -g 1000 woodpecker && \
useradd -u 1000 -g 1000 woodpecker && \

View file

@ -7,7 +7,7 @@ It relies on a number of environment variables that you must set before running
```yaml title="docker-compose.yaml"
services:
woodpecker-server:
image: woodpeckerci/woodpecker-server:latest
image: woodpeckerci/woodpecker-server:v3
ports:
- 8000:8000
volumes:
@ -21,7 +21,7 @@ services:
- WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
woodpecker-agent:
image: woodpeckerci/woodpecker-agent:latest
image: woodpeckerci/woodpecker-agent:v3
command: agent
restart: always
depends_on:

View file

@ -239,6 +239,11 @@
"name": "Basic Git Changelog",
"docs": "https://raw.githubusercontent.com/GECO-IT/woodpecker-plugin-git-basic-changelog/refs/heads/main/docs.md",
"verified": false
},
{
"name": "Home Assistant Notify",
"docs": "https://raw.githubusercontent.com/DHandspikerWade/woodpecker-plugin-ha-notify/refs/heads/main/docs.md",
"verified": false
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@ It relies on a number of environment variables that you must set before running
```yaml title="docker-compose.yaml"
services:
woodpecker-server:
image: woodpeckerci/woodpecker-server:latest
image: woodpeckerci/woodpecker-server:v3
ports:
- 8000:8000
volumes:
@ -21,7 +21,7 @@ services:
- WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
woodpecker-agent:
image: woodpeckerci/woodpecker-agent:latest
image: woodpeckerci/woodpecker-agent:v3
command: agent
restart: always
depends_on:

10
go.mod
View file

@ -29,7 +29,7 @@ require (
github.com/go-sql-driver/mysql v1.8.1
github.com/go-viper/mapstructure/v2 v2.2.1
github.com/golang-jwt/jwt/v5 v5.2.1
github.com/google/go-github/v69 v69.0.0
github.com/google/go-github/v69 v69.1.0
github.com/google/tink/go v1.7.0
github.com/gorilla/securecookie v1.1.2
github.com/hashicorp/go-hclog v1.6.3
@ -56,7 +56,7 @@ require (
github.com/xeipuuv/gojsonschema v1.2.0
github.com/yaronf/httpsign v0.3.2
github.com/zalando/go-keyring v0.2.6
gitlab.com/gitlab-org/api/client-go v0.122.0
gitlab.com/gitlab-org/api/client-go v0.123.0
go.uber.org/multierr v1.11.0
golang.org/x/crypto v0.33.0
golang.org/x/net v0.35.0
@ -67,9 +67,9 @@ require (
google.golang.org/grpc v1.70.0
google.golang.org/protobuf v1.36.5
gopkg.in/yaml.v3 v3.0.1
k8s.io/api v0.32.1
k8s.io/apimachinery v0.32.1
k8s.io/client-go v0.32.1
k8s.io/api v0.32.2
k8s.io/apimachinery v0.32.2
k8s.io/client-go v0.32.2
src.techknowlogick.com/xormigrate v1.7.1
xorm.io/builder v0.3.13
xorm.io/xorm v1.3.9

20
go.sum
View file

@ -233,8 +233,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-github/v69 v69.0.0 h1:YnFvZ3pEIZF8KHmI8xyQQe3mYACdkhnaTV2hr7CP2/w=
github.com/google/go-github/v69 v69.0.0/go.mod h1:xne4jymxLR6Uj9b7J7PyTpkMYstEMMwGZa0Aehh1azM=
github.com/google/go-github/v69 v69.1.0 h1:ljzwzEsHsc4qUqyHEJCNA1dMqvoTK3YX2NAaK6iprDg=
github.com/google/go-github/v69 v69.1.0/go.mod h1:xne4jymxLR6Uj9b7J7PyTpkMYstEMMwGZa0Aehh1azM=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@ -555,8 +555,8 @@ github.com/zalando/go-keyring v0.2.6 h1:r7Yc3+H+Ux0+M72zacZoItR3UDxeWfKTcabvkI8u
github.com/zalando/go-keyring v0.2.6/go.mod h1:2TCrxYrbUNYfNS/Kgy/LSrkSQzZ5UPVH85RwfczwvcI=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
gitlab.com/gitlab-org/api/client-go v0.122.0 h1:Nog85APtgquS+HHkMkP4DiZ6lXlUZYhQKqguS4OJYNM=
gitlab.com/gitlab-org/api/client-go v0.122.0/go.mod h1:Jh0qjLILEdbO6z/OY94RD+3NDQRUKiuFSFYozN6cpKM=
gitlab.com/gitlab-org/api/client-go v0.123.0 h1:W3LZ5QNyiSCJA0Zchkwz8nQIUzOuDoSWMZtRDT5DjPI=
gitlab.com/gitlab-org/api/client-go v0.123.0/go.mod h1:Jh0qjLILEdbO6z/OY94RD+3NDQRUKiuFSFYozN6cpKM=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
@ -759,12 +759,12 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
k8s.io/api v0.32.1 h1:f562zw9cy+GvXzXf0CKlVQ7yHJVYzLfL6JAS4kOAaOc=
k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k=
k8s.io/apimachinery v0.32.1 h1:683ENpaCBjma4CYqsmZyhEzrGz6cjn1MY/X2jB2hkZs=
k8s.io/apimachinery v0.32.1/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
k8s.io/client-go v0.32.1 h1:otM0AxdhdBIaQh7l1Q0jQpmo7WOFIk5FFa4bg6YMdUU=
k8s.io/client-go v0.32.1/go.mod h1:aTTKZY7MdxUaJ/KiUs8D+GssR9zJZi77ZqtzcGXIiDg=
k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw=
k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y=
k8s.io/apimachinery v0.32.2 h1:yoQBR9ZGkA6Rgmhbp/yuT9/g+4lxtsGYwW6dR6BDPLQ=
k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA=
k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=

View file

@ -20,8 +20,6 @@ import (
"errors"
"fmt"
"net/http"
"path"
"path/filepath"
"strconv"
"strings"
"time"
@ -287,22 +285,16 @@ func (c *Forgejo) Dir(ctx context.Context, u *model.User, r *model.Repo, b *mode
return nil, err
}
// List files in repository. Path from root
tree, _, err := client.GetTrees(r.Owner, r.Name, b.Commit, true)
// List files in repository
contents, _, err := client.ListContents(r.Owner, r.Name, b.Commit, f)
if err != nil {
return nil, err
}
f = path.Clean(f) // We clean path and remove trailing slash
f += "/" + "*" // construct pattern for match i.e. file in subdir
for _, e := range tree.Entries {
// Filter path matching pattern and type file (blob)
if m, _ := filepath.Match(f, e.Path); m && e.Type == "blob" {
for _, e := range contents {
if e.Type == "file" {
data, err := c.File(ctx, u, r, b, e.Path)
if err != nil {
if errors.Is(err, &forge_types.ErrConfigNotFound{}) {
return nil, fmt.Errorf("git tree reported existence of file but we got: %s", err.Error())
}
return nil, fmt.Errorf("multi-pipeline cannot get %s: %w", e.Path, err)
}

View file

@ -22,8 +22,6 @@ import (
"errors"
"fmt"
"net/http"
"path"
"path/filepath"
"strconv"
"strings"
"time"
@ -289,22 +287,16 @@ func (c *Gitea) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.
return nil, err
}
// List files in repository. Path from root
tree, _, err := client.GetTrees(r.Owner, r.Name, b.Commit, true)
// List files in repository
contents, _, err := client.ListContents(r.Owner, r.Name, b.Commit, f)
if err != nil {
return nil, err
}
f = path.Clean(f) // We clean path and remove trailing slash
f += "/" + "*" // construct pattern for match i.e. file in subdir
for _, e := range tree.Entries {
// Filter path matching pattern and type file (blob)
if m, _ := filepath.Match(f, e.Path); m && e.Type == "blob" {
for _, e := range contents {
if e.Type == "file" {
data, err := c.File(ctx, u, r, b, e.Path)
if err != nil {
if errors.Is(err, &forge_types.ErrConfigNotFound{}) {
return nil, fmt.Errorf("git tree reported existence of file but we got: %s", err.Error())
}
return nil, fmt.Errorf("multi-pipeline cannot get %s: %w", e.Path, err)
}

View file

@ -1,3 +1,4 @@
.pnpm-store/
pnpm-lock.yaml
dist
coverage/

View file

@ -20,12 +20,10 @@
"dependencies": {
"@kyvg/vue3-notification": "^3.4.1",
"@mdi/js": "^7.4.47",
"@tailwindcss/postcss": "4.0.5",
"@tailwindcss/typography": "^0.5.15",
"@tailwindcss/vite": "4.0.5",
"@tailwindcss/vite": "4.0.6",
"@vueuse/core": "^12.3.0",
"ansi_up": "^6.0.2",
"autoprefixer": "^10.4.20",
"dompurify": "^3.2.3",
"fuse.js": "^7.0.0",
"js-base64": "^3.7.7",
@ -33,12 +31,11 @@
"marked": "^15.0.5",
"node-emoji": "^2.2.0",
"pinia": "^2.3.0",
"postcss": "^8.4.49",
"prettier-plugin-tailwindcss": "^0.6.9",
"prettier-plugin-tailwindcss": "^0.6.11",
"prismjs": "^1.29.0",
"semver": "^7.6.3",
"simple-icons": "^14.1.0",
"tailwindcss": "^3.4.17",
"tailwindcss": "^4.0.6",
"vue": "^3.5.13",
"vue-i18n": "^11.0.1",
"vue-router": "^4.5.0"

File diff suppressed because it is too large Load diff

View file

@ -1,7 +0,0 @@
// postcss.config.js
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

View file

@ -1,14 +1,14 @@
<template>
<div class="app m-auto flex h-full w-full flex-col bg-wp-background-200 dark:bg-wp-background-100">
<div class="app bg-wp-background-200 dark:bg-wp-background-100 m-auto flex h-full w-full flex-col">
<router-view v-if="blank" />
<template v-else>
<Navbar />
<main class="relative flex h-full min-h-0">
<div id="scroll-component" class="flex flex-grow flex-col overflow-y-auto">
<div id="scroll-component" class="flex grow flex-col overflow-y-auto">
<router-view />
</div>
<transition name="slide-right">
<PipelineFeedSidebar class="absolute bottom-0 right-0 top-0 w-full max-w-80 border-l shadow-md xl:max-w-96" />
<PipelineFeedSidebar class="absolute top-0 right-0 bottom-0 w-full max-w-80 border-l shadow-md xl:max-w-96" />
</transition>
</main>
</template>

View file

@ -1,17 +1,17 @@
<template>
<div v-if="stats" class="flex justify-center">
<div
class="w-full rounded-md border border-wp-background-300 bg-wp-background-200 px-5 py-5 text-wp-text-100 dark:bg-wp-background-100"
class="border-wp-background-300 bg-wp-background-200 text-wp-text-100 dark:bg-wp-background-100 w-full rounded-md border px-5 py-5"
>
<div class="flex w-full">
<h3 class="flex-1 text-lg font-semibold uppercase leading-tight">
<h3 class="flex-1 text-lg leading-tight font-semibold uppercase">
{{ $t('admin.settings.queue.stats.completed_count') }}
</h3>
</div>
<div class="relative overflow-hidden transition-all duration-500">
<div>
<div class="pb-4 lg:pb-6">
<h4 class="inline-block text-2xl font-semibold leading-tight lg:text-3xl">
<h4 class="inline-block text-2xl leading-tight font-semibold lg:text-3xl">
{{ stats.completed_count }}
</h4>
</div>
@ -33,9 +33,9 @@
v-for="(item, index) in data"
:key="item.key"
class="px-4 sm:w-full md:w-1/4"
:class="{ 'border-gray-300 dark:border-gray-600 md:border-l': index !== 0 }"
:class="{ 'border-gray-300 md:border-l dark:border-gray-600': index !== 0 }"
>
<div class="overflow-hidden text-ellipsis whitespace-nowrap text-sm">
<div class="overflow-hidden text-sm text-ellipsis whitespace-nowrap">
<span class="mr-1 inline-block h-2 w-2 rounded-full align-middle" :class="`${item.color}`">&nbsp;</span>
<span class="align-middle">{{ item.label }}</span>
</div>

View file

@ -1,9 +1,9 @@
<template>
<div v-if="!props.loading" class="space-y-4 text-wp-text-100">
<div v-if="!props.loading" class="text-wp-text-100 space-y-4">
<ListItem
v-for="agent in props.agents"
:key="agent.id"
class="items-center !bg-wp-background-200 dark:!bg-wp-background-100"
class="bg-wp-background-200! dark:bg-wp-background-100! items-center"
>
<span>{{ agent.name || `Agent ${agent.id}` }}</span>
<span class="ml-auto">
@ -30,7 +30,7 @@
<IconButton
icon="trash"
:title="$t('admin.settings.agents.delete_agent')"
class="ml-2 h-8 w-8 hover:text-wp-error-100"
class="hover:text-wp-error-100 ml-2 h-8 w-8"
:is-loading="props.isDeleting"
@click="$emit('delete', agent)"
/>

View file

@ -1,7 +1,7 @@
<template>
<span class="inline-flex text-xs font-medium">
<span
class="flex items-center rounded-l-full border-2 border-wp-state-neutral-100 bg-wp-state-neutral-100 py-0.5 pl-2 pr-1 text-gray-300"
class="border-wp-state-neutral-100 bg-wp-state-neutral-100 flex items-center rounded-l-full border-2 py-0.5 pr-1 pl-2 text-gray-300"
:class="{
'rounded-r-full pr-2': value === undefined,
}"
@ -10,7 +10,7 @@
</span>
<span
v-if="value !== undefined"
class="flex items-center rounded-r-full border-2 border-wp-state-neutral-100 py-0.5 pl-1 pr-2"
class="border-wp-state-neutral-100 flex items-center rounded-r-full border-2 py-0.5 pr-2 pl-1"
>
{{ value }}
</span>

View file

@ -2,25 +2,25 @@
<component
:is="to === undefined ? 'button' : httpLink ? 'a' : 'router-link'"
v-bind="btnAttrs"
class="relative flex flex-shrink-0 cursor-pointer items-center overflow-hidden whitespace-nowrap rounded-md border px-2 py-1 shadow-sm transition-all duration-150 disabled:cursor-not-allowed disabled:opacity-50"
class="relative flex shrink-0 cursor-pointer items-center overflow-hidden rounded-md border px-2 py-1 whitespace-nowrap shadow-xs transition-all duration-150 disabled:cursor-not-allowed disabled:opacity-50"
:class="{
'border-wp-control-neutral-300 bg-wp-control-neutral-100 text-wp-text-100 hover:bg-wp-control-neutral-200':
color === 'gray',
'border-wp-control-ok-300 bg-wp-control-ok-100 text-white hover:bg-wp-control-ok-200': color === 'green',
'border-wp-control-info-300 bg-wp-control-info-100 text-white hover:bg-wp-control-info-200': color === 'blue',
'border-wp-error-300 bg-wp-error-100 text-white hover:bg-wp-error-200': color === 'red',
'border-wp-control-ok-300 bg-wp-control-ok-100 hover:bg-wp-control-ok-200 text-white': color === 'green',
'border-wp-control-info-300 bg-wp-control-info-100 hover:bg-wp-control-info-200 text-white': color === 'blue',
'border-wp-error-300 bg-wp-error-100 hover:bg-wp-error-200 text-white': color === 'red',
...passedClasses,
}"
:title="title"
:disabled="disabled"
>
<slot>
<Icon v-if="startIcon" :name="startIcon" class="!h-5 !w-5" :class="{ invisible: isLoading, 'mr-1': text }" />
<Icon v-if="startIcon" :name="startIcon" class="h-5! w-5!" :class="{ invisible: isLoading, 'mr-1': text }" />
<span :class="{ invisible: isLoading }">{{ text }}</span>
<Icon v-if="endIcon" :name="endIcon" class="ml-2 h-6 w-6" :class="{ invisible: isLoading }" />
<div
v-if="isLoading"
class="absolute bottom-0 left-0 right-0 top-0 flex items-center justify-center"
class="absolute top-0 right-0 bottom-0 left-0 flex items-center justify-center"
:class="{
'bg-wp-control-neutral-200': color === 'gray',
'bg-wp-control-ok-200': color === 'green',

View file

@ -1,6 +1,6 @@
<template>
<span
class="inline-block min-w-5 rounded-full bg-wp-background-300 px-1.5 py-0.5 text-center text-xs font-bold leading-4 text-wp-text-100 dark:bg-wp-background-100"
class="bg-wp-background-300 text-wp-text-100 dark:bg-wp-background-100 inline-block min-w-5 rounded-full px-1.5 py-0.5 text-center text-xs leading-4 font-bold"
>
{{ value }}
</span>

View file

@ -3,9 +3,9 @@
:href="`${docsUrl}`"
:title="$t('documentation_for', { topic })"
target="_blank"
class="cursor-pointer text-wp-link-100 hover:text-wp-link-200"
class="text-wp-link-100 hover:text-wp-link-200 cursor-pointer"
>
<Icon name="question" class="!h-5 !w-5" />
<Icon name="question" class="h-5! w-5!" />
</a>
</template>

View file

@ -1,6 +1,6 @@
<template>
<div
class="flex items-center gap-2 rounded-md border border-l-4 border-solid border-wp-error-200 bg-wp-error-100 p-2 text-white"
class="border-wp-error-200 bg-wp-error-100 flex items-center gap-2 rounded-md border border-l-4 border-solid p-2 text-white"
>
<Icon v-if="!textOnly" name="alert" />
<slot>

View file

@ -21,7 +21,7 @@
<slot>
<Icon v-if="icon" :name="icon" />
</slot>
<div v-if="isLoading" class="absolute bottom-0 left-0 right-0 top-0 flex items-center justify-center">
<div v-if="isLoading" class="absolute top-0 right-0 bottom-0 left-0 flex items-center justify-center">
<Icon name="loading" class="animate-spin" />
</div>
</button>
@ -44,6 +44,8 @@ defineProps<{
</script>
<style scoped>
@reference '~/tailwind.css';
.icon-button {
@apply hover-effect relative flex items-center justify-center overflow-hidden rounded-md bg-transparent px-1 py-1 disabled:cursor-not-allowed disabled:opacity-50;
}

View file

@ -2,9 +2,9 @@
<component
:is="to ? 'router-link' : clickable ? 'button' : 'div'"
:to="to"
class="flex w-full overflow-hidden rounded-md border border-wp-background-400 bg-wp-background-100 p-4 dark:bg-wp-background-200"
class="border-wp-background-400 bg-wp-background-100 dark:bg-wp-background-200 flex w-full overflow-hidden rounded-md border p-4"
:class="{
'cursor-pointer hover:bg-wp-background-300 hover:shadow-md dark:hover:bg-wp-background-300': clickable || to,
'hover:bg-wp-background-300 dark:hover:bg-wp-background-300 cursor-pointer hover:shadow-md': clickable || to,
}"
>
<slot />

View file

@ -1,8 +1,8 @@
<template>
<div
class="flex items-center gap-4 rounded-md border border-l-4 border-solid border-wp-hint-warn-200 bg-wp-hint-warn-100 p-4 font-bold text-gray-700"
class="border-wp-hint-warn-200 bg-wp-hint-warn-100 flex items-center gap-4 rounded-md border border-l-4 border-solid p-4 font-bold text-gray-700"
>
<Icon v-if="!textOnly" name="alert" class="flex-shrink-0" />
<Icon v-if="!textOnly" name="alert" class="shrink-0" />
<slot>
<span class="whitespace-pre-wrap">{{ text }}</span>
</slot>

View file

@ -3,13 +3,13 @@
<input
:id="`checkbox-${id}`"
type="checkbox"
class="checkbox relative h-5 w-5 flex-shrink-0 cursor-pointer rounded-md border border-wp-control-neutral-200 bg-wp-control-neutral-100 transition-colors duration-150 checked:border-wp-control-ok-200 checked:bg-wp-control-ok-200 focus-visible:border-wp-control-neutral-300 checked:focus-visible:border-wp-control-ok-300"
class="checkbox border-wp-control-neutral-200 bg-wp-control-neutral-100 checked:border-wp-control-ok-200 checked:bg-wp-control-ok-200 focus-visible:border-wp-control-neutral-300 checked:focus-visible:border-wp-control-ok-300 relative h-5 w-5 shrink-0 cursor-pointer rounded-md border transition-colors duration-150"
:checked="innerValue"
@click="innerValue = !innerValue"
/>
<div class="ml-4 flex flex-col">
<label class="cursor-pointer text-wp-text-100" :for="`checkbox-${id}`">{{ label }}</label>
<span v-if="description" class="text-sm text-wp-text-alt-100">{{ description }}</span>
<label class="text-wp-text-100 cursor-pointer" :for="`checkbox-${id}`">{{ label }}</label>
<span v-if="description" class="text-wp-text-alt-100 text-sm">{{ description }}</span>
</div>
</div>
</template>
@ -39,6 +39,8 @@ const id = (Math.random() + 1).toString(36).substring(7);
</script>
<style scoped>
@reference '~/tailwind.css';
.checkbox {
width: 1.3rem;
height: 1.3rem;
@ -61,7 +63,6 @@ const id = (Math.random() + 1).toString(36).substring(7);
border-width: 0 2px 2px 0;
transform: translate(-50%, -60%) rotate(45deg);
opacity: 0;
@apply dark:border-white;
}
.checkbox:checked::before {

View file

@ -1,11 +1,11 @@
<template>
<div class="mb-4 mt-2 flex flex-col">
<div class="mt-2 mb-4 flex flex-col">
<div class="mb-2 flex items-center">
<label class="font-bold text-wp-text-100" :for="id" v-bind="$attrs">{{ label }}</label>
<label class="text-wp-text-100 font-bold" :for="id" v-bind="$attrs">{{ label }}</label>
<DocsLink v-if="docsUrl" :topic="label" :url="docsUrl" class="ml-2" />
<slot v-else-if="$slots.titleActions" name="titleActions" />
</div>
<div v-if="$slots.description" class="mb-2 text-sm text-wp-text-alt-100">
<div v-if="$slots.description" class="text-wp-text-alt-100 mb-2 text-sm">
<slot name="description" />
</div>
<slot :id="id" />

View file

@ -17,7 +17,7 @@
:placeholder="valuePlaceholder"
@update:model-value="updateItem(index, 'value', $event)"
/>
<div class="w-10 flex-shrink-0">
<div class="w-10 shrink-0">
<Button
v-if="index !== displayItems.length - 1"
type="button"

View file

@ -3,14 +3,14 @@
<input
:id="`radio-${id}-${option.value}`"
type="radio"
class="radio relative h-5 w-5 flex-shrink-0 cursor-pointer rounded-full border border-wp-control-neutral-200 bg-wp-control-neutral-100 checked:border-wp-control-ok-200 checked:bg-wp-control-ok-200 focus-visible:border-wp-control-neutral-300 checked:focus-visible:border-wp-control-ok-300"
class="radio border-wp-control-neutral-200 bg-wp-control-neutral-100 checked:border-wp-control-ok-200 checked:bg-wp-control-ok-200 focus-visible:border-wp-control-neutral-300 checked:focus-visible:border-wp-control-ok-300 relative h-5 w-5 shrink-0 cursor-pointer rounded-full border"
:value="option.value"
:checked="innerValue?.includes(option.value)"
@click="innerValue = option.value"
/>
<div class="ml-4 flex flex-col">
<label class="cursor-pointer text-wp-text-100" :for="`radio-${id}-${option.value}`">{{ option.text }}</label>
<span v-if="option.description" class="text-sm text-wp-text-alt-100">{{ option.description }}</span>
<label class="text-wp-text-100 cursor-pointer" :for="`radio-${id}-${option.value}`">{{ option.text }}</label>
<span v-if="option.description" class="text-wp-text-alt-100 text-sm">{{ option.description }}</span>
</div>
</div>
</template>
@ -41,6 +41,8 @@ const id = (Math.random() + 1).toString(36).substring(7);
</script>
<style scoped>
@reference '~/tailwind.css';
.radio {
width: 1.3rem;
height: 1.3rem;
@ -62,7 +64,6 @@ const id = (Math.random() + 1).toString(36).substring(7);
background: white;
transform: translate(-50%, -50%);
opacity: 0;
@apply dark:bg-white;
}
.radio:checked::before {

View file

@ -1,7 +1,7 @@
<template>
<select
v-model="innerValue"
class="w-full rounded-md border border-wp-control-neutral-200 bg-wp-control-neutral-100 px-2 py-1 text-wp-text-100"
class="border-wp-control-neutral-200 bg-wp-control-neutral-100 text-wp-text-100 w-full rounded-md border px-2 py-1"
>
<option v-if="placeholder" value="" class="hidden">{{ placeholder }}</option>
<option v-for="option in options" :key="option.value" :value="option.value" class="text-wp-text-100">

View file

@ -2,7 +2,7 @@
<input
v-if="lines === 1"
v-model="innerValue"
class="w-full rounded-md border border-wp-control-neutral-200 bg-wp-background-100 px-2 py-1 focus-visible:border-wp-control-neutral-300 focus-visible:outline-none"
class="border-wp-control-neutral-200 bg-wp-background-100 focus-visible:border-wp-control-neutral-300 w-full rounded-md border px-2 py-1 focus-visible:outline-hidden"
:class="{ 'opacity-50': disabled }"
:disabled="disabled"
:type="type"
@ -11,7 +11,7 @@
<textarea
v-else
v-model="innerValue"
class="w-full rounded-md border border-wp-control-neutral-200 bg-wp-background-100 px-2 py-1 focus-visible:border-wp-control-neutral-300 focus-visible:outline-none"
class="border-wp-control-neutral-200 bg-wp-background-100 focus-visible:border-wp-control-neutral-300 w-full rounded-md border px-2 py-1 focus-visible:outline-hidden"
:class="{ 'opacity-50': disabled }"
:disabled="disabled"
:placeholder="placeholder"

View file

@ -1,12 +1,12 @@
<template>
<div
class="w-full overflow-hidden rounded-md border border-wp-background-400 bg-wp-background-100 shadow dark:bg-wp-background-200"
class="border-wp-background-400 bg-wp-background-100 dark:bg-wp-background-200 w-full overflow-hidden rounded-md border shadow-sm"
>
<component
:is="collapsable ? 'button' : 'div'"
v-if="title"
type="button"
class="flex w-full gap-2 bg-wp-background-400 px-4 py-2 font-bold text-wp-text-100"
class="bg-wp-background-400 text-wp-text-100 flex w-full gap-2 px-4 py-2 font-bold"
@click="_collapsed = !_collapsed"
>
<Icon
@ -22,9 +22,9 @@
'max-h-auto': !collapsed,
'max-h-0': collapsed,
}"
class="overflow-hidden transition-height duration-150"
class="transition-height overflow-hidden duration-150"
>
<div class="w-full p-4 text-wp-text-100">
<div class="text-wp-text-100 w-full p-4">
<slot />
</div>
</div>

View file

@ -2,7 +2,7 @@
<!-- overlay -->
<div
v-if="open"
class="fixed bottom-0 left-0 right-0 top-0 z-40 bg-gray-900 opacity-80 print:hidden"
class="fixed top-0 right-0 bottom-0 left-0 z-40 bg-gray-900 opacity-80 print:hidden"
@click="$emit('close')"
/>
<!-- overlay end -->

View file

@ -1,8 +1,8 @@
<template>
<Panel>
<div class="mb-4 flex flex-col justify-center border-b pb-4 dark:border-wp-background-100">
<div class="dark:border-wp-background-100 mb-4 flex flex-col justify-center border-b pb-4">
<div class="flex items-center justify-between">
<h1 class="flex items-center gap-1 text-xl text-wp-text-100">
<h1 class="text-wp-text-100 flex items-center gap-1 text-xl">
{{ title }}
<DocsLink v-if="docsUrl" :topic="title" :url="docsUrl" />
</h1>
@ -10,7 +10,7 @@
</div>
<div class="flex flex-wrap items-center justify-between gap-x-4 gap-y-2">
<p v-if="description" class="text-sm text-wp-text-alt-100">{{ description }}</p>
<p v-if="description" class="text-wp-text-alt-100 text-sm">{{ description }}</p>
<div v-if="$slots.headerActions">
<slot name="headerActions" />
</div>

View file

@ -1,13 +1,11 @@
<template>
<IconButton
:title="pipelineCount > 0 ? `${$t('pipeline_feed')} (${pipelineCount})` : $t('pipeline_feed')"
class="active-pipelines-toggle relative !p-1.5 text-current"
class="active-pipelines-toggle relative p-1.5! text-current"
@click="toggle"
>
<div v-if="pipelineCount > 0" class="spinner" />
<div
class="z-0 flex h-full w-full items-center justify-center rounded-md bg-white bg-opacity-15 font-bold dark:bg-black dark:bg-opacity-10"
>
<div class="z-0 flex h-full w-full items-center justify-center rounded-md bg-white/15 font-bold dark:bg-black/10">
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
{{ pipelineCount > 9 ? '9+' : pipelineCount }}
</div>
@ -31,6 +29,8 @@ onMounted(async () => {
</script>
<style scoped>
@reference '~/tailwind.css';
@keyframes rotate {
100% {
transform: rotate(1turn);
@ -41,7 +41,7 @@ onMounted(async () => {
overflow: hidden;
}
.spinner::before {
@apply absolute bg-wp-primary-200 dark:bg-wp-primary-300;
@apply bg-wp-primary-200 absolute;
content: '';
left: -50%;
top: -50%;
@ -55,7 +55,7 @@ onMounted(async () => {
animation: rotate 1.5s linear infinite;
}
.spinner::after {
@apply absolute inset-0.5 bg-wp-primary-200 dark:bg-wp-primary-300;
@apply bg-wp-primary-200 absolute inset-0.5;
/*
The nested border radius needs to be calculated correctly to look right:
https://www.30secondsofcode.org/css/s/nested-border-radius/
@ -63,4 +63,9 @@ onMounted(async () => {
border-radius: calc(0.375rem - 0.125rem);
content: '';
}
:root[data-theme='dark'] .spinner::before,
:root[data-theme='dark'] .spinner::after {
@apply bg-wp-primary-300;
}
</style>

View file

@ -1,6 +1,6 @@
<template>
<nav
class="text-neutral-content flex border-b border-wp-background-100 bg-wp-primary-200 p-4 font-bold text-wp-primary-text-100 dark:bg-wp-primary-300"
class="text-neutral-content border-wp-background-100 bg-wp-primary-200 text-wp-primary-text-100 dark:bg-wp-primary-300 flex border-b p-4 font-bold"
>
<div class="flex items-center space-x-2">
<router-link :to="{ name: 'home' }" class="-my-2 flex flex-col px-2">
@ -26,11 +26,11 @@
:to="{ name: 'admin-settings' }"
>
<Icon name="settings" />
<div v-if="version?.needsUpdate" class="absolute right-2 top-2 h-3 w-3 rounded-full bg-wp-error-100" />
<div v-if="version?.needsUpdate" class="bg-wp-error-100 absolute top-2 right-2 h-3 w-3 rounded-full" />
</IconButton>
<ActivePipelines v-if="user" class="navbar-icon !p-1.5" />
<IconButton v-if="user" :to="{ name: 'user' }" :title="$t('user.settings.settings')" class="navbar-icon !p-1.5">
<ActivePipelines v-if="user" class="navbar-icon p-1.5!" />
<IconButton v-if="user" :to="{ name: 'user' }" :title="$t('user.settings.settings')" class="navbar-icon p-1.5!">
<img v-if="user && user.avatar_url" class="rounded-md" :src="`${user.avatar_url}`" />
</IconButton>
<Button v-else :text="$t('login')" :to="`/login?url=${route.fullPath}`" />
@ -62,6 +62,8 @@ const { enableSwagger } = config;
</script>
<style scoped>
@reference '~/tailwind.css';
.navbar-icon {
@apply h-11 w-11 rounded-md p-2.5;
}

View file

@ -2,7 +2,7 @@
<Popup :open="open" @close="$emit('close')">
<Panel v-if="!loading">
<form @submit.prevent="triggerDeployPipeline">
<span class="text-xl text-wp-text-100">{{
<span class="text-wp-text-100 text-xl">{{
$t('repo.deploy_pipeline.title', { pipelineId: pipelineNumber })
}}</span>
<InputField v-slot="{ id }" :label="$t('repo.deploy_pipeline.enter_target')">
@ -12,7 +12,7 @@
<TextField :id="id" v-model="payload.task" />
</InputField>
<InputField v-slot="{ id }" :label="$t('repo.deploy_pipeline.variables.title')">
<span class="mb-2 text-sm text-wp-text-alt-100">{{ $t('repo.deploy_pipeline.variables.desc') }}</span>
<span class="text-wp-text-alt-100 mb-2 text-sm">{{ $t('repo.deploy_pipeline.variables.desc') }}</span>
<KeyValueEditor
:id="id"
v-model="payload.variables"

View file

@ -1,9 +1,9 @@
<template>
<header
class="border-b border-wp-background-400 bg-wp-background-100 text-wp-text-100 dark:border-wp-background-100 dark:bg-wp-background-300"
class="border-wp-background-400 bg-wp-background-100 text-wp-text-100 dark:border-wp-background-100 dark:bg-wp-background-300 border-b"
:class="{ 'md:px-4': fullWidth }"
>
<Container :full-width="fullWidth" class="!py-0">
<Container :full-width="fullWidth" class="py-0!">
<div class="flex w-full flex-col gap-2 py-3 md:flex-row md:items-center md:justify-between md:gap-10">
<div
class="flex min-h-10 content-start items-center"
@ -15,16 +15,16 @@
v-if="goBack"
icon="back"
:title="$t('back')"
class="md:display-unset mr-2 hidden h-8 w-8 flex-shrink-0 md:justify-between"
class="md:display-unset mr-2 hidden h-8 w-8 shrink-0 md:justify-between"
@click="goBack"
/>
<h1 class="flex min-w-0 items-center gap-x-2 text-xl text-wp-text-100">
<h1 class="text-wp-text-100 flex min-w-0 items-center gap-x-2 text-xl">
<slot name="title" />
</h1>
</div>
<TextField
v-if="searchBoxPresent"
class="order-3 w-full flex-grow md:order-none md:w-auto"
class="order-3 w-full grow md:order-none md:w-auto"
:aria-label="$t('search')"
:placeholder="$t('search')"
:model-value="search"

View file

@ -5,14 +5,14 @@
v-for="tab in visibleTabs"
:key="tab.title"
:to="tab.to"
class="flex cursor-pointer items-center whitespace-nowrap border-b-2 border-transparent py-1 text-wp-text-100"
:active-class="tab.matchChildren ? '!border-wp-text-100' : ''"
:exact-active-class="tab.matchChildren ? '' : '!border-wp-text-100'"
class="text-wp-text-100 flex cursor-pointer items-center border-b-2 border-transparent py-1 whitespace-nowrap"
:active-class="tab.matchChildren ? 'border-wp-text-100!' : ''"
:exact-active-class="tab.matchChildren ? '' : 'border-wp-text-100!'"
>
<span
class="flex w-full min-w-20 flex-row items-center justify-center gap-2 rounded-md px-2 py-1 hover:bg-wp-background-200 dark:hover:bg-wp-background-100"
class="hover:bg-wp-background-200 dark:hover:bg-wp-background-100 flex w-full min-w-20 flex-row items-center justify-center gap-2 rounded-md px-2 py-1"
>
<Icon v-if="tab.icon" :name="tab.icon" :class="tab.iconClass" class="flex-shrink-0" />
<Icon v-if="tab.icon" :name="tab.icon" :class="tab.iconClass" class="shrink-0" />
<span>{{ tab.title }}</span>
<CountBadge v-if="tab.count" :value="tab.count" />
</span>
@ -24,20 +24,20 @@
<div
v-if="isDropdownOpen"
class="tabs-dropdown absolute z-20 mt-1 rounded-md border border-wp-background-400 bg-wp-background-100 shadow-lg dark:bg-wp-background-200"
class="tabs-dropdown border-wp-background-400 bg-wp-background-100 dark:bg-wp-background-200 absolute z-20 mt-1 rounded-md border shadow-lg"
:class="[visibleTabs.length === 0 ? 'left-0' : 'right-0']"
>
<router-link
v-for="tab in hiddenTabs"
:key="tab.title"
:to="tab.to"
class="block w-full whitespace-nowrap p-1 text-left"
class="block w-full p-1 text-left whitespace-nowrap"
@click="isDropdownOpen = false"
>
<span
class="flex w-full min-w-20 flex-row items-center justify-center gap-2 rounded-md px-2 py-1 hover:bg-wp-background-200 dark:hover:bg-wp-background-100"
class="hover:bg-wp-background-200 dark:hover:bg-wp-background-100 flex w-full min-w-20 flex-row items-center justify-center gap-2 rounded-md px-2 py-1"
>
<Icon v-if="tab.icon" :name="tab.icon" :class="tab.iconClass" class="flex-shrink-0" />
<Icon v-if="tab.icon" :name="tab.icon" :class="tab.iconClass" class="shrink-0" />
<span>{{ tab.title }}</span>
</span>
</router-link>

View file

@ -1,5 +1,5 @@
<template>
<div v-if="pipeline" class="flex w-full text-wp-text-100">
<div v-if="pipeline" class="text-wp-text-100 flex w-full">
<PipelineStatusIcon :status="pipeline.status" class="flex items-center" />
<div class="ml-4 flex min-w-0 flex-col">
<router-link
@ -12,7 +12,7 @@
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
{{ repo?.owner }} / {{ repo?.name }}
</router-link>
<span class="overflow-hidden overflow-ellipsis whitespace-nowrap" :title="message">{{ shortMessage }}</span>
<span class="overflow-hidden text-ellipsis whitespace-nowrap" :title="message">{{ shortMessage }}</span>
<div class="mt-2 flex flex-col">
<div class="flex items-center space-x-2" :title="created">
<Icon name="since" />

View file

@ -2,7 +2,7 @@
<aside
v-if="isOpen"
ref="target"
class="z-50 flex flex-col items-center overflow-y-auto border-wp-background-400 bg-wp-background-100 dark:bg-wp-background-200"
class="border-wp-background-400 bg-wp-background-100 dark:bg-wp-background-200 z-50 flex flex-col items-center overflow-y-auto"
:aria-label="$t('pipeline_feed')"
>
<router-link
@ -12,12 +12,12 @@
name: 'repo-pipeline',
params: { repoId: pipeline.repo_id, pipelineId: pipeline.number },
}"
class="flex w-full border-b border-wp-background-400 px-2 py-4 hover:bg-wp-background-300 hover:shadow-sm dark:hover:bg-wp-background-400"
class="border-wp-background-400 hover:bg-wp-background-300 dark:hover:bg-wp-background-400 flex w-full border-b px-2 py-4 hover:shadow-xs"
>
<PipelineFeedItem :pipeline="pipeline" />
</router-link>
<span v-if="sortedPipelines.length === 0" class="m-4 text-wp-text-100">{{ $t('repo.pipeline.no_pipelines') }}</span>
<span v-if="sortedPipelines.length === 0" class="text-wp-text-100 m-4">{{ $t('repo.pipeline.no_pipelines') }}</span>
</aside>
</template>

View file

@ -1,9 +1,9 @@
<template>
<div class="space-y-4 text-wp-text-100">
<div class="text-wp-text-100 space-y-4">
<ListItem
v-for="registry in registries"
:key="registry.id"
class="items-center !bg-wp-background-200 dark:!bg-wp-background-100"
class="bg-wp-background-200! dark:bg-wp-background-100! items-center"
>
<span>{{ registry.address }}</span>
<IconButton
@ -15,7 +15,7 @@
<IconButton
v-if="!registry.readonly"
icon="trash"
class="h-8 w-8 hover:text-wp-error-100"
class="hover:text-wp-error-100 h-8 w-8"
:is-loading="isDeleting"
:title="$t('registries.delete')"
@click="deleteRegistry(registry)"

View file

@ -2,11 +2,11 @@
<router-link
v-if="repo"
:to="{ name: 'repo', params: { repoId: repo.id } }"
class="flex cursor-pointer flex-col overflow-hidden rounded-md border border-wp-background-400 bg-wp-background-100 p-4 hover:bg-wp-background-300 hover:shadow-md dark:bg-wp-background-200 dark:hover:bg-wp-background-300"
class="border-wp-background-400 bg-wp-background-100 hover:bg-wp-background-300 dark:bg-wp-background-200 dark:hover:bg-wp-background-300 flex cursor-pointer flex-col overflow-hidden rounded-md border p-4 hover:shadow-md"
>
<div class="grid grid-cols-[auto,1fr] items-center gap-y-4">
<div class="text-lg text-wp-text-100">{{ `${repo.owner} / ${repo.name}` }}</div>
<div class="ml-auto text-wp-text-100">
<div class="grid grid-cols-[auto_1fr] items-center gap-y-4">
<div class="text-wp-text-100 text-lg">{{ `${repo.owner} / ${repo.name}` }}</div>
<div class="text-wp-text-100 ml-auto">
<div
v-if="repo.visibility === RepoVisibility.Private"
:title="`${$t('repo.visibility.visibility')}: ${$t(`repo.visibility.private.private`)}`"
@ -21,14 +21,14 @@
</div>
</div>
<div class="col-span-2 flex w-full gap-x-4 text-wp-text-100">
<div class="text-wp-text-100 col-span-2 flex w-full gap-x-4">
<template v-if="lastPipeline">
<div class="flex min-w-0 flex-1 items-center gap-x-1">
<PipelineStatusIcon v-if="lastPipeline" :status="lastPipeline.status" />
<span class="overflow-hidden overflow-ellipsis whitespace-nowrap pl-1">{{ shortMessage }}</span>
<span class="overflow-hidden pl-1 text-ellipsis whitespace-nowrap">{{ shortMessage }}</span>
</div>
<div class="ml-auto flex flex-shrink-0 items-center gap-x-1">
<div class="ml-auto flex shrink-0 items-center gap-x-1">
<Icon name="since" />
<span>{{ since }}</span>
</div>

View file

@ -1,5 +1,5 @@
<template>
<ListItem v-if="pipeline" class="w-full !p-0">
<ListItem v-if="pipeline" class="w-full p-0!">
<div class="flex w-11 items-center">
<div
class="h-full w-3"
@ -17,19 +17,19 @@
</div>
</div>
<div class="flex min-w-0 flex-grow flex-wrap px-4 py-2 md:flex-nowrap">
<div class="hidden flex-shrink-0 items-center md:flex">
<div class="flex min-w-0 grow flex-wrap px-4 py-2 md:flex-nowrap">
<div class="hidden shrink-0 items-center md:flex">
<Icon v-if="pipeline.event === 'cron'" name="stopwatch" class="text-wp-text-100" />
<img v-else class="w-6 rounded-md" :src="pipeline.author_avatar" />
</div>
<div class="flex w-full min-w-0 items-center md:mx-4 md:w-auto">
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
<span class="md:display-unset hidden text-wp-text-alt-100">#{{ pipeline.number }}</span>
<span class="md:display-unset text-wp-text-alt-100 hidden">#{{ pipeline.number }}</span>
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
<span class="md:display-unset mx-2 hidden text-wp-text-alt-100">-</span>
<span class="md:display-unset text-wp-text-alt-100 mx-2 hidden">-</span>
<span
class="overflow-hidden overflow-ellipsis whitespace-nowrap text-wp-text-100 underline md:no-underline"
class="text-wp-text-100 overflow-hidden text-ellipsis whitespace-nowrap underline md:no-underline"
:title="message"
>
{{ shortMessage }}
@ -37,7 +37,7 @@
</div>
<div
class="grid w-full flex-shrink-0 grid-flow-col grid-cols-2 grid-rows-2 gap-x-4 gap-y-2 py-2 text-wp-text-100 md:ml-auto md:w-96"
class="text-wp-text-100 grid w-full shrink-0 grid-flow-col grid-cols-2 grid-rows-2 gap-x-4 gap-y-2 py-2 md:ml-auto md:w-96"
>
<div class="flex min-w-0 items-center space-x-2">
<span :title="pipelineEventTitle">

View file

@ -1,14 +1,14 @@
<template>
<div v-if="pipeline" class="flex flex-col pt-10 md:pt-0">
<div
class="code-box-log flex flex-grow flex-col overflow-hidden !p-0 shadow md:mt-0 md:!rounded-md"
class="code-box-log flex grow flex-col overflow-hidden p-0! shadow-sm md:mt-0 md:rounded-md!"
@mouseover="showActions = true"
@mouseleave="showActions = false"
>
<div
class="fixed left-0 top-0 flex w-full flex-row items-center bg-wp-code-100 px-4 py-2 md:relative md:left-auto md:top-auto"
class="bg-wp-code-100 fixed top-0 left-0 flex w-full flex-row items-center px-4 py-2 md:relative md:top-auto md:left-auto"
>
<span class="text-base font-bold text-wp-code-text-alt-100">
<span class="text-wp-code-text-alt-100 text-base font-bold">
<span class="md:display-unset hidden">{{ $t('repo.pipeline.log_title') }}</span>
<span class="md:hidden">{{ step?.name }}</span>
</span>
@ -18,14 +18,14 @@
v-if="step?.finished !== undefined && hasLogs"
:is-loading="downloadInProgress"
:title="$t('repo.pipeline.actions.log_download')"
class="hover:!bg-white hover:!bg-opacity-10"
class="hover:bg-white/10!"
icon="download"
@click="download"
/>
<IconButton
v-if="step?.finished !== undefined && hasLogs && hasPushPermission"
:title="$t('repo.pipeline.actions.log_delete')"
class="hover:!bg-white hover:!bg-opacity-10"
class="hover:bg-white/10!"
icon="trash"
@click="deleteLogs"
/>
@ -34,32 +34,28 @@
:title="
autoScroll ? $t('repo.pipeline.actions.log_auto_scroll_off') : $t('repo.pipeline.actions.log_auto_scroll')
"
class="hover:!bg-white hover:!bg-opacity-10"
class="hover:bg-white/10!"
:icon="autoScroll ? 'auto-scroll' : 'auto-scroll-off'"
@click="autoScroll = !autoScroll"
/>
<IconButton
class="hover:!bg-white hover:!bg-opacity-10 md:!hidden"
icon="close"
@click="$emit('update:step-id', null)"
/>
<IconButton class="hover:bg-white/10! md:hidden!" icon="close" @click="$emit('update:step-id', null)" />
</div>
</div>
<div
v-show="hasLogs && loadedLogs && (log?.length || 0) > 0"
ref="consoleElement"
class="grid w-full max-w-full flex-grow auto-rows-min grid-cols-[min-content,minmax(0,1fr),min-content] overflow-y-auto overflow-x-hidden p-4 text-xs md:text-sm"
class="grid w-full max-w-full grow auto-rows-min grid-cols-[min-content_minmax(0,1fr)_min-content] overflow-x-hidden overflow-y-auto p-4 text-xs md:text-sm"
>
<div v-for="line in log" :key="line.index" class="contents font-mono">
<a
:id="`L${line.number}`"
:href="`#L${line.number}`"
class="select-none whitespace-nowrap pl-2 pr-6 text-right text-wp-code-text-alt-100"
class="text-wp-code-text-alt-100 pr-6 pl-2 text-right whitespace-nowrap select-none"
:class="{
'bg-red-600 bg-opacity-40 dark:bg-red-800 dark:bg-opacity-50': line.type === 'error',
'bg-yellow-600 bg-opacity-40 dark:bg-yellow-800 dark:bg-opacity-50': line.type === 'warning',
'bg-blue-600 bg-opacity-30': isSelected(line),
'bg-red-600/40 dark:bg-red-800/50': line.type === 'error',
'bg-yellow-600/40 dark:bg-yellow-800/50': line.type === 'warning',
'bg-blue-600/30': isSelected(line),
underline: isSelected(line),
}"
>
@ -67,21 +63,21 @@
</a>
<!-- eslint-disable vue/no-v-html -->
<span
class="whitespace-pre-wrap break-words align-top"
class="align-top break-words whitespace-pre-wrap"
:class="{
'bg-10.168.64.121-600 bg-opacity-40 dark:bg-red-800 dark:bg-opacity-50': line.type === 'error',
'bg-yellow-600 bg-opacity-40 dark:bg-yellow-800 dark:bg-opacity-50': line.type === 'warning',
'bg-blue-600 bg-opacity-30': isSelected(line),
'bg-red-600/40 dark:bg-red-800/50': line.type === 'error',
'bg-yellow-600/40 dark:bg-yellow-800/50': line.type === 'warning',
'bg-blue-600/30': isSelected(line),
}"
v-html="line.text"
/>
<!-- eslint-enable vue/no-v-html -->
<span
class="select-none whitespace-nowrap pr-1 text-right text-wp-code-text-alt-100"
class="text-wp-code-text-alt-100 pr-1 text-right whitespace-nowrap select-none"
:class="{
'bg-red-600 bg-opacity-40 dark:bg-red-800 dark:bg-opacity-50': line.type === 'error',
'bg-yellow-600 bg-opacity-40 dark:bg-yellow-800 dark:bg-opacity-50': line.type === 'warning',
'bg-blue-600 bg-opacity-30': isSelected(line),
'bg-red-600/40 dark:bg-red-800/50': line.type === 'error',
'bg-yellow-600/40 dark:bg-yellow-800/50': line.type === 'warning',
'bg-blue-600/30': isSelected(line),
}"
>
{{ formatTime(line.time) }}
@ -89,7 +85,7 @@
</div>
</div>
<div class="m-auto text-xl text-wp-text-alt-100">
<div class="text-wp-text-alt-100 m-auto text-xl">
<span v-if="step?.state === 'skipped'">{{ $t('repo.pipeline.actions.canceled') }}</span>
<span v-else-if="!step?.started">{{ $t('repo.pipeline.step_not_started') }}</span>
<div v-else-if="!loadedLogs">{{ $t('repo.pipeline.loading') }}</div>
@ -98,9 +94,9 @@
<div
v-if="step?.finished !== undefined"
class="text-md flex w-full items-center bg-wp-code-100 p-4 font-bold text-wp-code-text-alt-100"
class="text-md bg-wp-code-100 text-wp-code-text-alt-100 flex w-full items-center p-4 font-bold"
>
<PipelineStatusIcon :status="step.state" class="!h-4 !w-4" />
<PipelineStatusIcon :status="step.state" class="h-4! w-4!" />
<span v-if="step?.error" class="px-2">{{ step.error }}</span>
<span v-else class="px-2">{{ $t('repo.pipeline.exit_code', { exitCode: step.exit_code }) }}</span>
</div>

View file

@ -7,6 +7,8 @@ import WoodpeckerIcon from '~/assets/woodpecker.svg?component';
</script>
<style scoped>
@reference '~/tailwind.css';
@keyframes peck {
0% {
transform: rotate(5deg) translateX(5%);

View file

@ -1,9 +1,9 @@
<template>
<div class="md:min-w-xs flex w-full flex-col gap-2 pb-2 text-wp-text-100 md:w-3/12 md:max-w-md">
<div class="text-wp-text-100 flex w-full flex-col gap-2 pb-2 md:w-3/12 md:max-w-md md:min-w-xs">
<div
class="flex flex-shrink-0 flex-wrap justify-between gap-1 rounded-md border border-wp-background-400 bg-wp-background-100 p-4 dark:bg-wp-background-200"
class="border-wp-background-400 bg-wp-background-100 dark:bg-wp-background-200 flex shrink-0 flex-wrap justify-between gap-1 rounded-md border p-4"
>
<div class="flex flex-shrink-0 items-center space-x-1">
<div class="flex shrink-0 items-center space-x-1">
<div class="flex items-center">
<Icon v-if="pipeline.event === 'cron'" name="stopwatch" />
<img v-else class="w-6 rounded-md" :src="pipeline.author_avatar" />
@ -12,7 +12,7 @@
</div>
<a
v-if="pipeline.event === 'pull_request' || pipeline.event === 'pull_request_closed'"
class="flex min-w-0 items-center space-x-1 text-wp-link-100 hover:text-wp-link-200"
class="text-wp-link-100 hover:text-wp-link-200 flex min-w-0 items-center space-x-1"
:href="pipeline.forge_url"
>
<Icon name="pull-request" />
@ -20,7 +20,7 @@
</a>
<router-link
v-else-if="pipeline.event === 'push' || pipeline.event === 'manual' || pipeline.event === 'deployment'"
class="flex min-w-0 items-center space-x-1 text-wp-link-100 hover:text-wp-link-200"
class="text-wp-link-100 hover:text-wp-link-200 flex min-w-0 items-center space-x-1"
:to="{ name: 'repo-branch', params: { branch: prettyRef } }"
>
<Icon v-if="pipeline.event === 'manual'" name="manual-pipeline" />
@ -33,14 +33,14 @@
<span class="truncate">{{ prettyRef }}</span>
</div>
<div class="flex flex-shrink-0 items-center">
<div class="flex shrink-0 items-center">
<template v-if="pipeline.event === 'pull_request'">
<Icon name="commit" />
<span>{{ pipeline.commit.slice(0, 10) }}</span>
</template>
<a
v-else
class="flex items-center text-wp-link-100 hover:text-wp-link-200"
class="text-wp-link-100 hover:text-wp-link-200 flex items-center"
:href="pipeline.forge_url"
target="_blank"
>
@ -54,15 +54,15 @@
<span>{{ $t('repo.pipeline.no_pipeline_steps') }}</span>
</Panel>
<div class="relative min-h-0 w-full flex-grow">
<div class="absolute left-0 right-0 top-0 flex h-full flex-col gap-y-2 md:overflow-y-auto">
<div class="relative min-h-0 w-full grow">
<div class="absolute top-0 right-0 left-0 flex h-full flex-col gap-y-2 md:overflow-y-auto">
<div
v-for="workflow in pipeline.workflows"
:key="workflow.id"
class="rounded-md border border-wp-background-400 bg-wp-background-100 p-2 shadow dark:bg-wp-background-200"
class="border-wp-background-400 bg-wp-background-100 dark:bg-wp-background-200 rounded-md border p-2 shadow-sm"
>
<div class="flex flex-col gap-2">
<div v-if="workflow.environ" class="flex flex-wrap justify-end gap-x-1 gap-y-2 pr-1 pt-1 text-xs">
<div v-if="workflow.environ" class="flex flex-wrap justify-end gap-x-1 gap-y-2 pt-1 pr-1 text-xs">
<div v-for="(value, key) in workflow.environ" :key="key">
<Badge :label="key" :value="value" />
</div>
@ -71,7 +71,7 @@
v-if="!singleConfig"
type="button"
:title="workflow.name"
class="hover-effect flex items-center gap-2 rounded-md px-1 py-2 hover:bg-wp-background-300 dark:hover:bg-wp-background-400"
class="hover-effect hover:bg-wp-background-300 dark:hover:bg-wp-background-400 flex items-center gap-2 rounded-md px-1 py-2"
@click="workflowsCollapsed[workflow.id] = !workflowsCollapsed[workflow.id]"
>
<Icon
@ -79,7 +79,7 @@
class="h-6 min-w-6 transition-transform duration-150"
:class="{ 'rotate-90 transform': !workflowsCollapsed[workflow.id] }"
/>
<PipelineStatusIcon :status="workflow.state" class="!h-4 !w-4" />
<PipelineStatusIcon :status="workflow.state" class="h-4! w-4!" />
<span class="truncate">{{ workflow.name }}</span>
<PipelineStepDuration
v-if="workflow.started !== workflow.finished"
@ -89,7 +89,7 @@
</button>
</div>
<div
class="overflow-hidden transition-height duration-150"
class="transition-height overflow-hidden duration-150"
:class="{ 'max-h-0': workflowsCollapsed[workflow.id], 'ml-[1.6rem]': !singleConfig }"
>
<button
@ -97,14 +97,14 @@
:key="step.pid"
type="button"
:title="step.name"
class="hover-effect flex w-full items-center gap-2 rounded-md border-2 border-transparent p-2 hover:bg-wp-background-300 dark:hover:bg-wp-background-400"
class="hover-effect hover:bg-wp-background-300 dark:hover:bg-wp-background-400 flex w-full items-center gap-2 rounded-md border-2 border-transparent p-2"
:class="{
'bg-wp-background-300 dark:bg-wp-background-400': selectedStepId && selectedStepId === step.pid,
'mt-1': !singleConfig || (workflow.children && step.pid !== workflow.children[0].pid),
}"
@click="$emit('update:selected-step-id', step.pid)"
>
<PipelineStatusIcon :service="step.type === StepType.Service" :status="step.state" class="!h-4 !w-4" />
<PipelineStatusIcon :service="step.type === StepType.Service" :status="step.state" class="h-4! w-4!" />
<span class="truncate">{{ step.name }}</span>
<PipelineStepDuration :step="step" />
</button>

View file

@ -22,7 +22,7 @@
</InputField>
<InputField v-slot="{ id }" :label="$t('secrets.plugins.images')">
<span class="mb-2 ml-1 text-wp-text-alt-100">{{ $t('secrets.plugins.desc') }}</span>
<span class="text-wp-text-alt-100 mb-2 ml-1">{{ $t('secrets.plugins.desc') }}</span>
<div class="flex flex-col gap-2">
<div v-for="image in innerValue.images" :key="image" class="flex gap-2">

View file

@ -1,9 +1,9 @@
<template>
<div class="space-y-4 text-wp-text-100">
<div class="text-wp-text-100 space-y-4">
<ListItem
v-for="secret in secrets"
:key="secret.id"
class="items-center !bg-wp-background-200 dark:!bg-wp-background-100"
class="bg-wp-background-200! dark:bg-wp-background-100! items-center"
>
<span>{{ secret.name }}</span>
<Badge
@ -23,7 +23,7 @@
/>
<IconButton
icon="trash"
class="ml-2 h-8 w-8 hover:text-wp-error-100"
class="hover:text-wp-error-100 ml-2 h-8 w-8"
:is-loading="isDeleting"
:title="$t('secrets.delete')"
@click="deleteSecret(secret)"

View file

@ -1,112 +1,114 @@
@reference "./tailwind.css";
:root,
:root[data-theme='light'] {
--wp-background-100: theme('colors.white');
--wp-background-200: theme('colors.gray.100');
--wp-background-300: theme('colors.gray.200');
--wp-background-400: theme('colors.gray.300');
--wp-background-100: var(--color-white);
--wp-background-200: var(--color-gray-100);
--wp-background-300: var(--color-gray-200);
--wp-background-400: var(--color-gray-300);
--wp-text-100: theme('colors.gray.600');
--wp-text-200: theme('colors.gray.700');
--wp-text-alt-100: theme('colors.gray.500');
--wp-text-100: var(--color-gray-600);
--wp-text-200: var(--color-gray-700);
--wp-text-alt-100: var(--color-gray-500);
--wp-primary-100: theme('colors.int-wp-primary.300');
--wp-primary-200: theme('colors.int-wp-primary.400');
--wp-primary-300: theme('colors.int-wp-primary.500');
--wp-primary-text-100: theme('colors.white');
--wp-primary-100: var(--color-int-wp-primary-300);
--wp-primary-200: var(--color-int-wp-primary-400);
--wp-primary-300: var(--color-int-wp-primary-500);
--wp-primary-text-100: var(--color-white);
--wp-control-neutral-100: theme('colors.white');
--wp-control-neutral-200: theme('colors.gray.300');
--wp-control-neutral-300: theme('colors.gray.400');
--wp-control-neutral-100: var(--color-white);
--wp-control-neutral-200: var(--color-gray-300);
--wp-control-neutral-300: var(--color-gray-400);
--wp-control-info-100: theme('colors.int-wp-control-info.100');
--wp-control-info-200: theme('colors.int-wp-control-info.200');
--wp-control-info-300: theme('colors.int-wp-control-info.300');
--wp-control-info-100: var(--color-int-wp-control-info-100);
--wp-control-info-200: var(--color-int-wp-control-info-200);
--wp-control-info-300: var(--color-int-wp-control-info-300);
--wp-control-ok-100: theme('colors.int-wp-control-ok.100');
--wp-control-ok-200: theme('colors.int-wp-control-ok.200');
--wp-control-ok-300: theme('colors.int-wp-control-ok.300');
--wp-control-ok-100: var(--color-int-wp-control-ok-100);
--wp-control-ok-200: var(--color-int-wp-control-ok-200);
--wp-control-ok-300: var(--color-int-wp-control-ok-300);
--wp-error-100: theme('colors.int-wp-error.100');
--wp-error-200: theme('colors.int-wp-error.200');
--wp-error-300: theme('colors.int-wp-error.300');
--wp-error-100: var(--color-int-wp-error-100);
--wp-error-200: var(--color-int-wp-error-200);
--wp-error-300: var(--color-int-wp-error-300);
--wp-state-neutral-100: theme('colors.int-wp-state-neutral.100');
--wp-state-ok-100: theme('colors.int-wp-state-ok.100');
--wp-state-info-100: theme('colors.int-wp-state-info.100');
--wp-state-warn-100: theme('colors.int-wp-state-warn.100');
--wp-state-neutral-100: var(--color-int-wp-state-neutral-100);
--wp-state-ok-100: var(--color-int-wp-state-ok-100);
--wp-state-info-100: var(--color-int-wp-state-info-100);
--wp-state-warn-100: var(--color-int-wp-state-warn-100);
--wp-hint-warn-100: theme('colors.int-wp-hint-warn.100');
--wp-hint-warn-200: theme('colors.int-wp-hint-warn.200');
--wp-hint-warn-100: var(--color-int-wp-hint-warn-100);
--wp-hint-warn-200: var(--color-int-wp-hint-warn-200);
--wp-code-inline-100: theme('colors.gray.200');
--wp-code-inline-200: theme('colors.gray.200');
--wp-code-inline-100: var(--color-gray-200);
--wp-code-inline-200: var(--color-gray-200);
--wp-code-inline-text-100: theme('colors.gray.600');
--wp-code-inline-text-100: var(--color-gray-600);
--wp-code-100: theme('colors.int-wp-secondary.300');
--wp-code-200: theme('colors.int-wp-secondary.600');
--wp-code-300: theme('colors.int-wp-secondary.600');
--wp-code-100: var(--color-int-wp-secondary-300);
--wp-code-200: var(--color-int-wp-secondary-600);
--wp-code-300: var(--color-int-wp-secondary-600);
--wp-code-text-100: theme('colors.gray.200');
--wp-code-text-alt-100: theme('colors.gray.300');
--wp-code-text-100: var(--color-gray-200);
--wp-code-text-alt-100: var(--color-gray-300);
--wp-link-100: theme('colors.blue.600');
--wp-link-200: theme('colors.blue.700');
--wp-link-100: var(--color-blue-600);
--wp-link-200: var(--color-blue-700);
}
:root[data-theme='dark'] {
--wp-background-100: theme('colors.int-wp-secondary.300');
--wp-background-200: theme('colors.int-wp-secondary.400');
--wp-background-300: theme('colors.int-wp-secondary.500');
--wp-background-400: theme('colors.int-wp-secondary.600');
--wp-background-100: var(--color-int-wp-secondary-300);
--wp-background-200: var(--color-int-wp-secondary-400);
--wp-background-300: var(--color-int-wp-secondary-500);
--wp-background-400: var(--color-int-wp-secondary-600);
--wp-text-100: theme('colors.gray.300');
--wp-text-200: theme('colors.gray.200');
--wp-text-alt-100: theme('colors.gray.400');
--wp-text-100: var(--color-gray-300);
--wp-text-200: var(--color-gray-200);
--wp-text-alt-100: var(--color-gray-400);
--wp-primary-100: theme('colors.int-wp-secondary.300');
--wp-primary-200: theme('colors.int-wp-secondary.400');
--wp-primary-300: theme('colors.int-wp-secondary.600');
--wp-primary-text-100: theme('colors.gray.300');
--wp-primary-100: var(--color-int-wp-secondary-300);
--wp-primary-200: var(--color-int-wp-secondary-400);
--wp-primary-300: var(--color-int-wp-secondary-600);
--wp-primary-text-100: var(--color-gray-300);
--wp-control-neutral-100: theme('colors.int-wp-secondary.300');
--wp-control-neutral-200: theme('colors.int-wp-secondary.600');
--wp-control-neutral-300: theme('colors.int-wp-secondary.700');
--wp-control-neutral-100: var(--color-int-wp-secondary-300);
--wp-control-neutral-200: var(--color-int-wp-secondary-600);
--wp-control-neutral-300: var(--color-int-wp-secondary-700);
--wp-control-info-100: theme('colors.int-wp-control-info-dark.100');
--wp-control-info-200: theme('colors.int-wp-control-info-dark.200');
--wp-control-info-300: theme('colors.int-wp-control-info-dark.300');
--wp-control-info-100: var(--color-int-wp-control-info-dark-100);
--wp-control-info-200: var(--color-int-wp-control-info-dark-200);
--wp-control-info-300: var(--color-int-wp-control-info-dark-300);
--wp-control-ok-100: theme('colors.int-wp-control-ok-dark.100');
--wp-control-ok-200: theme('colors.int-wp-control-ok-dark.200');
--wp-control-ok-300: theme('colors.int-wp-control-ok-dark.300');
--wp-control-ok-100: var(--color-int-wp-control-ok-dark-100);
--wp-control-ok-200: var(--color-int-wp-control-ok-dark-200);
--wp-control-ok-300: var(--color-int-wp-control-ok-dark-300);
--wp-error-100: theme('colors.int-wp-error.200');
--wp-error-200: theme('colors.int-wp-error.300');
--wp-error-300: theme('colors.int-wp-error.300');
--wp-error-100: var(--color-int-wp-error-200);
--wp-error-200: var(--color-int-wp-error-300);
--wp-error-300: var(--color-int-wp-error-300);
--wp-state-neutral-100: theme('colors.int-wp-state-neutral.100');
--wp-state-ok-100: theme('colors.int-wp-state-ok-dark.100');
--wp-state-info-100: theme('colors.int-wp-state-info-dark.100');
--wp-state-warn-100: theme('colors.int-wp-state-warn-dark.100');
--wp-state-neutral-100: var(--color-int-wp-state-neutral-100);
--wp-state-ok-100: var(--color-int-wp-state-ok-dark-100);
--wp-state-info-100: var(--color-int-wp-state-info-dark-100);
--wp-state-warn-100: var(--color-int-wp-state-warn-dark-100);
--wp-hint-warn-100: theme('colors.int-wp-hint-warn-dark.100');
--wp-hint-warn-200: theme('colors.int-wp-hint-warn-dark.200');
--wp-hint-warn-100: var(--color-int-wp-hint-warn-dark-100);
--wp-hint-warn-200: var(--color-int-wp-hint-warn-dark-200);
--wp-code-inline-100: theme('colors.int-wp-secondary.700');
--wp-code-inline-200: theme('colors.int-wp-secondary.300');
--wp-code-inline-100: var(--color-int-wp-secondary-700);
--wp-code-inline-200: var(--color-int-wp-secondary-300);
--wp-code-inline-text-100: theme('colors.gray.300');
--wp-code-inline-text-100: var(--color-gray-300);
--wp-code-100: theme('colors.int-wp-secondary.700'); /* #222631 */
--wp-code-200: theme('colors.int-wp-secondary.600'); /* #2a2e3a */
--wp-code-300: theme('colors.int-wp-secondary.800'); /* #1B1F28 */
--wp-code-100: var(--color-int-wp-secondary-700); /* #222631 */
--wp-code-200: var(--color-int-wp-secondary-600); /* #2a2e3a */
--wp-code-300: var(--color-int-wp-secondary-800); /* #1B1F28 */
--wp-code-text-100: theme('colors.gray.200');
--wp-code-text-alt-100: theme('colors.gray.400');
--wp-code-text-100: var(--color-gray-200);
--wp-code-text-alt-100: var(--color-gray-400);
--wp-link-100: theme('colors.blue.400');
--wp-link-200: theme('colors.blue.500');
--wp-link-100: var(--color-blue-400);
--wp-link-200: var(--color-blue-500);
}
html,
@ -125,11 +127,11 @@ body,
}
.vue-notification.success {
@apply !border-l-wp-control-ok-300 !bg-wp-control-ok-100;
@apply !border-wp-error-200 !bg-wp-control-ok-100 !border-l;
}
.vue-notification.error {
@apply !border-l-wp-error-200 !bg-wp-error-100;
@apply !border-wp-error-200 !bg-wp-error-100 !border-l;
}
*::-webkit-scrollbar {
@ -143,11 +145,11 @@ body,
*::-webkit-scrollbar-thumb {
transition: background 0.2s ease-in-out;
border: 3px solid transparent;
@apply rounded-full bg-gray-200 bg-clip-content dark:bg-wp-background-200;
@apply dark:bg-wp-background-200 rounded-full bg-gray-200 bg-clip-content;
}
*::-webkit-scrollbar-thumb:hover {
@apply bg-gray-300 dark:bg-wp-background-100;
@apply dark:bg-wp-background-100 bg-gray-300;
}
*::-webkit-scrollbar-corner {
@ -155,16 +157,16 @@ body,
}
.code-box {
@apply break-words rounded-md bg-wp-code-inline-100 p-4 text-sm text-wp-code-inline-text-100;
@apply bg-wp-code-inline-100 text-wp-code-inline-text-100 rounded-md p-4 text-sm break-words;
white-space: pre-wrap;
}
.code-box-inline,
code:not(pre > code) {
@apply rounded-md bg-wp-code-inline-100 px-1.5 py-0.5 text-wp-code-inline-text-100;
@apply bg-wp-code-inline-100 text-wp-code-inline-text-100 rounded-md px-1.5 py-0.5;
}
.code-box-log {
@apply break-words bg-wp-code-300 p-4 text-wp-code-text-100;
@apply bg-wp-code-300 text-wp-code-text-100 p-4 break-words;
white-space: pre-wrap;
}

File diff suppressed because it is too large Load diff

View file

@ -7,26 +7,26 @@
v-if="errorUri"
:href="errorUri"
target="_blank"
class="mt-1 cursor-pointer text-wp-link-100 hover:text-wp-link-200"
class="text-wp-link-100 hover:text-wp-link-200 mt-1 cursor-pointer"
>
<span>{{ errorUri }}</span>
</a>
</Error>
<div
class="flex min-h-sm w-full flex-col overflow-hidden border border-wp-background-400 bg-wp-background-100 shadow dark:bg-wp-background-200 md:m-8 md:w-3xl md:flex-row md:rounded-md"
class="min-h-sm border-wp-background-400 bg-wp-background-100 dark:bg-wp-background-200 flex w-full flex-col overflow-hidden border shadow-sm md:m-8 md:w-3xl md:flex-row md:rounded-md"
>
<div class="flex min-h-48 items-center justify-center bg-wp-primary-200 dark:bg-wp-primary-300 md:w-3/5">
<div class="bg-wp-primary-200 dark:bg-wp-primary-300 flex min-h-48 items-center justify-center md:w-3/5">
<WoodpeckerLogo preserveAspectRatio="xMinYMin slice" class="h-32 w-32 md:h-48 md:w-48" />
</div>
<div class="flex min-h-48 flex-col items-center justify-center gap-4 p-4 text-center md:w-2/5">
<h1 class="text-xl text-wp-text-100">{{ $t('welcome') }}</h1>
<h1 class="text-wp-text-100 text-xl">{{ $t('welcome') }}</h1>
<div class="flex flex-col gap-2">
<Button
v-for="forge in forges"
:key="forge.id"
:start-icon="forge.type === 'addon' ? 'repo' : forge.type"
class="!whitespace-normal"
class="whitespace-normal!"
@click="doLogin(forge.id)"
>
{{ $t('login_with', { forge: getHostFromUrl(forge) }) }}

View file

@ -13,7 +13,7 @@
:to="repo.active ? { name: 'repo', params: { repoId: repo.id } } : undefined"
>
<span class="text-wp-text-100">{{ repo.full_name }}</span>
<span v-if="repo.active" class="ml-auto text-wp-text-alt-100">{{ $t('repo.enable.enabled') }}</span>
<span v-if="repo.active" class="text-wp-text-alt-100 ml-auto">{{ $t('repo.enable.enabled') }}</span>
<div v-else class="ml-auto flex items-center">
<Badge v-if="repo.id" class="md:display-unset mr-2 hidden" :label="$t('repo.enable.disabled')" />
<Button
@ -24,7 +24,7 @@
</div>
</ListItem>
</template>
<div v-else-if="loading" class="flex justify-center text-wp-text-100">
<div v-else-if="loading" class="text-wp-text-100 flex justify-center">
<Icon name="spinner" />
</div>
</div>

View file

@ -18,7 +18,7 @@
</div>
<div class="flex flex-col gap-4">
<h2 class="text-lg text-wp-text-100">{{ $t('all_repositories') }}</h2>
<h2 class="text-wp-text-100 text-lg">{{ $t('all_repositories') }}</h2>
<div class="flex flex-col gap-4">
<RepoItem v-for="repo in reposLastActivity" :key="repo.id" :repo="repo" />
</div>
@ -28,7 +28,7 @@
<div v-if="reposLastActivity.length > 0" class="flex flex-col gap-4">
<RepoItem v-for="repo in reposLastActivity" :key="repo.id" :repo="repo" />
</div>
<span v-else class="text-center text-lg text-wp-text-100">{{ $t('no_search_results') }}</span>
<span v-else class="text-wp-text-100 text-center text-lg">{{ $t('no_search_results') }}</span>
</div>
</Transition>
</Scaffold>

View file

@ -1,7 +1,7 @@
<template>
<Settings :title="$t('info')">
<div class="flex flex-col items-center gap-4">
<WoodpeckerLogo class="h-32 w-32 fill-wp-text-200" />
<WoodpeckerLogo class="fill-wp-text-200 h-32 w-32" />
<i18n-t keypath="running_version" tag="p" class="text-center text-xl">
<span class="font-bold">{{ version?.current }}</span>

View file

@ -1,10 +1,10 @@
<template>
<Settings :title="$t('admin.settings.orgs.orgs')" :description="$t('admin.settings.orgs.desc')">
<div class="space-y-4 text-wp-text-100">
<div class="text-wp-text-100 space-y-4">
<ListItem
v-for="org in orgs"
:key="org.id"
class="items-center gap-2 !bg-wp-background-200 dark:!bg-wp-background-100"
class="bg-wp-background-200! dark:bg-wp-background-100! items-center gap-2"
>
<span>{{ org.name }}</span>
<IconButton
@ -22,7 +22,7 @@
<IconButton
icon="trash"
:title="$t('admin.settings.orgs.delete_org')"
class="ml-2 h-8 w-8 hover:text-wp-error-100"
class="hover:text-wp-error-100 ml-2 h-8 w-8"
:is-loading="isDeleting"
@click="deleteOrg(org)"
/>

View file

@ -26,11 +26,11 @@
<AdminQueueStats :stats="queueInfo?.stats" />
<div v-if="tasks.length > 0" class="flex flex-col">
<p class="mb-2 mt-6 text-xl">{{ $t('admin.settings.queue.tasks') }}</p>
<p class="mt-6 mb-2 text-xl">{{ $t('admin.settings.queue.tasks') }}</p>
<ListItem
v-for="task in tasks"
:key="task.id"
class="mb-2 items-center !bg-wp-background-200 dark:!bg-wp-background-100"
class="bg-wp-background-200! dark:bg-wp-background-100! mb-2 items-center"
>
<div
class="flex items-center"

View file

@ -9,11 +9,11 @@
/>
</template>
<div class="space-y-4 text-wp-text-100">
<div class="text-wp-text-100 space-y-4">
<ListItem
v-for="repo in repos"
:key="repo.id"
class="items-center gap-2 bg-wp-background-200 dark:!bg-wp-background-100"
class="bg-wp-background-200 dark:bg-wp-background-100! items-center gap-2"
>
<span>{{ repo.full_name }}</span>
<div class="ml-auto flex items-center">

View file

@ -10,11 +10,11 @@
<Button v-else :text="$t('admin.settings.users.add')" start-icon="plus" @click="showAddUser" />
</template>
<div v-if="!selectedUser" class="space-y-4 text-wp-text-100">
<div v-if="!selectedUser" class="text-wp-text-100 space-y-4">
<ListItem
v-for="user in users"
:key="user.id"
class="items-center gap-2 !bg-wp-background-200 dark:!bg-wp-background-100"
class="bg-wp-background-200! dark:bg-wp-background-100! items-center gap-2"
>
<img v-if="user.avatar_url" class="h-6 rounded-md" :src="user.avatar_url" />
<span>{{ user.login }}</span>
@ -33,7 +33,7 @@
<IconButton
icon="trash"
:title="$t('admin.settings.users.delete_user')"
class="ml-2 h-8 w-8 hover:text-wp-error-100"
class="hover:text-wp-error-100 ml-2 h-8 w-8"
:is-loading="isDeleting"
@click="deleteUser(user)"
/>

View file

@ -1,6 +1,6 @@
<template>
<div class="m-auto flex flex-col gap-4">
<div class="text-center text-wp-text-100">
<div class="text-wp-text-100 text-center">
<WoodpeckerLogo preserveAspectRatio="xMinYMin slice" class="m-auto mb-8 w-32" />
<template v-if="state === 'confirm'">
<h1 class="text-4xl font-bold">{{ $t('login_to_cli') }}</h1>

View file

@ -17,7 +17,7 @@
<RepoItem v-for="repo in reposLastActivity" :key="repo.id" :repo="repo" />
</div>
<div v-if="(reposLastActivity || []).length <= 0" class="text-center">
<span class="m-auto text-wp-text-100">{{ $t('repo.user_none') }}</span>
<span class="text-wp-text-100 m-auto">{{ $t('repo.user_none') }}</span>
</div>
</Scaffold>
</template>

View file

@ -1,6 +1,6 @@
<template>
<div class="mb-4 flex w-full justify-center">
<span class="text-xl text-wp-text-100">{{ $t('repo.pipeline.pipelines_for', { branch }) }}</span>
<span class="text-wp-text-100 text-xl">{{ $t('repo.pipeline.pipelines_for', { branch }) }}</span>
</div>
<PipelineList :pipelines="pipelines" :repo="repo" />
</template>

View file

@ -11,7 +11,7 @@
<Badge v-if="branch === repo?.default_branch" :label="$t('default')" class="ml-auto" />
</ListItem>
</template>
<div v-else-if="loading" class="flex justify-center text-wp-text-100">
<div v-else-if="loading" class="text-wp-text-100 flex justify-center">
<Icon name="spinner" />
</div>
<Panel v-else class="flex justify-center">

View file

@ -1,7 +1,7 @@
<template>
<Panel v-if="!loading">
<form @submit.prevent="triggerManualPipeline">
<span class="text-xl text-wp-text-100">{{ $t('repo.manual_pipeline.title') }}</span>
<span class="text-wp-text-100 text-xl">{{ $t('repo.manual_pipeline.title') }}</span>
<InputField v-slot="{ id }" :label="$t('repo.manual_pipeline.select_branch')">
<SelectField :id="id" v-model="payload.branch" :options="branches" required @update:model-value="loadParameters" />
</InputField>
@ -92,7 +92,7 @@
</template>
<InputField v-slot="{ id }" :label="$t('repo.manual_pipeline.variables.title')">
<span class="mb-2 text-sm text-wp-text-alt-100">{{ $t('repo.manual_pipeline.variables.desc') }}</span>
<span class="text-wp-text-alt-100 mb-2 text-sm">{{ $t('repo.manual_pipeline.variables.desc') }}</span>
<KeyValueEditor
:id="id"
v-model="payload.variables"
@ -105,7 +105,7 @@
<Button type="submit" :text="$t('repo.manual_pipeline.trigger')" :disabled="!isFormValid" />
</form>
</Panel>
<div v-else class="flex justify-center text-wp-text-100">
<div v-else class="text-wp-text-100 flex justify-center">
<Icon name="spinner" />
</div>
</template>

View file

@ -1,6 +1,6 @@
<template>
<div class="mb-4 flex w-full justify-center">
<span class="text-xl text-wp-text-100">{{ $t('repo.pipeline.pipelines_for_pr', { index: pullRequest }) }}</span>
<span class="text-wp-text-100 text-xl">{{ $t('repo.pipeline.pipelines_for_pr', { index: pullRequest }) }}</span>
</div>
<PipelineList :pipelines="pipelines" :repo="repo" />
</template>

View file

@ -8,15 +8,15 @@
:to="{ name: 'repo-pull-request', params: { pullRequest: pullRequest.index } }"
>
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
<span class="md:display-unset hidden text-wp-text-alt-100">#{{ pullRequest.index }}</span>
<span class="md:display-unset text-wp-text-alt-100 hidden">#{{ pullRequest.index }}</span>
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
<span class="md:display-unset mx-2 hidden text-wp-text-alt-100">-</span>
<span class="overflow-hidden overflow-ellipsis whitespace-nowrap text-wp-text-100 underline md:no-underline">{{
<span class="md:display-unset text-wp-text-alt-100 mx-2 hidden">-</span>
<span class="text-wp-text-100 overflow-hidden text-ellipsis whitespace-nowrap underline md:no-underline">{{
pullRequest.title
}}</span>
</ListItem>
</template>
<div v-else-if="loading" class="flex justify-center text-wp-text-100">
<div v-else-if="loading" class="text-wp-text-100 flex justify-center">
<Icon name="spinner" />
</div>
<Panel v-else class="flex justify-center">

View file

@ -1,17 +1,17 @@
<template>
<Container full-width class="md:min-h-xs flex flex-grow-0 flex-col md:flex-grow md:px-4">
<div class="flex min-h-0 w-full flex-grow flex-wrap-reverse md:flex-nowrap md:gap-4">
<Container full-width class="md:min-h-xs flex grow-0 flex-col md:grow md:px-4">
<div class="flex min-h-0 w-full grow flex-wrap-reverse md:flex-nowrap md:gap-4">
<PipelineStepList
v-model:selected-step-id="selectedStepId"
:class="{ 'hidden md:flex': pipeline!.status === 'blocked' }"
:pipeline="pipeline!"
/>
<div class="relative flex flex-grow basis-full items-start justify-center md:basis-auto">
<div class="relative flex grow basis-full items-start justify-center md:basis-auto">
<div v-if="pipeline!.errors?.some((e) => !e.is_warning)" class="mb-4 w-full md:mb-auto">
<Panel>
<div class="flex flex-col items-center gap-4 text-center">
<Icon name="status-error" class="h-16 w-16 text-wp-error-100" size="1.5rem" />
<Icon name="status-error" class="text-wp-error-100 h-16 w-16" size="1.5rem" />
<span class="text-xl">{{ $t('repo.pipeline.we_got_some_errors') }}</span>
<Button color="red" :text="$t('repo.pipeline.show_errors')" :to="{ name: 'repo-pipeline-errors' }" />
</div>
@ -44,7 +44,7 @@
<div v-else-if="pipeline!.status === 'declined'" class="mb-4 w-full md:mb-auto">
<Panel>
<div class="flex flex-col items-center gap-4">
<Icon name="status-declined" size="1.5rem" class="h-16 w-16 text-wp-error-100" />
<Icon name="status-declined" size="1.5rem" class="text-wp-error-100 h-16 w-16" />
<p class="text-xl">{{ $t('repo.pipeline.protected.declined') }}</p>
</div>
</Panel>
@ -54,7 +54,7 @@
v-else-if="selectedStepId !== null"
v-model:step-id="selectedStepId"
:pipeline="pipeline!"
class="fixed left-0 top-0 h-full w-full md:absolute"
class="fixed top-0 left-0 h-full w-full md:absolute"
/>
</div>
</div>

View file

@ -21,7 +21,7 @@
collapsed-by-default
:title="pipelineConfigsDecoded && pipelineConfigsDecoded.length > 1 ? pipelineConfig.name : ''"
>
<SyntaxHighlight class="overflow-auto whitespace-pre font-mono" language="yaml" :code="pipelineConfig.data" />
<SyntaxHighlight class="overflow-auto font-mono whitespace-pre" language="yaml" :code="pipelineConfig.data" />
</Panel>
</div>
</template>

View file

@ -2,7 +2,7 @@
<template v-if="repoPermissions && repoPermissions.push">
<Panel>
<InputField :label="$t('repo.pipeline.debug.metadata_exec_title')">
<p class="mb-2 text-sm text-wp-text-alt-100">{{ $t('repo.pipeline.debug.metadata_exec_desc') }}</p>
<p class="text-wp-text-alt-100 mb-2 text-sm">{{ $t('repo.pipeline.debug.metadata_exec_desc') }}</p>
<pre class="code-box">{{ cliExecWithMetadata }}</pre>
</InputField>
<div class="flex items-center space-x-4">
@ -11,7 +11,7 @@
</Panel>
</template>
<div v-else class="flex h-full items-center justify-center">
<div class="rounded-lg bg-wp-error-100 p-8 text-center shadow-lg dark:bg-wp-error-200">
<div class="bg-wp-error-100 dark:bg-wp-error-200 rounded-lg p-8 text-center shadow-lg">
<p class="text-2xl font-bold text-white">{{ $t('repo.pipeline.debug.no_permission') }}</p>
</div>
</div>

View file

@ -3,11 +3,11 @@
<div class="flex flex-col gap-y-4">
<template v-for="(error, _index) in pipeline!.errors" :key="_index">
<div>
<div class="grid grid-cols-[minmax(10rem,auto),3fr]">
<div class="grid grid-cols-[minmax(10rem,auto)_3fr]">
<span class="flex items-center gap-x-2">
<Icon
name="alert"
class="my-1 flex-shrink-0"
class="my-1 shrink-0"
:class="{
'text-wp-state-warn-100': error.is_warning,
'text-wp-error-100': !error.is_warning,
@ -35,7 +35,7 @@
</span>
<span v-else />
</div>
<div class="col-start-2 grid grid-cols-[minmax(10rem,auto),4fr]">
<div class="col-start-2 grid grid-cols-[minmax(10rem,auto)_4fr]">
<span />
<span>
<RenderMarkdown :content="error.message" />

View file

@ -20,11 +20,11 @@
<template #headerActions>
<div class="flex w-full items-center justify-between gap-2">
<div class="flex min-w-0 content-start gap-2">
<PipelineStatusIcon :status="pipeline.status" class="flex flex-shrink-0" />
<span class="flex-shrink-0 text-center">{{ $t('repo.pipeline.pipeline', { pipelineId }) }}</span>
<PipelineStatusIcon :status="pipeline.status" class="flex shrink-0" />
<span class="shrink-0 text-center">{{ $t('repo.pipeline.pipeline', { pipelineId }) }}</span>
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
<span class="hidden md:inline-block">-</span>
<span class="min-w-0 overflow-hidden overflow-ellipsis whitespace-nowrap" :title="message">{{
<span class="min-w-0 overflow-hidden text-ellipsis whitespace-nowrap" :title="message">{{
shortMessage
}}</span>
</div>
@ -33,20 +33,20 @@
<div class="flex content-start gap-x-2">
<Button
v-if="pipeline.status === 'pending' || pipeline.status === 'running'"
class="flex-shrink-0"
class="shrink-0"
:text="$t('repo.pipeline.actions.cancel')"
:is-loading="isCancelingPipeline"
@click="cancelPipeline"
/>
<Button
class="flex-shrink-0"
class="shrink-0"
:text="$t('repo.pipeline.actions.restart')"
:is-loading="isRestartingPipeline"
@click="restartPipeline"
/>
<Button
v-if="pipeline.status === 'success' && repo.allow_deploy"
class="flex-shrink-0"
class="shrink-0"
:text="$t('repo.pipeline.actions.deploy')"
@click="showDeployPipelinePopup = true"
/>
@ -62,11 +62,11 @@
<template #tabActions>
<div class="flex flex-wrap gap-4 md:flex-nowrap">
<div class="flex flex-shrink-0 items-center gap-2" :title="$t('repo.pipeline.created', { created })">
<div class="flex shrink-0 items-center gap-2" :title="$t('repo.pipeline.created', { created })">
<Icon name="since" />
<span>{{ since }}</span>
</div>
<div class="flex flex-shrink-0 items-center gap-2" :title="$t('repo.pipeline.duration')">
<div class="flex shrink-0 items-center gap-2" :title="$t('repo.pipeline.duration')">
<Icon name="duration" />
<span>{{ duration }}</span>
</div>

View file

@ -14,11 +14,11 @@
<Button v-else start-icon="plus" :text="$t('repo.settings.crons.add')" @click="selectedCron = {}" />
</template>
<div v-if="!selectedCron" class="space-y-4 text-wp-text-100">
<div v-if="!selectedCron" class="text-wp-text-100 space-y-4">
<ListItem
v-for="cron in crons"
:key="cron.id"
class="items-center !bg-wp-background-200 dark:!bg-wp-background-100"
class="bg-wp-background-200! dark:bg-wp-background-100! items-center"
>
<span class="grid w-full grid-cols-3">
<span>{{ cron.name }}</span>
@ -39,7 +39,7 @@
<IconButton icon="edit" class="h-8 w-8" :title="$t('repo.settings.crons.edit')" @click="selectedCron = cron" />
<IconButton
icon="trash"
class="h-8 w-8 hover:text-wp-error-100"
class="hover:text-wp-error-100 h-8 w-8"
:is-loading="isDeleting"
:title="$t('repo.settings.crons.delete')"
@click="deleteCron(cron)"

View file

@ -120,7 +120,7 @@
>
<div class="flex items-center">
<NumberField :id="id" v-model="repoSettings.timeout" class="w-24" />
<span class="ml-4 text-wp-text-alt-100">{{ $t('repo.settings.general.timeout.minutes') }}</span>
<span class="text-wp-text-alt-100 ml-4">{{ $t('repo.settings.general.timeout.minutes') }}</span>
</div>
</InputField>

View file

@ -2,7 +2,7 @@
<Settings :title="$t('user.settings.cli_and_api.cli_and_api')" :description="$t('user.settings.cli_and_api.desc')">
<InputField :label="$t('user.settings.cli_and_api.cli_usage')">
<template #headerActions>
<a :href="cliDownload" target="_blank" class="ml-4 text-wp-link-100 hover:text-wp-link-200">{{
<a :href="cliDownload" target="_blank" class="text-wp-link-100 hover:text-wp-link-200 ml-4">{{
$t('user.settings.cli_and_api.download_cli')
}}</a>
</template>
@ -22,7 +22,7 @@
v-if="enableSwagger"
:href="`${address}/swagger/index.html`"
target="_blank"
class="ml-4 text-wp-link-100 hover:text-wp-link-200"
class="text-wp-link-100 hover:text-wp-link-200 ml-4"
>
{{ $t('user.settings.cli_and_api.swagger_ui') }}
</a>

View file

@ -1,237 +0,0 @@
// cSpell:ignore Segoe Roboto Neue Noto nocheck
// eslint-disable-next-line ts/ban-ts-comment
// @ts-nocheck
import typography from '@tailwindcss/typography';
import type { Config } from 'tailwindcss';
import colors from 'tailwindcss/colors';
import tinycolor from 'tinycolor2';
const customColors = {
'wp-primary': {
100: '#8AD97F',
200: '#68C464',
300: '#4CAF50',
400: '#369943',
500: '#248438',
600: '#166E30',
},
'wp-secondary': {
200: '#434858',
300: '#383C4A',
400: '#303440',
500: '#2D313D',
600: '#2A2E3A',
700: '#222631',
800: '#1B1F28',
},
};
export default {
content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}', './src/**/*.css'],
darkMode: 'class',
theme: {
extend: {
colors: {
// Internals to keep a single source for color definitions
'int-wp-primary': {
100: customColors['wp-primary'][100],
200: customColors['wp-primary'][200],
300: customColors['wp-primary'][300],
400: customColors['wp-primary'][400],
500: customColors['wp-primary'][500],
600: customColors['wp-primary'][600],
},
'int-wp-secondary': {
200: customColors['wp-secondary'][200],
300: customColors['wp-secondary'][300],
400: customColors['wp-secondary'][400],
500: customColors['wp-secondary'][500],
600: customColors['wp-secondary'][600],
700: customColors['wp-secondary'][700],
800: customColors['wp-secondary'][800],
},
'int-wp-control-neutral': {
100: colors.white,
200: colors.gray[300],
300: colors.gray[400],
},
'int-wp-control-info': {
100: colors.cyan[700],
200: colors.cyan[800],
300: colors.cyan[900],
},
'int-wp-control-info-dark': {
100: tinycolor(colors.cyan[700]).desaturate(30).toString(),
200: tinycolor(colors.cyan[800]).desaturate(30).toString(),
300: tinycolor(colors.cyan[900]).desaturate(30).toString(),
},
'int-wp-control-ok': {
100: customColors['wp-primary'][400],
200: customColors['wp-primary'][500],
300: customColors['wp-primary'][600],
},
'int-wp-control-ok-dark': {
100: tinycolor(customColors['wp-primary'][400]).desaturate(10).toString(),
200: tinycolor(customColors['wp-primary'][500]).desaturate(10).toString(),
300: tinycolor(customColors['wp-primary'][600]).desaturate(10).toString(),
},
'int-wp-error': {
100: colors.red[700],
200: colors.red[800],
300: colors.red[900],
},
'int-wp-state-neutral': {
100: colors.gray[600],
},
'int-wp-state-ok': {
100: colors.green[600],
},
'int-wp-state-ok-dark': {
100: tinycolor(colors.green[600]).desaturate(20).toString(),
},
'int-wp-state-info': {
100: colors.cyan[600],
},
'int-wp-state-info-dark': {
100: tinycolor(colors.cyan[600]).desaturate(20).toString(),
},
'int-wp-state-warn': {
100: colors.yellow[400],
},
'int-wp-state-warn-dark': {
100: tinycolor(colors.yellow[400]).desaturate(20).toString(),
},
'int-wp-hint-warn': {
100: colors.yellow[100],
200: colors.yellow[300],
},
'int-wp-hint-warn-dark': {
100: tinycolor(colors.yellow[300]).desaturate(60).toString(),
200: tinycolor(colors.yellow[500]).desaturate(60).toString(),
},
// Theme colors
'wp-background': {
100: 'var(--wp-background-100)',
200: 'var(--wp-background-200)',
300: 'var(--wp-background-300)',
400: 'var(--wp-background-400)',
},
'wp-text': {
100: 'var(--wp-text-100)',
200: 'var(--wp-text-200)',
},
'wp-text-alt': {
100: 'var(--wp-text-alt-100)',
},
'wp-primary': {
100: 'var(--wp-primary-100)',
200: 'var(--wp-primary-200)',
300: 'var(--wp-primary-300)',
},
'wp-primary-text': {
100: 'var(--wp-primary-text-100)',
},
'wp-control-neutral': {
100: 'var(--wp-control-neutral-100)',
200: 'var(--wp-control-neutral-200)',
300: 'var(--wp-control-neutral-300)',
},
'wp-control-info': {
100: 'var(--wp-control-info-100)',
200: 'var(--wp-control-info-200)',
300: 'var(--wp-control-info-300)',
},
'wp-control-ok': {
100: 'var(--wp-control-ok-100)',
200: 'var(--wp-control-ok-200)',
300: 'var(--wp-control-ok-300)',
},
'wp-error': {
100: 'var(--wp-error-100)',
200: 'var(--wp-error-200)',
300: 'var(--wp-error-300)',
},
'wp-state-neutral': {
100: 'var(--wp-state-neutral-100)',
},
'wp-state-ok': {
100: 'var(--wp-state-ok-100)',
},
'wp-state-info': {
100: 'var(--wp-state-info-100)',
},
'wp-state-warn': {
100: 'var(--wp-state-warn-100)',
},
'wp-hint-warn': {
100: 'var(--wp-hint-warn-100)',
200: 'var(--wp-hint-warn-200)',
},
'wp-code-inline': {
100: 'var(--wp-code-inline-100)',
200: 'var(--wp-code-inline-200)',
},
'wp-code-inline-text': {
100: 'var(--wp-code-inline-text-100)',
},
'wp-code': {
100: 'var(--wp-code-100)',
200: 'var(--wp-code-200)',
300: 'var(--wp-code-300)',
},
'wp-code-text': {
100: 'var(--wp-code-text-100)',
},
'wp-code-text-alt': {
100: 'var(--wp-code-text-alt-100)',
},
'wp-link': {
100: 'var(--wp-link-100)',
200: 'var(--wp-link-200)',
},
},
spacing: {
sm: '24rem',
md: '28rem',
lg: '32rem',
xl: '36rem',
'2xl': '42rem',
'3xl': '48rem',
},
fontFamily: {
sans: [
'system-ui',
'-apple-system',
'Segoe UI',
'Roboto',
'Helvetica Neue',
'Noto Sans',
'Liberation Sans',
'Arial',
'sans-serif',
],
},
transitionProperty: {
height: 'max-height',
},
stroke: (theme: (path: string) => object) => theme('colors'),
fill: (theme: (path: string) => object) => theme('colors'),
},
},
plugins: [typography],
} satisfies Config;

View file

@ -27,14 +27,6 @@
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",
"src/**/*.json",
"tailwind.config.ts",
"vite.config.ts",
"postcss.config.js"
],
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "src/**/*.json", "vite.config.ts"],
"exclude": ["node_modules", "**/__tests__/**/*", "**/dist/**/*"]
}

View file

@ -2,6 +2,7 @@ import { readdirSync } from 'node:fs';
import path from 'node:path';
import process from 'node:process';
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite';
import tailwindcss from '@tailwindcss/vite';
import vue from '@vitejs/plugin-vue';
import type { Plugin } from 'vite';
import prismjs from 'vite-plugin-prismjs';
@ -75,6 +76,7 @@ export default defineConfig({
prismjs({
languages: ['yaml'],
}),
tailwindcss(),
],
resolve: {
alias: {