hallo-kit 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/fonts/Manrope/OFL.txt +93 -93
- package/fonts/index.ts +30 -30
- package/package.json +4 -1
- package/src/hooks/useCountdown.ts +44 -44
- package/src/hooks/usePlatform.ts +102 -102
- package/src/ui/Icon/Icon.types.ts +60 -60
- package/src/ui/Icon/data/ui.data.tsx +780 -780
- package/src/ui/breadcrumbs/breadcrumbs.tsx +63 -63
- package/src/ui/data-list/data-list.tsx +331 -331
- package/src/ui/modal/modal.tsx +128 -128
- package/src/ui/select/select.tsx +215 -215
- package/src/ui/skeleton/skeleton.tsx +44 -44
- package/src/ui/tabs/tabs.tsx +190 -190
- package/src/utils/copy-to-clipboard.ts +12 -12
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
import { Fragment } from 'react'
|
|
2
|
-
|
|
3
|
-
import Link from 'next/link'
|
|
4
|
-
|
|
5
|
-
import { cn } from '../../lib/utils'
|
|
6
|
-
|
|
7
|
-
// Один сегмент пути. С href → ссылка (предок), без href → просто текст.
|
|
8
|
-
export interface BreadcrumbItem {
|
|
9
|
-
/** Подпись сегмента. Приходит уже локализованной (как title/subtitle в PageHeader). */
|
|
10
|
-
label: string
|
|
11
|
-
/** Куда ведёт сегмент. У текущей страницы (последний сегмент) href обычно не задают. */
|
|
12
|
-
href?: string
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// Хлебные крошки над заголовком страницы (см. PageHeader). Сегменты передают пропсом
|
|
16
|
-
// уже переведёнными. Последний сегмент — текущая страница: не ссылка, помечен
|
|
17
|
-
// aria-current. Разделитель — «/». Цвет приглушённый (muted), ссылки темнеют на hover.
|
|
18
|
-
export function Breadcrumbs({
|
|
19
|
-
items,
|
|
20
|
-
className,
|
|
21
|
-
// aria-label для landmark <nav>. SR-only; при необходимости локализуй через проп.
|
|
22
|
-
ariaLabel = 'breadcrumb',
|
|
23
|
-
}: {
|
|
24
|
-
items: BreadcrumbItem[]
|
|
25
|
-
className?: string
|
|
26
|
-
ariaLabel?: string
|
|
27
|
-
}) {
|
|
28
|
-
if (items.length === 0) return null
|
|
29
|
-
|
|
30
|
-
return (
|
|
31
|
-
<nav aria-label={ariaLabel} className={cn('min-w-0', className)}>
|
|
32
|
-
<ol className='flex flex-wrap items-center gap-x-2 gap-y-1 text-body-s text-muted-foreground'>
|
|
33
|
-
{items.map((item, index) => {
|
|
34
|
-
const isLast = index === items.length - 1
|
|
35
|
-
return (
|
|
36
|
-
<Fragment key={`${item.label}-${index}`}>
|
|
37
|
-
<li>
|
|
38
|
-
{item.href && !isLast ? (
|
|
39
|
-
<Link
|
|
40
|
-
href={item.href}
|
|
41
|
-
className='rounded-sm underline-offset-2 outline-none transition-colors hover:text-foreground hover:underline focus-visible:ring-2 focus-visible:ring-ring'
|
|
42
|
-
>
|
|
43
|
-
{item.label}
|
|
44
|
-
</Link>
|
|
45
|
-
) : (
|
|
46
|
-
<span aria-current={isLast ? 'page' : undefined}>
|
|
47
|
-
{item.label}
|
|
48
|
-
</span>
|
|
49
|
-
)}
|
|
50
|
-
</li>
|
|
51
|
-
{/* Разделитель — декоративный, скринридеру не нужен. */}
|
|
52
|
-
{!isLast && (
|
|
53
|
-
<li aria-hidden className='select-none'>
|
|
54
|
-
/
|
|
55
|
-
</li>
|
|
56
|
-
)}
|
|
57
|
-
</Fragment>
|
|
58
|
-
)
|
|
59
|
-
})}
|
|
60
|
-
</ol>
|
|
61
|
-
</nav>
|
|
62
|
-
)
|
|
63
|
-
}
|
|
1
|
+
import { Fragment } from 'react'
|
|
2
|
+
|
|
3
|
+
import Link from 'next/link'
|
|
4
|
+
|
|
5
|
+
import { cn } from '../../lib/utils'
|
|
6
|
+
|
|
7
|
+
// Один сегмент пути. С href → ссылка (предок), без href → просто текст.
|
|
8
|
+
export interface BreadcrumbItem {
|
|
9
|
+
/** Подпись сегмента. Приходит уже локализованной (как title/subtitle в PageHeader). */
|
|
10
|
+
label: string
|
|
11
|
+
/** Куда ведёт сегмент. У текущей страницы (последний сегмент) href обычно не задают. */
|
|
12
|
+
href?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Хлебные крошки над заголовком страницы (см. PageHeader). Сегменты передают пропсом
|
|
16
|
+
// уже переведёнными. Последний сегмент — текущая страница: не ссылка, помечен
|
|
17
|
+
// aria-current. Разделитель — «/». Цвет приглушённый (muted), ссылки темнеют на hover.
|
|
18
|
+
export function Breadcrumbs({
|
|
19
|
+
items,
|
|
20
|
+
className,
|
|
21
|
+
// aria-label для landmark <nav>. SR-only; при необходимости локализуй через проп.
|
|
22
|
+
ariaLabel = 'breadcrumb',
|
|
23
|
+
}: {
|
|
24
|
+
items: BreadcrumbItem[]
|
|
25
|
+
className?: string
|
|
26
|
+
ariaLabel?: string
|
|
27
|
+
}) {
|
|
28
|
+
if (items.length === 0) return null
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<nav aria-label={ariaLabel} className={cn('min-w-0', className)}>
|
|
32
|
+
<ol className='flex flex-wrap items-center gap-x-2 gap-y-1 text-body-s text-muted-foreground'>
|
|
33
|
+
{items.map((item, index) => {
|
|
34
|
+
const isLast = index === items.length - 1
|
|
35
|
+
return (
|
|
36
|
+
<Fragment key={`${item.label}-${index}`}>
|
|
37
|
+
<li>
|
|
38
|
+
{item.href && !isLast ? (
|
|
39
|
+
<Link
|
|
40
|
+
href={item.href}
|
|
41
|
+
className='rounded-sm underline-offset-2 outline-none transition-colors hover:text-foreground hover:underline focus-visible:ring-2 focus-visible:ring-ring'
|
|
42
|
+
>
|
|
43
|
+
{item.label}
|
|
44
|
+
</Link>
|
|
45
|
+
) : (
|
|
46
|
+
<span aria-current={isLast ? 'page' : undefined}>
|
|
47
|
+
{item.label}
|
|
48
|
+
</span>
|
|
49
|
+
)}
|
|
50
|
+
</li>
|
|
51
|
+
{/* Разделитель — декоративный, скринридеру не нужен. */}
|
|
52
|
+
{!isLast && (
|
|
53
|
+
<li aria-hidden className='select-none'>
|
|
54
|
+
/
|
|
55
|
+
</li>
|
|
56
|
+
)}
|
|
57
|
+
</Fragment>
|
|
58
|
+
)
|
|
59
|
+
})}
|
|
60
|
+
</ol>
|
|
61
|
+
</nav>
|
|
62
|
+
)
|
|
63
|
+
}
|