Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
5b76fe6
chore: update formatting
bassoGeorge Jun 17, 2026
6d6a245
feat: Initial cut of feature resources
bassoGeorge Jun 17, 2026
52436c6
chore: wip
bassoGeorge Jun 17, 2026
a730eb2
feat: Introduce basic resources
bassoGeorge Jun 17, 2026
3972832
chore: Basic design for resources
bassoGeorge Jun 17, 2026
eb21333
chore: fix from debuggin
bassoGeorge Jun 17, 2026
c896093
chore: set a peacock color for wrkspace
bassoGeorge Jun 18, 2026
96d501a
chore: happier with the styling of attacklist
bassoGeorge Jun 18, 2026
b47cf36
chore: Get print styling sorted
bassoGeorge Jun 18, 2026
b73aaab
feat: Add text replacement for features
bassoGeorge Jun 18, 2026
6875bd3
feat: hit dice calculation
bassoGeorge Jun 18, 2026
afab642
chore: Update data for omarin
bassoGeorge Jun 18, 2026
789e8a4
feat: simplify feature lists
bassoGeorge Jun 18, 2026
dd23bce
feat: Get overall layout a bit better
bassoGeorge Jun 18, 2026
6b0c0d9
chore: Add the spells for omarin
bassoGeorge Jun 18, 2026
fe0cead
feat: Start splitting up spellcasting section
bassoGeorge Jun 18, 2026
794c4c9
feat: finish spell slots section
bassoGeorge Jun 19, 2026
ee05a3b
feat: Finish spell list basic
bassoGeorge Jun 19, 2026
407fd4c
feat: Finish spell list
bassoGeorge Jun 20, 2026
baf165a
feat: introduce a basic rich text display for dnd sheets
bassoGeorge Jun 21, 2026
70d369e
feat: Simplify appearance and personality
bassoGeorge Jun 21, 2026
bb604f4
feat: More second page stuff
bassoGeorge Jun 21, 2026
5b11eed
feat: Add magic item attunement
bassoGeorge Jun 21, 2026
1dfe442
feat: Minor layout change
bassoGeorge Jun 21, 2026
37d26d7
chore: working through character list
bassoGeorge Jun 22, 2026
c321131
chore: some more fixes
bassoGeorge Jun 22, 2026
29c2fb2
chore: minor fixups
bassoGeorge Jun 22, 2026
33e1994
feat: Introduce game tools deployment
bassoGeorge Jun 22, 2026
4b62588
chore: fix silly errors
bassoGeorge Jun 22, 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
17 changes: 8 additions & 9 deletions .github/workflows/info.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,6 @@ on:
affected_projects:
description: 'JSON array of affected projects'
value: ${{ jobs.Info.outputs.affected_projects }}
should_run_e2e:
description: 'Whether to run the e2e because of e2e change'
value: ${{ contains(fromJSON(jobs.Info.outputs.affected_projects), '@ageorgedev/ageorgedev-e2e') }}
should_deploy_site:
description: 'Whether to deploy the site'
value: ${{ contains(fromJSON(jobs.Info.outputs.affected_projects), '@ageorgedev/ageorgedev') }}
should_deploy_design_system:
description: 'Whether to deploy the design-system storybook'
value: ${{ contains(fromJSON(jobs.Info.outputs.affected_projects), '@ageorgedev/design-docs')}}
production_deploy_matrix:
description: 'JSON array of projects to deploy to production'
value: ${{ jobs.Info.outputs.production_deploy_matrix }}
Expand Down Expand Up @@ -42,6 +33,7 @@ jobs:
AFFECTED: ${{ steps.affected_projects.outputs.affected_projects }}
SITE_PROJECT: ${{ vars.VERCEL_PROJECT_AGEORGEDEV }}
DESIGN_PROJECT: ${{ vars.VERCEL_PROJECT_DESIGN_SYSTEM }}
GAME_TOOLS_PROJECT: ${{ vars.VERCEL_PROJECT_GAME_TOOLS }}
run: |
matrix=$(echo "$AFFECTED" | jq -c '
. as $p |
Expand All @@ -51,6 +43,9 @@ jobs:
else . end |
if ($p | contains(["@ageorgedev/design-docs"])) then
. + [{"vercel_project_name": env.DESIGN_PROJECT}]
else . end |
if ($p | contains(["@ageorgedev/game-tools"])) then
. + [{"vercel_project_name": env.GAME_TOOLS_PROJECT}]
else . end
')
echo "production_deploy_matrix=$matrix" >> "$GITHUB_OUTPUT"
Expand All @@ -60,6 +55,7 @@ jobs:
AFFECTED: ${{ steps.affected_projects.outputs.affected_projects }}
SITE_PROJECT: ${{ vars.VERCEL_PROJECT_AGEORGEDEV }}
DESIGN_PROJECT: ${{ vars.VERCEL_PROJECT_DESIGN_SYSTEM }}
GAME_TOOLS_PROJECT: ${{ vars.VERCEL_PROJECT_GAME_TOOLS }}
run: |
matrix=$(echo "$AFFECTED" | jq -c '
. as $p |
Expand All @@ -69,6 +65,9 @@ jobs:
else . end |
if ($p | contains(["@ageorgedev/design-docs"])) then
. + [{"vercel_project_name": env.DESIGN_PROJECT, "label": "Design System"}]
else . end |
if ($p | contains(["@ageorgedev/game-tools"])) then
. + [{"vercel_project_name": env.GAME_TOOLS_PROJECT, "label": "Game Tools"}]
else . end
')
echo "pr_deploy_matrix=$matrix" >> "$GITHUB_OUTPUT"
Expand Down
17 changes: 16 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,20 @@
"editor.defaultFormatter": "biomejs.biome",
"nxConsole.generateAiAgentRules": true,
"js/ts.preferences.preferTypeOnlyAutoImports": true,
"js/ts.tsdk.path": "node_modules/typescript/lib"
"js/ts.tsdk.path": "node_modules/typescript/lib",
"workbench.colorCustomizations": {
"commandCenter.border": "#e7e7e799",
"sash.hoverBorder": "#8f491a",
"statusBar.background": "#643312",
"statusBar.foreground": "#e7e7e7",
"statusBarItem.hoverBackground": "#8f491a",
"statusBarItem.remoteBackground": "#643312",
"statusBarItem.remoteForeground": "#e7e7e7",
"tab.activeBorder": "#8f491a",
"titleBar.activeBackground": "#643312",
"titleBar.activeForeground": "#e7e7e7",
"titleBar.inactiveBackground": "#64331299",
"titleBar.inactiveForeground": "#e7e7e799"
},
"peacock.color": "#643312"
}
4 changes: 2 additions & 2 deletions apps/ageorgedev-e2e/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { defineConfig, devices } from '@playwright/test'
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
testDir: './tests',
Expand All @@ -11,4 +11,4 @@ export default defineConfig({
use: { ...devices['Desktop Chrome'] },
},
],
})
});
24 changes: 12 additions & 12 deletions apps/ageorgedev-e2e/tests/smoke.spec.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import { expect, test } from '@playwright/test'
import { expect, test } from '@playwright/test';

