@rdlabo/ionic-theme-ios26 0.0.2 → 0.0.4

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 (205) hide show
  1. package/.cursor/rules/css-compilation.mdc +34 -0
  2. package/.cursor/rules/demo-application.mdc +39 -0
  3. package/.cursor/rules/development-workflow.mdc +41 -0
  4. package/.cursor/rules/project-role.mdc +21 -0
  5. package/.github/FUNDING.yml +15 -0
  6. package/.github/workflows/lint.yml +40 -0
  7. package/.husky/pre-commit +1 -0
  8. package/.lintstagedrc.yml +6 -0
  9. package/.prettierignore +3 -0
  10. package/FEEDBACK.md +118 -0
  11. package/FEEDBACK2.md +45 -0
  12. package/README.md +107 -75
  13. package/USING_ION_ITEM_GROUP.md +56 -0
  14. package/demo/ .cursor/rules/angular-20.mdc +136 -0
  15. package/demo/.browserslistrc +15 -0
  16. package/demo/.editorconfig +16 -0
  17. package/demo/.vscode/extensions.json +5 -0
  18. package/demo/.vscode/settings.json +3 -0
  19. package/demo/angular.json +141 -0
  20. package/demo/capacitor.config.ts +9 -0
  21. package/demo/eslint.config.js +49 -0
  22. package/demo/ionic.config.json +7 -0
  23. package/demo/karma.conf.js +44 -0
  24. package/demo/package-lock.json +20001 -0
  25. package/demo/package.json +60 -0
  26. package/demo/src/app/album/album-page.component.html +24 -0
  27. package/demo/src/app/album/album-page.component.scss +17 -0
  28. package/demo/src/app/album/album-page.component.spec.ts +21 -0
  29. package/demo/src/app/album/album-page.component.ts +24 -0
  30. package/demo/src/app/app.component.html +3 -0
  31. package/demo/src/app/app.component.ts +16 -0
  32. package/demo/src/app/app.config.ts +17 -0
  33. package/demo/src/app/app.routes.ts +8 -0
  34. package/demo/src/app/health/health-page.component.html +17 -0
  35. package/demo/src/app/health/health-page.component.scss +0 -0
  36. package/demo/src/app/health/health-page.component.spec.ts +21 -0
  37. package/demo/src/app/health/health-page.component.ts +14 -0
  38. package/demo/src/app/index/index-page.component.html +49 -0
  39. package/demo/src/app/index/index-page.component.scss +0 -0
  40. package/demo/src/app/index/index-page.component.spec.ts +21 -0
  41. package/demo/src/app/index/index-page.component.ts +100 -0
  42. package/demo/src/app/index/index.routes.ts +89 -0
  43. package/demo/src/app/index/pages/action-sheet/action-sheet.page.html +33 -0
  44. package/demo/src/app/index/pages/action-sheet/action-sheet.page.scss +0 -0
  45. package/demo/src/app/index/pages/action-sheet/action-sheet.page.spec.ts +21 -0
  46. package/demo/src/app/index/pages/action-sheet/action-sheet.page.ts +73 -0
  47. package/demo/src/app/index/pages/action-sheet/action-sheet.util.ts +28 -0
  48. package/demo/src/app/index/pages/alert/alert.page.html +33 -0
  49. package/demo/src/app/index/pages/alert/alert.page.scss +0 -0
  50. package/demo/src/app/index/pages/alert/alert.page.spec.ts +21 -0
  51. package/demo/src/app/index/pages/alert/alert.page.ts +73 -0
  52. package/demo/src/app/index/pages/alert/alert.util.ts +21 -0
  53. package/demo/src/app/index/pages/breadcrumbs/breadcrumbs.page.html +41 -0
  54. package/demo/src/app/index/pages/breadcrumbs/breadcrumbs.page.scss +0 -0
  55. package/demo/src/app/index/pages/breadcrumbs/breadcrumbs.page.spec.ts +21 -0
  56. package/demo/src/app/index/pages/breadcrumbs/breadcrumbs.page.ts +47 -0
  57. package/demo/src/app/index/pages/button/button.page.html +112 -0
  58. package/demo/src/app/index/pages/button/button.page.scss +3 -0
  59. package/demo/src/app/index/pages/button/button.page.spec.ts +21 -0
  60. package/demo/src/app/index/pages/button/button.page.ts +51 -0
  61. package/demo/src/app/index/pages/card/card.page.html +171 -0
  62. package/demo/src/app/index/pages/card/card.page.scss +0 -0
  63. package/demo/src/app/index/pages/card/card.page.spec.ts +21 -0
  64. package/demo/src/app/index/pages/card/card.page.ts +57 -0
  65. package/demo/src/app/index/pages/checkbox/checkbox.page.html +66 -0
  66. package/demo/src/app/index/pages/checkbox/checkbox.page.scss +0 -0
  67. package/demo/src/app/index/pages/checkbox/checkbox.page.spec.ts +21 -0
  68. package/demo/src/app/index/pages/checkbox/checkbox.page.ts +45 -0
  69. package/demo/src/app/index/pages/chip/chip.page.html +72 -0
  70. package/demo/src/app/index/pages/chip/chip.page.scss +0 -0
  71. package/demo/src/app/index/pages/chip/chip.page.spec.ts +21 -0
  72. package/demo/src/app/index/pages/chip/chip.page.ts +47 -0
  73. package/demo/src/app/index/pages/date-and-time-pickers/date-and-time-pickers.page.html +48 -0
  74. package/demo/src/app/index/pages/date-and-time-pickers/date-and-time-pickers.page.scss +0 -0
  75. package/demo/src/app/index/pages/date-and-time-pickers/date-and-time-pickers.page.spec.ts +21 -0
  76. package/demo/src/app/index/pages/date-and-time-pickers/date-and-time-pickers.page.ts +55 -0
  77. package/demo/src/app/index/pages/floating-action-button/floating-action-button.page.html +106 -0
  78. package/demo/src/app/index/pages/floating-action-button/floating-action-button.page.scss +0 -0
  79. package/demo/src/app/index/pages/floating-action-button/floating-action-button.page.spec.ts +21 -0
  80. package/demo/src/app/index/pages/floating-action-button/floating-action-button.page.ts +49 -0
  81. package/demo/src/app/index/pages/menu/menu.page.html +13 -0
  82. package/demo/src/app/index/pages/menu/menu.page.scss +0 -0
  83. package/demo/src/app/index/pages/menu/menu.page.spec.ts +21 -0
  84. package/demo/src/app/index/pages/menu/menu.page.ts +17 -0
  85. package/demo/src/app/index/pages/modal/modal.page.html +37 -0
  86. package/demo/src/app/index/pages/modal/modal.page.scss +0 -0
  87. package/demo/src/app/index/pages/modal/modal.page.spec.ts +21 -0
  88. package/demo/src/app/index/pages/modal/modal.page.ts +77 -0
  89. package/demo/src/app/index/pages/popover/popover.page.html +34 -0
  90. package/demo/src/app/index/pages/popover/popover.page.scss +0 -0
  91. package/demo/src/app/index/pages/popover/popover.page.spec.ts +21 -0
  92. package/demo/src/app/index/pages/popover/popover.page.ts +47 -0
  93. package/demo/src/app/index/pages/progress-indicators/progress-indicators.page.html +28 -0
  94. package/demo/src/app/index/pages/progress-indicators/progress-indicators.page.scss +0 -0
  95. package/demo/src/app/index/pages/progress-indicators/progress-indicators.page.spec.ts +21 -0
  96. package/demo/src/app/index/pages/progress-indicators/progress-indicators.page.ts +47 -0
  97. package/demo/src/app/index/pages/radio/radio.page.html +39 -0
  98. package/demo/src/app/index/pages/radio/radio.page.scss +0 -0
  99. package/demo/src/app/index/pages/radio/radio.page.spec.ts +21 -0
  100. package/demo/src/app/index/pages/radio/radio.page.ts +47 -0
  101. package/demo/src/app/index/pages/range/range.page.html +58 -0
  102. package/demo/src/app/index/pages/range/range.page.scss +0 -0
  103. package/demo/src/app/index/pages/range/range.page.spec.ts +21 -0
  104. package/demo/src/app/index/pages/range/range.page.ts +49 -0
  105. package/demo/src/app/index/pages/searchbar/searchbar.page.html +33 -0
  106. package/demo/src/app/index/pages/searchbar/searchbar.page.scss +0 -0
  107. package/demo/src/app/index/pages/searchbar/searchbar.page.spec.ts +21 -0
  108. package/demo/src/app/index/pages/searchbar/searchbar.page.ts +45 -0
  109. package/demo/src/app/index/pages/segment/segment.page.html +102 -0
  110. package/demo/src/app/index/pages/segment/segment.page.scss +0 -0
  111. package/demo/src/app/index/pages/segment/segment.page.spec.ts +21 -0
  112. package/demo/src/app/index/pages/segment/segment.page.ts +51 -0
  113. package/demo/src/app/index/pages/select/select.page.html +74 -0
  114. package/demo/src/app/index/pages/select/select.page.scss +0 -0
  115. package/demo/src/app/index/pages/select/select.page.spec.ts +21 -0
  116. package/demo/src/app/index/pages/select/select.page.ts +50 -0
  117. package/demo/src/app/index/pages/toast/toast.page.html +32 -0
  118. package/demo/src/app/index/pages/toast/toast.page.scss +0 -0
  119. package/demo/src/app/index/pages/toast/toast.page.spec.ts +21 -0
  120. package/demo/src/app/index/pages/toast/toast.page.ts +66 -0
  121. package/demo/src/app/index/pages/toggle/toggle.page.html +45 -0
  122. package/demo/src/app/index/pages/toggle/toggle.page.scss +0 -0
  123. package/demo/src/app/index/pages/toggle/toggle.page.spec.ts +21 -0
  124. package/demo/src/app/index/pages/toggle/toggle.page.ts +49 -0
  125. package/demo/src/app/settings/settings-page.component.html +117 -0
  126. package/demo/src/app/settings/settings-page.component.scss +33 -0
  127. package/demo/src/app/settings/settings-page.component.spec.ts +21 -0
  128. package/demo/src/app/settings/settings-page.component.ts +55 -0
  129. package/demo/src/app/tabs/tabs.page.html +23 -0
  130. package/demo/src/app/tabs/tabs.page.scss +9 -0
  131. package/demo/src/app/tabs/tabs.page.spec.ts +26 -0
  132. package/demo/src/app/tabs/tabs.page.ts +28 -0
  133. package/demo/src/app/tabs/tabs.routes.ts +40 -0
  134. package/demo/src/assets/.gitkeep +0 -0
  135. package/demo/src/favicon.ico +0 -0
  136. package/demo/src/global.scss +65 -0
  137. package/demo/src/index.html +24 -0
  138. package/demo/src/main.ts +5 -0
  139. package/demo/src/test.ts +7 -0
  140. package/demo/src/theme/variables.scss +20 -0
  141. package/demo/tsconfig.app.json +14 -0
  142. package/demo/tsconfig.json +30 -0
  143. package/demo/tsconfig.spec.json +17 -0
  144. package/demo/util/mocks/angular/angular-delegate.ts +18 -0
  145. package/demo/util/mocks/angular/ion-router-outlet.ts +39 -0
  146. package/demo/util/mocks/angular/modal-controller.ts +7 -0
  147. package/demo/util/mocks/angular/nav-controller.ts +22 -0
  148. package/demo/util/mocks/angular/popover-controller.ts +7 -0
  149. package/demo/util/mocks/util/base.mock.ts +13 -0
  150. package/demo/util/mocks/util/overlay.ts +13 -0
  151. package/demo/util/test.config.ts +54 -0
  152. package/package.json +39 -11
  153. package/prettier.config.js +18 -0
  154. package/screenshots/ios26.png +0 -0
  155. package/screenshots/why-ion-list-inset.png +0 -0
  156. package/src/components/ion-action-sheet.scss +61 -0
  157. package/src/components/ion-alert.scss +46 -0
  158. package/src/components/ion-breadcrumbs.scss +24 -0
  159. package/src/components/ion-button.scss +154 -0
  160. package/src/components/ion-card.scss +7 -0
  161. package/src/components/ion-chip.scss +10 -0
  162. package/src/components/ion-content.scss +13 -0
  163. package/src/components/ion-datetime.scss +9 -0
  164. package/src/components/ion-fab.scss +22 -0
  165. package/src/components/ion-list.scss +38 -0
  166. package/src/components/ion-loading.scss +9 -0
  167. package/src/components/ion-modal.scss +31 -0
  168. package/src/components/ion-picker.scss +4 -0
  169. package/src/components/ion-popover.scss +13 -0
  170. package/src/components/ion-range.scss +21 -0
  171. package/src/components/ion-searchbar.scss +37 -0
  172. package/src/components/ion-segment.scss +45 -0
  173. package/src/components/ion-tabs.scss +47 -0
  174. package/src/components/ion-toast.scss +12 -0
  175. package/src/components/ion-toggle.scss +56 -0
  176. package/src/components/ion-toolbar.scss +27 -0
  177. package/src/default-variables.scss +12 -0
  178. package/src/ionic-theme-ios26-dark-always.scss +6 -0
  179. package/src/ionic-theme-ios26-dark-class.scss +6 -0
  180. package/src/ionic-theme-ios26-dark-system.scss +8 -0
  181. package/src/ionic-theme-ios26.scss +23 -0
  182. package/src/md-ion-list-inset.scss +19 -0
  183. package/src/utils/api.scss +21 -0
  184. package/src/utils/dark/ion-button.scss +45 -0
  185. package/src/utils/theme-dark.scss +16 -0
  186. package/src/utils/theme-list-inset.scss +96 -0
  187. package/src/utils/translucent.scss +71 -0
  188. package/tsconfig.json +5 -0
  189. package/css/ion-list-inset.css +0 -247
  190. package/css/ion-list-inset.css.map +0 -1
  191. package/css/ionic-theme-ios26.css +0 -349
  192. package/css/ionic-theme-ios26.css.map +0 -1
  193. package/fesm2022/rdlabo-ionic-theme-ios26.mjs +0 -4
  194. package/fesm2022/rdlabo-ionic-theme-ios26.mjs.map +0 -1
  195. package/index.d.ts +0 -3
  196. package/src/assets/ion-list-inset.scss +0 -198
  197. package/src/assets/ios-design/ion-button.scss +0 -68
  198. package/src/assets/ios-design/ion-popover.scss +0 -23
  199. package/src/assets/ios-design/ion-searchbar.scss +0 -44
  200. package/src/assets/ios-design/ion-segment.scss +0 -12
  201. package/src/assets/ios-design/ion-tabs.scss +0 -60
  202. package/src/assets/ios-design/ion-toggle.scss +0 -8
  203. package/src/assets/ios-design/ios-design-dark.scss +0 -28
  204. package/src/assets/ios-design.scss +0 -110
  205. package/src/assets/ios-variables.scss +0 -38
