From 066a771cedefb6d66378886ad22380f81245fd69 Mon Sep 17 00:00:00 2001 From: martyanov-av Date: Thu, 21 Dec 2023 16:42:21 +0300 Subject: [PATCH 1/4] feat: RTL support --- .gitignore | 1 + demo/src/Components/DocPage/data.ts | 3 + demo/src/Components/DocPage/index.stories.tsx | 17 +- demo/src/Components/DocPage/page-he.json | 288 ++++++++++++++++++ src/components/Controls/Controls.scss | 6 +- .../Controls/single-controls/LangControl.tsx | 4 +- .../SettingsControl/SettingsControl.scss | 12 + src/components/DocPage/DocPage.scss | 5 + src/components/Paginator/Paginator.scss | 4 + src/components/SearchPage/SearchPage.scss | 4 + src/components/Toc/Toc.scss | 8 + src/components/TocItem/TocItem.scss | 8 + src/components/TocNavPanel/TocNavPanel.scss | 10 + src/components/ToggleArrow/ToggleArrow.scss | 10 + src/models/index.ts | 1 + 15 files changed, 378 insertions(+), 3 deletions(-) create mode 100644 demo/src/Components/DocPage/page-he.json diff --git a/.gitignore b/.gitignore index 7105f913..e6e7da51 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ node_modules # Generated content /build /storybook-static +/demo/storybook-static diff --git a/demo/src/Components/DocPage/data.ts b/demo/src/Components/DocPage/data.ts index 7a4be2ca..091710a2 100644 --- a/demo/src/Components/DocPage/data.ts +++ b/demo/src/Components/DocPage/data.ts @@ -1,6 +1,7 @@ import {Lang} from '../../../../src'; import pageContentEn from './page-en.json'; +import pageContentHe from './page-he.json'; import pageContentRu from './page-ru.json'; import singlePageContentEn from './single-page-en.json'; import singlePageContentRu from './single-page-ru.json'; @@ -14,6 +15,8 @@ export const getContent = (lang: Lang, singlePage: boolean) => { if (lang === 'ru') { return pageContentRu; + } else if (lang === 'he') { + return pageContentHe; } return pageContentEn; diff --git a/demo/src/Components/DocPage/index.stories.tsx b/demo/src/Components/DocPage/index.stories.tsx index a8e2cecc..0423c4d8 100644 --- a/demo/src/Components/DocPage/index.stories.tsx +++ b/demo/src/Components/DocPage/index.stories.tsx @@ -60,9 +60,24 @@ const useSettings = () => { }; }; +const useDirection = (lang) => { + const [dir, onChangeDir] = useState('ltr'); + + useEffect(() => { + if (lang === 'he') { + onChangeDir('rtl'); + } else { + onChangeDir('ltr'); + } + + document.dir = dir; + }, [lang, dir]); +}; + const useLangs = () => { - const langs = ['ru', 'en', 'cs']; + const langs = ['ru', 'en', 'cs', 'he']; const [lang, onChangeLang] = useState(DEFAULT_SETTINGS.lang); + useDirection(lang); return { lang, diff --git a/demo/src/Components/DocPage/page-he.json b/demo/src/Components/DocPage/page-he.json new file mode 100644 index 00000000..d7ab89aa --- /dev/null +++ b/demo/src/Components/DocPage/page-he.json @@ -0,0 +1,288 @@ +{ + "html": "

לשירותי Yandex.Cloud עשויים להיות מכסות ומגבלות:

\n\n

ניתן לראות את המכסות שנקבעו עבור חשבונך בהנהלה מסוף .

