diff --git a/client/src/components/Admin/AdminPluginsPanel.tsx b/client/src/components/Admin/AdminPluginsPanel.tsx index 8a1630424..9ba077f3f 100644 --- a/client/src/components/Admin/AdminPluginsPanel.tsx +++ b/client/src/components/Admin/AdminPluginsPanel.tsx @@ -1688,8 +1688,8 @@ function VersionPickerDialog({ plugin, versions, failed, busy, t, locale, onPick t: T; locale: string; onPick: (version: string) => void; onClose: () => void }) { return ( -
$1')
- .replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_, label, url) => {
- const safeUrl = url.startsWith('http://') || url.startsWith('https://') ? url : '#'
- return `${label}`
- })
+ return linkify(
+ escapeHtml(text)
+ .replace(/\*\*(.+?)\*\*/g, '$1')
+ .replace(/`(.+?)`/g, '$1')
+ )
}
for (const line of lines) {
diff --git a/client/src/mobile/screens/journey/MJourneyEntrySheet.tsx b/client/src/mobile/screens/journey/MJourneyEntrySheet.tsx
index ee6c8ef1a..a850f30f4 100644
--- a/client/src/mobile/screens/journey/MJourneyEntrySheet.tsx
+++ b/client/src/mobile/screens/journey/MJourneyEntrySheet.tsx
@@ -315,7 +315,12 @@ export default function MJourneyEntrySheet({
}
const addTag = () => {
- const value = tagInput.trim().replace(/,+$/, '')
+ // Trailing commas dropped by a scan, not /,+$/: an unanchored ,+ before $ has to
+ // retry from every comma in the run, so a pasted string of them freezes the tab.
+ const trimmed = tagInput.trim()
+ let end = trimmed.length
+ while (end > 0 && trimmed[end - 1] === ',') end--
+ const value = trimmed.slice(0, end)
if (!value) return
if (!tags.includes(value)) setTags(prev => [...prev, value])
setTagInput('')
diff --git a/client/src/mobile/screens/trip/sheets/MTransportFormSheet.tsx b/client/src/mobile/screens/trip/sheets/MTransportFormSheet.tsx
index c81ba3425..f96886d85 100644
--- a/client/src/mobile/screens/trip/sheets/MTransportFormSheet.tsx
+++ b/client/src/mobile/screens/trip/sheets/MTransportFormSheet.tsx
@@ -54,9 +54,16 @@ function endpointFromAirport(a: Airport, role: 'from' | 'to' | 'stop', sequence:
function endpointFromLocation(l: LocationPoint, role: 'from' | 'to' | 'stop', sequence: number, date: string | null, time: string | null): Omit