@dmsi/wedgekit-react 0.0.2

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 (263) hide show
  1. package/README.md +35 -0
  2. package/dist/chunk-27KIIUAR.js +59 -0
  3. package/dist/chunk-2G2E2JMA.js +123 -0
  4. package/dist/chunk-4C66DLIJ.js +51 -0
  5. package/dist/chunk-4RD5ZF2V.js +55 -0
  6. package/dist/chunk-4RJKB7LC.js +14 -0
  7. package/dist/chunk-4T7F5BZZ.js +26 -0
  8. package/dist/chunk-5GOBP2JS.js +53 -0
  9. package/dist/chunk-6ZY524ID.js +42 -0
  10. package/dist/chunk-AWQSSKCK.js +32 -0
  11. package/dist/chunk-BNHSAFMP.js +93 -0
  12. package/dist/chunk-BWRHL2AG.js +439 -0
  13. package/dist/chunk-DKKYR6DS.js +132 -0
  14. package/dist/chunk-E5ALT5W7.js +182 -0
  15. package/dist/chunk-FY7PTP6E.js +322 -0
  16. package/dist/chunk-GTCSRHPF.js +119 -0
  17. package/dist/chunk-I2UVVKQI.js +12 -0
  18. package/dist/chunk-IGQVA7SC.js +41 -0
  19. package/dist/chunk-K3IKUSZW.js +59 -0
  20. package/dist/chunk-KENSVWOY.js +151 -0
  21. package/dist/chunk-KX3O6GJ6.js +138 -0
  22. package/dist/chunk-L4UM372R.js +253 -0
  23. package/dist/chunk-ORMEWXMH.js +37 -0
  24. package/dist/chunk-Q3FKEKIN.js +23 -0
  25. package/dist/chunk-SEKKGFM6.js +28 -0
  26. package/dist/chunk-SY3HT54E.js +91 -0
  27. package/dist/chunk-TAW5ZZ4Z.js +346 -0
  28. package/dist/chunk-TRUPPHBQ.js +109 -0
  29. package/dist/chunk-TU55CHXU.js +30 -0
  30. package/dist/chunk-TWZZB4WO.js +114 -0
  31. package/dist/chunk-TYI74BSP.js +62 -0
  32. package/dist/chunk-U42SKNR6.js +104 -0
  33. package/dist/chunk-UU3FA6LV.js +72 -0
  34. package/dist/chunk-WVUIIBRR.js +51 -0
  35. package/dist/chunk-XUIPGYP5.js +39 -0
  36. package/dist/chunk-Z4UCFUF7.js +299 -0
  37. package/dist/components/Breadcrumbs.cjs +376 -0
  38. package/dist/components/Breadcrumbs.js +90 -0
  39. package/dist/components/Button.cjs +319 -0
  40. package/dist/components/Button.js +8 -0
  41. package/dist/components/CalendarRange.cjs +520 -0
  42. package/dist/components/CalendarRange.js +13 -0
  43. package/dist/components/Caption.cjs +283 -0
  44. package/dist/components/Caption.js +80 -0
  45. package/dist/components/Checkbox.cjs +378 -0
  46. package/dist/components/Checkbox.js +11 -0
  47. package/dist/components/ContentTab.cjs +382 -0
  48. package/dist/components/ContentTab.js +10 -0
  49. package/dist/components/ContentTabs.cjs +472 -0
  50. package/dist/components/ContentTabs.js +98 -0
  51. package/dist/components/DMSiLogo.cjs +79 -0
  52. package/dist/components/DMSiLogo.js +56 -0
  53. package/dist/components/DataGrid.cjs +3113 -0
  54. package/dist/components/DataGrid.js +758 -0
  55. package/dist/components/DataGridCell.cjs +1907 -0
  56. package/dist/components/DataGridCell.js +24 -0
  57. package/dist/components/DataTable.cjs +791 -0
  58. package/dist/components/DataTable.js +720 -0
  59. package/dist/components/DateInput.cjs +1130 -0
  60. package/dist/components/DateInput.js +170 -0
  61. package/dist/components/DateRangeInput.cjs +1131 -0
  62. package/dist/components/DateRangeInput.js +171 -0
  63. package/dist/components/DebugJson.cjs +50 -0
  64. package/dist/components/DebugJson.js +27 -0
  65. package/dist/components/Display.cjs +234 -0
  66. package/dist/components/Display.js +12 -0
  67. package/dist/components/EditingContext.cjs +73 -0
  68. package/dist/components/EditingContext.js +35 -0
  69. package/dist/components/FilterGroup.cjs +1431 -0
  70. package/dist/components/FilterGroup.js +231 -0
  71. package/dist/components/FullViewportBox.cjs +35 -0
  72. package/dist/components/FullViewportBox.js +12 -0
  73. package/dist/components/Grid.cjs +69 -0
  74. package/dist/components/Grid.js +36 -0
  75. package/dist/components/GridContainer.cjs +125 -0
  76. package/dist/components/GridContainer.js +92 -0
  77. package/dist/components/Heading.cjs +238 -0
  78. package/dist/components/Heading.js +14 -0
  79. package/dist/components/HorizontalDivider.cjs +33 -0
  80. package/dist/components/HorizontalDivider.js +10 -0
  81. package/dist/components/Icon.cjs +98 -0
  82. package/dist/components/Icon.js +7 -0
  83. package/dist/components/Input.cjs +672 -0
  84. package/dist/components/Input.js +21 -0
  85. package/dist/components/InputGroup.cjs +270 -0
  86. package/dist/components/InputGroup.js +60 -0
  87. package/dist/components/Label.cjs +223 -0
  88. package/dist/components/Label.js +8 -0
  89. package/dist/components/Link.cjs +262 -0
  90. package/dist/components/Link.js +8 -0
  91. package/dist/components/List.cjs +37 -0
  92. package/dist/components/List.js +14 -0
  93. package/dist/components/LiveChatComponent.cjs +63 -0
  94. package/dist/components/LiveChatComponent.js +40 -0
  95. package/dist/components/LogoAgilityTopBar.cjs +115 -0
  96. package/dist/components/LogoAgilityTopBar.js +92 -0
  97. package/dist/components/LogoDMSiTopBar.cjs +79 -0
  98. package/dist/components/LogoDMSiTopBar.js +7 -0
  99. package/dist/components/LogoMillworkTopBar.cjs +221 -0
  100. package/dist/components/LogoMillworkTopBar.js +198 -0
  101. package/dist/components/MainBar.cjs +211 -0
  102. package/dist/components/MainBar.js +65 -0
  103. package/dist/components/Menu.cjs +437 -0
  104. package/dist/components/Menu.js +11 -0
  105. package/dist/components/MenuOption.cjs +483 -0
  106. package/dist/components/MenuOption.js +13 -0
  107. package/dist/components/MobileDataGrid.cjs +658 -0
  108. package/dist/components/MobileDataGrid.js +125 -0
  109. package/dist/components/Modal.cjs +783 -0
  110. package/dist/components/Modal.js +245 -0
  111. package/dist/components/ModalButtons.cjs +385 -0
  112. package/dist/components/ModalButtons.js +10 -0
  113. package/dist/components/ModalContent.cjs +57 -0
  114. package/dist/components/ModalContent.js +7 -0
  115. package/dist/components/ModalHeader.cjs +426 -0
  116. package/dist/components/ModalHeader.js +11 -0
  117. package/dist/components/ModalScrim.cjs +64 -0
  118. package/dist/components/ModalScrim.js +7 -0
  119. package/dist/components/NavigationTab.cjs +431 -0
  120. package/dist/components/NavigationTab.js +10 -0
  121. package/dist/components/NavigationTabs.cjs +477 -0
  122. package/dist/components/NavigationTabs.js +56 -0
  123. package/dist/components/Notification.cjs +640 -0
  124. package/dist/components/Notification.js +117 -0
  125. package/dist/components/OptionPill.cjs +478 -0
  126. package/dist/components/OptionPill.js +11 -0
  127. package/dist/components/Paragraph.cjs +231 -0
  128. package/dist/components/Paragraph.js +8 -0
  129. package/dist/components/Password.cjs +700 -0
  130. package/dist/components/Password.js +53 -0
  131. package/dist/components/ProjectBar.cjs +242 -0
  132. package/dist/components/ProjectBar.js +63 -0
  133. package/dist/components/Radio.cjs +349 -0
  134. package/dist/components/Radio.js +131 -0
  135. package/dist/components/Search.cjs +767 -0
  136. package/dist/components/Search.js +12 -0
  137. package/dist/components/Select.cjs +758 -0
  138. package/dist/components/Select.js +12 -0
  139. package/dist/components/SideMenu.cjs +54 -0
  140. package/dist/components/SideMenu.js +21 -0
  141. package/dist/components/SideMenuGroup.cjs +422 -0
  142. package/dist/components/SideMenuGroup.js +83 -0
  143. package/dist/components/SideMenuItem.cjs +388 -0
  144. package/dist/components/SideMenuItem.js +70 -0
  145. package/dist/components/Stack.cjs +138 -0
  146. package/dist/components/Stack.js +7 -0
  147. package/dist/components/StatusPill.cjs +265 -0
  148. package/dist/components/StatusPill.js +52 -0
  149. package/dist/components/Stepper.cjs +885 -0
  150. package/dist/components/Stepper.js +105 -0
  151. package/dist/components/Subheader.cjs +226 -0
  152. package/dist/components/Subheader.js +8 -0
  153. package/dist/components/Surface.cjs +98 -0
  154. package/dist/components/Surface.js +40 -0
  155. package/dist/components/Swatch.cjs +1728 -0
  156. package/dist/components/Swatch.js +1319 -0
  157. package/dist/components/Textarea.cjs +269 -0
  158. package/dist/components/Textarea.js +96 -0
  159. package/dist/components/Theme.cjs +36 -0
  160. package/dist/components/Theme.js +7 -0
  161. package/dist/components/Time.cjs +1118 -0
  162. package/dist/components/Time.js +353 -0
  163. package/dist/components/Toast.cjs +644 -0
  164. package/dist/components/Toast.js +218 -0
  165. package/dist/components/Tooltip.cjs +273 -0
  166. package/dist/components/Tooltip.js +9 -0
  167. package/dist/components/TopBar.cjs +352 -0
  168. package/dist/components/TopBar.js +132 -0
  169. package/dist/components/useInfiniteScroll.cjs +57 -0
  170. package/dist/components/useInfiniteScroll.js +8 -0
  171. package/dist/components/useMatchesMedia.cjs +53 -0
  172. package/dist/components/useMatchesMedia.js +9 -0
  173. package/dist/components/useMenuSystem.cjs +358 -0
  174. package/dist/components/useMenuSystem.js +11 -0
  175. package/dist/components/useMounted.cjs +39 -0
  176. package/dist/components/useMounted.js +8 -0
  177. package/dist/fonts.css +21 -0
  178. package/dist/icons-light[FILL]-PPZXOLWS.woff2 +0 -0
  179. package/dist/icons-normal[FILL]-PPZXOLWS.woff2 +0 -0
  180. package/dist/index.css +4401 -0
  181. package/dist/open-sans-55T6A4JE.woff2 +0 -0
  182. package/dist/types.cjs +18 -0
  183. package/dist/types.js +0 -0
  184. package/package.json +66 -0
  185. package/src/brand.css +125 -0
  186. package/src/classNames.ts +144 -0
  187. package/src/components/Breadcrumbs.tsx +116 -0
  188. package/src/components/Button.tsx +210 -0
  189. package/src/components/CalendarRange.tsx +429 -0
  190. package/src/components/Caption.tsx +101 -0
  191. package/src/components/Checkbox.tsx +196 -0
  192. package/src/components/ContentTab.tsx +66 -0
  193. package/src/components/ContentTabs.tsx +103 -0
  194. package/src/components/DMSiLogo.tsx +32 -0
  195. package/src/components/DataGrid.tsx +948 -0
  196. package/src/components/DataGridCell.tsx +384 -0
  197. package/src/components/DataTable.tsx +835 -0
  198. package/src/components/DateInput.tsx +188 -0
  199. package/src/components/DateRangeInput.tsx +179 -0
  200. package/src/components/DebugJson.tsx +24 -0
  201. package/src/components/Display.tsx +60 -0
  202. package/src/components/EditingContext.tsx +40 -0
  203. package/src/components/FilterGroup.tsx +234 -0
  204. package/src/components/FullViewportBox.tsx +11 -0
  205. package/src/components/Grid.tsx +75 -0
  206. package/src/components/GridContainer.tsx +124 -0
  207. package/src/components/Heading.tsx +66 -0
  208. package/src/components/HorizontalDivider.tsx +3 -0
  209. package/src/components/Icon.tsx +36 -0
  210. package/src/components/Input.tsx +511 -0
  211. package/src/components/InputGroup.tsx +51 -0
  212. package/src/components/Label.tsx +40 -0
  213. package/src/components/Link.tsx +106 -0
  214. package/src/components/List.tsx +10 -0
  215. package/src/components/LiveChatComponent.tsx +56 -0
  216. package/src/components/LogoAgilityTopBar.tsx +53 -0
  217. package/src/components/LogoDMSiTopBar.tsx +32 -0
  218. package/src/components/LogoMillworkTopBar.tsx +118 -0
  219. package/src/components/MainBar.tsx +83 -0
  220. package/src/components/Menu.tsx +286 -0
  221. package/src/components/MenuOption.tsx +275 -0
  222. package/src/components/MobileDataGrid.tsx +135 -0
  223. package/src/components/Modal.tsx +271 -0
  224. package/src/components/ModalButtons.tsx +44 -0
  225. package/src/components/ModalContent.tsx +23 -0
  226. package/src/components/ModalHeader.tsx +41 -0
  227. package/src/components/ModalScrim.tsx +35 -0
  228. package/src/components/NavigationTab.tsx +89 -0
  229. package/src/components/NavigationTabs.tsx +63 -0
  230. package/src/components/Notification.tsx +120 -0
  231. package/src/components/OptionPill.tsx +114 -0
  232. package/src/components/Paragraph.tsx +49 -0
  233. package/src/components/Password.tsx +46 -0
  234. package/src/components/ProjectBar.tsx +76 -0
  235. package/src/components/Radio.tsx +140 -0
  236. package/src/components/Search.tsx +129 -0
  237. package/src/components/Select.tsx +104 -0
  238. package/src/components/SideMenu.tsx +21 -0
  239. package/src/components/SideMenuGroup.tsx +81 -0
  240. package/src/components/SideMenuItem.tsx +90 -0
  241. package/src/components/Stack.tsx +179 -0
  242. package/src/components/StatusPill.tsx +51 -0
  243. package/src/components/Stepper.tsx +91 -0
  244. package/src/components/Subheader.tsx +44 -0
  245. package/src/components/Surface.tsx +34 -0
  246. package/src/components/Swatch.tsx +1066 -0
  247. package/src/components/Textarea.tsx +101 -0
  248. package/src/components/Theme.tsx +13 -0
  249. package/src/components/Time.tsx +438 -0
  250. package/src/components/Toast.tsx +244 -0
  251. package/src/components/Tooltip.tsx +137 -0
  252. package/src/components/TopBar.tsx +124 -0
  253. package/src/components/useInfiniteScroll.tsx +40 -0
  254. package/src/components/useMatchesMedia.tsx +28 -0
  255. package/src/components/useMenuSystem.tsx +367 -0
  256. package/src/components/useMounted.tsx +14 -0
  257. package/src/darkmode.css +140 -0
  258. package/src/fonts.css +23 -0
  259. package/src/index.css +509 -0
  260. package/src/index.tsx +2 -0
  261. package/src/types.ts +149 -0
  262. package/src/utils/formatting.tsx +81 -0
  263. package/src/utils.ts +23 -0