@@ -0,0 +1,34 @@
1
+ ---
2
+ description: SCSS to CSS compilation process and build workflow
3
+ globs: *.scss,*.css,package.json
4
+ ---
5
+
6
+ # CSS Compilation Process
7
+
8
+ ## ビルドプロセス
9
+
10
+ ### ソースファイル
11
+ - **入力**: `src/` ディレクトリ内のSCSSファイル
12
+ - **メインファイル**: [src/ionic-theme-ios26.scss](mdc:src/ionic-theme-ios26.scss)
13
+
14
+ ### 出力ファイル
15
+ - **出力**: `dist/css/` ディレクトリ内のCSSファイル
16
+ - **生成ファイル**:
17
+ - [dist/css/ionic-theme-ios26.min.css](mdc:dist/css/ionic-theme-ios26.min.css): メインCSSファイル(圧縮版)
18
+ - [dist/css/ionic-theme-ios26.min.css.map](mdc:dist/css/ionic-theme-ios26.min.css.map): ソースマップ
19
+ - [dist/css/md-ion-list-inset.min.css](mdc:dist/css/md-ion-list-inset.min.css): インセットリスト専用CSS(圧縮版)
20
+ - [dist/css/md-ion-list-inset.min.css.map](mdc:dist/css/md-ion-list-inset.min.css.map): ソースマップ
21
+
22
+ ## コンパイル時の注意事項
23
+
24
+ 1. **依存関係**: [package.json](mdc:package.json)でビルドツールの依存関係を確認
25
+ 2. **ソースマップ**: 開発時のデバッグ用にソースマップファイルも生成
26
+ 3. **最適化**: 本番用にはCSSの最適化(minify)を検討
27
+ 4. **テスト**: コンパイル後は`demo/`アプリケーションで動作確認
28
+
29
+ ## ファイル構造の一貫性
30
+
31
+ - SCSSファイルは`src/`に配置
32
+ - コンパイル後のCSSファイルは`dist/css/`に配置
33
+ - デモアプリケーションは`demo/`に配置
34
+ - スクリーンショットなどのリソースは`screenshots/`に配置
@@ -0,0 +1,39 @@
1
+ ---
2
+ description: Angular demo application structure and usage
3
+ globs: demo/**/*
4
+ ---
5
+
6
+ # Demo Application (Angular)
7
+
8
+ ## デモアプリケーションの目的
9
+
10
+ `demo/` ディレクトリには、Ionic iOS26テーマの動作確認用のAngularアプリケーションが含まれています。
11
+
12
+ ## 主要なコンポーネント
13
+
14
+ ### ページコンポーネント
15
+ - [album-page.component](mdc:demo/src/app/album/): アルバムページ(リスト表示の確認)
16
+ - [health-page.component](mdc:demo/src/app/health/): ヘルスページ(ヘルス関連UIの確認)
17
+ - [settings-page.component](mdc:demo/src/app/settings/): 設定ページ(設定UIの確認)
18
+ - [simple-page.component](mdc:demo/src/app/simple/): シンプルページ(基本的なコンポーネントの確認)
19
+
20
+ ### ナビゲーション
21
+ - [tabs.page](mdc:demo/src/app/tabs/): タブベースのナビゲーション
22
+
23
+ ## テーマファイル
24
+
25
+ - [demo/src/theme/theme-ios26.scss](mdc:demo/src/theme/theme-ios26.scss): デモアプリ用のテーマ設定
26
+ - [demo/src/global.scss](mdc:demo/src/global.scss): グローバルスタイル
27
+
28
+ ## 使用方法
29
+
30
+ 1. **開発サーバー起動**: `cd demo && npm start` または `ionic serve`
31
+ 2. **テーマ確認**: 各ページでiOS26テーマの適用状況を確認
32
+ 3. **スタイル調整**: `src/` のSCSSファイルを編集後、デモアプリで確認
33
+
34
+ ## 設定ファイル
35
+
36
+ - [demo/angular.json](mdc:demo/angular.json): Angular CLI設定
37
+ - [demo/package.json](mdc:demo/package.json): デモアプリの依存関係
38
+ - [demo/ionic.config.json](mdc:demo/ionic.config.json): Ionic設定
39
+ - [demo/capacitor.config.ts](mdc:demo/capacitor.config.ts): Capacitor設定
@@ -0,0 +1,41 @@
1
+ ---
2
+ description: Development workflow and directory structure guidelines
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Development Workflow
7
+
8
+ ## ディレクトリ構造の詳細
9
+
10
+ ### src/ ディレクトリ
11
+ - **src/components/**: 個別のIonicコンポーネント用のSCSSファイル
12
+ - [ion-button.scss](mdc:src/components/ion-button.scss): ボタンスタイル
13
+ - [ion-list.scss](mdc:src/components/ion-list.scss): リストスタイル
14
+ - [ion-popover.scss](mdc:src/components/ion-popover.scss): ポップオーバースタイル
15
+ - [ion-searchbar.scss](mdc:src/components/ion-searchbar.scss): 検索バースタイル
16
+ - [ion-tabs.scss](mdc:src/components/ion-tabs.scss): タブスタイル
17
+ - [ion-toggle.scss](mdc:src/components/ion-toggle.scss): トグルスタイル
18
+
19
+ - **src/utils/**: ユーティリティファイル
20
+ - [api.scss](mdc:src/utils/api.scss): API関連ユーティリティ
21
+ - [theme-dark.scss](mdc:src/utils/theme-dark.scss): ダークテーマ用ユーティリティ
22
+ - [theme-list-inset.scss](mdc:src/utils/theme-list-inset.scss): インセットリスト用ユーティリティ
23
+ - [translucent.scss](mdc:src/utils/translucent.scss): 半透明効果用ユーティリティ
24
+
25
+ - **src/**: ルートレベルのファイル
26
+ - [default-variables.scss](mdc:src/default-variables.scss): デフォルト変数定義
27
+ - [md-ion-list-inset.scss](mdc:src/md-ion-list-inset.scss): Material Design用インセットリスト
28
+
29
+ - **src/ionic-theme-ios26.scss**: メインのSCSSファイル(全てのコンポーネントを統合)
30
+
31
+ ### demo/ ディレクトリ
32
+ - Angular 20ベースのデモアプリケーション
33
+ - 各ページコンポーネントでテーマの動作確認
34
+ - [demo/src/theme/theme-ios26.scss](mdc:demo/src/theme/theme-ios26.scss): デモアプリ用テーマファイル
35
+
36
+ ## 開発時の注意事項
37
+
38
+ 1. **SCSSファイルの編集**: `src/` ディレクトリ内のSCSSファイルを編集
39
+ 2. **コンパイル**: 変更後は適切なビルドコマンドでCSSファイルを生成
40
+ 3. **確認**: `demo/` アプリケーションでスタイルの動作確認
41
+ 4. **ドキュメント**: READMEは英語で記述(OSS配布のため)
@@ -0,0 +1,21 @@
1
+ ---
2
+ description: Ionic iOS26 Theme Library Project Overview
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Ionic iOS26 Theme Library Project
7
+
8
+ このプロジェクトは、Ionic FrameworkをiOS26のルックアンドフィールにするためのCSSライブラリです。OSSで配布するため、READMEの記述は基本的に英語になります。
9
+
10
+ ## プロジェクト構造
11
+
12
+ - **src/**: コンパイル前のSCSSファイルが配置されます
13
+ - **css/**: コンパイル後のCSSファイルが配置されます
14
+ - **demo/**: 開発と確認に用いるAngularプロジェクトです
15
+
16
+ ## 主要なファイル
17
+
18
+ - [package.json](mdc:package.json): プロジェクトの依存関係とビルドスクリプト
19
+ - [src/ionic-theme-ios26.scss](mdc:src/ionic-theme-ios26.scss): メインのSCSSファイル
20
+ - [demo/](mdc:demo/): Angularデモアプリケーション
21
+ - [README.md](mdc:README.md): プロジェクトの説明(英語)
@@ -0,0 +1,15 @@
1
+ # These are supported funding model platforms
2
+
3
+ github: rdlabo
4
+ patreon: # Replace with a single Patreon username
5
+ open_collective: # Replace with a single Open Collective username
6
+ ko_fi: # Replace with a single Ko-fi username
7
+ tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8
+ community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9
+ liberapay: # Replace with a single Liberapay username
10
+ issuehunt: # Replace with a single IssueHunt username
11
+ lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
12
+ polar: # Replace with a single Polar username
13
+ buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
14
+ thanks_dev: # Replace with a single thanks.dev username
15
+ custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
@@ -0,0 +1,40 @@
1
+ name: Lint
2
+ on:
3
+ push:
4
+ branches:
5
+ - '**'
6
+ pull_request:
7
+ types: [opened]
8
+ jobs:
9
+ prettier:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - uses: actions/setup-node@v4
14
+ with:
15
+ node-version: 22
16
+ - uses: actions/cache@v4
17
+ with:
18
+ path: node_modules
19
+ key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
20
+ restore-keys: |
21
+ ${{ runner.os }}-node-
22
+ - run: npm install
23
+ - run: npm run lint
24
+ lint:
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: actions/setup-node@v4
29
+ with:
30
+ node-version: 22
31
+ - uses: actions/cache@v4
32
+ with:
33
+ path: node_modules
34
+ key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
35
+ restore-keys: |
36
+ ${{ runner.os }}-node-
37
+ - run: npm install
38
+ working-directory: './demo'
39
+ - run: npm run lint
40
+ working-directory: './demo'
@@ -0,0 +1 @@
1
+ npx lint-staged
@@ -0,0 +1,6 @@
1
+ "*.ts":
2
+ - prettier --parser typescript --write
3
+ "*.html":
4
+ - prettier --parser angular --write
5
+ "*.scss":
6
+ - prettier --parser scss --write
@@ -0,0 +1,3 @@
1
+ node_modules
2
+ dist
3
+ www
package/FEEDBACK.md ADDED
@@ -0,0 +1,118 @@
1
+ # Feature Requests for Ionic Framework
2
+
3
+ ## docs(): Naming conventions for Ionic theme classes
4
+
5
+ After the Ionic Modular release, I expect many themes to be distributed through community activities. Therefore, I would like to establish naming conventions for theme application classes. I would appreciate the Ionic team's opinion on this matter.
6
+
7
+ - Classes for manually applying themes
8
+ - .theme-[theme-name] (ex: .theme-ios26)
9
+ - .theme-[theme-name]-enabled (ex: .theme-ios26-enabled)
10
+ - .[theme-name]-enabled (ex: .ios26-enabled)
11
+ - .ion-[theme-name]-enabled (ex: .ion-ios26-enabled)
12
+ - Classes for manually removing themes
13
+ - .theme-no-[theme-name] (ex: .theme-no-ios26)
14
+ - .theme-[theme-name]-disabled (ex: .theme-ios26-disabled)
15
+ - .[theme-name]-disabled (ex: .ios26-disabled)
16
+ - .ion-[theme-name]-disabled (ex: .ion-ios26-disabled)
17
+
18
+
19
+ ## feat(): ion-config new property for `collapse`
20
+
21
+ Currently, `collapse` behavior is automatically enabled in iOS mode, but this should be configurable through `ion-config` for better control.
22
+
23
+ ex:
24
+ ```typescript
25
+ export interface IonicConfig {
26
+ ...,
27
+ collapseLargeTitle: {
28
+ ios: boolean;
29
+ md: boolean;
30
+ ionic: boolean;
31
+ },
32
+ collapseBackButtonAnimation: {
33
+ ios: boolean;
34
+ md: boolean;
35
+ ionic: boolean;
36
+ },
37
+ }
38
+ ```
39
+
40
+ ### should disable ion-back-button Animation
41
+
42
+ When using `collapse` on the previous screen and specifying `ion-buttons ion-back-button` on the next screen, iOS 18 and earlier animation processing occurs. Since this is unnecessary for iOS 26+, a property to disable this would be beneficial.
43
+
44
+ https://github.com/ionic-team/ionic-framework/blob/3b80473f2fd5ad4da5a9f5d66f783a69909c8965/core/src/utils/transition/ios.transition.ts#L333C31-L337
45
+ - enteringBackButtonTextAnimation
46
+ - enteringBackButtonIconAnimation
47
+ - enteringBackButtonAnimation
48
+
49
+ Currently, I work around this by not placing `ion-back-button` inside `ion-buttons` due to the selector relationship `ion-buttons > ion-back-button`.
50
+
51
+
52
+ ## feat(): ion-content[fullscreen=true] will have .content-fullscreen class
53
+
54
+ For implementing iOS 26's blurred safe area effects, a class indicating whether `ion-content` has fullscreen configuration is needed.
55
+ I would like to use selectors like the following:
56
+
57
+ ```css
58
+ .ion-page:has(ion-header.header-translucent) ion-content.content-fullscreen {
59
+ }
60
+
61
+ .ion-page:has(ion-header.footer-translucent) ion-content.content-fullscreen {
62
+ }
63
+ ```
64
+
65
+ Currently, I assume fullscreen is specified when using `translucent` elements, but this is not guaranteed.
66
+
67
+
68
+ ## feat(): add .range-knob-min and .range-knob-max directly to ion-range
69
+
70
+ Currently, `.range-knob-min` and `.range-knob-max` are applied to DOM elements inside ShadowDOM, but since these represent the state of `ion-range` itself, they should be applied directly to the component.
71
+ This would provide more flexibility for knob styling.
72
+
73
+ Current:
74
+ ```html
75
+ <ion-range>
76
+ #shadow-root
77
+ ...
78
+ <div class="range-knob-handle ... range-knob-min">...</div>
79
+ </ion-range>
80
+ ```
81
+
82
+ After:
83
+ ```html
84
+ <ion-range class="range-knob-min">
85
+ #shadow-root
86
+ ...
87
+ <div class="range-knob-handle ... range-knob-min">...</div>
88
+ </ion-range>
89
+ ```
90
+
91
+
92
+ ## feat(): add native shadow-part for design
93
+
94
+ ### native-inner(or item-inner) part to ion-item
95
+ The styling for `ion-item[lines=inset]` is applied to `.item-inner`, which cannot be styled directly. This limitation means that for iOS 26 styling, I can only modify the border-bottom style through `::part(native)` with padding-right, preventing me from utilizing the full right side of `ion-item`. Adding `::part(native-inner)` would increase styling flexibility.
96
+
97
+ ```diff
98
+ <ion-item>
99
+ <button type="button" class="item-native" part="native">
100
+ - <div class="item-inner">
101
+ + <div class="item-inner" part="native-inner">
102
+ ...
103
+ </div>
104
+ </button>
105
+ </ion-item>
106
+ ```
107
+
108
+ ### native part to ion-toast
109
+ The default styling for `ion-toast` is applied to `div.toast-wrapper`, and CSS Custom Properties overrides work similarly. However, there's no way to directly override `div.toast-wrapper`. Currently, I disable this styling using CSS Custom Properties and then apply new styles to `::part(container)`. This is not ideal for styling, so adding `::part(native)` to allow direct override of `div.toast-wrapper` would be preferable.
110
+
111
+ ```diff
112
+ <ion-toast>
113
+ - <div class="toast-wrapper">...</div>
114
+ + <div class="toast-wrapper" part="native">...</div>
115
+ </ion-toast>
116
+ ```
117
+
118
+
package/FEEDBACK2.md ADDED
@@ -0,0 +1,45 @@
1
+ # Feature Requests for Ionic Framework
2
+ ## feat(): native container add at ion-segment
3
+
4
+ 現在、`ion-segment` はShadowDOMであるにもかかわらず、container DOMをもっていない。このため、 `ion-segment` にスタイルをあてるためには、`ion-segment` 自身にあてるしか方法がない。このため、子孫要素である `ion-segment-button` のタップエフェクトを、 `ion-segment` の外に表示することができない。
5
+
6
+ Current:
7
+
8
+ ```html
9
+ <ion-segment>
10
+ ::shadow-root
11
+ // Put child element
12
+ <ion-segment-button></ion-segment-button>
13
+ <ion-segment-button></ion-segment-button>
14
+ </ion-segment>
15
+ ```
16
+
17
+ After:
18
+
19
+ ```html
20
+ <ion-segment>
21
+ ::shadow-root
22
+ <div class="segment-container" part="container">
23
+ // Put child element
24
+ <ion-segment-button></ion-segment-button>
25
+ <ion-segment-button></ion-segment-button>
26
+ </div>
27
+ </ion-segment>
28
+ ```
29
+
30
+ このことで、以下のようにスタイリングしたい。
31
+
32
+ ```scss
33
+ ion-segment {
34
+ &::part(container) {
35
+ overflow: visible;
36
+ margin: 12px; // Enable Effect Area
37
+ background: var(255, 255, 255, 0.7);
38
+ }
39
+ ion-segment-button {
40
+ &.segment-button-checked {
41
+ transform: scale(1.1); // Enable overflow effect
42
+ }
43
+ }
44
+ }
45
+ ```
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  A CSS theme library that applies iOS26 design system to Ionic applications.
4
4
 
5
+ ![](screenshots/ios26.png)
6
+
5
7
  DEMO is here: https://ionic-theme-ios26.netlify.app/
6
8
 
7
9
  ## Overview
@@ -10,130 +12,160 @@ This library provides CSS files to apply the iOS26 design system used in real pr
10
12
 
11
13
  > **⚠️ Under Development**: This library is currently in the development and consideration phase as an OSS project, based on files copied from real projects. We are working on API stability and documentation improvement before full-scale use.
12
14
 
15
+ ## 💖 Support This Project
16
+
17
+ Enjoying this project? Your support helps keep it alive and growing!
18
+ Sponsoring means you directly contribute to new features, improvements, and maintenance.
19
+
20
+ [Become a Sponsor →](https://github.com/sponsors/rdlabo)
13
21
 
14
22
  ## Setup
15
23
 
16
24
  > **⚠️ Warning**: This library is under development. API changes and breaking changes may occur before full-scale use.
17
25
 
18
- ### 1. Installation
19
-
20
26
  ```bash
21
27
  npm install @rdlabo/ionic-theme-ios26
22
28
  ```
23
29
 
24
- ### 2. CSS File Import (Required)
25
-
26
- Import the theme in your project's main CSS file (e.g., `src/styles.scss`) and set the `--max-safe-area` variable:
30
+ And import the theme in your project's main CSS file (e.g., `src/styles.scss`).
27
31
 
28
- ```scss
29
- @import '@rdlabo/ionic-theme-ios26/css/ionic-theme-ios26.css';
30
- @import '@rdlabo/ionic-theme-ios26/css/ion-list-inset.css';
31
-
32
- /* Required: Safe area configuration */
33
- :root {
34
- --max-safe-area: calc(max(10px, var(--ion-safe-area-bottom, 0px)) + var(--admob-safe-area, 0px));
35
- }
32
+ ```css
33
+ @import '@rdlabo/ionic-theme-ios26/dist/css/default-variables.css';
34
+ @import '@rdlabo/ionic-theme-ios26/dist/css/ionic-theme-ios26.min.css';
35
+
36
+ /*
37
+ * Support Dark Mode
38
+ * We support Ionic Dark Mode. More information is here: https://ionicframework.com/docs/theming/dark-mode
39
+ * use Always: @import '@rdlabo/ionic-theme-ios26/dist/css/ionic-theme-dark-always.min.css'
40
+ * use System: @import '@rdlabo/ionic-theme-ios26/dist/css/ionic-theme-dark-system.min.css'
41
+ * use CSS Class: @import '@rdlabo/ionic-theme-ios26/dist/css/ionic-theme-dark-class.min.css'
42
+ */
36
43
  ```
