Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
bb4b5a3
init ios demo
coom1222 May 22, 2026
d899535
feat: 역점역(점자→한글) 기능 구현 및 점자 입력 키보드 추가
yeoneunseo May 29, 2026
230740a
chore: Fix script
coom1222 May 29, 2026
f240b1d
Merge remote-tracking branch 'origin/main' into demo-ios-app
coom1222 May 29, 2026
a5353d6
Delete README
coom1222 May 29, 2026
74734a9
chore: init android
Nohgh May 31, 2026
41210d5
style(fix): BottomTabBar - figma와 일치하도록 수정
Nohgh May 31, 2026
7638033
style(add): Translator Page - 입력 안내문자에 점자 디자인 추가
Nohgh May 31, 2026
5fc2704
fix: history 개수 제한 제거
Nohgh May 31, 2026
1da7f74
fix: 된소리 초성(ㄲ·ㄸ·ㅃ·ㅆ·ㅉ) 디코딩 지원
yeoneunseo May 31, 2026
fb56a28
fix: parseToCells에서 일반 공백·줄바꿈을 점자 공백으로 보존
yeoneunseo May 31, 2026
c95c158
test: 된소리 복합 단어 테스트 추가
yeoneunseo May 31, 2026
f5ee8b3
fix: EditableBrailleCell에 인덱스 대신 안정적인 고유 key 사용
yeoneunseo May 31, 2026
a2cfdc7
refactor: 일반·수학·역점역 3가지 모드를 단일 토글로 통합
yeoneunseo May 31, 2026
5a57076
Merge branch 'demo-ios-app' into demo-ios-app
jessieyeon May 31, 2026
34894a4
Merge pull request #1 from jessieyeon/demo-ios-app
coom1222 May 31, 2026
56130d3
packages/node/src/lib.rs에 빠진 괄호 추가
coom1222 May 31, 2026
77d09a6
Merge remote-tracking branch 'teammate/demo-ios-app' into demo-ios-app
Nohgh Jun 1, 2026
b76a2b7
Merge pull request #2 from Nohgh/demo-ios-app
coom1222 Jun 1, 2026
17d6446
refactor(mobile): Tauri 프론트엔드를 Vite에서 Next.js(App Router)로 전환
coom1222 Jun 5, 2026
140498d
chore(mobile): Next 마이그레이션 검증 및 설정 정리
coom1222 Jun 5, 2026
eafd18c
fix(mobile): CI규칙 및 Braillify icon 적용
coom1222 Jun 25, 2026
c042d9c
fix(mobile): iOS 아이콘 표시 수정 및 시뮬레이터 버튼 버그 수정
coom1222 Jun 26, 2026
6a09f78
test: 역점역 API 및 테스트 보완
coom1222 Jul 12, 2026
d8db87b
chore(mobile): gen/ 커밋 제외 및 iOS 서명 설정 정리
coom1222 Jul 20, 2026
a0d3d04
refactor : PR 리뷰 반영
coom1222 Jul 20, 2026
3930457
fix(mobile): 앱 아이콘 자동 적용 및 iOS 시뮬레이터 동작방식 수정
coom1222 Jul 22, 2026
e0028a3
Merge remote-tracking branch 'upstream/main' into demo-ios-app
coom1222 Jul 22, 2026
f8d52d7
refactor(mobile): move static app frame to page
coom1222 Aug 2, 2026
b3cc17d
refactor(mobile): use layout components in bottom tab bar
coom1222 Aug 2, 2026
6d4f471
refactor(mobile): use stack and grid in braille input
coom1222 Aug 2, 2026
13e70b9
refactor(mobile): use layout components in braille editor
coom1222 Aug 2, 2026
76f65e5
refactor(mobile): 텍스트 입력과 점자 키보드 컴포넌트 분리
coom1222 Aug 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
33 changes: 33 additions & 0 deletions apps/mobile/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules

# Next.js
.next/
out/
*.tsbuildinfo
next-env.d.ts

# devup-ui generated
df/
.df/

*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
75 changes: 75 additions & 0 deletions apps/mobile/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Tauri + React + Typescript

This template should help get you started developing with Tauri, React and Typescript in Vite.

## Recommended IDE Setup

- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer)

## 모바일 프로젝트 준비 (clone 후 최초 1회)

