diff --git a/package-lock.json b/package-lock.json index 39cd228d..9d1374c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4565,7 +4565,7 @@ "version": "1.57.0", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "playwright": "1.57.0" @@ -7263,7 +7263,7 @@ "version": "19.2.7", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -8011,7 +8011,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -10158,7 +10158,7 @@ "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "node-gyp-build": "bin.js", @@ -10647,7 +10647,7 @@ "version": "1.57.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "playwright-core": "1.57.0" @@ -10666,7 +10666,7 @@ "version": "1.57.0", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -10898,7 +10898,6 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -10918,7 +10917,6 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", - "dev": true, "license": "MIT", "dependencies": { "scheduler": "^0.27.0" @@ -11285,7 +11283,6 @@ "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, "license": "MIT" }, "node_modules/scroll-into-view-if-needed": { diff --git a/packages/web/app/components/board-page/climbs-list.module.css b/packages/web/app/components/board-page/climbs-list.module.css new file mode 100644 index 00000000..587145ef --- /dev/null +++ b/packages/web/app/components/board-page/climbs-list.module.css @@ -0,0 +1,23 @@ +/* Responsive grid column for climbs list + + This CSS replaces antd's responsive Col props (xs/sm/lg/xl) to avoid + JavaScript-based breakpoint detection that can cause infinite loops + on iOS Safari when the browser UI changes viewport size. + + Since no `span` prop is set on the Col component, antd doesn't apply + its flex rules, allowing these CSS flex properties to control the layout. + This is intentional - we're using antd Col purely for gutter spacing + while CSS handles the responsive column widths. */ +.climbCol { + /* Default: full width on small screens (matches previous xs={24}) */ + flex: 0 0 100%; + max-width: 100%; +} + +/* lg breakpoint (992px+): 2 columns (matches previous lg={12}) */ +@media (min-width: 992px) { + .climbCol { + flex: 0 0 50%; + max-width: 50%; + } +} diff --git a/packages/web/app/components/board-page/climbs-list.tsx b/packages/web/app/components/board-page/climbs-list.tsx index b9542624..0190a863 100644 --- a/packages/web/app/components/board-page/climbs-list.tsx +++ b/packages/web/app/components/board-page/climbs-list.tsx @@ -7,6 +7,7 @@ import { useQueueContext } from '../graphql-queue'; import ClimbCard from '../climb-card/climb-card'; import { ClimbCardSkeleton } from './board-page-skeleton'; import { useSearchParams } from 'next/navigation'; +import styles from './climbs-list.module.css'; type ClimbsListProps = ParsedBoardRouteParameters & { boardDetails: BoardDetails; @@ -15,7 +16,7 @@ type ClimbsListProps = ParsedBoardRouteParameters & { const ClimbsListSkeleton = ({ aspectRatio }: { aspectRatio: number }) => { return Array.from({ length: 10 }, (_, i) => ( -