diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..a5b18eb --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,48 @@ +# Copilot Instructions + +This monorepo contains multiple subprojects. Below are the specific instructions for each. + +## Web Application +/webapp + +This is a TypeScript + Vue 3 + Vuetify application. + +### Architecture +- Vue 3 (Composition API) +- State management is local-first; avoid global stores unless required +- Vuetify for UI components and styling + +### Page Structure +- Each page resides in `src/views` +- Shared components go in `src/components` +- Styles are scoped to components; avoid global styles unless necessary +- Prefer helper classes (provided by Vuetify) for styling over CSS rules +- Wrap most pages in DefaultLayout.vue for consistent headers/footers +- Use the Hero component for prominent page headings + +### Coding Style +- Prefer functional patterns + +### Security & Privacy +- Never log PII +- Do not introduce tracking, analytics, or telemetry + +### General Rules +- Do not generate placeholder logic +- If something is unknown, leave a TODO comment +- Prefer simple, readable solutions over clever ones + +## Backend Service +/shotgun + +This is being deprecated. No new features should be added. Backend functionality should be migrated to serverless functions where possible. + +## Terraform +/terraform + +This contains Terraform code for infrastructure management. + +## Serverless Functions +/serverless + +This contains serverless functions to support the web application. \ No newline at end of file diff --git a/webapp/src/components/layout/Hero.vue b/webapp/src/components/layout/Hero.vue index bb79cbf..b390da2 100644 --- a/webapp/src/components/layout/Hero.vue +++ b/webapp/src/components/layout/Hero.vue @@ -3,7 +3,7 @@ @@ -33,7 +33,10 @@ const props = defineProps({ title: String, description: String, imageUrl: String, - gradient: String, + gradient: { + type: String, + default: 'linear-gradient(135deg, rgb(var(--v-theme-primary)) 0%, rgb(var(--v-theme-secondary)) 100%)', + }, buttonText: String, buttonTo: String, buttonHref: String, @@ -51,14 +54,11 @@ const target = computed(() => props.buttonHref && !props.buttonHref.startsWith('#') ? '_blank' : '_self' ); -const heroStyle = computed(() => { - if (props.gradient) { - return `background: ${props.gradient};`; - } else if (props.imageUrl) { - return `background: url('${props.imageUrl}') no-repeat ${props.backgroundPosition} / cover; --hero-opacity: ${props.opacity};`; - } - return ''; -}); +const heroStyle = computed(() => ( + props.imageUrl ? + `background: url('${props.imageUrl}') no-repeat ${props.backgroundPosition} / cover; --hero-opacity: ${props.opacity};` : + `background: ${props.gradient};` + ));