@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.
Files changed (98) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README.md +110 -0
  3. package/dist/assets/fonts/GoogleSansFlex-VariableFont.woff2 +0 -0
  4. package/dist/assets/fonts/MaterialSymbolsOutlined-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  5. package/dist/assets/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  6. package/dist/assets/fonts/MaterialSymbolsSharp-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  7. package/dist/assets/loading-indicator.svg +19 -0
  8. package/dist/assets/material-symbols-cdn.css +65 -0
  9. package/dist/assets/material-symbols-self-hosted.css +94 -0
  10. package/dist/buttons.d.mts +180 -0
  11. package/dist/buttons.d.ts +180 -0
  12. package/dist/buttons.js +4282 -0
  13. package/dist/buttons.js.map +1 -0
  14. package/dist/buttons.mjs +4227 -0
  15. package/dist/buttons.mjs.map +1 -0
  16. package/dist/core.d.mts +422 -0
  17. package/dist/core.d.ts +422 -0
  18. package/dist/core.js +2581 -0
  19. package/dist/core.js.map +1 -0
  20. package/dist/core.mjs +2547 -0
  21. package/dist/core.mjs.map +1 -0
  22. package/dist/feedback.d.mts +600 -0
  23. package/dist/feedback.d.ts +600 -0
  24. package/dist/feedback.js +2357 -0
  25. package/dist/feedback.js.map +1 -0
  26. package/dist/feedback.mjs +2321 -0
  27. package/dist/feedback.mjs.map +1 -0
  28. package/dist/forms.d.mts +40 -0
  29. package/dist/forms.d.ts +40 -0
  30. package/dist/forms.js +4263 -0
  31. package/dist/forms.js.map +1 -0
  32. package/dist/forms.mjs +4228 -0
  33. package/dist/forms.mjs.map +1 -0
  34. package/dist/icon-button-D-gs0gfj.d.mts +136 -0
  35. package/dist/icon-button-D-gs0gfj.d.ts +136 -0
  36. package/dist/index.css +309 -0
  37. package/dist/index.css.d.ts +2 -0
  38. package/dist/index.d.mts +24 -0
  39. package/dist/index.d.ts +24 -0
  40. package/dist/index.js +23972 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/index.mjs +23668 -0
  43. package/dist/index.mjs.map +1 -0
  44. package/dist/layout.d.mts +610 -0
  45. package/dist/layout.d.ts +610 -0
  46. package/dist/layout.js +5091 -0
  47. package/dist/layout.js.map +1 -0
  48. package/dist/layout.mjs +5042 -0
  49. package/dist/layout.mjs.map +1 -0
  50. package/dist/material-symbols-cdn.css +65 -0
  51. package/dist/material-symbols-cdn.css.d.ts +2 -0
  52. package/dist/material-symbols-self-hosted.css +94 -0
  53. package/dist/material-symbols-self-hosted.css.d.ts +2 -0
  54. package/dist/md3-DFhj-NZj.d.mts +17 -0
  55. package/dist/md3-DFhj-NZj.d.ts +17 -0
  56. package/dist/navigation.d.mts +2766 -0
  57. package/dist/navigation.d.ts +2766 -0
  58. package/dist/navigation.js +6684 -0
  59. package/dist/navigation.js.map +1 -0
  60. package/dist/navigation.mjs +6573 -0
  61. package/dist/navigation.mjs.map +1 -0
  62. package/dist/overlays.d.mts +161 -0
  63. package/dist/overlays.d.ts +161 -0
  64. package/dist/overlays.js +3298 -0
  65. package/dist/overlays.js.map +1 -0
  66. package/dist/overlays.mjs +3244 -0
  67. package/dist/overlays.mjs.map +1 -0
  68. package/dist/pickers.d.mts +1074 -0
  69. package/dist/pickers.d.ts +1074 -0
  70. package/dist/pickers.js +4240 -0
  71. package/dist/pickers.js.map +1 -0
  72. package/dist/pickers.mjs +4200 -0
  73. package/dist/pickers.mjs.map +1 -0
  74. package/dist/plugin.d.mts +1 -0
  75. package/dist/plugin.d.ts +1 -0
  76. package/dist/plugin.js +13 -0
  77. package/dist/plugin.js.map +1 -0
  78. package/dist/plugin.mjs +3 -0
  79. package/dist/plugin.mjs.map +1 -0
  80. package/dist/scroll-area-CVS6HyLl.d.mts +33 -0
  81. package/dist/scroll-area-CVS6HyLl.d.ts +33 -0
  82. package/dist/shapes.d.mts +1119 -0
  83. package/dist/shapes.d.ts +1119 -0
  84. package/dist/shapes.js +2941 -0
  85. package/dist/shapes.js.map +1 -0
  86. package/dist/shapes.mjs +2889 -0
  87. package/dist/shapes.mjs.map +1 -0
  88. package/dist/side-sheet-modal-BY6VCC8p.d.mts +553 -0
  89. package/dist/side-sheet-modal-CglP6KYA.d.ts +553 -0
  90. package/dist/split-button-trailing-uncheckable-C5CLCIKP.d.ts +731 -0
  91. package/dist/split-button-trailing-uncheckable-MXj_kyNt.d.mts +731 -0
  92. package/dist/text-field-eAIpz9z1.d.mts +1038 -0
  93. package/dist/text-field-eAIpz9z1.d.ts +1038 -0
  94. package/dist/typography-339RV6v7.d.mts +486 -0
  95. package/dist/typography-339RV6v7.d.ts +486 -0
  96. package/dist/typography.css +22 -0
  97. package/dist/typography.css.d.ts +2 -0
  98. 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
@@ -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 };