@juspay/blend-design-system 0.0.24 → 0.0.25

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 (66) hide show
  1. package/dist/components/Avatar/Avatar.d.ts +2 -1
  2. package/dist/components/Avatar/types.d.ts +5 -0
  3. package/dist/components/Breadcrumb/types.d.ts +6 -0
  4. package/dist/components/Button/Button.d.ts +1 -1
  5. package/dist/components/Button/button.tokens.d.ts +4 -1
  6. package/dist/components/Button/types.d.ts +1 -1
  7. package/dist/components/Checkbox/checkbox.animations.d.ts +2 -0
  8. package/dist/components/DataTable/TableHeader/DraggableColumnHeader.d.ts +9 -0
  9. package/dist/components/DataTable/TableHeader/index.d.ts +2 -1
  10. package/dist/components/DataTable/TableHeader/types.d.ts +2 -0
  11. package/dist/components/DataTable/types.d.ts +25 -6
  12. package/dist/components/DateRangePicker/TimeSelector.d.ts +0 -2
  13. package/dist/components/DateRangePicker/dateRangePicker.tokens.d.ts +7 -19
  14. package/dist/components/Directory/directory.tokens.d.ts +86 -0
  15. package/dist/components/Directory/types.d.ts +5 -0
  16. package/dist/components/Drawer/types.d.ts +16 -0
  17. package/dist/components/Inputs/MultiValueInput/MultiValueInput.d.ts +1 -1
  18. package/dist/components/Inputs/MultiValueInput/types.d.ts +3 -1
  19. package/dist/components/Menu/menu.animations.d.ts +8 -0
  20. package/dist/components/Modal/modal.animations.d.ts +3 -0
  21. package/dist/components/Modal/modal.utils.d.ts +2 -0
  22. package/dist/components/Modal/useModal.d.ts +5 -0
  23. package/dist/components/MultiSelect/multiSelect.animations.d.ts +12 -0
  24. package/dist/components/Popover/popover.animations.d.ts +1 -0
  25. package/dist/components/Primitives/PrimitiveInput/PrimitiveInput.d.ts +5 -0
  26. package/dist/components/Primitives/PrimitiveTextArea.d.ts +5 -0
  27. package/dist/components/Radio/radio.animations.d.ts +1 -0
  28. package/dist/components/Sidebar/SidebarMobile/MobileNavigationItem.d.ts +11 -0
  29. package/dist/components/Sidebar/SidebarMobile/MoreButton.d.ts +7 -0
  30. package/dist/components/Sidebar/SidebarMobile/PrimaryActionButton.d.ts +8 -0
  31. package/dist/components/Sidebar/SidebarMobile/hooks.d.ts +24 -0
  32. package/dist/components/Sidebar/SidebarMobile/index.d.ts +3 -0
  33. package/dist/components/Sidebar/SidebarMobile/mobile.tokens.d.ts +81 -0
  34. package/dist/components/Sidebar/SidebarMobile/utils.d.ts +29 -0
  35. package/dist/components/Sidebar/TenantPanel.d.ts +1 -0
  36. package/dist/components/Sidebar/types.d.ts +36 -1
  37. package/dist/components/Sidebar/utils.d.ts +39 -1
  38. package/dist/components/SingleSelect/singleSelect.animations.d.ts +3 -0
  39. package/dist/components/SplitTag/types.d.ts +1 -10
  40. package/dist/components/StatCard/statcard.tokens.d.ts +1 -1
  41. package/dist/components/StatCard/types.d.ts +5 -0
  42. package/dist/components/Switch/switch.animations.d.ts +2 -0
  43. package/dist/components/Tags/Tags.d.ts +12 -0
  44. package/dist/components/Tags/tag.tokens.d.ts +2 -1
  45. package/dist/components/Tooltip/tooltip.animations.d.ts +1 -0
  46. package/dist/components/Topbar/topbar.tokens.d.ts +0 -1
  47. package/dist/components/Topbar/types.d.ts +7 -1
  48. package/dist/components/animations/ChevronAnimation/ChevronAnimation.d.ts +3 -0
  49. package/dist/components/animations/ChevronAnimation/index.d.ts +3 -0
  50. package/dist/components/animations/ChevronAnimation/types.d.ts +28 -0
  51. package/dist/components/animations/ChevronAnimation/utils.d.ts +3 -0
  52. package/dist/components/animations/Ripple/RippleContainer.d.ts +7 -0
  53. package/dist/components/animations/Ripple/index.d.ts +2 -0
  54. package/dist/components/common/error.animations.d.ts +4 -0
  55. package/dist/components/common/index.d.ts +2 -0
  56. package/dist/components/common/useErrorShake.d.ts +6 -0
  57. package/dist/context/ThemeContext.d.ts +6 -0
  58. package/dist/context/ThemeProvider.d.ts +6 -1
  59. package/dist/context/index.d.ts +1 -1
  60. package/dist/context/initComponentTokens.d.ts +2 -1
  61. package/dist/context/useComponentToken.d.ts +3 -1
  62. package/dist/hooks/useRipple.d.ts +11 -0
  63. package/dist/main.d.ts +1 -0
  64. package/dist/main.js +33676 -27408
  65. package/dist/tokens/unit.tokens.d.ts +2 -0
  66. package/package.json +5 -2