test('home page renders', async ({ page }) => {
await page.goto('/')
await expect(page.getByRole('heading', { name: 'Anish' })).toBeVisible()
await expect(page.getByRole('heading', { name: 'George' })).toBeVisible()
await page.goto('/');
await expect(page.getByRole('heading', { name: 'Anish' })).toBeVisible();
await expect(page.getByRole('heading', { name: 'George' })).toBeVisible();
await expect(
page.getByRole('heading', { name: 'Web Developer' })
).toBeVisible()
})
).toBeVisible();
});

test('resume page renders', async ({ page }) => {
await page.goto('/resume')
await expect(page.locator('body')).not.toBeEmpty()
})
await page.goto('/resume');
await expect(page.locator('body')).not.toBeEmpty();
});

test('talks page renders', async ({ page }) => {
await page.goto('/talks')
await expect(page.locator('body')).not.toBeEmpty()
})
await page.goto('/talks');
await expect(page.locator('body')).not.toBeEmpty();
});
2 changes: 1 addition & 1 deletion apps/ageorgedev/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"@phosphor-icons/react": "2.1.10",
"@tanstack/react-router": "1.170.11",
"@tanstack/react-start": "1.168.19",
"ramda": "0.28.0",
"ramda": "0.32.0",
"react": "19.2.7",
"react-dom": "19.2.7",
"remark-frontmatter": "5.0.0",
Expand Down
2 changes: 1 addition & 1 deletion apps/ageorgedev/postcss.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ export default {
'postcss-nesting': {},
'@tailwindcss/postcss': {},
},
}
};
4 changes: 2 additions & 2 deletions apps/ageorgedev/src/components/GlobalProviders.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ThemeProvider } from '@ageorgedev/design-system/theming/ThemeProvider'
import { ThemeProvider } from '@ageorgedev/design-system/theming/ThemeProvider';

