Анализ сайта stonehenge.com
Основное Готовность: 100%
Домен
stonehenge.com
Состояние доменного имени
?
Проверяем корректность доменного имени и наличие технических проблем на уровне домена.
Домен второго уровня идеален для продвижения.
Отличный запоминающийся домен.
Ответ сервера
200 Успешный ответ
HTTP-код ответа и цепочка редиректов
?
Код 200 — страница доступна. Коды 3xx — редиректы (цепочки замедляют загрузку и размывают ссылочный вес). Коды 4xx/5xx — ошибки, поисковик не сможет проиндексировать страницу.
Сервер настроен корректно.
Цепочка редиректов:
http://stonehenge.com
301 MovedPermanently
https://stonehenge.com/
200 OK
Безопасность
Сайт безопасен
Использование HTTPS и SSL-сертификат
?
HTTPS — обязательный стандарт. Google и Яндекс отдают предпочтение защищённым сайтам. Отсутствие SSL или просроченный сертификат ведут к предупреждениям в браузере и снижению позиций.
На сайте работает защищенный протокол ssl и сайт открывается по https.
Ssl-сертификат действителен до 08.10.2026 0:33:02.
Сервер поддерживает HTTP/3 (QUIC) — новейший протокол.
Включён HSTS (Strict-Transport-Security) — защита от подмены на http.
HTTP автоматически перенаправляется на HTTPS.
Поздравляем! Сайт не содержится в реестре РКН.
Кодировка
utf-8
Кодировка символов страницы
?
Стандарт — UTF-8. Неправильная кодировка вызывает нечитаемые символы и мешает поисковику корректно распознать текст страницы.
Указана кодировка на странице utf-8.
Язык
Атрибут lang в HTML-теге
?
Атрибут lang (<html lang="ru">) сообщает поисковикам и браузерам, на каком языке написана страница. Помогает при ранжировании в региональном поиске.
Язык страницы не указан. Рекомендуется явно указать язык документа!
Скорость загрузки
~0,45сек
Время отклика сервера (TTFB)
?
Time To First Byte — время до получения первого байта от сервера. Норма до 200 мс. Медленный отклик ухудшает пользовательский опыт и ранжирование: Яндекс и Google учитывают скорость страниц.
Скорость загрузки сайта 0,45сек оптимальна.
Объем документа
60Кб
Размер HTML-кода страницы
?
Слишком большой HTML замедляет парсинг браузером и сканирование поисковым роботом. Рекомендуется не более 200 Кб.
Объем html-документа 60Кб оптимален.
Структура html-документа корректна.
Ресурсы
Ресурсы: 2
Внешние ресурсы страницы (CSS, JS, изображения)
?
Количество и тип подключённых ресурсов влияют на скорость загрузки. Большое число запросов увеличивает время рендеринга страницы.
Кол-во файлов ресурсов 2 достаточно.
Показать полный список ресурсов
| Тип | Название | Значение |
|---|---|---|
| js | https://www.googletagmanager.com/gtag/js?id=G-81KZ9NDMN3 | |
| js | main.client.dart.js |
Серверные заголовки
Кол-во: 11
HTTP-заголовки ответа сервера
?
Заголовки сервера передают браузеру и поисковику служебную информацию: кеширование, безопасность (CSP, HSTS), сжатие (gzip). Правильная настройка ускоряет загрузку и повышает защищённость.
Найдены серверные заголовки 11шт. Подробнее про серверные заголовки.
Показать полный список серверных заголовков
| Ключ | Значение |
|---|---|
| Cache-Control | max-age=3600 |
| ETag | "aa3bd4f63b957d5832d73b83403d74c417e4d26163d844da8dd2691724f78d42" |
| Strict-Transport-Security | max-age=31556926 |
| Accept-Ranges | bytes |
| Date | Sun, 23 Aug 2026 13:24:24 GMT |
| X-Served-By | cache-bma-essb1270041-BMA |
| X-Cache | MISS |
| x-cache-hits | 0 |
| x-timer | S1787491464.296531,VS0,VE104 |
| Vary | x-fh-requested-host |
| Alt-Svc | h3=":443" |
CMS
Не определена
Система управления сайтом (движок)
?
CMS — это движок, на котором работает сайт (WordPress, 1C-Bitrix, Tilda и др.). Знание CMS помогает понять возможности SEO-оптимизации и подобрать подходящие инструменты. «Не определена» — вероятно, самописный сайт или нестандартная сборка.
CMS не определена. Вероятно, сайт самописный либо движок надёжно скрыт. Это не ошибка.
Веб-сервер
Не определён
Программное обеспечение сервера
?
Веб-сервер — это ПО, которое отдаёт страницы посетителям (nginx, Apache, IIS, LiteSpeed и др.). Определяется по серверным заголовкам ответа (Server, X-Powered-By и т.п.). «Не определён» — сервер намеренно скрывает эти заголовки, это нормальная практика безопасности.
Веб-сервер не определён — заголовок Server скрыт. Это не ошибка: часто так настраивают из соображений безопасности.
Мета-теги Готовность: 34%
Title
Stonehenge Consulting Services, Inc.
Заголовок страницы в браузере и поисковой выдаче
?
Title — главный SEO-заголовок страницы. Влияет на CTR в поиске и ранжирование. Оптимальная длина: 50–70 символов. Ключевые слова — ближе к началу.
Необходимо увеличить число символов в title (текущее значение: 36, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.
Description
Worldwide Dart & Flutter Technical Consulting, with a legendary 30-year legacy in Perl Training.
Описание страницы в поисковой выдаче (сниппет)
?
Meta Description — текст под заголовком в выдаче. Напрямую на позиции не влияет, но влияет на CTR. Оптимальная длина: 120–160 символов.
Необходимо увеличить число символов в description (текущее значение: 100, оптимально: от 120 до 130)
Keywords
Dart consulting, Flutter consulting, Perl training, Perl consulting, Randal L. Schwartz, Tom Phoenix
Список ключевых слов страницы (устаревший тег)
?
Meta Keywords не учитывается Яндексом и Google для ранжирования с 2009–2012 годов. Заполнение не обязательно, но не вредит. Конкурент может использовать содержимое для анализа.
Keywords установлены.
Канонический Url
Указывает поисковику основную версию страницы
?
Canonical (rel=canonical) предотвращает проблему дублей страниц. Должен точно совпадать с URL проверяемой страницы. Неправильный canonical может передать ссылочный вес на другую страницу.
Рекомендуем прописать канонический Url.
Robots
Ошибок нет
Директивы для поисковых роботов на уровне страницы
?
Meta Robots управляет индексацией конкретной страницы: index/noindex — индексировать ли, follow/nofollow — следовать ли по ссылкам. Noindex полностью исключает страницу из поиска.
Meta-тег robots не указан. Страница свободна для индексации.
Адаптивность
width=device-width, initial-scale=1.0
Настройка масштабирования на мобильных устройствах
?
Тег viewport (<meta name="viewport">) сообщает браузеру, как масштабировать страницу на мобильных. Стандарт: width=device-width, initial-scale=1. Отсутствие — признак отсутствия мобильной версии.
Meta-тег viewport со значением-константой width=device-width задаёт ширину страницы в соответствии с размером экрана.
Meta-тег viewport со значением initial-scale=1.0 определяет масштаб 1:1, т.е. «не масштабировать».
Разметка OpenGraph
Не найдено
Мета-теги для красивых превью в соцсетях
?
OpenGraph (og:title, og:description, og:image) управляет тем, как страница выглядит при репосте в социальных сетях и мессенджерах. Отсутствие OG-тегов — невзрачный превью при шеринге.
Разметка OpenGraph не задана. Страница не оптимизирована под социальные сети. Мета-теги с разметкой Og помогают социальным роботам лучше структурировать Ваш сайт.
Все мета-теги
Кол-во: 3
Полный список мета-тегов страницы
?
Таблица всех meta-тегов, включая нестандартные. Позволяет найти опечатки, дубли и лишние теги.
Найдены мета-теги 3шт. Мета-теги не видимы для человека и предназначены для обмена информацией между веб-страницей и поисковыми системами, браузерами и другими веб-службами. С ними роботы 🤖 и устройства ведут себя более ожидаемо.
Показать полный список мета-тегов
| Тип | Название | Значение |
|---|---|---|
| name | viewport | width=device-width, initial-scale=1.0 |
| name | description | Worldwide Dart & Flutter Technical Consulting, with a legendary 30-year legacy in Perl Training. |
| name | keywords | Dart consulting, Flutter consulting, Perl training, Perl consulting, Randal L. Schwartz, Tom Phoenix |
Оптимизация Готовность: 82%
Структура
Ошибок нет
Семантические HTML-элементы страницы
?
Проверяет наличие основных структурных элементов: nav, header, footer, main. Корректная семантическая структура помогает поисковику понять архитектуру страницы.
Структура документа корректна (теги <html> и <body> присутствуют в одном экземпляре).
Контент
Есть ошибки
Объём и качество текстового содержимого
?
Анализирует объём полезного текста на странице. Слишком мало — страница может считаться малополезной. Слишком много — ухудшается читаемость и восприятие.
Абзацев с текстом 8 слишком мало. Добавьте больше абзацев с текстом (тег <p>)!
Кол-во слов 272 слишком мало. Добавьте больше текста (минимум 400 слов)!
Слова из title 4 встречаются в тексте достаточно.
Среднее число слов в абзаце 34 достаточно.
Кол-во знаков контента 2056 на странице оптимально.
Заголовки
Ошибок нет
Иерархия заголовков H1–H6
?
H1 должен быть один и содержать ключевой запрос. H2–H6 описывают подразделы. Пропуск уровней (H1 → H3) и несколько H1 — типичные ошибки, снижающие понятность страницы для поисковика.
На странице присутствуют заголовки <h1> 1. Это прекрасно.
На странице присутствуют заголовки <h2> 3. Это хорошо.
На странице присутствуют заголовки <h3> 2.
Тошнота
2,83
Насколько одно слово доминирует в тексте
?
Классическая тошнота = √(частота самого повторяющегося слова). Норма до 7–8: текст воспринимается естественно. Выше — поисковик может счесть страницу переспамленной.
Тошнота страницы в пределах нормы 3.
Академич. тошнота
20,22%
Насколько текст перенасыщен ключевыми словами
?
Академическая тошнота = (частота слова / общее количество слов) × 100%. Показывает долю конкретного слова в тексте. Норма 5–15%.
Академическая тошнота превышает норму 5-15%. Измените текст страницы!
Семантическое ядро
20
Наиболее часто встречающиеся слова на странице
?
Топ слов по частоте использования. Показывает, какие слова доминируют в тексте с точки зрения поисковика.
Контент страницы содержит осмысленный текст и слова.
Показать список слов
| Слово | Кол-во | Частота |
|---|---|---|
| stonehenge | 8 | 2,94% |
| consulting | 7 | 2,57% |
| flutter | 5 | 1,84% |
| legacy | 4 | 1,47% |
| active | 3 | 1,10% |
| reactive | 3 | 1,10% |
| screencast | 3 | 1,10% |
| platforms | 2 | 0,74% |
| technical | 2 | 0,74% |
| randal | 2 | 0,74% |
| schwartz | 2 | 0,74% |
| robust | 2 | 0,74% |
| consult | 2 | 0,74% |
| high-performance | 2 | 0,74% |
| package | 2 | 0,74% |
| management | 2 | 0,74% |
| podcast | 2 | 0,74% |
| training | 2 | 0,74% |
| worldwide | 2 | 0,74% |
| learning | 2 | 0,74% |
Индексация Готовность: 80%
Индексирование
Ошибок нет
Разрешено ли индексирование страницы
?
Проверяет, не закрыта ли страница от индексации через robots.txt, meta robots или X-Robots-Tag. Страница, закрытая от индексации, не появится в поисковой выдаче.
Анкоров на странице 8 оптимально. Поисковые роботы обязательно проиндексируют сайт.
Robots.txt
Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 62297 байт. Загружен за: 0сек.
Проверяемая страница не запрещена в robots.txt.
Robots.txt доступен по постоянному адресу
Цепочка редиректов для файла robots.txt:
http://stonehenge.com/robots.txt
301 MovedPermanently
https://stonehenge.com/robots.txt
200 OK
Показать содержимое robots.txt
<!DOCTYPE html>
<html>
<head>
<base href="/"/>
<meta charset="utf-8"/>
<script src="https://www.googletagmanager.com/gtag/js?id=G-81KZ9NDMN3" async></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-81KZ9NDMN3');
</script>
<script>
(function() {
const savedTheme = localStorage.getItem('theme');
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
if (savedTheme === 'dark' || (!savedTheme && systemPrefersDark)) {
document.documentElement.classList.add('theme-dark');
} else {
document.documentElement.classList.add('theme-light');
}
})();
function toggleTheme() {
const isDark = document.documentElement.classList.contains('theme-dark');
if (isDark) {
document.documentElement.classList.remove('theme-dark');
document.documentElement.classList.add('theme-light');
localStorage.setItem('theme', 'light');
} else {
document.documentElement.classList.remove('theme-light');
document.documentElement.classList.add('theme-dark');
localStorage.setItem('theme', 'dark');
}
}
</script>
<!--$-->
<title>Stonehenge Consulting Services, Inc.</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content="Worldwide Dart & Flutter Technical Consulting, with a legendary 30-year legacy in Perl Training."/>
<meta name="keywords" content="Dart consulting, Flutter consulting, Perl training, Perl consulting, Randal L. Schwartz, Tom Phoenix"/>
<!--/-->
<script src="main.client.dart.js" defer></script>
<style>
@import url(https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600;800&display=swap);
html, body {
width: 100%;
min-height: 100vh;
padding: 0;
margin: 0;
font-family: 'Outfit', sans-serif;
background-color: #09090b;
}
:root {
--bg-color: #030303;
--text-color: #f4f4f5;
--text-muted: #a1a1aa;
--text-dark: #71717a;
--text-heading: #ffffff;
--card-bg: #111115;
--card-bg-darker: #0c0c0e;
--card-bg-lighter: #18181b;
--border-color: #27272a;
--border-muted: rgba(255, 255, 255, 0.04);
--nav-bg: rgba(13, 13, 17, 0.75);
--nav-border: rgba(255, 255, 255, 0.08);
--nav-item-hover-bg: rgba(255, 255, 255, 0.03);
--nav-item-active-bg: rgba(255, 255, 255, 0.06);
--btn-glow-bg: rgba(255, 255, 255, 0.02);
--btn-glow-border: rgba(255, 255, 255, 0.08);
--footer-bg: #09090b;
--footer-border: rgba(255, 255, 255, 0.06);
--footer-border-sub: rgba(255, 255, 255, 0.04);
--footer-bottom-text: #52525b;
--input-bg: #111115;
--input-color: #ffffff;
--input-border: #27272a;
--glow-today: rgba(99, 102, 241, 0.06);
--glow-legacy: rgba(16, 185, 129, 0.06);
--glow-life: rgba(236, 48, 153, 0.05);
--glow-life-purple: rgba(139, 92, 246, 0.05);
--heading-gradient-end: #d4d4d8;
--logo-gradient-end: #e4e4e7;
--background-gradient: radial-gradient(circle at 80% 20%, rgba(99, 102, 241, 0.05) 0%, transparent 40%), radial-gradient(circle at 10% 80%, rgba(16, 185, 129, 0.03) 0%, transparent 50%);
}
html.theme-dark {
--bg-color: #030303;
--text-color: #f4f4f5;
--text-muted: #a1a1aa;
--text-dark: #71717a;
--text-heading: #ffffff;
--card-bg: #111115;
--card-bg-darker: #0c0c0e;
--card-bg-lighter: #18181b;
--border-color: #27272a;
--border-muted: rgba(255, 255, 255, 0.04);
--nav-bg: rgba(13, 13, 17, 0.75);
--nav-border: rgba(255, 255, 255, 0.08);
--nav-item-hover-bg: rgba(255, 255, 255, 0.03);
--nav-item-active-bg: rgba(255, 255, 255, 0.06);
--btn-glow-bg: rgba(255, 255, 255, 0.02);
--btn-glow-border: rgba(255, 255, 255, 0.08);
--footer-bg: #09090b;
--footer-border: rgba(255, 255, 255, 0.06);
--footer-border-sub: rgba(255, 255, 255, 0.04);
--footer-bottom-text: #52525b;
--input-bg: #111115;
--input-color: #ffffff;
--input-border: #27272a;
--glow-today: rgba(99, 102, 241, 0.06);
--glow-legacy: rgba(16, 185, 129, 0.06);
--glow-life: rgba(236, 48, 153, 0.05);
--glow-life-purple: rgba(139, 92, 246, 0.05);
--heading-gradient-end: #d4d4d8;
--logo-gradient-end: #e4e4e7;
--background-gradient: radial-gradient(circle at 80% 20%, rgba(99, 102, 241, 0.05) 0%, transparent 40%), radial-gradient(circle at 10% 80%, rgba(16, 185, 129, 0.03) 0%, transparent 50%);
}
html.theme-light {
--bg-color: #f4f4f5;
--text-color: #18181b;
--text-muted: #52525b;
--text-dark: #71717a;
--text-heading: #09090b;
--card-bg: #ffffff;
--card-bg-darker: #e4e4e7;
--card-bg-lighter: #ffffff;
--border-color: #d4d4d8;
--border-muted: rgba(0, 0, 0, 0.04);
--nav-bg: rgba(244, 244, 245, 0.85);
--nav-border: rgba(0, 0, 0, 0.08);
--nav-item-hover-bg: rgba(0, 0, 0, 0.04);
--nav-item-active-bg: rgba(0, 0, 0, 0.08);
--btn-glow-bg: rgba(0, 0, 0, 0.02);
--btn-glow-border: rgba(0, 0, 0, 0.08);
--footer-bg: #e4e4e7;
--footer-border: rgba(0, 0, 0, 0.06);
--footer-border-sub: rgba(0, 0, 0, 0.04);
--footer-bottom-text: #71717a;
--input-bg: #ffffff;
--input-color: #09090b;
--input-border: #d4d4d8;
--glow-today: rgba(99, 102, 241, 0.03);
--glow-legacy: rgba(16, 185, 129, 0.03);
--glow-life: rgba(236, 48, 153, 0.02);
--glow-life-purple: rgba(139, 92, 246, 0.02);
--heading-gradient-end: #27272a;
--logo-gradient-end: #18181b;
--background-gradient: radial-gradient(circle at 80% 20%, rgba(99, 102, 241, 0.03) 0%, transparent 40%), radial-gradient(circle at 10% 80%, rgba(16, 185, 129, 0.02) 0%, transparent 50%);
}
@media (prefers-color-scheme: light) html:not(.theme-dark) {
--bg-color: #f4f4f5;
--text-color: #18181b;
--text-muted: #52525b;
--text-dark: #71717a;
--text-heading: #09090b;
--card-bg: #ffffff;
--card-bg-darker: #e4e4e7;
--card-bg-lighter: #ffffff;
--border-color: #d4d4d8;
--border-muted: rgba(0, 0, 0, 0.04);
--nav-bg: rgba(244, 244, 245, 0.85);
--nav-border: rgba(0, 0, 0, 0.08);
--nav-item-hover-bg: rgba(0, 0, 0, 0.04);
--nav-item-active-bg: rgba(0, 0, 0, 0.08);
--btn-glow-bg: rgba(0, 0, 0, 0.02);
--btn-glow-border: rgba(0, 0, 0, 0.08);
--footer-bg: #e4e4e7;
--footer-border: rgba(0, 0, 0, 0.06);
--footer-border-sub: rgba(0, 0, 0, 0.04);
--footer-bottom-text: #71717a;
--input-bg: #ffffff;
--input-color: #09090b;
--input-border: #d4d4d8;
--glow-today: rgba(99, 102, 241, 0.03);
--glow-legacy: rgba(16, 185, 129, 0.03);
--glow-life: rgba(236, 48, 153, 0.02);
--glow-life-purple: rgba(139, 92, 246, 0.02);
--heading-gradient-end: #27272a;
--logo-gradient-end: #18181b;
--background-gradient: radial-gradient(circle at 80% 20%, rgba(99, 102, 241, 0.03) 0%, transparent 40%), radial-gradient(circle at 10% 80%, rgba(16, 185, 129, 0.02) 0%, transparent 50%);
}
*, *::before, *::after {
box-sizing: border-box;
}
html, body {
min-height: 100vh;
padding: 0px;
margin: 0px;
color: var(--text-color);
font-family: 'Inter', sans-serif;
background-color: var(--bg-color);
scroll-behavior: smooth;
background-image: var(--background-gradient);
transition: background-color 0.3s ease, color 0.3s ease;
}
.layout-container {
display: flex;
min-height: 100vh;
flex-direction: column;
}
.header-nav {
position: fixed;
top: 0px;
left: 0px;
right: 0px;
transition: all 300ms;
background-color: var(--nav-bg);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--nav-border);
z-index: 1000;
}
.nav-container {
display: flex;
max-width: 1200px;
padding: 0.85rem 2rem;
margin-left: auto;
margin-right: auto;
justify-content: space-between;
align-items: center;
@media (max-width: 768px): flex-direction: column; gap: 1rem; padding: 1rem;;
}
.nav-logo {
display: flex;
align-items: center;
gap: 0.75rem;
text-decoration: none;
}
.logo-graphic {
display: flex;
width: 36px;
height: 36px;
border-radius: 8px;
justify-content: center;
align-items: center;
color: var(--text-heading);
font-size: 1.1rem;
font-weight: 800;
}
.logo-graphic .company-logo {
background: linear-gradient(135deg, #6366f1 0%, #10b981 100%);
box-shadow: 0 4px 12px rgba(99, 102, 241, 0.25);
}
.logo-graphic .personal-logo {
background: linear-gradient(135deg, #ec4899 0%, #8b5cf6 100%);
box-shadow: 0 4px 12px rgba(236, 48, 153, 0.25);
}
.logo-graphic .small-logo {
width: 24px;
height: 24px;
border-radius: 6px;
font-size: 0.8rem;
background: linear-gradient(135deg, #6366f1 0%, #10b981 100%);
}
.logo-text {
font-family: 'Outfit', sans-serif;
font-size: 1.25rem;
font-weight: 800;
letter-spacing: -0.5px;
background: linear-gradient(to right, var(--text-heading), var(--logo-gradient-end));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.nav-links {
display: flex;
align-items: center;
gap: 1.5rem;
@media (max-width: 768px): width: 100%; justify-content: center; gap: 1rem;;
}
.nav-links .nav-item {
padding: 0.5rem 0.75rem;
border-radius: 6px;
transition: all 200ms;
color: var(--text-muted);
font-size: 0.9rem;
font-weight: 500;
text-decoration: none;
}
.nav-links .nav-item:hover {
color: var(--text-heading);
background-color: var(--nav-item-hover-bg);
}
.nav-links .nav-item.active {
color: var(--text-heading);
font-weight: 600;
background-color: var(--nav-item-active-bg);
}
.nav-action {
display: flex;
align-items: center;
gap: 1rem;
@media (max-width: 768px): width: 100%; display: flex; justify-content: center; gap: 1rem;;
}
.theme-toggle-btn {
display: flex;
padding: 8px;
border-radius: 50%;
cursor: pointer;
transition: background-color 200ms;
justify-content: center;
align-items: center;
background: none;
border: none;
outline: none;
}
.theme-toggle-btn:hover {
background-color: var(--nav-item-hover-bg);
}
.theme-toggle-btn .sun-icon {
display: none;
font-size: 1.2rem;
}
.theme-toggle-btn .moon-icon {
display: none;
font-size: 1.2rem;
}
html.theme-light .theme-toggle-btn .moon-icon {
display: block;
}
html.theme-dark .theme-toggle-btn .sun-icon {
display: block;
}
.btn {
display: inline-flex;
padding: 0.5rem 1rem;
border-radius: 8px;
cursor: pointer;
transition: all 200ms;
justify-content: center;
align-items: center;
font-size: 0.88rem;
font-weight: 600;
text-decoration: none;
}
.btn:hover {
text-decoration: none;
}
.btn.btn-primary {
color: #ffffff;
background-color: #10b981;
border: none;
box-shadow: 0 4px 14px rgba(16, 185, 129, 0.25);
}
.btn.btn-primary:hover {
background-color: #059669;
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(16, 185, 129, 0.35);
}
.btn.btn-glow {
border: 1px solid var(--btn-glow-border);
background-color: var(--btn-glow-bg);
}
.btn.btn-personal {
color: #ec4899;
}
.btn.btn-personal:hover {
color: #f472b6;
background-color: rgba(236, 48, 153, 0.08);
border-color: rgba(236, 48, 153, 0.3);
transform: translateY(-2px);
}
.btn.btn-company {
color: #10b981;
}
.btn.btn-company:hover {
color: #34d399;
background-color: rgba(16, 185, 129, 0.08);
border-color: rgba(16, 185, 129, 0.3);
transform: translateY(-2px);
}
.content-panel {
display: flex;
padding: 4rem 2rem;
justify-content: center;
margin-top: 80px;
flex-grow: 1;
@media (max-width: 768px): margin-top: 160px; padding: 2rem 1rem;;
}
.content-wrapper {
display: flex;
width: 100%;
max-width: 1000px;
flex-direction: column;
gap: 3rem;
}
.content-wrapper h1 {
margin-bottom: 1rem;
font-family: 'Outfit', sans-serif;
font-size: 3.25rem;
font-weight: 800;
letter-spacing: -1.5px;
line-height: 1.15em;
background: linear-gradient(to right, var(--text-heading), var(--heading-gradient-end));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
@media (max-width: 768px): font-size: 2.5rem;;
}
.content-wrapper h2 {
margin-top: 2rem;
margin-bottom: 1rem;
color: var(--text-heading);
font-family: 'Outfit', sans-serif;
font-size: 2.15rem;
font-weight: 700;
letter-spacing: -0.5px;
@media (max-width: 768px): font-size: 1.75rem;;
}
.content-wrapper h3 {
margin-top: 1.5rem;
margin-bottom: 0.5rem;
color: var(--text-heading);
font-family: 'Outfit', sans-serif;
font-size: 1.45rem;
font-weight: 700;
letter-spacing: -0.2px;
}
.content-wrapper p {
margin-bottom: 1.25rem;
color: var(--text-muted);
font-size: 1.05rem;
line-height: 1.7em;
}
.content-wrapper a {
transition: color 200ms;
color: #10b981;
text-decoration: none;
}
.content-wrapper a:hover {
color: #34d399;
text-decoration: underline;
}
.footer-panel {
padding: 3.5rem 2rem;
background-color: var(--footer-bg);
margin-top: auto;
border-top: 1px solid var(--footer-border);
}
.footer-content {
display: grid;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
grid-template-columns: 2fr 1fr 1.5fr;
gap: 3rem;
@media (max-width: 1024px): grid-template-columns: 1fr; gap: 2.5rem;;
}
.footer-brand {
display: flex;
flex-direction: column;
gap: 1rem;
}
.footer-logo {
display: flex;
align-items: center;
color: var(--text-heading);
font-size: 1.15rem;
font-weight: bold;
gap: 0.5rem;
}
.footer-tagline {
margin: 0;
color: var(--text-dark);
font-size: 0.9rem;
line-height: 1.5em;
}
.footer-section-title {
color: var(--text-heading);
font-size: 0.75rem;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 1px;
display: block;
margin-bottom: 1rem;
}
.footer-address, .footer-contact p {
margin: 0;
color: var(--text-dark);
font-size: 0.88rem;
line-height: 1.6em;
}
.footer-email {
color: #10b981;
font-weight: 600;
display: inline-block;
margin-top: 0.5rem;
text-decoration: none !important;
}
.footer-email:hover {
color: #34d399;
}
.footer-bottom {
max-width: 1200px;
padding-top: 1.5rem;
margin-top: 3rem;
margin-left: auto;
margin-right: auto;
text-align: center;
border-top: 1px solid var(--footer-border-sub);
}
.footer-bottom p {
margin: 0;
color: var(--footer-bottom-text);
font-size: 0.8rem;
}
.home-container {
display: flex;
flex-direction: column;
gap: 5rem;
--service-today-gradient-end: #a5b4fc;
--service-legacy-gradient-end: #a7f3d0;
}
html.theme-light .home-container {
--service-today-gradient-end: #4f46e5;
--service-legacy-gradient-end: #059669;
}
@media (prefers-color-scheme: light) html:not(.theme-dark) .home-container {
--service-today-gradient-end: #4f46e5;
--service-legacy-gradient-end: #059669;
}
.home-hero {
display: flex;
margin-top: 2.5rem;
margin-bottom: 1rem;
flex-direction: column;
align-items: center;
text-align: center;
gap: 1rem;
}
.home-hero .hero-sub {
max-width: 820px;
margin-left: auto;
margin-right: auto;
color: var(--text-muted);
font-size: 1.25rem;
line-height: 1.75em;
}
.badge-glow-green {
padding: 0.25rem 0.75rem;
border-radius: 20px;
color: #10b981;
font-size: 0.75rem;
font-weight: bold;
background-color: rgba(16, 185, 129, 0.08);
border: 1px solid rgba(16, 185, 129, 0.25);
letter-spacing: 1.5px;
text-transform: uppercase;
box-shadow: 0 0 15px rgba(16, 185, 129, 0.15);
}
.split-services-section {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
@media (max-width: 1024px): grid-template-columns: 1fr;;
}
.service-column {
display: flex;
position: relative;
padding: 3rem;
border-radius: 24px;
overflow: hidden;
flex-direction: column;
background-color: var(--card-bg);
border: 1px solid var(--border-muted);
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
@media (max-width: 768px): padding: 2rem 1.5rem;;
}
.service-glow-layer {
position: absolute;
top: 0px;
left: 0px;
bottom: 0px;
right: 0px;
pointer-events: none;
}
.service-glow-layer.today-glow {
background: radial-gradient(circle at 10% 20%, var(--glow-today) 0%, transparent 60%);
}
.service-glow-layer.legacy-glow {
background: radial-gradient(circle at 90% 80%, var(--glow-legacy) 0%, transparent 60%);
}
.service-content {
display: flex;
position: relative;
flex-direction: column;
z-index: 10;
flex-grow: 1;
}
.service-content h2 {
margin-bottom: 0.25rem;
color: var(--text-dark);
font-size: 1.15rem;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 1px;
}
.service-content .service-headline {
margin-bottom: 1.25rem;
font-family: 'Outfit', sans-serif;
font-size: 2.15rem;
font-weight: 800;
letter-spacing: -1px;
}
.service-content p {
margin-bottom: 1.5rem;
color: var(--text-muted);
font-size: 1.05rem;
line-height: 1.65em;
}
.service-content ul {
display: flex;
padding: 0px;
margin-bottom: 2.5rem;
flex-direction: column;
list-style-type: none;
gap: 1rem;
flex-grow: 1;
}
.service-content ul li {
position: relative;
padding-left: 1.5rem;
color: var(--text-muted);
font-size: 0.95rem;
line-height: 1.6em;
}
.service-content ul li::before {
position: absolute;
top: 0px;
left: 0px;
font-weight: bold;
content: "✓";
}
.service-content ul li strong {
color: var(--text-heading);
font-weight: 600;
}
.service-content .service-btn {
align-self: flex-start;
width: auto;
}
.today-column h3 {
background: linear-gradient(to right, var(--text-heading), var(--service-today-gradient-end));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.legacy-column h3 {
background: linear-gradient(to right, var(--text-heading), var(--service-legacy-gradient-end));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.today-column ul li::before {
color: #6366f1;
}
.legacy-column ul li::before {
color: #10b981;
}
.service-badge {
padding: 0.2rem 0.6rem;
margin-bottom: 1rem;
border-radius: 10px;
align-self: flex-start;
font-size: 0.7rem;
font-weight: bold;
}
.service-badge.badge-today {
color: #6366f1;
background-color: rgba(99, 102, 241, 0.08);
border: 1px solid rgba(99, 102, 241, 0.2);
}
.service-badge.badge-legacy {
color: #10b981;
background-color: rgba(16, 185, 129, 0.08);
border: 1px solid rgba(16, 185, 129, 0.2);
}
.home-books-section {
display: flex;
flex-direction: column;
gap: 2rem;
}
.books-header {
text-align: center;
}
.books-header h2 {
margin: 0;
}
.books-header p {
margin-top: 0.5rem;
color: var(--text-dark);
}
.books-scroller {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 2rem;
}
.mini-book-card {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.75rem;
}
.mini-book-card .mini-cover {
height: 120px;
border-radius: 4px;
box-shadow: 0 8px 16px rgba(0,0,0,0.25);
transition: transform 0.2s ease;
}
.mini-book-card .mini-cover:hover {
transform: scale(1.06);
}
.mini-book-card .mini-title {
color: var(--text-muted);
font-size: 0.85rem;
font-weight: 600;
}
.legacy-container {
display: flex;
padding-bottom: 5rem;
flex-direction: column;
gap: 4.5rem;
}
.legacy-hero {
display: flex;
margin-top: 2.5rem;
flex-direction: column;
align-items: center;
text-align: center;
gap: 1rem;
}
.legacy-hero .lead {
max-width: 760px;
margin-left: auto;
margin-right: auto;
color: var(--text-muted);
font-size: 1.25rem;
line-height: 1.7em;
}
.badge-glow {
padding: 0.25rem 0.75rem;
border-radius: 20px;
color: #10b981;
font-size: 0.75rem;
font-weight: bold;
background-color: rgba(16, 185, 129, 0.08);
border: 1px solid rgba(16, 185, 129, 0.25);
letter-spacing: 1.5px;
text-transform: uppercase;
box-shadow: 0 0 15px rgba(16, 185, 129, 0.15);
}
.section-accomplishments {
display: flex;
flex-direction: column;
gap: 2rem;
}
.section-accomplishments h2 {
margin: 0;
text-align: center;
}
.accomplishments-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
}
.accomplishment-card {
padding: 2rem;
border-radius: 16px;
transition: all 200ms;
background-color: var(--card-bg);
border: 1px solid var(--border-muted);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);
}
.accomplishment-card:hover {
transform: translateY(-4px);
border-color: rgba(16, 185, 129, 0.3);
box-shadow: 0 12px 30px rgba(16, 185, 129, 0.06);
}
.accomplishment-card .card-icon {
margin-bottom: 1rem;
font-size: 2.25rem;
}
.accomplishment-card h3 {
margin-bottom: 0.5rem;
color: var(--text-heading);
font-size: 1.25rem;
font-weight: 700;
}
.accomplishment-card p {
margin: 0;
color: var(--text-muted);
font-size: 0.95rem;
line-height: 1.6em;
}
.section-books {
display: flex;
flex-direction: column;
gap: 1rem;
}
.section-books h2 {
margin: 0;
text-align: center;
}
.section-books .section-sub {
margin-bottom: 2rem;
color: var(--text-dark);
text-align: center;
font-size: 1.05rem;
}
.books-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1.5rem;
}
.book-card {
display: flex;
border-radius: 16px;
overflow: hidden;
flex-direction: column;
background-color: var(--card-bg);
border: 1px solid var(--border-muted);
}
.book-card .book-cover-wrapper {
display: flex;
height: 200px;
padding: 1.5rem;
justify-content: center;
align-items: center;
background-color: var(--btn-glow-bg);
border-bottom: 1px solid var(--border-muted);
}
.book-card .book-cover {
max-width: 100%;
max-height: 100%;
border-radius: 4px;
object-fit: contain;
box-shadow: 0 8px 20px rgba(0,0,0,0.25);
}
.book-card .book-info {
display: flex;
padding: 1.5rem;
flex-direction: column;
flex-grow: 1;
}
.book-card .book-info h3 {
margin-bottom: 0.5rem;
color: var(--text-heading);
font-size: 1.15rem;
font-weight: bold;
}
.book-card .book-info p {
margin: 0;
color: var(--text-muted);
font-size: 0.88rem;
line-height: 1.5em;
}
.cta-portal-section {
margin-top: 2rem;
}
.cta-portal-card {
position: relative;
padding: 3rem;
border-radius: 24px;
overflow: hidden;
background-color: var(--card-bg);
border: 1px solid rgba(16, 185, 129, 0.15);
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
@media (max-width: 768px): padding: 2rem 1.5rem;;
}
.cta-portal-card .cta-glow-bg {
position: absolute;
top: 0px;
left: 0px;
bottom: 0px;
right: 0px;
background: radial-gradient(circle at 80% 80%, var(--glow-legacy) 0%, transparent 60%), radial-gradient(circle at 10% 20%, var(--glow-today) 0%, transparent 60%);
pointer-events: none;
}
.cta-portal-card .cta-content {
display: flex;
position: relative;
flex-direction: column;
align-items: center;
text-align: center;
gap: 1.25rem;
z-index: 10;
}
.cta-portal-card .cta-badge {
padding: 0.2rem 0.6rem;
border-radius: 10px;
color: #6366f1;
font-size: 0.7rem;
font-weight: bold;
background-color: rgba(99, 102, 241, 0.08);
border: 1px solid rgba(99, 102, 241, 0.2);
letter-spacing: 1px;
}
.cta-portal-card h3 {
margin: 0;
color: var(--text-heading);
font-family: 'Outfit', sans-serif;
font-size: 1.85rem;
font-weight: 800;
letter-spacing: -0.5px;
}
.cta-portal-card p {
max-width: 680px;
margin: 0;
color: var(--text-muted);
font-size: 1.05rem;
line-height: 1.65em;
}
.cta-portal-card .cta-btn {
display: inline-flex;
margin-top: 0.5rem;
align-items: center;
gap: 0.5rem;
}
.columns-container {
padding-bottom: 4rem;
}
.search-filter-panel {
display: flex;
margin-top: 2rem;
margin-bottom: 3rem;
flex-direction: column;
gap: 1.5rem;
}
.search-box-wrapper {
display: flex;
position: relative;
width: 100%;
align-items: center;
}
.search-box-wrapper .search-input {
width: 100%;
padding: 1rem 3rem;
border-radius: 12px;
transition: all 200ms;
color: var(--input-color);
font-size: 1.1rem;
font-weight: 400;
background-color: var(--input-bg);
border: 1px solid var(--input-border);
outline: none;
padding-left: 3.25rem;
}
.search-box-wrapper .search-input:focus {
border-color: #6366f1;
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2);
}
.search-box-wrapper .search-icon {
display: flex;
position: absolute;
left: 1.25rem;
pointer-events: none;
align-items: center;
color: var(--text-dark);
}
.pub-tabs-wrapper {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
.pub-tabs-wrapper .pub-tab-btn {
padding: 0.5rem 1rem;
border-radius: 8px;
cursor: pointer;
transition: all 200ms;
color: var(--text-muted);
font-size: 0.95rem;
font-weight: 600;
background-color: var(--card-bg);
border: 1px solid var(--border-color);
outline: none;
}
.pub-tabs-wrapper .pub-tab-btn:hover {
color: var(--text-heading);
border-color: var(--text-muted);
}
.pub-tabs-wrapper .pub-tab-btn.active {
color: #ffffff;
background-color: #6366f1;
border-color: #6366f1;
}
.columns-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
}
.column-card {
display: flex;
padding: 1.5rem;
border-radius: 12px;
transition: all 200ms;
flex-direction: column;
background-color: var(--card-bg);
border: 1px solid var(--border-color);
box-shadow: 0 4px 6px -1px rgba(0,0,0,0.05), 0 2px 4px -1px rgba(0,0,0,0.03);
}
.column-card:hover {
transform: translateY(-4px);
border-color: var(--text-muted);
box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -2px rgba(0,0,0,0.05);
}
.column-card .card-meta {
display: flex;
margin-bottom: 1rem;
justify-content: space-between;
align-items: center;
}
.column-card .pub-badge {
color: #818cf8;
font-size: 0.8rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.column-card .date-badge {
color: var(--text-dark);
font-size: 0.85rem;
}
.column-card .card-title {
margin: 0;
color: var(--text-heading);
font-size: 1.25rem;
font-weight: 700;
line-height: 1.4em;
flex-grow: 1;
}
.column-card .card-actions {
display: flex;
margin-top: 1.5rem;
gap: 0.75rem;
}
.column-card .card-btn {
padding: 0.5rem 1rem;
border-radius: 6px;
transition: all 200ms;
font-size: 0.9rem;
font-weight: 600;
text-decoration: none !important;
display: inline-flex;
align-items: center;
}
.column-card .read-btn {
color: #ffffff;
background-color: #6366f1;
}
.column-card .read-btn:hover {
background-color: #4f46e5;
}
.column-card .code-btn {
color: #10b981;
background-color: rgba(16, 185, 129, 0.1);
border: 1px solid rgba(16, 185, 129, 0.2);
}
.column-card .code-btn:hover {
background-color: rgba(16, 185, 129, 0.2);
}
.loading-state, .empty-state, .error-state {
display: flex;
padding-top: 4rem;
padding-bottom: 4rem;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
}
.spinner {
width: 40px;
height: 40px;
border-radius: 50%;
border: 3px solid rgba(99, 102, 241, 0.1);
border-top-color: #6366f1;
animation: spin 1s linear infinite;
}
.retry-btn {
padding: 0.5rem 1rem;
border-radius: 6px;
cursor: pointer;
color: #ffffff;
font-size: 0.95rem;
font-weight: 600;
background-color: #ef4444;
border: none;
outline: none;
}
.personal-container {
display: flex;
flex-direction: column;
gap: 4.5rem;
}
.personal-hero {
display: flex;
margin-top: 2.5rem;
margin-bottom: 1rem;
flex-direction: column;
align-items: center;
text-align: center;
gap: 1rem;
}
.personal-hero .hero-sub {
max-width: 780px;
margin-left: auto;
margin-right: auto;
color: #a1a1aa;
font-size: 1.25rem;
line-height: 1.7em;
}
.badge-glow-pink {
padding: 0.25rem 0.75rem;
border-radius: 20px;
color: #ec4899;
font-size: 0.75rem;
font-weight: bold;
background-color: rgba(236, 48, 153, 0.08);
border: 1px solid rgba(236, 48, 153, 0.25);
letter-spacing: 1.5px;
text-transform: uppercase;
box-shadow: 0 0 15px rgba(236, 48, 153, 0.15);
}
.archive-cta-section {
display: flex;
justify-content: center;
}
.archive-cta-card {
position: relative;
width: 100%;
padding: 3rem;
border-radius: 24px;
overflow: hidden;
background-color: #0c0c0e;
border: 1px solid rgba(236, 48, 153, 0.15);
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.5);
@media (max-width: 768px): padding: 2rem 1.5rem;;
}
.archive-cta-card .glow-layer {
position: absolute;
top: 0px;
left: 0px;
bottom: 0px;
right: 0px;
background: radial-gradient(circle at 90% 80%, rgba(236, 48, 153, 0.05) 0%, transparent 60%), radial-gradient(circle at 10% 20%, rgba(139, 92, 246, 0.05) 0%, transparent 60%);
pointer-events: none;
}
.archive-cta-card .archive-content {
display: flex;
position: relative;
flex-direction: column;
align-items: center;
text-align: center;
gap: 1.25rem;
z-index: 10;
}
.archive-cta-card .archive-badge {
padding: 0.2rem 0.6rem;
border-radius: 10px;
color: #ec4899;
font-size: 0.7rem;
font-weight: bold;
background-color: rgba(236, 48, 153, 0.08);
border: 1px solid rgba(236, 48, 153, 0.2);
}
.archive-cta-card h2 {
margin: 0;
color: #ffffff;
font-family: 'Outfit', sans-serif;
font-size: 2.15rem;
font-weight: 800;
letter-spacing: -1px;
}
.archive-cta-card p {
max-width: 720px;
margin: 0;
color: #a1a1aa;
font-size: 1.05rem;
line-height: 1.65em;
}
.archive-cta-card .archive-btn {
margin-top: 0.5rem;
}
.archive-cta-card .btn-pink {
color: #ffffff;
background-color: #ec4899;
border: none;
box-shadow: 0 4px 14px rgba(236, 48, 153, 0.25);
}
.archive-cta-card .btn-pink:hover {
background-color: #db2777;
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(236, 48, 153, 0.35);
}
.personal-activities-section, .trivia-section {
display: flex;
flex-direction: column;
gap: 2rem;
}
.personal-activities-section, .trivia-section .section-title {
margin: 0;
text-align: center;
}
.activities-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1.5rem;
}
.activity-card {
display: flex;
padding: 1.75rem;
border-radius: 16px;
transition: all 200ms;
flex-direction: column;
background-color: #0c0c0e;
border: 1px solid rgba(255, 255, 255, 0.04);
}
.activity-card:hover {
transform: translateY(-4px);
border-color: rgba(236, 48, 153, 0.3);
box-shadow: 0 12px 30px rgba(236, 48, 153, 0.05);
}
.activity-card .activity-header {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 1rem;
}
.activity-card .activity-icon {
font-size: 1.75rem;
}
.activity-card h3 {
margin: 0;
color: #ffffff;
font-size: 1.15rem;
font-weight: bold;
}
.activity-card p {
margin-bottom: 1rem;
color: #8e8e93;
font-size: 0.92rem;
line-height: 1.6em;
flex-grow: 1;
}
.activity-card .activity-link {
align-self: flex-start;
color: #ec4899;
font-size: 0.88rem;
font-weight: 600;
text-decoration: none;
}
.activity-card .activity-link:hover {
color: #f472b6;
text-decoration: underline;
}
.trivia-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
}
.trivia-card {
padding: 2rem;
border-radius: 16px;
background-color: #0c0c0e;
border: 1px solid rgba(255, 255, 255, 0.04);
}
.trivia-card h3 {
margin-bottom: 1rem;
color: #ffffff;
font-size: 1.25rem;
font-weight: bold;
}
.trivia-card p {
margin-bottom: 1rem;
color: #8e8e93;
font-size: 0.95rem;
line-height: 1.65em;
display: inline;
}
.trivia-card .highlight-quote {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
color: #ffffff;
font-size: 1.05rem;
font-weight: 600;
display: inline;
}
.trivia-card a {
color: #ec4899;
font-weight: 600;
display: inline;
}
.trivia-card a:hover {
color: #f472b6;
}
.life-container {
display: flex;
padding-bottom: 4rem;
flex-direction: column;
gap: 3rem;
}
.life-hero {
position: relative;
width: 100%;
padding: 3rem;
border-radius: 24px;
overflow: hidden;
background-color: var(--card-bg);
border: 1px solid rgba(236, 48, 153, 0.2);
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
@media (max-width: 768px): padding: 2rem 1.5rem;;
}
.life-hero .glow-layer {
position: absolute;
top: 0px;
left: 0px;
bottom: 0px;
right: 0px;
background: radial-gradient(circle at 10% 20%, var(--glow-life) 0%, transparent 60%), radial-gradient(circle at 90% 80%, var(--glow-life-purple) 0%, transparent 60%);
pointer-events: none;
}
.life-hero .hero-content {
display: flex;
position: relative;
flex-direction: column;
align-items: center;
text-align: center;
gap: 1.25rem;
z-index: 10;
}
.life-hero .hero-badge {
padding: 0.25rem 0.75rem;
border-radius: 20px;
color: #ec4899;
font-size: 0.75rem;
font-weight: bold;
background-color: rgba(236, 48, 153, 0.08);
border: 1px solid rgba(236, 48, 153, 0.25);
letter-spacing: 1.5px;
text-transform: uppercase;
box-shadow: 0 0 15px rgba(236, 48, 153, 0.15);
}
.life-hero h1 {
margin: 0;
color: var(--text-heading);
font-family: 'Outfit', sans-serif;
font-size: 2.5rem;
font-weight: 800;
letter-spacing: -1px;
}
.life-hero p {
max-width: 800px;
margin: 0;
color: var(--text-muted);
font-size: 1.1rem;
line-height: 1.7em;
}
.search-filter-panel {
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.search-box-wrapper {
display: flex;
position: relative;
width: 100%;
align-items: center;
}
.search-box-wrapper .search-input {
width: 100%;
padding: 1rem 3rem;
border-radius: 12px;
transition: all 200ms;
color: var(--input-color);
font-size: 1.1rem;
font-weight: 400;
background-color: var(--input-bg);
border: 1px solid var(--input-border);
outline: none;
padding-left: 3.25rem;
}
.search-box-wrapper .search-input:focus {
border-color: #ec4899;
box-shadow: 0 0 0 3px rgba(236, 48, 153, 0.2);
}
.search-box-wrapper .search-icon {
display: flex;
position: absolute;
left: 1.25rem;
pointer-events: none;
align-items: center;
color: var(--text-dark);
}
.category-tabs-wrapper {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
.category-tabs-wrapper .cat-tab-btn {
padding: 0.5rem 1.25rem;
border-radius: 8px;
cursor: pointer;
transition: all 200ms;
color: var(--text-muted);
font-size: 0.95rem;
font-weight: 600;
text-decoration: none;
background-color: var(--card-bg);
border: 1px solid var(--border-color);
outline: none;
}
.category-tabs-wrapper .cat-tab-btn:hover {
color: var(--text-heading);
border-color: var(--text-muted);
}
.category-tabs-wrapper .cat-tab-btn.active {
color: #ffffff;
background-color: #ec4899;
border-color: #ec4899;
box-shadow: 0 4px 14px rgba(236, 48, 153, 0.2);
}
.cards-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
}
.entity-card {
display: flex;
padding: 1.75rem;
border-radius: 16px;
transition: all 200ms;
flex-direction: column;
text-decoration: none;
background-color: var(--card-bg);
border: 1px solid var(--border-color);
box-shadow: 0 4px 6px -1px rgba(0,0,0,0.05);
}
.entity-card:hover {
transform: translateY(-4px);
border-color: rgba(236, 48, 153, 0.4);
box-shadow: 0 12px 30px rgba(236, 48, 153, 0.06);
}
.entity-card:hover .read-link {
color: #f472b6;
text-decoration: underline;
}
.entity-card .card-header-meta {
display: flex;
margin-bottom: 1rem;
justify-content: space-between;
align-items: center;
}
.entity-card .ns-badge {
padding: 0.2rem 0.6rem;
border-radius: 6px;
font-size: 0.75rem;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.entity-card .badge-person {
color: #3b82f6;
background-color: rgba(59, 130, 246, 0.1);
}
.entity-card .badge-event {
color: #ec4899;
background-color: rgba(236, 48, 153, 0.1);
}
.entity-card .badge-book {
color: #10b981;
background-color: rgba(16, 185, 129, 0.1);
}
.entity-card .badge-company {
color: #f59e0b;
background-color: rgba(245, 158, 11, 0.1);
}
.entity-card .badge-place {
color: #8b5cf6;
background-color: rgba(139, 92, 246, 0.1);
}
.entity-card .badge-default {
color: var(--text-muted);
background-color: rgba(113, 113, 122, 0.1);
}
.entity-card .date-label {
color: var(--text-dark);
font-size: 0.85rem;
}
.entity-card .entity-title {
margin-bottom: 0.75rem;
color: var(--text-heading);
font-size: 1.35rem;
font-weight: bold;
}
.entity-card .entity-snippet {
margin-bottom: 1.5rem;
color: var(--text-muted);
font-size: 0.92rem;
line-height: 1.6em;
flex-grow: 1;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.entity-card .read-link {
align-self: flex-start;
color: #ec4899;
font-size: 0.9rem;
font-weight: bold;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 4px;
}
.entity-card .read-link:hover {
color: #f472b6;
text-decoration: underline;
}
.timeline-wrapper {
position: relative;
width: 100%;
max-width: 800px;
padding-top: 2rem;
padding-bottom: 2rem;
margin-left: auto;
margin-right: auto;
box-sizing: border-box;
&::before: content: ''; position: absolute; left: 18px; top: 0; bottom: 0; width: 2px; background: rgba(236, 48, 153, 0.25);;
}
.timeline-item {
position: relative;
width: 100%;
padding-left: 3rem;
margin-bottom: 3rem;
box-sizing: border-box;
&:last-child: margin-bottom: 0;;
}
.timeline-item .timeline-dot {
position: absolute;
top: 4px;
left: 9px;
width: 20px;
height: 20px;
border-radius: 50%;
background-color: var(--bg-color);
border: 4px solid #ec4899;
box-shadow: 0 0 10px rgba(236, 48, 153, 0.5);
z-index: 2;
}
.timeline-item .timeline-card {
display: flex;
width: 100%;
padding: 1.75rem;
border-radius: 16px;
flex-direction: column;
text-decoration: none;
background-color: var(--card-bg);
border: 1px solid var(--border-color);
box-shadow: 0 4px 6px -1px rgba(0,0,0,0.05);
transition: all 0.2s ease;
box-sizing: border-box;
}
.timeline-item .timeline-card:hover {
border-color: rgba(236, 48, 153, 0.3);
box-shadow: 0 10px 20px rgba(236, 48, 153, 0.05);
transform: translateY(-4px);
}
.timeline-item .timeline-card:hover .read-link {
color: #f472b6;
text-decoration: underline;
}
.timeline-item .timeline-date {
color: #ec4899;
font-size: 0.85rem;
font-weight: bold;
letter-spacing: 0.5px;
}
.timeline-item .timeline-title {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
color: var(--text-heading);
font-size: 1.4rem;
font-weight: bold;
}
.timeline-item .timeline-desc {
margin-bottom: 1.25rem;
color: var(--text-muted);
font-size: 0.95rem;
line-height: 1.6em;
}
.empty-state {
padding-top: 4rem;
padding-bottom: 4rem;
color: var(--text-dark);
text-align: center;
font-size: 1.1rem;
}
.logseq-page-container {
display: flex;
flex-direction: column;
gap: 2rem;
}
.logseq-back-nav a {
display: inline-flex;
color: #ec4899;
font-weight: bold;
text-decoration: none;
align-items: center;
}
.logseq-back-nav a:hover {
color: #f472b6;
text-decoration: underline;
}
.logseq-back-nav .nav-arrow {
margin-right: 6px;
}
.logseq-page-header {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.75rem;
}
.logseq-page-header .logseq-namespace-badge {
padding: 0.25rem 0.6rem;
border-radius: 6px;
font-size: 0.75rem;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.logseq-page-header .badge-person {
color: #3b82f6;
background-color: rgba(59, 130, 246, 0.1);
}
.logseq-page-header .badge-event {
color: #ec4899;
background-color: rgba(236, 48, 153, 0.1);
}
.logseq-page-header .badge-book {
color: #10b981;
background-color: rgba(16, 185, 129, 0.1);
}
.logseq-page-header .badge-company {
color: #f59e0b;
background-color: rgba(245, 158, 11, 0.1);
}
.logseq-page-header .badge-place {
color: #8b5cf6;
background-color: rgba(139, 92, 246, 0.1);
}
.logseq-page-header .badge-default {
color: var(--text-muted);
background-color: rgba(113, 113, 122, 0.1);
}
.logseq-page-header h1 {
margin: 0;
color: var(--text-heading);
font-family: 'Outfit', sans-serif;
font-size: 2.5rem;
font-weight: 800;
letter-spacing: -1px;
}
.logseq-metadata-panel {
display: flex;
padding: 1rem 1.25rem;
border-radius: 12px;
flex-direction: column;
background-color: var(--card-bg);
border: 1px solid var(--border-color);
gap: 0.6rem;
}
.logseq-metadata-panel .metadata-row {
display: flex;
flex-wrap: wrap;
font-size: 0.92rem;
gap: 0.5rem;
}
.logseq-metadata-panel .metadata-label {
min-width: 100px;
color: var(--text-dark);
font-weight: bold;
}
.logseq-metadata-panel .metadata-value {
color: var(--text-muted);
a: color: #ec4899; text-decoration: none; font-weight: 600;;
a:hover: text-decoration: underline; color: #f472b6;;
}
.logseq-page-body {
color: var(--text-muted);
font-size: 1.05rem;
line-height: 1.7em;
}
.logseq-page-body ul {
padding-left: 1.75rem;
margin-bottom: 1rem;
}
.logseq-page-body li {
padding-top: 0.35rem;
padding-bottom: 0.35rem;
}
.logseq-page-body li::marker {
color: #ec4899;
}
.logseq-page-body li.heading-block {
list-style-type: none;
padding-left: 0;
margin-top: 1.75rem;
}
.logseq-page-body h2, h3, h4 {
margin-top: 1.75rem;
margin-bottom: 0.75rem;
color: var(--text-heading);
font-family: 'Outfit', sans-serif;
font-weight: bold;
}
.logseq-page-body h2 {
font-size: 1.5rem;
letter-spacing: -0.5px;
}
.logseq-page-body h3 {
font-size: 1.25rem;
}
.logseq-page-body h4 {
font-size: 1.1rem;
}
.logseq-page-body strong {
color: var(--text-heading);
font-weight: 700;
}
.logseq-page-body code {
padding: 0.15rem 0.4rem;
border-radius: 4px;
color: #ec4899;
font-size: 0.9rem;
background-color: var(--card-bg-lighter);
border: 1px solid var(--border-color);
}
.logseq-page-body blockquote {
padding: 0.6rem 1rem;
margin: 0.75rem 0;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
color: var(--text-muted);
font-size: 1rem;
background-color: var(--card-bg-lighter);
border-left: 4px solid #ec4899;
font-style: italic;
}
.logseq-page-body a {
color: #ec4899;
font-weight: 600;
text-decoration: none;
}
.logseq-page-body a:hover {
color: #f472b6;
text-decoration: underline;
}
.logseq-backlinks-section {
padding-top: 2rem;
margin-top: 2rem;
border-top: 1px solid var(--border-color);
}
.logseq-backlinks-section h3 {
margin-bottom: 1.25rem;
color: var(--text-heading);
font-family: 'Outfit', sans-serif;
font-size: 1.35rem;
font-weight: bold;
letter-spacing: -0.2px;
}
.logseq-backlinks-section .backlinks-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 0.75rem;
}
.logseq-backlinks-section .backlink-card {
display: flex;
padding: 0.75rem 1rem;
border-radius: 10px;
transition: all 200ms;
text-decoration: none;
background-color: var(--card-bg);
border: 1px solid var(--border-color);
gap: 0.75rem;
align-items: center;
}
.logseq-backlinks-section .backlink-card:hover {
border-color: rgba(236, 48, 153, 0.4);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(236, 48, 153, 0.05);
}
.logseq-backlinks-section .backlink-icon {
color: #ec4899;
font-size: 0.9rem;
}
.logseq-backlinks-section .backlink-title {
transition: color 200ms;
color: var(--text-muted);
font-size: 0.92rem;
font-weight: 600;
}
.logseq-backlinks-section .backlink-card:hover .backlink-title {
color: var(--text-heading);
}
.logseq-disclaimer {
padding-top: 1.5rem;
color: var(--text-dark);
text-align: center;
font-size: 0.85rem;
line-height: 1.5em;
border-top: 1px solid var(--border-muted);
margin-top: 2.5rem;
a: color: #ec4899; text-decoration: none; font-weight: bold;;
a:hover: text-decoration: underline; color: #f472b6;;
}
.redirect-container {
display: flex;
min-height: 60vh;
justify-content: center;
align-items: center;
}
.redirect-card {
padding: 3rem;
border-radius: 16px;
text-align: center;
background-color: #0c0c0e;
border: 1px solid rgba(255, 255, 255, 0.08);
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
}
.redirect-card h1 {
margin-bottom: 1rem;
color: #ffffff;
font-size: 2rem;
}
.redirect-card p {
margin-bottom: 1.5rem;
color: #a1a1aa;
font-size: 1.15rem;
}
.redirect-card p a {
color: #6366f1;
text-decoration: none;
}
.redirect-card p a:hover {
text-decoration: underline;
}
.redirect-card .redirect-sub {
margin: 0;
color: #71717a;
font-size: 0.9rem;
}
</style>
</head>
<body>
<div class="layout-container">
<header class="header-nav">
<div class="nav-container">
<a class="nav-logo" href="/"><div class="logo-graphic company-logo">S</div><div class="logo-text">Stonehenge</div></a>
<nav class="nav-links">
<a class="nav-item active" href="/">Home</a>
<a class="nav-item" href="/#today">Dart & Flutter</a>
<a class="nav-item" href="/legacy">Perl Legacy</a>
</nav>
<div class="nav-action">
<button class="theme-toggle-btn" onclick="toggleTheme()" aria-label="Toggle theme"><span class="sun-icon">☀️</span><span class="moon-icon">🌙</span></button>
<a class="btn btn-glow btn-personal" href="/merlyn">Randal's Hub<span class="btn-arrow"> 🧙♂️</span></a>
</div>
</div>
</header>
<main class="content-panel">
<div class="content-wrapper">
<div class="home-container">
<section class="home-hero">
<div class="badge-glow-green">ACTIVE IN DART & FLUTTER</div>
<h1>Expert Systems Architected for Modern Platforms</h1>
<p class="hero-sub">
From legacy foundations to next-generation reactive apps, Stonehenge delivers elite technical guidance. Spearheaded by Randal L. Schwartz, we shape robust platforms using decades of software mastery.
</p>
</section>
<section id="today" class="split-services-section">
<div class="service-column today-column">
<div class="service-glow-layer today-glow"></div>
<div class="service-content">
<span class="service-badge badge-today">ACTIVE PRACTICE</span>
<h2>Stonehenge Today</h2>
<h3 class="service-headline">Dart & Flutter Consulting</h3>
<p>
We help engineering teams build robust, state-of-the-art mobile and web applications. Randal L. Schwartz and our specialists consult on high-performance reactive architectures, package design, state management, and video screencast development.
</p>
<ul>
<li>
<strong>Reactive Architecture: </strong>Implementation of high-performance Signals-based state management.
</li>
<li>
<strong>Screencast & Developer Media: </strong>Professional instructional video and tech podcast production.
</li>
<li>
<strong>Package Engineering: </strong>Custom, highly reusable pub.dev libraries matching pure Dart standards.
</li>
</ul>
<a class="btn btn-primary service-btn" href="mailto:merlyn@stonehenge.com">Consult With Us<span class="btn-arrow"> ➡️</span></a>
</div>
</div>
<div class="service-column legacy-column">
<div class="service-glow-layer legacy-glow"></div>
<div class="service-content">
<span class="service-badge badge-legacy">HISTORICAL LEGACY</span>
<h2>Stonehenge Legacy</h2>
<h3 class="service-headline">Perl Training & Consulting</h3>
<p>
For over thirty years, Stonehenge stood at the very center of the global Perl community. We wrote the definitive O'Reilly books, taught thousands of programmers worldwide, and shaped core tools that powered the early web.
</p>
<ul>
<li>
<strong>Standard Book Authors: </strong>Authors of the best-selling Learning Perl and Intermediate Perl series.
</li>
<li>
<strong>Core Engine Contributions: </strong>Contributed the core "constant" pragma used globally in Perl.
</li>
<li>
<strong>Grassroots Foundations: </strong>Helped establish and fund Perl Mongers and The Perl Institute.
</li>
</ul>
<a class="btn btn-glow service-btn" href="/legacy">What We Accomplished<span class="btn-arrow"> 📜</span></a>
</div>
</div>
</section>
<section class="home-books-section">
<div class="books-header">
<h2>Bestselling Industry Manuals</h2>
<p>Designed by our team to take developers from complete beginners to enterprise system architects.</p>
</div>
<div class="books-scroller">
<div class="mini-book-card">
<img class="mini-cover" alt="Learning Perl" src="/images/0596001320.jpg"/>
<span class="mini-title">Learning Perl</span>
</div>
<div class="mini-book-card">
<img class="mini-cover" alt="Intermediate Perl" src="/images/0596102062.jpg"/>
<span class="mini-title">Intermediate Perl</span>
</div>
<div class="mini-book-card">
<img class="mini-cover" alt="Mastering Perl" src="/images/mastering_perl.png"/>
<span class="mini-title">Mastering Perl</span>
</div>
<div class="mini-book-card">
<img class="mini-cover" alt="Effective Perl" src="/images/0201419750.jpg"/>
<span class="mini-title">Effective Perl</span>
</div>
</div>
</section>
</div>
</div>
</main>
<footer class="footer-panel">
<div class="footer-content">
<div class="footer-brand">
<div class="footer-logo"><div class="logo-graphic small-logo">S</div><span>Stonehenge Consulting</span></div>
<p class="footer-tagline">Worldwide Dart, Flutter & Perl Technical Consulting and Training.</p>
</div>
<div class="footer-address">
<span class="footer-section-title">Address & Office</span>
<p>Stonehenge Consulting Services, Inc.<br/>Portland, Oregon, USA<br/>+1 (503) 777-0095</p>
</div>
<div class="footer-contact">
<span class="footer-section-title">Get In Touch</span>
<p>
For active Dart & Flutter consulting inquiries, podcast or screencast bookings:<br/><a class="footer-email" href="mailto:merlyn@stonehenge.com">merlyn@stonehenge.com</a>
</p>
</div>
</div>
<div class="footer-bottom"><p>© 2026 Stonehenge Consulting Services, Inc. All rights reserved.</p></div>
</footer>
</div>
</body>
</html>
Sitemap
Кол-во: 0
XML-карта сайта для поисковиков
?
Sitemap.xml помогает поисковику быстрее находить и индексировать страницы. Особенно важен для крупных сайтов и новых страниц, на которые ещё нет входящих ссылок.
Robots.txt не содержит ссылку на карту сайта. Рекомендуется добавить карту сайта и указать ссылку на нее в robots.txt.
Внутренние ссылки
Кол-во: 5
Ссылки на другие страницы своего сайта
?
Внутренние ссылки распределяют ссылочный вес между страницами и помогают поисковику обходить сайт. Пустые анкоры и ссылки на запрещённые robots.txt страницы — типичные ошибки.
Внутренних ссылок на странице 5 оптимально.
Внутренние ссылки не запрещены к индексации в robots.txt.
Показать внутренние ссылки
| Url | Анкор | Состояние | Анализировать |
|---|---|---|---|
| / |
<div class="logo-graphic company-logo">S</div><div class="logo-text">Stonehenge</div>
|
|
Анализировать url |
| / |
Home
|
|
Анализировать url |
| /legacy |
Perl Legacy
|
|
Анализировать url |
| /merlyn |
Randal's Hub<span class="btn-arrow"> 🧙♂️</span>
|
|
Анализировать url |
| /legacy |
What We Accomplished<span class="btn-arrow"> 📜</span>
|
|
Анализировать url |
Внешние ссылки
Не найдено
Ссылки на сторонние сайты
?
Исходящие внешние ссылки передают часть ссылочного веса на чужие сайты. Ссылки на авторитетные ресурсы безопасны; ссылки на мусорные сайты могут навредить репутации страницы.
Внешних ссылок на странице не найдено.
Конкуренты Готовность: 0%
Конкуренты в Яндексе
Кол-во: 0
Топ сайтов-конкурентов в Яндексе
?
Сайты, чаще всего появляющиеся в ТОПе Яндекса по запросам из семантического ядра этой страницы.
Мы не нашли у вас конкурентов в Яндексе. Сайт или очень молодой или плохо продвигается.
Конкурентов в ТОП-10 Яндекса не нашлось.
Конкуренты в Google
Кол-во: 0
Топ сайтов-конкурентов в Google
?
Сайты, чаще всего появляющиеся в ТОПе Google по запросам из семантического ядра этой страницы.
Конкуренты в Google тоже не найдены. Займитесь продвижением сайта!
Конкурентов в ТОП-10 Google не нашлось.
ЗоЗПП: права потребителей Готовность: 100%
Нарушения
Не выявлены
Признаков дистанционной продажи товаров (интернет-магазина) не обнаружено — требования ЗоЗПП о раскрытии информации продавца к сайту не применяются. Нарушений нет.
ФЗ-149: рекомендательные технологии Готовность: 100%
Нарушения
Не выявлены
Рекомендательные блоки («с этим покупают», «похожие товары» и т.п.) на сайте не обнаружены — требования ст. 10.7 ФЗ-149 к сайту не применяются. Нарушений нет.
ФЗ-38: реклама Готовность: 100%
Нарушения
Не выявлены
Рекламных тематик с обязательными оговорками (медицина, БАД, кредиты и займы, новостройки) на сайте не обнаружено. Нарушений нет.
ФЗ-436: защита детей Готовность: 100%
Нарушения
Не выявлены
Признаков информационной продукции (новости, видео, книги, игры, курсы) не обнаружено — обязательная возрастная маркировка по ФЗ-436 сайту не требуется. Нарушений нет.
Вердикт
Сайт stonehenge.com проверен - готовность высокая и составляет 74%.
Исправьте ошибки в мета-тегах.
Поделитесь с друзьями: