feat: ship self-hosted KOC LOOP workflows

This commit is contained in:
巫凤萍
2026-08-11 23:07:26 +08:00
parent 1f1887c860
commit ddad4b7659
88 changed files with 6056 additions and 8938 deletions

View File

@@ -1,6 +1,8 @@
@import "tailwindcss";
:root {
--font-geist-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
--font-geist-mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
--ink: #172321;
--ink-soft: #32423f;
--nav: #13201e;
@@ -242,6 +244,146 @@ a {
min-height: 100vh;
}
.task-type-picker {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
margin: 22px 0 6px;
}
.task-type-picker button {
display: flex;
min-height: 82px;
flex-direction: column;
align-items: flex-start;
justify-content: center;
gap: 7px;
padding: 16px;
border: 1px solid #dbe4df;
border-radius: 14px;
color: #53625d;
background: #fafcfb;
text-align: left;
}
.task-type-picker button.active {
border-color: #278b69;
color: #123f31;
background: #edf8f3;
box-shadow: 0 0 0 3px rgb(39 139 105 / 0.08);
}
.task-type-picker b {
font-size: 15px;
}
.task-type-picker span {
color: #87938f;
font-size: 11px;
line-height: 1.5;
}
.screenshot-task-fields textarea {
width: 100%;
min-height: 108px;
resize: vertical;
padding: 13px 14px;
border: 1px solid #d8e0dc;
border-radius: 12px;
outline: none;
font: inherit;
line-height: 1.65;
}
.screenshot-task-fields textarea:focus {
border-color: #63a88e;
box-shadow: 0 0 0 3px rgb(39 139 105 / 0.08);
}
.task-example-picker {
position: relative;
display: flex;
min-height: 82px;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 5px;
padding: 14px;
border: 1px dashed #bdccc5;
border-radius: 12px;
background: #fafcfb;
}
.task-example-picker.has-file {
border-style: solid;
border-color: #8ec3ae;
background: #f0f8f4;
}
.task-example-picker input {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
opacity: 0;
cursor: pointer;
}
.task-example-picker strong {
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.task-example-picker small {
color: #8c9994;
}
.screenshot-task-table .creator-screenshot-link {
white-space: nowrap;
}
.admin-result-gallery {
display: flex;
min-width: 150px;
align-items: center;
flex-wrap: wrap;
gap: 5px;
}
.admin-result-gallery a,
.admin-result-gallery button {
display: block;
width: 42px;
height: 42px;
padding: 0;
overflow: hidden;
border: 1px solid #dce5e0;
border-radius: 8px;
background: #f4f7f5;
cursor: zoom-in;
}
.admin-result-gallery img {
width: 100%;
height: 100%;
display: block;
object-fit: cover;
}
.admin-result-gallery > span {
color: #74817c;
font-size: 8px;
white-space: nowrap;
}
@media (max-width: 760px) {
.task-type-picker {
grid-template-columns: 1fr;
}
}
.sidebar {
position: fixed;
inset: 0 auto 0 0;
@@ -1566,6 +1708,22 @@ a {
font-size: 11px;
}
.resource-heading-actions {
display: flex;
align-items: center;
justify-content: flex-end;
flex-wrap: wrap;
gap: 8px;
}
.resource-heading-actions > a {
text-decoration: none;
}
.resource-heading-actions .filter-chips {
margin-left: 4px;
}
.resource-toolbar {
display: flex;
align-items: center;
@@ -1658,6 +1816,224 @@ a {
font-size: 11px;
}
.resource-import-modal {
width: min(780px, calc(100vw - 32px));
max-height: min(86vh, 820px);
overflow-y: auto;
}
.import-guide-strip {
display: grid;
grid-template-columns: auto auto 1fr auto auto 1fr auto auto;
align-items: center;
gap: 9px;
margin-bottom: 18px;
padding: 12px 14px;
border-radius: 11px;
color: #687773;
background: #f4f8f5;
}
.import-guide-strip > span {
display: grid;
width: 24px;
height: 24px;
place-items: center;
border-radius: 8px;
color: var(--green-deep);
background: #dff0e9;
font-size: 10px;
font-weight: 750;
}
.import-guide-strip p {
margin: 0;
font-size: 10px;
white-space: nowrap;
}
.import-guide-strip i {
height: 1px;
background: #d5e0db;
}
.resource-import-dropzone {
position: relative;
display: flex;
min-height: 116px;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 7px;
border: 1px dashed #9dc9b9;
border-radius: 13px;
color: var(--green-deep);
background: #f8fcfa;
cursor: pointer;
}
.resource-import-dropzone:hover {
border-color: var(--green);
background: #f2faf6;
}
.resource-import-dropzone input {
position: absolute;
width: 1px;
height: 1px;
opacity: 0;
pointer-events: none;
}
.resource-import-dropzone strong {
max-width: 88%;
overflow: hidden;
font-size: 13px;
text-overflow: ellipsis;
white-space: nowrap;
}
.resource-import-dropzone span {
color: #8a9893;
font-size: 9px;
}
.import-template-note {
display: flex;
align-items: center;
justify-content: space-between;
gap: 18px;
margin-top: 12px;
padding: 12px 14px;
border: 1px solid #edf0ee;
border-radius: 11px;
}
.import-template-note > div {
display: flex;
flex-direction: column;
gap: 4px;
}
.import-template-note strong {
font-size: 10px;
}
.import-template-note span {
color: #8b9692;
font-size: 9px;
}
.import-template-note a {
flex: 0 0 auto;
text-decoration: none;
}
.resource-import-preview {
margin-top: 14px;
}
.import-summary-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 8px;
}
.import-summary-grid > div {
display: flex;
min-height: 58px;
align-items: center;
justify-content: space-between;
padding: 0 14px;
border: 1px solid #e7ece9;
border-radius: 10px;
background: #fafbf9;
}
.import-summary-grid span {
color: #87938f;
font-size: 9px;
}
.import-summary-grid strong {
font-size: 19px;
}
.import-summary-grid .create strong { color: var(--green); }
.import-summary-grid .update strong { color: #4c7890; }
.import-summary-grid .error strong { color: #c86548; }
.import-preview-table {
margin-top: 12px;
overflow: hidden;
border: 1px solid #e8ece9;
border-radius: 11px;
}
.import-preview-row {
display: grid;
grid-template-columns: 48px 1.4fr 1fr 1.15fr 1.15fr;
min-height: 50px;
align-items: center;
border-top: 1px solid #edf0ee;
font-size: 9px;
}
.import-preview-row.head {
min-height: 36px;
border-top: 0;
color: #8c9793;
background: #f6f8f6;
font-weight: 650;
}
.import-preview-row > span {
min-width: 0;
padding: 8px 10px;
overflow-wrap: anywhere;
}
.import-preview-row > span:not(:last-child) {
border-right: 1px solid #f0f2f1;
}
.import-preview-row strong,
.import-preview-row small {
display: block;
}
.import-preview-row small {
margin-top: 3px;
color: #9aa39f;
font-size: 8px;
}
.import-result {
color: #557269;
font-weight: 650;
}
.import-result.create { color: var(--green); }
.import-result.update { color: #47778d; }
.import-result.error { color: #bd644b; font-weight: 520; }
.import-preview-more {
margin: 8px 0 0;
color: #919c98;
font-size: 9px;
text-align: right;
}
.form-error {
margin-top: 12px;
padding: 10px 12px;
border: 1px solid #f0d5cc;
border-radius: 9px;
color: #a95037;
background: #fff7f3;
font-size: 10px;
}
.resource-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
@@ -1905,27 +2281,19 @@ a {
.recovery-title-link {
display: inline-flex;
align-items: center;
gap: 5px;
max-width: 310px;
color: #182822;
color: #168565;
text-decoration: none;
vertical-align: top;
cursor: pointer;
}
.recovery-title-link strong {
min-width: 0;
}
.recovery-title-link::after {
content: "↗";
flex: none;
color: #2b9875;
font-size: 10px;
font-weight: 700;
}
.recovery-title-link:hover strong {
color: #168565;
color: #116d54;
text-decoration: underline;
text-underline-offset: 3px;
}
@@ -2038,15 +2406,178 @@ a {
}
.creator-screenshot-link {
position: relative;
width: 72px;
height: 56px;
padding: 0;
overflow: hidden;
border: 1px solid #dce5e0;
border-radius: 8px;
color: var(--green-deep);
background: #f4f7f5;
font-size: 8px;
font-weight: 700;
text-decoration: none;
cursor: zoom-in;
}
.creator-screenshot-link:hover {
text-decoration: underline;
text-underline-offset: 3px;
border-color: #9fc9b8;
}
.creator-screenshot-link img {
width: 100%;
height: 100%;
display: block;
object-fit: cover;
}
.creator-screenshot-link span {
position: absolute;
right: 4px;
bottom: 4px;
padding: 3px 5px;
border-radius: 5px;
color: white;
background: rgb(17 48 39 / 0.76);
font-size: 7px;
}
.admin-image-lightbox {
position: fixed;
z-index: 2000;
inset: 0;
display: grid;
place-items: center;
padding: 22px;
background: rgb(7 24 19 / 0.78);
}
.admin-image-lightbox-card {
width: min(980px, 100%);
max-height: calc(100vh - 44px);
display: flex;
overflow: hidden;
border: 1px solid rgb(255 255 255 / 0.18);
border-radius: 16px;
background: #f7faf8;
box-shadow: 0 28px 90px rgb(0 0 0 / 0.34);
flex-direction: column;
}
.admin-image-lightbox-heading {
display: flex;
min-height: 52px;
align-items: center;
justify-content: space-between;
gap: 18px;
padding: 10px 16px;
border-bottom: 1px solid #dce5e0;
}
.admin-image-lightbox-heading > div {
display: flex;
min-width: 0;
align-items: center;
gap: 10px;
}
.admin-image-lightbox-heading strong {
overflow: hidden;
color: var(--green-deep);
font-size: 10px;
text-overflow: ellipsis;
white-space: nowrap;
}
.admin-image-lightbox-heading span {
flex: 0 0 auto;
padding: 3px 7px;
border-radius: 999px;
color: #5f746b;
background: #e9f1ed;
font-size: 8px;
font-weight: 700;
}
.admin-image-lightbox-heading button {
flex: 0 0 auto;
height: 32px;
padding: 0 13px;
border: 1px solid #c7d8d0;
border-radius: 8px;
color: var(--green-deep);
background: white;
font-size: 8px;
font-weight: 700;
}
.admin-image-lightbox-stage {
position: relative;
min-height: 0;
display: grid;
flex: 1;
place-items: center;
overflow: hidden;
background: #14231e;
}
.admin-image-lightbox-stage > img {
width: 100%;
height: 100%;
min-height: 0;
max-height: calc(100vh - 108px);
display: block;
object-fit: contain;
}
.admin-image-lightbox-stage > button {
position: absolute;
z-index: 1;
top: 50%;
min-width: 58px;
height: 36px;
padding: 0 10px;
border: 1px solid rgb(255 255 255 / 0.42);
border-radius: 999px;
color: white;
background: rgb(8 31 24 / 0.78);
box-shadow: 0 6px 20px rgb(0 0 0 / 0.24);
font-size: 9px;
font-weight: 700;
transform: translateY(-50%);
transition: background 160ms ease, transform 160ms ease;
}
.admin-image-lightbox-stage > button:hover,
.admin-image-lightbox-stage > button:focus-visible {
background: rgb(23 112 83 / 0.94);
transform: translateY(-50%) scale(1.03);
}
.admin-image-lightbox-stage > button.previous {
left: 14px;
}
.admin-image-lightbox-stage > button.next {
right: 14px;
}
@media (max-width: 640px) {
.admin-image-lightbox-stage > button {
min-width: 52px;
height: 32px;
padding: 0 8px;
font-size: 8px;
}
.admin-image-lightbox-stage > button.previous {
left: 8px;
}
.admin-image-lightbox-stage > button.next {
right: 8px;
}
}
.creator-screenshot-pending,
@@ -3388,6 +3919,37 @@ label small {
justify-content: space-between;
}
.resource-heading-actions {
width: 100%;
justify-content: flex-start;
}
.resource-heading-actions .filter-chips {
width: 100%;
margin: 4px 0 0;
overflow-x: auto;
}
.import-guide-strip {
grid-template-columns: auto 1fr;
}
.import-guide-strip i {
display: none;
}
.import-summary-grid {
grid-template-columns: repeat(2, 1fr);
}
.import-preview-table {
overflow-x: auto;
}
.import-preview-row {
min-width: 620px;
}
.collection-schedule-panel {
padding: 18px;
}