Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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: 0 additions & 1 deletion app/student/profile/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,6 @@ export default function ProfilePage() {
ref={profileEditorRef}
initialTab="Student Profile"
initialOpenSections={openProfileSections}
actionSlot={editActions}
resumeManager={resumeManager}
/>
</ProfileEditForm>
Expand Down
74 changes: 68 additions & 6 deletions components/ui/autocomplete.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ function AutocompleteBase<ID extends number | string>({
const inputRef = useRef<HTMLInputElement | null>(null);
const sheetInputRef = useRef<HTMLInputElement | null>(null);
const lastSelectionRef = useRef(0);
const [sheetViewport, setSheetViewport] = useState<{
top: number;
height: number;
} | null>(null);

const inputId = useId();

Expand Down Expand Up @@ -182,6 +186,30 @@ function AutocompleteBase<ID extends number | string>({
return () => window.clearTimeout(focusTimer);
}, [isOpen, useMobileSheet]);

// track visual viewport for autocomplete mobile popup
useEffect(() => {
if (!isOpen || !useMobileSheet) {
setSheetViewport(null);
return;
}

const updateViewport = () => {
const top = window.visualViewport?.offsetTop ?? 0;
const height = window.visualViewport?.height ?? window.innerHeight;
setSheetViewport({ top, height });
};

updateViewport();

window.visualViewport?.addEventListener("resize", updateViewport);
window.visualViewport?.addEventListener("scroll", updateViewport);

return () => {
window.visualViewport?.removeEventListener("resize", updateViewport);
window.visualViewport?.removeEventListener("scroll", updateViewport);
};
}, [isOpen, useMobileSheet]);

const suppressMobileKeyboard =
isMobile && mobileDropdownMode === "inline" && !allowCustomValue;

Expand Down Expand Up @@ -374,12 +402,15 @@ function AutocompleteBase<ID extends number | string>({
className={cn(
"overflow-y-auto overscroll-contain bg-white text-sm shadow-lg ring-1 ring-black ring-opacity-5",
useMobileSheet
? "fixed bottom-0 left-0 right-0 z-[1100] mt-0 max-h-[70vh] rounded-t-[0.33em] border border-b-0 border-gray-200 pb-3 shadow-2xl"
? "fixed left-0 right-0 z-[1100] mt-0 rounded-t-[0.33em] border border-b-0 border-gray-200 pb-3 shadow-2xl"
: "absolute left-0 right-0 z-50 mt-1 max-h-[400px] rounded-[0.33em] py-1",
)}
style={
useInlineMobileDropdown && dropdownMaxHeight !== undefined
? { maxHeight: dropdownMaxHeight }
useMobileSheet && sheetViewport
? {
top: sheetViewport.top,
maxHeight: sheetViewport.height,
}
: undefined
}
>
Expand Down Expand Up @@ -597,6 +628,10 @@ export function AutocompleteTreeMulti({
});
const rootRef = useRef<HTMLDivElement | null>(null);
const inputRef = useRef<HTMLButtonElement | null>(null);
const [sheetViewport, setSheetViewport] = useState<{
top: number;
height: number;
} | null>(null);

// Build ID -> label map (child shows "Parent · Child")
const labelMap = useMemo(() => {
Expand Down Expand Up @@ -738,6 +773,30 @@ export function AutocompleteTreeMulti({
};
}, [isOpen, useInlineMobileDropdown]);

// track visual viewport for autocomplete mobile popup
useEffect(() => {
if (!isOpen || !useMobileSheet) {
setSheetViewport(null);
return;
}

const updateViewport = () => {
const top = window.visualViewport?.offsetTop ?? 0;
const height = window.visualViewport?.height ?? window.innerHeight;
setSheetViewport({ top, height });
};

updateViewport();

window.visualViewport?.addEventListener("resize", updateViewport);
window.visualViewport?.addEventListener("scroll", updateViewport);

return () => {
window.visualViewport?.removeEventListener("resize", updateViewport);
window.visualViewport?.removeEventListener("scroll", updateViewport);
};
}, [isOpen, useMobileSheet]);

return (
<div
className={cn("relative w-full overflow-visible", className)}
Expand Down Expand Up @@ -801,12 +860,15 @@ export function AutocompleteTreeMulti({
className={cn(
"overflow-y-auto overscroll-contain bg-white text-sm shadow-lg ring-1 ring-black ring-opacity-5",
useMobileSheet
? "fixed bottom-0 left-0 right-0 z-[1100] mt-0 max-h-[70vh] rounded-t-[0.33em] border border-b-0 border-gray-200 pb-3 shadow-2xl"
? "fixed left-0 right-0 z-[1100] mt-0 rounded-t-[0.33em] border border-b-0 border-gray-200 pb-3 shadow-2xl"
: "absolute left-0 right-0 z-50 mt-1 max-h-[400px] rounded-[0.33em] py-1",
)}
style={
useInlineMobileDropdown && dropdownMaxHeight !== undefined
? { maxHeight: dropdownMaxHeight }
useMobileSheet && sheetViewport
? {
top: sheetViewport.top,
maxHeight: sheetViewport.height,
}
: undefined
}
>
Expand Down
7 changes: 0 additions & 7 deletions cypress.config.ts

This file was deleted.

116 changes: 0 additions & 116 deletions cypress/e2e/createjob.cy.ts

This file was deleted.

14 changes: 0 additions & 14 deletions cypress/e2e/deletejob.cy.ts

This file was deleted.

10 changes: 0 additions & 10 deletions cypress/e2e/login.cy.ts

This file was deleted.

15 changes: 0 additions & 15 deletions cypress/e2e/search.cy.ts

This file was deleted.

5 changes: 0 additions & 5 deletions cypress/fixtures/example.json

This file was deleted.

16 changes: 0 additions & 16 deletions cypress/support/commands.ts

This file was deleted.

17 changes: 0 additions & 17 deletions cypress/support/e2e.ts

This file was deleted.

5 changes: 0 additions & 5 deletions cypress/support/index.d.ts

This file was deleted.

4 changes: 2 additions & 2 deletions next.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ const imageOrigins = [

const cspHeader = `
default-src 'self';
script-src 'self' 'unsafe-eval' 'unsafe-inline' https://cdnjs.cloudflare.com;
script-src 'self' 'unsafe-eval' 'unsafe-inline' https://cdnjs.cloudflare.com https://*.posthog.com;
frame-src 'self' http://localhost:* ${connectOrigins};
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
img-src 'self' blob: data: http://localhost:* ${imageOrigins};
font-src 'self' https://fonts.gstatic.com;
connect-src 'self' http://localhost:* https://storage.googleapis.com ${connectOrigins};
connect-src 'self' http://localhost:* https://storage.googleapis.com https://*.posthog.com ${connectOrigins};
object-src 'none';
base-uri 'self';
form-action 'self';
Expand Down
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@
"@types/pg": "^8.20.0",
"@types/react": "^19",
"@types/react-dom": "^19",
"cypress": "^15.6.0",
"eslint": "^9.18.0",
"eslint-config-prettier": "^10.0.1",
"eslint-plugin-prettier": "^5.2.2",
Expand Down