Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
dcb2d4a
S5-01: Add 44px minimum touch targets for mobile WCAG 2.5.5
henfrydls Feb 23, 2026
3586baa
S5-02: Add mobile-responsive YearView with mini-heatmap + month detail
henfrydls Feb 23, 2026
180745d
S5-03: Add skeleton loaders with Zustand hydration gate
henfrydls Feb 23, 2026
b8dac02
S5-04: Add mobile UX improvements — MonthView default, Log Today, FAB…
henfrydls Feb 26, 2026
64b0b60
S5-05: Add design doc for animations and BottomSheet refinement
henfrydls Feb 26, 2026
cce7463
S5-05: Add implementation plan for animations and BottomSheet
henfrydls Feb 26, 2026
4301561
S5-05a: Add useAnimatedPresence hook for exit animations
henfrydls Feb 26, 2026
335aba2
S5-05c: Add exit animation to Modal
henfrydls Feb 26, 2026
36b83b8
S5-05b: Rewrite BottomSheet with swipe gestures and slide animation
henfrydls Feb 26, 2026
5adfb84
S5-05e: Add slide-up/fade animations to QuickLog
henfrydls Feb 26, 2026
448ca81
S5-05d: Add exit animation to ConfirmDialog
henfrydls Feb 26, 2026
54b43ab
S5-05f: Add exit animations for Toast, DropdownMenu, and view transit…
henfrydls Feb 26, 2026
cacbda3
S5-06a: Make Tauri config mobile-compatible
henfrydls Feb 26, 2026
e54876e
S5-06: Android build setup — first APK generated
henfrydls Feb 26, 2026
d6b1269
S5-07: QA fixes — icons, status bar, dropdown, swipe, pagination, colors
henfrydls Mar 6, 2026
11c27d2
S5-07a: Fix unused import in useSwipeGesture
henfrydls Mar 6, 2026
2389c25
S5-07b: QA round 2 — status bar, sticky header, overflow, pagination
henfrydls Mar 7, 2026
4f23a55
S5-07c: Fix launcher icon safe zone — add 19% padding for adaptive icons
henfrydls Mar 7, 2026
41392a5
S5-07d: Responsive pagination — 5 items mobile, 8 desktop
henfrydls Mar 7, 2026
de4dac8
S5-07e: Fix status bar color and keyboard cutoff on Android
henfrydls Mar 7, 2026
100e8f0
S5-07f: Adjust launcher icon to 75% content size
henfrydls Mar 7, 2026
ac8d3e9
S5-07g: Remove enableEdgeToEdge — fix status bar and keyboard
henfrydls Mar 7, 2026
2cd694c
S5-07h: Fix status bar with CSS-only approach for Android API 36
henfrydls Mar 7, 2026
0d05fcd
S5-07i: Status bar color — bg-gray-800 for clean contrast
henfrydls Mar 7, 2026
87c274f
S5-07j: UX improvements — collapsible colors, a11y, dvh fixes
henfrydls Mar 7, 2026
338caad
S5-07k: Auto-collapse ColorPicker, fix keyboard cutoff in ActivityForm
henfrydls Mar 7, 2026
bbf4cec
S5-07l: Bigger bold +/- toggle button in ColorPicker
henfrydls Mar 7, 2026
7b2a047
S5-07m: Fix status bar — white background with dark icons
henfrydls Mar 7, 2026
816a21a
S5-07n: Mobile QA fixes — modals, keyboard, colors, QuickLog
henfrydls Mar 7, 2026
c35b266
S5-07o: Add M3 easing CSS vars and animation keyframes
henfrydls Mar 7, 2026
a198492
S5-07p: Year-Month directional zoom transition (P0)
henfrydls Mar 7, 2026
2d3d054
S5-07q: Month navigation slide animation (P0)
henfrydls Mar 8, 2026
62c6f10
S5-07r: Checkbox bounce micro-interaction (P0)
henfrydls Mar 8, 2026
0b0c81d
S5-07s: Fix broken animate-in/out in Modal, ConfirmDialog, Toast, Dro…
henfrydls Mar 8, 2026
3705af4
S5-07t: BottomSheet asymmetric easing + backdrop blur (P1)
henfrydls Mar 8, 2026
518bcc0
S5-07u: QuickLog two-phase crossfade (P1)
henfrydls Mar 8, 2026
5937264
S5-07v: Activity list stagger + ripple touch feedback (P2)
henfrydls Mar 8, 2026
76264f8
S5-07w: Format animation changes + add design/implementation docs
henfrydls Mar 8, 2026
f203884
S5-07x: Fix BottomSheet enter animation — delay visibility by one frame
henfrydls Mar 8, 2026
1181d9f
S5-07b: Fix modal clipping + animation reliability + swipe toggle
henfrydls Mar 8, 2026
9fa82d3
S5-06a: Add Android APK build to release workflow
henfrydls Mar 8, 2026
474fe9f
S5-06a: Optimize Android APK — arm64 only
henfrydls Mar 8, 2026
df25daf
S5-07c: Fix CI lint errors — eslint-disable for setState-in-effect, p…
henfrydls Mar 8, 2026
95a8ba6
S5-07d: Fix CI — CRLF, eslint ignores, test compatibility
henfrydls Mar 19, 2026
10a4845
S5-07d: Fix Rust formatting in lib.rs
henfrydls Mar 19, 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
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* text=auto eol=lf
85 changes: 82 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,20 +88,99 @@ jobs:
with:
tagName: ${{ github.ref_name }}
releaseName: '${{ github.ref_name }}'
releaseBody: 'See the assets below to download the installer for your platform.'
releaseBody: |
See the assets below to download the installer for your platform.