`src-tauri/gen/`(Xcode·Android 네이티브 프로젝트)은 전부 생성물이라 저장소에
커밋하지 않습니다. clone 후 빌드 전에 아래로 재생성합니다.

```bash
bun -F mobile ios:init # iOS — xcodegen, cocoapods 필요
bun -F mobile android:init # Android — Android SDK/NDK 필요
```

`ios:init`/`android:init`은 각각 `tauri ios/android init` 실행 직후
`bun run icons`(= `tauri icon app-icon.json`)를 자동으로 이어서 실행합니다.

⚠️ **왜 필요한가**: `tauri ios/android init`은 `gen/`을 만들 때 항상
**기본 Tauri 아이콘**을 심습니다. 이후 `tauri icon`을 실행하지 않으면 그
기본 아이콘이 그대로 남습니다. 특히 iOS 아이콘은 `icons/` 밑이 아니라
`gen/apple/Assets.xcassets/AppIcon.appiconset/`에 **직접** 쓰여지므로
(gen이 이미 존재할 때만 그렇게 동작합니다), init 이후 반드시 `tauri icon`을
다시 실행해야 합니다. `ios:init`/`android:init` 스크립트가 이 순서를 강제합니다.

소스오브트루스는 [`app-icon.svg`](./app-icon.svg)(아이콘 원본)와
[`app-icon.json`](./app-icon.json)(배경색 `#EFEEEB` 지정 manifest,
`tauri icon`의 입력)입니다. Android 어댑티브 아이콘 배경색은 `--ios-color`
CLI 옵션(기본값 `#fff`)이 그대로 적용되므로, 색을 코드 여러 곳에 흩어두지
않도록 `app-icon.json`의 `bg_color`로 고정했습니다. 아이콘을 다시 만들
때는 항상 `bun run icons`를 사용하고 `tauri icon app-icon.svg`를 직접
호출하지 마세요(직접 호출하면 배경색 플래그가 빠져 Android 배경이 `#fff`로
어긋납니다).

## iOS 시뮬레이터 개발 (정적 빌드 모드)

```bash
bun -F mobile ios:dev # next build(정적 export) 후 시뮬레이터 실행
```

⚠️ **iOS에서 Next dev 서버(HMR) 모드를 쓰지 않는 이유**: Tauri CLI는 iOS
dev에서 `devUrl`(dev 서버)을 항상 `tauri://localhost` 커스텀 스킴으로
**프록시**합니다(IP 리터럴 devUrl로 바꿔도 동일). 이 환경에서 Next 16
(Turbopack) dev 런타임은 HTML·flight 데이터가 전부 도착해도 **hydration을
끝내지 못해** 화면은 보이지만 모든 버튼이 반응하지 않습니다. 반면 정적
export(`out/`)를 임베드해 서빙하면 동일한 `tauri://` 스킴에서도 hydration·
버튼·WASM 점역이 모두 정상 동작함을 확인했습니다.

그래서 `ios:dev`는 `--config src-tauri/tauri.sim.conf.json` 오버레이로
`devUrl`을 제거하고 `beforeDevCommand`를 `bun run build`로 바꿔, 매 실행마다
정적 export를 새로 빌드해 임베드합니다. HMR은 없지만 동작이 보장됩니다.

- **UI 빠른 반복**: 웹 브라우저에서 `bun -F mobile dev` (HMR 정상 동작)
- **시뮬레이터 확인**: `bun -F mobile ios:dev` (프론트 변경 시 재실행 필요)

## iOS 코드 서명 (개발자 팀)

iOS **실기기 빌드/배포**(`tauri ios build`, `tauri ios run`)는 Apple 코드 서명이
필요하며, Apple 개발자 **팀 ID**(10자리, 조직 단위 공유 값)를 지정해야 합니다.
아래 둘 중 하나로 제공합니다:

- 환경변수: `APPLE_DEVELOPMENT_TEAM=XXXXXXXXXX bun -F mobile tauri ios build`
- 또는 [`src-tauri/tauri.conf.json`](./src-tauri/tauri.conf.json)의
`bundle.iOS.developmentTeam`에 실제 팀 ID 기입

> ⚠️ 이 값을 **빈 문자열 `""`로 두면 tauri 가 거부**합니다
> (`apple.development-team is empty`). 팀 ID가 정해지기 전에는 필드를 **아예 생략**하세요.

