@raystack/apsara 0.48.5 → 0.49.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 (115) hide show
  1. package/dist/components/amount/amount.cjs +39 -17
  2. package/dist/components/amount/amount.cjs.map +1 -1
  3. package/dist/components/amount/amount.d.ts +2 -1
  4. package/dist/components/amount/amount.d.ts.map +1 -1
  5. package/dist/components/amount/amount.js +39 -17
  6. package/dist/components/amount/amount.js.map +1 -1
  7. package/dist/components/calendar/range-picker.cjs +19 -18
  8. package/dist/components/calendar/range-picker.cjs.map +1 -1
  9. package/dist/components/calendar/range-picker.d.ts +5 -4
  10. package/dist/components/calendar/range-picker.d.ts.map +1 -1
  11. package/dist/components/calendar/range-picker.js +19 -18
  12. package/dist/components/calendar/range-picker.js.map +1 -1
  13. package/dist/components/color-picker/color-picker-alpha.cjs +15 -0
  14. package/dist/components/color-picker/color-picker-alpha.cjs.map +1 -0
  15. package/dist/components/color-picker/color-picker-alpha.d.ts +5 -0
  16. package/dist/components/color-picker/color-picker-alpha.d.ts.map +1 -0
  17. package/dist/components/color-picker/color-picker-alpha.js +13 -0
  18. package/dist/components/color-picker/color-picker-alpha.js.map +1 -0
  19. package/dist/components/color-picker/color-picker-area.cjs +73 -0
  20. package/dist/components/color-picker/color-picker-area.cjs.map +1 -0
  21. package/dist/components/color-picker/color-picker-area.d.ts +4 -0
  22. package/dist/components/color-picker/color-picker-area.d.ts.map +1 -0
  23. package/dist/components/color-picker/color-picker-area.js +71 -0
  24. package/dist/components/color-picker/color-picker-area.js.map +1 -0
  25. package/dist/components/color-picker/color-picker-hue.cjs +15 -0
  26. package/dist/components/color-picker/color-picker-hue.cjs.map +1 -0
  27. package/dist/components/color-picker/color-picker-hue.d.ts +5 -0
  28. package/dist/components/color-picker/color-picker-hue.d.ts.map +1 -0
  29. package/dist/components/color-picker/color-picker-hue.js +13 -0
  30. package/dist/components/color-picker/color-picker-hue.js.map +1 -0
  31. package/dist/components/color-picker/color-picker-input.cjs +16 -0
  32. package/dist/components/color-picker/color-picker-input.cjs.map +1 -0
  33. package/dist/components/color-picker/color-picker-input.d.ts +4 -0
  34. package/dist/components/color-picker/color-picker-input.d.ts.map +1 -0
  35. package/dist/components/color-picker/color-picker-input.js +14 -0
  36. package/dist/components/color-picker/color-picker-input.js.map +1 -0
  37. package/dist/components/color-picker/color-picker-mode.cjs +16 -0
  38. package/dist/components/color-picker/color-picker-mode.cjs.map +1 -0
  39. package/dist/components/color-picker/color-picker-mode.d.ts +8 -0
  40. package/dist/components/color-picker/color-picker-mode.d.ts.map +1 -0
  41. package/dist/components/color-picker/color-picker-mode.js +14 -0
  42. package/dist/components/color-picker/color-picker-mode.js.map +1 -0
  43. package/dist/components/color-picker/color-picker-root.cjs +53 -0
  44. package/dist/components/color-picker/color-picker-root.cjs.map +1 -0
  45. package/dist/components/color-picker/color-picker-root.d.ts +25 -0
  46. package/dist/components/color-picker/color-picker-root.d.ts.map +1 -0
  47. package/dist/components/color-picker/color-picker-root.js +50 -0
  48. package/dist/components/color-picker/color-picker-root.js.map +1 -0
  49. package/dist/components/color-picker/color-picker.cjs +19 -0
  50. package/dist/components/color-picker/color-picker.cjs.map +1 -0
  51. package/dist/components/color-picker/color-picker.js +17 -0
  52. package/dist/components/color-picker/color-picker.js.map +1 -0
  53. package/dist/components/color-picker/color-picker.module.css.cjs +8 -0
  54. package/dist/components/color-picker/color-picker.module.css.cjs.map +1 -0
  55. package/dist/components/color-picker/color-picker.module.css.js +4 -0
  56. package/dist/components/color-picker/color-picker.module.css.js.map +1 -0
  57. package/dist/components/color-picker/index.d.ts +2 -0
  58. package/dist/components/color-picker/index.d.ts.map +1 -0
  59. package/dist/components/color-picker/utils.cjs +18 -0
  60. package/dist/components/color-picker/utils.cjs.map +1 -0
  61. package/dist/components/color-picker/utils.d.ts +11 -0
  62. package/dist/components/color-picker/utils.d.ts.map +1 -0
  63. package/dist/components/color-picker/utils.js +15 -0
  64. package/dist/components/color-picker/utils.js.map +1 -0
  65. package/dist/components/filter-chip/filter-chip.cjs +4 -5
  66. package/dist/components/filter-chip/filter-chip.cjs.map +1 -1
  67. package/dist/components/filter-chip/filter-chip.d.ts.map +1 -1
  68. package/dist/components/filter-chip/filter-chip.js +4 -5
  69. package/dist/components/filter-chip/filter-chip.js.map +1 -1
  70. package/dist/components/filter-chip/filter-chip.module.css.cjs +1 -1
  71. package/dist/components/filter-chip/filter-chip.module.css.js +1 -1
  72. package/dist/index.cjs +2 -0
  73. package/dist/index.cjs.map +1 -1
  74. package/dist/index.d.ts +1 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +1 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/conversions.cjs +986 -0
  79. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/conversions.cjs.map +1 -0
  80. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/conversions.js +982 -0
  81. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/conversions.js.map +1 -0
  82. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/index.cjs +86 -0
  83. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/index.cjs.map +1 -0
  84. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/index.js +82 -0
  85. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/index.js.map +1 -0
  86. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/route.cjs +103 -0
  87. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/route.cjs.map +1 -0
  88. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/route.js +99 -0
  89. package/dist/node_modules/.pnpm/color-convert@3.1.0/node_modules/color-convert/route.js.map +1 -0
  90. package/dist/node_modules/.pnpm/color-name@2.0.0/node_modules/color-name/index.cjs +157 -0
  91. package/dist/node_modules/.pnpm/color-name@2.0.0/node_modules/color-name/index.cjs.map +1 -0
  92. package/dist/node_modules/.pnpm/color-name@2.0.0/node_modules/color-name/index.js +153 -0
  93. package/dist/node_modules/.pnpm/color-name@2.0.0/node_modules/color-name/index.js.map +1 -0
  94. package/dist/node_modules/.pnpm/color-string@2.0.1/node_modules/color-string/index.cjs +235 -0
  95. package/dist/node_modules/.pnpm/color-string@2.0.1/node_modules/color-string/index.cjs.map +1 -0
  96. package/dist/node_modules/.pnpm/color-string@2.0.1/node_modules/color-string/index.js +231 -0
  97. package/dist/node_modules/.pnpm/color-string@2.0.1/node_modules/color-string/index.js.map +1 -0
  98. package/dist/node_modules/.pnpm/color@5.0.0/node_modules/color/index.cjs +501 -0
  99. package/dist/node_modules/.pnpm/color@5.0.0/node_modules/color/index.cjs.map +1 -0
  100. package/dist/node_modules/.pnpm/color@5.0.0/node_modules/color/index.js +497 -0
  101. package/dist/node_modules/.pnpm/color@5.0.0/node_modules/color/index.js.map +1 -0
  102. package/dist/style.css +1 -1
  103. package/package.json +2 -1
  104. package/dist/components/textfield/index.d.ts +0 -2
  105. package/dist/components/textfield/index.d.ts.map +0 -1
  106. package/dist/components/textfield/textfield.cjs +0 -44
  107. package/dist/components/textfield/textfield.cjs.map +0 -1
  108. package/dist/components/textfield/textfield.d.ts +0 -33
  109. package/dist/components/textfield/textfield.d.ts.map +0 -1
  110. package/dist/components/textfield/textfield.js +0 -42
  111. package/dist/components/textfield/textfield.js.map +0 -1
  112. package/dist/components/textfield/textfield.module.css.cjs +0 -8
  113. package/dist/components/textfield/textfield.module.css.cjs.map +0 -1
  114. package/dist/components/textfield/textfield.module.css.js +0 -4
  115. package/dist/components/textfield/textfield.module.css.js.map +0 -1
@@ -76,24 +76,46 @@ function isValidCurrency(currency) {
76
76
  * ```
77
77
  */
78
78
  const Amount = React.forwardRef(({ value = 0, currency = 'USD', locale = 'en-US', hideDecimals = false, currencyDisplay = 'symbol', minimumFractionDigits, maximumFractionDigits, groupDigits = true, valueInMinorUnits = true }, ref) => {
79
- const validCurrency = isValidCurrency(currency) ? currency : 'USD';
80
- if (validCurrency !== currency) {
81
- console.warn(`Invalid currency code: ${currency}. Falling back to USD.`);
79
+ try {
80
+ if (typeof value === 'number' &&
81
+ Math.abs(value) > Number.MAX_SAFE_INTEGER) {
82
+ console.warn(`Warning: The number ${value} exceeds JavaScript's safe integer limit (${Number.MAX_SAFE_INTEGER}). ` +
83
+ 'For large numbers, pass the value as a string to maintain precision.');
84
+ }
85
+ const validCurrency = isValidCurrency(currency) ? currency : 'USD';
86
+ if (validCurrency !== currency) {
87
+ console.warn(`Invalid currency code: ${currency}. Falling back to USD.`);
88
+ }
89
+ const decimals = getCurrencyDecimals(validCurrency);
90
+ // Handle minor units - use string manipulation for strings and Math.pow for numbers
91
+ const baseValue = valueInMinorUnits && decimals > 0
92
+ ? typeof value === 'string'
93
+ ? value.slice(0, -decimals) + '.' + value.slice(-decimals)
94
+ : value / Math.pow(10, decimals)
95
+ : value;
96
+ // Remove decimals if hideDecimals is true - handle string and number separately
97
+ // Note: Not all numbers passed is converted to string as methods like Math.trunc
98
+ // or toString cannot handle large numbers thus, we need to handle it separately (large numbers passed in value throws console warning).
99
+ const finalBaseValue = hideDecimals
100
+ ? typeof baseValue === 'string'
101
+ ? baseValue.split('.')[0]
102
+ : Math.trunc(baseValue)
103
+ : baseValue;
104
+ const formattedValue = new Intl.NumberFormat(locale, {
105
+ style: 'currency',
106
+ currency: validCurrency.toUpperCase(),
107
+ currencyDisplay,
108
+ minimumFractionDigits: hideDecimals ? 0 : minimumFractionDigits,
109
+ maximumFractionDigits: hideDecimals ? 0 : maximumFractionDigits,
110
+ useGrouping: groupDigits
111
+ // @ts-ignore - Handling large numbers as string or number, so we need to pass the value as string or number.
112
+ }).format(finalBaseValue);
113
+ return jsxRuntime.jsxRuntimeExports.jsx("span", { ref: ref, children: formattedValue });
114
+ }
115
+ catch (error) {
116
+ console.error('Error formatting amount:', error);
117
+ return jsxRuntime.jsxRuntimeExports.jsx("span", { ref: ref, children: value });
82
118
  }
83
- const decimals = getCurrencyDecimals(validCurrency);
84
- const baseValue = valueInMinorUnits
85
- ? value / Math.pow(10, decimals)
86
- : value;
87
- const finalBaseValue = hideDecimals ? Math.trunc(baseValue) : baseValue;
88
- const formattedValue = new Intl.NumberFormat(locale, {
89
- style: 'currency',
90
- currency: validCurrency.toUpperCase(),
91
- currencyDisplay,
92
- minimumFractionDigits: hideDecimals ? 0 : minimumFractionDigits,
93
- maximumFractionDigits: hideDecimals ? 0 : maximumFractionDigits,
94
- useGrouping: groupDigits
95
- }).format(finalBaseValue);
96
- return jsxRuntime.jsxRuntimeExports.jsx("span", { ref: ref, children: formattedValue });
97
119
  });
98
120
  Amount.displayName = 'Amount';
99
121
 