**Android:** The APK is built for arm64 (aarch64) devices, which covers all Android phones and tablets released since ~2017 (Galaxy S8+, Pixel 2+, etc.). Older 32-bit devices are not supported.
releaseDraft: false
prerelease: false
args: ${{ matrix.args }}

build-android:
permissions:
contents: write
runs-on: ubuntu-latest
name: Build (android-apk)

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'

- name: Setup Android SDK
uses: android-actions/setup-android@v3

- name: Install Android NDK
run: sdkmanager "ndk;29.0.14206865"

- name: Install Rust stable with Android target
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'

- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
workspaces: './src-tauri -> target'
shared-key: android

- name: Install Node.js dependencies
run: npm ci

- name: Install Tauri CLI
run: npm install --save-dev @tauri-apps/cli

- name: Build Android APK (arm64 only)
run: npx tauri android build --apk --target aarch64
env:
NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/29.0.14206865

- name: Sign APK
run: |
APK_PATH="src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release-unsigned.apk"
ALIGNED_PATH="src-tauri/gen/android/app/build/outputs/apk/universal/release/daylo-android.apk"

# Generate a signing key
keytool -genkey -v -keystore release.jks -keyalg RSA -keysize 2048 \
-validity 10000 -alias release -storepass android -keypass android \
-dname "CN=Daylo,O=DLSLabs,C=US"

# Align
${ANDROID_HOME}/build-tools/$(ls ${ANDROID_HOME}/build-tools/ | tail -1)/zipalign -f 4 \
"$APK_PATH" "$ALIGNED_PATH"

# Sign
${ANDROID_HOME}/build-tools/$(ls ${ANDROID_HOME}/build-tools/ | tail -1)/apksigner sign \
--ks release.jks --ks-pass pass:android --ks-key-alias release \
"$ALIGNED_PATH"

- name: Upload APK to release
uses: softprops/action-gh-release@v2
with:
files: src-tauri/gen/android/app/build/outputs/apk/universal/release/daylo-android.apk
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