export function GlobalProviders({ children }: React.PropsWithChildren) {
return <ThemeProvider>{children}</ThemeProvider>
return <ThemeProvider>{children}</ThemeProvider>;
}
28 changes: 14 additions & 14 deletions apps/ageorgedev/src/components/HomeAboveFold/HomeAboveFold.spec.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
import { render, screen } from '@testing-library/react'
import { describe, expect, it } from 'vitest'
import { HomeAboveFold } from './HomeAboveFold'
import { render, screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import { HomeAboveFold } from './HomeAboveFold';

describe('HomeAboveFold', () => {
it('renders a heading with the title', () => {
render(<HomeAboveFold />)
render(<HomeAboveFold />);
expect(
screen.getByRole('heading', { name: /web developer/i })
).toBeInTheDocument()
})
).toBeInTheDocument();
});

it('renders the subtitle text', () => {
render(<HomeAboveFold />)
render(<HomeAboveFold />);
expect(
screen.getByText(/architecting web experiences since 2016/i)
).toBeInTheDocument()
})
).toBeInTheDocument();
});

it('renders social links to GitHub and LinkedIn', () => {
render(<HomeAboveFold />)
expect(screen.getByRole('link', { name: /github/i })).toBeInTheDocument()
expect(screen.getByRole('link', { name: /linkedin/i })).toBeInTheDocument()
})
})
render(<HomeAboveFold />);
expect(screen.getByRole('link', { name: /github/i })).toBeInTheDocument();
expect(screen.getByRole('link', { name: /linkedin/i })).toBeInTheDocument();
});
});
12 changes: 6 additions & 6 deletions apps/ageorgedev/src/components/HomeAboveFold/HomeAboveFold.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { NameLogo } from '@ageorgedev/design-system/logo/NameLogo'
import { NameLogo } from '@ageorgedev/design-system/logo/NameLogo';
import {
Heading3,
Heading4,
} from '@ageorgedev/design-system/typography/typography-components'
import { cn } from '@ageorgedev/toolbelt/cn'
import { GithubLogoIcon, LinkedinLogoIcon } from '@phosphor-icons/react/ssr'
import styles from './HomeAboveFold.module.css'
} from '@ageorgedev/design-system/typography/typography-components';
import { cn } from '@ageorgedev/toolbelt/cn';
import { GithubLogoIcon, LinkedinLogoIcon } from '@phosphor-icons/react/ssr';
import styles from './HomeAboveFold.module.css';

export function HomeAboveFold() {
return (
Expand Down Expand Up @@ -62,5 +62,5 @@ export function HomeAboveFold() {
</div>
</section>
</div>
)
);
}
38 changes: 19 additions & 19 deletions apps/ageorgedev/src/components/Resume/Skill.spec.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
import { render, screen } from '@testing-library/react'
import { describe, expect, it } from 'vitest'
import { Skill } from './Skill'
import { render, screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import { Skill } from './Skill';

describe('Skill', () => {
it('renders the skill name', () => {
render(<Skill name="TypeScript" type="tool" level={4} />)
expect(screen.getByText('TypeScript')).toBeInTheDocument()
})
render(<Skill name="TypeScript" type="tool" level={4} />);
expect(screen.getByText('TypeScript')).toBeInTheDocument();
});

it('renders for each skill type without throwing', () => {
const { rerender } = render(<Skill name="React" type="tool" level={5} />)
expect(screen.getByText('React')).toBeInTheDocument()
const { rerender } = render(<Skill name="React" type="tool" level={5} />);
expect(screen.getByText('React')).toBeInTheDocument();

rerender(<Skill name="Performance" type="technique" level={4} />)
expect(screen.getByText('Performance')).toBeInTheDocument()
rerender(<Skill name="Performance" type="technique" level={4} />);
expect(screen.getByText('Performance')).toBeInTheDocument();

rerender(<Skill name="Mentoring" type="human" level={3} />)
expect(screen.getByText('Mentoring')).toBeInTheDocument()
})
rerender(<Skill name="Mentoring" type="human" level={3} />);
expect(screen.getByText('Mentoring')).toBeInTheDocument();
});

