Глубина
Тень показывает, насколько высоко парит поверхность. Слой z-index решает, что лежит сверху. Это разные инструменты.
<div style="box-shadow: var(--shadow-1); background: var(--surface-raised); padding: var(--space-24); border-radius: var(--radius-12)">shadow-1</div> <div style="box-shadow: var(--shadow-2); background: var(--surface-raised); padding: var(--space-24); border-radius: var(--radius-16)">shadow-2</div> <div style="box-shadow: var(--shadow-3); background: var(--surface-raised); padding: var(--space-24); border-radius: var(--radius-16)">shadow-3</div>
Тень
Три ступени и shadow-none. Чем больше число, тем выше поверхность.
| Токен | Для чего | В Thykes |
|---|---|---|
shadow-none |
плоско; снимает унаследованную тень | — |
shadow-1 |
карточка, небольшая приподнятая деталь | выбранный сегмент, бегунок переключателя |
shadow-2 |
панель над страницей | меню, поповер, подсказка, тост, выбор даты, плавающий сайдбар |
shadow-3 |
модальная поверхность | диалог, шторка |
Компоненты задают тень сами; токены нужны для поверхностей, которые вы делаете сами.
Anyone with the link can view this file.
<tk-popover label="Share"> <tk-button slot="trigger">Share</tk-button> <p>Anyone with the link can view this file.</p> </tk-popover>
- У каждой ступени есть кромка в 1px в светлой и тёмной теме: тонкий край, который держит поверхность чёткой на фоне того же тона. В светлой теме кромка чёрная, в тёмной белая.
- Тёмная тема: тень сильнее, а
surface/raisedна одну ступень светлее страницы. Ступень небольшая, поэтому край в основном рисует белая кромка. - Высокий контраст: один бледный слой без кромки. Плавающие панели вместо неё рисуют рамку.
Рамки и тени
Кромка ложится сразу за краем элемента, поверх его собственной рамки. У элемента с рамкой и тенью получается два края.
- Своя плавающая панель: в светлой и тёмной теме край рисует тень, рамку добавляйте только в высоком контрасте. Так устроены панели Thykes.
- Рамка, которая должна быть видна в любой теме, например край контрола с контрастом 3:1: оставьте рамку и уберите тень.
.my-panel { box-shadow: var(--shadow-2); }
[data-theme="high-contrast"] .my-panel { border: 1px solid var(--border-default); }
@media (prefers-contrast: more) {
:root:not([data-theme]) .my-panel { border: 1px solid var(--border-default); }
}Кромка зависит от темы, а не от поверхности. На тёмной поверхности в светлой теме, например у подсказки или тоста, её не видно, поэтому край тёмной поверхности она не задаёт.
Порядок слоёв
- Оверлеям Thykes z-index не нужен. Диалоги, шторки, меню, поповеры, подсказки и панели селектов и выбора даты открываются в верхнем слое браузера, над всем на странице.
- Слой
z-*— для ваших элементов, которые парят над страницей: липкой шапкеz-sticky, своему выпадающему спискуz-dropdown. Тосты стоят наz-toast. - Внутри компонента — локальные слои. Задайте корню
isolation: isolateи внутри используйтеz-index: 1,2,3. Локальные значения не выйдут наружу и не будут спорить со слоями страницы. - Никаких
z-index: 9999. Слой выбирают по роли.
Слои — в карточке
Доступность
- Тень не бывает единственной границей. Она мягкая и зависит от фона, поэтому не набирает 3:1 для нетекстовых элементов. Если край элемента важен, как у контрола или поля, дайте ему рамку.
- Высота не заменяет фокус. Приподнятой поверхности тоже нужен видимый индикатор
фокуса; см.
Focus .
Можно / Нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
Брать тени из shadow-* |
Писать box-shadow на глаз |
shadow-1 для карточек, shadow-2 для плавающих панелей, shadow-3 для модальных окон |
Давать модальному окну тень карточки |
| Давать элементу рамку, когда его край должен быть виден | Полагаться на одну тень как на границу |
| Рисовать рамку плавающей панели только в высоком контрасте | Давать ей и рамку, и тень во всех темах |
| Показывать hover сменой поверхности или рамки | Брать для hover ступень тени повыше |
Брать слои z-*, а внутри компонента isolation: isolate |
Писать z-index: 9999 |
Тень
Три ступени тени, по темам: одни и те же имена с разными значениями в светлой, тёмной и контрастной теме.
| Токен | CSS-переменная | Для чего |
|---|---|---|
shadow-none |
--shadow-none |
без тени |
shadow-1 |
--shadow-1 |
карточка, небольшая приподнятая деталь |
shadow-2 |
--shadow-2 |
плавающая панель: меню, поповер, подсказка, тост |
shadow-3 |
--shadow-3 |
модальная поверхность: диалог, шторка |
В светлой и тёмной теме у каждой ступени три слоя: два мягких в тёмном тонированном сером
(gray-950 с прозрачностью) и кромка в 1px. В высоком контрасте один бледный слой без
кромки.
Светлая
| Токен | Значение |
|---|---|
shadow-none |
none |
shadow-1 |
0 1px 3px 0 #1a1a1d0f, 0 1px 2px 0 #1a1a1d0a, 0 0 1px 0 #0000001a |
shadow-2 |
0 4px 12px -2px #1a1a1d1a, 0 2px 6px -1px #1a1a1d14, 0 0 1px 0 #0000001a |
shadow-3 |
0 12px 28px -6px #1a1a1d1f, 0 6px 16px -4px #1a1a1d1a, 0 0 1px 0 #0000001a |
Тёмная
| Токен | Значение |
|---|---|
shadow-none |
none |
shadow-1 |
0 1px 3px 0 #1a1a1d40, 0 1px 2px 0 #1a1a1d29, 0 0 1px 0 #ffffff26 |
shadow-2 |
0 4px 12px -2px #1a1a1d4d, 0 2px 6px -1px #1a1a1d3d, 0 0 1px 0 #ffffff26 |
shadow-3 |
0 12px 28px -6px #1a1a1d59, 0 6px 16px -4px #1a1a1d4d, 0 0 1px 0 #ffffff26 |
Высокий контраст
| Токен | Значение |
|---|---|
shadow-none |
none |
shadow-1 |
0 1px 2px 0 #1a1a1d1f |
shadow-2 |
0 2px 4px 0 #1a1a1d29 |
shadow-3 |
0 4px 8px 0 #1a1a1d33 |
Тень, вместе с кромкой, не граница: она не набирает 3:1 для нетекстовых элементов. Если
край элемента должен быть виден, дайте ему рамку. Подробнее — в
Z-index
Восемь слоёв наложения, названных по роли, с шагом 100. Одинаковы во всех темах.
| Токен | CSS-переменная | Значение | Для чего |
|---|---|---|---|
z-deep |
--z-deep |
-100 | декоративные фоны за интерфейсом |
z-base |
--z-base |
0 | обычное содержимое страницы |
z-sticky |
--z-sticky |
100 | липкие шапки, панели инструментов, сайдбары |
z-dropdown |
--z-dropdown |
200 | меню, поповеры, автодополнение |
z-overlay |
--z-overlay |
300 | затемнённая подложка под модальным окном |
z-modal |
--z-modal |
400 | модальное окно или шторка над подложкой |
z-toast |
--z-toast |
500 | тосты |
z-tooltip |
--z-tooltip |
600 | подсказки, над всем |
Эти слои — только для элементов, которые парят над страницей. Внутри компонента задайте
корню isolation: isolate и стройте слои локально: 1, 2, 3. Подробнее — в
Размытие
Одно значение размытия — для необязательной «матовой» подложки за диалогом или шторкой.
| Токен | CSS-переменная | Значение | Для чего |
|---|---|---|---|
blur-backdrop |
--blur-backdrop |
8px | размытие подложки за модальным окном |
<tk-dialog heading="Frosted backdrop" backdrop-blur> The page behind this dialog is dimmed and blurred. </tk-dialog>
- По умолчанию выключено. Включается атрибутом
backdrop-blurуtk-dialog,tk-confirm-dialogиtk-sheet(Dialog ,Sheet ). Живое размытие стоит времени на отрисовку. - Главное — затемнение. Размытие добавляется к затемнённой подложке; если браузер не умеет размывать, затемнение остаётся.