@@ -1 +1 @@
1
- {"version":3,"file":"amount.cjs","sources":["../../../components/amount/amount.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nexport interface AmountProps {\n /**\n * The monetary value to display\n * @default 0\n * @example\n * valueInMinorUnits=true: 1299 => \"$12.99\"\n * valueInMinorUnits=false: 12.99 => \"$12.99\"\n */\n value: number;\n\n /**\n * ISO 4217 currency code\n * @default 'USD'\n */\n currency?: string;\n\n /**\n * Whether the value is in minor units (cents, paise, etc.)\n * If true, the value will be converted based on the currency's decimal places\n * If false, the value will be used as is\n * @default true\n * @example\n * USD: 1299 => $12.99 (2 decimals)\n * JPY: 1299 => ¥1,299 (0 decimals)\n * BHD: 1299 => BHD 1.299 (3 decimals)\n */\n valueInMinorUnits?: boolean;\n\n /**\n * BCP 47 language tag\n * @default 'en-US'\n * @example 'en-US', 'de-DE', 'ja-JP'\n */\n locale?: string;\n\n /**\n * Truncates decimal places\n * @default false\n */\n hideDecimals?: boolean;\n\n /**\n * Currency display format\n * @default 'symbol'\n * @example 'symbol' - $12.99, 'code' - USD 12.99, 'name' - 12.99 US Dollars\n */\n currencyDisplay?: 'symbol' | 'code' | 'name';\n\n /**\n * Number of minimum fraction digits\n * @default undefined (uses currency's default)\n */\n minimumFractionDigits?: number;\n\n /**\n * Number of maximum fraction digits\n * @default undefined (uses currency's default)\n */\n maximumFractionDigits?: number;\n\n /**\n * Group digits (e.g., thousand separators)\n * @default true\n */\n groupDigits?: boolean;\n}\n\n/**\n * Get the number of decimal places for a currency\n */\nfunction getCurrencyDecimals(currency: string): number {\n try {\n const formatter = new Intl.NumberFormat('en', {\n style: 'currency',\n currency: currency.toUpperCase()\n });\n\n // Format a number and count the decimal places\n const formatted = formatter.format(1); // Get string representation of 1 unit with currency symbol\n const match = formatted.match(/\\.([\\d]+)/); // Extract the decimal part\n return match ? match[1].length : 0;\n } catch {\n // Default to 2 decimal places\n return 2;\n }\n}\n\n/**\n * Check if a currency is valid\n */\nfunction isValidCurrency(currency: string): boolean {\n try {\n new Intl.NumberFormat('en', {\n style: 'currency',\n currency: currency.toUpperCase()\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Amount component for displaying monetary values.\n * Automatically formats currencies using Intl.NumberFormat.\n * Inherits styling from parent Text component.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Text>\n * Total: <Amount value={1299} /> // Shows as \"$12.99\"\n * </Text>\n *\n * // With different currency and locale\n * <Text>\n * Prix: <Amount value={1299} currency=\"EUR\" locale=\"fr-FR\" /> // Shows as \"12,99 €\"\n * </Text>\n *\n * // Without decimals\n * <Text>\n * Price: <Amount value={1299} hideDecimals /> // Shows as \"$12\"\n * </Text>\n *\n * // With currency code\n * <Text>\n * Amount: <Amount value={1299} currencyDisplay=\"code\" /> // Shows as \"USD 12.99\"\n * </Text>\n *\n * // With value in major units\n * <Text>\n * Amount: <Amount value={12.99} valueInMinorUnits={false} /> // Shows as \"$12.99\"\n * </Text>\n *\n * // With groupDigits (default is true)\n * <Text>\n * Amount: <Amount value={129999999} groupDigits /> // Shows as \"$129,999,999.99\"\n * </Text>\n * ```\n */\nexport const Amount = forwardRef<HTMLSpanElement, AmountProps>(\n (\n {\n value = 0,\n currency = 'USD',\n locale = 'en-US',\n hideDecimals = false,\n currencyDisplay = 'symbol',\n minimumFractionDigits,\n maximumFractionDigits,\n groupDigits = true,\n valueInMinorUnits = true\n },\n ref\n ) => {\n const validCurrency = isValidCurrency(currency) ? currency : 'USD';\n if (validCurrency !== currency) {\n console.warn(`Invalid currency code: ${currency}. Falling back to USD.`);\n }\n\n const decimals = getCurrencyDecimals(validCurrency);\n const baseValue = valueInMinorUnits\n ? value / Math.pow(10, decimals)\n : value;\n const finalBaseValue = hideDecimals ? Math.trunc(baseValue) : baseValue;\n\n const formattedValue = new Intl.NumberFormat(locale, {\n style: 'currency' as const,\n currency: validCurrency.toUpperCase(),\n currencyDisplay,\n minimumFractionDigits: hideDecimals ? 0 : minimumFractionDigits,\n maximumFractionDigits: hideDecimals ? 0 : maximumFractionDigits,\n useGrouping: groupDigits\n }).format(finalBaseValue);\n\n return <span ref={ref}>{formattedValue}</span>;\n }\n);\n\nAmount.displayName = 'Amount';\n"],"names":["forwardRef","_jsx"],"mappings":";;;;;AAqEA;;AAEG;AACH,SAAS,mBAAmB,CAAC,QAAgB,EAAA;AAC3C,IAAA,IAAI;QACF,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AAC5C,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;AACjC,SAAA,CAAC,CAAC;;QAGH,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC3C,QAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;KACpC;AAAC,IAAA,MAAM;;AAEN,QAAA,OAAO,CAAC,CAAC;KACV;AACH,CAAC;AAED;;AAEG;AACH,SAAS,eAAe,CAAC,QAAgB,EAAA;AACvC,IAAA,IAAI;AACF,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AAC1B,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;AACjC,SAAA,CAAC,CAAC;AACH,QAAA,OAAO,IAAI,CAAC;KACb;AAAC,IAAA,MAAM;AACN,QAAA,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCG;AACU,MAAA,MAAM,GAAGA,gBAAU,CAC9B,CACE,EACE,KAAK,GAAG,CAAC,EACT,QAAQ,GAAG,KAAK,EAChB,MAAM,GAAG,OAAO,EAChB,YAAY,GAAG,KAAK,EACpB,eAAe,GAAG,QAAQ,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,GAAG,IAAI,EAClB,iBAAiB,GAAG,IAAI,EACzB,EACD,GAAG,KACD;AACF,IAAA,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAC;AACnE,IAAA,IAAI,aAAa,KAAK,QAAQ,EAAE;AAC9B,QAAA,OAAO,CAAC,IAAI,CAAC,0BAA0B,QAAQ,CAAA,sBAAA,CAAwB,CAAC,CAAC;KAC1E;AAED,IAAA,MAAM,QAAQ,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,iBAAiB;UAC/B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC;UAC9B,KAAK,CAAC;AACV,IAAA,MAAM,cAAc,GAAG,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IAExE,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACnD,QAAA,KAAK,EAAE,UAAmB;AAC1B,QAAA,QAAQ,EAAE,aAAa,CAAC,WAAW,EAAE;QACrC,eAAe;QACf,qBAAqB,EAAE,YAAY,GAAG,CAAC,GAAG,qBAAqB;QAC/D,qBAAqB,EAAE,YAAY,GAAG,CAAC,GAAG,qBAAqB;AAC/D,QAAA,WAAW,EAAE,WAAW;AACzB,KAAA,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,IAAA,OAAOC,2CAAM,GAAG,EAAE,GAAG,EAAG,QAAA,EAAA,cAAc,GAAQ,CAAC;AACjD,CAAC,EACD;AAEF,MAAM,CAAC,WAAW,GAAG,QAAQ;;;;"}
1
+ {"version":3,"file":"amount.cjs","sources":["../../../components/amount/amount.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nexport interface AmountProps {\n /**\n * The monetary value to display\n * For large numbers (> 2^53), pass the value as string to maintain precision\n * @default 0\n * @example\n * valueInMinorUnits=true: 1299 => \"$12.99\"\n * valueInMinorUnits=false: 12.99 => \"$12.99\"\n */\n value: number | string;\n\n /**\n * ISO 4217 currency code\n * @default 'USD'\n */\n currency?: string;\n\n /**\n * Whether the value is in minor units (cents, paise, etc.)\n * If true, the value will be converted based on the currency's decimal places\n * If false, the value will be used as is\n * @default true\n * @example\n * USD: 1299 => $12.99 (2 decimals)\n * JPY: 1299 => ¥1,299 (0 decimals)\n * BHD: 1299 => BHD 1.299 (3 decimals)\n */\n valueInMinorUnits?: boolean;\n\n /**\n * BCP 47 language tag\n * @default 'en-US'\n * @example 'en-US', 'de-DE', 'ja-JP'\n */\n locale?: string;\n\n /**\n * Truncates decimal places\n * @default false\n */\n hideDecimals?: boolean;\n\n /**\n * Currency display format\n * @default 'symbol'\n * @example 'symbol' - $12.99, 'code' - USD 12.99, 'name' - 12.99 US Dollars\n */\n currencyDisplay?: 'symbol' | 'code' | 'name';\n\n /**\n * Number of minimum fraction digits\n * @default undefined (uses currency's default)\n */\n minimumFractionDigits?: number;\n\n /**\n * Number of maximum fraction digits\n * @default undefined (uses currency's default)\n */\n maximumFractionDigits?: number;\n\n /**\n * Group digits (e.g., thousand separators)\n * @default true\n */\n groupDigits?: boolean;\n}\n\n/**\n * Get the number of decimal places for a currency\n */\nfunction getCurrencyDecimals(currency: string): number {\n try {\n const formatter = new Intl.NumberFormat('en', {\n style: 'currency',\n currency: currency.toUpperCase()\n });\n\n // Format a number and count the decimal places\n const formatted = formatter.format(1); // Get string representation of 1 unit with currency symbol\n const match = formatted.match(/\\.([\\d]+)/); // Extract the decimal part\n return match ? match[1].length : 0;\n } catch {\n // Default to 2 decimal places\n return 2;\n }\n}\n\n/**\n * Check if a currency is valid\n */\nfunction isValidCurrency(currency: string): boolean {\n try {\n new Intl.NumberFormat('en', {\n style: 'currency',\n currency: currency.toUpperCase()\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Amount component for displaying monetary values.\n * Automatically formats currencies using Intl.NumberFormat.\n * Inherits styling from parent Text component.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Text>\n * Total: <Amount value={1299} /> // Shows as \"$12.99\"\n * </Text>\n *\n * // With different currency and locale\n * <Text>\n * Prix: <Amount value={1299} currency=\"EUR\" locale=\"fr-FR\" /> // Shows as \"12,99 €\"\n * </Text>\n *\n * // Without decimals\n * <Text>\n * Price: <Amount value={1299} hideDecimals /> // Shows as \"$12\"\n * </Text>\n *\n * // With currency code\n * <Text>\n * Amount: <Amount value={1299} currencyDisplay=\"code\" /> // Shows as \"USD 12.99\"\n * </Text>\n *\n * // With value in major units\n * <Text>\n * Amount: <Amount value={12.99} valueInMinorUnits={false} /> // Shows as \"$12.99\"\n * </Text>\n *\n * // With groupDigits (default is true)\n * <Text>\n * Amount: <Amount value={129999999} groupDigits /> // Shows as \"$129,999,999.99\"\n * </Text>\n * ```\n */\nexport const Amount = forwardRef<HTMLSpanElement, AmountProps>(\n (\n {\n value = 0,\n currency = 'USD',\n locale = 'en-US',\n hideDecimals = false,\n currencyDisplay = 'symbol',\n minimumFractionDigits,\n maximumFractionDigits,\n groupDigits = true,\n valueInMinorUnits = true\n },\n ref\n ) => {\n try {\n if (\n typeof value === 'number' &&\n Math.abs(value) > Number.MAX_SAFE_INTEGER\n ) {\n console.warn(\n `Warning: The number ${value} exceeds JavaScript's safe integer limit (${Number.MAX_SAFE_INTEGER}). ` +\n 'For large numbers, pass the value as a string to maintain precision.'\n );\n }\n\n const validCurrency = isValidCurrency(currency) ? currency : 'USD';\n if (validCurrency !== currency) {\n console.warn(\n `Invalid currency code: ${currency}. Falling back to USD.`\n );\n }\n\n const decimals = getCurrencyDecimals(validCurrency);\n\n // Handle minor units - use string manipulation for strings and Math.pow for numbers\n const baseValue =\n valueInMinorUnits && decimals > 0\n ? typeof value === 'string'\n ? value.slice(0, -decimals) + '.' + value.slice(-decimals)\n : value / Math.pow(10, decimals)\n : value;\n\n // Remove decimals if hideDecimals is true - handle string and number separately\n // Note: Not all numbers passed is converted to string as methods like Math.trunc\n // or toString cannot handle large numbers thus, we need to handle it separately (large numbers passed in value throws console warning).\n const finalBaseValue = hideDecimals\n ? typeof baseValue === 'string'\n ? baseValue.split('.')[0]\n : Math.trunc(baseValue)\n : baseValue;\n\n const formattedValue = new Intl.NumberFormat(locale, {\n style: 'currency' as const,\n currency: validCurrency.toUpperCase(),\n currencyDisplay,\n minimumFractionDigits: hideDecimals ? 0 : minimumFractionDigits,\n maximumFractionDigits: hideDecimals ? 0 : maximumFractionDigits,\n useGrouping: groupDigits\n // @ts-ignore - Handling large numbers as string or number, so we need to pass the value as string or number.\n }).format(finalBaseValue);\n\n return <span ref={ref}>{formattedValue}</span>;\n } catch (error) {\n console.error('Error formatting amount:', error);\n return <span ref={ref}>{value}</span>;\n }\n }\n);\n\nAmount.displayName = 'Amount';\n"],"names":["forwardRef","_jsx"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  export interface AmountProps {
2
2
  /**
3
3
  * The monetary value to display
4
+ * For large numbers (> 2^53), pass the value as string to maintain precision
4
5
  * @default 0
5
6
  * @example
6
7
  * valueInMinorUnits=true: 1299 => "$12.99"
7
8
  * valueInMinorUnits=false: 12.99 => "$12.99"
8
9
  */
9
- value: number;
10
+ value: number | string;
10
11
  /**
11
12
  * ISO 4217 currency code
12
13
  * @default 'USD'
@@ -1 +1 @@
1
- {"version":3,"file":"amount.d.ts","sourceRoot":"","sources":["../../../components/amount/amount.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,eAAe,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAE7C;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAqCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,MAAM,yGAqClB,CAAC"}
1
+ {"version":3,"file":"amount.d.ts","sourceRoot":"","sources":["../../../components/amount/amount.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B;;;;;;;OAOG;IACH,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAEvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,eAAe,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAE7C;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAqCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,MAAM,yGAoElB,CAAC"}
@@ -74,24 +74,46 @@ function isValidCurrency(currency) {
74
74
  * ```
75
75
  */
76
76
  const Amount = forwardRef(({ value = 0, currency = 'USD', locale = 'en-US', hideDecimals = false, currencyDisplay = 'symbol', minimumFractionDigits, maximumFractionDigits, groupDigits = true, valueInMinorUnits = true }, ref) => {
77
- const validCurrency = isValidCurrency(currency) ? currency : 'USD';
78
- if (validCurrency !== currency) {
79
- console.warn(`Invalid currency code: ${currency}. Falling back to USD.`);
77
+ try {
78
+ if (typeof value === 'number' &&
79
+ Math.abs(value) > Number.MAX_SAFE_INTEGER) {
80
+ console.warn(`Warning: The number ${value} exceeds JavaScript's safe integer limit (${Number.MAX_SAFE_INTEGER}). ` +
81
+ 'For large numbers, pass the value as a string to maintain precision.');
82
+ }
83
+ const validCurrency = isValidCurrency(currency) ? currency : 'USD';
84
+ if (validCurrency !== currency) {
85
+ console.warn(`Invalid currency code: ${currency}. Falling back to USD.`);
86
+ }
87
+ const decimals = getCurrencyDecimals(validCurrency);
88
+ // Handle minor units - use string manipulation for strings and Math.pow for numbers
89
+ const baseValue = valueInMinorUnits && decimals > 0
90
+ ? typeof value === 'string'
91
+ ? value.slice(0, -decimals) + '.' + value.slice(-decimals)
92
+ : value / Math.pow(10, decimals)
93
+ : value;
94
+ // Remove decimals if hideDecimals is true - handle string and number separately
95
+ // Note: Not all numbers passed is converted to string as methods like Math.trunc
96
+ // or toString cannot handle large numbers thus, we need to handle it separately (large numbers passed in value throws console warning).
97
+ const finalBaseValue = hideDecimals
98
+ ? typeof baseValue === 'string'
99
+ ? baseValue.split('.')[0]
100
+ : Math.trunc(baseValue)
101
+ : baseValue;
102
+ const formattedValue = new Intl.NumberFormat(locale, {
103
+ style: 'currency',
104
+ currency: validCurrency.toUpperCase(),
105
+ currencyDisplay,
106
+ minimumFractionDigits: hideDecimals ? 0 : minimumFractionDigits,
107
+ maximumFractionDigits: hideDecimals ? 0 : maximumFractionDigits,
108
+ useGrouping: groupDigits
109
+ // @ts-ignore - Handling large numbers as string or number, so we need to pass the value as string or number.
110
+ }).format(finalBaseValue);
111
+ return jsxRuntimeExports.jsx("span", { ref: ref, children: formattedValue });
112
+ }
113
+ catch (error) {
114
+ console.error('Error formatting amount:', error);
115
+ return jsxRuntimeExports.jsx("span", { ref: ref, children: value });
80
116
  }
81
- const decimals = getCurrencyDecimals(validCurrency);
82
- const baseValue = valueInMinorUnits
83
- ? value / Math.pow(10, decimals)
84
- : value;
85
- const finalBaseValue = hideDecimals ? Math.trunc(baseValue) : baseValue;
86
- const formattedValue = new Intl.NumberFormat(locale, {
87
- style: 'currency',
88
- currency: validCurrency.toUpperCase(),
89
- currencyDisplay,
90
- minimumFractionDigits: hideDecimals ? 0 : minimumFractionDigits,
91
- maximumFractionDigits: hideDecimals ? 0 : maximumFractionDigits,
92
- useGrouping: groupDigits
93
- }).format(finalBaseValue);
94
- return jsxRuntimeExports.jsx("span", { ref: ref, children: formattedValue });
95
117
  });
96
118
  Amount.displayName = 'Amount';
97
119
 
@@ -1 +1 @@
1
- {"version":3,"file":"amount.js","sources":["../../../components/amount/amount.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nexport interface AmountProps {\n /**\n * The monetary value to display\n * @default 0\n * @example\n * valueInMinorUnits=true: 1299 => \"$12.99\"\n * valueInMinorUnits=false: 12.99 => \"$12.99\"\n */\n value: number;\n\n /**\n * ISO 4217 currency code\n * @default 'USD'\n */\n currency?: string;\n\n /**\n * Whether the value is in minor units (cents, paise, etc.)\n * If true, the value will be converted based on the currency's decimal places\n * If false, the value will be used as is\n * @default true\n * @example\n * USD: 1299 => $12.99 (2 decimals)\n * JPY: 1299 => ¥1,299 (0 decimals)\n * BHD: 1299 => BHD 1.299 (3 decimals)\n */\n valueInMinorUnits?: boolean;\n\n /**\n * BCP 47 language tag\n * @default 'en-US'\n * @example 'en-US', 'de-DE', 'ja-JP'\n */\n locale?: string;\n\n /**\n * Truncates decimal places\n * @default false\n */\n hideDecimals?: boolean;\n\n /**\n * Currency display format\n * @default 'symbol'\n * @example 'symbol' - $12.99, 'code' - USD 12.99, 'name' - 12.99 US Dollars\n */\n currencyDisplay?: 'symbol' | 'code' | 'name';\n\n /**\n * Number of minimum fraction digits\n * @default undefined (uses currency's default)\n */\n minimumFractionDigits?: number;\n\n /**\n * Number of maximum fraction digits\n * @default undefined (uses currency's default)\n */\n maximumFractionDigits?: number;\n\n /**\n * Group digits (e.g., thousand separators)\n * @default true\n */\n groupDigits?: boolean;\n}\n\n/**\n * Get the number of decimal places for a currency\n */\nfunction getCurrencyDecimals(currency: string): number {\n try {\n const formatter = new Intl.NumberFormat('en', {\n style: 'currency',\n currency: currency.toUpperCase()\n });\n\n // Format a number and count the decimal places\n const formatted = formatter.format(1); // Get string representation of 1 unit with currency symbol\n const match = formatted.match(/\\.([\\d]+)/); // Extract the decimal part\n return match ? match[1].length : 0;\n } catch {\n // Default to 2 decimal places\n return 2;\n }\n}\n\n/**\n * Check if a currency is valid\n */\nfunction isValidCurrency(currency: string): boolean {\n try {\n new Intl.NumberFormat('en', {\n style: 'currency',\n currency: currency.toUpperCase()\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Amount component for displaying monetary values.\n * Automatically formats currencies using Intl.NumberFormat.\n * Inherits styling from parent Text component.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Text>\n * Total: <Amount value={1299} /> // Shows as \"$12.99\"\n * </Text>\n *\n * // With different currency and locale\n * <Text>\n * Prix: <Amount value={1299} currency=\"EUR\" locale=\"fr-FR\" /> // Shows as \"12,99 €\"\n * </Text>\n *\n * // Without decimals\n * <Text>\n * Price: <Amount value={1299} hideDecimals /> // Shows as \"$12\"\n * </Text>\n *\n * // With currency code\n * <Text>\n * Amount: <Amount value={1299} currencyDisplay=\"code\" /> // Shows as \"USD 12.99\"\n * </Text>\n *\n * // With value in major units\n * <Text>\n * Amount: <Amount value={12.99} valueInMinorUnits={false} /> // Shows as \"$12.99\"\n * </Text>\n *\n * // With groupDigits (default is true)\n * <Text>\n * Amount: <Amount value={129999999} groupDigits /> // Shows as \"$129,999,999.99\"\n * </Text>\n * ```\n */\nexport const Amount = forwardRef<HTMLSpanElement, AmountProps>(\n (\n {\n value = 0,\n currency = 'USD',\n locale = 'en-US',\n hideDecimals = false,\n currencyDisplay = 'symbol',\n minimumFractionDigits,\n maximumFractionDigits,\n groupDigits = true,\n valueInMinorUnits = true\n },\n ref\n ) => {\n const validCurrency = isValidCurrency(currency) ? currency : 'USD';\n if (validCurrency !== currency) {\n console.warn(`Invalid currency code: ${currency}. Falling back to USD.`);\n }\n\n const decimals = getCurrencyDecimals(validCurrency);\n const baseValue = valueInMinorUnits\n ? value / Math.pow(10, decimals)\n : value;\n const finalBaseValue = hideDecimals ? Math.trunc(baseValue) : baseValue;\n\n const formattedValue = new Intl.NumberFormat(locale, {\n style: 'currency' as const,\n currency: validCurrency.toUpperCase(),\n currencyDisplay,\n minimumFractionDigits: hideDecimals ? 0 : minimumFractionDigits,\n maximumFractionDigits: hideDecimals ? 0 : maximumFractionDigits,\n useGrouping: groupDigits\n }).format(finalBaseValue);\n\n return <span ref={ref}>{formattedValue}</span>;\n }\n);\n\nAmount.displayName = 'Amount';\n"],"names":["_jsx"],"mappings":";;;AAqEA;;AAEG;AACH,SAAS,mBAAmB,CAAC,QAAgB,EAAA;AAC3C,IAAA,IAAI;QACF,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AAC5C,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;AACjC,SAAA,CAAC,CAAC;;QAGH,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC3C,QAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;KACpC;AAAC,IAAA,MAAM;;AAEN,QAAA,OAAO,CAAC,CAAC;KACV;AACH,CAAC;AAED;;AAEG;AACH,SAAS,eAAe,CAAC,QAAgB,EAAA;AACvC,IAAA,IAAI;AACF,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AAC1B,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;AACjC,SAAA,CAAC,CAAC;AACH,QAAA,OAAO,IAAI,CAAC;KACb;AAAC,IAAA,MAAM;AACN,QAAA,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCG;AACU,MAAA,MAAM,GAAG,UAAU,CAC9B,CACE,EACE,KAAK,GAAG,CAAC,EACT,QAAQ,GAAG,KAAK,EAChB,MAAM,GAAG,OAAO,EAChB,YAAY,GAAG,KAAK,EACpB,eAAe,GAAG,QAAQ,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,GAAG,IAAI,EAClB,iBAAiB,GAAG,IAAI,EACzB,EACD,GAAG,KACD;AACF,IAAA,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAC;AACnE,IAAA,IAAI,aAAa,KAAK,QAAQ,EAAE;AAC9B,QAAA,OAAO,CAAC,IAAI,CAAC,0BAA0B,QAAQ,CAAA,sBAAA,CAAwB,CAAC,CAAC;KAC1E;AAED,IAAA,MAAM,QAAQ,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,iBAAiB;UAC/B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC;UAC9B,KAAK,CAAC;AACV,IAAA,MAAM,cAAc,GAAG,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IAExE,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACnD,QAAA,KAAK,EAAE,UAAmB;AAC1B,QAAA,QAAQ,EAAE,aAAa,CAAC,WAAW,EAAE;QACrC,eAAe;QACf,qBAAqB,EAAE,YAAY,GAAG,CAAC,GAAG,qBAAqB;QAC/D,qBAAqB,EAAE,YAAY,GAAG,CAAC,GAAG,qBAAqB;AAC/D,QAAA,WAAW,EAAE,WAAW;AACzB,KAAA,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,IAAA,OAAOA,gCAAM,GAAG,EAAE,GAAG,EAAG,QAAA,EAAA,cAAc,GAAQ,CAAC;AACjD,CAAC,EACD;AAEF,MAAM,CAAC,WAAW,GAAG,QAAQ;;;;"}
1
+ {"version":3,"file":"amount.js","sources":["../../../components/amount/amount.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nexport interface AmountProps {\n /**\n * The monetary value to display\n * For large numbers (> 2^53), pass the value as string to maintain precision\n * @default 0\n * @example\n * valueInMinorUnits=true: 1299 => \"$12.99\"\n * valueInMinorUnits=false: 12.99 => \"$12.99\"\n */\n value: number | string;\n\n /**\n * ISO 4217 currency code\n * @default 'USD'\n */\n currency?: string;\n\n /**\n * Whether the value is in minor units (cents, paise, etc.)\n * If true, the value will be converted based on the currency's decimal places\n * If false, the value will be used as is\n * @default true\n * @example\n * USD: 1299 => $12.99 (2 decimals)\n * JPY: 1299 => ¥1,299 (0 decimals)\n * BHD: 1299 => BHD 1.299 (3 decimals)\n */\n valueInMinorUnits?: boolean;\n\n /**\n * BCP 47 language tag\n * @default 'en-US'\n * @example 'en-US', 'de-DE', 'ja-JP'\n */\n locale?: string;\n\n /**\n * Truncates decimal places\n * @default false\n */\n hideDecimals?: boolean;\n\n /**\n * Currency display format\n * @default 'symbol'\n * @example 'symbol' - $12.99, 'code' - USD 12.99, 'name' - 12.99 US Dollars\n */\n currencyDisplay?: 'symbol' | 'code' | 'name';\n\n /**\n * Number of minimum fraction digits\n * @default undefined (uses currency's default)\n */\n minimumFractionDigits?: number;\n\n /**\n * Number of maximum fraction digits\n * @default undefined (uses currency's default)\n */\n maximumFractionDigits?: number;\n\n /**\n * Group digits (e.g., thousand separators)\n * @default true\n */\n groupDigits?: boolean;\n}\n\n/**\n * Get the number of decimal places for a currency\n */\nfunction getCurrencyDecimals(currency: string): number {\n try {\n const formatter = new Intl.NumberFormat('en', {\n style: 'currency',\n currency: currency.toUpperCase()\n });\n\n // Format a number and count the decimal places\n const formatted = formatter.format(1); // Get string representation of 1 unit with currency symbol\n const match = formatted.match(/\\.([\\d]+)/); // Extract the decimal part\n return match ? match[1].length : 0;\n } catch {\n // Default to 2 decimal places\n return 2;\n }\n}\n\n/**\n * Check if a currency is valid\n */\nfunction isValidCurrency(currency: string): boolean {\n try {\n new Intl.NumberFormat('en', {\n style: 'currency',\n currency: currency.toUpperCase()\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Amount component for displaying monetary values.\n * Automatically formats currencies using Intl.NumberFormat.\n * Inherits styling from parent Text component.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Text>\n * Total: <Amount value={1299} /> // Shows as \"$12.99\"\n * </Text>\n *\n * // With different currency and locale\n * <Text>\n * Prix: <Amount value={1299} currency=\"EUR\" locale=\"fr-FR\" /> // Shows as \"12,99 €\"\n * </Text>\n *\n * // Without decimals\n * <Text>\n * Price: <Amount value={1299} hideDecimals /> // Shows as \"$12\"\n * </Text>\n *\n * // With currency code\n * <Text>\n * Amount: <Amount value={1299} currencyDisplay=\"code\" /> // Shows as \"USD 12.99\"\n * </Text>\n *\n * // With value in major units\n * <Text>\n * Amount: <Amount value={12.99} valueInMinorUnits={false} /> // Shows as \"$12.99\"\n * </Text>\n *\n * // With groupDigits (default is true)\n * <Text>\n * Amount: <Amount value={129999999} groupDigits /> // Shows as \"$129,999,999.99\"\n * </Text>\n * ```\n */\nexport const Amount = forwardRef<HTMLSpanElement, AmountProps>(\n (\n {\n value = 0,\n currency = 'USD',\n locale = 'en-US',\n hideDecimals = false,\n currencyDisplay = 'symbol',\n minimumFractionDigits,\n maximumFractionDigits,\n groupDigits = true,\n valueInMinorUnits = true\n },\n ref\n ) => {\n try {\n if (\n typeof value === 'number' &&\n Math.abs(value) > Number.MAX_SAFE_INTEGER\n ) {\n console.warn(\n `Warning: The number ${value} exceeds JavaScript's safe integer limit (${Number.MAX_SAFE_INTEGER}). ` +\n 'For large numbers, pass the value as a string to maintain precision.'\n );\n }\n\n const validCurrency = isValidCurrency(currency) ? currency : 'USD';\n if (validCurrency !== currency) {\n console.warn(\n `Invalid currency code: ${currency}. Falling back to USD.`\n );\n }\n\n const decimals = getCurrencyDecimals(validCurrency);\n\n // Handle minor units - use string manipulation for strings and Math.pow for numbers\n const baseValue =\n valueInMinorUnits && decimals > 0\n ? typeof value === 'string'\n ? value.slice(0, -decimals) + '.' + value.slice(-decimals)\n : value / Math.pow(10, decimals)\n : value;\n\n // Remove decimals if hideDecimals is true - handle string and number separately\n // Note: Not all numbers passed is converted to string as methods like Math.trunc\n // or toString cannot handle large numbers thus, we need to handle it separately (large numbers passed in value throws console warning).\n const finalBaseValue = hideDecimals\n ? typeof baseValue === 'string'\n ? baseValue.split('.')[0]\n : Math.trunc(baseValue)\n : baseValue;\n\n const formattedValue = new Intl.NumberFormat(locale, {\n style: 'currency' as const,\n currency: validCurrency.toUpperCase(),\n currencyDisplay,\n minimumFractionDigits: hideDecimals ? 0 : minimumFractionDigits,\n maximumFractionDigits: hideDecimals ? 0 : maximumFractionDigits,\n useGrouping: groupDigits\n // @ts-ignore - Handling large numbers as string or number, so we need to pass the value as string or number.\n }).format(finalBaseValue);\n\n return <span ref={ref}>{formattedValue}</span>;\n } catch (error) {\n console.error('Error formatting amount:', error);\n return <span ref={ref}>{value}</span>;\n }\n }\n);\n\nAmount.displayName = 'Amount';\n"],"names":["_jsx"],"mappings":"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"}
@@ -5,26 +5,27 @@ var reactIcons_esm = require('../../node_modules/.pnpm/@radix-ui_react-icons@1.3
5
5
  var dayjs_min = require('../../node_modules/.pnpm/dayjs@1.11.11/node_modules/dayjs/dayjs.min.cjs');
6
6
  var React = require('react');
7
7
  var flex = require('../flex/flex.cjs');
8
+ var inputField = require('../input-field/input-field.cjs');
8
9
  var popover = require('../popover/popover.cjs');
9
10
  var calendar = require('./calendar.cjs');
10
11
  var calendar_module = require('./calendar.module.css.cjs');
11
- var inputField = require('../input-field/input-field.cjs');
12
12
 
13
- function RangePicker({ side = "top", dateFormat = "DD/MM/YYYY", inputFieldsProps = {}, calendarProps, onSelect = () => { }, value = {
13
+ function RangePicker({ side = 'top', dateFormat = 'DD/MM/YYYY', inputFieldsProps = {}, calendarProps, onSelect = () => { }, value, defaultValue = {
14
14
  to: new Date(),
15
- from: new Date(),
16
- }, pickerGroupClassName, children, showCalendarIcon = true, footer, timeZone, }) {
15
+ from: new Date()
16
+ }, pickerGroupClassName, children, showCalendarIcon = true, footer, timeZone }) {
17
17
  const [showCalendar, setShowCalendar] = React.useState(false);
18
- const [currentRangeField, setCurrentRangeField] = React.useState("from");
19
- const [selectedRange, setSelectedRange] = React.useState(value);
20
- const [currentMonth, setCurrentMonth] = React.useState(selectedRange?.from);
18
+ const [currentRangeField, setCurrentRangeField] = React.useState('from');
19
+ const [internalValue, setInternalValue] = React.useState(value ?? defaultValue);
20
+ const [currentMonth, setCurrentMonth] = React.useState(internalValue?.from);
21
+ const selectedRange = value ?? internalValue;
21
22
  const prevSelectedRangeRef = React.useRef(selectedRange);
22
23
  const startDate = selectedRange.from
23
24
  ? dayjs_min.default(selectedRange.from).format(dateFormat)
24
- : "";
25
+ : '';
25
26
  const endDate = selectedRange.to
26
27
  ? dayjs_min.default(selectedRange.to).format(dateFormat)
27
- : "";
28
+ : '';
28
29
  // Ensures two months are visible even when
29
30
  // current month is the last allowed month (endMonth).
30
31
  const computedDefaultMonth = React.useMemo(() => {
@@ -44,10 +45,10 @@ function RangePicker({ side = "top", dateFormat = "DD/MM/YYYY", inputFieldsProps
44
45
  const handleSelect = (range, selectedDay) => {
45
46
  // TODO: Remove custom logic and reuse the default logic from react-day-picker
46
47
  let newRange;
47
- if (currentRangeField === "from") {
48
+ if (currentRangeField === 'from') {
48
49
  // First click - set from date and prepare for to date selection
49
50
  newRange = { from: selectedDay };
50
- setCurrentRangeField("to");
51
+ setCurrentRangeField('to');
51
52
  }
52
53
  else {
53
54
  // Second click - setting to date
@@ -55,15 +56,15 @@ function RangePicker({ side = "top", dateFormat = "DD/MM/YYYY", inputFieldsProps
55
56
  if (dayjs_min.default(selectedDay).isBefore(dayjs_min.default(from))) {
56
57
  // If selected date is before current from date, start new range
57
58
  newRange = { from: selectedDay };
58
- setCurrentRangeField("to");
59
+ setCurrentRangeField('to');
59
60
  }
60
61
  else {
61
62
  // Set the to date
62
63
  newRange = { from, to: selectedDay };
63
- setCurrentRangeField("from");
64
+ setCurrentRangeField('from');
64
65
  }
65
66
  }
66
- setSelectedRange(newRange);
67
+ setInternalValue(newRange);
67
68
  onSelect(newRange);
68
69
  };
69
70
  function onOpenChange(open) {
@@ -71,7 +72,7 @@ function RangePicker({ side = "top", dateFormat = "DD/MM/YYYY", inputFieldsProps
71
72
  setShowCalendar(currOpen);
72
73
  // Reset selected range if calendar is closed and start or end date is empty
73
74
  if (!currOpen && (!startDate.length || !endDate.length)) {
74
- setSelectedRange(prevSelectedRangeRef.current);
75
+ setInternalValue(prevSelectedRangeRef.current);
75
76
  onSelect(prevSelectedRangeRef.current);
76
77
  }
77
78
  // Update previous selected range reference when both start and end dates are selected
@@ -79,11 +80,11 @@ function RangePicker({ side = "top", dateFormat = "DD/MM/YYYY", inputFieldsProps
79
80
  prevSelectedRangeRef.current = selectedRange;
80
81
  }
81
82
  }
82
- const defaultTrigger = (jsxRuntime.jsxRuntimeExports.jsxs(flex.Flex, { gap: "medium", className: pickerGroupClassName, children: [jsxRuntime.jsxRuntimeExports.jsx(inputField.InputField, { size: 'small', placeholder: "Select start date", trailingIcon: showCalendarIcon ? jsxRuntime.jsxRuntimeExports.jsx(reactIcons_esm.CalendarIcon, {}) : undefined, className: calendar_module.default.datePickerInput, ...(inputFieldsProps.startDate ?? {}), value: startDate, readOnly: true }), jsxRuntime.jsxRuntimeExports.jsx(inputField.InputField, { size: 'small', placeholder: "Select end date", trailingIcon: showCalendarIcon ? jsxRuntime.jsxRuntimeExports.jsx(reactIcons_esm.CalendarIcon, {}) : undefined, className: calendar_module.default.datePickerInput, ...(inputFieldsProps.endDate ?? {}), value: endDate, readOnly: true })] }));
83
- const trigger = typeof children === "function"
83
+ const defaultTrigger = (jsxRuntime.jsxRuntimeExports.jsxs(flex.Flex, { gap: 'medium', className: pickerGroupClassName, children: [jsxRuntime.jsxRuntimeExports.jsx(inputField.InputField, { size: 'small', placeholder: 'Select start date', trailingIcon: showCalendarIcon ? jsxRuntime.jsxRuntimeExports.jsx(reactIcons_esm.CalendarIcon, {}) : undefined, className: calendar_module.default.datePickerInput, ...(inputFieldsProps.startDate ?? {}), value: startDate, readOnly: true }), jsxRuntime.jsxRuntimeExports.jsx(inputField.InputField, { size: 'small', placeholder: 'Select end date', trailingIcon: showCalendarIcon ? jsxRuntime.jsxRuntimeExports.jsx(reactIcons_esm.CalendarIcon, {}) : undefined, className: calendar_module.default.datePickerInput, ...(inputFieldsProps.endDate ?? {}), value: endDate, readOnly: true })] }));
84
+ const trigger = typeof children === 'function'
84
85
  ? children({ startDate, endDate })
85
86
  : children || defaultTrigger;
86
- return (jsxRuntime.jsxRuntimeExports.jsxs(popover.Popover, { open: showCalendar, onOpenChange: onOpenChange, children: [jsxRuntime.jsxRuntimeExports.jsx(popover.Popover.Trigger, { asChild: true, children: trigger }), jsxRuntime.jsxRuntimeExports.jsxs(popover.Popover.Content, { side: side, className: calendar_module.default.calendarPopover, children: [jsxRuntime.jsxRuntimeExports.jsx(calendar.Calendar, { showOutsideDays: false, numberOfMonths: 2, defaultMonth: selectedRange.from, required: true, ...calendarProps, timeZone: timeZone, mode: "range", month: computedDefaultMonth, selected: selectedRange, onSelect: handleSelect, onMonthChange: setCurrentMonth }), footer && (jsxRuntime.jsxRuntimeExports.jsx(flex.Flex, { align: "center", justify: "center", className: calendar_module.default.calendarFooter, children: footer }))] })] }));
87
+ return (jsxRuntime.jsxRuntimeExports.jsxs(popover.Popover, { open: showCalendar, onOpenChange: onOpenChange, children: [jsxRuntime.jsxRuntimeExports.jsx(popover.Popover.Trigger, { asChild: true, children: trigger }), jsxRuntime.jsxRuntimeExports.jsxs(popover.Popover.Content, { side: side, className: calendar_module.default.calendarPopover, children: [jsxRuntime.jsxRuntimeExports.jsx(calendar.Calendar, { showOutsideDays: false, numberOfMonths: 2, defaultMonth: selectedRange.from, required: true, ...calendarProps, timeZone: timeZone, mode: 'range', month: computedDefaultMonth, selected: selectedRange, onSelect: handleSelect, onMonthChange: setCurrentMonth }), footer && (jsxRuntime.jsxRuntimeExports.jsx(flex.Flex, { align: 'center', justify: 'center', className: calendar_module.default.calendarFooter, children: footer }))] })] }));
87
88
  }
88
89
 
89
90
  exports.RangePicker = RangePicker;
@@ -1 +1 @@
1
- {"version":3,"file":"range-picker.cjs","sources":["../../../components/calendar/range-picker.tsx"],"sourcesContent":["import { CalendarIcon } from \"@radix-ui/react-icons\";\nimport dayjs from \"dayjs\";\nimport { useRef, useState, useMemo } from \"react\";\nimport { DateRange, PropsBase, PropsRangeRequired } from \"react-day-picker\";\n\nimport { Flex } from \"../flex\";\nimport { Popover } from \"../popover\";\nimport { Calendar } from \"./calendar\";\nimport styles from \"./calendar.module.css\";\nimport { InputField } from \"../input-field\";\nimport { InputFieldProps } from \"../input-field/input-field\";\n\ninterface RangePickerProps {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n dateFormat?: string;\n inputFieldsProps?: { startDate?: InputFieldProps; endDate?: InputFieldProps };\n calendarProps?: PropsRangeRequired & PropsBase;\n onSelect?: (date: DateRange) => void;\n pickerGroupClassName?: string;\n value?: DateRange;\n children?:\n | React.ReactNode\n | ((props: { startDate: string; endDate: string }) => React.ReactNode);\n showCalendarIcon?: boolean;\n footer?: React.ReactNode;\n timeZone?: string;\n}\n\ntype RangeFields = keyof DateRange;\n\nexport function RangePicker({\n side = \"top\",\n dateFormat = \"DD/MM/YYYY\",\n inputFieldsProps = {},\n calendarProps,\n onSelect = () => {},\n value = {\n to: new Date(),\n from: new Date(),\n },\n pickerGroupClassName,\n children,\n showCalendarIcon = true,\n footer,\n timeZone,\n}: RangePickerProps) {\n const [showCalendar, setShowCalendar] = useState(false);\n const [currentRangeField, setCurrentRangeField] =\n useState<RangeFields>(\"from\");\n const [selectedRange, setSelectedRange] = useState(value);\n const [currentMonth, setCurrentMonth] = useState(selectedRange?.from);\n\n const prevSelectedRangeRef = useRef(selectedRange);\n\n const startDate = selectedRange.from\n ? dayjs(selectedRange.from).format(dateFormat)\n : \"\";\n const endDate = selectedRange.to\n ? dayjs(selectedRange.to).format(dateFormat)\n : \"\";\n\n // Ensures two months are visible even when\n // current month is the last allowed month (endMonth).\n const computedDefaultMonth = useMemo(() => {\n let month = currentMonth;\n if (calendarProps?.endMonth) {\n const endMonth = dayjs(calendarProps.endMonth);\n const fromMonth = dayjs(currentMonth);\n\n if (fromMonth.isSame(endMonth, 'month')) {\n month = endMonth.subtract(1, 'month').toDate();\n }\n }\n return month;\n }, [currentMonth, calendarProps?.endMonth]);\n\n // 1st click will select the start date.\n // 2nd click will select the end date.\n // 3rd click will select the start date again.\n const handleSelect = (range: DateRange, selectedDay: Date) => {\n // TODO: Remove custom logic and reuse the default logic from react-day-picker\n let newRange: DateRange;\n\n if (currentRangeField === \"from\") {\n // First click - set from date and prepare for to date selection\n newRange = { from: selectedDay };\n setCurrentRangeField(\"to\");\n } else {\n // Second click - setting to date\n const from = selectedRange.from;\n\n if (dayjs(selectedDay).isBefore(dayjs(from))) {\n // If selected date is before current from date, start new range\n newRange = { from: selectedDay };\n setCurrentRangeField(\"to\");\n } else {\n // Set the to date\n newRange = { from, to: selectedDay };\n setCurrentRangeField(\"from\");\n }\n }\n\n setSelectedRange(newRange);\n onSelect(newRange);\n };\n\n function onOpenChange(open?: boolean) {\n const currOpen = Boolean(open);\n\n setShowCalendar(currOpen);\n\n // Reset selected range if calendar is closed and start or end date is empty\n if (!currOpen && (!startDate.length || !endDate.length)) {\n setSelectedRange(prevSelectedRangeRef.current);\n onSelect(prevSelectedRangeRef.current);\n }\n\n // Update previous selected range reference when both start and end dates are selected\n if (!currOpen && startDate.length && endDate.length) {\n prevSelectedRangeRef.current = selectedRange;\n }\n }\n\n const defaultTrigger = (\n <Flex gap=\"medium\" className={pickerGroupClassName}>\n <InputField\n size='small'\n placeholder=\"Select start date\"\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n className={styles.datePickerInput}\n {...(inputFieldsProps.startDate ?? {})}\n value={startDate}\n readOnly\n />\n\n <InputField\n size='small'\n placeholder=\"Select end date\"\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n className={styles.datePickerInput}\n {...(inputFieldsProps.endDate ?? {})}\n value={endDate}\n readOnly\n />\n </Flex>\n );\n\n const trigger =\n typeof children === \"function\"\n ? children({ startDate, endDate })\n : children || defaultTrigger;\n\n return (\n <Popover open={showCalendar} onOpenChange={onOpenChange}>\n <Popover.Trigger asChild>{trigger}</Popover.Trigger>\n <Popover.Content side={side} className={styles.calendarPopover}>\n <Calendar\n showOutsideDays={false}\n numberOfMonths={2}\n defaultMonth={selectedRange.from}\n required={true}\n {...calendarProps}\n timeZone={timeZone}\n mode=\"range\"\n month={computedDefaultMonth}\n selected={selectedRange}\n onSelect={handleSelect}\n onMonthChange={setCurrentMonth}\n />\n {footer && (\n <Flex\n align=\"center\"\n justify=\"center\"\n className={styles.calendarFooter}\n >\n {footer}\n </Flex>\n )}\n </Popover.Content>\n </Popover>\n );\n}\n"],"names":["useState","useRef","dayjs","useMemo","_jsxs","Flex","_jsx","InputField","CalendarIcon","styles","Popover","Calendar"],"mappings":"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"}
1
+ {"version":3,"file":"range-picker.cjs","sources":["../../../components/calendar/range-picker.tsx"],"sourcesContent":["import { CalendarIcon } from '@radix-ui/react-icons';\nimport dayjs from 'dayjs';\nimport { useMemo, useRef, useState } from 'react';\nimport { DateRange, PropsBase, PropsRangeRequired } from 'react-day-picker';\n\nimport { Flex } from '../flex';\nimport { InputField } from '../input-field';\nimport { InputFieldProps } from '../input-field/input-field';\nimport { Popover } from '../popover';\nimport { Calendar } from './calendar';\nimport styles from './calendar.module.css';\n\ninterface RangePickerProps {\n side?: 'top' | 'right' | 'bottom' | 'left';\n dateFormat?: string;\n inputFieldsProps?: { startDate?: InputFieldProps; endDate?: InputFieldProps };\n calendarProps?: PropsRangeRequired & PropsBase;\n onSelect?: (date: DateRange) => void;\n pickerGroupClassName?: string;\n value?: DateRange;\n defaultValue?: DateRange;\n children?:\n | React.ReactNode\n | ((props: { startDate: string; endDate: string }) => React.ReactNode);\n showCalendarIcon?: boolean;\n footer?: React.ReactNode;\n timeZone?: string;\n}\n\ntype RangeFields = keyof DateRange;\n\nexport function RangePicker({\n side = 'top',\n dateFormat = 'DD/MM/YYYY',\n inputFieldsProps = {},\n calendarProps,\n onSelect = () => {},\n value,\n defaultValue = {\n to: new Date(),\n from: new Date()\n },\n pickerGroupClassName,\n children,\n showCalendarIcon = true,\n footer,\n timeZone\n}: RangePickerProps) {\n const [showCalendar, setShowCalendar] = useState(false);\n const [currentRangeField, setCurrentRangeField] =\n useState<RangeFields>('from');\n const [internalValue, setInternalValue] = useState(value ?? defaultValue);\n const [currentMonth, setCurrentMonth] = useState(internalValue?.from);\n\n const selectedRange = value ?? internalValue;\n\n const prevSelectedRangeRef = useRef(selectedRange);\n\n const startDate = selectedRange.from\n ? dayjs(selectedRange.from).format(dateFormat)\n : '';\n const endDate = selectedRange.to\n ? dayjs(selectedRange.to).format(dateFormat)\n : '';\n\n // Ensures two months are visible even when\n // current month is the last allowed month (endMonth).\n const computedDefaultMonth = useMemo(() => {\n let month = currentMonth;\n if (calendarProps?.endMonth) {\n const endMonth = dayjs(calendarProps.endMonth);\n const fromMonth = dayjs(currentMonth);\n\n if (fromMonth.isSame(endMonth, 'month')) {\n month = endMonth.subtract(1, 'month').toDate();\n }\n }\n return month;\n }, [currentMonth, calendarProps?.endMonth]);\n\n // 1st click will select the start date.\n // 2nd click will select the end date.\n // 3rd click will select the start date again.\n const handleSelect = (range: DateRange, selectedDay: Date) => {\n // TODO: Remove custom logic and reuse the default logic from react-day-picker\n let newRange: DateRange;\n\n if (currentRangeField === 'from') {\n // First click - set from date and prepare for to date selection\n newRange = { from: selectedDay };\n setCurrentRangeField('to');\n } else {\n // Second click - setting to date\n const from = selectedRange.from;\n\n if (dayjs(selectedDay).isBefore(dayjs(from))) {\n // If selected date is before current from date, start new range\n newRange = { from: selectedDay };\n setCurrentRangeField('to');\n } else {\n // Set the to date\n newRange = { from, to: selectedDay };\n setCurrentRangeField('from');\n }\n }\n\n setInternalValue(newRange);\n onSelect(newRange);\n };\n\n function onOpenChange(open?: boolean) {\n const currOpen = Boolean(open);\n\n setShowCalendar(currOpen);\n\n // Reset selected range if calendar is closed and start or end date is empty\n if (!currOpen && (!startDate.length || !endDate.length)) {\n setInternalValue(prevSelectedRangeRef.current);\n onSelect(prevSelectedRangeRef.current);\n }\n\n // Update previous selected range reference when both start and end dates are selected\n if (!currOpen && startDate.length && endDate.length) {\n prevSelectedRangeRef.current = selectedRange;\n }\n }\n\n const defaultTrigger = (\n <Flex gap='medium' className={pickerGroupClassName}>\n <InputField\n size='small'\n placeholder='Select start date'\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n className={styles.datePickerInput}\n {...(inputFieldsProps.startDate ?? {})}\n value={startDate}\n readOnly\n />\n\n <InputField\n size='small'\n placeholder='Select end date'\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n className={styles.datePickerInput}\n {...(inputFieldsProps.endDate ?? {})}\n value={endDate}\n readOnly\n />\n </Flex>\n );\n\n const trigger =\n typeof children === 'function'\n ? children({ startDate, endDate })\n : children || defaultTrigger;\n\n return (\n <Popover open={showCalendar} onOpenChange={onOpenChange}>\n <Popover.Trigger asChild>{trigger}</Popover.Trigger>\n <Popover.Content side={side} className={styles.calendarPopover}>\n <Calendar\n showOutsideDays={false}\n numberOfMonths={2}\n defaultMonth={selectedRange.from}\n required={true}\n {...calendarProps}\n timeZone={timeZone}\n mode='range'\n month={computedDefaultMonth}\n selected={selectedRange}\n onSelect={handleSelect}\n onMonthChange={setCurrentMonth}\n />\n {footer && (\n <Flex\n align='center'\n justify='center'\n className={styles.calendarFooter}\n >\n {footer}\n </Flex>\n )}\n </Popover.Content>\n </Popover>\n );\n}\n"],"names":["useState","useRef","dayjs","useMemo","_jsxs","Flex","_jsx","InputField","CalendarIcon","styles","Popover","Calendar"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { DateRange, PropsBase, PropsRangeRequired } from "react-day-picker";
2
- import { InputFieldProps } from "../input-field/input-field";
1
+ import { DateRange, PropsBase, PropsRangeRequired } from 'react-day-picker';
2
+ import { InputFieldProps } from '../input-field/input-field';
3
3
  interface RangePickerProps {
4
- side?: "top" | "right" | "bottom" | "left";
4
+ side?: 'top' | 'right' | 'bottom' | 'left';
5
5
  dateFormat?: string;
6
6
  inputFieldsProps?: {
7
7
  startDate?: InputFieldProps;
@@ -11,6 +11,7 @@ interface RangePickerProps {
11
11
  onSelect?: (date: DateRange) => void;
12
12
  pickerGroupClassName?: string;
13
13
  value?: DateRange;
14
+ defaultValue?: DateRange;
14
15
  children?: React.ReactNode | ((props: {
15
16
  startDate: string;
16
17
  endDate: string;
@@ -19,6 +20,6 @@ interface RangePickerProps {
19
20
  footer?: React.ReactNode;
20
21
  timeZone?: string;
21
22
  }
22
- export declare function RangePicker({ side, dateFormat, inputFieldsProps, calendarProps, onSelect, value, pickerGroupClassName, children, showCalendarIcon, footer, timeZone, }: RangePickerProps): import("react/jsx-runtime").JSX.Element;
23
+ export declare function RangePicker({ side, dateFormat, inputFieldsProps, calendarProps, onSelect, value, defaultValue, pickerGroupClassName, children, showCalendarIcon, footer, timeZone }: RangePickerProps): import("react/jsx-runtime").JSX.Element;
23
24
  export {};
24
25
  //# sourceMappingURL=range-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"range-picker.d.ts","sourceRoot":"","sources":["../../../components/calendar/range-picker.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAO5E,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,eAAe,CAAC;QAAC,OAAO,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC;IAC9E,aAAa,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EACL,KAAK,CAAC,SAAS,GACf,CAAC,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,WAAW,CAAC,EAC1B,IAAY,EACZ,UAAyB,EACzB,gBAAqB,EACrB,aAAa,EACb,QAAmB,EACnB,KAGC,EACD,oBAAoB,EACpB,QAAQ,EACR,gBAAuB,EACvB,MAAM,EACN,QAAQ,GACT,EAAE,gBAAgB,2CAwIlB"}
1
+ {"version":3,"file":"range-picker.d.ts","sourceRoot":"","sources":["../../../components/calendar/range-picker.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAI5E,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAK7D,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,eAAe,CAAC;QAAC,OAAO,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC;IAC9E,aAAa,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,EACL,KAAK,CAAC,SAAS,GACf,CAAC,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,WAAW,CAAC,EAC1B,IAAY,EACZ,UAAyB,EACzB,gBAAqB,EACrB,aAAa,EACb,QAAmB,EACnB,KAAK,EACL,YAGC,EACD,oBAAoB,EACpB,QAAQ,EACR,gBAAuB,EACvB,MAAM,EACN,QAAQ,EACT,EAAE,gBAAgB,2CA0IlB"}
@@ -3,26 +3,27 @@ import { CalendarIcon } from '../../node_modules/.pnpm/@radix-ui_react-icons@1.3
3
3
  import dayjs from '../../node_modules/.pnpm/dayjs@1.11.11/node_modules/dayjs/dayjs.min.js';
4
4
  import { useState, useRef, useMemo } from 'react';
5
5
  import { Flex } from '../flex/flex.js';
6
+ import { InputField } from '../input-field/input-field.js';
6
7
  import { Popover } from '../popover/popover.js';
7
8
  import { Calendar } from './calendar.js';
8
9
  import styles from './calendar.module.css.js';
9
- import { InputField } from '../input-field/input-field.js';
10
10
 
11
- function RangePicker({ side = "top", dateFormat = "DD/MM/YYYY", inputFieldsProps = {}, calendarProps, onSelect = () => { }, value = {
11
+ function RangePicker({ side = 'top', dateFormat = 'DD/MM/YYYY', inputFieldsProps = {}, calendarProps, onSelect = () => { }, value, defaultValue = {
12
12
  to: new Date(),
13
- from: new Date(),
14
- }, pickerGroupClassName, children, showCalendarIcon = true, footer, timeZone, }) {
13
+ from: new Date()
14
+ }, pickerGroupClassName, children, showCalendarIcon = true, footer, timeZone }) {
15
15
  const [showCalendar, setShowCalendar] = useState(false);
16
- const [currentRangeField, setCurrentRangeField] = useState("from");
17
- const [selectedRange, setSelectedRange] = useState(value);
18
- const [currentMonth, setCurrentMonth] = useState(selectedRange?.from);
16
+ const [currentRangeField, setCurrentRangeField] = useState('from');
17
+ const [internalValue, setInternalValue] = useState(value ?? defaultValue);
18
+ const [currentMonth, setCurrentMonth] = useState(internalValue?.from);
19
+ const selectedRange = value ?? internalValue;
19
20
  const prevSelectedRangeRef = useRef(selectedRange);
20
21
  const startDate = selectedRange.from
21
22
  ? dayjs(selectedRange.from).format(dateFormat)
22
- : "";
23
+ : '';
23
24
  const endDate = selectedRange.to
24
25
  ? dayjs(selectedRange.to).format(dateFormat)
25
- : "";
26
+ : '';
26
27
  // Ensures two months are visible even when
27
28
  // current month is the last allowed month (endMonth).
28
29
  const computedDefaultMonth = useMemo(() => {
@@ -42,10 +43,10 @@ function RangePicker({ side = "top", dateFormat = "DD/MM/YYYY", inputFieldsProps
42
43
  const handleSelect = (range, selectedDay) => {
43
44
  // TODO: Remove custom logic and reuse the default logic from react-day-picker
44
45
  let newRange;
45
- if (currentRangeField === "from") {
46
+ if (currentRangeField === 'from') {
46
47
  // First click - set from date and prepare for to date selection
47
48
  newRange = { from: selectedDay };
48
- setCurrentRangeField("to");
49
+ setCurrentRangeField('to');
49
50
  }
50
51
  else {
51
52
  // Second click - setting to date
@@ -53,15 +54,15 @@ function RangePicker({ side = "top", dateFormat = "DD/MM/YYYY", inputFieldsProps
53
54
  if (dayjs(selectedDay).isBefore(dayjs(from))) {
54
55
  // If selected date is before current from date, start new range
55
56
  newRange = { from: selectedDay };
56
- setCurrentRangeField("to");
57
+ setCurrentRangeField('to');
57
58
  }
58
59
  else {
59
60
  // Set the to date
60
61
  newRange = { from, to: selectedDay };
61
- setCurrentRangeField("from");
62
+ setCurrentRangeField('from');
62
63
  }
63
64
  }
64
- setSelectedRange(newRange);
65
+ setInternalValue(newRange);
65
66
  onSelect(newRange);
66
67
  };
67
68
  function onOpenChange(open) {
@@ -69,7 +70,7 @@ function RangePicker({ side = "top", dateFormat = "DD/MM/YYYY", inputFieldsProps
69
70
  setShowCalendar(currOpen);
70
71
  // Reset selected range if calendar is closed and start or end date is empty
71
72
  if (!currOpen && (!startDate.length || !endDate.length)) {
72
- setSelectedRange(prevSelectedRangeRef.current);
73
+ setInternalValue(prevSelectedRangeRef.current);
73
74
  onSelect(prevSelectedRangeRef.current);
74
75
  }
75
76
  // Update previous selected range reference when both start and end dates are selected
@@ -77,11 +78,11 @@ function RangePicker({ side = "top", dateFormat = "DD/MM/YYYY", inputFieldsProps
77
78
  prevSelectedRangeRef.current = selectedRange;
78
79
  }
79
80
  }
80
- const defaultTrigger = (jsxRuntimeExports.jsxs(Flex, { gap: "medium", className: pickerGroupClassName, children: [jsxRuntimeExports.jsx(InputField, { size: 'small', placeholder: "Select start date", trailingIcon: showCalendarIcon ? jsxRuntimeExports.jsx(CalendarIcon, {}) : undefined, className: styles.datePickerInput, ...(inputFieldsProps.startDate ?? {}), value: startDate, readOnly: true }), jsxRuntimeExports.jsx(InputField, { size: 'small', placeholder: "Select end date", trailingIcon: showCalendarIcon ? jsxRuntimeExports.jsx(CalendarIcon, {}) : undefined, className: styles.datePickerInput, ...(inputFieldsProps.endDate ?? {}), value: endDate, readOnly: true })] }));
81
- const trigger = typeof children === "function"
81
+ const defaultTrigger = (jsxRuntimeExports.jsxs(Flex, { gap: 'medium', className: pickerGroupClassName, children: [jsxRuntimeExports.jsx(InputField, { size: 'small', placeholder: 'Select start date', trailingIcon: showCalendarIcon ? jsxRuntimeExports.jsx(CalendarIcon, {}) : undefined, className: styles.datePickerInput, ...(inputFieldsProps.startDate ?? {}), value: startDate, readOnly: true }), jsxRuntimeExports.jsx(InputField, { size: 'small', placeholder: 'Select end date', trailingIcon: showCalendarIcon ? jsxRuntimeExports.jsx(CalendarIcon, {}) : undefined, className: styles.datePickerInput, ...(inputFieldsProps.endDate ?? {}), value: endDate, readOnly: true })] }));
82
+ const trigger = typeof children === 'function'
82
83
  ? children({ startDate, endDate })
83
84
  : children || defaultTrigger;
84
- return (jsxRuntimeExports.jsxs(Popover, { open: showCalendar, onOpenChange: onOpenChange, children: [jsxRuntimeExports.jsx(Popover.Trigger, { asChild: true, children: trigger }), jsxRuntimeExports.jsxs(Popover.Content, { side: side, className: styles.calendarPopover, children: [jsxRuntimeExports.jsx(Calendar, { showOutsideDays: false, numberOfMonths: 2, defaultMonth: selectedRange.from, required: true, ...calendarProps, timeZone: timeZone, mode: "range", month: computedDefaultMonth, selected: selectedRange, onSelect: handleSelect, onMonthChange: setCurrentMonth }), footer && (jsxRuntimeExports.jsx(Flex, { align: "center", justify: "center", className: styles.calendarFooter, children: footer }))] })] }));
85
+ return (jsxRuntimeExports.jsxs(Popover, { open: showCalendar, onOpenChange: onOpenChange, children: [jsxRuntimeExports.jsx(Popover.Trigger, { asChild: true, children: trigger }), jsxRuntimeExports.jsxs(Popover.Content, { side: side, className: styles.calendarPopover, children: [jsxRuntimeExports.jsx(Calendar, { showOutsideDays: false, numberOfMonths: 2, defaultMonth: selectedRange.from, required: true, ...calendarProps, timeZone: timeZone, mode: 'range', month: computedDefaultMonth, selected: selectedRange, onSelect: handleSelect, onMonthChange: setCurrentMonth }), footer && (jsxRuntimeExports.jsx(Flex, { align: 'center', justify: 'center', className: styles.calendarFooter, children: footer }))] })] }));
85
86
  }
86
87
 
87
88
  export { RangePicker };
@@ -1 +1 @@
1
- {"version":3,"file":"range-picker.js","sources":["../../../components/calendar/range-picker.tsx"],"sourcesContent":["import { CalendarIcon } from \"@radix-ui/react-icons\";\nimport dayjs from \"dayjs\";\nimport { useRef, useState, useMemo } from \"react\";\nimport { DateRange, PropsBase, PropsRangeRequired } from \"react-day-picker\";\n\nimport { Flex } from \"../flex\";\nimport { Popover } from \"../popover\";\nimport { Calendar } from \"./calendar\";\nimport styles from \"./calendar.module.css\";\nimport { InputField } from \"../input-field\";\nimport { InputFieldProps } from \"../input-field/input-field\";\n\ninterface RangePickerProps {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n dateFormat?: string;\n inputFieldsProps?: { startDate?: InputFieldProps; endDate?: InputFieldProps };\n calendarProps?: PropsRangeRequired & PropsBase;\n onSelect?: (date: DateRange) => void;\n pickerGroupClassName?: string;\n value?: DateRange;\n children?:\n | React.ReactNode\n | ((props: { startDate: string; endDate: string }) => React.ReactNode);\n showCalendarIcon?: boolean;\n footer?: React.ReactNode;\n timeZone?: string;\n}\n\ntype RangeFields = keyof DateRange;\n\nexport function RangePicker({\n side = \"top\",\n dateFormat = \"DD/MM/YYYY\",\n inputFieldsProps = {},\n calendarProps,\n onSelect = () => {},\n value = {\n to: new Date(),\n from: new Date(),\n },\n pickerGroupClassName,\n children,\n showCalendarIcon = true,\n footer,\n timeZone,\n}: RangePickerProps) {\n const [showCalendar, setShowCalendar] = useState(false);\n const [currentRangeField, setCurrentRangeField] =\n useState<RangeFields>(\"from\");\n const [selectedRange, setSelectedRange] = useState(value);\n const [currentMonth, setCurrentMonth] = useState(selectedRange?.from);\n\n const prevSelectedRangeRef = useRef(selectedRange);\n\n const startDate = selectedRange.from\n ? dayjs(selectedRange.from).format(dateFormat)\n : \"\";\n const endDate = selectedRange.to\n ? dayjs(selectedRange.to).format(dateFormat)\n : \"\";\n\n // Ensures two months are visible even when\n // current month is the last allowed month (endMonth).\n const computedDefaultMonth = useMemo(() => {\n let month = currentMonth;\n if (calendarProps?.endMonth) {\n const endMonth = dayjs(calendarProps.endMonth);\n const fromMonth = dayjs(currentMonth);\n\n if (fromMonth.isSame(endMonth, 'month')) {\n month = endMonth.subtract(1, 'month').toDate();\n }\n }\n return month;\n }, [currentMonth, calendarProps?.endMonth]);\n\n // 1st click will select the start date.\n // 2nd click will select the end date.\n // 3rd click will select the start date again.\n const handleSelect = (range: DateRange, selectedDay: Date) => {\n // TODO: Remove custom logic and reuse the default logic from react-day-picker\n let newRange: DateRange;\n\n if (currentRangeField === \"from\") {\n // First click - set from date and prepare for to date selection\n newRange = { from: selectedDay };\n setCurrentRangeField(\"to\");\n } else {\n // Second click - setting to date\n const from = selectedRange.from;\n\n if (dayjs(selectedDay).isBefore(dayjs(from))) {\n // If selected date is before current from date, start new range\n newRange = { from: selectedDay };\n setCurrentRangeField(\"to\");\n } else {\n // Set the to date\n newRange = { from, to: selectedDay };\n setCurrentRangeField(\"from\");\n }\n }\n\n setSelectedRange(newRange);\n onSelect(newRange);\n };\n\n function onOpenChange(open?: boolean) {\n const currOpen = Boolean(open);\n\n setShowCalendar(currOpen);\n\n // Reset selected range if calendar is closed and start or end date is empty\n if (!currOpen && (!startDate.length || !endDate.length)) {\n setSelectedRange(prevSelectedRangeRef.current);\n onSelect(prevSelectedRangeRef.current);\n }\n\n // Update previous selected range reference when both start and end dates are selected\n if (!currOpen && startDate.length && endDate.length) {\n prevSelectedRangeRef.current = selectedRange;\n }\n }\n\n const defaultTrigger = (\n <Flex gap=\"medium\" className={pickerGroupClassName}>\n <InputField\n size='small'\n placeholder=\"Select start date\"\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n className={styles.datePickerInput}\n {...(inputFieldsProps.startDate ?? {})}\n value={startDate}\n readOnly\n />\n\n <InputField\n size='small'\n placeholder=\"Select end date\"\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n className={styles.datePickerInput}\n {...(inputFieldsProps.endDate ?? {})}\n value={endDate}\n readOnly\n />\n </Flex>\n );\n\n const trigger =\n typeof children === \"function\"\n ? children({ startDate, endDate })\n : children || defaultTrigger;\n\n return (\n <Popover open={showCalendar} onOpenChange={onOpenChange}>\n <Popover.Trigger asChild>{trigger}</Popover.Trigger>\n <Popover.Content side={side} className={styles.calendarPopover}>\n <Calendar\n showOutsideDays={false}\n numberOfMonths={2}\n defaultMonth={selectedRange.from}\n required={true}\n {...calendarProps}\n timeZone={timeZone}\n mode=\"range\"\n month={computedDefaultMonth}\n selected={selectedRange}\n onSelect={handleSelect}\n onMonthChange={setCurrentMonth}\n />\n {footer && (\n <Flex\n align=\"center\"\n justify=\"center\"\n className={styles.calendarFooter}\n >\n {footer}\n </Flex>\n )}\n </Popover.Content>\n </Popover>\n );\n}\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"range-picker.js","sources":["../../../components/calendar/range-picker.tsx"],"sourcesContent":["import { CalendarIcon } from '@radix-ui/react-icons';\nimport dayjs from 'dayjs';\nimport { useMemo, useRef, useState } from 'react';\nimport { DateRange, PropsBase, PropsRangeRequired } from 'react-day-picker';\n\nimport { Flex } from '../flex';\nimport { InputField } from '../input-field';\nimport { InputFieldProps } from '../input-field/input-field';\nimport { Popover } from '../popover';\nimport { Calendar } from './calendar';\nimport styles from './calendar.module.css';\n\ninterface RangePickerProps {\n side?: 'top' | 'right' | 'bottom' | 'left';\n dateFormat?: string;\n inputFieldsProps?: { startDate?: InputFieldProps; endDate?: InputFieldProps };\n calendarProps?: PropsRangeRequired & PropsBase;\n onSelect?: (date: DateRange) => void;\n pickerGroupClassName?: string;\n value?: DateRange;\n defaultValue?: DateRange;\n children?:\n | React.ReactNode\n | ((props: { startDate: string; endDate: string }) => React.ReactNode);\n showCalendarIcon?: boolean;\n footer?: React.ReactNode;\n timeZone?: string;\n}\n\ntype RangeFields = keyof DateRange;\n\nexport function RangePicker({\n side = 'top',\n dateFormat = 'DD/MM/YYYY',\n inputFieldsProps = {},\n calendarProps,\n onSelect = () => {},\n value,\n defaultValue = {\n to: new Date(),\n from: new Date()\n },\n pickerGroupClassName,\n children,\n showCalendarIcon = true,\n footer,\n timeZone\n}: RangePickerProps) {\n const [showCalendar, setShowCalendar] = useState(false);\n const [currentRangeField, setCurrentRangeField] =\n useState<RangeFields>('from');\n const [internalValue, setInternalValue] = useState(value ?? defaultValue);\n const [currentMonth, setCurrentMonth] = useState(internalValue?.from);\n\n const selectedRange = value ?? internalValue;\n\n const prevSelectedRangeRef = useRef(selectedRange);\n\n const startDate = selectedRange.from\n ? dayjs(selectedRange.from).format(dateFormat)\n : '';\n const endDate = selectedRange.to\n ? dayjs(selectedRange.to).format(dateFormat)\n : '';\n\n // Ensures two months are visible even when\n // current month is the last allowed month (endMonth).\n const computedDefaultMonth = useMemo(() => {\n let month = currentMonth;\n if (calendarProps?.endMonth) {\n const endMonth = dayjs(calendarProps.endMonth);\n const fromMonth = dayjs(currentMonth);\n\n if (fromMonth.isSame(endMonth, 'month')) {\n month = endMonth.subtract(1, 'month').toDate();\n }\n }\n return month;\n }, [currentMonth, calendarProps?.endMonth]);\n\n // 1st click will select the start date.\n // 2nd click will select the end date.\n // 3rd click will select the start date again.\n const handleSelect = (range: DateRange, selectedDay: Date) => {\n // TODO: Remove custom logic and reuse the default logic from react-day-picker\n let newRange: DateRange;\n\n if (currentRangeField === 'from') {\n // First click - set from date and prepare for to date selection\n newRange = { from: selectedDay };\n setCurrentRangeField('to');\n } else {\n // Second click - setting to date\n const from = selectedRange.from;\n\n if (dayjs(selectedDay).isBefore(dayjs(from))) {\n // If selected date is before current from date, start new range\n newRange = { from: selectedDay };\n setCurrentRangeField('to');\n } else {\n // Set the to date\n newRange = { from, to: selectedDay };\n setCurrentRangeField('from');\n }\n }\n\n setInternalValue(newRange);\n onSelect(newRange);\n };\n\n function onOpenChange(open?: boolean) {\n const currOpen = Boolean(open);\n\n setShowCalendar(currOpen);\n\n // Reset selected range if calendar is closed and start or end date is empty\n if (!currOpen && (!startDate.length || !endDate.length)) {\n setInternalValue(prevSelectedRangeRef.current);\n onSelect(prevSelectedRangeRef.current);\n }\n\n // Update previous selected range reference when both start and end dates are selected\n if (!currOpen && startDate.length && endDate.length) {\n prevSelectedRangeRef.current = selectedRange;\n }\n }\n\n const defaultTrigger = (\n <Flex gap='medium' className={pickerGroupClassName}>\n <InputField\n size='small'\n placeholder='Select start date'\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n className={styles.datePickerInput}\n {...(inputFieldsProps.startDate ?? {})}\n value={startDate}\n readOnly\n />\n\n <InputField\n size='small'\n placeholder='Select end date'\n trailingIcon={showCalendarIcon ? <CalendarIcon /> : undefined}\n className={styles.datePickerInput}\n {...(inputFieldsProps.endDate ?? {})}\n value={endDate}\n readOnly\n />\n </Flex>\n );\n\n const trigger =\n typeof children === 'function'\n ? children({ startDate, endDate })\n : children || defaultTrigger;\n\n return (\n <Popover open={showCalendar} onOpenChange={onOpenChange}>\n <Popover.Trigger asChild>{trigger}</Popover.Trigger>\n <Popover.Content side={side} className={styles.calendarPopover}>\n <Calendar\n showOutsideDays={false}\n numberOfMonths={2}\n defaultMonth={selectedRange.from}\n required={true}\n {...calendarProps}\n timeZone={timeZone}\n mode='range'\n month={computedDefaultMonth}\n selected={selectedRange}\n onSelect={handleSelect}\n onMonthChange={setCurrentMonth}\n />\n {footer && (\n <Flex\n align='center'\n justify='center'\n className={styles.calendarFooter}\n >\n {footer}\n </Flex>\n )}\n </Popover.Content>\n </Popover>\n );\n}\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;AA+BgB,SAAA,WAAW,CAAC,EAC1B,IAAI,GAAG,KAAK,EACZ,UAAU,GAAG,YAAY,EACzB,gBAAgB,GAAG,EAAE,EACrB,aAAa,EACb,QAAQ,GAAG,MAAO,GAAC,EACnB,KAAK,EACL,YAAY,GAAG;IACb,EAAE,EAAE,IAAI,IAAI,EAAE;IACd,IAAI,EAAE,IAAI,IAAI,EAAE;CACjB,EACD,oBAAoB,EACpB,QAAQ,EACR,gBAAgB,GAAG,IAAI,EACvB,MAAM,EACN,QAAQ,EACS,EAAA;IACjB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAC7C,QAAQ,CAAc,MAAM,CAAC,CAAC;AAChC,IAAA,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;AAC1E,IAAA,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAEtE,IAAA,MAAM,aAAa,GAAG,KAAK,IAAI,aAAa,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AAEnD,IAAA,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI;UAChC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;UAC5C,EAAE,CAAC;AACP,IAAA,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE;UAC5B,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;UAC1C,EAAE,CAAC;;;AAIP,IAAA,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAK;QACxC,IAAI,KAAK,GAAG,YAAY,CAAC;AACzB,QAAA,IAAI,aAAa,EAAE,QAAQ,EAAE;YAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC/C,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;YAEtC,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;AACvC,gBAAA,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;aAChD;SACF;AACD,QAAA,OAAO,KAAK,CAAC;KACd,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;;;;AAK5C,IAAA,MAAM,YAAY,GAAG,CAAC,KAAgB,EAAE,WAAiB,KAAI;;AAE3D,QAAA,IAAI,QAAmB,CAAC;AAExB,QAAA,IAAI,iBAAiB,KAAK,MAAM,EAAE;;AAEhC,YAAA,QAAQ,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACjC,oBAAoB,CAAC,IAAI,CAAC,CAAC;SAC5B;aAAM;;AAEL,YAAA,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;AAEhC,YAAA,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;;AAE5C,gBAAA,QAAQ,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBACjC,oBAAoB,CAAC,IAAI,CAAC,CAAC;aAC5B;iBAAM;;gBAEL,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC;gBACrC,oBAAoB,CAAC,MAAM,CAAC,CAAC;aAC9B;SACF;QAED,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrB,KAAC,CAAC;IAEF,SAAS,YAAY,CAAC,IAAc,EAAA;AAClC,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAE/B,eAAe,CAAC,QAAQ,CAAC,CAAC;;AAG1B,QAAA,IAAI,CAAC,QAAQ,KAAK,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACvD,YAAA,gBAAgB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC/C,YAAA,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;SACxC;;QAGD,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE;AACnD,YAAA,oBAAoB,CAAC,OAAO,GAAG,aAAa,CAAC;SAC9C;KACF;IAED,MAAM,cAAc,IAClBA,sBAAA,CAAC,IAAI,EAAC,EAAA,GAAG,EAAC,QAAQ,EAAC,SAAS,EAAE,oBAAoB,EAAA,QAAA,EAAA,CAChDC,qBAAC,CAAA,UAAU,EACT,EAAA,IAAI,EAAC,OAAO,EACZ,WAAW,EAAC,mBAAmB,EAC/B,YAAY,EAAE,gBAAgB,GAAGA,qBAAA,CAAC,YAAY,EAAG,EAAA,CAAA,GAAG,SAAS,EAC7D,SAAS,EAAE,MAAM,CAAC,eAAe,EAC7B,IAAC,gBAAgB,CAAC,SAAS,IAAI,EAAE,CAAC,EACtC,KAAK,EAAE,SAAS,EAChB,QAAQ,EACR,IAAA,EAAA,CAAA,EAEFA,sBAAC,UAAU,EAAA,EACT,IAAI,EAAC,OAAO,EACZ,WAAW,EAAC,iBAAiB,EAC7B,YAAY,EAAE,gBAAgB,GAAGA,qBAAC,CAAA,YAAY,EAAG,EAAA,CAAA,GAAG,SAAS,EAC7D,SAAS,EAAE,MAAM,CAAC,eAAe,EAAA,IAC5B,gBAAgB,CAAC,OAAO,IAAI,EAAE,CAAC,EACpC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAA,IAAA,EAAA,CACR,CACG,EAAA,CAAA,CACR,CAAC;AAEF,IAAA,MAAM,OAAO,GACX,OAAO,QAAQ,KAAK,UAAU;UAC1B,QAAQ,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAClC,UAAE,QAAQ,IAAI,cAAc,CAAC;IAEjC,QACED,sBAAC,CAAA,OAAO,EAAC,EAAA,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAA,QAAA,EAAA,CACrDC,sBAAC,OAAO,CAAC,OAAO,EAAA,EAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EAAE,OAAO,EAAmB,CAAA,EACpDD,sBAAC,CAAA,OAAO,CAAC,OAAO,IAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,eAAe,EAC5D,QAAA,EAAA,CAAAC,qBAAA,CAAC,QAAQ,EAAA,EACP,eAAe,EAAE,KAAK,EACtB,cAAc,EAAE,CAAC,EACjB,YAAY,EAAE,aAAa,CAAC,IAAI,EAChC,QAAQ,EAAE,IAAI,EAAA,GACV,aAAa,EACjB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,YAAY,EACtB,aAAa,EAAE,eAAe,EAAA,CAC9B,EACD,MAAM,KACLA,qBAAA,CAAC,IAAI,EAAA,EACH,KAAK,EAAC,QAAQ,EACd,OAAO,EAAC,QAAQ,EAChB,SAAS,EAAE,MAAM,CAAC,cAAc,EAAA,QAAA,EAE/B,MAAM,EAAA,CACF,CACR,CAAA,EAAA,CACe,CACV,EAAA,CAAA,EACV;AACJ;;;;"}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('../../node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.cjs');
4
+ var index$1 = require('../../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.cjs');
5
+ var colorPickerRoot = require('./color-picker-root.cjs');
6
+ var colorPicker_module = require('./color-picker.module.css.cjs');
7
+ var index = require('../../node_modules/.pnpm/@radix-ui_react-slider@1.3.5_@types_react-dom@18.0.11_@types_react@18.2.12_react-dom@18.3.1_react@18.2.0__react@18.2.0/node_modules/@radix-ui/react-slider/dist/index.cjs');
8
+
9
+ const ColorPickerAlpha = ({ className, ...props }) => {
10
+ const { alpha = 1, setColor } = colorPickerRoot.useColorPicker();
11
+ return (jsxRuntime.jsxRuntimeExports.jsxs(index.Root, { className: index$1.cx(colorPicker_module.default.sliderRoot, className), max: 100, onValueChange: ([alpha]) => setColor({ alpha: alpha / 100 }), step: 1, value: [alpha * 100], ...props, children: [jsxRuntime.jsxRuntimeExports.jsxs(index.Track, { className: index$1.cx(colorPicker_module.default.sliderTrack, colorPicker_module.default.alphaTrack), children: [jsxRuntime.jsxRuntimeExports.jsx("div", { className: colorPicker_module.default.alphaTrackGradient }), jsxRuntime.jsxRuntimeExports.jsx(index.Range, { className: colorPicker_module.default.sliderRange })] }), jsxRuntime.jsxRuntimeExports.jsx(index.Thumb, { className: colorPicker_module.default.sliderThumb })] }));
12
+ };
13
+
14
+ exports.ColorPickerAlpha = ColorPickerAlpha;
15
+ //# sourceMappingURL=color-picker-alpha.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-picker-alpha.cjs","sources":["../../../components/color-picker/color-picker-alpha.tsx"],"sourcesContent":["import { cx } from 'class-variance-authority';\nimport { Slider } from 'radix-ui';\nimport { type ComponentProps } from 'react';\nimport { useColorPicker } from './color-picker-root';\nimport styles from './color-picker.module.css';\n\nexport type ColorPickerAlphaProps = ComponentProps<typeof Slider.Root>;\n\nexport const ColorPickerAlpha = ({\n className,\n ...props\n}: ColorPickerAlphaProps) => {\n const { alpha = 1, setColor } = useColorPicker();\n return (\n <Slider.Root\n className={cx(styles.sliderRoot, className)}\n max={100}\n onValueChange={([alpha]) => setColor({ alpha: alpha / 100 })}\n step={1}\n value={[alpha * 100]}\n {...props}\n >\n <Slider.Track className={cx(styles.sliderTrack, styles.alphaTrack)}>\n <div className={styles.alphaTrackGradient} />\n <Slider.Range className={styles.sliderRange} />\n </Slider.Track>\n <Slider.Thumb className={styles.sliderThumb} />\n </Slider.Root>\n );\n};\n"],"names":["useColorPicker","_jsxs","Slider.Root","cx","styles","Slider.Track","_jsx","Slider.Range","Slider.Thumb"],"mappings":";;;;;;;;AAQO,MAAM,gBAAgB,GAAG,CAAC,EAC/B,SAAS,EACT,GAAG,KAAK,EACc,KAAI;IAC1B,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAGA,8BAAc,EAAE,CAAC;IACjD,QACEC,kCAACC,UAAW,EACV,EAAA,SAAS,EAAEC,UAAE,CAACC,0BAAM,CAAC,UAAU,EAAE,SAAS,CAAC,EAC3C,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE,CAAC,EAC5D,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,EAAA,GAChB,KAAK,EAET,QAAA,EAAA,CAAAH,iCAAA,CAACI,WAAY,EAAA,EAAC,SAAS,EAAEF,UAAE,CAACC,0BAAM,CAAC,WAAW,EAAEA,0BAAM,CAAC,UAAU,CAAC,EAChE,QAAA,EAAA,CAAAE,gCAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAEF,0BAAM,CAAC,kBAAkB,EAAI,CAAA,EAC7CE,iCAACC,WAAY,EAAA,EAAC,SAAS,EAAEH,0BAAM,CAAC,WAAW,EAAI,CAAA,CAAA,EAAA,CAClC,EACfE,gCAAA,CAACE,WAAY,EAAC,EAAA,SAAS,EAAEJ,0BAAM,CAAC,WAAW,EAAA,CAAI,CACnC,EAAA,CAAA,EACd;AACJ;;;;"}