fix: cyrillic fonts, dev certs, page head, and ru-text typography (#67)

🤖 PR generated for branch `fix/cyrillic-fonts-dev-certs-and-page-head`.

### Changes Summary
- **Fonts**: Add Cyrillic glyph subsets for Lato, EB Garamond, and Fira
Code.
- **Dev**: Support remote Root CA and encrypted dev CA key in
`.env.dev`.
- **UI & Kits**: Add size variant to `Breadcrumbs` component and enlarge
`PageHead` breadcrumbs with tuned collapse scroll threshold.
- **ESLint**: Add `no-hanging-particles` i18n & markdown typography rule
with auto-fixer.
- **Content & i18n**: Apply `ru-text` editorial and typography polish
(em dashes, number ranges, «ё» restoration, non-breaking spaces) across
`services/www` and `services/docs`.
This commit is contained in:
deytenit authored and GitHub committed 2026-10-25 15:21:09 +03:00
1 parent c6487dc258
commit b3638f4d63
111 files changed
+2350 -1512

No files matched your search

@@ -76,3 +76,15 @@ export const WithBullets: Story = {
</Breadcrumbs>
),
};
export const Large: Story = {
render: () => (
<Breadcrumbs size="l">
<Breadcrumbs.Item href="/">Home</Breadcrumbs.Item>
<Breadcrumbs.Separator variant="slash" />
<Breadcrumbs.Item href="/articles">Articles</Breadcrumbs.Item>
<Breadcrumbs.Separator variant="slash" />
<Breadcrumbs.Item isCurrent>Deep Learning</Breadcrumbs.Item>
</Breadcrumbs>
),
};
@@ -36,6 +36,16 @@ describe('components/Breadcrumbs', () => {
expect(ol.className).toContain('text-label-m');
});
it('supports custom size variant', () => {
render(
<Breadcrumbs size="l">
<Breadcrumbs.Item href="/test">Home</Breadcrumbs.Item>
</Breadcrumbs>
);
const ol = screen.getByRole('list');
expect(ol.className).toContain('text-label-l');
});
it('supports isCurrent state', () => {
render(
<Breadcrumbs>
@@ -16,15 +16,44 @@ import type { ClassNameProps, TestIdProps } from '@ermnvldmr/stl';
export interface BreadcrumbsProps extends HStackProps {
/** Breadcrumb items and separators */
children: React.ReactNode;
/**
* Typography size variant for the breadcrumbs trail.
* @default 'm'
*/
size?: 's' | 'm' | 'l';
}
const breadcrumbsVariants = cva('font-sans font-medium', {
variants: {
size: {
s: 'text-label-s',
m: 'text-label-m',
l: 'text-label-l',
},
},
defaultVariants: {
size: 'm',
},
});
/**
* Root component for hierarchical navigation.
*/
const BreadcrumbsRoot = memo(function Breadcrumbs({ children, className, ...props }: BreadcrumbsProps) {
const BreadcrumbsRoot = memo(function Breadcrumbs({
children,
className,
size = 'm',
...props
}: BreadcrumbsProps) {
return (
<nav aria-label="Breadcrumb" className={className}>
<HStack align="center" as="ol" className="text-label-m font-sans font-medium" gap={2} {...props}>
<nav aria-label="Breadcrumb">
<HStack
align="center"
as="ol"
className={cn(breadcrumbsVariants({ size }), className)}
gap={2}
{...props}
>
{children}
</HStack>
</nav>
@@ -126,7 +155,7 @@ const BreadcrumbsSeparator = memo(function BreadcrumbsSeparator({
const content = {
slash: '/',
bull: '•',
arrow: <ChevronRight className="size-4" />,
arrow: <ChevronRight className="size-[1em]" />,
};
return (