Files
sky_phone/frontend/src/ui/foundation.css
T
2026-08-16 15:23:21 +02:00

953 lines
20 KiB
CSS

.sky-ui-provider,
.sky-app {
min-width: 0;
min-height: 0;
color: var(--sky-text);
font-family: var(--sky-font-family);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-tap-highlight-color: transparent;
-webkit-text-size-adjust: 100%;
}
.sky-app {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
background: var(--sky-bg);
}
.sky-app-page {
--sky-page-collapse-offset: 0px;
position: relative;
isolation: isolate;
width: 100%;
height: 100%;
min-width: 0;
min-height: 0;
display: flex;
flex-direction: column;
overflow: hidden;
background: var(--sky-bg);
color: var(--sky-text);
font-family: var(--sky-font-family);
-webkit-font-smoothing: antialiased;
-webkit-tap-highlight-color: transparent;
}
.sky-app-page__backdrop {
position: absolute;
z-index: -1;
inset: 0;
background: var(--sky-bg);
pointer-events: none;
}
.sky-navbar {
--sky-navbar-collapse-offset: 0px;
--sky-navbar-compact-title-opacity: 0;
--sky-navbar-extended-title-opacity: 1;
--sky-navbar-safe-area-top: max(16px, var(--sky-safe-area-top));
position: relative;
z-index: 10;
box-sizing: border-box;
min-width: 0;
min-height: calc(var(--sky-navbar-safe-area-top) + var(--sky-navbar-height));
padding-top: var(--sky-navbar-safe-area-top);
flex: none;
color: var(--sky-text);
background: transparent;
}
.sky-navbar__blur,
.sky-navbar__background {
position: absolute;
z-index: -1;
top: 0;
right: 0;
left: 0;
height: calc(
var(--sky-navbar-safe-area-top) + var(--sky-navbar-height) + 16px
);
pointer-events: none;
}
.sky-navbar__blur {
background: transparent;
}
.sky-navbar__background {
background: linear-gradient(
to bottom,
var(--sky-navbar-glass, var(--sky-bg)) 0%,
transparent 100%
);
}
.sky-navbar--transparent .sky-navbar__heading {
opacity: var(--sky-navbar-compact-title-opacity);
}
.sky-navbar--outline::after {
position: absolute;
right: 0;
bottom: 0;
left: 0;
height: 1px;
content: '';
background: var(--sky-hairline);
transform: translateY(calc(0px - var(--sky-navbar-collapse-offset)))
scaleY(var(--sky-hairline-scale));
transform-origin: center bottom;
}
.sky-navbar--with-subnavbar .sky-navbar__blur,
.sky-navbar--with-subnavbar .sky-navbar__background {
height: calc(
var(--sky-navbar-safe-area-top) + var(--sky-navbar-height) + 70px + 16px
);
}
.sky-navbar__inner {
box-sizing: border-box;
width: 100%;
min-width: 0;
height: var(--sky-navbar-height);
padding-right: calc(var(--sky-page-gutter) + var(--sky-safe-area-right));
padding-left: calc(var(--sky-page-gutter) + var(--sky-safe-area-left));
display: grid;
grid-template-columns:
minmax(var(--sky-touch-target), 1fr)
minmax(0, 2fr)
minmax(var(--sky-touch-target), 1fr);
align-items: center;
margin-bottom: var(--sky-space-3);
}
.sky-navbar--no-navigation {
padding-top: calc(
var(--sky-navbar-safe-area-top) + var(--sky-navbar-height) +
var(--sky-space-3)
);
}
.sky-navbar__left,
.sky-navbar__right {
width: max-content;
max-width: 100%;
min-width: 0;
min-height: var(--sky-navbar-height);
display: flex;
align-items: center;
overflow: hidden;
border-radius: var(--sky-radius-pill);
}
.sky-navbar__left {
grid-column: 1;
justify-self: start;
justify-content: flex-start;
}
.sky-navbar__right {
grid-column: 3;
justify-self: end;
justify-content: flex-end;
}
.sky-navbar__heading {
min-width: 0;
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
grid-column: 2;
text-align: center;
}
.sky-navbar__title {
min-width: 0;
margin: 0;
padding: 0 var(--sky-space-1);
overflow: hidden;
color: var(--sky-text);
font-size: var(--sky-font-title);
font-weight: 600;
line-height: var(--sky-navbar-height);
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
}
.sky-navbar__subtitle {
min-width: 0;
max-width: 100%;
margin: -10px 0 0;
overflow: hidden;
color: var(--sky-muted);
font-size: 14px;
font-weight: 500;
line-height: 16px;
text-align: inherit;
text-overflow: ellipsis;
white-space: nowrap;
}
.sky-navbar__back {
box-sizing: border-box;
max-width: 100%;
min-width: var(--sky-touch-target);
min-height: var(--sky-touch-target);
margin: 0;
padding: 0 16px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--sky-space-1);
border: 0;
border-radius: var(--sky-radius-pill);
appearance: none;
color: inherit;
background: transparent;
font: inherit;
cursor: pointer;
transition:
opacity 300ms ease,
transform 100ms ease;
-webkit-tap-highlight-color: transparent;
}
.sky-navbar__back-icon {
width: 12px;
height: 20px;
display: block;
flex: none;
fill: currentColor;
}
.sky-navbar__back-label {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.sky-navbar button,
.sky-navbar a {
min-width: var(--sky-touch-target);
min-height: var(--sky-touch-target);
}
.sky-navbar button:active,
.sky-navbar a:active {
opacity: 0.58;
}
.sky-navbar__back:active {
transform: scale(0.98);
transition-duration: 0ms;
}
.sky-navbar__back--surface {
width: var(--sky-touch-target);
max-width: var(--sky-touch-target);
padding: 0;
justify-content: center;
border: 0;
border-radius: 50%;
color: var(--sky-text);
background: var(--sky-glass-solid);
box-shadow: var(
--sky-shadow-glass,
inset 0 0 0 1px var(--sky-hairline),
inset 0 0 5px 1px rgba(255, 255, 255, 0.35),
0 4px 14px rgba(0, 0, 0, 0.16)
);
}
.sky-navbar--medium {
min-height: calc(
var(--sky-navbar-safe-area-top) + var(--sky-navbar-height) +
var(--sky-navbar-height)
);
}
.sky-navbar--large {
min-height: calc(
var(--sky-navbar-safe-area-top) + var(--sky-navbar-height) +
var(--sky-navbar-large-title-height)
);
}
.sky-navbar--medium,
.sky-navbar--large {
margin-bottom: calc(0px - var(--sky-navbar-collapse-offset));
pointer-events: none;
}
.sky-navbar--medium .sky-navbar__inner,
.sky-navbar--large .sky-navbar__inner,
.sky-navbar--medium .sky-navbar__subnavbar,
.sky-navbar--large .sky-navbar__subnavbar {
pointer-events: auto;
}
.sky-navbar__title-container {
box-sizing: border-box;
height: var(--sky-navbar-large-title-height);
padding-right: calc(var(--sky-page-gutter) + var(--sky-safe-area-right));
padding-left: calc(var(--sky-page-gutter) + var(--sky-safe-area-left));
display: flex;
align-items: center;
opacity: var(--sky-navbar-extended-title-opacity);
transform: translateY(calc(0px - var(--sky-navbar-collapse-offset)));
}
.sky-navbar--medium .sky-navbar__title-container {
height: var(--sky-navbar-height);
}
.sky-navbar__collapsed-heading {
position: absolute;
z-index: 1;
top: var(--sky-navbar-safe-area-top);
right: calc(var(--sky-page-gutter) + var(--sky-safe-area-right));
left: calc(var(--sky-page-gutter) + var(--sky-safe-area-left));
height: var(--sky-navbar-height);
min-width: 0;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
opacity: var(--sky-navbar-compact-title-opacity);
pointer-events: none;
}
.sky-navbar__collapsed-heading .sky-navbar__title {
line-height: var(--sky-navbar-height);
}
.sky-navbar__title-container > div {
min-width: 0;
}
.sky-navbar__title-container .sky-navbar__title {
padding: 0;
font-weight: 700;
text-align: left;
}
.sky-navbar--medium .sky-navbar__title-container .sky-navbar__title {
font-size: var(--sky-font-medium-title);
line-height: 32px;
}
.sky-navbar--large .sky-navbar__title-container .sky-navbar__title {
font-size: var(--sky-font-large-title);
line-height: 42px;
}
.sky-navbar__title-container .sky-navbar__subtitle {
margin: -2px 0 0;
text-align: left;
}
.sky-navbar__subnavbar {
box-sizing: border-box;
width: 100%;
height: 56px;
min-height: 56px;
padding-right: calc(var(--sky-page-gutter) + var(--sky-safe-area-right));
padding-left: calc(var(--sky-page-gutter) + var(--sky-safe-area-left));
display: flex;
align-items: center;
flex: none;
}
.sky-navbar--with-subnavbar {
padding-bottom: 56px;
}
.sky-navbar--with-subnavbar .sky-navbar__subnavbar {
position: absolute;
right: 0;
bottom: 0;
left: 0;
transform: translateY(calc(0px - var(--sky-navbar-collapse-offset)));
}
.sky-scroll-area {
position: relative;
z-index: 1;
box-sizing: border-box;
min-width: 0;
min-height: 0;
padding: 0;
flex: 1 1 auto;
overflow-x: hidden;
overflow-y: auto;
overflow-anchor: none;
overscroll-behavior: contain;
touch-action: pan-y;
scrollbar-width: none;
}
.sky-scroll-area--padded {
--sky-block-gutter-left: 0px;
--sky-block-gutter-right: 0px;
--sky-block-inset-gutter: 0px;
--sky-block-outer-left: 0px;
--sky-block-outer-right: 0px;
--sky-block-strong-gutter: 16px;
--sky-card-outer-left: 0px;
--sky-card-outer-right: 0px;
--sky-list-outer-left: 0px;
--sky-list-outer-right: 0px;
--sky-title-gutter-left: 0px;
--sky-title-gutter-right: 0px;
padding: var(--sky-page-space)
calc(var(--sky-page-gutter) + var(--sky-safe-area-right))
calc(var(--sky-safe-area-bottom) + var(--sky-page-space));
padding-left: calc(var(--sky-page-gutter) + var(--sky-safe-area-left));
}
.sky-scroll-area::before {
height: var(--sky-page-collapse-offset);
display: block;
content: '';
pointer-events: none;
}
.sky-scroll-area--tabbar {
padding-bottom: calc(
var(--sky-safe-area-bottom) + var(--sky-tabbar-height) + var(--sky-space-3)
);
}
.sky-scroll-area::-webkit-scrollbar {
display: none;
}
.sky-infinite-loader {
box-sizing: border-box;
width: 100%;
height: 1px;
min-width: 0;
margin: 0;
display: grid;
place-items: center;
color: var(--sky-app-accent);
}
.sky-infinite-loader[hidden] {
display: none;
}
.sky-infinite-loader--visible {
height: auto;
min-height: var(--sky-touch-target);
margin: var(--sky-space-1) 0;
}
.sky-infinite-loader__retry.sky-link {
min-height: var(--sky-touch-target);
padding: 0 var(--sky-space-2);
border: 0;
border-radius: 0;
background: transparent;
color: var(--sky-app-accent);
font-weight: 600;
}
.sky-infinite-loader__retry.sky-link:active:not(:disabled) {
background: transparent;
opacity: 0.62;
}
.sky-scroll-rail {
box-sizing: border-box;
width: 100%;
min-width: 0;
padding: calc(var(--sky-space-1) / 2) 0;
display: flex;
align-items: center;
gap: var(--sky-space-2);
overflow-x: auto;
overflow-y: hidden;
overscroll-behavior-x: contain;
touch-action: pan-x;
scrollbar-width: none;
cursor: grab;
}
.sky-scroll-rail > * {
flex: 0 0 auto;
}
.sky-scroll-rail::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
}
.sky-scroll-rail--dragging,
.sky-scroll-rail--dragging * {
user-select: none;
cursor: grabbing;
}
.sky-widget-frame {
box-sizing: border-box;
width: 100%;
height: 100%;
min-width: 0;
min-height: 0;
display: grid;
grid-template-rows:
minmax(0, 1fr)
var(--sky-widget-label-height);
gap: var(--sky-widget-label-gap);
}
.sky-widget-frame--unlabelled {
grid-template-rows: minmax(0, 1fr);
gap: 0;
}
.sky-widget-frame__surface {
min-width: 0;
min-height: 0;
}
.sky-widget-frame__label {
min-width: 0;
height: var(--sky-widget-label-height);
overflow: hidden;
color: var(--sky-widget-label-color, #fff);
font-family:
-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', sans-serif;
font-size: 11.5px;
font-weight: 500;
letter-spacing: -0.15px;
line-height: var(--sky-widget-label-height);
text-align: center;
text-overflow: ellipsis;
text-shadow: 0 1px 4px rgb(0 0 0 / 72%);
white-space: nowrap;
pointer-events: none;
}
.sky-section {
min-width: 0;
margin: 0 0 var(--sky-space-6);
}
.sky-section__title {
margin: var(--sky-space-5) 0 var(--sky-space-2);
padding: 0;
color: var(--sky-muted);
font-size: var(--sky-font-title);
font-weight: 600;
line-height: var(--sky-space-5);
}
.sky-list-card {
min-width: 0;
margin: 0;
padding: 0;
overflow: hidden;
color: var(--sky-text);
list-style: none;
}
.sky-list-card--inset {
border-radius: var(--sky-radius-card);
}
.sky-list-card--strong {
background: var(--sky-surface);
}
.sky-list-card > li {
min-width: 0;
color: var(--sky-text);
}
.sky-list-card > li + li {
border-top: 1px solid var(--sky-hairline);
}
.sky-list-card button,
.sky-list-card a,
.sky-list-card label {
min-height: var(--sky-touch-target);
}
.sky-empty-state {
box-sizing: border-box;
min-height: 240px;
margin: var(--sky-space-3) 0;
padding: var(--sky-space-6) var(--sky-space-5);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--sky-space-2);
border: 1px solid var(--sky-hairline);
border-radius: var(--sky-radius-card);
background: var(--sky-surface);
color: var(--sky-muted);
text-align: center;
}
.sky-empty-state--compact {
min-height: 150px;
padding: var(--sky-space-5);
}
.sky-empty-state--danger .sky-empty-state__icon {
color: var(--sky-danger);
}
.sky-empty-state__icon {
min-height: 36px;
display: grid;
place-items: center;
color: var(--sky-muted);
}
.sky-empty-state__title {
color: var(--sky-text);
font-size: var(--sky-font-title);
font-weight: 650;
line-height: 21px;
}
.sky-empty-state__body {
max-width: 270px;
margin: 0;
color: var(--sky-muted);
font-size: 13px;
line-height: 18px;
}
.sky-empty-state__actions {
width: 100%;
margin-top: var(--sky-space-1);
}
.sky-empty-state__actions button,
.sky-empty-state__actions a {
width: 100%;
min-height: var(--sky-touch-target);
}
.sky-pill-navigation {
position: absolute;
z-index: 20;
right: calc(var(--sky-safe-area-right) + var(--sky-space-4));
bottom: calc(var(--sky-safe-area-bottom) + 10px);
left: calc(var(--sky-safe-area-left) + var(--sky-space-4));
box-sizing: border-box;
min-width: 0;
min-height: 56px;
pointer-events: none;
}
.sky-pill-navigation__inner {
width: 100%;
min-width: 0;
min-height: 56px;
display: flex;
align-items: center;
gap: var(--sky-space-3);
}
.sky-pill-navigation__group {
min-width: 0;
max-width: 100%;
display: flex;
pointer-events: auto;
}
.sky-pill-navigation__group > .sky-segmented {
max-width: 100%;
flex: none;
}
.sky-pill-navigation__group--end {
margin-inline-start: auto;
}
.sky-pill-navigation--full .sky-pill-navigation__group--primary {
width: 100%;
flex: 1 1 auto;
}
.sky-pill-navigation--full
.sky-pill-navigation__group--primary
> .sky-segmented {
width: 100%;
flex: 1 1 auto;
}
.sky-pill-navigation--compact .sky-pill-navigation__inner {
justify-content: center;
}
.sky-pill-navigation--compact.sky-pill-navigation--align-start
.sky-pill-navigation__inner {
justify-content: flex-start;
}
.sky-pill-navigation--compact.sky-pill-navigation--align-end
.sky-pill-navigation__inner {
justify-content: flex-end;
}
.sky-pill-navigation--split .sky-pill-navigation__inner {
justify-content: space-between;
}
.sky-pill-navigation--compact .sky-segmented-button,
.sky-pill-navigation--split .sky-segmented-button {
width: 60px;
flex: 0 0 60px;
}
.sky-tabbar {
--sky-tabbar-pane-height: 48px;
position: absolute;
z-index: 20;
right: 0;
bottom: 0;
left: 0;
box-sizing: border-box;
min-height: calc(
var(--sky-safe-area-bottom) + var(--sky-tabbar-pane-height) + 16px
);
display: flex;
justify-content: center;
padding-right: calc(var(--sky-safe-area-right) + 16px);
padding-bottom: calc(var(--sky-safe-area-bottom) + 16px);
padding-left: calc(var(--sky-safe-area-left) + 16px);
color: var(--sky-text);
}
.sky-tabbar--icons.sky-tabbar--labels {
--sky-tabbar-pane-height: 64px;
}
.sky-tabbar__blur,
.sky-tabbar__background {
width: 100%;
height: calc(
var(--sky-safe-area-bottom) + var(--sky-tabbar-pane-height) + 32px
);
position: absolute;
bottom: 0;
left: 0;
pointer-events: none;
}
.sky-tabbar__blur {
display: none;
}
.sky-tabbar__background {
background: linear-gradient(to top, var(--sky-bg), transparent);
}
.sky-tabbar__inner {
width: 100%;
min-width: 0;
height: var(--sky-tabbar-pane-height);
position: relative;
}
.sky-tabbar__pane {
width: 100%;
min-width: 0;
height: 100%;
overflow: hidden;
border: 0;
border-radius: var(--sky-radius-pill);
}
.sky-tabbar__links {
width: 100%;
height: 100%;
min-width: 0;
position: relative;
z-index: 1;
display: flex;
align-items: stretch;
}
.sky-tabbar__links > .sky-toolbar-pane {
width: 100%;
height: 100%;
min-width: 0;
display: flex;
align-items: stretch;
border-radius: inherit;
background: transparent;
box-shadow: none;
}
.sky-tabbar__links > .sky-toolbar-pane::after {
display: none;
}
.sky-tabbar__links > .sky-toolbar-pane > .sky-tab-button {
min-width: 0;
min-height: var(--sky-tabbar-pane-height);
flex: 1 1 0;
}
.sky-tabbar__highlight {
height: 100%;
position: absolute;
z-index: 0;
top: 0;
left: 0;
border-radius: inherit;
pointer-events: none;
transition: transform 300ms ease;
}
[dir='rtl'] .sky-tabbar__highlight,
.sky-tabbar[dir='rtl'] .sky-tabbar__highlight {
right: 0;
left: auto;
}
.sky-tabbar__highlight-inner,
.sky-tabbar__highlight-thumb {
position: absolute;
inset: 4px;
border-radius: inherit;
pointer-events: none;
transition:
opacity 300ms ease,
transform 300ms ease;
}
.sky-tabbar__highlight-inner {
background: var(--sky-tabbar-highlight-background, rgba(0, 0, 0, 0.1));
}
.sky-tabbar__highlight-thumb {
background: var(--sky-tabbar-thumb-background, rgba(0, 0, 0, 0.05));
box-shadow: var(--sky-shadow-glass-thumb);
opacity: 0;
}
.sky-tabbar__highlight--pressed .sky-tabbar__highlight-inner {
opacity: 0;
transform: scale(1.4);
}
.sky-tabbar__highlight--pressed .sky-tabbar__highlight-thumb {
opacity: 1;
transform: scale(1.4);
}
.sky-tabbar__links > button,
.sky-tabbar__links > a {
box-sizing: border-box;
min-width: 0;
min-height: var(--sky-tabbar-pane-height);
margin: 0;
padding: 4px 8px;
display: flex;
align-items: center;
justify-content: center;
flex: 1 1 0;
overflow: hidden;
border: 0;
border-radius: 0;
appearance: none;
color: inherit;
background: transparent;
font: inherit;
text-decoration: none;
cursor: pointer;
transition:
background-color 200ms ease,
color 200ms ease,
opacity 200ms ease,
transform 200ms ease;
-webkit-tap-highlight-color: transparent;
}
@supports (
(-webkit-backdrop-filter: blur(2px)) or (backdrop-filter: blur(2px))
) {
.sky-navbar__back--surface {
background: var(--sky-glass);
-webkit-backdrop-filter: blur(16px);
backdrop-filter: blur(16px);
}
.sky-tabbar__blur {
display: block;
-webkit-backdrop-filter: blur(2px);
backdrop-filter: blur(2px);
-webkit-mask-image: linear-gradient(transparent 0%, #000 50%, #000 100%);
mask-image: linear-gradient(transparent 0%, #000 50%, #000 100%);
}
}
@supports (
((-webkit-backdrop-filter: blur(2px)) or (backdrop-filter: blur(2px))) and
(
(-webkit-mask-image: linear-gradient(#000, transparent)) or
(mask-image: linear-gradient(#000, transparent))
)
) {
.sky-navbar__blur {
-webkit-backdrop-filter: blur(2px);
backdrop-filter: blur(2px);
-webkit-mask-image: linear-gradient(to bottom, #000 50%, transparent 100%);
mask-image: linear-gradient(to bottom, #000 50%, transparent 100%);
}
}
.sky-tabbar__links > button > span,
.sky-tabbar__links > a > span {
min-width: 0;
max-width: 100%;
}
.sky-navbar button:focus-visible,
.sky-navbar a:focus-visible,
.sky-list-card button:focus-visible,
.sky-list-card a:focus-visible,
.sky-list-card input:focus-visible,
.sky-list-card select:focus-visible,
.sky-list-card textarea:focus-visible,
.sky-empty-state button:focus-visible,
.sky-empty-state a:focus-visible,
.sky-tabbar button:focus-visible,
.sky-tabbar a:focus-visible {
outline: 2px solid var(--sky-app-accent);
outline-offset: -2px;
}
@media (prefers-reduced-motion: reduce) {
.sky-scroll-rail {
scroll-behavior: auto !important;
}
.sky-app-page *,
.sky-app-page *::before,
.sky-app-page *::after {
scroll-behavior: auto !important;
transition-duration: 0.01ms !important;
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
}
}