diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..64ac8471 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + validate: + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.25.0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install dependencies + run: pnpm install --no-frozen-lockfile + + - name: Typecheck + run: pnpm typecheck + + - name: Lint + run: pnpm lint + + - name: Test + run: pnpm test + + - name: Build + run: pnpm build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..98a4f38c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,48 @@ +name: Release + +on: + push: + tags: + - 'v*' + workflow_dispatch: + +jobs: + package: + runs-on: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.25.0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install dependencies + run: pnpm install --no-frozen-lockfile + + - name: Build app + run: pnpm build + + - name: Package macOS + env: + CSC_LINK: ${{ secrets.CSC_LINK }} + CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + run: pnpm dist:mac + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: release-macos + path: release/** + if-no-files-found: error diff --git a/src/renderer/components/chat/ChatHistoryLoadingState.tsx b/src/renderer/components/chat/ChatHistoryLoadingState.tsx index d03c60d7..2398c259 100644 --- a/src/renderer/components/chat/ChatHistoryLoadingState.tsx +++ b/src/renderer/components/chat/ChatHistoryLoadingState.tsx @@ -1,20 +1,40 @@ /** * Loading skeleton for ChatHistory while conversation is loading. + * Industrial shimmer with organic line widths — no generic pulse. */ export const ChatHistoryLoadingState = (): JSX.Element => { + const rows = [ + { user: ['85%', '60%'], ai: ['92%', '70%', '82%', '45%'] }, + { user: ['75%', '92%', '40%'], ai: ['88%', '65%', '78%'] }, + { user: ['95%', '55%'], ai: ['72%', '85%', '60%', '92%', '35%'] }, + ]; + return ( -
+
- {/* Loading skeleton */} - {[1, 2, 3].map((i) => ( -
- {/* User message skeleton - right aligned */} + {rows.map((row, i) => ( +
+ {/* User message skeleton — right aligned */}
-
+
+ {row.user.map((width, j) => ( +
+ ))} +
- {/* AI response skeleton - left aligned with border accent */} -
-
+ {/* AI response skeleton — left aligned with border accent */} +
+ {row.ai.map((width, j) => ( +
+ ))}
))} diff --git a/src/renderer/components/dashboard/DashboardView.tsx b/src/renderer/components/dashboard/DashboardView.tsx index dd5bca27..2ad29f24 100644 --- a/src/renderer/components/dashboard/DashboardView.tsx +++ b/src/renderer/components/dashboard/DashboardView.tsx @@ -54,7 +54,7 @@ const CommandSearch = ({ value, onChange }: Readonly): React
{/* Search container with glow effect on focus */}
{/* Icon with subtle border */} -
+
@@ -232,11 +232,11 @@ const NewProjectCard = (): React.JSX.Element => { return (