# Create a summary job that runs after all builds complete
release-summary:
needs: build
needs: [build, build-android]
runs-on: ubuntu-latest
if: always()
steps:
- name: Check build results
run: |
if [ "${{ needs.build.result }}" == "success" ]; then
if [ "${{ needs.build.result }}" == "success" ] && [ "${{ needs.build-android.result }}" == "success" ]; then
echo "All builds completed successfully!"
echo "Release artifacts have been uploaded to: ${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ github.ref_name }}"
else
Expand Down
3 changes: 2 additions & 1 deletion .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 100
"printWidth": 100,
"endOfLine": "lf"
}
76 changes: 76 additions & 0 deletions docs/plans/2026-02-26-s5-05-animations-bottomsheet-design.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# S5-05: Animations & BottomSheet Refinement — Design

## Problem

1. **BottomSheet backdrop bug:** Tapping the dimmed area doesn't close the sheet (inner div intercepts clicks)
2. **No exit animations:** All modals/toasts/dropdowns vanish instantly on close
3. **BottomSheet too basic:** No swipe-to-dismiss, no snap points, no slide animation
4. **View switching is jarring:** Year/Month swap is instantaneous

## Solution

### 1. `useAnimatedPresence` hook

Reusable hook for delayed unmount pattern:

```ts
function useAnimatedPresence(isOpen: boolean, duration: number): {
shouldRender: boolean // Keep in DOM during exit animation
isAnimating: boolean // true = entering, false = exiting
}
```

Components stay mounted during exit animation, then unmount after `duration` ms.

### 2. BottomSheet — Native-feel gestures

- **Snap points:** 75vh (default), 50vh (half), 0 (closed)
- **Swipe-to-dismiss:** Drag down past 30% threshold closes sheet
- **Slide-up animation:** `transform: translateY()` with `cubic-bezier(0.32, 0.72, 0, 1)` 300ms
- **Backdrop fix:** Move `onClick={onClose}` to backdrop div directly
- **Backdrop interpolation:** Opacity syncs with sheet position during drag
- **Touch handling:** `onPointerDown/Move/Up` for cross-device support

### 3. Exit animations for all overlay components

| Component | Enter | Exit |
|-----------|-------|------|
| Modal | fade-in + zoom-in-95 200ms | fade-out + zoom-out-95 150ms |
| ConfirmDialog | fade-in + zoom-in-95 200ms | fade-out + zoom-out-95 150ms |
| QuickLog | slide-up 300ms | slide-down 250ms |
| Toast | slide-in-from-right 300ms | slide-out-to-right 200ms |
| DropdownMenu | fade-in + slide-from-top 150ms | fade-out + slide-to-top 100ms |
| BottomSheet | slide-up 300ms | slide-down 200ms |

### 4. View transition (Year/Month)

Fade crossfade 200ms using CSS transition on opacity with `useAnimatedPresence`.

### 5. Unified timing

- **Enter:** `cubic-bezier(0.32, 0.72, 0, 1)` 300ms
- **Exit:** `cubic-bezier(0.32, 0.72, 0, 1)` 200ms
- **Micro-interactions:** Existing hover/active unchanged

## Approach

- Zero new dependencies (no framer-motion)
- Tailwind CSS transitions + `useAnimatedPresence` hook
- Touch gestures via native pointer events

## Files to create/modify

| File | Action |
|------|--------|
| `src/hooks/useAnimatedPresence.ts` | Create — delayed unmount hook |
| `src/hooks/useAnimatedPresence.test.ts` | Create — tests |
| `src/hooks/index.ts` | Update — export new hook |
| `src/components/ui/BottomSheet.tsx` | Rewrite — gestures + animations |
| `src/components/ui/BottomSheet.test.tsx` | Update — new behavior tests |
| `src/components/ui/Modal.tsx` | Update — exit animation |
| `src/components/ui/Modal.test.tsx` | Update — exit animation test |
| `src/components/activities/QuickLog.tsx` | Update — slide animation |
| `src/components/ui/Toast.tsx` | Update — exit animation |
| `src/components/ui/DropdownMenu.tsx` | Update — exit animation |
| `src/components/ui/ConfirmDialog.tsx` | Update — exit animation |
| `src/App.tsx` | Update — view transition wrapper |
Loading
Loading