Выпущен 0.1.3: UX convenience pack, unwrap/admin polish и cache-bust статики.
devops-tools/wrapped/wrapped-build/pipeline/head There was a failure building this commit

Добавлены Share/QR PNG, zip all, size meter, PWA-manifest, системная тема и haptic на copy; улучшены success/unwrap и статистика админки (EN/RU).
This commit is contained in:
2026-07-29 11:33:21 +03:00
parent 49df683281
commit 806f2bdb1b
26 changed files with 1317 additions and 136 deletions
+414 -10
View File
@@ -113,6 +113,7 @@ html[data-theme="light"] body {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
padding: 0.85rem 0.75rem;
max-width: none;
width: 100%;
@@ -262,6 +263,14 @@ html[data-theme="dark"] .icon-btn:hover {
.result-panel > .success-callout {
justify-self: stretch;
}
.result-actions {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.result-panel > .success-trust {
margin: 0;
}
.success-panel {
justify-items: stretch;
text-align: left;
@@ -273,6 +282,149 @@ html[data-theme="dark"] .icon-btn:hover {
.success-panel > .btn.ghost {
justify-self: center;
}
.success-layout {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 1.25rem 1.5rem;
align-items: start;
min-width: 0;
}
.success-main {
display: grid;
gap: 0.55rem;
min-width: 0;
}
.success-main > label {
margin-top: 0.35rem;
}
.success-password-block {
display: grid;
gap: 0.45rem;
margin-bottom: 0.35rem;
}
.success-password-badge {
display: inline-flex;
align-items: center;
gap: 0.45rem;
width: fit-content;
max-width: 100%;
margin: 0;
padding: 0.4rem 0.7rem;
border-radius: 10px;
border: 1px solid rgba(61, 214, 198, 0.35);
background: rgba(61, 214, 198, 0.1);
color: var(--accent-2);
font-size: 0.82rem;
font-weight: 650;
}
.success-password-hint {
margin: 0;
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;
}
.size-meter.is-warn {
color: #e8a838;
}
.size-meter.is-over {
color: var(--danger);
}
.success-qr {
display: grid;
justify-items: center;
gap: 0.45rem;
padding: 0.85rem;
border: 1px solid var(--line);
border-radius: 16px;
background: var(--panel);
min-width: 0;
}
.share-qr {
width: 180px;
height: 180px;
display: grid;
place-items: center;
background: #fff;
border-radius: 12px;
padding: 0.5rem;
box-sizing: border-box;
}
.share-qr img,
.share-qr canvas {
display: block;
max-width: 100%;
height: auto;
}
.success-qr-hint {
margin: 0;
text-align: center;
font-size: 0.78rem;
max-width: 11rem;
line-height: 1.35;
}
@media (max-width: 860px) {
.success-layout {
grid-template-columns: 1fr;
}
.success-qr {
order: -1;
justify-self: center;
width: min(100%, 280px);
}
.share-qr {
width: min(220px, 70vw);
height: min(220px, 70vw);
}
.copy-row {
grid-template-columns: 1fr;
}
.copy-row .btn {
width: 100%;
}
}
.success-callout {
display: flex;
align-items: center;
@@ -441,12 +593,28 @@ input, select, textarea, .code-input {
}
.lang-modal-panel {
width: min(480px, 100%);
display: flex;
flex-direction: column;
overflow: hidden;
}
.lang-modal-panel .modal-title,
.lang-modal-panel .modal-message,
.lang-modal-panel .modal-actions {
flex-shrink: 0;
}
.lang-modal-panel .modal-message {
margin-bottom: 0.75rem;
}
.lang-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.45rem;
margin-bottom: 1rem;
margin-bottom: 0.85rem;
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
}
@media (max-width: 520px) {
.lang-grid { grid-template-columns: 1fr; }
@@ -947,6 +1115,110 @@ html[data-theme="light"] .about-version {
transform: none;
}
.item-card img,
.item-preview-img {
display: block;
max-width: 100%;
width: auto;
height: auto;
border-radius: 10px;
margin-top: 0.65rem;
cursor: zoom-in;
}
.item-preview-hint {
margin: 0.4rem 0 0;
font-size: 0.78rem;
}
.unwrap-state {
display: grid;
justify-items: center;
gap: 0.75rem;
text-align: center;
padding: 1.5rem 0.5rem 0.5rem;
min-width: 0;
}
.unwrap-state.hidden {
display: none;
}
.unwrap-state-icon {
width: 64px;
height: 64px;
display: grid;
place-items: center;
border-radius: 18px;
border: 1px solid rgba(110, 168, 255, 0.25);
background: linear-gradient(160deg, rgba(110, 168, 255, 0.14), rgba(13, 20, 32, 0.35));
color: var(--accent-2);
font-size: 1.45rem;
}
html[data-theme="light"] .unwrap-state-icon {
background: linear-gradient(160deg, rgba(47, 111, 237, 0.12), rgba(255, 255, 255, 0.9));
}
.unwrap-state h2 {
margin: 0;
font-size: 1.35rem;
font-weight: 650;
max-width: 22rem;
line-height: 1.25;
}
.unwrap-state .lede {
margin: 0;
max-width: 28rem;
}
.unwrap-state .btn {
margin-top: 0.35rem;
}
.image-lightbox {
position: fixed;
inset: 0;
z-index: 1100;
display: grid;
grid-template-rows: auto 1fr auto;
align-items: center;
justify-items: center;
gap: 0.75rem;
padding: max(0.75rem, env(safe-area-inset-top, 0px))
max(0.75rem, env(safe-area-inset-right, 0px))
max(0.75rem, env(safe-area-inset-bottom, 0px))
max(0.75rem, env(safe-area-inset-left, 0px));
background: rgba(6, 10, 18, 0.88);
backdrop-filter: blur(6px);
}
.image-lightbox.hidden {
display: none;
}
.image-lightbox-close {
justify-self: end;
width: 42px;
height: 42px;
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.18);
background: rgba(20, 28, 42, 0.7);
color: #fff;
cursor: pointer;
display: grid;
place-items: center;
}
.image-lightbox img {
max-width: min(100%, 960px);
max-height: min(78dvh, 78vh);
width: auto;
height: auto;
object-fit: contain;
border-radius: 12px;
cursor: default;
}
.image-lightbox-caption {
margin: 0;
color: rgba(255, 255, 255, 0.85);
font-size: 0.9rem;
text-align: center;
max-width: 90vw;
word-break: break-word;
}
.items {
display: grid;
gap: 1rem;
@@ -1000,11 +1272,6 @@ html[data-theme="light"] .item-card pre,
html[data-theme="light"] .item-card .item-text-pre {
background: rgba(16, 32, 56, 0.05);
}
.item-card img {
max-width: 100%;
border-radius: 8px;
margin-top: 0.6rem;
}
/* Admin */
.admin-body { min-height: 100vh; }
@@ -1074,6 +1341,15 @@ html[data-theme="light"] .item-card .item-text-pre {
margin: 0;
font-size: 0.82rem;
}
.admin-top-tools {
display: flex;
align-items: center;
gap: 0.45rem;
flex-shrink: 0;
}
.admin-nav-toggle {
display: none;
}
.admin-top-right {
display: flex;
align-items: center;
@@ -1099,6 +1375,10 @@ html[data-theme="light"] .item-card .item-text-pre {
backdrop-filter: blur(12px);
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.12);
}
.admin-nav-logout-form {
display: inline;
margin: 0;
}
.admin-nav-link {
display: inline-flex;
align-items: center;
@@ -1142,6 +1422,113 @@ html[data-theme="light"] .item-card .item-text-pre {
html[data-theme="light"] .admin-nav {
box-shadow: 0 8px 24px rgba(20, 40, 70, 0.08);
}
@media (max-width: 860px) {
.admin-top {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
grid-template-areas:
"brand tools"
"nav nav";
align-items: center;
gap: 0.55rem 0.65rem;
padding: 0.7rem 0.65rem;
}
.admin-top > .brand {
grid-area: brand;
min-width: 0;
}
.admin-top-tools {
grid-area: tools;
}
.admin-top .brand-tagline {
max-width: 42vw;
}
.admin-nav-toggle {
display: grid;
}
.admin-nav {
grid-area: nav;
display: none;
flex-direction: column;
flex-wrap: nowrap;
align-items: stretch;
width: 100%;
max-height: min(70dvh, 28rem);
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
padding: 0.4rem;
gap: 0.2rem;
}
.admin-top.is-nav-open .admin-nav {
display: flex;
}
.admin-nav-link {
width: 100%;
justify-content: flex-start;
padding: 0.7rem 0.85rem;
font-size: 0.92rem;
}
.admin-nav-logout-form {
display: block;
width: 100%;
}
.admin-nav-logout-form .admin-nav-link {
width: 100%;
}
.admin-shell {
padding: 0 0.65rem 2rem;
}
.admin-shell > h1 {
font-size: 1.35rem;
margin-bottom: 0.75rem;
}
.admin-tablist {
flex-wrap: nowrap;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior-x: contain;
scrollbar-width: thin;
}
.admin-tab {
flex: 0 0 auto;
}
.admin-tabpanel {
padding: 0.9rem;
}
.audit-filters {
display: grid;
grid-template-columns: 1fr;
align-items: stretch;
}
.audit-field,
.audit-field-grow {
min-width: 0;
width: 100%;
}
.audit-filter-btn {
width: 100%;
height: auto;
min-height: 42px;
}
.audit-table {
min-width: 720px;
}
.admin-login-toggles {
top: max(0.75rem, env(safe-area-inset-top, 0px));
right: max(0.75rem, env(safe-area-inset-right, 0px));
}
}
@media (min-width: 861px) {
.admin-top > .brand {
flex: 0 0 auto;
}
.admin-nav {
margin-left: auto;
}
}
.danger-page {
max-width: 520px;
}
@@ -1262,12 +1649,9 @@ html[data-theme="light"] .admin-nav {
}
.stats-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 0.75rem;
}
@media (max-width: 1100px) {
.stats-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 620px) {
.stats-grid { grid-template-columns: 1fr; }
}
@@ -1643,6 +2027,11 @@ body.modal-open {
display: grid;
place-items: center;
padding: 1.25rem;
/* iOS: безопасные отступы от notch / home indicator */
padding: max(0.75rem, env(safe-area-inset-top, 0px))
max(0.75rem, env(safe-area-inset-right, 0px))
max(0.75rem, env(safe-area-inset-bottom, 0px))
max(0.75rem, env(safe-area-inset-left, 0px));
}
.modal-root.hidden {
display: none;
@@ -1659,6 +2048,10 @@ html[data-theme="light"] .modal-backdrop {
.modal-panel {
position: relative;
width: min(420px, 100%);
max-height: calc(100vh - 1.5rem);
overflow-y: auto;
-webkit-overflow-scrolling: touch;
overscroll-behavior: contain;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 16px;
@@ -1666,6 +2059,17 @@ html[data-theme="light"] .modal-backdrop {
padding: 1.35rem 1.4rem 1.25rem;
animation: modal-in 0.18s ease-out;
}
@supports (height: 100dvh) {
.modal-panel {
max-height: calc(100dvh - 1.5rem);
}
}
/* Список языков: скролл внутри сетки, заголовок и Cancel остаются на экране */
.modal-panel.lang-modal-panel {
overflow: hidden;
display: flex;
flex-direction: column;
}
@keyframes modal-in {
from { opacity: 0; transform: translateY(8px) scale(0.98); }
to { opacity: 1; transform: none; }