@freightos/freightwind 1.0.0

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 (198) hide show
  1. package/dist/cjs/components/accordion.js +57 -0
  2. package/dist/cjs/components/alert.js +76 -0
  3. package/dist/cjs/components/aspect-ratio.js +39 -0
  4. package/dist/cjs/components/avatar.js +75 -0
  5. package/dist/cjs/components/badge.js +24 -0
  6. package/dist/cjs/components/breadcrumb.js +65 -0
  7. package/dist/cjs/components/button.js +76 -0
  8. package/dist/cjs/components/calendar.js +106 -0
  9. package/dist/cjs/components/card.js +59 -0
  10. package/dist/cjs/components/chart.js +176 -0
  11. package/dist/cjs/components/checkbox.js +44 -0
  12. package/dist/cjs/components/chip.js +26 -0
  13. package/dist/cjs/components/collapsible.js +43 -0
  14. package/dist/cjs/components/command.js +73 -0
  15. package/dist/cjs/components/context-menu.js +83 -0
  16. package/dist/cjs/components/country-select.js +155 -0
  17. package/dist/cjs/components/date-picker.js +59 -0
  18. package/dist/cjs/components/date-range-picker.js +59 -0
  19. package/dist/cjs/components/date-time-picker.js +106 -0
  20. package/dist/cjs/components/dialog.js +70 -0
  21. package/dist/cjs/components/drawer.js +68 -0
  22. package/dist/cjs/components/dropdown-menu.js +85 -0
  23. package/dist/cjs/components/empty.js +42 -0
  24. package/dist/cjs/components/file-preview.js +73 -0
  25. package/dist/cjs/components/form.js +106 -0
  26. package/dist/cjs/components/inline-edit.js +83 -0
  27. package/dist/cjs/components/input-group.js +70 -0
  28. package/dist/cjs/components/input-otp.js +58 -0
  29. package/dist/cjs/components/input.js +57 -0
  30. package/dist/cjs/components/label.js +45 -0
  31. package/dist/cjs/components/menubar.js +96 -0
  32. package/dist/cjs/components/navigation-menu.js +68 -0
  33. package/dist/cjs/components/pagination.js +65 -0
  34. package/dist/cjs/components/phone-input.js +218 -0
  35. package/dist/cjs/components/popover.js +49 -0
  36. package/dist/cjs/components/progress.js +43 -0
  37. package/dist/cjs/components/radio-button-group.js +84 -0
  38. package/dist/cjs/components/radio-group.js +50 -0
  39. package/dist/cjs/components/resizable.js +47 -0
  40. package/dist/cjs/components/rich-text-editor.js +152 -0
  41. package/dist/cjs/components/route.js +47 -0
  42. package/dist/cjs/components/scroll-area.js +48 -0
  43. package/dist/cjs/components/select.js +71 -0
  44. package/dist/cjs/components/separator.js +43 -0
  45. package/dist/cjs/components/sheet.js +245 -0
  46. package/dist/cjs/components/skeleton.js +8 -0
  47. package/dist/cjs/components/slider.js +47 -0
  48. package/dist/cjs/components/sonner.js +25 -0
  49. package/dist/cjs/components/spinner.js +25 -0
  50. package/dist/cjs/components/stepper.js +99 -0
  51. package/dist/cjs/components/steps.js +127 -0
  52. package/dist/cjs/components/switch.js +66 -0
  53. package/dist/cjs/components/table.js +66 -0
  54. package/dist/cjs/components/tabs.js +51 -0
  55. package/dist/cjs/components/textarea.js +44 -0
  56. package/dist/cjs/components/time-picker.js +110 -0
  57. package/dist/cjs/components/toast.js +75 -0
  58. package/dist/cjs/components/toaster.js +12 -0
  59. package/dist/cjs/components/toggle-group.js +58 -0
  60. package/dist/cjs/components/toggle.js +62 -0
  61. package/dist/cjs/components/tooltip.js +49 -0
  62. package/dist/cjs/hooks/use-toast.js +166 -0
  63. package/dist/cjs/index.js +88 -0
  64. package/dist/cjs/lib/countryUtils.js +93 -0
  65. package/dist/cjs/lib/utils.js +8 -0
  66. package/dist/esm/components/accordion.js +18 -0
  67. package/dist/esm/components/alert.js +39 -0
  68. package/dist/esm/components/aspect-ratio.js +3 -0
  69. package/dist/esm/components/avatar.js +37 -0
  70. package/dist/esm/components/badge.js +20 -0
  71. package/dist/esm/components/breadcrumb.js +23 -0
  72. package/dist/esm/components/button.js +39 -0
  73. package/dist/esm/components/calendar.js +70 -0
  74. package/dist/esm/components/card.js +18 -0
  75. package/dist/esm/components/chart.js +135 -0
  76. package/dist/esm/components/checkbox.js +8 -0
  77. package/dist/esm/components/chip.js +22 -0
  78. package/dist/esm/components/collapsible.js +5 -0
  79. package/dist/esm/components/command.js +29 -0
  80. package/dist/esm/components/context-menu.js +33 -0
  81. package/dist/esm/components/country-select.js +118 -0
  82. package/dist/esm/components/date-picker.js +23 -0
  83. package/dist/esm/components/date-range-picker.js +23 -0
  84. package/dist/esm/components/date-time-picker.js +70 -0
  85. package/dist/esm/components/dialog.js +24 -0
  86. package/dist/esm/components/drawer.js +23 -0
  87. package/dist/esm/components/dropdown-menu.js +35 -0
  88. package/dist/esm/components/empty.js +6 -0
  89. package/dist/esm/components/file-preview.js +69 -0
  90. package/dist/esm/components/form.js +63 -0
  91. package/dist/esm/components/inline-edit.js +47 -0
  92. package/dist/esm/components/input-group.js +63 -0
  93. package/dist/esm/components/input-otp.js +19 -0
  94. package/dist/esm/components/input.js +21 -0
  95. package/dist/esm/components/label.js +9 -0
  96. package/dist/esm/components/menubar.js +45 -0
  97. package/dist/esm/components/navigation-menu.js +24 -0
  98. package/dist/esm/components/pagination.js +23 -0
  99. package/dist/esm/components/phone-input.js +181 -0
  100. package/dist/esm/components/popover.js +10 -0
  101. package/dist/esm/components/progress.js +7 -0
  102. package/dist/esm/components/radio-button-group.js +47 -0
  103. package/dist/esm/components/radio-group.js +13 -0
  104. package/dist/esm/components/resizable.js +9 -0
  105. package/dist/esm/components/rich-text-editor.js +145 -0
  106. package/dist/esm/components/route.js +11 -0
  107. package/dist/esm/components/scroll-area.js +11 -0
  108. package/dist/esm/components/select.js +26 -0
  109. package/dist/esm/components/separator.js +7 -0
  110. package/dist/esm/components/sheet.js +197 -0
  111. package/dist/esm/components/skeleton.js +6 -0
  112. package/dist/esm/components/slider.js +11 -0
  113. package/dist/esm/components/sonner.js +22 -0
  114. package/dist/esm/components/spinner.js +21 -0
  115. package/dist/esm/components/stepper.js +57 -0
  116. package/dist/esm/components/steps.js +80 -0
  117. package/dist/esm/components/switch.js +30 -0
  118. package/dist/esm/components/table.js +22 -0
  119. package/dist/esm/components/tabs.js +12 -0
  120. package/dist/esm/components/textarea.js +8 -0
  121. package/dist/esm/components/time-picker.js +74 -0
  122. package/dist/esm/components/toast.js +33 -0
  123. package/dist/esm/components/toaster.js +9 -0
  124. package/dist/esm/components/toggle-group.js +21 -0
  125. package/dist/esm/components/toggle.js +25 -0
  126. package/dist/esm/components/tooltip.js +10 -0
  127. package/dist/esm/hooks/use-toast.js +128 -0
  128. package/dist/esm/index.js +67 -0
  129. package/dist/esm/lib/countryUtils.js +87 -0
  130. package/dist/esm/lib/utils.js +5 -0
  131. package/dist/styles.css +152 -0
  132. package/dist/types/components/accordion.d.ts +11 -0
  133. package/dist/types/components/alert.d.ts +12 -0
  134. package/dist/types/components/aspect-ratio.d.ts +3 -0
  135. package/dist/types/components/avatar.d.ts +19 -0
  136. package/dist/types/components/badge.d.ts +9 -0
  137. package/dist/types/components/breadcrumb.d.ts +19 -0
  138. package/dist/types/components/button.d.ts +14 -0
  139. package/dist/types/components/calendar.d.ts +7 -0
  140. package/dist/types/components/card.d.ts +11 -0
  141. package/dist/types/components/chart.d.ts +66 -0
  142. package/dist/types/components/checkbox.d.ts +4 -0
  143. package/dist/types/components/chip.d.ts +10 -0
  144. package/dist/types/components/collapsible.d.ts +5 -0
  145. package/dist/types/components/command.d.ts +80 -0
  146. package/dist/types/components/context-menu.d.ts +27 -0
  147. package/dist/types/components/country-select.d.ts +17 -0
  148. package/dist/types/components/date-picker.d.ts +9 -0
  149. package/dist/types/components/date-range-picker.d.ts +10 -0
  150. package/dist/types/components/date-time-picker.d.ts +10 -0
  151. package/dist/types/components/dialog.d.ts +23 -0
  152. package/dist/types/components/drawer.d.ts +22 -0
  153. package/dist/types/components/dropdown-menu.d.ts +27 -0
  154. package/dist/types/components/empty.d.ts +6 -0
  155. package/dist/types/components/file-preview.d.ts +9 -0
  156. package/dist/types/components/form.d.ts +23 -0
  157. package/dist/types/components/inline-edit.d.ts +10 -0
  158. package/dist/types/components/input-group.d.ts +16 -0
  159. package/dist/types/components/input-otp.d.ts +34 -0
  160. package/dist/types/components/input.d.ts +9 -0
  161. package/dist/types/components/label.d.ts +5 -0
  162. package/dist/types/components/menubar.d.ts +28 -0
  163. package/dist/types/components/navigation-menu.d.ts +12 -0
  164. package/dist/types/components/pagination.d.ts +29 -0
  165. package/dist/types/components/phone-input.d.ts +20 -0
  166. package/dist/types/components/popover.d.ts +9 -0
  167. package/dist/types/components/progress.d.ts +4 -0
  168. package/dist/types/components/radio-button-group.d.ts +17 -0
  169. package/dist/types/components/radio-group.d.ts +5 -0
  170. package/dist/types/components/resizable.d.ts +23 -0
  171. package/dist/types/components/rich-text-editor.d.ts +8 -0
  172. package/dist/types/components/route.d.ts +10 -0
  173. package/dist/types/components/scroll-area.d.ts +5 -0
  174. package/dist/types/components/select.d.ts +13 -0
  175. package/dist/types/components/separator.d.ts +4 -0
  176. package/dist/types/components/sheet.d.ts +49 -0
  177. package/dist/types/components/skeleton.d.ts +2 -0
  178. package/dist/types/components/slider.d.ts +4 -0
  179. package/dist/types/components/sonner.d.ts +4 -0
  180. package/dist/types/components/spinner.d.ts +8 -0
  181. package/dist/types/components/stepper.d.ts +17 -0
  182. package/dist/types/components/steps.d.ts +64 -0
  183. package/dist/types/components/switch.d.ts +10 -0
  184. package/dist/types/components/table.d.ts +14 -0
  185. package/dist/types/components/tabs.d.ts +7 -0
  186. package/dist/types/components/textarea.d.ts +3 -0
  187. package/dist/types/components/time-picker.d.ts +10 -0
  188. package/dist/types/components/toast.d.ts +15 -0
  189. package/dist/types/components/toaster.d.ts +1 -0
  190. package/dist/types/components/toggle-group.d.ts +12 -0
  191. package/dist/types/components/toggle.d.ts +12 -0
  192. package/dist/types/components/tooltip.d.ts +7 -0
  193. package/dist/types/hooks/use-toast.d.ts +44 -0
  194. package/dist/types/index.d.ts +62 -0
  195. package/dist/types/lib/countryUtils.d.ts +20 -0
  196. package/dist/types/lib/utils.d.ts +2 -0
  197. package/package.json +84 -0
  198. package/tailwind-preset.js +70 -0
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCountryInfo = exports.getCountryFlagEmoji = exports.getCountryFlag = void 0;
4
+ /**
5
+ * Get flag image URL for country code (ISO 3166-1 alpha-2)
6
+ * Uses Freightos festatic CDN for flag images
7
+ * @param countryCode Two-letter country code (e.g., 'US', 'GB', 'FR')
8
+ * @returns Flag image URL or empty string if invalid
9
+ */
10
+ const getCountryFlag = (countryCode) => {
11
+ if (!countryCode || countryCode.length !== 2)
12
+ return '';
13
+ const lowerCode = countryCode.toLowerCase();
14
+ // Use Freightos festatic CDN for flag images
15
+ return `https://festatic.freightos.com/flags/1x1/${lowerCode}.svg`;
16
+ };
17
+ exports.getCountryFlag = getCountryFlag;
18
+ /**
19
+ * Get flag emoji for country code (ISO 3166-1 alpha-2)
20
+ * Uses Unicode regional indicator symbols to display flag emojis
21
+ */
22
+ const getCountryFlagEmoji = (countryCode) => {
23
+ if (!countryCode || countryCode.length !== 2)
24
+ return '';
25
+ const upperCode = countryCode.toUpperCase();
26
+ // Convert country code to regional indicator symbols (flag emoji)
27
+ const codePoints = [...upperCode].map(char => 0x1F1E6 + char.charCodeAt(0) - 65);
28
+ return String.fromCodePoint(...codePoints);
29
+ };
30
+ exports.getCountryFlagEmoji = getCountryFlagEmoji;
31
+ /**
32
+ * Common country names mapping (ISO 3166-1 alpha-2 codes)
33
+ */
34
+ const COUNTRY_NAMES = {
35
+ US: 'United States',
36
+ GB: 'United Kingdom',
37
+ CA: 'Canada',
38
+ FR: 'France',
39
+ DE: 'Germany',
40
+ IT: 'Italy',
41
+ ES: 'Spain',
42
+ NL: 'Netherlands',
43
+ BE: 'Belgium',
44
+ CH: 'Switzerland',
45
+ AT: 'Austria',
46
+ SE: 'Sweden',
47
+ NO: 'Norway',
48
+ DK: 'Denmark',
49
+ FI: 'Finland',
50
+ PL: 'Poland',
51
+ CZ: 'Czech Republic',
52
+ IE: 'Ireland',
53
+ PT: 'Portugal',
54
+ GR: 'Greece',
55
+ CN: 'China',
56
+ JP: 'Japan',
57
+ KR: 'South Korea',
58
+ IN: 'India',
59
+ AU: 'Australia',
60
+ NZ: 'New Zealand',
61
+ SG: 'Singapore',
62
+ HK: 'Hong Kong',
63
+ TW: 'Taiwan',
64
+ TH: 'Thailand',
65
+ MY: 'Malaysia',
66
+ ID: 'Indonesia',
67
+ PH: 'Philippines',
68
+ VN: 'Vietnam',
69
+ BR: 'Brazil',
70
+ MX: 'Mexico',
71
+ AR: 'Argentina',
72
+ CL: 'Chile',
73
+ CO: 'Colombia',
74
+ PE: 'Peru',
75
+ ZA: 'South Africa',
76
+ EG: 'Egypt',
77
+ IL: 'Israel',
78
+ AE: 'United Arab Emirates',
79
+ SA: 'Saudi Arabia',
80
+ TR: 'Turkey',
81
+ RU: 'Russia',
82
+ UA: 'Ukraine',
83
+ };
84
+ /**
85
+ * Get country information including flag, code, and name
86
+ */
87
+ const getCountryInfo = (countryCode) => {
88
+ const upperCode = countryCode?.toUpperCase() || '';
89
+ const flag = (0, exports.getCountryFlag)(upperCode);
90
+ const name = COUNTRY_NAMES[upperCode] || upperCode;
91
+ return { flag, code: upperCode, name };
92
+ };
93
+ exports.getCountryInfo = getCountryInfo;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cn = cn;
4
+ const clsx_1 = require("clsx");
5
+ const tailwind_merge_1 = require("tailwind-merge");
6
+ function cn(...inputs) {
7
+ return (0, tailwind_merge_1.twMerge)((0, clsx_1.clsx)(inputs));
8
+ }
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as AccordionPrimitive from '@radix-ui/react-accordion';
3
+ import * as React from 'react';
4
+ import { IconCaretDown } from '@freightos/icons';
5
+ import { cn } from '../lib/utils';
6
+ const Accordion = AccordionPrimitive.Root;
7
+ const AccordionItem = React.forwardRef(({ className, ...props }, ref) => (_jsx(AccordionPrimitive.Item, { ref: ref, className: cn(className), ...props })));
8
+ AccordionItem.displayName = 'AccordionItem';
9
+ const AccordionTrigger = React.forwardRef(({ className, children, caretPosition = 'end', bottom, ...props }, ref) => {
10
+ const caretIcon = (_jsx(IconCaretDown, { size: 18, className: "h-6 w-6 shrink-0 transition-transform duration-200" }));
11
+ return (_jsxs(AccordionPrimitive.Header, { className: "flex flex-col", children: [_jsxs(AccordionPrimitive.Trigger, { ref: ref, className: cn('flex flex-1 cursor-pointer items-center py-4 transition-all [&[data-state=open]>svg]:rotate-180', caretPosition === 'end'
12
+ ? 'justify-between pe-fds-lg'
13
+ : 'gap-fds-md ps-fds-lg', className), ...props, children: [caretPosition === 'start' && caretIcon, children, caretPosition === 'end' && caretIcon] }), bottom && _jsx("div", { children: bottom })] }));
14
+ });
15
+ AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
16
+ const AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => (_jsx(AccordionPrimitive.Content, { ref: ref, className: "overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down", ...props, children: _jsx("div", { className: cn(className), children: children }) })));
17
+ AccordionContent.displayName = AccordionPrimitive.Content.displayName;
18
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger };
@@ -0,0 +1,39 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { IconCheckCircled, IconClose, IconInfoCircled, IconAlertCircled, IconNegativeCircled } from '@freightos/icons';
4
+ import * as React from 'react';
5
+ import { cn } from '../lib/utils';
6
+ const alertConfig = {
7
+ info: {
8
+ icon: IconInfoCircled,
9
+ borderColor: 'border-l-fds-blue',
10
+ iconColor: 'text-fds-blue',
11
+ },
12
+ success: {
13
+ icon: IconCheckCircled,
14
+ borderColor: 'border-l-fds-green',
15
+ iconColor: 'text-fds-green',
16
+ },
17
+ warning: {
18
+ icon: IconAlertCircled,
19
+ borderColor: 'border-l-fds-orange',
20
+ iconColor: 'text-fds-orange',
21
+ },
22
+ error: {
23
+ icon: IconNegativeCircled,
24
+ borderColor: 'border-l-fds-red',
25
+ iconColor: 'text-fds-red',
26
+ },
27
+ };
28
+ export const Alert = ({ type = 'info', message, description, closable = false, onClose, className, }) => {
29
+ const [visible, setVisible] = React.useState(true);
30
+ if (!visible)
31
+ return null;
32
+ const config = alertConfig[type];
33
+ const Icon = config.icon;
34
+ const handleClose = () => {
35
+ setVisible(false);
36
+ onClose?.();
37
+ };
38
+ return (_jsxs("div", { role: "alert", className: cn('flex items-start gap-fds-sm rounded-[4px] border-l-4 bg-card px-fds-md py-fds-sm shadow-[0_0_10px_0_rgba(35,37,55,0.12)] dark:shadow-[0_0_10px_0_rgba(0,0,0,0.3)]', config.borderColor, className), children: [_jsx(Icon, { size: 18, className: cn('mt-px shrink-0', config.iconColor) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("div", { className: "text-fds-base font-fds-medium text-foreground", children: message }), description && (_jsx("div", { className: "mt-fds-xs text-fds-sm text-fds-gray-60", children: description }))] }), closable && (_jsx("button", { type: "button", onClick: handleClose, className: "shrink-0 text-fds-gray-40 hover:text-fds-gray-60 transition-colors", "aria-label": "Close alert", children: _jsx(IconClose, { size: 16 }) }))] }));
39
+ };
@@ -0,0 +1,3 @@
1
+ import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
2
+ const AspectRatio = AspectRatioPrimitive.Root;
3
+ export { AspectRatio };
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils';
3
+ import * as AvatarPrimitive from '@radix-ui/react-avatar';
4
+ import { cva } from 'class-variance-authority';
5
+ import * as React from 'react';
6
+ const avatarVariants = cva('relative flex shrink-0 overflow-hidden rounded-full', {
7
+ variants: {
8
+ size: {
9
+ xs: 'h-[16px] w-[16px]',
10
+ sm: 'h-[24px] w-[24px]',
11
+ md: 'h-[32px] w-[32px]',
12
+ lg: 'h-[40px] w-[40px]',
13
+ xl: 'h-[58px] w-[58px]',
14
+ },
15
+ bordered: {
16
+ true: 'border-fds-sm border-fds-gray-20',
17
+ false: '',
18
+ },
19
+ },
20
+ defaultVariants: {
21
+ size: 'md',
22
+ bordered: false,
23
+ },
24
+ });
25
+ const Avatar = React.forwardRef(({ className, size = 'md', bordered = false, type = 'default', country, ...props }, ref) => {
26
+ if (type === 'flag' && country) {
27
+ const flagUrl = `https://festatic.freightos.com/flags/1x1/${country.toLowerCase()}.svg`;
28
+ return (_jsx("div", { className: cn(avatarVariants({ size, bordered }), className), children: _jsx("img", { src: flagUrl, alt: country, className: "h-full w-full object-cover" }) }));
29
+ }
30
+ return (_jsx(AvatarPrimitive.Root, { ref: ref, className: cn(avatarVariants({ size, bordered }), className), ...props }));
31
+ });
32
+ Avatar.displayName = AvatarPrimitive.Root.displayName;
33
+ const AvatarImage = React.forwardRef(({ className, ...props }, ref) => (_jsx(AvatarPrimitive.Image, { ref: ref, className: cn('aspect-square h-full w-full', className), ...props })));
34
+ AvatarImage.displayName = AvatarPrimitive.Image.displayName;
35
+ const AvatarFallback = React.forwardRef(({ className, ...props }, ref) => (_jsx(AvatarPrimitive.Fallback, { ref: ref, className: cn('flex h-full w-full items-center justify-center rounded-full bg-muted', className), ...props })));
36
+ AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
37
+ export { Avatar, AvatarFallback, AvatarImage };
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import { cn } from "../lib/utils";
4
+ const badgeVariants = cva("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", {
5
+ variants: {
6
+ variant: {
7
+ default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
8
+ secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
9
+ destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
10
+ outline: "text-foreground",
11
+ },
12
+ },
13
+ defaultVariants: {
14
+ variant: "default",
15
+ },
16
+ });
17
+ function Badge({ className, variant, ...props }) {
18
+ return (_jsx("div", { className: cn(badgeVariants({ variant }), className), ...props }));
19
+ }
20
+ export { Badge, badgeVariants };
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Slot } from "@radix-ui/react-slot";
4
+ import { ChevronRight, MoreHorizontal } from "lucide-react";
5
+ import { cn } from "../lib/utils";
6
+ const Breadcrumb = React.forwardRef(({ ...props }, ref) => _jsx("nav", { ref: ref, "aria-label": "breadcrumb", ...props }));
7
+ Breadcrumb.displayName = "Breadcrumb";
8
+ const BreadcrumbList = React.forwardRef(({ className, ...props }, ref) => (_jsx("ol", { ref: ref, className: cn("flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", className), ...props })));
9
+ BreadcrumbList.displayName = "BreadcrumbList";
10
+ const BreadcrumbItem = React.forwardRef(({ className, ...props }, ref) => (_jsx("li", { ref: ref, className: cn("inline-flex items-center gap-1.5", className), ...props })));
11
+ BreadcrumbItem.displayName = "BreadcrumbItem";
12
+ const BreadcrumbLink = React.forwardRef(({ asChild, className, ...props }, ref) => {
13
+ const Comp = asChild ? Slot : "a";
14
+ return (_jsx(Comp, { ref: ref, className: cn("transition-colors hover:text-foreground", className), ...props }));
15
+ });
16
+ BreadcrumbLink.displayName = "BreadcrumbLink";
17
+ const BreadcrumbPage = React.forwardRef(({ className, ...props }, ref) => (_jsx("span", { ref: ref, role: "link", "aria-disabled": "true", "aria-current": "page", className: cn("font-normal text-foreground", className), ...props })));
18
+ BreadcrumbPage.displayName = "BreadcrumbPage";
19
+ const BreadcrumbSeparator = ({ children, className, ...props }) => (_jsx("li", { role: "presentation", "aria-hidden": "true", className: cn("[&>svg]:w-3.5 [&>svg]:h-3.5", className), ...props, children: children ?? _jsx(ChevronRight, {}) }));
20
+ BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
21
+ const BreadcrumbEllipsis = ({ className, ...props }) => (_jsxs("span", { role: "presentation", "aria-hidden": "true", className: cn("flex h-9 w-9 items-center justify-center", className), ...props, children: [_jsx(MoreHorizontal, { className: "h-4 w-4" }), _jsx("span", { className: "sr-only", children: "More" })] }));
22
+ BreadcrumbEllipsis.displayName = "BreadcrumbElipssis";
23
+ export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, };
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cva } from 'class-variance-authority';
3
+ import * as React from 'react';
4
+ import { cn } from '../lib/utils';
5
+ const buttonVariants = cva('inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--fds-border-radius-md)] font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', {
6
+ variants: {
7
+ type: {
8
+ default: 'bg-fds-blue !text-fds-white hover:bg-fds-blue-40',
9
+ secondary: 'bg-fds-white dark:bg-background border border-fds-blue !text-fds-blue hover:bg-fds-blue-10 dark:hover:bg-fds-gray-80',
10
+ tertiary: 'bg-fds-white dark:bg-fds-gray-90 !text-fds-blue hover:bg-fds-blue-10 dark:hover:bg-fds-gray-80',
11
+ text: 'bg-transparent !text-fds-blue hover:!text-fds-blue-50',
12
+ danger: 'bg-fds-red hover:bg-fds-red/90 !text-white',
13
+ },
14
+ size: {
15
+ small: 'h-[var(--fds-size-lg)] text-fds-sm',
16
+ medium: 'h-[var(--fds-size-xl)] text-fds-base',
17
+ large: 'h-[var(--fds-size-xxl)] text-fds-base',
18
+ },
19
+ padding: {
20
+ default: 'px-fds-lg',
21
+ small: 'px-fds-md',
22
+ large: 'px-fds-xl',
23
+ },
24
+ },
25
+ defaultVariants: {
26
+ type: 'default',
27
+ size: 'medium',
28
+ padding: 'default',
29
+ },
30
+ });
31
+ const Button = React.forwardRef(
32
+ // eslint-disable-next-line unused-imports/no-unused-vars
33
+ ({ className, type, size, icon = false, asChild = false, htmlType, ...props }, ref) => {
34
+ // Determine padding variant based on size, or none if icon
35
+ const paddingVariant = icon ? undefined : (size === 'small' ? 'small' : size === 'large' ? 'large' : 'default');
36
+ return (_jsx("button", { type: htmlType, className: cn(buttonVariants({ type, size, padding: paddingVariant }), icon && 'w-[var(--fds-size-xl)] aspect-square', icon && size === 'small' && 'w-[var(--fds-size-lg)]', icon && size === 'large' && 'w-[var(--fds-size-xxl)]', className), ref: ref, ...props }));
37
+ });
38
+ Button.displayName = 'Button';
39
+ export { Button, buttonVariants };
@@ -0,0 +1,70 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, } from 'lucide-react';
4
+ import * as React from 'react';
5
+ import { DayPicker, getDefaultClassNames } from 'react-day-picker';
6
+ import { buttonVariants } from './button';
7
+ import { cn } from '../lib/utils';
8
+ function Calendar({ className, classNames, showOutsideDays = true, captionLayout = 'label', buttonVariant = 'text', formatters, components, ...props }) {
9
+ const defaultClassNames = getDefaultClassNames();
10
+ return (_jsx(DayPicker, { showOutsideDays: showOutsideDays, className: cn('group/calendar bg-card p-3 [--cell-size:2rem]', String.raw `rtl:**:[.rdp-button\_next>svg]:rotate-180`, String.raw `rtl:**:[.rdp-button\_previous>svg]:rotate-180`, className), captionLayout: captionLayout, formatters: {
11
+ formatMonthDropdown: (date) => date.toLocaleString('default', { month: 'short' }),
12
+ ...formatters,
13
+ }, classNames: {
14
+ root: cn('w-fit', defaultClassNames.root),
15
+ months: cn('flex gap-4 flex-col md:flex-row relative', defaultClassNames.months),
16
+ month: cn('flex flex-col w-full gap-4', defaultClassNames.month),
17
+ nav: cn('flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between', defaultClassNames.nav),
18
+ button_previous: cn(buttonVariants({ type: buttonVariant }), 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none', defaultClassNames.button_previous),
19
+ button_next: cn(buttonVariants({ type: buttonVariant }), 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none', defaultClassNames.button_next),
20
+ month_caption: cn('flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)', defaultClassNames.month_caption),
21
+ dropdowns: cn('w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5', defaultClassNames.dropdowns),
22
+ dropdown_root: cn('relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md', defaultClassNames.dropdown_root),
23
+ dropdown: cn('absolute bg-popover inset-0 opacity-0', defaultClassNames.dropdown),
24
+ caption_label: cn('select-none font-medium', captionLayout === 'label'
25
+ ? 'text-sm'
26
+ : 'rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5', defaultClassNames.caption_label),
27
+ table: 'w-full border-collapse',
28
+ weekdays: cn('flex', defaultClassNames.weekdays),
29
+ weekday: cn('text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none', defaultClassNames.weekday),
30
+ week: cn('flex w-full mt-2', defaultClassNames.week),
31
+ week_number_header: cn('select-none w-(--cell-size)', defaultClassNames.week_number_header),
32
+ week_number: cn('text-[0.8rem] select-none text-muted-foreground', defaultClassNames.week_number),
33
+ day: cn('relative w-full h-full p-0 text-center group/day aspect-square select-none', defaultClassNames.day),
34
+ range_start: cn('[&_button]:bg-primary [&_button]:text-primary-foreground [&_button]:rounded-l-md [&_button]:rounded-r-none [&_button]:hover:bg-primary [&_button]:hover:text-primary-foreground', defaultClassNames.range_start),
35
+ range_middle: cn('[&_button]:bg-fds-blue-10 [&_button]:text-fds-gray [&_button]:rounded-none [&_button]:hover:bg-fds-blue-20 [&_button]:hover:text-fds-gray', defaultClassNames.range_middle),
36
+ range_end: cn('[&_button]:bg-primary [&_button]:text-primary-foreground [&_button]:rounded-r-md [&_button]:rounded-l-none [&_button]:hover:bg-primary [&_button]:hover:text-primary-foreground', defaultClassNames.range_end),
37
+ today: cn('bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none', defaultClassNames.today),
38
+ outside: cn('text-muted-foreground aria-selected:text-muted-foreground', defaultClassNames.outside),
39
+ disabled: cn('text-muted-foreground opacity-50', defaultClassNames.disabled),
40
+ hidden: cn('invisible', defaultClassNames.hidden),
41
+ ...classNames,
42
+ }, components: {
43
+ Root: ({ className, rootRef, ...props }) => {
44
+ return (_jsx("div", { "data-slot": "calendar", ref: rootRef, className: cn(className), ...props }));
45
+ },
46
+ Chevron: ({ className, orientation, ...props }) => {
47
+ if (orientation === 'left') {
48
+ return (_jsx(ChevronLeftIcon, { className: cn('size-4', className), ...props }));
49
+ }
50
+ if (orientation === 'right') {
51
+ return (_jsx(ChevronRightIcon, { className: cn('size-4', className), ...props }));
52
+ }
53
+ return (_jsx(ChevronDownIcon, { className: cn('size-4', className), ...props }));
54
+ },
55
+ DayButton: CalendarDayButton,
56
+ WeekNumber: ({ children, ...props }) => {
57
+ return (_jsx("td", { ...props, children: _jsx("div", { className: "size-(--cell-size) flex items-center justify-center text-center", children: children }) }));
58
+ },
59
+ ...components,
60
+ }, ...props }));
61
+ }
62
+ function CalendarDayButton({ className, day, modifiers, ...props }) {
63
+ const ref = React.useRef(null);
64
+ React.useEffect(() => {
65
+ if (modifiers.focused)
66
+ ref.current?.focus();
67
+ }, [modifiers.focused]);
68
+ return (_jsx("button", { ref: ref, type: "button", "data-day": day.date.toLocaleDateString(), className: cn('inline-flex items-center justify-center rounded-md text-sm font-normal transition-colors', 'hover:bg-accent hover:text-accent-foreground', 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring', 'disabled:pointer-events-none disabled:opacity-50', 'h-9 w-9 p-0', 'aria-selected:bg-primary aria-selected:text-primary-foreground aria-selected:hover:bg-primary aria-selected:hover:text-primary-foreground', className), ...props }));
69
+ }
70
+ export { Calendar, CalendarDayButton };
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { cn } from '../lib/utils';
4
+ const Card = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('rounded-lg bg-card p-fds-xl shadow-fds-sm', 'text-card-foreground', className), ...props })));
5
+ Card.displayName = 'Card';
6
+ const CardHeader = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, "data-slot": "card-header", className: cn('@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 has-[[data-slot=card-action]]:grid-cols-[1fr_auto]', className), ...props })));
7
+ CardHeader.displayName = 'CardHeader';
8
+ const CardAction = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, "data-slot": "card-action", className: cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className), ...props })));
9
+ CardAction.displayName = 'CardAction';
10
+ const CardTitle = React.forwardRef(({ className, size = 'medium', ...props }, ref) => {
11
+ return (_jsx("div", { ref: ref, className: cn('font-fds-bold leading-none tracking-tight', size === 'small' ? 'text-fds-h5' : 'text-fds-h3', className), ...props }));
12
+ });
13
+ CardTitle.displayName = 'CardTitle';
14
+ const CardContent = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('pt-0', className), ...props })));
15
+ CardContent.displayName = 'CardContent';
16
+ const CardFooter = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('flex items-center p-6 pt-0', className), ...props })));
17
+ CardFooter.displayName = 'CardFooter';
18
+ export { Card, CardAction, CardContent, CardFooter, CardHeader, CardTitle };
@@ -0,0 +1,135 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as RechartsPrimitive from "recharts";
5
+ import { cn } from "../lib/utils";
6
+ // Format: { THEME_NAME: CSS_SELECTOR }
7
+ const THEMES = { light: "", dark: ".dark" };
8
+ const ChartContext = React.createContext(null);
9
+ function useChart() {
10
+ const context = React.useContext(ChartContext);
11
+ if (!context) {
12
+ throw new Error("useChart must be used within a <ChartContainer />");
13
+ }
14
+ return context;
15
+ }
16
+ const ChartContainer = React.forwardRef(({ id, className, children, config, ...props }, ref) => {
17
+ const uniqueId = React.useId();
18
+ const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
19
+ return (_jsx(ChartContext.Provider, { value: { config }, children: _jsxs("div", { "data-chart": chartId, ref: ref, className: cn("flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none", className), ...props, children: [_jsx(ChartStyle, { id: chartId, config: config }), _jsx(RechartsPrimitive.ResponsiveContainer, { children: children })] }) }));
20
+ });
21
+ ChartContainer.displayName = "Chart";
22
+ const ChartStyle = ({ id, config }) => {
23
+ const colorConfig = Object.entries(config).filter(([, config]) => config.theme || config.color);
24
+ if (!colorConfig.length) {
25
+ return null;
26
+ }
27
+ return (_jsx("style", { dangerouslySetInnerHTML: {
28
+ __html: Object.entries(THEMES)
29
+ .map(([theme, prefix]) => `
30
+ ${prefix} [data-chart=${id}] {
31
+ ${colorConfig
32
+ .map(([key, itemConfig]) => {
33
+ const color = itemConfig.theme?.[theme] ||
34
+ itemConfig.color;
35
+ return color ? ` --color-${key}: ${color};` : null;
36
+ })
37
+ .join("\n")}
38
+ }
39
+ `)
40
+ .join("\n"),
41
+ } }));
42
+ };
43
+ const ChartTooltip = RechartsPrimitive.Tooltip;
44
+ const ChartTooltipContent = React.forwardRef(({ active, payload, className, indicator = "dot", hideLabel = false, hideIndicator = false, label, labelFormatter, labelClassName, formatter, color, nameKey, labelKey, }, ref) => {
45
+ const { config } = useChart();
46
+ const tooltipLabel = React.useMemo(() => {
47
+ if (hideLabel || !payload?.length) {
48
+ return null;
49
+ }
50
+ const [item] = payload;
51
+ const key = `${labelKey || item?.dataKey || item?.name || "value"}`;
52
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
53
+ const value = !labelKey && typeof label === "string"
54
+ ? config[label]?.label || label
55
+ : itemConfig?.label;
56
+ if (labelFormatter) {
57
+ return (_jsx("div", { className: cn("font-medium", labelClassName), children: labelFormatter(value, payload) }));
58
+ }
59
+ if (!value) {
60
+ return null;
61
+ }
62
+ return _jsx("div", { className: cn("font-medium", labelClassName), children: value });
63
+ }, [
64
+ label,
65
+ labelFormatter,
66
+ payload,
67
+ hideLabel,
68
+ labelClassName,
69
+ config,
70
+ labelKey,
71
+ ]);
72
+ if (!active || !payload?.length) {
73
+ return null;
74
+ }
75
+ const nestLabel = payload.length === 1 && indicator !== "dot";
76
+ return (_jsxs("div", { ref: ref, className: cn("grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl", className), children: [!nestLabel ? tooltipLabel : null, _jsx("div", { className: "grid gap-1.5", children: payload
77
+ .filter((item) => item.type !== "none")
78
+ .map((item, index) => {
79
+ const key = `${nameKey || item.name || item.dataKey || "value"}`;
80
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
81
+ const indicatorColor = color || item.payload?.fill || item.color;
82
+ return (_jsx("div", { className: cn("flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground", indicator === "dot" && "items-center"), children: formatter && item?.value !== undefined && item.name ? (formatter(item.value, item.name, item, index, item.payload)) : (_jsxs(_Fragment, { children: [itemConfig?.icon ? (_jsx(itemConfig.icon, {})) : (!hideIndicator && (_jsx("div", { className: cn("shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]", {
83
+ "h-2.5 w-2.5": indicator === "dot",
84
+ "w-1": indicator === "line",
85
+ "w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed",
86
+ "my-0.5": nestLabel && indicator === "dashed",
87
+ }), style: {
88
+ "--color-bg": indicatorColor,
89
+ "--color-border": indicatorColor,
90
+ } }))), _jsxs("div", { className: cn("flex flex-1 justify-between leading-none", nestLabel ? "items-end" : "items-center"), children: [_jsxs("div", { className: "grid gap-1.5", children: [nestLabel ? tooltipLabel : null, _jsx("span", { className: "text-muted-foreground", children: itemConfig?.label || item.name })] }), item.value && (_jsx("span", { className: "font-mono font-medium tabular-nums text-foreground", children: item.value.toLocaleString() }))] })] })) }, item.dataKey));
91
+ }) })] }));
92
+ });
93
+ ChartTooltipContent.displayName = "ChartTooltip";
94
+ const ChartLegend = RechartsPrimitive.Legend;
95
+ const ChartLegendContent = React.forwardRef(({ className, hideIcon = false, payload, verticalAlign = "bottom", nameKey }, ref) => {
96
+ const { config } = useChart();
97
+ if (!payload?.length) {
98
+ return null;
99
+ }
100
+ return (_jsx("div", { ref: ref, className: cn("flex items-center justify-center gap-4", verticalAlign === "top" ? "pb-3" : "pt-3", className), children: payload
101
+ .filter((item) => item.type !== "none")
102
+ .map((item) => {
103
+ const key = `${nameKey || item.dataKey || "value"}`;
104
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
105
+ return (_jsxs("div", { className: cn("flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground"), children: [itemConfig?.icon && !hideIcon ? (_jsx(itemConfig.icon, {})) : (_jsx("div", { className: "h-2 w-2 shrink-0 rounded-[2px]", style: {
106
+ backgroundColor: item.color,
107
+ } })), itemConfig?.label] }, item.value));
108
+ }) }));
109
+ });
110
+ ChartLegendContent.displayName = "ChartLegend";
111
+ // Helper to extract item config from a payload.
112
+ function getPayloadConfigFromPayload(config, payload, key) {
113
+ if (typeof payload !== "object" || payload === null) {
114
+ return undefined;
115
+ }
116
+ const payloadPayload = "payload" in payload &&
117
+ typeof payload.payload === "object" &&
118
+ payload.payload !== null
119
+ ? payload.payload
120
+ : undefined;
121
+ let configLabelKey = key;
122
+ if (key in payload &&
123
+ typeof payload[key] === "string") {
124
+ configLabelKey = payload[key];
125
+ }
126
+ else if (payloadPayload &&
127
+ key in payloadPayload &&
128
+ typeof payloadPayload[key] === "string") {
129
+ configLabelKey = payloadPayload[key];
130
+ }
131
+ return configLabelKey in config
132
+ ? config[configLabelKey]
133
+ : config[key];
134
+ }
135
+ export { ChartContainer, ChartTooltip, ChartTooltipContent, ChartLegend, ChartLegendContent, ChartStyle, };
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
3
+ import * as React from 'react';
4
+ import { IconCheck } from '@freightos/icons';
5
+ import { cn } from '../lib/utils';
6
+ const Checkbox = React.forwardRef(({ className, ...props }, ref) => (_jsx(CheckboxPrimitive.Root, { ref: ref, className: cn('peer h-4 w-4 shrink-0 rounded-fds-md border border-fds-gray-40 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground', className), ...props, children: _jsx(CheckboxPrimitive.Indicator, { className: cn('flex items-center justify-center text-current'), children: _jsx(IconCheck, { className: "h-4 w-4" }) }) })));
7
+ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
8
+ export { Checkbox };
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cva } from 'class-variance-authority';
3
+ import { IconClose } from '@freightos/icons';
4
+ import { cn } from '../lib/utils';
5
+ const chipVariants = cva('inline-flex items-center rounded-full h-5 px-2.5 py-0.5 !text-fds-sm font-fds-regular transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', {
6
+ variants: {
7
+ type: {
8
+ default: 'bg-fds-purple-10 text-fds-purple',
9
+ neutral: 'bg-fds-gray-20 text-fds-gray-80',
10
+ secondary: 'bg-fds-blue-10 text-fds-blue-40',
11
+ warning: 'bg-fds-yellow-20 text-fds-yellow-40',
12
+ positive: 'bg-fds-green-20 text-fds-green-40',
13
+ },
14
+ },
15
+ defaultVariants: {
16
+ type: 'default',
17
+ },
18
+ });
19
+ function Chip({ className, type, onClose, children, ...props }) {
20
+ return (_jsxs("div", { className: cn(chipVariants({ type }), className), ...props, children: [children, onClose && (_jsx("span", { onClick: onClose, className: "ms-fds-sm inline-flex cursor-pointer items-center hover:opacity-70", children: _jsx(IconClose, { size: "10px" }) }))] }));
21
+ }
22
+ export { Chip, chipVariants };
@@ -0,0 +1,5 @@
1
+ import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
2
+ const Collapsible = CollapsiblePrimitive.Root;
3
+ const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
4
+ const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
5
+ export { Collapsible, CollapsibleTrigger, CollapsibleContent };
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Command as CommandPrimitive } from 'cmdk';
5
+ import { Search } from 'lucide-react';
6
+ import { cn } from '../lib/utils';
7
+ import { Dialog, DialogContent } from './dialog';
8
+ const Command = React.forwardRef(({ className, ...props }, ref) => (_jsx(CommandPrimitive, { ref: ref, className: cn('flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground', className), ...props })));
9
+ Command.displayName = CommandPrimitive.displayName;
10
+ const CommandDialog = ({ children, ...props }) => {
11
+ return (_jsx(Dialog, { ...props, children: _jsx(DialogContent, { className: "overflow-hidden p-0 shadow-lg", children: _jsx(Command, { className: "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5", children: children }) }) }));
12
+ };
13
+ const CommandInput = React.forwardRef(({ className, ...props }, ref) => (_jsxs("div", { className: "flex items-center border-b px-3", "cmdk-input-wrapper": "", children: [_jsx(Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }), _jsx(CommandPrimitive.Input, { ref: ref, className: cn('flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50', className), ...props })] })));
14
+ CommandInput.displayName = CommandPrimitive.Input.displayName;
15
+ const CommandList = React.forwardRef(({ className, ...props }, ref) => (_jsx(CommandPrimitive.List, { ref: ref, className: cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className), ...props })));
16
+ CommandList.displayName = CommandPrimitive.List.displayName;
17
+ const CommandEmpty = React.forwardRef((props, ref) => (_jsx(CommandPrimitive.Empty, { ref: ref, className: "py-6 text-center text-sm", ...props })));
18
+ CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
19
+ const CommandGroup = React.forwardRef(({ className, ...props }, ref) => (_jsx(CommandPrimitive.Group, { ref: ref, className: cn('overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground', className), ...props })));
20
+ CommandGroup.displayName = CommandPrimitive.Group.displayName;
21
+ const CommandSeparator = React.forwardRef(({ className, ...props }, ref) => (_jsx(CommandPrimitive.Separator, { ref: ref, className: cn('-mx-1 h-px bg-border', className), ...props })));
22
+ CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
23
+ const CommandItem = React.forwardRef(({ className, ...props }, ref) => (_jsx(CommandPrimitive.Item, { ref: ref, className: cn("relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-fds-blue-10 hover:text-foreground data-[disabled=true]:pointer-events-none data-[selected='true']:bg-fds-blue-10 data-[selected=true]:text-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", className), ...props })));
24
+ CommandItem.displayName = CommandPrimitive.Item.displayName;
25
+ const CommandShortcut = ({ className, ...props }) => {
26
+ return (_jsx("span", { className: cn('ml-auto text-xs tracking-widest text-muted-foreground', className), ...props }));
27
+ };
28
+ CommandShortcut.displayName = 'CommandShortcut';
29
+ export { Command, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator, };