@rdlabo/ionic-theme-md3 0.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/dist/css/components/ion-action-sheet.css +1 -0
  4. package/dist/css/components/ion-alert.css +1 -0
  5. package/dist/css/components/ion-button.css +1 -0
  6. package/dist/css/components/ion-card.css +1 -0
  7. package/dist/css/components/ion-chip.css +1 -0
  8. package/dist/css/components/ion-content.css +1 -0
  9. package/dist/css/components/ion-datetime.css +1 -0
  10. package/dist/css/components/ion-fab.css +1 -0
  11. package/dist/css/components/ion-list.css +1 -0
  12. package/dist/css/components/ion-loading.css +1 -0
  13. package/dist/css/components/ion-modal.css +1 -0
  14. package/dist/css/components/ion-picker.css +1 -0
  15. package/dist/css/components/ion-popover.css +1 -0
  16. package/dist/css/components/ion-range.css +1 -0
  17. package/dist/css/components/ion-searchbar.css +1 -0
  18. package/dist/css/components/ion-segment.css +1 -0
  19. package/dist/css/components/ion-tabs.css +1 -0
  20. package/dist/css/components/ion-toast.css +1 -0
  21. package/dist/css/components/ion-toggle.css +1 -0
  22. package/dist/css/components/ion-toolbar.css +1 -0
  23. package/dist/css/default-variables.css +1 -0
  24. package/dist/css/ionic-theme-md3.css +1 -0
  25. package/dist/css/md-remove-ios-class-effect.css +1 -0
  26. package/dist/css/utils/theme-list-inset.css +1 -0
  27. package/package.json +48 -0
  28. package/src/styles/components/ion-action-sheet.scss +17 -0
  29. package/src/styles/components/ion-alert.scss +23 -0
  30. package/src/styles/components/ion-button.scss +117 -0
  31. package/src/styles/components/ion-card.scss +8 -0
  32. package/src/styles/components/ion-chip.scss +19 -0
  33. package/src/styles/components/ion-content.scss +2 -0
  34. package/src/styles/components/ion-datetime.scss +2 -0
  35. package/src/styles/components/ion-fab.scss +38 -0
  36. package/src/styles/components/ion-list.scss +43 -0
  37. package/src/styles/components/ion-loading.scss +6 -0
  38. package/src/styles/components/ion-modal.scss +19 -0
  39. package/src/styles/components/ion-picker.scss +2 -0
  40. package/src/styles/components/ion-popover.scss +12 -0
  41. package/src/styles/components/ion-range.scss +54 -0
  42. package/src/styles/components/ion-searchbar.scss +7 -0
  43. package/src/styles/components/ion-segment.scss +2 -0
  44. package/src/styles/components/ion-tabs.scss +35 -0
  45. package/src/styles/components/ion-toast.scss +4 -0
  46. package/src/styles/components/ion-toggle.scss +40 -0
  47. package/src/styles/components/ion-toolbar.scss +4 -0
  48. package/src/styles/default-variables.scss +25 -0
  49. package/src/styles/ionic-theme-md3.scss +20 -0
  50. package/src/styles/md-remove-ios-class-effect.scss +41 -0
  51. package/src/styles/utils/theme-list-inset.scss +98 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # Ionic Theme Material Design 3
