Files
FixIt/layouts/_shortcodes/tabs.html
T
Cell 5f1e79f49c feat(i18n): add RTL support for Arabic, Persian and Urdu (#831)
* feat(i18n): add RTL support and Arabic/Persian translations

- Add `dir` attribute to `<html>` via `.Site.Language.Direction`
- Convert physical CSS properties to logical properties across ~30 SCSS files
- Add `[dir="rtl"]` overrides for elements that need physical direction (code blocks, translate, icons)
- Add `logical-direction.html` template function for config value normalization
- Add RTL-aware deprecation warnings for old "left"/"right" config values
- Rename github corner, TOC position, reading progress config values from "left"/"right" to "start"/"end"
- Add Arabic (ar.toml) and Persian (fa.toml) i18n translation files
- Update multilingual documentation with RTL language configuration guide

* feat(shortcodes): add RTL support for tabs and refactor border-radius mixin

- Rename tabs placement values from "left"/"right" to "start"/"end" with deprecation warnings
- Convert all physical directional properties in tabs SCSS to logical properties
- Add RTL overrides for translate and box-shadow in tabs
- Add "start"/"end" support to border-radius mixin using CSS logical properties
- Refactor fixit-decryptor to use border-radius(start/end) mixin

* feat(assets): add RTL support for toc-dialog slide animation

The mobile toc-dialog always slid in from the right (100vw). In RTL
mode it should slide from the left (-100vw), matching the
border-inline-start/margin-inline-end anchoring.

* feat(assets): add RTL support for post-tag comma separator

* refactor(assets): extract RTL styles into dedicated _rtl.scss

* feat(assets): add RTL support for theme-switch and directional icons

* feat(i18n): add RTL support and improve i18n

- Add RTL typography corrections for Arabic-script languages (:lang(ar/fa/ur))
- Remove fa-list-ol from RTL flip list (numbers get mirrored)
- Add Urdu translation file (i18n/ur.toml)
- Rename noMoretTranslations to noTranslations and simplify all translations
- Update json-viewer-element from 1.0.4 to 1.0.6
- Add RTL test posts (index.en.md, index.ar.md)
- Fix layout partials for RTL support

See https://fixit.lruihao.cn/docs/content-management/introduction/#rtl-language-support
2026-08-24 00:22:34 +08:00

63 lines
2.6 KiB
HTML

{{- /*
Renders a tabbed interface with multiple tabs and their corresponding content.
See https://fixit.lruihao.cn/docs/content-management/shortcodes/extended/tabs/
@param {Int} [defaultTab=0] - The index of the tab to be active by default (0-based)
@param {String} [type="underline"] - The style type of the tabs ("underline", "pill", "card", "segment", etc.)
@param {String} [placement="top"] - The placement of the tabs ("top", "bottom", "start", "end")
Usage:
{{< tabs defaultTab="1" type="card" placement="top" >}}
{{% tab title="Tab 1" %}}
Content for Tab 1
{{% /tab %}}
{{% tab title="Tab 2" %}}
Content for Tab 2
{{% /tab %}}
{{< /tabs >}}
Note: Tabs must be defined using the nested "tab" shortcode within the "tabs" shortcode.
*/ -}}
{{- if ne hugo.Context.MarkupScope "home" -}}
{{- $tabs := .Store.Get "tabs" -}}
{{- if not $tabs -}}
{{- errorf "No tabs found. Please add at least one tab to the tabs shortcode. See %s %s" .Name .Position -}}
{{- end -}}
{{- $lenTabs := len $tabs -}}
{{- $defaultTab := .Get "defaultTab" | default 0 -}}
{{- $type := .Get "type" | default "underline" -}}
{{- $placementRaw := .Get "placement" | default "top" -}}
{{- $placement := $placementRaw -}}
{{- if or (eq $placementRaw "left") (eq $placementRaw "right") -}}
{{- $newVal := cond (eq $placementRaw "left") "start" "end" -}}
{{- warnf "The placement value %q is deprecated, use %q instead. See %s %s" $placementRaw $newVal .Name .Position -}}
{{- $placement = $newVal -}}
{{- end -}}
{{- $placementMap := slice "top" "bottom" "start" "end" -}}
{{- if ge $defaultTab $lenTabs -}}
{{- warnf "The defaultTab value %v is out of range [0, %v]. See %s %s" $defaultTab (sub $lenTabs 1) .Name .Position -}}
{{- $defaultTab = 0 -}}
{{- end -}}
{{- if not (in $placementMap $placement) -}}
{{- warnf "The placement value %q is invalid. Supported values are: %v. See %s %s" $placement (delimit $placementMap ", ") .Name .Position -}}
{{- $placement = "top" -}}
{{- end -}}
{{- /* Tabs Container */ -}}
<div class="shortcode-tabs">
<tab-container default-tab="{{ $defaultTab }}" placement="{{ $placement }}"{{ with $type }} type="{{ . }}"{{ end }}>
{{- range $index, $tab := $tabs -}}
{{- $title := $tab.title | default (printf "Untitled%v" $index) -}}
{{- $id := $tab.id -}}
<button class="tab-button" type="button" role="tab" id="tab-{{ $id }}" aria-selected="{{ eq $index $defaultTab }}">{{ $title | $.Page.RenderString }}</button>
{{- end -}}
{{- .Inner -}}
</tab-container>
</div>
{{- .Page.Store.Set "hasTabs" true -}}
{{- end -}}