From 0414d195c117f817f58fd6f6906a77b6935c014d Mon Sep 17 00:00:00 2001 From: thekingofcity <3353040+thekingofcity@users.noreply.github.com> Date: Wed, 24 Jun 2026 13:00:42 +0000 Subject: [PATCH 1/5] #351 Welcome page with apps cards --- src/components/workspace/welcome.test.tsx | 59 ++++ src/components/workspace/welcome.tsx | 211 +++++++++++-- src/components/workspace/workspace.module.css | 280 +++++++++++++++++- src/i18n/translations/en.json | 12 +- src/i18n/translations/ja.json | 10 + src/i18n/translations/ko.json | 10 + src/i18n/translations/zh-Hans.json | 10 + src/i18n/translations/zh-Hant.json | 10 + 8 files changed, 569 insertions(+), 33 deletions(-) create mode 100644 src/components/workspace/welcome.test.tsx diff --git a/src/components/workspace/welcome.test.tsx b/src/components/workspace/welcome.test.tsx new file mode 100644 index 0000000..672ecec --- /dev/null +++ b/src/components/workspace/welcome.test.tsx @@ -0,0 +1,59 @@ +import { fireEvent, screen } from '@testing-library/react'; +import { createTestStore, render } from '../../test-utils'; +import Welcome from './welcome'; + +const mockMatchMedia = (isMobilePortrait: boolean) => { + window.matchMedia = vi.fn().mockImplementation(query => ({ + media: query, + matches: query === '(max-width: 48em) and (orientation: portrait)' ? isMobilePortrait : false, + addListener: vi.fn(), + removeListener: vi.fn(), + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), + })); +}; + +describe('Welcome', () => { + const rmaDescription = + 'Generate station announcement content for a route. Good for turning station, transfer, and direction information into announcement copy that feels closer to a real ride experience.'; + + beforeEach(() => { + mockMatchMedia(false); + }); + + it('renders primary app cards', () => { + render(, { store: createTestStore() }); + + expect(screen.getByText('Rail Map Generator')).toBeInTheDocument(); + expect(screen.getByText('Rail Map Painter')).toBeInTheDocument(); + expect(screen.getByText('Rail Map Announcer')).toBeInTheDocument(); + expect(screen.getByText('Rail Sign Generator')).toBeInTheDocument(); + }); + + it('opens selected app from app card', () => { + const store = createTestStore(); + render(, { store }); + + fireEvent.click(screen.getByRole('button', { name: 'Open Rail Map Announcer' })); + + expect(store.getState().app.openedTabs).toEqual([expect.objectContaining({ app: 'rma', url: '/rma/' })]); + }); + + it('expands mobile app details without opening the app', () => { + mockMatchMedia(true); + const store = createTestStore(); + render(, { store }); + + expect(screen.queryByText(rmaDescription)).not.toBeInTheDocument(); + + fireEvent.click(screen.getByRole('button', { name: 'Expand Rail Map Announcer' })); + + expect(store.getState().app.openedTabs).toHaveLength(0); + expect(screen.getByText(rmaDescription)).toBeInTheDocument(); + + fireEvent.click(screen.getByRole('button', { name: 'Open Rail Map Announcer' })); + + expect(store.getState().app.openedTabs).toEqual([expect.objectContaining({ app: 'rma', url: '/rma/' })]); + }); +}); diff --git a/src/components/workspace/welcome.tsx b/src/components/workspace/welcome.tsx index 23a9129..4b992e0 100644 --- a/src/components/workspace/welcome.tsx +++ b/src/components/workspace/welcome.tsx @@ -1,30 +1,207 @@ import classes from './workspace.module.css'; import { useTranslation } from 'react-i18next'; import rmpLogo from '../../images/rmp-logo512.png'; -import { Group, Image, Stack, Text, Title } from '@mantine/core'; +import { Image, Stack, Text, Title } from '@mantine/core'; import { useRootDispatch } from '../../redux'; import { openApp } from '../../redux/app/app-slice'; +import { assetEnablement } from '../../util/asset-enablements'; +import { MdChevronRight, MdKeyboardArrowDown, MdKeyboardArrowUp } from 'react-icons/md'; +import { useMediaQuery } from '@mantine/hooks'; +import { type KeyboardEvent, type MouseEvent, useState } from 'react'; + +type WelcomeAppId = 'rmg' | 'rmp' | 'rma' | 'rsg'; + +interface WelcomeApp { + appId: WelcomeAppId; + descriptionKey: string; + logoSrc?: string; + logoText?: string; +} + +const welcomeApps: WelcomeApp[] = [ + { + appId: 'rmg', + logoSrc: import.meta.env.BASE_URL + 'logo512.png', + descriptionKey: 'WelcomePage.rmg', + }, + { + appId: 'rmp', + logoSrc: rmpLogo, + descriptionKey: 'WelcomePage.rmp', + }, + { + appId: 'rma', + logoText: 'RMA', + descriptionKey: 'WelcomePage.rma', + }, + { + appId: 'rsg', + logoText: 'RSG', + descriptionKey: 'WelcomePage.rsg', + }, +]; + +interface WelcomeAppCardProps { + app: WelcomeApp; + appName: string; + onOpenApp: (appId: WelcomeAppId) => void; + onOpenAppKeyDown: (event: KeyboardEvent, appId: WelcomeAppId) => void; +} + +const AppIcon = ({ app }: { app: WelcomeApp }) => ( +
+ {app.logoSrc ? ( + + ) : ( + {app.logoText} + )} +
+); + +const AppDescriptions = ({ app }: { app: WelcomeApp }) => { + const { t } = useTranslation(); + + return {t(app.descriptionKey)}; +}; + +const DesktopWelcomeAppCard = (props: WelcomeAppCardProps) => { + const { t } = useTranslation(); + const { app, appName, onOpenApp, onOpenAppKeyDown } = props; + + return ( +
onOpenApp(app.appId)} + onKeyDown={event => onOpenAppKeyDown(event, app.appId)} + > + + + + {appName} + + + +
+ +
+
+ ); +}; + +const MobileWelcomeAppCard = (props: WelcomeAppCardProps) => { + const { t } = useTranslation(); + const { app, appName, onOpenApp, onOpenAppKeyDown } = props; + const [isExpanded, setIsExpanded] = useState(false); + + const handleExpandClick = (event: MouseEvent) => { + event.stopPropagation(); + setIsExpanded(value => !value); + }; + + const handleExpandKeyDown = (event: KeyboardEvent) => { + event.stopPropagation(); + }; + + return ( +
onOpenApp(app.appId)} + onKeyDown={event => onOpenAppKeyDown(event, app.appId)} + > +
+ + + {appName} + +
+ +
+
+ + {isExpanded && ( +
+ + + +
+ )} + + +
+ ); +}; export default function Welcome() { const { t } = useTranslation(); const dispatch = useRootDispatch(); + const isMobilePortrait = useMediaQuery('(max-width: 48em) and (orientation: portrait)', false, { + getInitialValueInEffect: false, + }); + + const handleOpenApp = (appId: WelcomeAppId) => { + dispatch(openApp({ appId })); + }; + + const handleOpenAppKeyDown = (event: KeyboardEvent, appId: WelcomeAppId) => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + handleOpenApp(appId); + } + }; return ( - - - dispatch(openApp({ appId: 'rmg' }))} - /> - dispatch(openApp({ appId: 'rmp' }))} - /> - - {t('Welcome to Rail Map Toolkit')} - {t('Select an app to start your own rail map design!')} - +
+ + + {t('Welcome to Rail Map Toolkit')} + {t('WelcomePage.subtitle')} + + + + {welcomeApps.map(app => { + const appName = assetEnablement[app.appId].name + .split(' - ') + .map(name => t(name)) + .join(' - '); + + return isMobilePortrait ? ( + + ) : ( + + ); + })} + + +
); } diff --git a/src/components/workspace/workspace.module.css b/src/components/workspace/workspace.module.css index 9412d3e..77e200a 100644 --- a/src/components/workspace/workspace.module.css +++ b/src/components/workspace/workspace.module.css @@ -27,29 +27,279 @@ .welcome { height: 100%; - align-items: center; - justify-content: center; - overflow: hidden; + overflow: auto; + padding: calc(env(safe-area-inset-top) + 56px) var(--mantine-spacing-xl) + calc(env(safe-area-inset-bottom) + var(--mantine-spacing-xl)); +} + +.welcome-content { + width: min(75%, 1120px); + min-width: min(720px, 100%); + margin: 0 auto; + align-items: stretch; + gap: var(--mantine-spacing-xl); +} - h1, p { - text-align: center; +.welcome-heading { + align-items: flex-start; + + h1 { + font-size: 2.125rem; + line-height: 1.15; + letter-spacing: 0; } p { + max-width: 620px; + color: var(--mantine-color-dimmed); font-size: var(--mantine-font-size-lg); + line-height: 1.45; } } -.welcome .icons { - margin-bottom: var(--mantine-spacing-xs); +.welcome-app-list { + gap: var(--mantine-spacing-md); +} + +.welcome-app-card { + display: grid; + grid-template-columns: 112px minmax(0, 1fr) 96px; + align-items: center; + min-height: 128px; + background: var(--mantine-color-body); + border: 1px solid var(--mantine-color-default-border); + border-left: 5px solid var(--mantine-primary-color-filled); + border-radius: 8px; + box-shadow: var(--mantine-shadow-xs); + cursor: pointer; + overflow: hidden; + transition: + background-color 150ms ease, + border-color 150ms ease, + box-shadow 150ms ease; - img { - width: 120px; - padding: var(--mantine-spacing-xs); - background: white; - border: 1px solid var(--mantine-color-default-border); - border-radius: 12px; + @mixin hover { + background: var(--mantine-primary-color-light); + border-color: color-mix( + in srgb, + var(--mantine-primary-color-filled) 45%, + var(--mantine-color-default-border) + ); box-shadow: var(--mantine-shadow-sm); - cursor: pointer; } -} \ No newline at end of file + + &:focus-visible { + outline: 2px solid var(--mantine-primary-color-filled); + outline-offset: 2px; + } +} + +.welcome-app-icon { + width: 76px; + height: 76px; + justify-self: start; + margin-left: var(--mantine-spacing-lg); + display: flex; + align-items: center; + justify-content: center; + background: var(--mantine-primary-color-light); + border: 1px solid + color-mix(in srgb, var(--mantine-primary-color-filled) 28%, var(--mantine-color-default-border)); + border-radius: 8px; +} + +.welcome-app-logo { + width: 56px; + height: 56px; + object-fit: contain; +} + +.welcome-app-initials { + color: var(--mantine-primary-color-filled); + font-size: var(--mantine-font-size-lg); + font-weight: 700; + letter-spacing: 0; +} + +.welcome-app-copy { + min-width: 0; + padding: var(--mantine-spacing-lg) var(--mantine-spacing-lg) var(--mantine-spacing-lg) 0; + + h2 { + font-size: 1.3rem; + line-height: 1.2; + letter-spacing: 0; + } +} + +.welcome-app-description { + color: var(--mantine-color-dimmed); + font-size: var(--mantine-font-size-sm); + line-height: 1.45; +} + +.welcome-app-open { + width: 96px; + height: 100%; + align-self: stretch; + display: flex; + align-items: center; + justify-content: center; + color: var(--mantine-color-white); + background: var(--mantine-primary-color-filled); + + svg { + width: 36px; + height: 36px; + } +} + +.welcome-app-card.welcome-app-card-mobile { + display: block; + min-height: 0; +} + +.welcome-app-mobile-summary { + min-height: 78px; + display: grid; + grid-template-columns: 72px minmax(0, 1fr) 64px; + align-items: center; + + h2 { + min-width: 0; + padding-right: var(--mantine-spacing-md); + font-size: var(--mantine-font-size-lg); + line-height: 1.2; + letter-spacing: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .welcome-app-icon { + width: 52px; + height: 52px; + margin-left: var(--mantine-spacing-md); + } + + .welcome-app-logo { + width: 38px; + height: 38px; + } + + .welcome-app-open { + width: 64px; + } +} + +.welcome-app-mobile-detail { + min-height: 78px; + border-top: 1px solid + color-mix(in srgb, var(--mantine-primary-color-filled) 24%, var(--mantine-color-default-border)); + + .welcome-app-copy { + padding: var(--mantine-spacing-sm) var(--mantine-spacing-md); + } +} + +.welcome-app-expand { + width: 100%; + height: 22px; + display: flex; + align-items: center; + justify-content: center; + color: var(--mantine-primary-color-filled); + background: var(--mantine-primary-color-light); + border: 0; + border-top: 1px solid + color-mix(in srgb, var(--mantine-primary-color-filled) 24%, var(--mantine-color-default-border)); + cursor: pointer; + + @mixin hover { + background: var(--mantine-primary-color-light-hover); + } + + &:focus-visible { + outline: 2px solid var(--mantine-primary-color-filled); + outline-offset: -2px; + } + + svg { + width: 18px; + height: 18px; + } +} + +@media (max-width: 48em) { + .welcome { + padding-right: var(--mantine-spacing-md); + padding-left: var(--mantine-spacing-md); + } + + .welcome-content { + width: min(100%, 720px); + min-width: 0; + gap: var(--mantine-spacing-lg); + } + + .welcome-heading { + h1 { + font-size: 1.75rem; + } + + p { + font-size: var(--mantine-font-size-md); + } + } + + .welcome-app-card { + grid-template-columns: 76px minmax(0, 1fr) 84px; + min-height: 112px; + } + + .welcome-app-card.welcome-app-card-mobile { + min-height: 0; + } + + .welcome-app-icon { + width: 56px; + height: 56px; + margin-left: var(--mantine-spacing-md); + } + + .welcome-app-logo { + width: 42px; + height: 42px; + } + + .welcome-app-copy h2 { + font-size: var(--mantine-font-size-lg); + } + + .welcome-app-copy { + padding: var(--mantine-spacing-md) var(--mantine-spacing-md) var(--mantine-spacing-md) 0; + } + + .welcome-app-open { + width: 84px; + + svg { + width: 32px; + height: 32px; + } + } +} + +@media (max-width: 36em) { + .welcome-app-card { + grid-template-columns: 64px minmax(0, 1fr) 64px; + } + + .welcome-app-open { + width: 64px; + } + + .welcome-app-description { + font-size: var(--mantine-font-size-xs); + } +} diff --git a/src/i18n/translations/en.json b/src/i18n/translations/en.json index 81a1e5a..6c98742 100644 --- a/src/i18n/translations/en.json +++ b/src/i18n/translations/en.json @@ -23,6 +23,16 @@ "text4": "Please close this modal unless you're certain to do so or are supervised by our developers." }, + "WelcomePage": { + "subtitle": "Choose from the tools below and create your own rail map.", + "rmg": "Create single-line route diagrams and passenger information graphics like those above platform screen doors. Good for clearly showing a line's stations, transfers, directions, first and last trains, and more.", + "rmp": "Freely draw a complete rail transit network map. Good for designing urban metro networks, fictional lines, or organizing multiple lines into one clear map.", + "rma": "Generate station announcement content for a route. Good for turning station, transfer, and direction information into announcement copy that feels closer to a real ride experience.", + "rsg": "Create wayfinding signs and directional information for metro stations. Good for generating directions, station information boards, and display content with the Beijing Subway visual style." + }, + + "Expand": "Expand", + "Collapse": "Collapse", "RMP_CLOUD": "Rail Map Painter・Proceed Signal", "RMP_EXPORT": "Rail Map Painter・Stop and Proceed" -} \ No newline at end of file +} diff --git a/src/i18n/translations/ja.json b/src/i18n/translations/ja.json index f2a33cc..83108f3 100644 --- a/src/i18n/translations/ja.json +++ b/src/i18n/translations/ja.json @@ -23,11 +23,21 @@ "text4": "ご不明な場合、または当社の開発者の指示なしに操作している場合は、このダイアログを閉じてください。" }, + "WelcomePage": { + "subtitle": "以下のツールから選んで、自分だけの路線図を作成しましょう。", + "rmg": "ホームドア上部にあるような単一路線図と旅客案内図を作成できます。1つの路線の駅、乗換、方面、始発・終電などの情報を分かりやすく示すのに適しています。", + "rmp": "鉄道交通ネットワーク全体の路線図を自由に描けます。都市の地下鉄ネットワーク、架空路線の設計、または複数路線を1枚の分かりやすい地図に整理する用途に適しています。", + "rma": "路線向けの駅案内放送文を生成できます。駅、乗換、方面の情報を、実際の乗車体験に近い放送原稿として整理するのに適しています。", + "rsg": "地下鉄駅内の案内サインや誘導情報を作成できます。方向案内、駅情報板、北京地下鉄のビジュアルスタイルを持つ表示内容の生成に適しています。" + }, + "Session expired.": "セッションの有効期限が切れました。", "Please log in again.": "再度ログインしてください。", "Error": "失敗", "Success": "成功", "Close": "閉じる", + "Expand": "展開", + "Collapse": "折りたたむ", "About": "概要", "Allow cookies to help improve our website": "Cookie を許可して網頁の改善にご協力ください", diff --git a/src/i18n/translations/ko.json b/src/i18n/translations/ko.json index c3d975d..a7d01cc 100644 --- a/src/i18n/translations/ko.json +++ b/src/i18n/translations/ko.json @@ -23,11 +23,21 @@ "text4": "확실하지 않거나 당사 개발자의 안내 없이 작업하는 경우 이 대화 상자를 닫으십시오." }, + "WelcomePage": { + "subtitle": "아래 도구 중에서 선택해 나만의 노선도를 만들어 보세요.", + "rmg": "승강장 스크린도어 위에 있는 것 같은 단일 노선도와 승객 안내 이미지를 만들 수 있습니다. 한 노선의 역, 환승, 방향, 첫차와 막차 등의 정보를 명확하게 보여주기에 적합합니다.", + "rmp": "완전한 철도 교통망 지도를 자유롭게 그릴 수 있습니다. 도시 지하철 네트워크, 가상 노선 설계, 또는 여러 노선을 하나의 명확한 지도로 정리하는 데 적합합니다.", + "rma": "노선의 역 안내 방송 내용을 생성할 수 있습니다. 역, 환승, 방향 정보를 실제 승차 경험에 가까운 방송 문안으로 정리하는 데 적합합니다.", + "rsg": "지하철역 안의 안내 표지와 방향 안내 정보를 만들 수 있습니다. 방향 안내, 역 정보 표지, 베이징 지하철 시각 스타일의 표시 콘텐츠를 생성하는 데 적합합니다." + }, + "Session expired.": "세션이 만료되었습니다.", "Please log in again.": "다시 로그인해주세요.", "Error": "오류", "Success": "성공", "Close": "닫기", + "Expand": "펼치기", + "Collapse": "접기", "About": "정보", "Allow cookies to help improve our website": "쿠키를 허용하여 웹사이트 개선에 도움을 주세요", diff --git a/src/i18n/translations/zh-Hans.json b/src/i18n/translations/zh-Hans.json index d9d37fc..9310312 100644 --- a/src/i18n/translations/zh-Hans.json +++ b/src/i18n/translations/zh-Hans.json @@ -23,11 +23,21 @@ "text4": "如果您不确定,或者不是在我们的开发者的指引下操作,请关闭这个对话框。" }, + "WelcomePage": { + "subtitle": "从下列工具中选择并创建属于你的线路图吧", + "rmg": "制作站台门上方那样的单线线路图和乘客信息图。适合清楚展示一条线路的站点、换乘、方向和首末班车等信息。", + "rmp": "自由绘制完整的轨道交通线网图。适合设计城市地铁网络、虚构线路,或把多条线路整理成一张清晰的地图。", + "rma": "为线路生成报站内容。适合把站点、换乘和方向信息整理成更像真实乘车体验的播报文案。", + "rsg": "制作地铁站里的导视牌和指示信息。适合生成方向指引、站点信息牌,以及带有北京地铁视觉风格的展示内容。" + }, + "Session expired.": "会话已过期。", "Please log in again.": "请重新登录。", "Error": "错误", "Success": "成功", "Close": "关闭", + "Expand": "展开", + "Collapse": "收起", "About": "关于", "Allow cookies to help improve our website": "允许用 Cookies 帮助改进本网站", diff --git a/src/i18n/translations/zh-Hant.json b/src/i18n/translations/zh-Hant.json index 82280d9..e7ba6f0 100644 --- a/src/i18n/translations/zh-Hant.json +++ b/src/i18n/translations/zh-Hant.json @@ -23,11 +23,21 @@ "text4": "若你未能確定,或不是在我們的開發人員的指引下操作,請關閉這個視窗。" }, + "WelcomePage": { + "subtitle": "從下列工具中選擇並建立屬於你的路綫圖吧", + "rmg": "製作月台幕門上方那樣的單綫路綫圖和乘客資訊圖。適合清楚展示一條路綫的車站、轉乘、方向和首末班車等資訊。", + "rmp": "自由繪製完整的軌道交通綫網圖。適合設計城市地鐵網絡、虛構路綫,或把多條路綫整理成一張清晰的地圖。", + "rma": "為路綫生成報站內容。適合把車站、轉乘和方向資訊整理成更像真實乘車體驗的廣播文案。", + "rsg": "製作地鐵站裏的導視牌和指示資訊。適合生成方向指引、車站資訊牌,以及帶有北京地鐵視覺風格的展示內容。" + }, + "Session expired.": "工作階段已過期。", "Please log in again.": "請重新登入。", "Error": "錯誤", "Success": "成功", "Close": "關閉", + "Expand": "展開", + "Collapse": "收起", "About": "關於", "Allow cookies to help improve our website": "容許以 Cookies 幫助改進本網站", From 9563be2e9a89c80337abdfd058771c45c382abb9 Mon Sep 17 00:00:00 2001 From: thekingofcity <3353040+thekingofcity@users.noreply.github.com> Date: Wed, 24 Jun 2026 13:17:01 +0000 Subject: [PATCH 2/5] fix comment with action button background --- src/components/workspace/workspace.module.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/workspace/workspace.module.css b/src/components/workspace/workspace.module.css index 77e200a..74105a7 100644 --- a/src/components/workspace/workspace.module.css +++ b/src/components/workspace/workspace.module.css @@ -145,8 +145,8 @@ display: flex; align-items: center; justify-content: center; - color: var(--mantine-color-white); - background: var(--mantine-primary-color-filled); + color: var(--mantine-primary-color-filled); + background: transparent; svg { width: 36px; From 5d8fb742294d07b916936e32403a1b694390d83b Mon Sep 17 00:00:00 2001 From: thekingofcity <3353040+thekingofcity@users.noreply.github.com> Date: Tue, 7 Jul 2026 03:36:22 +0000 Subject: [PATCH 3/5] simplify welcome ui --- src/components/workspace/welcome.tsx | 145 +++++++----------- src/components/workspace/workspace.module.css | 7 - 2 files changed, 58 insertions(+), 94 deletions(-) diff --git a/src/components/workspace/welcome.tsx b/src/components/workspace/welcome.tsx index 4b992e0..742c5c8 100644 --- a/src/components/workspace/welcome.tsx +++ b/src/components/workspace/welcome.tsx @@ -14,8 +14,7 @@ type WelcomeAppId = 'rmg' | 'rmp' | 'rma' | 'rsg'; interface WelcomeApp { appId: WelcomeAppId; descriptionKey: string; - logoSrc?: string; - logoText?: string; + logoSrc: string; } const welcomeApps: WelcomeApp[] = [ @@ -31,12 +30,12 @@ const welcomeApps: WelcomeApp[] = [ }, { appId: 'rma', - logoText: 'RMA', + logoSrc: import.meta.env.BASE_URL + 'rma/logo512.png', descriptionKey: 'WelcomePage.rma', }, { appId: 'rsg', - logoText: 'RSG', + logoSrc: import.meta.env.BASE_URL + 'rsg/logo512.png', descriptionKey: 'WelcomePage.rsg', }, ]; @@ -44,57 +43,14 @@ const welcomeApps: WelcomeApp[] = [ interface WelcomeAppCardProps { app: WelcomeApp; appName: string; + isMobilePortrait: boolean; onOpenApp: (appId: WelcomeAppId) => void; onOpenAppKeyDown: (event: KeyboardEvent, appId: WelcomeAppId) => void; } -const AppIcon = ({ app }: { app: WelcomeApp }) => ( -
- {app.logoSrc ? ( - - ) : ( - {app.logoText} - )} -
-); - -const AppDescriptions = ({ app }: { app: WelcomeApp }) => { - const { t } = useTranslation(); - - return {t(app.descriptionKey)}; -}; - -const DesktopWelcomeAppCard = (props: WelcomeAppCardProps) => { - const { t } = useTranslation(); - const { app, appName, onOpenApp, onOpenAppKeyDown } = props; - - return ( -
onOpenApp(app.appId)} - onKeyDown={event => onOpenAppKeyDown(event, app.appId)} - > - - - - {appName} - - - -
- -
-
- ); -}; - -const MobileWelcomeAppCard = (props: WelcomeAppCardProps) => { +const WelcomeAppCard = (props: WelcomeAppCardProps) => { const { t } = useTranslation(); - const { app, appName, onOpenApp, onOpenAppKeyDown } = props; + const { app, appName, isMobilePortrait, onOpenApp, onOpenAppKeyDown } = props; const [isExpanded, setIsExpanded] = useState(false); const handleExpandClick = (event: MouseEvent) => { @@ -106,9 +62,15 @@ const MobileWelcomeAppCard = (props: WelcomeAppCardProps) => { event.stopPropagation(); }; + const appIcon = ( +
+ +
+ ); + return (
{ onClick={() => onOpenApp(app.appId)} onKeyDown={event => onOpenAppKeyDown(event, app.appId)} > -
- - - {appName} - -
- -
-
- - {isExpanded && ( -
+ {isMobilePortrait ? ( + <> +
+ {appIcon} + + {appName} + +
+ +
+
+ + {isExpanded && ( +
+
+ {t(app.descriptionKey)} +
+
+ )} + + + + ) : ( + <> + {appIcon} - + {appName} + {t(app.descriptionKey)} -
- )} - +
+ +
+ + )}
); }; @@ -182,19 +160,12 @@ export default function Welcome() { .map(name => t(name)) .join(' - '); - return isMobilePortrait ? ( - - ) : ( - diff --git a/src/components/workspace/workspace.module.css b/src/components/workspace/workspace.module.css index 74105a7..65ebf07 100644 --- a/src/components/workspace/workspace.module.css +++ b/src/components/workspace/workspace.module.css @@ -114,13 +114,6 @@ object-fit: contain; } -.welcome-app-initials { - color: var(--mantine-primary-color-filled); - font-size: var(--mantine-font-size-lg); - font-weight: 700; - letter-spacing: 0; -} - .welcome-app-copy { min-width: 0; padding: var(--mantine-spacing-lg) var(--mantine-spacing-lg) var(--mantine-spacing-lg) 0; From 60349f3044f7fe333d9808dea16f650d56aa4d54 Mon Sep 17 00:00:00 2001 From: thekingofcity <3353040+thekingofcity@users.noreply.github.com> Date: Sat, 11 Jul 2026 14:28:26 +0000 Subject: [PATCH 4/5] update logo src --- src/components/workspace/welcome.tsx | 2 +- src/images/rmp-logo512.png | Bin 34299 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 src/images/rmp-logo512.png diff --git a/src/components/workspace/welcome.tsx b/src/components/workspace/welcome.tsx index 742c5c8..93d8d97 100644 --- a/src/components/workspace/welcome.tsx +++ b/src/components/workspace/welcome.tsx @@ -25,7 +25,7 @@ const welcomeApps: WelcomeApp[] = [ }, { appId: 'rmp', - logoSrc: rmpLogo, + logoSrc: import.meta.env.BASE_URL + 'rmp/logo512.png', descriptionKey: 'WelcomePage.rmp', }, { diff --git a/src/images/rmp-logo512.png b/src/images/rmp-logo512.png deleted file mode 100644 index 8e7a843acb9736318c3d7f03a6f10b277e8b3d8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34299 zcmeIb1z1(v)<3)mL8WX;0g+JY?obigA|W9S5*ygmM!LZS1CdscP&x#pLqbuJR#HGf zMMO%ZoBfTYC%EUH`+DF1z2Eme|L2iMbe*;58gtIy96iR`=eoM;DXQ%Z+Ytnz!YCDRGlEd;Mt_NrnEP}HazX~DrR$=raz@e|Z_jILfj7hQ zde}R{Xatd#^KdjZx5c`!m|?AO4l=A$71gXPI13q89T63N6~_};Yn+mo6IRnpRm5#I`2|>h`(c&c4p-7n z7M7A43W~o?2md9*YVG3UD9Oj??(WX(F2sv>vf>kvkdWZx7vvKZy|HYJleEcsbhBHx7 z`D5=ivvg7SR$Ak`xe>6yfLM z7nkJc-$dlc$iL7~!CT-gJ%6Vm$ipwjBfzgEAR;L!A}K7inZ~A(f29F}XkqGN`fpL$ zJa!Wu3v)?Jypz4Di!9FG)C$Yz=wKzy_vg(`BmZDe$rE@xyb~-7D=Q?;_jkAd_9-o_ zhszmLPpp&krqh8l`Y!s%O|Aa%?(ZMi;l7Koqp6cK7G+Qw*55hw51Ic%q|s;oT+a8o zR88%%vKlJto7eg02Y;^f4;p_ZfUf#)34H(HuLPv|P<>;E`^UZfxciS=+`OQ_MF!9Q63RE0 zmM-q5PS|5sz#;#R&iq03A0PWG`M(#B|IR_+9o(=^|C^%#l>*Aa1=UBEPI!BkKlC4q z3!cT)(a{cPZi=2UpPPflZ;rtqqVfBAZ=&)4;a;6h-TpI{6Oa%W6E_tDF*6so;4v2z z7T_`C7Z>A^kPwg%GLx_n#R`l4zQs)(``0a^2e*ltz!q+{V*--GV!zw5O{4xbk$>c! zf5S}wJ1qC-8qKXu9jvexvV6bq?DrdgUD5xGT>2lMoP>oCsD261{pS2w9&u4PJ~L4< z3m#z$F(DCtVNnYaLC}{!fcZZ@xy>HPuao;t(f`N#6glgvR?(#o+X1{xT|Ln>A?zaBmPDRva zqmCVL-%mmVFj5eMN^a7Jzq``^t~&k8GnB{NC{5jk2=b-Q>+?)JoX*5Ka1dklN z!|z^_tbjD%Ki%6z?fYlCXzXU^`rUID6Xb^GdzTehSg%0l(ndjK)u|f5G)rh&B)S1=nUYetP{2uAf4*dB88Y zHly*=>tAsF6r#-oe!;aFjh|lsg6pRcZ65FouFYut^!gWEKZR)XfM0NJM&qZ~zu@{Q zM4Jcvf@?DxKfV41*H0nZJm42xo6-2`^)I-73en~Pzu?-8#!s(*!Sz#!HV^m(*Jd<+ zdi@KopF*^Gz%RHqqw&-0UvT{tqRj(-!L=EUpI-lh>!%QH9`FmU&1n4e`WIY3g=q7D zUvOiZi(?dyX?gTc^t=0LxjrNi7Mm>E z4j#O?gC#)eY)nw%97j;lrJ${5$DSl+J{8~9`kR1jS z!bAu{3X7G8-~YzNRv;6A()ur4>_F+j`jCIVP!Kh^^`un+b8o|+7*S{B#bCouj}67% zyctR(aH@?IbHMEI9D+0nvBljf)NeaQ8t^6Z2<}d@ENoSthonXpvt@ps>g8!94|6&! zqQRX3QCF@HyFWkQEUHPgJ{&`>j&K>l7Tv*`u`xmjD(k7Y`X;-|oJT&n zRcN0*`(S3qX?SFWOHR(DuLQ4SYI=~0!bi>0GPSqZKFhK>CIb`B(a_MKahZ%NA}s7- zX=$myL`!B?mbRv5(v2J2%M5wW-K3F0|_roa`wGq}eim zE>_gOBiBT($iDB~BmE+c0?X!(LR>rkcE$7O3XSoNlWtk*=}Lh#%w1K!tA)-Zs=gb` zBMr^X!r7FmZ5;ESEb4Yyoh+Hn8tN{#H<%o#G*C@zFJ~4u_~zf{P&T~Jb-YXEfTYXo zEwqM-Q9K4mg@lAACiQf6(|HVv4~vQE;H%e*7ryp4MrVJm3Y&Y9EZ4s0%>hI<+@fRT zRAG8%rl9QVgwT*!^>T3Ny?gYJCt(4q%7gBvrVmU@`hr(BWU?pCU*4jR@-Go@@p^dq^GCz@8i}zPf5ogFm-_FeF8rPVj39}lgWsGayG$lB_oQ@BnP1D8ejBo zR}q_jpv)laQ_5TZg_VJo6xcCVj^O+TAtwo*{J`n967^n!WSC)2KE%1qkG!em59(37ms!;R78*!gG7=EGz5gYNU4I(45$#O-?v^=WeEn#U;4oIbssT=~GW zo=aOOwh{?kNeM822VC#6GKbr{cW(ypbKUI&?bmm6x`0^3$#|cG{|sjX(QF)c@)c^3 zo|h0ATd!MFzJ45 zUZ)8Y!s4a z3K_0@+Y%=g3~FE>u^GEOF+xIBNWB0XV%ftp|144B!-uTzQ|v*{ znA_az(lPdAPh9XE%Sa>MaG+!q<^FuT02CBms~q9USq%*{+*VYewt}4ml8IkKa*Qe% zl%sh?o*3t{%c+8@;IXzUzvwR^& z!rAgUX~3+#C)^8Yu#7AUiud$P<74`t^p!MvC+^B@X=^Svt91 zgfeo;MZ!(Ks`HOo!n+cXji9L3C?}op7ICg@T-G#*NWSx!Jvr+Ab;-H$7Q0NWGLf9%Gx6 z(VZ|4YMxkM^C=Me@a$@8m+7lluin33xy_m2qd{07Bp9W|2f*RWtb9ol<{(1yL`iSa z3n^~dvL$ugx-0u0hg$sph;G_1rvrHO3txkJEW!^~1vK`1jX#=SaHe*dx}00Ja+;ia zKYvj=O(hv&>^f(B`mERPB*ozEW6yM15Ein%d-iq#eY8w>W2^h)p@Te^IyE9W^5F~pZ&ce1cQ#-YB@ynY- ztOIq+u3u>RjQ2bC9J@@`nMD=SQZb%WL0ol|@Fgi^BSYq_yK$}#jm+E~8ylN5-4}*} z#oF$WA~jwiavPUV=hGB)sAG z@2@p?b^%wB@cOUMcXwyCy0j%@Y`U`b^WHBebm?mlIVmsJxQVvvO={kLi5 zwSc}KbE&Wgwi0HA1r227R@r#*pKpxfsohu^`dHO(I9t?hOtIvbRr}#}zx$vOpKPOI zFvAv~{BIu8F=BWo^5b{ns$ZBXf@D~O(zkG9eaLk~Bcg@r_BSF;Ys=)J$*M<&-iG;IyuMQRAe z@qI+d)*EYUKAOX<9|8%h2cJ&_jrTcJ@MOx>f`X4>Xyo_b@SzUau?&2n66q|yf2^l~ zlS&CV#eHq*g641&cORo2qp00$P=6%6?!%Efit{d9Le2!51Cq&|SvtXa=Y4VRJiXz zH8h;o93IPmc28SJLeAxxpwvf6eI27%@e2=~oScYx7f+NZH@&m{{7Fj+jE;~|SJV45 z;43Fs6pvSAW;XPa)ILWFnaioB-<)C|1=CMmngbhC9Nw30`FVqO&mNzGHNN9RP4|R^ ziMJv_+?KiTS(nM1n<^)*4R@4qkW+w0N;jw8bzPziieQhizy z1qI~CpHA2#STK7$8FSEiWIejL(qU& zzAcX=7_3NUGhK98m{*ArK5|sH1XO)YZ|Iw`41dd)4$mKgM;Lo_#Hs8IA1f&_@+}Dr zTIT2GSaQRbNw;y(Rkyz^E(~~2-E#=H*7cl(D-n^s;YEa6+P6*O7d~DYwXZmaAbuSx zV*M7GhQ`LmabzM_pRFy=s_-~P#K-5XPF2f&l&jczNRia=Gcd1f?_ILb_xfdKE4)SE zbakJ7aQuSWGi^~i&d~FQu6zc?Omig=eSP|*Z|W$_j4;5 z^z*L4Qr5l(OMZUY_IgOj$oZ9RLob6h6&0^#(JNryFCRpa2}{Hp>C{}?67_Bk&U@D zxqDSA`7Wax-muy@`Aqv@0=6+K zBRToXH8w~Vw5O>t`_9yJ+VtdOYp}L9HgmHH1Vit|ufe5@+I>%hoIf`SxQ??PI#fG% zzWzMFkbMEDc(|F-IVe&gBD~T0#B=scZvN=B$6SY|+M6I!B+&u&m3fTHJ38tIho--P zxE8rgE;)k!)UWa>%gDE+RnG4PC2Ko&B_E=#oQV??s0Y`+6q=$OZ3Cw-%tnOpa|#J* z&W^Np-QJ&nOw=^TZ+rq{yql5`r)2`c_V@K(qdmz@l74f`Qh0 zY2Tz5SeH3w!ZdU0xVZb*`%K;w0u12@a(DJyEe-eyMlt-R&#L?RN9w>?`x1JJ>CKei zV#S?GOQFSLlIiI>W?S%;h@x+XgwU+UAP|9dXywOAxsMHn$Wf2k3eB!(hJeZfuTdYh z>8_b0Akf_)vN&~+@3)$Oz;uIZ7t~gR_zI2Q)`$80uP-eco;$bi^`J?i zb!f&2y@-vL?%+t};y@N^W(;{>FEUztKO2en{`w|WB^GsWNnIo-gN$lfv+sgNes3KeVj9EANhp6|s%VxT-DbHj&Pi`$W)g%K2UC z1)}JT%*-}0CzpETALsZJHuN8xU5)o$(8F3;b!X&&G6X*&a++b@aKB1GxuawpgN#?9 z;w`!dL?mSCCjzNmzh2|v;%XOal};MmSST^|HhG|{x$*q^Zv9HHq6{K^h`Q2HD|@Fz zxv$v1v%-BUpz)Djfg-2s{jDqGH(xXdpv1_TJmhsue2duI6{u=on}^7x7TI>skeosg zAKNPT(YBKSGa7Sr0)N9Ns#l`{=o2XU<{XgE|3AH%uvxlRoj9guRPYzU}> zuHPT?>?;LQCXi5R;HQj?h&T-XPqOkUm$8pWKmFv*eW@i=RL|d)Ig4N$_W12V9VQ4TsP~H}LM{RK^wJjnQb*J0RbA@5 zWve0nYbPK~-L@nF*^peYH(6lT*mB#Oj7gb7PJ!~28ygSW(Y86?M(V^zh+vHM#Xd-s-iPI}0sf z6nzc>$YT92;l&R9nI>x=X$1&LPn?Du0vdblL_u~$(sOwrJoa6g+g6JDxwe%jSTD6g z2mzXPtUWEnZ@JMV|Mjk|$kyt@LSdQpxppsb)(=_k&=D7n^qhV{s}h;jsERKVu`5A8gtg`EV{t6f@xviF#mi3#5CkM0JmLWQCI}E(8X=z>{gF@`$_( zowSGJE1lAU<3^T5_r<&y>^eI-NDUppb~Q9L6|TwL)1!k3;bmBg#UtxhU3Ey-Ju)ak zwc;2!=aQ~t$)}ioh1tCMSjr#oP`|aBF|6S1

rDZaSnlimcxphg8G&Sii_71+;6H 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 Ls*rR1{H6Z~Q~Rgd From b8d6080719f231503495859f89cf59bbd805ecde Mon Sep 17 00:00:00 2001 From: thekingofcity <3353040+thekingofcity@users.noreply.github.com> Date: Sun, 12 Jul 2026 13:38:18 +0000 Subject: [PATCH 5/5] fix lint --- src/components/workspace/welcome.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/workspace/welcome.tsx b/src/components/workspace/welcome.tsx index 93d8d97..81a956e 100644 --- a/src/components/workspace/welcome.tsx +++ b/src/components/workspace/welcome.tsx @@ -1,6 +1,5 @@ import classes from './workspace.module.css'; import { useTranslation } from 'react-i18next'; -import rmpLogo from '../../images/rmp-logo512.png'; import { Image, Stack, Text, Title } from '@mantine/core'; import { useRootDispatch } from '../../redux'; import { openApp } from '../../redux/app/app-slice';