Skip to content

Commit 0c07e2f

Browse files
committed
Initial Singapore RBO website MVP
Content: - Home page with hero banner, featured event, sponsor info - Contact page with LinkedIn as primary contact - RBO Kickoff 2026 event (January TBC) Assets: - DTC branded CSS (blue/orange theme, Poppins font) - Responsive mobile styles - Logos (DTC, Axomem, Dell) - Event and page banners - Placeholder speaker photos Configuration: - Site config with navigation and social links - Initiatives dropdown linking to DTC global initiatives Toolkit submodule updated to latest version
1 parent 3d6e51b commit 0c07e2f

27 files changed

Lines changed: 1763 additions & 2 deletions

.gitignore

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# RBO Website Toolkit - Git Ignore
2+
3+
# Generated output
4+
site/
5+
6+
# Environment and credentials
7+
.env
8+
.env.local
9+
.env.*.local
10+
11+
# Python
12+
__pycache__/
13+
*.py[cod]
14+
*$py.class
15+
*.so
16+
.Python
17+
build/
18+
develop-eggs/
19+
dist/
20+
downloads/
21+
eggs/
22+
.eggs/
23+
lib/
24+
lib64/
25+
parts/
26+
sdist/
27+
var/
28+
wheels/
29+
*.egg-info/
30+
.installed.cfg
31+
*.egg
32+
venv/
33+
.venv/
34+
35+
# IDE
36+
.idea/
37+
.vscode/
38+
*.swp
39+
*.swo
40+
*~
41+
.DS_Store
42+
43+
# Logs
44+
*.log
45+
npm-debug.log*
46+
47+
# Testing
48+
.coverage
49+
htmlcov/
50+
.pytest_cache/
51+

