@intlayer/design-system 8.11.3 → 8.12.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/dist/esm/api/hooks/project.mjs +110 -1
  2. package/dist/esm/api/hooks/project.mjs.map +1 -1
  3. package/dist/esm/api/index.mjs +2 -2
  4. package/dist/esm/api/useAuth/useOAuth2.mjs +1 -1
  5. package/dist/esm/api/useIntlayerAPI.mjs +1 -1
  6. package/dist/esm/components/Accordion/Accordion.mjs.map +1 -1
  7. package/dist/esm/components/Badge/index.mjs +18 -55
  8. package/dist/esm/components/Badge/index.mjs.map +1 -1
  9. package/dist/esm/components/Breadcrumb/index.mjs +12 -12
  10. package/dist/esm/components/Breadcrumb/index.mjs.map +1 -1
  11. package/dist/esm/components/Browser/Browser.mjs +1 -1
  12. package/dist/esm/components/Browser/Browser.mjs.map +1 -1
  13. package/dist/esm/components/Button/Button.mjs +60 -117
  14. package/dist/esm/components/Button/Button.mjs.map +1 -1
  15. package/dist/esm/components/Button/index.mjs +2 -2
  16. package/dist/esm/components/Carousel/index.mjs +3 -3
  17. package/dist/esm/components/Carousel/index.mjs.map +1 -1
  18. package/dist/esm/components/Container/index.mjs +1 -71
  19. package/dist/esm/components/Container/index.mjs.map +1 -1
  20. package/dist/esm/components/ContentEditor/ContentEditor.mjs +0 -1
  21. package/dist/esm/components/ContentEditor/ContentEditor.mjs.map +1 -1
  22. package/dist/esm/components/ContentEditor/ContentEditorInput.mjs +2 -2
  23. package/dist/esm/components/ContentEditor/ContentEditorInput.mjs.map +1 -1
  24. package/dist/esm/components/ContentEditor/ContentEditorTextArea.mjs +2 -2
  25. package/dist/esm/components/ContentEditor/ContentEditorTextArea.mjs.map +1 -1
  26. package/dist/esm/components/ContentEditor/index.mjs +1 -1
  27. package/dist/esm/components/CopyButton/index.mjs +4 -4
  28. package/dist/esm/components/CopyButton/index.mjs.map +1 -1
  29. package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs +6 -7
  30. package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs.map +1 -1
  31. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs +0 -1
  32. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs.map +1 -1
  33. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs +3 -4
  34. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs.map +1 -1
  35. package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs +3 -3
  36. package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs.map +1 -1
  37. package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs +3 -3
  38. package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs.map +1 -1
  39. package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +2 -3
  40. package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs.map +1 -1
  41. package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs +2 -3
  42. package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs.map +1 -1
  43. package/dist/esm/components/DictionaryFieldEditor/VersionSwitcherDropDown/VersionSwitcher.mjs +1 -1
  44. package/dist/esm/components/DictionaryFieldEditor/VersionSwitcherDropDown/VersionSwitcher.mjs.map +1 -1
  45. package/dist/esm/components/DropDown/index.mjs +3 -23
  46. package/dist/esm/components/DropDown/index.mjs.map +1 -1
  47. package/dist/esm/components/EditableField/EditableFieldLayout.mjs +1 -1
  48. package/dist/esm/components/EditableField/EditableFieldLayout.mjs.map +1 -1
  49. package/dist/esm/components/EditableField/EditableFieldTextArea.mjs +1 -1
  50. package/dist/esm/components/IDE/CopyCode.mjs +0 -1
  51. package/dist/esm/components/IDE/CopyCode.mjs.map +1 -1
  52. package/dist/esm/components/Input/Checkbox.mjs +2 -22
  53. package/dist/esm/components/Input/Checkbox.mjs.map +1 -1
  54. package/dist/esm/components/Input/Input.mjs +1 -11
  55. package/dist/esm/components/Input/Input.mjs.map +1 -1
  56. package/dist/esm/components/Input/Radio.mjs +82 -0
  57. package/dist/esm/components/Input/Radio.mjs.map +1 -0
  58. package/dist/esm/components/Input/index.mjs +4 -3
  59. package/dist/esm/components/KeyboardShortcut/KeyboardShortcut.mjs +1 -52
  60. package/dist/esm/components/KeyboardShortcut/KeyboardShortcut.mjs.map +1 -1
  61. package/dist/esm/components/KeyboardShortcut/index.mjs +2 -2
  62. package/dist/esm/components/Link/Link.mjs +33 -85
  63. package/dist/esm/components/Link/Link.mjs.map +1 -1
  64. package/dist/esm/components/Link/index.mjs +2 -2
  65. package/dist/esm/components/LocaleSwitcherContentDropDown/LocaleSwitcherContent.mjs +2 -2
  66. package/dist/esm/components/LocaleSwitcherContentDropDown/LocaleSwitcherContent.mjs.map +1 -1
  67. package/dist/esm/components/LocaleSwitcherDropDown/LocaleSwitcher.mjs +1 -1
  68. package/dist/esm/components/LocaleSwitcherDropDown/LocaleSwitcher.mjs.map +1 -1
  69. package/dist/esm/components/MarkDownRender/MarkDownIframe.mjs +3 -3
  70. package/dist/esm/components/MarkDownRender/MarkDownIframe.mjs.map +1 -1
  71. package/dist/esm/components/Modal/Modal.mjs +3 -14
  72. package/dist/esm/components/Modal/Modal.mjs.map +1 -1
  73. package/dist/esm/components/Modal/index.mjs +2 -2
  74. package/dist/esm/components/Navbar/DesktopNavbar.mjs +1 -1
  75. package/dist/esm/components/Navbar/DesktopNavbar.mjs.map +1 -1
  76. package/dist/esm/components/Pagination/Pagination.mjs +2 -14
  77. package/dist/esm/components/Pagination/Pagination.mjs.map +1 -1
  78. package/dist/esm/components/Pagination/index.mjs +2 -2
  79. package/dist/esm/components/Pattern/DotPattern.mjs +1 -1
  80. package/dist/esm/components/Pattern/DotPattern.mjs.map +1 -1
  81. package/dist/esm/components/Popover/dynamic.mjs +4 -4
  82. package/dist/esm/components/Popover/dynamic.mjs.map +1 -1
  83. package/dist/esm/components/Popover/index.mjs +2 -2
  84. package/dist/esm/components/Popover/static.mjs +6 -28
  85. package/dist/esm/components/Popover/static.mjs.map +1 -1
  86. package/dist/esm/components/RightDrawer/RightDrawer.mjs +1 -1
  87. package/dist/esm/components/RightDrawer/RightDrawer.mjs.map +1 -1
  88. package/dist/esm/components/Select/Multiselect.mjs +4 -4
  89. package/dist/esm/components/Select/Multiselect.mjs.map +1 -1
  90. package/dist/esm/components/Select/Select.mjs +3 -15
  91. package/dist/esm/components/Select/Select.mjs.map +1 -1
  92. package/dist/esm/components/Select/index.mjs +2 -2
  93. package/dist/esm/components/Steps/index.mjs +37 -27
  94. package/dist/esm/components/Steps/index.mjs.map +1 -1
  95. package/dist/esm/components/Steps/steps.content.mjs +55 -0
  96. package/dist/esm/components/Steps/steps.content.mjs.map +1 -0
  97. package/dist/esm/components/SwitchSelector/SwitchSelector.mjs +19 -35
  98. package/dist/esm/components/SwitchSelector/SwitchSelector.mjs.map +1 -1
  99. package/dist/esm/components/SwitchSelector/VerticalSwitchSelector.mjs +20 -20
  100. package/dist/esm/components/SwitchSelector/VerticalSwitchSelector.mjs.map +1 -1
  101. package/dist/esm/components/SwitchSelector/index.mjs +2 -2
  102. package/dist/esm/components/Tab/Tab.mjs +2 -2
  103. package/dist/esm/components/Tab/Tab.mjs.map +1 -1
  104. package/dist/esm/components/TabSelector/TabSelector.mjs +1 -11
  105. package/dist/esm/components/TabSelector/TabSelector.mjs.map +1 -1
  106. package/dist/esm/components/TabSelector/index.mjs +2 -2
  107. package/dist/esm/components/Table/ExpandButton.mjs +0 -1
  108. package/dist/esm/components/Table/ExpandButton.mjs.map +1 -1
  109. package/dist/esm/components/Table/SmartTable.mjs +1 -1
  110. package/dist/esm/components/Table/SmartTable.mjs.map +1 -1
  111. package/dist/esm/components/Tag/index.mjs +51 -205
  112. package/dist/esm/components/Tag/index.mjs.map +1 -1
  113. package/dist/esm/components/TechLogo/TechLogo.mjs +36 -37
  114. package/dist/esm/components/TechLogo/TechLogo.mjs.map +1 -1
  115. package/dist/esm/components/TechLogo/index.mjs +1 -2
  116. package/dist/esm/components/TechLogo/types.mjs +0 -44
  117. package/dist/esm/components/TextArea/AutoSizeTextArea.mjs +1 -1
  118. package/dist/esm/components/TextArea/AutoSizeTextArea.mjs.map +1 -1
  119. package/dist/esm/components/TextArea/ContentEditableTextArea.mjs.map +1 -1
  120. package/dist/esm/components/TextArea/TextArea.mjs +2 -2
  121. package/dist/esm/components/TextArea/TextArea.mjs.map +1 -1
  122. package/dist/esm/components/TextArea/index.mjs +2 -2
  123. package/dist/esm/components/ThemeSwitcherDropDown/DesktopThemeSwitcher.mjs +1 -2
  124. package/dist/esm/components/ThemeSwitcherDropDown/DesktopThemeSwitcher.mjs.map +1 -1
  125. package/dist/esm/components/ThemeSwitcherDropDown/MobileThemeSwitcher.mjs +0 -1
  126. package/dist/esm/components/ThemeSwitcherDropDown/MobileThemeSwitcher.mjs.map +1 -1
  127. package/dist/esm/components/ThemeSwitcherDropDown/index.mjs +1 -2
  128. package/dist/esm/components/ThemeSwitcherDropDown/types.mjs +0 -11
  129. package/dist/esm/components/index.mjs +24 -23
  130. package/dist/types/api/hooks/project.d.ts +8 -1
  131. package/dist/types/api/hooks/project.d.ts.map +1 -1
  132. package/dist/types/api/index.d.ts +2 -2
  133. package/dist/types/api/useIntlayerAPI.d.ts +10 -3
  134. package/dist/types/api/useIntlayerAPI.d.ts.map +1 -1
  135. package/dist/types/components/Accordion/Accordion.d.ts.map +1 -1
  136. package/dist/types/components/Badge/index.d.ts +6 -25
  137. package/dist/types/components/Badge/index.d.ts.map +1 -1
  138. package/dist/types/components/Breadcrumb/index.d.ts +1 -1
  139. package/dist/types/components/Browser/Browser.d.ts +1 -1
  140. package/dist/types/components/Browser/Browser.d.ts.map +1 -1
  141. package/dist/types/components/Button/Button.d.ts +9 -45
  142. package/dist/types/components/Button/Button.d.ts.map +1 -1
  143. package/dist/types/components/Carousel/index.d.ts.map +1 -1
  144. package/dist/types/components/CollapsibleTable/CollapsibleTable.d.ts +2 -2
  145. package/dist/types/components/Command/index.d.ts +3 -3
  146. package/dist/types/components/Command/index.d.ts.map +1 -1
  147. package/dist/types/components/Container/index.d.ts +11 -60
  148. package/dist/types/components/Container/index.d.ts.map +1 -1
  149. package/dist/types/components/ContentEditor/ContentEditor.d.ts.map +1 -1
  150. package/dist/types/components/CopyButton/index.d.ts +3 -3
  151. package/dist/types/components/CopyButton/index.d.ts.map +1 -1
  152. package/dist/types/components/DictionaryFieldEditor/ContentEditorView/SafeHtmlRenderer.d.ts +1 -1
  153. package/dist/types/components/DictionaryFieldEditor/ContentEditorView/SafeHtmlRenderer.d.ts.map +1 -1
  154. package/dist/types/components/DictionaryFieldEditor/ContentEditorView/TextEditor.d.ts.map +1 -1
  155. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.d.ts.map +1 -1
  156. package/dist/types/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.d.ts.map +1 -1
  157. package/dist/types/components/DictionaryFieldEditor/SaveForm/SaveForm.d.ts.map +1 -1
  158. package/dist/types/components/DictionaryFieldEditor/StructureView/StructureView.d.ts.map +1 -1
  159. package/dist/types/components/DictionaryFieldEditor/VersionSwitcherDropDown/VersionSwitcher.d.ts.map +1 -1
  160. package/dist/types/components/DropDown/index.d.ts +4 -14
  161. package/dist/types/components/DropDown/index.d.ts.map +1 -1
  162. package/dist/types/components/Form/FormBase.d.ts +1 -1
  163. package/dist/types/components/Form/FormBase.d.ts.map +1 -1
  164. package/dist/types/components/Form/FormField.d.ts +1 -1
  165. package/dist/types/components/Form/FormField.d.ts.map +1 -1
  166. package/dist/types/components/Form/elements/EditableFieldInputElement.d.ts +1 -1
  167. package/dist/types/components/Form/elements/EditableFieldInputElement.d.ts.map +1 -1
  168. package/dist/types/components/Form/elements/EditableFieldTextAreaElement.d.ts +1 -1
  169. package/dist/types/components/Form/elements/EditableFieldTextAreaElement.d.ts.map +1 -1
  170. package/dist/types/components/Form/elements/FormElement.d.ts +1 -1
  171. package/dist/types/components/Form/elements/FormElement.d.ts.map +1 -1
  172. package/dist/types/components/Form/elements/MultiselectElement.d.ts +1 -1
  173. package/dist/types/components/Form/elements/MultiselectElement.d.ts.map +1 -1
  174. package/dist/types/components/Form/elements/OTPElement.d.ts +1 -1
  175. package/dist/types/components/Form/elements/OTPElement.d.ts.map +1 -1
  176. package/dist/types/components/Form/elements/SelectElement.d.ts +1 -1
  177. package/dist/types/components/Form/elements/SelectElement.d.ts.map +1 -1
  178. package/dist/types/components/Form/elements/SwitchSelectorElement.d.ts +1 -1
  179. package/dist/types/components/Form/elements/SwitchSelectorElement.d.ts.map +1 -1
  180. package/dist/types/components/IDE/CodeBlockHighlight.d.ts +1 -1
  181. package/dist/types/components/IDE/CodeBlockHighlight.d.ts.map +1 -1
  182. package/dist/types/components/Input/Checkbox.d.ts +4 -20
  183. package/dist/types/components/Input/Checkbox.d.ts.map +1 -1
  184. package/dist/types/components/Input/Input.d.ts +3 -9
  185. package/dist/types/components/Input/Input.d.ts.map +1 -1
  186. package/dist/types/components/Input/OTPInput.d.ts +1 -1
  187. package/dist/types/components/Input/OTPInput.d.ts.map +1 -1
  188. package/dist/types/components/Input/Radio.d.ts +25 -0
  189. package/dist/types/components/Input/Radio.d.ts.map +1 -0
  190. package/dist/types/components/Input/SearchInput.d.ts +1 -1
  191. package/dist/types/components/Input/SearchInput.d.ts.map +1 -1
  192. package/dist/types/components/Input/index.d.ts +2 -1
  193. package/dist/types/components/KeyboardShortcut/KeyboardShortcut.d.ts +1 -47
  194. package/dist/types/components/KeyboardShortcut/KeyboardShortcut.d.ts.map +1 -1
  195. package/dist/types/components/Link/Link.d.ts +8 -47
  196. package/dist/types/components/Link/Link.d.ts.map +1 -1
  197. package/dist/types/components/Loader/spinner.d.ts +1 -1
  198. package/dist/types/components/Loader/spinner.d.ts.map +1 -1
  199. package/dist/types/components/LocaleSwitcherContentDropDown/LocaleSwitcherContent.d.ts.map +1 -1
  200. package/dist/types/components/MarkDownRender/MarkDownRender.d.ts +44 -44
  201. package/dist/types/components/MarkDownRender/MarkDownRender.d.ts.map +1 -1
  202. package/dist/types/components/MaxWidthSmoother/index.d.ts +1 -1
  203. package/dist/types/components/MaxWidthSmoother/index.d.ts.map +1 -1
  204. package/dist/types/components/Modal/Modal.d.ts +2 -8
  205. package/dist/types/components/Modal/Modal.d.ts.map +1 -1
  206. package/dist/types/components/Navbar/Burger.d.ts +1 -1
  207. package/dist/types/components/Navbar/Burger.d.ts.map +1 -1
  208. package/dist/types/components/Navbar/DesktopNavbar.d.ts +1 -1
  209. package/dist/types/components/Navbar/DesktopNavbar.d.ts.map +1 -1
  210. package/dist/types/components/Navbar/MobileNavbar.d.ts +1 -1
  211. package/dist/types/components/Navbar/MobileNavbar.d.ts.map +1 -1
  212. package/dist/types/components/Navbar/index.d.ts +1 -1
  213. package/dist/types/components/Navbar/index.d.ts.map +1 -1
  214. package/dist/types/components/Pagination/Pagination.d.ts +2 -10
  215. package/dist/types/components/Pagination/Pagination.d.ts.map +1 -1
  216. package/dist/types/components/Popover/dynamic.d.ts.map +1 -1
  217. package/dist/types/components/Popover/static.d.ts +5 -17
  218. package/dist/types/components/Popover/static.d.ts.map +1 -1
  219. package/dist/types/components/Select/Multiselect.d.ts +3 -3
  220. package/dist/types/components/Select/Select.d.ts +3 -8
  221. package/dist/types/components/Select/Select.d.ts.map +1 -1
  222. package/dist/types/components/SocialNetworks/index.d.ts +1 -1
  223. package/dist/types/components/Steps/index.d.ts +4 -4
  224. package/dist/types/components/Steps/index.d.ts.map +1 -1
  225. package/dist/types/components/Steps/steps.content.d.ts +52 -0
  226. package/dist/types/components/Steps/steps.content.d.ts.map +1 -0
  227. package/dist/types/components/SwitchSelector/SwitchSelector.d.ts +4 -16
  228. package/dist/types/components/SwitchSelector/SwitchSelector.d.ts.map +1 -1
  229. package/dist/types/components/SwitchSelector/VerticalSwitchSelector.d.ts +2 -2
  230. package/dist/types/components/SwitchSelector/VerticalSwitchSelector.d.ts.map +1 -1
  231. package/dist/types/components/Tab/Tab.d.ts +2 -2
  232. package/dist/types/components/Tab/Tab.d.ts.map +1 -1
  233. package/dist/types/components/TabSelector/TabSelector.d.ts +2 -10
  234. package/dist/types/components/TabSelector/TabSelector.d.ts.map +1 -1
  235. package/dist/types/components/Table/TableElements.d.ts +4 -4
  236. package/dist/types/components/Table/TableElements.d.ts.map +1 -1
  237. package/dist/types/components/Tag/index.d.ts +44 -83
  238. package/dist/types/components/Tag/index.d.ts.map +1 -1
  239. package/dist/types/components/TechLogo/TechLogo.d.ts.map +1 -1
  240. package/dist/types/components/TechLogo/index.d.ts +1 -1
  241. package/dist/types/components/TechLogo/logos/Lit.d.ts +1 -1
  242. package/dist/types/components/TechLogo/logos/Lit.d.ts.map +1 -1
  243. package/dist/types/components/TechLogo/logos/Vanilla.d.ts +1 -1
  244. package/dist/types/components/TechLogo/logos/Vanilla.d.ts.map +1 -1
  245. package/dist/types/components/TechLogo/types.d.ts +1 -38
  246. package/dist/types/components/TechLogo/types.d.ts.map +1 -1
  247. package/dist/types/components/TextArea/AutoSizeTextArea.d.ts +1 -1
  248. package/dist/types/components/TextArea/ContentEditableTextArea.d.ts +3 -3
  249. package/dist/types/components/TextArea/TextArea.d.ts +6 -6
  250. package/dist/types/components/TextArea/TextArea.d.ts.map +1 -1
  251. package/dist/types/components/ThemeSwitcherDropDown/types.d.ts +1 -5
  252. package/dist/types/components/ThemeSwitcherDropDown/types.d.ts.map +1 -1
  253. package/dist/types/components/Toaster/Toast.d.ts +1 -1
  254. package/dist/types/components/Toaster/Toaster.d.ts +1 -1
  255. package/dist/types/components/Toaster/Toaster.d.ts.map +1 -1
  256. package/dist/types/components/index.d.ts +5 -2
  257. package/package.json +23 -24
  258. package/dist/esm/components/TechLogo/types.mjs.map +0 -1
  259. package/dist/esm/components/ThemeSwitcherDropDown/types.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TabSelector.mjs","names":[],"sources":["../../../../src/components/TabSelector/TabSelector.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ItemSelectorOrientation,\n useItemSelector,\n} from '@hooks/useItemSelector';\nimport { cn } from '@utils/cn';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport {\n cloneElement,\n type HTMLAttributes,\n type MouseEvent,\n type ReactElement,\n useEffect,\n useRef,\n} from 'react';\n\nexport enum TabSelectorColor {\n PRIMARY = 'primary',\n SECONDARY = 'secondary',\n ERROR = 'error',\n NEUTRAL = 'neutral',\n LIGHT = 'light',\n DARK = 'dark',\n TEXT = 'text',\n}\n\nconst tabSelectorVariant = cva(\n 'relative z-0 flex size-full flex-row items-center gap-2',\n {\n variants: {\n color: {\n primary: 'border-primary text-primary',\n secondary: 'border-secondary text-secondary',\n error: 'border-error bg-error text-error',\n neutral: 'border-neutral text-neutral',\n light: 'border-white text-white',\n dark: 'border-neutral-800 text-neutral-800',\n text: 'border-text text-text',\n },\n },\n defaultVariants: {\n color: 'primary',\n },\n }\n);\n\nconst indicatorVariant = cva(\n 'absolute -z-1 rounded-lg duration-300 ease-in-out motion-reduce:transition-none',\n {\n variants: {\n color: {\n primary: 'bg-primary/10 aria-selected:text-text',\n secondary: 'bg-secondary/10 aria-selected:text-text',\n error: 'bg-error/10 aria-selected:text-text',\n neutral: 'bg-neutral/10 aria-selected:text-white/10',\n light: 'bg-white/10 aria-selected:text-black',\n dark: 'bg-neutral-800/10 aria-selected:text-white',\n text: 'bg-text/10 aria-selected:text-text-opposite',\n },\n orientation: {\n horizontal: 'top-0 h-full w-auto transition-[left,width]',\n vertical: 'left-0 h-auto w-full transition-[top,height]',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n }\n);\n\nexport type TabSelectorItemProps = HTMLAttributes<HTMLElement> & {\n key: string | number;\n};\n\nexport type TabSelectorProps<T extends TabSelectorItemProps> = {\n tabs: ReactElement<T>[];\n selectedChoice: T['key'];\n onTabClick?: (choice: T['key']) => void;\n hoverable?: boolean;\n orientation?: ItemSelectorOrientation;\n} & HTMLAttributes<HTMLElement> &\n Omit<VariantProps<typeof tabSelectorVariant>, 'color'> & {\n color?: TabSelectorColor | `${TabSelectorColor}`;\n };\n\n/**\n *\n * Component that allows the user to select one of the provided choices.\n *\n * Example:\n * ```jsx\n * <TabSelector\n * selectedChoice=\"option1\"\n * onTabClick={(choice) => console.log(choice)}\n * hoverable={true}\n * >\n * <Button key=\"option1\"/>\n * <Button key=\"option2\"/>\n * <Button key=\"option3\"/>\n * </TabSelector>\n * ```\n */\nexport const TabSelector = <T extends TabSelectorItemProps>({\n tabs,\n selectedChoice,\n onTabClick,\n color = TabSelectorColor.PRIMARY,\n hoverable = false,\n orientation = 'horizontal',\n className,\n}: TabSelectorProps<T>) => {\n const optionsRefs = useRef<HTMLElement[]>([]);\n const indicatorRef = useRef<HTMLDivElement | null>(null);\n const { choiceIndicatorPosition, calculatePosition } = useItemSelector(\n optionsRefs,\n { isHoverable: hoverable, orientation }\n );\n\n useEffect(() => {\n calculatePosition();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedChoice]);\n\n return (\n <div\n className={cn(\n tabSelectorVariant({\n color,\n }),\n className\n )}\n aria-orientation={orientation}\n aria-multiselectable=\"false\"\n role=\"tablist\"\n >\n {tabs.map((Tab, index) => {\n const key = Tab.key!;\n\n const isSelected = selectedChoice === key;\n\n return cloneElement(Tab, {\n key: key ?? index,\n role: 'tab',\n onClick: (e: MouseEvent<HTMLElement>) => {\n Tab.props?.onClick?.(e);\n onTabClick?.(key);\n },\n 'aria-selected': isSelected,\n 'data-active': isSelected as unknown as string,\n tabIndex: isSelected ? 0 : -1,\n ref: (el: HTMLElement) => {\n optionsRefs.current[index] = el!;\n },\n } as unknown as T);\n })}\n {choiceIndicatorPosition && (\n <div\n className={cn(\n indicatorVariant({\n color,\n orientation,\n })\n )}\n style={choiceIndicatorPosition}\n ref={indicatorRef}\n key={`${selectedChoice}${JSON.stringify(tabs.map((tab) => tab.key))}`}\n />\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;AAiBA,IAAY,mBAAL;CACL;CACA;CACA;CACA;CACA;CACA;CACA;;AACF;AAEA,MAAM,qBAAqB,IACzB,2DACA;CACE,UAAU,EACR,OAAO;EACL,SAAS;EACT,WAAW;EACX,OAAO;EACP,SAAS;EACT,OAAO;EACP,MAAM;EACN,MAAM;CACR,EACF;CACA,iBAAiB,EACf,OAAO,UACT;AACF,CACF;AAEA,MAAM,mBAAmB,IACvB,mFACA;CACE,UAAU;EACR,OAAO;GACL,SAAS;GACT,WAAW;GACX,OAAO;GACP,SAAS;GACT,OAAO;GACP,MAAM;GACN,MAAM;EACR;EACA,aAAa;GACX,YAAY;GACZ,UAAU;EACZ;CACF;CACA,iBAAiB,EACf,aAAa,aACf;AACF,CACF;;;;;;;;;;;;;;;;;;AAkCA,MAAa,eAA+C,EAC1D,MACA,gBACA,YACA,mBACA,YAAY,OACZ,cAAc,cACd,gBACyB;CACzB,MAAM,cAAc,OAAsB,CAAC,CAAC;CAC5C,MAAM,eAAe,OAA8B,IAAI;CACvD,MAAM,EAAE,yBAAyB,sBAAsB,gBACrD,aACA;EAAE,aAAa;EAAW;CAAY,CACxC;CAEA,gBAAgB;EACd,kBAAkB;CAEpB,GAAG,CAAC,cAAc,CAAC;CAEnB,OACE,qBAAC,OAAD;EACE,WAAW,GACT,mBAAmB,EACjB,MACF,CAAC,GACD,SACF;EACA,oBAAkB;EAClB,wBAAqB;EACrB,MAAK;YATP,CAWG,KAAK,KAAK,KAAK,UAAU;GACxB,MAAM,MAAM,IAAI;GAEhB,MAAM,aAAa,mBAAmB;GAEtC,OAAO,aAAa,KAAK;IACvB,KAAK,OAAO;IACZ,MAAM;IACN,UAAU,MAA+B;KACvC,IAAI,OAAO,UAAU,CAAC;KACtB,aAAa,GAAG;IAClB;IACA,iBAAiB;IACjB,eAAe;IACf,UAAU,aAAa,IAAI;IAC3B,MAAM,OAAoB;KACxB,YAAY,QAAQ,SAAS;IAC/B;GACF,CAAiB;EACnB,CAAC,GACA,2BACC,oBAAC,OAAD;GACE,WAAW,GACT,iBAAiB;IACf;IACA;GACF,CAAC,CACH;GACA,OAAO;GACP,KAAK;EAEN,GADM,GAAG,iBAAiB,KAAK,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,GACnE,CAEA;;AAET"}
1
+ {"version":3,"file":"TabSelector.mjs","names":[],"sources":["../../../../src/components/TabSelector/TabSelector.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ItemSelectorOrientation,\n useItemSelector,\n} from '@hooks/useItemSelector';\nimport { cn } from '@utils/cn';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport {\n cloneElement,\n type HTMLAttributes,\n type MouseEvent,\n type ReactElement,\n useEffect,\n useRef,\n} from 'react';\n\nexport type TabSelectorColor = \n | 'primary' |\n 'secondary' |\n 'error' |\n 'neutral' |\n 'light' |\n 'dark' |\n 'text';\n\nconst tabSelectorVariant = cva(\n 'relative z-0 flex size-full flex-row items-center gap-2',\n {\n variants: {\n color: {\n primary: 'border-primary text-primary',\n secondary: 'border-secondary text-secondary',\n error: 'border-error bg-error text-error',\n neutral: 'border-neutral text-neutral',\n light: 'border-white text-white',\n dark: 'border-neutral-800 text-neutral-800',\n text: 'border-text text-text',\n },\n },\n defaultVariants: {\n color: 'primary',\n },\n }\n);\n\nconst indicatorVariant = cva(\n 'absolute -z-1 rounded-lg duration-300 ease-in-out motion-reduce:transition-none',\n {\n variants: {\n color: {\n primary: 'bg-primary/10 aria-selected:text-text',\n secondary: 'bg-secondary/10 aria-selected:text-text',\n error: 'bg-error/10 aria-selected:text-text',\n neutral: 'bg-neutral/10 aria-selected:text-white/10',\n light: 'bg-white/10 aria-selected:text-black',\n dark: 'bg-neutral-800/10 aria-selected:text-white',\n text: 'bg-text/10 aria-selected:text-text-opposite',\n },\n orientation: {\n horizontal: 'top-0 h-full w-auto transition-[left,width]',\n vertical: 'left-0 h-auto w-full transition-[top,height]',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n }\n);\n\nexport type TabSelectorItemProps = HTMLAttributes<HTMLElement> & {\n key: string | number;\n};\n\nexport type TabSelectorProps<T extends TabSelectorItemProps> = {\n tabs: ReactElement<T>[];\n selectedChoice: T['key'];\n onTabClick?: (choice: T['key']) => void;\n hoverable?: boolean;\n orientation?: ItemSelectorOrientation;\n} & HTMLAttributes<HTMLElement> &\n Omit<VariantProps<typeof tabSelectorVariant>, 'color'> & {\n color?: TabSelectorColor | `${TabSelectorColor}`;\n };\n\n/**\n *\n * Component that allows the user to select one of the provided choices.\n *\n * Example:\n * ```jsx\n * <TabSelector\n * selectedChoice=\"option1\"\n * onTabClick={(choice) => console.log(choice)}\n * hoverable={true}\n * >\n * <Button key=\"option1\"/>\n * <Button key=\"option2\"/>\n * <Button key=\"option3\"/>\n * </TabSelector>\n * ```\n */\nexport const TabSelector = <T extends TabSelectorItemProps>({\n tabs,\n selectedChoice,\n onTabClick,\n color = 'primary',\n hoverable = false,\n orientation = 'horizontal',\n className,\n}: TabSelectorProps<T>) => {\n const optionsRefs = useRef<HTMLElement[]>([]);\n const indicatorRef = useRef<HTMLDivElement | null>(null);\n const { choiceIndicatorPosition, calculatePosition } = useItemSelector(\n optionsRefs,\n { isHoverable: hoverable, orientation }\n );\n\n useEffect(() => {\n calculatePosition();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedChoice]);\n\n return (\n <div\n className={cn(\n tabSelectorVariant({\n color,\n }),\n className\n )}\n aria-orientation={orientation}\n aria-multiselectable=\"false\"\n role=\"tablist\"\n >\n {tabs.map((Tab, index) => {\n const key = Tab.key!;\n\n const isSelected = selectedChoice === key;\n\n return cloneElement(Tab, {\n key: key ?? index,\n role: 'tab',\n onClick: (e: MouseEvent<HTMLElement>) => {\n Tab.props?.onClick?.(e);\n onTabClick?.(key);\n },\n 'aria-selected': isSelected,\n 'data-active': isSelected as unknown as string,\n tabIndex: isSelected ? 0 : -1,\n ref: (el: HTMLElement) => {\n optionsRefs.current[index] = el!;\n },\n } as unknown as T);\n })}\n {choiceIndicatorPosition && (\n <div\n className={cn(\n indicatorVariant({\n color,\n orientation,\n })\n )}\n style={choiceIndicatorPosition}\n ref={indicatorRef}\n key={`${selectedChoice}${JSON.stringify(tabs.map((tab) => tab.key))}`}\n />\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;AA0BA,MAAM,qBAAqB,IACzB,2DACA;CACE,UAAU,EACR,OAAO;EACL,SAAS;EACT,WAAW;EACX,OAAO;EACP,SAAS;EACT,OAAO;EACP,MAAM;EACN,MAAM;CACR,EACF;CACA,iBAAiB,EACf,OAAO,UACT;AACF,CACF;AAEA,MAAM,mBAAmB,IACvB,mFACA;CACE,UAAU;EACR,OAAO;GACL,SAAS;GACT,WAAW;GACX,OAAO;GACP,SAAS;GACT,OAAO;GACP,MAAM;GACN,MAAM;EACR;EACA,aAAa;GACX,YAAY;GACZ,UAAU;EACZ;CACF;CACA,iBAAiB,EACf,aAAa,aACf;AACF,CACF;;;;;;;;;;;;;;;;;;AAkCA,MAAa,eAA+C,EAC1D,MACA,gBACA,YACA,QAAQ,WACR,YAAY,OACZ,cAAc,cACd,gBACyB;CACzB,MAAM,cAAc,OAAsB,CAAC,CAAC;CAC5C,MAAM,eAAe,OAA8B,IAAI;CACvD,MAAM,EAAE,yBAAyB,sBAAsB,gBACrD,aACA;EAAE,aAAa;EAAW;CAAY,CACxC;CAEA,gBAAgB;EACd,kBAAkB;CAEpB,GAAG,CAAC,cAAc,CAAC;CAEnB,OACE,qBAAC,OAAD;EACE,WAAW,GACT,mBAAmB,EACjB,MACF,CAAC,GACD,SACF;EACA,oBAAkB;EAClB,wBAAqB;EACrB,MAAK;YATP,CAWG,KAAK,KAAK,KAAK,UAAU;GACxB,MAAM,MAAM,IAAI;GAEhB,MAAM,aAAa,mBAAmB;GAEtC,OAAO,aAAa,KAAK;IACvB,KAAK,OAAO;IACZ,MAAM;IACN,UAAU,MAA+B;KACvC,IAAI,OAAO,UAAU,CAAC;KACtB,aAAa,GAAG;IAClB;IACA,iBAAiB;IACjB,eAAe;IACf,UAAU,aAAa,IAAI;IAC3B,MAAM,OAAoB;KACxB,YAAY,QAAQ,SAAS;IAC/B;GACF,CAAiB;EACnB,CAAC,GACA,2BACC,oBAAC,OAAD;GACE,WAAW,GACT,iBAAiB;IACf;IACA;GACF,CAAC,CACH;GACA,OAAO;GACP,KAAK;EAEN,GADM,GAAG,iBAAiB,KAAK,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,GACnE,CAEA;;AAET"}
@@ -1,3 +1,3 @@
1
- import { TabSelector, TabSelectorColor } from "./TabSelector.mjs";
1
+ import { TabSelector } from "./TabSelector.mjs";
2
2
 
3
- export { TabSelector, TabSelectorColor };
3
+ export { TabSelector };
@@ -1,5 +1,4 @@
1
1
  import { Button } from "../Button/Button.mjs";
2
- import { PopoverXAlign } from "../Popover/static.mjs";
3
2
  import { Popover } from "../Popover/dynamic.mjs";
4
3
  import { MoveDiagonal } from "lucide-react";
5
4
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"ExpandButton.mjs","names":[],"sources":["../../../../src/components/Table/ExpandButton.tsx"],"sourcesContent":["import { Popover, PopoverXAlign } from '@components/Popover';\nimport { MoveDiagonal } from 'lucide-react';\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Button } from '../Button';\n\ntype ExpandButtonProps = {\n setIsModalOpen: (isOpen: boolean) => void;\n};\n\nexport const ExpandButton: FC<ExpandButtonProps> = ({ setIsModalOpen }) => {\n const { modal: modalContent } = useIntlayer('table');\n\n return (\n <div className=\"pointer-events-none absolute inset-y-0 right-4 z-10\">\n <div className=\"pointer-events-auto sticky top-48 pt-4\">\n <Popover identifier=\"expand\">\n <Button\n variant=\"hoverable\"\n size=\"icon-md\"\n onClick={() => {\n setIsModalOpen(true);\n }}\n label={modalContent.title}\n Icon={MoveDiagonal}\n />\n\n <Popover.Detail\n identifier=\"expand\"\n className=\"flex min-w-64 flex-col gap-3 p-3 text-sm\"\n xAlign={PopoverXAlign.END}\n >\n <strong>{modalContent.title}</strong>\n <p className=\"text-neutral\">{modalContent.description}</p>\n </Popover.Detail>\n </Popover>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;AAUA,MAAa,gBAAuC,EAAE,qBAAqB;CACzE,MAAM,EAAE,OAAO,iBAAiB,YAAY,OAAO;CAEnD,OACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,OAAD;GAAK,WAAU;aACb,qBAAC,SAAD;IAAS,YAAW;cAApB,CACE,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,eAAe;MACb,eAAe,IAAI;KACrB;KACA,OAAO,aAAa;KACpB,MAAM;IACP,IAED,qBAAC,QAAQ,QAAT;KACE,YAAW;KACX,WAAU;KACV;eAHF,CAKE,oBAAC,UAAD,YAAS,aAAa,MAAc,IACpC,oBAAC,KAAD;MAAG,WAAU;gBAAgB,aAAa;KAAe,EAC3C;MACT;;EACN;CACF;AAET"}
1
+ {"version":3,"file":"ExpandButton.mjs","names":[],"sources":["../../../../src/components/Table/ExpandButton.tsx"],"sourcesContent":["import { Popover } from '@components/Popover';\nimport { MoveDiagonal } from 'lucide-react';\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Button } from '../Button';\n\ntype ExpandButtonProps = {\n setIsModalOpen: (isOpen: boolean) => void;\n};\n\nexport const ExpandButton: FC<ExpandButtonProps> = ({ setIsModalOpen }) => {\n const { modal: modalContent } = useIntlayer('table');\n\n return (\n <div className=\"pointer-events-none absolute inset-y-0 right-4 z-10\">\n <div className=\"pointer-events-auto sticky top-48 pt-4\">\n <Popover identifier=\"expand\">\n <Button\n variant=\"hoverable\"\n size=\"icon-md\"\n onClick={() => {\n setIsModalOpen(true);\n }}\n label={modalContent.title}\n Icon={MoveDiagonal}\n />\n\n <Popover.Detail\n identifier=\"expand\"\n className=\"flex min-w-64 flex-col gap-3 p-3 text-sm\"\n xAlign=\"end\"\n >\n <strong>{modalContent.title}</strong>\n <p className=\"text-neutral\">{modalContent.description}</p>\n </Popover.Detail>\n </Popover>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;AAUA,MAAa,gBAAuC,EAAE,qBAAqB;CACzE,MAAM,EAAE,OAAO,iBAAiB,YAAY,OAAO;CAEnD,OACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,OAAD;GAAK,WAAU;aACb,qBAAC,SAAD;IAAS,YAAW;cAApB,CACE,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,eAAe;MACb,eAAe,IAAI;KACrB;KACA,OAAO,aAAa;KACpB,MAAM;IACP,IAED,qBAAC,QAAQ,QAAT;KACE,YAAW;KACX,WAAU;KACV,QAAO;eAHT,CAKE,oBAAC,UAAD,YAAS,aAAa,MAAc,IACpC,oBAAC,KAAD;MAAG,WAAU;gBAAgB,aAAa;KAAe,EAC3C;MACT;;EACN;CACF;AAET"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from "../../utils/cn.mjs";
4
- import { Modal, ModalSize } from "../Modal/Modal.mjs";
4
+ import { Modal } from "../Modal/Modal.mjs";
5
5
  import { ExpandCollapse } from "../ExpandCollapse/ExpandCollapse.mjs";
6
6
  import { ExpandButton } from "./ExpandButton.mjs";
7
7
  import { Table } from "./Table.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"SmartTable.mjs","names":[],"sources":["../../../../src/components/Table/SmartTable.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport { type FC, useEffect, useRef, useState } from 'react';\nimport { ExpandCollapse } from '../ExpandCollapse';\nimport { Modal, ModalSize } from '../Modal';\nimport { ExpandButton } from './ExpandButton';\nimport type { TableProps } from './Table';\nimport { Table } from './Table';\nimport { useTableWidths } from './useTableWidths';\n\n/**\n * Properties for the SmartTable component\n *\n * @interface SmartTableProps\n * @extends {TableProps}\n *\n * @property {boolean} [isRollable] - Whether the table content can be collapsed/expanded using the ExpandCollapse wrapper\n * @property {boolean} [displayModal] - Whether the table should be able to expand into a modal\n */\ntype SmartTableProps = TableProps & {\n isRollable?: boolean;\n displayModal?: boolean;\n};\n\n/**\n * Table component that provides an enhanced table experience with modal expansion and collapsible content\n *\n * The Table component wraps a standard HTML table element with additional functionality:\n * - **Modal Expansion**: Click the diagonal arrow button to view the table in a full-screen modal\n * - **Collapsible Content**: Optionally wrap content in an ExpandCollapse component for space-saving\n * - **Responsive Design**: Handles large tables gracefully with modal overflow\n * - **Sticky Controls**: Table controls remain accessible even when scrolling\n *\n * ## Features\n * - **Modal View**: Full-screen modal for better viewing of large tables\n * - **Expand/Collapse**: Optional collapsible wrapper to save space\n * - **Responsive**: Handles overflow and responsive behavior automatically\n * - **Accessibility**: Maintains proper table semantics and keyboard navigation\n * - **Customizable**: Supports all standard HTML table attributes and styling\n *\n * ## Best Practices\n * - Use semantic HTML table structure (thead, tbody, tfoot)\n * - Provide proper column headers with scope attributes\n * - Use the isRollable prop for large tables that might need space management\n * - Apply consistent styling through the className prop\n * - Consider pagination for very large datasets\n *\n * @param {SmartTableProps} props - The properties for the Table component\n * @returns {JSX.Element} The rendered table with enhanced functionality\n *\n * @example\n * ```tsx\n * // Simple data table\n * <SmartTable>\n * <thead>\n * <tr>\n * <th scope=\"col\">Name</th>\n * <th scope=\"col\">Email</th>\n * <th scope=\"col\">Status</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr>\n * <td>John Doe</td>\n * <td>john@example.com</td>\n * <td>\n * <span className=\"px-2 py-1 bg-green-100 text-green-800 rounded-full text-xs\">\n * Active\n * </span>\n * </td>\n * </tr>\n * <tr>\n * <td>Jane Smith</td>\n * <td>jane@example.com</td>\n * <td>\n * <span className=\"px-2 py-1 bg-yellow-100 text-yellow-800 rounded-full text-xs\">\n * Pending\n * </span>\n * </td>\n * </tr>\n * </tbody>\n * </SmartTable>\n *\n * // Large collapsible table with custom styling\n * <SmartTable\n * isRollable\n * className=\"border border-gray-200 rounded-lg overflow-hidden\"\n * >\n * <thead className=\"bg-gray-50\">\n * <tr>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Product ID\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Name\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Category\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Price\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Stock\n * </th>\n * </tr>\n * </thead>\n * <tbody className=\"bg-white divide-y divide-gray-200\">\n * {products.map((product) => (\n * <tr key={product.id} className=\"hover:bg-gray-50\">\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n * #{product.id}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900\">\n * {product.name}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n * {product.category}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n * ${product.price.toFixed(2)}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n * {product.stock} units\n * </td>\n * </tr>\n * ))}\n * </tbody>\n * </SmartTable>\n *\n * // Financial data table with formatted numbers\n * <SmartTable className=\"w-full border-collapse\">\n * <thead>\n * <tr className=\"border-b-2 border-gray-300\">\n * <th scope=\"col\" className=\"text-left py-3 px-4\">Quarter</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Revenue</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Profit</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Growth</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr className=\"border-b border-gray-200\">\n * <td className=\"py-3 px-4 font-medium\">Q1 2024</td>\n * <td className=\"py-3 px-4 text-right\">$2,450,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">$345,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">+12.5%</td>\n * </tr>\n * <tr className=\"border-b border-gray-200\">\n * <td className=\"py-3 px-4 font-medium\">Q2 2024</td>\n * <td className=\"py-3 px-4 text-right\">$2,780,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">$398,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">+13.5%</td>\n * </tr>\n * </tbody>\n * </SmartTable>\n * ```\n *\n * @see {@link ExpandCollapse} - Component used for collapsible table content\n * @see {@link Modal} - Component used for full-screen table view\n * @see {@link Button} - Component used for the modal trigger button\n */\nexport const SmartTable: FC<SmartTableProps> = ({\n className,\n isRollable = false,\n displayModal,\n isInteractive,\n onClick,\n ...props\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [highlightedRowIndex, setHighlightedRowIndex] = useState<number | null>(\n null\n );\n\n const tableRef = useRef<HTMLTableElement>(null);\n const modalTableRef = useRef<HTMLTableElement>(null);\n\n useTableWidths(tableRef, modalTableRef, [props.children, isModalOpen]);\n\n useEffect(() => {\n if (isModalOpen && highlightedRowIndex !== null && modalTableRef.current) {\n const row = modalTableRef.current.rows[highlightedRowIndex];\n\n if (row) {\n row.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n row.classList.add('bg-neutral/40', 'dark:bg-neutral-dark/40');\n row.style.transition = 'background-color 0.3s ease-in-out';\n }\n }\n }, [isModalOpen, highlightedRowIndex]);\n\n useEffect(() => {\n if (!isModalOpen) {\n setHighlightedRowIndex(null);\n }\n }, [isModalOpen]);\n\n const handleTableClick = (e: React.MouseEvent<HTMLTableElement>) => {\n if (displayModal) {\n const target = e.target as HTMLElement;\n const tr = target.closest('tr');\n\n if (tr?.closest('tbody')) {\n setHighlightedRowIndex(tr.rowIndex);\n setIsModalOpen(true);\n }\n }\n onClick?.(e);\n };\n\n return (\n <div className=\"group relative\">\n {displayModal && <ExpandButton setIsModalOpen={setIsModalOpen} />}\n\n <ExpandCollapse\n isRollable={isRollable}\n className=\"max-w-full overflow-x-auto rounded-2xl bg-background text-left [corner-shape:squircle] supports-[corner-shape:squircle]:rounded-3xl\"\n >\n <Table\n ref={tableRef}\n className={className}\n isInteractive={isInteractive ?? displayModal}\n onClick={handleTableClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n handleTableClick(\n e as unknown as React.MouseEvent<HTMLTableElement>\n );\n }\n }}\n {...props}\n />\n </ExpandCollapse>\n\n <Modal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n size={ModalSize.XL}\n hasCloseButton\n isScrollable\n >\n {isModalOpen ? (\n <div className=\"grid\">\n <Table\n ref={modalTableRef}\n className={cn('min-w-full max-w-full text-left', className)}\n isInteractive={isInteractive}\n {...props}\n />\n </div>\n ) : (\n <></>\n )}\n </Modal>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkKA,MAAa,cAAmC,EAC9C,WACA,aAAa,OACb,cACA,eACA,SACA,GAAG,YACC;CACJ,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,MAAM,CAAC,qBAAqB,0BAA0B,SACpD,IACF;CAEA,MAAM,WAAW,OAAyB,IAAI;CAC9C,MAAM,gBAAgB,OAAyB,IAAI;CAEnD,eAAe,UAAU,eAAe,CAAC,MAAM,UAAU,WAAW,CAAC;CAErE,gBAAgB;EACd,IAAI,eAAe,wBAAwB,QAAQ,cAAc,SAAS;GACxE,MAAM,MAAM,cAAc,QAAQ,KAAK;GAEvC,IAAI,KAAK;IACP,IAAI,eAAe;KAAE,UAAU;KAAU,OAAO;IAAS,CAAC;IAE1D,IAAI,UAAU,IAAI,iBAAiB,yBAAyB;IAC5D,IAAI,MAAM,aAAa;GACzB;EACF;CACF,GAAG,CAAC,aAAa,mBAAmB,CAAC;CAErC,gBAAgB;EACd,IAAI,CAAC,aACH,uBAAuB,IAAI;CAE/B,GAAG,CAAC,WAAW,CAAC;CAEhB,MAAM,oBAAoB,MAA0C;EAClE,IAAI,cAAc;GAEhB,MAAM,KADS,EAAE,OACC,QAAQ,IAAI;GAE9B,IAAI,IAAI,QAAQ,OAAO,GAAG;IACxB,uBAAuB,GAAG,QAAQ;IAClC,eAAe,IAAI;GACrB;EACF;EACA,UAAU,CAAC;CACb;CAEA,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACG,gBAAgB,oBAAC,cAAD,EAA8B,eAAiB;GAEhE,oBAAC,gBAAD;IACc;IACZ,WAAU;cAEV,oBAAC,OAAD;KACE,KAAK;KACM;KACX,eAAe,iBAAiB;KAChC,SAAS;KACT,YAAY,MAAM;MAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KACjC,iBACE,CACF;KAEJ;KACA,GAAI;IACL;GACa;GAEhB,oBAAC,OAAD;IACE,QAAQ;IACR,eAAe,eAAe,KAAK;IACnC;IACA;IACA;cAEC,cACC,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,OAAD;MACE,KAAK;MACL,WAAW,GAAG,mCAAmC,SAAS;MAC3C;MACf,GAAI;KACL;IACE,KAEL,iCAAI;GAED;EACJ;;AAET"}
1
+ {"version":3,"file":"SmartTable.mjs","names":[],"sources":["../../../../src/components/Table/SmartTable.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport { type FC, useEffect, useRef, useState } from 'react';\nimport { ExpandCollapse } from '../ExpandCollapse';\nimport { Modal } from '../Modal';\nimport { ExpandButton } from './ExpandButton';\nimport type { TableProps } from './Table';\nimport { Table } from './Table';\nimport { useTableWidths } from './useTableWidths';\n\n/**\n * Properties for the SmartTable component\n *\n * @interface SmartTableProps\n * @extends {TableProps}\n *\n * @property {boolean} [isRollable] - Whether the table content can be collapsed/expanded using the ExpandCollapse wrapper\n * @property {boolean} [displayModal] - Whether the table should be able to expand into a modal\n */\ntype SmartTableProps = TableProps & {\n isRollable?: boolean;\n displayModal?: boolean;\n};\n\n/**\n * Table component that provides an enhanced table experience with modal expansion and collapsible content\n *\n * The Table component wraps a standard HTML table element with additional functionality:\n * - **Modal Expansion**: Click the diagonal arrow button to view the table in a full-screen modal\n * - **Collapsible Content**: Optionally wrap content in an ExpandCollapse component for space-saving\n * - **Responsive Design**: Handles large tables gracefully with modal overflow\n * - **Sticky Controls**: Table controls remain accessible even when scrolling\n *\n * ## Features\n * - **Modal View**: Full-screen modal for better viewing of large tables\n * - **Expand/Collapse**: Optional collapsible wrapper to save space\n * - **Responsive**: Handles overflow and responsive behavior automatically\n * - **Accessibility**: Maintains proper table semantics and keyboard navigation\n * - **Customizable**: Supports all standard HTML table attributes and styling\n *\n * ## Best Practices\n * - Use semantic HTML table structure (thead, tbody, tfoot)\n * - Provide proper column headers with scope attributes\n * - Use the isRollable prop for large tables that might need space management\n * - Apply consistent styling through the className prop\n * - Consider pagination for very large datasets\n *\n * @param {SmartTableProps} props - The properties for the Table component\n * @returns {JSX.Element} The rendered table with enhanced functionality\n *\n * @example\n * ```tsx\n * // Simple data table\n * <SmartTable>\n * <thead>\n * <tr>\n * <th scope=\"col\">Name</th>\n * <th scope=\"col\">Email</th>\n * <th scope=\"col\">Status</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr>\n * <td>John Doe</td>\n * <td>john@example.com</td>\n * <td>\n * <span className=\"px-2 py-1 bg-green-100 text-green-800 rounded-full text-xs\">\n * Active\n * </span>\n * </td>\n * </tr>\n * <tr>\n * <td>Jane Smith</td>\n * <td>jane@example.com</td>\n * <td>\n * <span className=\"px-2 py-1 bg-yellow-100 text-yellow-800 rounded-full text-xs\">\n * Pending\n * </span>\n * </td>\n * </tr>\n * </tbody>\n * </SmartTable>\n *\n * // Large collapsible table with custom styling\n * <SmartTable\n * isRollable\n * className=\"border border-gray-200 rounded-lg overflow-hidden\"\n * >\n * <thead className=\"bg-gray-50\">\n * <tr>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Product ID\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Name\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Category\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Price\n * </th>\n * <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase\">\n * Stock\n * </th>\n * </tr>\n * </thead>\n * <tbody className=\"bg-white divide-y divide-gray-200\">\n * {products.map((product) => (\n * <tr key={product.id} className=\"hover:bg-gray-50\">\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n * #{product.id}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900\">\n * {product.name}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n * {product.category}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n * ${product.price.toFixed(2)}\n * </td>\n * <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n * {product.stock} units\n * </td>\n * </tr>\n * ))}\n * </tbody>\n * </SmartTable>\n *\n * // Financial data table with formatted numbers\n * <SmartTable className=\"w-full border-collapse\">\n * <thead>\n * <tr className=\"border-b-2 border-gray-300\">\n * <th scope=\"col\" className=\"text-left py-3 px-4\">Quarter</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Revenue</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Profit</th>\n * <th scope=\"col\" className=\"text-right py-3 px-4\">Growth</th>\n * </tr>\n * </thead>\n * <tbody>\n * <tr className=\"border-b border-gray-200\">\n * <td className=\"py-3 px-4 font-medium\">Q1 2024</td>\n * <td className=\"py-3 px-4 text-right\">$2,450,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">$345,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">+12.5%</td>\n * </tr>\n * <tr className=\"border-b border-gray-200\">\n * <td className=\"py-3 px-4 font-medium\">Q2 2024</td>\n * <td className=\"py-3 px-4 text-right\">$2,780,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">$398,000</td>\n * <td className=\"py-3 px-4 text-right text-green-600\">+13.5%</td>\n * </tr>\n * </tbody>\n * </SmartTable>\n * ```\n *\n * @see {@link ExpandCollapse} - Component used for collapsible table content\n * @see {@link Modal} - Component used for full-screen table view\n * @see {@link Button} - Component used for the modal trigger button\n */\nexport const SmartTable: FC<SmartTableProps> = ({\n className,\n isRollable = false,\n displayModal,\n isInteractive,\n onClick,\n ...props\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [highlightedRowIndex, setHighlightedRowIndex] = useState<number | null>(\n null\n );\n\n const tableRef = useRef<HTMLTableElement>(null);\n const modalTableRef = useRef<HTMLTableElement>(null);\n\n useTableWidths(tableRef, modalTableRef, [props.children, isModalOpen]);\n\n useEffect(() => {\n if (isModalOpen && highlightedRowIndex !== null && modalTableRef.current) {\n const row = modalTableRef.current.rows[highlightedRowIndex];\n\n if (row) {\n row.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n row.classList.add('bg-neutral/40', 'dark:bg-neutral-dark/40');\n row.style.transition = 'background-color 0.3s ease-in-out';\n }\n }\n }, [isModalOpen, highlightedRowIndex]);\n\n useEffect(() => {\n if (!isModalOpen) {\n setHighlightedRowIndex(null);\n }\n }, [isModalOpen]);\n\n const handleTableClick = (e: React.MouseEvent<HTMLTableElement>) => {\n if (displayModal) {\n const target = e.target as HTMLElement;\n const tr = target.closest('tr');\n\n if (tr?.closest('tbody')) {\n setHighlightedRowIndex(tr.rowIndex);\n setIsModalOpen(true);\n }\n }\n onClick?.(e);\n };\n\n return (\n <div className=\"group relative\">\n {displayModal && <ExpandButton setIsModalOpen={setIsModalOpen} />}\n\n <ExpandCollapse\n isRollable={isRollable}\n className=\"max-w-full overflow-x-auto rounded-2xl bg-background text-left [corner-shape:squircle] supports-[corner-shape:squircle]:rounded-3xl\"\n >\n <Table\n ref={tableRef}\n className={className}\n isInteractive={isInteractive ?? displayModal}\n onClick={handleTableClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n handleTableClick(\n e as unknown as React.MouseEvent<HTMLTableElement>\n );\n }\n }}\n {...props}\n />\n </ExpandCollapse>\n\n <Modal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n size=\"xl\"\n hasCloseButton\n isScrollable\n >\n {isModalOpen ? (\n <div className=\"grid\">\n <Table\n ref={modalTableRef}\n className={cn('min-w-full max-w-full text-left', className)}\n isInteractive={isInteractive}\n {...props}\n />\n </div>\n ) : (\n <></>\n )}\n </Modal>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkKA,MAAa,cAAmC,EAC9C,WACA,aAAa,OACb,cACA,eACA,SACA,GAAG,YACC;CACJ,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,MAAM,CAAC,qBAAqB,0BAA0B,SACpD,IACF;CAEA,MAAM,WAAW,OAAyB,IAAI;CAC9C,MAAM,gBAAgB,OAAyB,IAAI;CAEnD,eAAe,UAAU,eAAe,CAAC,MAAM,UAAU,WAAW,CAAC;CAErE,gBAAgB;EACd,IAAI,eAAe,wBAAwB,QAAQ,cAAc,SAAS;GACxE,MAAM,MAAM,cAAc,QAAQ,KAAK;GAEvC,IAAI,KAAK;IACP,IAAI,eAAe;KAAE,UAAU;KAAU,OAAO;IAAS,CAAC;IAE1D,IAAI,UAAU,IAAI,iBAAiB,yBAAyB;IAC5D,IAAI,MAAM,aAAa;GACzB;EACF;CACF,GAAG,CAAC,aAAa,mBAAmB,CAAC;CAErC,gBAAgB;EACd,IAAI,CAAC,aACH,uBAAuB,IAAI;CAE/B,GAAG,CAAC,WAAW,CAAC;CAEhB,MAAM,oBAAoB,MAA0C;EAClE,IAAI,cAAc;GAEhB,MAAM,KADS,EAAE,OACC,QAAQ,IAAI;GAE9B,IAAI,IAAI,QAAQ,OAAO,GAAG;IACxB,uBAAuB,GAAG,QAAQ;IAClC,eAAe,IAAI;GACrB;EACF;EACA,UAAU,CAAC;CACb;CAEA,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACG,gBAAgB,oBAAC,cAAD,EAA8B,eAAiB;GAEhE,oBAAC,gBAAD;IACc;IACZ,WAAU;cAEV,oBAAC,OAAD;KACE,KAAK;KACM;KACX,eAAe,iBAAiB;KAChC,SAAS;KACT,YAAY,MAAM;MAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KACjC,iBACE,CACF;KAEJ;KACA,GAAI;IACL;GACa;GAEhB,oBAAC,OAAD;IACE,QAAQ;IACR,eAAe,eAAe,KAAK;IACnC,MAAK;IACL;IACA;cAEC,cACC,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,OAAD;MACE,KAAK;MACL,WAAW,GAAG,mCAAmC,SAAS;MAC3C;MACf,GAAI;KACL;IACE,KAEL,iCAAI;GAED;EACJ;;AAET"}
@@ -2,205 +2,51 @@ import { cva } from "class-variance-authority";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/Tag/index.tsx
5
- /**
6
- * Enumeration for tag border radius sizes
7
- *
8
- * Controls the roundedness of tag corners, from sharp edges to fully rounded pills.
9
- *
10
- * @enum TagRoundedSize
11
- * @property NONE - 'none' - No border radius (sharp corners)
12
- * @property SM - 'sm' - Small border radius (2px)
13
- * @property MD - 'md' - Medium border radius (6px)
14
- * @property LG - 'lg' - Large border radius (8px)
15
- * @property XL - 'xl' - Extra large border radius (12px)
16
- * @property XXL - '2xl' - 2x large border radius (16px)
17
- * @property XXXL - '3xl' - 3x large border radius (24px)
18
- * @property FULL - 'full' - Fully rounded (50% border radius, pill shape)
19
- *
20
- * @example
21
- * ```tsx
22
- * // Sharp corners
23
- * <Tag roundedSize={TagRoundedSize.NONE}>Sharp Tag</Tag>
24
- *
25
- * // Pill-shaped tag
26
- * <Tag roundedSize={TagRoundedSize.FULL}>Pill Tag</Tag>
27
- *
28
- * // Medium rounded corners
29
- * <Tag roundedSize={TagRoundedSize.MD}>Rounded Tag</Tag>
30
- * ```
31
- */
32
- let TagRoundedSize = /* @__PURE__ */ function(TagRoundedSize) {
33
- TagRoundedSize["NONE"] = "none";
34
- TagRoundedSize["SM"] = "sm";
35
- TagRoundedSize["MD"] = "md";
36
- TagRoundedSize["LG"] = "lg";
37
- TagRoundedSize["XL"] = "xl";
38
- TagRoundedSize["XXL"] = "2xl";
39
- TagRoundedSize["XXXL"] = "3xl";
40
- TagRoundedSize["FULL"] = "full";
41
- return TagRoundedSize;
42
- }({});
43
- /**
44
- * Enumeration for tag color themes
45
- *
46
- * Provides semantic color options for different tag purposes and meanings.
47
- * Each color includes background, border, and text color variations.
48
- *
49
- * @enum TagColor
50
- * @property SUCCESS - 'success' - Green theme for positive states, success messages, or completed items
51
- * @property ERROR - 'error' - Red theme for error states, warnings, or failed operations
52
- * @property WARNING - 'warning' - Yellow/orange theme for caution, pending states, or important notices
53
- * @property NEUTRAL - 'neutral' - Gray theme for neutral information or secondary content
54
- * @property TEXT - 'text' - Default text color theme for general purpose tags
55
- *
56
- * @example
57
- * ```tsx
58
- * // Status indicators
59
- * <Tag color={TagColor.SUCCESS}>Completed</Tag>
60
- * <Tag color={TagColor.ERROR}>Failed</Tag>
61
- * <Tag color={TagColor.WARNING}>Pending</Tag>
62
- *
63
- * // Category tags
64
- * <Tag color={TagColor.NEUTRAL}>Category</Tag>
65
- * <Tag color={TagColor.TEXT}>General</Tag>
66
- * ```
67
- */
68
- let TagColor = /* @__PURE__ */ function(TagColor) {
69
- TagColor["PRIMARY"] = "primary";
70
- TagColor["SUCCESS"] = "success";
71
- TagColor["ERROR"] = "error";
72
- TagColor["WARNING"] = "warning";
73
- TagColor["NEUTRAL"] = "neutral";
74
- TagColor["TEXT"] = "text";
75
- TagColor["BLUE"] = "blue";
76
- TagColor["YELLOW"] = "yellow";
77
- TagColor["GREEN"] = "green";
78
- TagColor["RED"] = "red";
79
- TagColor["ORANGE"] = "orange";
80
- TagColor["PURPLE"] = "purple";
81
- TagColor["PINK"] = "pink";
82
- TagColor["BROWN"] = "brown";
83
- TagColor["GRAY"] = "gray";
84
- TagColor["BLACK"] = "black";
85
- TagColor["WHITE"] = "white";
86
- return TagColor;
87
- }({});
88
- /**
89
- * Enumeration for tag size variants
90
- *
91
- * Controls the overall size of tags including padding, font size, and border thickness.
92
- * Sizes are designed to maintain visual hierarchy and readability.
93
- *
94
- * @enum TagSize
95
- * @property XS - 'xs' - Extra small (0.5rem padding, text-xs, 1.2px border)
96
- * @property SM - 'sm' - Small (0.5rem padding, text-sm, 1.5px border)
97
- * @property MD - 'md' - Medium (1rem padding, text-base, 2px border) - Default size
98
- * @property LG - 'lg' - Large (2rem padding, text-lg, 2px border)
99
- * @property XL - 'xl' - Extra large (4rem padding, text-xl, 2px border)
100
- *
101
- * @example
102
- * ```tsx
103
- * // Different sizes for hierarchy
104
- * <Tag size={TagSize.XS}>Small detail</Tag>
105
- * <Tag size={TagSize.SM}>Minor category</Tag>
106
- * <Tag size={TagSize.MD}>Standard tag</Tag>
107
- * <Tag size={TagSize.LG}>Important label</Tag>
108
- * <Tag size={TagSize.XL}>Hero tag</Tag>
109
- * ```
110
- */
111
- let TagSize = /* @__PURE__ */ function(TagSize) {
112
- TagSize["XS"] = "xs";
113
- TagSize["SM"] = "sm";
114
- TagSize["MD"] = "md";
115
- TagSize["LG"] = "lg";
116
- TagSize["XL"] = "xl";
117
- return TagSize;
118
- }({});
119
- /**
120
- * Enumeration for tag border visibility
121
- *
122
- * Controls whether a border is displayed around the tag.
123
- *
124
- * @enum TagBorder
125
- * @property NONE - 'none' - No border (default)
126
- * @property WITH - 'with' - Show border with 1.5px thickness
127
- *
128
- * @example
129
- * ```tsx
130
- * <Tag border={TagBorder.NONE}>Borderless</Tag>
131
- * <Tag border={TagBorder.WITH}>With Border</Tag>
132
- * ```
133
- */
134
- let TagBorder = /* @__PURE__ */ function(TagBorder) {
135
- TagBorder["NONE"] = "none";
136
- TagBorder["WITH"] = "with";
137
- return TagBorder;
138
- }({});
139
- /**
140
- * Enumeration for tag background visibility
141
- *
142
- * Controls the background styling of the tag.
143
- *
144
- * @enum TagBackground
145
- * @property NONE - 'none' - No background styling
146
- * @property WITH - 'with' - Apply background styling
147
- *
148
- * @example
149
- * ```tsx
150
- * <Tag background={TagBackground.NONE}>No Background</Tag>
151
- * <Tag background={TagBackground.WITH}>With Background</Tag>
152
- * ```
153
- */
154
- let TagBackground = /* @__PURE__ */ function(TagBackground) {
155
- TagBackground["NONE"] = "none";
156
- TagBackground["WITH"] = "with";
157
- return TagBackground;
158
- }({});
159
5
  const containerVariants = cva("w-fit backdrop-blur", {
160
6
  variants: {
161
7
  roundedSize: {
162
- [`none`]: "rounded-none",
163
- [`sm`]: "rounded-sm",
164
- [`md`]: "rounded-md",
165
- [`lg`]: "rounded-lg",
166
- [`xl`]: "rounded-xl",
167
- [`2xl`]: "rounded-2xl",
168
- [`3xl`]: "rounded-3xl",
169
- [`full`]: "rounded-full"
8
+ none: "rounded-none",
9
+ sm: "rounded-sm",
10
+ md: "rounded-md",
11
+ lg: "rounded-lg",
12
+ xl: "rounded-xl",
13
+ [`xxl`]: "rounded-2xl",
14
+ [`xxxl`]: "rounded-3xl",
15
+ full: "rounded-full"
170
16
  },
171
17
  color: {
172
- [`primary`]: "border-primary bg-primary/10 text-primary",
173
- [`success`]: "border-success bg-success/10 text-success",
174
- [`error`]: "border-error bg-error/10 text-error",
175
- [`warning`]: "border-warning bg-warning/10 text-warning",
176
- [`neutral`]: "/10 border-neutral bg-neutral/10 text-neutral",
177
- [`text`]: "border-text bg-text/10 text-text",
178
- [`blue`]: "border-blue-500 bg-blue-500/10 text-blue-500 dark:text-blue-300",
179
- [`yellow`]: "border-yellow-500 bg-yellow-500/10 text-yellow-500 dark:text-yellow-300",
180
- [`green`]: "border-green-500 bg-green-500/10 text-green-500 dark:text-green-300",
181
- [`red`]: "border-error bg-error/10 text-error dark:text-red-300",
182
- [`orange`]: "border-orange-500 bg-orange-500/10 text-orange-500 dark:text-orange-300",
183
- [`purple`]: "border-purple-500 bg-purple-500/10 text-purple-500 dark:text-purple-300",
184
- [`pink`]: "border-pink-500 bg-pink-500/10 text-pink-500 dark:text-pink-300",
185
- [`brown`]: "border-brown-500 bg-brown-500/10 text-brown-500 dark:text-brown-300",
186
- [`gray`]: "border-gray-500 bg-gray-500/10 text-gray-500 dark:text-gray-300",
187
- [`black`]: "border-black bg-black/10 text-black",
188
- [`white`]: "border-white bg-white/10 text-white"
18
+ primary: "border-primary bg-primary/10 text-primary",
19
+ success: "border-success bg-success/10 text-success",
20
+ error: "border-error bg-error/10 text-error",
21
+ warning: "border-warning bg-warning/10 text-warning",
22
+ neutral: "/10 border-neutral bg-neutral/10 text-neutral",
23
+ text: "border-text bg-text/10 text-text",
24
+ blue: "border-blue-500 bg-blue-500/10 text-blue-500 dark:text-blue-300",
25
+ yellow: "border-yellow-500 bg-yellow-500/10 text-yellow-500 dark:text-yellow-300",
26
+ green: "border-green-500 bg-green-500/10 text-green-500 dark:text-green-300",
27
+ red: "border-error bg-error/10 text-error dark:text-red-300",
28
+ orange: "border-orange-500 bg-orange-500/10 text-orange-500 dark:text-orange-300",
29
+ purple: "border-purple-500 bg-purple-500/10 text-purple-500 dark:text-purple-300",
30
+ pink: "border-pink-500 bg-pink-500/10 text-pink-500 dark:text-pink-300",
31
+ brown: "border-brown-500 bg-brown-500/10 text-brown-500 dark:text-brown-300",
32
+ gray: "border-gray-500 bg-gray-500/10 text-gray-500 dark:text-gray-300",
33
+ black: "border-black bg-black/10 text-black",
34
+ white: "border-white bg-white/10 text-white"
189
35
  },
190
36
  size: {
191
- [`xs`]: "border-[1.2px] px-2 py-0.5 text-xs",
192
- [`sm`]: "border-[1.3px] px-2 py-0.5 text-sm",
193
- [`md`]: "border-2 px-2 py-1 text-base",
194
- [`lg`]: "border-2 px-3 py-2 text-lg",
195
- [`xl`]: "border-2 px-3 py-2 text-xl"
37
+ xs: "border-[1.2px] px-2 py-0.5 text-xs",
38
+ sm: "border-[1.3px] px-2 py-0.5 text-sm",
39
+ md: "border-2 px-2 py-1 text-base",
40
+ lg: "border-2 px-3 py-2 text-lg",
41
+ xl: "border-2 px-3 py-2 text-xl"
196
42
  },
197
43
  border: {
198
- [`none`]: "border-none",
199
- [`with`]: "border-[1.3px] border-text"
44
+ none: "border-none",
45
+ with: "border-[1.3px] border-text"
200
46
  },
201
47
  background: {
202
- [`none`]: "bg-none",
203
- [`with`]: ""
48
+ none: "bg-none",
49
+ with: ""
204
50
  }
205
51
  },
206
52
  defaultVariants: {
@@ -244,38 +90,38 @@ const containerVariants = cva("w-fit backdrop-blur", {
244
90
  * @example
245
91
  * ```tsx
246
92
  * // Basic status tags
247
- * <Tag color={TagColor.SUCCESS}>Completed</Tag>
248
- * <Tag color={TagColor.ERROR}>Failed</Tag>
249
- * <Tag color={TagColor.WARNING}>In Progress</Tag>
93
+ * <Tag color="success">Completed</Tag>
94
+ * <Tag color="error">Failed</Tag>
95
+ * <Tag color="warning">In Progress</Tag>
250
96
  *
251
97
  * // Category tags with borders
252
- * <Tag color={TagColor.NEUTRAL} border={TagBorder.WITH}>
98
+ * <Tag color="neutral" border="with">
253
99
  * Technology
254
100
  * </Tag>
255
- * <Tag color={TagColor.TEXT} border={TagBorder.WITH}>
101
+ * <Tag color="text" border="with">
256
102
  * Design
257
103
  * </Tag>
258
104
  *
259
105
  * // Size variations for hierarchy
260
106
  * <div className="flex items-center gap-2">
261
- * <Tag size={TagSize.XS} color={TagColor.NEUTRAL}>Minor</Tag>
262
- * <Tag size={TagSize.SM} color={TagColor.TEXT}>Standard</Tag>
263
- * <Tag size={TagSize.LG} color={TagColor.SUCCESS}>Important</Tag>
107
+ * <Tag size="xs" color="neutral">Minor</Tag>
108
+ * <Tag size="sm" color="text">Standard</Tag>
109
+ * <Tag size="lg" color="success">Important</Tag>
264
110
  * </div>
265
111
  *
266
112
  * // Rounded variations
267
113
  * <div className="flex gap-2">
268
- * <Tag roundedSize={TagRoundedSize.NONE}>Sharp</Tag>
269
- * <Tag roundedSize={TagRoundedSize.MD}>Rounded</Tag>
270
- * <Tag roundedSize={TagRoundedSize.FULL}>Pill</Tag>
114
+ * <Tag roundedSize="none">Sharp</Tag>
115
+ * <Tag roundedSize="md">Rounded</Tag>
116
+ * <Tag roundedSize="full">Pill</Tag>
271
117
  * </div>
272
118
  *
273
119
  * // Custom styled tag
274
120
  * <Tag
275
- * color={TagColor.WARNING}
276
- * size={TagSize.LG}
277
- * border={TagBorder.WITH}
278
- * roundedSize={TagRoundedSize.LG}
121
+ * color="warning"
122
+ * size="lg"
123
+ * border="with"
124
+ * roundedSize="lg"
279
125
  * className="font-bold uppercase tracking-wide"
280
126
  * >
281
127
  * Custom Style
@@ -283,7 +129,7 @@ const containerVariants = cva("w-fit backdrop-blur", {
283
129
  *
284
130
  * // Interactive tags with click handlers
285
131
  * <Tag
286
- * color={TagColor.SUCCESS}
132
+ * color="success"
287
133
  * onClick={() => console.log('Tag clicked')}
288
134
  * className="cursor-pointer hover:opacity-80 transition-opacity"
289
135
  * >
@@ -313,5 +159,5 @@ const Tag = ({ children, color, roundedSize, size, border, background, className
313
159
  };
314
160
 
315
161
  //#endregion
316
- export { Tag, TagBackground, TagBorder, TagColor, TagRoundedSize, TagSize };
162
+ export { Tag };
317
163
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/components/Tag/index.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport type { FC, HTMLAttributes, PropsWithChildren } from 'react';\n\n/**\n * Properties for the Tag component extending HTML div attributes and variant options\n *\n * @interface TagProps\n * @extends {PropsWithChildren<VariantProps<typeof containerVariants>>}\n * @extends {HTMLAttributes<HTMLDivElement>}\n *\n * @property {ReactNode} children - The content to display inside the tag\n * @property {TagColor} [color] - Color theme variant of the tag\n * @property {TagRoundedSize} [roundedSize] - Border radius size of the tag\n * @property {TagSize} [size] - Size variant affecting padding and font size\n * @property {TagBorder} [border] - Whether to show a border around the tag\n * @property {TagBackground} [background] - Background visibility option\n * @property [className] - Additional CSS classes for custom styling\n *\n * @example\n * ```tsx\n * // Basic tag\n * <Tag>Default Tag</Tag>\n *\n * // Success tag with border\n * <Tag color={TagColor.SUCCESS} border={TagBorder.WITH}>\n * Success Status\n * </Tag>\n *\n * // Large warning tag\n * <Tag color={TagColor.WARNING} size={TagSize.LG}>\n * Important Warning\n * </Tag>\n * ```\n */\ntype TagProps = PropsWithChildren<VariantProps<typeof containerVariants>> &\n HTMLAttributes<HTMLDivElement>;\n\n/**\n * Enumeration for tag border radius sizes\n *\n * Controls the roundedness of tag corners, from sharp edges to fully rounded pills.\n *\n * @enum TagRoundedSize\n * @property NONE - 'none' - No border radius (sharp corners)\n * @property SM - 'sm' - Small border radius (2px)\n * @property MD - 'md' - Medium border radius (6px)\n * @property LG - 'lg' - Large border radius (8px)\n * @property XL - 'xl' - Extra large border radius (12px)\n * @property XXL - '2xl' - 2x large border radius (16px)\n * @property XXXL - '3xl' - 3x large border radius (24px)\n * @property FULL - 'full' - Fully rounded (50% border radius, pill shape)\n *\n * @example\n * ```tsx\n * // Sharp corners\n * <Tag roundedSize={TagRoundedSize.NONE}>Sharp Tag</Tag>\n *\n * // Pill-shaped tag\n * <Tag roundedSize={TagRoundedSize.FULL}>Pill Tag</Tag>\n *\n * // Medium rounded corners\n * <Tag roundedSize={TagRoundedSize.MD}>Rounded Tag</Tag>\n * ```\n */\nexport enum TagRoundedSize {\n NONE = 'none',\n SM = 'sm',\n MD = 'md',\n LG = 'lg',\n XL = 'xl',\n XXL = '2xl',\n XXXL = '3xl',\n FULL = 'full',\n}\n\n/**\n * Enumeration for tag color themes\n *\n * Provides semantic color options for different tag purposes and meanings.\n * Each color includes background, border, and text color variations.\n *\n * @enum TagColor\n * @property SUCCESS - 'success' - Green theme for positive states, success messages, or completed items\n * @property ERROR - 'error' - Red theme for error states, warnings, or failed operations\n * @property WARNING - 'warning' - Yellow/orange theme for caution, pending states, or important notices\n * @property NEUTRAL - 'neutral' - Gray theme for neutral information or secondary content\n * @property TEXT - 'text' - Default text color theme for general purpose tags\n *\n * @example\n * ```tsx\n * // Status indicators\n * <Tag color={TagColor.SUCCESS}>Completed</Tag>\n * <Tag color={TagColor.ERROR}>Failed</Tag>\n * <Tag color={TagColor.WARNING}>Pending</Tag>\n *\n * // Category tags\n * <Tag color={TagColor.NEUTRAL}>Category</Tag>\n * <Tag color={TagColor.TEXT}>General</Tag>\n * ```\n */\nexport enum TagColor {\n PRIMARY = 'primary',\n SUCCESS = 'success',\n ERROR = 'error',\n WARNING = 'warning',\n NEUTRAL = 'neutral',\n TEXT = 'text',\n BLUE = 'blue',\n YELLOW = 'yellow',\n GREEN = 'green',\n RED = 'red',\n ORANGE = 'orange',\n PURPLE = 'purple',\n PINK = 'pink',\n BROWN = 'brown',\n GRAY = 'gray',\n BLACK = 'black',\n WHITE = 'white',\n}\n\n/**\n * Enumeration for tag size variants\n *\n * Controls the overall size of tags including padding, font size, and border thickness.\n * Sizes are designed to maintain visual hierarchy and readability.\n *\n * @enum TagSize\n * @property XS - 'xs' - Extra small (0.5rem padding, text-xs, 1.2px border)\n * @property SM - 'sm' - Small (0.5rem padding, text-sm, 1.5px border)\n * @property MD - 'md' - Medium (1rem padding, text-base, 2px border) - Default size\n * @property LG - 'lg' - Large (2rem padding, text-lg, 2px border)\n * @property XL - 'xl' - Extra large (4rem padding, text-xl, 2px border)\n *\n * @example\n * ```tsx\n * // Different sizes for hierarchy\n * <Tag size={TagSize.XS}>Small detail</Tag>\n * <Tag size={TagSize.SM}>Minor category</Tag>\n * <Tag size={TagSize.MD}>Standard tag</Tag>\n * <Tag size={TagSize.LG}>Important label</Tag>\n * <Tag size={TagSize.XL}>Hero tag</Tag>\n * ```\n */\nexport enum TagSize {\n XS = 'xs',\n SM = 'sm',\n MD = 'md',\n LG = 'lg',\n XL = 'xl',\n}\n\n/**\n * Enumeration for tag border visibility\n *\n * Controls whether a border is displayed around the tag.\n *\n * @enum TagBorder\n * @property NONE - 'none' - No border (default)\n * @property WITH - 'with' - Show border with 1.5px thickness\n *\n * @example\n * ```tsx\n * <Tag border={TagBorder.NONE}>Borderless</Tag>\n * <Tag border={TagBorder.WITH}>With Border</Tag>\n * ```\n */\nexport enum TagBorder {\n NONE = 'none',\n WITH = 'with',\n}\n\n/**\n * Enumeration for tag background visibility\n *\n * Controls the background styling of the tag.\n *\n * @enum TagBackground\n * @property NONE - 'none' - No background styling\n * @property WITH - 'with' - Apply background styling\n *\n * @example\n * ```tsx\n * <Tag background={TagBackground.NONE}>No Background</Tag>\n * <Tag background={TagBackground.WITH}>With Background</Tag>\n * ```\n */\nexport enum TagBackground {\n NONE = 'none',\n WITH = 'with',\n}\n\nconst containerVariants = cva('w-fit backdrop-blur', {\n variants: {\n roundedSize: {\n [`${TagRoundedSize.NONE}`]: 'rounded-none',\n [`${TagRoundedSize.SM}`]: 'rounded-sm',\n [`${TagRoundedSize.MD}`]: 'rounded-md',\n [`${TagRoundedSize.LG}`]: 'rounded-lg',\n [`${TagRoundedSize.XL}`]: 'rounded-xl',\n [`${TagRoundedSize.XXL}`]: 'rounded-2xl',\n [`${TagRoundedSize.XXXL}`]: 'rounded-3xl',\n [`${TagRoundedSize.FULL}`]: 'rounded-full',\n },\n color: {\n [`${TagColor.PRIMARY}`]: 'border-primary bg-primary/10 text-primary',\n [`${TagColor.SUCCESS}`]: 'border-success bg-success/10 text-success',\n [`${TagColor.ERROR}`]: 'border-error bg-error/10 text-error',\n [`${TagColor.WARNING}`]: 'border-warning bg-warning/10 text-warning',\n [`${TagColor.NEUTRAL}`]: '/10 border-neutral bg-neutral/10 text-neutral',\n [`${TagColor.TEXT}`]: 'border-text bg-text/10 text-text',\n [`${TagColor.BLUE}`]:\n 'border-blue-500 bg-blue-500/10 text-blue-500 dark:text-blue-300',\n [`${TagColor.YELLOW}`]:\n 'border-yellow-500 bg-yellow-500/10 text-yellow-500 dark:text-yellow-300',\n [`${TagColor.GREEN}`]:\n 'border-green-500 bg-green-500/10 text-green-500 dark:text-green-300',\n [`${TagColor.RED}`]:\n 'border-error bg-error/10 text-error dark:text-red-300',\n [`${TagColor.ORANGE}`]:\n 'border-orange-500 bg-orange-500/10 text-orange-500 dark:text-orange-300',\n [`${TagColor.PURPLE}`]:\n 'border-purple-500 bg-purple-500/10 text-purple-500 dark:text-purple-300',\n [`${TagColor.PINK}`]:\n 'border-pink-500 bg-pink-500/10 text-pink-500 dark:text-pink-300',\n [`${TagColor.BROWN}`]:\n 'border-brown-500 bg-brown-500/10 text-brown-500 dark:text-brown-300',\n [`${TagColor.GRAY}`]:\n 'border-gray-500 bg-gray-500/10 text-gray-500 dark:text-gray-300',\n [`${TagColor.BLACK}`]: 'border-black bg-black/10 text-black',\n [`${TagColor.WHITE}`]: 'border-white bg-white/10 text-white',\n },\n size: {\n [`${TagSize.XS}`]: 'border-[1.2px] px-2 py-0.5 text-xs',\n [`${TagSize.SM}`]: 'border-[1.3px] px-2 py-0.5 text-sm',\n [`${TagSize.MD}`]: 'border-2 px-2 py-1 text-base',\n [`${TagSize.LG}`]: 'border-2 px-3 py-2 text-lg',\n [`${TagSize.XL}`]: 'border-2 px-3 py-2 text-xl',\n },\n border: {\n [`${TagBorder.NONE}`]: 'border-none',\n [`${TagBorder.WITH}`]: 'border-[1.3px] border-text',\n },\n background: {\n [`${TagBackground.NONE}`]: 'bg-none',\n [`${TagBackground.WITH}`]: '',\n },\n },\n\n defaultVariants: {\n roundedSize: TagRoundedSize.FULL,\n border: TagBorder.NONE,\n color: TagColor.TEXT,\n size: TagSize.MD,\n },\n});\n\n/**\n * Tag component for displaying labels, categories, status indicators, and badges\n *\n * The Tag component is a versatile labeling element that supports multiple visual variants\n * for different use cases. It provides semantic color options, flexible sizing, and\n * customizable styling options for borders and backgrounds.\n *\n * ## Features\n * - **Semantic Colors**: Success, error, warning, neutral, and text color themes\n * - **Flexible Sizing**: Five size variants from extra small to extra large\n * - **Border Radius Options**: Eight rounding options from none to fully rounded\n * - **Border Control**: Optional borders for enhanced visual separation\n * - **Background Control**: Configurable background styling\n * - **Accessibility**: Proper HTML semantics and keyboard navigation support\n *\n * ## Use Cases\n * - **Status Indicators**: Show completion, error, or pending states\n * - **Category Labels**: Organize and categorize content\n * - **Badges**: Display counts, notifications, or achievements\n * - **Keywords**: Tag content with relevant keywords or topics\n * - **Metadata**: Show additional information like dates, authors, or types\n *\n * ## Design Principles\n * - Maintains readability across all size and color combinations\n * - Uses backdrop blur effect for subtle transparency\n * - Follows consistent spacing and typography scales\n * - Provides sufficient color contrast for accessibility\n *\n * @param {TagProps} props - The properties for the Tag component\n * @returns {JSX.Element} The rendered tag element\n *\n * @example\n * ```tsx\n * // Basic status tags\n * <Tag color={TagColor.SUCCESS}>Completed</Tag>\n * <Tag color={TagColor.ERROR}>Failed</Tag>\n * <Tag color={TagColor.WARNING}>In Progress</Tag>\n *\n * // Category tags with borders\n * <Tag color={TagColor.NEUTRAL} border={TagBorder.WITH}>\n * Technology\n * </Tag>\n * <Tag color={TagColor.TEXT} border={TagBorder.WITH}>\n * Design\n * </Tag>\n *\n * // Size variations for hierarchy\n * <div className=\"flex items-center gap-2\">\n * <Tag size={TagSize.XS} color={TagColor.NEUTRAL}>Minor</Tag>\n * <Tag size={TagSize.SM} color={TagColor.TEXT}>Standard</Tag>\n * <Tag size={TagSize.LG} color={TagColor.SUCCESS}>Important</Tag>\n * </div>\n *\n * // Rounded variations\n * <div className=\"flex gap-2\">\n * <Tag roundedSize={TagRoundedSize.NONE}>Sharp</Tag>\n * <Tag roundedSize={TagRoundedSize.MD}>Rounded</Tag>\n * <Tag roundedSize={TagRoundedSize.FULL}>Pill</Tag>\n * </div>\n *\n * // Custom styled tag\n * <Tag\n * color={TagColor.WARNING}\n * size={TagSize.LG}\n * border={TagBorder.WITH}\n * roundedSize={TagRoundedSize.LG}\n * className=\"font-bold uppercase tracking-wide\"\n * >\n * Custom Style\n * </Tag>\n *\n * // Interactive tags with click handlers\n * <Tag\n * color={TagColor.SUCCESS}\n * onClick={() => console.log('Tag clicked')}\n * className=\"cursor-pointer hover:opacity-80 transition-opacity\"\n * >\n * Clickable Tag\n * </Tag>\n * ```\n *\n * @see {@link TagColor} - Available color theme options\n * @see {@link TagSize} - Available size variants\n * @see {@link TagRoundedSize} - Available border radius options\n * @see {@link TagBorder} - Border visibility options\n * @see {@link TagBackground} - Background styling options\n */\nexport const Tag: FC<TagProps> = ({\n children,\n color,\n roundedSize,\n size,\n border,\n background,\n className,\n ...props\n}) => {\n return (\n <div\n className={containerVariants({\n color,\n roundedSize,\n size,\n border,\n background,\n className,\n })}\n {...props}\n >\n {children}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEA,IAAY,iBAAL;CACL;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,IAAY,WAAL;CACL;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;AACF;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAY,UAAL;CACL;CACA;CACA;CACA;CACA;;AACF;;;;;;;;;;;;;;;;AAiBA,IAAY,YAAL;CACL;CACA;;AACF;;;;;;;;;;;;;;;;AAiBA,IAAY,gBAAL;CACL;CACA;;AACF;AAEA,MAAM,oBAAoB,IAAI,uBAAuB;CACnD,UAAU;EACR,aAAa;IACV,SAA2B;IAC3B,OAAyB;IACzB,OAAyB;IACzB,OAAyB;IACzB,OAAyB;IACzB,QAA0B;IAC1B,QAA2B;IAC3B,SAA2B;EAC9B;EACA,OAAO;IACJ,YAAwB;IACxB,YAAwB;IACxB,UAAsB;IACtB,YAAwB;IACxB,YAAwB;IACxB,SAAqB;IACrB,SACC;IACD,WACC;IACD,UACC;IACD,QACC;IACD,WACC;IACD,WACC;IACD,SACC;IACD,UACC;IACD,SACC;IACD,UAAsB;IACtB,UAAsB;EACzB;EACA,MAAM;IACH,OAAkB;IAClB,OAAkB;IAClB,OAAkB;IAClB,OAAkB;IAClB,OAAkB;EACrB;EACA,QAAQ;IACL,SAAsB;IACtB,SAAsB;EACzB;EACA,YAAY;IACT,SAA0B;IAC1B,SAA0B;EAC7B;CACF;CAEA,iBAAiB;EACf;EACA;EACA;EACA;CACF;AACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyFD,MAAa,OAAqB,EAChC,UACA,OACA,aACA,MACA,QACA,YACA,WACA,GAAG,YACC;CACJ,OACE,oBAAC,OAAD;EACE,WAAW,kBAAkB;GAC3B;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EACD,GAAI;EAEH;CACE;AAET"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/components/Tag/index.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport type { FC, HTMLAttributes, PropsWithChildren } from 'react';\n\n/**\n * Properties for the Tag component extending HTML div attributes and variant options\n *\n * @interface TagProps\n * @extends {PropsWithChildren<VariantProps<typeof containerVariants>>}\n * @extends {HTMLAttributes<HTMLDivElement>}\n *\n * @property {ReactNode} children - The content to display inside the tag\n * @property {TagColor} [color] - Color theme variant of the tag\n * @property {TagRoundedSize} [roundedSize] - Border radius size of the tag\n * @property {TagSize} [size] - Size variant affecting padding and font size\n * @property {TagBorder} [border] - Whether to show a border around the tag\n * @property {TagBackground} [background] - Background visibility option\n * @property [className] - Additional CSS classes for custom styling\n *\n * @example\n * ```tsx\n * // Basic tag\n * <Tag>Default Tag</Tag>\n *\n * // Success tag with border\n * <Tag color=\"success\" border=\"with\">\n * Success Status\n * </Tag>\n *\n * // Large warning tag\n * <Tag color=\"warning\" size=\"lg\">\n * Important Warning\n * </Tag>\n * ```\n */\ntype TagProps = PropsWithChildren<VariantProps<typeof containerVariants>> &\n HTMLAttributes<HTMLDivElement>;\n\n/**\n * Enumeration for tag border radius sizes\n *\n * Controls the roundedness of tag corners, from sharp edges to fully rounded pills.\n *\n * @enum TagRoundedSize\n * @property NONE - 'none' - No border radius (sharp corners)\n * @property SM - 'sm' - Small border radius (2px)\n * @property MD - 'md' - Medium border radius (6px)\n * @property LG - 'lg' - Large border radius (8px)\n * @property XL - 'xl' - Extra large border radius (12px)\n * @property XXL - '2xl' - 2x large border radius (16px)\n * @property XXXL - '3xl' - 3x large border radius (24px)\n * @property FULL - 'full' - Fully rounded (50% border radius, pill shape)\n *\n * @example\n * ```tsx\n * // Sharp corners\n * <Tag roundedSize=\"none\">Sharp Tag</Tag>\n *\n * // Pill-shaped tag\n * <Tag roundedSize=\"full\">Pill Tag</Tag>\n *\n * // Medium rounded corners\n * <Tag roundedSize=\"md\">Rounded Tag</Tag>\n * ```\n */\nexport type TagRoundedSize = \n | 'none' |\n 'sm' |\n 'md' |\n 'lg' |\n 'xl' |\n '2xl' |\n '3xl' |\n 'full';\n\n/**\n * Enumeration for tag color themes\n *\n * Provides semantic color options for different tag purposes and meanings.\n * Each color includes background, border, and text color variations.\n *\n * @enum TagColor\n * @property SUCCESS - 'success' - Green theme for positive states, success messages, or completed items\n * @property ERROR - 'error' - Red theme for error states, warnings, or failed operations\n * @property WARNING - 'warning' - Yellow/orange theme for caution, pending states, or important notices\n * @property NEUTRAL - 'neutral' - Gray theme for neutral information or secondary content\n * @property TEXT - 'text' - Default text color theme for general purpose tags\n *\n * @example\n * ```tsx\n * // Status indicators\n * <Tag color=\"success\">Completed</Tag>\n * <Tag color=\"error\">Failed</Tag>\n * <Tag color=\"warning\">Pending</Tag>\n *\n * // Category tags\n * <Tag color=\"neutral\">Category</Tag>\n * <Tag color=\"text\">General</Tag>\n * ```\n */\nexport type TagColor = \n | 'primary' |\n 'success' |\n 'error' |\n 'warning' |\n 'neutral' |\n 'text' |\n 'blue' |\n 'yellow' |\n 'green' |\n 'red' |\n 'orange' |\n 'purple' |\n 'pink' |\n 'brown' |\n 'gray' |\n 'black' |\n 'white';\n\n/**\n * Enumeration for tag size variants\n *\n * Controls the overall size of tags including padding, font size, and border thickness.\n * Sizes are designed to maintain visual hierarchy and readability.\n *\n * @enum TagSize\n * @property XS - 'xs' - Extra small (0.5rem padding, text-xs, 1.2px border)\n * @property SM - 'sm' - Small (0.5rem padding, text-sm, 1.5px border)\n * @property MD - 'md' - Medium (1rem padding, text-base, 2px border) - Default size\n * @property LG - 'lg' - Large (2rem padding, text-lg, 2px border)\n * @property XL - 'xl' - Extra large (4rem padding, text-xl, 2px border)\n *\n * @example\n * ```tsx\n * // Different sizes for hierarchy\n * <Tag size=\"xs\">Small detail</Tag>\n * <Tag size=\"sm\">Minor category</Tag>\n * <Tag size=\"md\">Standard tag</Tag>\n * <Tag size=\"lg\">Important label</Tag>\n * <Tag size=\"xl\">Hero tag</Tag>\n * ```\n */\nexport type TagSize = \n | 'xs' |\n 'sm' |\n 'md' |\n 'lg' |\n 'xl';\n\n/**\n * Enumeration for tag border visibility\n *\n * Controls whether a border is displayed around the tag.\n *\n * @enum TagBorder\n * @property NONE - 'none' - No border (default)\n * @property WITH - 'with' - Show border with 1.5px thickness\n *\n * @example\n * ```tsx\n * <Tag border=\"none\">Borderless</Tag>\n * <Tag border=\"with\">With Border</Tag>\n * ```\n */\nexport type TagBorder = \n | 'none' |\n 'with';\n\n/**\n * Enumeration for tag background visibility\n *\n * Controls the background styling of the tag.\n *\n * @enum TagBackground\n * @property NONE - 'none' - No background styling\n * @property WITH - 'with' - Apply background styling\n *\n * @example\n * ```tsx\n * <Tag background=\"none\">No Background</Tag>\n * <Tag background=\"with\">With Background</Tag>\n * ```\n */\nexport type TagBackground = \n | 'none' |\n 'with';\n\nconst containerVariants = cva('w-fit backdrop-blur', {\n variants: {\n roundedSize: {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n [`${\"xxl\"}`]: 'rounded-2xl',\n [`${\"xxxl\"}`]: 'rounded-3xl',\n full: 'rounded-full',\n },\n color: {\n primary: 'border-primary bg-primary/10 text-primary',\n success: 'border-success bg-success/10 text-success',\n error: 'border-error bg-error/10 text-error',\n warning: 'border-warning bg-warning/10 text-warning',\n neutral: '/10 border-neutral bg-neutral/10 text-neutral',\n text: 'border-text bg-text/10 text-text',\n blue:\n 'border-blue-500 bg-blue-500/10 text-blue-500 dark:text-blue-300',\n yellow:\n 'border-yellow-500 bg-yellow-500/10 text-yellow-500 dark:text-yellow-300',\n green:\n 'border-green-500 bg-green-500/10 text-green-500 dark:text-green-300',\n red:\n 'border-error bg-error/10 text-error dark:text-red-300',\n orange:\n 'border-orange-500 bg-orange-500/10 text-orange-500 dark:text-orange-300',\n purple:\n 'border-purple-500 bg-purple-500/10 text-purple-500 dark:text-purple-300',\n pink:\n 'border-pink-500 bg-pink-500/10 text-pink-500 dark:text-pink-300',\n brown:\n 'border-brown-500 bg-brown-500/10 text-brown-500 dark:text-brown-300',\n gray:\n 'border-gray-500 bg-gray-500/10 text-gray-500 dark:text-gray-300',\n black: 'border-black bg-black/10 text-black',\n white: 'border-white bg-white/10 text-white',\n },\n size: {\n xs: 'border-[1.2px] px-2 py-0.5 text-xs',\n sm: 'border-[1.3px] px-2 py-0.5 text-sm',\n md: 'border-2 px-2 py-1 text-base',\n lg: 'border-2 px-3 py-2 text-lg',\n xl: 'border-2 px-3 py-2 text-xl',\n },\n border: {\n none: 'border-none',\n with: 'border-[1.3px] border-text',\n },\n background: {\n none: 'bg-none',\n with: '',\n },\n },\n\n defaultVariants: {\n roundedSize: 'full',\n border: 'none',\n color: 'text',\n size: 'md',\n },\n});\n\n/**\n * Tag component for displaying labels, categories, status indicators, and badges\n *\n * The Tag component is a versatile labeling element that supports multiple visual variants\n * for different use cases. It provides semantic color options, flexible sizing, and\n * customizable styling options for borders and backgrounds.\n *\n * ## Features\n * - **Semantic Colors**: Success, error, warning, neutral, and text color themes\n * - **Flexible Sizing**: Five size variants from extra small to extra large\n * - **Border Radius Options**: Eight rounding options from none to fully rounded\n * - **Border Control**: Optional borders for enhanced visual separation\n * - **Background Control**: Configurable background styling\n * - **Accessibility**: Proper HTML semantics and keyboard navigation support\n *\n * ## Use Cases\n * - **Status Indicators**: Show completion, error, or pending states\n * - **Category Labels**: Organize and categorize content\n * - **Badges**: Display counts, notifications, or achievements\n * - **Keywords**: Tag content with relevant keywords or topics\n * - **Metadata**: Show additional information like dates, authors, or types\n *\n * ## Design Principles\n * - Maintains readability across all size and color combinations\n * - Uses backdrop blur effect for subtle transparency\n * - Follows consistent spacing and typography scales\n * - Provides sufficient color contrast for accessibility\n *\n * @param {TagProps} props - The properties for the Tag component\n * @returns {JSX.Element} The rendered tag element\n *\n * @example\n * ```tsx\n * // Basic status tags\n * <Tag color=\"success\">Completed</Tag>\n * <Tag color=\"error\">Failed</Tag>\n * <Tag color=\"warning\">In Progress</Tag>\n *\n * // Category tags with borders\n * <Tag color=\"neutral\" border=\"with\">\n * Technology\n * </Tag>\n * <Tag color=\"text\" border=\"with\">\n * Design\n * </Tag>\n *\n * // Size variations for hierarchy\n * <div className=\"flex items-center gap-2\">\n * <Tag size=\"xs\" color=\"neutral\">Minor</Tag>\n * <Tag size=\"sm\" color=\"text\">Standard</Tag>\n * <Tag size=\"lg\" color=\"success\">Important</Tag>\n * </div>\n *\n * // Rounded variations\n * <div className=\"flex gap-2\">\n * <Tag roundedSize=\"none\">Sharp</Tag>\n * <Tag roundedSize=\"md\">Rounded</Tag>\n * <Tag roundedSize=\"full\">Pill</Tag>\n * </div>\n *\n * // Custom styled tag\n * <Tag\n * color=\"warning\"\n * size=\"lg\"\n * border=\"with\"\n * roundedSize=\"lg\"\n * className=\"font-bold uppercase tracking-wide\"\n * >\n * Custom Style\n * </Tag>\n *\n * // Interactive tags with click handlers\n * <Tag\n * color=\"success\"\n * onClick={() => console.log('Tag clicked')}\n * className=\"cursor-pointer hover:opacity-80 transition-opacity\"\n * >\n * Clickable Tag\n * </Tag>\n * ```\n *\n * @see {@link TagColor} - Available color theme options\n * @see {@link TagSize} - Available size variants\n * @see {@link TagRoundedSize} - Available border radius options\n * @see {@link TagBorder} - Border visibility options\n * @see {@link TagBackground} - Background styling options\n */\nexport const Tag: FC<TagProps> = ({\n children,\n color,\n roundedSize,\n size,\n border,\n background,\n className,\n ...props\n}) => {\n return (\n <div\n className={containerVariants({\n color,\n roundedSize,\n size,\n border,\n background,\n className,\n })}\n {...props}\n >\n {children}\n </div>\n );\n};\n"],"mappings":";;;;AA0LA,MAAM,oBAAoB,IAAI,uBAAuB;CACnD,UAAU;EACR,aAAa;GACX,MAAM;GACN,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;IACH,QAAa;IACb,SAAc;GACf,MAAM;EACR;EACA,OAAO;GACL,SAAS;GACT,SAAS;GACT,OAAO;GACP,SAAS;GACT,SAAS;GACT,MAAM;GACN,MACE;GACF,QACE;GACF,OACE;GACF,KACE;GACF,QACE;GACF,QACE;GACF,MACE;GACF,OACE;GACF,MACE;GACF,OAAO;GACP,OAAO;EACT;EACA,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;EACN;EACA,QAAQ;GACN,MAAM;GACN,MAAM;EACR;EACA,YAAY;GACV,MAAM;GACN,MAAM;EACR;CACF;CAEA,iBAAiB;EACf,aAAa;EACb,QAAQ;EACR,OAAO;EACP,MAAM;CACR;AACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyFD,MAAa,OAAqB,EAChC,UACA,OACA,aACA,MACA,QACA,YACA,WACA,GAAG,YACC;CACJ,OACE,oBAAC,OAAD;EACE,WAAW,kBAAkB;GAC3B;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EACD,GAAI;EAEH;CACE;AAET"}
@@ -1,5 +1,4 @@
1
1
  import { cn } from "../../utils/cn.mjs";
2
- import { TechLogoName } from "./types.mjs";
3
2
  import { Suspense, lazy } from "react";
4
3
  import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
5
4
 
@@ -11,42 +10,42 @@ const dynamicLogo = (importFn, exportName) => lazy(async () => {
11
10
  return { default: (await importFn())[exportName] };
12
11
  });
13
12
  const logoRecord = {
14
- ["adonis"]: dynamicLogo(() => import("./logos/Adonis.mjs"), "AdonisLogo"),
15
- ["angular"]: dynamicLogo(() => import("./logos/Angular.mjs"), "AngularLogo"),
16
- ["astro"]: dynamicLogo(() => import("./logos/Astro.mjs"), "AstroLogo"),
17
- ["express"]: dynamicLogo(() => import("./logos/Express.mjs"), "ExpressLogo"),
18
- ["fastify"]: dynamicLogo(() => import("./logos/Fastify.mjs"), "FastifyLogo"),
19
- ["hono"]: dynamicLogo(() => import("./logos/Hono.mjs"), "HonoLogo"),
20
- ["lynx"]: dynamicLogo(() => import("./logos/Lynx.mjs"), "LynxLogo"),
21
- ["nestjs"]: dynamicLogo(() => import("./logos/NestJS.mjs"), "NestJSLogo"),
22
- ["nextjs"]: dynamicLogo(() => import("./logos/Nextjs.mjs"), "NextJSLogo"),
23
- ["node"]: dynamicLogo(() => import("./logos/Node.mjs"), "NodejsLogo"),
24
- ["nuxt"]: dynamicLogo(() => import("./logos/Nuxt.mjs"), "NuxtLogo"),
25
- ["preact"]: dynamicLogo(() => import("./logos/Preact.mjs"), "PreactLogo"),
26
- ["react"]: dynamicLogo(() => import("./logos/Reactjs.mjs"), "ReactLogo"),
27
- ["solid"]: dynamicLogo(() => import("./logos/Solid.mjs"), "SolidLogo"),
28
- ["svelte"]: dynamicLogo(() => import("./logos/Svelte.mjs"), "SvelteLogo"),
29
- ["tanstack"]: dynamicLogo(() => import("./logos/Tanstack.mjs"), "TanstackLogo"),
30
- ["vite"]: dynamicLogo(() => import("./logos/Vitejs.mjs"), "ViteLogo"),
31
- ["vue"]: dynamicLogo(() => import("./logos/Vuejs.mjs"), "VuejsLogo"),
32
- ["lit"]: dynamicLogo(() => import("./logos/Lit.mjs"), "LitLogo"),
33
- ["vanilla"]: dynamicLogo(() => import("./logos/Vanilla.mjs"), "JavaScriptLogo"),
34
- ["anthropic"]: dynamicLogo(() => import("./logos/Anthropic.mjs"), "AnthropicLogo"),
35
- ["claude"]: dynamicLogo(() => import("./logos/Claude.mjs"), "ClaudeLogo"),
36
- ["chatgpt"]: dynamicLogo(() => import("./logos/ChatGPT.mjs"), "ChatGPTLogo"),
37
- ["deepseek"]: dynamicLogo(() => import("./logos/DeepSeek.mjs"), "DeepSeekLogo"),
38
- ["gemini"]: dynamicLogo(() => import("./logos/Gemini.mjs"), "GeminiLogo"),
39
- ["googleai"]: dynamicLogo(() => import("./logos/GoogleAI.mjs"), "GoogleAILogo"),
40
- ["grok"]: dynamicLogo(() => import("./logos/Grok.mjs"), "GrokLogo"),
41
- ["mistral"]: dynamicLogo(() => import("./logos/Mistral.mjs"), "MistralLogo"),
42
- ["ollama"]: dynamicLogo(() => import("./logos/Ollama.mjs"), "OllamaLogo"),
43
- ["openai"]: dynamicLogo(() => import("./logos/OpenAI.mjs"), "OpenAILogo"),
44
- ["perplexity"]: dynamicLogo(() => import("./logos/Perplexity.mjs"), "PerplexityLogo"),
45
- ["github"]: dynamicLogo(() => import("./logos/GitHub.mjs"), "GitHubLogo"),
46
- ["gitlab"]: dynamicLogo(() => import("./logos/GitLab.mjs"), "GitLabLogo"),
47
- ["bitbucket"]: dynamicLogo(() => import("./logos/Bitbucket.mjs"), "BitbucketLogo"),
48
- ["google"]: dynamicLogo(() => import("./logos/Google.mjs"), "GoogleLogo"),
49
- ["linkedin"]: dynamicLogo(() => import("./logos/LinkedIn.mjs"), "LinkedInLogo")
13
+ adonis: dynamicLogo(() => import("./logos/Adonis.mjs"), "AdonisLogo"),
14
+ angular: dynamicLogo(() => import("./logos/Angular.mjs"), "AngularLogo"),
15
+ astro: dynamicLogo(() => import("./logos/Astro.mjs"), "AstroLogo"),
16
+ express: dynamicLogo(() => import("./logos/Express.mjs"), "ExpressLogo"),
17
+ fastify: dynamicLogo(() => import("./logos/Fastify.mjs"), "FastifyLogo"),
18
+ hono: dynamicLogo(() => import("./logos/Hono.mjs"), "HonoLogo"),
19
+ lynx: dynamicLogo(() => import("./logos/Lynx.mjs"), "LynxLogo"),
20
+ nestjs: dynamicLogo(() => import("./logos/NestJS.mjs"), "NestJSLogo"),
21
+ nextjs: dynamicLogo(() => import("./logos/Nextjs.mjs"), "NextJSLogo"),
22
+ node: dynamicLogo(() => import("./logos/Node.mjs"), "NodejsLogo"),
23
+ nuxt: dynamicLogo(() => import("./logos/Nuxt.mjs"), "NuxtLogo"),
24
+ preact: dynamicLogo(() => import("./logos/Preact.mjs"), "PreactLogo"),
25
+ react: dynamicLogo(() => import("./logos/Reactjs.mjs"), "ReactLogo"),
26
+ solid: dynamicLogo(() => import("./logos/Solid.mjs"), "SolidLogo"),
27
+ svelte: dynamicLogo(() => import("./logos/Svelte.mjs"), "SvelteLogo"),
28
+ tanstack: dynamicLogo(() => import("./logos/Tanstack.mjs"), "TanstackLogo"),
29
+ vite: dynamicLogo(() => import("./logos/Vitejs.mjs"), "ViteLogo"),
30
+ vue: dynamicLogo(() => import("./logos/Vuejs.mjs"), "VuejsLogo"),
31
+ lit: dynamicLogo(() => import("./logos/Lit.mjs"), "LitLogo"),
32
+ vanilla: dynamicLogo(() => import("./logos/Vanilla.mjs"), "JavaScriptLogo"),
33
+ anthropic: dynamicLogo(() => import("./logos/Anthropic.mjs"), "AnthropicLogo"),
34
+ claude: dynamicLogo(() => import("./logos/Claude.mjs"), "ClaudeLogo"),
35
+ chatgpt: dynamicLogo(() => import("./logos/ChatGPT.mjs"), "ChatGPTLogo"),
36
+ deepseek: dynamicLogo(() => import("./logos/DeepSeek.mjs"), "DeepSeekLogo"),
37
+ gemini: dynamicLogo(() => import("./logos/Gemini.mjs"), "GeminiLogo"),
38
+ googleai: dynamicLogo(() => import("./logos/GoogleAI.mjs"), "GoogleAILogo"),
39
+ grok: dynamicLogo(() => import("./logos/Grok.mjs"), "GrokLogo"),
40
+ mistral: dynamicLogo(() => import("./logos/Mistral.mjs"), "MistralLogo"),
41
+ ollama: dynamicLogo(() => import("./logos/Ollama.mjs"), "OllamaLogo"),
42
+ openai: dynamicLogo(() => import("./logos/OpenAI.mjs"), "OpenAILogo"),
43
+ perplexity: dynamicLogo(() => import("./logos/Perplexity.mjs"), "PerplexityLogo"),
44
+ github: dynamicLogo(() => import("./logos/GitHub.mjs"), "GitHubLogo"),
45
+ gitlab: dynamicLogo(() => import("./logos/GitLab.mjs"), "GitLabLogo"),
46
+ bitbucket: dynamicLogo(() => import("./logos/Bitbucket.mjs"), "BitbucketLogo"),
47
+ google: dynamicLogo(() => import("./logos/Google.mjs"), "GoogleLogo"),
48
+ linkedin: dynamicLogo(() => import("./logos/LinkedIn.mjs"), "LinkedInLogo")
50
49
  };
51
50
  const TechLogo = ({ name, ...props }) => {
52
51
  const LazyLogo = logoRecord[name];