Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
0f2d514
feat: forward URL search params to vibe iframes and metadata
jchris Jul 27, 2025
40bfc7d
fix: add trailing slash to vibe iframe URLs for consistent path resol…
jchris Jul 27, 2025
8082f94
refactor: replace iframe embed with direct subdomain redirect for vib…
jchris Jul 27, 2025
33097a6
chore: bump React and ReactDOM to v19.1.1
jchris Jul 28, 2025
1f91d8c
chore: update pnpm lockfile dependencies
jchris Jul 28, 2025
da9c036
chore: update allowedHosts in Vite config for preview server
necrodome Jul 28, 2025
8d70373
feat: add X-VIBES-Token header to API key service for enhanced authen…
necrodome Jul 28, 2025
edf87f9
feat: add email support link to about page footer
jchris Jul 28, 2025
c6fa01a
fix: skip title generation for error responses in sendMessage hook
necrodome Jul 29, 2025
776d7d6
chore: format
jchris Jul 29, 2025
f97a28f
proxy for llm requests (#174)
necrodome Jul 29, 2025
a3e6a0e
chore: update dependencies and enhance test mocks for Remix, Root and…
jchris Jul 30, 2025
04befd1
feat: auto-submit chat input when prompt URL parameter is present
jchris Jul 30, 2025
549394f
feat: add chat view mode and improve prompt handling in navigation flow
jchris Jul 30, 2025
33d4751
feat: add hidden chat view type and update URL paths from /app to /chat
jchris Jul 30, 2025
755a8af
Update prompts.ts for custom color instruction
jchris Aug 4, 2025
c8f3471
feat: add editable Monaco Editor with save functionality (#190)
jchris Aug 6, 2025
64292de
feat: add MoonshotAI Kimi K2 model to available models list
jchris Aug 6, 2025
7d351ea
Remove email support link until it works
windmountain Aug 7, 2025
b35b161
Merge pull request #192 from VibesDIY/remove-help-email
windmountain Aug 7, 2025
bf042a3
Revert "Remove email support link until it works" (#193)
jchris Aug 7, 2025
c3356cf
Enhance Monaco Editor syntax error detection for save button (#191)
jchris Aug 7, 2025
7e4115d
feat: Add Storybook component library with extracted components (#197)
jchris Aug 9, 2025
5aae5bb
feat: add Storybook build and deployment configuration with caching h…
jchris Aug 9, 2025
c046dac
feat: add app settings view (#199)
necrodome Aug 9, 2025
146e2d4
refactor: make system prompt template data-driven (#195)
jchris Aug 9, 2025
f4ef45a
refactor: replace dynamic LLM text imports with static imports for be…
jchris Aug 9, 2025
a4f4cc6
chore(models): sync OpenRouter models from Issue #204 (#205)
charliecreates[bot] Aug 10, 2025
201c9e2
feat(netlify): opt-in Split Testing via nf_ab query (#207)
charliecreates[bot] Aug 11, 2025
efea8ec
feat(prompt): AI-powered LLMs.txt module selection (#202)
charliecreates[bot] Aug 11, 2025
665ea3e
feat: integrate neobrutalism.dev save button component with complete …
aileenvl Aug 12, 2025
0fa043f
style: update minidisc save icon with rounded rectangle frame and adj…
jchris Aug 12, 2025
59765c6
Jchris/iframe sandbox (#232)
jchris Aug 13, 2025
4edd3e2
fix: position New Vibe button at top-right corner of screen (#243)
jchris Aug 13, 2025
f7521a3
feat: clean up prettier configuration for better DX (#235)
jchris Aug 13, 2025
102ffeb
pass updateTitle through props to fix title propagation issue (#242)
necrodome Aug 13, 2025
80a1b24
feat(app-settings): per‑vibe Libraries chooser + scoped prompt usage …
charliecreates[bot] Aug 14, 2025
61022d9
Fireproof upgrade to 0.23.0 across both iframe and site (#246)
jchris Aug 14, 2025
0f3d360
fix scrolling on settings and style the scrollbars. (#253)
necrodome Aug 14, 2025
c06f25c
refactor: simplify prompt for instructional text and demo data inclusion
jchris Aug 14, 2025
702d221
fix: update layout so it doesn't shift on settings (#255)
necrodome Aug 15, 2025
5351e0e
feat: display AI-selected dependencies in settings UI with override o…
jchris Aug 15, 2025
57d674e
refactor: replace lazy database loading with eager initialization usi…
jchris Aug 15, 2025
c23666c
refactor: remove NeedsLoginModal component and references from root l…
jchris Aug 15, 2025
05f2f8e
docs(llms): Web Audio API research llms-txt + catalog entry (no refre…
charliecreates[bot] Aug 15, 2025
5b4f748
docs: add Three.js API reference and examples documentation
jchris Aug 16, 2025
67f2749
refactor: remove test mode checks and use proper dependency mocking i…
jchris Aug 16, 2025
8e0a850
feat: add SkyGlider game example with Three.js and smoke trails
jchris Aug 17, 2025
c5a58d9
feat: add three.js support with namespace imports
jchris Aug 17, 2025
288a96d
refactor: remove audio system and balloon objects from sky glider game
jchris Aug 17, 2025
b59dd4f
feat: add D3.js visualization library support with documentation and …
jchris Aug 17, 2025
b8b501c
style: format code with prettier and fix quotes consistency
jchris Aug 18, 2025
4c05e7e
feat(chat): per‑chat runtime ModelPicker with session‑level persisten…
CharlieHelps Aug 15, 2025
e4cbbf5
refactor(models): centralize model resolution + validation in prompts…
CharlieHelps Aug 15, 2025
f215706
refactor(session): delegate effective model to prompts.resolveEffecti…
CharlieHelps Aug 15, 2025
4af7d63
fix(typecheck): remove duplicate useFireproof import and update tests…
CharlieHelps Aug 15, 2025
fd92ba2
feat(chat): ✨ icon ModelPicker with accessible dropdown + busy state
CharlieHelps Aug 16, 2025
0376e5d
feat(ModelPicker): open dropdown upward by default + fit-to-viewport …
CharlieHelps Aug 16, 2025
998f5ed
style: format code with prettier and standardize quotes
jchris Aug 17, 2025
de6c434
feat: mark Gemini 2.5 Pro as featured model in models list
jchris Aug 17, 2025
10c9c29
feat: add global model support to model picker with fallback display
jchris Aug 17, 2025
2c13e60
refactor: remove debug console.log statements from model picker and c…
jchris Aug 17, 2025
c880b58
feat: add responsive compact mode for chat input model picker
jchris Aug 17, 2025
59f80c5
feat: add setting to toggle visibility of all models in chat dropdown
jchris Aug 17, 2025
3bd77cd
feat: allow custom openrouter model IDs with relaxed validation
jchris Aug 17, 2025
9c568db
chore: clean up imports, update model description and add ResizeObser…
jchris Aug 17, 2025
e4262cc
refactor: consolidate ResizeObserver mock into setup.ts and add featu…
jchris Aug 17, 2025
1430282
fix: correct emoji inversion in dark mode for model picker UI
jchris Aug 17, 2025
6e56d9b
feat(ModelPicker): featured-first ordering + always show full list; r…
CharlieHelps Aug 18, 2025
1ff0454
add menu bar component for storybook
aileenvl Aug 19, 2025
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: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,7 @@

# VS Code settings
.vscode/settings.json
.claude/settings.local.json

*storybook.log
storybook-static
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ dist/

# Dependencies
node_modules/
pnpm-lock.yaml

# Logs
npm-debug.log*
Expand Down
18 changes: 18 additions & 0 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import type { StorybookConfig } from '@storybook/react-vite';

const config: StorybookConfig = {
stories: ['../stories/**/*.mdx', '../stories/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
addons: [
'@chromatic-com/storybook',
'@storybook/addon-docs',
'@storybook/addon-onboarding',
'@storybook/addon-a11y',
],
framework: {
name: '@storybook/react-vite',
options: {
viteConfigPath: './.storybook/vite.config.ts',
},
},
};
export default config;
87 changes: 87 additions & 0 deletions .storybook/preview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import type { Preview } from '@storybook/react-vite';
import '../app/app.css';

// Custom viewports for testing your app's breakpoints
const customViewports = {
xs: {
name: 'XS - Custom (480px)',
styles: { width: '480px', height: '800px' },
},
belowSm: {
name: 'Below SM (639px)',
styles: { width: '639px', height: '800px' },
},
small: {
name: 'Small Mobile (440px)',
styles: { width: '440px', height: '800px' },
},
tiny: {
name: 'Tiny (375px)',
styles: { width: '375px', height: '800px' },
},
};

const preview: Preview = {
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
a11y: {
// 'todo' - show a11y violations in the test UI only
// 'error' - fail CI on a11y violations
// 'off' - skip a11y checks entirely
test: 'todo',
},
backgrounds: {
default: 'light',
values: [
{
name: 'light',
value: '#ffffff',
},
{
name: 'dark',
value: '#1a1a1a',
},
],
},
viewport: {
viewports: customViewports,
},
},
globalTypes: {
theme: {
description: 'Global theme for components',
defaultValue: 'light',
toolbar: {
title: 'Theme',
icon: 'circlehollow',
items: ['light', 'dark'],
dynamicTitle: true,
},
},
},
decorators: [
(Story, context) => {
const theme = context.globals.theme || 'light';

// Apply theme to document for Tailwind dark mode
if (typeof document !== 'undefined') {
if (theme === 'dark') {
document.documentElement.classList.add('dark');
document.documentElement.dataset.theme = 'dark';
} else {
document.documentElement.classList.remove('dark');
document.documentElement.dataset.theme = 'light';
}
}

return Story();
},
],
};

export default preview;
14 changes: 14 additions & 0 deletions .storybook/vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { defineConfig } from 'vite';
import tailwindcss from '@tailwindcss/vite';
import tsconfigPaths from 'vite-tsconfig-paths';

// Separate Vite config for Storybook that excludes React Router
export default defineConfig({
plugins: [tailwindcss(), tsconfigPaths()],
define: {
'process.env.DISABLE_REACT_ROUTER': '"true"',
},
json: {
stringify: true,
},
});
10 changes: 10 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co

## Common Commands

Run `pnpm check` to format, typecheck, and test, before asking for feedback on work. Never delete a test to pass without asking.

### Development

- `pnpm dev` - Start development server with Netlify functions (primary dev command)
Expand Down Expand Up @@ -105,3 +107,11 @@ This is a React Router v7 SPA application for building AI-powered mini apps. Key
- Vite plugins: Tailwind, TypeScript paths, devtools JSON
- Test environment configured to disable React Router when needed
- Coverage tracking for critical components and utilities

# important-instruction-reminders

Do what has been asked; nothing more, nothing less.
NEVER create files unless they're absolutely necessary for achieving your goal.
ALWAYS prefer editing an existing file to creating a new one.
NEVER proactively create documentation files (\*.md) or README files. Only create documentation files if explicitly requested by the User.
NEVER put test mode checks in production code - instead mock upstream dependencies in tests if you need deterministic behavior.
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,16 @@ Create beautiful, interactive mini apps with zero setup. Your creations are auto
- Add your AI account key from [OpenRouter](https://openrouter.ai/settings/keys)
- Run `pnpm dev`

## Developer previews on the main domain (no redirects)

Opt into an experimental branch deploy on the primary site using Netlify Split Testing with a cookie. Use `?ab=<branch>` on the main domain, for example:

```
https://vibes.diy/?ab=feature-new-ui
```

Note: the underlying Netlify cookie is named `nf_ab` and is host‑scoped by default (not shared between `www` and apex). See [docs/split-testing.md](docs/split-testing.md) for details and scope options.

## Your Work is Always Safe

Every app you create is automatically saved, so you can:
Expand Down
2 changes: 0 additions & 2 deletions __mocks__/useAuth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ export const mockUseAuth = vi.fn().mockImplementation(() => defaultAuthenticated
export const setMockAuthState = (state: Partial<AuthContextType>) => {
mockUseAuth.mockImplementation(() => ({
...defaultAuthenticatedState,
needsLogin: false,
setNeedsLogin: vi.fn(),
...state,
}));
};
Expand Down
148 changes: 147 additions & 1 deletion app/app.css
Original file line number Diff line number Diff line change
@@ -1,7 +1,118 @@
@import 'tailwindcss';
/* @import 'tw-animate-css'; */

@custom-variant dark (&:is(.dark *));

:root {
--background: oklch(93.46% 0.0305 255.11);
--secondary-background: oklch(100% 0 0);
--foreground: oklch(0% 0 0);
--main-foreground: oklch(0% 0 0);
--main: oklch(67.47% 0.1726 259.49);
--border: oklch(0% 0 0);
--ring: oklch(0% 0 0);
--overlay: oklch(0% 0 0 / 0.8);
--shadow: 4px 4px 0px 0px var(--border);
--chart-1: #5294ff;
--chart-2: #ff4d50;
--chart-3: #facc00;
--chart-4: #05e17a;
--chart-5: #7a83ff;
--chart-active-dot: #000;
}

.dark {
--background: oklch(29.23% 0.0626 270.49);
--secondary-background: oklch(23.93% 0 0);
--foreground: oklch(92.49% 0 0);
--main-foreground: oklch(0% 0 0);
--main: oklch(67.47% 0.1726 259.49);
--border: oklch(0% 0 0);
--ring: oklch(100% 0 0);
--shadow: 4px 4px 0px 0px var(--border);
--chart-1: #5294ff;
--chart-2: #ff6669;
--chart-3: #e0b700;
--chart-4: #04c86d;
--chart-5: #7a83ff;
--chart-active-dot: #fff;
}

@theme inline {
--color-main: var(--main);
--color-background: var(--background);
--color-secondary-background: var(--secondary-background);
--color-foreground: var(--foreground);
--color-main-foreground: var(--main-foreground);
--color-border: var(--border);
--color-overlay: var(--overlay);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);

/* Neobrutalism Color System */
--color-red-100: #ffcccb;
--color-red-200: #ff9f9f;
--color-red-300: #fa7a7a;
--color-red-400: #f76363;
--color-red-500: #e53e3e;

--color-orange-100: #ffe4cc;
--color-orange-200: #ffc29f;
--color-orange-300: #ff965b;
--color-orange-400: #fa8543;
--color-orange-500: #dd6b20;

--color-yellow-100: #fff5cc;
--color-yellow-200: #fff066;
--color-yellow-300: #ffe500;
--color-yellow-400: #ffe500;
--color-yellow-500: #d69e2e;

--color-lime-100: #e6ffcc;
--color-lime-200: #b8ff9f;
--color-lime-300: #9dfc7c;
--color-lime-400: #7df752;
--color-lime-500: #68d391;

--color-cyan-100: #ccf7ff;
--color-cyan-200: #a6faff;
--color-cyan-300: #79f7ff;
--color-cyan-400: #53f2fc;
--color-cyan-500: #4dd5e6;

--color-blue-100: #e6f3ff;
--color-blue-200: #cce7ff;
--color-blue-300: #5294ff;
--color-blue-400: oklch(67.47% 0.1726 259.49);
--color-blue-500: #2b77e6;

--color-violet-100: #f0ccff;
--color-violet-200: #a8a6ff;
--color-violet-300: #918efa;
--color-violet-400: #807dfa;
--color-violet-500: #7a83ff;

--color-pink-100: #ffccf9;
--color-pink-200: #ffa6f6;
--color-pink-300: #fa8cef;
--color-pink-400: #fa7fee;
--color-pink-500: #ed64a6;

--spacing-boxShadowX: 4px;
--spacing-boxShadowY: 4px;
--spacing-reverseBoxShadowX: -4px;
--spacing-reverseBoxShadowY: -4px;
--radius-base: 5px;
--shadow-shadow: var(--shadow);
--font-weight-base: 500;
--font-weight-heading: 700;
}

@theme {
/* Color definitions - these will be available as bg-midnight, text-tahiti, etc. */
--color-midnight: #333;
--color-tahiti: #999;
--color-bermuda: #ccc;
Expand Down Expand Up @@ -43,6 +154,21 @@
'Segoe UI Symbol', 'Noto Color Emoji';
}

@layer base {
body {
@apply text-foreground font-base bg-background;
}

h1,
h2,
h3,
h4,
h5,
h6 {
@apply font-heading;
}
}

html,
body {
@apply bg-light-background-00 dark:bg-dark-background-00 text-light-primary dark:text-dark-primary;
Expand Down Expand Up @@ -189,6 +315,26 @@ a,
@apply bg-accent-03-light dark:bg-accent-03-dark;
}

/* Global scrollbar styling */
* {
scrollbar-width: thin;
scrollbar-color: rgba(156, 163, 175, 0.5) transparent;
}

::-webkit-scrollbar {
width: 5px;
height: 40px;
}

::-webkit-scrollbar-thumb {
background: hsl(var(--gray-300));
border-radius: 5px;
}

::-webkit-scrollbar-track {
background: 0 0;
}

.text-accent-00 {
@apply text-accent-00-light dark:text-accent-00-dark;
}
Expand Down
Loading