@atme-lab/ui-kit 0.1.7 → 0.1.9

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.
Files changed (82) hide show
  1. package/dist/components/content/ArticlePreview/ArticlePreview.d.ts +13 -0
  2. package/dist/components/content/ArticlePreview/components/ArticlePreviewContent/ArticlePreviewContent.d.ts +14 -0
  3. package/dist/components/content/ArticlePreview/components/ArticlePreviewContent/index.d.ts +2 -0
  4. package/dist/components/content/ArticlePreview/components/index.d.ts +2 -0
  5. package/dist/components/content/ArticlePreview/index.d.ts +2 -0
  6. package/dist/components/content/index.d.ts +2 -0
  7. package/dist/components/index.d.ts +21 -0
  8. package/dist/components/layout/Grid/Grid.d.ts +21 -0
  9. package/dist/components/layout/Grid/index.d.ts +2 -0
  10. package/dist/components/layout/Island/Island.d.ts +13 -0
  11. package/dist/components/layout/Island/index.d.ts +2 -0
  12. package/dist/components/layout/Stack/Stack.d.ts +19 -0
  13. package/dist/components/layout/Stack/index.d.ts +2 -0
  14. package/dist/components/layout/WindowFrame/WindowFrame.d.ts +8 -0
  15. package/dist/components/layout/WindowFrame/components/ActionButton/ActionButton.d.ts +7 -0
  16. package/dist/components/layout/WindowFrame/components/ActionButton/index.d.ts +1 -0
  17. package/dist/components/layout/WindowFrame/components/TitleBar/TitleBar.d.ts +7 -0
  18. package/dist/components/layout/WindowFrame/components/TitleBar/index.d.ts +1 -0
  19. package/dist/components/layout/WindowFrame/components/index.d.ts +2 -0
  20. package/dist/components/layout/WindowFrame/index.d.ts +1 -0
  21. package/dist/components/navigation/SideMenu/SideMenu.d.ts +18 -0
  22. package/dist/components/navigation/SideMenu/SideMenuItem.d.ts +16 -0
  23. package/dist/components/navigation/SideMenu/index.d.ts +2 -0
  24. package/dist/components/navigation/index.d.ts +2 -0
  25. package/dist/components/primitives/Button/Button.d.ts +13 -0
  26. package/dist/components/primitives/Button/index.d.ts +2 -0
  27. package/dist/components/primitives/Icon/Icon.d.ts +9 -0
  28. package/dist/components/primitives/Icon/Icons/CloseIcon.d.ts +3 -0
  29. package/dist/components/primitives/Icon/Icons/DocumentIcon.d.ts +3 -0
  30. package/dist/components/primitives/Icon/Icons/FullscreenIcon.d.ts +3 -0
  31. package/dist/components/primitives/Icon/Icons/HeartIcon.d.ts +7 -0
  32. package/dist/components/primitives/Icon/Icons/HomeIcon.d.ts +3 -0
  33. package/dist/components/primitives/Icon/Icons/index.d.ts +6 -0
  34. package/dist/components/primitives/Icon/index.d.ts +2 -0
  35. package/dist/components/primitives/LabelMenuItem/LabelMenuItem.d.ts +11 -0
  36. package/dist/components/primitives/LabelMenuItem/index.d.ts +2 -0
  37. package/dist/components/primitives/LikeButton/LikeButton.d.ts +10 -0
  38. package/dist/components/primitives/LikeButton/index.d.ts +2 -0
  39. package/dist/components/primitives/Spacer/Spacer.d.ts +10 -0
  40. package/dist/components/primitives/Spacer/index.d.ts +0 -0
  41. package/dist/components/primitives/Tag/Tag.d.ts +16 -0
  42. package/dist/components/primitives/Tag/index.d.ts +2 -0
  43. package/dist/components/primitives/TagGroup/TagGroup.d.ts +15 -0
  44. package/dist/components/primitives/TagGroup/components/TagGroupItemButton.d.ts +6 -0
  45. package/dist/components/primitives/TagGroup/components/TagGroupItemView.d.ts +6 -0
  46. package/dist/components/primitives/TagGroup/components/index.d.ts +4 -0
  47. package/dist/components/primitives/TagGroup/index.d.ts +2 -0
  48. package/dist/components/primitives/TagGroup/types.d.ts +9 -0
  49. package/dist/components/primitives/Typography/Typography.d.ts +12 -0
  50. package/dist/components/primitives/Typography/index.d.ts +2 -0
  51. package/dist/components/types.d.ts +4 -0
  52. package/dist/global.cjs.js +2 -0
  53. package/dist/global.cjs.js.map +1 -0
  54. package/dist/global.d.ts +0 -0
  55. package/dist/global.esm.js +2 -0
  56. package/dist/global.esm.js.map +1 -0
  57. package/dist/hooks/index.d.ts +7 -0
  58. package/dist/hooks/useExternalLink.d.ts +16 -0
  59. package/dist/hooks/useMenuItem.d.ts +25 -0
  60. package/dist/hooks/useMenuNavigation.d.ts +16 -0
  61. package/dist/hooks/useMouseScale.d.ts +22 -0
  62. package/dist/hooks/useRovingTabIndex.d.ts +20 -0
  63. package/dist/hooks/useTheme.d.ts +2 -0
  64. package/dist/index.d.ts +6 -0
  65. package/dist/styles/functions/spacing.d.ts +1 -0
  66. package/dist/test/setup.d.ts +0 -0
  67. package/dist/themes/ThemeProvider.d.ts +12 -0
  68. package/dist/themes/index.d.ts +3 -0
  69. package/dist/tokens/generate-css-vars.d.ts +2 -0
  70. package/dist/tokens/index.d.ts +4 -0
  71. package/dist/tokens/themes/baseTheme.d.ts +2 -0
  72. package/dist/tokens/themes/darkTheme.d.ts +57 -0
  73. package/dist/tokens/themes/index.d.ts +3 -0
  74. package/dist/tokens/themes/lightTheme.d.ts +53 -0
  75. package/dist/tokens/types.d.ts +125 -0
  76. package/dist/tokens/utils.d.ts +3 -0
  77. package/dist/typings/design.d.ts +1 -0
  78. package/dist/ui-kit.css +1 -1
  79. package/dist/utils/deepMerge.d.ts +1 -0
  80. package/dist/utils/index.d.ts +2 -0
  81. package/dist/utils/navigation.d.ts +1 -0
  82. package/package.json +30 -27
