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
30 changes: 29 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: serve build capsync lint test e2e check clean install pwa android ios ios-live android-live
.PHONY: serve build capsync lint test e2e check clean install pwa android ios ios-live android-live appflow-ship

default:
@echo "Call a specific subcommand:"
Expand Down Expand Up @@ -57,3 +57,31 @@ clean:
rm -rf www/
rm -rf .angular/
rm -rf node_modules/

# Push current main to GitHub, build the web bundle on Appflow, and deploy it
# to the Production live-update channel. Requires:
# - IONIC_TOKEN env var (Appflow personal access token)
# - jq installed
# After build the jq selector below may need tweaking once you see the actual
# JSON shape; if so, run `appflow build web --json | jq .` once and update.
APPFLOW_APP_ID := e8e09c7a
APPFLOW_CHANNEL := Production

appflow-ship:
@command -v appflow >/dev/null || (echo "appflow CLI not found; install with: npm install -g @ionic/cloud-cli" && exit 1)
@command -v jq >/dev/null || (echo "jq not found; brew install jq" && exit 1)
@test -n "$$IONIC_TOKEN" || (echo "IONIC_TOKEN not set (export from .env: set -x IONIC_TOKEN (grep IONIC_TOKEN .env | cut -d= -f2))" && exit 1)
@COMMIT=$$(git rev-parse HEAD); \
if [ -z "$$(git branch -r --contains $$COMMIT 2>/dev/null)" ]; then \
echo "ERROR: $$COMMIT is not on any remote branch yet. Push it first (e.g. 'git push origin HEAD')."; \
exit 1; \
fi; \
echo ">> Building $(APPFLOW_APP_ID) @ $$COMMIT on Appflow..."; \
BUILD_JSON=$$(appflow build web --app-id $(APPFLOW_APP_ID) --commit $$COMMIT --json); \
BUILD_ID=$$(echo "$$BUILD_JSON" | jq -r '.buildId // .build_id // .id'); \
if [ -z "$$BUILD_ID" ] || [ "$$BUILD_ID" = "null" ]; then \
echo "Could not parse build ID from response:"; echo "$$BUILD_JSON"; exit 1; \
fi; \
echo ">> Built #$$BUILD_ID. Deploying to $(APPFLOW_CHANNEL)..."; \
appflow deploy web --app-id $(APPFLOW_APP_ID) --build-id $$BUILD_ID --destination $(APPFLOW_CHANNEL); \
echo ">> Done. Existing app installs will pick up build #$$BUILD_ID on next cold launch."
12 changes: 10 additions & 2 deletions src/app/pages/about-pycon/about-pycon.page.html
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,19 @@ <h1>PyCon US 2026</h1>
<span class="dev-value">{{liveUpdateService.appVersion}}</span>
</div>
<div class="dev-row">
<span class="dev-label">Build</span>
<span class="dev-label">Native Build</span>
<span class="dev-value">{{liveUpdateService.build}}</span>
</div>
<div class="dev-row" *ngIf="liveUpdateService.snapshot?.buildId">
<span class="dev-label">Live Update Build</span>
<span class="dev-value">#{{liveUpdateService.snapshot.buildId}}</span>
</div>
<div class="dev-row" *ngIf="liveUpdateService.channel">
<span class="dev-label">Channel</span>
<span class="dev-value">{{liveUpdateService.channel}}</span>
</div>
<div class="dev-row">
<span class="dev-label">Environment</span>
<span class="dev-label">API</span>
<span class="dev-value">{{environmentUrl}}</span>
</div>
<ion-button *ngIf="loggedIn" expand="block" fill="outline" size="small" (click)="shareDebug()" class="dev-btn">
Expand Down
289 changes: 74 additions & 215 deletions src/app/pages/expo-hall/expo-hall.page.html

Large diffs are not rendered by default.

180 changes: 149 additions & 31 deletions src/app/pages/expo-hall/expo-hall.page.scss
Original file line number Diff line number Diff line change
@@ -1,52 +1,170 @@
ion-content{
white-space: nowrap;
}
// Expo Hall — interactive floor plan with sponsor logo overlays.

