# 🎨 Руководство по Material Web Components 3 **Только Material компоненты! Никаких собственных компонентов!** --- ## 📦 Установка и настройка ```bash npm install @material/web ``` --- ## 🔧 Настройка TypeScript Создать файл `types/material-web.d.ts`: ```typescript // Декларации для Material Web Components declare namespace JSX { interface IntrinsicElements { // Buttons 'md-filled-button': any; 'md-outlined-button': any; 'md-text-button': any; 'md-elevated-button': any; 'md-tonal-button': any; 'md-filled-tonal-button': any; // Text Fields 'md-filled-text-field': any; 'md-outlined-text-field': any; // Cards 'md-filled-card': any; 'md-elevated-card': any; 'md-outlined-card': any; // Lists 'md-list': any; 'md-list-item': any; // Navigation 'md-navigation-bar': any; 'md-navigation-tab': any; 'md-navigation-drawer': any; 'md-navigation-drawer-modal': any; // Dialogs & Sheets 'md-dialog': any; // Chips 'md-chip-set': any; 'md-assist-chip': any; 'md-filter-chip': any; 'md-input-chip': any; 'md-suggestion-chip': any; // Icons 'md-icon': any; 'md-icon-button': any; 'md-filled-icon-button': any; 'md-tonal-icon-button': any; 'md-outlined-icon-button': any; // Form Controls 'md-checkbox': any; 'md-radio': any; 'md-switch': any; 'md-slider': any; // Select 'md-filled-select': any; 'md-outlined-select': any; 'md-select-option': any; // Menus 'md-menu': any; 'md-menu-item': any; 'md-sub-menu': any; // Progress 'md-circular-progress': any; 'md-linear-progress': any; // FAB 'md-fab': any; 'md-branded-fab': any; // Badges 'md-badge': any; // Divider 'md-divider': any; // Tabs 'md-tabs': any; 'md-primary-tab': any; 'md-secondary-tab': any; } } ``` --- ## 📚 Импорт компонентов Создать файл `lib/material-components.ts`: ```typescript // Buttons import '@material/web/button/filled-button.js'; import '@material/web/button/outlined-button.js'; import '@material/web/button/text-button.js'; import '@material/web/button/elevated-button.js'; import '@material/web/button/tonal-button.js'; // Text Fields import '@material/web/textfield/filled-text-field.js'; import '@material/web/textfield/outlined-text-field.js'; // Cards import '@material/web/labs/card/filled-card.js'; import '@material/web/labs/card/elevated-card.js'; import '@material/web/labs/card/outlined-card.js'; // Lists import '@material/web/list/list.js'; import '@material/web/list/list-item.js'; // Navigation (из labs) import '@material/web/labs/navigationbar/navigation-bar.js'; import '@material/web/labs/navigationtab/navigation-tab.js'; import '@material/web/labs/navigationdrawer/navigation-drawer.js'; // Dialogs import '@material/web/dialog/dialog.js'; // Chips import '@material/web/chips/chip-set.js'; import '@material/web/chips/assist-chip.js'; import '@material/web/chips/filter-chip.js'; import '@material/web/chips/input-chip.js'; import '@material/web/chips/suggestion-chip.js'; // Icons import '@material/web/icon/icon.js'; import '@material/web/iconbutton/icon-button.js'; import '@material/web/iconbutton/filled-icon-button.js'; import '@material/web/iconbutton/tonal-icon-button.js'; import '@material/web/iconbutton/outlined-icon-button.js'; // Form Controls import '@material/web/checkbox/checkbox.js'; import '@material/web/radio/radio.js'; import '@material/web/switch/switch.js'; import '@material/web/slider/slider.js'; // Select import '@material/web/select/filled-select.js'; import '@material/web/select/outlined-select.js'; import '@material/web/select/select-option.js'; // Menus import '@material/web/menu/menu.js'; import '@material/web/menu/menu-item.js'; import '@material/web/menu/sub-menu.js'; // Progress import '@material/web/progress/circular-progress.js'; import '@material/web/progress/linear-progress.js'; // FAB import '@material/web/fab/fab.js'; import '@material/web/fab/branded-fab.js'; // Badges import '@material/web/labs/badge/badge.js'; // Divider import '@material/web/divider/divider.js'; // Tabs import '@material/web/tabs/tabs.js'; import '@material/web/tabs/primary-tab.js'; import '@material/web/tabs/secondary-tab.js'; ``` Импортировать в `app/layout.tsx`: ```typescript import '@/lib/material-components'; ``` --- ## 🎨 Material Design 3 Grid System Создать файл `styles/material-grid.css`: ```css /* Material Design 3 Layout Grid */ /* Breakpoints: - xs: 0-599px (Mobile) - sm: 600-839px (Tablet Portrait) - md: 840-1239px (Tablet Landscape / Small Desktop) - lg: 1240-1439px (Desktop) - xl: 1440px+ (Large Desktop) */ .md-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; padding: 0 16px; width: 100%; } /* Tablet Portrait (600-839px) */ @media (min-width: 600px) { .md-grid { grid-template-columns: repeat(8, 1fr); gap: 24px; padding: 0 24px; } } /* Tablet Landscape / Desktop (840-1239px) */ @media (min-width: 840px) { .md-grid { grid-template-columns: repeat(12, 1fr); gap: 24px; padding: 0 24px; } } /* Large Desktop (1240px+) */ @media (min-width: 1240px) { .md-grid { gap: 24px; padding: 0 24px; max-width: 1200px; margin: 0 auto; } } /* Column Span Classes */ /* Mobile (4 columns) */ .md-col-1 { grid-column: span 1; } .md-col-2 { grid-column: span 2; } .md-col-3 { grid-column: span 3; } .md-col-4 { grid-column: span 4; } /* Tablet (8 columns) */ @media (min-width: 600px) { .md-col-sm-1 { grid-column: span 1; } .md-col-sm-2 { grid-column: span 2; } .md-col-sm-4 { grid-column: span 4; } .md-col-sm-6 { grid-column: span 6; } .md-col-sm-8 { grid-column: span 8; } } /* Desktop (12 columns) */ @media (min-width: 840px) { .md-col-md-3 { grid-column: span 3; } .md-col-md-4 { grid-column: span 4; } .md-col-md-6 { grid-column: span 6; } .md-col-md-8 { grid-column: span 8; } .md-col-md-9 { grid-column: span 9; } .md-col-md-12 { grid-column: span 12; } } /* Flexbox альтернатива для простых случаев */ .md-flex { display: flex; gap: 16px; } .md-flex-col { display: flex; flex-direction: column; gap: 16px; } .md-flex-wrap { flex-wrap: wrap; } ``` **Использование:** ```tsx
Студентов
Занятий на неделе
Доход за месяц
Body Large
Body Medium
Body Small
Label Large
Label Medium
Label Small
``` Импортировать типографику: ```typescript import { styles as typescaleStyles } from '@material/web/typography/md-typescale-styles.js'; // В layout.tsx useEffect(() => { document.adoptedStyleSheets.push(typescaleStyles.styleSheet); }, []); ``` --- ## 🎯 Важные замечания 1. **Web Components в React:** - Material Web Components - это нативные Web Components - Используются напрямую в JSX как HTML элементы - Не нужны wrapper компоненты 2. **События:** - Используйте `ref` для доступа к элементу - Добавляйте слушатели событий через `addEventListener` 3. **Стилизация:** - CSS Variables для кастомизации - Только чистый CSS, без Tailwind - Material Grid System для layout 4. **Компоненты из `labs`:** - Некоторые компоненты находятся в `@material/web/labs/` - Например: `navigation-bar`, `badge`, `card` --- **Документация:** https://github.com/material-components/material-web **Demo:** https://material-web.dev/