Skip to main content
Flowra
PricingCommunityFAQ
JoinStart with Flowra
  • PricingPlans, seats and payment
  • Frequently asked questionsEverything you have asked, in one place
  • Contact usWrite to the right team
  • CommunityKaro Studio, who make Flowra

For your team

  • Marketing teamsCampaigns from brief to launch
  • Product and dev teamsFeatures and bugs with full context
  • Design and content teamsBrief, files and delivery side by side
  • Operations teamsWork, documents and costs you can track
  • Sales and services teamsFrom meeting to contract and payment
  • Remote teamsOnline meeting to delivery, on your time

For your role

  • Project managersAction stories instead of chasing the team
  • Freelancers and consultantsFrom brief to contract and settlement

For your workflow

  • Meeting to actionMeeting decisions as trackable work
  • Actions with financial contextCosts next to the work that caused them
  • Actions with contract contextEvery commitment as trackable work
  • Brief to project deliveryEvery project step, one complete action
See all solutionsStart with FlowraJoin
++
Flowra design system

Fundamentals

PrinciplesVoice and writingCopy rules for each surfaceGlossaryRTL and languagesNumbers and datesAccessibility

Foundations

ColorDark modePrintingTypographySpacing and layoutRadius and shadowLayersMotionNotification soundKeyboard shortcutsIconsService logos

Components

ButtonsText fieldPickerDate and timeCheckboxRadioKeySegmented controlSliderMenu and sheetDialogCard and listTables and data listsBadge, pill, and switchTabs and filtersAvatarEmpty and loading statesProgress and stepsToastFloating helpNavigationPage headerAssistants

Patterns

Connector pageList, filter, and searchForm layoutCreation flowUpgrade promptConfirmation and irreversible actionsPhone layoutFixed bars and scrolling

Brand

Flowra brandMark and logoBrand colorBrand typographyMisuse

Design system/Fundamentals

RTL and languages

Flowra speaks nine languages, and two of them, Persian and Arabic, are written right to left. Layout is written once, with logical properties, so it sits correctly in both directions on its own.

In codelib/locales/langs.tscomponents/lang-gate.tsxcomponents/step-arrow.tsx

On this page

  1. Nine languages, two directions
  2. Logical properties
  3. Icons and arrows
  4. Mixed text
  5. Pitfalls
  6. What mirrors and what doesn't

Nine languages, two directions

Languages come from one list in lib/locales/langs.ts: English, German, Turkish, Persian, Arabic, French, Armenian, Portuguese, and Russian. Each language keeps its direction, number locale, and tab title right there, and no other part of the app keeps a separate list of languages.

The server always renders Persian, because it can't read the choice saved in the browser. LangGate keeps the browser's first render in Persian too, then switches to the saved language; that's how the page changes without a hydration error.

Live example

Right to left

SCampaign briefEdited yesterdayopen

Left to right

SCampaign briefEdited yesterdayopen

One markup, two directions: spacing is logical, the arrow mirrors, and the progress bar starts where the text starts.

Logical properties

Instead of left and right, we use inline-start and inline-end: padding-inline, margin-inline-start, inset-inline-end. These are measured from where the text starts, so one rule is correct in both directions.

Do

margin-inline-start and inset-inline-end for anything that moves with the text.

Don't

margin-left for spacing between an icon and text; in Persian it lands on the wrong side.

Do

Physical left and right for images; a cluster of objects doesn't flip with the text.

Don't

Mirroring a chart or logo with the page direction.

Icons and arrows

An icon with a direction, like a "Next" or "Back" arrow, gets the .rtl-flip class and is mirrored in right-to-left. For a previous and next pair, StepArrow takes the direction of movement, not the side of the screen, and the buttons always come in previous, next order in the DOM.

Icons without a direction, like a clock or search, aren't mirrored.

<Icon d={paths.arrowRight} size={14} className="rtl-flip" />
<StepArrow dir="next" />

Mixed text

Code, URLs, email addresses, hex colors, and card numbers always get dir="ltr", even in the middle of a Persian sentence. A Latin name or phrase inside Persian text goes inside bdi so the punctuation around it doesn't shift. Six-digit verification code boxes are left to right in both languages, because digits are read left to right in Persian too.

Pitfalls

  • Gradients have no logical direction; in a mirrored layout, flip the angle by hand under html[dir="rtl"].
  • html[dir="rtl"] .a .b is more specific than .a .b:nth-child(1); for every directional rule, write both the right-to-left and left-to-right versions explicitly.
  • In right-to-left, scrollLeft is zero at the start edge and goes negative toward the left.
  • Nothing should read getLang() during render; trLang() and uiDir() are safe for rendering.

What mirrors and what doesn't

Directional icon[dir="rtl"] .rtl-flip { transform: scaleX(-1) }
Floating panelgetComputedStyle(anchor).directionIn right-to-left, “start” is the right edge
ActionMenu menurtl ? r.right - width : r.left
Floating fielddata-dir="rtl" | "ltr"Physical left/right with arrow keys
Verification codedir="ltr"In both languages
Dockinset-inline-start: 20px
  • A floating field gets its direction from uiDir() or the dir prop, and lays out the icon, label, and trailing control with physical left and right under data-dir, so an LTR field inside a Persian page is correct too.
  • The on/off switch (.toggle) doesn't mirror: the knob, with left: 2.5px and a positive translateX, moves right in both directions.
  • The toast is centered with left: 50% and translateX(-50%); it's symmetric and needs no direction.
  • The bottom sheet stretches with inset-inline: 0 and is identical in both directions.

Do

Position the floating panel based on the anchor's own direction.

Don't

From the page's dir; an LTR field in the middle of a Persian page sends the menu the wrong way.

Do

One icon with .rtl-flip.

Don't

A language check in JSX to pick a left or right arrow.

Related pages

Voice and writingThe text shown in each language comes from tr().Numbers and datesDigits, separators, and the calendar follow the language too.IconsDirectional icons are mirrored with .rtl-flip.TypographyEach language has its own font: Estedad or Inter.Text fieldThe floating label and field icon each have their place in either direction.Date and timeThe row of months mirrors in left-to-right.Creation flowStepArrow in multi-step flows.
PreviousGlossaryNextNumbers and dates

Related pages

  • PageBrand kitThe Flowra mark and logo, colors, typography, clear space and minimum size, and the brand kit files to download.
  • PageDocumentationThe complete Flowra guide: actions, calendar, meetings, knowledge, files, Folio, chat, network, finance, connectors, settings and AI, each with its connections.
  • PageChangelogWhat each release added to Flowra, what got better, and what’s coming next.
  • PageContact usReach the right team: support, sales and plans, partnerships, careers, or security and privacy.
Flowra

Flowra is an all-in-one workspace for managing tasks, projects, finances, meetings, and teamwork, powered by AI to keep everything organized in one place.

Solutions for teams

  • Marketing teams
  • Product and dev teams
  • Design and content teams
  • Operations teams
  • Sales and services teams
  • Remote teams

Roles and flows

  • Project managers
  • Freelancers and consultants
  • Meeting to action
  • Actions with financial context
  • Actions with contract context
  • Brief to project delivery

With Flowra

  • All solutions
  • Pricing
  • Frequently asked questions
  • Documentation
  • Contact us
  • Brand kit
  • Design system
Crafted by Karo Studio
SecurityPrivacyTermsCookies
Version 0.16.0