Button
Every action. One filled button per screen for the main thing, outline and ghost for the rest, destructive only where something is lost.
The mark, color, type, motion and voice shared by the console, the POS, the client app and this website. Every value on this page is the one the product uses, so you can copy it straight into your work.
A letter T that is also a receipt. Select a part to see where it sits.
The lockup is the mark with the name beside it, and it is the default. Use the mark alone where the name is already on screen or there is no room for it: an app icon, a browser tab, the side rail of the POS.
Leave x of empty space on every side, where x is the height of the crossbar. Text, other logos and the edge of the screen stay outside it.
x is the height of the crossbar.
Keep the lockup at least 24px tall so the name stays readable. The mark works down to 16px, the size of a browser tab icon.
The logo is drawn for white and for receipt paper. On navy, brand blue or a photo, put it on a white tile.
White
Receipt paper
Navy, on a white tile
Don’t stretch or squash it.
Don’t recolor it. The bar is the only blue.
Don’t rotate it.
Don’t mirror it for Arabic. Use the Arabic lockup.
Don’t add shadows, outlines or gradients.
Don’t put it on brand blue. The bar disappears.
Mostly white, near-black and hairlines. Navy is the ink of the mark and the color of whatever you can press or have selected. Brand blue is the bar in the mark and the border of the field you are typing in.
The two colors of the mark.
Navy
The ink of the mark. Primary buttons, the selected tab, and the one dark band on the landing page.
Brand blue
The bar in the mark. The border of the field you are typing in.
Most of every screen.
Ink
Text and headings.
Muted ink
Secondary text, captions and icons at rest.
Canvas
The console's page, under its panels.
Hairline
The line between rows.
Muted
Hover fills, loading skeletons and secondary buttons.
Inset
A well inside a panel: totals, a summary, a dialog's buttons.
Rail
The console's sidebar.
Tint
Every second section of the landing page.
Panel
Every panel and the fields in it.
The state of something, always as a tinted badge with darker text of the same hue. Never for emphasis.
Positive
Caution
Info
Destructive
Only on pictures of paper: the sign-in card, the customer’s tracking ticket and the receipt in the landing page’s ZATCA band.
Paper
The ground of a printed slip.
Stamp
The one printed heading on the ticket.
One typeface for each script: Inter for English, IBM Plex Sans Arabic for Arabic and Urdu. Headings are semibold and body text is regular. Both faces are free under the SIL Open Font License.
Your order is ready for pickup.
English, in the console and on this site.
طلبك جاهز للاستلام.
Arabic and Urdu on the web. In the POS and the client app it sets every language, English included.
Display
60px on a desktop, 36px on a phone. Semibold, line height 1.06, tracking −2.8%.
The invoice is on its way.
Heading
34px, 26px on a phone. Semibold, line height 1.15, tracking −2%.
The invoice is on its way.
Console page title
24px, 20px on a phone. Semibold.
The invoice is on its way.
Console section title
14px. Semibold.
The invoice is on its way.
Body
17px on this site, 14px in the console. Regular.
The invoice is on its way.
Small
12px. Captions and notes under tables.
The invoice is on its way.
Every screen ships in English, Arabic and Urdu. Arabic and Urdu read right to left, share one typeface on screen and share the Arabic lockup.
English
Your whole shop, in one system.
العربية
نظام محلك كله، في مكان واحد.
اردو
آپ کی پوری دکان، ایک نظام میں۔
Stroke icons from Hugeicons, in the color of the text beside them. Every icon comes with a word, or with a label a screen reader can announce.
A person without a photo is drawn, not lettered. The drawing comes from their name, so the same person has the same face at the till, in the back office and in the customer app.
The console separates by tone and space, not lines: a faint canvas, white panels on it, a baby blue well inside a panel, and one line left, between rows. Only what floats has a shadow.
--canvas, --card, rounded-panel 16px
The page is a faint grey canvas. Each part of a screen is a white panel on it with 16px corners, no border and no shadow, told apart from the next by the canvas between them.
41.40
--inset #E9F0FF, rounded-inset 12px
A well inside a panel, in a deeper baby blue: an order's totals, a summary, the buttons at the foot of a dialog. Never a page's ground.
<Rows>, 1px --border
The one line left. It runs between rows that belong together, starts where their text starts, and never sits above the first or below the last.
80%, backdrop-blur-xl, reduce-transparency
Menus, popups and dialogs are solid and carry the only shadows. A bar that floats over scrolling content is see-through, and turns solid for anyone who asks their device for less transparency.
control 16, popup 16, row 12, inset 12, full
Every control and every popup is 16px round, and so is a panel. Smaller boxes get smaller corners; a corner inside a corner is the outer one less the padding. Chips and badges are fully round.
4, 8, 12, 16, 24, 32, 40
Padding and gaps come in steps of 4px. Anything you can tap has at least 44px to hit on a touch screen.
--color-landing-tint, landing-surface
Sections are told apart by ground: every second one sits on the tint. A block that needs a container is a white surface with a soft navy shadow.
Everything the console is built from, working. The switches under each one show its variants and states; the navbar changes the language and the theme.
Things that hold a value the operator gives.
Every action. One filled button per screen for the main thing, outline and ghost for the rest, destructive only where something is lost.
A single line the operator types: a name, a code. Label it with Field.
The box a list is searched with: a magnifier and a field. It takes its name from its placeholder.
An input that needs something attached: a search icon, a unit like , a clear button.
Free text longer than a line: a note on an order, a reason.
Printed on the ticket.
A number someone types: a count gets − / + either side, an amount its unit. Never a type="number" box.
Before VAT.
The Saudi Riyal sign, drawn: a unit beside an amount, as tall as its figures. Text that prints a price gets the sign from formatSAR.
A Saudi mobile number. The +966 is fixed, so nobody types it twice.
Turning one option on or off in a form that is saved together. For a setting that applies at once, use Switch.
A setting that applies the moment it is flipped. Inside a form saved with a button, use Checkbox.
Two to five choices that should all be visible at once. More than that, or long labels: Select.
A day, a month or a range. Every date field in the console goes through it.
A time of day with no date, like opening hours or a usual pickup time.
One photo for a record, an item or a person's face. Replaced and removed in place.
This page doesn't store photos, so the upload stops here.
A larger drop area, for when the photo is the main thing on the screen.
This page doesn't store photos, so the upload stops here.
Labels any control and reads out its hint and its error. The one way to label a control.
As it prints on the receipt.
Several controls under one heading: checkboxes or radios that answer one question.
A label wired by hand, outside a form. Inside a form, use Field.
Picking from a list or from a few options.
A list we own (statuses, types, yes or no) or a short one that stays short, like branches. For a list that grows, use Combobox.
A list that grows (customers, items, suppliers), searched by typing, with a missing entry created on the spot.
Two or three choices that each need a sentence to explain, shown as cards.
A small saved value, edited or removed right where it is shown.
One question at a time, as in setup. It keeps the person on the question in front of them.
What the console says back: status, progress, errors, and what is still empty.
A short status on a row or a heading. The tone says how it is going; the word says what.
Something about the whole screen the operator should know before going on. It stays while it is true.
Confirms something that happened out of view, then leaves. If the change shows where it happened, no toast.
How far along something with a known end is.
The shape of content on its way, so the screen does not jump when it arrives.
What a list says when there is nothing in it yet, and the one action that fills it.
When part of a screen fails, only that part shows the error and a way to try again.
When something happened, in words, with the exact time on hover.
Placed 3 minutes ago
A photo or initials for a business or an account.
A person's photo, or a face drawn from their name when there is none.
A merchant's logo, or waves drawn from its id when there is none.
Things that open on top of the page.
A little more about something, opened from it and closed by clicking away.
Adding or renaming something small, up to three fields, right where it is listed.
Actions that do not earn a button of their own. Actions only: to choose a value, use Select.
The name of an icon-only button. Never the only place something important is said.
A short task that needs focus: a dialog on a computer, a sheet from the bottom on a phone.
A longer task beside the page: a side sheet on a computer, a sheet from the bottom on a phone.
Confirming what cannot be undone. Use it rarely: asking too often teaches people to click through.
The dialog under ResponsiveDialog. Use ResponsiveDialog, so a phone gets a sheet.
The panel under ResponsiveSheet and the phone menu. For a task, use ResponsiveSheet.
How a screen is put together.
A screen's title, one line on what it is for, and its main action.
Everything rung up at this branch.
Text at one of three levels: the thing itself, what supports it, or metadata. Only metadata is grey.
A part of a screen with its own heading and actions. On the page it is a white panel; an Inset inside it holds totals or a summary.
What this order comes to, and how it was paid.
A value the reader copies, such as a sign-in link or an authenticator secret. Monospace and left to right in every language; one click selects all of it.
https://tamem.dev/sign-in/7KQ2-9XF4-MB3ROne fact about a record, a label and its value. Shows a dash, not a blank, when there is nothing.
Rows that belong together, with a line between each and the next that starts at their text. The only way to draw a line between rows. ActionRow makes a row one thing to do; FactRow makes it a label and its value.
A whole and what it is made of: a month's expenses by category, sales by branch. Press a part to narrow the screen to it.
All branches
115,411.97
A few numbers that matter today, side by side.
A table drawn by hand, for a short fixed list. For data that is sorted, filtered or paged, use DataTable.
| Invoice | Customer | Status | Total |
|---|---|---|---|
| INV-2026-004183 | Noura Al-Qahtani | 45.00 | |
| INV-2026-004182 | Faisal Al-Harbi | 120.00 | |
| INV-2026-004181 | Fahad Al-Otaibi | 27.50 |
Moves through a list too long for one page. A DataTable brings its own; use this under a list you page yourself.
Switching between views of the same thing without leaving the screen.
Tabs that are addresses: each is its own page, and the browser's back button works.
The controls that act on the panel under them, like a list's search and filters. They stand on the canvas above the panel, not inside it.
Larger pieces with behaviour of their own.
Records the operator sorts, filters, searches and pages through.
Invoice | Customer | Status | Total |
|---|---|---|---|
INV-2026-004183 | Noura Al-Qahtani | 45.00 | |
INV-2026-004182 | Faisal Al-Harbi | 120.00 | |
INV-2026-004181 | Fahad Al-Otaibi | 27.50 |
Every form in the console. Fields bound to it get their label, error and state with no wiring.
Creating or editing one record in a dialog or a sheet, with “Create another” for entering several.
Choosing a place on a map, with search. Only where the address really matters, like delivery.
A branch's day or week of appointments, staff side by side. Only for the appointments calendar.
Faisal Al-Harbi
Fahad Al-Otaibi
The frame every console screen sits in.
The console's frame: the rail of screens, the account menu, the phone menu.
Changing one value right where it is shown, saved on Enter.
Who changed what on a record, and when.
Nothing animates on scroll. Movement answers something the person did, or plays one of the landing page's demos. When the device asks for reduced motion, nothing slides or scales: surfaces fade in place.
160ms, --ease-out, scale 0.97
A button shrinks to 97% while it is held, over 160ms, and springs back. A full-width row darkens instead, because 3% of a wide row is a lurch. Hover only shows where there is a mouse.
200ms / 150ms, --ease-out cubic-bezier(0.23, 1, 0.32, 1)
Menus, lists and popovers grow out of the control that opened them, from 95%, in 200ms, and shrink back into it in 150ms. Dialogs open in the centre in 250ms, since nothing on screen opened them.
400ms, --ease-drawer cubic-bezier(0.32, 0.72, 0, 1)
Sheets and drawers rise on iOS's sheet curve in 400ms, and leave by the edge they came in from.
220ms, cubic-bezier(0.22, 1, 0.36, 1)
Fades in and drops 4px into place. A new WhatsApp message, a stock count that just changed.
240ms, cubic-bezier(0.23, 1, 0.32, 1)
Rows come in from the top, 40ms apart, when a sheet opens with a list.
--ease-out, --ease-in-out cubic-bezier(0.77, 0, 0.175, 1)
The hero’s order, the Salla shelf and the ZATCA receipt play as short loops while they are on screen. Each has a pause control, the visitor can take over at any point, and under reduced motion each shows its most telling frame.
180ms, 320ms, 260ms
The tablet uses springs instead of curves, damped so they settle without a bounce. The one exception is the count on a catalog tile, which overshoots slightly so a changed number gets noticed.
Two store apps, one mark. Both icons set the mark on white, over a blue ground. The console and this website use the mark on its own.
Write the way a shop owner explains the system to a new cashier: plain verbs, real nouns, sentence case. A number that isn’t true today doesn’t go on the page.
Write: Founding shops
Not: Trusted by 342 laundries
The number was never real, so it came off the page.
Write: Connect your Salla store
Not: Certified Salla app
The connection works. The marketplace listing is not finished.
Write: Sent from the Tamem number, unless your shop has its own
Not: Sent from your own number
A shop’s messages leave from its own number only once it has been set up with one; until then they go from the Tamem number.
Write: Take payment
Not: Submit
A button names what happens when you press it.
Paste this into an agent’s context before it makes Tamem screens, images or copy. It is built from the same values as this page.
# Tamem brand brief Read this before making Tamem screens, images or copy. The values are the ones the product ships with (apps/web/src/app/globals.css). ## Name - Tamem in English, تامم in Arabic and Urdu. - The company's full legal name only where a legal party is meant. ## Mark - A letter T that is also a receipt: navy #1B3472, with one bar in brand blue #3563EA. - Files: /brand/tamem-horizontal-en.svg, /brand/tamem-horizontal-ar.svg, /brand/tamem-icon.svg. - Arabic and Urdu use the Arabic lockup, mark on the right. Never mirror the mark. - Never recolor, stretch, rotate or add effects. On any ground but white or receipt paper, set it on a white tile. - Clear space: the height of the crossbar on every side. Lockup at least 24px tall, mark at least 16px. ## Color ``` navy #1B3472 --primary brand #3563EA --color-brand ink #090A0C --foreground mutedInk #5A5E65 --muted-foreground canvas #EBEDF1 --canvas hairline #E3E5E9 --border muted #EEF0F4 --muted inset #E9F0FF --inset panel #F9FAFB --sidebar tint #F2F6FD --color-landing-tint ground #FFFFFF --background positive #0E8A68 --color-positive caution #C97709 --color-caution info #006EDC --color-info destructive #E7000B --destructive paper #F7F4EC --color-receipt-paper stamp #B43822 --color-receipt-stamp ``` - Mostly white, ink and hairlines. Navy only for what can be pressed or is selected, plus one dark band on the landing page. - Secondary text is mutedInk, on the console and the marketing site alike. - Status colors only as tinted badges, never for emphasis. - Receipt paper and stamp only on pictures of printed slips. - No gradients, no glows, no second accent. ## Type - Inter for Latin (400, 500, 600). IBM Plex Sans Arabic for Arabic and Urdu (400 to 700). - Headings semibold, tracking -2% to -2.8% in Latin and 0 in Arabic script. - Sentence case. No uppercase labels, no eyebrows, no monospace outside receipts. ## Surfaces - Console: hairlines (1px #E3E5E9) instead of boxes. One radius, 16px. - Console: shadows only on menus, dialogs, popovers and toasts. - Landing page: every second section on the tint (#F2F6FD), containers as white landing-surface blocks, lines only between siblings. - 4px spacing steps. Touch targets at least 44px. ## People - A person without a photo gets a drawn face, never initials. It is DiceBear's notionists style in navy #1B3472 and white on #E9EDF7 or #F7F4EC, seeded by the full name. - Draw it with PersonAvatar (@tamem/ui-web) or Avatar (@tamem/ui-native), on the device. Never fetch it from a hosted avatar API: that sends the person's name away. - A business is not a face: a merchant keeps its logo, or its initials. ## Motion - In answer to a person's action. 150ms color changes; 220ms for a line arriving. - The landing demos loop while on screen, with a pause control and a takeover. - Nothing on scroll. Under prefers-reduced-motion, show one still frame. ## Voice - Plain verbs, real nouns. A button names what happens. - No invented numbers, customers or certifications. - No em or en dashes.