README.md

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,39 @@
1-
# README
1+
# Digital Twin Consortium - Singapore
2+
3+
Website for the Digital Twin Consortium Singapore Regional Branch.
4+
5+
## Quick Start
6+
7+
```bash
8+
# Install dependencies
9+
pip install -r toolkit/requirements.txt
10+
11+
# Build the site
12+
python toolkit/build.py
13+
14+
# Preview locally
15+
python -m http.server -d site 8000
16+
```
17+
18+
Then open http://localhost:8000
19+
20+
## Project Structure
21+
22+
- `content/` - Site content (pages, events, configuration)
23+
- `assets/` - CSS, JavaScript, and images
24+
- `toolkit/` - Build system and templates
25+
- `site/` - Generated output (gitignored)
26+
27+
## Documentation
28+
29+
- [Setup Status](toolkit/doc/setup_status.md) - Implementation progress
30+
- [Specification](toolkit/doc/setup_spec.md) - Full technical specification
31+
- [Agent Quickstart](toolkit/doc/QUICKSTART_AGENT.md) - Quick reference for AI agents
32+
33+
## Regional Branch Organizer
34+
35+
[Axomem](https://axomem.io) - Singapore
36+
37+
## License
38+
39+
Part of the [Digital Twin Consortium](https://www.digitaltwinconsortium.org) Regional Branch program.

assets/css/responsive.css

Lines changed: 305 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,305 @@
1+
/* RBO Website Toolkit - Responsive Styles */
2+
3+
/* ===== Mobile Menu Toggle ===== */
4+
.mobile-menu-toggle {
5+
display: none;
6+
}
7+
8+
/* ===== Tablet (max-width: 768px) ===== */
9+
@media (max-width: 768px) {
10+
:root {
11+
--spacing-xxl: 2rem;
12+
}
13+
14+
h1 { font-size: 1.75rem; }
15+
h2 { font-size: 1.5rem; }
16+
17+
.header-main {
18+
height: 80px;
19+
}
20+
21+
.site-logo {
22+
height: 60px;
23+
}
24+
25+
.header-container {
26+
flex-wrap: wrap;
27+
}
28+
29+
.mobile-menu-toggle {
30+
display: block;
31+
}
32+
33+
.nav-menu {
34+
display: none;
35+
position: absolute;
36+
top: 100%;
37+
left: 0;
38+
right: 0;
39+
flex-direction: column;
40+
background: var(--background);
41+
border-top: 1px solid var(--border-color);
42+
box-shadow: var(--shadow-md);
43+
padding: var(--spacing-md);
44+
gap: 0;
45+
}
46+
47+
.nav-menu.active {
48+
display: flex;
49+
}
50+
51+
.nav-item a {
52+
padding: var(--spacing-md);
53+
border-bottom: 1px solid var(--border-color);
54+
}
55+
56+
.nav-item:last-child a {
57+
border-bottom: none;
58+
}
59+
60+
/* Dropdown on mobile */
61+
.dropdown-menu {
62+
position: static;
63+
box-shadow: none;
64+
border: none;
65+
background: var(--background-alt);
66+
display: none;
67+
}
68+
69+
.nav-item.has-dropdown.open .dropdown-menu {
70+
display: block;
71+
}
72+
73+
/* Banner */
74+
.banner {
75+
min-height: 400px;
76+
}
77+
78+
.banner-content {
79+
margin-left: 0;
80+
padding: var(--spacing-xl);
81+
text-align: center;
82+
max-width: 100%;
83+
}
84+
85+
.banner-title {
86+
font-size: 1.75rem;
87+
}
88+
89+
.event-banner {
90+
height: 300px;
91+
}
92+
93+
.event-banner-content h1 {
94+
font-size: 1.5rem;
95+
}
96+
97+
/* Featured Event */
98+
.featured-event-card {
99+
grid-template-columns: 1fr;
100+
}
101+
102+
.featured-event-image {
103+
min-height: 250px;
104+
}
105+
106+
/* About Grid */
107+
.about-grid {
108+
grid-template-columns: 1fr;
109+
}
110+
111+
/* Event Meta */
112+
.event-meta {
113+
flex-direction: column;
114+
align-items: flex-start;
115+
gap: var(--spacing-sm);
116+
}
117+
118+
/* Speakers */
119+
.speakers-grid {
120+
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
121+
}
122+
123+
/* Contact */
124+
.contact-options {
125+
grid-template-columns: 1fr;
126+
}
127+
128+
/* Row Layout */
129+
.col-8,
130+
.col-10 {
131+
flex: 0 0 100%;
132+
max-width: 100%;
133+
}
134+
135+
/* Footer */
136+
.footer-container {
137+
grid-template-columns: 1fr;
138+
text-align: center;
139+
}
140+
}
141+
142+
/* ===== Mobile (max-width: 549px) ===== */
143+
@media (max-width: 549px) {
144+
html {
145+
font-size: 15px;
146+
}
147+
148+
.header-main {
149+
height: 70px;
150+
}
151+
152+
.site-logo {
153+
height: 50px;
154+
}
155+
156+
.top-bar {
157+
font-size: 12px;
158+
}
159+
160+
/* Banner */
161+
.banner-content {
162+
padding: 120px 0 var(--spacing-lg);
163+
}
164+
165+
.banner-title {
166+
font-size: 1.25rem;
167+
}
168+
169+
.event-banner {
170+
height: 240px;
171+
}
172+
173+
/* Buttons */
174+
.btn {
175+
width: 100%;
176+
justify-content: center;
177+
}
178+
179+
.btn-large {
180+
padding: var(--spacing-md);
181+
}
182+
183+
/* Events Grid */
184+
.events-grid {
185+
grid-template-columns: 1fr;
186+
}
187+
188+
/* Speakers */
189+
.speakers-grid {
190+
grid-template-columns: 1fr 1fr;
191+
}
192+
193+
.speaker-photo {
194+
width: 80px;
195+
height: 80px;
196+
}
197+
198+
/* Sponsors */
199+
.sponsors-grid {
200+
gap: var(--spacing-md);
201+
}
202+
203+
.sponsor-logo {
204+
height: 40px;
205+
}
206+
207+
/* Page content */
208+
.page-content,
209+
.event-content {
210+
padding: var(--spacing-lg) var(--spacing-md);
211+
}
212+
213+
.event-cta {
214+
padding: var(--spacing-lg);
215+
margin: var(--spacing-lg) var(--spacing-md);
216+
}
217+
}
218+
219+
/* ===== Large Desktop (min-width: 1280px) ===== */
220+
@media (min-width: 1280px) {
221+
.container {
222+
padding: 0 var(--spacing-xl);
223+
}
224+
}
225+
226+
/* ===== Print Styles ===== */
227+
@media print {
228+
.skip-link,
229+
.top-bar,
230+
.site-header,
231+
.site-footer,
232+
.mobile-menu-toggle,
233+
.event-cta,
234+
.back-link {
235+
display: none !important;
236+
}
237+
238+
.banner,
239+
.event-banner {
240+
height: auto;
241+
background: none !important;
242+
}
243+
244+
.banner-overlay,
245+
.event-banner-overlay {
246+
display: none;
247+
}
248+
249+
.banner-content,
250+
.event-banner-content {
251+
position: static;
252+
padding: var(--spacing-lg) 0;
253+
}
254+
255+
.banner-title,
256+
.event-banner-content h1 {
257+
color: var(--text-color);
258+
}
259+
260+
body {
261+
font-size: 12pt;
262+
}
263+
264+
a {
265+
text-decoration: underline;
266+
}
267+
268+
a[href^="http"]:after {
269+
content: " (" attr(href) ")";
270+
font-size: 0.8em;
271+
color: var(--text-light);
272+
}
273+
}
274+
275+
/* ===== Reduced Motion ===== */
276+
@media (prefers-reduced-motion: reduce) {
277+
*,
278+
*::before,
279+
*::after {
280+
animation-duration: 0.01ms !important;
281+
animation-iteration-count: 1 !important;
282+
transition-duration: 0.01ms !important;
283+
}
284+
285+
html {
286+
scroll-behavior: auto;
287+
}
288+
}
289+
290+
/* ===== Video Container for Responsive Embeds ===== */
291+
.video-container {
292+
position: relative;
293+
padding-bottom: 56.25%; /* 16:9 aspect ratio */
294+
height: 0;
295+
overflow: hidden;
296+
margin: var(--spacing-md) 0;
297+
}
298+
299+
.video-container iframe {
300+
position: absolute;
301+
top: 0;
302+
left: 0;
303+
width: 100%;
304+
height: 100%;
305+
}

0 commit comments

Comments
 (0)