@@ -0,0 +1,13 @@
1
+ import { default as React } from 'react';
2
+ import { BaseComponentProps } from '../../types';
3
+ export type ArticlePreviewView = 'tile' | 'row';
4
+ export interface ArticlePreviewProps extends BaseComponentProps, Omit<React.AnchorHTMLAttributes<HTMLAnchorElement> & React.HTMLAttributes<HTMLDivElement>, 'title'> {
5
+ title: string;
6
+ publishedAt: Date | string;
7
+ imageUrl?: string;
8
+ view?: ArticlePreviewView;
9
+ imageAlt?: string;
10
+ href?: string;
11
+ tags?: React.ReactNode;
12
+ }
13
+ export declare const ArticlePreview: React.ForwardRefExoticComponent<ArticlePreviewProps & React.RefAttributes<HTMLAnchorElement | HTMLDivElement>>;
@@ -0,0 +1,14 @@
1
+ import { default as React } from 'react';
2
+ export type ArticlePreviewContentView = 'tile' | 'row';
3
+ export interface ArticlePreviewContentProps {
4
+ title: string;
5
+ imageUrl?: string | undefined;
6
+ imageAlt: string;
7
+ formattedDate: string;
8
+ view: ArticlePreviewContentView;
9
+ tags?: React.ReactNode;
10
+ }
11
+ export declare function ArticlePreviewContent({ title, imageUrl, imageAlt, formattedDate, view, tags, }: ArticlePreviewContentProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare namespace ArticlePreviewContent {
13
+ var displayName: string;
14
+ }
@@ -0,0 +1,2 @@
1
+ export { ArticlePreviewContent } from './ArticlePreviewContent';
2
+ export type { ArticlePreviewContentProps, ArticlePreviewContentView } from './ArticlePreviewContent';
@@ -0,0 +1,2 @@
1
+ export { ArticlePreviewContent } from './ArticlePreviewContent';
2
+ export type { ArticlePreviewContentProps, ArticlePreviewContentView } from './ArticlePreviewContent';
@@ -0,0 +1,2 @@
1
+ export { ArticlePreview } from './ArticlePreview';
2
+ export type { ArticlePreviewProps, ArticlePreviewView } from './ArticlePreview';
@@ -0,0 +1,2 @@
1
+ export { ArticlePreview } from './ArticlePreview';
2
+ export type { ArticlePreviewProps, ArticlePreviewView } from './ArticlePreview';
@@ -0,0 +1,21 @@
1
+ export type { BaseComponentProps } from './types';
2
+ export { Typography } from './primitives/Typography';
3
+ export type { TypographyProps, TypographyVariant, TypographySize } from './primitives/Typography';
4
+ export { Tag } from './primitives/Tag';
5
+ export type { TagProps, TagVariant, TagSize } from './primitives/Tag';
6
+ export { TagGroup } from './primitives/TagGroup';
7
+ export type { TagGroupProps, TagGroupItem, TagGroupTag } from './primitives/TagGroup';
8
+ export { Button } from './primitives/Button';
9
+ export type { ButtonProps, ButtonVariant, ButtonSize } from './primitives/Button';
10
+ export { Icon } from './primitives/Icon';
11
+ export type { IconProps } from './primitives/Icon';
12
+ export { LabelMenuItem } from './primitives/LabelMenuItem';
13
+ export type { LabelMenuItemProps } from './primitives/LabelMenuItem';
14
+ export { LikeButton } from './primitives/LikeButton';
15
+ export type { LikeButtonProps } from './primitives/LikeButton';
16
+ export { Stack } from './layout/Stack';
17
+ export type { StackProps, StackDirection, StackAlign, StackJustify, StackWrap, StackGap } from './layout/Stack';
18
+ export { Grid } from './layout/Grid';
19
+ export type { GridProps, GridColumns, GridGap } from './layout/Grid';
20
+ export { ArticlePreview } from './content/ArticlePreview';
21
+ export type { ArticlePreviewProps, ArticlePreviewView } from './content/ArticlePreview';
@@ -0,0 +1,21 @@
1
+ import { default as React } from 'react';
2
+ import { BaseComponentProps } from '../../types';
3
+ export type GridGap = number | string;
4
+ export type GridColumns = number | {
5
+ xs?: number;
6
+ sm?: number;
7
+ md?: number;
8
+ lg?: number;
9
+ xl?: number;
10
+ "2xl"?: number;
11
+ };
12
+ type GridElement = "div" | "section" | "article" | "main" | "header" | "footer" | "aside" | "nav";
13
+ export interface GridProps extends BaseComponentProps, Omit<React.HTMLAttributes<HTMLDivElement>, "ref"> {
14
+ columns?: GridColumns;
15
+ gap?: GridGap;
16
+ minColumnWidth?: string;
17
+ as?: GridElement;
18
+ children: React.ReactNode;
19
+ }
20
+ export declare const Grid: React.ForwardRefExoticComponent<GridProps & React.RefAttributes<HTMLDivElement>>;
21
+ export {};
@@ -0,0 +1,2 @@
1
+ export { Grid } from './Grid';
2
+ export type { GridProps, GridColumns, GridGap, } from './Grid';
@@ -0,0 +1,13 @@
1
+ import { BaseComponentProps } from '../../types';
2
+ import { FC, ReactNode } from 'react';
3
+ export type IslandSize = "sm" | "md" | "lg";
4
+ export type IslandVariant = "default" | "paper" | "accent";
5
+ export type IslandElevation = "none" | "sm" | "md" | "lg" | "xl";
6
+ export interface IslandProps extends BaseComponentProps {
7
+ children?: ReactNode;
8
+ size?: IslandSize;
9
+ variant?: IslandVariant;
10
+ elevation?: IslandElevation;
11
+ bordered?: boolean;
12
+ }
13
+ export declare const Island: FC<IslandProps>;
@@ -0,0 +1,2 @@
1
+ export { Island } from './Island';
2
+ export type { IslandProps, IslandSize, IslandVariant, IslandElevation } from './Island';
@@ -0,0 +1,19 @@
1
+ import { default as React } from 'react';
2
+ import { BaseComponentProps } from '../../types';
3
+ export type StackDirection = "row" | "column" | "row-reverse" | "column-reverse";
4
+ export type StackAlign = "start" | "end" | "center" | "stretch" | "baseline";
5
+ export type StackJustify = "start" | "end" | "center" | "between" | "around" | "evenly";
6
+ export type StackWrap = "nowrap" | "wrap" | "wrap-reverse";
7
+ export type StackGap = number | string;
8
+ type StackElement = "div" | "section" | "article" | "main" | "header" | "footer" | "aside" | "nav";
9
+ export interface StackProps extends BaseComponentProps, Omit<React.HTMLAttributes<HTMLDivElement>, "ref"> {
10
+ direction?: StackDirection;
11
+ align?: StackAlign;
12
+ justify?: StackJustify;
13
+ wrap?: StackWrap;
14
+ gap?: StackGap;
15
+ as?: StackElement;
16
+ children: React.ReactNode;
17
+ }
18
+ export declare const Stack: React.ForwardRefExoticComponent<StackProps & React.RefAttributes<HTMLDivElement>>;
19
+ export {};
@@ -0,0 +1,2 @@
1
+ export { Stack } from './Stack';
2
+ export type { StackProps, StackDirection, StackAlign, StackJustify, StackWrap, StackGap } from './Stack';
@@ -0,0 +1,8 @@
1
+ import { FC, ReactNode } from 'react';
2
+ import { BaseComponentProps } from '../../types';
3
+ export interface WindowFrameProps extends BaseComponentProps {
4
+ children?: ReactNode;
5
+ title?: string;
6
+ actions?: ReactNode;
7
+ }
8
+ export declare const WindowFrame: FC<WindowFrameProps>;
@@ -0,0 +1,7 @@
1
+ import { BaseComponentProps } from '../../../../types';
2
+ import { ReactNode } from 'react';
3
+ export interface ActionButtonProps extends BaseComponentProps, Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "children"> {
4
+ icon: ReactNode;
5
+ hint?: string;
6
+ }
7
+ export declare const ActionButton: import('react').ForwardRefExoticComponent<ActionButtonProps & import('react').RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1 @@
1
+ export * from './ActionButton';
@@ -0,0 +1,7 @@
1
+ import { FC, ReactNode } from 'react';
2
+ interface TitleBarProps {
3
+ title?: string;
4
+ addonLeft?: ReactNode;
5
+ }
6
+ export declare const TitleBar: FC<TitleBarProps>;
7
+ export {};
@@ -0,0 +1 @@
1
+ export * from './TitleBar';
@@ -0,0 +1,2 @@
1
+ export { TitleBar } from './TitleBar';
2
+ export { ActionButton } from './ActionButton';
@@ -0,0 +1 @@
1
+ export { WindowFrame } from './WindowFrame';
@@ -0,0 +1,18 @@
1
+ import { default as React } from 'react';
2
+ import { BaseComponentProps } from '../../types';
3
+ export interface SideMenuItem {
4
+ title: string;
5
+ path: string;
6
+ isOuterLink?: boolean;
7
+ Icon: React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
8
+ }
9
+ export interface SideMenuProps extends BaseComponentProps {
10
+ items: SideMenuItem[];
11
+ defaultItemSize?: number;
12
+ maxScale?: number;
13
+ showTitles?: boolean;
14
+ orientation?: "horizontal" | "vertical";
15
+ onItemClick?: (item: SideMenuItem, index: number) => void;
16
+ onNavigate?: (url: string) => void;
17
+ }
18
+ export declare const SideMenu: React.FC<SideMenuProps>;
@@ -0,0 +1,16 @@
1
+ import { default as React } from 'react';
2
+ import { SideMenuItem as SideMenuItemType } from './SideMenu';
3
+ export interface SideMenuItemProps {
4
+ item: SideMenuItemType;
5
+ index: number;
6
+ size: number;
7
+ showTitles: boolean;
8
+ orientation: "horizontal" | "vertical";
9
+ onItemClick?: (item: SideMenuItemType, index: number) => void;
10
+ onNavigate?: (url: string) => void;
11
+ onKeyDown?: (e: React.KeyboardEvent<HTMLElement>, index: number) => void;
12
+ tabIndex: number;
13
+ itemRef?: (el: HTMLLIElement | null) => void;
14
+ linkRef?: (el: HTMLAnchorElement | HTMLButtonElement | null) => void;
15
+ }
16
+ export declare const SideMenuItem: React.ForwardRefExoticComponent<SideMenuItemProps & React.RefAttributes<HTMLLIElement>>;
@@ -0,0 +1,2 @@
1
+ export { SideMenu } from './SideMenu';
2
+ export type { SideMenuProps, SideMenuItem } from './SideMenu';
@@ -0,0 +1,2 @@
1
+ export { SideMenu } from './SideMenu';
2
+ export type { SideMenuProps, SideMenuItem } from './SideMenu';
@@ -0,0 +1,13 @@
1
+ import { default as React } from 'react';
2
+ export type ButtonVariant = "primary" | "secondary" | "outline" | "ghost";
3
+ export type ButtonSize = "sm" | "md" | "lg";
4
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
5
+ variant?: ButtonVariant;
6
+ size?: ButtonSize;
7
+ startIcon?: React.ReactNode;
8
+ endIcon?: React.ReactNode;
9
+ fullWidth?: boolean;
10
+ loading?: boolean;
11
+ children: React.ReactNode;
12
+ }
13
+ export declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,2 @@
1
+ export { Button } from './Button';
2
+ export type { ButtonProps, ButtonVariant, ButtonSize } from './Button';
@@ -0,0 +1,9 @@
1
+ import { default as React } from 'react';
2
+ export interface IconProps extends React.SVGProps<SVGSVGElement> {
3
+ color?: string;
4
+ children?: React.ReactNode;
5
+ svg?: string;
6
+ name?: string;
7
+ decorative?: boolean;
8
+ }
9
+ export declare const Icon: React.ForwardRefExoticComponent<Omit<IconProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+ import { IconProps } from '../Icon';
3
+ export declare const CloseIcon: React.FC<Omit<IconProps, 'children' | 'svg'>>;
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+ import { IconProps } from '../Icon';
3
+ export declare const DocumentIcon: React.FC<Omit<IconProps, 'children' | 'svg'>>;
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+ import { IconProps } from '../Icon';
3
+ export declare const FullscreenIcon: React.FC<Omit<IconProps, "children" | "svg">>;
@@ -0,0 +1,7 @@
1
+ import { default as React } from 'react';
2
+ import { IconProps } from '../Icon';
3
+ export interface HeartIconProps extends Omit<IconProps, 'children' | 'svg'> {
4
+ /** Залитое сердечко (лайк поставлен) */
5
+ filled?: boolean;
6
+ }
7
+ export declare const HeartIcon: React.FC<HeartIconProps>;
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+ import { IconProps } from '../Icon';
3
+ export declare const HomeIcon: React.FC<Omit<IconProps, "children" | "svg">>;
@@ -0,0 +1,6 @@
1
+ export { DocumentIcon } from './DocumentIcon';
2
+ export { CloseIcon } from './CloseIcon';
3
+ export { HomeIcon } from './HomeIcon';
4
+ export { FullscreenIcon } from './FullscreenIcon';
5
+ export { HeartIcon } from './HeartIcon';
6
+ export type { HeartIconProps } from './HeartIcon';
@@ -0,0 +1,2 @@
1
+ export { Icon } from './Icon';
2
+ export type { IconProps } from './Icon';
@@ -0,0 +1,11 @@
1
+ import { default as React } from 'react';
2
+ import { IconProps } from '../Icon';
3
+ export interface LabelMenuItemProps {
4
+ label: string;
5
+ icon: React.ComponentType<Partial<IconProps>>;
6
+ onClick: () => void;
7
+ disabled?: boolean;
8
+ className?: string;
9
+ iconSize?: string | number;
10
+ }
11
+ export declare const LabelMenuItem: React.FC<LabelMenuItemProps>;
@@ -0,0 +1,2 @@
1
+ export { LabelMenuItem } from './LabelMenuItem';
2
+ export type { LabelMenuItemProps } from './LabelMenuItem';
@@ -0,0 +1,10 @@
1
+ import { default as React } from 'react';
2
+ import { BaseComponentProps } from '../../types';
3
+ export interface LikeButtonProps extends BaseComponentProps, Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onClick' | 'children'> {
4
+ liked?: boolean;
5
+ defaultLiked?: boolean;
6
+ count?: number;
7
+ onLike?: (liked: boolean) => void;
8
+ onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
9
+ }
10
+ export declare const LikeButton: React.ForwardRefExoticComponent<LikeButtonProps & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,2 @@
1
+ export { LikeButton } from './LikeButton';
2
+ export type { LikeButtonProps } from './LikeButton';
@@ -0,0 +1,10 @@
1
+ import { BaseComponentProps } from '../../types';
2
+ import { FC } from 'react';
3
+ import { SpacingVariant } from '../../../typings/design';
4
+ export interface SpacerProps extends BaseComponentProps {
5
+ size?: SpacingVariant;
6
+ x?: SpacingVariant;
7
+ y?: SpacingVariant;
8
+ axis?: "x" | "y";
9
+ }
10
+ export declare const Spacer: FC<SpacerProps>;
File without changes
@@ -0,0 +1,16 @@
1
+ import { default as React } from 'react';
2
+ export type TagVariant = "primary" | "secondary" | "success" | "warning" | "error" | "neutral";
3
+ export type TagSize = "sm" | "md" | "lg";
4
+ export interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
5
+ variant?: TagVariant;
6
+ size?: TagSize;
7
+ icon?: React.ReactNode;
8
+ iconPosition?: "left" | "right";
9
+ closeable?: boolean;
10
+ onClose?: (event: React.MouseEvent<HTMLButtonElement>) => void;
11
+ children: React.ReactNode;
12
+ href?: string;
13
+ }
14
+ type TagRootElement = HTMLAnchorElement | HTMLSpanElement;
15
+ export declare const Tag: React.ForwardRefExoticComponent<TagProps & React.RefAttributes<TagRootElement>>;
16
+ export {};
@@ -0,0 +1,2 @@
1
+ export { Tag } from './Tag';
2
+ export type { TagProps, TagVariant, TagSize } from './Tag';
@@ -0,0 +1,15 @@
1
+ import { default as React } from 'react';
2
+ import { TagProps } from '../Tag';
3
+ import { TagGroupTag } from './types';
4
+ export type { TagGroupItem, TagGroupTag } from './types';
5
+ export { isTagGroupItem } from './types';
6
+ export interface TagGroupProps extends React.HTMLAttributes<HTMLDivElement> {
7
+ tags: TagGroupTag[];
8
+ maxVisible?: number;
9
+ overflowTagProps?: Omit<TagProps, "children">;
10
+ collapseTagProps?: Omit<TagProps, "children">;
11
+ collapseText?: string;
12
+ size?: TagProps["size"];
13
+ variant?: TagProps["variant"];
14
+ }
15
+ export declare const TagGroup: React.ForwardRefExoticComponent<TagGroupProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,6 @@
1
+ import { TagGroupItem, TagGroupBaseTagProps } from '../types';
2
+ export interface TagGroupItemButtonProps {
3
+ tag: TagGroupItem;
4
+ baseTagProps: TagGroupBaseTagProps;
5
+ }
6
+ export declare function TagGroupItemButton({ tag, baseTagProps }: TagGroupItemButtonProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { TagGroupTag, TagGroupBaseTagProps } from '../types';
2
+ export interface TagGroupItemViewProps {
3
+ tag: TagGroupTag;
4
+ baseTagProps: TagGroupBaseTagProps;
5
+ }
6
+ export declare function TagGroupItemView({ tag, baseTagProps }: TagGroupItemViewProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ export { TagGroupItemButton } from './TagGroupItemButton';
2
+ export type { TagGroupItemButtonProps } from './TagGroupItemButton';
3
+ export { TagGroupItemView } from './TagGroupItemView';
4
+ export type { TagGroupItemViewProps } from './TagGroupItemView';
@@ -0,0 +1,2 @@
1
+ export { TagGroup } from './TagGroup';
2
+ export type { TagGroupProps, TagGroupItem, TagGroupTag } from './TagGroup';
@@ -0,0 +1,9 @@
1
+ import { TagProps } from '../Tag';
2
+ export interface TagGroupItem {
3
+ label: React.ReactNode;
4
+ href?: string;
5
+ onClick?: (event: React.MouseEvent<HTMLElement>) => void;
6
+ }
7
+ export type TagGroupTag = React.ReactNode | TagGroupItem;
8
+ export declare function isTagGroupItem(tag: TagGroupTag): tag is TagGroupItem;
9
+ export type TagGroupBaseTagProps = Partial<Pick<TagProps, "size" | "variant">>;
@@ -0,0 +1,12 @@
1
+ import { default as React } from 'react';
2
+ export type TypographyVariant = "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "body" | "caption" | "overline";
3
+ export type TypographySize = "xs" | "sm" | "base" | "lg" | "xl" | "2xl" | "3xl" | "4xl";
4
+ export type TypographyColor = "primary" | "secondary" | "disabled";
5
+ export interface TypographyProps extends React.HTMLAttributes<HTMLElement> {
6
+ variant?: TypographyVariant;
7
+ size?: TypographySize;
8
+ color?: TypographyColor;
9
+ as?: React.ElementType;
10
+ children: React.ReactNode;
11
+ }
12
+ export declare const Typography: React.ForwardRefExoticComponent<TypographyProps & React.RefAttributes<HTMLElement>>;
@@ -0,0 +1,2 @@
1
+ export { Typography } from './Typography';
2
+ export type { TypographyProps, TypographyVariant, TypographySize } from './Typography';
@@ -0,0 +1,4 @@
1
+ export interface BaseComponentProps {
2
+ className?: string;
3
+ testId?: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=global.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
File without changes
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=global.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export { useTheme } from './useTheme';
2
+ export { useMouseScale } from './useMouseScale';
3
+ export { useMenuNavigation } from './useMenuNavigation';
4
+ export { useRovingTabIndex } from './useRovingTabIndex';
5
+ export { useExternalLink } from './useExternalLink';
6
+ export { useMenuItem } from './useMenuItem';
7
+ export type { UseMouseScaleOptions, UseMouseScaleReturn } from './useMouseScale';
@@ -0,0 +1,16 @@
1
+ export interface UseExternalLinkOptions {
2
+ onNavigate?: (url: string) => void;
3
+ }
4
+ export interface UseExternalLinkReturn {
5
+ openLink: (url: string) => void;
6
+ shouldUseButton: (isOuterLink?: boolean) => boolean;
7
+ }
8
+ /**
9
+ * Хук для работы с внешними ссылками.
10
+ * Определяет, нужно ли использовать button вместо ссылки,
11
+ * и предоставляет функцию для открытия ссылок.
12
+ *
13
+ * @param options - Опции для настройки работы с ссылками
14
+ * @returns Утилиты для работы с внешними ссылками
15
+ */
16
+ export declare function useExternalLink({ onNavigate, }?: UseExternalLinkOptions): UseExternalLinkReturn;
@@ -0,0 +1,25 @@
1
+ import { SideMenuItem as SideMenuItemType } from '../components/navigation/SideMenu/SideMenu';
2
+ export interface UseMenuItemOptions {
3
+ item: SideMenuItemType;
4
+ index: number;
5
+ onItemClick?: ((item: SideMenuItemType, index: number) => void) | undefined;
6
+ onNavigate?: ((url: string) => void) | undefined;
7
+ }
8
+ export interface UseMenuItemReturn {
9
+ elementType: "button" | "a";
10
+ handleClick: (e: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => void;
11
+ handleActivate: () => void;
12
+ linkProps: {
13
+ href?: string;
14
+ target?: string;
15
+ rel?: string;
16
+ };
17
+ }
18
+ /**
19
+ * Хук для определения логики элемента меню.
20
+ * Определяет тип элемента (button или a) и обрабатывает активацию.
21
+ *
22
+ * @param options - Опции для настройки элемента меню
23
+ * @returns Логика для элемента меню
24
+ */
25
+ export declare function useMenuItem({ item, index, onItemClick, onNavigate, }: UseMenuItemOptions): UseMenuItemReturn;
@@ -0,0 +1,16 @@
1
+ export interface UseMenuNavigationOptions {
2
+ itemsCount: number;
3
+ orientation: "horizontal" | "vertical";
4
+ onNavigate?: (index: number) => void;
5
+ }
6
+ export interface UseMenuNavigationReturn {
7
+ handleNavigationKeyDown: (e: React.KeyboardEvent, currentIndex: number) => number | null;
8
+ }
9
+ /**
10
+ * Хук для обработки навигации по меню с помощью клавиатуры.
11
+ * Поддерживает стрелки, Home, End с циклической навигацией.
12
+ *
13
+ * @param options - Опции для настройки навигации
14
+ * @returns Обработчик навигации по клавиатуре
15
+ */
16
+ export declare function useMenuNavigation({ itemsCount, orientation, onNavigate, }: UseMenuNavigationOptions): UseMenuNavigationReturn;
@@ -0,0 +1,22 @@
1
+ import { RefObject } from 'react';
2
+ export interface UseMouseScaleOptions {
3
+ itemRefs: RefObject<(HTMLElement | null)[]>;
4
+ containerRef: RefObject<HTMLElement>;
5
+ defaultSize: number;
6
+ maxScale?: number;
7
+ orientation?: "horizontal" | "vertical";
8
+ animationClassName?: string;
9
+ }
10
+ export interface UseMouseScaleReturn {
11
+ handleMouseEnter: () => void;
12
+ handleMouseMove: (e: React.MouseEvent<HTMLElement>) => void;
13
+ handleMouseLeave: () => void;
14
+ }
15
+ /**
16
+ * Хук для создания интерактивного масштабирования элементов при движении мыши.
17
+ * Элементы увеличиваются пропорционально близости курсора к их центру.
18
+ *
19
+ * @param options - Опции для настройки масштабирования
20
+ * @returns Обработчики событий мыши для привязки к контейнеру
21
+ */
22
+ export declare function useMouseScale({ itemRefs, containerRef, defaultSize, maxScale, orientation, animationClassName, }: UseMouseScaleOptions): UseMouseScaleReturn;
@@ -0,0 +1,20 @@
1
+ import { RefObject } from 'react';
2
+ export interface UseRovingTabIndexOptions {
3
+ itemsCount: number;
4
+ initialFocusedIndex?: number;
5
+ }
6
+ export interface UseRovingTabIndexReturn {
7
+ focusedIndex: number | null;
8
+ setFocusedIndex: (index: number) => void;
9
+ getTabIndex: (index: number) => number;
10
+ focusItem: (index: number, refs: RefObject<(HTMLElement | null)[]>) => void;
11
+ }
12
+ /**
13
+ * Хук для управления roving tabindex паттерном.
14
+ * Обеспечивает, что только один элемент в меню имеет tabIndex={0},
15
+ * остальные имеют tabIndex={-1}.
16
+ *
17
+ * @param options - Опции для настройки roving tabindex
18
+ * @returns Утилиты для управления фокусом
19
+ */
20
+ export declare function useRovingTabIndex({ initialFocusedIndex, }: UseRovingTabIndexOptions): UseRovingTabIndexReturn;
@@ -0,0 +1,2 @@
1
+ import { Theme } from '../tokens';
2
+ export declare function useTheme(): Theme;
@@ -0,0 +1,6 @@
1
+ export * from './components';
2
+ export * from './themes';
3
+ export type { Theme, Palette, Spacing, Typography as TypographyTokens, Shadows, BorderRadius, Transitions, ZIndex, } from './tokens/types';
4
+ export { baseTheme, lightTheme, darkTheme } from './tokens/themes';
5
+ export { mergeTheme } from './tokens/utils';
6
+ export { themeToCssVars } from './tokens/generate-css-vars';
@@ -0,0 +1 @@
1
+ export default function spacing(multiplier: number): string;
File without changes
@@ -0,0 +1,12 @@
1
+ import { FC, ReactNode } from 'react';
2
+ import { Theme } from '../tokens';
3
+ interface ThemeContextValue {
4
+ theme: Theme;
5
+ }
6
+ export interface ThemeProviderProps {
7
+ theme?: Theme | Partial<Theme>;
8
+ children: ReactNode;
9
+ }
10
+ export declare const ThemeProvider: FC<ThemeProviderProps>;
11
+ export declare function useThemeContext(): ThemeContextValue;
12
+ export {};
@@ -0,0 +1,3 @@
1
+ export { ThemeProvider, useThemeContext } from './ThemeProvider';
2
+ export type { ThemeProviderProps } from './ThemeProvider';
3
+ export { useTheme } from '../hooks/useTheme';
@@ -0,0 +1,2 @@
1
+ import { Theme } from './types';
2
+ export declare function themeToCssVars(theme: Theme): Record<string, string>;
@@ -0,0 +1,4 @@
1
+ export type { Theme, Palette, Spacing, Typography, Shadows, BorderRadius, Transitions, ZIndex } from './types';
2
+ export { baseTheme, lightTheme, darkTheme } from './themes';
3
+ export { mergeTheme, getSpacingVar } from './utils';
4
+ export { themeToCssVars } from './generate-css-vars';
@@ -0,0 +1,2 @@
1
+ import { Theme } from '../types';
2
+ export declare const baseTheme: Omit<Theme, 'palette'>;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Темная тема
3
+ * Расширяет базовую тему, добавляя темную цветовую палитру
4
+ */
5
+ export declare const darkTheme: {
6
+ palette: {
7
+ primary: {
8
+ main: string;
9
+ hover: string;
10
+ active: string;
11
+ contrastText: string;
12
+ };
13
+ secondary: {
14
+ main: string;
15
+ hover: string;
16
+ active: string;
17
+ contrastText: string;
18
+ };
19
+ error: {
20
+ main: string;
21
+ hover: string;
22
+ active: string;
23
+ };
24
+ warning: {
25
+ main: string;
26
+ hover: string;
27
+ active: string;
28
+ };
29
+ success: {
30
+ main: string;
31
+ hover: string;
32
+ active: string;
33
+ };
34
+ text: {
35
+ primary: string;
36
+ secondary: string;
37
+ disabled: string;
38
+ };
39
+ background: {
40
+ default: string;
41
+ accent: string;
42
+ paper: string;
43
+ };
44
+ border: {
45
+ default: string;
46
+ subtle: string;
47
+ strong: string;
48
+ };
49
+ };
50
+ border: import('../types').Border;
51
+ typography: import('..').Typography;
52
+ spacing: import('..').Spacing;
53
+ shadows: import('..').Shadows;
54
+ borderRadius: import('..').BorderRadius;
55
+ transitions: import('..').Transitions;
56
+ zIndex: import('..').ZIndex;
57
+ };
@@ -0,0 +1,3 @@
1
+ export { baseTheme } from './baseTheme';
2
+ export { lightTheme } from './lightTheme';
3
+ export { darkTheme } from './darkTheme';
@@ -0,0 +1,53 @@
1
+ export declare const lightTheme: {
2
+ palette: {
3
+ primary: {
4
+ main: string;
5
+ hover: string;
6
+ active: string;
7
+ contrastText: string;
8
+ };
9
+ secondary: {
10
+ main: string;
11
+ hover: string;
12
+ active: string;
13
+ contrastText: string;
14
+ };
15
+ error: {
16
+ main: string;
17
+ hover: string;
18
+ active: string;
19
+ };
20
+ warning: {
21
+ main: string;
22
+ hover: string;
23
+ active: string;
24
+ };
25
+ success: {
26
+ main: string;
27
+ hover: string;
28
+ active: string;
29
+ };
30
+ text: {
31
+ primary: string;
32
+ secondary: string;
33
+ disabled: string;
34
+ };
35
+ background: {
36
+ default: string;
37
+ accent: string;
38
+ paper: string;
39
+ };
40
+ border: {
41
+ default: string;
42
+ subtle: string;
43
+ strong: string;
44
+ };
45
+ };
46
+ border: import('../types').Border;
47
+ typography: import('..').Typography;
48
+ spacing: import('..').Spacing;
49
+ shadows: import('..').Shadows;
50
+ borderRadius: import('..').BorderRadius;
51
+ transitions: import('..').Transitions;
52
+ zIndex: import('..').ZIndex;
53
+ };
@@ -0,0 +1,125 @@
1
+ export interface Palette {
2
+ primary: {
3
+ main: string;
4
+ hover: string;
5
+ active: string;
6
+ contrastText: string;
7
+ };
8
+ secondary: {
9
+ main: string;
10
+ hover: string;
11
+ active: string;
12
+ contrastText: string;
13
+ };
14
+ error: {
15
+ main: string;
16
+ hover: string;
17
+ active: string;
18
+ };
19
+ warning: {
20
+ main: string;
21
+ hover: string;
22
+ active: string;
23
+ };
24
+ success: {
25
+ main: string;
26
+ hover: string;
27
+ active: string;
28
+ };
29
+ text: {
30
+ primary: string;
31
+ secondary: string;
32
+ disabled: string;
33
+ };
34
+ background: {
35
+ default: string;
36
+ accent: string;
37
+ paper: string;
38
+ };
39
+ border: {
40
+ default: string;
41
+ subtle: string;
42
+ strong: string;
43
+ };
44
+ }
45
+ export interface Spacing {
46
+ unit: number;
47
+ }
48
+ export interface Typography {
49
+ fontFamily: string;
50
+ fontSize: {
51
+ xs: string;
52
+ sm: string;
53
+ base: string;
54
+ lg: string;
55
+ xl: string;
56
+ '2xl': string;
57
+ '3xl': string;
58
+ '4xl': string;
59
+ };
60
+ fontWeight: {
61
+ normal: number;
62
+ medium: number;
63
+ semibold: number;
64
+ bold: number;
65
+ };
66
+ lineHeight: {
67
+ tight: number;
68
+ normal: number;
69
+ relaxed: number;
70
+ };
71
+ }
72
+ export interface Shadows {
73
+ sm: string;
74
+ base: string;
75
+ md: string;
76
+ lg: string;
77
+ xl: string;
78
+ '2xl': string;
79
+ none: string;
80
+ }
81
+ export interface Border {
82
+ base: string;
83
+ }
84
+ export interface BorderRadius {
85
+ none: string;
86
+ round: string;
87
+ sm: string;
88
+ base: string;
89
+ md: string;
90
+ lg: string;
91
+ xl: string;
92
+ '2xl': string;
93
+ full: string;
94
+ }
95
+ export interface Transitions {
96
+ duration: {
97
+ fast: string;
98
+ base: string;
99
+ slow: string;
100
+ };
101
+ easing: {
102
+ easeInOut: string;
103
+ easeIn: string;
104
+ easeOut: string;
105
+ };
106
+ }
107
+ export interface ZIndex {
108
+ dropdown: number;
109
+ sticky: number;
110
+ fixed: number;
111
+ modalBackdrop: number;
112
+ modal: number;
113
+ popover: number;
114
+ tooltip: number;
115
+ }
116
+ export interface Theme {
117
+ palette: Palette;
118
+ spacing: Spacing;
119
+ typography: Typography;
120
+ shadows: Shadows;
121
+ border: Border;
122
+ borderRadius: BorderRadius;
123
+ transitions: Transitions;
124
+ zIndex: ZIndex;
125
+ }
@@ -0,0 +1,3 @@
1
+ import { Theme } from './types';
2
+ export declare function mergeTheme(baseTheme: Theme, overrides: Partial<Theme>): Theme;
3
+ export declare function getSpacingVar(spacing: number | string | undefined): string | undefined;
@@ -0,0 +1 @@
1
+ export type SpacingVariant = number;
package/dist/ui-kit.css CHANGED
@@ -1 +1 @@
1
- ._typography_11hr8_1{font-family:var(--typography-font-family);margin:0;padding:0}._typography--h1_11hr8_8{font-size:var(--typography-font-size-4xl);font-weight:var(--typography-font-weight-bold);line-height:var(--typography-line-height-tight);color:var(--palette-text-primary)}._typography--h2_11hr8_15{font-size:var(--typography-font-size-3xl);font-weight:var(--typography-font-weight-bold);line-height:var(--typography-line-height-tight);color:var(--palette-text-primary)}._typography--h3_11hr8_22{font-size:var(--typography-font-size-2xl);font-weight:var(--typography-font-weight-semibold);line-height:var(--typography-line-height-normal);color:var(--palette-text-primary)}._typography--h4_11hr8_29{font-size:var(--typography-font-size-xl);font-weight:var(--typography-font-weight-semibold);line-height:var(--typography-line-height-normal);color:var(--palette-text-primary)}._typography--h5_11hr8_36{font-size:var(--typography-font-size-lg);font-weight:var(--typography-font-weight-medium);line-height:var(--typography-line-height-normal);color:var(--palette-text-primary)}._typography--h6_11hr8_43{font-size:var(--typography-font-size-base);font-weight:var(--typography-font-weight-medium);line-height:var(--typography-line-height-normal);color:var(--palette-text-primary)}._typography--body_11hr8_50{font-size:var(--typography-font-size-base);font-weight:var(--typography-font-weight-normal);line-height:var(--typography-line-height-normal);color:var(--palette-text-primary)}._typography--caption_11hr8_57{font-size:var(--typography-font-size-sm);font-weight:var(--typography-font-weight-normal);line-height:var(--typography-line-height-normal);color:var(--palette-text-secondary)}._typography--overline_11hr8_64{font-size:var(--typography-font-size-xs);font-weight:var(--typography-font-weight-medium);line-height:var(--typography-line-height-normal);color:var(--palette-text-secondary);text-transform:uppercase;letter-spacing:.05em}._typography--xs_11hr8_74{font-size:var(--typography-font-size-xs)}._typography--sm_11hr8_78{font-size:var(--typography-font-size-sm)}._typography--base_11hr8_82{font-size:var(--typography-font-size-base)}._typography--lg_11hr8_86{font-size:var(--typography-font-size-lg)}._typography--xl_11hr8_90{font-size:var(--typography-font-size-xl)}._typography--2xl_11hr8_94{font-size:var(--typography-font-size-2xl)}._typography--3xl_11hr8_98{font-size:var(--typography-font-size-3xl)}._typography--4xl_11hr8_102{font-size:var(--typography-font-size-4xl)}._typography--color-primary_11hr8_107{color:var(--palette-text-primary)}._typography--color-secondary_11hr8_111{color:var(--palette-text-secondary)}._typography--color-disabled_11hr8_115{color:var(--palette-text-disabled)}._tag_10ar5_1{display:inline-flex;align-items:center;gap:calc(var(--spacing-unit) * 1 * 1px);border-radius:var(--border-radius-base);border:2px solid var(--palette-border-strong);font-family:var(--typography-font-family);font-weight:var(--typography-font-weight-medium);line-height:1;white-space:nowrap}._tag--link_10ar5_13{text-decoration:none;color:inherit}._tag--link_10ar5_13:focus-visible{outline:2px solid var(--palette-primary-main);outline-offset:2px}._tagContent_10ar5_23{display:inline-flex;align-items:center}._tagIcon_10ar5_28{display:inline-flex;align-items:center;flex-shrink:0}._tagClose_10ar5_34{display:inline-flex;align-items:center;justify-content:center;margin-left:calc(var(--spacing-unit) * 1 * 1px);padding:0;background:none;border:none;cursor:pointer;font-size:1.2em;line-height:1;color:inherit;opacity:.7;transition:opacity var(--transitions-duration-base) var(--transitions-easing-easeInOut)}._tagClose_10ar5_34:hover{opacity:1}._tagClose_10ar5_34:focus{outline:2px solid currentColor;outline-offset:2px}._tag--sm_10ar5_60{padding:calc(var(--spacing-unit) * 1 * 1px) calc(var(--spacing-unit) * 2 * 1px);font-size:var(--typography-font-size-xs)}._tag--md_10ar5_65{padding:calc(var(--spacing-unit) * 1 * 1px) calc(var(--spacing-unit) * 3 * 1px);font-size:var(--typography-font-size-sm)}._tag--lg_10ar5_70{padding:calc(var(--spacing-unit) * 2 * 1px) calc(var(--spacing-unit) * 4 * 1px);font-size:var(--typography-font-size-base)}._tag--primary_10ar5_76{background-color:var(--palette-primary-main);color:var(--palette-secondary-contrastText)}._tag--secondary_10ar5_81{background-color:var(--palette-secondary-main);color:var(--palette-secondary-contrastText)}._tag--success_10ar5_86{background-color:var(--palette-success-main);color:#fff}._tag--warning_10ar5_91{background-color:var(--palette-warning-main);color:#fff}._tag--error_10ar5_96{background-color:var(--palette-error-main);color:#fff}._tag--neutral_10ar5_101{background-color:var(--palette-border-default);color:var(--palette-text-primary)}._tagGroup_1b8va_1{display:flex;flex-wrap:wrap;gap:calc(var(--spacing-unit) * 1 * 1px);align-items:center}._button_t5esz_1{display:inline-flex;align-items:center;justify-content:center;gap:calc(var(--spacing-unit) * 2 * 1px);border:1px solid transparent;border-radius:var(--border-radius-lg);font-family:var(--typography-font-family);font-weight:var(--typography-font-weight-medium);line-height:1;cursor:pointer;transition:all var(--transitions-duration-base) var(--transitions-easing-easeInOut);text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;box-shadow:var(--shadows-sm)}._button_t5esz_1:focus-visible{outline:2px solid var(--palette-primary-main);outline-offset:2px}._button_t5esz_1:disabled,._button_t5esz_1[aria-disabled=true]{cursor:not-allowed;opacity:.6;box-shadow:none}._buttonContent_t5esz_32{display:inline-flex;align-items:center}._buttonIcon_t5esz_37{display:inline-flex;align-items:center;flex-shrink:0}._buttonSpinner_t5esz_43{display:inline-block;width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:_spin_t5esz_1 .6s linear infinite}@keyframes _spin_t5esz_1{to{transform:rotate(360deg)}}._button--sm_t5esz_60{padding:calc(var(--spacing-unit) * 1.5 * 1px) calc(var(--spacing-unit) * 3.5 * 1px);font-size:var(--typography-font-size-sm);min-height:36px}._button--md_t5esz_66{padding:calc(var(--spacing-unit) * 2.5 * 1px) calc(var(--spacing-unit) * 5 * 1px);font-size:var(--typography-font-size-base);min-height:44px}._button--lg_t5esz_72{padding:calc(var(--spacing-unit) * 3 * 1px) calc(var(--spacing-unit) * 6 * 1px);font-size:var(--typography-font-size-lg);min-height:52px}._button--fullWidth_t5esz_78{width:100%}._button--primary_t5esz_83{background-color:var(--palette-primary-hover);color:var(--palette-text-primary);border-color:var(--palette-primary-hover);box-shadow:var(--shadows-sm)}._button--primary_t5esz_83:hover:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-primary-main);border-color:var(--palette-primary-main);color:var(--palette-primary-contrast-text);box-shadow:var(--shadows-base);transform:translateY(-1px)}._button--primary_t5esz_83:active:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-primary-active);border-color:var(--palette-primary-active);color:var(--palette-primary-contrast-text);box-shadow:var(--shadows-sm);transform:translateY(0)}._button--secondary_t5esz_106{background-color:var(--palette-background-paper);color:var(--palette-secondary-contrast-text);border-color:var(--palette-secondary-main);box-shadow:var(--shadows-sm)}._button--secondary_t5esz_106:hover:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-secondary-hover);border-color:var(--palette-secondary-hover);color:var(--palette-secondary-contrast-text);box-shadow:var(--shadows-base);transform:translateY(-1px)}._button--secondary_t5esz_106:active:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-secondary-active);border-color:var(--palette-secondary-active);color:var(--palette-secondary-contrast-text);box-shadow:var(--shadows-sm);transform:translateY(0)}._button--outline_t5esz_129{background-color:var(--palette-background-paper);color:var(--palette-primary-main);border-color:var(--palette-primary-main);box-shadow:var(--shadows-sm)}._button--outline_t5esz_129:hover:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-primary-hover);color:var(--palette-text-secondary);border-color:var(--palette-primary-hover);box-shadow:var(--shadows-base);transform:translateY(-1px)}._button--outline_t5esz_129:active:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-primary-active);color:var(--palette-primary-contrast-text);border-color:var(--palette-primary-active);box-shadow:var(--shadows-sm);transform:translateY(0)}._button--ghost_t5esz_152{background-color:transparent;color:var(--palette-primary-main);border-color:transparent;box-shadow:none}._button--ghost_t5esz_152:hover:not(:disabled):not([aria-disabled=true]){background-color:#0000000d;box-shadow:var(--shadows-sm)}._button--ghost_t5esz_152:active:not(:disabled):not([aria-disabled=true]){background-color:#0000001a;box-shadow:none}[data-color-scheme=dark] ._button--ghost_t5esz_152:hover:not(:disabled):not([aria-disabled=true]){background-color:#ffffff1a;box-shadow:var(--shadows-sm)}[data-color-scheme=dark] ._button--ghost_t5esz_152:active:not(:disabled):not([aria-disabled=true]){background-color:#fff3;box-shadow:none}._button--loading_t5esz_181{position:relative;color:transparent}._icon_1se7w_1{display:inline-block;flex-shrink:0;vertical-align:middle;color:currentColor;fill:currentColor}._icon--custom_1se7w_9{fill:unset}._labelMenuItem_fjxw4_1{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing-unit) * 2 * 1px);padding:calc(var(--spacing-unit) * 3 * 1px);border:none;background:transparent;cursor:pointer;transition:all var(--transitions-duration-base) var(--transitions-easing-easeInOut)}._labelMenuItem_fjxw4_1:hover:not(:disabled){opacity:.8}._labelMenuItem_fjxw4_1:active:not(:disabled){opacity:.6}._labelMenuItem_fjxw4_1:disabled{cursor:not-allowed;opacity:.5}._labelMenuItem_fjxw4_1:focus-visible{outline:2px solid var(--palette-primary-main);outline-offset:2px;border-radius:var(--border-radius-md)}._icon_fjxw4_32{display:flex;align-items:center;justify-content:center}._label_fjxw4_1{text-align:center}._heartIconOutline_137aq_1{fill:none}._likeButton_1nv5d_1{display:inline-flex;align-items:center;justify-content:center;gap:calc(var(--spacing-unit) * 2 * 1px);padding:calc(var(--spacing-unit) * 1.5 * 1px) calc(var(--spacing-unit) * 2 * 1px);border:none;border-radius:var(--border-radius-full);background:transparent;color:var(--palette-text-secondary);cursor:pointer;font-family:var(--typography-font-family);transition:color var(--transitions-duration-base) var(--transitions-easing-easeInOut),transform var(--transitions-duration-base) var(--transitions-easing-easeOut),filter var(--transitions-duration-base) var(--transitions-easing-easeInOut)}._likeButton_1nv5d_1:hover:not(._likeButton--disabled_1nv5d_19){color:var(--palette-primary-main);transform:scale(1.08);filter:drop-shadow(0 0 6px var(--palette-primary-main))}._likeButton--liked_1nv5d_25{color:var(--palette-primary-main)}._likeButton--liked_1nv5d_25:hover:not(._likeButton--disabled_1nv5d_19){color:var(--palette-primary-hover);filter:drop-shadow(0 0 8px var(--palette-primary-hover))}._likeButton_1nv5d_1:active:not(._likeButton--disabled_1nv5d_19){transform:scale(.98)}._likeButton_1nv5d_1:focus-visible{outline:2px solid var(--palette-primary-main);outline-offset:2px}._likeButton--disabled_1nv5d_19{cursor:not-allowed;opacity:.5}._likeButton--pop_1nv5d_49 ._heartWrap_1nv5d_49{animation:_heartPop_1nv5d_1 .55s cubic-bezier(.34,1.56,.64,1)}@keyframes _heartPop_1nv5d_1{0%{transform:scale(1)}25%{transform:scale(1.45)}50%{transform:scale(.92)}70%{transform:scale(1.12)}85%{transform:scale(.98)}to{transform:scale(1)}}._likeButton--liked_1nv5d_25:hover:not(._likeButton--disabled_1nv5d_19) ._heartWrap_1nv5d_49{animation:_heartBeat_1nv5d_1 .6s ease-in-out}@keyframes _heartBeat_1nv5d_1{0%,to{transform:scale(1)}20%{transform:scale(1.15)}40%{transform:scale(.95)}60%{transform:scale(1.08)}80%{transform:scale(1)}}._heartWrap_1nv5d_49{display:inline-flex;align-items:center;justify-content:center;width:1.25em;height:1.25em}._heart_1nv5d_49{width:100%;height:100%;transition:color var(--transitions-duration-base) var(--transitions-easing-easeInOut)}._countWrap_1nv5d_112{display:inline-flex;align-items:center;justify-content:flex-start;min-width:1.5em}._countWrap--bump_1nv5d_119{animation:_countBump_1nv5d_1 .5s cubic-bezier(.34,1.56,.64,1)}@keyframes _countBump_1nv5d_1{0%{transform:scale(1) translateY(0)}30%{transform:scale(1.35) translateY(-4px)}55%{transform:scale(.95) translateY(1px)}75%{transform:scale(1.08) translateY(-1px)}to{transform:scale(1) translateY(0)}}._count_1nv5d_112{margin:0;text-align:left}._stack_45gcn_1{display:flex}._stack--direction-row_45gcn_6{flex-direction:row}._stack--direction-column_45gcn_10{flex-direction:column}._stack--direction-row-reverse_45gcn_14{flex-direction:row-reverse}._stack--direction-column-reverse_45gcn_18{flex-direction:column-reverse}._stack--align-start_45gcn_23{align-items:flex-start}._stack--align-end_45gcn_27{align-items:flex-end}._stack--align-center_45gcn_31{align-items:center}._stack--align-stretch_45gcn_35{align-items:stretch}._stack--align-baseline_45gcn_39{align-items:baseline}._stack--justify-start_45gcn_44{justify-content:flex-start}._stack--justify-end_45gcn_48{justify-content:flex-end}._stack--justify-center_45gcn_52{justify-content:center}._stack--justify-between_45gcn_56{justify-content:space-between}._stack--justify-around_45gcn_60{justify-content:space-around}._stack--justify-evenly_45gcn_64{justify-content:space-evenly}._stack--wrap-nowrap_45gcn_69{flex-wrap:nowrap}._stack--wrap-wrap_45gcn_73{flex-wrap:wrap}._stack--wrap-wrap-reverse_45gcn_77{flex-wrap:wrap-reverse}._grid_16nbv_1{display:grid}@media(min-width:640px){._grid_16nbv_1{grid-template-columns:repeat(var(--grid-cols-sm, var(--grid-cols-xs, 1)),1fr)}}@media(min-width:768px){._grid_16nbv_1{grid-template-columns:repeat(var(--grid-cols-md, var(--grid-cols-sm, var(--grid-cols-xs, 1))),1fr)}}@media(min-width:1024px){._grid_16nbv_1{grid-template-columns:repeat(var(--grid-cols-lg, var(--grid-cols-md, var(--grid-cols-sm, var(--grid-cols-xs, 1)))),1fr)}}@media(min-width:1280px){._grid_16nbv_1{grid-template-columns:repeat(var(--grid-cols-xl, var(--grid-cols-lg, var(--grid-cols-md, var(--grid-cols-sm, var(--grid-cols-xs, 1))))),1fr)}}@media(min-width:1536px){._grid_16nbv_1{grid-template-columns:repeat(var(--grid-cols-2xl, var(--grid-cols-xl, var(--grid-cols-lg, var(--grid-cols-md, var(--grid-cols-sm, var(--grid-cols-xs, 1)))))),1fr)}}._content_8ltuo_1{display:flex;flex-direction:column;width:100%}._content--tile_8ltuo_8 ._previewWrap_8ltuo_8{width:100%;aspect-ratio:16 / 10;flex-shrink:0}._content--tile_8ltuo_8 ._body_8ltuo_14{padding:calc(var(--spacing-unit) * 3 * 1px) calc(var(--spacing-unit) * 4 * 1px);display:flex;flex-direction:column;gap:calc(var(--spacing-unit) * 1 * 1px)}._content--row_8ltuo_22{flex-direction:row}._content--row_8ltuo_22 ._previewWrap_8ltuo_8{width:160px;min-width:160px;aspect-ratio:1;flex-shrink:0}._content--row_8ltuo_22 ._body_8ltuo_14{padding:calc(var(--spacing-unit) * 3 * 1px) calc(var(--spacing-unit) * 4 * 1px);display:flex;flex-direction:column;gap:calc(var(--spacing-unit) * 1 * 1px);min-width:0;flex:1}._previewWrap_8ltuo_8{position:relative;background-color:var(--palette-background-default);overflow:hidden}._tagsSlotTile_8ltuo_48{position:absolute;top:0;left:0;z-index:1;padding:calc(var(--spacing-unit) * 2 * 1px) calc(var(--spacing-unit) * 3 * 1px);display:flex;flex-wrap:wrap;gap:calc(var(--spacing-unit) * 1 * 1px);pointer-events:auto}._tagsSlotRow_8ltuo_60{display:flex;flex-wrap:wrap;gap:calc(var(--spacing-unit) * 1 * 1px);margin-bottom:calc(var(--spacing-unit) * 1 * 1px);pointer-events:auto}._previewImage_8ltuo_68{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;display:block;vertical-align:middle}._previewPlaceholder_8ltuo_76{width:100%;height:100%;min-height:120px;background-color:var(--palette-border-subtle);background-image:repeating-linear-gradient(-45deg,transparent,transparent 8px,var(--palette-background-paper) 8px,var(--palette-background-paper) 10px)}._title_8ltuo_90{color:var(--palette-text-secondary);overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-clamp:2;margin:0}._date_8ltuo_101{margin:0;flex-shrink:0}._root_19jmt_1{display:block;background-color:var(--palette-background-paper);border:var(--border-base) solid var(--palette-border-subtle);border-radius:var(--border-radius-lg);overflow:hidden;box-shadow:var(--shadows-sm);text-decoration:none;color:inherit;transition:transform var(--transitions-duration-slow) var(--transitions-easing-easeInOut),box-shadow var(--transitions-duration-slow) var(--transitions-easing-easeInOut),border-color var(--transitions-duration-slow) var(--transitions-easing-easeInOut),background-color var(--transitions-duration-slow) var(--transitions-easing-easeInOut)}._root--interactive_19jmt_17{cursor:pointer}._root--interactive_19jmt_17:hover{transform:translateY(-2px);box-shadow:var(--shadows-lg);border-color:var(--palette-border-default);background-color:var(--palette-background-default)}._root--interactive_19jmt_17:focus-visible{outline:2px solid var(--palette-primary-main);outline-offset:2px}._root--tile_19jmt_33{max-width:360px}._root--row_19jmt_37{max-width:100%}
1
+ ._typography_11hr8_1{font-family:var(--typography-font-family);margin:0;padding:0}._typography--h1_11hr8_8{font-size:var(--typography-font-size-4xl);font-weight:var(--typography-font-weight-bold);line-height:var(--typography-line-height-tight);color:var(--palette-text-primary)}._typography--h2_11hr8_15{font-size:var(--typography-font-size-3xl);font-weight:var(--typography-font-weight-bold);line-height:var(--typography-line-height-tight);color:var(--palette-text-primary)}._typography--h3_11hr8_22{font-size:var(--typography-font-size-2xl);font-weight:var(--typography-font-weight-semibold);line-height:var(--typography-line-height-normal);color:var(--palette-text-primary)}._typography--h4_11hr8_29{font-size:var(--typography-font-size-xl);font-weight:var(--typography-font-weight-semibold);line-height:var(--typography-line-height-normal);color:var(--palette-text-primary)}._typography--h5_11hr8_36{font-size:var(--typography-font-size-lg);font-weight:var(--typography-font-weight-medium);line-height:var(--typography-line-height-normal);color:var(--palette-text-primary)}._typography--h6_11hr8_43{font-size:var(--typography-font-size-base);font-weight:var(--typography-font-weight-medium);line-height:var(--typography-line-height-normal);color:var(--palette-text-primary)}._typography--body_11hr8_50{font-size:var(--typography-font-size-base);font-weight:var(--typography-font-weight-normal);line-height:var(--typography-line-height-normal);color:var(--palette-text-primary)}._typography--caption_11hr8_57{font-size:var(--typography-font-size-sm);font-weight:var(--typography-font-weight-normal);line-height:var(--typography-line-height-normal);color:var(--palette-text-secondary)}._typography--overline_11hr8_64{font-size:var(--typography-font-size-xs);font-weight:var(--typography-font-weight-medium);line-height:var(--typography-line-height-normal);color:var(--palette-text-secondary);text-transform:uppercase;letter-spacing:.05em}._typography--xs_11hr8_74{font-size:var(--typography-font-size-xs)}._typography--sm_11hr8_78{font-size:var(--typography-font-size-sm)}._typography--base_11hr8_82{font-size:var(--typography-font-size-base)}._typography--lg_11hr8_86{font-size:var(--typography-font-size-lg)}._typography--xl_11hr8_90{font-size:var(--typography-font-size-xl)}._typography--2xl_11hr8_94{font-size:var(--typography-font-size-2xl)}._typography--3xl_11hr8_98{font-size:var(--typography-font-size-3xl)}._typography--4xl_11hr8_102{font-size:var(--typography-font-size-4xl)}._typography--color-primary_11hr8_107{color:var(--palette-text-primary)}._typography--color-secondary_11hr8_111{color:var(--palette-text-secondary)}._typography--color-disabled_11hr8_115{color:var(--palette-text-disabled)}._tag_10ar5_1{display:inline-flex;align-items:center;gap:calc(var(--spacing-unit) * 1 * 1px);border-radius:var(--border-radius-base);border:2px solid var(--palette-border-strong);font-family:var(--typography-font-family);font-weight:var(--typography-font-weight-medium);line-height:1;white-space:nowrap}._tag--link_10ar5_13{text-decoration:none;color:inherit}._tag--link_10ar5_13:focus-visible{outline:2px solid var(--palette-primary-main);outline-offset:2px}._tagContent_10ar5_23{display:inline-flex;align-items:center}._tagIcon_10ar5_28{display:inline-flex;align-items:center;flex-shrink:0}._tagClose_10ar5_34{display:inline-flex;align-items:center;justify-content:center;margin-left:calc(var(--spacing-unit) * 1 * 1px);padding:0;background:none;border:none;cursor:pointer;font-size:1.2em;line-height:1;color:inherit;opacity:.7;transition:opacity var(--transitions-duration-base) var(--transitions-easing-easeInOut)}._tagClose_10ar5_34:hover{opacity:1}._tagClose_10ar5_34:focus{outline:2px solid currentColor;outline-offset:2px}._tag--sm_10ar5_60{padding:calc(var(--spacing-unit) * 1 * 1px) calc(var(--spacing-unit) * 2 * 1px);font-size:var(--typography-font-size-xs)}._tag--md_10ar5_65{padding:calc(var(--spacing-unit) * 1 * 1px) calc(var(--spacing-unit) * 3 * 1px);font-size:var(--typography-font-size-sm)}._tag--lg_10ar5_70{padding:calc(var(--spacing-unit) * 2 * 1px) calc(var(--spacing-unit) * 4 * 1px);font-size:var(--typography-font-size-base)}._tag--primary_10ar5_76{background-color:var(--palette-primary-main);color:var(--palette-secondary-contrastText)}._tag--secondary_10ar5_81{background-color:var(--palette-secondary-main);color:var(--palette-secondary-contrastText)}._tag--success_10ar5_86{background-color:var(--palette-success-main);color:#fff}._tag--warning_10ar5_91{background-color:var(--palette-warning-main);color:#fff}._tag--error_10ar5_96{background-color:var(--palette-error-main);color:#fff}._tag--neutral_10ar5_101{background-color:var(--palette-border-default);color:var(--palette-text-primary)}._tagGroup_1b8va_1{display:flex;flex-wrap:wrap;gap:calc(var(--spacing-unit) * 1 * 1px);align-items:center}._button_t5esz_1{display:inline-flex;align-items:center;justify-content:center;gap:calc(var(--spacing-unit) * 2 * 1px);border:1px solid transparent;border-radius:var(--border-radius-lg);font-family:var(--typography-font-family);font-weight:var(--typography-font-weight-medium);line-height:1;cursor:pointer;transition:all var(--transitions-duration-base) var(--transitions-easing-easeInOut);text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;box-shadow:var(--shadows-sm)}._button_t5esz_1:focus-visible{outline:2px solid var(--palette-primary-main);outline-offset:2px}._button_t5esz_1:disabled,._button_t5esz_1[aria-disabled=true]{cursor:not-allowed;opacity:.6;box-shadow:none}._buttonContent_t5esz_32{display:inline-flex;align-items:center}._buttonIcon_t5esz_37{display:inline-flex;align-items:center;flex-shrink:0}._buttonSpinner_t5esz_43{display:inline-block;width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:_spin_t5esz_1 .6s linear infinite}@keyframes _spin_t5esz_1{to{transform:rotate(360deg)}}._button--sm_t5esz_60{padding:calc(var(--spacing-unit) * 1.5 * 1px) calc(var(--spacing-unit) * 3.5 * 1px);font-size:var(--typography-font-size-sm);min-height:36px}._button--md_t5esz_66{padding:calc(var(--spacing-unit) * 2.5 * 1px) calc(var(--spacing-unit) * 5 * 1px);font-size:var(--typography-font-size-base);min-height:44px}._button--lg_t5esz_72{padding:calc(var(--spacing-unit) * 3 * 1px) calc(var(--spacing-unit) * 6 * 1px);font-size:var(--typography-font-size-lg);min-height:52px}._button--fullWidth_t5esz_78{width:100%}._button--primary_t5esz_83{background-color:var(--palette-primary-hover);color:var(--palette-text-primary);border-color:var(--palette-primary-hover);box-shadow:var(--shadows-sm)}._button--primary_t5esz_83:hover:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-primary-main);border-color:var(--palette-primary-main);color:var(--palette-primary-contrast-text);box-shadow:var(--shadows-base);transform:translateY(-1px)}._button--primary_t5esz_83:active:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-primary-active);border-color:var(--palette-primary-active);color:var(--palette-primary-contrast-text);box-shadow:var(--shadows-sm);transform:translateY(0)}._button--secondary_t5esz_106{background-color:var(--palette-background-paper);color:var(--palette-secondary-contrast-text);border-color:var(--palette-secondary-main);box-shadow:var(--shadows-sm)}._button--secondary_t5esz_106:hover:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-secondary-hover);border-color:var(--palette-secondary-hover);color:var(--palette-secondary-contrast-text);box-shadow:var(--shadows-base);transform:translateY(-1px)}._button--secondary_t5esz_106:active:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-secondary-active);border-color:var(--palette-secondary-active);color:var(--palette-secondary-contrast-text);box-shadow:var(--shadows-sm);transform:translateY(0)}._button--outline_t5esz_129{background-color:var(--palette-background-paper);color:var(--palette-primary-main);border-color:var(--palette-primary-main);box-shadow:var(--shadows-sm)}._button--outline_t5esz_129:hover:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-primary-hover);color:var(--palette-text-secondary);border-color:var(--palette-primary-hover);box-shadow:var(--shadows-base);transform:translateY(-1px)}._button--outline_t5esz_129:active:not(:disabled):not([aria-disabled=true]){background-color:var(--palette-primary-active);color:var(--palette-primary-contrast-text);border-color:var(--palette-primary-active);box-shadow:var(--shadows-sm);transform:translateY(0)}._button--ghost_t5esz_152{background-color:transparent;color:var(--palette-primary-main);border-color:transparent;box-shadow:none}._button--ghost_t5esz_152:hover:not(:disabled):not([aria-disabled=true]){background-color:#0000000d;box-shadow:var(--shadows-sm)}._button--ghost_t5esz_152:active:not(:disabled):not([aria-disabled=true]){background-color:#0000001a;box-shadow:none}[data-color-scheme=dark] ._button--ghost_t5esz_152:hover:not(:disabled):not([aria-disabled=true]){background-color:#ffffff1a;box-shadow:var(--shadows-sm)}[data-color-scheme=dark] ._button--ghost_t5esz_152:active:not(:disabled):not([aria-disabled=true]){background-color:#fff3;box-shadow:none}._button--loading_t5esz_181{position:relative;color:transparent}._icon_1se7w_1{display:inline-block;flex-shrink:0;vertical-align:middle;color:currentColor;fill:currentColor}._icon--custom_1se7w_9{fill:unset}._labelMenuItem_fjxw4_1{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing-unit) * 2 * 1px);padding:calc(var(--spacing-unit) * 3 * 1px);border:none;background:transparent;cursor:pointer;transition:all var(--transitions-duration-base) var(--transitions-easing-easeInOut)}._labelMenuItem_fjxw4_1:hover:not(:disabled){opacity:.8}._labelMenuItem_fjxw4_1:active:not(:disabled){opacity:.6}._labelMenuItem_fjxw4_1:disabled{cursor:not-allowed;opacity:.5}._labelMenuItem_fjxw4_1:focus-visible{outline:2px solid var(--palette-primary-main);outline-offset:2px;border-radius:var(--border-radius-md)}._icon_fjxw4_32{display:flex;align-items:center;justify-content:center}._label_fjxw4_1{text-align:center}._heartIconOutline_137aq_1{fill:none}._likeButton_1nv5d_1{display:inline-flex;align-items:center;justify-content:center;gap:calc(var(--spacing-unit) * 2 * 1px);padding:calc(var(--spacing-unit) * 1.5 * 1px) calc(var(--spacing-unit) * 2 * 1px);border:none;border-radius:var(--border-radius-full);background:transparent;color:var(--palette-text-secondary);cursor:pointer;font-family:var(--typography-font-family);transition:color var(--transitions-duration-base) var(--transitions-easing-easeInOut),transform var(--transitions-duration-base) var(--transitions-easing-easeOut),filter var(--transitions-duration-base) var(--transitions-easing-easeInOut)}._likeButton_1nv5d_1:hover:not(._likeButton--disabled_1nv5d_19){color:var(--palette-primary-main);transform:scale(1.08);filter:drop-shadow(0 0 6px var(--palette-primary-main))}._likeButton--liked_1nv5d_25{color:var(--palette-primary-main)}._likeButton--liked_1nv5d_25:hover:not(._likeButton--disabled_1nv5d_19){color:var(--palette-primary-hover);filter:drop-shadow(0 0 8px var(--palette-primary-hover))}._likeButton_1nv5d_1:active:not(._likeButton--disabled_1nv5d_19){transform:scale(.98)}._likeButton_1nv5d_1:focus-visible{outline:2px solid var(--palette-primary-main);outline-offset:2px}._likeButton--disabled_1nv5d_19{cursor:not-allowed;opacity:.5}._likeButton--pop_1nv5d_49 ._heartWrap_1nv5d_49{animation:_heartPop_1nv5d_1 .55s cubic-bezier(.34,1.56,.64,1)}@keyframes _heartPop_1nv5d_1{0%{transform:scale(1)}25%{transform:scale(1.45)}50%{transform:scale(.92)}70%{transform:scale(1.12)}85%{transform:scale(.98)}to{transform:scale(1)}}._likeButton--liked_1nv5d_25:hover:not(._likeButton--disabled_1nv5d_19) ._heartWrap_1nv5d_49{animation:_heartBeat_1nv5d_1 .6s ease-in-out}@keyframes _heartBeat_1nv5d_1{0%,to{transform:scale(1)}20%{transform:scale(1.15)}40%{transform:scale(.95)}60%{transform:scale(1.08)}80%{transform:scale(1)}}._heartWrap_1nv5d_49{display:inline-flex;align-items:center;justify-content:center;width:1.25em;height:1.25em}._heart_1nv5d_49{width:100%;height:100%;transition:color var(--transitions-duration-base) var(--transitions-easing-easeInOut)}._countWrap_1nv5d_112{display:inline-flex;align-items:center;justify-content:flex-start;min-width:1.5em}._countWrap--bump_1nv5d_119{animation:_countBump_1nv5d_1 .5s cubic-bezier(.34,1.56,.64,1)}@keyframes _countBump_1nv5d_1{0%{transform:scale(1) translateY(0)}30%{transform:scale(1.35) translateY(-4px)}55%{transform:scale(.95) translateY(1px)}75%{transform:scale(1.08) translateY(-1px)}to{transform:scale(1) translateY(0)}}._count_1nv5d_112{margin:0;text-align:left}._stack_45gcn_1{display:flex}._stack--direction-row_45gcn_6{flex-direction:row}._stack--direction-column_45gcn_10{flex-direction:column}._stack--direction-row-reverse_45gcn_14{flex-direction:row-reverse}._stack--direction-column-reverse_45gcn_18{flex-direction:column-reverse}._stack--align-start_45gcn_23{align-items:flex-start}._stack--align-end_45gcn_27{align-items:flex-end}._stack--align-center_45gcn_31{align-items:center}._stack--align-stretch_45gcn_35{align-items:stretch}._stack--align-baseline_45gcn_39{align-items:baseline}._stack--justify-start_45gcn_44{justify-content:flex-start}._stack--justify-end_45gcn_48{justify-content:flex-end}._stack--justify-center_45gcn_52{justify-content:center}._stack--justify-between_45gcn_56{justify-content:space-between}._stack--justify-around_45gcn_60{justify-content:space-around}._stack--justify-evenly_45gcn_64{justify-content:space-evenly}._stack--wrap-nowrap_45gcn_69{flex-wrap:nowrap}._stack--wrap-wrap_45gcn_73{flex-wrap:wrap}._stack--wrap-wrap-reverse_45gcn_77{flex-wrap:wrap-reverse}._grid_16nbv_1{display:grid}@media(min-width:640px){._grid_16nbv_1{grid-template-columns:repeat(var(--grid-cols-sm, var(--grid-cols-xs, 1)),1fr)}}@media(min-width:768px){._grid_16nbv_1{grid-template-columns:repeat(var(--grid-cols-md, var(--grid-cols-sm, var(--grid-cols-xs, 1))),1fr)}}@media(min-width:1024px){._grid_16nbv_1{grid-template-columns:repeat(var(--grid-cols-lg, var(--grid-cols-md, var(--grid-cols-sm, var(--grid-cols-xs, 1)))),1fr)}}@media(min-width:1280px){._grid_16nbv_1{grid-template-columns:repeat(var(--grid-cols-xl, var(--grid-cols-lg, var(--grid-cols-md, var(--grid-cols-sm, var(--grid-cols-xs, 1))))),1fr)}}@media(min-width:1536px){._grid_16nbv_1{grid-template-columns:repeat(var(--grid-cols-2xl, var(--grid-cols-xl, var(--grid-cols-lg, var(--grid-cols-md, var(--grid-cols-sm, var(--grid-cols-xs, 1)))))),1fr)}}._content_8ltuo_1{display:flex;flex-direction:column;width:100%}._content--tile_8ltuo_8 ._previewWrap_8ltuo_8{width:100%;aspect-ratio:16 / 10;flex-shrink:0}._content--tile_8ltuo_8 ._body_8ltuo_14{padding:calc(var(--spacing-unit) * 3 * 1px) calc(var(--spacing-unit) * 4 * 1px);display:flex;flex-direction:column;gap:calc(var(--spacing-unit) * 1 * 1px)}._content--row_8ltuo_22{flex-direction:row}._content--row_8ltuo_22 ._previewWrap_8ltuo_8{width:160px;min-width:160px;aspect-ratio:1;flex-shrink:0}._content--row_8ltuo_22 ._body_8ltuo_14{padding:calc(var(--spacing-unit) * 3 * 1px) calc(var(--spacing-unit) * 4 * 1px);display:flex;flex-direction:column;gap:calc(var(--spacing-unit) * 1 * 1px);min-width:0;flex:1}._previewWrap_8ltuo_8{position:relative;background-color:var(--palette-background-default);overflow:hidden}._tagsSlotTile_8ltuo_48{position:absolute;top:0;left:0;z-index:1;padding:calc(var(--spacing-unit) * 2 * 1px) calc(var(--spacing-unit) * 3 * 1px);display:flex;flex-wrap:wrap;gap:calc(var(--spacing-unit) * 1 * 1px);pointer-events:auto}._tagsSlotRow_8ltuo_60{display:flex;flex-wrap:wrap;gap:calc(var(--spacing-unit) * 1 * 1px);margin-bottom:calc(var(--spacing-unit) * 1 * 1px);pointer-events:auto}._previewImage_8ltuo_68{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;display:block;vertical-align:middle}._previewPlaceholder_8ltuo_76{width:100%;height:100%;min-height:120px;background-color:var(--palette-border-subtle);background-image:repeating-linear-gradient(-45deg,transparent,transparent 8px,var(--palette-background-paper) 8px,var(--palette-background-paper) 10px)}._title_8ltuo_90{color:var(--palette-text-secondary);overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-clamp:2;margin:0}._date_8ltuo_101{margin:0;flex-shrink:0}._root_19jmt_1{display:block;background-color:var(--palette-background-paper);border:var(--border-base) solid var(--palette-border-subtle);border-radius:var(--border-radius-lg);overflow:hidden;box-shadow:var(--shadows-sm);text-decoration:none;color:inherit;transition:transform var(--transitions-duration-slow) var(--transitions-easing-easeInOut),box-shadow var(--transitions-duration-slow) var(--transitions-easing-easeInOut),border-color var(--transitions-duration-slow) var(--transitions-easing-easeInOut),background-color var(--transitions-duration-slow) var(--transitions-easing-easeInOut)}._root--interactive_19jmt_17{cursor:pointer}._root--interactive_19jmt_17:hover{transform:translateY(-2px);box-shadow:var(--shadows-lg);border-color:var(--palette-border-default);background-color:var(--palette-background-default)}._root--interactive_19jmt_17:focus-visible{outline:2px solid var(--palette-primary-main);outline-offset:2px}._root--tile_19jmt_33{max-width:360px}._root--row_19jmt_37{max-width:100%}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;line-height:1.5;color:var(--palette-text-primary, #171717);background-color:#fff}button{font-family:inherit;font-size:inherit;line-height:inherit;cursor:pointer}input,textarea,select{font-family:inherit;font-size:inherit;line-height:inherit}:focus-visible{outline:2px solid var(--palette-primary-main, #0ea5e9);outline-offset:2px}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.2}p{margin:0}a{color:inherit;text-decoration:none}img{max-width:100%;height:auto;display:block}
@@ -0,0 +1 @@
1
+ export declare function deepMerge<T>(target: T, source: Partial<T>): T;
@@ -0,0 +1,2 @@
1
+ export { deepMerge } from './deepMerge';
2
+ export { openExternalLink } from './navigation';
@@ -0,0 +1 @@
1
+ export declare function openExternalLink(url: string, target?: string, features?: string): void;
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "name": "@atme-lab/ui-kit",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "Component library for personal projects",
5
5
  "type": "module",
6
- "main": "./dist/index.js",
6
+ "main": "./dist/index.cjs.js",
7
7
  "module": "./dist/index.esm.js",
8
8
  "types": "./dist/index.d.ts",
9
9
  "exports": {
10
10
  ".": {
11
11
  "types": "./dist/index.d.ts",
12
12
  "import": "./dist/index.esm.js",
13
- "require": "./dist/index.js"
13
+ "require": "./dist/index.cjs.js"
14
14
  },
15
15
  "./global": {
16
16
  "types": "./dist/global.d.ts",
17
17
  "import": "./dist/global.esm.js",
18
- "require": "./dist/global.js"
18
+ "require": "./dist/global.cjs.js"
19
19
  },
20
20
  "./tokens": {
21
21
  "types": "./dist/tokens/index.d.ts",
@@ -25,6 +25,28 @@
25
25
  "files": [
26
26
  "dist"
27
27
  ],
28
+ "scripts": {
29
+ "prepare": "husky",
30
+ "prepublishOnly": "npm run build",
31
+ "dev": "vite --config .configs/vite.config.ts",
32
+ "build": "tsc && vite build --config .configs/vite.config.ts",
33
+ "type-check": "tsc --noEmit",
34
+ "test": "vitest --config .configs/vitest.config.ts",
35
+ "test:ui": "vitest --config .configs/vitest.config.ts --ui",
36
+ "test:coverage": "vitest --config .configs/vitest.config.ts --coverage",
37
+ "storybook": "storybook dev -p 6006",
38
+ "build-storybook": "storybook build",
39
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --config .configs/eslintrc.cjs",
40
+ "lint:fix": "eslint . --ext ts,tsx --fix --config .configs/eslintrc.cjs",
41
+ "format": "prettier --write --config .configs/prettierrc \"**/*.{ts,tsx,js,jsx,json,css,md}\" --ignore-path .prettierignore",
42
+ "format:check": "prettier --check --config .configs/prettierrc \"**/*.{ts,tsx,js,jsx,json,css,md}\" --ignore-path .prettierignore",
43
+ "stylelint": "stylelint --config .configs/stylelintrc.json \"**/*.{css,pcss}\"",
44
+ "stylelint:fix": "stylelint --config .configs/stylelintrc.json \"**/*.{css,pcss}\" --fix",
45
+ "commit": "cz",
46
+ "release": "standard-version",
47
+ "release:minor": "standard-version --release-as minor",
48
+ "release:major": "standard-version --release-as major"
49
+ },
28
50
  "keywords": [
29
51
  "react",
30
52
  "ui",
@@ -88,30 +110,11 @@
88
110
  "tsx": "^4.21.0",
89
111
  "typescript": "^5.7.2",
90
112
  "vite": "^6.0.5",
91
- "vitest": "^4.0.16",
92
- "vite-aliases": "^0.11.8"
113
+ "vite-aliases": "^0.11.8",
114
+ "vite-plugin-dts": "^4.5.4",
115
+ "vitest": "^4.0.16"
93
116
  },
94
117
  "dependencies": {
95
118
  "classnames": "^2.5.1"
96
- },
97
- "scripts": {
98
- "dev": "vite --config .configs/vite.config.ts",
99
- "build": "tsc && vite build --config .configs/vite.config.ts",
100
- "type-check": "tsc --noEmit",
101
- "test": "vitest --config .configs/vitest.config.ts",
102
- "test:ui": "vitest --config .configs/vitest.config.ts --ui",
103
- "test:coverage": "vitest --config .configs/vitest.config.ts --coverage",
104
- "storybook": "storybook dev -p 6006",
105
- "build-storybook": "storybook build",
106
- "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --config .configs/eslintrc.cjs",
107
- "lint:fix": "eslint . --ext ts,tsx --fix --config .configs/eslintrc.cjs",
108
- "format": "prettier --write --config .configs/prettierrc \"**/*.{ts,tsx,js,jsx,json,css,md}\" --ignore-path .prettierignore",
109
- "format:check": "prettier --check --config .configs/prettierrc \"**/*.{ts,tsx,js,jsx,json,css,md}\" --ignore-path .prettierignore",
110
- "stylelint": "stylelint --config .configs/stylelintrc.json \"**/*.{css,pcss}\"",
111
- "stylelint:fix": "stylelint --config .configs/stylelintrc.json \"**/*.{css,pcss}\" --fix",
112
- "commit": "cz",
113
- "release": "standard-version",
114
- "release:minor": "standard-version --release-as minor",
115
- "release:major": "standard-version --release-as major"
116
119
  }
117
- }
120
+ }