@ryanhe919/lumen-ui 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/ErrorMessage-CbE7emgD.cjs +26 -0
  2. package/dist/ErrorMessage-CbE7emgD.cjs.map +1 -0
  3. package/dist/ErrorMessage-Dt4cJ-sy.js +27 -0
  4. package/dist/ErrorMessage-Dt4cJ-sy.js.map +1 -0
  5. package/dist/{LMButton-B258yfky.cjs → LMButton-ByInEqMk.cjs} +15 -11
  6. package/dist/LMButton-ByInEqMk.cjs.map +1 -0
  7. package/dist/{LMButton-S4xQSohi.js → LMButton-DH7s4i80.js} +16 -12
  8. package/dist/LMButton-DH7s4i80.js.map +1 -0
  9. package/dist/{LMCard-D_K051f2.cjs → LMCard-lJGrsAzY.cjs} +9 -6
  10. package/dist/LMCard-lJGrsAzY.cjs.map +1 -0
  11. package/dist/{LMCard-D7ABNC95.js → LMCard-uuWNjVQL.js} +9 -6
  12. package/dist/LMCard-uuWNjVQL.js.map +1 -0
  13. package/dist/{LMCheckbox-C2YvEQ8f.cjs → LMCheckbox-C5gRhXJk.cjs} +11 -34
  14. package/dist/LMCheckbox-C5gRhXJk.cjs.map +1 -0
  15. package/dist/{LMCheckbox-DaaJRjKt.js → LMCheckbox-DPg4CldM.js} +11 -34
  16. package/dist/LMCheckbox-DPg4CldM.js.map +1 -0
  17. package/dist/{LMDatePicker-DSv28BFH.js → LMDatePicker-C7R0ByJ-.js} +5 -1
  18. package/dist/LMDatePicker-C7R0ByJ-.js.map +1 -0
  19. package/dist/{LMDatePicker-BlUwN4On.cjs → LMDatePicker-lH-8-HzG.cjs} +5 -1
  20. package/dist/LMDatePicker-lH-8-HzG.cjs.map +1 -0
  21. package/dist/{LMEmpty-BedQxpbi.cjs → LMEmpty-BCf4K8iH.cjs} +7 -6
  22. package/dist/LMEmpty-BCf4K8iH.cjs.map +1 -0
  23. package/dist/{LMEmpty-DzHM1fOb.js → LMEmpty-C499qRrR.js} +7 -6
  24. package/dist/LMEmpty-C499qRrR.js.map +1 -0
  25. package/dist/{LMField-DhDHj64z.cjs → LMField-BRaviP2p.cjs} +3 -2
  26. package/dist/LMField-BRaviP2p.cjs.map +1 -0
  27. package/dist/{LMField-BS-DSEya.js → LMField-DkRk9Q8-.js} +3 -2
  28. package/dist/LMField-DkRk9Q8-.js.map +1 -0
  29. package/dist/{LMInput-D9csGyhj.js → LMInput-Be2KkPOW.js} +21 -43
  30. package/dist/LMInput-Be2KkPOW.js.map +1 -0
  31. package/dist/{LMInput-CVjawj1F.cjs → LMInput-O55xkiRS.cjs} +20 -42
  32. package/dist/LMInput-O55xkiRS.cjs.map +1 -0
  33. package/dist/{LMModal-BCVVPLot.cjs → LMModal-BgxF1xOT.cjs} +2 -2
  34. package/dist/LMModal-BgxF1xOT.cjs.map +1 -0
  35. package/dist/{LMModal-DCJPlfA4.js → LMModal-CZF26Ask.js} +2 -2
  36. package/dist/LMModal-CZF26Ask.js.map +1 -0
  37. package/dist/{LMNumberInput-B1tU7T_W.cjs → LMNumberInput-DQaLVoud.cjs} +30 -39
  38. package/dist/LMNumberInput-DQaLVoud.cjs.map +1 -0
  39. package/dist/{LMNumberInput-BI5_OEx4.js → LMNumberInput-gnRvWRly.js} +31 -40
  40. package/dist/LMNumberInput-gnRvWRly.js.map +1 -0
  41. package/dist/{LMRadio-CHn6nFSy.cjs → LMRadio-BVBwm1rk.cjs} +11 -37
  42. package/dist/LMRadio-BVBwm1rk.cjs.map +1 -0
  43. package/dist/{LMRadio-UQLNgTMF.js → LMRadio-C0ZL0hVK.js} +11 -37
  44. package/dist/LMRadio-C0ZL0hVK.js.map +1 -0
  45. package/dist/{LMSearchInput-nBlAX734.cjs → LMSearchInput-BDJVh4Vs.cjs} +25 -31
  46. package/dist/LMSearchInput-BDJVh4Vs.cjs.map +1 -0
  47. package/dist/{LMSearchInput-CIvVkEf2.js → LMSearchInput-DQovqMTN.js} +26 -32
  48. package/dist/LMSearchInput-DQovqMTN.js.map +1 -0
  49. package/dist/{LMSelect-B-MWX2JI.js → LMSelect-BPfW-AHI.js} +37 -48
  50. package/dist/LMSelect-BPfW-AHI.js.map +1 -0
  51. package/dist/{LMSelect-ByQcUp2S.cjs → LMSelect-xIVolEhx.cjs} +37 -48
  52. package/dist/LMSelect-xIVolEhx.cjs.map +1 -0
  53. package/dist/{LMStatCard-D5HV9r6d.js → LMStatCard-CdyIDhrA.js} +11 -6
  54. package/dist/LMStatCard-CdyIDhrA.js.map +1 -0
  55. package/dist/{LMStatCard-MXs9Z0qH.cjs → LMStatCard-Do5f2Map.cjs} +11 -6
  56. package/dist/LMStatCard-Do5f2Map.cjs.map +1 -0
  57. package/dist/{LMSwitch-CP1_nrfU.js → LMSwitch-BqhucDO0.js} +3 -31
  58. package/dist/LMSwitch-BqhucDO0.js.map +1 -0
  59. package/dist/{LMSwitch-DYoSH6wE.cjs → LMSwitch-BxVqTSUH.cjs} +3 -31
  60. package/dist/LMSwitch-BxVqTSUH.cjs.map +1 -0
  61. package/dist/{LMTable-j1ZzAzXB.cjs → LMTable-Be9FK8bz.cjs} +7 -4
  62. package/dist/LMTable-Be9FK8bz.cjs.map +1 -0
  63. package/dist/{LMTable-Cp8HZqiV.js → LMTable-IGmHFhnV.js} +7 -4
  64. package/dist/LMTable-IGmHFhnV.js.map +1 -0
  65. package/dist/{LMTabs-D5n9lB8X.js → LMTabs-Cjp3oiNv.js} +2 -2
  66. package/dist/{LMTabs-D5n9lB8X.js.map → LMTabs-Cjp3oiNv.js.map} +1 -1
  67. package/dist/{LMTabs-NPmOzPat.cjs → LMTabs-DEYx2gOH.cjs} +2 -2
  68. package/dist/{LMTabs-NPmOzPat.cjs.map → LMTabs-DEYx2gOH.cjs.map} +1 -1
  69. package/dist/{LMTextarea-5dVVPeL2.js → LMTextarea-BNacTCNn.js} +20 -28
  70. package/dist/LMTextarea-BNacTCNn.js.map +1 -0
  71. package/dist/{LMTextarea-yG0OBZjA.cjs → LMTextarea-DRi6gaFW.cjs} +20 -28
  72. package/dist/LMTextarea-DRi6gaFW.cjs.map +1 -0
  73. package/dist/cn-I2jp-M-K.cjs +6 -0
  74. package/dist/cn-I2jp-M-K.cjs.map +1 -0
  75. package/dist/cn-wDEkOmcn.js +7 -0
  76. package/dist/cn-wDEkOmcn.js.map +1 -0
  77. package/dist/components/Chat/LMChatBubble/LMChatBubble.d.ts.map +1 -1
  78. package/dist/components/Chat/LMChatContainer/LMChatContainer.d.ts.map +1 -1
  79. package/dist/components/Chat/LMChatInput/LMChatInput.d.ts.map +1 -1
  80. package/dist/components/Chat/LMChatMessage/LMChatMessage.d.ts.map +1 -1
  81. package/dist/components/Chat/LMMarkdownRenderer/LMMarkdownRenderer.d.ts.map +1 -1
  82. package/dist/components/Chat/LMTypingIndicator/LMTypingIndicator.d.ts.map +1 -1
  83. package/dist/components/DataDisplay/LMCard/LMCard.d.ts.map +1 -1
  84. package/dist/components/DataDisplay/LMEmpty/LMEmpty.d.ts.map +1 -1
  85. package/dist/components/DataDisplay/LMStatCard/LMStatCard.d.ts.map +1 -1
  86. package/dist/components/DataDisplay/LMTable/LMTable.d.ts.map +1 -1
  87. package/dist/components/Feedback/LMModal/LMModal.d.ts +1 -1
  88. package/dist/components/Feedback/LMModal/LMModal.d.ts.map +1 -1
  89. package/dist/components/Form/LMCheckbox/LMCheckbox.d.ts.map +1 -1
  90. package/dist/components/Form/LMDatePicker/LMDatePicker.d.ts.map +1 -1
  91. package/dist/components/Form/LMField/LMField.d.ts.map +1 -1
  92. package/dist/components/Form/LMInput/LMInput.d.ts +1 -1
  93. package/dist/components/Form/LMInput/LMInput.d.ts.map +1 -1
  94. package/dist/components/Form/LMNumberInput/LMNumberInput.d.ts +1 -1
  95. package/dist/components/Form/LMNumberInput/LMNumberInput.d.ts.map +1 -1
  96. package/dist/components/Form/LMRadio/LMRadio.d.ts.map +1 -1
  97. package/dist/components/Form/LMSearchInput/LMSearchInput.d.ts +1 -1
  98. package/dist/components/Form/LMSearchInput/LMSearchInput.d.ts.map +1 -1
  99. package/dist/components/Form/LMSelect/LMSelect.d.ts.map +1 -1
  100. package/dist/components/Form/LMSwitch/LMSwitch.d.ts.map +1 -1
  101. package/dist/components/Form/LMTextarea/LMTextarea.d.ts +1 -1
  102. package/dist/components/Form/LMTextarea/LMTextarea.d.ts.map +1 -1
  103. package/dist/components/General/LMButton/LMButton.d.ts.map +1 -1
  104. package/dist/components/_internal/ErrorMessage.d.ts +9 -0
  105. package/dist/components/_internal/ErrorMessage.d.ts.map +1 -0
  106. package/dist/components/button/index.cjs +1 -1
  107. package/dist/components/button/index.js +1 -1
  108. package/dist/components/card/index.cjs +1 -1
  109. package/dist/components/card/index.js +1 -1
  110. package/dist/components/checkbox/index.cjs +1 -1
  111. package/dist/components/checkbox/index.js +1 -1
  112. package/dist/components/date-picker/index.cjs +1 -1
  113. package/dist/components/date-picker/index.js +1 -1
  114. package/dist/components/empty/index.cjs +1 -1
  115. package/dist/components/empty/index.js +1 -1
  116. package/dist/components/field/index.cjs +1 -1
  117. package/dist/components/field/index.js +1 -1
  118. package/dist/components/input/index.cjs +1 -1
  119. package/dist/components/input/index.js +1 -1
  120. package/dist/components/modal/index.cjs +1 -1
  121. package/dist/components/modal/index.js +1 -1
  122. package/dist/components/number-input/index.cjs +1 -1
  123. package/dist/components/number-input/index.js +1 -1
  124. package/dist/components/radio/index.cjs +1 -1
  125. package/dist/components/radio/index.js +1 -1
  126. package/dist/components/search-input/index.cjs +1 -1
  127. package/dist/components/search-input/index.js +1 -1
  128. package/dist/components/select/index.cjs +1 -1
  129. package/dist/components/select/index.js +1 -1
  130. package/dist/components/stat-card/index.cjs +1 -1
  131. package/dist/components/stat-card/index.js +1 -1
  132. package/dist/components/switch/index.cjs +1 -1
  133. package/dist/components/switch/index.js +1 -1
  134. package/dist/components/table/index.cjs +1 -1
  135. package/dist/components/table/index.js +1 -1
  136. package/dist/components/tabs/index.cjs +1 -1
  137. package/dist/components/tabs/index.js +1 -1
  138. package/dist/components/textarea/index.cjs +1 -1
  139. package/dist/components/textarea/index.js +1 -1
  140. package/dist/index.cjs +122 -123
  141. package/dist/index.cjs.map +1 -1
  142. package/dist/index.js +121 -122
  143. package/dist/index.js.map +1 -1
  144. package/dist/style.css +6 -0
  145. package/package.json +2 -1
  146. package/dist/LMButton-B258yfky.cjs.map +0 -1
  147. package/dist/LMButton-S4xQSohi.js.map +0 -1
  148. package/dist/LMCard-D7ABNC95.js.map +0 -1
  149. package/dist/LMCard-D_K051f2.cjs.map +0 -1
  150. package/dist/LMCheckbox-C2YvEQ8f.cjs.map +0 -1
  151. package/dist/LMCheckbox-DaaJRjKt.js.map +0 -1
  152. package/dist/LMDatePicker-BlUwN4On.cjs.map +0 -1
  153. package/dist/LMDatePicker-DSv28BFH.js.map +0 -1
  154. package/dist/LMEmpty-BedQxpbi.cjs.map +0 -1
  155. package/dist/LMEmpty-DzHM1fOb.js.map +0 -1
  156. package/dist/LMField-BS-DSEya.js.map +0 -1
  157. package/dist/LMField-DhDHj64z.cjs.map +0 -1
  158. package/dist/LMInput-CVjawj1F.cjs.map +0 -1
  159. package/dist/LMInput-D9csGyhj.js.map +0 -1
  160. package/dist/LMModal-BCVVPLot.cjs.map +0 -1
  161. package/dist/LMModal-DCJPlfA4.js.map +0 -1
  162. package/dist/LMNumberInput-B1tU7T_W.cjs.map +0 -1
  163. package/dist/LMNumberInput-BI5_OEx4.js.map +0 -1
  164. package/dist/LMRadio-CHn6nFSy.cjs.map +0 -1
  165. package/dist/LMRadio-UQLNgTMF.js.map +0 -1
  166. package/dist/LMSearchInput-CIvVkEf2.js.map +0 -1
  167. package/dist/LMSearchInput-nBlAX734.cjs.map +0 -1
  168. package/dist/LMSelect-B-MWX2JI.js.map +0 -1
  169. package/dist/LMSelect-ByQcUp2S.cjs.map +0 -1
  170. package/dist/LMStatCard-D5HV9r6d.js.map +0 -1
  171. package/dist/LMStatCard-MXs9Z0qH.cjs.map +0 -1
  172. package/dist/LMSwitch-CP1_nrfU.js.map +0 -1
  173. package/dist/LMSwitch-DYoSH6wE.cjs.map +0 -1
  174. package/dist/LMTable-Cp8HZqiV.js.map +0 -1
  175. package/dist/LMTable-j1ZzAzXB.cjs.map +0 -1
  176. package/dist/LMTextarea-5dVVPeL2.js.map +0 -1
  177. package/dist/LMTextarea-yG0OBZjA.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMModal-DCJPlfA4.js","sources":["../src/components/Feedback/LMModal/LMModal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useCallback, memo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { LMButton } from '../../General/LMButton'\nimport {\n COMPONENT_SIZE_ORDER,\n SIZE_HEADING_CLASSES,\n SIZE_MODAL_CONFIG,\n clampComponentSize,\n} from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nconst MODAL_FOOTER_SIZE_MAP: Record<ComponentSize, ComponentSize> = {\n xs: 'xs',\n sm: 'xs',\n md: 'sm',\n lg: 'md',\n xl: 'md',\n '2xl': 'lg',\n}\n\nconst CloseIcon: React.FC = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\nconst WindowIcon: React.FC = () => (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n)\n\nexport interface LMModalProps {\n /** Visibility */\n visible: boolean\n /** Title */\n title?: string\n /** Content */\n children: React.ReactNode\n /** Custom footer */\n footer?: React.ReactNode\n /** Close callback */\n onClose?: () => void\n /** OK callback */\n onOk?: () => void\n /** Cancel callback */\n onCancel?: () => void\n /** OK button text */\n okText?: string\n /** Cancel button text */\n cancelText?: string\n /** Show OK button */\n showOk?: boolean\n /** Show Cancel button */\n showCancel?: boolean\n /** OK loading state */\n okLoading?: boolean\n /** Cancel loading state */\n cancelLoading?: boolean\n /** Show mask */\n mask?: boolean\n /** Click mask to close */\n maskClosable?: boolean\n /** Show close button */\n closable?: boolean\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** Header icon */\n headerIcon?: React.ReactNode\n /** Width */\n width?: string | number\n /** Height */\n height?: string | number\n /** Size preset */\n size?: ComponentSize\n /** Custom class name */\n className?: string\n /** Custom style */\n style?: React.CSSProperties\n /** Center vertically */\n centered?: boolean\n /** Fullscreen mode */\n fullscreen?: boolean\n /** Animation duration (ms) */\n animationDuration?: number\n /** Enable animation */\n animation?: boolean\n}\n\nconst LMModal: React.FC<LMModalProps> = ({\n visible,\n title,\n children,\n footer,\n onClose,\n onOk,\n onCancel,\n okText = 'Confirm',\n cancelText = 'Cancel',\n showOk = true,\n showCancel = true,\n okLoading = false,\n cancelLoading = false,\n mask = true,\n maskClosable = false,\n closable = true,\n closeIcon,\n headerIcon,\n width,\n height,\n size = 'md',\n className = '',\n style,\n centered = true,\n fullscreen = false,\n animationDuration: _animationDuration = 300,\n animation = true,\n}) => {\n // Note: animationDuration is kept for API compatibility but uses CSS variables now\n void _animationDuration\n const modalRef = useRef<HTMLDivElement>(null)\n const backdropRef = useRef<HTMLDivElement>(null)\n const resolvedSize = clampComponentSize(size, COMPONENT_SIZE_ORDER)\n const footerButtonSize = MODAL_FOOTER_SIZE_MAP[resolvedSize]\n\n const getModalStyles = () => {\n // Apple-like refined modal styling\n const baseStyles: React.CSSProperties = {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n borderColor: 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-xl)',\n borderRadius: 'var(--lm-radius-xl)',\n border: '1px solid var(--lm-border-default)',\n backdropFilter: 'blur(20px) saturate(180%)',\n WebkitBackdropFilter: 'blur(20px) saturate(180%)',\n ...style,\n }\n\n if (fullscreen) {\n baseStyles.width = '100vw'\n baseStyles.height = '100vh'\n baseStyles.maxWidth = '100vw'\n baseStyles.maxHeight = '100vh'\n baseStyles.borderRadius = '0'\n } else {\n baseStyles.width = width\n ? typeof width === 'number'\n ? `${width}px`\n : width\n : SIZE_MODAL_CONFIG[resolvedSize].width\n baseStyles.maxWidth = SIZE_MODAL_CONFIG[resolvedSize].maxWidth\n if (height) {\n baseStyles.height = typeof height === 'number' ? `${height}px` : height\n }\n }\n\n return baseStyles\n }\n\n // Apple-like refined backdrop\n const getBackdropStyles = () =>\n mask\n ? {\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n backdropFilter: 'blur(8px) saturate(150%)',\n WebkitBackdropFilter: 'blur(8px) saturate(150%)',\n }\n : { backgroundColor: 'transparent', backdropFilter: 'none' }\n\n const handleOk = () => (onOk ? onOk() : onClose?.())\n\n const handleCancel = useCallback(() => {\n if (onCancel) onCancel()\n else onClose?.()\n }, [onCancel, onClose])\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (maskClosable && e.target === backdropRef.current) handleCancel()\n }\n\n useEffect(() => {\n const keyHandler = (e: KeyboardEvent) => {\n if (visible && e.key === 'Escape') handleCancel()\n }\n if (visible) {\n document.addEventListener('keydown', keyHandler)\n document.body.style.overflow = 'hidden'\n }\n return () => {\n document.removeEventListener('keydown', keyHandler)\n if (visible) document.body.style.overflow = ''\n }\n }, [visible, handleCancel])\n\n const defaultFooter = (\n <div\n className=\"flex items-center justify-end gap-3 px-6 py-4 border-t\"\n style={{ borderColor: 'var(--lm-border-default)' }}\n >\n {showCancel && (\n <LMButton\n variant=\"secondary\"\n size={footerButtonSize}\n onClick={handleCancel}\n disabled={cancelLoading}\n loading={cancelLoading}\n >\n {cancelText}\n </LMButton>\n )}\n {showOk && (\n <LMButton\n variant=\"primary\"\n size={footerButtonSize}\n onClick={handleOk}\n disabled={okLoading}\n loading={okLoading}\n >\n {okText}\n </LMButton>\n )}\n </div>\n )\n\n // Apple-like refined animation with spring easing\n const getAnimationClasses = () => {\n if (!animation) return ''\n // Use faster, snappier duration for Apple-like feel\n return 'transition-all duration-200 ease-out'\n }\n\n if (!visible) return null\n\n const modalContent = (\n <div\n ref={backdropRef}\n className={`fixed inset-0 z-50 flex ${centered ? 'items-center' : 'items-start pt-20'} justify-center ${getAnimationClasses()}`}\n style={getBackdropStyles()}\n onClick={handleBackdropClick}\n >\n <div\n ref={modalRef}\n className={`relative ${getAnimationClasses()} ${className}`}\n style={getModalStyles()}\n onClick={(e) => e.stopPropagation()}\n >\n {(title || closable) && (\n <div\n className=\"flex items-center justify-between p-6 pb-4 border-b\"\n style={{ borderColor: 'var(--lm-border-default)' }}\n >\n {title && (\n <h3\n className={`font-semibold flex items-center gap-2 ${SIZE_HEADING_CLASSES[resolvedSize]}`}\n style={{ color: 'var(--lm-text-primary)' }}\n >\n <span style={{ color: 'var(--lm-text-secondary)' }}>\n {headerIcon || <WindowIcon />}\n </span>\n {title}\n </h3>\n )}\n {closable && (\n <LMButton\n variant=\"ghost\"\n size=\"xs\"\n onClick={handleCancel}\n leftIcon={closeIcon || <CloseIcon />}\n className=\"w-8 h-8 p-0\"\n aria-label=\"Close dialog\"\n title=\"Close\"\n style={{\n borderRadius: '0.5rem',\n backgroundColor: 'var(--lm-bg-paper)',\n borderColor: 'var(--lm-border-default)',\n color: 'var(--lm-text-secondary)',\n }}\n />\n )}\n </div>\n )}\n\n <div className=\"p-6\">{children}</div>\n\n {footer !== undefined\n ? footer\n : showOk || showCancel\n ? defaultFooter\n : null}\n </div>\n </div>\n )\n\n return createPortal(modalContent, document.body)\n}\n\nexport default memo(LMModal)\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMNumberInput-B1tU7T_W.cjs","sources":["../src/components/Form/LMNumberInput/LMNumberInput.tsx"],"sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n useId,\n} from 'react'\nimport { SIZE_INPUT_CONFIG } from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMNumberInputProps {\n /** Current value (controlled) */\n value?: number | null\n /** Change callback */\n onChange?: (value: number | null) => void\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Placeholder */\n placeholder?: string\n /** Disabled state */\n disabled?: boolean\n /** Class name */\n className?: string\n /** Form field name */\n name?: string\n /** Size */\n size?: ComponentSize\n /** Minimum value */\n min?: number\n /** Maximum value */\n max?: number\n /** Step */\n step?: number\n /** Decimal precision */\n precision?: number\n /** Show increment/decrement controls */\n showControls?: boolean\n /** Prefix text */\n prefix?: string\n /** Suffix text */\n suffix?: string\n}\n\nconst LMNumberInput: React.FC<LMNumberInputProps> = ({\n value,\n onChange,\n error = false,\n errorMessage,\n placeholder = 'Enter number...',\n disabled = false,\n className = '',\n name,\n size = 'md',\n min,\n max,\n step = 1,\n precision = 0,\n showControls = true,\n prefix,\n suffix,\n}) => {\n const [inputValue, setInputValue] = useState<string>(\n value !== null && value !== undefined ? String(value) : ''\n )\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const errId = `lm-ni-err-${useId()}`\n\n const formatNumber = useCallback(\n (num: number): string => {\n if (!Number.isFinite(num)) return ''\n if (precision <= 0) return String(Math.round(num))\n return num.toFixed(precision)\n },\n [precision]\n )\n\n useEffect(() => {\n if (value === undefined || value === null) {\n setInputValue('')\n } else if (!isFocused) {\n setInputValue(formatNumber(value))\n }\n }, [value, isFocused, formatNumber])\n\n const baseClassName = `\n w-full ${SIZE_INPUT_CONFIG[size].padding} ${SIZE_INPUT_CONFIG[size].height} ${SIZE_INPUT_CONFIG[size].fontSize}\n backdrop-blur-md border rounded-2xl\n focus:ring-2 focus:outline-none transition-all duration-300\n shadow-sm\n ${showControls ? 'pr-10' : ''}\n ${prefix ? 'pl-10' : ''}\n ${suffix ? 'pr-10' : ''}\n ${className}\n [&::-webkit-outer-spin-button]:appearance-none\n [&::-webkit-inner-spin-button]:appearance-none\n [-moz-appearance:textfield]\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getNumberInputStyles = () => {\n const base = {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n borderColor: error\n ? 'var(--lm-error-300)'\n : isFocused\n ? 'var(--lm-primary-400)'\n : 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n } as React.CSSProperties\n\n return {\n ...base,\n '--tw-ring-color': error\n ? 'var(--lm-error-400)'\n : 'var(--lm-primary-400)',\n '--tw-ring-opacity': '0.3',\n }\n }\n\n const getDisabledStyles = () =>\n disabled\n ? {\n backgroundColor: 'var(--lm-bg-paper)',\n color: 'var(--lm-text-disabled)',\n cursor: 'not-allowed',\n opacity: 0.6,\n }\n : {}\n\n const getIconStyles = () => {\n if (error) return { color: 'var(--lm-error-400)' }\n if (isFocused) return { color: 'var(--lm-primary-500)' }\n return { color: 'var(--lm-text-secondary)' }\n }\n\n const getControlButtonStyles = () => ({\n backgroundColor: 'var(--lm-bg-paper)',\n color: 'var(--lm-text-secondary)',\n borderColor: 'var(--lm-border-light)',\n })\n\n const getHoverControlButtonStyles = () => ({\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n })\n\n const parseNumber = (str: string): number | null => {\n const n = parseFloat(str)\n return Number.isNaN(n) ? null : n\n }\n\n const clamp = (num: number): number => {\n let v = num\n if (min !== undefined) v = Math.max(v, min)\n if (max !== undefined) v = Math.min(v, max)\n return v\n }\n\n const stepFrom = useMemo(() => min ?? 0, [min])\n const alignToStep = (num: number) => {\n const offset = num - stepFrom\n const k = Math.round(offset / step)\n const next = stepFrom + k * step\n return Number(next.toFixed(Math.max(precision, 12)))\n }\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const val = event.target.value\n setInputValue(val)\n\n if (val.trim() === '') {\n onChange?.(null)\n return\n }\n\n const num = parseNumber(val)\n if (num === null) return\n\n const clamped = clamp(num)\n if (clamped !== num) return\n onChange?.(num)\n }\n\n const changeByStep = (delta: number) => {\n if (disabled) return\n\n const current = parseNumber(inputValue)\n const base = current ?? min ?? 0\n const raw = base + delta * step\n const clamped = clamp(raw)\n const aligned = alignToStep(clamped)\n\n setInputValue(formatNumber(aligned))\n onChange?.(aligned)\n }\n\n const handleIncrement = () => changeByStep(+1)\n const handleDecrement = () => changeByStep(-1)\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n handleIncrement()\n } else if (event.key === 'ArrowDown') {\n event.preventDefault()\n handleDecrement()\n }\n }\n\n const handleFocus = () => setIsFocused(true)\n const handleBlur = () => {\n setIsFocused(false)\n\n if (inputValue.trim() === '') {\n setInputValue('')\n if (value !== null) onChange?.(null)\n return\n }\n\n const num = parseNumber(inputValue)\n if (num === null) {\n if (typeof value === 'number') {\n setInputValue(formatNumber(clamp(value)))\n } else {\n setInputValue('')\n if (value !== null) onChange?.(null)\n }\n return\n }\n let v = clamp(num)\n v = alignToStep(v)\n const formatted = formatNumber(v)\n setInputValue(formatted)\n if (v !== value) onChange?.(v)\n }\n\n const handleWheel: React.WheelEventHandler<HTMLInputElement> = (e) => {\n if (document.activeElement === inputRef.current) {\n e.preventDefault()\n }\n }\n\n const currentNum = parseNumber(inputValue)\n const incDisabled = useMemo(() => {\n if (disabled) return true\n const base = currentNum ?? min ?? 0\n return max !== undefined && base >= max\n }, [disabled, currentNum, min, max])\n\n const decDisabled = useMemo(() => {\n if (disabled) return true\n const base = currentNum ?? min ?? 0\n return min !== undefined && base <= min\n }, [disabled, currentNum, min])\n\n const ChevronUp = () => (\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n )\n\n const ChevronDown = () => (\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n )\n\n return (\n <div className=\"space-y-2\">\n <div className=\"relative group\">\n {prefix && (\n <div className=\"absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none z-10\">\n <span className=\"text-sm font-medium\" style={getIconStyles()}>\n {prefix}\n </span>\n </div>\n )}\n\n <input\n ref={inputRef}\n type=\"number\"\n name={name}\n value={inputValue}\n placeholder={placeholder}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n inputMode=\"decimal\"\n className={baseClassName}\n style={{ ...getNumberInputStyles(), ...getDisabledStyles() } as React.CSSProperties}\n aria-invalid={error || undefined}\n aria-describedby={errorMessage ? errId : undefined}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onWheel={handleWheel}\n onMouseEnter={(e) => {\n if (!disabled && !error && !isFocused) {\n e.currentTarget.style.borderColor = 'var(--lm-border-strong)'\n }\n }}\n onMouseLeave={(e) => {\n if (!disabled && !error && !isFocused) {\n e.currentTarget.style.borderColor = 'var(--lm-border-default)'\n }\n }}\n />\n\n {suffix && (\n <div\n className={`absolute inset-y-0 flex items-center pointer-events-none z-10 ${\n showControls ? 'right-10' : 'right-4'\n }`}\n >\n <span className=\"text-sm font-medium\" style={getIconStyles()}>\n {suffix}\n </span>\n </div>\n )}\n\n {showControls && (\n <div className=\"absolute inset-y-0 right-0 flex flex-col w-8\">\n <button\n type=\"button\"\n aria-label=\"Increment\"\n onClick={handleIncrement}\n disabled={incDisabled}\n className=\"flex-1 px-1 border-l border-b rounded-tr-2xl transition-colors duration-200 flex items-center justify-center\"\n style={getControlButtonStyles()}\n onMouseEnter={(e) => {\n if (!incDisabled)\n Object.assign(e.currentTarget.style, getHoverControlButtonStyles())\n }}\n onMouseLeave={(e) => {\n if (!incDisabled)\n Object.assign(e.currentTarget.style, getControlButtonStyles())\n }}\n >\n <ChevronUp />\n </button>\n <button\n type=\"button\"\n aria-label=\"Decrement\"\n onClick={handleDecrement}\n disabled={decDisabled}\n className=\"flex-1 px-1 border-l rounded-br-2xl transition-colors duration-200 flex items-center justify-center\"\n style={getControlButtonStyles()}\n onMouseEnter={(e) => {\n if (!decDisabled)\n Object.assign(e.currentTarget.style, getHoverControlButtonStyles())\n }}\n onMouseLeave={(e) => {\n if (!decDisabled)\n Object.assign(e.currentTarget.style, getControlButtonStyles())\n }}\n >\n <ChevronDown />\n </button>\n </div>\n )}\n </div>\n\n {errorMessage && (\n <p\n id={errId}\n className=\"text-xs flex items-center gap-1\"\n style={{ color: 'var(--lm-error-500)' }}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <svg className=\"w-3 h-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {errorMessage}\n </p>\n )}\n </div>\n )\n}\n\nexport default LMNumberInput\n"],"names":["useState","useRef","useId","useCallback","useEffect","SIZE_INPUT_CONFIG","useMemo","jsx","jsxs"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMNumberInput-BI5_OEx4.js","sources":["../src/components/Form/LMNumberInput/LMNumberInput.tsx"],"sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n useId,\n} from 'react'\nimport { SIZE_INPUT_CONFIG } from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMNumberInputProps {\n /** Current value (controlled) */\n value?: number | null\n /** Change callback */\n onChange?: (value: number | null) => void\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Placeholder */\n placeholder?: string\n /** Disabled state */\n disabled?: boolean\n /** Class name */\n className?: string\n /** Form field name */\n name?: string\n /** Size */\n size?: ComponentSize\n /** Minimum value */\n min?: number\n /** Maximum value */\n max?: number\n /** Step */\n step?: number\n /** Decimal precision */\n precision?: number\n /** Show increment/decrement controls */\n showControls?: boolean\n /** Prefix text */\n prefix?: string\n /** Suffix text */\n suffix?: string\n}\n\nconst LMNumberInput: React.FC<LMNumberInputProps> = ({\n value,\n onChange,\n error = false,\n errorMessage,\n placeholder = 'Enter number...',\n disabled = false,\n className = '',\n name,\n size = 'md',\n min,\n max,\n step = 1,\n precision = 0,\n showControls = true,\n prefix,\n suffix,\n}) => {\n const [inputValue, setInputValue] = useState<string>(\n value !== null && value !== undefined ? String(value) : ''\n )\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const errId = `lm-ni-err-${useId()}`\n\n const formatNumber = useCallback(\n (num: number): string => {\n if (!Number.isFinite(num)) return ''\n if (precision <= 0) return String(Math.round(num))\n return num.toFixed(precision)\n },\n [precision]\n )\n\n useEffect(() => {\n if (value === undefined || value === null) {\n setInputValue('')\n } else if (!isFocused) {\n setInputValue(formatNumber(value))\n }\n }, [value, isFocused, formatNumber])\n\n const baseClassName = `\n w-full ${SIZE_INPUT_CONFIG[size].padding} ${SIZE_INPUT_CONFIG[size].height} ${SIZE_INPUT_CONFIG[size].fontSize}\n backdrop-blur-md border rounded-2xl\n focus:ring-2 focus:outline-none transition-all duration-300\n shadow-sm\n ${showControls ? 'pr-10' : ''}\n ${prefix ? 'pl-10' : ''}\n ${suffix ? 'pr-10' : ''}\n ${className}\n [&::-webkit-outer-spin-button]:appearance-none\n [&::-webkit-inner-spin-button]:appearance-none\n [-moz-appearance:textfield]\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getNumberInputStyles = () => {\n const base = {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n borderColor: error\n ? 'var(--lm-error-300)'\n : isFocused\n ? 'var(--lm-primary-400)'\n : 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n } as React.CSSProperties\n\n return {\n ...base,\n '--tw-ring-color': error\n ? 'var(--lm-error-400)'\n : 'var(--lm-primary-400)',\n '--tw-ring-opacity': '0.3',\n }\n }\n\n const getDisabledStyles = () =>\n disabled\n ? {\n backgroundColor: 'var(--lm-bg-paper)',\n color: 'var(--lm-text-disabled)',\n cursor: 'not-allowed',\n opacity: 0.6,\n }\n : {}\n\n const getIconStyles = () => {\n if (error) return { color: 'var(--lm-error-400)' }\n if (isFocused) return { color: 'var(--lm-primary-500)' }\n return { color: 'var(--lm-text-secondary)' }\n }\n\n const getControlButtonStyles = () => ({\n backgroundColor: 'var(--lm-bg-paper)',\n color: 'var(--lm-text-secondary)',\n borderColor: 'var(--lm-border-light)',\n })\n\n const getHoverControlButtonStyles = () => ({\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n })\n\n const parseNumber = (str: string): number | null => {\n const n = parseFloat(str)\n return Number.isNaN(n) ? null : n\n }\n\n const clamp = (num: number): number => {\n let v = num\n if (min !== undefined) v = Math.max(v, min)\n if (max !== undefined) v = Math.min(v, max)\n return v\n }\n\n const stepFrom = useMemo(() => min ?? 0, [min])\n const alignToStep = (num: number) => {\n const offset = num - stepFrom\n const k = Math.round(offset / step)\n const next = stepFrom + k * step\n return Number(next.toFixed(Math.max(precision, 12)))\n }\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const val = event.target.value\n setInputValue(val)\n\n if (val.trim() === '') {\n onChange?.(null)\n return\n }\n\n const num = parseNumber(val)\n if (num === null) return\n\n const clamped = clamp(num)\n if (clamped !== num) return\n onChange?.(num)\n }\n\n const changeByStep = (delta: number) => {\n if (disabled) return\n\n const current = parseNumber(inputValue)\n const base = current ?? min ?? 0\n const raw = base + delta * step\n const clamped = clamp(raw)\n const aligned = alignToStep(clamped)\n\n setInputValue(formatNumber(aligned))\n onChange?.(aligned)\n }\n\n const handleIncrement = () => changeByStep(+1)\n const handleDecrement = () => changeByStep(-1)\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n handleIncrement()\n } else if (event.key === 'ArrowDown') {\n event.preventDefault()\n handleDecrement()\n }\n }\n\n const handleFocus = () => setIsFocused(true)\n const handleBlur = () => {\n setIsFocused(false)\n\n if (inputValue.trim() === '') {\n setInputValue('')\n if (value !== null) onChange?.(null)\n return\n }\n\n const num = parseNumber(inputValue)\n if (num === null) {\n if (typeof value === 'number') {\n setInputValue(formatNumber(clamp(value)))\n } else {\n setInputValue('')\n if (value !== null) onChange?.(null)\n }\n return\n }\n let v = clamp(num)\n v = alignToStep(v)\n const formatted = formatNumber(v)\n setInputValue(formatted)\n if (v !== value) onChange?.(v)\n }\n\n const handleWheel: React.WheelEventHandler<HTMLInputElement> = (e) => {\n if (document.activeElement === inputRef.current) {\n e.preventDefault()\n }\n }\n\n const currentNum = parseNumber(inputValue)\n const incDisabled = useMemo(() => {\n if (disabled) return true\n const base = currentNum ?? min ?? 0\n return max !== undefined && base >= max\n }, [disabled, currentNum, min, max])\n\n const decDisabled = useMemo(() => {\n if (disabled) return true\n const base = currentNum ?? min ?? 0\n return min !== undefined && base <= min\n }, [disabled, currentNum, min])\n\n const ChevronUp = () => (\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n )\n\n const ChevronDown = () => (\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n )\n\n return (\n <div className=\"space-y-2\">\n <div className=\"relative group\">\n {prefix && (\n <div className=\"absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none z-10\">\n <span className=\"text-sm font-medium\" style={getIconStyles()}>\n {prefix}\n </span>\n </div>\n )}\n\n <input\n ref={inputRef}\n type=\"number\"\n name={name}\n value={inputValue}\n placeholder={placeholder}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n inputMode=\"decimal\"\n className={baseClassName}\n style={{ ...getNumberInputStyles(), ...getDisabledStyles() } as React.CSSProperties}\n aria-invalid={error || undefined}\n aria-describedby={errorMessage ? errId : undefined}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onWheel={handleWheel}\n onMouseEnter={(e) => {\n if (!disabled && !error && !isFocused) {\n e.currentTarget.style.borderColor = 'var(--lm-border-strong)'\n }\n }}\n onMouseLeave={(e) => {\n if (!disabled && !error && !isFocused) {\n e.currentTarget.style.borderColor = 'var(--lm-border-default)'\n }\n }}\n />\n\n {suffix && (\n <div\n className={`absolute inset-y-0 flex items-center pointer-events-none z-10 ${\n showControls ? 'right-10' : 'right-4'\n }`}\n >\n <span className=\"text-sm font-medium\" style={getIconStyles()}>\n {suffix}\n </span>\n </div>\n )}\n\n {showControls && (\n <div className=\"absolute inset-y-0 right-0 flex flex-col w-8\">\n <button\n type=\"button\"\n aria-label=\"Increment\"\n onClick={handleIncrement}\n disabled={incDisabled}\n className=\"flex-1 px-1 border-l border-b rounded-tr-2xl transition-colors duration-200 flex items-center justify-center\"\n style={getControlButtonStyles()}\n onMouseEnter={(e) => {\n if (!incDisabled)\n Object.assign(e.currentTarget.style, getHoverControlButtonStyles())\n }}\n onMouseLeave={(e) => {\n if (!incDisabled)\n Object.assign(e.currentTarget.style, getControlButtonStyles())\n }}\n >\n <ChevronUp />\n </button>\n <button\n type=\"button\"\n aria-label=\"Decrement\"\n onClick={handleDecrement}\n disabled={decDisabled}\n className=\"flex-1 px-1 border-l rounded-br-2xl transition-colors duration-200 flex items-center justify-center\"\n style={getControlButtonStyles()}\n onMouseEnter={(e) => {\n if (!decDisabled)\n Object.assign(e.currentTarget.style, getHoverControlButtonStyles())\n }}\n onMouseLeave={(e) => {\n if (!decDisabled)\n Object.assign(e.currentTarget.style, getControlButtonStyles())\n }}\n >\n <ChevronDown />\n </button>\n </div>\n )}\n </div>\n\n {errorMessage && (\n <p\n id={errId}\n className=\"text-xs flex items-center gap-1\"\n style={{ color: 'var(--lm-error-500)' }}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <svg className=\"w-3 h-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {errorMessage}\n </p>\n )}\n </div>\n )\n}\n\nexport default LMNumberInput\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMRadio-CHn6nFSy.cjs","sources":["../src/components/Form/LMRadio/LMRadio.tsx"],"sourcesContent":["import React, { useId } from 'react'\nimport { SIZE_ICON_CONFIG } from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMRadioProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n /** Label text */\n label: string\n /** Description text */\n description?: string\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Size */\n size?: ComponentSize\n}\n\nconst sizeConfig = {\n xs: {\n container: 'p-2 gap-2',\n label: 'text-xs',\n description: 'text-xs mt-0.5',\n errorMessage: 'text-xs',\n },\n sm: {\n container: 'p-3 gap-2.5',\n label: 'text-sm',\n description: 'text-xs mt-1',\n errorMessage: 'text-xs',\n },\n md: {\n container: 'p-4 gap-3',\n label: 'text-base',\n description: 'text-sm mt-1',\n errorMessage: 'text-xs',\n },\n lg: {\n container: 'p-5 gap-4',\n label: 'text-lg',\n description: 'text-base mt-1.5',\n errorMessage: 'text-sm',\n },\n xl: {\n container: 'p-6 gap-4',\n label: 'text-xl',\n description: 'text-lg mt-2',\n errorMessage: 'text-sm',\n },\n '2xl': {\n container: 'p-8 gap-5',\n label: 'text-2xl',\n description: 'text-xl mt-2.5',\n errorMessage: 'text-base',\n },\n}\n\nconst LMRadio: React.FC<LMRadioProps> = ({\n label,\n description,\n error = false,\n errorMessage,\n size = 'md',\n className = '',\n id,\n ...props\n}) => {\n const autoId = useId()\n const controlId = id ?? `lm-radio-${autoId}`\n const errId = `lm-radio-err-${autoId}`\n\n const currentSize = sizeConfig[size]\n const radioSizeClass = SIZE_ICON_CONFIG[size]\n\n const getRadioStyles = () => {\n const baseStyles = {\n backgroundColor: 'var(--lm-bg-elevated)',\n borderColor: error\n ? 'var(--lm-error-300)'\n : 'var(--lm-border-default)',\n color: 'var(--lm-primary-500)',\n } as React.CSSProperties\n\n return {\n ...baseStyles,\n '--tw-ring-color': error\n ? 'var(--lm-error-400)'\n : 'var(--lm-primary-400)',\n '--tw-ring-opacity': '0.3',\n }\n }\n\n const getDisabledStyles = () => {\n if (props.disabled) {\n return {\n backgroundColor: 'var(--lm-bg-paper)',\n borderColor: 'var(--lm-border-light)',\n color: 'var(--lm-text-disabled)',\n cursor: 'not-allowed',\n opacity: 0.6,\n } as React.CSSProperties\n }\n return {}\n }\n\n const getContainerStyles = () => {\n const base = { backgroundColor: 'var(--lm-bg-paper)' }\n return error ? { ...base, backgroundColor: 'var(--lm-error-50)' } : base\n }\n\n const getHoverContainerStyles = () =>\n error\n ? { backgroundColor: 'var(--lm-error-100)' }\n : { backgroundColor: 'var(--lm-bg-elevated)' }\n\n const getLabelStyles = () => {\n if (error) return { color: 'var(--lm-error-700)' }\n if (props.disabled)\n return { color: 'var(--lm-text-disabled)', cursor: 'not-allowed' }\n return { color: 'var(--lm-text-primary)', cursor: 'pointer' }\n }\n\n const getDescriptionStyles = () =>\n error\n ? { color: 'var(--lm-error-600)' }\n : { color: 'var(--lm-text-secondary)' }\n\n const radioClassName = `\n ${radioSizeClass} border-2 rounded-full\n focus:ring-2 focus:ring-offset-0\n transition-all duration-200\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n return (\n <div>\n <div\n className={`flex items-start ${currentSize.container} rounded-2xl transition-colors duration-200`}\n style={getContainerStyles()}\n onMouseEnter={(e) => {\n if (!props.disabled)\n Object.assign(e.currentTarget.style, getHoverContainerStyles())\n }}\n onMouseLeave={(e) => {\n if (!props.disabled)\n Object.assign(e.currentTarget.style, getContainerStyles())\n }}\n >\n <input\n type=\"radio\"\n id={controlId}\n {...props}\n className={radioClassName}\n aria-invalid={error || undefined}\n aria-describedby={errorMessage ? errId : undefined}\n style={{ ...getRadioStyles(), ...getDisabledStyles() } as React.CSSProperties}\n onFocus={(e) => {\n if (!props.disabled) {\n e.currentTarget.style.borderColor = error\n ? 'var(--lm-error-400)'\n : 'var(--lm-primary-400)'\n }\n props.onFocus?.(e)\n }}\n onBlur={(e) => {\n if (!props.disabled) {\n e.currentTarget.style.borderColor = error\n ? 'var(--lm-error-300)'\n : 'var(--lm-border-default)'\n }\n props.onBlur?.(e)\n }}\n />\n\n <div className=\"flex-1\">\n <label\n htmlFor={controlId}\n className={`${currentSize.label} font-medium transition-colors duration-200`}\n style={getLabelStyles()}\n >\n {label}\n </label>\n {description && (\n <p className={currentSize.description} style={getDescriptionStyles()}>\n {description}\n </p>\n )}\n </div>\n </div>\n\n {errorMessage && (\n <p\n id={errId}\n className={`${currentSize.errorMessage} flex items-center gap-1`}\n style={{ color: 'var(--lm-error-500)' }}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <svg\n className=\"w-3 h-3\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {errorMessage}\n </p>\n )}\n </div>\n )\n}\n\nexport default LMRadio\n"],"names":["useId","SIZE_ICON_CONFIG","jsxs","jsx"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMRadio-UQLNgTMF.js","sources":["../src/components/Form/LMRadio/LMRadio.tsx"],"sourcesContent":["import React, { useId } from 'react'\nimport { SIZE_ICON_CONFIG } from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMRadioProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n /** Label text */\n label: string\n /** Description text */\n description?: string\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Size */\n size?: ComponentSize\n}\n\nconst sizeConfig = {\n xs: {\n container: 'p-2 gap-2',\n label: 'text-xs',\n description: 'text-xs mt-0.5',\n errorMessage: 'text-xs',\n },\n sm: {\n container: 'p-3 gap-2.5',\n label: 'text-sm',\n description: 'text-xs mt-1',\n errorMessage: 'text-xs',\n },\n md: {\n container: 'p-4 gap-3',\n label: 'text-base',\n description: 'text-sm mt-1',\n errorMessage: 'text-xs',\n },\n lg: {\n container: 'p-5 gap-4',\n label: 'text-lg',\n description: 'text-base mt-1.5',\n errorMessage: 'text-sm',\n },\n xl: {\n container: 'p-6 gap-4',\n label: 'text-xl',\n description: 'text-lg mt-2',\n errorMessage: 'text-sm',\n },\n '2xl': {\n container: 'p-8 gap-5',\n label: 'text-2xl',\n description: 'text-xl mt-2.5',\n errorMessage: 'text-base',\n },\n}\n\nconst LMRadio: React.FC<LMRadioProps> = ({\n label,\n description,\n error = false,\n errorMessage,\n size = 'md',\n className = '',\n id,\n ...props\n}) => {\n const autoId = useId()\n const controlId = id ?? `lm-radio-${autoId}`\n const errId = `lm-radio-err-${autoId}`\n\n const currentSize = sizeConfig[size]\n const radioSizeClass = SIZE_ICON_CONFIG[size]\n\n const getRadioStyles = () => {\n const baseStyles = {\n backgroundColor: 'var(--lm-bg-elevated)',\n borderColor: error\n ? 'var(--lm-error-300)'\n : 'var(--lm-border-default)',\n color: 'var(--lm-primary-500)',\n } as React.CSSProperties\n\n return {\n ...baseStyles,\n '--tw-ring-color': error\n ? 'var(--lm-error-400)'\n : 'var(--lm-primary-400)',\n '--tw-ring-opacity': '0.3',\n }\n }\n\n const getDisabledStyles = () => {\n if (props.disabled) {\n return {\n backgroundColor: 'var(--lm-bg-paper)',\n borderColor: 'var(--lm-border-light)',\n color: 'var(--lm-text-disabled)',\n cursor: 'not-allowed',\n opacity: 0.6,\n } as React.CSSProperties\n }\n return {}\n }\n\n const getContainerStyles = () => {\n const base = { backgroundColor: 'var(--lm-bg-paper)' }\n return error ? { ...base, backgroundColor: 'var(--lm-error-50)' } : base\n }\n\n const getHoverContainerStyles = () =>\n error\n ? { backgroundColor: 'var(--lm-error-100)' }\n : { backgroundColor: 'var(--lm-bg-elevated)' }\n\n const getLabelStyles = () => {\n if (error) return { color: 'var(--lm-error-700)' }\n if (props.disabled)\n return { color: 'var(--lm-text-disabled)', cursor: 'not-allowed' }\n return { color: 'var(--lm-text-primary)', cursor: 'pointer' }\n }\n\n const getDescriptionStyles = () =>\n error\n ? { color: 'var(--lm-error-600)' }\n : { color: 'var(--lm-text-secondary)' }\n\n const radioClassName = `\n ${radioSizeClass} border-2 rounded-full\n focus:ring-2 focus:ring-offset-0\n transition-all duration-200\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n return (\n <div>\n <div\n className={`flex items-start ${currentSize.container} rounded-2xl transition-colors duration-200`}\n style={getContainerStyles()}\n onMouseEnter={(e) => {\n if (!props.disabled)\n Object.assign(e.currentTarget.style, getHoverContainerStyles())\n }}\n onMouseLeave={(e) => {\n if (!props.disabled)\n Object.assign(e.currentTarget.style, getContainerStyles())\n }}\n >\n <input\n type=\"radio\"\n id={controlId}\n {...props}\n className={radioClassName}\n aria-invalid={error || undefined}\n aria-describedby={errorMessage ? errId : undefined}\n style={{ ...getRadioStyles(), ...getDisabledStyles() } as React.CSSProperties}\n onFocus={(e) => {\n if (!props.disabled) {\n e.currentTarget.style.borderColor = error\n ? 'var(--lm-error-400)'\n : 'var(--lm-primary-400)'\n }\n props.onFocus?.(e)\n }}\n onBlur={(e) => {\n if (!props.disabled) {\n e.currentTarget.style.borderColor = error\n ? 'var(--lm-error-300)'\n : 'var(--lm-border-default)'\n }\n props.onBlur?.(e)\n }}\n />\n\n <div className=\"flex-1\">\n <label\n htmlFor={controlId}\n className={`${currentSize.label} font-medium transition-colors duration-200`}\n style={getLabelStyles()}\n >\n {label}\n </label>\n {description && (\n <p className={currentSize.description} style={getDescriptionStyles()}>\n {description}\n </p>\n )}\n </div>\n </div>\n\n {errorMessage && (\n <p\n id={errId}\n className={`${currentSize.errorMessage} flex items-center gap-1`}\n style={{ color: 'var(--lm-error-500)' }}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <svg\n className=\"w-3 h-3\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {errorMessage}\n </p>\n )}\n </div>\n )\n}\n\nexport default LMRadio\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMSearchInput-CIvVkEf2.js","sources":["../src/components/Form/LMSearchInput/LMSearchInput.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react'\nimport { SIZE_INPUT_CONFIG } from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMSearchInputProps {\n /** Current search value */\n value?: string\n /** Change callback */\n onChange?: (value: string) => void\n /** Search submit callback */\n onSearch?: (value: string) => void\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Placeholder */\n placeholder?: string\n /** Disabled state */\n disabled?: boolean\n /** Class name */\n className?: string\n /** Form field name */\n name?: string\n /** Size */\n size?: ComponentSize\n /** Show clear button */\n showClear?: boolean\n /** Show search button */\n showSearchButton?: boolean\n /** Search button text */\n searchButtonText?: string\n /** Debounce delay (ms) */\n debounceDelay?: number\n}\n\nconst LMSearchInput: React.FC<LMSearchInputProps> = ({\n value,\n onChange,\n onSearch,\n error = false,\n errorMessage,\n placeholder = 'Search...',\n disabled = false,\n className = '',\n name,\n size = 'md',\n showClear = true,\n showSearchButton = true,\n searchButtonText = 'Search',\n debounceDelay = 300,\n}) => {\n const [inputValue, setInputValue] = useState(value || '')\n const [isFocused, setIsFocused] = useState(false)\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const searchBtnRef = useRef<HTMLButtonElement>(null)\n const [searchBtnWidth, setSearchBtnWidth] = useState(0)\n\n useEffect(() => {\n if (value !== undefined && value !== null) setInputValue(value)\n }, [value])\n\n useEffect(() => {\n if (showSearchButton && searchBtnRef.current) {\n setSearchBtnWidth(searchBtnRef.current.offsetWidth || 0)\n } else {\n setSearchBtnWidth(0)\n }\n }, [showSearchButton, searchButtonText])\n\n const baseClassName = `\n w-full ${SIZE_INPUT_CONFIG[size].padding} ${SIZE_INPUT_CONFIG[size].height} backdrop-blur-md border rounded-2xl\n focus:ring-2 focus:outline-none transition-all duration-300\n shadow-sm\n ${showSearchButton ? 'pr-20' : showClear ? 'pr-10' : 'pr-4'}\n pl-12\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getSearchInputStyles = () => {\n const baseStyles = {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n borderColor: error\n ? 'var(--lm-error-300)'\n : isFocused\n ? 'var(--lm-primary-400)'\n : 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n } as React.CSSProperties\n\n return {\n ...baseStyles,\n '--tw-ring-color': error\n ? 'var(--lm-error-400)'\n : 'var(--lm-primary-400)',\n '--tw-ring-opacity': '0.3',\n }\n }\n\n const getDisabledStyles = () =>\n disabled\n ? {\n backgroundColor: 'var(--lm-bg-paper)',\n color: 'var(--lm-text-disabled)',\n cursor: 'not-allowed',\n opacity: 0.6,\n }\n : {}\n\n const getIconStyles = () => {\n if (error) return { color: 'var(--lm-error-400)' }\n if (isFocused) return { color: 'var(--lm-primary-500)' }\n return { color: 'var(--lm-text-secondary)' }\n }\n\n const getButtonStyles = () => ({\n backgroundColor: 'var(--lm-primary-500)',\n color: 'white',\n })\n\n const getClearButtonStyles = () => ({\n backgroundColor: 'var(--lm-bg-paper)',\n color: 'var(--lm-text-secondary)',\n })\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value\n setInputValue(newValue)\n onChange?.(newValue)\n\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => {\n onSearch?.(newValue)\n }, debounceDelay)\n }\n\n const handleSearch = () => onSearch?.(inputValue)\n\n const handleClear = () => {\n setInputValue('')\n onChange?.('')\n onSearch?.('')\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n handleSearch()\n }\n }\n\n const clearBtnSizeClass =\n size === 'sm'\n ? 'w-7 h-7 text-xs'\n : size === 'lg'\n ? 'w-9 h-9 text-sm'\n : 'w-8 h-8 text-sm'\n\n const clearRightPx = showSearchButton ? searchBtnWidth + 8 : 8\n\n const SearchIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n )\n\n const ClearIcon = () => (\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n\n return (\n <div className=\"space-y-2\">\n <div className=\"relative group\">\n <div className=\"absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none z-10\">\n <span style={getIconStyles()}>\n <SearchIcon />\n </span>\n </div>\n\n <input\n ref={inputRef}\n type=\"search\"\n name={name}\n value={inputValue}\n placeholder={placeholder}\n disabled={disabled}\n className={baseClassName}\n style={{\n ...getSearchInputStyles(),\n ...getDisabledStyles(),\n } as React.CSSProperties}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onMouseEnter={(e) => {\n if (!disabled && !error && !isFocused) {\n e.currentTarget.style.borderColor = 'var(--lm-border-strong)'\n }\n }}\n onMouseLeave={(e) => {\n if (!disabled && !error && !isFocused) {\n e.currentTarget.style.borderColor = 'var(--lm-border-default)'\n }\n }}\n />\n\n <style>{`\n input[type='search']::-webkit-search-cancel-button {\n -webkit-appearance: none;\n appearance: none;\n }\n `}</style>\n\n {showClear && inputValue && !disabled && (\n <button\n onClick={handleClear}\n className={`absolute top-1/2 -translate-y-1/2 z-10 rounded-full flex items-center justify-center ${clearBtnSizeClass}`}\n style={{\n ...getClearButtonStyles(),\n right: `${clearRightPx}px`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--lm-bg-elevated)'\n e.currentTarget.style.color = 'var(--lm-text-primary)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--lm-bg-paper)'\n e.currentTarget.style.color = 'var(--lm-text-secondary)'\n }}\n aria-label=\"Clear\"\n type=\"button\"\n >\n <ClearIcon />\n </button>\n )}\n\n {showSearchButton && !disabled && (\n <button\n ref={searchBtnRef}\n onClick={handleSearch}\n className=\"absolute inset-y-0 right-0 px-4 rounded-r-2xl transition-colors duration-200 z-20\"\n style={getButtonStyles()}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--lm-primary-600)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--lm-primary-500)'\n }}\n type=\"button\"\n >\n <span className=\"text-sm font-medium\">{searchButtonText}</span>\n </button>\n )}\n </div>\n\n {errorMessage && (\n <p\n className=\"text-xs flex items-center gap-1\"\n style={{ color: 'var(--lm-error-500)' }}\n >\n <svg className=\"w-3 h-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {errorMessage}\n </p>\n )}\n </div>\n )\n}\n\nexport default LMSearchInput\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMSearchInput-nBlAX734.cjs","sources":["../src/components/Form/LMSearchInput/LMSearchInput.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react'\nimport { SIZE_INPUT_CONFIG } from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMSearchInputProps {\n /** Current search value */\n value?: string\n /** Change callback */\n onChange?: (value: string) => void\n /** Search submit callback */\n onSearch?: (value: string) => void\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Placeholder */\n placeholder?: string\n /** Disabled state */\n disabled?: boolean\n /** Class name */\n className?: string\n /** Form field name */\n name?: string\n /** Size */\n size?: ComponentSize\n /** Show clear button */\n showClear?: boolean\n /** Show search button */\n showSearchButton?: boolean\n /** Search button text */\n searchButtonText?: string\n /** Debounce delay (ms) */\n debounceDelay?: number\n}\n\nconst LMSearchInput: React.FC<LMSearchInputProps> = ({\n value,\n onChange,\n onSearch,\n error = false,\n errorMessage,\n placeholder = 'Search...',\n disabled = false,\n className = '',\n name,\n size = 'md',\n showClear = true,\n showSearchButton = true,\n searchButtonText = 'Search',\n debounceDelay = 300,\n}) => {\n const [inputValue, setInputValue] = useState(value || '')\n const [isFocused, setIsFocused] = useState(false)\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const searchBtnRef = useRef<HTMLButtonElement>(null)\n const [searchBtnWidth, setSearchBtnWidth] = useState(0)\n\n useEffect(() => {\n if (value !== undefined && value !== null) setInputValue(value)\n }, [value])\n\n useEffect(() => {\n if (showSearchButton && searchBtnRef.current) {\n setSearchBtnWidth(searchBtnRef.current.offsetWidth || 0)\n } else {\n setSearchBtnWidth(0)\n }\n }, [showSearchButton, searchButtonText])\n\n const baseClassName = `\n w-full ${SIZE_INPUT_CONFIG[size].padding} ${SIZE_INPUT_CONFIG[size].height} backdrop-blur-md border rounded-2xl\n focus:ring-2 focus:outline-none transition-all duration-300\n shadow-sm\n ${showSearchButton ? 'pr-20' : showClear ? 'pr-10' : 'pr-4'}\n pl-12\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getSearchInputStyles = () => {\n const baseStyles = {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n borderColor: error\n ? 'var(--lm-error-300)'\n : isFocused\n ? 'var(--lm-primary-400)'\n : 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n } as React.CSSProperties\n\n return {\n ...baseStyles,\n '--tw-ring-color': error\n ? 'var(--lm-error-400)'\n : 'var(--lm-primary-400)',\n '--tw-ring-opacity': '0.3',\n }\n }\n\n const getDisabledStyles = () =>\n disabled\n ? {\n backgroundColor: 'var(--lm-bg-paper)',\n color: 'var(--lm-text-disabled)',\n cursor: 'not-allowed',\n opacity: 0.6,\n }\n : {}\n\n const getIconStyles = () => {\n if (error) return { color: 'var(--lm-error-400)' }\n if (isFocused) return { color: 'var(--lm-primary-500)' }\n return { color: 'var(--lm-text-secondary)' }\n }\n\n const getButtonStyles = () => ({\n backgroundColor: 'var(--lm-primary-500)',\n color: 'white',\n })\n\n const getClearButtonStyles = () => ({\n backgroundColor: 'var(--lm-bg-paper)',\n color: 'var(--lm-text-secondary)',\n })\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value\n setInputValue(newValue)\n onChange?.(newValue)\n\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => {\n onSearch?.(newValue)\n }, debounceDelay)\n }\n\n const handleSearch = () => onSearch?.(inputValue)\n\n const handleClear = () => {\n setInputValue('')\n onChange?.('')\n onSearch?.('')\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n handleSearch()\n }\n }\n\n const clearBtnSizeClass =\n size === 'sm'\n ? 'w-7 h-7 text-xs'\n : size === 'lg'\n ? 'w-9 h-9 text-sm'\n : 'w-8 h-8 text-sm'\n\n const clearRightPx = showSearchButton ? searchBtnWidth + 8 : 8\n\n const SearchIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n )\n\n const ClearIcon = () => (\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n\n return (\n <div className=\"space-y-2\">\n <div className=\"relative group\">\n <div className=\"absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none z-10\">\n <span style={getIconStyles()}>\n <SearchIcon />\n </span>\n </div>\n\n <input\n ref={inputRef}\n type=\"search\"\n name={name}\n value={inputValue}\n placeholder={placeholder}\n disabled={disabled}\n className={baseClassName}\n style={{\n ...getSearchInputStyles(),\n ...getDisabledStyles(),\n } as React.CSSProperties}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onMouseEnter={(e) => {\n if (!disabled && !error && !isFocused) {\n e.currentTarget.style.borderColor = 'var(--lm-border-strong)'\n }\n }}\n onMouseLeave={(e) => {\n if (!disabled && !error && !isFocused) {\n e.currentTarget.style.borderColor = 'var(--lm-border-default)'\n }\n }}\n />\n\n <style>{`\n input[type='search']::-webkit-search-cancel-button {\n -webkit-appearance: none;\n appearance: none;\n }\n `}</style>\n\n {showClear && inputValue && !disabled && (\n <button\n onClick={handleClear}\n className={`absolute top-1/2 -translate-y-1/2 z-10 rounded-full flex items-center justify-center ${clearBtnSizeClass}`}\n style={{\n ...getClearButtonStyles(),\n right: `${clearRightPx}px`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--lm-bg-elevated)'\n e.currentTarget.style.color = 'var(--lm-text-primary)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--lm-bg-paper)'\n e.currentTarget.style.color = 'var(--lm-text-secondary)'\n }}\n aria-label=\"Clear\"\n type=\"button\"\n >\n <ClearIcon />\n </button>\n )}\n\n {showSearchButton && !disabled && (\n <button\n ref={searchBtnRef}\n onClick={handleSearch}\n className=\"absolute inset-y-0 right-0 px-4 rounded-r-2xl transition-colors duration-200 z-20\"\n style={getButtonStyles()}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--lm-primary-600)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--lm-primary-500)'\n }}\n type=\"button\"\n >\n <span className=\"text-sm font-medium\">{searchButtonText}</span>\n </button>\n )}\n </div>\n\n {errorMessage && (\n <p\n className=\"text-xs flex items-center gap-1\"\n style={{ color: 'var(--lm-error-500)' }}\n >\n <svg className=\"w-3 h-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {errorMessage}\n </p>\n )}\n </div>\n )\n}\n\nexport default LMSearchInput\n"],"names":["useState","useRef","useEffect","SIZE_INPUT_CONFIG","jsx","jsxs"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMSelect-B-MWX2JI.js","sources":["../src/components/Form/LMSelect/LMSelect.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react'\nimport { SIZE_SELECTOR_CONFIG } from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMSelectOption {\n value: string | number\n label: string\n disabled?: boolean\n}\n\nexport interface LMSelectProps {\n /** Options */\n options: LMSelectOption[]\n /** Current value */\n value?: string | number | (string | number)[]\n /** Change callback */\n onChange?: (value: string | number | (string | number)[]) => void\n /** Dropdown visibility change callback */\n onDropdownVisibleChange?: (visible: boolean) => void\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Placeholder */\n placeholder?: string\n /** Disabled state */\n disabled?: boolean\n /** Class name */\n className?: string\n /** Form field name */\n name?: string\n /** Size */\n size?: ComponentSize\n /** Multiple selection */\n multiple?: boolean\n}\n\nconst SIZE_DROPDOWN_CONFIG: Record<\n ComponentSize,\n {\n maxHeight: string\n optionPadding: string\n optionTextSize: string\n }\n> = {\n xs: { maxHeight: 'max-h-32', optionPadding: 'px-3 py-1.5', optionTextSize: 'text-xs' },\n sm: { maxHeight: 'max-h-40', optionPadding: 'px-3 py-2', optionTextSize: 'text-xs' },\n md: { maxHeight: 'max-h-48', optionPadding: 'px-4 py-2.5', optionTextSize: 'text-sm' },\n lg: { maxHeight: 'max-h-56', optionPadding: 'px-4 py-3', optionTextSize: 'text-sm' },\n xl: { maxHeight: 'max-h-64', optionPadding: 'px-5 py-3', optionTextSize: 'text-base' },\n '2xl': { maxHeight: 'max-h-72', optionPadding: 'px-6 py-4', optionTextSize: 'text-lg' },\n}\n\nconst LMSelect: React.FC<LMSelectProps> = ({\n options,\n value,\n onChange,\n onDropdownVisibleChange,\n error = false,\n errorMessage,\n placeholder = 'Select...',\n disabled = false,\n className = '',\n name,\n size = 'md',\n multiple = false,\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const [selectedOption, setSelectedOption] = useState<LMSelectOption | null>(null)\n const [selectedOptions, setSelectedOptions] = useState<LMSelectOption[]>([])\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!multiple) {\n if (value !== undefined && value !== null && !Array.isArray(value)) {\n const option = options.find((opt) => opt.value === value)\n setSelectedOption(option || null)\n } else {\n setSelectedOption(null)\n }\n }\n }, [value, options, multiple])\n\n useEffect(() => {\n if (multiple && Array.isArray(value)) {\n const selectedOpts = options.filter((opt) => value.includes(opt.value))\n setSelectedOptions(selectedOpts)\n } else if (multiple) {\n setSelectedOptions([])\n }\n }, [value, options, multiple])\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n onDropdownVisibleChange?.(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, onDropdownVisibleChange])\n\n const handleSelect = (option: LMSelectOption) => {\n if (option.disabled) return\n\n if (multiple) {\n const currentValues = Array.isArray(value) ? value : []\n const isSelected = currentValues.includes(option.value)\n const newValues = isSelected\n ? currentValues.filter((v) => v !== option.value)\n : [...currentValues, option.value]\n onChange?.(newValues)\n } else {\n setSelectedOption(option)\n onChange?.(option.value)\n setIsOpen(false)\n onDropdownVisibleChange?.(false)\n }\n }\n\n const toggleDropdown = () => {\n if (!disabled) {\n const newIsOpen = !isOpen\n setIsOpen(newIsOpen)\n onDropdownVisibleChange?.(newIsOpen)\n }\n }\n\n // Apple-like refined select styling\n const baseClassName = `\n w-full ${SIZE_SELECTOR_CONFIG[size].padding} ${SIZE_SELECTOR_CONFIG[size].height} ${SIZE_SELECTOR_CONFIG[size].fontSize}\n border rounded-xl\n cursor-pointer select-none\n flex items-center justify-between\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getSelectorStyles = () => {\n // Apple-like refined select styles\n const baseStyles = {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n borderColor: error ? 'var(--lm-error-300)' : 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n transition: 'all var(--lm-transition-fast) var(--lm-ease-out)',\n }\n\n return {\n ...baseStyles,\n '--tw-ring-color': error ? 'var(--lm-error-400)' : 'var(--lm-primary-400)',\n '--tw-ring-opacity': '0.4',\n }\n }\n\n const getDisabledStyles = () =>\n disabled\n ? {\n backgroundColor: 'var(--lm-bg-paper)',\n color: 'var(--lm-text-disabled)',\n cursor: 'not-allowed',\n opacity: 0.6,\n }\n : {}\n\n const getIconStyles = () =>\n error ? { color: 'var(--lm-error-400)' } : { color: 'var(--lm-text-secondary)' }\n\n // Apple-like refined dropdown styles\n const getDropdownStyles = () => ({\n backgroundColor: 'var(--lm-bg-elevated)',\n borderColor: 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-lg)',\n backdropFilter: 'blur(20px) saturate(180%)',\n WebkitBackdropFilter: 'blur(20px) saturate(180%)',\n })\n\n const isOptionSelected = (optionValue: string | number): boolean => {\n if (multiple) {\n return Array.isArray(value) && value.includes(optionValue)\n }\n return selectedOption?.value === optionValue\n }\n\n const getOptionStyles = (option: LMSelectOption) => {\n const baseStyles = {\n color: option.disabled ? 'var(--lm-text-disabled)' : 'var(--lm-text-primary)',\n backgroundColor: option.disabled ? 'var(--lm-bg-paper)' : 'transparent',\n }\n\n if (isOptionSelected(option.value)) {\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-primary-50)',\n color: 'var(--lm-primary-700)',\n }\n }\n\n return baseStyles\n }\n\n const getHoverOptionStyles = (option: LMSelectOption) => {\n if (option.disabled) return {}\n\n if (isOptionSelected(option.value)) {\n return { backgroundColor: 'var(--lm-primary-100)' }\n }\n\n return { backgroundColor: 'var(--lm-bg-paper)' }\n }\n\n const getDisplayText = (): string => {\n if (multiple) {\n if (selectedOptions.length === 0) return placeholder\n if (selectedOptions.length === 1) return selectedOptions[0].label\n return `${selectedOptions.length} selected`\n }\n return selectedOption ? selectedOption.label : placeholder\n }\n\n const ChevronDown = () => (\n <svg\n className={`w-4 h-4 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n style={getIconStyles()}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n )\n\n const CheckIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n\n return (\n <div className=\"relative\" ref={dropdownRef}>\n <select\n name={name}\n value={\n multiple\n ? Array.isArray(value)\n ? value.map(String)\n : []\n : value !== undefined && value !== null && !Array.isArray(value)\n ? String(value)\n : ''\n }\n onChange={() => {}}\n className=\"sr-only\"\n disabled={disabled}\n tabIndex={-1}\n multiple={multiple}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </select>\n\n <div\n className={baseClassName}\n onClick={toggleDropdown}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n style={{\n ...getSelectorStyles(),\n ...getDisabledStyles(),\n } as React.CSSProperties}\n onMouseEnter={(e) => {\n if (!disabled && !error) {\n e.currentTarget.style.borderColor = 'var(--lm-border-strong)'\n }\n }}\n onMouseLeave={(e) => {\n if (!disabled && !error) {\n e.currentTarget.style.borderColor = 'var(--lm-border-default)'\n }\n }}\n onFocus={(e) => {\n if (!disabled) {\n e.currentTarget.style.borderColor = error\n ? 'var(--lm-error-400)'\n : 'var(--lm-primary-400)'\n }\n }}\n onBlur={(e) => {\n if (!disabled) {\n e.currentTarget.style.borderColor = error\n ? 'var(--lm-error-300)'\n : 'var(--lm-border-default)'\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggleDropdown()\n }\n }}\n >\n <span\n style={{\n color:\n (multiple && selectedOptions.length > 0) || selectedOption\n ? 'var(--lm-text-primary)'\n : 'var(--lm-text-secondary)',\n }}\n >\n {getDisplayText()}\n </span>\n <ChevronDown />\n </div>\n\n {isOpen && (\n <div\n className={`absolute left-0 right-0 z-50 border rounded-xl overflow-y-auto ${SIZE_DROPDOWN_CONFIG[size].maxHeight}`}\n style={{\n ...getDropdownStyles(),\n top: 'calc(100% + 4px)',\n }}\n >\n {options.map((option, index) => (\n <div\n key={option.value}\n className={`\n ${SIZE_DROPDOWN_CONFIG[size].optionPadding} ${SIZE_DROPDOWN_CONFIG[size].optionTextSize} font-medium\n cursor-pointer transition-all duration-150\n ${option.disabled ? 'cursor-not-allowed' : ''}\n ${index === 0 ? 'rounded-t-xl' : ''}\n ${index === options.length - 1 ? 'rounded-b-xl' : ''}\n ${index > 0 ? 'border-t' : ''}\n `}\n style={{\n ...getOptionStyles(option),\n borderTopColor: index > 0 ? 'var(--lm-border-light)' : 'transparent',\n }}\n onMouseEnter={(e) => {\n if (!option.disabled) {\n Object.assign(e.currentTarget.style, getHoverOptionStyles(option))\n }\n }}\n onMouseLeave={(e) => {\n if (!option.disabled) {\n Object.assign(e.currentTarget.style, getOptionStyles(option))\n }\n }}\n onClick={() => handleSelect(option)}\n role=\"option\"\n aria-selected={isOptionSelected(option.value)}\n >\n <div className=\"flex items-center justify-between\">\n {multiple && (\n <input\n type=\"checkbox\"\n checked={isOptionSelected(option.value)}\n onChange={() => {}}\n className=\"mr-2 cursor-pointer\"\n style={{ accentColor: 'var(--lm-primary-500)' }}\n onClick={(e) => e.stopPropagation()}\n />\n )}\n <span className=\"truncate flex-1\">{option.label}</span>\n {!multiple && isOptionSelected(option.value) && (\n <span className=\"ml-2 shrink-0\" style={{ color: 'var(--lm-primary-600)' }}>\n <CheckIcon />\n </span>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {errorMessage && (\n <p\n className=\"text-xs flex items-center gap-1 mt-2\"\n style={{ color: 'var(--lm-error-500)' }}\n >\n <svg className=\"w-3 h-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {errorMessage}\n </p>\n )}\n </div>\n )\n}\n\nexport default LMSelect\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMSelect-ByQcUp2S.cjs","sources":["../src/components/Form/LMSelect/LMSelect.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react'\nimport { SIZE_SELECTOR_CONFIG } from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMSelectOption {\n value: string | number\n label: string\n disabled?: boolean\n}\n\nexport interface LMSelectProps {\n /** Options */\n options: LMSelectOption[]\n /** Current value */\n value?: string | number | (string | number)[]\n /** Change callback */\n onChange?: (value: string | number | (string | number)[]) => void\n /** Dropdown visibility change callback */\n onDropdownVisibleChange?: (visible: boolean) => void\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Placeholder */\n placeholder?: string\n /** Disabled state */\n disabled?: boolean\n /** Class name */\n className?: string\n /** Form field name */\n name?: string\n /** Size */\n size?: ComponentSize\n /** Multiple selection */\n multiple?: boolean\n}\n\nconst SIZE_DROPDOWN_CONFIG: Record<\n ComponentSize,\n {\n maxHeight: string\n optionPadding: string\n optionTextSize: string\n }\n> = {\n xs: { maxHeight: 'max-h-32', optionPadding: 'px-3 py-1.5', optionTextSize: 'text-xs' },\n sm: { maxHeight: 'max-h-40', optionPadding: 'px-3 py-2', optionTextSize: 'text-xs' },\n md: { maxHeight: 'max-h-48', optionPadding: 'px-4 py-2.5', optionTextSize: 'text-sm' },\n lg: { maxHeight: 'max-h-56', optionPadding: 'px-4 py-3', optionTextSize: 'text-sm' },\n xl: { maxHeight: 'max-h-64', optionPadding: 'px-5 py-3', optionTextSize: 'text-base' },\n '2xl': { maxHeight: 'max-h-72', optionPadding: 'px-6 py-4', optionTextSize: 'text-lg' },\n}\n\nconst LMSelect: React.FC<LMSelectProps> = ({\n options,\n value,\n onChange,\n onDropdownVisibleChange,\n error = false,\n errorMessage,\n placeholder = 'Select...',\n disabled = false,\n className = '',\n name,\n size = 'md',\n multiple = false,\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const [selectedOption, setSelectedOption] = useState<LMSelectOption | null>(null)\n const [selectedOptions, setSelectedOptions] = useState<LMSelectOption[]>([])\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!multiple) {\n if (value !== undefined && value !== null && !Array.isArray(value)) {\n const option = options.find((opt) => opt.value === value)\n setSelectedOption(option || null)\n } else {\n setSelectedOption(null)\n }\n }\n }, [value, options, multiple])\n\n useEffect(() => {\n if (multiple && Array.isArray(value)) {\n const selectedOpts = options.filter((opt) => value.includes(opt.value))\n setSelectedOptions(selectedOpts)\n } else if (multiple) {\n setSelectedOptions([])\n }\n }, [value, options, multiple])\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n onDropdownVisibleChange?.(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, onDropdownVisibleChange])\n\n const handleSelect = (option: LMSelectOption) => {\n if (option.disabled) return\n\n if (multiple) {\n const currentValues = Array.isArray(value) ? value : []\n const isSelected = currentValues.includes(option.value)\n const newValues = isSelected\n ? currentValues.filter((v) => v !== option.value)\n : [...currentValues, option.value]\n onChange?.(newValues)\n } else {\n setSelectedOption(option)\n onChange?.(option.value)\n setIsOpen(false)\n onDropdownVisibleChange?.(false)\n }\n }\n\n const toggleDropdown = () => {\n if (!disabled) {\n const newIsOpen = !isOpen\n setIsOpen(newIsOpen)\n onDropdownVisibleChange?.(newIsOpen)\n }\n }\n\n // Apple-like refined select styling\n const baseClassName = `\n w-full ${SIZE_SELECTOR_CONFIG[size].padding} ${SIZE_SELECTOR_CONFIG[size].height} ${SIZE_SELECTOR_CONFIG[size].fontSize}\n border rounded-xl\n cursor-pointer select-none\n flex items-center justify-between\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getSelectorStyles = () => {\n // Apple-like refined select styles\n const baseStyles = {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n borderColor: error ? 'var(--lm-error-300)' : 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n transition: 'all var(--lm-transition-fast) var(--lm-ease-out)',\n }\n\n return {\n ...baseStyles,\n '--tw-ring-color': error ? 'var(--lm-error-400)' : 'var(--lm-primary-400)',\n '--tw-ring-opacity': '0.4',\n }\n }\n\n const getDisabledStyles = () =>\n disabled\n ? {\n backgroundColor: 'var(--lm-bg-paper)',\n color: 'var(--lm-text-disabled)',\n cursor: 'not-allowed',\n opacity: 0.6,\n }\n : {}\n\n const getIconStyles = () =>\n error ? { color: 'var(--lm-error-400)' } : { color: 'var(--lm-text-secondary)' }\n\n // Apple-like refined dropdown styles\n const getDropdownStyles = () => ({\n backgroundColor: 'var(--lm-bg-elevated)',\n borderColor: 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-lg)',\n backdropFilter: 'blur(20px) saturate(180%)',\n WebkitBackdropFilter: 'blur(20px) saturate(180%)',\n })\n\n const isOptionSelected = (optionValue: string | number): boolean => {\n if (multiple) {\n return Array.isArray(value) && value.includes(optionValue)\n }\n return selectedOption?.value === optionValue\n }\n\n const getOptionStyles = (option: LMSelectOption) => {\n const baseStyles = {\n color: option.disabled ? 'var(--lm-text-disabled)' : 'var(--lm-text-primary)',\n backgroundColor: option.disabled ? 'var(--lm-bg-paper)' : 'transparent',\n }\n\n if (isOptionSelected(option.value)) {\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-primary-50)',\n color: 'var(--lm-primary-700)',\n }\n }\n\n return baseStyles\n }\n\n const getHoverOptionStyles = (option: LMSelectOption) => {\n if (option.disabled) return {}\n\n if (isOptionSelected(option.value)) {\n return { backgroundColor: 'var(--lm-primary-100)' }\n }\n\n return { backgroundColor: 'var(--lm-bg-paper)' }\n }\n\n const getDisplayText = (): string => {\n if (multiple) {\n if (selectedOptions.length === 0) return placeholder\n if (selectedOptions.length === 1) return selectedOptions[0].label\n return `${selectedOptions.length} selected`\n }\n return selectedOption ? selectedOption.label : placeholder\n }\n\n const ChevronDown = () => (\n <svg\n className={`w-4 h-4 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n style={getIconStyles()}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n )\n\n const CheckIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n\n return (\n <div className=\"relative\" ref={dropdownRef}>\n <select\n name={name}\n value={\n multiple\n ? Array.isArray(value)\n ? value.map(String)\n : []\n : value !== undefined && value !== null && !Array.isArray(value)\n ? String(value)\n : ''\n }\n onChange={() => {}}\n className=\"sr-only\"\n disabled={disabled}\n tabIndex={-1}\n multiple={multiple}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </select>\n\n <div\n className={baseClassName}\n onClick={toggleDropdown}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n style={{\n ...getSelectorStyles(),\n ...getDisabledStyles(),\n } as React.CSSProperties}\n onMouseEnter={(e) => {\n if (!disabled && !error) {\n e.currentTarget.style.borderColor = 'var(--lm-border-strong)'\n }\n }}\n onMouseLeave={(e) => {\n if (!disabled && !error) {\n e.currentTarget.style.borderColor = 'var(--lm-border-default)'\n }\n }}\n onFocus={(e) => {\n if (!disabled) {\n e.currentTarget.style.borderColor = error\n ? 'var(--lm-error-400)'\n : 'var(--lm-primary-400)'\n }\n }}\n onBlur={(e) => {\n if (!disabled) {\n e.currentTarget.style.borderColor = error\n ? 'var(--lm-error-300)'\n : 'var(--lm-border-default)'\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggleDropdown()\n }\n }}\n >\n <span\n style={{\n color:\n (multiple && selectedOptions.length > 0) || selectedOption\n ? 'var(--lm-text-primary)'\n : 'var(--lm-text-secondary)',\n }}\n >\n {getDisplayText()}\n </span>\n <ChevronDown />\n </div>\n\n {isOpen && (\n <div\n className={`absolute left-0 right-0 z-50 border rounded-xl overflow-y-auto ${SIZE_DROPDOWN_CONFIG[size].maxHeight}`}\n style={{\n ...getDropdownStyles(),\n top: 'calc(100% + 4px)',\n }}\n >\n {options.map((option, index) => (\n <div\n key={option.value}\n className={`\n ${SIZE_DROPDOWN_CONFIG[size].optionPadding} ${SIZE_DROPDOWN_CONFIG[size].optionTextSize} font-medium\n cursor-pointer transition-all duration-150\n ${option.disabled ? 'cursor-not-allowed' : ''}\n ${index === 0 ? 'rounded-t-xl' : ''}\n ${index === options.length - 1 ? 'rounded-b-xl' : ''}\n ${index > 0 ? 'border-t' : ''}\n `}\n style={{\n ...getOptionStyles(option),\n borderTopColor: index > 0 ? 'var(--lm-border-light)' : 'transparent',\n }}\n onMouseEnter={(e) => {\n if (!option.disabled) {\n Object.assign(e.currentTarget.style, getHoverOptionStyles(option))\n }\n }}\n onMouseLeave={(e) => {\n if (!option.disabled) {\n Object.assign(e.currentTarget.style, getOptionStyles(option))\n }\n }}\n onClick={() => handleSelect(option)}\n role=\"option\"\n aria-selected={isOptionSelected(option.value)}\n >\n <div className=\"flex items-center justify-between\">\n {multiple && (\n <input\n type=\"checkbox\"\n checked={isOptionSelected(option.value)}\n onChange={() => {}}\n className=\"mr-2 cursor-pointer\"\n style={{ accentColor: 'var(--lm-primary-500)' }}\n onClick={(e) => e.stopPropagation()}\n />\n )}\n <span className=\"truncate flex-1\">{option.label}</span>\n {!multiple && isOptionSelected(option.value) && (\n <span className=\"ml-2 shrink-0\" style={{ color: 'var(--lm-primary-600)' }}>\n <CheckIcon />\n </span>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {errorMessage && (\n <p\n className=\"text-xs flex items-center gap-1 mt-2\"\n style={{ color: 'var(--lm-error-500)' }}\n >\n <svg className=\"w-3 h-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {errorMessage}\n </p>\n )}\n </div>\n )\n}\n\nexport default LMSelect\n"],"names":["useState","useRef","useEffect","SIZE_SELECTOR_CONFIG","jsx","jsxs"],"mappings":";;;;AAqCA,MAAM,uBAOF;AAAA,EACF,IAAI,EAAE,WAAW,YAAY,eAAe,eAAe,gBAAgB,UAAA;AAAA,EAC3E,IAAI,EAAE,WAAW,YAAY,eAAe,aAAa,gBAAgB,UAAA;AAAA,EACzE,IAAI,EAAE,WAAW,YAAY,eAAe,eAAe,gBAAgB,UAAA;AAAA,EAC3E,IAAI,EAAE,WAAW,YAAY,eAAe,aAAa,gBAAgB,UAAA;AAAA,EACzE,IAAI,EAAE,WAAW,YAAY,eAAe,aAAa,gBAAgB,YAAA;AAAA,EACzE,OAAO,EAAE,WAAW,YAAY,eAAe,aAAa,gBAAgB,UAAA;AAC9E;AAEA,MAAM,WAAoC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AACb,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAS,KAAK;AAC1C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAAgC,IAAI;AAChF,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,MAAAA,SAA2B,CAAA,CAAE;AAC3E,QAAM,cAAcC,MAAAA,OAAuB,IAAI;AAE/CC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,UAAU;AACb,UAAI,UAAU,UAAa,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,GAAG;AAClE,cAAM,SAAS,QAAQ,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK;AACxD,0BAAkB,UAAU,IAAI;AAAA,MAClC,OAAO;AACL,0BAAkB,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,QAAQ,CAAC;AAE7BA,QAAAA,UAAU,MAAM;AACd,QAAI,YAAY,MAAM,QAAQ,KAAK,GAAG;AACpC,YAAM,eAAe,QAAQ,OAAO,CAAC,QAAQ,MAAM,SAAS,IAAI,KAAK,CAAC;AACtE,yBAAmB,YAAY;AAAA,IACjC,WAAW,UAAU;AACnB,yBAAmB,CAAA,CAAE;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,QAAQ,CAAC;AAE7BA,QAAAA,UAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UAAI,YAAY,WAAW,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC9E,kBAAU,KAAK;AACf,2EAA0B;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,eAAS,iBAAiB,aAAa,kBAAkB;AACzD,aAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAC3E;AAAA,EACF,GAAG,CAAC,QAAQ,uBAAuB,CAAC;AAEpC,QAAM,eAAe,CAAC,WAA2B;AAC/C,QAAI,OAAO,SAAU;AAErB,QAAI,UAAU;AACZ,YAAM,gBAAgB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAA;AACrD,YAAM,aAAa,cAAc,SAAS,OAAO,KAAK;AACtD,YAAM,YAAY,aACd,cAAc,OAAO,CAAC,MAAM,MAAM,OAAO,KAAK,IAC9C,CAAC,GAAG,eAAe,OAAO,KAAK;AACnC,2CAAW;AAAA,IACb,OAAO;AACL,wBAAkB,MAAM;AACxB,2CAAW,OAAO;AAClB,gBAAU,KAAK;AACf,yEAA0B;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,QAAI,CAAC,UAAU;AACb,YAAM,YAAY,CAAC;AACnB,gBAAU,SAAS;AACnB,yEAA0B;AAAA,IAC5B;AAAA,EACF;AAGA,QAAM,gBAAgB;AAAA,aACXC,eAAAA,qBAAqB,IAAI,EAAE,OAAO,IAAIA,eAAAA,qBAAqB,IAAI,EAAE,MAAM,IAAIA,oCAAqB,IAAI,EAAE,QAAQ;AAAA;AAAA;AAAA;AAAA,MAIrH,SAAS;AAAA,IAEV,KAAA,EACA,QAAQ,QAAQ,GAAG;AAEtB,QAAM,oBAAoB,MAAM;AAE9B,UAAM,aAAa;AAAA,MACjB,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,aAAa,QAAQ,wBAAwB;AAAA,MAC7C,WAAW;AAAA,MACX,YAAY;AAAA,IAAA;AAGd,WAAO;AAAA,MACL,GAAG;AAAA,MACH,mBAAmB,QAAQ,wBAAwB;AAAA,MACnD,qBAAqB;AAAA,IAAA;AAAA,EAEzB;AAEA,QAAM,oBAAoB,MACxB,WACI;AAAA,IACE,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,EAAA,IAEX,CAAA;AAEN,QAAM,gBAAgB,MACpB,QAAQ,EAAE,OAAO,0BAA0B,EAAE,OAAO,2BAAA;AAGtD,QAAM,oBAAoB,OAAO;AAAA,IAC/B,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,EAAA;AAGxB,QAAM,mBAAmB,CAAC,gBAA0C;AAClE,QAAI,UAAU;AACZ,aAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,WAAW;AAAA,IAC3D;AACA,YAAO,iDAAgB,WAAU;AAAA,EACnC;AAEA,QAAM,kBAAkB,CAAC,WAA2B;AAClD,UAAM,aAAa;AAAA,MACjB,OAAO,OAAO,WAAW,4BAA4B;AAAA,MACrD,iBAAiB,OAAO,WAAW,uBAAuB;AAAA,IAAA;AAG5D,QAAI,iBAAiB,OAAO,KAAK,GAAG;AAClC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB;AAAA,QACjB,OAAO;AAAA,MAAA;AAAA,IAEX;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,CAAC,WAA2B;AACvD,QAAI,OAAO,SAAU,QAAO,CAAA;AAE5B,QAAI,iBAAiB,OAAO,KAAK,GAAG;AAClC,aAAO,EAAE,iBAAiB,wBAAA;AAAA,IAC5B;AAEA,WAAO,EAAE,iBAAiB,qBAAA;AAAA,EAC5B;AAEA,QAAM,iBAAiB,MAAc;AACnC,QAAI,UAAU;AACZ,UAAI,gBAAgB,WAAW,EAAG,QAAO;AACzC,UAAI,gBAAgB,WAAW,EAAG,QAAO,gBAAgB,CAAC,EAAE;AAC5D,aAAO,GAAG,gBAAgB,MAAM;AAAA,IAClC;AACA,WAAO,iBAAiB,eAAe,QAAQ;AAAA,EACjD;AAEA,QAAM,cAAc,MAClBC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,6CAA6C,SAAS,eAAe,EAAE;AAAA,MAClF,MAAK;AAAA,MACL,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,OAAO,cAAA;AAAA,MAEP,UAAAA,2BAAAA,IAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,iBAAA,CAAiB;AAAA,IAAA;AAAA,EAAA;AAI1F,QAAM,YAAY,MAChBA,+BAAC,OAAA,EAAI,WAAU,WAAU,MAAK,QAAO,QAAO,gBAAe,SAAQ,aACjE,UAAAA,2BAAAA,IAAC,QAAA,EAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,iBAAA,CAAiB,EAAA,CACxF;AAGF,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,YAAW,KAAK,aAC7B,UAAA;AAAA,IAAAD,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,OACE,WACI,MAAM,QAAQ,KAAK,IACjB,MAAM,IAAI,MAAM,IAChB,CAAA,IACF,UAAU,UAAa,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAC3D,OAAO,KAAK,IACZ;AAAA,QAER,UAAU,MAAM;AAAA,QAAC;AAAA,QACjB,WAAU;AAAA,QACV;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QAEC,kBAAQ,IAAI,CAAC,WACZA,2BAAAA,IAAC,YAA0B,OAAO,OAAO,OAAO,UAAU,OAAO,UAC9D,UAAA,OAAO,MAAA,GADG,OAAO,KAEpB,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,IAGHC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,QACX,SAAS;AAAA,QACT,MAAK;AAAA,QACL,UAAU,WAAW,KAAK;AAAA,QAC1B,OAAO;AAAA,UACL,GAAG,kBAAA;AAAA,UACH,GAAG,kBAAA;AAAA,QAAkB;AAAA,QAEvB,cAAc,CAAC,MAAM;AACnB,cAAI,CAAC,YAAY,CAAC,OAAO;AACvB,cAAE,cAAc,MAAM,cAAc;AAAA,UACtC;AAAA,QACF;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,cAAI,CAAC,YAAY,CAAC,OAAO;AACvB,cAAE,cAAc,MAAM,cAAc;AAAA,UACtC;AAAA,QACF;AAAA,QACA,SAAS,CAAC,MAAM;AACd,cAAI,CAAC,UAAU;AACb,cAAE,cAAc,MAAM,cAAc,QAChC,wBACA;AAAA,UACN;AAAA,QACF;AAAA,QACA,QAAQ,CAAC,MAAM;AACb,cAAI,CAAC,UAAU;AACb,cAAE,cAAc,MAAM,cAAc,QAChC,wBACA;AAAA,UACN;AAAA,QACF;AAAA,QACA,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,cAAE,eAAA;AACF,2BAAA;AAAA,UACF;AAAA,QACF;AAAA,QAEA,UAAA;AAAA,UAAAD,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,OACG,YAAY,gBAAgB,SAAS,KAAM,iBACxC,2BACA;AAAA,cAAA;AAAA,cAGP,UAAA,eAAA;AAAA,YAAe;AAAA,UAAA;AAAA,yCAEjB,aAAA,CAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGd,UACCA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,kEAAkE,qBAAqB,IAAI,EAAE,SAAS;AAAA,QACjH,OAAO;AAAA,UACL,GAAG,kBAAA;AAAA,UACH,KAAK;AAAA,QAAA;AAAA,QAGN,UAAA,QAAQ,IAAI,CAAC,QAAQ,UACpBA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW;AAAA,kBACP,qBAAqB,IAAI,EAAE,aAAa,IAAI,qBAAqB,IAAI,EAAE,cAAc;AAAA;AAAA,kBAErF,OAAO,WAAW,uBAAuB,EAAE;AAAA,kBAC3C,UAAU,IAAI,iBAAiB,EAAE;AAAA,kBACjC,UAAU,QAAQ,SAAS,IAAI,iBAAiB,EAAE;AAAA,kBAClD,QAAQ,IAAI,aAAa,EAAE;AAAA;AAAA,YAE/B,OAAO;AAAA,cACL,GAAG,gBAAgB,MAAM;AAAA,cACzB,gBAAgB,QAAQ,IAAI,2BAA2B;AAAA,YAAA;AAAA,YAEzD,cAAc,CAAC,MAAM;AACnB,kBAAI,CAAC,OAAO,UAAU;AACpB,uBAAO,OAAO,EAAE,cAAc,OAAO,qBAAqB,MAAM,CAAC;AAAA,cACnE;AAAA,YACF;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,kBAAI,CAAC,OAAO,UAAU;AACpB,uBAAO,OAAO,EAAE,cAAc,OAAO,gBAAgB,MAAM,CAAC;AAAA,cAC9D;AAAA,YACF;AAAA,YACA,SAAS,MAAM,aAAa,MAAM;AAAA,YAClC,MAAK;AAAA,YACL,iBAAe,iBAAiB,OAAO,KAAK;AAAA,YAE5C,UAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,qCACZ,UAAA;AAAA,cAAA,YACCD,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,iBAAiB,OAAO,KAAK;AAAA,kBACtC,UAAU,MAAM;AAAA,kBAAC;AAAA,kBACjB,WAAU;AAAA,kBACV,OAAO,EAAE,aAAa,wBAAA;AAAA,kBACtB,SAAS,CAAC,MAAM,EAAE,gBAAA;AAAA,gBAAgB;AAAA,cAAA;AAAA,cAGtCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,mBAAmB,iBAAO,OAAM;AAAA,cAC/C,CAAC,YAAY,iBAAiB,OAAO,KAAK,KACzCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,iBAAgB,OAAO,EAAE,OAAO,2BAC9C,UAAAA,+BAAC,aAAU,EAAA,CACb;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA;AAAA,UA5CK,OAAO;AAAA,QAAA,CA8Cf;AAAA,MAAA;AAAA,IAAA;AAAA,IAIJ,gBACCC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,sBAAA;AAAA,QAEhB,UAAA;AAAA,UAAAD,+BAAC,SAAI,WAAU,WAAU,MAAK,gBAAe,SAAQ,aACnD,UAAAA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,UAAS;AAAA,cACT,GAAE;AAAA,cACF,UAAS;AAAA,YAAA;AAAA,UAAA,GAEb;AAAA,UACC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMStatCard-D5HV9r6d.js","sources":["../src/components/DataDisplay/LMStatCard/LMStatCard.tsx"],"sourcesContent":["import React from 'react'\nimport {\n COMPONENT_SIZE_ORDER,\n SIZE_GAP_CLASSES,\n SIZE_PADDING_CLASSES,\n clampComponentSize,\n} from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMStatCardProps {\n /** Title */\n title: string\n /** Value */\n value: string | number\n /** Description text */\n description?: string\n /** Left icon */\n icon?: React.ReactNode\n /** Trend value (percentage, positive/negative indicates direction; 0 means flat) */\n trend?: number\n /** Trend description text */\n trendText?: string\n /** Visual variant */\n variant?: 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info'\n /** Size */\n size?: ComponentSize\n /** Clickable */\n clickable?: boolean\n /** Click event */\n onClick?: () => void\n /** Class name */\n className?: string\n /** Value prefix (e.g., $) */\n prefix?: string\n /** Value suffix (e.g., %, times) */\n suffix?: string\n /** Show border */\n bordered?: boolean\n /** Show shadow */\n shadow?: boolean\n /** Compact mode: uses smaller spacing and fonts when enabled */\n compact?: boolean\n}\n\nconst ArrowUpIcon: React.FC = () => (\n <svg className=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 10V2M6 2l4 4M6 2L2 6\" />\n </svg>\n)\n\nconst ArrowDownIcon: React.FC = () => (\n <svg className=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 2v8M6 10l4-4M6 10l-4-4\" />\n </svg>\n)\n\nconst MinusIcon: React.FC = () => (\n <svg className=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2 6h8\" />\n </svg>\n)\n\nconst LMStatCard: React.FC<LMStatCardProps> = ({\n title,\n value,\n description,\n icon,\n trend,\n trendText,\n variant = 'default',\n size = 'md',\n clickable = false,\n onClick,\n className = '',\n prefix,\n suffix,\n bordered = true,\n shadow = true,\n compact = false,\n}) => {\n const resolvedSize = clampComponentSize(size, COMPONENT_SIZE_ORDER)\n\n const iconSizeClasses: Record<ComponentSize, string> = compact\n ? {\n xs: 'w-4 h-4',\n sm: 'w-5 h-5',\n md: 'w-6 h-6',\n lg: 'w-8 h-8',\n xl: 'w-10 h-10',\n '2xl': 'w-12 h-12',\n }\n : {\n xs: 'w-5 h-5',\n sm: 'w-6 h-6',\n md: 'w-10 h-10',\n lg: 'w-12 h-12',\n xl: 'w-14 h-14',\n '2xl': 'w-16 h-16',\n }\n\n const titleTextClasses: Record<ComponentSize, string> = compact\n ? {\n xs: 'text-[10px]',\n sm: 'text-[10px]',\n md: 'text-xs',\n lg: 'text-sm',\n xl: 'text-base',\n '2xl': 'text-lg',\n }\n : {\n xs: 'text-xs',\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n '2xl': 'text-xl',\n }\n\n const metaTextClasses: Record<ComponentSize, string> = compact\n ? {\n xs: 'text-[10px]',\n sm: 'text-[10px]',\n md: 'text-[10px]',\n lg: 'text-[10px]',\n xl: 'text-xs',\n '2xl': 'text-xs',\n }\n : {\n xs: 'text-xs',\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n xl: 'text-base',\n '2xl': 'text-lg',\n }\n\n const descriptionTextClasses: Record<ComponentSize, string> = {\n xs: 'text-xs',\n sm: 'text-xs',\n md: 'text-xs',\n lg: 'text-xs',\n xl: 'text-xs',\n '2xl': 'text-xs',\n }\n\n const valueTextClasses: Record<ComponentSize, string> = compact\n ? {\n xs: 'text-sm',\n sm: 'text-base',\n md: 'text-lg',\n lg: 'text-xl',\n xl: 'text-2xl',\n '2xl': 'text-3xl',\n }\n : {\n xs: 'text-lg',\n sm: 'text-xl',\n md: 'text-3xl',\n lg: 'text-4xl',\n xl: 'text-5xl',\n '2xl': 'text-6xl',\n }\n\n const roundedClasses = 'rounded-2xl'\n const borderClasses = bordered ? 'border' : ''\n const shadowClasses = shadow ? 'shadow-sm' : ''\n const clickableClasses = clickable ? 'cursor-pointer transition-transform hover:scale-105' : ''\n\n const baseClassName = `\n ${SIZE_PADDING_CLASSES[resolvedSize]} ${roundedClasses} ${borderClasses} ${shadowClasses} ${clickableClasses}\n backdrop-blur-md transition-all duration-300\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getCardStyles = () => {\n const baseStyles = {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n borderColor: 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n } as React.CSSProperties\n\n switch (variant) {\n case 'primary':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-primary-50)',\n borderColor: 'var(--lm-primary-200)',\n }\n case 'success':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-success-50)',\n borderColor: 'var(--lm-success-200)',\n }\n case 'warning':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-warning-50)',\n borderColor: 'var(--lm-warning-200)',\n }\n case 'error':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-error-50)',\n borderColor: 'var(--lm-error-200)',\n }\n case 'info':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-gray-50)',\n borderColor: 'var(--lm-gray-200)',\n }\n default:\n return baseStyles\n }\n }\n\n const getHoverStyles = () => {\n if (!clickable) return {}\n switch (variant) {\n case 'primary':\n return {\n backgroundColor: 'var(--lm-primary-100)',\n borderColor: 'var(--lm-primary-300)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'success':\n return {\n backgroundColor: 'var(--lm-success-100)',\n borderColor: 'var(--lm-success-300)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'warning':\n return {\n backgroundColor: 'var(--lm-warning-100)',\n borderColor: 'var(--lm-warning-300)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'error':\n return {\n backgroundColor: 'var(--lm-error-100)',\n borderColor: 'var(--lm-error-300)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'info':\n return {\n backgroundColor: 'var(--lm-gray-100)',\n borderColor: 'var(--lm-gray-300)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n default:\n return {\n backgroundColor: 'var(--lm-bg-paper)',\n borderColor: 'var(--lm-border-strong)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n }\n }\n\n const getIconStyles = () => {\n switch (variant) {\n case 'primary':\n return {\n color: 'var(--lm-primary-600)',\n backgroundColor: 'var(--lm-primary-100)',\n }\n case 'success':\n return {\n color: 'var(--lm-success-600)',\n backgroundColor: 'var(--lm-success-100)',\n }\n case 'warning':\n return {\n color: 'var(--lm-warning-600)',\n backgroundColor: 'var(--lm-warning-100)',\n }\n case 'error':\n return {\n color: 'var(--lm-error-600)',\n backgroundColor: 'var(--lm-error-100)',\n }\n case 'info':\n return {\n color: 'var(--lm-gray-600)',\n backgroundColor: 'var(--lm-gray-100)',\n }\n default:\n return {\n color: 'var(--lm-primary-600)',\n backgroundColor: 'var(--lm-bg-paper)',\n }\n }\n }\n\n const getValueStyles = () => {\n switch (variant) {\n case 'primary':\n return { color: 'var(--lm-primary-700)' }\n case 'success':\n return { color: 'var(--lm-success-700)' }\n case 'warning':\n return { color: 'var(--lm-warning-700)' }\n case 'error':\n return { color: 'var(--lm-error-700)' }\n case 'info':\n return { color: 'var(--lm-gray-700)' }\n default:\n return { color: 'var(--lm-text-primary)' }\n }\n }\n\n const getTrendStyles = () => {\n if (trend == null) return {}\n if (trend > 0) return { color: 'var(--lm-success-600)' }\n if (trend < 0) return { color: 'var(--lm-error-600)' }\n return { color: 'var(--lm-text-secondary)' }\n }\n\n const getTrendIcon = () => {\n if (trend == null) return null\n if (trend > 0) return <ArrowUpIcon />\n if (trend < 0) return <ArrowDownIcon />\n return <MinusIcon />\n }\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (e) => {\n if (!clickable) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick?.()\n }\n }\n\n return (\n <div\n className={baseClassName}\n style={getCardStyles()}\n onClick={clickable ? onClick : undefined}\n onKeyDown={handleKeyDown}\n onMouseEnter={(e) => {\n if (clickable) Object.assign(e.currentTarget.style, getHoverStyles())\n }}\n onMouseLeave={(e) => {\n if (clickable) Object.assign(e.currentTarget.style, getCardStyles())\n }}\n role={clickable ? 'button' : undefined}\n tabIndex={clickable ? 0 : undefined}\n aria-label={clickable ? title : undefined}\n >\n <div className=\"flex items-start justify-between overflow-hidden\">\n <div className=\"flex-1 min-w-0\">\n {/* Title and icon */}\n <div className=\"flex items-center gap-2 mb-2 min-w-0\">\n {icon && (\n <div\n className={`${iconSizeClasses[resolvedSize]} rounded-lg flex items-center justify-center shrink-0`}\n style={getIconStyles()}\n >\n {icon}\n </div>\n )}\n <h3\n className={`${titleTextClasses[resolvedSize]} font-medium truncate`}\n style={{ color: 'var(--lm-text-secondary)' }}\n title={title}\n >\n {title}\n </h3>\n </div>\n\n {/* Value area (prefix/suffix) */}\n <div\n className={`flex items-baseline ${SIZE_GAP_CLASSES[resolvedSize]} min-w-0 overflow-hidden w-full`}\n >\n {prefix && (\n <span\n className={`${metaTextClasses[resolvedSize]} shrink-0`}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n {prefix}\n </span>\n )}\n <span\n className={`font-bold ${valueTextClasses[resolvedSize]} overflow-hidden`}\n style={getValueStyles()}\n >\n {value}\n </span>\n {suffix && (\n <span\n className={`${metaTextClasses[resolvedSize]} shrink-0`}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n {suffix}\n </span>\n )}\n </div>\n\n {/* Description */}\n {description && (\n <p\n className={`${descriptionTextClasses[resolvedSize]} mt-1 truncate`}\n style={{ color: 'var(--lm-text-secondary)' }}\n title={description}\n >\n {description}\n </p>\n )}\n\n {/* Trend area */}\n {(trend != null || trendText) && (\n <div className={`flex items-center ${SIZE_GAP_CLASSES[resolvedSize]} mt-2`}>\n {trend != null && (\n <div className=\"flex items-center gap-1\" style={getTrendStyles()}>\n {getTrendIcon()}\n <span className=\"text-sm font-medium\">{Math.abs(trend)}%</span>\n </div>\n )}\n {trendText && (\n <span className=\"text-sm\" style={{ color: 'var(--lm-text-secondary)' }}>\n {trendText}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default LMStatCard\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMStatCard-MXs9Z0qH.cjs","sources":["../src/components/DataDisplay/LMStatCard/LMStatCard.tsx"],"sourcesContent":["import React from 'react'\nimport {\n COMPONENT_SIZE_ORDER,\n SIZE_GAP_CLASSES,\n SIZE_PADDING_CLASSES,\n clampComponentSize,\n} from '../../../utils/componentSizes'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMStatCardProps {\n /** Title */\n title: string\n /** Value */\n value: string | number\n /** Description text */\n description?: string\n /** Left icon */\n icon?: React.ReactNode\n /** Trend value (percentage, positive/negative indicates direction; 0 means flat) */\n trend?: number\n /** Trend description text */\n trendText?: string\n /** Visual variant */\n variant?: 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info'\n /** Size */\n size?: ComponentSize\n /** Clickable */\n clickable?: boolean\n /** Click event */\n onClick?: () => void\n /** Class name */\n className?: string\n /** Value prefix (e.g., $) */\n prefix?: string\n /** Value suffix (e.g., %, times) */\n suffix?: string\n /** Show border */\n bordered?: boolean\n /** Show shadow */\n shadow?: boolean\n /** Compact mode: uses smaller spacing and fonts when enabled */\n compact?: boolean\n}\n\nconst ArrowUpIcon: React.FC = () => (\n <svg className=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 10V2M6 2l4 4M6 2L2 6\" />\n </svg>\n)\n\nconst ArrowDownIcon: React.FC = () => (\n <svg className=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 2v8M6 10l4-4M6 10l-4-4\" />\n </svg>\n)\n\nconst MinusIcon: React.FC = () => (\n <svg className=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2 6h8\" />\n </svg>\n)\n\nconst LMStatCard: React.FC<LMStatCardProps> = ({\n title,\n value,\n description,\n icon,\n trend,\n trendText,\n variant = 'default',\n size = 'md',\n clickable = false,\n onClick,\n className = '',\n prefix,\n suffix,\n bordered = true,\n shadow = true,\n compact = false,\n}) => {\n const resolvedSize = clampComponentSize(size, COMPONENT_SIZE_ORDER)\n\n const iconSizeClasses: Record<ComponentSize, string> = compact\n ? {\n xs: 'w-4 h-4',\n sm: 'w-5 h-5',\n md: 'w-6 h-6',\n lg: 'w-8 h-8',\n xl: 'w-10 h-10',\n '2xl': 'w-12 h-12',\n }\n : {\n xs: 'w-5 h-5',\n sm: 'w-6 h-6',\n md: 'w-10 h-10',\n lg: 'w-12 h-12',\n xl: 'w-14 h-14',\n '2xl': 'w-16 h-16',\n }\n\n const titleTextClasses: Record<ComponentSize, string> = compact\n ? {\n xs: 'text-[10px]',\n sm: 'text-[10px]',\n md: 'text-xs',\n lg: 'text-sm',\n xl: 'text-base',\n '2xl': 'text-lg',\n }\n : {\n xs: 'text-xs',\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n '2xl': 'text-xl',\n }\n\n const metaTextClasses: Record<ComponentSize, string> = compact\n ? {\n xs: 'text-[10px]',\n sm: 'text-[10px]',\n md: 'text-[10px]',\n lg: 'text-[10px]',\n xl: 'text-xs',\n '2xl': 'text-xs',\n }\n : {\n xs: 'text-xs',\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n xl: 'text-base',\n '2xl': 'text-lg',\n }\n\n const descriptionTextClasses: Record<ComponentSize, string> = {\n xs: 'text-xs',\n sm: 'text-xs',\n md: 'text-xs',\n lg: 'text-xs',\n xl: 'text-xs',\n '2xl': 'text-xs',\n }\n\n const valueTextClasses: Record<ComponentSize, string> = compact\n ? {\n xs: 'text-sm',\n sm: 'text-base',\n md: 'text-lg',\n lg: 'text-xl',\n xl: 'text-2xl',\n '2xl': 'text-3xl',\n }\n : {\n xs: 'text-lg',\n sm: 'text-xl',\n md: 'text-3xl',\n lg: 'text-4xl',\n xl: 'text-5xl',\n '2xl': 'text-6xl',\n }\n\n const roundedClasses = 'rounded-2xl'\n const borderClasses = bordered ? 'border' : ''\n const shadowClasses = shadow ? 'shadow-sm' : ''\n const clickableClasses = clickable ? 'cursor-pointer transition-transform hover:scale-105' : ''\n\n const baseClassName = `\n ${SIZE_PADDING_CLASSES[resolvedSize]} ${roundedClasses} ${borderClasses} ${shadowClasses} ${clickableClasses}\n backdrop-blur-md transition-all duration-300\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')\n\n const getCardStyles = () => {\n const baseStyles = {\n backgroundColor: 'var(--lm-bg-elevated)',\n color: 'var(--lm-text-primary)',\n borderColor: 'var(--lm-border-default)',\n boxShadow: 'var(--lm-shadow-sm)',\n } as React.CSSProperties\n\n switch (variant) {\n case 'primary':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-primary-50)',\n borderColor: 'var(--lm-primary-200)',\n }\n case 'success':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-success-50)',\n borderColor: 'var(--lm-success-200)',\n }\n case 'warning':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-warning-50)',\n borderColor: 'var(--lm-warning-200)',\n }\n case 'error':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-error-50)',\n borderColor: 'var(--lm-error-200)',\n }\n case 'info':\n return {\n ...baseStyles,\n backgroundColor: 'var(--lm-gray-50)',\n borderColor: 'var(--lm-gray-200)',\n }\n default:\n return baseStyles\n }\n }\n\n const getHoverStyles = () => {\n if (!clickable) return {}\n switch (variant) {\n case 'primary':\n return {\n backgroundColor: 'var(--lm-primary-100)',\n borderColor: 'var(--lm-primary-300)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'success':\n return {\n backgroundColor: 'var(--lm-success-100)',\n borderColor: 'var(--lm-success-300)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'warning':\n return {\n backgroundColor: 'var(--lm-warning-100)',\n borderColor: 'var(--lm-warning-300)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'error':\n return {\n backgroundColor: 'var(--lm-error-100)',\n borderColor: 'var(--lm-error-300)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n case 'info':\n return {\n backgroundColor: 'var(--lm-gray-100)',\n borderColor: 'var(--lm-gray-300)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n default:\n return {\n backgroundColor: 'var(--lm-bg-paper)',\n borderColor: 'var(--lm-border-strong)',\n boxShadow: 'var(--lm-shadow-md)',\n }\n }\n }\n\n const getIconStyles = () => {\n switch (variant) {\n case 'primary':\n return {\n color: 'var(--lm-primary-600)',\n backgroundColor: 'var(--lm-primary-100)',\n }\n case 'success':\n return {\n color: 'var(--lm-success-600)',\n backgroundColor: 'var(--lm-success-100)',\n }\n case 'warning':\n return {\n color: 'var(--lm-warning-600)',\n backgroundColor: 'var(--lm-warning-100)',\n }\n case 'error':\n return {\n color: 'var(--lm-error-600)',\n backgroundColor: 'var(--lm-error-100)',\n }\n case 'info':\n return {\n color: 'var(--lm-gray-600)',\n backgroundColor: 'var(--lm-gray-100)',\n }\n default:\n return {\n color: 'var(--lm-primary-600)',\n backgroundColor: 'var(--lm-bg-paper)',\n }\n }\n }\n\n const getValueStyles = () => {\n switch (variant) {\n case 'primary':\n return { color: 'var(--lm-primary-700)' }\n case 'success':\n return { color: 'var(--lm-success-700)' }\n case 'warning':\n return { color: 'var(--lm-warning-700)' }\n case 'error':\n return { color: 'var(--lm-error-700)' }\n case 'info':\n return { color: 'var(--lm-gray-700)' }\n default:\n return { color: 'var(--lm-text-primary)' }\n }\n }\n\n const getTrendStyles = () => {\n if (trend == null) return {}\n if (trend > 0) return { color: 'var(--lm-success-600)' }\n if (trend < 0) return { color: 'var(--lm-error-600)' }\n return { color: 'var(--lm-text-secondary)' }\n }\n\n const getTrendIcon = () => {\n if (trend == null) return null\n if (trend > 0) return <ArrowUpIcon />\n if (trend < 0) return <ArrowDownIcon />\n return <MinusIcon />\n }\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (e) => {\n if (!clickable) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick?.()\n }\n }\n\n return (\n <div\n className={baseClassName}\n style={getCardStyles()}\n onClick={clickable ? onClick : undefined}\n onKeyDown={handleKeyDown}\n onMouseEnter={(e) => {\n if (clickable) Object.assign(e.currentTarget.style, getHoverStyles())\n }}\n onMouseLeave={(e) => {\n if (clickable) Object.assign(e.currentTarget.style, getCardStyles())\n }}\n role={clickable ? 'button' : undefined}\n tabIndex={clickable ? 0 : undefined}\n aria-label={clickable ? title : undefined}\n >\n <div className=\"flex items-start justify-between overflow-hidden\">\n <div className=\"flex-1 min-w-0\">\n {/* Title and icon */}\n <div className=\"flex items-center gap-2 mb-2 min-w-0\">\n {icon && (\n <div\n className={`${iconSizeClasses[resolvedSize]} rounded-lg flex items-center justify-center shrink-0`}\n style={getIconStyles()}\n >\n {icon}\n </div>\n )}\n <h3\n className={`${titleTextClasses[resolvedSize]} font-medium truncate`}\n style={{ color: 'var(--lm-text-secondary)' }}\n title={title}\n >\n {title}\n </h3>\n </div>\n\n {/* Value area (prefix/suffix) */}\n <div\n className={`flex items-baseline ${SIZE_GAP_CLASSES[resolvedSize]} min-w-0 overflow-hidden w-full`}\n >\n {prefix && (\n <span\n className={`${metaTextClasses[resolvedSize]} shrink-0`}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n {prefix}\n </span>\n )}\n <span\n className={`font-bold ${valueTextClasses[resolvedSize]} overflow-hidden`}\n style={getValueStyles()}\n >\n {value}\n </span>\n {suffix && (\n <span\n className={`${metaTextClasses[resolvedSize]} shrink-0`}\n style={{ color: 'var(--lm-text-secondary)' }}\n >\n {suffix}\n </span>\n )}\n </div>\n\n {/* Description */}\n {description && (\n <p\n className={`${descriptionTextClasses[resolvedSize]} mt-1 truncate`}\n style={{ color: 'var(--lm-text-secondary)' }}\n title={description}\n >\n {description}\n </p>\n )}\n\n {/* Trend area */}\n {(trend != null || trendText) && (\n <div className={`flex items-center ${SIZE_GAP_CLASSES[resolvedSize]} mt-2`}>\n {trend != null && (\n <div className=\"flex items-center gap-1\" style={getTrendStyles()}>\n {getTrendIcon()}\n <span className=\"text-sm font-medium\">{Math.abs(trend)}%</span>\n </div>\n )}\n {trendText && (\n <span className=\"text-sm\" style={{ color: 'var(--lm-text-secondary)' }}>\n {trendText}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default LMStatCard\n"],"names":["jsx","clampComponentSize","COMPONENT_SIZE_ORDER","SIZE_PADDING_CLASSES","jsxs","SIZE_GAP_CLASSES"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMSwitch-CP1_nrfU.js","sources":["../src/components/Form/LMSwitch/LMSwitch.tsx"],"sourcesContent":["import React, { useId } from 'react'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMSwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Size */\n size?: ComponentSize\n}\n\nconst sizeConfig = {\n xs: {\n container: 'p-2 gap-2',\n label: 'text-xs',\n description: 'text-xs mt-0.5',\n errorMessage: 'text-xs',\n track: 'w-7 h-4',\n thumb: 'w-2.5 h-2.5',\n translate: 'translate-x-3',\n },\n sm: {\n container: 'p-3 gap-2.5',\n label: 'text-sm',\n description: 'text-xs mt-1',\n errorMessage: 'text-xs',\n track: 'w-9 h-5',\n thumb: 'w-3 h-3',\n translate: 'translate-x-4',\n },\n md: {\n container: 'p-4 gap-3',\n label: 'text-base',\n description: 'text-sm mt-1',\n errorMessage: 'text-xs',\n track: 'w-11 h-6',\n thumb: 'w-4 h-4',\n translate: 'translate-x-5',\n },\n lg: {\n container: 'p-5 gap-4',\n label: 'text-lg',\n description: 'text-base mt-1.5',\n errorMessage: 'text-sm',\n track: 'w-14 h-7',\n thumb: 'w-5 h-5',\n translate: 'translate-x-7',\n },\n xl: {\n container: 'p-6 gap-4',\n label: 'text-xl',\n description: 'text-lg mt-2',\n errorMessage: 'text-sm',\n track: 'w-16 h-8',\n thumb: 'w-6 h-6',\n translate: 'translate-x-8',\n },\n '2xl': {\n container: 'p-8 gap-5',\n label: 'text-2xl',\n description: 'text-xl mt-2.5',\n errorMessage: 'text-base',\n track: 'w-20 h-10',\n thumb: 'w-8 h-8',\n translate: 'translate-x-10',\n },\n}\n\nconst LMSwitch: React.FC<LMSwitchProps> = ({\n label,\n description,\n error = false,\n errorMessage,\n size = 'md',\n id,\n ...props\n}) => {\n const autoId = useId()\n const controlId = id ?? `lm-switch-${autoId}`\n const errId = `lm-switch-err-${autoId}`\n\n const currentSize = sizeConfig[size]\n\n const getTrackBg = () => {\n if (props.disabled) return 'var(--lm-bg-paper)'\n if (error && !props.checked) return 'var(--lm-error-300)'\n if (props.checked) return 'var(--lm-primary-500)'\n return 'var(--lm-border-default)'\n }\n\n const getDisabledStyles = () => {\n if (props.disabled) {\n return {\n opacity: 0.6,\n cursor: 'not-allowed',\n } as React.CSSProperties\n }\n return {}\n }\n\n const getContainerStyles = () => {\n const base = { backgroundColor: 'var(--lm-bg-paper)' }\n return error ? { ...base, backgroundColor: 'var(--lm-error-50)' } : base\n }\n\n const getHoverContainerStyles = () =>\n error\n ? { backgroundColor: 'var(--lm-error-100)' }\n : { backgroundColor: 'var(--lm-bg-elevated)' }\n\n const getLabelStyles = () => {\n if (error) return { color: 'var(--lm-error-700)' }\n if (props.disabled)\n return { color: 'var(--lm-text-disabled)', cursor: 'not-allowed' }\n return { color: 'var(--lm-text-primary)', cursor: 'pointer' }\n }\n\n const getDescriptionStyles = () =>\n error\n ? { color: 'var(--lm-error-600)' }\n : { color: 'var(--lm-text-secondary)' }\n\n return (\n <div>\n <label\n htmlFor={controlId}\n className={`flex items-start rounded-2xl transition-colors duration-200 ${currentSize.container} ${\n props.disabled ? '' : 'cursor-pointer'\n }`}\n style={getContainerStyles()}\n onMouseEnter={(e) => {\n if (!props.disabled) {\n Object.assign(e.currentTarget.style, getHoverContainerStyles())\n }\n }}\n onMouseLeave={(e) => {\n if (!props.disabled) {\n Object.assign(e.currentTarget.style, getContainerStyles())\n }\n }}\n >\n <div className=\"shrink-0 relative\">\n <input\n type=\"checkbox\"\n id={controlId}\n {...props}\n className=\"sr-only peer\"\n aria-invalid={error || undefined}\n aria-describedby={errorMessage ? errId : undefined}\n style={getDisabledStyles()}\n />\n <div\n className={`${currentSize.track} rounded-full transition-all duration-300 relative`}\n style={{\n backgroundColor: getTrackBg(),\n ...getDisabledStyles(),\n }}\n >\n <div\n className={`${currentSize.thumb} absolute left-1 top-1/2 -translate-y-1/2 rounded-full transition-transform duration-300 ${\n props.checked ? currentSize.translate : 'translate-x-0'\n }`}\n style={{\n backgroundColor: 'var(--lm-bg-elevated)',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.1)',\n }}\n />\n </div>\n </div>\n\n {(label || description) && (\n <div className=\"flex-1\">\n {label && (\n <span\n className={`font-medium leading-tight transition-colors duration-200 ${currentSize.label}`}\n style={getLabelStyles()}\n >\n {label}\n </span>\n )}\n {description && (\n <p\n className={currentSize.description}\n style={getDescriptionStyles()}\n >\n {description}\n </p>\n )}\n </div>\n )}\n </label>\n\n {errorMessage && (\n <p\n id={errId}\n className={`flex items-center gap-1 mt-2 ${currentSize.errorMessage}`}\n style={{ color: 'var(--lm-error-500)' }}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <svg\n className=\"w-3 h-3\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {errorMessage}\n </p>\n )}\n </div>\n )\n}\n\nexport default LMSwitch\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LMSwitch-DYoSH6wE.cjs","sources":["../src/components/Form/LMSwitch/LMSwitch.tsx"],"sourcesContent":["import React, { useId } from 'react'\nimport type { ComponentSize } from '../../../utils/componentSizes'\n\nexport interface LMSwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Error state */\n error?: boolean\n /** Error message */\n errorMessage?: string\n /** Size */\n size?: ComponentSize\n}\n\nconst sizeConfig = {\n xs: {\n container: 'p-2 gap-2',\n label: 'text-xs',\n description: 'text-xs mt-0.5',\n errorMessage: 'text-xs',\n track: 'w-7 h-4',\n thumb: 'w-2.5 h-2.5',\n translate: 'translate-x-3',\n },\n sm: {\n container: 'p-3 gap-2.5',\n label: 'text-sm',\n description: 'text-xs mt-1',\n errorMessage: 'text-xs',\n track: 'w-9 h-5',\n thumb: 'w-3 h-3',\n translate: 'translate-x-4',\n },\n md: {\n container: 'p-4 gap-3',\n label: 'text-base',\n description: 'text-sm mt-1',\n errorMessage: 'text-xs',\n track: 'w-11 h-6',\n thumb: 'w-4 h-4',\n translate: 'translate-x-5',\n },\n lg: {\n container: 'p-5 gap-4',\n label: 'text-lg',\n description: 'text-base mt-1.5',\n errorMessage: 'text-sm',\n track: 'w-14 h-7',\n thumb: 'w-5 h-5',\n translate: 'translate-x-7',\n },\n xl: {\n container: 'p-6 gap-4',\n label: 'text-xl',\n description: 'text-lg mt-2',\n errorMessage: 'text-sm',\n track: 'w-16 h-8',\n thumb: 'w-6 h-6',\n translate: 'translate-x-8',\n },\n '2xl': {\n container: 'p-8 gap-5',\n label: 'text-2xl',\n description: 'text-xl mt-2.5',\n errorMessage: 'text-base',\n track: 'w-20 h-10',\n thumb: 'w-8 h-8',\n translate: 'translate-x-10',\n },\n}\n\nconst LMSwitch: React.FC<LMSwitchProps> = ({\n label,\n description,\n error = false,\n errorMessage,\n size = 'md',\n id,\n ...props\n}) => {\n const autoId = useId()\n const controlId = id ?? `lm-switch-${autoId}`\n const errId = `lm-switch-err-${autoId}`\n\n const currentSize = sizeConfig[size]\n\n const getTrackBg = () => {\n if (props.disabled) return 'var(--lm-bg-paper)'\n if (error && !props.checked) return 'var(--lm-error-300)'\n if (props.checked) return 'var(--lm-primary-500)'\n return 'var(--lm-border-default)'\n }\n\n const getDisabledStyles = () => {\n if (props.disabled) {\n return {\n opacity: 0.6,\n cursor: 'not-allowed',\n } as React.CSSProperties\n }\n return {}\n }\n\n const getContainerStyles = () => {\n const base = { backgroundColor: 'var(--lm-bg-paper)' }\n return error ? { ...base, backgroundColor: 'var(--lm-error-50)' } : base\n }\n\n const getHoverContainerStyles = () =>\n error\n ? { backgroundColor: 'var(--lm-error-100)' }\n : { backgroundColor: 'var(--lm-bg-elevated)' }\n\n const getLabelStyles = () => {\n if (error) return { color: 'var(--lm-error-700)' }\n if (props.disabled)\n return { color: 'var(--lm-text-disabled)', cursor: 'not-allowed' }\n return { color: 'var(--lm-text-primary)', cursor: 'pointer' }\n }\n\n const getDescriptionStyles = () =>\n error\n ? { color: 'var(--lm-error-600)' }\n : { color: 'var(--lm-text-secondary)' }\n\n return (\n <div>\n <label\n htmlFor={controlId}\n className={`flex items-start rounded-2xl transition-colors duration-200 ${currentSize.container} ${\n props.disabled ? '' : 'cursor-pointer'\n }`}\n style={getContainerStyles()}\n onMouseEnter={(e) => {\n if (!props.disabled) {\n Object.assign(e.currentTarget.style, getHoverContainerStyles())\n }\n }}\n onMouseLeave={(e) => {\n if (!props.disabled) {\n Object.assign(e.currentTarget.style, getContainerStyles())\n }\n }}\n >\n <div className=\"shrink-0 relative\">\n <input\n type=\"checkbox\"\n id={controlId}\n {...props}\n className=\"sr-only peer\"\n aria-invalid={error || undefined}\n aria-describedby={errorMessage ? errId : undefined}\n style={getDisabledStyles()}\n />\n <div\n className={`${currentSize.track} rounded-full transition-all duration-300 relative`}\n style={{\n backgroundColor: getTrackBg(),\n ...getDisabledStyles(),\n }}\n >\n <div\n className={`${currentSize.thumb} absolute left-1 top-1/2 -translate-y-1/2 rounded-full transition-transform duration-300 ${\n props.checked ? currentSize.translate : 'translate-x-0'\n }`}\n style={{\n backgroundColor: 'var(--lm-bg-elevated)',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.1)',\n }}\n />\n </div>\n </div>\n\n {(label || description) && (\n <div className=\"flex-1\">\n {label && (\n <span\n className={`font-medium leading-tight transition-colors duration-200 ${currentSize.label}`}\n style={getLabelStyles()}\n >\n {label}\n </span>\n )}\n {description && (\n <p\n className={currentSize.description}\n style={getDescriptionStyles()}\n >\n {description}\n </p>\n )}\n </div>\n )}\n </label>\n\n {errorMessage && (\n <p\n id={errId}\n className={`flex items-center gap-1 mt-2 ${currentSize.errorMessage}`}\n style={{ color: 'var(--lm-error-500)' }}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <svg\n className=\"w-3 h-3\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {errorMessage}\n </p>\n )}\n </div>\n )\n}\n\nexport default LMSwitch\n"],"names":["useId","jsxs","jsx"],"mappings":"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"}