37
44
 
38
- > **Important**: The theme will not work correctly without the `--max-safe-area` setting. This configuration is mandatory.
45
+ ## Important Notes
39
46
 
40
- ### 3. Framework-specific Configuration Examples
47
+ ### `ion-back-button` must be used without `ion-buttons`
41
48
 
42
- #### For Angular Projects
49
+ When the following conditions are met, the Ionic Framework programmatically generates and animates the `ion-back-button`:
43
50
 
44
- Add CSS file to `angular.json`:
51
+ - The previous page uses `ion-header[collapse='condense']`
52
+ - The navigated page has `ion-buttons ion-back-button`
45
53
 
46
- ```json
47
- {
48
- "styles": [
49
- "node_modules/@rdlabo/ionic-theme-ios26/css/ionic-theme-ios26.css",
50
- "node_modules/@rdlabo/ionic-theme-ios26/css/ion-list-inset.css"
51
- ]
52
- }
54
+ This is not the iOS26 UI behavior. To avoid this programmatic behavior, you need to implement it as follows:
55
+
56
+ ```diff
57
+ <ion-header>
58
+ - <ion-buttons slot="start">
59
+ - <ion-back-button></ion-back-button>
60
+ - </ion-buttons>
61
+ + <ion-back-button slot=start></ion-back-button>
62
+ </ion-header>
53
63
  ```
54
64
 
55
- **Required**: Set `--max-safe-area` in `src/styles.scss`:
65
+ ### Using `ion-item-group`
56
66
 
57
- ```scss
58
- :root {
59
- --max-safe-area: calc(max(10px, var(--ion-safe-area-bottom, 0px)) + var(--admob-safe-area, 0px));
60
- }
67
+ Under specific conditions, you need to use `ion-item-group`.
68
+
69
+ ```diff
70
+ <ion-list inset=true>
71
+ <ion-list-header><ion-label>Label</ion-label></ion-list-header>
72
+ + <ion-item-group>
73
+ <ion-item>...</ion-item>
74
+ <ion-item>...</ion-item>
75
+ + </ion-item-group>
76
+ </ion-list>
61
77
  ```