@@ -1,4 +1,4 @@
1
- import { AvatarSize, AvatarShape } from './types';
1
+ import { AvatarSize, AvatarShape, AvatarOnlinePosition } from './types';
2
2
  declare const Avatar: import('react').ForwardRefExoticComponent<{
3
3
  src?: string;
4
4
  alt?: string;
@@ -6,6 +6,7 @@ declare const Avatar: import('react').ForwardRefExoticComponent<{
6
6
  size?: AvatarSize;
7
7
  shape?: AvatarShape;
8
8
  online?: boolean;
9
+ onlinePosition?: AvatarOnlinePosition;
9
10
  leadingSlot?: React.ReactNode;
10
11
  trailingSlot?: React.ReactNode;
11
12
  } & Omit<import('react').HTMLAttributes<HTMLDivElement>, "children"> & import('react').RefAttributes<HTMLDivElement>>;
@@ -10,6 +10,10 @@ export declare enum AvatarShape {
10
10
  CIRCULAR = "circular",
11
11
  ROUNDED = "rounded"
12
12
  }
13
+ export declare enum AvatarOnlinePosition {
14
+ TOP = "top",
15
+ BOTTOM = "bottom"
16
+ }
13
17
  export type AvatarProps = {
14
18
  src?: string;
15
19
  alt?: string;
@@ -17,6 +21,7 @@ export type AvatarProps = {
17
21
  size?: AvatarSize;
18
22
  shape?: AvatarShape;
19
23
  online?: boolean;
24
+ onlinePosition?: AvatarOnlinePosition;
20
25
  leadingSlot?: React.ReactNode;
21
26
  trailingSlot?: React.ReactNode;
22
27
  } & Omit<HTMLAttributes<HTMLDivElement>, 'children'>;
@@ -3,4 +3,10 @@ export type BreadcrumbItemType = {
3
3
  rightSlot?: React.ReactNode;
4
4
  label: string;
5
5
  href: string;
6
+ /**
7
+ * Optional click handler for custom routing (e.g., React Router).
8
+ * When provided, prevents default link behavior and calls this handler instead.
9
+ * Use this to avoid page reloads and handle navigation with client-side routing.
10
+ */
11
+ onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;
6
12
  };
@@ -7,7 +7,7 @@ declare const Button: import('react').ForwardRefExoticComponent<{
7
7
  leadingIcon?: React.ReactNode;
8
8
  trailingIcon?: React.ReactNode;
9
9
  disabled?: boolean;
10
- onClick?: () => void;
10
+ onClick?: (event?: React.MouseEvent<HTMLButtonElement>) => void;
11
11
  loading?: boolean;
12
12
  showSkeleton?: boolean;
13
13
  skeletonVariant?: import('../Skeleton').SkeletonVariant;
@@ -37,7 +37,10 @@ export type ButtonTokensType = {
37
37
  padding: {
38
38
  [key in ButtonSize]: {
39
39
  [key in ButtonType]: {
40
- [key in ButtonSubType]: CSSObject['padding'];
40
+ [key in ButtonSubType]: {
41
+ x: CSSObject['padding'];
42
+ y: CSSObject['padding'];
43
+ };
41
44
  };
42
45
  };
43
46
  };
@@ -31,7 +31,7 @@ export type ButtonProps = {
31
31
  leadingIcon?: React.ReactNode;
32
32
  trailingIcon?: React.ReactNode;
33
33
  disabled?: boolean;
34
- onClick?: () => void;
34
+ onClick?: (event?: React.MouseEvent<HTMLButtonElement>) => void;
35
35
  loading?: boolean;
36
36
  showSkeleton?: boolean;
37
37
  skeletonVariant?: SkeletonVariant;
@@ -0,0 +1,2 @@
1
+ export declare const checkboxRootAnimations: import('styled-components').RuleSet<object>;
2
+ export declare const checkboxIndicatorAnimations: import('styled-components').RuleSet<object>;
@@ -0,0 +1,9 @@
1
+ interface DraggableColumnHeaderProps {
2
+ id: string;
3
+ children: React.ReactNode;
4
+ style?: React.CSSProperties;
5
+ disabled?: boolean;
6
+ 'data-table-column-heading'?: string;
7
+ }
8
+ export declare const DraggableColumnHeader: React.FC<DraggableColumnHeaderProps>;
9
+ export {};
@@ -1,3 +1,4 @@
1
+ import { default as React } from 'react';
1
2
  import { TableHeaderProps } from './types';
2
- declare const TableHeader: import('react').ForwardRefExoticComponent<TableHeaderProps<Record<string, unknown>> & import('react').RefAttributes<HTMLTableSectionElement>>;
3
+ declare const TableHeader: React.ForwardRefExoticComponent<TableHeaderProps<Record<string, unknown>> & React.RefAttributes<HTMLTableSectionElement>>;
3
4
  export default TableHeader;
@@ -8,6 +8,7 @@ export type TableHeaderProps<T extends Record<string, unknown>> = {
8
8
  sortConfig?: SortConfig | null;
9
9
  enableInlineEdit?: boolean;
10
10
  enableColumnManager?: boolean;
11
+ enableColumnReordering?: boolean;
11
12
  columnManagerMaxSelections?: number;
12
13
  columnManagerAlwaysSelected?: string[];
13
14
  columnManagerPrimaryAction?: {
@@ -36,6 +37,7 @@ export type TableHeaderProps<T extends Record<string, unknown>> = {
36
37
  onSortDescending?: (field: keyof T) => void;
37
38
  onSelectAll: (checked: boolean | 'indeterminate') => void;
38
39
  onColumnChange: (columns: ColumnDefinition<T>[]) => void;
40
+ onColumnReorder?: (columns: ColumnDefinition<T>[]) => void;
39
41
  onColumnFilter?: (field: string, type: FilterType, value: string | string[] | {
40
42
  min: number;
41
43
  max: number;
@@ -188,11 +188,12 @@ export type PaginationConfig = {
188
188
  totalRows: number;
189
189
  pageSizeOptions?: number[];
190
190
  };
191
- export type BulkAction = {
192
- id: string;
193
- label: string;
194
- variant: 'primary' | 'secondary' | 'danger';
195
- onClick: (selectedRowIds: string[]) => void;
191
+ export type BulkActionsConfig = {
192
+ showSelectAll?: boolean;
193
+ showDeselectAll?: boolean;
194
+ onSelectAll?: () => void;
195
+ onDeselectAll?: () => void;
196
+ customActions?: ReactNode;
196
197
  };
197
198
  export type RowActionConfig<T extends Record<string, unknown>> = {
198
199
  id: string;
@@ -234,6 +235,8 @@ export type DataTableProps<T extends Record<string, unknown>> = {
234
235
  onAdvancedFiltersChange?: (filters: unknown[]) => void;
235
236
  columnFreeze?: number;
236
237
  enableColumnManager?: boolean;
238
+ enableColumnReordering?: boolean;
239
+ onColumnReorder?: (columns: ColumnDefinition<T>[]) => void;
237
240
  columnManagerMaxSelections?: number;
238
241
  columnManagerAlwaysSelected?: (keyof T)[];
239
242
  columnManagerPrimaryAction?: {
@@ -274,8 +277,24 @@ export type DataTableProps<T extends Record<string, unknown>> = {
274
277
  isRowExpandable?: (row: T, index: number) => boolean;
275
278
  onRowExpansionChange?: (rowId: unknown, isExpanded: boolean, rowData: T) => void;
276
279
  enableRowSelection?: boolean;
277
- bulkActions?: BulkAction[];
280
+ onRowSelectionChange?: (selectedRowIds: string[], isSelected: boolean, rowId: string, rowData: T) => void;
281
+ bulkActions?: BulkActionsConfig;
278
282
  rowActions?: RowActionsConfig<T>;
279
283
  getRowStyle?: (row: T, index: number) => React.CSSProperties;
284
+ tableBodyHeight?: string | number;
285
+ /**
286
+ * Approximate height of a single row in pixels.
287
+ * Used to calculate minimum table height based on page size.
288
+ * Helps maintain consistent layout and prevent shifting.
289
+ * @default 52
290
+ */
291
+ rowHeight?: number;
292
+ /**
293
+ * Whether to maintain minimum height based on page size.
294
+ * When true, table maintains consistent height preventing layout shifts.
295
+ * When false, table height adjusts to content.
296
+ * @default true
297
+ */
298
+ maintainMinHeight?: boolean;
280
299
  mobileColumnsToShow?: number;
281
300
  };
@@ -1,12 +1,10 @@
1
1
  import { default as React } from 'react';
2
- import { CalendarTokenType } from './dateRangePicker.tokens';
3
2
  type TimeSelectorProps = {
4
3
  value: string;
5
4
  onChange: (time: string) => void;
6
5
  className?: string;
7
6
  autoFocus?: boolean;
8
7
  tabIndex?: number;
9
- calendarToken?: CalendarTokenType;
10
8
  };
11
9
  declare const TimeSelector: React.ForwardRefExoticComponent<TimeSelectorProps & React.RefAttributes<HTMLDivElement>>;
12
10
  export default TimeSelector;
@@ -83,7 +83,7 @@ export type CalendarTokenType = {
83
83
  border: CSSObject['border'];
84
84
  borderRadius: CSSObject['borderRadius'];
85
85
  boxShadow: CSSObject['boxShadow'];
86
- inputs: {
86
+ header: {
87
87
  padding: {
88
88
  x: CSSObject['padding'];
89
89
  y: CSSObject['padding'];
@@ -92,12 +92,9 @@ export type CalendarTokenType = {
92
92
  gap: CSSObject['gap'];
93
93
  label: {
94
94
  color: CSSObject['color'];
95
- width: CSSObject['width'];
96
95
  fontSize: CSSObject['fontSize'];
97
96
  fontWeight: CSSObject['fontWeight'];
98
97
  };
99
- fontSize: CSSObject['fontSize'];
100
- fontWeight: CSSObject['fontWeight'];
101
98
  };
102
99
  };
103
100
  calendarGrid: {
@@ -136,8 +133,8 @@ export type CalendarTokenType = {
136
133
  fontWeight: CSSObject['fontWeight'];
137
134
  fontSize: CSSObject['fontSize'];
138
135
  lineHeight: CSSObject['lineHeight'];
139
- outline: {
140
- [key in CalendarState]: CSSObject['outline'];
136
+ border: {
137
+ [key in CalendarState]: CSSObject['border'];
141
138
  };
142
139
  borderRadius: CSSObject['borderRadius'];
143
140
  };
@@ -166,14 +163,8 @@ export type CalendarTokenType = {
166
163
  todayDay: {
167
164
  fontWeight: CSSObject['fontWeight'];
168
165
  };
169
- hoverState: {
170
- boxShadow: CSSObject['boxShadow'];
171
- borderRadius: CSSObject['borderRadius'];
172
- };
173
166
  disabledDay: {
174
- opacity: CSSObject['opacity'];
175
- cursor: CSSObject['cursor'];
176
- pointerEvents: CSSObject['pointerEvents'];
167
+ color: CSSObject['color'];
177
168
  };
178
169
  };
179
170
  text: {
@@ -189,16 +180,13 @@ export type CalendarTokenType = {
189
180
  todayDay: {
190
181
  color: CSSObject['color'];
191
182
  };
183
+ disabledDate: {
184
+ color: CSSObject['color'];
185
+ };
192
186
  };
193
187
  todayIndicator: {
194
188
  width: CSSObject['width'];
195
- height: CSSObject['height'];
196
189
  backgroundColor: CSSObject['backgroundColor'];
197
- borderRadius: CSSObject['borderRadius'];
198
- position: CSSObject['position'];
199
- bottom: CSSObject['bottom'];
200
- left: CSSObject['left'];
201
- transform: CSSObject['transform'];
202
190
  };
203
191
  };
204
192
  };
@@ -0,0 +1,86 @@
1
+ import { CSSObject } from 'styled-components';
2
+ import { FoundationTokenType } from '../../tokens/theme.token';
3
+ import { BreakpointType } from '../../breakpoints/breakPoints';
4
+ export type DirectoryState = 'default' | 'hover' | 'active';
5
+ /**
6
+ * Directory Tokens following the pattern: [target].CSSProp.[state]
7
+ *
8
+ * Hierarchical Structure:
9
+ * - Container level: gap, paddingX, paddingY (spacing for the entire directory)
10
+ * - Section level: Contains header, label, chevron, and item
11
+ * - header: Controls section header layout
12
+ * - label: Controls section label text styling
13
+ * - chevron: Controls section collapse/expand icon
14
+ * - item: Navigation items within the section (NavItem)
15
+ * - nested: Child items within navigation items
16
+ *
17
+ * Pattern examples:
18
+ * - gap (space between sections)
19
+ * - paddingX (container horizontal padding)
20
+ * - section.header.padding (section header spacing)
21
+ * - section.item.backgroundColor.[state] (nav item background with states)
22
+ * - section.item.nested.paddingLeft (nested item indentation)
23
+ */
24
+ export type DirectoryTokenType = {
25
+ gap: CSSObject['gap'];
26
+ paddingX: CSSObject['padding'];
27
+ paddingY: CSSObject['padding'];
28
+ section: {
29
+ gap: CSSObject['gap'];
30
+ header: {
31
+ padding: {
32
+ x: CSSObject['padding'];
33
+ y: CSSObject['padding'];
34
+ };
35
+ label: {
36
+ fontSize: CSSObject['fontSize'];
37
+ color: CSSObject['color'];
38
+ fontWeight: CSSObject['fontWeight'];
39
+ };
40
+ chevron: {
41
+ width: CSSObject['width'];
42
+ color: CSSObject['color'];
43
+ };
44
+ };
45
+ itemList: {
46
+ gap: CSSObject['gap'];
47
+ item: {
48
+ padding: {
49
+ x: CSSObject['padding'];
50
+ y: CSSObject['padding'];
51
+ };
52
+ gap: CSSObject['gap'];
53
+ borderRadius: CSSObject['borderRadius'];
54
+ fontWeight: CSSObject['fontWeight'];
55
+ fontSize: CSSObject['fontSize'];
56
+ transition: CSSObject['transition'];
57
+ backgroundColor: {
58
+ [key in DirectoryState]: CSSObject['backgroundColor'];
59
+ };
60
+ color: {
61
+ [key in DirectoryState]: CSSObject['color'];
62
+ };
63
+ icon: {
64
+ width: CSSObject['width'];
65
+ };
66
+ chevron: {
67
+ width: CSSObject['width'];
68
+ color: CSSObject['color'];
69
+ };
70
+ };
71
+ nested: {
72
+ paddingLeft: CSSObject['paddingLeft'];
73
+ marginTop: CSSObject['marginTop'];
74
+ border: {
75
+ width: CSSObject['width'];
76
+ color: CSSObject['color'];
77
+ leftOffset: CSSObject['left'];
78
+ };
79
+ };
80
+ };
81
+ };
82
+ };
83
+ export type ResponsiveDirectoryTokens = {
84
+ [key in keyof BreakpointType]: DirectoryTokenType;
85
+ };
86
+ export declare const getDirectoryTokens: (foundationToken: FoundationTokenType) => ResponsiveDirectoryTokens;
@@ -17,6 +17,11 @@ export type NavbarItem = {
17
17
  onClick?: () => void;
18
18
  href?: string;
19
19
  isSelected?: boolean;
20
+ /**
21
+ * When true, the item appears in the Sidebar mobile navigation drawer.
22
+ * Desktop always renders all items regardless of this flag.
23
+ */
24
+ showOnMobile?: boolean;
20
25
  };
21
26
  export type SectionProps = {
22
27
  section: DirectoryData;
@@ -105,6 +105,14 @@ export type DrawerContentProps = {
105
105
  * Custom styles
106
106
  */
107
107
  style?: React.CSSProperties;
108
+ /**
109
+ * Accessibility label for the drawer content
110
+ */
111
+ 'aria-label'?: string;
112
+ /**
113
+ * ID of the element describing the drawer content
114
+ */
115
+ 'aria-describedby'?: string;
108
116
  };
109
117
  export type DrawerHeaderProps = {
110
118
  /**
@@ -125,6 +133,10 @@ export type DrawerTitleProps = {
125
133
  * Custom class name
126
134
  */
127
135
  className?: string;
136
+ /**
137
+ * ID for ARIA labeling
138
+ */
139
+ id?: string;
128
140
  };
129
141
  export type DrawerDescriptionProps = {
130
142
  /**
@@ -135,6 +147,10 @@ export type DrawerDescriptionProps = {
135
147
  * Custom class name
136
148
  */
137
149
  className?: string;
150
+ /**
151
+ * ID for ARIA description
152
+ */
153
+ id?: string;
138
154
  };
139
155
  export type DrawerFooterProps = {
140
156
  /**
@@ -1,3 +1,3 @@
1
1
  import { MultiValueInputProps } from './types';
2
- declare const MultiValueInput: ({ value, label, sublabel, disabled, required, error, errorMessage, hintText, tags, onTagAdd, onTagRemove, onChange, size, ...rest }: MultiValueInputProps) => import("react/jsx-runtime").JSX.Element;
2
+ declare const MultiValueInput: ({ value, label, sublabel, disabled, required, error, errorMessage, hintText, tags, onTagAdd, onTagRemove, onChange, size, onFocus, onBlur, ...rest }: MultiValueInputProps) => import("react/jsx-runtime").JSX.Element;
3
3
  export default MultiValueInput;
@@ -25,4 +25,6 @@ export type MultiValueInputProps = {
25
25
  onTagRemove?: (tag: string) => void;
26
26
  onChange?: (value: string) => void;
27
27
  size?: TextInputSize;
28
- } & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'style' | 'className' | 'onChange' | 'value'>;
28
+ onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
29
+ onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
30
+ } & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'style' | 'className' | 'onChange' | 'value' | 'onFocus' | 'onBlur'>;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Menu dropdown content animations
3
+ */
4
+ export declare const menuContentAnimations = "\n transform-origin: var(--radix-dropdown-menu-content-transform-origin);\n\n &[data-side='bottom'][data-state='open'] {\n animation: slideInFromTop 400ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n &[data-side='bottom'][data-state='closed'] {\n animation: slideOutToTop 300ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n &[data-side='top'][data-state='open'] {\n animation: slideInFromBottom 400ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n &[data-side='top'][data-state='closed'] {\n animation: slideOutToBottom 300ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n &[data-side='right'][data-state='open'] {\n animation: slideInFromLeft 400ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n &[data-side='right'][data-state='closed'] {\n animation: slideOutToLeft 300ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n &[data-side='left'][data-state='open'] {\n animation: slideInFromRight 400ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n &[data-side='left'][data-state='closed'] {\n animation: slideOutToRight 300ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n /* Shadcn-style keyframes with zoom + slide + fade */\n @keyframes slideInFromTop {\n from {\n opacity: 0;\n transform: translateY(-8px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes slideOutToTop {\n from {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateY(-8px) scale(0.95);\n }\n }\n\n @keyframes slideInFromBottom {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes slideOutToBottom {\n from {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateY(8px) scale(0.95);\n }\n }\n\n @keyframes slideInFromLeft {\n from {\n opacity: 0;\n transform: translateX(-8px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateX(0) scale(1);\n }\n }\n\n @keyframes slideOutToLeft {\n from {\n opacity: 1;\n transform: translateX(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateX(-8px) scale(0.95);\n }\n }\n\n @keyframes slideInFromRight {\n from {\n opacity: 0;\n transform: translateX(8px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateX(0) scale(1);\n }\n }\n\n @keyframes slideOutToRight {\n from {\n opacity: 1;\n transform: translateX(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateX(8px) scale(0.95);\n }\n }\n";
5
+ /**
6
+ * Submenu animations
7
+ */
8
+ export declare const submenuContentAnimations = "\n transform-origin: var(--radix-dropdown-menu-content-transform-origin);\n\n &[data-side='right'][data-state='open'] {\n animation: slideInFromLeft 400ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n &[data-side='right'][data-state='closed'] {\n animation: slideOutToLeft 300ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n &[data-side='left'][data-state='open'] {\n animation: slideInFromRight 400ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n &[data-side='left'][data-state='closed'] {\n animation: slideOutToRight 300ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n";
@@ -0,0 +1,3 @@
1
+ export declare const modalBackdropAnimations: (isAnimatingIn: boolean) => import('styled-components').RuleSet<object>;
2
+ export declare const modalContentAnimations: (isAnimatingIn: boolean) => import('styled-components').RuleSet<object>;
3
+ export declare const ANIMATION_DURATION = 500;
@@ -0,0 +1,2 @@
1
+ export declare const getPortalContainer: () => HTMLElement;
2
+ export declare const cleanupPortalContainer: () => void;
@@ -0,0 +1,5 @@
1
+ export declare const useModal: (isOpen: boolean, onClose: () => void) => {
2
+ shouldRender: boolean;
3
+ isAnimatingIn: boolean;
4
+ portalContainer: HTMLElement | null;
5
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * MultiSelect Dropdown Animations
3
+ *
4
+ * Shadcn-style animations with zoom + slide + fade
5
+ * - Combined animation in single keyframe
6
+ * - Side-aware based on dropdown position
7
+ * - Smooth spring easing
8
+ */
9
+ /**
10
+ * Main dropdown content animations
11
+ */
12
+ export declare const dropdownContentAnimations = "\n transform-origin: var(--radix-dropdown-menu-content-transform-origin);\n\n /* Opening animations - Shadcn style with zoom */\n &[data-side='bottom'][data-state='open'] {\n animation: slideInFromTop 400ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n &[data-side='bottom'][data-state='closed'] {\n animation: slideOutToTop 300ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n &[data-side='top'][data-state='open'] {\n animation: slideInFromBottom 400ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n &[data-side='top'][data-state='closed'] {\n animation: slideOutToBottom 300ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n &[data-side='right'][data-state='open'] {\n animation: slideInFromLeft 400ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n &[data-side='right'][data-state='closed'] {\n animation: slideOutToLeft 300ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n &[data-side='left'][data-state='open'] {\n animation: slideInFromRight 400ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n &[data-side='left'][data-state='closed'] {\n animation: slideOutToRight 300ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n /* Shadcn-style keyframes with zoom + slide + fade */\n @keyframes slideInFromTop {\n from {\n opacity: 0;\n transform: translateY(-8px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes slideOutToTop {\n from {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateY(-8px) scale(0.95);\n }\n }\n\n @keyframes slideInFromBottom {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes slideOutToBottom {\n from {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateY(8px) scale(0.95);\n }\n }\n\n @keyframes slideInFromLeft {\n from {\n opacity: 0;\n transform: translateX(-8px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateX(0) scale(1);\n }\n }\n\n @keyframes slideOutToLeft {\n from {\n opacity: 1;\n transform: translateX(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateX(-8px) scale(0.95);\n }\n }\n\n @keyframes slideInFromRight {\n from {\n opacity: 0;\n transform: translateX(8px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateX(0) scale(1);\n }\n }\n\n @keyframes slideOutToRight {\n from {\n opacity: 1;\n transform: translateX(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateX(8px) scale(0.95);\n }\n }\n";
@@ -0,0 +1 @@
1
+ export declare const popoverContentAnimations: import('styled-components').RuleSet<object>;
@@ -84,6 +84,11 @@ type PrimitiveInputProps = StateStyles & {
84
84
  overflowY?: CSSObject['overflowY'];
85
85
  contentCentered?: boolean;
86
86
  cursor?: CSSObject['cursor'];
87
+ transition?: CSSObject['transition'];
88
+ transitionProperty?: CSSObject['transitionProperty'];
89
+ transitionDuration?: CSSObject['transitionDuration'];
90
+ transitionTimingFunction?: CSSObject['transitionTimingFunction'];
91
+ transitionDelay?: CSSObject['transitionDelay'];
87
92
  placeholderStyles?: CSSObject;
88
93
  };
89
94
  export type InputProps = React.InputHTMLAttributes<HTMLInputElement> & PrimitiveInputProps & {
@@ -79,6 +79,11 @@ type PrimitiveTextareaProps = StateStyles & {
79
79
  overflowY?: CSSObject['overflowY'];
80
80
  contentCentered?: boolean;
81
81
  cursor?: CSSObject['cursor'];
82
+ transition?: CSSObject['transition'];
83
+ transitionProperty?: CSSObject['transitionProperty'];
84
+ transitionDuration?: CSSObject['transitionDuration'];
85
+ transitionTimingFunction?: CSSObject['transitionTimingFunction'];
86
+ transitionDelay?: CSSObject['transitionDelay'];
82
87
  placeholderStyles?: CSSObject;
83
88
  resize?: CSSObject['resize'];
84
89
  fontFamily?: CSSObject['fontFamily'];
@@ -0,0 +1 @@
1
+ export declare const radioAnimations: import('styled-components').RuleSet<object>;
@@ -0,0 +1,11 @@
1
+ import { default as React } from 'react';
2
+ import { MobileNavigationItem as MobileNavigationItemType } from '../types';
3
+ import { MobileNavigationTokenType } from './mobile.tokens';
4
+ type MobileNavigationItemProps = {
5
+ item: MobileNavigationItemType;
6
+ index?: number;
7
+ tokens: MobileNavigationTokenType;
8
+ onSelect: (item: MobileNavigationItemType) => void;
9
+ };
10
+ declare const MobileNavigationItem: React.ForwardRefExoticComponent<MobileNavigationItemProps & React.RefAttributes<HTMLButtonElement>>;
11
+ export default MobileNavigationItem;
@@ -0,0 +1,7 @@
1
+ import { MobileNavigationTokenType } from './mobile.tokens';
2
+ type MoreButtonProps = {
3
+ tokens: MobileNavigationTokenType;
4
+ onClick: () => void;
5
+ };
6
+ declare const MoreButton: import('react').ForwardRefExoticComponent<MoreButtonProps & import('react').RefAttributes<HTMLButtonElement>>;
7
+ export default MoreButton;
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+ import { MobileNavigationTokenType } from './mobile.tokens';
3
+ type PrimaryActionButtonProps = {
4
+ tokens: MobileNavigationTokenType;
5
+ buttonProps?: Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'>;
6
+ };
7
+ declare const PrimaryActionButton: React.ForwardRefExoticComponent<PrimaryActionButtonProps & React.RefAttributes<HTMLButtonElement>>;
8
+ export default PrimaryActionButton;
@@ -0,0 +1,24 @@
1
+ import { MobileNavigationItem } from '../types';
2
+ /**
3
+ * Custom hook to manage ordered items with smart property updates.
4
+ * Only resets order when items are added/removed, otherwise preserves order
5
+ * and just updates properties (like isSelected).
6
+ *
7
+ * This hook is extracted because:
8
+ * 1. It encapsulates complex state logic
9
+ * 2. The logic is reusable across different navigation contexts
10
+ * 3. It keeps the component clean and focused on rendering
11
+ */
12
+ export declare const useOrderedItems: <T extends {
13
+ label: string;
14
+ }>(items: T[]) => readonly [T[], import('react').Dispatch<import('react').SetStateAction<T[]>>];
15
+ /**
16
+ * Custom hook for item selection with smart swapping logic.
17
+ * Handles the complex behavior of swapping secondary items with primary items.
18
+ *
19
+ * This hook is extracted because:
20
+ * 1. It encapsulates business logic for item swapping
21
+ * 2. It reduces component complexity
22
+ * 3. The logic is testable in isolation
23
+ */
24
+ export declare const useItemSelection: (orderedItems: MobileNavigationItem[], setOrderedItems: (items: MobileNavigationItem[]) => void, primaryItems: MobileNavigationItem[], hasSecondaryItems: boolean, onCollapse: () => void) => (item: MobileNavigationItem, isSecondaryItem?: boolean) => void;
@@ -0,0 +1,3 @@
1
+ import { SidebarMobileNavigationProps } from '../types';
2
+ declare const SidebarMobileNavigation: import('react').ForwardRefExoticComponent<SidebarMobileNavigationProps & import('react').RefAttributes<HTMLDivElement>>;
3
+ export default SidebarMobileNavigation;
@@ -0,0 +1,81 @@
1
+ import { CSSObject } from 'styled-components';
2
+ import { FoundationTokenType } from '../../../tokens/theme.token';
3
+ import { BreakpointType } from '../../../breakpoints/breakPoints';
4
+ export type MobileNavigationState = 'default' | 'active';
5
+ /**
6
+ * Mobile Navigation Tokens following the pattern: [target].CSSProp.[variant].[state]
7
+ *
8
+ * Structure matches Sidebar pattern for consistency:
9
+ * - Base properties: backgroundColor, drawer.*
10
+ * - Layout surfaces: padding/gap (container), row.*
11
+ * - Interactive elements: item.*, primaryAction.*
12
+ * - Interactive elements have state-based styling: [state] = default | active
13
+ *
14
+ * Note: This is mobile-only, so no responsive breakpoints needed.
15
+ * All navigation items (including the More button) use the same item tokens.
16
+ *
17
+ * Pattern examples:
18
+ * - padding.[axis] (wrapper spacing for all rows)
19
+ * - row.padding.[axis] (individual row spacing)
20
+ * - item.backgroundColor.[state] (item background per state)
21
+ * - primaryAction.width (primary action button dimensions)
22
+ */
23
+ export type MobileNavigationTokenType = {
24
+ backgroundColor: CSSObject['backgroundColor'];
25
+ drawer: {
26
+ borderRadius: CSSObject['borderRadius'];
27
+ borderTop: CSSObject['border'];
28
+ };
29
+ padding: {
30
+ x: CSSObject['padding'];
31
+ y: CSSObject['padding'];
32
+ };
33
+ gap: CSSObject['gap'];
34
+ row: {
35
+ padding: {
36
+ x: CSSObject['padding'];
37
+ y: CSSObject['padding'];
38
+ };
39
+ gap: CSSObject['gap'];
40
+ item: {
41
+ width: CSSObject['width'];
42
+ height: CSSObject['height'];
43
+ borderRadius: CSSObject['borderRadius'];
44
+ gap: CSSObject['gap'];
45
+ backgroundColor: {
46
+ [key in MobileNavigationState]: CSSObject['backgroundColor'];
47
+ };
48
+ color: {
49
+ [key in MobileNavigationState]: CSSObject['color'];
50
+ };
51
+ fontWeight: CSSObject['fontWeight'];
52
+ icon: {
53
+ width: CSSObject['width'];
54
+ height: CSSObject['height'];
55
+ borderRadius: CSSObject['borderRadius'];
56
+ transition: CSSObject['transition'];
57
+ };
58
+ text: {
59
+ fontSize: CSSObject['fontSize'];
60
+ fontWeight: CSSObject['fontWeight'];
61
+ textAlign: CSSObject['textAlign'];
62
+ };
63
+ };
64
+ primaryAction: {
65
+ width: CSSObject['width'];
66
+ height: CSSObject['height'];
67
+ borderRadius: CSSObject['borderRadius'];
68
+ background: CSSObject['background'];
69
+ boxShadow: CSSObject['boxShadow'];
70
+ color: CSSObject['color'];
71
+ icon: {
72
+ width: CSSObject['width'];
73
+ height: CSSObject['height'];
74
+ };
75
+ };
76
+ };
77
+ };
78
+ export type ResponsiveMobileNavigationTokens = {
79
+ [key in keyof BreakpointType]: MobileNavigationTokenType;
80
+ };
81
+ export declare const getMobileNavigationTokens: (foundationToken: FoundationTokenType) => ResponsiveMobileNavigationTokens;