diff --git a/resources/js/Components/FlightsGoneBy/CopyPageButton.vue b/resources/js/Components/FlightsGoneBy/CopyPageButton.vue
new file mode 100644
index 0000000..e55fb2e
--- /dev/null
+++ b/resources/js/Components/FlightsGoneBy/CopyPageButton.vue
@@ -0,0 +1,55 @@
+
+
+
+ {{ copied ? 'Copied Link To Page!' : label }}
+
+ {{ copied ? 'Copied Link To Page!' : label }}
+
+
+
+
+
diff --git a/resources/js/Components/FlightsGoneBy/FlightFilter.vue b/resources/js/Components/FlightsGoneBy/FlightFilter.vue
index 89cf595..48b0780 100644
--- a/resources/js/Components/FlightsGoneBy/FlightFilter.vue
+++ b/resources/js/Components/FlightsGoneBy/FlightFilter.vue
@@ -270,20 +270,6 @@ onMounted(async () => {
emitFilters()
})
-// ── Copy link ─────────────────────────────────────────────────────────────────
-
-const linkCopied = ref(false)
-
-async function copyFilterLink() {
- try {
- await navigator.clipboard.writeText(window.location.href)
- linkCopied.value = true
- setTimeout(() => { linkCopied.value = false }, 2000)
- } catch {
- // Clipboard API unavailable (e.g. non-secure context) - nothing to fall
- // back to here, the button just silently no-ops.
- }
-}
// ── Helpers ───────────────────────────────────────────────────────────────────
@@ -670,18 +656,6 @@ const countryFlagClass = (code: string) =>
-
-
-
- {{ linkCopied ? 'Copied!' : 'Copy Link to This Page With Filters' }}
-
-
diff --git a/resources/js/Components/FlightsGoneBy/GenericBadgeTable.vue b/resources/js/Components/FlightsGoneBy/GenericBadgeTable.vue
index c246cd9..0086b4d 100644
--- a/resources/js/Components/FlightsGoneBy/GenericBadgeTable.vue
+++ b/resources/js/Components/FlightsGoneBy/GenericBadgeTable.vue
@@ -4,6 +4,7 @@ defineProps<{
rowKey: (row: T) => string | number
hasItems: (row: T) => boolean
labelWidth?: string
+ compactOnMobile?: boolean
}>()
@@ -15,7 +16,11 @@ defineProps<{
class="badge-row"
>
-
+
@@ -38,8 +43,6 @@ defineProps<{
container-type: inline-size;
}
-
-
.badge-row {
display: flex;
align-items: center;
@@ -49,13 +52,13 @@ defineProps<{
.badge-label {
flex: 0 0 auto;
- width: 15em;
+ width: 21em;
padding: 0.5em;
border-right: 1px solid var(--table-border);
align-self: stretch;
display: flex;
align-items: center;
- font-size:0.9rem;
+ font-size: 0.9rem;
}
@container (max-width: 480px) {
@@ -63,6 +66,12 @@ defineProps<{
font-size: 0.75rem;
width: 9em;
}
+
+ .badge-label--compact {
+ font-size: 0.7rem;
+ width: clamp(6em, 50cqw, 9em);
+ flex-shrink: 0;
+ }
}
.badge-scroll-container {
diff --git a/resources/js/Components/FlightsGoneBy/MainFooter.vue b/resources/js/Components/FlightsGoneBy/MainFooter.vue
index 899a620..9cfcf54 100644
--- a/resources/js/Components/FlightsGoneBy/MainFooter.vue
+++ b/resources/js/Components/FlightsGoneBy/MainFooter.vue
@@ -1,6 +1,7 @@
@@ -35,11 +41,16 @@ const { entriesByDeparture, departureNames, completedCount, totalCount } =
:rows="entriesByDeparture.get(dep) ?? []"
:rowKey="entry => entry.key"
:hasItems="entry => entry.flights.length > 0"
- labelWidth="18em"
+ compactOnMobile
>
- {{ entry.label }}
+ {{ splitLabel(entry.label)[0] }}
+
+ {{ '\u2192\uFE0E' }}
+ {{ '\u2193\uFE0E' }}
+
+ {{ splitLabel(entry.label)[1] }}
@@ -80,4 +91,55 @@ const { entriesByDeparture, departureNames, completedCount, totalCount } =
gap: 1rem;
margin-bottom: 0.75rem;
}
+
+.pair-label {
+ width: 100%;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ gap: 0.35rem;
+ padding: 0 0.25rem;
+}
+
+.pair-part {
+ font-size: 0.9rem;
+ text-align: center;
+ white-space: nowrap;
+}
+
+.pair-divider {
+ font-size: 0.9rem;
+ opacity: 0.6;
+ flex-shrink: 0;
+}
+
+.divider-vertical {
+ display: none;
+}
+
+@container (max-width: 480px) {
+ .pair-label {
+ flex-direction: column;
+ gap: 0.1rem;
+ }
+
+ .pair-part {
+ font-size: 0.7rem;
+ white-space: normal;
+ }
+
+ .pair-divider {
+ font-size: 0.65rem;
+ line-height: 1;
+ }
+
+ .divider-horizontal {
+ display: none;
+ }
+
+ .divider-vertical {
+ display: inline;
+ }
+}
diff --git a/resources/js/Pages/Profile/Achievements/countries_continents.all_continent_pairs_one_way.vue b/resources/js/Pages/Profile/Achievements/countries_continents.all_continent_pairs_one_way.vue
index fa86ff8..a3b31ef 100644
--- a/resources/js/Pages/Profile/Achievements/countries_continents.all_continent_pairs_one_way.vue
+++ b/resources/js/Pages/Profile/Achievements/countries_continents.all_continent_pairs_one_way.vue
@@ -19,6 +19,12 @@ const flights = computed(() => props.flights)
const continents = computed(() => props.continents.filter(c => c.internal_name !== 'antarctica'))
const { entries, completedCount, totalCount } = useUndirectedContinentPairs(flights, continents)
+
+// Split "Africa↔Asia" into ["Africa", "Asia"] for independent flex items
+function splitLabel(label: string): [string, string] {
+ const [from, to] = label.split('↔')
+ return [from, to]
+}
@@ -32,11 +38,16 @@ const { entries, completedCount, totalCount } = useUndirectedContinentPairs(flig
:rows="entries"
:rowKey="entry => entry.key"
:hasItems="entry => entry.flights.length > 0"
- labelWidth="18em"
+ compactOnMobile
>
- {{ entry.label }}
+ {{ splitLabel(entry.label)[0] }}
+
+ {{ '\u2194\uFE0E' }}
+ {{ '\u2195\uFE0E' }}
+
+ {{ splitLabel(entry.label)[1] }}
@@ -80,12 +91,51 @@ const { entries, completedCount, totalCount } = useUndirectedContinentPairs(flig
.pair-label {
width: 100%;
display: flex;
+ flex-direction: row;
align-items: center;
- gap: 0.5rem;
+ justify-content: center;
+ gap: 0.35rem;
padding: 0 0.25rem;
}
-.pair-name {
+.pair-part {
font-size: 0.9rem;
+ text-align: center;
+ white-space: nowrap;
+}
+
+.pair-divider {
+ font-size: 0.9rem;
+ opacity: 0.6;
+ flex-shrink: 0;
+}
+
+.divider-vertical {
+ display: none;
+}
+
+@container (max-width: 480px) {
+ .pair-label {
+ flex-direction: column;
+ gap: 0.1rem;
+ }
+
+ .pair-part {
+ font-size: 0.7rem;
+ white-space: normal;
+ }
+
+ .pair-divider {
+ font-size: 0.65rem;
+ line-height: 1;
+ }
+
+ .divider-horizontal {
+ display: none;
+ }
+
+ .divider-vertical {
+ display: inline;
+ }
}