Files
wekan/client/components/import/import.css
T
Lauri Ojansivu 2536861b79 - Full right-to-left (RTL) UI for every page when an RTL language is selected
(Arabic and its variants, Persian/Farsi, Hebrew, Uyghur, Uzbek-Arabic and
  Yiddish — the languages flagged `rtl: true` in `imports/i18n/languages.js`).
  Previously only some pages flipped. The root `<html>` element now gets a
  reactive `dir="rtl"`/`dir="ltr"` attribute that follows the chosen language, so
  the whole UI mirrors at once. To make this work on every page rather than a
  handful, all directional component CSS was converted to CSS logical properties
  (`margin-left`→`margin-inline-start`, `left:`→`inset-inline-start:`,
  `text-align: left`→`text-align: start`, `float: left`→`float: inline-start`,
  and the mirror-image right/end variants) across 48 stylesheets, which flip
  automatically with `dir`. Horizontal-centering rules using
  `left: 50%` + `transform: translate(-50%, …)` were intentionally kept physical,
  since those already center correctly in both directions. The calendar view also
  renders RTL. Thanks to xet7 and Claude.
- Tests for the RTL UI. A fast, server-less `tests/rtl.test.js` (run with
  `node tests/rtl.test.js`) checks that exactly the expected languages are
  flagged `rtl: true`, that the direction helper maps each language to the right
  `dir` value, that the root `<html>` and the client keep `dir` in sync, and —
  as a regression guard — that component CSS keeps using logical properties
  (no physical `margin-left`/`float: left`/bare `left:` offsets sneak back in).
  A Playwright browser spec `tests/playwright/specs/18-rtl-layout.e2e.js` drives
  the app in both English (LTR) and Arabic (RTL) and asserts, on the boards list,
  board view, card details, my-cards / due-cards / global-search, the admin
  settings page and the login page, that the direction is correct, the
  translated text is visible, and leading-edge content (the boards menu, the
  first board list) sits on the correct side. Thanks to xet7 and Claude.
- Fixed the "Meteor unit tests" CI job hanging until its 45-minute timeout. The
  workflow set `TEST_WATCH: '0'`, but meteortesting:mocha computes
  `testWatch: TEST_WATCH || …` and the string `'0'` is truthy in JavaScript, so
  it turned on watch mode and the process never exited. Removing the env var lets
  `meteor test --once` finish and exit with the correct status.

Thanks to xet7 and Claude !

Fixes #6136,
fixes #3376,
fixes #884
2026-06-14 08:59:58 +03:00

168 lines
3.7 KiB
CSS

.map-members:after {
content: "";
flex: auto;
}
.map-members .mapping-list {
display: flex;
flex-wrap: wrap;
margin: 0 -0.5vw;
}
.map-members .mapping-list .mapping-item {
max-width: min(300px, 40vw);
min-width: min(200px, 26vw);
padding: 0.8vh 0.8vw;
margin: 0.7vh;
flex: 1;
background: #fff;
border-radius: 0.4vw;
box-shadow: 0 0.2vh 0.3vh rgba(0,0,0,0.15);
}
.map-members .mapping-list .mapping-item:hover {
background: #f2f2f2;
}
.map-members .mapping-list .mapping-item.filled {
background: #e0ffe5;
}
.map-members .mapping-list .mapping-item.filled:hover {
background: #ffe0e0;
}
.map-members .mapping-list .mapping-item.ghost-item {
height: 0;
visibility: hidden;
border: none;
}
.map-members .mapping-list .profile-source {
display: inline-block;
width: 80%;
}
.map-members .mapping-list .wekan {
display: inline-block;
width: 4.5vw;
}
.map-members .mapping-list .wekan .member {
float: none;
}
a.show-mapping {
text-decoration: underline;
}
.import-members-map-note {
font-size: 90%;
font-weight: bold;
}
/* Trello API import: file rows, workspace tree, job progress and errors */
/* The shared page spinners are centered with a large top margin (e.g. bounce
uses margin:100px auto), which leaves a big empty gap above the spinner in
this compact panel. Make spinners here small and inline instead. */
.trello-api-import .sk-spinner {
margin: 0 8px 0 0;
display: inline-block;
vertical-align: middle;
width: auto;
}
.trello-api-import .import-file-row label {
display: block;
font-weight: bold;
}
.trello-api-import .import-file-row input,
.trello-api-import .import-file-row select {
width: 100%;
}
.trello-workspaces {
max-height: 40vh;
overflow-y: auto;
border: 1px solid #ddd;
padding: 8px;
margin: 8px 0;
}
.trello-workspace {
margin-bottom: 8px;
}
.trello-workspace .trello-boards {
margin-inline-start: 22px;
}
.trello-workspace-title,
.trello-board {
align-items: center;
padding: 3px 0;
cursor: pointer;
text-decoration: none;
color: inherit;
}
.trello-workspace-title .materialCheckBox,
.trello-board .materialCheckBox {
flex: 0 0 auto;
margin-inline-end: 12px;
}
.trello-select-controls button {
margin-inline-end: 6px;
}
.trello-job-controls button {
margin-inline-end: 6px;
}
/* Import progress meter, styled like Admin Panel / Attachments / Move Attachments */
.trello-progress-label {
margin: 8px 0 6px;
}
.trello-progress-bar {
background: #e9ecef;
border-radius: 8px;
height: 12px;
overflow: hidden;
margin-bottom: 4px;
}
.trello-progress-fill {
background: linear-gradient(90deg, #28a745, #20c997);
height: 100%;
border-radius: 8px;
transition: width 0.3s ease;
position: relative;
}
.trello-progress-fill.is-running::after {
content: '';
position: absolute;
top: 0;
inset-inline-start: 0;
inset-inline-end: 0;
bottom: 0;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent);
animation: trelloProgressShimmer 2s infinite;
}
@keyframes trelloProgressShimmer {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
.trello-progress-percent {
text-align: end;
font-size: 12px;
color: #666;
font-weight: 600;
margin-bottom: 8px;
}
.trello-import-result.is-ok {
color: #3cb500;
}
.trello-import-result.is-error {
color: #eb4646;
}
.js-trello-errors-text {
width: 100%;
font-family: monospace;
white-space: pre;
}
/* Trello API credential Save/Delete buttons */
.trello-api-creds-buttons button {
margin-inline-end: 6px;
}
.trello-creds-saved {
color: #3cb500;
}
/* Simplified per-field hint text under the Trello file upload labels */
.import-file-row .import-file-hint {
display: block;
font-size: 0.85em;
margin: 2px 0 4px;
}