Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
14a2e3e
Complete i18n coverage for named UI pages
woahwhattheheck Oct 5, 2026
1e0cbca
Localize payment amount header
woahwhattheheck Oct 5, 2026
44a4599
fix(i18n): resolve dynamic statuses and preserve liquidity figures
woahwhattheheck Oct 6, 2026
532b55f
fix(i18n): localize forecast chart tooltip labels
woahwhattheheck Oct 6, 2026
105039e
fix(i18n): localize contract error panel
woahwhattheheck Oct 6, 2026
049fe48
fix(i18n): localize account connection controls
woahwhattheheck Oct 6, 2026
dbf777e
fix(i18n): localize scheduling wizard
woahwhattheheck Oct 6, 2026
c6fdd0d
fix(i18n): localize CSV uploader strings
woahwhattheheck Oct 6, 2026
ba9b99c
fix(i18n): add en shared component copy
woahwhattheheck Oct 6, 2026
6708d16
fix(i18n): add es shared component copy
woahwhattheheck Oct 6, 2026
852f82e
fix(i18n): localize bulk payment status tracker
woahwhattheheck Oct 6, 2026
05f995e
fix(i18n): add shared component English strings
woahwhattheheck Oct 6, 2026
713572e
fix(i18n): add shared component Spanish strings
woahwhattheheck Oct 6, 2026
dbf1928
fix(i18n): localize app navigation
woahwhattheheck Oct 6, 2026
77c4a44
fix(i18n): localize dashboard sidebar
woahwhattheheck Oct 6, 2026
91a7f73
fix(i18n): localize employee list
woahwhattheheck Oct 6, 2026
9dedb9e
fix(i18n): extend English navigation and employee copy
woahwhattheheck Oct 6, 2026
dca5c6d
fix(i18n): extend Spanish navigation and employee copy
woahwhattheheck Oct 6, 2026
5fdc8a0
fix(i18n): localize employee removal confirmation
woahwhattheheck Oct 6, 2026
8a3393f
fix(i18n): localize employee portal refresh
woahwhattheheck Oct 6, 2026
4ee070d
fix(i18n): translate theme toggle accessible labels
woahwhattheheck Oct 6, 2026
c31a51f
fix(i18n): localize app shell
woahwhattheheck Oct 6, 2026
d1da29e
fix(i18n): localize certificate download
woahwhattheheck Oct 6, 2026
708b206
fix(i18n): localize dashboard top bar
woahwhattheheck Oct 6, 2026
c730ab3
fix(i18n): localize employer shell
woahwhattheheck Oct 6, 2026
bf3324d
fix(i18n): add shared shell English copy
woahwhattheheck Oct 6, 2026
3230fc6
fix(i18n): add shared shell Spanish copy
woahwhattheheck Oct 6, 2026
0c949dd
fix(i18n): localize login page
woahwhattheheck Oct 6, 2026
bd4d078
fix(i18n): localize auth callback
woahwhattheheck Oct 6, 2026
c06dd51
fix(i18n): localize vesting grant form
woahwhattheheck Oct 6, 2026
23a3441
fix(i18n): localize employee entry flow
woahwhattheheck Oct 6, 2026
3058c1c
fix(i18n): localize wallet QR guidance
woahwhattheheck Oct 6, 2026
fcd6a98
fix(i18n): localize vesting grant list
woahwhattheheck Oct 6, 2026
65fae1d
fix(i18n): localize vesting escrow
woahwhattheheck Oct 6, 2026
c38c8dd
fix(i18n): add identity wallet vesting English copy
woahwhattheheck Oct 6, 2026
244f699
fix(i18n): add identity wallet vesting Spanish copy
woahwhattheheck Oct 6, 2026
c5e5312
fix(i18n): localize security admin panel
woahwhattheheck Oct 6, 2026
53c143d
fix(i18n): localize contract upgrade registry
woahwhattheheck Oct 6, 2026
a31b462
i18n: add payments and operations copy (en)
woahwhattheheck Oct 6, 2026
2457fdb
i18n: add payments and operations copy (es)
woahwhattheheck Oct 6, 2026
f58fb82
i18n: complete payments ops labels (en)
woahwhattheheck Oct 6, 2026
7c94509
i18n: complete payments ops labels (es)
woahwhattheheck Oct 6, 2026
f7ea584
fix(i18n): localize countdown timer
woahwhattheheck Oct 6, 2026
7f43710
fix(i18n): localize transaction history
woahwhattheheck Oct 6, 2026
fecbbd3
fix(i18n): localize revenue split dashboard
woahwhattheheck Oct 6, 2026
c48a0c5
fix(ci): drop invalid top-level retention-days from workflows
woahwhattheheck Oct 6, 2026
4ef3fe0
i18n: add remaining payments ops labels (en)
woahwhattheheck Oct 6, 2026
5ef523d
i18n: add remaining payments ops labels (es)
woahwhattheheck Oct 6, 2026
884813d
fix(ci): drop invalid top-level retention-days from workflows
woahwhattheheck Oct 6, 2026
3da2ebe
fix(i18n): localize withdrawal flow
woahwhattheheck Oct 6, 2026
a4424cd
fix(i18n): localize cross-asset payment
woahwhattheheck Oct 6, 2026
b303a5c
i18n: add remaining operations labels
woahwhattheheck Oct 6, 2026
dd8033c
i18n: add remaining operations labels
woahwhattheheck Oct 6, 2026
89f6f6f
fix(i18n): localize payroll operations residuals
woahwhattheheck Oct 6, 2026
0a3bb7b
fix(i18n): localize bulk payment tracker
woahwhattheheck Oct 6, 2026
4d72dbe
i18n: add payroll wallet address label
woahwhattheheck Oct 6, 2026
941b0f7
i18n: add payroll wallet address label
woahwhattheheck Oct 6, 2026
eefeab1
i18n: rely on locale entries for scheduler labels
woahwhattheheck Oct 6, 2026
1e87e29
fix: restore withdrawal state destructuring
woahwhattheheck Oct 6, 2026
0289d74
fix(i18n): translate captured contract error explanations
woahwhattheheck Oct 6, 2026
a7c52c7
fix(i18n): translate generic contract error recovery action
woahwhattheheck Oct 6, 2026
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
5 changes: 1 addition & 4 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
branches: ["main"]
types: [opened, synchronize, reopened, ready_for_review]

