@0xsquid/ui 2.6.3 → 2.6.4

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 (31) hide show
  1. package/dist/cjs/index.js +170 -35
  2. package/dist/cjs/types/components/buttons/Button.d.ts +4 -1
  3. package/dist/cjs/types/components/controls/Switch.d.ts +1 -1
  4. package/dist/cjs/types/components/icons/Generic.d.ts +8 -0
  5. package/dist/cjs/types/components/lists/ListItem.d.ts +4 -1
  6. package/dist/cjs/types/core/utils.d.ts +7 -0
  7. package/dist/cjs/types/hooks/useColorFromSeed.d.ts +1 -0
  8. package/dist/cjs/types/stories/buttons/AssetsButton.stories.d.ts +1 -0
  9. package/dist/cjs/types/stories/buttons/Button.stories.d.ts +30 -15
  10. package/dist/cjs/types/stories/controls/Switch.stories.d.ts +5 -3
  11. package/dist/cjs/types/stories/lists/ListItem.stories.d.ts +3 -0
  12. package/dist/cjs/types/types/components.d.ts +1 -1
  13. package/dist/cjs/types/types/config.d.ts +3 -3
  14. package/dist/cjs/types/types/index.d.ts +1 -1
  15. package/dist/esm/index.js +168 -36
  16. package/dist/esm/types/components/buttons/Button.d.ts +4 -1
  17. package/dist/esm/types/components/controls/Switch.d.ts +1 -1
  18. package/dist/esm/types/components/icons/Generic.d.ts +8 -0
  19. package/dist/esm/types/components/lists/ListItem.d.ts +4 -1
  20. package/dist/esm/types/core/utils.d.ts +7 -0
  21. package/dist/esm/types/hooks/useColorFromSeed.d.ts +1 -0
  22. package/dist/esm/types/stories/buttons/AssetsButton.stories.d.ts +1 -0
  23. package/dist/esm/types/stories/buttons/Button.stories.d.ts +30 -15
  24. package/dist/esm/types/stories/controls/Switch.stories.d.ts +5 -3
  25. package/dist/esm/types/stories/lists/ListItem.stories.d.ts +3 -0
  26. package/dist/esm/types/types/components.d.ts +1 -1
  27. package/dist/esm/types/types/config.d.ts +3 -3
  28. package/dist/esm/types/types/index.d.ts +1 -1
  29. package/dist/index.css +1 -1
  30. package/dist/index.d.ts +21 -7
  31. package/package.json +1 -1
package/dist/cjs/index.js CHANGED
@@ -117,6 +117,13 @@ const THEME_COLOR_KEYS = [
117
117
  "button-md-secondary-text",
118
118
  "button-md-tertiary-bg",
119
119
  "button-md-tertiary-text",
120
+ // sm button variant colors
121
+ "button-sm-primary-bg",
122
+ "button-sm-primary-text",
123
+ "button-sm-secondary-bg",
124
+ "button-sm-secondary-text",
125
+ "button-sm-tertiary-bg",
126
+ "button-sm-tertiary-text",
120
127
  // input colors
121
128
  "input-placeholder",
122
129
  "input-text",
@@ -146,12 +153,18 @@ const THEME_COLOR_KEYS = [
146
153
  "material-light-blend-grey-800",
147
154
  ];
148
155
  const THEME_BORDER_RADIUS_KEYS = [
156
+ // lg button
149
157
  "button-lg-primary",
150
158
  "button-lg-secondary",
151
159
  "button-lg-tertiary",
160
+ // md button
152
161
  "button-md-primary",
153
162
  "button-md-secondary",
154
163
  "button-md-tertiary",
164
+ // sm button
165
+ "button-sm-primary",
166
+ "button-sm-secondary",
167
+ "button-sm-tertiary",
155
168
  "container",
156
169
  "input",
157
170
  "menu-sm",
@@ -2953,6 +2966,19 @@ function mapToCssVariables(obj) {
2953
2966
  return acc;
2954
2967
  }, {});
2955
2968
  }
2969
+ /**
2970
+ * Simple hash function to create a deterministic index from a given string.
2971
+ * @param {string} str - The input string to hash.
2972
+ * @param {number} max - The maximum value for the hash.
2973
+ * @returns {number} - The index within the array.
2974
+ */
2975
+ function hashStringToIndex(str, max) {
2976
+ let index = 0;
2977
+ for (let i = 0; i < str.length; i++) {
2978
+ index = (index * 31 + str.charCodeAt(i)) % max;
2979
+ }
2980
+ return index;
2981
+ }
2956
2982
 
