From fd0bf89e9ebc8ddbaa4ae431c0b221724984fc39 Mon Sep 17 00:00:00 2001 From: Sergey Antropoff Date: Wed, 29 Jul 2026 14:15:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20VERSION=20=D0=B4=D0=BE=200.1.3;=20=D1=83=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=20=D0=B0=D0=B2=D1=82=D0=BE-bump=20=D0=B8?= =?UTF-8?q?=D0=B7=20make=20push.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Упрощён экран «Токен выдан»: чеклист/trust убраны, Share и Download QR — иконки под QR. --- Jenkinsfile | 2 +- Makefile | 6 +-- README.md | 6 +-- VERSION | 2 +- app/static/css/app.css | 96 +++++++++++++++++++++++---------------- app/static/js/create.js | 3 -- app/templates/create.html | 30 ++++++------ helm/wrapped/Chart.yaml | 4 +- helm/wrapped/values.yaml | 2 +- pyproject.toml | 2 +- 10 files changed, 82 insertions(+), 71 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 4aa6111..942c00e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,7 +5,7 @@ // 2) при успехе — trigger Deploy с wait:false и agent none → Builder-под умирает // 3) Deploy стартует отдельно уже без Builder // -// Версия образа = VERSION из коммита. Bump: make bump-patch / make push. +// Версия образа = VERSION из коммита (без auto-bump). Ручной bump: make bump-patch. // // Credentials (Global): // harbor-devops-tools-push-pull-access — Harbor devops-tools (robot) diff --git a/Makefile b/Makefile index 1016d1f..9246cc7 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ help: @echo " make bump-minor VERSION +0.1.0" @echo " make release Multi-arch build & push $(FULL_IMAGE)" @echo " platforms: $(RELEASE_PLATFORMS)" - @echo " make push bump-patch + git add/commit (prompt) + push" + @echo " make push git add/commit (prompt) + push (без auto-bump)" @echo " make helm-lint Lint Helm chart" @echo " make helm-package Package Helm chart" @echo " make clean Remove containers, volumes, local image" @@ -136,7 +136,7 @@ clean: -docker buildx rm $(BUILDX_BUILDER) 2>/dev/null || true rm -rf dist -# Same flow as proxmox_api_simulator / infra: bump SemVer, stage, multiline commit, push. +# Ручной SemVer (не вызывается из make push). bump-patch: @PYTHONPATH=. python3 scripts/bump_version.py patch @echo "VERSION → $$(cat VERSION)" @@ -153,7 +153,7 @@ version-commit: git commit -m "Bump version to $$(cat VERSION)."; \ fi -push: bump-patch +push: @set -e; \ git add .; \ echo "=== staged ==="; \ diff --git a/README.md b/README.md index 3ce7a5f..f027549 100644 --- a/README.md +++ b/README.md @@ -340,7 +340,7 @@ services: ### UX (v0.1.3+) -- После создания: **QR** на share-link, **скачать QR (PNG)**, **Web Share** (если есть `navigator.share`), чеклист и trust-строка про `#key`; отдельные кнопки Copy для ссылки / токена / пароля; пароль не советуется слать в той же переписке. +- После создания: **QR** на share-link, иконки **скачать QR (PNG)** и **Web Share** (если есть `navigator.share`) под QR; отдельные кнопки Copy для ссылки / токена / пароля; пароль не советуется слать в той же переписке. - Create: счётчик размера `≈ used / max` и предупреждение near-limit (сверх лимита — `create.tooLarge`). - Unwrap: Enter в поле пароля отправляет форму; после `password_required` / `bad_password` — focus+select; при ≥2 элементах — **скачать всё** (zip через JSZip); trust-строка на результате; спокойный экран «ссылка недоступна» для already used / expired (anti-enumeration); отдельные состояния для `password_locked`, rate limit, CAPTCHA, ошибки расшифровки. - Картинки после unwrap: inline-превью и **lightbox** (тап/клик). @@ -452,8 +452,8 @@ docker buildx build \ | Где | Поведение | |-----|-----------| | UI (модалка «?») | бейдж `vX.Y.Z` | -| `make bump-patch` / `bump-minor` | ручной bump | -| `make push` | автоматически `bump-patch`, затем commit/push | +| `make bump-patch` / `bump-minor` | ручной bump (по желанию) | +| `make push` | commit/push **без** auto-bump | | Jenkins (`Jenkinsfile`) | читает `VERSION` из коммита **без** доп. bump → те же теги в образе и на кластере | Что в `VERSION` запушили — то и уйдёт в Harbor/Hub/деплой (и в футер модалки внутри образа). diff --git a/VERSION b/VERSION index 845639e..b1e80bb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.4 +0.1.3 diff --git a/app/static/css/app.css b/app/static/css/app.css index 2760bea..4759abd 100644 --- a/app/static/css/app.css +++ b/app/static/css/app.css @@ -322,46 +322,6 @@ html[data-theme="dark"] .icon-btn:hover { font-size: 0.84rem; line-height: 1.4; } -.success-checklist { - list-style: none; - margin: 0; - padding: 0; - display: grid; - gap: 0.35rem; -} -.success-checklist li { - position: relative; - padding-left: 1.35rem; - color: var(--muted); - font-size: 0.88rem; - line-height: 1.4; -} -.success-checklist li::before { - content: ""; - position: absolute; - left: 0; - top: 0.35rem; - width: 0.55rem; - height: 0.55rem; - border-radius: 2px; - border: 1.5px solid var(--accent-2); - opacity: 0.85; -} -.success-trust { - margin: 0; - font-size: 0.84rem; - line-height: 1.45; -} -.success-actions { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; - margin-top: 0.35rem; -} -.success-actions .btn { - flex: 1 1 auto; - min-width: 8rem; -} .size-meter { margin: 0; font-variant-numeric: tabular-nums; @@ -381,6 +341,7 @@ html[data-theme="dark"] .icon-btn:hover { border-radius: 16px; background: var(--panel); min-width: 0; + overflow: visible; } .share-qr { width: 180px; @@ -405,6 +366,61 @@ html[data-theme="dark"] .icon-btn:hover { max-width: 11rem; line-height: 1.35; } +.success-qr-actions { + display: flex; + align-items: center; + justify-content: center; + gap: 0.4rem; + margin-top: 0.15rem; +} +.qr-action-btn { + position: relative; + width: 2.35rem; + height: 2.35rem; + border: 1px solid var(--line); + border-radius: 10px; + background: transparent; + color: var(--muted); + cursor: pointer; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0; + transition: color 0.15s, background 0.15s, border-color 0.15s; +} +.qr-action-btn:hover, +.qr-action-btn:focus-visible { + color: var(--accent-2); + background: rgba(75, 134, 240, 0.1); + border-color: rgba(75, 134, 240, 0.35); + outline: none; +} +.qr-action-btn:active { + transform: scale(0.96); +} +.qr-action-btn .ui-tooltip { + left: 50%; + right: auto; + bottom: calc(100% + 0.5rem); + transform: translateX(-50%) translateY(4px); + white-space: nowrap; +} +.qr-action-btn .ui-tooltip::after { + left: 50%; + right: auto; + transform: translateX(-50%); +} +.qr-action-btn:hover .ui-tooltip, +.qr-action-btn:focus-visible .ui-tooltip { + opacity: 1; + visibility: visible; + transform: translateX(-50%); +} +.success-panel > .expires-meta { + width: 100%; + justify-self: stretch; + margin-top: 0.15rem; +} @media (max-width: 860px) { .success-layout { grid-template-columns: 1fr; diff --git a/app/static/js/create.js b/app/static/js/create.js index 086a213..20d8378 100644 --- a/app/static/js/create.js +++ b/app/static/js/create.js @@ -31,7 +31,6 @@ expiresMeta: document.getElementById("expires-meta"), captchaSlot: document.getElementById("captcha-slot"), sizeMeter: document.getElementById("size-meter"), - checkPasswordItem: document.getElementById("check-password-item"), shareNative: document.getElementById("share-native"), downloadQr: document.getElementById("download-qr"), }; @@ -334,11 +333,9 @@ if (password) { els.sharePassword.value = password; els.passwordBlock.classList.remove("hidden"); - els.checkPasswordItem?.classList.remove("hidden"); } else { els.sharePassword.value = ""; els.passwordBlock.classList.add("hidden"); - els.checkPasswordItem?.classList.add("hidden"); } renderShareQr(link); syncShareControls(); diff --git a/app/templates/create.html b/app/templates/create.html index ac900ea..6417a9f 100644 --- a/app/templates/create.html +++ b/app/templates/create.html @@ -66,15 +66,6 @@ - -

- The encryption key lives only in the link #fragment — the server never sees it. -

-
- -
- - -
- -

Scan to open the share link

+
+ + +
+

+ diff --git a/helm/wrapped/Chart.yaml b/helm/wrapped/Chart.yaml index d47b2d8..27626d8 100644 --- a/helm/wrapped/Chart.yaml +++ b/helm/wrapped/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: wrapped description: Zero-knowledge one-time encrypted drop (Wrapped) type: application -version: 0.1.4 -appVersion: "0.1.4" +version: 0.1.3 +appVersion: "0.1.3" diff --git a/helm/wrapped/values.yaml b/helm/wrapped/values.yaml index 8b38239..e41a7cd 100644 --- a/helm/wrapped/values.yaml +++ b/helm/wrapped/values.yaml @@ -2,7 +2,7 @@ replicaCount: 1 image: repository: inecs/wrapped - tag: "0.1.4" + tag: "0.1.3" pullPolicy: IfNotPresent service: diff --git a/pyproject.toml b/pyproject.toml index 7d23783..a85b050 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "wrapped" -version = "0.1.4" +version = "0.1.3" description = "Zero-knowledge one-time encrypted drop service" readme = "README.md" requires-python = ">=3.12"