@bug-on/m3-expressive 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +110 -0
- package/README.md +110 -0
- package/dist/assets/fonts/GoogleSansFlex-VariableFont.woff2 +0 -0
- package/dist/assets/fonts/MaterialSymbolsOutlined-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/fonts/MaterialSymbolsSharp-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/loading-indicator.svg +19 -0
- package/dist/assets/material-symbols-cdn.css +65 -0
- package/dist/assets/material-symbols-self-hosted.css +94 -0
- package/dist/buttons.d.mts +180 -0
- package/dist/buttons.d.ts +180 -0
- package/dist/buttons.js +4282 -0
- package/dist/buttons.js.map +1 -0
- package/dist/buttons.mjs +4227 -0
- package/dist/buttons.mjs.map +1 -0
- package/dist/core.d.mts +422 -0
- package/dist/core.d.ts +422 -0
- package/dist/core.js +2581 -0
- package/dist/core.js.map +1 -0
- package/dist/core.mjs +2547 -0
- package/dist/core.mjs.map +1 -0
- package/dist/feedback.d.mts +600 -0
- package/dist/feedback.d.ts +600 -0
- package/dist/feedback.js +2357 -0
- package/dist/feedback.js.map +1 -0
- package/dist/feedback.mjs +2321 -0
- package/dist/feedback.mjs.map +1 -0
- package/dist/forms.d.mts +40 -0
- package/dist/forms.d.ts +40 -0
- package/dist/forms.js +4263 -0
- package/dist/forms.js.map +1 -0
- package/dist/forms.mjs +4228 -0
- package/dist/forms.mjs.map +1 -0
- package/dist/icon-button-D-gs0gfj.d.mts +136 -0
- package/dist/icon-button-D-gs0gfj.d.ts +136 -0
- package/dist/index.css +309 -0
- package/dist/index.css.d.ts +2 -0
- package/dist/index.d.mts +24 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +23972 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +23668 -0
- package/dist/index.mjs.map +1 -0
- package/dist/layout.d.mts +610 -0
- package/dist/layout.d.ts +610 -0
- package/dist/layout.js +5091 -0
- package/dist/layout.js.map +1 -0
- package/dist/layout.mjs +5042 -0
- package/dist/layout.mjs.map +1 -0
- package/dist/material-symbols-cdn.css +65 -0
- package/dist/material-symbols-cdn.css.d.ts +2 -0
- package/dist/material-symbols-self-hosted.css +94 -0
- package/dist/material-symbols-self-hosted.css.d.ts +2 -0
- package/dist/md3-DFhj-NZj.d.mts +17 -0
- package/dist/md3-DFhj-NZj.d.ts +17 -0
- package/dist/navigation.d.mts +2766 -0
- package/dist/navigation.d.ts +2766 -0
- package/dist/navigation.js +6684 -0
- package/dist/navigation.js.map +1 -0
- package/dist/navigation.mjs +6573 -0
- package/dist/navigation.mjs.map +1 -0
- package/dist/overlays.d.mts +161 -0
- package/dist/overlays.d.ts +161 -0
- package/dist/overlays.js +3298 -0
- package/dist/overlays.js.map +1 -0
- package/dist/overlays.mjs +3244 -0
- package/dist/overlays.mjs.map +1 -0
- package/dist/pickers.d.mts +1074 -0
- package/dist/pickers.d.ts +1074 -0
- package/dist/pickers.js +4240 -0
- package/dist/pickers.js.map +1 -0
- package/dist/pickers.mjs +4200 -0
- package/dist/pickers.mjs.map +1 -0
- package/dist/plugin.d.mts +1 -0
- package/dist/plugin.d.ts +1 -0
- package/dist/plugin.js +13 -0
- package/dist/plugin.js.map +1 -0
- package/dist/plugin.mjs +3 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/scroll-area-CVS6HyLl.d.mts +33 -0
- package/dist/scroll-area-CVS6HyLl.d.ts +33 -0
- package/dist/shapes.d.mts +1119 -0
- package/dist/shapes.d.ts +1119 -0
- package/dist/shapes.js +2941 -0
- package/dist/shapes.js.map +1 -0
- package/dist/shapes.mjs +2889 -0
- package/dist/shapes.mjs.map +1 -0
- package/dist/side-sheet-modal-BY6VCC8p.d.mts +553 -0
- package/dist/side-sheet-modal-CglP6KYA.d.ts +553 -0
- package/dist/split-button-trailing-uncheckable-C5CLCIKP.d.ts +731 -0
- package/dist/split-button-trailing-uncheckable-MXj_kyNt.d.mts +731 -0
- package/dist/text-field-eAIpz9z1.d.mts +1038 -0
- package/dist/text-field-eAIpz9z1.d.ts +1038 -0
- package/dist/typography-339RV6v7.d.mts +486 -0
- package/dist/typography-339RV6v7.d.ts +486 -0
- package/dist/typography.css +22 -0
- package/dist/typography.css.d.ts +2 -0
- package/package.json +207 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# @bug-on/m3-expressive
|
|
2
|
+
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
### 🎉 Initial Release
|
|
6
|
+
|
|
7
|
+
First stable release of **@bug-on/m3-expressive** — Material Design 3 Expressive React component library by Bug Ổn.
|
|
8
|
+
|
|
9
|
+
> **Note:** This package was previously published as `@bug-on/md3-react`. All functionality has been carried over with a fresh version reset.
|
|
10
|
+
|
|
11
|
+
#### Components
|
|
12
|
+
|
|
13
|
+
**Buttons**
|
|
14
|
+
- `Button` — Filled, Outlined, Tonal, Elevated, Text variants
|
|
15
|
+
- `IconButton` — Standard, Filled, Tonal, Outlined variants with toggle support
|
|
16
|
+
- `FAB` — Floating Action Button (Small, Medium, Large)
|
|
17
|
+
- `ExtendedFAB` — Extended FAB with label and icon
|
|
18
|
+
- `FABMenu` — FAB with expandable menu actions
|
|
19
|
+
- `SplitButton` — Split button with primary action and dropdown
|
|
20
|
+
- `ButtonGroup` — Grouped buttons with shared styling
|
|
21
|
+
|
|
22
|
+
**Forms & Inputs**
|
|
23
|
+
- `TextField` — Filled and Outlined variants with leading/trailing icons
|
|
24
|
+
- `Checkbox` — Standard and TriState checkbox
|
|
25
|
+
- `RadioButton` — Radio button with MD3 styling
|
|
26
|
+
- `Switch` — Toggle switch with icon support
|
|
27
|
+
- `Slider` / `RangeSlider` — Single and range slider with discrete/continuous modes
|
|
28
|
+
|
|
29
|
+
**Navigation**
|
|
30
|
+
- `NavigationBar` — Bottom navigation bar with animated icons
|
|
31
|
+
- `NavigationRail` — Side navigation rail
|
|
32
|
+
- `Tabs` / `Tab` / `TabsList` / `TabsContent` — Primary and Secondary tab variants
|
|
33
|
+
- `Drawer` — Navigation drawer (standard, modal)
|
|
34
|
+
|
|
35
|
+
**Feedback**
|
|
36
|
+
- `Dialog` — Alert and full-screen dialog
|
|
37
|
+
- `Snackbar` / `SnackbarProvider` / `useSnackbar` — Toast notifications
|
|
38
|
+
- `ProgressIndicator` — Linear and Circular (determinate, indeterminate, wavy)
|
|
39
|
+
- `LoadingIndicator` — Loading spinner
|
|
40
|
+
- `Tooltip` — Plain and Rich tooltip with caret
|
|
41
|
+
|
|
42
|
+
**Layout & Surfaces**
|
|
43
|
+
- `Card` — Elevated, Filled, Outlined variants
|
|
44
|
+
- `Divider` — Full-width and inset dividers
|
|
45
|
+
- `List` / `ListItem` / `ListDivider` — Lists with leading/trailing elements
|
|
46
|
+
- `ScrollArea` — Custom scrollbar area
|
|
47
|
+
- `SideSheet` / `BottomSheet` — Sheet overlays
|
|
48
|
+
|
|
49
|
+
**App Bars & Toolbars**
|
|
50
|
+
- `SmallAppBar` / `MediumFlexibleAppBar` / `LargeFlexibleAppBar` — Top app bars
|
|
51
|
+
- `BottomAppBar` — Bottom app bar with FAB integration
|
|
52
|
+
- `SearchAppBar` / `SearchView` — Expandable search
|
|
53
|
+
- `Toolbar` / `FloatingToolbar` / `DockedToolbar` — Contextual toolbars
|
|
54
|
+
|
|
55
|
+
**Data & Display**
|
|
56
|
+
- `Badge` / `BadgedBox` — Notification badges
|
|
57
|
+
- `Chip` — Assist, Filter, Input, Suggestion variants
|
|
58
|
+
- `Icon` — Material Symbols integration with fill/weight/grade/size control
|
|
59
|
+
- `Text` — Typography component with MD3 type scale
|
|
60
|
+
- `CodeBlock` — Code display with syntax highlighting
|
|
61
|
+
|
|
62
|
+
**Date & Time Pickers**
|
|
63
|
+
- `DatePicker` / `DatePickerDialog` / `DatePickerInput` — Date selection
|
|
64
|
+
- `DateRangePicker` — Date range selection
|
|
65
|
+
- `TimePicker` / `TimePickerDialog` / `TimeInput` — Time selection
|
|
66
|
+
|
|
67
|
+
**Shapes & Media**
|
|
68
|
+
- `ShapeMedia` / `ShapeMediaServer` — MD3 Expressive shape containers
|
|
69
|
+
- `ShapeSvg` / `ShapeIcon` — SVG-based shapes
|
|
70
|
+
- `useShapeMorph` — Shape morphing animation hook
|
|
71
|
+
- MD3 shape catalog with all expressive corner variants
|
|
72
|
+
|
|
73
|
+
**Search**
|
|
74
|
+
- `Search` / `SearchBar` — Inline search
|
|
75
|
+
- `SearchViewDocked` / `SearchViewFullscreen` — Expanded search views
|
|
76
|
+
|
|
77
|
+
**Menu**
|
|
78
|
+
- `Menu` / `MenuItem` / `MenuDivider` / `MenuGroup` — Dropdown menus
|
|
79
|
+
- `SubMenu` — Nested submenus
|
|
80
|
+
- `ContextMenu` — Right-click context menu
|
|
81
|
+
- `VerticalMenu` — Vertical navigation menu
|
|
82
|
+
|
|
83
|
+
**Theme & Providers**
|
|
84
|
+
- `MD3ThemeProvider` — Dynamic color theming (Material You)
|
|
85
|
+
- `useTheme` / `useThemeMode` — Theme hooks
|
|
86
|
+
- `MaterialSymbolsPreconnect` — Font preconnect helper
|
|
87
|
+
|
|
88
|
+
**Utilities**
|
|
89
|
+
- `Ripple` — Touch ripple effect
|
|
90
|
+
- `StateLayer` — Hover/focus/press state layer
|
|
91
|
+
- `TouchTarget` — Accessible touch target sizing
|
|
92
|
+
- `useAppBarScroll` — Scroll-aware app bar behavior
|
|
93
|
+
|
|
94
|
+
#### CSS Exports
|
|
95
|
+
- `@bug-on/m3-expressive/index.css` — MD3 tokens + Tailwind `@theme` + resets
|
|
96
|
+
- `@bug-on/m3-expressive/typography.css` — Google Sans Flex font-face
|
|
97
|
+
- `@bug-on/m3-expressive/material-symbols-cdn.css` — Material Symbols via CDN
|
|
98
|
+
- `@bug-on/m3-expressive/material-symbols-self-hosted.css` — Self-hosted icons
|
|
99
|
+
|
|
100
|
+
#### Sub-path Exports
|
|
101
|
+
- `@bug-on/m3-expressive/core` — Theme providers and hooks only
|
|
102
|
+
- `@bug-on/m3-expressive/buttons` — Button components only
|
|
103
|
+
- `@bug-on/m3-expressive/forms` — Form components only
|
|
104
|
+
- `@bug-on/m3-expressive/feedback` — Feedback components only
|
|
105
|
+
- `@bug-on/m3-expressive/navigation` — Navigation components only
|
|
106
|
+
- `@bug-on/m3-expressive/overlays` — Dialog/Sheet components only
|
|
107
|
+
- `@bug-on/m3-expressive/layout` — Layout components only
|
|
108
|
+
- `@bug-on/m3-expressive/pickers` — Date/Time pickers only
|
|
109
|
+
- `@bug-on/m3-expressive/shapes` — Shape components only
|
|
110
|
+
- `@bug-on/m3-expressive/plugin` — Tailwind v4 plugin re-export
|
package/README.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# @bug-on/m3-expressive
|
|
2
|
+
|
|
3
|
+
> ⚠️ **Work in progress** — Material Design 3 Expressive React Component Library.
|
|
4
|
+
|
|
5
|
+
Thư viện UI component hiệu năng cao cho React được thiết kế theo ngôn ngữ thiết kế [Material Design 3 Expressive](https://m3.material.io/). Mang đến hiệu ứng mượt mà, khả năng hỗ trợ tiếp cận (a11y) mạnh mẽ và tương thích hoàn hảo với SSR / Next.js App Router.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 📖 Tài liệu hướng dẫn & Demo
|
|
10
|
+
Để xem hướng dẫn chi tiết về API của từng Component, các thuộc tính chỉnh sửa cũng như xem demo tương tác trực quan nhất, vui lòng truy cập:
|
|
11
|
+
👉 **[Tài liệu & Demo chính thức (GitHub Repository)](https://github.com/nguyentruongton/bug-on-md3-expressive)**
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 📦 Cài đặt
|
|
16
|
+
|
|
17
|
+
Cài đặt gói React component cùng với các package cốt lõi đi kèm trong hệ sinh thái:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @bug-on/m3-expressive @bug-on/m3-tailwind @bug-on/m3-tokens
|
|
21
|
+
# hoặc
|
|
22
|
+
pnpm add @bug-on/m3-expressive @bug-on/m3-tailwind @bug-on/m3-tokens
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Peer Dependencies thiết yếu
|
|
26
|
+
Đảm bảo bạn đã cài đặt đầy đủ các peer dependencies sau trong dự án:
|
|
27
|
+
```bash
|
|
28
|
+
npm install react react-dom
|
|
29
|
+
# Yêu cầu cài đặt thêm thư viện motion cho các component có hiệu ứng động (Fab, Tabs, Dialog...):
|
|
30
|
+
npm install motion
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 🛠️ Configuration & Setup (Tailwind CSS v4)
|
|
36
|
+
|
|
37
|
+
> [!WARNING]
|
|
38
|
+
> The library only supports **Tailwind CSS v4** (peer dependency `tailwindcss: ">=4.0.0"`). **Tailwind CSS v3 is no longer supported**.
|
|
39
|
+
|
|
40
|
+
This system is designed around the CSS-first architecture of **Tailwind CSS v4**. Setup is extremely simple and requires no JS/TS configuration files. Just import the stylesheets directly into your application's main CSS entry point (e.g., `globals.css` or `index.css`):
|
|
41
|
+
|
|
42
|
+
```css
|
|
43
|
+
/* 1. Import core Tailwind CSS v4 */
|
|
44
|
+
@import "tailwindcss";
|
|
45
|
+
|
|
46
|
+
/* 2. Register core Design Tokens + Tailwind Theme + Resets (Zero Config) */
|
|
47
|
+
@import "@bug-on/m3-expressive/index.css";
|
|
48
|
+
|
|
49
|
+
/* 3. (Optional) Integrate MD3 advanced utility classes (elevations, transitions, icons) */
|
|
50
|
+
@import "@bug-on/m3-tailwind";
|
|
51
|
+
|
|
52
|
+
/* 4. (Optional) Integrate specialized Typography CSS for React Components */
|
|
53
|
+
@import "@bug-on/m3-expressive/typography.css";
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> **Zero Config:** Once `@bug-on/m3-expressive/index.css` is imported, basic MD3 utility classes (`bg-m3-primary`, `text-m3-on-surface`, `rounded-m3-xl`, etc.) work immediately. For the full set of utilities like depth shadows (`elevation-3`), icon axis control (`icon-fill-1`), or physics-based transitions (`transition-m3-fast-spatial`), import `@bug-on/m3-tailwind` as well. Do NOT use JS plugins in Tailwind v4.
|
|
57
|
+
|
|
58
|
+
### Cấu hình Icons (Material Symbols)
|
|
59
|
+
Thư viện tích hợp sẵn component `<Icon />` sử dụng font `Material Symbols Outlined`. Bạn cần import stylesheet của icon tại root của ứng dụng (ví dụ `layout.tsx` hoặc `main.tsx`):
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
// app/layout.tsx hoặc src/main.tsx
|
|
63
|
+
import '@bug-on/m3-expressive/material-symbols-cdn.css';
|
|
64
|
+
import { MaterialSymbolsPreconnect } from '@bug-on/m3-expressive';
|
|
65
|
+
|
|
66
|
+
export default function RootLayout({ children }) {
|
|
67
|
+
return (
|
|
68
|
+
<html>
|
|
69
|
+
<head>
|
|
70
|
+
{/* Hỗ trợ tải trước font giúp hiển thị icon cực nhanh */}
|
|
71
|
+
<MaterialSymbolsPreconnect />
|
|
72
|
+
</head>
|
|
73
|
+
<body>{children}</body>
|
|
74
|
+
</html>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
Nếu cần hỗ trợ offline hoặc không gửi request font tới CDN, cài package font opt-in:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pnpm add @bug-on/m3-fonts
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```css
|
|
85
|
+
@import "@bug-on/m3-fonts/material-symbols.css";
|
|
86
|
+
@import "@bug-on/m3-fonts/typography.css";
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`@bug-on/m3-expressive/material-symbols-self-hosted.css` vẫn hoạt động để tương thích ngược, nhưng đã deprecated và sẽ bị xoá ở major version tiếp theo.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 🚀 Sử dụng cơ bản
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
import { Button, Icon } from '@bug-on/m3-expressive';
|
|
97
|
+
|
|
98
|
+
export default function Page() {
|
|
99
|
+
return (
|
|
100
|
+
<div className="p-8 bg-m3-surface min-h-screen flex items-center justify-center">
|
|
101
|
+
<Button colorStyle="filled" size="md" icon={<Icon name="add" />}>
|
|
102
|
+
Get Started
|
|
103
|
+
</Button>
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## ⚖️ Giấy phép
|
|
110
|
+
MIT
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<svg width="100%" height="100%" viewBox="4 4 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill="#D0BCFF">
|
|
3
|
+
<animate attributeName="d" dur="5s" repeatCount="indefinite" calcMode="spline" keySplines="0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8" keyTimes="0; 0.14; 0.14; 0.29; 0.29; 0.43; 0.43; 0.57; 0.57; 0.71; 0.71; 0.86; 0.86; 1" values="M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z;
|
|
4
|
+
M20.3 8.6 21.1 8 22 7.6 23 7.3 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.2 15.5 37.6 16.5 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8 17.6 9.8 18.6 9.6 19.5 9.2Z;
|
|
5
|
+
M18.6 9.6 19.5 9.2 20.3 8.6 21.1 8 22 7.6 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.6 16.4 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8Z;
|
|
6
|
+
M18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.2 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 33.7 13.1 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.5 30.5 39.5 30 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7.1 21.7 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8 15.4 12.3 16.2 11.7 17 11.1 17.8 10.5Z;
|
|
7
|
+
M15.4 12.3 16.2 11.7 17 11.1 17.8 10.5 18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.3 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.4 30.5 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8Z;
|
|
8
|
+
M17 12.8 17.7 12.1 18.5 11.5 19.3 10.9 20.1 10.5 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 25 9 26 9 27 9 27.6 9.1 28 9.1 28.9 9.3 29.9 9.6 30.9 9.9 31.8 10.3 32.6 10.8 33.5 11.3 34.3 11.9 34.6 12.2 35 12.6 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.6 18.5 38.6 18.7 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.3 38.2 26.4 37.8 27.3 37.4 28.2 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.8 32.5 33.5 32.8 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.2 37.3 27.9 37.5 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 22.5 39 21.5 39 20.5 38.9 20.4 38.9 19.5 38.8 18.6 38.6 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.4 35.8 13.3 35.8 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.6 30 9.4 29.3 9.3 29 9.1 28 9 27 9 26 9 25 9.2 24 9.4 23 9.6 22.1 9.8 21.7 10 21.1 10.4 20.2 10.9 19.4 11.4 18.5 12.1 17.8 12.7 17 13.4 16.3 14.2 15.6 14.2 15.5 14.9 14.9 15.6 14.2 16.3 13.5Z;
|
|
9
|
+
M33.5 11.3 34.3 11.9 35 12.6 35.3 12.8 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.3 17.7 38.6 18.5 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.4 37.8 27.3 37.4 28.2 36.9 28.9 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.5 32.8 33.1 33.2 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.7 37 28.2 37.3 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 23.3 38.9 22.5 39 21.5 39 20.5 38.9 19.5 38.8 18.6 38.6 17.6 38.3 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.3 35.8 12.7 35.2 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.7 30.3 9.6 29.9 9.3 29 9.1 28 9 27 9 26 9 25 9.1 24.5 9.2 24 9.4 23 9.6 22.1 10 21.1 10.4 20.2 10.9 19.4 11.1 19.1 11.5 18.5 12.1 17.7 12.7 17 13.5 16.3 14.2 15.6 14.9 14.9 14.9 14.8 15.6 14.2 16.3 13.5 17 12.8 17.7 12.1 18.5 11.5 19.3 11 19.3 10.9 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 24.7 9.1 25 9 26 9 27 9 28 9.1 28.9 9.3 29.9 9.6 30.4 9.7 30.9 9.9 31.8 10.3 32.6 10.8Z;
|
|
10
|
+
M33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.8 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.6 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7 27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1Z;
|
|
11
|
+
M27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1 33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.9 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.5 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7Z;
|
|
12
|
+
M27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 34.8 11.3 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.9 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.4 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35 36 35.7 35.3 36.4 34.4 37 34.1 37.2 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.6 10 30.1 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10 16.6 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 20.9 11 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11Z;
|
|
13
|
+
M36 35.7 35.3 36.4 34.4 37 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.2 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11 27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.8 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35Z;
|
|
14
|
+
M32.1 32.1 31.4 32.8 30.7 33.5 29.9 34.1 29.1 34.7 28.3 35.3 27.6 35.8 27.5 35.8 26.6 36.4 25.8 36.8 24.9 37.3 24 37.7 23.1 38 22.1 38.3 21.2 38.6 20.2 38.8 19.2 38.9 18.2 39 17.2 39 16.6 38.9 16.3 38.9 15.3 38.7 14.3 38.4 13.4 38 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10 34.6 9.6 33.7 9.3 32.7 9.1 31.7 9.1 31.4 9 30.8 9 29.8 9.1 28.8 9.2 27.8 9.4 26.8 9.7 25.9 10 24.9 10.3 24 10.7 23.1 11.2 22.2 11.6 21.4 12.2 20.5 12.2 20.4 12.7 19.7 13.3 18.9 13.9 18.1 14.5 17.3 15.2 16.6 15.9 15.9 16.6 15.2 17.3 14.5 18.1 13.9 18.9 13.3 19.7 12.7 20.4 12.2 20.5 12.2 21.4 11.6 22.2 11.2 23.1 10.7 24 10.3 24.9 10 25.9 9.7 26.8 9.4 27.8 9.2 28.8 9.1 29.8 9 30.8 9 31.4 9.1 31.7 9.1 32.7 9.3 33.7 9.6 34.6 10 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 38 13.4 38.4 14.3 38.7 15.3 38.9 16.3 38.9 16.6 39 17.2 39 18.2 38.9 19.2 38.8 20.2 38.6 21.2 38.3 22.1 38 23.1 37.7 24 37.3 24.9 36.8 25.8 36.4 26.6 35.8 27.5 35.8 27.6 35.3 28.3 34.7 29.1 34.1 29.9 33.5 30.7 32.8 31.4Z;
|
|
15
|
+
M24.3 10.2 24.9 10 25.9 9.7 26.8 9.4 27.1 9.4 27.8 9.2 28.8 9.1 29.8 9 29.9 9 30.8 9 31.7 9.1 32.7 9.3 32.8 9.3 33.7 9.6 34.6 10 35.5 10.5 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 37.5 12.5 38 13.4 38.4 14.3 38.7 15.2 38.7 15.3 38.9 16.3 39 17.2 39 18.1 39 18.2 38.9 19.2 38.8 20.2 38.6 20.9 38.6 21.2 38.3 22.1 38 23.1 37.8 23.7 37.7 24 37.3 24.9 36.8 25.8 36.5 26.4 36.4 26.6 35.8 27.5 35.3 28.3 35 28.8 34.7 29.1 34.1 29.9 33.5 30.7 33.1 31.1 32.8 31.4 32.1 32.1 31.4 32.8 31.1 33.1 30.7 33.5 29.9 34.1 29.1 34.7 28.8 35 28.3 35.3 27.5 35.8 26.6 36.4 26.4 36.5 25.8 36.8 24.9 37.3 24 37.7 23.7 37.8 23.1 38 22.1 38.3 21.2 38.6 20.9 38.6 20.2 38.8 19.2 38.9 18.2 39 18.1 39 17.2 39 16.3 38.9 15.3 38.7 15.2 38.7 14.3 38.4 13.4 38 12.5 37.5 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10.5 35.5 10 34.6 9.6 33.7 9.3 32.8 9.3 32.7 9.1 31.7 9 30.8 9 29.9 9 29.8 9.1 28.8 9.2 27.8 9.4 27.1 9.4 26.8 9.7 25.9 10 24.9 10.2 24.3 10.3 24 10.7 23.1 11.2 22.2 11.5 21.6 11.6 21.4 12.2 20.5 12.7 19.7 13 19.2 13.3 18.9 13.9 18.1 14.5 17.3 14.9 16.9 15.2 16.6 15.9 15.9 16.6 15.2 16.9 14.9 17.3 14.5 18.1 13.9 18.9 13.3 19.2 13 19.7 12.7 20.5 12.2 21.4 11.6 21.6 11.5 22.2 11.2 23.1 10.7 24 10.3Z;
|
|
16
|
+
M22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.3 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.4 38.9 26.2 39.6 27 40.2 27.7 40.5 28.6 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.8 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.6 9.1 21.8 8.4 21 7.8 20.3 7.5 19.4 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.2 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1 20.9 10.4 21.4 9.5 21.9 8.7Z"></animate>
|
|
17
|
+
<animateTransform attributeName="transform" attributeType="XML" type="rotate" dur="5s" repeatCount="indefinite" calcMode="spline" keySplines="0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8" keyTimes="0; 0.14; 0.29; 0.43; 0.57; 0.71; 0.86; 1" values="0 24 24; 154 24 24; 309 24 24; 463 24 24; 617 24 24; 771 24 24; 926 24 24; 1080 24 24"></animateTransform>
|
|
18
|
+
</path>
|
|
19
|
+
</svg>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Material Symbols — CDN version (Google Fonts)
|
|
3
|
+
*
|
|
4
|
+
* USAGE IN APP'S HTML <head>:
|
|
5
|
+
* Add preconnect hints BEFORE this CSS loads for fastest performance:
|
|
6
|
+
*
|
|
7
|
+
* <link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
8
|
+
* <link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
|
9
|
+
*
|
|
10
|
+
* Then import this CSS:
|
|
11
|
+
* import '@bug-on/m3-expressive/material-symbols-cdn.css'
|
|
12
|
+
*
|
|
13
|
+
* WHY TWO preconnect?
|
|
14
|
+
* Google Fonts serves the CSS stylesheet from fonts.googleapis.com
|
|
15
|
+
* but the actual .woff2 font files come from fonts.gstatic.com (different origin).
|
|
16
|
+
* The crossorigin attribute is required for font files (CORS request).
|
|
17
|
+
*
|
|
18
|
+
* FONT-DISPLAY NOTE for icon fonts:
|
|
19
|
+
* We use font-display: block (NOT swap) because:
|
|
20
|
+
* - swap would briefly show raw text like "arrow_forward" before icon loads = jarring layout shift
|
|
21
|
+
* - block hides text during load period (max 3s), then shows icon = cleaner UX
|
|
22
|
+
* - optional is NOT suitable: if font misses the load window, icons never appear
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* INSTRUCTION:
|
|
27
|
+
* Use the <MaterialSymbolsPreconnect /> component to load the actual Google Fonts CSS!
|
|
28
|
+
*
|
|
29
|
+
* We NO LONGER use @import url(...) here because CSS bundlers (like Next.js/Webpack)
|
|
30
|
+
* often merge global CSS files and push @import statements below regular CSS rules.
|
|
31
|
+
* According to CSS spec, any @import MUST be at the very top, so it breaks randomly.
|
|
32
|
+
* Loading via `<link rel="stylesheet">` (handled by MaterialSymbolsPreconnect) is fully robust.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/* ─────────────────────────────────────────────────────────────────────────────
|
|
36
|
+
* BASE ICON STYLES
|
|
37
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
38
|
+
*
|
|
39
|
+
* This class ensures that Material Symbols render correctly as ligatures
|
|
40
|
+
* across all browsers and prevents common layout issues.
|
|
41
|
+
*/
|
|
42
|
+
.md-icon {
|
|
43
|
+
font-family: inherit; /* Set dynamically by the Icon component */
|
|
44
|
+
font-weight: normal;
|
|
45
|
+
font-style: normal;
|
|
46
|
+
display: inline-flex;
|
|
47
|
+
align-items: center;
|
|
48
|
+
justify-content: center;
|
|
49
|
+
width: 1em;
|
|
50
|
+
height: 1em;
|
|
51
|
+
line-height: normal;
|
|
52
|
+
text-transform: none;
|
|
53
|
+
letter-spacing: normal;
|
|
54
|
+
word-wrap: normal;
|
|
55
|
+
white-space: nowrap;
|
|
56
|
+
direction: ltr;
|
|
57
|
+
|
|
58
|
+
/* Enable ligature rendering support for modern browsers */
|
|
59
|
+
font-feature-settings: "liga";
|
|
60
|
+
|
|
61
|
+
/* Improved rendering quality */
|
|
62
|
+
-webkit-font-smoothing: antialiased;
|
|
63
|
+
-moz-osx-font-smoothing: grayscale;
|
|
64
|
+
text-rendering: optimizeLegibility;
|
|
65
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Material Symbols — Self-Hosted version
|
|
3
|
+
*
|
|
4
|
+
* SETUP STEPS:
|
|
5
|
+
*
|
|
6
|
+
* Step 1 — Download font files
|
|
7
|
+
* Truy cập: https://github.com/google/material-design-icons/tree/master/variablefont
|
|
8
|
+
* Download file: MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].woff2
|
|
9
|
+
* (và Rounded / Sharp nếu cần)
|
|
10
|
+
*
|
|
11
|
+
* Step 2 — Place font files in your app
|
|
12
|
+
* Recommended location: public/fonts/ hoặc src/assets/fonts/
|
|
13
|
+
* Example: public/fonts/MaterialSymbolsOutlined.woff2
|
|
14
|
+
*
|
|
15
|
+
* Step 3 — Copy và điều chỉnh @font-face block bên dưới
|
|
16
|
+
* Thay đổi src url() để trỏ đúng đường dẫn trong project của bạn
|
|
17
|
+
*
|
|
18
|
+
* @deprecated New integrations should install `@bug-on/m3-fonts` and import
|
|
19
|
+
* `@bug-on/m3-fonts/material-symbols.css`. This legacy export remains only
|
|
20
|
+
* for backwards compatibility and will be removed in the next major version.
|
|
21
|
+
*
|
|
22
|
+
* Step 4 — Import file này:
|
|
23
|
+
* import '@bug-on/m3-expressive/material-symbols-self-hosted.css'
|
|
24
|
+
*
|
|
25
|
+
* PERFORMANCE NOTES:
|
|
26
|
+
* - Self-hosting tốt hơn CDN khi bạn dùng CDN + HTTP/2 cho static assets
|
|
27
|
+
* - Nếu không có CDN, Google Fonts CDN có thể nhanh hơn do cache sharing
|
|
28
|
+
* - Dùng font-display: block cho icon fonts (xem lý do ở file CDN)
|
|
29
|
+
* - WOFF2 là format duy nhất cần thiết (100% modern browser support, Brotli compression)
|
|
30
|
+
* - Không cần WOFF fallback nữa
|
|
31
|
+
*
|
|
32
|
+
* SUBSETTING (QUAN TRỌNG để giảm file size):
|
|
33
|
+
* Full variable font ~295 KB. Sau khi subset còn ~1-2 KB cho vài chục icons.
|
|
34
|
+
* Dùng tool: https://everythingfonts.com/subsetter
|
|
35
|
+
* Hoặc dùng Google Fonts text parameter để subset trên CDN:
|
|
36
|
+
* ?family=Material+Symbols+Outlined&text=home%20search%20settings
|
|
37
|
+
*
|
|
38
|
+
* GDPR NOTE:
|
|
39
|
+
* Self-hosting loại bỏ việc gửi user IP đến Google servers,
|
|
40
|
+
* giải quyết GDPR compliance requirement.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
@font-face {
|
|
44
|
+
font-family: "Material Symbols Outlined";
|
|
45
|
+
font-style: normal;
|
|
46
|
+
/* Khai báo full axis range để browser biết đây là variable font */
|
|
47
|
+
font-weight: 100 700;
|
|
48
|
+
/* font-display: block là bắt buộc cho icon fonts:
|
|
49
|
+
* - Tránh render text thô "arrow_forward" thay vì icon
|
|
50
|
+
* - Max 3s block, sau đó icon xuất hiện
|
|
51
|
+
* Tham khảo: https://web.dev/articles/font-best-practices#icon_fonts */
|
|
52
|
+
font-display: block;
|
|
53
|
+
src: url("/fonts/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].woff2")
|
|
54
|
+
format("woff2");
|
|
55
|
+
/* unicode-range: chỉ load font khi page chứa ký tự trong range này.
|
|
56
|
+
* Material Symbols dùng PUA (Private Use Area) cho ligatures. */
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
* Rounded variants and Sharp variants are not included by default to save space.
|
|
61
|
+
* You can declare them similarly if you download the respective woff2 files.
|
|
62
|
+
*/
|
|
63
|
+
|
|
64
|
+
/* ─────────────────────────────────────────────────────────────────────────────
|
|
65
|
+
* BASE ICON STYLES
|
|
66
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
67
|
+
*
|
|
68
|
+
* This class ensures that Material Symbols render correctly as ligatures
|
|
69
|
+
* across all browsers and prevents common layout issues.
|
|
70
|
+
*/
|
|
71
|
+
.md-icon {
|
|
72
|
+
font-family: inherit; /* Set dynamically by the Icon component */
|
|
73
|
+
font-weight: normal;
|
|
74
|
+
font-style: normal;
|
|
75
|
+
display: inline-flex;
|
|
76
|
+
align-items: center;
|
|
77
|
+
justify-content: center;
|
|
78
|
+
width: 1em;
|
|
79
|
+
height: 1em;
|
|
80
|
+
line-height: normal;
|
|
81
|
+
text-transform: none;
|
|
82
|
+
letter-spacing: normal;
|
|
83
|
+
word-wrap: normal;
|
|
84
|
+
white-space: nowrap;
|
|
85
|
+
direction: ltr;
|
|
86
|
+
|
|
87
|
+
/* Enable ligature rendering support for modern browsers */
|
|
88
|
+
font-feature-settings: "liga";
|
|
89
|
+
|
|
90
|
+
/* Improved rendering quality */
|
|
91
|
+
-webkit-font-smoothing: antialiased;
|
|
92
|
+
-moz-osx-font-smoothing: grayscale;
|
|
93
|
+
text-rendering: optimizeLegibility;
|
|
94
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
export { B as BUTTON_COLOR_TOKENS, a as BUTTON_SIZE_TOKENS, b as BaseButtonProps, c as Button, d as ButtonGroup, e as ButtonGroupOrientation, f as ButtonGroupProps, g as ButtonGroupVariant, h as ButtonProps, E as ElevatedSplitButtonLeading, i as ElevatedSplitButtonTrailing, j as ElevatedSplitButtonTrailingUncheckable, k as ExtendedFAB, l as ExtendedFABProps, F as FAB, m as FABMenu, n as FABMenuItem, o as FABMenuItemData, p as FABMenuItemProps, q as FABMenuProps, r as FABPosition, s as FABPositionProps, t as FABProps, u as FilledSplitButtonLeading, v as FilledSplitButtonTrailing, w as FilledSplitButtonTrailingUncheckable, O as OutlinedSplitButtonLeading, x as OutlinedSplitButtonTrailing, y as OutlinedSplitButtonTrailingUncheckable, S as SplitButtonLayout, z as SplitButtonLayoutProps, A as SplitButtonLeading, C as SplitButtonLeadingProps, D as SplitButtonSize, Q as SplitButtonSizeTokens, G as SplitButtonTrailing, H as SplitButtonTrailingProps, I as SplitButtonTrailingUncheckable, J as SplitButtonTrailingUncheckableProps, K as SplitButtonVariant, T as ToggleFAB, L as ToggleFABProps, M as TonalSplitButtonLeading, N as TonalSplitButtonTrailing, P as TonalSplitButtonTrailingUncheckable } from './split-button-trailing-uncheckable-MXj_kyNt.mjs';
|
|
2
|
+
import { b as MD3Size } from './md3-DFhj-NZj.mjs';
|
|
3
|
+
export { B as BaseIconButtonProps, I as IconButton, a as IconButtonProps } from './icon-button-D-gs0gfj.mjs';
|
|
4
|
+
import { Transition } from 'motion/react';
|
|
5
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
6
|
+
import 'react';
|
|
7
|
+
import 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
interface Corners {
|
|
10
|
+
tl: number;
|
|
11
|
+
tr: number;
|
|
12
|
+
br: number;
|
|
13
|
+
bl: number;
|
|
14
|
+
}
|
|
15
|
+
interface ShapeSet {
|
|
16
|
+
default: Corners;
|
|
17
|
+
pressed: Corners;
|
|
18
|
+
checked: Corners;
|
|
19
|
+
}
|
|
20
|
+
declare const ButtonGroupDefaults: {
|
|
21
|
+
expandedRatio: number;
|
|
22
|
+
connectedLeadingButtonShapes: (size: MD3Size) => ShapeSet;
|
|
23
|
+
connectedMiddleButtonShapes: (size: MD3Size) => ShapeSet;
|
|
24
|
+
connectedTrailingButtonShapes: (size: MD3Size) => ShapeSet;
|
|
25
|
+
/** For orientation="vertical". */
|
|
26
|
+
connectedTopButtonShapes: (size: MD3Size) => ShapeSet;
|
|
27
|
+
connectedBottomButtonShapes: (size: MD3Size) => ShapeSet;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* MD3 Expressive Button Group Tokens
|
|
32
|
+
* Ported from ButtonGroupSmallTokens.kt and ConnectedButtonGroupSmallTokens.kt
|
|
33
|
+
*/
|
|
34
|
+
declare const BUTTON_GROUP_TOKENS: {
|
|
35
|
+
readonly standard: {
|
|
36
|
+
readonly betweenSpace: 12;
|
|
37
|
+
readonly containerHeight: 40;
|
|
38
|
+
};
|
|
39
|
+
readonly connected: {
|
|
40
|
+
readonly betweenSpace: 2;
|
|
41
|
+
readonly containerHeight: 40;
|
|
42
|
+
readonly containerShape: 9999;
|
|
43
|
+
readonly innerCorner: 8;
|
|
44
|
+
readonly pressedInnerCorner: 4;
|
|
45
|
+
readonly selectedCornerPercent: 50;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
declare const SPLIT_BUTTON_CHEVRON_SPRING: Transition;
|
|
50
|
+
declare const SPLIT_BUTTON_RADIUS_SPRING: Transition;
|
|
51
|
+
/**
|
|
52
|
+
* Split Button Tokens (Expressive)
|
|
53
|
+
* Source: SplitButtonXSmallTokens.kt, SplitButtonSmallTokens.kt,
|
|
54
|
+
* SplitButtonMediumTokens.kt, SplitButtonLargeTokens.kt,
|
|
55
|
+
* SplitButtonXLargeTokens.kt (Android/Compose reference)
|
|
56
|
+
*/
|
|
57
|
+
declare const SPLIT_BUTTON_TOKENS: {
|
|
58
|
+
readonly xs: {
|
|
59
|
+
readonly containerHeight: 32;
|
|
60
|
+
readonly betweenSpace: 2;
|
|
61
|
+
readonly innerCorner: {
|
|
62
|
+
readonly default: 4;
|
|
63
|
+
readonly hovered: 8;
|
|
64
|
+
readonly pressed: 8;
|
|
65
|
+
};
|
|
66
|
+
readonly outerCornerPercent: 50;
|
|
67
|
+
readonly leadingPadding: {
|
|
68
|
+
readonly start: 12;
|
|
69
|
+
readonly end: 10;
|
|
70
|
+
};
|
|
71
|
+
readonly trailingPadding: {
|
|
72
|
+
readonly start: 13;
|
|
73
|
+
readonly end: 13;
|
|
74
|
+
};
|
|
75
|
+
readonly trailingIconSize: 22;
|
|
76
|
+
readonly opticalCenterOffset: -1;
|
|
77
|
+
};
|
|
78
|
+
readonly sm: {
|
|
79
|
+
readonly containerHeight: 40;
|
|
80
|
+
readonly betweenSpace: 2;
|
|
81
|
+
readonly innerCorner: {
|
|
82
|
+
readonly default: 4;
|
|
83
|
+
readonly hovered: 12;
|
|
84
|
+
readonly pressed: 12;
|
|
85
|
+
};
|
|
86
|
+
readonly outerCornerPercent: 50;
|
|
87
|
+
readonly leadingPadding: {
|
|
88
|
+
readonly start: 16;
|
|
89
|
+
readonly end: 12;
|
|
90
|
+
};
|
|
91
|
+
readonly trailingPadding: {
|
|
92
|
+
readonly start: 13;
|
|
93
|
+
readonly end: 13;
|
|
94
|
+
};
|
|
95
|
+
readonly trailingIconSize: 22;
|
|
96
|
+
readonly opticalCenterOffset: -1;
|
|
97
|
+
};
|
|
98
|
+
readonly md: {
|
|
99
|
+
readonly containerHeight: 56;
|
|
100
|
+
readonly betweenSpace: 2;
|
|
101
|
+
readonly innerCorner: {
|
|
102
|
+
readonly default: 4;
|
|
103
|
+
readonly hovered: 12;
|
|
104
|
+
readonly pressed: 12;
|
|
105
|
+
};
|
|
106
|
+
readonly outerCornerPercent: 50;
|
|
107
|
+
readonly leadingPadding: {
|
|
108
|
+
readonly start: 24;
|
|
109
|
+
readonly end: 24;
|
|
110
|
+
};
|
|
111
|
+
readonly trailingPadding: {
|
|
112
|
+
readonly start: 15;
|
|
113
|
+
readonly end: 15;
|
|
114
|
+
};
|
|
115
|
+
readonly trailingIconSize: 26;
|
|
116
|
+
readonly opticalCenterOffset: -2;
|
|
117
|
+
};
|
|
118
|
+
readonly lg: {
|
|
119
|
+
readonly containerHeight: 96;
|
|
120
|
+
readonly betweenSpace: 2;
|
|
121
|
+
readonly innerCorner: {
|
|
122
|
+
readonly default: 8;
|
|
123
|
+
readonly hovered: 28;
|
|
124
|
+
readonly pressed: 28;
|
|
125
|
+
};
|
|
126
|
+
readonly outerCornerPercent: 50;
|
|
127
|
+
readonly leadingPadding: {
|
|
128
|
+
readonly start: 48;
|
|
129
|
+
readonly end: 48;
|
|
130
|
+
};
|
|
131
|
+
readonly trailingPadding: {
|
|
132
|
+
readonly start: 29;
|
|
133
|
+
readonly end: 29;
|
|
134
|
+
};
|
|
135
|
+
readonly trailingIconSize: 38;
|
|
136
|
+
readonly opticalCenterOffset: -3;
|
|
137
|
+
};
|
|
138
|
+
readonly xl: {
|
|
139
|
+
readonly containerHeight: 136;
|
|
140
|
+
readonly betweenSpace: 2;
|
|
141
|
+
readonly innerCorner: {
|
|
142
|
+
readonly default: 12;
|
|
143
|
+
readonly hovered: 28;
|
|
144
|
+
readonly pressed: 28;
|
|
145
|
+
};
|
|
146
|
+
readonly outerCornerPercent: 50;
|
|
147
|
+
readonly leadingPadding: {
|
|
148
|
+
readonly start: 64;
|
|
149
|
+
readonly end: 64;
|
|
150
|
+
};
|
|
151
|
+
readonly trailingPadding: {
|
|
152
|
+
readonly start: 43;
|
|
153
|
+
readonly end: 43;
|
|
154
|
+
};
|
|
155
|
+
readonly trailingIconSize: 50;
|
|
156
|
+
readonly opticalCenterOffset: -6;
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* Leading icon size per size variant.
|
|
161
|
+
* From Compose ButtonDefaults.iconSizeFor logic.
|
|
162
|
+
*/
|
|
163
|
+
declare const LEADING_ICON_SIZE_FOR_SIZE: {
|
|
164
|
+
readonly xs: 18;
|
|
165
|
+
readonly sm: 20;
|
|
166
|
+
readonly md: 24;
|
|
167
|
+
readonly lg: 32;
|
|
168
|
+
readonly xl: 40;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Color variants for the Split Button components using CVA.
|
|
173
|
+
*/
|
|
174
|
+
declare const splitButtonVariants: (props?: ({
|
|
175
|
+
variant?: "outlined" | "elevated" | "filled" | "tonal" | null | undefined;
|
|
176
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl" | null | undefined;
|
|
177
|
+
disabled?: boolean | null | undefined;
|
|
178
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
179
|
+
|
|
180
|
+
export { BUTTON_GROUP_TOKENS, ButtonGroupDefaults, LEADING_ICON_SIZE_FOR_SIZE, SPLIT_BUTTON_CHEVRON_SPRING, SPLIT_BUTTON_RADIUS_SPRING, SPLIT_BUTTON_TOKENS, splitButtonVariants };
|