Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
ce3ffe7
chore(deps): update dependency vue to v3.5.43 (#4762)
renovate[bot] Oct 1, 2026
0c05484
chore(deps): update dependency cspell to v10.3.5 (#4761)
renovate[bot] Oct 1, 2026
ecafe0d
chore(deps): update ionic to v9.0.6 (#4764)
renovate[bot] Oct 1, 2026
24cfd3f
chore(deps): update dependency web-vitals to v6.2.2 (#4763)
renovate[bot] Oct 1, 2026
985cf4a
chore(deps): update dependency sass to v1.105.0 (#4769)
renovate[bot] Oct 2, 2026
9a5c76c
chore(deps): update dependency cspell to v10.3.6 (#4770)
renovate[bot] Oct 5, 2026
8b38062
chore(deps): update dependency @prismicio/react to v3.5.0 (#4767)
renovate[bot] Oct 5, 2026
6258d91
chore(deps): update dependency sass to v1.105.1 (#4771)
renovate[bot] Oct 5, 2026
e82d814
chore(deps): update dependency @types/node to v24.19.0 (#4768)
renovate[bot] Oct 5, 2026
03f8775
chore(deps): update dependency @crowdin/cli to v5.3.0 (#4766)
renovate[bot] Oct 5, 2026
ec55426
chore(deps): update dependency @prismicio/react to v3.5.1 (#4772)
renovate[bot] Oct 5, 2026
f7ab5de
chore(deps): update dependency @types/node to v24.19.1 (#4773)
renovate[bot] Oct 5, 2026
c06a94f
chore(deps): update dependency vue-tsc to v3.3.12 (#4775)
renovate[bot] Oct 6, 2026
358e216
chore(deps): update dependency vitest to v5.0.3 (#4774)
renovate[bot] Oct 6, 2026
a4c1d24
docs(hardware-back-button): query IonRouterOutlet with @ViewChild in …
ShaneK Oct 8, 2026
b71c55c
chore(deps): update ionic to v9.0.7 (#4778)
renovate[bot] Oct 8, 2026
faa2958
chore(deps): update dependency web-vitals to v6.2.3 (#4777)
renovate[bot] Oct 8, 2026
6b540d6
chore(deps): update dependency vite to v7.3.7 (#4781)
renovate[bot] Oct 9, 2026
ed3efe6
chore(deps): update dependency vite to v7.3.7 (#4780)
renovate[bot] Oct 9, 2026
49cb49e
chore(deps): update dependency vite to v7.3.7 (#4782)
renovate[bot] Oct 9, 2026
fb8bec1
chore(deps): update dependency @types/node to v24.19.2 (#4785)
renovate[bot] Oct 14, 2026
4a7516d
chore(deps): update dependency @vitejs/plugin-vue to v6.0.10 (#4786)
renovate[bot] Oct 14, 2026
d72ad20
chore(deps): update dependency @prismicio/client to v7.22.3 (#4783)
renovate[bot] Oct 14, 2026
086689d
chore(deps): update actions/setup-node action to v7.1.0 (#4784)
renovate[bot] Oct 14, 2026
8c073b3
chore(deps): update dependency prettier to v3.9.10 (#4787)
renovate[bot] Oct 15, 2026
6fd5392
chore(deps): update dependency vitest to v5.0.4 (#4788)
renovate[bot] Oct 15, 2026
6f08f90
chore(deps): update dependency docusaurus-plugin-copy-page-button to …
renovate[bot] Oct 15, 2026
90f35a1
chore(deps): update dependency vue-tsc to v3.3.13 (#4790)
renovate[bot] Oct 15, 2026
5a02086
chore(deps): update ionic to v9.0.8 (#4792)
renovate[bot] Oct 16, 2026
1776be2
chore(deps): update dependency vue-router to v5.4.0 (#4793)
renovate[bot] Oct 16, 2026
d56c13c
chore(deps): update dependency vue to v3.5.44 (#4791)
renovate[bot] Oct 16, 2026
f7676f6
chore(deps): update dependency sass to v1.105.2 (#4795)
renovate[bot] Oct 19, 2026
73f2e03
chore(deps): update dependency vitest to v5.0.5 (#4796)
renovate[bot] Oct 19, 2026
3d33ac7
docs(vue): document useIonRouter replace using 'none' direction to pr…
ShaneK Oct 20, 2026
314a147
chore(deps): update dependency @crowdin/cli to v5.4.0 (#4800)
renovate[bot] Oct 21, 2026
1b1610b
chore(deps): update dependency cspell to v10.4.0 (#4801)
renovate[bot] Oct 21, 2026
e5bbba9
chore(deps): update react-root to v19.3.1 (#4799)
renovate[bot] Oct 21, 2026
44cd5e1
chore(deps): update react to v19.3.1 (#4798)
renovate[bot] Oct 21, 2026
dbdc35b
chore(deps): update ionic to v9.0.9 (#4803)
renovate[bot] Oct 22, 2026
8d649af
docs: align tutorial, quickstart, and testing pages with the updated …
brandyscarney Oct 27, 2026
1e563f7
docs(angular): update testing guide for Vitest and Playwright (#4806)
brandyscarney Oct 27, 2026
c80efbe
chore(deps): update dependency sass to v1.106.1 (#4811)
renovate[bot] Oct 28, 2026
3e6e9dd
chore(deps): update dependency @crowdin/cli to v5.5.0 (#4810)
renovate[bot] Oct 28, 2026
baf72f5
chore(deps): update dependency @types/node to v26 (#4812)
renovate[bot] Oct 28, 2026
ed3e879
chore(deps): update ionic to v9.0.10 (#4813)
renovate[bot] Oct 29, 2026
5c62682
docs(desktop): clarify that desktop usage is not officially supported…
thetaPC Oct 30, 2026
71787cf
chore(deps): update dependency vue-tsc to v3.3.14 (#4816)
renovate[bot] Nov 2, 2026
2162986
chore(deps): update dependency @types/node to v26.6.6 (#4815)
renovate[bot] Nov 2, 2026
0bfbce4
chore(playground): update stackblitz playgrounds to vite 8 and @vitej…
ShaneK Nov 3, 2026
fe4aa1a
chore(deps): update dependency tslib to v2.9.1 (#4821)
renovate[bot] Nov 3, 2026
b9d2f0f
chore(deps): update dependency @prismicio/client to v7.23.0 (#4817)
renovate[bot] Nov 3, 2026
44ae53c
chore(i18n): sync main into translation/jp
thetaPC Nov 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: ⚙️ Use Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
Expand Down Expand Up @@ -78,7 +78,7 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: ⚙️ Use Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
Expand Down
8 changes: 3 additions & 5 deletions docs/angular/quickstart.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ And its template in `app.component.html`:
Routes are defined in `app.routes.ts`:

```ts title="src/app/app.routes.ts"
import { Routes } from '@angular/router';
import type { Routes } from '@angular/router';

export const routes: Routes = [
{
Expand Down Expand Up @@ -376,7 +376,7 @@ export class NewPage implements OnInit {

ngOnInit() {}

scrollToBottom = () => {
scrollToBottom = (): void => {
this.content.scrollToBottom(300);
};
}
Expand Down Expand Up @@ -435,9 +435,7 @@ ionic cap open android
</DocsCard>

<DocsCard header="Capacitorドキュメント" href="https://capacitorjs.com/docs/" icon="/icons/guide-capacitor-icon.png">
<p>
Capacitorを使用してネイティブデバイス機能にアクセスし、アプリをiOS、Android、Webにデプロイする方法を探索します。
</p>
Capacitorを使用してネイティブデバイス機能にアクセスし、アプリをiOS、Android、Webにデプロイする方法を探索します。
</DocsCard>

</DocsCards>
611 changes: 268 additions & 343 deletions docs/angular/testing.mdx

Large diffs are not rendered by default.

31 changes: 28 additions & 3 deletions docs/angular/your-first-app.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular';
// CHANGE: Add the following import
import { defineCustomElements } from '@ionic/pwa-elements/loader';

import { routes } from './app/app.routes';
import { AppComponent } from './app/app.component';
import { routes } from './app/app.routes';

// CHANGE: Call the element loader before the `bootstrapApplication` call
defineCustomElements(window);
Expand Down Expand Up @@ -191,11 +191,11 @@ ionic serve
```html
<ion-header [translucent]="true">
<ion-toolbar>
<ion-title>Photo Gallery</ion-title>
<ion-title> Photo Gallery </ion-title>
</ion-toolbar>
</ion-header>

<ion-content>
<ion-content [fullscreen]="true">
<ion-header collapse="condense">
<ion-toolbar>
<ion-title size="large">Photo Gallery</ion-title>
Expand Down Expand Up @@ -239,4 +239,29 @@ ionic serve
</ion-tabs>
```

Then open `src/app/tabs/tabs.page.ts` and register the `images` icon in place of `ellipse`, so the new icon can display:

```ts
import { Component, EnvironmentInjector, inject } from '@angular/core';
import { IonTabs, IonTabBar, IonTabButton, IonIcon, IonLabel } from '@ionic/angular';
import { addIcons } from 'ionicons';
// CHANGE: Update import
import { triangle, images, square } from 'ionicons/icons';

@Component({
selector: 'app-tabs',
templateUrl: 'tabs.page.html',
styleUrls: ['tabs.page.scss'],
imports: [IonTabs, IonTabBar, IonTabButton, IonIcon, IonLabel],
})
export class TabsPage {
public environmentInjector = inject(EnvironmentInjector);

constructor() {
// CHANGE: Register the `images` icon instead of `ellipse`
addIcons({ triangle, images, square });
}
}
```

これは、Ionic でできるすべての素晴らしいことの始まりに過ぎません。次に、Web でカメラ撮影機能を実装し、その後 iOS と Android 用にビルドします。
29 changes: 15 additions & 14 deletions docs/angular/your-first-app/2-taking-photos.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@ import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
})
export class PhotoService {
// CHANGE: Add the gallery method
public async addNewToGallery() {
public async addNewToGallery(): Promise<void> {
// Take a photo
const capturedPhoto = await Camera.getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100,
resultType: CameraResultType.Uri, // file-based data; provides best performance
source: CameraSource.Camera, // automatically take a new photo with the camera
quality: 100, // highest quality (0 to 100)
});
}
}
Expand Down Expand Up @@ -78,6 +78,7 @@ import {
// CHANGE: Register the camera icon used by the FAB
import { addIcons } from 'ionicons';
import { camera } from 'ionicons/icons';

// CHANGE: Import the PhotoService
import { PhotoService } from '../services/photo.service';

Expand All @@ -98,7 +99,7 @@ export class Tab2Page {
}

// CHANGE: Add `addPhotoToGallery()` method
addPhotoToGallery() {
addPhotoToGallery(): void {
this.photoService.addNewToGallery();
}
}
Expand Down Expand Up @@ -166,7 +167,7 @@ export class PhotoService {
// CHANGE: Add the `photos` signal
public photos = signal<UserPhoto[]>([]);

public async addNewToGallery() {
public async addNewToGallery(): Promise<void> {
// ...existing code...
}
}
Expand All @@ -176,12 +177,12 @@ Over in the `addNewToGallery` method, add the newly captured photo to the beginn

```ts
// CHANGE: Update `addNewToGallery()` method
public async addNewToGallery() {
public async addNewToGallery(): Promise<void> {
// Take a photo
const capturedPhoto = await Camera.getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100
resultType: CameraResultType.Uri, // file-based data; provides best performance
source: CameraSource.Camera, // automatically take a new photo with the camera
quality: 100, // highest quality (0 to 100)
});

// CHANGE: Add the new photo to the front of the photos signal
Expand All @@ -207,12 +208,12 @@ import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
export class PhotoService {
public photos = signal<UserPhoto[]>([]);

public async addNewToGallery() {
public async addNewToGallery(): Promise<void> {
// Take a photo
const capturedPhoto = await Camera.getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100,
resultType: CameraResultType.Uri, // file-based data; provides best performance
source: CameraSource.Camera, // automatically take a new photo with the camera
quality: 100, // highest quality (0 to 100)
});

this.photos.update((photos) => [
Expand Down
21 changes: 11 additions & 10 deletions docs/angular/your-first-app/3-saving-photos.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ We can use this new method immediately in `addNewToGallery()`.

```ts
import { Injectable, signal } from '@angular/core';
import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera';
import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
import type { Photo } from '@capacitor/camera';

@Injectable({
providedIn: 'root',
Expand All @@ -56,12 +57,12 @@ export class PhotoService {
public photos = signal<UserPhoto[]>([]);

// CHANGE: Update the `addNewToGallery()` method
public async addNewToGallery() {
public async addNewToGallery(): Promise<void> {
// Take a photo
const capturedPhoto = await Camera.getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100,
resultType: CameraResultType.Uri, // file-based data; provides best performance
source: CameraSource.Camera, // automatically take a new photo with the camera
quality: 100, // highest quality (0 to 100)
});

// CHANGE: Add `savedImageFile`
Expand Down Expand Up @@ -93,7 +94,7 @@ Then, pass the data to the Filesystem's `writeFile` method. Recall that we displ
Create a new helper method, `base64FromPath()`, to implement the necessary logic for running on the web:

```ts
import { Injectable } from '@angular/core';
import { Injectable, signal } from '@angular/core';
import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
import type { Photo } from '@capacitor/camera';
// CHANGE: Add import
Expand Down Expand Up @@ -164,12 +165,12 @@ import { Filesystem, Directory } from '@capacitor/filesystem';
export class PhotoService {
public photos = signal<UserPhoto[]>([]);

public async addNewToGallery() {
public async addNewToGallery(): Promise<void> {
// Take a photo
const capturedPhoto = await Camera.getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100,
resultType: CameraResultType.Uri, // file-based data; provides best performance
source: CameraSource.Camera, // automatically take a new photo with the camera
quality: 100, // highest quality (0 to 100)
});

// Save the picture and add it to photo collection
Expand Down
40 changes: 21 additions & 19 deletions docs/angular/your-first-app/4-loading-photos.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export class PhotoService {
Next, at the end of the `addNewToGallery()` method, add a call to `Preferences.set()` to save the `photos` array. By adding it here, the `photos` array is stored each time a new photo is taken. This way, it doesn’t matter when the app user closes or switches to a different app - all photo data is saved.

```ts
import { Injectable } from '@angular/core';
import { Injectable, signal } from '@angular/core';
import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
import type { Photo } from '@capacitor/camera';
import { Filesystem, Directory } from '@capacitor/filesystem';
Expand All @@ -47,12 +47,12 @@ export class PhotoService {
// ...existing code...

// CHANGE: Update `addNewToGallery()` method
public async addNewToGallery() {
public async addNewToGallery(): Promise<void> {
// Take a photo
const capturedPhoto = await Camera.getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100,
resultType: CameraResultType.Uri, // file-based data; provides best performance
source: CameraSource.Camera, // automatically take a new photo with the camera
quality: 100, // highest quality (0 to 100)
});

const savedImageFile = await this.savePicture(capturedPhoto);
Expand Down Expand Up @@ -82,7 +82,7 @@ export class PhotoService {
// ...existing code...

// CHANGE: Add the method to load the photo data
public async loadSaved() {
public async loadSaved(): Promise<void> {
// Retrieve cached photo array data
const { value: photoList } = await Preferences.get({ key: this.PHOTO_STORAGE });
this.photos.set((photoList ? JSON.parse(photoList) : []) as UserPhoto[]);
Expand All @@ -97,21 +97,21 @@ export class PhotoService {
// ...existing code...

// CHANGE: Update the `loadSaved()` method
public async loadSaved() {
public async loadSaved(): Promise<void> {
// Retrieve cached photo array data
const { value: photoList } = await Preferences.get({ key: this.PHOTO_STORAGE });
const photos = (photoList ? JSON.parse(photoList) : []) as UserPhoto[];

// CHANGE: Display the photo by reading into base64 format
for (const photo of photos) {
// Read each saved photo's data from the Filesystem
const file = await Filesystem.readFile({
const readFile = await Filesystem.readFile({
path: photo.filepath,
directory: Directory.Data,
});

// Web platform only: Load the photo as base64 data
photo.webviewPath = `data:image/jpeg;base64,${file.data}`;
photo.webviewPath = `data:image/jpeg;base64,${readFile.data}`;
}

// CHANGE: Set the signal so the gallery view updates
Expand All @@ -137,12 +137,12 @@ export class PhotoService {

private PHOTO_STORAGE: string = 'photos';

public async addNewToGallery() {
public async addNewToGallery(): Promise<void> {
// Take a photo
const capturedPhoto = await Camera.getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100,
resultType: CameraResultType.Uri, // file-based data; provides best performance
source: CameraSource.Camera, // automatically take a new photo with the camera
quality: 100, // highest quality (0 to 100)
});

// Save the picture and add it to photo collection
Expand Down Expand Up @@ -192,20 +192,20 @@ export class PhotoService {
});
}

public async loadSaved() {
public async loadSaved(): Promise<void> {
// Retrieve cached photo array data
const { value: photoList } = await Preferences.get({ key: this.PHOTO_STORAGE });
const photos = (photoList ? JSON.parse(photoList) : []) as UserPhoto[];

for (const photo of photos) {
// Read each saved photo's data from the Filesystem
const file = await Filesystem.readFile({
const readFile = await Filesystem.readFile({
path: photo.filepath,
directory: Directory.Data,
});

// Web platform only: Load the photo as base64 data
photo.webviewPath = `data:image/jpeg;base64,${file.data}`;
photo.webviewPath = `data:image/jpeg;base64,${readFile.data}`;
}

this.photos.set(photos);
Expand All @@ -223,7 +223,8 @@ Our `PhotoService` can now load the saved images, but we'll need to update `tab2
Update `tab2.page.ts` to look like the following:

```ts
import { Component, OnInit, inject } from '@angular/core';
import type { OnInit } from '@angular/core';
import { Component, inject } from '@angular/core';
import {
IonHeader,
IonToolbar,
Expand All @@ -238,6 +239,7 @@ import {
} from '@ionic/angular';
import { addIcons } from 'ionicons';
import { camera } from 'ionicons/icons';

import { PhotoService } from '../services/photo.service';

@Component({
Expand All @@ -254,11 +256,11 @@ export class Tab2Page implements OnInit {
}

// CHANGE: Add call to `loadSaved()` when navigating to the Photos tab
async ngOnInit() {
async ngOnInit(): Promise<void> {
await this.photoService.loadSaved();
}

addPhotoToGallery() {
addPhotoToGallery(): void {
this.photoService.addNewToGallery();
}
}
Expand Down
Loading
Loading