taiga
справочник · разбор

Kitchen sink:
все компоненты темы

проверено на v0.0.1 ~9 мин 915 слов

Полигон всех компонентов темы: по одному экземпляру каждого шорткода, коллаута, блока кода, диаграммы и виджета на одной странице — чтобы правки дизайна было на чём проверять, а автору гайдов было что подсмотреть и скопировать.

#Заголовки и якоря

Второго уровня — с решёткой #, третьего — с ##. Инлайн: курсив, жирный, код, внутренняя ссылка на эталонный гайд.

##Подзаголовок третьего уровня

Проверяем, что render-heading вешает ## и якорь на h3.

#Код

Go подсвечивается сервером (Chroma в цветах палитры):

type Point struct {
	X, Y int64
}
func dist(a, b Point) int64 { return (a.X-b.X)*(a.X-b.X) }

С подписью файла и подсветкой строки ({label=… hl_lines=[2]}):

runtime/malloc.go (упрощено)
func mallocgc(size uintptr) unsafe.Pointer {
	c := getMCache()          // горячий путь — без блокировок
	return c.alloc(size)
}

Остальные подсвеченные языки носят те же роли — синий у структурного имени, медный у числа, свой тон у строк, приглушённый курсив у комментария:

{
  "items": [
    {"price": 123, "shipped": true},
    {"price": 101}  // хвостовой комментарий допустим
  ]
}
export GODEBUG=schedtrace=1000
go build ./... && ./app --addr "$HOST:8080"   # либо всё, либо ничего

Голый забор, text и txt — плоская форма, .nohl: она и нужна выводу команды:

$ go build ./...
ok  taiga/internals  0.312s

#Таблица

Markdown-таблица, обёртку .tbl-wrap вешает render-table:

ТипРазмерВыравнивание
bool11
int6488
[]T248

#Коллауты

Главная мысль

Главная мысль с дефолтным лейблом. Внутри — markdown и код.

Ловушка

Ловушка с дефолтным лейблом.

Под капотом: свой лейбл

Коллаут «под капотом» с переопределённым лейблом.

Историческая сноска

Историческая сноска — самый тихий тип.

Внимание

Внимание — самый громкий тип, красный.

#Fold

Сворачиваемая врезка — значок, заголовок и переключатель; панель выезжает по высоте. title= — инлайновый Markdown, тело — Markdown.

У этого гайда есть также видео-версия. ПодробнееСвернуть

Сначала посмотрите, потом прочитайте для закрепления — что-то нагляднее на экране, что-то лучше усваивается текстом. Ссылка выше открывает видео не сворачивая панель.

Упрощение, сделанное намеренно. ПодробнееСвернуть

На самом деле всё чуть сложнее, но упрощённая модель верна в главном — детали дальше.

Полный листинг, сразу раскрытый. Показать кодСкрыть
func main() { println("hello") }

Примерно за полэкрана текста кат сам меняет регистр: заголовок набирается читательским кеглем, блок получает свой воздух, а панель закрывается явной кнопкой — длинное отступление можно свернуть там, где кончилось чтение. size= задаёт регистр принудительно; здесь — чтобы показать секцию, не вставляя стену текста.

Ликбез: отступление, выросшее в главу РазвернутьСвернуть

Отступление на несколько экранов — уже не сноска, и набирать его двумя кеглями ниже значит наказывать читателя за то, что он открыл: клик — это и есть его согласие читать.

Поэтому раскрытая панель набрана прозой — тем же кеглем и цветом, что статья вокруг, — а «это вставка» говорит структура: строка-заголовок, рельс слева и строка-выход внизу.

Рельс — единственное, что переживает прокрутку. За первым экраном заголовок уже уехал, и линия остаётся единственным признаком того, что вы всё ещё внутри блока, который статья предложила пропустить.

#Термины

Наведи на подчёркнутое слово — определение раскроется карточкой; клик её закрепит, чтобы можно было спокойно читать и уйти по ссылке. Без JavaScript все определения лежат списком в конце страницы, и каждое слово ведёт к своему.

Простейшая форма — слово и определение, тип по умолчанию: у каждого P есть свой mcache, и попадание в него — самый дешёвый путь аллокации.

С ярлыком и цветом типа, и с ссылкой в подвале карточки: компилятор вставляет барьер записи — и именно поэтому у записи указателя цена выше, чем у записи int.

Тело определения проходит тот же конвейер, что и статья, поэтому листинг внутри карточки подсвечен ровно так же, как был бы в прозе: путь пишется как JSON Pointer, а не как путь через точки.

Слово в тексте склоняется, а шапка карточки — нет; для этого title=: данные лежат в кэшах ядра, а не в оперативке.

#Диаграммы

Диаграмма памяти и байтовая лента — сырой HTML через {{< raw >}}:

Point{X, Y int64} → 16 байт, ноль воздуха

#Виджеты

Форма 1 — пустой mount, оживляет Taiga.widget из widgets.js:

Поиграй — жми, число тикает

Форма 2 — mount со статик-фолбэком внутри (виден без JS):

Поиграй — под ним статичная диаграмма
статик-фолбэк
e0

Форма 3 — без id, произвольный HTML прямо в figure:

Поиграй — свой HTML, без mount
произвольная разметка виджета

#Карточка

К эталону → Гайд — это папка Большая CTA-карточка: kicker, заголовок, подпись.

На точном курсоре наведи на любую ссылку ниже — появится карточка-превью: физика терм-карточки, один поповер, собранный из билд-фрагмента (внутренние ссылки) или из пререндеренной карточки (Telegram, YouTube).

Внутренние ссылки открывают окно в страницу: превью целого гайда, якорь на раздел, который сужает карточку до одного раздела, и оглавление серии со списком частей.

Telegram — пост из авторского канала получает карточку, собранную на билде: пост 409 и пост 410. Несуществующий пост деградирует до карточки канала, а чужой канал получает только значок ✈, без карточки.

YouTube — доклад про планировщик Go открывает видео-карточку с превью-кадром, длительностью и числом просмотров.

Обычная внешняя ссылка несёт только значок ↗.

Википедия — work-stealing планировщик и вытесняющая многозадачность открывают карточку-сводку из REST API Wikimedia, со значком W.

Блог Go — превью области видимости переменной цикла и классический error handling in Go открывают карточку с курсивным значком Go, байлайном и зачином поста.

#Рассылка

Блоки подписки — на сайте, где рассылка включена (params.newsletter.enable, см. newsletter.md). За ними в демо нет эндпоинта, поэтому отправка заканчивается состоянием ошибки — на неё как раз и стоит посмотреть.

Срединный блок, поставленный руками, с крестиком (dismiss=), решение по которому запоминается по блоку:

Голая форма для страницы, написанной прозой (newsletter-inline) — тот же компонент, что стоит на странице подписки:

Демо-форма: за ней нет эндпоинта.

Карточка в подвале этой страницы — третий вариант, newsletter-cta; здесь её вставил автоматически placements.articleEnd.