2957
2983
  const spacing$1 = {
2958
2984
  "squid-xxs": "0.3125rem", // 5px
@@ -3347,12 +3373,18 @@ const defaultFontFamily = {
3347
3373
  "squid-main": "Geist, sans-serif",
3348
3374
  };
3349
3375
  const defaultBorderRadius = {
3376
+ // lg button
3350
3377
  "button-lg-primary": spacing$1["squid-xxl"],
3351
3378
  "button-lg-secondary": spacing$1["squid-xxl"],
3352
3379
  "button-lg-tertiary": spacing$1["squid-xxl"],
3380
+ // md button
3353
3381
  "button-md-primary": spacing$1["squid-m"],
3354
3382
  "button-md-secondary": spacing$1["squid-m"],
3355
3383
  "button-md-tertiary": spacing$1["squid-m"],
3384
+ // sm button
3385
+ "button-sm-primary": spacing$1["squid-m"],
3386
+ "button-sm-secondary": spacing$1["squid-m"],
3387
+ "button-sm-tertiary": spacing$1["squid-m"],
3356
3388
  container: spacing$1["squid-l"],
3357
3389
  input: "9999px",
3358
3390
  "menu-sm": spacing$1["squid-s"],
@@ -3394,18 +3426,27 @@ const lightTheme = {
3394
3426
  "animation-bg": "#B893EC",
3395
3427
  "animation-text": "#FBFBFD",
3396
3428
  // buttons
3429
+ // lg button
3397
3430
  "button-lg-primary-bg": "#B893EC",
3398
3431
  "button-lg-primary-text": "#FBFBFD",
3399
3432
  "button-lg-secondary-bg": "#17191C",
3400
3433
  "button-lg-secondary-text": "#EDEEF3",
3401
3434
  "button-lg-tertiary-bg": "#EDEEF3",
3402
3435
  "button-lg-tertiary-text": "#292C32",
3436
+ // md button
3403
3437
  "button-md-primary-bg": "#B893EC",
3404
3438
  "button-md-primary-text": "#FBFBFD",
3405
3439
  "button-md-secondary-bg": "#17191C",
3406
3440
  "button-md-secondary-text": "#EDEEF3",
3407
3441
  "button-md-tertiary-bg": "#EDEEF3",
3408
3442
  "button-md-tertiary-text": "#292C32",
3443
+ // sm button
3444
+ "button-sm-primary-bg": "#B893EC",
3445
+ "button-sm-primary-text": "#FBFBFD",
3446
+ "button-sm-secondary-bg": "#17191C",
3447
+ "button-sm-secondary-text": "#EDEEF3",
3448
+ "button-sm-tertiary-bg": "#EDEEF3",
3449
+ "button-sm-tertiary-text": "#292C32",
3409
3450
  // input
3410
3451
  "input-bg": "#FBFBFD",
3411
3452
  "input-placeholder": "#A7ABBE",
@@ -3454,18 +3495,27 @@ const darkTheme = {
3454
3495
  "animation-bg": "#9E79D2",
3455
3496
  "animation-text": "#FBFBFD",
3456
3497
  // buttons
3498
+ // lg button
3457
3499
  "button-lg-primary-bg": "#9E79D2",
3458
3500
  "button-lg-primary-text": "#FBFBFD",
3459
3501
  "button-lg-secondary-bg": "#FBFBFD",
3460
3502
  "button-lg-secondary-text": "#292C32",
3461
3503
  "button-lg-tertiary-bg": "#292C32",
3462
3504
  "button-lg-tertiary-text": "#D1D6E0",
3505
+ // md button
3463
3506
  "button-md-primary-bg": "#9E79D2",
3464
3507
  "button-md-primary-text": "#FBFBFD",
3465
3508
  "button-md-secondary-bg": "#FBFBFD",
3466
3509
  "button-md-secondary-text": "#292C32",
3467
3510
  "button-md-tertiary-bg": "#292C32",
3468
3511
  "button-md-tertiary-text": "#D1D6E0",
3512
+ // sm button
3513
+ "button-sm-primary-bg": "#9E79D2",
3514
+ "button-sm-primary-text": "#FBFBFD",
3515
+ "button-sm-secondary-bg": "#FBFBFD",
3516
+ "button-sm-secondary-text": "#292C32",
3517
+ "button-sm-tertiary-bg": "#292C32",
3518
+ "button-sm-tertiary-text": "#D1D6E0",
3469
3519
  // input
3470
3520
  "input-bg": "#17191C",
3471
3521
  "input-placeholder": "#676B7E",
@@ -3544,7 +3594,7 @@ const boxShadowClassMap = {
3544
3594
  xlarge: "tw-shadow-elevation-light-2",
3545
3595
  xxlarge: "tw-shadow-elevation-dark-1",
3546
3596
  };
3547
- const roundedClassMap$1 = {
3597
+ const roundedClassMap = {
3548
3598
  xxs: "tw-rounded-squid-xxs",
3549
3599
  xs: "tw-rounded-squid-xs",
3550
3600
  s: "tw-rounded-squid-s",
@@ -3573,7 +3623,7 @@ const borderClassMap = {
3573
3623
  };
3574
3624
  function Image$1(_a) {
3575
3625
  var { src, size = "medium", className: propsClassName, placeholderImageUrl, border = "none", rounded = "xxs", shadow = false, children, containerProps } = _a, props = __rest$1(_a, ["src", "size", "className", "placeholderImageUrl", "border", "rounded", "shadow", "children", "containerProps"]);
3576
- const className = cn("tw-object-cover tw-aspect-square tw-relative tw-duration-300 tw-transition-[width,height] tw-max-w-full tw-bg-grey-500", sizeClassMap$1[size], propsClassName, roundedClassMap$1[rounded], shadow && boxShadowClassMap[size], borderClassMap[border]);
3626
+ const className = cn("tw-object-cover tw-aspect-square tw-relative tw-duration-300 tw-transition-[width,height] tw-max-w-full tw-bg-grey-500", sizeClassMap$1[size], propsClassName, roundedClassMap[rounded], shadow && boxShadowClassMap[size], borderClassMap[border]);
3577
3627
  const [imageState, setImageState] = React$1.useState(exports.ImageState.LOADED);
3578
3628
  return (jsxRuntime.jsxs("div", Object.assign({}, containerProps, { className: cn("tw-relative", containerProps === null || containerProps === void 0 ? void 0 : containerProps.className), children: [border === "gradient" && (jsxRuntime.jsx("span", { style: {
3579
3629
  borderRadius: gradientRoundedClassMap[rounded],
@@ -4032,6 +4082,12 @@ function ArrowExpandIcon({ className, size = "24", }) {
4032
4082
  function MoneyBagIcon({ className, size = "24", }) {
4033
4083
  return (jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", className: className, children: jsxRuntime.jsx("path", { d: "M9.5 8H14.5M9.5 8C9.5 8 3.99996 11 4 16C4.00003 20.0207 7.97931 21 12 21C16.0207 21 20 20.0207 20 16C20 11 14.5 8 14.5 8M9.5 8L8.55725 5.48601C8.23089 4.6157 8.56249 3.64123 9.45158 3.37016C10.1074 3.1702 10.9686 3 12 3C13.0314 3 13.8926 3.1702 14.5484 3.37016C15.4375 3.64123 15.7691 4.6157 15.4427 5.48601L14.5 8", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }));
4034
4084
  }
4085
+ function PluginIcon({ size = "16", className, }) {
4086
+ return (jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 16 16", fill: "none", className: className, children: jsxRuntime.jsx("path", { d: "M6.66675 1.99998C6.66675 1.63179 6.36827 1.33331 6.00008 1.33331C5.63189 1.33331 5.33341 1.63179 5.33341 1.99998V3.99998H4.66675C3.56218 3.99998 2.66675 4.89541 2.66675 5.99998V9.33331C2.66675 11.1743 4.15913 12.6666 6.00008 12.6666H7.33341V14C7.33341 14.3682 7.63189 14.6666 8.00008 14.6666C8.36827 14.6666 8.66675 14.3682 8.66675 14V12.6666H10.0001C11.841 12.6666 13.3334 11.1743 13.3334 9.33331V5.99998C13.3334 4.89541 12.438 3.99998 11.3334 3.99998H10.6667V1.99998C10.6667 1.63179 10.3683 1.33331 10.0001 1.33331C9.63189 1.33331 9.33341 1.63179 9.33341 1.99998V3.99998H6.66675V1.99998Z", fill: "currentColor" }) }));
4087
+ }
4088
+ function CircleCheckIcon({ className, size = "24", }) {
4089
+ return (jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", className: className, children: jsxRuntime.jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2ZM15.774 10.1333C16.1237 9.70582 16.0607 9.0758 15.6332 8.72607C15.2058 8.37635 14.5758 8.43935 14.226 8.86679L10.4258 13.5116L9.20711 12.2929C8.81658 11.9024 8.18342 11.9024 7.79289 12.2929C7.40237 12.6834 7.40237 13.3166 7.79289 13.7071L9.79289 15.7071C9.99267 15.9069 10.2676 16.0129 10.5498 15.9988C10.832 15.9847 11.095 15.8519 11.274 15.6333L15.774 10.1333Z", fill: "currentColor" }) }));
4090
+ }
4035
4091
 
4036
4092
  function EmptyHeartIcon({ className }) {
4037
4093
  return (jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", className: className, children: jsxRuntime.jsx("path", { d: "M21 10C21 15.75 12.75 20 12 20C11.25 20 3 15.75 3 10C3 6 5.5 4 8 4C10.5 4 12 5.5 12 5.5C12 5.5 13.5 4 16 4C18.5 4 21 6 21 10Z", stroke: "currentColor", strokeWidth: "2", strokeLinejoin: "round" }) }));
@@ -4398,16 +4454,23 @@ function Chip(_a) {
4398
4454
  return (jsxRuntime.jsx("div", Object.assign({}, props, { className: cn("tw-flex tw-h-squid-m tw-items-center tw-justify-center tw-rounded-squid-m tw-bg-grey-500 tw-text-grey-900", icon && "tw-w-squid-m", props.className), children: label ? (jsxRuntime.jsx(CaptionText, { className: "tw-min-w-squid-xl tw-text-nowrap tw-px-squid-xxs tw-text-center", children: label })) : (icon) })));
4399
4455
  }
4400
4456
 
4457
+ const loaderSizeMap = {
4458
+ sm: "16px",
4459
+ md: "24px",
4460
+ lg: "36px",
4461
+ };
4401
4462
  const baseButtonClassName = "tw-border tw-relative tw-overflow-hidden tw-group/base-button tw-flex tw-items-center tw-justify-center";
4402
4463
  const buttonWidthClassnameMap = {
4464
+ sm: "tw-w-max",
4403
4465
  md: "tw-min-w-[60px]",
4404
4466
  lg: "tw-w-full",
4405
4467
  };
4406
4468
  const buttonSizeClassMap = {
4407
4469
  md: "tw-px-squid-xs tw-py-squid-xxs tw-h-squid-xl",
4408
4470
  lg: "tw-p-1 tw-h-button",
4471
+ sm: "tw-h-squid-l tw-px-squid-xs",
4409
4472
  };
4410
- const roundedClassMap = {
4473
+ const buttonRoundedClassMap = {
4411
4474
  lg: {
4412
4475
  primary: "tw-rounded-button-lg-primary",
4413
4476
  secondary: "tw-rounded-button-lg-secondary",
@@ -4418,6 +4481,11 @@ const roundedClassMap = {
4418
4481
  secondary: "tw-rounded-button-md-secondary",
4419
4482
  tertiary: "tw-rounded-button-md-tertiary",
4420
4483
  },
4484
+ sm: {
4485
+ primary: "tw-rounded-button-sm-primary",
4486
+ secondary: "tw-rounded-button-sm-secondary",
4487
+ tertiary: "tw-rounded-button-sm-tertiary",
4488
+ },
4421
4489
  };
4422
4490
  const buttonVariantClassMap = {
4423
4491
  lg: {
@@ -4430,22 +4498,24 @@ const buttonVariantClassMap = {
4430
4498
  secondary: "tw-bg-button-md-secondary-bg tw-text-button-md-secondary-text",
4431
4499
  tertiary: "tw-bg-button-md-tertiary-bg tw-text-button-md-tertiary-text",
4432
4500
  },
4501
+ sm: {
4502
+ primary: "tw-bg-button-sm-primary-bg tw-text-button-sm-primary-text",
4503
+ secondary: "tw-bg-button-sm-secondary-bg tw-text-button-sm-secondary-text",
4504
+ tertiary: "tw-bg-button-sm-tertiary-bg tw-text-button-sm-tertiary-text",
4505
+ },
4433
4506
  };
4434
4507
  // right now all variants have the same disabled styles
4435
4508
  // in the future, we can add more disabled styles for different variants
4436
4509
  const buttonDisabledClass = "!tw-bg-grey-800 !tw-text-grey-600 tw-cursor-not-allowed";
4437
4510
  const loadingClassname = "tw-invisible tw-opacity-0";
4438
4511
  function Button$1(_a) {
4439
- var { label, disabled = false, size, variant, icon, link, isLoading = false, showLoader = false, chip, containerClassName, anchorRef, buttonRef } = _a, props = __rest$1(_a, ["label", "disabled", "size", "variant", "icon", "link", "isLoading", "showLoader", "chip", "containerClassName", "anchorRef", "buttonRef"]);
4512
+ var { label, disabled = false, size, variant, icon, link, isLoading = false, showLoader = false, loaderSize = "md", chip, containerClassName, anchorRef, buttonRef } = _a, props = __rest$1(_a, ["label", "disabled", "size", "variant", "icon", "link", "isLoading", "showLoader", "loaderSize", "chip", "containerClassName", "anchorRef", "buttonRef"]);
4440
4513
  const chipElement = chip != null ? (jsxRuntime.jsx(Chip, Object.assign({}, chip, { className: cn("tw-absolute -tw-right-squid-xxs -tw-top-squid-xxs tw-z-10", chip.className) }))) : null;
4441
- const children = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!disabled && !isLoading && (jsxRuntime.jsx(ButtonHoverOverlay, { className: roundedClassMap[size][variant] })), jsxRuntime.jsx("div", { className: "tw-relative tw-z-[5] tw-flex tw-items-center tw-justify-center tw-gap-squid-xxs", children: label == null && icon == null ? (props.children) : size === "lg" ? (jsxRuntime.jsxs("span", { className: "tw-flex tw-items-center tw-justify-center tw-gap-squid-xs tw-px-squid-m", children: [showLoader && jsxRuntime.jsx(Loader, {}), jsxRuntime.jsx(BodyText, { className: isLoading ? loadingClassname : "", size: "medium", children: label })] })) : size === "md" ? (label != null && icon == null ? (
4442
- // label only
4443
- jsxRuntime.jsx(BodyText, { className: isLoading ? loadingClassname : "", size: "small", children: label })) : label == null && icon != null ? (
4444
- // icon only
4445
- isLoading ? null : (icon)) : (
4446
- // icon and label
4447
- jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [icon, jsxRuntime.jsx(BodyText, { className: "tw-pr-1", size: "small", children: label })] }))) : null })] }));
4448
- const className = cn(baseButtonClassName, buttonSizeClassMap[size], buttonWidthClassnameMap[size], buttonVariantClassMap[size][variant], "tw-border-material-light-thin", !disabled && !isLoading && "hover:tw-border-material-light-average", roundedClassMap[size][variant],
4514
+ const children = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!disabled && !isLoading && (jsxRuntime.jsx(ButtonHoverOverlay, { className: buttonRoundedClassMap[size][variant] })), jsxRuntime.jsx("div", { className: "tw-relative tw-z-[5] tw-flex tw-items-center tw-justify-center tw-gap-squid-xxs", children: label == null && icon == null && !showLoader ? (props.children) : (jsxRuntime.jsxs("span", { className: cn("tw-flex tw-items-center tw-justify-center", size === "lg"
4515
+ ? "tw-gap-squid-xs tw-px-squid-m"
4516
+ : "tw-gap-squid-xxs"), children: [showLoader && jsxRuntime.jsx(Loader, { size: loaderSizeMap[loaderSize] }), !isLoading && icon, label != null &&
4517
+ (size === "sm" ? (jsxRuntime.jsx(CaptionText, { className: cn(isLoading && loadingClassname, icon != null && "tw-pr-1"), children: label })) : (jsxRuntime.jsx(BodyText, { className: cn(isLoading && loadingClassname, icon != null && "tw-pr-1"), size: size === "lg" ? "medium" : "small", children: label })))] })) })] }));
4518
+ const className = cn(baseButtonClassName, buttonSizeClassMap[size], buttonWidthClassnameMap[size], buttonVariantClassMap[size][variant], "tw-border-material-light-thin", !disabled && !isLoading && "hover:tw-border-material-light-average", buttonRoundedClassMap[size][variant],
4449
4519
  // disabled styles
4450
4520
  disabled && buttonDisabledClass, isLoading && "tw-cursor-not-allowed",
4451
4521
  // custom classes from props
@@ -4463,7 +4533,7 @@ function Button$1(_a) {
4463
4533
  const ButtonHoverOverlay = ({ className }) => {
4464
4534
  return (jsxRuntime.jsx("span", { className: cn("tw-absolute tw-inset-0 tw-z-0 tw-hidden tw-h-full tw-w-full tw-bg-material-light-thin group-hover/base-button:tw-block", className) }));
4465
4535
  };
4466
- const ButtonWrapper = ({ children, size, variant, className, }) => (jsxRuntime.jsx("div", { className: cn("tw-relative", buttonWidthClassnameMap[size], roundedClassMap[size][variant], className), children: children }));
4536
+ const ButtonWrapper = ({ children, size, variant, className, }) => (jsxRuntime.jsx("div", { className: cn("tw-relative", buttonWidthClassnameMap[size], buttonRoundedClassMap[size][variant], className), children: children }));
4467
4537
 
4468
4538
  function AccountsButton(_a) {
4469
4539
  var { imageUrls } = _a, props = __rest$1(_a, ["imageUrls"]);
@@ -4489,6 +4559,26 @@ function ArrowButton(_a) {
4489
4559
  "aria-disabled:tw-bg-grey-600 aria-disabled:tw-text-grey-800"), children: jsxRuntime.jsx(ArrowRightIcon, {}) })] })));
4490
4560
  }
4491
4561
 
4562
+ const colors = [
4563
+ "#D94E41",
4564
+ "#E58845",
4565
+ "#D9BA21",
4566
+ "#B1CC29",
4567
+ "#66CC33",
4568
+ "#19A654",
4569
+ "#56BFB6",
4570
+ "#45B0E5",
4571
+ "#3973E5",
4572
+ "#7562D9",
4573
+ "#B167E5",
4574
+ "#E573BF",
4575
+ ];
4576
+ function useColorFromSeed(seed) {
4577
+ return React$1.useMemo(() => {
4578
+ return colors[hashStringToIndex(seed, colors.length)];
4579
+ }, [seed]);
4580
+ }
4581
+
4492
4582
  function Input(_a) {
4493
4583
  var { placeholder = "Search", showIcon = true, className, icon, isError = false, isWarning = false, containerClassName, actionButtonProps, autoFocusTimeout, inputRef: inputRefProp } = _a, props = __rest$1(_a, ["placeholder", "showIcon", "className", "icon", "isError", "isWarning", "containerClassName", "actionButtonProps", "autoFocusTimeout", "inputRef"]);
4494
4584
  const showActionButton = actionButtonProps != null;
@@ -19382,7 +19472,7 @@ const collapsedListItemClassMap = {
19382
19472
  large: "tw-w-[80px]",
19383
19473
  };
19384
19474
  function ListItem(_a) {
19385
- var { itemTitle, mainImageUrl, subtitle, subtitleOnHover, detail, icon, secondaryImageUrl, placeholderImageUrl, size = "large", mainIcon, className, isSelected = false, onDetailClick, showDetailOnHoverOnly, rounded = "xxs", detailButtonClassName, loading, containerProps, compactOnMobile, extraPadding = true, itemsContainerRef, dropdownMenuContent, imageGroup, multilineSubtitle = false } = _a, props = __rest$1(_a, ["itemTitle", "mainImageUrl", "subtitle", "subtitleOnHover", "detail", "icon", "secondaryImageUrl", "placeholderImageUrl", "size", "mainIcon", "className", "isSelected", "onDetailClick", "showDetailOnHoverOnly", "rounded", "detailButtonClassName", "loading", "containerProps", "compactOnMobile", "extraPadding", "itemsContainerRef", "dropdownMenuContent", "imageGroup", "multilineSubtitle"]);
19475
+ var { itemTitle, mainImageUrl, subtitle, subtitleOnHover, detail, icon, secondaryImageUrl, placeholderImageUrl, size = "large", mainIcon, className, isSelected = false, onDetailClick, showDetailOnHoverOnly, rounded = "xxs", detailButtonClassName, loading, containerProps, compactOnMobile, extraPadding = true, itemsContainerRef, dropdownMenuContent, imageGroup, multilineSubtitle = false, control } = _a, props = __rest$1(_a, ["itemTitle", "mainImageUrl", "subtitle", "subtitleOnHover", "detail", "icon", "secondaryImageUrl", "placeholderImageUrl", "size", "mainIcon", "className", "isSelected", "onDetailClick", "showDetailOnHoverOnly", "rounded", "detailButtonClassName", "loading", "containerProps", "compactOnMobile", "extraPadding", "itemsContainerRef", "dropdownMenuContent", "imageGroup", "multilineSubtitle", "control"]);
19386
19476
  const { isDropdownOpen, dropdownRef, openDropdown, closeDropdown, openDropdownButtonRef, itemRef, menuRef, dropdownStyles, } = useDropdownMenu({
19387
19477
  itemsContainerRef,
19388
19478
  });
@@ -19418,9 +19508,11 @@ function ListItem(_a) {
19418
19508
  }
19419
19509
  return null;
19420
19510
  };
19421
- const isInteractive = !!props.onClick;
19422
- const ItemTag = isInteractive ? "button" : "div";
19423
- const itemProps = isInteractive ? props : {};
19511
+ const isInteractive = !!props.onClick || !!control;
19512
+ const ItemTag = isInteractive ? (control ? "label" : "button") : "div";
19513
+ const itemProps = isInteractive
19514
+ ? props
19515
+ : {};
19424
19516
  const handleInteraction = (e) => {
19425
19517
  var _a;
19426
19518
  e.preventDefault();
@@ -19437,9 +19529,9 @@ function ListItem(_a) {
19437
19529
  };
19438
19530
  return (jsxRuntime.jsxs("li", Object.assign({}, containerProps, { ref: itemRef, className: cn("tw-relative tw-flex tw-max-w-full tw-bg-grey-900 tw-text-grey-300 tw-highlight-adjacent", !multilineSubtitle && listItemSizeMap[size], extraPadding && "tw-px-squid-xs", compactOnMobile
19439
19531
  ? `${collapsedListItemClassMap[size]} mobile-lg:tw-w-full`
19440
- : "tw-w-full", className), children: [jsxRuntime.jsxs(ItemTag, Object.assign({}, itemProps, { onClick: handleItemClick, className: cn("tw-group/list-item tw-peer/list-item tw-relative tw-flex tw-w-full tw-max-w-full tw-justify-start tw-gap-squid-xs tw-rounded-squid-s tw-px-squid-xs", !multilineSubtitle
19532
+ : "tw-w-full", className), children: [jsxRuntime.jsxs(ItemTag, Object.assign({}, itemProps, { onClick: control == null ? handleItemClick : undefined, className: cn("tw-group/list-item tw-peer/list-item tw-relative tw-flex tw-w-full tw-max-w-full tw-justify-start tw-gap-squid-xs tw-rounded-squid-s tw-px-squid-xs", !multilineSubtitle
19441
19533
  ? "tw-items-center tw-py-squid-xxs"
19442
- : "tw-py-squid-xs", (isSelected || isDropdownOpen) && "tw-bg-material-light-thin", isInteractive && "hover:tw-bg-material-light-thin", isInteractive && "tw-text-left tw-normal-case"), children: [size === "large" ? (jsxRuntime.jsx("div", { className: "tw-h-10 tw-w-10", children: mainIcon !== null && mainIcon !== void 0 ? mainIcon : (imageGroup != null ? (jsxRuntime.jsx(ImageGroup, { size: "small", imageUrls: imageGroup })) : (jsxRuntime.jsx(BadgeImage, { image: {
19534
+ : "tw-py-squid-xs", (isSelected || isDropdownOpen) && "tw-bg-material-light-thin", isInteractive && control == null && "hover:tw-bg-material-light-thin", isInteractive && "tw-text-left tw-normal-case"), children: [size === "large" ? (jsxRuntime.jsx("div", { className: "tw-h-10 tw-w-10", children: mainIcon !== null && mainIcon !== void 0 ? mainIcon : (imageGroup != null ? (jsxRuntime.jsx(ImageGroup, { size: "small", imageUrls: imageGroup })) : (jsxRuntime.jsx(BadgeImage, { image: {
19443
19535
  src: mainImageUrl,
19444
19536
  placeholderImageUrl,
19445
19537
  size: "xlarge",
@@ -19459,7 +19551,7 @@ function ListItem(_a) {
19459
19551
  : "tw-flex", isDetailInteractive && "hover:tw-bg-material-light-thin", detailButtonClassName), children: [!!detail && (jsxRuntime.jsx(CaptionText, { className: "min-tw-w-4 min-tw-h-4 tw-px-squid-xxs tw-leading-[10px]", children: detail })), icon ? (jsxRuntime.jsx("span", { className: "tw-flex tw-items-center tw-justify-center tw-px-[3px] tw-py-2", children: icon })) : null] }))), !!dropdownMenuContent && (jsxRuntime.jsx(ListItemActionsButton, { ref: openDropdownButtonRef, onClick: (e) => {
19460
19552
  e.stopPropagation();
19461
19553
  isDropdownOpen ? closeDropdown() : openDropdown();
19462
- }, isActive: isDropdownOpen, className: "tw-z-20 peer-hover/list-item:tw-opacity-100" }))] })), isDropdownOpen && !!dropdownMenuContent ? (jsxRuntime.jsx(DropdownMenu, { menuRef: menuRef, isHidden: !dropdownStyles, className: cn(!!dropdownStyles &&
19554
+ }, isActive: isDropdownOpen, className: "tw-z-20 peer-hover/list-item:tw-opacity-100" })), control] })), isDropdownOpen && !!dropdownMenuContent ? (jsxRuntime.jsx(DropdownMenu, { menuRef: menuRef, isHidden: !dropdownStyles, className: cn(!!dropdownStyles &&
19463
19555
  dropdownPositionClassMap$1[dropdownStyles.position]), dropdownRef: dropdownRef, children: dropdownMenuContent })) : null] })));
19464
19556
  }
19465
19557
  const ListItemActionsButton = React$1.forwardRef((_a, ref) => {
@@ -27554,19 +27646,23 @@ function Switch({ checked = false, onChange, size, disabled = false, inputProps,
27554
27646
  // size styles
27555
27647
  switchSizeClassMap[size],
27556
27648
  // checked styles
27557
- checked ? "tw-bg-status-positive" : "tw-bg-grey-800",
27649
+ disabled || !checked ? "tw-bg-grey-800" : "tw-bg-status-positive",
27558
27650
  // disabled styles
27559
27651
  disabled ? "tw-cursor-not-allowed" : "tw-cursor-pointer",
27560
27652
  // Focus visible styles
27561
27653
  "tw-focus-visible-within-outline"), children: [jsxRuntime.jsx("input", Object.assign({}, inputProps, { disabled: disabled, checked: checked, onChange: disabled ? undefined : (e) => onChange === null || onChange === void 0 ? void 0 : onChange(e.target.checked), type: "checkbox", className: "tw-peer tw-sr-only" })), jsxRuntime.jsx("span", { style: {
27562
- filter: "drop-shadow(0px 5px 20px rgba(0, 0, 0, 0.33)) drop-shadow(0px 2px 5px rgba(0, 0, 0, 0.20))",
27654
+ filter: disabled
27655
+ ? "drop-shadow(0px 5px 20px rgba(0, 0, 0, 0.10)) drop-shadow(0px 1px 5px rgba(0, 0, 0, 0.10))"
27656
+ : "drop-shadow(0px 5px 20px rgba(0, 0, 0, 0.33)) drop-shadow(0px 2px 5px rgba(0, 0, 0, 0.20))",
27563
27657
  }, className: clsx("tw-absolute tw-rounded-full tw-border tw-border-material-light-thin tw-transition-all",
27564
27658
  // size styles
27565
27659
  switchKnobSizeClassMap[size],
27566
27660
  // checked styles
27567
- switchKnobCheckedClassMap[size][checked ? "checked" : "unchecked"], checked
27568
- ? "group-data-[squid-theme-type=dark]:tw-bg-grey-100 group-data-[squid-theme-type=light]:tw-bg-grey-900"
27569
- : "tw-bg-grey-500") })] }));
27661
+ switchKnobCheckedClassMap[size][checked ? "checked" : "unchecked"], disabled
27662
+ ? "group-data-[squid-theme-type=dark]:tw-bg-grey-700 group-data-[squid-theme-type=light]:tw-bg-grey-900"
27663
+ : checked
27664
+ ? "group-data-[squid-theme-type=dark]:tw-bg-grey-100 group-data-[squid-theme-type=light]:tw-bg-grey-900"
27665
+ : "tw-bg-grey-500") })] }));
27570
27666
  }
27571
27667
 
27572
27668
  function RangeInput({ label, initialValue, onChange, min = 0, max = 99, isWarning = false, }) {
@@ -27680,7 +27776,8 @@ function RangeInput({ label, initialValue, onChange, min = 0, max = 99, isWarnin
27680
27776
  }, onMouseLeave: handleUpdateValue, className: cn("tw-relative tw-flex tw-h-full tw-items-center tw-justify-center tw-self-stretch tw-rounded-squid-xs tw-p-squid-xxs tw-text-left tw-text-caption tw-font-caption tw-leading-[10px] placeholder-shown:tw-text-grey-600 hover:tw-bg-material-light-thin"), children: jsxRuntime.jsx(CirclePlusIcon, {}) })] })] }) }));
27681
27777
  }
27682
27778
 
27683
- const imageClass = "tw-w-[40px] tw-aspect-square tw-flex tw-items-center tw-justify-center";
27779
+ const imageWrapperClassName = "tw-w-[40px] tw-aspect-square tw-flex tw-items-center tw-justify-center";
27780
+ const tokenImageClassName = "tw-absolute tw-h-squid-xl tw-w-squid-xl tw-rounded-full tw-object-cover";
27684
27781
  const themeKeyVariantMap = {
27685
27782
  primary: "grey-800",
27686
27783
  accent: "royal-500",
@@ -27700,6 +27797,12 @@ var AssetsButtonState;
27700
27797
  AssetsButtonState[AssetsButtonState["EMPTY"] = 2] = "EMPTY";
27701
27798
  AssetsButtonState[AssetsButtonState["LOADING"] = 3] = "LOADING";
27702
27799
  })(AssetsButtonState || (AssetsButtonState = {}));
27800
+ var ImageLoadingState;
27801
+ (function (ImageLoadingState) {
27802
+ ImageLoadingState[ImageLoadingState["LOADING"] = 0] = "LOADING";
27803
+ ImageLoadingState[ImageLoadingState["LOADED"] = 1] = "LOADED";
27804
+ ImageLoadingState[ImageLoadingState["ERROR"] = 2] = "ERROR";
27805
+ })(ImageLoadingState || (ImageLoadingState = {}));
27703
27806
  const outlineWidthMap = {
27704
27807
  [AssetsButtonState.LOADING]: {
27705
27808
  inner: 75,
@@ -27719,7 +27822,9 @@ const outlineWidthMap = {
27719
27822
  },
27720
27823
  };
27721
27824
  function AssetsButton({ chain, token, onClick, variant = "primary", isLoading = false, tooltip, emptyTokenLabel = "Select token", }) {
27722
- var _a, _b;
27825
+ var _a, _b, _c, _d;
27826
+ const [tokenImageLoadingState, setTokenImageLoadingState] = React$1.useState(ImageLoadingState.LOADING);
27827
+ const fallbackBgColor = useColorFromSeed((_a = token === null || token === void 0 ? void 0 : token.symbol) !== null && _a !== void 0 ? _a : "");
27723
27828
  const state = React$1.useMemo(() => {
27724
27829
  if (chain != null && !isLoading) {
27725
27830
  if (token != null) {
@@ -27734,10 +27839,27 @@ function AssetsButton({ chain, token, onClick, variant = "primary", isLoading =
27734
27839
  }, [token, chain, isLoading]);
27735
27840
  const defaultBgColor = `var(${themeKeysToCssVariables.color[themeKeyVariantMap[variant]].cssVariable})`;
27736
27841
  const outlineWidth = outlineWidthMap[state];
27737
- const chainBgColor = (_a = chain === null || chain === void 0 ? void 0 : chain.bgColor) !== null && _a !== void 0 ? _a : defaultBgColor;
27738
- const tokenBgColor = state === AssetsButtonState.FULL
27739
- ? (_b = token === null || token === void 0 ? void 0 : token.bgColor) !== null && _b !== void 0 ? _b : defaultBgColor
27740
- : defaultBgColor;
27842
+ const chainBgColor = (_b = chain === null || chain === void 0 ? void 0 : chain.bgColor) !== null && _b !== void 0 ? _b : defaultBgColor;
27843
+ const tokenTextColor = tokenImageLoadingState === ImageLoadingState.ERROR
27844
+ ? "#fff"
27845
+ : token === null || token === void 0 ? void 0 : token.textColor;
27846
+ const tokenBgColor = React$1.useMemo(() => {
27847
+ if (state !== AssetsButtonState.FULL) {
27848
+ return defaultBgColor;
27849
+ }
27850
+ if (tokenImageLoadingState === ImageLoadingState.ERROR) {
27851
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
27852
+ return fallbackBgColor || defaultBgColor;
27853
+ }
27854
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
27855
+ return (token === null || token === void 0 ? void 0 : token.bgColor) || defaultBgColor;
27856
+ }, [
27857
+ state,
27858
+ token === null || token === void 0 ? void 0 : token.bgColor,
27859
+ defaultBgColor,
27860
+ tokenImageLoadingState,
27861
+ fallbackBgColor,
27862
+ ]);
27741
27863
  const bgGradient = React$1.useMemo(() => {
27742
27864
  switch (state) {
27743
27865
  case AssetsButtonState.EMPTY:
@@ -27755,12 +27877,22 @@ function AssetsButton({ chain, token, onClick, variant = "primary", isLoading =
27755
27877
  ? "tw-cursor-not-allowed"
27756
27878
  : "tw-group/assets-button"), children: [jsxRuntime.jsx("svg", { className: "tw-absolute tw-left-0 tw-z-10 tw-h-[40px] tw-w-[72px] tw-text-material-light-thin", viewBox: "0 0 72 40", xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", children: jsxRuntime.jsx("path", { d: "m57.86 5.86c-.53.53-1.05 1.06-1.56 1.59-3.29 3.38-6.37 6.55-10.3 6.55s-7.01-3.17-10.3-6.55c-.51-.53-1.03-1.06-1.56-1.59-3.9-3.91-9.02-5.86-14.14-5.86s-10.24 1.95-14.14 5.86c-3.91 3.9-5.86 9.02-5.86 14.14s1.95 10.24 5.86 14.14c3.91 3.91 9.02 5.86 14.14 5.86s10.24-1.95 14.14-5.86c.52-.53 1.04-1.06 1.55-1.58 3.29-3.39 6.37-6.56 10.31-6.56s7.02 3.17 10.31 6.56c.51.53 1.03 1.06 1.55 1.58 3.91 3.91 9.02 5.86 14.14 5.86v-40c-5.12 0-10.24 1.95-14.14 5.86zm14.14 33.14c-5.07 0-9.85-1.98-13.43-5.56-.52-.52-1.02-1.04-1.54-1.57-3.43-3.53-6.67-6.86-11.02-6.86s-7.6 3.33-11.04 6.88c-.5.52-1.01 1.04-1.53 1.56-3.59 3.59-8.36 5.57-13.44 5.57s-9.85-1.98-13.43-5.57c-3.59-3.59-5.56-8.36-5.56-13.43s1.98-9.85 5.56-13.44c3.58-3.6 8.35-5.58 13.43-5.58s9.85 1.98 13.44 5.57c.52.52 1.04 1.05 1.55 1.58 3.43 3.53 6.66 6.86 11.02 6.86s7.59-3.33 11.02-6.86c.51-.52 1.02-1.05 1.55-1.58 3.59-3.59 8.36-5.56 13.43-5.56v38z" }) }), jsxRuntime.jsxs("svg", { className: "tw-absolute -tw-left-[2px] -tw-top-[2px] tw-z-20 tw-hidden group-hover/assets-button:tw-block", xmlns: "http://www.w3.org/2000/svg", width: outlineWidth.inner, height: "44", viewBox: `0 0 ${outlineWidth.inner} 44`, fill: "none", children: [jsxRuntime.jsx("clipPath", { id: "halfClip1", children: jsxRuntime.jsx("rect", { x: "0", y: "0", width: outlineWidth.inner, height: "44" }) }), jsxRuntime.jsx("path", { d: "M59.1506 36.849L59.1508 36.8492C63.2511 40.9496 68.6272 43 74.0001 43H145C156.598 43 166 33.598 166 22C166 10.402 156.598 1 145 1H74.0001C68.6272 0.999977 63.2511 3.05042 59.1508 7.15076C58.6183 7.68325 58.0958 8.22097 57.5842 8.74755L57.5817 8.75009C55.9228 10.4574 54.3925 12.0283 52.8031 13.1834C51.2282 14.3279 49.6791 15 48 15C46.3209 15 44.7718 14.3279 43.1969 13.1834C41.6075 12.0283 40.0772 10.4574 38.4183 8.75009L38.4159 8.74759C37.9042 8.22101 37.3817 7.68327 36.8492 7.15076C32.7489 3.05042 27.3728 0.999977 21.9999 1C16.6271 1.00002 11.251 3.05047 7.15076 7.15076C3.05045 11.2511 1 16.6272 1 22C1 27.3728 3.05045 32.7489 7.15076 36.8492C11.251 40.9495 16.6271 43 21.9999 43C27.3728 43 32.7489 40.9496 36.8492 36.8492L36.8494 36.849C37.3794 36.3188 37.8994 35.7834 38.4088 35.2589L38.4108 35.2569C40.0704 33.5483 41.6019 31.9756 43.1928 30.8191C44.7691 29.6731 46.3197 29 48 29C49.6803 29 51.2309 29.6731 52.8072 30.8191C54.3981 31.9756 55.9296 33.5483 57.5892 35.2569L57.5912 35.2589C58.1006 35.7834 58.6206 36.3188 59.1506 36.849Z", stroke: "currentColor", className: "tw-text-grey-900", strokeWidth: "2", clipPath: "url(#halfClip1)" })] }), jsxRuntime.jsxs("svg", { className: "tw-absolute -tw-left-[4px] -tw-top-[4px] tw-z-10 tw-hidden group-hover/assets-button:tw-block", xmlns: "http://www.w3.org/2000/svg", width: outlineWidth.outer, height: "48", viewBox: `0 0 ${outlineWidth.outer} 48`, fill: "none", children: [jsxRuntime.jsx("clipPath", { id: "halfClip2", children: jsxRuntime.jsx("rect", { x: "0", y: "0", width: outlineWidth.outer, height: "48" }) }), jsxRuntime.jsx("path", { d: "M60.4432 39.5559L60.4437 39.5564C64.7391 43.8517 70.3729 46 76.0001 46H147C159.15 46 169 36.1503 169 24C169 11.8497 159.15 2 147 2H76.0001C70.3729 1.99998 64.7391 4.14825 60.4437 8.44365C59.9062 8.98109 59.3797 9.52298 58.8697 10.0479L58.8645 10.0532C57.1905 11.7761 55.7217 13.2796 54.2152 14.3745C52.7378 15.4481 51.3923 16 50 16C48.6077 16 47.2622 15.4481 45.7848 14.3745C44.2783 13.2796 42.8095 11.7761 41.1355 10.0532L41.1305 10.0481C40.6205 9.52314 40.0939 8.98117 39.5563 8.44365C35.2609 4.14825 29.6271 1.99998 23.9999 2C18.3727 2.00002 12.739 4.1483 8.44365 8.44365C4.14827 12.739 2 18.3728 2 24C2 29.6272 4.14827 35.261 8.44365 39.5564C12.739 43.8517 18.3727 46 23.9999 46C29.6271 46 35.2609 43.8517 39.5563 39.5564L39.5568 39.5559C40.0917 39.0207 40.6159 38.481 41.1237 37.9582L41.1281 37.9537C42.8028 36.2295 44.2728 34.7243 45.7808 33.6279C47.2597 32.5528 48.6066 32 50 32C51.3934 32 52.7403 32.5528 54.2192 33.6279C55.7272 34.7243 57.1972 36.2295 58.8719 37.9537L58.8763 37.9582C59.3841 38.481 59.9083 39.0207 60.4432 39.5559Z", stroke: "currentColor", className: "tw-text-material-light-average", strokeWidth: "4", clipPath: "url(#halfClip2)" })] }), jsxRuntime.jsx("div", { className: cn("tw-assets-button-mask tw-flex tw-h-squid-xl tw-w-[92px] tw-items-center tw-justify-between", state !== AssetsButtonState.FULL && "!tw-w-[72px]"), style: {
27757
27879
  backgroundImage: bgGradient,
27758
- }, children: jsxRuntime.jsx("div", { className: clsx(imageClass), children: state === AssetsButtonState.CHAIN_ONLY ||
27759
- state === AssetsButtonState.FULL ? (jsxRuntime.jsx("img", { src: chain === null || chain === void 0 ? void 0 : chain.iconUrl, alt: "", className: "tw-h-squid-xl tw-w-squid-xl tw-rounded-full tw-object-cover" })) : (state !== AssetsButtonState.LOADING && (jsxRuntime.jsx("span", { className: emptyChainIconTextClassNameMap[variant], children: jsxRuntime.jsx(PlusIcon, {}) }))) }) }), state === AssetsButtonState.FULL ? (jsxRuntime.jsxs("div", { className: clsx(imageClass, "tw-absolute tw-left-[54px] tw-z-[5] tw-h-squid-xl tw-overflow-hidden"), children: [jsxRuntime.jsx("div", { className: "tw-absolute tw-right-0 tw-h-full tw-w-[22px]", style: {
27880
+ }, children: jsxRuntime.jsx("div", { className: clsx(imageWrapperClassName), children: state === AssetsButtonState.CHAIN_ONLY ||
27881
+ state === AssetsButtonState.FULL ? (jsxRuntime.jsx("img", { src: chain === null || chain === void 0 ? void 0 : chain.iconUrl, alt: "", className: "tw-h-squid-xl tw-w-squid-xl tw-rounded-full tw-object-cover" })) : (state !== AssetsButtonState.LOADING && (jsxRuntime.jsx("span", { className: emptyChainIconTextClassNameMap[variant], children: jsxRuntime.jsx(PlusIcon, {}) }))) }) }), state === AssetsButtonState.FULL ? (jsxRuntime.jsxs("div", { className: clsx(imageWrapperClassName, "tw-absolute tw-left-[54px] tw-z-[5] tw-h-squid-xl tw-overflow-hidden"), children: [jsxRuntime.jsx("div", { className: "tw-absolute tw-right-0 tw-h-full tw-w-[22px]", style: {
27760
27882
  backgroundColor: tokenBgColor,
27761
- } }), jsxRuntime.jsx("img", { src: token === null || token === void 0 ? void 0 : token.iconUrl, alt: token === null || token === void 0 ? void 0 : token.symbol, className: "tw-absolute tw-h-squid-xl tw-w-squid-xl tw-rounded-full tw-object-cover" }), jsxRuntime.jsx("div", { className: "tw-absolute tw-right-0 tw-h-full tw-w-[22px] tw-border-b\n tw-border-t tw-border-material-light-thin" })] })) : null, jsxRuntime.jsxs("div", { className: cn("tw-relative tw-flex tw-h-squid-xl tw-w-fit tw-min-w-fit tw-items-center tw-gap-squid-xxs tw-rounded-br-full tw-rounded-tr-full tw-border tw-border-l-0 tw-border-material-light-thin tw-py-squid-xs tw-pr-squid-xs before:tw-absolute before:-tw-inset-[3px] before:tw-z-[1] before:tw-w-[calc(100%+3px)] before:tw-translate-x-[3px] before:tw-rounded-br-full before:tw-rounded-tr-full before:tw-border-2 before:tw-border-l-0 before:tw-border-transparent after:tw-absolute after:-tw-inset-[5px] after:tw-z-0 after:tw-w-[calc(100%+4px)] after:tw-translate-x-[6px] after:tw-rounded-br-full after:tw-rounded-tr-full after:tw-border-4 after:tw-border-l-0 after:tw-border-transparent group-hover/assets-button:before:tw-border-grey-900 group-hover/assets-button:after:tw-border-material-light-average", state === AssetsButtonState.FULL && "tw-pl-[7px]"), style: {
27883
+ } }), tokenImageLoadingState === ImageLoadingState.ERROR && (
27884
+ // show fallback
27885
+ jsxRuntime.jsx("div", { style: { color: tokenTextColor }, className: cn(tokenImageClassName, "tw-flex tw-items-center tw-justify-center tw-text-body-small"), children: (_d = (_c = token === null || token === void 0 ? void 0 : token.symbol) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.toUpperCase() })), jsxRuntime.jsx("img", { onLoad: () => {
27886
+ setTokenImageLoadingState(ImageLoadingState.LOADED);
27887
+ }, onError: () => {
27888
+ setTokenImageLoadingState(ImageLoadingState.ERROR);
27889
+ }, src: token === null || token === void 0 ? void 0 : token.iconUrl, alt: token === null || token === void 0 ? void 0 : token.symbol, className: cn(tokenImageClassName,
27890
+ // when image load failed, hide it with opacity: 0 instead of display: none
27891
+ // so new images can load and update the loading state
27892
+ tokenImageLoadingState === ImageLoadingState.ERROR &&
27893
+ "tw-opacity-0") }), jsxRuntime.jsx("div", { className: "tw-absolute tw-right-0 tw-h-full tw-w-[22px] tw-border-b\n tw-border-t tw-border-material-light-thin" })] })) : null, jsxRuntime.jsxs("div", { className: cn("tw-relative tw-flex tw-h-squid-xl tw-w-fit tw-min-w-fit tw-items-center tw-gap-squid-xxs tw-rounded-br-full tw-rounded-tr-full tw-border tw-border-l-0 tw-border-material-light-thin tw-py-squid-xs tw-pr-squid-xs before:tw-absolute before:-tw-inset-[3px] before:tw-z-[1] before:tw-w-[calc(100%+3px)] before:tw-translate-x-[3px] before:tw-rounded-br-full before:tw-rounded-tr-full before:tw-border-2 before:tw-border-l-0 before:tw-border-transparent after:tw-absolute after:-tw-inset-[5px] after:tw-z-0 after:tw-w-[calc(100%+4px)] after:tw-translate-x-[6px] after:tw-rounded-br-full after:tw-rounded-tr-full after:tw-border-4 after:tw-border-l-0 after:tw-border-transparent group-hover/assets-button:before:tw-border-grey-900 group-hover/assets-button:after:tw-border-material-light-average", state === AssetsButtonState.FULL && "tw-pl-[7px]"), style: {
27762
27894
  backgroundColor: tokenBgColor,
27763
- color: token === null || token === void 0 ? void 0 : token.textColor,
27895
+ color: tokenTextColor,
27764
27896
  }, children: [jsxRuntime.jsx(BodyText, { size: "small", className: cn("tw-leading-[13px]", state === AssetsButtonState.LOADING && "tw-min-w-[135px]"), children: state === AssetsButtonState.FULL
27765
27897
  ? token === null || token === void 0 ? void 0 : token.symbol
27766
27898
  : state !== AssetsButtonState.LOADING && emptyTokenLabel }), state !== AssetsButtonState.LOADING && (jsxRuntime.jsx(ChevronLargeRightIcon, { className: "tw-w-4 tw-min-w-4 tw-opacity-66" }))] })] }) })));
@@ -69845,6 +69977,7 @@ exports.ChevronRightSmallIcon = ChevronRightSmallIcon;
69845
69977
  exports.ChevronTopIcon = ChevronTopIcon;
69846
69978
  exports.ChevronTopSmallIcon = ChevronTopSmallIcon;
69847
69979
  exports.Chip = Chip;
69980
+ exports.CircleCheckIcon = CircleCheckIcon;
69848
69981
  exports.CircleMinusIcon = CircleMinusIcon;
69849
69982
  exports.CirclePlusIcon = CirclePlusIcon;
69850
69983
  exports.CircleX = CircleX;
@@ -69963,6 +70096,7 @@ exports.PercentIcon = PercentIcon;
69963
70096
  exports.PhoneIcon = PhoneIcon;
69964
70097
  exports.PieChartIcon = PieChartIcon;
69965
70098
  exports.PipeSeparator = PipeSeparator;
70099
+ exports.PluginIcon = PluginIcon;
69966
70100
  exports.PlusIcon = PlusIcon;
69967
70101
  exports.PoopIcon = PoopIcon;
69968
70102
  exports.PowerIcon = PowerIcon;
@@ -70070,6 +70204,7 @@ exports.XSocialIcon = XSocialIcon;
70070
70204
  exports.adjustColorForContrast = adjustColorForContrast;
70071
70205
  exports.baseTailwindConfig = baseTailwindConfig;
70072
70206
  exports.blendColors = blendColors;
70207
+ exports.buttonRoundedClassMap = buttonRoundedClassMap;
70073
70208
  exports.cn = cn;
70074
70209
  exports.darkTheme = darkTheme;
70075
70210
  exports.getColorBrightness = getColorBrightness;
@@ -10,10 +10,13 @@ interface ButtonProps extends React.HTMLAttributes<HTMLButtonElement> {
10
10
  link?: string;
11
11
  isLoading?: boolean;
12
12
  showLoader?: boolean;
13
+ loaderSize?: LoaderSize;
13
14
  chip?: ChipProps;
14
15
  containerClassName?: string;
15
16
  buttonRef?: React.Ref<HTMLButtonElement>;
16
17
  anchorRef?: React.Ref<HTMLAnchorElement>;
17
18
  }
18
- export declare function Button({ label, disabled, size, variant, icon, link, isLoading, showLoader, chip, containerClassName, anchorRef, buttonRef, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
19
+ type LoaderSize = "sm" | "md" | "lg";
20
+ export declare const buttonRoundedClassMap: Record<ButtonSize, Record<ButtonVariant, string>>;
21
+ export declare function Button({ label, disabled, size, variant, icon, link, isLoading, showLoader, loaderSize, chip, containerClassName, anchorRef, buttonRef, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
19
22
  export {};
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { SwitchSize } from "../../types/components";
2
+ import { type SwitchSize } from "../../types/components";
3
3
  export interface SwitchProps {
4
4
  checked?: boolean;
5
5
  onChange?: (checked: boolean) => void;
@@ -114,3 +114,11 @@ export declare function MoneyBagIcon({ className, size, }: {
114
114
  className?: string;
115
115
  size?: string;
116
116
  }): import("react/jsx-runtime").JSX.Element;
117
+ export declare function PluginIcon({ size, className, }: {
118
+ size?: string;
119
+ className?: string;
120
+ }): import("react/jsx-runtime").JSX.Element;
121
+ export declare function CircleCheckIcon({ className, size, }: {
122
+ className?: string;
123
+ size?: string;
124
+ }): import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { type ImageRoundedSize } from "../../types/components";
3
+ type HTMLInteractiveItem = HTMLButtonElement | HTMLDivElement | HTMLLabelElement;
3
4
  interface ListItemProps extends React.HTMLAttributes<HTMLButtonElement> {
4
5
  itemTitle: string | React.ReactNode;
5
6
  mainImageUrl?: string;
@@ -27,9 +28,11 @@ interface ListItemProps extends React.HTMLAttributes<HTMLButtonElement> {
27
28
  itemsContainerRef?: React.RefObject<HTMLElement>;
28
29
  imageGroup?: string[];
29
30
  multilineSubtitle?: boolean;
31
+ control?: React.ReactNode;
32
+ onClick?: (event: React.MouseEvent<HTMLInteractiveItem>) => void;
30
33
  }
31
34
  type ListItemSize = "small" | "large";
32
- export declare function ListItem({ itemTitle, mainImageUrl, subtitle, subtitleOnHover, detail, icon, secondaryImageUrl, placeholderImageUrl, size, mainIcon, className, isSelected, onDetailClick, showDetailOnHoverOnly, rounded, detailButtonClassName, loading, containerProps, compactOnMobile, extraPadding, itemsContainerRef, dropdownMenuContent, imageGroup, multilineSubtitle, ...props }: ListItemProps): import("react/jsx-runtime").JSX.Element;
35
+ export declare function ListItem({ itemTitle, mainImageUrl, subtitle, subtitleOnHover, detail, icon, secondaryImageUrl, placeholderImageUrl, size, mainIcon, className, isSelected, onDetailClick, showDetailOnHoverOnly, rounded, detailButtonClassName, loading, containerProps, compactOnMobile, extraPadding, itemsContainerRef, dropdownMenuContent, imageGroup, multilineSubtitle, control, ...props }: ListItemProps): import("react/jsx-runtime").JSX.Element;
33
36
  export declare const ListItemActionsButton: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement> & {
34
37
  isActive?: boolean | undefined;
35
38
  }, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
@@ -65,4 +65,11 @@ export declare function replaceKeys(obj: Record<string, any>, options: ReplaceKe
65
65
  * mapToCssVariables({ "accent-gold": { cssVariable: "--accent-gold" } }) -> { "accent-gold": "var(--accent-gold)" }
66
66
  */
67
67
  export declare function mapToCssVariables<T extends Record<string, any>>(obj: T): Record<keyof T & string, string>;
68
+ /**
69
+ * Simple hash function to create a deterministic index from a given string.
70
+ * @param {string} str - The input string to hash.
71
+ * @param {number} max - The maximum value for the hash.
72
+ * @returns {number} - The index within the array.
73
+ */
74
+ export declare function hashStringToIndex(str: string, max: number): number;
68
75
  export {};
@@ -0,0 +1 @@
1
+ export declare function useColorFromSeed(seed: string): string | undefined;
@@ -13,3 +13,4 @@ export declare const ChainAndTokenLightText: Story;
13
13
  export declare const ChainAndTokenDarkText: Story;
14
14
  export declare const LongTokenSymbol: Story;
15
15
  export declare const Tooltip: Story;
16
+ export declare const BrokenTokenImage: Story;
@@ -3,32 +3,47 @@ import { Button } from "../../components/buttons/Button";
3
3
  declare const meta: Meta<typeof Button>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof meta>;
6
+ export declare const SmallPrimary: Story;
6
7
  export declare const MediumPrimary: Story;
8
+ export declare const LargePrimary: Story;
9
+ export declare const SmallSecondary: Story;
7
10
  export declare const MediumSecondary: Story;
11
+ export declare const LargeSecondary: Story;
12
+ export declare const SmallTertiary: Story;
8
13
  export declare const MediumTertiary: Story;
14
+ export declare const LargeTertiary: Story;
15
+ export declare const SmallDisabled: Story;
9
16
  export declare const MediumDisabled: Story;
10
- export declare const MediumAndLink: Story;
11
- export declare const MediumAndLinkDisabled: Story;
12
- export declare const MediumPrimaryIconOnly: Story;
13
- export declare const MediumSecondaryIconOnly: Story;
14
- export declare const MediumTertiaryIconOnly: Story;
17
+ export declare const LargeDisabled: Story;
18
+ export declare const SmallWithLink: Story;
19
+ export declare const MediumWithLink: Story;
20
+ export declare const LargeWithLink: Story;
21
+ export declare const SmallDisabledWithLink: Story;
22
+ export declare const MediumDisabledWithLink: Story;
23
+ export declare const LargeDisabledWithLink: Story;
24
+ export declare const SmallIconOnly: Story;
25
+ export declare const MediumIconOnly: Story;
26
+ export declare const LargeIconOnly: Story;
27
+ export declare const SmallDisabledIconOnly: Story;
15
28
  export declare const MediumDisabledIconOnly: Story;
16
- export declare const MediumPrimaryIconAndLabel: Story;
17
- export declare const MediumSecondaryIconAndLabel: Story;
18
- export declare const MediumTertiaryIconAndLabel: Story;
29
+ export declare const LargeDisabledIconOnly: Story;
30
+ export declare const SmallIconAndLabel: Story;
31
+ export declare const MediumIconAndLabel: Story;
32
+ export declare const LargeIconAndLabel: Story;
19
33
  export declare const MediumDisabledIconAndLabel: Story;
20
- export declare const LargePrimary: Story;
21
- export declare const LargeSecondary: Story;
22
- export declare const LargeTertiary: Story;
23
- export declare const LargeDisabled: Story;
24
- export declare const LargeAndLink: Story;
25
- export declare const LargeAndLinkDisabled: Story;
34
+ export declare const SmallWithLoader: Story;
35
+ export declare const MediumWithLoader: Story;
26
36
  export declare const LargeWithLoader: Story;
27
37
  export declare const LargeDisabledWithLoader: Story;
38
+ export declare const SmallWithIconLoading: Story;
28
39
  export declare const MediumWithIconLoading: Story;
40
+ export declare const LargeWithIconLoading: Story;
41
+ export declare const SmallWithLabelLoading: Story;
29
42
  export declare const MediumWithLabelLoading: Story;
30
- export declare const MediumWithLongLabelLoading: Story;
31
43
  export declare const LargeWithLabelLoading: Story;
44
+ export declare const SmallWithLongLabelLoading: Story;
45
+ export declare const MediumWithLongLabelLoading: Story;
32
46
  export declare const LargeWithLongLabelLoading: Story;
47
+ export declare const SmallWithChip: Story;
33
48
  export declare const MediumWithChip: Story;
34
49
  export declare const LargeWithChip: Story;