# Retention policy: Keep successful runs for 30 days, failed/cancelled for 7 days
# Retention is a repo setting, not a workflow key. Artifact steps set their own retention-days.
env:
CARGO_TERM_COLOR: always
PKG_CONFIG_PATH: /usr/lib/pkgconfig
Expand Down Expand Up @@ -113,6 +113,3 @@ jobs:
- name: Run Tests
working-directory: ./frontend
run: npm test --if-present

# Workflow run retention settings
retention-days: 30
5 changes: 1 addition & 4 deletions .github/workflows/contract-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:
tags:
- "v*"

# Retention policy: Keep successful runs for 90 days, failed/cancelled for 14 days
# Retention is a repo setting, not a workflow key.
permissions: # required permissions for the workflow
id-token: write
contents: write # in order to create releases
Expand All @@ -27,6 +27,3 @@ jobs:
package: "..."
secrets:
release_token: ${{ secrets.GITHUB_TOKEN }}

# Workflow run retention settings
retention-days: 90
5 changes: 1 addition & 4 deletions .github/workflows/dapp-ipfs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:

workflow_dispatch:

# Retention policy: Keep successful runs for 30 days, failed/cancelled for 7 days
# Retention is a repo setting, not a workflow key.
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
Expand Down Expand Up @@ -65,6 +65,3 @@ jobs:
echo "" >> $GITHUB_STEP_SUMMARY
echo "- CID: ${{ steps.storacha.outputs.cid }}" >> "$GITHUB_STEP_SUMMARY"
echo "- URL: ${{ steps.storacha.outputs.url }}" >> "$GITHUB_STEP_SUMMARY"

# Workflow run retention settings
retention-days: 30
5 changes: 1 addition & 4 deletions .github/workflows/secrets-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ on:
paths:
- "k8s/**"

# Retention policy: Keep successful runs for 30 days, failed/cancelled for 7 days
# Retention is a repo setting, not a workflow key.
jobs:
check-secrets-placeholders:
name: Verify no real secrets in k8s manifests
Expand All @@ -20,6 +20,3 @@ jobs:

- name: Check backend-secret.yaml for non-placeholder values
run: ./scripts/check-k8s-secrets.sh

# Workflow run retention settings
retention-days: 30
10 changes: 6 additions & 4 deletions frontend/src/components/AppLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ConnectAccount from '../components/ConnectAccount';
import AppNav from './AppNav';
import ThemeToggle from './ThemeToggle';
import { WalletExtensionBanner } from './WalletExtensionBanner';
import { useTranslation } from 'react-i18next';