.map-container {
width: 100%;
height: 100%;
overflow-x: scroll!important;
overflow-y: hidden;
overflow: hidden;
}

.expo-hall-map {
width: 100%;
height: 100%;
aspect-ratio: 4096/2885;
background-image:url(/assets/img/pycon-us-2026-floorplan.png);
background-size: contain;
background-repeat: no-repeat;
}

.map-inner {
position: relative;
display: inline-block;
width: 100%;

img {
width: 100%;
height: auto;
display: block;
}
}

// Booth overlay positioned on the floor plan
.boothgroup {
position: absolute;
cursor: pointer;

.boothgroupinner {
position: relative;
width: 100%;
height: 100%;
}

.booth {
position: absolute;
inset: 0;
border-radius: 4px;
transition: background 0.15s ease;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}

.booth-img {
max-width: 85%;
max-height: 85%;
object-fit: contain;
pointer-events: none;
}

&:active .booth,
&:hover .booth {
background: rgba(240, 192, 64, 0.28);
outline: 2px solid rgba(240, 192, 64, 0.85);
}

&.highlighted .booth {
background: rgba(240, 192, 64, 0.35);
outline: 3px solid #f0c040;
animation: pulse 1.2s ease-in-out 2;
}
}

@keyframes pulse {
0% { background: rgba(240, 192, 64, 0.15); }
50% { background: rgba(240, 192, 64, 0.45); }
100% { background: rgba(240, 192, 64, 0.15); }
}

// Search results dropdown
.search-results {
position: absolute;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: var(--ion-background-color, #fff);
border-bottom: 1px solid var(--ion-color-light, #e0e0e0);
max-height: 40vh;
overflow-y: auto;
}

.search-result-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
border-bottom: 1px solid var(--ion-color-light, #f0f0f0);
cursor: pointer;

&:active {
background: var(--ion-color-light, #f5f5f5);
}

.booth-name {
font-size: clamp(0.8rem, 2.5vw, 1rem);
font-weight: 600;
color: var(--ion-text-color, #222);
}

.booth-number {
font-size: clamp(0.7rem, 2vw, 0.85rem);
color: var(--ion-color-medium, #888);
}
}

// Tap popup at the bottom of the screen
.booth-popup {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 200;
padding: 0 16px 16px;
}

.booth {
margin: auto;
text-align: center;
border-radius: .33em;
scroll-margin-left: 3em;
scroll-margin-right: 3em;
.booth-popup-inner {
display: flex;
align-items: center;
justify-content: space-between;
background: var(--ion-background-color, #fff);
border-radius: 12px;
padding: 14px 16px;
box-shadow: 0 -2px 20px rgba(0, 0, 0, 0.15);
}

.booth-highlight {
border-style: solid;
border-width: 3%;
border-color: rgba(255, 252, 127, 0.75);
background: rgba(255, 252, 127, 0.33);
.booth-popup-content {
display: flex;
flex-direction: column;
gap: 2px;
flex: 1;
text-decoration: none;
color: inherit;
position: relative;

// The chevron sits inline at the right side of the link content so the
// tappable target spans the whole sponsor name + level row.
.booth-popup-chevron {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
color: var(--ion-color-medium, #888);
font-size: 1rem;
}
}

.booth-img {
max-height: 33%;
max-width: 85%;
margin-top: 20%;
a.booth-popup-content {
padding-right: 24px;
}

.tall-booth .booth-img {
margin-top: 80%;
.booth-popup-name {
font-size: clamp(0.9rem, 3vw, 1.1rem);
font-weight: 700;
color: var(--ion-text-color, #111);
}

.sq-booth .booth-img {
margin-top: 20%;
max-height: 50%;
.booth-popup-number {
font-size: clamp(0.75rem, 2.5vw, 0.9rem);
color: var(--ion-color-medium, #888);
}

.xtall-booth .booth-img {
margin-top: 50%
.close-btn {
--color: var(--ion-color-medium, #888);
margin-left: 8px;
}
24 changes: 0 additions & 24 deletions src/app/pages/expo-hall/expo-hall.page.spec.ts

This file was deleted.

Loading
Loading