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
1 change: 1 addition & 0 deletions .github/workflows/tauri-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ jobs:
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
VITE_SUPABASE_PUBLISHABLE_DEFAULT_KEY: ${{ secrets.VITE_SUPABASE_PUBLISHABLE_DEFAULT_KEY }}
VITE_SAAS_SERVER_URL: ${{ secrets.VITE_SAAS_SERVER_URL }}
VITE_SAAS_BACKEND_API_URL: ${{ secrets.VITE_SAAS_BACKEND_API_URL }}
# Only enable Windows signing in Tauri when on main
SIGN: ${{ github.ref == 'refs/heads/main' && (env.SM_API_KEY == '' && env.WINDOWS_CERTIFICATE != '') && '1' || '0' }}
CI: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ public void addCorsMappings(CorsRegistry registry) {
logger.info("Tauri mode detected - enabling CORS for Tauri protocols (v1 and v2)");
registry.addMapping("/**")
.allowedOriginPatterns(
"http://localhost:*",
"https://localhost:*",
"tauri://*", // Add this for Tauri apps
"tauri://localhost",
"http://tauri.localhost",
"https://tauri.localhost")
Expand Down
228 changes: 228 additions & 0 deletions frontend/public/locales/en-GB/translation.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2242,9 +2242,11 @@ copy = "Copy"
done = "Done"
error = "Error"
expand = "Expand"
learnMore = "Learn more"
lines = "lines"
loading = "Loading..."
next = "Next"
operation = "this operation"
preview = "Preview"
previous = "Previous"
refresh = "Refresh"
Expand Down Expand Up @@ -2908,6 +2910,7 @@ copyStack = "Copy Stack Trace"
discordSubmit = "Discord - Submit Support post"
dismissAllErrors = "Dismiss All Errors"
encryptedPdfMustRemovePassword = "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A."
generic = "An error occurred"
github = "Submit a ticket on GitHub"
githubSubmit = "GitHub - Submit a ticket"
incorrectPasswordProvided = "The PDF password is incorrect or not provided."
Expand Down Expand Up @@ -4426,6 +4429,10 @@ upgradeCompleteMessage = "Your subscription has been upgraded successfully. Your
upgradeSuccess = "Payment successful! Your subscription has been upgraded. The license has been updated on your server. You will receive a confirmation email shortly."
upgradeTitle = "Upgrade to {{planName}}"
yearly = "Yearly"
checkoutOpened = "Checkout Opened in Browser"
checkoutInstructions = "Complete your purchase in the browser window that just opened. After payment is complete, return here and click the button below to refresh your billing information."
refreshBilling = "I've Completed Payment - Refresh Billing"
closeLater = "I'll Do This Later"

[payment.emailStage]
continue = "Continue"
Expand Down Expand Up @@ -4812,6 +4819,7 @@ customPricing = "Custom"
featureComparison = "Feature Comparison"
from = "From"
hideComparison = "Hide Feature Comparison"
included = "Included"
includedInCurrent = "Included in Your Plan"
licensedSeats = "Licensed: {{count}} seats"
manage = "Manage"
Expand All @@ -4829,9 +4837,11 @@ title = "Active Plan"

[plan.availablePlans]
subtitle = "Choose the plan that fits your needs"
loadError = "Unable to load plan pricing. Using default values."
title = "Available Plans"

[plan.enterprise]
siteLicense = "Site License"
highlight1 = "Custom pricing"
highlight2 = "Dedicated support"
highlight3 = "Latest features"
Expand Down Expand Up @@ -4905,6 +4915,82 @@ keyDescription = "Paste the license key from your email"
success = "License Activated!"
successMessage = "Your license has been successfully activated. You can now close this window."

[plan.team]
name = "Team"
siteLicense = "Site License"

[credits]
enableOverageBilling = "Enable Overage Billing"
maybeLater = "Maybe later"
upgrade = "Upgrade"

[credits.modal]
advancedMonitoring = "Advanced monitoring"
allInOneWorkspace = "All-in-one PDF workspace (viewer, tools & agent)"
apiSandbox = "API sandbox"
contactSales = "Contact Sales"
creditsRemaining = "{{current}} of {{total}} remaining"
creditsThisMonth = "Monthly credits"
current = "Current Plan"
customPricing = "Custom"
customSmartFolders = "Custom Smart Folders"
dedicatedSupportSlas = "Dedicated support & SLAs"
enterpriseSubscription = "Enterprise"
everythingInCredits = "Everything in Credits, plus:"
everythingInFree = "Everything in Free, plus:"
fasterThroughput = "10x faster throughput"
forRegularWork = "For regular PDF work:"
freeTier = "Free Tier"
fullyPrivateFiles = "Fully private files"
largeFileProcessing = "Large file processing"
managedMemberMessage = "You have unlimited access to credits through your team. If you need assistance, please contact your team leader."
managedMemberTitle = "Unlimited Credits"
meteringBillingNote = "Overage credits are billed monthly alongside your Team subscription. Track your usage anytime in your account settings."
meteringExplanation = "Your Team plan includes {{credits}} credits per month. When you run out, overage billing automatically provides additional credits so you never have to stop working."
meteringIncluded = "{{credits}} credits/month included with Team"
meteringNoCommitment = "No commitment, cancel anytime"
meteringNeverRunOut = "Never run out of credits"
meteringPayAsYouGo = "Only pay for what you use"
meteringPrice = "Additional credits at {{price}}/credit"
meteringTitle = "Pay-What-You-Use Overage Billing"
monthlyCredits = "monthly credits"
orgWideAccess = "Org-wide access controls"
overage = "overage"
perMonth = "/month"
popular = "Popular"
premiumAiModels = "Premium AI models"
prioritySupport = "Priority support"
privateDocCloud = "Private Document Cloud"
ragFineTuning = "RAG + fine-tuning"
secureApiAccess = "Secure API access"
selfHostLink = "Review the docs and plans"
selfHostPrompt = "Want to self host?"
standardThroughput = "Standard throughput"
subtitle = "Upgrade to Team for 10x the credits and faster processing."
subtitlePro = "Enable automatic overage billing to never run out of credits."
teamLeaderOnly = "Only team leaders can enable overage billing"
teamSubscription = "Team"
titleExhausted = "You've used your free credits"
titleExhaustedPro = "You have run out of credits"
unlimitedApiAccess = "Unlimited API access"
unlimitedMonthlyCredits = "Site License"
unlimitedSeats = "Unlimited seats"

[credits.modal.features]
everythingInCredits = "Everything in Credits, plus:"
everythingInFree = "Everything in Free, plus:"
forRegularWork = "For regular PDF work:"

[credits.insufficient]
brief = "Insufficient credits. You need {{required}} credits but have {{current}}."
freeTier = "Upgrade to Team for 10x more credits and unlimited overage billing."
managedMember = "Please contact your team leader for assistance."
message = "You do not have enough credits to run {{tool}}. You currently have {{current}} credits."
messageWithAmount = "You need {{required}} credits to run {{tool}}, but you only have {{current}}."
teamMember = "Enable overage billing to never run out of credits."
title = "Insufficient Credits"


[printFile]
header = "Print File to Printer"
submit = "Print"
Expand Down Expand Up @@ -5542,6 +5628,70 @@ user = "Logged in as"
saas = "Stirling Cloud"
selfhosted = "Self-Hosted"

[settings.planBilling]
currentPlan = "Current Plan"
loading = "Loading billing information..."
notAvailable = "Plan & Billing is only available when connected to Stirling Cloud (SaaS mode)."
title = "Plan & Billing"

[settings.planBilling.billing]
manageBilling = "Manage Billing"
nextBillingDate = "Next billing date"
overageCost = "Current overage cost: {{amount}} ({{credits}} credits)"

[settings.planBilling.credits]
estimatedCost = "Estimated cost: {{amount}}"
freeTierInfo = "Free plan includes {{freeCredits}} credits per month. Upgrade to Team for {{teamCredits}} credits/month and pay-as-you-go overage billing."
included = "{{count}} credits/month (included)"
noOverage = "No overage charges this month. You're using your included {{count}} credits."
overage = "+ {{count}} overage"
overageInfo = "Overage credits are billed at {{price}} per credit. You'll only pay for what you use beyond your monthly allowance."
title = "Credit Usage"

[settings.planBilling.errors]
fetchFailed = "Unable to fetch billing data"
retry = "Retry"

[settings.planBilling.status]
active = "Active"
canceled = "Canceled"
pastDue = "Past Due"
trial = "Trial"

[settings.planBilling.tier]
enterprise = "Enterprise"
enterpriseDescription = "Custom enterprise features and support"
free = "Free"
freeDescription = "50 credits per month"
team = "Team"
teamBadge = "Team"
teamDescription = "500 credits/month included, automatic overage billing for uninterrupted service"
teamTooltipCredits = "Team plan includes {{credits}} credits/month."
teamTooltipFineprint = "Only pay for what you use beyond included credits."
teamTooltipOverage = "Automatic overage billing at {{price}}/credit ensures uninterrupted service."

[settings.planBilling.team]
managedByTeam = "Managed by team"
memberCount = "{{count}} team members"

[settings.planBilling.trial]
daysRemaining = "{{days}} days remaining"
daysRemainingFull = "Your trial ends in {{days}} days"
endDate = "Expires: {{date}}"
endsOn = "Trial ends"
title = "Free Trial Active"

[settings.planBilling.upgrade]
cta = "Upgrade to Team"
featureApi = "API access for automation"
featureCredits = "{{teamCredits}} credits per month (vs {{freeCredits}} on Free)"
featureMembers = "Unlimited team members"
featureSupport = "Priority support"
featureThroughput = "Faster processing throughput"
opensInBrowser = "Opens in browser to complete upgrade"
subtitle = "Upgrade to Team for:"
title = "Upgrade Your Plan"

[settings.developer]
apiKeys = "API Keys"
title = "Developer"
Expand Down Expand Up @@ -5666,6 +5816,9 @@ people = "People"
teams = "Teams"
title = "Workspace"

[settings.team]
title = "Team"

[setup]
description = "Get started by choosing how you want to use Stirling PDF"
welcome = "Welcome to Stirling PDF"
Expand Down Expand Up @@ -6971,3 +7124,78 @@ cancel = "Cancel"
confirm = "Extract"
message = "This ZIP contains {{count}} files. Extract anyway?"
title = "Large ZIP File"

[cloudBadge]
tooltip = "This operation will use your cloud credits"


[team]
cancelInviteError = "Failed to cancel invitation"
confirmCancelInvite = "Are you sure you want to cancel this invitation?"
confirmLeave = "Are you sure you want to leave this team?"
confirmLeaveLeader = "As a team leader, leaving will remove you from the team. Are you sure?"
confirmRemove = "Are you sure you want to remove this member?"
editName = "Edit team name"
inviteCancelled = "Invitation cancelled"
inviteError = "Failed to send invitation"
inviteSent = "Invitation sent successfully"
leader = "Leader"
leaveButton = "Leave Team"
leaveError = "Failed to leave team"
leaveSuccess = "Successfully left team"
loading = "Loading team information..."
memberCount = "{{count}} members"
memberRemoved = "Member removed successfully"
namePlaceholder = "Enter team name"
personal = "Personal"
removeError = "Failed to remove member"
renameError = "Failed to rename team"
renameSuccess = "Team renamed successfully"

[team.invitationBanner]
message = "has invited you to join"
acceptButton = "Accept"
rejectButton = "Decline"

[team.features]
badge = "Team Features"
subtitle = "Collaborate with your team"
title = "Team Collaboration"
viewPlans = "View Plans"

[team.features.billing]
description = "Manage billing and subscriptions"
title = "Billing Management"

[team.features.credits]
description = "Shared credit pool for all members"
title = "Shared Credits"

[team.features.dashboard]
description = "View team activity and usage"
title = "Team Dashboard"

[team.features.invite]
description = "Add members to your team"
title = "Invite Members"

[team.invite]
cancelLabel = "Cancel"
invalidEmail = "Invalid email address"
placeholder = "Enter email address"
sendButton = "Send Invitation"
title = "Invite Team Member"

[team.members]
emailColumn = "Email"
empty = "No team members yet"
nameColumn = "Name"
pending = "Pending"
remove = "Remove"
roleColumn = "Role"
title = "Team Members"

[team.upgrade]
button = "Upgrade to Team"
description = "Unlock team collaboration features"
title = "Upgrade to Team Plan"
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/**
* Core stub for QuickAccessBar footer extensions
* Desktop build overrides this with actual credit counter implementation
*/

interface QuickAccessBarFooterExtensionsProps {
className?: string;
}

export function QuickAccessBarFooterExtensions(_props: QuickAccessBarFooterExtensionsProps) {
return null;
}
11 changes: 11 additions & 0 deletions frontend/src/core/components/shared/CloudBadge.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
interface CloudBadgeProps {
className?: string;
}

/**
* Stub component for cloud badge (desktop override provides real implementation)
* In web builds, this returns null since cloud routing is desktop-only
*/
export function CloudBadge(_props: CloudBadgeProps) {
return null; // Stub - does nothing in web builds
}
3 changes: 3 additions & 0 deletions frontend/src/core/components/shared/QuickAccessBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import {
getActiveNavButton,
} from '@app/components/shared/quickAccessBar/QuickAccessBar';
import { Z_INDEX_OVER_FULLSCREEN_SURFACE } from '@app/styles/zIndex';
import { QuickAccessBarFooterExtensions } from '@app/components/quickAccessBar/QuickAccessBarFooterExtensions';

const QuickAccessBar = forwardRef<HTMLDivElement>((_, ref) => {
const { t } = useTranslation();
Expand Down Expand Up @@ -265,6 +266,8 @@ const QuickAccessBar = forwardRef<HTMLDivElement>((_, ref) => {
{/* Spacer to push bottom buttons to bottom */}
<div className="spacer" />

<QuickAccessBarFooterExtensions className="quick-access-footer" />

{/* Bottom section */}
<Stack gap="lg" align="stretch">
{bottomButtons.map((buttonConfig, index) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* Core stub for SaaS Teams Section
* Desktop layer provides the real implementation
* This component only appears in SaaS mode
*/
export function SaaSTeamsSection() {
// Core stub - return null (no team management in web builds)
return null;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/**
* Core stub for SaasPlanSection
* This component returns null in non-desktop builds
* The desktop layer shadows this with the real implementation
*/
export function SaasPlanSection() {
return null;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/**
* Core stub for Credit Exhausted Modal
* Desktop build overrides this with actual modal implementation
*/

interface CreditExhaustedModalProps {
opened: boolean;
onClose: () => void;
}

export function CreditExhaustedModal(_props: CreditExhaustedModalProps) {
return null;
}
Loading
Loading