62
78
 
63
- #### For React Projects
79
+ For details, please refer to [USING_ION_ITEM_GROUP.md](./USING_ION_ITEM_GROUP.md).
64
80
 
65
- Import CSS file in `index.js` or `App.js`:
81
+ ### You can also use the liquid glass mixin
66
82
 
67
- ```javascript
68
- import '@rdlabo/ionic-theme-ios26/css/ionic-theme-ios26.css';
69
- import '@rdlabo/ionic-theme-ios26/css/ion-list-inset.css';
70
- ```
83
+ You can use the liquid glass mixin by importing SCSS files from the main package.
71
84
 
72
- **Required**: Set `--max-safe-area` in main CSS file:
85
+ ```scss
86
+ @use '@rdlabo/ionic-theme-ios26/src/utils/api';
73
87
 
74
- ```css
75
- :root {
76
- --max-safe-area: calc(max(10px, var(--ion-safe-area-bottom, 0px)) + var(--admob-safe-area, 0px));
88
+ ion-textarea label.textarea-wrapper {
89
+ @include api.glass-background;
77
90
  }
78
91
  ```
79
92
 
80
- #### For Vue.js Projects
93
+ ## Selective Theme Application
81
94
 
82
- Import CSS file in `main.js`:
95
+ You may want to apply the iOS26 theme to your Ionic project but find it difficult to apply it to all components. We provide two approaches to selectively control theme application.
83
96
 
84
- ```javascript
85
- import '@rdlabo/ionic-theme-ios26/css/ionic-theme-ios26.css';
86
- import '@rdlabo/ionic-theme-ios26/css/ion-list-inset.css';
87
- ```
97
+ You can use `1. Import Components Individually` or `2. Using the .ios26-disabled Class`
98
+
99
+ ### 1. Import Components Individually
88
100
 
89
- **Required**: Set `--max-safe-area` in main CSS file:
101
+ **Recommended for**: When you want to apply the iOS26 theme only to specific components, or when you want to minimize bundle size.
102
+
103
+ While `@import '@rdlabo/ionic-theme-ios26/dist/css/ionic-theme-ios26.min.css'` applies styling to all components at once, you can also import them individually.
90
104
 
91
105
  ```css
92
- :root {
93
- --max-safe-area: calc(max(10px, var(--ion-safe-area-bottom, 0px)) + var(--admob-safe-area, 0px));
94
- }
106
+ @import '@rdlabo/ionic-theme-ios26/dist/css/utils/translucent';
107
+ @import '@rdlabo/ionic-theme-ios26/dist/css/components/ion-action-sheet';
108
+ @import '@rdlabo/ionic-theme-ios26/dist/css/components/ion-alert';
109
+ @import '@rdlabo/ionic-theme-ios26/dist/css/components/ion-breadcrumbs';
110
+ @import '@rdlabo/ionic-theme-ios26/dist/css/components/ion-button';
111
+ ...
95
112
  ```
96
113
 
114
+ #### Individual Import for Dark Mode Components
97
115
 
98
- ## Development Status
116
+ If you're using dark mode, you need to use SCSS because the selectors differ between `Always`, `System`, and `Class` modes, which cannot be handled with CSS files alone.
99
117
 
100
- This library is currently in the development and consideration phase. We are working on the following tasks:
118
+ > **Note**: Currently, only `ion-button` has separate dark mode styling applied.
101
119
 
102
- - [ ] API stabilization
103
- - [ ] Documentation improvement
104
- - [ ] Test coverage enhancement
105
- - [ ] Performance optimization
106
- - [ ] Community feedback collection
120
+ Always (Always Dark Mode):
121
+ ```scss
122
+ @use '@rdlabo/ionic-theme-ios26/src/utils/theme-dark';
107
123
 
108
- ## Developer Information
124
+ :root {
125
+ @include theme-dark.default-variables;
126
+ }
127
+ @include theme-dark.ion-button;
128
+ ```
109
129
 
110
- ### Build
130
+ System (Follow System Settings):
131
+ ```scss
132
+ @use '@rdlabo/ionic-theme-ios26/src/utils/theme-dark';
111
133
 
112
- ```bash
113
- ng build ionic-theme-ios26
134
+ @media (prefers-color-scheme: dark) {
135
+ :root {
136
+ @include theme-dark.default-variables;
137
+ }
138
+ @include theme-dark.ion-button;
139
+ }
114
140
  ```
115
141
 
116
- ### Test
142
+ Class (Toggle with CSS Class):
143
+ ```scss
144
+ @use '@rdlabo/ionic-theme-ios26/src/utils/theme-dark';
117
145
 
118
- ```bash
119
- ng test
146
+ .ion-palette-dark {
147
+ @include theme-dark.default-variables;
148
+ @include theme-dark.ion-button;
149
+ }
120
150
  ```
121
151
 
122
- ## License
123
152
 
124
- MIT License
153
+ ### 2. Using the `.ios26-disabled` Class
125
154
 
126
- ## Contributing
155
+ **Recommended for**: When you want to apply the iOS26 theme to all components in general, but use standard Ionic styling in specific places.
127
156
 
128
- This project is under development. We welcome feedback and suggestions:
157
+ After importing all components, you can disable the iOS26 theme for specific component instances by adding the `.ios26-disabled` class.
129
158
 
130
- - Issue reporting
131
- - Feature requests
132
- - Documentation improvements
133
- - Code review participation
159
+ ```html
160
+ <!-- iOS26 theme applied -->
161
+ <ion-button>iOS26 Design</ion-button>
162
+
163
+ <!-- Standard Ionic styling -->
164
+ <ion-button class="ios26-disabled">Standard Ionic Design</ion-button>
165
+ ```
134
166
 
135
- ## Support
167
+ This method is useful in the following scenarios:
136
168
 
137
- - **Under Development**: No formal support is provided
138
- - **Feedback**: Please report issues on GitHub Issues page
139
- - **Community**: Participate in developer community discussions
169
+ - When you want to use standard styling only within specific modals or popovers
170
+ - When you want to perform a gradual migration (add `.ios26-disabled` to some screens and remove it later)
171
+ - When you want to conduct A/B testing for designs