The Quantum Symbols project is a minimal and visually striking single-page application (SPA) that features a set of floating symbols inspired by quantum themes. The application is designed to be mobile-optimized and works seamlessly across all modern browsers, including Chrome, Edge, Safari, Opera, Brave, and Arc.
- Floating symbols that respond to user interactions.
- Full-screen modal display for content when symbols are clicked.
- Visually appealing background graphics that convey a quantum theme with undulating colors and rounded geometric shapes.
- Cloud-hosted images served from Google Cloud Storage for improved performance and scalability.
- Built using TypeScript for robust and maintainable code.
The project is organized as follows:
├── src
│ ├── index.ts # Main entry point of the application
│ ├── styles.css # Styles for the application
│ ├── types.ts # TypeScript interfaces and types
│ ├── imageManifest.json # Cloud storage image URL mappings
│ └── assets
│ └── background.svg # Background graphic for the application
├── public
│ └── index.html # Main HTML file for the application
├── dist # Build output
| └── various files generated by webpack which are served publically
├── package.json # npm configuration file
├── tsconfig.json # TypeScript configuration file
├── .gitignore # Files and directories to ignore by Git
└── README.md # Documentation for the project
-
Clone the repository:
git clone https://github.com/rorads/qntm-exhib.rorads.github.io.git cd qntm-exhib.rorads.github.io -
Install dependencies:
npm install -
Build the project:
npm run build -
Serve the application:
npx serve -s dist -l 3005 -
Open your browser and navigate to
http://localhost:3005to view the application.
The application is deployed and can be accessed at: https://rorads.github.io/qntm-exhib.rorads.github.io/dist/
- Click on any of the floating symbols to open a modal that displays relevant content.
- The application is designed to be responsive and should work well on mobile devices.
The application uses Google Cloud Storage to host exhibition images. All images are served from the exhibition-pictures bucket and referenced through a JSON manifest.
-
Organise images locally in the
offline_pictures/directory:offline_pictures/ ├── full/ # Full-size images ├── full_thumbs/ # Thumbnail versions └── mains/ # Main artist images used in modals -
Upload images to Google Cloud Storage (preserving folder structure):
gsutil -m cp -r offline_pictures/* gs://exhibition-pictures/ -
Generate the image manifest with public URLs:
# List all images and create URL mappings gsutil ls -r gs://exhibition-pictures/ | grep -E '\.(jpg|jpeg|png)$'
-
Update the JSON manifest at
src/imageManifest.jsonwith the new URLs:- Public URL format:
https://storage.googleapis.com/exhibition-pictures/[folder]/[filename] - URL-encode spaces in filenames (space becomes
%20) - Organise by folder:
full,full_thumbs,mains
- Public URL format:
-
Rebuild and test the application:
npm run build npm start
To remove images from the exhibition:
-
Delete from local folder (if still present):
rm offline_pictures/[folder]/[filename]
-
Delete from Google Cloud Storage:
gsutil rm gs://exhibition-pictures/[folder]/[filename]
-
Regenerate the complete manifest (recommended approach):
- Follow steps 2-5 from "Adding or Updating Images" above
- This ensures the manifest stays in sync with available images
- Always maintain matching filenames between
full/andfull_thumbs/directories - The
mains/folder contains the specific artist images referenced in modal content - URL encoding is critical for filenames with spaces or special characters
- Test the application after any image changes to ensure all URLs are accessible
The exhibition-pictures bucket is configured with:
- Public read access - Images are accessible without authentication
- Project:
quantum-exhibition - Location: Standard storage class for optimal performance
Contributions are welcome! Please feel free to submit a pull request or open an issue for any suggestions or improvements.
This project is licensed under the MIT License. See the LICENSE file for more details.