@freightos/freightwind 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +28 -0
  3. package/dist/cjs/components/alert.js +33 -16
  4. package/dist/cjs/components/avatar.js +53 -58
  5. package/dist/cjs/components/badge.js +42 -18
  6. package/dist/cjs/components/button.js +35 -24
  7. package/dist/cjs/components/checkbox.js +21 -3
  8. package/dist/cjs/components/chip.js +67 -9
  9. package/dist/cjs/components/message.js +38 -0
  10. package/dist/cjs/components/pop-confirm.js +86 -0
  11. package/dist/cjs/components/radio-button-group.js +31 -35
  12. package/dist/cjs/components/radio-group.js +2 -1
  13. package/dist/cjs/components/slider.js +14 -6
  14. package/dist/cjs/components/switch.js +29 -10
  15. package/dist/cjs/components/tooltip.js +40 -11
  16. package/dist/cjs/index.js +38 -84
  17. package/dist/cjs/lib/icon-utils.js +5 -0
  18. package/dist/cjs/{components/aspect-ratio.js → lib/use-stable-id.js} +7 -4
  19. package/dist/cjs/lib/utils.js +18 -1
  20. package/dist/esm/components/alert.js +34 -17
  21. package/dist/esm/components/avatar.js +53 -22
  22. package/dist/esm/components/badge.js +45 -19
  23. package/dist/esm/components/button.js +36 -25
  24. package/dist/esm/components/checkbox.js +22 -4
  25. package/dist/esm/components/chip.js +34 -9
  26. package/dist/esm/components/message.js +34 -0
  27. package/dist/esm/components/pop-confirm.js +51 -0
  28. package/dist/esm/components/radio-button-group.js +31 -33
  29. package/dist/esm/components/radio-group.js +2 -1
  30. package/dist/esm/components/slider.js +14 -6
  31. package/dist/esm/components/switch.js +30 -11
  32. package/dist/esm/components/tooltip.js +40 -7
  33. package/dist/esm/index.js +18 -66
  34. package/dist/esm/lib/icon-utils.js +1 -0
  35. package/dist/esm/lib/use-stable-id.js +6 -0
  36. package/dist/esm/lib/utils.js +18 -1
  37. package/dist/types/components/alert.d.ts +5 -5
  38. package/dist/types/components/avatar.d.ts +14 -19
  39. package/dist/types/components/badge.d.ts +22 -8
  40. package/dist/types/components/button.d.ts +15 -9
  41. package/dist/types/components/checkbox.d.ts +8 -2
  42. package/dist/types/components/chip.d.ts +14 -8
  43. package/dist/types/components/message.d.ts +14 -0
  44. package/dist/types/components/pop-confirm.d.ts +28 -0
  45. package/dist/types/components/radio-button-group.d.ts +19 -14
  46. package/dist/types/components/slider.d.ts +10 -2
  47. package/dist/types/components/switch.d.ts +7 -6
  48. package/dist/types/components/tooltip.d.ts +9 -6
  49. package/dist/types/index.d.ts +25 -61
  50. package/dist/types/lib/icon-utils.d.ts +1 -0
  51. package/dist/types/lib/use-stable-id.d.ts +1 -0
  52. package/guidelines/Guidelines.md +54 -0
  53. package/guidelines/design-tokens/colors.md +81 -0
  54. package/guidelines/design-tokens/spacing.md +45 -0
  55. package/guidelines/design-tokens/typography.md +50 -0
  56. package/guidelines/overview-components.md +252 -0
  57. package/guidelines/overview-icons.md +52 -0
  58. package/package.json +63 -54
  59. package/tokens.css +409 -0
  60. package/dist/cjs/components/accordion.js +0 -57
  61. package/dist/cjs/components/breadcrumb.js +0 -65
  62. package/dist/cjs/components/calendar.js +0 -106
  63. package/dist/cjs/components/card.js +0 -59
  64. package/dist/cjs/components/chart.js +0 -176
  65. package/dist/cjs/components/collapsible.js +0 -43
  66. package/dist/cjs/components/command.js +0 -73
  67. package/dist/cjs/components/context-menu.js +0 -83
  68. package/dist/cjs/components/country-select.js +0 -155
  69. package/dist/cjs/components/date-picker.js +0 -59
  70. package/dist/cjs/components/date-range-picker.js +0 -59
  71. package/dist/cjs/components/date-time-picker.js +0 -106
  72. package/dist/cjs/components/dialog.js +0 -70
  73. package/dist/cjs/components/drawer.js +0 -68
  74. package/dist/cjs/components/dropdown-menu.js +0 -85
  75. package/dist/cjs/components/empty.js +0 -42
  76. package/dist/cjs/components/file-preview.js +0 -73
  77. package/dist/cjs/components/form.js +0 -106
  78. package/dist/cjs/components/inline-edit.js +0 -83
  79. package/dist/cjs/components/input-group.js +0 -70
  80. package/dist/cjs/components/input-otp.js +0 -58
  81. package/dist/cjs/components/input.js +0 -57
  82. package/dist/cjs/components/label.js +0 -45
  83. package/dist/cjs/components/menubar.js +0 -96
  84. package/dist/cjs/components/navigation-menu.js +0 -68
  85. package/dist/cjs/components/pagination.js +0 -65
  86. package/dist/cjs/components/phone-input.js +0 -218
  87. package/dist/cjs/components/popover.js +0 -49
  88. package/dist/cjs/components/progress.js +0 -43
  89. package/dist/cjs/components/resizable.js +0 -47
  90. package/dist/cjs/components/rich-text-editor.js +0 -152
  91. package/dist/cjs/components/route.js +0 -47
  92. package/dist/cjs/components/scroll-area.js +0 -48
  93. package/dist/cjs/components/select.js +0 -71
  94. package/dist/cjs/components/separator.js +0 -43
  95. package/dist/cjs/components/sheet.js +0 -245
  96. package/dist/cjs/components/skeleton.js +0 -8
  97. package/dist/cjs/components/sonner.js +0 -25
  98. package/dist/cjs/components/spinner.js +0 -25
  99. package/dist/cjs/components/stepper.js +0 -99
  100. package/dist/cjs/components/steps.js +0 -127
  101. package/dist/cjs/components/table.js +0 -66
  102. package/dist/cjs/components/tabs.js +0 -51
  103. package/dist/cjs/components/textarea.js +0 -44
  104. package/dist/cjs/components/time-picker.js +0 -110
  105. package/dist/cjs/components/toast.js +0 -75
  106. package/dist/cjs/components/toaster.js +0 -12
  107. package/dist/cjs/components/toggle-group.js +0 -58
  108. package/dist/cjs/components/toggle.js +0 -62
  109. package/dist/cjs/hooks/use-toast.js +0 -166
  110. package/dist/cjs/lib/countryUtils.js +0 -93
  111. package/dist/esm/components/accordion.js +0 -18
  112. package/dist/esm/components/aspect-ratio.js +0 -3
  113. package/dist/esm/components/breadcrumb.js +0 -23
  114. package/dist/esm/components/calendar.js +0 -70
  115. package/dist/esm/components/card.js +0 -18
  116. package/dist/esm/components/chart.js +0 -135
  117. package/dist/esm/components/collapsible.js +0 -5
  118. package/dist/esm/components/command.js +0 -29
  119. package/dist/esm/components/context-menu.js +0 -33
  120. package/dist/esm/components/country-select.js +0 -118
  121. package/dist/esm/components/date-picker.js +0 -23
  122. package/dist/esm/components/date-range-picker.js +0 -23
  123. package/dist/esm/components/date-time-picker.js +0 -70
  124. package/dist/esm/components/dialog.js +0 -24
  125. package/dist/esm/components/drawer.js +0 -23
  126. package/dist/esm/components/dropdown-menu.js +0 -35
  127. package/dist/esm/components/empty.js +0 -6
  128. package/dist/esm/components/file-preview.js +0 -69
  129. package/dist/esm/components/form.js +0 -63
  130. package/dist/esm/components/inline-edit.js +0 -47
  131. package/dist/esm/components/input-group.js +0 -63
  132. package/dist/esm/components/input-otp.js +0 -19
  133. package/dist/esm/components/input.js +0 -21
  134. package/dist/esm/components/label.js +0 -9
  135. package/dist/esm/components/menubar.js +0 -45
  136. package/dist/esm/components/navigation-menu.js +0 -24
  137. package/dist/esm/components/pagination.js +0 -23
  138. package/dist/esm/components/phone-input.js +0 -181
  139. package/dist/esm/components/popover.js +0 -10
  140. package/dist/esm/components/progress.js +0 -7
  141. package/dist/esm/components/resizable.js +0 -9
  142. package/dist/esm/components/rich-text-editor.js +0 -145
  143. package/dist/esm/components/route.js +0 -11
  144. package/dist/esm/components/scroll-area.js +0 -11
  145. package/dist/esm/components/select.js +0 -26
  146. package/dist/esm/components/separator.js +0 -7
  147. package/dist/esm/components/sheet.js +0 -197
  148. package/dist/esm/components/skeleton.js +0 -6
  149. package/dist/esm/components/sonner.js +0 -22
  150. package/dist/esm/components/spinner.js +0 -21
  151. package/dist/esm/components/stepper.js +0 -57
  152. package/dist/esm/components/steps.js +0 -80
  153. package/dist/esm/components/table.js +0 -22
  154. package/dist/esm/components/tabs.js +0 -12
  155. package/dist/esm/components/textarea.js +0 -8
  156. package/dist/esm/components/time-picker.js +0 -74
  157. package/dist/esm/components/toast.js +0 -33
  158. package/dist/esm/components/toaster.js +0 -9
  159. package/dist/esm/components/toggle-group.js +0 -21
  160. package/dist/esm/components/toggle.js +0 -25
  161. package/dist/esm/hooks/use-toast.js +0 -128
  162. package/dist/esm/lib/countryUtils.js +0 -87
  163. package/dist/styles.css +0 -152
  164. package/dist/types/components/accordion.d.ts +0 -11
  165. package/dist/types/components/aspect-ratio.d.ts +0 -3
  166. package/dist/types/components/breadcrumb.d.ts +0 -19
  167. package/dist/types/components/calendar.d.ts +0 -7
  168. package/dist/types/components/card.d.ts +0 -11
  169. package/dist/types/components/chart.d.ts +0 -66
  170. package/dist/types/components/collapsible.d.ts +0 -5
  171. package/dist/types/components/command.d.ts +0 -80
  172. package/dist/types/components/context-menu.d.ts +0 -27
  173. package/dist/types/components/country-select.d.ts +0 -17
  174. package/dist/types/components/date-picker.d.ts +0 -9
  175. package/dist/types/components/date-range-picker.d.ts +0 -10
  176. package/dist/types/components/date-time-picker.d.ts +0 -10
  177. package/dist/types/components/dialog.d.ts +0 -23
  178. package/dist/types/components/drawer.d.ts +0 -22
  179. package/dist/types/components/dropdown-menu.d.ts +0 -27
  180. package/dist/types/components/empty.d.ts +0 -6
  181. package/dist/types/components/file-preview.d.ts +0 -9
  182. package/dist/types/components/form.d.ts +0 -23
  183. package/dist/types/components/inline-edit.d.ts +0 -10
  184. package/dist/types/components/input-group.d.ts +0 -16
  185. package/dist/types/components/input-otp.d.ts +0 -34
  186. package/dist/types/components/input.d.ts +0 -9
  187. package/dist/types/components/label.d.ts +0 -5
  188. package/dist/types/components/menubar.d.ts +0 -28
  189. package/dist/types/components/navigation-menu.d.ts +0 -12
  190. package/dist/types/components/pagination.d.ts +0 -29
  191. package/dist/types/components/phone-input.d.ts +0 -20
  192. package/dist/types/components/popover.d.ts +0 -9
  193. package/dist/types/components/progress.d.ts +0 -4
  194. package/dist/types/components/resizable.d.ts +0 -23
  195. package/dist/types/components/rich-text-editor.d.ts +0 -8
  196. package/dist/types/components/route.d.ts +0 -10
  197. package/dist/types/components/scroll-area.d.ts +0 -5
  198. package/dist/types/components/select.d.ts +0 -13
  199. package/dist/types/components/separator.d.ts +0 -4
  200. package/dist/types/components/sheet.d.ts +0 -49
  201. package/dist/types/components/skeleton.d.ts +0 -2
  202. package/dist/types/components/sonner.d.ts +0 -4
  203. package/dist/types/components/spinner.d.ts +0 -8
  204. package/dist/types/components/stepper.d.ts +0 -17
  205. package/dist/types/components/steps.d.ts +0 -64
  206. package/dist/types/components/table.d.ts +0 -14
  207. package/dist/types/components/tabs.d.ts +0 -7
  208. package/dist/types/components/textarea.d.ts +0 -3
  209. package/dist/types/components/time-picker.d.ts +0 -10
  210. package/dist/types/components/toast.d.ts +0 -15
  211. package/dist/types/components/toaster.d.ts +0 -1
  212. package/dist/types/components/toggle-group.d.ts +0 -12
  213. package/dist/types/components/toggle.d.ts +0 -12
  214. package/dist/types/hooks/use-toast.d.ts +0 -44
  215. package/dist/types/lib/countryUtils.d.ts +0 -20
  216. package/tailwind-preset.js +0 -70
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ 'use client';
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.PopConfirm = PopConfirm;
38
+ const jsx_runtime_1 = require("react/jsx-runtime");
39
+ const PopoverPrimitive = __importStar(require("@radix-ui/react-popover"));
40
+ const React = __importStar(require("react"));
41
+ const button_1 = require("./button");
42
+ const icon_utils_1 = require("../lib/icon-utils");
43
+ function resolvePlacement(placement) {
44
+ const [sideRaw, alignRaw] = placement.split('-');
45
+ const align = alignRaw ?? 'center';
46
+ const isRtl = typeof document !== 'undefined' && document.documentElement.dir === 'rtl';
47
+ const resolveLogical = (value) => (value === 'start') !== isRtl ? 'left' : 'right';
48
+ const side = sideRaw === 'top' || sideRaw === 'bottom'
49
+ ? sideRaw
50
+ : resolveLogical(sideRaw);
51
+ const radixAlign = align === 'center'
52
+ ? 'center'
53
+ : isRtl
54
+ ? align === 'start' ? 'end' : 'start'
55
+ : align;
56
+ return { side, align: radixAlign };
57
+ }
58
+ const ARROW_EDGE_INSET = 10;
59
+ function PopConfirm({ title, onConfirm, onCancel, placement = 'top', children, slotProps, }) {
60
+ const [open, setOpen] = React.useState(false);
61
+ const { side, align } = resolvePlacement(placement);
62
+ const triggerRef = React.useRef(null);
63
+ const [alignOffset, setAlignOffset] = React.useState(0);
64
+ React.useEffect(() => {
65
+ if (align === 'center' || !triggerRef.current) {
66
+ setAlignOffset(0);
67
+ return;
68
+ }
69
+ const isHorizontal = side === 'top' || side === 'bottom';
70
+ const triggerSize = isHorizontal
71
+ ? triggerRef.current.offsetWidth
72
+ : triggerRef.current.offsetHeight;
73
+ setAlignOffset(ARROW_EDGE_INSET - triggerSize / 2);
74
+ }, [align, side]);
75
+ function handleConfirm() {
76
+ onConfirm();
77
+ setOpen(false);
78
+ }
79
+ function handleCancel() {
80
+ onCancel?.();
81
+ setOpen(false);
82
+ }
83
+ const iconName = slotProps?.icon?.name ?? 'risk';
84
+ const IconComp = icon_utils_1.iconMap[iconName];
85
+ return ((0, jsx_runtime_1.jsxs)(PopoverPrimitive.Root, { open: open, onOpenChange: setOpen, children: [(0, jsx_runtime_1.jsx)(PopoverPrimitive.Trigger, { asChild: true, ref: triggerRef, children: children }), (0, jsx_runtime_1.jsx)(PopoverPrimitive.Portal, { children: (0, jsx_runtime_1.jsxs)(PopoverPrimitive.Content, { side: side, align: align, alignOffset: alignOffset, sideOffset: 8, className: "z-[1300] w-[246px] rounded-fds-lg bg-white p-fds-lg shadow-fds-md origin-[--radix-popover-content-transform-origin] animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex gap-fds-xs", children: [IconComp && (0, jsx_runtime_1.jsx)(IconComp, { size: 16, color: slotProps?.icon?.color ?? 'yellow-30', className: "mt-[2.5px] shrink-0" }), (0, jsx_runtime_1.jsx)("p", { className: "text-fds-base text-fds-gray-100", children: title })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mt-[10px] flex justify-end gap-fds-sm", children: [(0, jsx_runtime_1.jsx)(button_1.Button, { variant: slotProps?.cancelButton?.variant ?? 'secondary', size: "sm", onClick: handleCancel, children: slotProps?.cancelButton?.children ?? 'No' }), (0, jsx_runtime_1.jsx)(button_1.Button, { variant: slotProps?.confirmButton?.variant ?? 'danger', size: "sm", onClick: handleConfirm, children: slotProps?.confirmButton?.children ?? 'Yes' })] }), (0, jsx_runtime_1.jsx)(PopoverPrimitive.Arrow, { className: "fill-white", width: 16, height: 8 })] }) })] }));
86
+ }
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -33,52 +34,47 @@ var __importStar = (this && this.__importStar) || (function () {
33
34
  };
34
35
  })();
35
36
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.RadioButtonGroupItem = exports.RadioButtonGroup = void 0;
37
+ exports.RadioButtonGroup = RadioButtonGroup;
37
38
  const jsx_runtime_1 = require("react/jsx-runtime");
38
39
  const utils_1 = require("../lib/utils");
40
+ const use_stable_id_1 = require("../lib/use-stable-id");
39
41
  const class_variance_authority_1 = require("class-variance-authority");
40
42
  const React = __importStar(require("react"));
41
43
  const radio_group_1 = require("./radio-group");
42
- const radioButtonGroupItemVariants = (0, class_variance_authority_1.cva)('relative flex cursor-pointer items-center justify-center border bg-card px-[15px] transition-all has-[[data-state=checked]]:z-10', {
44
+ const itemVariants = (0, class_variance_authority_1.cva)('relative flex cursor-pointer items-center justify-center border bg-card transition-all has-[[data-state=checked]]:z-10', {
43
45
  variants: {
44
46
  size: {
45
- small: 'h-[24px]',
46
- medium: 'h-[32px]',
47
- large: 'h-[40px]',
48
- },
49
- variant: {
50
- default: 'border-fds-gray-30 text-fds-gray-80 dark:border-fds-gray-60 dark:text-fds-gray-40 has-[[data-state=checked]]:border-fds-blue has-[[data-state=checked]]:bg-fds-blue-10 has-[[data-state=checked]]:text-fds-blue dark:has-[[data-state=checked]]:border-fds-blue-20 dark:has-[[data-state=checked]]:text-fds-blue',
51
- custom: '', // No default checked styles, allows full customization
47
+ sm: 'h-[24px] text-fds-sm px-fds-md',
48
+ md: 'h-[32px] text-fds-base px-fds-lg',
49
+ lg: 'h-[40px] text-fds-h6 px-fds-xl',
52
50
  },
53
51
  },
54
52
  defaultVariants: {
55
- size: 'medium',
56
- variant: 'default',
53
+ size: 'md',
57
54
  },
58
55
  });
59
- const RadioButtonGroup = React.forwardRef(({ className, children, size, borderRadius = 'lg', ...props }, ref) => {
60
- const childrenArray = React.Children.toArray(children);
61
- const childrenWithProps = childrenArray.map((child, index) => {
62
- if (React.isValidElement(child)) {
56
+ const defaultColors = 'border-fds-gray-30 text-fds-gray-80 dark:border-fds-gray-60 dark:text-fds-gray-40 has-[[data-state=checked]]:border-fds-blue-30 has-[[data-state=checked]]:bg-fds-blue-10 has-[[data-state=checked]]:text-fds-blue-30 dark:has-[[data-state=checked]]:border-fds-blue-20 dark:has-[[data-state=checked]]:text-fds-blue-30';
57
+ const errorColors = 'border-fds-red-30 bg-fds-red-10 text-fds-red-30 has-[[data-state=checked]]:border-fds-red-30 has-[[data-state=checked]]:bg-fds-red-10 has-[[data-state=checked]]:text-fds-red-30';
58
+ const disabledColors = 'bg-fds-gray-10 border-fds-gray-20 text-fds-gray-60 has-[[data-state=checked]]:bg-fds-gray-20 has-[[data-state=checked]]:border-fds-gray-30 has-[[data-state=checked]]:text-fds-gray-60';
59
+ function RadioButtonGroup({ options, value, defaultValue, onValueChange, size = 'md', orientation = 'horizontal', disabled = false, error = false, }) {
60
+ const [internalValue, setInternalValue] = React.useState(defaultValue);
61
+ const isControlled = value !== undefined;
62
+ const currentValue = isControlled ? value : internalValue;
63
+ const baseId = (0, use_stable_id_1.useStableId)();
64
+ const handleValueChange = (v) => {
65
+ if (!isControlled)
66
+ setInternalValue(v);
67
+ onValueChange?.(v);
68
+ };
69
+ const isVertical = orientation === 'vertical';
70
+ const stateColors = disabled ? disabledColors : error ? errorColors : defaultColors;
71
+ return ((0, jsx_runtime_1.jsx)(radio_group_1.RadioGroup, { value: currentValue, onValueChange: handleValueChange, disabled: disabled, className: (0, utils_1.cn)('flex', isVertical ? 'flex-col gap-fds-sm' : 'flex-row gap-0', disabled && 'opacity-50 cursor-not-allowed'), children: options.map((option, index) => {
63
72
  const isFirst = index === 0;
64
- const isLast = index === childrenArray.length - 1;
65
- const roundedStart = borderRadius === 'full' ? 'rounded-s-full' : 'rounded-s-fds-md';
66
- const roundedEnd = borderRadius === 'full' ? 'rounded-e-full' : 'rounded-e-fds-md';
67
- const childProps = child.props;
68
- return React.cloneElement(child, {
69
- ...childProps,
70
- size: childProps.size ?? size ?? undefined,
71
- className: (0, utils_1.cn)(childProps.className, isFirst && roundedStart, isLast && roundedEnd, !isFirst && '-ml-px') || undefined,
72
- });
73
- }
74
- return child;
75
- });
76
- return ((0, jsx_runtime_1.jsx)(radio_group_1.RadioGroup, { ref: ref, className: (0, utils_1.cn)('flex gap-0', className), ...props, children: childrenWithProps }));
77
- });
78
- exports.RadioButtonGroup = RadioButtonGroup;
73
+ const isLast = index === options.length - 1;
74
+ const optionId = `${baseId}-${option.value}`;
75
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)(itemVariants({ size }), stateColors, option.render && 'h-auto py-fds-sm', isVertical
76
+ ? 'rounded-fds-md w-full'
77
+ : (0, utils_1.cn)(isFirst && 'rounded-s-fds-md', isLast && 'rounded-e-fds-md', !isFirst && '-ml-px'), disabled && 'cursor-not-allowed'), children: [(0, jsx_runtime_1.jsx)(radio_group_1.RadioGroupItem, { id: optionId, value: option.value, className: "sr-only", disabled: disabled }), (0, jsx_runtime_1.jsx)("label", { htmlFor: optionId, className: (0, utils_1.cn)('whitespace-nowrap after:absolute after:inset-0', !option.render && 'font-medium', disabled ? 'cursor-not-allowed' : 'cursor-pointer'), style: { color: 'inherit', fontSize: 'inherit' }, children: option.render ? option.render() : option.label })] }, option.value));
78
+ }) }));
79
+ }
79
80
  RadioButtonGroup.displayName = 'RadioButtonGroup';
80
- const RadioButtonGroupItem = React.forwardRef(({ className, value, id, size, variant, children, ...props }, ref) => {
81
- return ((0, jsx_runtime_1.jsxs)("div", { ref: ref, className: (0, utils_1.cn)(radioButtonGroupItemVariants({ size, variant }), className), ...props, children: [(0, jsx_runtime_1.jsx)(radio_group_1.RadioGroupItem, { id: id, value: value, className: "sr-only" }), (0, jsx_runtime_1.jsx)("label", { htmlFor: id, className: "cursor-pointer whitespace-nowrap font-medium after:absolute after:inset-0", style: { color: 'inherit', fontSize: 'inherit' }, children: children })] }));
82
- });
83
- exports.RadioButtonGroupItem = RadioButtonGroupItem;
84
- RadioButtonGroupItem.displayName = 'RadioButtonGroupItem';
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -44,7 +45,7 @@ const RadioGroup = React.forwardRef(({ className, ...props }, ref) => {
44
45
  exports.RadioGroup = RadioGroup;
45
46
  RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
46
47
  const RadioGroupItem = React.forwardRef(({ className, ...props }, ref) => {
47
- return ((0, jsx_runtime_1.jsx)(RadioGroupPrimitive.Item, { ref: ref, className: (0, utils_1.cn)('aspect-square h-[16px] w-[16px] rounded-full border border-fds-gray-80 text-fds-blue ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-fds-blue focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-fds-blue', className), ...props, children: (0, jsx_runtime_1.jsx)(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: (0, jsx_runtime_1.jsx)("div", { className: "h-[8px] w-[8px] rounded-full bg-fds-blue" }) }) }));
48
+ return ((0, jsx_runtime_1.jsx)(RadioGroupPrimitive.Item, { ref: ref, className: (0, utils_1.cn)('fw-base h-[16px] w-[16px] cursor-pointer rounded-full border border-fds-gray-30 bg-white ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-fds-blue-30 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:border-fds-gray-20 disabled:bg-fds-gray-10 data-[state=checked]:border-fds-blue-30 data-[state=checked]:disabled:border-fds-gray-30', className), ...props, children: (0, jsx_runtime_1.jsx)(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: (0, jsx_runtime_1.jsx)("div", { className: "h-[8px] w-[8px] rounded-full bg-fds-blue-30 [[disabled]_&]:bg-fds-gray-30" }) }) }));
48
49
  });
49
50
  exports.RadioGroupItem = RadioGroupItem;
50
51
  RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -35,13 +36,20 @@ var __importStar = (this && this.__importStar) || (function () {
35
36
  Object.defineProperty(exports, "__esModule", { value: true });
36
37
  exports.Slider = void 0;
37
38
  const jsx_runtime_1 = require("react/jsx-runtime");
38
- const utils_1 = require("../lib/utils");
39
39
  const SliderPrimitive = __importStar(require("@radix-ui/react-slider"));
40
40
  const React = __importStar(require("react"));
41
- const Slider = React.forwardRef(({ className, ...props }, ref) => {
42
- const value = props.value || props.defaultValue || [0];
43
- const thumbCount = Array.isArray(value) ? value.length : 1;
44
- return ((0, jsx_runtime_1.jsxs)(SliderPrimitive.Root, { ref: ref, className: (0, utils_1.cn)('relative flex w-full touch-none select-none items-center', className), ...props, children: [(0, jsx_runtime_1.jsx)(SliderPrimitive.Track, { className: "relative h-1 w-full grow overflow-hidden rounded-full bg-fds-gray-20", children: (0, jsx_runtime_1.jsx)(SliderPrimitive.Range, { className: "absolute h-full bg-fds-blue" }) }), Array.from({ length: thumbCount }).map((_, i) => ((0, jsx_runtime_1.jsx)(SliderPrimitive.Thumb, { className: "block h-4 w-4 rounded-full border-2 border-fds-blue bg-fds-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fds-blue-20 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50" }, i)))] }));
41
+ const utils_1 = require("../lib/utils");
42
+ const Slider = React.forwardRef(({ value, defaultValue, onValueChange, min = 0, max = 100, step = 1, disabled }, ref) => {
43
+ const [internalValue, setInternalValue] = React.useState(defaultValue ?? [min]);
44
+ const resolvedValue = value !== undefined ? value : internalValue;
45
+ const handleValueChange = (val) => {
46
+ if (value === undefined)
47
+ setInternalValue(val);
48
+ onValueChange?.(val);
49
+ };
50
+ return ((0, jsx_runtime_1.jsxs)(SliderPrimitive.Root, { ref: ref, value: resolvedValue, onValueChange: handleValueChange, min: min, max: max, step: step, disabled: disabled, className: "relative flex w-full touch-none select-none items-center", children: [(0, jsx_runtime_1.jsx)(SliderPrimitive.Track, { className: "relative h-1 w-full grow overflow-hidden rounded-full bg-fds-gray-20", children: (0, jsx_runtime_1.jsx)(SliderPrimitive.Range, { className: (0, utils_1.cn)('absolute h-full', disabled ? 'bg-fds-blue-05' : 'bg-fds-blue-30') }) }), resolvedValue.map((_, i) => ((0, jsx_runtime_1.jsx)(SliderPrimitive.Thumb, { className: (0, utils_1.cn)('block h-4 w-4 rounded-full border-2 bg-fds-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2', disabled
51
+ ? 'border-fds-blue-05 cursor-not-allowed'
52
+ : 'border-fds-blue-30 focus-visible:ring-fds-blue-20 cursor-pointer') }, i)))] }));
45
53
  });
46
54
  exports.Slider = Slider;
47
- Slider.displayName = SliderPrimitive.Root.displayName;
55
+ Slider.displayName = 'Slider';
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -35,32 +36,50 @@ var __importStar = (this && this.__importStar) || (function () {
35
36
  Object.defineProperty(exports, "__esModule", { value: true });
36
37
  exports.Switch = void 0;
37
38
  const jsx_runtime_1 = require("react/jsx-runtime");
38
- const React = __importStar(require("react"));
39
39
  const SwitchPrimitives = __importStar(require("@radix-ui/react-switch"));
40
+ const React = __importStar(require("react"));
40
41
  const class_variance_authority_1 = require("class-variance-authority");
41
42
  const utils_1 = require("../lib/utils");
42
- const switchVariants = (0, class_variance_authority_1.cva)('peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fds-blue focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-fds-blue data-[state=unchecked]:bg-fds-gray-30', {
43
+ const use_stable_id_1 = require("../lib/use-stable-id");
44
+ const switchVariants = (0, class_variance_authority_1.cva)('fw-base peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fds-blue-30 focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50', {
43
45
  variants: {
44
46
  size: {
45
- default: 'h-5 w-9',
46
- small: 'h-4 w-7',
47
+ lg: 'h-5 w-9',
48
+ sm: 'h-4 w-8',
47
49
  },
48
50
  },
49
51
  defaultVariants: {
50
- size: 'default',
52
+ size: 'lg',
51
53
  },
52
54
  });
53
55
  const switchThumbVariants = (0, class_variance_authority_1.cva)('pointer-events-none block rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=unchecked]:translate-x-0', {
54
56
  variants: {
55
57
  size: {
56
- default: 'h-4 w-4 data-[state=checked]:translate-x-4',
57
- small: 'h-3 w-3 data-[state=checked]:translate-x-3',
58
+ lg: 'size-4 data-[state=checked]:translate-x-4',
59
+ sm: 'size-3 data-[state=checked]:translate-x-4',
58
60
  },
59
61
  },
60
62
  defaultVariants: {
61
- size: 'default',
63
+ size: 'lg',
62
64
  },
63
65
  });
64
- const Switch = React.forwardRef(({ className, size, ...props }, ref) => ((0, jsx_runtime_1.jsx)(SwitchPrimitives.Root, { className: (0, utils_1.cn)(switchVariants({ size }), className), ...props, ref: ref, children: (0, jsx_runtime_1.jsx)(SwitchPrimitives.Thumb, { className: (0, utils_1.cn)(switchThumbVariants({ size })) }) })));
66
+ const Switch = React.forwardRef(({ checked, onCheckedChange, disabled, error, size = 'lg', children }, ref) => {
67
+ const switchId = (0, use_stable_id_1.useStableId)();
68
+ const [internalChecked, setInternalChecked] = React.useState(false);
69
+ const resolvedChecked = checked !== undefined ? checked : internalChecked;
70
+ const handleCheckedChange = (val) => {
71
+ if (checked === undefined)
72
+ setInternalChecked(val);
73
+ onCheckedChange?.(val);
74
+ };
75
+ const track = ((0, jsx_runtime_1.jsx)(SwitchPrimitives.Root, { ref: ref, id: switchId, checked: resolvedChecked, onCheckedChange: handleCheckedChange, disabled: disabled, "aria-invalid": error || undefined, className: (0, utils_1.cn)(switchVariants({ size }), disabled
76
+ ? 'data-[state=unchecked]:bg-fds-gray-20 data-[state=checked]:bg-fds-blue-05'
77
+ : error
78
+ ? 'data-[state=unchecked]:bg-fds-gray-60 data-[state=checked]:bg-fds-red-30'
79
+ : 'data-[state=unchecked]:bg-fds-gray-60 data-[state=checked]:bg-fds-blue-30'), children: (0, jsx_runtime_1.jsx)(SwitchPrimitives.Thumb, { className: (0, utils_1.cn)(switchThumbVariants({ size })) }) }));
80
+ if (!children)
81
+ return track;
82
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-fds-sm", children: [track, (0, jsx_runtime_1.jsx)("label", { htmlFor: switchId, className: (0, utils_1.cn)('text-fds-base cursor-pointer select-none', disabled && 'cursor-not-allowed text-fds-gray-60', !disabled && error && resolvedChecked && 'text-fds-red-30', !disabled && !(error && resolvedChecked) && 'text-fds-gray-80 dark:text-fds-gray-10'), children: children })] }));
83
+ });
65
84
  exports.Switch = Switch;
66
- Switch.displayName = SwitchPrimitives.Root.displayName;
85
+ Switch.displayName = 'Switch';
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -33,17 +34,45 @@ var __importStar = (this && this.__importStar) || (function () {
33
34
  };
34
35
  })();
35
36
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.TooltipTrigger = exports.TooltipProvider = exports.TooltipContent = exports.Tooltip = void 0;
37
+ exports.Tooltip = Tooltip;
37
38
  const jsx_runtime_1 = require("react/jsx-runtime");
38
- const utils_1 = require("../lib/utils");
39
39
  const TooltipPrimitive = __importStar(require("@radix-ui/react-tooltip"));
40
40
  const React = __importStar(require("react"));
41
- const TooltipProvider = ({ children, ...props }) => ((0, jsx_runtime_1.jsx)(TooltipPrimitive.Provider, { delayDuration: 0, ...props, children: children }));
42
- exports.TooltipProvider = TooltipProvider;
43
- const Tooltip = TooltipPrimitive.Root;
44
- exports.Tooltip = Tooltip;
45
- const TooltipTrigger = TooltipPrimitive.Trigger;
46
- exports.TooltipTrigger = TooltipTrigger;
47
- const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => ((0, jsx_runtime_1.jsxs)(TooltipPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: (0, utils_1.cn)('z-[9999] origin-[--radix-tooltip-content-transform-origin] overflow-hidden rounded-fds-md bg-fds-gray px-fds-lg py-fds-md !text-fds-base !font-fds-regular text-fds-white shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', className), ...props, children: [props.children, (0, jsx_runtime_1.jsx)(TooltipPrimitive.Arrow, { className: "fill-fds-gray", width: 12, height: 6 })] })));
48
- exports.TooltipContent = TooltipContent;
49
- TooltipContent.displayName = TooltipPrimitive.Content.displayName;
41
+ function resolvePlacement(placement) {
42
+ const [sideRaw, alignRaw] = placement.split('-');
43
+ const align = alignRaw ?? 'center';
44
+ const isRtl = typeof document !== 'undefined' && document.documentElement.dir === 'rtl';
45
+ // Map logical start/end to physical left/right
46
+ const resolveLogical = (value) => (value === 'start') !== isRtl ? 'left' : 'right';
47
+ const side = sideRaw === 'top' || sideRaw === 'bottom'
48
+ ? sideRaw
49
+ : resolveLogical(sideRaw);
50
+ // Radix align also needs RTL flip for start/end
51
+ const radixAlign = align === 'center'
52
+ ? 'center'
53
+ : isRtl
54
+ ? align === 'start' ? 'end' : 'start'
55
+ : align;
56
+ return { side, align: radixAlign };
57
+ }
58
+ // Arrow is 12px wide. Place its center at border-radius (4px) + half arrow (6px) = 10px from edge.
59
+ const ARROW_EDGE_INSET = 10;
60
+ function Tooltip({ message, placement = 'top', children }) {
61
+ const { side, align } = resolvePlacement(placement);
62
+ const triggerRef = React.useRef(null);
63
+ const [alignOffset, setAlignOffset] = React.useState(0);
64
+ React.useEffect(() => {
65
+ if (align === 'center' || !triggerRef.current) {
66
+ setAlignOffset(0);
67
+ return;
68
+ }
69
+ const isHorizontal = side === 'top' || side === 'bottom';
70
+ const triggerSize = isHorizontal
71
+ ? triggerRef.current.offsetWidth
72
+ : triggerRef.current.offsetHeight;
73
+ // Negative offset shifts tooltip away from alignment edge,
74
+ // pulling the arrow (anchored at trigger center) toward that edge.
75
+ setAlignOffset(ARROW_EDGE_INSET - triggerSize / 2);
76
+ }, [align, side]);
77
+ return ((0, jsx_runtime_1.jsx)(TooltipPrimitive.Provider, { delayDuration: 0, children: (0, jsx_runtime_1.jsxs)(TooltipPrimitive.Root, { children: [(0, jsx_runtime_1.jsx)(TooltipPrimitive.Trigger, { asChild: true, ref: triggerRef, children: children }), (0, jsx_runtime_1.jsxs)(TooltipPrimitive.Content, { side: side, align: align, alignOffset: alignOffset, sideOffset: 4, className: "z-[9999] origin-[--radix-tooltip-content-transform-origin] overflow-hidden rounded-fds-md bg-fds-gray-100 p-fds-sm !text-fds-base !leading-none !font-fds-regular text-fds-white shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:bg-white dark:text-[rgba(83,87,95,1)]", children: [message, (0, jsx_runtime_1.jsx)(TooltipPrimitive.Arrow, { className: "fill-fds-gray-100 dark:fill-white", width: 12, height: 6 })] })] }) }));
78
+ }
package/dist/cjs/index.js CHANGED
@@ -1,88 +1,42 @@
1
1
  "use strict";
2
- // FreightWind Design System - Component Library
3
- // @freightos/freightwind
4
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
- if (k2 === undefined) k2 = k;
6
- var desc = Object.getOwnPropertyDescriptor(m, k);
7
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
- desc = { enumerable: true, get: function() { return m[k]; } };
9
- }
10
- Object.defineProperty(o, k2, desc);
11
- }) : (function(o, m, k, k2) {
12
- if (k2 === undefined) k2 = k;
13
- o[k2] = m[k];
14
- }));
15
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
17
- };
2
+ 'use client';
18
3
  Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.SonnerToaster = exports.toast = exports.useToast = exports.cn = void 0;
20
- // Utility
4
+ exports.iconMap = exports.useStableId = exports.cn = exports.Tooltip = exports.Switch = exports.Slider = exports.RadioGroupItem = exports.RadioGroup = exports.RadioButtonGroup = exports.PopConfirm = exports.message = exports.MessageProvider = exports.chipVariants = exports.Chip = exports.Checkbox = exports.buttonVariants = exports.Button = exports.Badge = exports.Avatar = exports.Alert = void 0;
5
+ // Components
6
+ var alert_1 = require("./components/alert");
7
+ Object.defineProperty(exports, "Alert", { enumerable: true, get: function () { return alert_1.Alert; } });
8
+ var avatar_1 = require("./components/avatar");
9
+ Object.defineProperty(exports, "Avatar", { enumerable: true, get: function () { return avatar_1.Avatar; } });
10
+ var badge_1 = require("./components/badge");
11
+ Object.defineProperty(exports, "Badge", { enumerable: true, get: function () { return badge_1.Badge; } });
12
+ var button_1 = require("./components/button");
13
+ Object.defineProperty(exports, "Button", { enumerable: true, get: function () { return button_1.Button; } });
14
+ Object.defineProperty(exports, "buttonVariants", { enumerable: true, get: function () { return button_1.buttonVariants; } });
15
+ var checkbox_1 = require("./components/checkbox");
16
+ Object.defineProperty(exports, "Checkbox", { enumerable: true, get: function () { return checkbox_1.Checkbox; } });
17
+ var chip_1 = require("./components/chip");
18
+ Object.defineProperty(exports, "Chip", { enumerable: true, get: function () { return chip_1.Chip; } });
19
+ Object.defineProperty(exports, "chipVariants", { enumerable: true, get: function () { return chip_1.chipVariants; } });
20
+ var message_1 = require("./components/message");
21
+ Object.defineProperty(exports, "MessageProvider", { enumerable: true, get: function () { return message_1.MessageProvider; } });
22
+ Object.defineProperty(exports, "message", { enumerable: true, get: function () { return message_1.message; } });
23
+ var pop_confirm_1 = require("./components/pop-confirm");
24
+ Object.defineProperty(exports, "PopConfirm", { enumerable: true, get: function () { return pop_confirm_1.PopConfirm; } });
25
+ var radio_button_group_1 = require("./components/radio-button-group");
26
+ Object.defineProperty(exports, "RadioButtonGroup", { enumerable: true, get: function () { return radio_button_group_1.RadioButtonGroup; } });
27
+ var radio_group_1 = require("./components/radio-group");
28
+ Object.defineProperty(exports, "RadioGroup", { enumerable: true, get: function () { return radio_group_1.RadioGroup; } });
29
+ Object.defineProperty(exports, "RadioGroupItem", { enumerable: true, get: function () { return radio_group_1.RadioGroupItem; } });
30
+ var slider_1 = require("./components/slider");
31
+ Object.defineProperty(exports, "Slider", { enumerable: true, get: function () { return slider_1.Slider; } });
32
+ var switch_1 = require("./components/switch");
33
+ Object.defineProperty(exports, "Switch", { enumerable: true, get: function () { return switch_1.Switch; } });
34
+ var tooltip_1 = require("./components/tooltip");
35
+ Object.defineProperty(exports, "Tooltip", { enumerable: true, get: function () { return tooltip_1.Tooltip; } });
36
+ // Utilities
21
37
  var utils_1 = require("./lib/utils");
22
38
  Object.defineProperty(exports, "cn", { enumerable: true, get: function () { return utils_1.cn; } });
23
- // Hooks
24
- var use_toast_1 = require("./hooks/use-toast");
25
- Object.defineProperty(exports, "useToast", { enumerable: true, get: function () { return use_toast_1.useToast; } });
26
- Object.defineProperty(exports, "toast", { enumerable: true, get: function () { return use_toast_1.toast; } });
27
- // Components
28
- __exportStar(require("./components/accordion"), exports);
29
- __exportStar(require("./components/alert"), exports);
30
- __exportStar(require("./components/aspect-ratio"), exports);
31
- __exportStar(require("./components/avatar"), exports);
32
- __exportStar(require("./components/badge"), exports);
33
- __exportStar(require("./components/breadcrumb"), exports);
34
- __exportStar(require("./components/button"), exports);
35
- __exportStar(require("./components/calendar"), exports);
36
- __exportStar(require("./components/card"), exports);
37
- __exportStar(require("./components/chart"), exports);
38
- __exportStar(require("./components/checkbox"), exports);
39
- __exportStar(require("./components/chip"), exports);
40
- __exportStar(require("./components/collapsible"), exports);
41
- __exportStar(require("./components/command"), exports);
42
- __exportStar(require("./components/context-menu"), exports);
43
- __exportStar(require("./components/country-select"), exports);
44
- __exportStar(require("./components/date-picker"), exports);
45
- __exportStar(require("./components/date-range-picker"), exports);
46
- __exportStar(require("./components/date-time-picker"), exports);
47
- __exportStar(require("./components/dialog"), exports);
48
- __exportStar(require("./components/drawer"), exports);
49
- __exportStar(require("./components/dropdown-menu"), exports);
50
- __exportStar(require("./components/empty"), exports);
51
- __exportStar(require("./components/file-preview"), exports);
52
- __exportStar(require("./components/form"), exports);
53
- __exportStar(require("./components/inline-edit"), exports);
54
- __exportStar(require("./components/input"), exports);
55
- __exportStar(require("./components/input-group"), exports);
56
- __exportStar(require("./components/input-otp"), exports);
57
- __exportStar(require("./components/label"), exports);
58
- __exportStar(require("./components/menubar"), exports);
59
- __exportStar(require("./components/navigation-menu"), exports);
60
- __exportStar(require("./components/pagination"), exports);
61
- __exportStar(require("./components/phone-input"), exports);
62
- __exportStar(require("./components/popover"), exports);
63
- __exportStar(require("./components/progress"), exports);
64
- __exportStar(require("./components/radio-button-group"), exports);
65
- __exportStar(require("./components/radio-group"), exports);
66
- __exportStar(require("./components/resizable"), exports);
67
- __exportStar(require("./components/rich-text-editor"), exports);
68
- __exportStar(require("./components/scroll-area"), exports);
69
- __exportStar(require("./components/select"), exports);
70
- __exportStar(require("./components/separator"), exports);
71
- __exportStar(require("./components/sheet"), exports);
72
- __exportStar(require("./components/skeleton"), exports);
73
- __exportStar(require("./components/slider"), exports);
74
- var sonner_1 = require("./components/sonner");
75
- Object.defineProperty(exports, "SonnerToaster", { enumerable: true, get: function () { return sonner_1.Toaster; } });
76
- __exportStar(require("./components/spinner"), exports);
77
- __exportStar(require("./components/stepper"), exports);
78
- __exportStar(require("./components/steps"), exports);
79
- __exportStar(require("./components/switch"), exports);
80
- __exportStar(require("./components/table"), exports);
81
- __exportStar(require("./components/tabs"), exports);
82
- __exportStar(require("./components/textarea"), exports);
83
- __exportStar(require("./components/time-picker"), exports);
84
- __exportStar(require("./components/toast"), exports);
85
- __exportStar(require("./components/toaster"), exports);
86
- __exportStar(require("./components/toggle"), exports);
87
- __exportStar(require("./components/toggle-group"), exports);
88
- __exportStar(require("./components/tooltip"), exports);
39
+ var use_stable_id_1 = require("./lib/use-stable-id");
40
+ Object.defineProperty(exports, "useStableId", { enumerable: true, get: function () { return use_stable_id_1.useStableId; } });
41
+ var icon_utils_1 = require("./lib/icon-utils");
42
+ Object.defineProperty(exports, "iconMap", { enumerable: true, get: function () { return icon_utils_1.iconMap; } });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.iconMap = void 0;
4
+ var icons_1 = require("@freightos/icons");
5
+ Object.defineProperty(exports, "iconMap", { enumerable: true, get: function () { return icons_1.iconMap; } });
@@ -33,7 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.AspectRatio = void 0;
37
- const AspectRatioPrimitive = __importStar(require("@radix-ui/react-aspect-ratio"));
38
- const AspectRatio = AspectRatioPrimitive.Root;
39
- exports.AspectRatio = AspectRatio;
36
+ exports.useStableId = useStableId;
37
+ const React = __importStar(require("react"));
38
+ let counter = 0;
39
+ function useStableId(prefix = 'fw') {
40
+ const [id] = React.useState(() => `${prefix}-${++counter}`);
41
+ return id;
42
+ }
@@ -3,6 +3,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.cn = cn;
4
4
  const clsx_1 = require("clsx");
5
5
  const tailwind_merge_1 = require("tailwind-merge");
6
+ const twMerge = (0, tailwind_merge_1.extendTailwindMerge)({
7
+ extend: {
8
+ classGroups: {
9
+ "font-size": [
10
+ "text-fds-xs",
11
+ "text-fds-sm",
12
+ "text-fds-base",
13
+ "text-fds-h6",
14
+ "text-fds-h5",
15
+ "text-fds-h4",
16
+ "text-fds-h3",
17
+ "text-fds-h2",
18
+ "text-fds-h1",
19
+ ],
20
+ },
21
+ },
22
+ });
6
23
  function cn(...inputs) {
7
- return (0, tailwind_merge_1.twMerge)((0, clsx_1.clsx)(inputs));
24
+ return twMerge((0, clsx_1.clsx)(inputs));
8
25
  }
@@ -1,39 +1,56 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { IconCheckCircled, IconClose, IconInfoCircled, IconAlertCircled, IconNegativeCircled } from '@freightos/icons';
3
+ import { IconCheckCircled, IconClose, IconInfoCircled, IconRisk, IconNegativeCircled } from '@freightos/icons';
4
+ import { AnimatePresence, motion } from 'motion/react';
4
5
  import * as React from 'react';
5
6
  import { cn } from '../lib/utils';
6
7
  const alertConfig = {
7
8
  info: {
8
9
  icon: IconInfoCircled,
9
- borderColor: 'border-l-fds-blue',
10
- iconColor: 'text-fds-blue',
10
+ borderColor: 'border-l-fds-blue-30',
11
+ iconColor: 'text-fds-blue-30',
11
12
  },
12
13
  success: {
13
14
  icon: IconCheckCircled,
14
- borderColor: 'border-l-fds-green',
15
- iconColor: 'text-fds-green',
15
+ borderColor: 'border-l-fds-green-30',
16
+ iconColor: 'text-fds-green-30',
16
17
  },
17
18
  warning: {
18
- icon: IconAlertCircled,
19
- borderColor: 'border-l-fds-orange',
20
- iconColor: 'text-fds-orange',
19
+ icon: IconRisk,
20
+ borderColor: 'border-l-fds-yellow-30',
21
+ iconColor: 'text-fds-yellow-30',
21
22
  },
22
23
  error: {
23
24
  icon: IconNegativeCircled,
24
- borderColor: 'border-l-fds-red',
25
- iconColor: 'text-fds-red',
25
+ borderColor: 'border-l-fds-red-30',
26
+ iconColor: 'text-fds-red-30',
27
+ },
28
+ special: {
29
+ icon: IconInfoCircled,
30
+ borderColor: 'border-l-fds-purple-1',
31
+ iconColor: 'text-fds-purple-1',
26
32
  },
27
33
  };
28
- export const Alert = ({ type = 'info', message, description, closable = false, onClose, className, }) => {
34
+ export const Alert = ({ variant = 'info', title, message, closable = false, onClose, callToAction, }) => {
29
35
  const [visible, setVisible] = React.useState(true);
30
- if (!visible)
31
- return null;
32
- const config = alertConfig[type];
36
+ const [closing, setClosing] = React.useState(false);
37
+ const config = alertConfig[variant];
33
38
  const Icon = config.icon;
39
+ const showCta = callToAction && !title;
40
+ const showClose = closable && !showCta;
34
41
  const handleClose = () => {
35
- setVisible(false);
36
- onClose?.();
42
+ setClosing(true);
37
43
  };
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 }) }))] }));
44
+ if (!visible)
45
+ return null;
46
+ return (_jsx("div", { style: {
47
+ display: 'grid',
48
+ gridTemplateRows: closing ? '0fr' : '1fr',
49
+ transition: 'grid-template-rows 0.2s ease-in-out',
50
+ }, onTransitionEnd: (e) => {
51
+ if (e.propertyName === 'grid-template-rows' && closing) {
52
+ setVisible(false);
53
+ onClose?.();
54
+ }
55
+ }, children: _jsx("div", { style: { overflow: 'hidden' }, children: _jsx(AnimatePresence, { initial: false, children: !closing && (_jsxs(motion.div, { role: "alert", exit: { y: -20 }, transition: { duration: 0.15, ease: 'easeIn' }, className: cn('flex w-full gap-fds-sm rounded-fds-md border-l-4 bg-card pr-fds-sm shadow-[0_0_10px_0_rgba(35,37,55,0.12)]', title ? 'items-start pl-fds-md py-fds-md' : 'items-center pl-fds-lg py-[5px]', config.borderColor), children: [_jsx(Icon, { size: title ? 20 : 18, className: cn('shrink-0', title && 'mt-[3px]', config.iconColor) }), _jsxs("div", { className: "flex-1 min-w-0", children: [title && _jsx("div", { className: "text-fds-h5 font-fds-bold leading-fds-title text-foreground", children: title }), message && (_jsx("div", { className: cn('text-fds-base text-fds-gray-80 dark:text-white', title && 'mt-fds-xs'), children: message }))] }), showCta && _jsx("div", { className: "shrink-0", children: callToAction }), showClose && (_jsx("button", { type: "button", onClick: handleClose, className: "fw-base shrink-0 cursor-pointer text-fds-gray-90 hover:text-fds-gray-100 transition-colors", "aria-label": "Close alert", children: _jsx(IconClose, { size: 16 }) }))] })) }) }) }));
39
56
  };