it('renders for all valid levels without throwing', () => {
const { rerender } = render(<Skill name="skill" type="tool" level={3} />)
rerender(<Skill name="skill" type="tool" level={4} />)
rerender(<Skill name="skill" type="tool" level={5} />)
expect(screen.getByText('skill')).toBeInTheDocument()
})
})
const { rerender } = render(<Skill name="skill" type="tool" level={3} />);
rerender(<Skill name="skill" type="tool" level={4} />);
rerender(<Skill name="skill" type="tool" level={5} />);
expect(screen.getByText('skill')).toBeInTheDocument();
});
});
42 changes: 21 additions & 21 deletions apps/ageorgedev/src/components/Resume/Skill.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import { cn } from '@ageorgedev/toolbelt/cn'
import { map } from 'ramda'
import styles from './Skill.module.css'
import { cn } from '@ageorgedev/toolbelt/cn';
import { map } from 'ramda';
import styles from './Skill.module.css';

type SkillType = 'tool' | 'technique' | 'human'
type SkillLevel = 3 | 4 | 5
type SkillType = 'tool' | 'technique' | 'human';
type SkillLevel = 3 | 4 | 5;

type SkillProps = {
name: string
type: SkillType
level: SkillLevel
}
name: string;
type: SkillType;
level: SkillLevel;
};

export function Skill(props: SkillProps) {
const styleClasses = levelClasses[props.type][props.level]
const styleClasses = levelClasses[props.type][props.level];

return (
<div
Expand All @@ -23,42 +23,42 @@ export function Skill(props: SkillProps) {
>
{props.name}
</div>
)
);
}

type SkillClassMap = Record<SkillLevel, string>
type SkillClassMap = Record<SkillLevel, string>;

const primaryAccentColorClasses: SkillClassMap = {
3: 'bg-primary-surface text-primary-onsurface',
4: 'bg-primary-surface-2 text-primary-onsurface-2',
5: `${styles.highSkill} bg-primary-surface-2 text-primary-onsurface-2`, // TODO
}
};

const secondaryAccentColorClasses: SkillClassMap = {
3: 'bg-secondary-surface text-secondary-onsurface',
4: 'bg-secondary-surface-2 text-secondary-onsurface-2',
5: `${styles.highSkill} bg-secondary-surface-2 text-secondary-onsurface-2`,
}
};

const levelClassesForHuman: SkillClassMap = {
3: 'bg-primary-surface text-primary-onsurface',
4: 'bg-primary-surface-2 text-primary-onsurface-2',
5: `${styles.highSkill} bg-primary-surface-2 text-primary-onsurface-2`, // TODO
}
};

const levelClasses: Record<SkillType, SkillClassMap> = {
tool: primaryAccentColorClasses,
technique: secondaryAccentColorClasses,
human: levelClassesForHuman,
}
};

const skillMapper =
(type: SkillType) =>
([name, level]: [string, SkillLevel]) => ({
name,
level,
type,
})
});

export const toolSkills: SkillProps[] = map(skillMapper('tool'), [
['React', 5],
Expand All @@ -73,7 +73,7 @@ export const toolSkills: SkillProps[] = map(skillMapper('tool'), [
['AgGrid', 3],
['Node', 4],
['Ramda', 4],
])
]);

export const techSkills: SkillProps[] = map(skillMapper('technique'), [
['Performance', 4],
Expand All @@ -89,7 +89,7 @@ export const techSkills: SkillProps[] = map(skillMapper('technique'), [
['Functional programming', 5],
['Accessibility', 4],
['CSS animations', 5],
])
]);

export const humanSkills: SkillProps[] = map(skillMapper('human'), [
['Mentoring', 4],
Expand All @@ -100,10 +100,10 @@ export const humanSkills: SkillProps[] = map(skillMapper('human'), [
['Leadership', 3],
['Stakeholder management', 5],
['Training', 5],
])
]);

export const AllSkills: SkillProps[] = [
...toolSkills,
...techSkills,
...humanSkills,
]
];
Loading