@@ -0,0 +1,44 @@
1
+ import { Button } from "./Button";
2
+ import { Icon } from "./Icon";
3
+
4
+ type ModalButtonsProps = {
5
+ title?: string;
6
+ onClose?: () => void;
7
+ onContinue?: () => void;
8
+ sampleWidth?: boolean;
9
+ customActions?: React.ReactNode;
10
+ };
11
+
12
+ export const ModalButtons = ({
13
+ onClose,
14
+ onContinue,
15
+ customActions,
16
+ }: ModalButtonsProps) => {
17
+ return (
18
+ <div className="border-t border-neutral-300 p-4 flex justify-end space-x-2">
19
+ {customActions ?? (
20
+ <>
21
+ <Button
22
+ variant="secondary"
23
+ leftIcon={<Icon name="close" size={24} />}
24
+ onClick={onClose}
25
+ className="max-sm:w-full"
26
+ >
27
+ Close
28
+ </Button>
29
+
30
+ <Button
31
+ variant="primary"
32
+ leftIcon={<Icon name="check" size={24} />}
33
+ className="max-sm:w-full"
34
+ onClick={onContinue} // Assuming you want to close the modal on continue
35
+ >
36
+ Continue
37
+ </Button>
38
+ </>
39
+ )}
40
+ </div>
41
+ );
42
+ };
43
+
44
+ ModalButtons.displayName = "ModalButtons";
@@ -0,0 +1,23 @@
1
+ import clsx from "clsx";
2
+
3
+ export interface ModalContentProps {
4
+ fixedHeightScrolling?: boolean;
5
+ }
6
+
7
+ export function ModalContent({
8
+ fixedHeightScrolling,
9
+ children,
10
+ }: React.PropsWithChildren<ModalContentProps>) {
11
+ return (
12
+ <div
13
+ className={clsx(
14
+ "flex-grow desktop:flex-grow-0 p-4",
15
+ fixedHeightScrolling && "overflow-auto",
16
+ )}
17
+ >
18
+ {children}
19
+ </div>
20
+ );
21
+ }
22
+
23
+ ModalContent.displayName = "ModalContent";
@@ -0,0 +1,41 @@
1
+ import { Heading2 } from "./Heading";
2
+
3
+ import { Button } from "./Button";
4
+ import { Icon } from "./Icon";
5
+
6
+ type ModalHeaderProps = {
7
+ title?: string;
8
+ hideCloseIcon?: boolean;
9
+ headerIcon?: React.ReactNode;
10
+ onClose?: () => void;
11
+ };
12
+
13
+ export const ModalHeader = ({
14
+ title,
15
+ hideCloseIcon,
16
+ headerIcon,
17
+ onClose,
18
+ }: ModalHeaderProps) => {
19
+ return (
20
+ <div className="flex justify-between items-center p-mobile-container-padding desktop:p-desktop-container-padding compact:p-desktop-compact-container-padding gap-mobile-container-gap desktop:gap-desktop-container-gap compact:gap-desktop-compact-container-gap">
21
+ <div className="flex items-center gap-2">
22
+ {headerIcon}
23
+ {title && <Heading2 as="p">{title}</Heading2>}
24
+ </div>
25
+ {!hideCloseIcon && (
26
+ <Button
27
+ iconOnly
28
+ variant="tertiary"
29
+ onClick={onClose}
30
+ leftIcon={
31
+ <span className="text-icon-primary-normal contents">
32
+ <Icon name="close" size={24} />
33
+ </span>
34
+ }
35
+ />
36
+ )}
37
+ </div>
38
+ );
39
+ };
40
+
41
+ ModalHeader.displayName = "ModalHeader";
@@ -0,0 +1,35 @@
1
+ import clsx from "clsx";
2
+ import { PropsWithChildren } from "react";
3
+
4
+ type ModalScrimProps = PropsWithChildren<{
5
+ sampleWidth?: boolean;
6
+ show?: boolean;
7
+ size?: "small" | "medium" | "large" | "x-large";
8
+ onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
9
+ ref?: React.Ref<HTMLDivElement>;
10
+ }>;
11
+
12
+ export const ModalScrim = ({
13
+ show = false,
14
+ size = "small",
15
+ children,
16
+ onClick,
17
+ ref,
18
+ }: ModalScrimProps) => {
19
+ return (
20
+ <div
21
+ className={clsx(
22
+ "overflow-y-auto h-screen transition-[visibility,opacity,background] ease-in-out duration-100 grid place-content-center desktop:p-4 group bg-neutral-600/50 fixed opacity-0",
23
+ !show && " pointer-events-none",
24
+ size === "small" && "p-4",
25
+ "inset-0 z-50",
26
+ )}
27
+ onMouseDown={onClick}
28
+ ref={ref}
29
+ >
30
+ {children}
31
+ </div>
32
+ );
33
+ };
34
+
35
+ ModalScrim.displayName = "ModalScrim";
@@ -0,0 +1,89 @@
1
+ import clsx from "clsx";
2
+ import { Button } from "./Button";
3
+ import { Icon } from "./Icon";
4
+ import { CSSProperties } from "react";
5
+
6
+ export type NavigationTabProps = {
7
+ label?: string;
8
+ onClick?: () => void;
9
+ selected?: boolean;
10
+ className?: string;
11
+ disabled?: boolean;
12
+ colorPrimitives?: "dmsi" | "agility";
13
+ href?: string;
14
+ };
15
+
16
+ export const NavigationTab = ({
17
+ label,
18
+ onClick,
19
+ selected = false,
20
+ className,
21
+ disabled = false,
22
+ href,
23
+ ...props
24
+ }: NavigationTabProps) => {
25
+ const textClassName = clsx(
26
+ // "!text-text-on-action-primary-hover", // use this once semantic tokens are available
27
+ "!text-brand-text-on-action-primary-hover",
28
+ // "hover:!text-text-on-action-primary-hover", // use this once semantic tokens are available
29
+ "hover:!text-brand-text-on-action-primary-hover",
30
+ // "active:!text-text-on-action-primary-active", // use this once semantic tokens are available
31
+ "active:!text-brand-text-on-action-primary-active",
32
+ "disabled:!text-brand-text-on-action-primary-disabled",
33
+ );
34
+
35
+ const disabledClassName = clsx(
36
+ "disabled:!bg-background-on-action-primary-disabled disabled:pointer-events-none",
37
+ );
38
+
39
+ const paddingClassName = clsx(
40
+ "p-mobile-component-padding desktop:p-desktop-component-padding compact:p-desktop-compact-component-padding",
41
+ );
42
+
43
+ const unselectedClassName = clsx(
44
+ "!bg-brand-200",
45
+ "hover:!bg-background-on-action-primary-normal",
46
+ // "hover:!bg-background-action-primary-normal", // use this once semantic tokens are available
47
+ "active:!bg-background-on-action-primary-active",
48
+ // "active:!bg-background-action-primary-active", // use this once semantic tokens are available
49
+ "shadow-nav-tab",
50
+ );
51
+
52
+ const selectedClassName = clsx(
53
+ "!bg-neutral-000",
54
+ "hover:!bg-background-on-action-primary-normal",
55
+ "active:!bg-background-on-action-primary-active",
56
+ );
57
+
58
+ const tokenOverrides: CSSProperties = {
59
+ '--color-text-on-action-primary-hover': 'var(--color-brand-500)',
60
+ '--color-text-on-action-primary-active': 'var(--color-brand-300)'
61
+ }
62
+
63
+ return (
64
+ <Button
65
+ variant="tertiary-critical"
66
+ colorClassName={textClassName}
67
+ className={clsx(
68
+ "!border-0 !rounded-b-none h-10 min-w-20 relative",
69
+ paddingClassName,
70
+ disabledClassName,
71
+ !selected && unselectedClassName,
72
+ selected && selectedClassName,
73
+ className,
74
+ )}
75
+ style={tokenOverrides}
76
+ classNameLabel="px-1"
77
+ rightIcon={<Icon name="close" size={16} />}
78
+ onClick={onClick}
79
+ disabled={disabled}
80
+ {...props}
81
+ as={href ? "a" : undefined}
82
+ href={href}
83
+ >
84
+ {label}
85
+ </Button>
86
+ );
87
+ };
88
+
89
+ NavigationTab.displayName = "NavigationTab";
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import clsx from "clsx";
3
+ import { ReactNode, useState } from "react";
4
+ import { NavigationTab } from "./NavigationTab";
5
+ import { componentGap } from "../classNames";
6
+
7
+ type Tab = {
8
+ id: string;
9
+ label: string;
10
+ href?: string;
11
+ content?: ReactNode;
12
+ };
13
+
14
+ export type NavigationTabsProps = {
15
+ tabs: Tab[];
16
+ onTabChange?: (tabId: string) => void;
17
+ colorPrimitives?: "dmsi" | "agility";
18
+ };
19
+
20
+ export const NavigationTabs = ({
21
+ tabs,
22
+ onTabChange,
23
+ colorPrimitives = "dmsi",
24
+ }: NavigationTabsProps) => {
25
+ const [selectedTab, setSelectedTab] = useState<string>(tabs[0]?.id);
26
+
27
+ const handleTabClick = (id: string) => {
28
+ setSelectedTab(id);
29
+ onTabChange?.(id);
30
+ };
31
+
32
+ const selectedContent = tabs.find((tab) => tab.id === selectedTab)?.content;
33
+ const selectedTabHasHref = tabs.find((tab) => tab.id === selectedTab)?.href;
34
+
35
+ return (
36
+ <div>
37
+ <div>
38
+ <div
39
+ className={clsx(
40
+ "flex items-center relative overflow-x-auto overflow-y-hidden",
41
+ componentGap,
42
+ )}
43
+ >
44
+ {tabs.map((tab) => (
45
+ <NavigationTab
46
+ key={tab.id}
47
+ label={tab.label}
48
+ selected={selectedTab === tab.id}
49
+ onClick={() => handleTabClick(tab.id)}
50
+ colorPrimitives={colorPrimitives}
51
+ href={tab.href}
52
+ />
53
+ ))}
54
+ </div>
55
+ </div>
56
+ {selectedContent && !selectedTabHasHref && (
57
+ <div className="mt-2">{selectedContent}</div>
58
+ )}
59
+ </div>
60
+ );
61
+ };
62
+
63
+ NavigationTabs.displayName = "NavigationTabs";
@@ -0,0 +1,120 @@
1
+ "use client";
2
+
3
+ import clsx from "clsx";
4
+
5
+ import { ReactNode, useState } from "react";
6
+
7
+ import { Button } from "./Button";
8
+ import { Paragraph } from "./Paragraph";
9
+ import { Heading3 } from "./Heading";
10
+ import { Icon } from "./Icon";
11
+ import { Stack } from "./Stack";
12
+
13
+ export interface NotificationProps {
14
+ variant?: "success" | "warning" | "error" | "info";
15
+ title?: string;
16
+ message?: string;
17
+ enableMessage?: boolean;
18
+ description?: string;
19
+ enableDescription?: boolean;
20
+ disclaimer?: string;
21
+ enableDisclaimer?: boolean;
22
+ card?: boolean;
23
+ icon?: ReactNode;
24
+ }
25
+
26
+ const variants = {
27
+ success: {
28
+ className: "border-success-400",
29
+ icon: (
30
+ <span className="text-icon-success-normal contents">
31
+ <Icon name="check_circle" size={24} />
32
+ </span>
33
+ ),
34
+ },
35
+ warning: {
36
+ className: "border-warning-400",
37
+ icon: (
38
+ <span className="text-icon-warning-normal contents">
39
+ <Icon name="warning" size={24} />
40
+ </span>
41
+ ),
42
+ },
43
+ error: {
44
+ className: "border-critical-400",
45
+ icon: (
46
+ <span className="text-icon-critical-normal contents">
47
+ <Icon name="error" size={24} />
48
+ </span>
49
+ ),
50
+ },
51
+ info: {
52
+ className: "border-action-400",
53
+ icon: (
54
+ <span className="text-icon-on-action-secondary-normal contents">
55
+ <Icon name="info" size={24} />
56
+ </span>
57
+ ),
58
+ },
59
+ };
60
+
61
+ export const Notification = ({
62
+ variant = "success",
63
+ title,
64
+ message,
65
+ enableMessage = true,
66
+ description,
67
+ enableDescription = false,
68
+ disclaimer,
69
+ enableDisclaimer = false,
70
+ card = false,
71
+ ...props
72
+ }: NotificationProps) => {
73
+ const [visible, setVisible] = useState(true);
74
+
75
+ const { className, icon: iconElement } =
76
+ variants[variant] ?? variants.success;
77
+
78
+ if (!visible) return null;
79
+
80
+ return (
81
+ <div
82
+ className={clsx(
83
+ "flex gap-mobile-layout-gap desktop:gap-desktop-layout-gap compact:gap-desktop-compact-layout-gap justify-between items-center border-2 rounded-sm w-full p-mobile-layout-padding desktop:p-desktop-layout-padding compact:p-desktop-compact-layout-padding bg-white max-w-240",
84
+ className,
85
+ card && "shadow-4",
86
+ )}
87
+ {...props}
88
+ >
89
+ <Stack
90
+ horizontal
91
+ horizontalMobile
92
+ items="start"
93
+ justify="start"
94
+ sizing="layout"
95
+ >
96
+ {iconElement}
97
+
98
+ <Stack elevation={0} items="start" justify="start" sizing="component">
99
+ {title && <Heading3 as="h3">{title}</Heading3>}
100
+ {message && enableMessage && <Paragraph as="p">{message}</Paragraph>}
101
+ {description && enableDescription && (
102
+ <Paragraph as="p">{description}</Paragraph>
103
+ )}
104
+ {disclaimer && enableDisclaimer && (
105
+ <Paragraph as="p">{disclaimer}</Paragraph>
106
+ )}
107
+ </Stack>
108
+ </Stack>
109
+
110
+ <Button
111
+ iconOnly
112
+ variant="tertiary"
113
+ onClick={() => setVisible(false)}
114
+ leftIcon={<Icon name="close" size={24} />}
115
+ />
116
+ </div>
117
+ );
118
+ };
119
+
120
+ Notification.displayName = "Notification";
@@ -0,0 +1,114 @@
1
+ import clsx from "clsx";
2
+ import { ComponentProps } from "react";
3
+ import {
4
+ baseTransition,
5
+ componentGap,
6
+ componentPadding,
7
+ componentPaddingMinusBorder,
8
+ componentPaddingYUsingComponentGap,
9
+ } from "../classNames";
10
+ import { Button } from "./Button";
11
+ import { Label } from "./Label";
12
+ import { Icon } from "./Icon";
13
+
14
+ type OptionPillProps = {
15
+ selected?: boolean;
16
+ onClick?: () => void;
17
+ onRemove?: () => void;
18
+ removable?: boolean;
19
+ disabled?: boolean;
20
+ };
21
+
22
+ export const OptionPill = ({
23
+ selected = false,
24
+ onClick,
25
+ onRemove,
26
+ removable = false,
27
+ disabled = false,
28
+ children,
29
+ className,
30
+ ...props
31
+ }: ComponentProps<"div"> & OptionPillProps) => {
32
+ const additionalAttributes = {
33
+ "data-disabled": disabled || null,
34
+ "data-selected": selected || null,
35
+ };
36
+
37
+ const classNames = clsx(
38
+ {
39
+ "hover:border-border-action-hover active:border-border-action-active":
40
+ !disabled,
41
+ "data-disabled:cursor-default data-disabled:border-border-primary-normal":
42
+ disabled,
43
+
44
+ "data-selected:border-transparent data-selected:bg-background-action-secondary-hover data-selected:outline-border-action-normal data-selected:hover:outline-border-action-hover data-selected:active:outline-border-action-active":
45
+ selected,
46
+
47
+ "data-selected:data-disabled:bg-background-action-secondary-disabled data-selected:data-disabled:border-border-action-disabled data-selected:data-disabled:outline-transparent":
48
+ disabled && selected,
49
+ },
50
+ !removable && componentPadding,
51
+ removable &&
52
+ "pl-mobile-component-padding desktop:pl-desktop-component-padding compact:pl-desktop-compact-component-padding",
53
+ );
54
+
55
+ const textColor = clsx(
56
+ !disabled && "text-text-primary-normal",
57
+ disabled && !selected && "text-text-primary-disabled",
58
+ disabled && selected && "text-text-on-action-primary-disabled",
59
+ );
60
+
61
+ return (
62
+ <div
63
+ onClick={handleOnClick}
64
+ {...props}
65
+ {...additionalAttributes}
66
+ className={clsx(
67
+ "flex items-center justify-between cursor-pointer w-max",
68
+ "border border-border-primary-normal rounded-base",
69
+ "outline-2 outline-transparent -outline-offset-2",
70
+ componentGap,
71
+ baseTransition,
72
+ classNames,
73
+ className,
74
+ textColor,
75
+ )}
76
+ >
77
+ <Label padded className={componentPaddingYUsingComponentGap}>
78
+ {children}
79
+ </Label>
80
+
81
+ {removable && (
82
+ <Button
83
+ onClick={handleOnRemove}
84
+ disabled={disabled}
85
+ className={clsx(
86
+ "mx-0 h-full w-10 !border-0",
87
+ componentPaddingMinusBorder,
88
+ )}
89
+ iconOnly
90
+ variant="tertiary"
91
+ leftIcon={<Icon name="close" />}
92
+ />
93
+ )}
94
+ </div>
95
+ );
96
+
97
+ function handleOnClick() {
98
+ if (disabled) {
99
+ return;
100
+ }
101
+
102
+ onClick?.();
103
+ }
104
+
105
+ function handleOnRemove() {
106
+ if (!removable || !onRemove) {
107
+ return;
108
+ }
109
+
110
+ onRemove();
111
+ }
112
+ };
113
+
114
+ OptionPill.displayName = "OptionPill";
@@ -0,0 +1,49 @@
1
+ import clsx from "clsx";
2
+ import { componentPaddingXUsingComponentGap, typography } from "../classNames";
3
+ import { AsProps, TextAttributes, TypographyProps } from "../types";
4
+
5
+ type Tags = "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "span" | "p";
6
+
7
+ type ParagraphProps = {
8
+ as?: Tags;
9
+ } & AsProps<Tags> &
10
+ TextAttributes &
11
+ TypographyProps;
12
+
13
+ export const Paragraph = ({
14
+ className,
15
+ color,
16
+ padded,
17
+ align = "left",
18
+ tall,
19
+ addOverflow,
20
+ children,
21
+ as = "p",
22
+ ...props
23
+ }: ParagraphProps) => {
24
+ const Element = as;
25
+
26
+ return (
27
+ <Element
28
+ {...props}
29
+ className={clsx(
30
+ typography.paragraph,
31
+ className,
32
+ padded && componentPaddingXUsingComponentGap,
33
+ align === "left" && "text-left",
34
+ align === "center" && "text-center",
35
+ align === "right" && "text-right",
36
+ tall && "!leading-6",
37
+ addOverflow && "whitespace-nowrap text-ellipsis overflow-hidden",
38
+ )}
39
+ style={{
40
+ ...props.style,
41
+ color: color ? `var(--color-${color})` : undefined,
42
+ }}
43
+ >
44
+ {children}
45
+ </Element>
46
+ );
47
+ };
48
+
49
+ Paragraph.displayName = "Paragraph";
@@ -0,0 +1,46 @@
1
+ "use client";
2
+
3
+ import { ComponentProps, useState } from "react";
4
+ import { InputBase, InputBaseProps } from "./Input";
5
+ import { Icon } from "./Icon";
6
+
7
+ export const Password = ({
8
+ ...props
9
+ }: Omit<ComponentProps<"input">, "type" | "children"> & InputBaseProps) => {
10
+ const [show, setShow] = useState(false);
11
+
12
+ return (
13
+ <InputBase
14
+ {...props}
15
+ type={show ? "text" : "password"}
16
+ after={<WhichIcon show={show} setShow={setShow} />}
17
+ />
18
+ );
19
+ };
20
+
21
+ type WhichIconProps = {
22
+ show: boolean;
23
+ setShow: (value: boolean) => void;
24
+ };
25
+
26
+ const WhichIcon = ({ show, setShow }: WhichIconProps) => {
27
+ if (show) {
28
+ return (
29
+ <Icon
30
+ name="visibility_off"
31
+ className="cursor-pointer"
32
+ onClick={() => setShow(false)}
33
+ />
34
+ );
35
+ }
36
+
37
+ return (
38
+ <Icon
39
+ name="visibility"
40
+ className="cursor-pointer"
41
+ onClick={() => setShow(true)}
42
+ />
43
+ );
44
+ };
45
+
46
+ Password.displayName = "Password";