2
+
3
+ A CSS/JS theme library that applies Material Design 3 design system to Ionic applications.
4
+
5
+ ![](screenshots/md3.png)
6
+
7
+ DEMO is here: https://ionic-theme-md3.netlify.app/
8
+
9
+ ## Overview
10
+
11
+ This library provides CSS/JS files that bring the Material Design 3 design system to Ionic applications. It updates the look and feel of Ionic components to match the latest Material Design 3 guidelines.
12
+
13
+ This project aims to follow the core concepts of Ionic as closely as possible, while placing a strong emphasis on compatibility with `@rdlabo/ionic-theme-ios26`. Just as Ionic provides beautiful styling whether it displays the ios or md theme from a single HTML structure, our goal is to ensure that this theme and `@rdlabo/ionic-theme-ios26` are fully compatible.
14
+
15
+ ### Related Projects
16
+
17
+ If you need a more comprehensive Material Design 3 implementation, you may also be interested in:
18
+
19
+ - **[md3-for-ionic](https://github.com/danielkleebinder/md3-for-ionic)** by danielkleebinder
20
+
21
+ > **Note:** This theme is purpose-built for compatibility with Ionic's design approach and `@rdlabo/ionic-theme-ios26`; it is not intended as a strict, full MD3 recreation.
22
+
23
+
24
+ ## 💖 Support This Project
25
+
26
+ Enjoying this library? Your support helps keep it alive and growing!
27
+ Sponsoring means you directly contribute to new features, improvements, and maintenance.
28
+
29
+ [Become a Sponsor →](https://github.com/sponsors/rdlabo)
30
+
31
+
32
+ ## Setup
33
+
34
+ This is a CSS theme for extending your Ionic project. It does not work on its own, so use it together with the Ionic Framework.
35
+
36
+ ```bash
37
+ npm install @rdlabo/ionic-theme-md3
38
+ ```
39
+
40
+ And import the theme in your project's main CSS file (e.g., `src/styles.scss`).
41
+
42
+ ```css
43
+ @import '@rdlabo/ionic-theme-md3/dist/css/default-variables.css';
44
+ @import '@rdlabo/ionic-theme-md3/dist/css/ionic-theme-md3.css';
45
+ ```
46
+
47
+ ## Development & Testing
48
+
49
+ ### Demo Application
50
+
51
+ The `demo/` directory contains an Angular application for testing and demonstrating the theme. To run the demo:
52
+
53
+ ```bash
54
+ cd demo
55
+ npm install
56
+ npm start
57
+ ```
58
+
59
+ ### Visual Regression Testing
60
+
61
+ We use Playwright for visual regression testing to ensure consistent styling across all components. The test suite automatically captures screenshots of all routes in both light and dark modes.
62
+
63
+ #### Running Tests
64
+
65
+ ```bash
66
+ cd demo
67
+
68
+ # Run all E2E tests
69
+ npm run test:e2e
70
+
71
+ # Run tests in UI mode (interactive)
72
+ npm run test:e2e:ui
73
+
74
+ # Debug tests
75
+ npm run test:e2e:debug
76
+
77
+ # Update baseline screenshots (when intentionally changing UI)
78
+ npm run test:e2e:update
79
+ ```
@@ -0,0 +1 @@
1
+ ion-action-sheet.md:not(.md3-disabled){--max-width: 640px !important}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container{overflow:hidden;border-radius:28px 28px 0 0;box-shadow:var(--token-elevation-1)}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container .action-sheet-title{padding:24px 24px 16px}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container .action-sheet-button{padding:12px 24px}
@@ -0,0 +1 @@
1
+ ion-alert.md:not(.md3-disabled){--backdrop-opacity: 0.2;--min-width: 280px;--max-width: 560px;transition:transform 200ms ease}ion-alert.md:not(.md3-disabled) .alert-wrapper{border-radius:24px;box-shadow:var(--token-elevation-3)}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-head{padding-top:24px;padding-bottom:16px}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-message{padding-bottom:24px}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-message:empty{padding-bottom:0}
@@ -0,0 +1 @@
1
+ ion-buttons.md:not(.md3-disabled) ion-button.md:not(.md3-disabled){--border-radius: 999px}ion-buttons.md:not(.md3-disabled) ion-button.md:not(.md3-disabled)::part(native){height:48px}ion-buttons.md:not(.md3-disabled) ion-button.md:not(.md3-disabled).button-has-icon-only::part(native){width:48px;height:48px}ion-button.md:not(.md3-disabled){--box-shadow: none;--padding-start: 16px;--padding-end: 16px;--border-radius: 999px}ion-button.md:not(.md3-disabled).button-square{--border-radius: 12px}ion-button.md:not(.md3-disabled)::part(native){height:40px}ion-button.md:not(.md3-disabled).button-has-icon-only::part(native){width:40px;height:40px}ion-button.md:not(.md3-disabled).button-has-icon-only{--padding-start: 0;--padding-end: 0}ion-button.md:not(.md3-disabled).button-has-icon-only ion-icon[name=close-outline]{font-size:2rem}ion-button.md:not(.md3-disabled) ion-icon{font-size:24px}ion-button.md:not(.md3-disabled) ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled) ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-small{--padding-start: 12px;--padding-end: 12px}ion-button.md:not(.md3-disabled).button-small::part(native){height:32px}ion-button.md:not(.md3-disabled).button-small.button-has-icon-only::part(native){width:32px;height:32px}ion-button.md:not(.md3-disabled).button-small ion-icon{font-size:20px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:4px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=end]{margin-inline-start:4px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-large{--padding-start: 24px;--padding-end: 24px}ion-button.md:not(.md3-disabled).button-large.button-square{--border-radius: 16px}ion-button.md:not(.md3-disabled).button-large::part(native){height:56px}ion-button.md:not(.md3-disabled).button-large.button-has-icon-only::part(native){width:56px;height:56px}ion-button.md:not(.md3-disabled).button-large ion-icon{font-size:24px}ion-button.md:not(.md3-disabled).button-large ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled).button-large ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}
@@ -0,0 +1 @@
1
+ ion-card.md:not(.md3-disabled){border-radius:12px;box-shadow:var(--token-elevation-1)}ion-card.md:not(.md3-disabled) ion-list ion-item{--padding-start: 0}
@@ -0,0 +1 @@
1
+ ion-chip.md:not(.md3-disabled){padding-inline-start:16px;padding-inline-end:16px;border-radius:8px}ion-chip.md:not(.md3-disabled) ion-icon{font-size:18px}ion-chip.md:not(.md3-disabled) ion-icon:first-child{margin-inline-start:-8px;margin-inline-end:8px}ion-chip.md:not(.md3-disabled) ion-icon:last-child{margin-inline-start:8px;margin-inline-end:-8px}
@@ -0,0 +1 @@
1
+ ion-fab.md:not(.md3-disabled) ion-fab-button{width:56px;height:56px;--border-radius: 16px;--transition: border-radius var(--token-expressive-fast-special);--box-shadow: var(--token-elevation-3)}ion-fab.md:not(.md3-disabled) ion-fab-button ion-icon{width:24px;height:24px}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-close-active{--border-radius: 50%}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-in-list{--border-radius: 50%}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-small{width:40px;height:40px;--border-radius: 12px}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-small.fab-button-close-active{--border-radius: 50%}ion-fab.md:not(.md3-disabled):has(.fab-button-small) ion-fab-button{width:40px;height:40px}
@@ -0,0 +1 @@
1
+ ion-list.md:not(.md3-disabled).list-inset{background:rgba(0,0,0,0)}ion-list.md:not(.md3-disabled).list-inset ion-list-header{display:flex;align-items:center}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-label{font-size:.9rem;margin:8px 4px 4px;color:var(--ion-color-medium-tint)}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-button{margin-top:8px}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-note{font-size:.9rem;margin:8px 16px 4px 0}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label{width:100%;text-align:center;padding:32px 16px 16px;transform:translateX(5px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-header.header-collapse-condense>ion-toolbar{--min-height: 0;visibility:hidden}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-icon{font-size:2.8rem;color:#fff;border-radius:20%;padding:6px}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label h2{font-size:1.2rem;font-weight:bold;margin-top:8px}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-text{font-size:.9rem}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item ion-text[slot=end],ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item ion-text[slot=end],ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item ion-text[slot=end],ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item ion-text[slot=end]{padding-left:8px}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item.item-disabled,ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item.item-disabled,ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item.item-disabled,ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item.item-disabled{opacity:1}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item.item-disabled>*,ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item.item-disabled>*,ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item.item-disabled>*,ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item.item-disabled>*{opacity:.4}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item.item-disabled::part(detail-icon),ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item.item-disabled::part(detail-icon),ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item.item-disabled::part(detail-icon),ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item.item-disabled::part(detail-icon){opacity:.1}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item ion-button[slot=end].ion-align-self-end,ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item ion-button[slot=end].ion-align-self-end,ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item ion-button[slot=end].ion-align-self-end,ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item ion-button[slot=end].ion-align-self-end{transform:translateY(-7px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item ion-button[slot=end] ion-icon[slot=icon-only],ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item ion-button[slot=end] ion-icon[slot=icon-only],ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item ion-button[slot=end] ion-icon[slot=icon-only],ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item ion-button[slot=end] ion-icon[slot=icon-only]{font-size:1.2rem !important;transform:translateY(4px)}ion-list.md:not(.md3-disabled).list-inset>ion-note{color:var(--ion-color-medium-tint);font-size:.9rem;display:block;margin:8px calc(20px + var(--ion-safe-area-right)) 8px calc(20px + var(--ion-safe-area-left))}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item{--border-color: var(--ion-color-light, #fff)}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item:not(.item-lines-inset):not(.item-lines-none){--border-radius: 4px;--border-width: 0px 0px 2px 0px;--inner-border-width: 0;--show-inset-highlight: 0;--show-full-highlight: 1}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating]{transition:transform 200ms ease}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating]:not(.label-floating){transform:translateY(-7px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating].label-floating{transform:translateY(-4px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group,ion-list.md:not(.md3-disabled).list-inset ion-reorder-group,ion-list.md:not(.md3-disabled).list-inset ion-accordion-group,ion-list.md:not(.md3-disabled).list-inset ion-radio-group{border-radius:16px;overflow:hidden}ion-list-header.md:not(.md3-disabled){padding-left:calc(var(--ion-safe-area-left, 0px) + 4px)}
@@ -0,0 +1 @@
1
+ ion-loading.md:not(.md3-disabled) .loading-wrapper{border-radius:24px;box-shadow:var(--token-elevation-3)}
@@ -0,0 +1 @@
1
+ ion-modal.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3)}@media only screen and (min-width: 768px)and (min-height: 600px){ion-modal.md:not(.md3-disabled){--border-radius: 24px}}ion-modal.md:not(.md3-disabled) ion-toolbar{padding-top:6px;--min-height: calc(64px - 6px);padding-right:calc(var(--ion-safe-area-right) + 14px);padding-left:calc(var(--ion-safe-area-left) + 14px)}ion-modal.md:not(.md3-disabled)::part(handle){width:80px}ion-modal.md:not(.md3-disabled).modal-sheet{--border-radius: 30px}
@@ -0,0 +1 @@
1
+
@@ -0,0 +1 @@
1
+ ion-popover.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3)}ion-popover.md:not(.md3-disabled)::part(content){border-radius:12px}ion-popover.md:not(.md3-disabled) ion-select-popover ion-list{padding:0}
@@ -0,0 +1 @@
1
+ ion-range.md:not(.md3-disabled){--height: 56px;--bar-height: 16px;--bar-border-radius: 8px;--knob-background: transparent;--knob-box-shadow: none;--knob-border-radius: 8px;--knob-size: 44px;--pin-background: var(--ion-background-color-step-700, #4a4458)}ion-range.md:not(.md3-disabled).range-has-pin{padding-top:2.6rem}ion-range.md:not(.md3-disabled)::part(knob){width:4px;height:var(--knob-size);background:var(--ion-color-primary);transform:translateX(calc(var(--knob-size) / 2 - 2px))}ion-range.md:not(.md3-disabled)::part(knob):before{content:none}ion-range.md:not(.md3-disabled).ion-color::part(knob){background:var(--ion-color-base, var(--ion-color-primary))}ion-range.md:not(.md3-disabled)::part(tick),ion-range.md:not(.md3-disabled)::part(tick-active){--bar-height: 4px}ion-range.md:not(.md3-disabled)::part(bar-active){border-top-right-radius:calc(var(--knob-border-radius)/2);border-bottom-right-radius:calc(var(--knob-border-radius)/2);margin-right:6px}ion-range.md:not(.md3-disabled)[dual-knobs]::part(bar-active){border-radius:calc(var(--knob-border-radius)/2);margin-left:6px}ion-range.md:not(.md3-disabled)::part(pin){padding:16px;min-width:36px;top:10px}ion-range.md:not(.md3-disabled)::part(pin):before{content:none}
@@ -0,0 +1 @@
1
+ ion-searchbar.md:not(.md3-disabled){--box-shadow: none;--border-radius: 999px;--background: rgba(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)), 0.08);--color: rgb(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)));--icon-color: rgb(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)))}
@@ -0,0 +1 @@
1
+ ion-tab-bar.md:not(.md3-disabled){height:60px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button{--ripple-color: transparent;--color-selected: var(--ion-color-contrast, var(--ion-color-primary-shade))}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-icon{padding:6px 16px;margin-top:6px;border-radius:16px;width:24px;height:20px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-icon::before{content:"";position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(var(--ion-color-contrast-rgb, var(--ion-color-primary-rgb, 2, 137, 255)), 0.2);transform:scaleX(0);transition:transform var(--token-expressive-fast-effects);z-index:-1}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-label{margin-top:2px;margin-bottom:6px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button.tab-selected ion-icon::before{transform:scaleX(1)}
@@ -0,0 +1 @@
1
+ ion-toast.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3);--border-radius: 8px}
@@ -0,0 +1 @@
1
+ ion-toggle.md:not(.md3-disabled){--handle-width: 24px;--handle-height: 24px;--handle-border-radius: 16px;--border-radius: 16px;--handle-box-shadow: none;--handle-spacing: 2px;--handle-transition: transform var(--token-expressive-default-special), background-color var(--token-expressive-default-effects)}ion-toggle.md:not(.md3-disabled)::part(track){box-sizing:border-box;min-height:32px;min-width:52px;border:2px solid var(--ion-text-color-step-450, #79747e);background:var(--ion-background-color-step-100, #e6e0e9)}ion-toggle.md:not(.md3-disabled).toggle-checked::part(track){border-color:var(--ion-color-base);background:var(--ion-color-base)}ion-toggle.md:not(.md3-disabled)::part(handle){background:var(--ion-text-color-step-450, #79747e)}ion-toggle.md:not(.md3-disabled).toggle-checked::part(handle){background:var(--ion-color-contrast)}ion-toggle.md:not(.md3-disabled):not(.ion-color).toggle-checked::part(track){border-color:var(--ion-color-primary);background:var(--ion-color-primary)}ion-toggle.md:not(.md3-disabled):not(.ion-color).toggle-checked::part(handle){background:var(--ion-color-primary-contrast)}
@@ -0,0 +1 @@
1
+ ion-header.md:not(.md3-disabled),ion-footer.md:not(.md3-disabled){box-shadow:none}
@@ -0,0 +1 @@
1
+ :root{--token-elevation-0: rgba(0, 0, 0, 0.2) 0px 0px 0px 0px, rgba(0, 0, 0, 0.14) 0px 0px 0px 0px, rgba(0, 0, 0, 0.12) 0px 0px 0px 0px;--token-elevation-1: rgba(0, 0, 0, 0.2) 0px 2px 1px -1px, rgba(0, 0, 0, 0.14) 0px 1px 1px 0px, rgba(0, 0, 0, 0.12) 0px 1px 3px 0px;--token-elevation-3: rgba(0, 0, 0, 0.2) 0px 3px 3px -2px, rgba(0, 0, 0, 0.14) 0px 3px 4px 0px, rgba(0, 0, 0, 0.12) 0px 1px 8px 0px;--token-elevation-6: rgba(0, 0, 0, 0.2) 0px 3px 5px -1px, rgba(0, 0, 0, 0.14) 0px 6px 10px 0px, rgba(0, 0, 0, 0.12) 0px 1px 18px 0px;--token-elevation-8: rgba(0, 0, 0, 0.2) 0px 5px 5px -3px, rgba(0, 0, 0, 0.14) 0px 8px 10px 1px, rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;--token-elevation-12: rgba(0, 0, 0, 0.2) 0px 7px 8px -4px, rgba(0, 0, 0, 0.14) 0px 12px 17px 2px, rgba(0, 0, 0, 0.12) 0px 5px 22px 4px;--token-expressive-fast-special: 350ms cubic-bezier(0.42, 1.67, 0.21, 0.9);--token-expressive-default-special: 500ms cubic-bezier(0.38, 1.21, 0.22, 1);--token-expressive-slow-special: 650ms cubic-bezier(0.39, 1.29, 0.35, 0.98);--token-expressive-fast-effects: 150ms cubic-bezier(0.31, 0.94, 0.34, 1);--token-expressive-default-effects: 200ms cubic-bezier(0.34, 0.8, 0.34, 1);--token-expressive-slow-effects: 300ms cubic-bezier(0.34, 0.88, 0.34, 1)}
@@ -0,0 +1 @@
1
+ ion-action-sheet.md:not(.md3-disabled){--max-width: 640px !important}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container{overflow:hidden;border-radius:28px 28px 0 0;box-shadow:var(--token-elevation-1)}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container .action-sheet-title{padding:24px 24px 16px}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container .action-sheet-button{padding:12px 24px}ion-alert.md:not(.md3-disabled){--backdrop-opacity: 0.2;--min-width: 280px;--max-width: 560px;transition:transform 200ms ease}ion-alert.md:not(.md3-disabled) .alert-wrapper{border-radius:24px;box-shadow:var(--token-elevation-3)}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-head{padding-top:24px;padding-bottom:16px}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-message{padding-bottom:24px}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-message:empty{padding-bottom:0}ion-buttons.md:not(.md3-disabled) ion-button.md:not(.md3-disabled){--border-radius: 999px}ion-buttons.md:not(.md3-disabled) ion-button.md:not(.md3-disabled)::part(native){height:48px}ion-buttons.md:not(.md3-disabled) ion-button.md:not(.md3-disabled).button-has-icon-only::part(native){width:48px;height:48px}ion-button.md:not(.md3-disabled){--box-shadow: none;--padding-start: 16px;--padding-end: 16px;--border-radius: 999px}ion-button.md:not(.md3-disabled).button-square{--border-radius: 12px}ion-button.md:not(.md3-disabled)::part(native){height:40px}ion-button.md:not(.md3-disabled).button-has-icon-only::part(native){width:40px;height:40px}ion-button.md:not(.md3-disabled).button-has-icon-only{--padding-start: 0;--padding-end: 0}ion-button.md:not(.md3-disabled).button-has-icon-only ion-icon[name=close-outline]{font-size:2rem}ion-button.md:not(.md3-disabled) ion-icon{font-size:24px}ion-button.md:not(.md3-disabled) ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled) ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-small{--padding-start: 12px;--padding-end: 12px}ion-button.md:not(.md3-disabled).button-small::part(native){height:32px}ion-button.md:not(.md3-disabled).button-small.button-has-icon-only::part(native){width:32px;height:32px}ion-button.md:not(.md3-disabled).button-small ion-icon{font-size:20px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:4px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=end]{margin-inline-start:4px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-large{--padding-start: 24px;--padding-end: 24px}ion-button.md:not(.md3-disabled).button-large.button-square{--border-radius: 16px}ion-button.md:not(.md3-disabled).button-large::part(native){height:56px}ion-button.md:not(.md3-disabled).button-large.button-has-icon-only::part(native){width:56px;height:56px}ion-button.md:not(.md3-disabled).button-large ion-icon{font-size:24px}ion-button.md:not(.md3-disabled).button-large ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled).button-large ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}ion-card.md:not(.md3-disabled){border-radius:12px;box-shadow:var(--token-elevation-1)}ion-card.md:not(.md3-disabled) ion-list ion-item{--padding-start: 0}ion-chip.md:not(.md3-disabled){padding-inline-start:16px;padding-inline-end:16px;border-radius:8px}ion-chip.md:not(.md3-disabled) ion-icon{font-size:18px}ion-chip.md:not(.md3-disabled) ion-icon:first-child{margin-inline-start:-8px;margin-inline-end:8px}ion-chip.md:not(.md3-disabled) ion-icon:last-child{margin-inline-start:8px;margin-inline-end:-8px}ion-fab.md:not(.md3-disabled) ion-fab-button{width:56px;height:56px;--border-radius: 16px;--transition: border-radius var(--token-expressive-fast-special);--box-shadow: var(--token-elevation-3)}ion-fab.md:not(.md3-disabled) ion-fab-button ion-icon{width:24px;height:24px}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-close-active{--border-radius: 50%}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-in-list{--border-radius: 50%}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-small{width:40px;height:40px;--border-radius: 12px}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-small.fab-button-close-active{--border-radius: 50%}ion-fab.md:not(.md3-disabled):has(.fab-button-small) ion-fab-button{width:40px;height:40px}ion-list.md:not(.md3-disabled).list-inset{background:rgba(0,0,0,0)}ion-list.md:not(.md3-disabled).list-inset ion-list-header{display:flex;align-items:center}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-label{font-size:.9rem;margin:8px 4px 4px;color:var(--ion-color-medium-tint)}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-button{margin-top:8px}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-note{font-size:.9rem;margin:8px 16px 4px 0}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label{width:100%;text-align:center;padding:32px 16px 16px;transform:translateX(5px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-header.header-collapse-condense>ion-toolbar{--min-height: 0;visibility:hidden}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-icon{font-size:2.8rem;color:#fff;border-radius:20%;padding:6px}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label h2{font-size:1.2rem;font-weight:bold;margin-top:8px}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-text{font-size:.9rem}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item ion-text[slot=end],ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item ion-text[slot=end],ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item ion-text[slot=end],ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item ion-text[slot=end]{padding-left:8px}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item.item-disabled,ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item.item-disabled,ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item.item-disabled,ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item.item-disabled{opacity:1}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item.item-disabled>*,ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item.item-disabled>*,ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item.item-disabled>*,ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item.item-disabled>*{opacity:.4}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item.item-disabled::part(detail-icon),ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item.item-disabled::part(detail-icon),ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item.item-disabled::part(detail-icon),ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item.item-disabled::part(detail-icon){opacity:.1}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item ion-button[slot=end].ion-align-self-end,ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item ion-button[slot=end].ion-align-self-end,ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item ion-button[slot=end].ion-align-self-end,ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item ion-button[slot=end].ion-align-self-end{transform:translateY(-7px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group ion-item ion-button[slot=end] ion-icon[slot=icon-only],ion-list.md:not(.md3-disabled).list-inset ion-reorder-group ion-item ion-button[slot=end] ion-icon[slot=icon-only],ion-list.md:not(.md3-disabled).list-inset ion-accordion-group ion-item ion-button[slot=end] ion-icon[slot=icon-only],ion-list.md:not(.md3-disabled).list-inset ion-radio-group ion-item ion-button[slot=end] ion-icon[slot=icon-only]{font-size:1.2rem !important;transform:translateY(4px)}ion-list.md:not(.md3-disabled).list-inset>ion-note{color:var(--ion-color-medium-tint);font-size:.9rem;display:block;margin:8px calc(20px + var(--ion-safe-area-right)) 8px calc(20px + var(--ion-safe-area-left))}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item{--border-color: var(--ion-color-light, #fff)}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item:not(.item-lines-inset):not(.item-lines-none){--border-radius: 4px;--border-width: 0px 0px 2px 0px;--inner-border-width: 0;--show-inset-highlight: 0;--show-full-highlight: 1}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating]{transition:transform 200ms ease}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating]:not(.label-floating){transform:translateY(-7px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating].label-floating{transform:translateY(-4px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group,ion-list.md:not(.md3-disabled).list-inset ion-reorder-group,ion-list.md:not(.md3-disabled).list-inset ion-accordion-group,ion-list.md:not(.md3-disabled).list-inset ion-radio-group{border-radius:16px;overflow:hidden}ion-list-header.md:not(.md3-disabled){padding-left:calc(var(--ion-safe-area-left, 0px) + 4px)}ion-loading.md:not(.md3-disabled) .loading-wrapper{border-radius:24px;box-shadow:var(--token-elevation-3)}ion-modal.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3)}@media only screen and (min-width: 768px)and (min-height: 600px){ion-modal.md:not(.md3-disabled){--border-radius: 24px}}ion-modal.md:not(.md3-disabled) ion-toolbar{padding-top:6px;--min-height: calc(64px - 6px);padding-right:calc(var(--ion-safe-area-right) + 14px);padding-left:calc(var(--ion-safe-area-left) + 14px)}ion-modal.md:not(.md3-disabled)::part(handle){width:80px}ion-modal.md:not(.md3-disabled).modal-sheet{--border-radius: 30px}ion-popover.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3)}ion-popover.md:not(.md3-disabled)::part(content){border-radius:12px}ion-popover.md:not(.md3-disabled) ion-select-popover ion-list{padding:0}ion-range.md:not(.md3-disabled){--height: 56px;--bar-height: 16px;--bar-border-radius: 8px;--knob-background: transparent;--knob-box-shadow: none;--knob-border-radius: 8px;--knob-size: 44px;--pin-background: var(--ion-background-color-step-700, #4a4458)}ion-range.md:not(.md3-disabled).range-has-pin{padding-top:2.6rem}ion-range.md:not(.md3-disabled)::part(knob){width:4px;height:var(--knob-size);background:var(--ion-color-primary);transform:translateX(calc(var(--knob-size) / 2 - 2px))}ion-range.md:not(.md3-disabled)::part(knob):before{content:none}ion-range.md:not(.md3-disabled).ion-color::part(knob){background:var(--ion-color-base, var(--ion-color-primary))}ion-range.md:not(.md3-disabled)::part(tick),ion-range.md:not(.md3-disabled)::part(tick-active){--bar-height: 4px}ion-range.md:not(.md3-disabled)::part(bar-active){border-top-right-radius:calc(var(--knob-border-radius)/2);border-bottom-right-radius:calc(var(--knob-border-radius)/2);margin-right:6px}ion-range.md:not(.md3-disabled)[dual-knobs]::part(bar-active){border-radius:calc(var(--knob-border-radius)/2);margin-left:6px}ion-range.md:not(.md3-disabled)::part(pin){padding:16px;min-width:36px;top:10px}ion-range.md:not(.md3-disabled)::part(pin):before{content:none}ion-searchbar.md:not(.md3-disabled){--box-shadow: none;--border-radius: 999px;--background: rgba(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)), 0.08);--color: rgb(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)));--icon-color: rgb(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)))}ion-tab-bar.md:not(.md3-disabled){height:60px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button{--ripple-color: transparent;--color-selected: var(--ion-color-contrast, var(--ion-color-primary-shade))}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-icon{padding:6px 16px;margin-top:6px;border-radius:16px;width:24px;height:20px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-icon::before{content:"";position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(var(--ion-color-contrast-rgb, var(--ion-color-primary-rgb, 2, 137, 255)), 0.2);transform:scaleX(0);transition:transform var(--token-expressive-fast-effects);z-index:-1}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-label{margin-top:2px;margin-bottom:6px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button.tab-selected ion-icon::before{transform:scaleX(1)}ion-toast.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3);--border-radius: 8px}ion-toggle.md:not(.md3-disabled){--handle-width: 24px;--handle-height: 24px;--handle-border-radius: 16px;--border-radius: 16px;--handle-box-shadow: none;--handle-spacing: 2px;--handle-transition: transform var(--token-expressive-default-special), background-color var(--token-expressive-default-effects)}ion-toggle.md:not(.md3-disabled)::part(track){box-sizing:border-box;min-height:32px;min-width:52px;border:2px solid var(--ion-text-color-step-450, #79747e);background:var(--ion-background-color-step-100, #e6e0e9)}ion-toggle.md:not(.md3-disabled).toggle-checked::part(track){border-color:var(--ion-color-base);background:var(--ion-color-base)}ion-toggle.md:not(.md3-disabled)::part(handle){background:var(--ion-text-color-step-450, #79747e)}ion-toggle.md:not(.md3-disabled).toggle-checked::part(handle){background:var(--ion-color-contrast)}ion-toggle.md:not(.md3-disabled):not(.ion-color).toggle-checked::part(track){border-color:var(--ion-color-primary);background:var(--ion-color-primary)}ion-toggle.md:not(.md3-disabled):not(.ion-color).toggle-checked::part(handle){background:var(--ion-color-primary-contrast)}ion-header.md:not(.md3-disabled),ion-footer.md:not(.md3-disabled){box-shadow:none}
@@ -0,0 +1 @@
1
+ ion-toolbar.md:not(.ios26-disabled)>ion-back-button[slot=start]{margin-inline-start:4px}ion-toolbar.md:not(.ios26-disabled)>ion-back-button[slot=end]{margin-inline-end:4px}ion-buttons.md ion-button.md:not(.ios26-disabled).button-default{--color: initial;--background: transparent;--background-activated: transparent;--background-focused: transparent;--background-hover: transparent}ion-buttons.md ion-button.md:not(.ios26-disabled).button-default.button-has-icon-only{--padding-top: 12px;--padding-end: 12px;--padding-bottom: 12px;--padding-start: 12px;--border-radius: 50%;margin:0;width:3rem;height:3rem}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@rdlabo/ionic-theme-md3",
3
+ "version": "0.0.0",
4
+ "description": "Material Design 3 Theme for Ionic Framework",
5
+ "files": [
6
+ "dist",
7
+ "src",
8
+ "package.json"
9
+ ],
10
+ "scripts": {
11
+ "build": "rm -rf dist/css && sass src/styles:dist/css --style=compressed --no-source-map",
12
+ "build:demo": "npm run build && cd demo && npm install && npm run build -- --configuration=production",
13
+ "prepare": "husky install",
14
+ "lint": "prettier --check \"./**/*.{scss,ts}\" && prettier --parser angular --check \"./**/*.html\"",
15
+ "fmt": "prettier --write \"./**/*.{scss,ts}\" && prettier --parser angular --write \"./**/*.html\"",
16
+ "release": "np --no-tests",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+ssh://git@github.com/rdlabo-team/ionic-theme-md3.git"
22
+ },
23
+ "keywords": [
24
+ "ionic",
25
+ "framework",
26
+ "theme",
27
+ "css",
28
+ "md3"
29
+ ],
30
+ "author": "Masahiko Sakakibara <sakakibara@rdlabo.jp>",
31
+ "license": "MIT",
32
+ "bugs": {
33
+ "url": "https://github.com/rdlabo-team/ionic-theme-md3/issues"
34
+ },
35
+ "homepage": "https://github.com/rdlabo-team/ionic-theme-md3#readme",
36
+ "devDependencies": {
37
+ "@ionic/angular": "^8.7.6",
38
+ "husky": "^9.1.7",
39
+ "lint-staged": "^16.2.1",
40
+ "np": "^10.2.0",
41
+ "prettier": "^3.6.2",
42
+ "sass": "^1.93.2",
43
+ "typescript": "^5.9.3"
44
+ },
45
+ "peerDependencies": {
46
+ "@ionic/core": "> 8.0.0"
47
+ }
48
+ }
@@ -0,0 +1,17 @@
1
+ ion-action-sheet.md:not(.md3-disabled) {
2
+ --max-width: 640px !important;
3
+
4
+ .action-sheet-container {
5
+ overflow: hidden;
6
+ border-radius: 28px 28px 0 0;
7
+ box-shadow: var(--token-elevation-1);
8
+
9
+ .action-sheet-title {
10
+ padding: 24px 24px 16px;
11
+ }
12
+
13
+ .action-sheet-button {
14
+ padding: 12px 24px;
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,23 @@
1
+ ion-alert.md:not(.md3-disabled) {
2
+ --backdrop-opacity: 0.2;
3
+ --min-width: 280px;
4
+ --max-width: 560px;
5
+ transition: transform 200ms ease;
6
+
7
+ .alert-wrapper {
8
+ border-radius: 24px;
9
+ box-shadow: var(--token-elevation-3);
10
+
11
+ .alert-head {
12
+ padding-top: 24px;
13
+ padding-bottom: 16px;
14
+ }
15
+
16
+ .alert-message {
17
+ padding-bottom: 24px;
18
+ &:empty {
19
+ padding-bottom: 0;
20
+ }
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,117 @@
1
+ @mixin theme-buttons {
2
+ ion-button.md:not(.md3-disabled) {
3
+ --border-radius: 999px;
4
+
5
+ &::part(native) {
6
+ height: 48px;
7
+ }
8
+ &.button-has-icon-only {
9
+ &::part(native) {
10
+ width: 48px;
11
+ height: 48px;
12
+ }
13
+ }
14
+ }
15
+ }
16
+
17
+ @mixin theme-button() {
18
+ // Default is be round button
19
+ --box-shadow: none;
20
+ --padding-start: 16px;
21
+ --padding-end: 16px;
22
+ --border-radius: 999px;
23
+
24
+ &.button-square {
25
+ --border-radius: 12px;
26
+ }
27
+
28
+ &::part(native) {
29
+ height: 40px;
30
+ }
31
+ &.button-has-icon-only {
32
+ &::part(native) {
33
+ width: 40px;
34
+ height: 40px;
35
+ }
36
+ --padding-start: 0;
37
+ --padding-end: 0;
38
+
39
+ ion-icon {
40
+ &[name='close-outline'] {
41
+ font-size: 2rem;
42
+ }
43
+ }
44
+ }
45
+ ion-icon {
46
+ font-size: 24px;
47
+ &[slot='start'] {
48
+ margin-inline-start: 0;
49
+ margin-inline-end: 8px;
50
+ }
51
+ &[slot='end'] {
52
+ margin-inline-start: 8px;
53
+ margin-inline-end: 0;
54
+ }
55
+ }
56
+
57
+ &.button-small {
58
+ --padding-start: 12px;
59
+ --padding-end: 12px;
60
+ &::part(native) {
61
+ height: 32px;
62
+ }
63
+ &.button-has-icon-only::part(native) {
64
+ width: 32px;
65
+ height: 32px;
66
+ }
67
+ ion-icon {
68
+ font-size: 20px;
69
+ &[slot='start'] {
70
+ margin-inline-start: 0;
71
+ margin-inline-end: 4px;
72
+ }
73
+ &[slot='end'] {
74
+ margin-inline-start: 4px;
75
+ margin-inline-end: 0;
76
+ }
77
+ }
78
+ }
79
+
80
+ &.button-large {
81
+ --padding-start: 24px;
82
+ --padding-end: 24px;
83
+
84
+ &.button-square {
85
+ --border-radius: 16px;
86
+ }
87
+
88
+ &::part(native) {
89
+ height: 56px;
90
+ }
91
+ &.button-has-icon-only::part(native) {
92
+ width: 56px;
93
+ height: 56px;
94
+ }
95
+ ion-icon {
96
+ font-size: 24px;
97
+ &[slot='start'] {
98
+ margin-inline-start: 0;
99
+ margin-inline-end: 8px;
100
+ }
101
+ &[slot='end'] {
102
+ margin-inline-start: 8px;
103
+ margin-inline-end: 0;
104
+ }
105
+ }
106
+ }
107
+ }
108
+
109
+ ion-buttons.md:not(.md3-disabled) {
110
+ @include theme-buttons;
111
+ }
112
+ ion-button.md:not(.md3-disabled) {
113
+ @include theme-button;
114
+ }
115
+ ion-back-button.md:not(.md3-disabled) {
116
+ //@include theme-button;
117
+ }
@@ -0,0 +1,8 @@
1
+ ion-card.md:not(.md3-disabled) {
2
+ border-radius: 12px;
3
+ box-shadow: var(--token-elevation-1);
4
+
5
+ ion-list ion-item {
6
+ --padding-start: 0;
7
+ }
8
+ }
@@ -0,0 +1,19 @@
1
+ ion-chip.md:not(.md3-disabled) {
2
+ padding-inline-start: 16px;
3
+ padding-inline-end: 16px;
4
+ border-radius: 8px;
5
+
6
+ ion-icon {
7
+ font-size: 18px;
8
+
9
+ &:first-child {
10
+ margin-inline-start: -8px;
11
+ margin-inline-end: 8px;
12
+ }
13
+
14
+ &:last-child {
15
+ margin-inline-start: 8px;
16
+ margin-inline-end: -8px;
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,2 @@
1
+ .md:not(.md3-disabled) {
2
+ }
@@ -0,0 +1,2 @@
1
+ ion-datetime.md:not(.md3-disabled) {
2
+ }
@@ -0,0 +1,38 @@
1
+ ion-fab.md:not(.md3-disabled) {
2
+ ion-fab-button {
3
+ width: 56px;
4
+ height: 56px;
5
+ --border-radius: 16px;
6
+ --transition: border-radius var(--token-expressive-fast-special);
7
+ --box-shadow: var(--token-elevation-3);
8
+
9
+ ion-icon {
10
+ width: 24px;
11
+ height: 24px;
12
+ }
13
+
14
+ &.fab-button-close-active {
15
+ --border-radius: 50%;
16
+ }
17
+
18
+ &.fab-button-in-list {
19
+ --border-radius: 50%;
20
+ }
21
+
22
+ &.fab-button-small {
23
+ width: 40px;
24
+ height: 40px;
25
+ --border-radius: 12px;
26
+ &.fab-button-close-active {
27
+ --border-radius: 50%;
28
+ }
29
+ }
30
+ }
31
+
32
+ &:has(.fab-button-small) {
33
+ ion-fab-button {
34
+ width: 40px;
35
+ height: 40px;
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,43 @@
1
+ @use '../utils/theme-list-inset';
2
+
3
+ ion-list.md:not(.md3-disabled).list-inset {
4
+ @include theme-list-inset.ion-list-inset();
5
+
6
+ ion-item-group > ion-item {
7
+ --border-color: var(--ion-color-light, #fff);
8
+
9
+ &:not(.item-lines-inset):not(.item-lines-none) {
10
+ --border-radius: 4px;
11
+ --border-width: #{0px 0px 2px 0px};
12
+ --inner-border-width: 0;
13
+ --show-inset-highlight: 0;
14
+ --show-full-highlight: 1;
15
+ }
16
+
17
+ & > ion-input[labelplacement='floating'] {
18
+ transition: transform 200ms ease;
19
+
20
+ &:not(.label-floating) {
21
+ transform: translateY(-7px);
22
+ }
23
+
24
+ &.label-floating {
25
+ transform: translateY(-4px);
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ ion-list.md:not(.md3-disabled).list-inset {
32
+ ion-item-group,
33
+ ion-reorder-group,
34
+ ion-accordion-group,
35
+ ion-radio-group {
36
+ border-radius: 16px;
37
+ overflow: hidden;
38
+ }
39
+ }
40
+
41
+ ion-list-header.md:not(.md3-disabled) {
42
+ padding-left: calc(var(--ion-safe-area-left, 0px) + 4px);
43
+ }
@@ -0,0 +1,6 @@
1
+ ion-loading.md:not(.md3-disabled) {
2
+ .loading-wrapper {
3
+ border-radius: 24px;
4
+ box-shadow: var(--token-elevation-3);
5
+ }
6
+ }
@@ -0,0 +1,19 @@
1
+ ion-modal.md:not(.md3-disabled) {
2
+ --box-shadow: var(--token-elevation-3);
3
+ @media only screen and (min-width: 768px) and (min-height: 600px) {
4
+ --border-radius: 24px;
5
+ }
6
+ ion-toolbar {
7
+ padding-top: 6px;
8
+ --min-height: calc(64px - 6px);
9
+ padding-right: calc(var(--ion-safe-area-right) + 14px);
10
+ padding-left: calc(var(--ion-safe-area-left) + 14px);
11
+ }
12
+ &::part(handle) {
13
+ width: 80px;
14
+ }
15
+
16
+ &.modal-sheet {
17
+ --border-radius: 30px;
18
+ }
19
+ }
@@ -0,0 +1,2 @@
1
+ ion-picker.md:not(.md3-disabled) {
2
+ }
@@ -0,0 +1,12 @@
1
+ ion-popover.md:not(.md3-disabled) {
2
+ --box-shadow: var(--token-elevation-3);
3
+ &::part(content) {
4
+ border-radius: 12px;
5
+ }
6
+
7
+ ion-select-popover {
8
+ ion-list {
9
+ padding: 0;
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,54 @@
1
+ ion-range.md:not(.md3-disabled) {
2
+ --height: 56px;
3
+ --bar-height: 16px;
4
+ --bar-border-radius: 8px;
5
+
6
+ --knob-background: transparent;
7
+ --knob-box-shadow: none;
8
+ --knob-border-radius: 8px;
9
+ --knob-size: 44px;
10
+
11
+ --pin-background: var(--ion-background-color-step-700, #4a4458);
12
+
13
+ &.range-has-pin {
14
+ padding-top: 2.6rem;
15
+ }
16
+
17
+ &::part(knob) {
18
+ width: 4px;
19
+ height: var(--knob-size);
20
+ background: var(--ion-color-primary);
21
+ transform: translateX(calc(var(--knob-size) / 2 - 2px));
22
+ &:before {
23
+ content: none;
24
+ }
25
+ }
26
+ &.ion-color::part(knob) {
27
+ background: var(--ion-color-base, var(--ion-color-primary));
28
+ }
29
+
30
+ &::part(tick),
31
+ &::part(tick-active) {
32
+ --bar-height: 4px;
33
+ }
34
+
35
+ &::part(bar-active) {
36
+ border-top-right-radius: calc(var(--knob-border-radius) / 2);
37
+ border-bottom-right-radius: calc(var(--knob-border-radius) / 2);
38
+ margin-right: 6px;
39
+ }
40
+
41
+ &[dual-knobs]::part(bar-active) {
42
+ border-radius: calc(var(--knob-border-radius) / 2);
43
+ margin-left: 6px;
44
+ }
45
+
46
+ &::part(pin) {
47
+ padding: 16px;
48
+ min-width: 36px;
49
+ top: 10px;
50
+ &:before {
51
+ content: none;
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,7 @@
1
+ ion-searchbar.md:not(.md3-disabled) {
2
+ --box-shadow: none;
3
+ --border-radius: 999px;
4
+ --background: rgba(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)), 0.08);
5
+ --color: rgb(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)));
6
+ --icon-color: rgb(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)));
7
+ }
@@ -0,0 +1,2 @@
1
+ ion-segment.md:not(.md3-disabled) {
2
+ }
@@ -0,0 +1,35 @@
1
+ ion-tab-bar.md:not(.md3-disabled) {
2
+ height: 60px;
3
+ ion-tab-button {
4
+ --ripple-color: transparent;
5
+ --color-selected: var(--ion-color-contrast, var(--ion-color-primary-shade));
6
+ ion-icon {
7
+ padding: 6px 16px;
8
+ margin-top: 6px;
9
+ border-radius: 16px;
10
+ width: calc(56px - 32px);
11
+ height: calc(32px - 12px);
12
+ &::before {
13
+ content: '';
14
+ position: absolute;
15
+ left: 0;
16
+ top: 0;
17
+ width: 100%;
18
+ height: 100%;
19
+ background-color: rgba(var(--ion-color-contrast-rgb, var(--ion-color-primary-rgb, 2, 137, 255)), 0.2);
20
+ transform: scaleX(0);
21
+ transition: transform var(--token-expressive-fast-effects);
22
+ z-index: -1;
23
+ }
24
+ }
25
+ ion-label {
26
+ margin-top: 2px;
27
+ margin-bottom: 6px;
28
+ }
29
+ &.tab-selected {
30
+ ion-icon::before {
31
+ transform: scaleX(1);
32
+ }
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,4 @@
1
+ ion-toast.md:not(.md3-disabled) {
2
+ --box-shadow: var(--token-elevation-3);
3
+ --border-radius: 8px;
4
+ }
@@ -0,0 +1,40 @@
1
+ ion-toggle.md:not(.md3-disabled) {
2
+ --handle-width: 24px;
3
+ --handle-height: 24px;
4
+ --handle-border-radius: 16px;
5
+ --border-radius: 16px;
6
+ --handle-box-shadow: none;
7
+ --handle-spacing: 2px;
8
+ --handle-transition: transform var(--token-expressive-default-special), background-color var(--token-expressive-default-effects);
9
+
10
+ &::part(track) {
11
+ box-sizing: border-box;
12
+ min-height: 32px;
13
+ min-width: 52px;
14
+ border: 2px solid var(--ion-text-color-step-450, #79747e);
15
+ background: var(--ion-background-color-step-100, #e6e0e9);
16
+ }
17
+
18
+ &.toggle-checked::part(track) {
19
+ border-color: var(--ion-color-base);
20
+ background: var(--ion-color-base);
21
+ }
22
+
23
+ &::part(handle) {
24
+ background: var(--ion-text-color-step-450, #79747e);
25
+ }
26
+
27
+ &.toggle-checked::part(handle) {
28
+ background: var(--ion-color-contrast);
29
+ }
30
+
31
+ &:not(.ion-color) {
32
+ &.toggle-checked::part(track) {
33
+ border-color: var(--ion-color-primary);
34
+ background: var(--ion-color-primary);
35
+ }
36
+ &.toggle-checked::part(handle) {
37
+ background: var(--ion-color-primary-contrast);
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,4 @@
1
+ ion-header.md:not(.md3-disabled),
2
+ ion-footer.md:not(.md3-disabled) {
3
+ box-shadow: none;
4
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @naming
3
+ * prefix: ios26
4
+ * target-element: tab-button
5
+ * target css property: color
6
+ * status: selected
7
+ * additional information: rgb
8
+ */
9
+
10
+ :root {
11
+ --token-elevation-0: rgba(0, 0, 0, 0.2) 0px 0px 0px 0px, rgba(0, 0, 0, 0.14) 0px 0px 0px 0px, rgba(0, 0, 0, 0.12) 0px 0px 0px 0px;
12
+ --token-elevation-1: rgba(0, 0, 0, 0.2) 0px 2px 1px -1px, rgba(0, 0, 0, 0.14) 0px 1px 1px 0px, rgba(0, 0, 0, 0.12) 0px 1px 3px 0px;
13
+ --token-elevation-3: rgba(0, 0, 0, 0.2) 0px 3px 3px -2px, rgba(0, 0, 0, 0.14) 0px 3px 4px 0px, rgba(0, 0, 0, 0.12) 0px 1px 8px 0px;
14
+ --token-elevation-6: rgba(0, 0, 0, 0.2) 0px 3px 5px -1px, rgba(0, 0, 0, 0.14) 0px 6px 10px 0px, rgba(0, 0, 0, 0.12) 0px 1px 18px 0px;
15
+ --token-elevation-8: rgba(0, 0, 0, 0.2) 0px 5px 5px -3px, rgba(0, 0, 0, 0.14) 0px 8px 10px 1px, rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;
16
+ --token-elevation-12: rgba(0, 0, 0, 0.2) 0px 7px 8px -4px, rgba(0, 0, 0, 0.14) 0px 12px 17px 2px, rgba(0, 0, 0, 0.12) 0px 5px 22px 4px;
17
+
18
+ --token-expressive-fast-special: 350ms cubic-bezier(0.42, 1.67, 0.21, 0.9);
19
+ --token-expressive-default-special: 500ms cubic-bezier(0.38, 1.21, 0.22, 1);
20
+ --token-expressive-slow-special: 650ms cubic-bezier(0.39, 1.29, 0.35, 0.98);
21
+
22
+ --token-expressive-fast-effects: 150ms cubic-bezier(0.31, 0.94, 0.34, 1);
23
+ --token-expressive-default-effects: 200ms cubic-bezier(0.34, 0.8, 0.34, 1);
24
+ --token-expressive-slow-effects: 300ms cubic-bezier(0.34, 0.88, 0.34, 1);
25
+ }
@@ -0,0 +1,20 @@
1
+ @use 'components/ion-action-sheet';
2
+ @use 'components/ion-alert';
3
+ @use 'components/ion-button';
4
+ @use 'components/ion-card';
5
+ @use 'components/ion-chip';
6
+ @use 'components/ion-content';
7
+ @use 'components/ion-datetime';
8
+ @use 'components/ion-fab';
9
+ @use 'components/ion-list';
10
+ @use 'components/ion-loading';
11
+ @use 'components/ion-modal';
12
+ @use 'components/ion-picker';
13
+ @use 'components/ion-popover';
14
+ @use 'components/ion-range';
15
+ @use 'components/ion-searchbar';
16
+ @use 'components/ion-segment';
17
+ @use 'components/ion-tabs';
18
+ @use 'components/ion-toast';
19
+ @use 'components/ion-toggle';
20
+ @use 'components/ion-toolbar';
@@ -0,0 +1,41 @@
1
+ ion-toolbar.md:not(.ios26-disabled) {
2
+ /**
3
+ * This will add margin-inline to the ion-button
4
+ * for ion-buttons are removed due to collapse.
5
+ */
6
+ & > ion-back-button {
7
+ &[slot='start'] {
8
+ margin-inline-start: 4px;
9
+ }
10
+ &[slot='end'] {
11
+ margin-inline-end: 4px;
12
+ }
13
+ }
14
+ }
15
+
16
+ ion-buttons.md {
17
+ /**
18
+ * ion-buttons.ios26-disabled > ion-button.button-default is for ios26 structure.
19
+ * for .md, remove button-default styles. Will be button-clear.
20
+ */
21
+ ion-button.md:not(.ios26-disabled).button-default {
22
+ // copy .button-clear
23
+ --color: initial;
24
+ --background: transparent;
25
+ --background-activated: transparent;
26
+ --background-focused: transparent;
27
+ --background-hover: transparent;
28
+
29
+ // copy .button-has-icon-only.button-clear
30
+ &.button-has-icon-only {
31
+ --padding-top: 12px;
32
+ --padding-end: 12px;
33
+ --padding-bottom: 12px;
34
+ --padding-start: 12px;
35
+ --border-radius: 50%;
36
+ margin: 0;
37
+ width: 3rem;
38
+ height: 3rem;
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,98 @@
1
+ @mixin ion-list-inset() {
2
+ background: transparent;
3
+
4
+ ion-list-header {
5
+ display: flex;
6
+ align-items: center;
7
+
8
+ ion-label {
9
+ font-size: 0.9rem;
10
+ margin: 8px 4px 4px;
11
+ color: var(--ion-color-medium-tint);
12
+ }
13
+
14
+ ion-button {
15
+ margin-top: 8px;
16
+ }
17
+
18
+ ion-note {
19
+ font-size: 0.9rem;
20
+ margin: 8px 16px 4px 0;
21
+ }
22
+ }
23
+
24
+ // TODO: これはUtility Classにマイグレートする必要があります
25
+ ion-item-group.header-item-group {
26
+ & > ion-item > ion-label {
27
+ width: 100%;
28
+ text-align: center;
29
+ padding: 32px 16px 16px;
30
+ transform: translateX(5px);
31
+
32
+ /**
33
+ * ion-header.header-collapse-condenseを使って、スクロールによってHeaderを変化させるトリック
34
+ */
35
+ ion-header.header-collapse-condense > ion-toolbar {
36
+ --min-height: 0;
37
+ visibility: hidden;
38
+ }
39
+
40
+ ion-icon {
41
+ font-size: 2.8rem;
42
+ color: #ffffff;
43
+ border-radius: 20%;
44
+ padding: 6px;
45
+ }
46
+
47
+ h2 {
48
+ font-size: 1.2rem;
49
+ font-weight: bold;
50
+ margin-top: 8px;
51
+ }
52
+
53
+ ion-text {
54
+ font-size: 0.9rem;
55
+ }
56
+ }
57
+ }
58
+
59
+ ion-item-group,
60
+ ion-reorder-group,
61
+ ion-accordion-group,
62
+ ion-radio-group {
63
+ ion-item {
64
+ ion-text[slot='end'] {
65
+ padding-left: 8px;
66
+ }
67
+
68
+ &.item-disabled {
69
+ opacity: 1;
70
+
71
+ & > * {
72
+ opacity: 0.4;
73
+ }
74
+
75
+ &::part(detail-icon) {
76
+ opacity: 0.1;
77
+ }
78
+ }
79
+
80
+ ion-button[slot='end'] {
81
+ &.ion-align-self-end {
82
+ transform: translateY(-7px);
83
+ }
84
+ ion-icon[slot='icon-only'] {
85
+ font-size: 1.2rem !important;
86
+ transform: translateY(4px);
87
+ }
88
+ }
89
+ }
90
+ }
91
+
92
+ & > ion-note {
93
+ color: var(--ion-color-medium-tint);
94
+ font-size: 0.9rem;
95
+ display: block;
96
+ margin: 8px calc(20px + var(--ion-safe-area-right)) 8px calc(20px + var(--ion-safe-area-left));
97
+ }
98
+ }