- **시뮬레이터**(`tauri ios dev`)는 ad-hoc 서명이라 팀 없이도 실행됩니다
(`developmentTeam` 필드를 생략한 상태면 그대로 동작).
- 팀 ID 확인: Xcode → Settings → Accounts → 계정 선택 → 팀 목록의 10자리 ID,
또는 <https://developer.apple.com> → Membership → Team ID.
4 changes: 4 additions & 0 deletions apps/mobile/app-icon.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"default": "app-icon.svg",
"bg_color": "#EFEEEB"
}
5 changes: 5 additions & 0 deletions apps/mobile/app-icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
22 changes: 22 additions & 0 deletions apps/mobile/devup.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"theme": {
"colors": {
"default": {
"bg": "#F2F2F2",
"surface": "#FFFFFF",
"text": "#1A1A1A",
"textMuted": "#6B6B6B",
"textSubtle": "#9A9A9A",
"border": "#E5E5E5",
"primary": "#1A1A1A",
"primaryText": "#FFFFFF",
"danger": "#E03E5C",
"dangerSoft": "#FDECEF",
"dangerSoftBorder": "#F5B8C1",
"accent": "#3FB6A8",
"star": "#F5C518",
"tabBar": "#2A2A2A"
}
}
}
}
33 changes: 33 additions & 0 deletions apps/mobile/next.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { DevupUI } from '@devup-ui/next-plugin'
import type { NextConfig } from 'next'

const nextConfig: NextConfig = {
// Tauri는 정적 export 결과물(out/)을 번들링한다.
// SSR / Server Actions / 동적 route handler는 사용하지 않는다.
output: 'export',

// 정적 export에서는 Next 이미지 최적화 서버를 쓸 수 없다.
images: {
unoptimized: true,
},

// react-compiler로 클라이언트 런타임 비용을 추가로 줄인다.
reactCompiler: true,

webpack(config, { isServer, dev }) {
// braillify는 wasm-pack `--target bundler` 산출물(ESM WebAssembly)이다.
// Webpack 5는 기본적으로 WebAssembly를 비활성화하므로 직접 켜준다.
config.experiments = { ...config.experiments, asyncWebAssembly: true }

// 정적 export 프리렌더(server 번들)에서 .wasm 경로가 어긋나
// "Error occurred prerendering page" 가 나는 것을 방지한다.
config.output.webassemblyModuleFilename =
isServer && !dev
? '../static/wasm/[modulehash].wasm'
: 'static/wasm/[modulehash].wasm'

return config
},
}

export default DevupUI(nextConfig, {})
38 changes: 38 additions & 0 deletions apps/mobile/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"name": "mobile",
"private": true,
"version": "0.1.0",
"scripts": {
"dev": "next dev -p 1420",
"build": "next build",
"start": "next start",
"lint": "oxlint",
"check": "tsc --noEmit && cargo check --manifest-path src-tauri/Cargo.toml",
"ios:init": "tauri ios init && bun run icons",
"ios:dev": "tauri ios dev --config src-tauri/tauri.sim.conf.json",
"ios:run": "tauri ios run",
"ios:build": "tauri ios build",
"android:init": "tauri android init && bun run icons",
"icons": "tauri icon app-icon.json",
"tauri": "tauri"
},
"dependencies": {
"@devup-ui/components": "^0.1.46",
"@devup-ui/react": "^1.0.37",
"@tauri-apps/api": "^2",
"@tauri-apps/plugin-clipboard-manager": "^2",
"braillify": "workspace:*",
"next": "16.2.6",
"react": "^19.2.6",
"react-dom": "^19.2.6"
},
"devDependencies": {
"@devup-ui/next-plugin": "^1.0.77",
"@tauri-apps/cli": "^2",
"@types/node": "^25",
"@types/react": "^19",
"@types/react-dom": "^19",
"babel-plugin-react-compiler": "^1.0.0",
"typescript": "~5.8.3"
}
}
8 changes: 8 additions & 0 deletions apps/mobile/src-tauri/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Generated by Cargo
# will have compiled files and executables
/target/

# Generated by Tauri
# 네이티브 프로젝트(Xcode/Android)는 전부 생성물이므로 커밋하지 않는다.
# clone 후 `tauri ios init` / `tauri android init` 로 재생성한다. (README 참고)
/gen/
Loading
Loading