/
webru
/
prisma-ui
Обзор
Документация
Войти
/
webru
/
prisma-ui
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
ops-datetime.css
305 строк
7 KB
webru
Add calendar and 24h time picker dropdowns for date/time fields.
14 июн 2026, 14:06
14 июн 2026, 14:06
5b1b4b2
Код
Авторство
О чём код?
/** * Prisma UI — Date & time pickers (calendar + 24h time selector) * Requires ops-tokens.css. Format: dd.mm.yyyy, HH:MM[:SS] */ /* ── Shared picker wrap ───────────────────────────────────────────── */ .ops-datepick, .ops-timepick { position: relative; display: block; width: 100%; } .ops-datepick.ops-input--filter, .ops-timepick.ops-input--filter { width: auto; min-width: 132px; } .ops-datepick__field, .ops-timepick__field { position: relative; display: flex; align-items: stretch; } .ops-datepick__field .ops-input, .ops-timepick__field .ops-input { padding-right: 30px; } .ops-datepick__btn, .ops-timepick__btn { position: absolute; top: 1px; right: 1px; bottom: 1px; width: 28px; display: flex; align-items: center; justify-content: center; padding: 0; border: none; border-left: 1px solid var(--border-subtle); border-radius: 0 var(--radius-sm) var(--radius-sm) 0; background: var(--panel-2); color: var(--muted); font-size: 0.78rem; cursor: pointer; transition: color 0.12s ease, background 0.12s ease; } .ops-datepick__btn:hover, .ops-timepick__btn:hover { color: var(--accent-soft-text); background: rgba(59, 130, 246, 0.08); } .ops-datepick.is-open .ops-datepick__btn, .ops-timepick.is-open .ops-timepick__btn { color: var(--accent-soft-text); box-shadow: inset 0 0 8px var(--accent-glow); } /* ── Glass panel (shared) ───────────────────────────────────────── */ .ops-datepick__panel, .ops-timepick__panel { position: fixed; z-index: 1200; padding: 8px; border: 1px solid rgba(59, 130, 246, 0.22); border-radius: var(--radius-md); background: var(--surface-dropdown); backdrop-filter: blur(16px) saturate(1.25); -webkit-backdrop-filter: blur(16px) saturate(1.25); box-shadow: var(--shadow-modal), inset 0 1px 0 rgba(255, 255, 255, 0.06); opacity: 0; visibility: hidden; transform: translateY(-4px); transition: opacity 0.14s ease, transform 0.14s ease, visibility 0.14s ease; pointer-events: none; } [data-theme="light"] .ops-datepick__panel, [data-theme="light"] .ops-timepick__panel { border-color: rgba(37, 99, 235, 0.18); box-shadow: var(--shadow-modal), inset 0 1px 0 rgba(255, 255, 255, 0.85); } .ops-datepick.is-open .ops-datepick__panel, .ops-timepick.is-open .ops-timepick__panel { opacity: 1; visibility: visible; transform: translateY(0); pointer-events: auto; } /* ── Calendar ───────────────────────────────────────────────────── */ .ops-cal__head { display: flex; align-items: center; justify-content: space-between; gap: 6px; margin-bottom: 8px; } .ops-cal__title { font-size: 0.76rem; font-weight: 600; color: var(--text); text-transform: capitalize; } .ops-cal__nav { width: 26px; height: 24px; padding: 0; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-control); color: var(--muted); font-size: 0.85rem; cursor: pointer; } .ops-cal__nav:hover { color: var(--text); border-color: var(--accent); } .ops-cal__weekdays { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; margin-bottom: 4px; } .ops-cal__weekday { padding: 4px 0; font-size: 0.62rem; font-weight: 700; text-align: center; text-transform: uppercase; letter-spacing: 0.04em; color: var(--muted); } .ops-cal__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; } .ops-cal__day { min-width: 30px; min-height: 28px; padding: 0; border: 1px solid transparent; border-radius: var(--radius-sm); background: transparent; color: var(--muted); font-family: var(--mono-datetime); font-size: 0.72rem; font-variant-numeric: tabular-nums lining-nums; cursor: pointer; transition: color 0.12s ease, text-shadow 0.12s ease; } .ops-cal__day:hover:not(:disabled) { color: var(--accent-soft-text); text-shadow: 0 0 10px var(--accent-glow); } .ops-cal__day.is-selected { color: var(--accent-soft-text); font-weight: 600; } .ops-cal__day.is-today { border-color: rgba(59, 130, 246, 0.35); } .ops-cal__day.is-outside { opacity: 0.35; } .ops-cal__day:disabled { opacity: 0.2; cursor: default; } .ops-cal__foot { display: flex; justify-content: space-between; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border-subtle); } .ops-cal__foot-btn { padding: 4px 8px; border: none; border-radius: var(--radius-sm); background: transparent; color: var(--muted); font-family: inherit; font-size: 0.7rem; cursor: pointer; } .ops-cal__foot-btn:hover { color: var(--accent-soft-text); text-shadow: 0 0 8px var(--accent-glow); } /* ── Time selector ────────────────────────────────────────────────── */ .ops-timepick__panel { min-width: 160px; } .ops-timepick__cols { display: flex; gap: 4px; } .ops-timepick__col { flex: 1; max-height: 180px; overflow-y: auto; padding: 2px; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); background: rgba(0, 0, 0, 0.12); } [data-theme="light"] .ops-timepick__col { background: rgba(255, 255, 255, 0.5); } .ops-timepick__col-label { padding: 4px 6px; font-size: 0.6rem; font-weight: 700; letter-spacing: 0.06em; text-align: center; text-transform: uppercase; color: var(--muted); border-bottom: 1px solid var(--border-subtle); } .ops-timepick__val { display: block; width: 100%; padding: 6px 4px; border: none; border-radius: var(--radius-sm); background: transparent; color: var(--muted); font-family: var(--mono-datetime); font-size: 0.76rem; font-variant-numeric: tabular-nums lining-nums; text-align: center; cursor: pointer; transition: color 0.12s ease, text-shadow 0.12s ease; } .ops-timepick__val:hover, .ops-timepick__val.is-focused { color: var(--accent-soft-text); text-shadow: 0 0 10px var(--accent-glow); } .ops-timepick__val.is-selected { color: var(--text); font-weight: 600; } .ops-timepick__foot { display: flex; justify-content: flex-end; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border-subtle); } /* ── Datetime pair ────────────────────────────────────────────────── */ .ops-datetime-pair { display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-end; } .ops-datetime-pair .ops-datepick, .ops-datetime-pair .ops-timepick { flex: 1; min-width: 120px; }