// ── Page Wrapper ───────────────────────
const PageWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => (
Expand All @@ -13,6 +14,7 @@ const PageWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => (
// ── Layout ────────────────────────────
const AppLayout: React.FC = () => {
const location = useLocation();
const { t } = useTranslation();

return (
<div
Expand All @@ -36,7 +38,7 @@ const AppLayout: React.FC = () => {
Pay<span className="text-(--accent)">D</span>
</span>
<span className="text-[9px] font-normal font-mono text-(--muted) tracking-widest uppercase border border-(--border-hi) px-1.5 py-0.5 rounded ml-0.5">
BETA
{t('appLayout.beta')}
</span>
</NavLink>

Expand Down Expand Up @@ -69,19 +71,19 @@ const AppLayout: React.FC = () => {
style={{ borderColor: 'var(--border)' }}
>
<span>
© {new Date().getFullYear()} PayD — Licensed under the{' '}
{t('footer.licensePrefix', { year: new Date().getFullYear() })}{' '}
<a
href="http://www.apache.org/licenses/LICENSE-2.0"
target="_blank"
rel="noopener noreferrer"
className="text-(--link) hover:underline"
>
Apache License 2.0
{t('footer.licenseName')}
</a>
</span>
<div className="flex items-center gap-1.5">
<div className="w-1.5 h-1.5 rounded-full bg-(--accent2)" />
STELLAR NETWORK · MAINNET
{t('footer.networkStatus')}
</div>
</footer>
</div>
Expand Down
28 changes: 15 additions & 13 deletions frontend/src/components/AppNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ import {
TrendingUp,
} from 'lucide-react';
import { Avatar } from './Avatar';
import { useTranslation } from 'react-i18next';

const AppNav: React.FC = () => {
const { t } = useTranslation();
const [mobileOpen, setMobileOpen] = useState(false);

// Mock user data - replace with actual user context
Expand All @@ -42,7 +44,7 @@ const AppNav: React.FC = () => {
<span className="opacity-70">
<Wallet className="w-4 h-4" />
</span>
<span className="hidden sm:inline">Payroll</span>
<span className="hidden sm:inline">{t('nav.payroll')}</span>
</NavLink>

<NavLink
Expand All @@ -59,7 +61,7 @@ const AppNav: React.FC = () => {
<span className="opacity-70">
<User className="w-4 h-4" />
</span>
<span className="hidden sm:inline">Employees</span>
<span className="hidden sm:inline">{t('nav.employees')}</span>
</NavLink>

<NavLink
Expand All @@ -75,7 +77,7 @@ const AppNav: React.FC = () => {
<span className="opacity-70">
<LayoutDashboard className="w-4 h-4" />
</span>
My Portal
{t('nav.myPortal')}
</NavLink>

<NavLink
Expand All @@ -92,7 +94,7 @@ const AppNav: React.FC = () => {
<span className="opacity-70">
<FileText className="w-4 h-4" />
</span>
<span className="hidden sm:inline">Reports</span>
<span className="hidden sm:inline">{t('nav.reports')}</span>
</NavLink>

<NavLink
Expand All @@ -109,7 +111,7 @@ const AppNav: React.FC = () => {
<span className="opacity-70">
<TrendingUp className="w-4 h-4" />
</span>
<span className="hidden sm:inline">Cash Flow</span>
<span className="hidden sm:inline">{t('nav.cashFlow')}</span>
</NavLink>

<NavLink
Expand All @@ -126,7 +128,7 @@ const AppNav: React.FC = () => {
<span className="opacity-70">
<Globe className="w-4 h-4" />
</span>
<span className="hidden sm:inline">Cross-Asset</span>
<span className="hidden sm:inline">{t('nav.crossAsset')}</span>
</NavLink>

<NavLink
Expand All @@ -142,7 +144,7 @@ const AppNav: React.FC = () => {
<span className="opacity-70">
<Activity className="w-4 h-4" />
</span>
History
{t('nav.history')}
</NavLink>

<NavLink
Expand All @@ -159,7 +161,7 @@ const AppNav: React.FC = () => {
<span className="opacity-70">
<BarChart2 className="w-4 h-4" />
</span>
<span className="hidden sm:inline">Bulk Payments</span>
<span className="hidden sm:inline">{t('nav.bulkPayments')}</span>
</NavLink>

<div className="w-px h-5 bg-(--border-hi) mx-2" />
Expand All @@ -174,7 +176,7 @@ const AppNav: React.FC = () => {
}
>
<ShieldAlert className="w-4 h-4" />
Admin
{t('nav.admin')}
</NavLink>

<NavLink
Expand All @@ -189,15 +191,15 @@ const AppNav: React.FC = () => {
onClick={() => setMobileOpen(false)}
>
<Code className="w-4 h-4" />
<span className="hidden sm:inline">debugger</span>
<span className="hidden sm:inline">{t('nav.debugger')}</span>
</NavLink>

<Link
to="/help"
onClick={() => setMobileOpen(false)}
className="text-(--link) text-[13px] font-semibold hover:text-(--accent) transition"
>
Help
{t('nav.help')}
</Link>
</>
);
Expand All @@ -210,7 +212,7 @@ const AppNav: React.FC = () => {

{/* Mobile menu button */}
<button
aria-label="Toggle menu"
aria-label={t('nav.toggleMenu')}
aria-expanded={mobileOpen}
onClick={() => setMobileOpen(!mobileOpen)}
className="lg:hidden p-3 rounded-md hover:bg-(--surface-hi) transition touch-manipulation"
Expand Down Expand Up @@ -259,7 +261,7 @@ const AppNav: React.FC = () => {
</span>
</div>
<button
aria-label="Close menu"
aria-label={t('nav.closeMenu')}
onClick={() => setMobileOpen(false)}
className="p-2 rounded-md hover:bg-(--surface-hi) transition touch-manipulation"
style={{ minHeight: '44px', minWidth: '44px' }}
Expand Down
Loading