", + "title": "מכסות ומגבלות", + "headings": [ + { + "title": "למה צריך מכסות?", + "href": "#quotas", + "level": 2 + }, + { + "title": "ברירת מחדל מכסות ומגבלות עבור שירותי ענן", + "href": "#quotas-and-limits-defaults-for-yandex.cloud-services", + "level": 2, + "items": [ + { + "title": "Yandex Compute Cloud", + "href": "#compute", + "level": 3, + "items": [] + }, + { + "title": "Yandex Object Storage", + "href": "#storage", + "level": 3, + "items": [] + }, + { + "title": "Yandex Virtual Private Cloud", + "href": "#vpc", + "level": 3, + "items": [] + }, + { + "title": "Yandex Resource Manager", + "href": "#resource-manager", + "level": 3 + }, + { + "title": "Yandex Load Balancer", + "href": "#load-balancer", + "level": 3, + "items": [] + }, + { + "title": "Yandex Managed Service for ClickHouse", + "href": "#mch", + "level": 3, + "items": [] + }, + { + "title": "Yandex Managed Service for MongoDB", + "href": "#mmg", + "level": 3, + "items": [] + }, + { + "title": "Yandex Managed Service for MySQL", + "href": "#mmy", + "level": 3, + "items": [] + }, + { + "title": "Yandex Managed Service for PostgreSQL", + "href": "#mpg", + "level": 3, + "items": [] + }, + { + "title": "Yandex Managed Service for Redis", + "href": "#mrd", + "level": 3, + "items": [] + }, + { + "title": "Yandex Message Queue", + "href": "#mq", + "level": 3, + "items": [] + }, + { + "title": "Yandex SpeechKit", + "href": "#speechkit", + "level": 3, + "items": [] + }, + { + "title": "Yandex Translate", + "href": "#translate", + "level": 3, + "items": [] + }, + { + "title": "Yandex Vision", + "href": "#vision", + "level": 3, + "items": [] + } + ] + } + ], + "meta": { + "author": { + "avatar": "https://avatars.githubusercontent.com/u/2485935?v=4", + "email": "", + "login": "robot-dataui-vcs@yandex-team.ru", + "name": "DataUI VCS Robot", + "url": "http://yandex.ru/" + }, + "contributors": [ + { + "avatar": "https://avatars.githubusercontent.com/u/2485945?v=6", + "email": "robot-dataui-vcs@yandex-team.ru", + "login": "", + "name": "DataUI VCS Robot", + "url": "" + } + ] + }, + "toc": { + "title": "סקירת פלטפורמה", + "href": "/docs/overview/", + "items": [ + { + "name": "שירותי Yandex.Cloud", + "href": "/docs/overview/concepts/services", + "id": "e619422ec28a87ea25c41d4ad7e45563" + }, + { + "name": "השוואה לפלטפורמות אחרות", + "expanded": true, + "items": [ + { + "name": "סקירה", + "href": "/docs/overview/platform-comparison/", + "id": "6cb52f285fd5d6ec04cbd96854dffab6" + }, + { + "name": "להשוות עם Amazon Web Services", + "href": "/docs/overview/platform-comparison/aws", + "id": "1d84cf0e31f3f0968bdc6e8c2e11ba2f" + }, + { + "name": "להשוות עם Google Cloud Platform", + "href": "/docs/overview/platform-comparison/gcp", + "id": "931f7302b4162c44fbe9bb07cea05b1e" + }, + { + "name": "להשוות עם Microsoft Azure", + "href": "/docs/overview/platform-comparison/azure", + "id": "c14b119f6944d57afd8d4b3e61c37e21" + } + ], + "id": "fa5cef5c0b0cf236fdaa1562cbc48eb8" + }, + { + "name": "אזורי זמינות", + "href": "/docs/overview/concepts/geo-scope", + "id": "054328058d7c7b60ff85e3c95be1a264" + }, + { + "name": "תחילת העבודה", + "href": "/docs/overview/quickstart", + "id": "c984893c04c28bc3fe91f5ff87b79c29" + }, + { + "name": "שלבי מוכנות השירות", + "href": "/docs/overview/concepts/launch-stages", + "id": "c53a86addb3cf17f0847acde5282ad84" + }, + { + "name": "מכסות ומגבלות", + "href": "/docs/overview/concepts/quotas-limits", + "id": "56baa37ef41a57f75c4fce09722ab06c" + }, + { + "name": "API", + "href": "/docs/overview/api", + "id": "136bdc27253376a450eee99e4539c186" + }, + { + "name": "בטיחות ותאימות", + "items": [ + { + "name": "המלצות אבטחה", + "href": "/docs/overview/security-bulletins/", + "id": "c87ac8d995548646dec5661b1b28e45c" + }, + { + "name": "כללים לביצוע סריקות אבטחה חיצוניות", + "href": "/docs/overview/compliance/pentest", + "id": "544f4d243ace1fc32591d87d2460742d" + }, + { + "name": "אבטחת פלטפורמת Yandex.Cloud", + "items": [ + { + "name": "סקירה", + "href": "/docs/overview/security/", + "id": "022cc6311c43fdd3c2848a238c92de1e" + }, + { + "name": "עקרונות בטיחות מרכזיים", + "href": "/docs/overview/security/principles", + "id": "fba46ca0333fec72f16d0e29fb78e239", + "names": [ + { + "name": "אבטחת פלטפורמת Yandex.Cloud", + "items": [ + { + "name": "סקירה", + "href": "/docs/overview/security/", + "id": "022cc6311c43fdd3c2848a238c92de1e" + }, + { + "name": "עקרונות בטיחות מרכזיים", + "href": "/docs/overview/security/principles", + "id": "fba46ca0333fec72f16d0e29fb78e239" + } + ] + } + ] + }, + { + "name": "שיתוף באחריות לאבטחה", + "href": "/docs/overview/security/respons", + "id": "177e184118e1e45bc890a53bf76971c7" + }, + { + "name": "מעקב אחר שיטות עבודה וסטנדרטים מומלצים", + "href": "/docs/overview/security/standarts", + "id": "778f32125645fc81b0f680d2d9d09d23" + }, + { + "name": "עמידה בדרישות", + "href": "/docs/overview/security/conform", + "id": "4d7329262a479edc4b28a7607a31c2b4" + }, + { + "name": "אמצעי הגנה טכניים בצד הספק", + "href": "/docs/overview/security/tech-measures", + "id": "98cfa650bb690aa5b9a9aa66f3e7e52b" + }, + { + "name": "הגנות זמינות למשתמשי ענן", + "href": "/docs/overview/security/user-side", + "id": "aaffdd260266d59cd003e6fcab17a1ec" + }, + { + "name": "משאבים שימושיים", + "href": "/docs/overview/security/resources", + "id": "72071e3e599234cb4df3fe56ac378dc1" + } + ], + "id": "f8cca556a8df3df325a1dce2ffec52dc" + } + ], + "id": "7f196892c00a04c9d36a10bc2275ccb8" + }, + { + "name": "מחיקת נתוני משתמש", + "href": "/docs/overview/concepts/data-deletion", + "id": "66fe49c2a324ffd44541fe6a33e14ed0" + }, + { + "name": "SLA", + "href": "/docs/overview/sla", + "id": "1636c6203504367fc47f73077e95ebad" + }, + { + "name": "שאלות ותשובות", + "href": "/docs/overview/qa", + "id": "ff7aacc415c714c83d0ea5715eabb016" + } + ] + }, + "breadcrumbs": [ + { + "name": "תיעוד" + }, + { + "name": "מכסות ומגבלות" + } + ], + "filePath": "/cache/c12878f1-cc2e-445f-8f96-7374fe76b074/ru/overview/concepts/quotas-limits.md", + "githubUrl": "https://github.com/yandex-cloud/docs/tree/master/ru/overview/concepts/quotas-limits.md", + "vcsType": "github", + "vcsUrl": "https://github.com/yandex-cloud/docs/tree/master/ru/overview/concepts/quotas-limits.md" +} diff --git a/src/components/Controls/Controls.scss b/src/components/Controls/Controls.scss index 8e1dff20..cb1c6106 100644 --- a/src/components/Controls/Controls.scss +++ b/src/components/Controls/Controls.scss @@ -20,7 +20,6 @@ } &__list-icon { - margin-right: 8px; font-size: 22px; } @@ -28,6 +27,7 @@ --g-focus-border-radius: 4px; display: flex; + gap: 8px; align-items: center; width: 100%; height: 100%; @@ -40,6 +40,10 @@ font-family: inherit; @include focusable(-2px); + + [dir='rtl'] & { + flex-direction: row-reverse; + } } &__icon-rotated { diff --git a/src/components/Controls/single-controls/LangControl.tsx b/src/components/Controls/single-controls/LangControl.tsx index a411782a..e6497afe 100644 --- a/src/components/Controls/single-controls/LangControl.tsx +++ b/src/components/Controls/single-controls/LangControl.tsx @@ -17,11 +17,13 @@ import '../Controls.scss'; const ICONS: Record = { en: '🇬🇧', ru: '🇷🇺', + he: '🇮🇱', }; -const DEFAULT_LANGS = ['en', 'ru']; +const DEFAULT_LANGS = ['en', 'ru', 'he']; const LEGACY_LANG_ITEMS = [ {value: Lang.En, text: 'English', icon: '🇬🇧'}, {value: Lang.Ru, text: 'Русский', icon: '🇷🇺'}, + {value: Lang.He, text: 'Hebrew', icon: '🇮🇱'}, ]; const b = block('dc-controls'); diff --git a/src/components/Controls/single-controls/SettingsControl/SettingsControl.scss b/src/components/Controls/single-controls/SettingsControl/SettingsControl.scss index dfea0cef..f580da3c 100644 --- a/src/components/Controls/single-controls/SettingsControl/SettingsControl.scss +++ b/src/components/Controls/single-controls/SettingsControl/SettingsControl.scss @@ -4,6 +4,10 @@ &__text-size-control { display: flex; align-items: center; + + [dir='rtl'] & { + flex-direction: row-reverse; + } } &__text-size-button { @@ -50,6 +54,10 @@ display: flex; padding: 12px; width: 100%; + + [dir='rtl'] & { + flex-direction: row-reverse; + } } &__list-item-description { @@ -60,5 +68,9 @@ display: flex; align-items: center; margin-left: auto; + + [dir='rtl'] & { + margin: 0 auto 0 0; + } } } diff --git a/src/components/DocPage/DocPage.scss b/src/components/DocPage/DocPage.scss index 55a759bf..036c016b 100644 --- a/src/components/DocPage/DocPage.scss +++ b/src/components/DocPage/DocPage.scss @@ -55,6 +55,11 @@ position: absolute; right: 7px; + [dir='rtl'] & { + flex-direction: row-reverse; + left: -210px; + } + & > .dc-controls { position: fixed; top: calc(6px + var(--dc-header-height, #{$headerHeight})); diff --git a/src/components/Paginator/Paginator.scss b/src/components/Paginator/Paginator.scss index 03e27066..dd46a713 100644 --- a/src/components/Paginator/Paginator.scss +++ b/src/components/Paginator/Paginator.scss @@ -9,6 +9,10 @@ display: flex; align-items: center; + [dir='rtl'] & { + flex-direction: row-reverse; + } + &__item { $item: &; diff --git a/src/components/SearchPage/SearchPage.scss b/src/components/SearchPage/SearchPage.scss index 57a0b559..a1c6c115 100644 --- a/src/components/SearchPage/SearchPage.scss +++ b/src/components/SearchPage/SearchPage.scss @@ -14,6 +14,10 @@ &__search-field-wrapper { display: flex; align-items: center; + + [dir='rtl'] & { + flex-direction: row-reverse; + } } &__search-button { diff --git a/src/components/Toc/Toc.scss b/src/components/Toc/Toc.scss index e83b4b8d..1c30226b 100644 --- a/src/components/Toc/Toc.scss +++ b/src/components/Toc/Toc.scss @@ -43,6 +43,10 @@ $leftOffset: 57px; display: flex; margin-right: 5px; flex-shrink: 0; + + [dir='rtl'] & { + margin-left: 5px; + } } &-header { @@ -114,6 +118,10 @@ $leftOffset: 57px; // recurcive padding > #{$class}__list { padding-left: 20px; + + [dir='rtl'] & { + padding-right: 20px; + } } } } diff --git a/src/components/TocItem/TocItem.scss b/src/components/TocItem/TocItem.scss index 70942fea..4e44d996 100644 --- a/src/components/TocItem/TocItem.scss +++ b/src/components/TocItem/TocItem.scss @@ -36,6 +36,10 @@ color: var(--g-color-text-primary); + [dir='rtl'] & { + padding: 7px 20px 7px 12px; + } + &_active { border-radius: 3px; background: var(--g-color-base-selection); @@ -61,5 +65,9 @@ &__icon { position: absolute; left: 0; + + [dir='rtl'] & { + right: 0; + } } } diff --git a/src/components/TocNavPanel/TocNavPanel.scss b/src/components/TocNavPanel/TocNavPanel.scss index de4236a1..c87a89a1 100644 --- a/src/components/TocNavPanel/TocNavPanel.scss +++ b/src/components/TocNavPanel/TocNavPanel.scss @@ -51,10 +51,20 @@ &_left svg { margin-right: 6px; + + [dir='rtl'] & { + margin-left: 6px; + transform: rotate(180deg); + } } &_right svg { margin-left: 6px; + + [dir='rtl'] & { + margin-right: 6px; + transform: rotate(180deg); + } } } diff --git a/src/components/ToggleArrow/ToggleArrow.scss b/src/components/ToggleArrow/ToggleArrow.scss index 669daf5b..eec8d472 100644 --- a/src/components/ToggleArrow/ToggleArrow.scss +++ b/src/components/ToggleArrow/ToggleArrow.scss @@ -11,6 +11,16 @@ &_vertical { transform: rotate(90deg); } + + [dir='rtl'] & { + &_horizontal { + transform: rotate(180deg); + } + + &_vertical { + transform: rotate(90deg); + } + } } &_open { diff --git a/src/models/index.ts b/src/models/index.ts index fe2315e2..6238747b 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -124,6 +124,7 @@ export interface Router { export enum Lang { Ru = 'ru', En = 'en', + He = 'he', } export interface Contributor { From f5d4e36b972c0d4f011f47c2e8f8c4f98dfd5ebc Mon Sep 17 00:00:00 2001 From: martyanov-av Date: Thu, 21 Dec 2023 18:47:21 +0300 Subject: [PATCH 2/4] feat: use logical stylelint rule --- .stylelintrc | 9 +++++++-- package.json | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.stylelintrc b/.stylelintrc index 5135c9ad..7b6bbc76 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -1,3 +1,8 @@ { - "extends": ["@gravity-ui/stylelint-config", "@gravity-ui/stylelint-config/prettier"] -} + "extends": ["@gravity-ui/stylelint-config", "@gravity-ui/stylelint-config/prettier"], + "plugins": ["stylelint-use-logical"], + "rules": { + "csstools/use-logical": ["always", {"except": ["float", "width", "min-width", "max-width", "height", "min-height", "max-height"]}], + "declaration-colon-space-after": "always-single-line" + } +} \ No newline at end of file diff --git a/package.json b/package.json index b1e98218..bb708bde 100644 --- a/package.json +++ b/package.json @@ -117,6 +117,7 @@ "rimraf": "^5.0.1", "sass": "^1.66.1", "stylelint": "^15.10.3", + "stylelint-use-logical": "^2.1.0", "svgo": "2.8.0", "typescript": "^5.2.2" }, From 75aeaf3e1323ca7558ae4e7ac5f5e63f97a515b8 Mon Sep 17 00:00:00 2001 From: martyanov-av Date: Fri, 22 Dec 2023 10:28:08 +0300 Subject: [PATCH 3/4] feat!: use logical CSS properties --- .stylelintrc | 3 +- package.json | 1 + .../ContributorAvatars.scss | 12 ++-- src/components/Controls/Controls.scss | 6 +- .../SettingsControl/SettingsControl.scss | 8 +-- src/components/DocLayout/DocLayout.scss | 6 +- .../DocLeadingPage/DocLeadingPage.scss | 22 +++---- src/components/DocPage/DocPage.scss | 63 +++++++++---------- src/components/DocPageTitle/DocPageTitle.scss | 4 +- src/components/ErrorPage/ErrorPage.scss | 10 +-- src/components/Feedback/Feedback.scss | 24 +++---- src/components/MiniToc/MiniToc.scss | 10 +-- src/components/Paginator/Paginator.scss | 4 +- src/components/SearchBar/SearchBar.scss | 2 +- src/components/SearchItem/SearchItem.scss | 10 +-- src/components/SearchPage/SearchPage.scss | 16 ++--- src/components/Subscribe/Subscribe.scss | 18 +++--- src/components/Toc/Toc.scss | 28 +++------ src/components/TocItem/TocItem.scss | 19 ++---- src/components/TocNavPanel/TocNavPanel.scss | 14 ++--- src/components/ToggleArrow/ToggleArrow.scss | 22 ++++--- src/styles/mixins.scss | 6 +- src/styles/yfm.scss | 16 ++--- 23 files changed, 152 insertions(+), 172 deletions(-) diff --git a/.stylelintrc b/.stylelintrc index 7b6bbc76..143025b9 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -3,6 +3,7 @@ "plugins": ["stylelint-use-logical"], "rules": { "csstools/use-logical": ["always", {"except": ["float", "width", "min-width", "max-width", "height", "min-height", "max-height"]}], - "declaration-colon-space-after": "always-single-line" + "declaration-colon-space-after": "always-single-line", + "declaration-block-no-redundant-longhand-properties": null } } \ No newline at end of file diff --git a/package.json b/package.json index bb708bde..f0037b7c 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "npm-run-all": "^4.1.5", "postcss": "^8.4.28", "postcss-preset-env": "^9.1.2", + "postcss-scss": "^4.0.9", "prettier": "^2.8.8", "prop-types": "^15.8.1", "react": "^18.2.0", diff --git a/src/components/ContributorAvatars/ContributorAvatars.scss b/src/components/ContributorAvatars/ContributorAvatars.scss index 4fb94673..4dbed82b 100644 --- a/src/components/ContributorAvatars/ContributorAvatars.scss +++ b/src/components/ContributorAvatars/ContributorAvatars.scss @@ -38,7 +38,7 @@ $avatarWrapperBigSize: 33px; @media screen and (max-width: map-get($screenBreakpoints, 'sm')) { &_onlyAuthor > *:last-child { - margin-left: 5px; + margin-inline-start: 5px; } & > *:last-child, @@ -51,7 +51,7 @@ $avatarWrapperBigSize: 33px; } & > *:not(:last-child) { - margin-right: 0px; + margin-inline-end: 0px; } } @@ -61,7 +61,7 @@ $avatarWrapperBigSize: 33px; } & > *:last-child { - margin-right: 0px; + margin-inline-end: 0px; } } } @@ -106,8 +106,8 @@ $avatarWrapperBigSize: 33px; @include disable-link-styles; & > * { - margin-left: $avatarBorder; - margin-right: calc(#{$avatarBorder} + #{$avatarsDistance}); + margin-inline-start: $avatarBorder; + margin-inline-end: calc(#{$avatarBorder} + #{$avatarsDistance}); } & a { border-radius: 50%; // to have rounded outline on focus as all avatars rounded @@ -157,7 +157,7 @@ $avatarWrapperBigSize: 33px; padding: $detailsIndent; & > *:not(:last-child) { - margin-bottom: $detailsIndent; + margin-block-end: $detailsIndent; } } } diff --git a/src/components/Controls/Controls.scss b/src/components/Controls/Controls.scss index cb1c6106..9487ad06 100644 --- a/src/components/Controls/Controls.scss +++ b/src/components/Controls/Controls.scss @@ -8,7 +8,7 @@ &__control:not(:last-child), &__divider { - margin-right: 4px; + margin-inline-end: 4px; } &__list { @@ -66,8 +66,8 @@ &_vertical &__control:not(:last-child), &_vertical &__divider { - margin-right: 0; - margin-bottom: 4px; + margin-inline-end: 0; + margin-block-end: 4px; } } } diff --git a/src/components/Controls/single-controls/SettingsControl/SettingsControl.scss b/src/components/Controls/single-controls/SettingsControl/SettingsControl.scss index f580da3c..58a3cc99 100644 --- a/src/components/Controls/single-controls/SettingsControl/SettingsControl.scss +++ b/src/components/Controls/single-controls/SettingsControl/SettingsControl.scss @@ -47,11 +47,12 @@ } &__list-icon { - margin-right: 8px; + margin-inline-end: 8px; } &__list-item { display: flex; + justify-content: space-between; padding: 12px; width: 100%; @@ -67,10 +68,5 @@ &__list-item-control { display: flex; align-items: center; - margin-left: auto; - - [dir='rtl'] & { - margin: 0 auto 0 0; - } } } diff --git a/src/components/DocLayout/DocLayout.scss b/src/components/DocLayout/DocLayout.scss index d623134d..39dc0118 100644 --- a/src/components/DocLayout/DocLayout.scss +++ b/src/components/DocLayout/DocLayout.scss @@ -20,7 +20,7 @@ &__right { width: 176px; - padding-right: 24px; + padding-inline-end: 24px; &_full-screen, &_hidden-right { flex: initial; @@ -58,8 +58,8 @@ &__toc { position: fixed; z-index: 100; - top: var(--dc-header-height, #{$headerHeight}); - padding-left: 24px; + inset-block-start: var(--dc-header-height, #{$headerHeight}); + padding-inline-start: 24px; width: 252px; box-sizing: content-box; background-color: var(--g-color-base-background); diff --git a/src/components/DocLeadingPage/DocLeadingPage.scss b/src/components/DocLeadingPage/DocLeadingPage.scss index 60845b62..4c234309 100644 --- a/src/components/DocLeadingPage/DocLeadingPage.scss +++ b/src/components/DocLeadingPage/DocLeadingPage.scss @@ -12,7 +12,7 @@ } &__main { - margin-bottom: 40px; + margin-block-end: 40px; padding: 0 40px; } @@ -41,13 +41,13 @@ &_root { flex-direction: row; - margin-top: 70px; - margin-bottom: -$blockMarginBottomLarge; + margin-block-start: 70px; + margin-block-end: -$blockMarginBottomLarge; } } &__links-left { - padding-right: 10px; + padding-inline-end: 10px; } &__links-item { @@ -56,10 +56,10 @@ min-width: 280px; max-width: 400px; width: calc(50% - 20px); - padding-top: 15px; - padding-bottom: 15px; - margin-bottom: $blockMarginBottomLarge; - border-top: 1px solid var(--g-color-line-generic); + padding-block-start: 15px; + padding-block-end: 15px; + margin-block-end: $blockMarginBottomLarge; + border-block-start: 1px solid var(--g-color-line-generic); } } @@ -67,7 +67,7 @@ &_root { @include heading4(); - margin-bottom: 10px; + margin-block-end: 10px; font-weight: 500; } } @@ -78,8 +78,8 @@ @media (max-width: map-get($screenBreakpoints, 'md') - 1) { &__main { - margin-left: 0; - margin-bottom: 40px; + margin-inline-start: 0; + margin-block-end: 40px; padding: 0 20px; } diff --git a/src/components/DocPage/DocPage.scss b/src/components/DocPage/DocPage.scss index 036c016b..a7dcbaee 100644 --- a/src/components/DocPage/DocPage.scss +++ b/src/components/DocPage/DocPage.scss @@ -10,9 +10,11 @@ &__aside { position: fixed; - top: calc(var(--dc-header-height, #{$headerHeight}) + var(--dc-subheader-height)); + inset-block-start: calc( + var(--dc-header-height, #{$headerHeight}) + var(--dc-subheader-height) + ); - padding-top: 24px; + padding-block-start: 24px; width: 176px; @include text-size(body-1); @@ -36,33 +38,28 @@ &__loader-wrapper { background: var(--g-color-base-background); - padding-top: calc((100vh - var(--dc-header-height, #{$headerHeight})) / 2); + padding-block-start: calc((100vh - var(--dc-header-height, #{$headerHeight})) / 2); display: flex; justify-content: center; position: absolute; width: 100%; - top: 0; + inset-block-start: 0; z-index: 101; height: 100%; } &__controls { display: flex; - top: 0; + inset-block-start: 0; + inset-inline-end: 7px; align-items: center; height: 40px; z-index: 102; position: absolute; - right: 7px; - - [dir='rtl'] & { - flex-direction: row-reverse; - left: -210px; - } & > .dc-controls { position: fixed; - top: calc(6px + var(--dc-header-height, #{$headerHeight})); + inset-block-start: calc(6px + var(--dc-header-height, #{$headerHeight})); @media (max-width: map-get($screenBreakpoints, 'md') - 1) { position: static; @@ -71,12 +68,12 @@ @media (min-width: map-get($screenBreakpoints, 'md')) { &_vertical { - top: calc(6px + var(--dc-header-height, #{$headerHeight})); + inset-block-start: calc(6px + var(--dc-header-height, #{$headerHeight})); justify-content: center; height: auto; width: 36px; position: absolute; - right: 0; + inset-inline-end: 0; } } } @@ -126,28 +123,28 @@ } &__feedback { - margin-top: 84px; + margin-block-start: 84px; } &__edit-button { position: absolute; - right: 0; + inset-inline-end: 0; } &__title { - margin-bottom: 8px; + margin-block-end: 8px; @include text-size(display-2); } &__content { flex: 1; - margin-bottom: 50px; + margin-block-end: 50px; } &__content-mini-toc { display: none; - margin-bottom: 20px; + margin-block-end: 20px; } &__search-bar { @@ -156,7 +153,7 @@ height: 40px; box-sizing: border-box; position: sticky; - top: calc(var(--dc-header-height, #{$headerHeight}) + 6px); + inset-block-start: calc(var(--dc-header-height, #{$headerHeight}) + 6px); z-index: 101; padding: 0 36px; @@ -166,7 +163,7 @@ } &__search-bar + &__breadcrumbs { - margin-top: 12px; + margin-block-start: 12px; } &_full-screen { @@ -178,8 +175,8 @@ #{$block}__main, & .dc-nav-toc-panel__content { - padding-left: 64px; - padding-right: 64px; + padding-inline-start: 64px; + padding-inline-end: 64px; } } @@ -189,15 +186,15 @@ &#{&}_single-page &__header-container { position: relative; - padding-right: 200px; + padding-inline-end: 200px; } &#{&}_full-screen#{&}_regular-page-width { max-width: 736px; #{$block}__main { - padding-left: 0; - padding-right: 0; + padding-inline-start: 0; + padding-inline-end: 0; } #{$block}__breadcrumbs { @@ -224,11 +221,11 @@ } &__toc-nav-panel { - padding-bottom: 50px; + padding-block-end: 50px; } &__controls { - padding-left: 12px; + padding-inline-start: 12px; position: static; } @@ -257,19 +254,19 @@ @media screen and (min-width: 1024px) { &#{&}_full-screen#{&}_regular-page-width &__controls_vertical { - right: -36px; + inset-inline-end: -36px; } } /* stylelint-disable declaration-no-important */ @media screen and (max-width: 1280px) { &_full-screen &__main, &_full-screen .dc-nav-toc-panel__content { - padding-left: 40px !important; - padding-right: 40px !important; + padding-inline-start: 40px !important; + padding-inline-end: 40px !important; } &_full-screen &__breadcrumbs { - padding-left: 24px !important; - padding-right: 24px !important; + padding-inline-start: 24px !important; + padding-inline-end: 24px !important; } &_regular-page-width { diff --git a/src/components/DocPageTitle/DocPageTitle.scss b/src/components/DocPageTitle/DocPageTitle.scss index 570d6c32..6783cdaf 100644 --- a/src/components/DocPageTitle/DocPageTitle.scss +++ b/src/components/DocPageTitle/DocPageTitle.scss @@ -3,7 +3,7 @@ &__label { position: absolute; - left: 0; - top: -11px; + inset-inline-start: 0; + inset-block-start: -11px; } } diff --git a/src/components/ErrorPage/ErrorPage.scss b/src/components/ErrorPage/ErrorPage.scss index e3b64a64..97cd81c2 100644 --- a/src/components/ErrorPage/ErrorPage.scss +++ b/src/components/ErrorPage/ErrorPage.scss @@ -5,14 +5,14 @@ display: flex; flex-direction: column; align-items: center; - margin-top: 70px; + margin-block-start: 70px; padding: 0 50px; text-align: center; &__image { width: 230px; height: 230px; - margin-bottom: 40px; + margin-block-end: 40px; background-size: contain; background-repeat: no-repeat; @@ -35,14 +35,14 @@ } &__code { - margin-bottom: 10px; + margin-block-end: 10px; } &__title { @include heading3(); max-width: 800px; - margin-bottom: 20px; + margin-block-end: 20px; } &__description { @@ -63,7 +63,7 @@ } .mobile & { - margin-top: 40px; + margin-block-start: 40px; padding: 0 20px; } } diff --git a/src/components/Feedback/Feedback.scss b/src/components/Feedback/Feedback.scss index 92469aaf..bc581f10 100644 --- a/src/components/Feedback/Feedback.scss +++ b/src/components/Feedback/Feedback.scss @@ -7,8 +7,8 @@ $popupWidth: 320px; @media screen and (max-width: map-get($screenBreakpoints, 'xs')) { & { // stylelint-disable declaration-no-important - right: 0 !important; - left: 0 !important; + inset-inline-end: 0 !important; + inset-inline-start: 0 !important; margin: auto; } } @@ -60,7 +60,7 @@ $popupWidth: 320px; &__popup-title { font-size: var(--g-text-body-2-font-size); line-height: var(--g-text-body-2-line-height); - padding-bottom: 8px; + padding-block-end: 8px; } &__popup-text { @@ -75,22 +75,22 @@ $popupWidth: 320px; } &__variant { - margin-bottom: 8px; + margin-block-end: 8px; white-space: normal; } &__variant:last-child { - margin-bottom: 0; + margin-block-end: 0; } &__variants-actions { - padding-top: 8px; + padding-block-start: 8px; display: flex; justify-content: flex-end; } &__variants-action { - margin-left: 10px; + margin-inline-start: 10px; } &__textarea { @@ -101,7 +101,7 @@ $popupWidth: 320px; &_view_wide { font-size: var(--g-text-body-2-font-size); line-height: var(--g-text-body-2-line-height); - margin-right: 16px; + margin-inline-end: 16px; font-weight: 400; } } @@ -124,18 +124,18 @@ $popupWidth: 320px; } &_view_wide { - margin-right: 12px; + margin-inline-end: 12px; &:last-child { - margin-right: 0; + margin-inline-end: 0; } } &_view_regular { - margin-right: 4px; + margin-inline-end: 4px; &:last-child { - margin-right: 0; + margin-inline-end: 0; } } } diff --git a/src/components/MiniToc/MiniToc.scss b/src/components/MiniToc/MiniToc.scss index 25d7f371..76ec5761 100644 --- a/src/components/MiniToc/MiniToc.scss +++ b/src/components/MiniToc/MiniToc.scss @@ -8,7 +8,7 @@ @include text-size(body-2); font-weight: 500; color: var(--g-color-text-primary); - margin-bottom: 12px; + margin-block-end: 12px; } &__sections { @@ -25,7 +25,7 @@ display: block; & > #{$class}__section-link { - border-left-color: var(--g-color-line-generic); + border-inline-start-color: var(--g-color-line-generic); @include focusable(-2px); } @@ -37,7 +37,7 @@ min-height: 28px; color: var(--g-color-text-secondary); - border-left: 2px solid transparent; + border-inline-start: 2px solid transparent; text-decoration: none; &:hover { @@ -47,13 +47,13 @@ &_child { #{$class}__section-link { - padding-left: 25px; + padding-inline-start: 25px; } } &_active > #{$class}__section-link { color: var(--g-color-text-primary); - border-left-color: var(--g-color-text-primary); + border-inline-start-color: var(--g-color-text-primary); } } } diff --git a/src/components/Paginator/Paginator.scss b/src/components/Paginator/Paginator.scss index dd46a713..c7ba4abe 100644 --- a/src/components/Paginator/Paginator.scss +++ b/src/components/Paginator/Paginator.scss @@ -29,7 +29,7 @@ &_type { &_prev { - margin-left: -6px; + margin-inline-start: -6px; } &_dots { @@ -53,7 +53,7 @@ } &_next { - margin-right: -6px; + margin-inline-end: -6px; } } } diff --git a/src/components/SearchBar/SearchBar.scss b/src/components/SearchBar/SearchBar.scss index 43560404..edbdd9e9 100644 --- a/src/components/SearchBar/SearchBar.scss +++ b/src/components/SearchBar/SearchBar.scss @@ -46,7 +46,7 @@ &__navigation { display: flex; align-items: center; - margin-right: 11px; + margin-inline-end: 11px; } &__next-arrow { diff --git a/src/components/SearchItem/SearchItem.scss b/src/components/SearchItem/SearchItem.scss index a9cf5442..7ea16061 100644 --- a/src/components/SearchItem/SearchItem.scss +++ b/src/components/SearchItem/SearchItem.scss @@ -20,14 +20,14 @@ &__marks { height: 16px; - margin-top: 10px; + margin-block-start: 10px; } &__mark { - margin-right: 20px; + margin-inline-end: 20px; &:last-child { - margin-right: 0; + margin-inline-end: 0; } } @@ -36,7 +36,7 @@ } &__item-wrapper { - margin-bottom: 20px; + margin-block-end: 20px; @include text-size(body-1); } @@ -59,7 +59,7 @@ } &-title { - margin-bottom: 4px; + margin-block-end: 4px; } &-title, diff --git a/src/components/SearchPage/SearchPage.scss b/src/components/SearchPage/SearchPage.scss index a1c6c115..781003a5 100644 --- a/src/components/SearchPage/SearchPage.scss +++ b/src/components/SearchPage/SearchPage.scss @@ -2,7 +2,7 @@ @import '../../styles/mixins'; .dc-search-page { - margin-top: 26px; + margin-block-start: 26px; display: flex; justify-content: center; @@ -21,27 +21,27 @@ } &__search-button { - margin-left: 10px; + margin-inline-start: 10px; } &__search { &-field, &-item { - margin-bottom: 36px; + margin-block-end: 36px; } } &__subtitle { - margin-bottom: 18px; + margin-block-end: 18px; } &__paginator { padding: 10px 0; - border-top: 1px solid var(--g-color-line-generic); + border-block-start: 1px solid var(--g-color-line-generic); } @media (max-width: map-get($screenBreakpoints, 'md')) { - margin-top: 16px; + margin-block-start: 16px; &__layout { padding: 0 12px; @@ -49,11 +49,11 @@ &__search { &-field { - margin-bottom: 24px; + margin-block-end: 24px; } &-item { - margin-bottom: 40px; + margin-block-end: 40px; } } } diff --git a/src/components/Subscribe/Subscribe.scss b/src/components/Subscribe/Subscribe.scss index a1f3e245..a65f97b1 100644 --- a/src/components/Subscribe/Subscribe.scss +++ b/src/components/Subscribe/Subscribe.scss @@ -7,8 +7,8 @@ $popupWidth: 320px; @media screen and (max-width: map-get($screenBreakpoints, 'xs')) { & { // stylelint-disable declaration-no-important - right: 0 !important; - left: 0 !important; + inset-inline-end: 0 !important; + inset-inline-start: 0 !important; margin: auto; } } @@ -60,7 +60,7 @@ $popupWidth: 320px; &__popup-title { font-size: var(--g-text-body2-font-size); line-height: var(--g-text-body2-line-height); - padding-bottom: 8px; + padding-block-end: 8px; } &__popup-text { @@ -74,7 +74,7 @@ $popupWidth: 320px; } &__variants-action { - margin-left: 10px; + margin-inline-start: 10px; } &__variant__list-item { @@ -89,7 +89,7 @@ $popupWidth: 320px; &_view_wide { font-size: var(--g-text-body2-font-size); line-height: var(--g-text-body2-line-height); - margin-right: 16px; + margin-inline-end: 16px; font-weight: 400; } } @@ -111,18 +111,18 @@ $popupWidth: 320px; } &_view_wide { - margin-right: 12px; + margin-inline-end: 12px; &:last-child { - margin-right: 0; + margin-inline-end: 0; } } &_view_regular { - margin-right: 4px; + margin-inline-end: 4px; &:last-child { - margin-right: 0; + margin-inline-end: 0; } } } diff --git a/src/components/Toc/Toc.scss b/src/components/Toc/Toc.scss index 1c30226b..6acb3205 100644 --- a/src/components/Toc/Toc.scss +++ b/src/components/Toc/Toc.scss @@ -17,11 +17,11 @@ $leftOffset: 57px; flex-direction: column; height: calc(100vh - var(--dc-header-height, #{$headerHeight})); overflow-y: hidden; - border-right: 1px solid var(--g-color-line-generic); + border-inline-end: 1px solid var(--g-color-line-generic); .mobile & { - border-top: 1px solid var(--g-color-line-generic); - border-right: none; + border-block-start: 1px solid var(--g-color-line-generic); + border-inline-end: none; } &__empty { @@ -36,17 +36,13 @@ $leftOffset: 57px; padding: 10px 10px 8px 0; &_scrolled { - border-bottom: 1px solid var(--g-color-line-generic); + border-block-end: 1px solid var(--g-color-line-generic); } &-header-icon { display: flex; - margin-right: 5px; + margin-inline-end: 5px; flex-shrink: 0; - - [dir='rtl'] & { - margin-left: 5px; - } } &-header { @@ -81,7 +77,7 @@ $leftOffset: 57px; padding: 4px 10px 20px 0; &_scrolled { - border-top: 1px solid var(--g-color-line-generic); + border-block-start: 1px solid var(--g-color-line-generic); } } @@ -94,7 +90,7 @@ $leftOffset: 57px; scrollbar-width: thin; &_offset_top { - padding-top: 24px; + padding-block-start: 24px; } } @@ -117,17 +113,13 @@ $leftOffset: 57px; // recurcive padding > #{$class}__list { - padding-left: 20px; - - [dir='rtl'] & { - padding-right: 20px; - } + padding-inline-start: 20px; } } } &__content > &__list { - padding-right: 21px; - padding-bottom: 30px; + padding-inline-end: 21px; + padding-block-end: 30px; } } diff --git a/src/components/TocItem/TocItem.scss b/src/components/TocItem/TocItem.scss index 4e44d996..f2c3ea5c 100644 --- a/src/components/TocItem/TocItem.scss +++ b/src/components/TocItem/TocItem.scss @@ -24,7 +24,8 @@ font-weight: inherit; position: relative; - padding: 7px 12px 7px 20px; + padding-block: 7px; + padding-inline: 20px 12px; box-sizing: border-box; word-break: break-word; background-color: transparent; @@ -36,10 +37,6 @@ color: var(--g-color-text-primary); - [dir='rtl'] & { - padding: 7px 20px 7px 12px; - } - &_active { border-radius: 3px; background: var(--g-color-base-selection); @@ -48,10 +45,10 @@ &::before { content: ''; position: absolute; - top: 0; - right: 0; + inset-block-start: 0; + inset-inline-end: 0; // hack: to be shure that it will always start from the left of the TOC - left: -100vw; + inset-inline-start: -100vw; height: 100%; } @@ -64,10 +61,6 @@ &__icon { position: absolute; - left: 0; - - [dir='rtl'] & { - right: 0; - } + inset-inline-start: 0; } } diff --git a/src/components/TocNavPanel/TocNavPanel.scss b/src/components/TocNavPanel/TocNavPanel.scss index c87a89a1..d8c5b801 100644 --- a/src/components/TocNavPanel/TocNavPanel.scss +++ b/src/components/TocNavPanel/TocNavPanel.scss @@ -10,10 +10,10 @@ &_fixed { position: fixed; - bottom: 0; + inset-block-end: 0; z-index: 1000; - left: 0; - border-top: 1px solid var(--g-color-line-generic); + inset-inline-start: 0; + border-block-start: 1px solid var(--g-color-line-generic); } &_fixed &__control-hint { @@ -45,24 +45,22 @@ } & svg { - margin-top: -1px; + margin-block-start: -1px; min-width: 16px; } &_left svg { - margin-right: 6px; + margin-inline-end: 6px; [dir='rtl'] & { - margin-left: 6px; transform: rotate(180deg); } } &_right svg { - margin-left: 6px; + margin-inline-start: 6px; [dir='rtl'] & { - margin-right: 6px; transform: rotate(180deg); } } diff --git a/src/components/ToggleArrow/ToggleArrow.scss b/src/components/ToggleArrow/ToggleArrow.scss index eec8d472..29feb5d6 100644 --- a/src/components/ToggleArrow/ToggleArrow.scss +++ b/src/components/ToggleArrow/ToggleArrow.scss @@ -6,30 +6,32 @@ &_type { &_horizontal { transform: rotate(0deg); - } - - &_vertical { - transform: rotate(90deg); - } - [dir='rtl'] & { - &_horizontal { + [dir='rtl'] & { transform: rotate(180deg); } + } - &_vertical { - transform: rotate(90deg); - } + &_vertical { + transform: rotate(90deg); } } &_open { &#{$root}_type_horizontal { transform: rotate(90deg); + + [dir='rtl'] & { + transform: rotate(90deg); + } } &#{$root}_type_vertical { transform: rotate(-90deg); + + [dir='rtl'] & { + transform: rotate(90deg); + } } } diff --git a/src/styles/mixins.scss b/src/styles/mixins.scss index f093cb1f..67e5c6c6 100644 --- a/src/styles/mixins.scss +++ b/src/styles/mixins.scss @@ -12,8 +12,8 @@ } @mixin fixAnchorPosition($offset: 0px) { - padding-top: calc(var(--dc-header-height, #{$headerHeight})); - margin-top: calc(#{$offset} - var(--dc-header-height, #{$headerHeight})); + padding-block-start: calc(var(--dc-header-height, #{$headerHeight})); + margin-block-start: calc(#{$offset} - var(--dc-header-height, #{$headerHeight})); } @mixin reset-link-style() { @@ -103,7 +103,7 @@ @mixin contributors-text() { font-size: 13px; font-weight: 400; - margin-right: 5px; + margin-inline-end: 5px; align-self: center; } diff --git a/src/styles/yfm.scss b/src/styles/yfm.scss index 99249e6e..b437372d 100644 --- a/src/styles/yfm.scss +++ b/src/styles/yfm.scss @@ -96,11 +96,11 @@ } blockquote { - border-left-color: var(--g-color-base-brand); + border-inline-start-color: var(--g-color-base-brand); } .yfm-tab-list { - border-bottom-color: var(--g-color-line-generic); + border-block-end-color: var(--g-color-line-generic); } .yfm-tab { @@ -114,12 +114,12 @@ } .yfm-tab.active { - border-bottom-color: var(--g-color-base-brand); + border-block-end-color: var(--g-color-base-brand); } /* TODO: move yfm-cut styles to yfm-transform */ .yfm-cut { - margin-bottom: $blockMarginBottomMedium; + margin-block-end: $blockMarginBottomMedium; } .yfm-cut.open .yfm-cut-content { @@ -131,11 +131,11 @@ } // Margin collapse is not applied for a block and header with a negative margin. - // The margin is summed up. So, we need to take 15px away from the header margin-top + // The margin is summed up. So, we need to take 15px away from the header margin-block-start h1, h2 { @include fixAnchorPosition(calc(#{$headerMarginTopLarge} - #{$blockMarginBottomMedium})); - margin-bottom: $blockMarginBottomLarge; + margin-block-end: $blockMarginBottomLarge; } h3, @@ -170,8 +170,8 @@ height: 4px; border-radius: 2px; background: var(--g-color-line-generic); - margin-top: 20px; - margin-bottom: 0; + margin-block-start: 20px; + margin-block-end: 0; & + h1, & + h2, From 7dc40a3f4d0e1536668dfdf5598f93dac1a3bd77 Mon Sep 17 00:00:00 2001 From: martyanov-av Date: Tue, 16 Jan 2024 14:40:00 +0300 Subject: [PATCH 4/4] fix: increase postcss stage --- esbuild/build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esbuild/build.js b/esbuild/build.js index 21bdd528..3b85497f 100755 --- a/esbuild/build.js +++ b/esbuild/build.js @@ -37,7 +37,7 @@ async function build({path, format}) { async transform(source) { const {css} = await postcss([ autoprefixer({cascade: false}), - postcssPresetEnv({stage: 0}), + postcssPresetEnv({stage: 3}), ]).process(source, {from: undefined}); return css;