solid-tom-ui 1.0.8 → 1.0.11

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 (502) hide show
  1. package/dist/README.md +246 -0
  2. package/dist/components/avatar/index.d.ts +3 -0
  3. package/{components → dist/components}/avatar/index.d.ts.map +1 -1
  4. package/dist/components/button/index.d.ts +3 -0
  5. package/{components → dist/components}/button/index.d.ts.map +1 -1
  6. package/dist/components/collapse/index.d.ts +3 -0
  7. package/{components → dist/components}/collapse/index.d.ts.map +1 -1
  8. package/dist/components/float-button/index.d.ts +3 -0
  9. package/{components → dist/components}/float-button/index.d.ts.map +1 -1
  10. package/dist/components/input/index.d.ts +3 -0
  11. package/dist/components/input/index.d.ts.map +1 -0
  12. package/dist/components/menu/index.d.ts +4 -0
  13. package/{components → dist/components}/menu/index.d.ts.map +1 -1
  14. package/{components → dist/components}/menu/menu.types.d.ts +9 -10
  15. package/{components → dist/components}/menu/menu.types.d.ts.map +1 -1
  16. package/dist/components/rating/index.d.ts +3 -0
  17. package/{components → dist/components}/rating/index.d.ts.map +1 -1
  18. package/dist/components/slider/index.d.ts +3 -0
  19. package/{components → dist/components}/slider/index.d.ts.map +1 -1
  20. package/{components → dist/components}/tour/tour.d.ts.map +1 -1
  21. package/{components → dist/components}/tour/tour.js +1 -1
  22. package/{components → dist/components}/tour/tour.js.map +1 -1
  23. package/{components → dist/components}/z-index/z-index.types.js.map +1 -1
  24. package/dist/package.json +45 -0
  25. package/dist/skill/avatar.skill.md.txt +255 -0
  26. package/dist/skill/badge.skill.md.txt +223 -0
  27. package/dist/skill/blank.skill.md.txt +0 -0
  28. package/dist/skill/breadcrumb.skill.md.txt +177 -0
  29. package/dist/skill/button.skill.md.txt +198 -0
  30. package/dist/skill/carousel.skill.md.txt +406 -0
  31. package/dist/skill/chat-bubble.skill.md.txt +342 -0
  32. package/dist/skill/checkbox.skill.md.txt +326 -0
  33. package/dist/skill/code-preview.skill.md.txt +240 -0
  34. package/dist/skill/collapse.skill.md.txt +329 -0
  35. package/dist/skill/context-menu.skill.md.txt +233 -0
  36. package/dist/skill/diff.skill.md.txt +244 -0
  37. package/dist/skill/divider.skill.md.txt +151 -0
  38. package/dist/skill/doc.skill.md.txt +191 -0
  39. package/dist/skill/drawer.skill.md.txt +157 -0
  40. package/dist/skill/dropdown.skill.md.txt +198 -0
  41. package/dist/skill/float-button.skill.md.txt +315 -0
  42. package/dist/skill/hover-3d-image.skill.md.txt +120 -0
  43. package/dist/skill/iframe.skill.md.txt +114 -0
  44. package/dist/skill/image-preview.skill.md.txt +162 -0
  45. package/dist/skill/indicator.skill.md.txt +60 -0
  46. package/dist/skill/input.skill.md.txt +489 -0
  47. package/dist/skill/loading.skill.md.txt +127 -0
  48. package/dist/skill/mansory.skill.md.txt +0 -0
  49. package/dist/skill/menu.skill.md.txt +476 -0
  50. package/dist/skill/modal.skill.md.txt +359 -0
  51. package/dist/skill/pagination.skill.md.txt +405 -0
  52. package/dist/skill/progress-bar.skill.md.txt +207 -0
  53. package/dist/skill/qr-code.skill.md.txt +136 -0
  54. package/dist/skill/rating.skill.md.txt +167 -0
  55. package/dist/skill/select-zone.skill.md.txt +93 -0
  56. package/dist/skill/select.skill.md.txt +663 -0
  57. package/dist/skill/skeleton.skill.md.txt +192 -0
  58. package/dist/skill/slider.skill.md.txt +404 -0
  59. package/dist/skill/splitter.skill.md.txt +411 -0
  60. package/dist/skill/steps.skill.md.txt +264 -0
  61. package/dist/skill/swap.skill.md.txt +139 -0
  62. package/dist/skill/switch.skill.md.txt +191 -0
  63. package/dist/skill/tab.skill.md.txt +484 -0
  64. package/dist/skill/table.example.header.md.txt +667 -0
  65. package/dist/skill/table.skill.md.txt +1407 -0
  66. package/dist/skill/text-rotate.skill.md.txt +186 -0
  67. package/dist/skill/timeline.skill.md.txt +247 -0
  68. package/dist/skill/toast.skill.md.txt +531 -0
  69. package/dist/skill/tooltip.skill.md.txt +222 -0
  70. package/dist/skill/tour.skill.md.txt +156 -0
  71. package/dist/skill/upload.skill.md.txt +358 -0
  72. package/dist/skill/z-index.skill.md.txt +0 -0
  73. package/{solid-ui.css → dist/solid-ui.css} +2 -2
  74. package/package.json +97 -9
  75. package/components/avatar/index.d.ts +0 -2
  76. package/components/button/index.d.ts +0 -2
  77. package/components/collapse/index.d.ts +0 -2
  78. package/components/float-button/index.d.ts +0 -2
  79. package/components/input/index.d.ts +0 -2
  80. package/components/input/index.d.ts.map +0 -1
  81. package/components/menu/index.d.ts +0 -4
  82. package/components/rating/index.d.ts +0 -2
  83. package/components/slider/index.d.ts +0 -2
  84. package/macos.code-workspace +0 -8
  85. /package/{components → dist/components}/avatar/avatar.d.ts +0 -0
  86. /package/{components → dist/components}/avatar/avatar.d.ts.map +0 -0
  87. /package/{components → dist/components}/avatar/avatar.js +0 -0
  88. /package/{components → dist/components}/avatar/avatar.js.map +0 -0
  89. /package/{components → dist/components}/avatar/avatar.types.d.ts +0 -0
  90. /package/{components → dist/components}/avatar/avatar.types.d.ts.map +0 -0
  91. /package/{components → dist/components}/badge/badge.d.ts +0 -0
  92. /package/{components → dist/components}/badge/badge.d.ts.map +0 -0
  93. /package/{components → dist/components}/badge/badge.js +0 -0
  94. /package/{components → dist/components}/badge/badge.js.map +0 -0
  95. /package/{components → dist/components}/badge/badge.types.d.ts +0 -0
  96. /package/{components → dist/components}/badge/badge.types.d.ts.map +0 -0
  97. /package/{components → dist/components}/badge/index.d.ts +0 -0
  98. /package/{components → dist/components}/badge/index.d.ts.map +0 -0
  99. /package/{components → dist/components}/blank/blank.d.ts +0 -0
  100. /package/{components → dist/components}/blank/blank.d.ts.map +0 -0
  101. /package/{components → dist/components}/blank/index.d.ts +0 -0
  102. /package/{components → dist/components}/blank/index.d.ts.map +0 -0
  103. /package/{components → dist/components}/breadcrumb/breadcrumb.d.ts +0 -0
  104. /package/{components → dist/components}/breadcrumb/breadcrumb.d.ts.map +0 -0
  105. /package/{components → dist/components}/breadcrumb/breadcrumb.js +0 -0
  106. /package/{components → dist/components}/breadcrumb/breadcrumb.js.map +0 -0
  107. /package/{components → dist/components}/breadcrumb/index.d.ts +0 -0
  108. /package/{components → dist/components}/breadcrumb/index.d.ts.map +0 -0
  109. /package/{components → dist/components}/button/button.d.ts +0 -0
  110. /package/{components → dist/components}/button/button.d.ts.map +0 -0
  111. /package/{components → dist/components}/button/button.js +0 -0
  112. /package/{components → dist/components}/button/button.js.map +0 -0
  113. /package/{components → dist/components}/button/button.types.d.ts +0 -0
  114. /package/{components → dist/components}/button/button.types.d.ts.map +0 -0
  115. /package/{components → dist/components}/carousel/carousel.d.ts +0 -0
  116. /package/{components → dist/components}/carousel/carousel.d.ts.map +0 -0
  117. /package/{components → dist/components}/carousel/carousel.js +0 -0
  118. /package/{components → dist/components}/carousel/carousel.js.map +0 -0
  119. /package/{components → dist/components}/carousel/carousel.types.d.ts +0 -0
  120. /package/{components → dist/components}/carousel/carousel.types.d.ts.map +0 -0
  121. /package/{components → dist/components}/carousel/index.d.ts +0 -0
  122. /package/{components → dist/components}/carousel/index.d.ts.map +0 -0
  123. /package/{components → dist/components}/chat-bubble/chatBubble.d.ts +0 -0
  124. /package/{components → dist/components}/chat-bubble/chatBubble.d.ts.map +0 -0
  125. /package/{components → dist/components}/chat-bubble/chatBubble.js +0 -0
  126. /package/{components → dist/components}/chat-bubble/chatBubble.js.map +0 -0
  127. /package/{components → dist/components}/chat-bubble/chatBubble.type.d.ts +0 -0
  128. /package/{components → dist/components}/chat-bubble/chatBubble.type.d.ts.map +0 -0
  129. /package/{components → dist/components}/chat-bubble/index.d.ts +0 -0
  130. /package/{components → dist/components}/chat-bubble/index.d.ts.map +0 -0
  131. /package/{components → dist/components}/checkbox/checkbox.d.ts +0 -0
  132. /package/{components → dist/components}/checkbox/checkbox.d.ts.map +0 -0
  133. /package/{components → dist/components}/checkbox/checkbox.js +0 -0
  134. /package/{components → dist/components}/checkbox/checkbox.js.map +0 -0
  135. /package/{components → dist/components}/checkbox/index.d.ts +0 -0
  136. /package/{components → dist/components}/checkbox/index.d.ts.map +0 -0
  137. /package/{components → dist/components}/collapse/collapse.d.ts +0 -0
  138. /package/{components → dist/components}/collapse/collapse.d.ts.map +0 -0
  139. /package/{components → dist/components}/collapse/collapse.js +0 -0
  140. /package/{components → dist/components}/collapse/collapse.js.map +0 -0
  141. /package/{components → dist/components}/collapse/collapse.types.d.ts +0 -0
  142. /package/{components → dist/components}/collapse/collapse.types.d.ts.map +0 -0
  143. /package/{components → dist/components}/context-menu/context-menu.d.ts +0 -0
  144. /package/{components → dist/components}/context-menu/context-menu.d.ts.map +0 -0
  145. /package/{components → dist/components}/context-menu/context-menu.js +0 -0
  146. /package/{components → dist/components}/context-menu/context-menu.js.map +0 -0
  147. /package/{components → dist/components}/context-menu/context-menu.store.d.ts +0 -0
  148. /package/{components → dist/components}/context-menu/context-menu.store.d.ts.map +0 -0
  149. /package/{components → dist/components}/context-menu/context-menu.store.js +0 -0
  150. /package/{components → dist/components}/context-menu/context-menu.store.js.map +0 -0
  151. /package/{components → dist/components}/context-menu/context-menu.types.d.ts +0 -0
  152. /package/{components → dist/components}/context-menu/context-menu.types.d.ts.map +0 -0
  153. /package/{components → dist/components}/context-menu/index.d.ts +0 -0
  154. /package/{components → dist/components}/context-menu/index.d.ts.map +0 -0
  155. /package/{components → dist/components}/diff/diff.d.ts +0 -0
  156. /package/{components → dist/components}/diff/diff.d.ts.map +0 -0
  157. /package/{components → dist/components}/diff/diff.js +0 -0
  158. /package/{components → dist/components}/diff/diff.js.map +0 -0
  159. /package/{components → dist/components}/diff/index.d.ts +0 -0
  160. /package/{components → dist/components}/diff/index.d.ts.map +0 -0
  161. /package/{components → dist/components}/divider/divider.d.ts +0 -0
  162. /package/{components → dist/components}/divider/divider.d.ts.map +0 -0
  163. /package/{components → dist/components}/divider/divider.js +0 -0
  164. /package/{components → dist/components}/divider/divider.js.map +0 -0
  165. /package/{components → dist/components}/divider/divider.types.d.ts +0 -0
  166. /package/{components → dist/components}/divider/divider.types.d.ts.map +0 -0
  167. /package/{components → dist/components}/divider/index.d.ts +0 -0
  168. /package/{components → dist/components}/divider/index.d.ts.map +0 -0
  169. /package/{components → dist/components}/drawer/drawer.d.ts +0 -0
  170. /package/{components → dist/components}/drawer/drawer.d.ts.map +0 -0
  171. /package/{components → dist/components}/drawer/drawer.js +0 -0
  172. /package/{components → dist/components}/drawer/drawer.js.map +0 -0
  173. /package/{components → dist/components}/drawer/drawer.types.d.ts +0 -0
  174. /package/{components → dist/components}/drawer/drawer.types.d.ts.map +0 -0
  175. /package/{components → dist/components}/drawer/index.d.ts +0 -0
  176. /package/{components → dist/components}/drawer/index.d.ts.map +0 -0
  177. /package/{components → dist/components}/dropdown/dropdown.d.ts +0 -0
  178. /package/{components → dist/components}/dropdown/dropdown.d.ts.map +0 -0
  179. /package/{components → dist/components}/dropdown/dropdown.js +0 -0
  180. /package/{components → dist/components}/dropdown/dropdown.js.map +0 -0
  181. /package/{components → dist/components}/dropdown/dropdown.store.d.ts +0 -0
  182. /package/{components → dist/components}/dropdown/dropdown.store.d.ts.map +0 -0
  183. /package/{components → dist/components}/dropdown/dropdown.store.js +0 -0
  184. /package/{components → dist/components}/dropdown/dropdown.store.js.map +0 -0
  185. /package/{components → dist/components}/dropdown/dropdown.types.d.ts +0 -0
  186. /package/{components → dist/components}/dropdown/dropdown.types.d.ts.map +0 -0
  187. /package/{components → dist/components}/dropdown/index.d.ts +0 -0
  188. /package/{components → dist/components}/dropdown/index.d.ts.map +0 -0
  189. /package/{components → dist/components}/float-button/float-button.d.ts +0 -0
  190. /package/{components → dist/components}/float-button/float-button.d.ts.map +0 -0
  191. /package/{components → dist/components}/float-button/float-button.js +0 -0
  192. /package/{components → dist/components}/float-button/float-button.js.map +0 -0
  193. /package/{components → dist/components}/float-button/float-button.types.d.ts +0 -0
  194. /package/{components → dist/components}/float-button/float-button.types.d.ts.map +0 -0
  195. /package/{components → dist/components}/hover-3d-image/hover-3d-example.d.ts +0 -0
  196. /package/{components → dist/components}/hover-3d-image/hover-3d-example.d.ts.map +0 -0
  197. /package/{components → dist/components}/hover-3d-image/hover-3d-image.d.ts +0 -0
  198. /package/{components → dist/components}/hover-3d-image/hover-3d-image.d.ts.map +0 -0
  199. /package/{components → dist/components}/hover-3d-image/hover-3d-image.js +0 -0
  200. /package/{components → dist/components}/hover-3d-image/hover-3d-image.js.map +0 -0
  201. /package/{components → dist/components}/hover-3d-image/index.d.ts +0 -0
  202. /package/{components → dist/components}/hover-3d-image/index.d.ts.map +0 -0
  203. /package/{components → dist/components}/image-preview/image-preview.d.ts +0 -0
  204. /package/{components → dist/components}/image-preview/image-preview.d.ts.map +0 -0
  205. /package/{components → dist/components}/image-preview/image-preview.js +0 -0
  206. /package/{components → dist/components}/image-preview/image-preview.js.map +0 -0
  207. /package/{components → dist/components}/image-preview/index.d.ts +0 -0
  208. /package/{components → dist/components}/image-preview/index.d.ts.map +0 -0
  209. /package/{components → dist/components}/indicator/index.d.ts +0 -0
  210. /package/{components → dist/components}/indicator/index.d.ts.map +0 -0
  211. /package/{components → dist/components}/indicator/indicator.d.ts +0 -0
  212. /package/{components → dist/components}/indicator/indicator.d.ts.map +0 -0
  213. /package/{components → dist/components}/indicator/indicator.js +0 -0
  214. /package/{components → dist/components}/indicator/indicator.js.map +0 -0
  215. /package/{components → dist/components}/indicator/indicator.types.d.ts +0 -0
  216. /package/{components → dist/components}/indicator/indicator.types.d.ts.map +0 -0
  217. /package/{components → dist/components}/input/input.d.ts +0 -0
  218. /package/{components → dist/components}/input/input.d.ts.map +0 -0
  219. /package/{components → dist/components}/input/input.js +0 -0
  220. /package/{components → dist/components}/input/input.js.map +0 -0
  221. /package/{components → dist/components}/input/input.types.d.ts +0 -0
  222. /package/{components → dist/components}/input/input.types.d.ts.map +0 -0
  223. /package/{components → dist/components}/input/input.utils.d.ts +0 -0
  224. /package/{components → dist/components}/input/input.utils.d.ts.map +0 -0
  225. /package/{components → dist/components}/input/input.utils.js +0 -0
  226. /package/{components → dist/components}/input/input.utils.js.map +0 -0
  227. /package/{components → dist/components}/input/variants/input-color.d.ts +0 -0
  228. /package/{components → dist/components}/input/variants/input-color.d.ts.map +0 -0
  229. /package/{components → dist/components}/input/variants/input-color.js +0 -0
  230. /package/{components → dist/components}/input/variants/input-color.js.map +0 -0
  231. /package/{components → dist/components}/input/variants/input-date.d.ts +0 -0
  232. /package/{components → dist/components}/input/variants/input-date.d.ts.map +0 -0
  233. /package/{components → dist/components}/input/variants/input-date.js +0 -0
  234. /package/{components → dist/components}/input/variants/input-date.js.map +0 -0
  235. /package/{components → dist/components}/input/variants/input-number.d.ts +0 -0
  236. /package/{components → dist/components}/input/variants/input-number.d.ts.map +0 -0
  237. /package/{components → dist/components}/input/variants/input-number.js +0 -0
  238. /package/{components → dist/components}/input/variants/input-number.js.map +0 -0
  239. /package/{components → dist/components}/input/variants/input-otp.d.ts +0 -0
  240. /package/{components → dist/components}/input/variants/input-otp.d.ts.map +0 -0
  241. /package/{components → dist/components}/input/variants/input-otp.js +0 -0
  242. /package/{components → dist/components}/input/variants/input-otp.js.map +0 -0
  243. /package/{components → dist/components}/input/variants/input-password.d.ts +0 -0
  244. /package/{components → dist/components}/input/variants/input-password.d.ts.map +0 -0
  245. /package/{components → dist/components}/input/variants/input-password.js +0 -0
  246. /package/{components → dist/components}/input/variants/input-password.js.map +0 -0
  247. /package/{components → dist/components}/input/variants/input-radio.d.ts +0 -0
  248. /package/{components → dist/components}/input/variants/input-radio.d.ts.map +0 -0
  249. /package/{components → dist/components}/input/variants/input-radio.js +0 -0
  250. /package/{components → dist/components}/input/variants/input-radio.js.map +0 -0
  251. /package/{components → dist/components}/input/variants/input-range.d.ts +0 -0
  252. /package/{components → dist/components}/input/variants/input-range.d.ts.map +0 -0
  253. /package/{components → dist/components}/input/variants/input-range.js +0 -0
  254. /package/{components → dist/components}/input/variants/input-range.js.map +0 -0
  255. /package/{components → dist/components}/input/variants/input-text.d.ts +0 -0
  256. /package/{components → dist/components}/input/variants/input-text.d.ts.map +0 -0
  257. /package/{components → dist/components}/input/variants/input-text.js +0 -0
  258. /package/{components → dist/components}/input/variants/input-text.js.map +0 -0
  259. /package/{components → dist/components}/input/variants/input-textarea.d.ts +0 -0
  260. /package/{components → dist/components}/input/variants/input-textarea.d.ts.map +0 -0
  261. /package/{components → dist/components}/input/variants/input-textarea.js +0 -0
  262. /package/{components → dist/components}/input/variants/input-textarea.js.map +0 -0
  263. /package/{components → dist/components}/loading/index.d.ts +0 -0
  264. /package/{components → dist/components}/loading/index.d.ts.map +0 -0
  265. /package/{components → dist/components}/loading/loading.d.ts +0 -0
  266. /package/{components → dist/components}/loading/loading.d.ts.map +0 -0
  267. /package/{components → dist/components}/loading/loading.js +0 -0
  268. /package/{components → dist/components}/loading/loading.js.map +0 -0
  269. /package/{components → dist/components}/mansory/index.d.ts +0 -0
  270. /package/{components → dist/components}/mansory/index.d.ts.map +0 -0
  271. /package/{components → dist/components}/mansory/mansory.d.ts +0 -0
  272. /package/{components → dist/components}/mansory/mansory.d.ts.map +0 -0
  273. /package/{components → dist/components}/mansory/mansory.js +0 -0
  274. /package/{components → dist/components}/mansory/mansory.js.map +0 -0
  275. /package/{components → dist/components}/mansory/mansory.types.d.ts +0 -0
  276. /package/{components → dist/components}/mansory/mansory.types.d.ts.map +0 -0
  277. /package/{components → dist/components}/menu/menu.d.ts +0 -0
  278. /package/{components → dist/components}/menu/menu.d.ts.map +0 -0
  279. /package/{components → dist/components}/menu/menu.data-example.d.ts +0 -0
  280. /package/{components → dist/components}/menu/menu.data-example.d.ts.map +0 -0
  281. /package/{components → dist/components}/menu/menu.js +0 -0
  282. /package/{components → dist/components}/menu/menu.js.map +0 -0
  283. /package/{components → dist/components}/modal/index.d.ts +0 -0
  284. /package/{components → dist/components}/modal/index.d.ts.map +0 -0
  285. /package/{components → dist/components}/modal/modal.d.ts +0 -0
  286. /package/{components → dist/components}/modal/modal.d.ts.map +0 -0
  287. /package/{components → dist/components}/modal/modal.js +0 -0
  288. /package/{components → dist/components}/modal/modal.js.map +0 -0
  289. /package/{components → dist/components}/modal/modalContext.d.ts +0 -0
  290. /package/{components → dist/components}/modal/modalContext.d.ts.map +0 -0
  291. /package/{components → dist/components}/modal/modalContext.js +0 -0
  292. /package/{components → dist/components}/modal/modalContext.js.map +0 -0
  293. /package/{components → dist/components}/pagination/index.d.ts +0 -0
  294. /package/{components → dist/components}/pagination/index.d.ts.map +0 -0
  295. /package/{components → dist/components}/pagination/pagination.d.ts +0 -0
  296. /package/{components → dist/components}/pagination/pagination.d.ts.map +0 -0
  297. /package/{components → dist/components}/pagination/pagination.js +0 -0
  298. /package/{components → dist/components}/pagination/pagination.js.map +0 -0
  299. /package/{components → dist/components}/pagination/pagination.types.d.ts +0 -0
  300. /package/{components → dist/components}/pagination/pagination.types.d.ts.map +0 -0
  301. /package/{components → dist/components}/progress-bar/index.d.ts +0 -0
  302. /package/{components → dist/components}/progress-bar/index.d.ts.map +0 -0
  303. /package/{components → dist/components}/progress-bar/progress-bar.d.ts +0 -0
  304. /package/{components → dist/components}/progress-bar/progress-bar.d.ts.map +0 -0
  305. /package/{components → dist/components}/progress-bar/progress-bar.js +0 -0
  306. /package/{components → dist/components}/progress-bar/progress-bar.js.map +0 -0
  307. /package/{components → dist/components}/progress-bar/progress-bar.types.d.ts +0 -0
  308. /package/{components → dist/components}/progress-bar/progress-bar.types.d.ts.map +0 -0
  309. /package/{components → dist/components}/qr-code/index.d.ts +0 -0
  310. /package/{components → dist/components}/qr-code/index.d.ts.map +0 -0
  311. /package/{components → dist/components}/qr-code/qr-code.d.ts +0 -0
  312. /package/{components → dist/components}/qr-code/qr-code.d.ts.map +0 -0
  313. /package/{components → dist/components}/qr-code/qr-code.js +0 -0
  314. /package/{components → dist/components}/qr-code/qr-code.js.map +0 -0
  315. /package/{components → dist/components}/qr-code/qr-code.types.d.ts +0 -0
  316. /package/{components → dist/components}/qr-code/qr-code.types.d.ts.map +0 -0
  317. /package/{components → dist/components}/rating/rating.d.ts +0 -0
  318. /package/{components → dist/components}/rating/rating.d.ts.map +0 -0
  319. /package/{components → dist/components}/rating/rating.js +0 -0
  320. /package/{components → dist/components}/rating/rating.js.map +0 -0
  321. /package/{components → dist/components}/rating/rating.types.d.ts +0 -0
  322. /package/{components → dist/components}/rating/rating.types.d.ts.map +0 -0
  323. /package/{components → dist/components}/select/index.d.ts +0 -0
  324. /package/{components → dist/components}/select/index.d.ts.map +0 -0
  325. /package/{components → dist/components}/select/select.d.ts +0 -0
  326. /package/{components → dist/components}/select/select.d.ts.map +0 -0
  327. /package/{components → dist/components}/select/select.js +0 -0
  328. /package/{components → dist/components}/select/select.js.map +0 -0
  329. /package/{components → dist/components}/select/select.types.d.ts +0 -0
  330. /package/{components → dist/components}/select/select.types.d.ts.map +0 -0
  331. /package/{components → dist/components}/select-zone/index.d.ts +0 -0
  332. /package/{components → dist/components}/select-zone/index.d.ts.map +0 -0
  333. /package/{components → dist/components}/select-zone/select-zone.d.ts +0 -0
  334. /package/{components → dist/components}/select-zone/select-zone.d.ts.map +0 -0
  335. /package/{components → dist/components}/select-zone/select-zone.js +0 -0
  336. /package/{components → dist/components}/select-zone/select-zone.js.map +0 -0
  337. /package/{components → dist/components}/select-zone/select-zone.types.d.ts +0 -0
  338. /package/{components → dist/components}/select-zone/select-zone.types.d.ts.map +0 -0
  339. /package/{components → dist/components}/skeleton/index.d.ts +0 -0
  340. /package/{components → dist/components}/skeleton/index.d.ts.map +0 -0
  341. /package/{components → dist/components}/skeleton/skeleton.d.ts +0 -0
  342. /package/{components → dist/components}/skeleton/skeleton.d.ts.map +0 -0
  343. /package/{components → dist/components}/skeleton/skeleton.js +0 -0
  344. /package/{components → dist/components}/skeleton/skeleton.js.map +0 -0
  345. /package/{components → dist/components}/slider/slider.d.ts +0 -0
  346. /package/{components → dist/components}/slider/slider.d.ts.map +0 -0
  347. /package/{components → dist/components}/slider/slider.js +0 -0
  348. /package/{components → dist/components}/slider/slider.js.map +0 -0
  349. /package/{components → dist/components}/slider/slider.types.d.ts +0 -0
  350. /package/{components → dist/components}/slider/slider.types.d.ts.map +0 -0
  351. /package/{components → dist/components}/splitter/index.d.ts +0 -0
  352. /package/{components → dist/components}/splitter/index.d.ts.map +0 -0
  353. /package/{components → dist/components}/splitter/splitter.d.ts +0 -0
  354. /package/{components → dist/components}/splitter/splitter.d.ts.map +0 -0
  355. /package/{components → dist/components}/splitter/splitter.js +0 -0
  356. /package/{components → dist/components}/splitter/splitter.js.map +0 -0
  357. /package/{components → dist/components}/splitter/splitter.types.d.ts +0 -0
  358. /package/{components → dist/components}/splitter/splitter.types.d.ts.map +0 -0
  359. /package/{components → dist/components}/steps/index.d.ts +0 -0
  360. /package/{components → dist/components}/steps/index.d.ts.map +0 -0
  361. /package/{components → dist/components}/steps/steps.d.ts +0 -0
  362. /package/{components → dist/components}/steps/steps.d.ts.map +0 -0
  363. /package/{components → dist/components}/steps/steps.js +0 -0
  364. /package/{components → dist/components}/steps/steps.js.map +0 -0
  365. /package/{components → dist/components}/swap/index.d.ts +0 -0
  366. /package/{components → dist/components}/swap/index.d.ts.map +0 -0
  367. /package/{components → dist/components}/swap/swap.d.ts +0 -0
  368. /package/{components → dist/components}/swap/swap.d.ts.map +0 -0
  369. /package/{components → dist/components}/swap/swap.js +0 -0
  370. /package/{components → dist/components}/swap/swap.js.map +0 -0
  371. /package/{components → dist/components}/switch/index.d.ts +0 -0
  372. /package/{components → dist/components}/switch/index.d.ts.map +0 -0
  373. /package/{components → dist/components}/switch/switch.d.ts +0 -0
  374. /package/{components → dist/components}/switch/switch.d.ts.map +0 -0
  375. /package/{components → dist/components}/switch/switch.js +0 -0
  376. /package/{components → dist/components}/switch/switch.js.map +0 -0
  377. /package/{components → dist/components}/switch/switch.types.d.ts +0 -0
  378. /package/{components → dist/components}/switch/switch.types.d.ts.map +0 -0
  379. /package/{components → dist/components}/tab/index.d.ts +0 -0
  380. /package/{components → dist/components}/tab/index.d.ts.map +0 -0
  381. /package/{components → dist/components}/tab/tab.d.ts +0 -0
  382. /package/{components → dist/components}/tab/tab.d.ts.map +0 -0
  383. /package/{components → dist/components}/tab/tab.js +0 -0
  384. /package/{components → dist/components}/tab/tab.js.map +0 -0
  385. /package/{components → dist/components}/tab/tab.types.d.ts +0 -0
  386. /package/{components → dist/components}/tab/tab.types.d.ts.map +0 -0
  387. /package/{components → dist/components}/table/index.d.ts +0 -0
  388. /package/{components → dist/components}/table/index.d.ts.map +0 -0
  389. /package/{components → dist/components}/table/index.js +0 -0
  390. /package/{components → dist/components}/table/table.d.ts +0 -0
  391. /package/{components → dist/components}/table/table.d.ts.map +0 -0
  392. /package/{components → dist/components}/table/table.js +0 -0
  393. /package/{components → dist/components}/table/table.js.map +0 -0
  394. /package/{components → dist/components}/table/table.types.d.ts +0 -0
  395. /package/{components → dist/components}/table/table.types.d.ts.map +0 -0
  396. /package/{components → dist/components}/text-rotate/index.d.ts +0 -0
  397. /package/{components → dist/components}/text-rotate/index.d.ts.map +0 -0
  398. /package/{components → dist/components}/text-rotate/text-rotate.d.ts +0 -0
  399. /package/{components → dist/components}/text-rotate/text-rotate.d.ts.map +0 -0
  400. /package/{components → dist/components}/text-rotate/text-rotate.js +0 -0
  401. /package/{components → dist/components}/text-rotate/text-rotate.js.map +0 -0
  402. /package/{components → dist/components}/timeline/index.d.ts +0 -0
  403. /package/{components → dist/components}/timeline/index.d.ts.map +0 -0
  404. /package/{components → dist/components}/timeline/timeline.d.ts +0 -0
  405. /package/{components → dist/components}/timeline/timeline.d.ts.map +0 -0
  406. /package/{components → dist/components}/timeline/timeline.js +0 -0
  407. /package/{components → dist/components}/timeline/timeline.js.map +0 -0
  408. /package/{components → dist/components}/timeline/timeline.types.d.ts +0 -0
  409. /package/{components → dist/components}/timeline/timeline.types.d.ts.map +0 -0
  410. /package/{components → dist/components}/toast/icons/ErrorIcon.d.ts +0 -0
  411. /package/{components → dist/components}/toast/icons/ErrorIcon.d.ts.map +0 -0
  412. /package/{components → dist/components}/toast/icons/ErrorIcon.js +0 -0
  413. /package/{components → dist/components}/toast/icons/ErrorIcon.js.map +0 -0
  414. /package/{components → dist/components}/toast/icons/IconCircle.d.ts +0 -0
  415. /package/{components → dist/components}/toast/icons/IconCircle.d.ts.map +0 -0
  416. /package/{components → dist/components}/toast/icons/IconCircle.js +0 -0
  417. /package/{components → dist/components}/toast/icons/IconCircle.js.map +0 -0
  418. /package/{components → dist/components}/toast/icons/InfoIcon.d.ts +0 -0
  419. /package/{components → dist/components}/toast/icons/InfoIcon.d.ts.map +0 -0
  420. /package/{components → dist/components}/toast/icons/InfoIcon.js +0 -0
  421. /package/{components → dist/components}/toast/icons/InfoIcon.js.map +0 -0
  422. /package/{components → dist/components}/toast/icons/LoaderIcon.d.ts +0 -0
  423. /package/{components → dist/components}/toast/icons/LoaderIcon.d.ts.map +0 -0
  424. /package/{components → dist/components}/toast/icons/LoaderIcon.js +0 -0
  425. /package/{components → dist/components}/toast/icons/LoaderIcon.js.map +0 -0
  426. /package/{components → dist/components}/toast/icons/SuccessIcon.d.ts +0 -0
  427. /package/{components → dist/components}/toast/icons/SuccessIcon.d.ts.map +0 -0
  428. /package/{components → dist/components}/toast/icons/SuccessIcon.js +0 -0
  429. /package/{components → dist/components}/toast/icons/SuccessIcon.js.map +0 -0
  430. /package/{components → dist/components}/toast/icons/WarningIcon.d.ts +0 -0
  431. /package/{components → dist/components}/toast/icons/WarningIcon.d.ts.map +0 -0
  432. /package/{components → dist/components}/toast/icons/WarningIcon.js +0 -0
  433. /package/{components → dist/components}/toast/icons/WarningIcon.js.map +0 -0
  434. /package/{components → dist/components}/toast/icons/index.d.ts +0 -0
  435. /package/{components → dist/components}/toast/icons/index.d.ts.map +0 -0
  436. /package/{components → dist/components}/toast/index.d.ts +0 -0
  437. /package/{components → dist/components}/toast/index.d.ts.map +0 -0
  438. /package/{components → dist/components}/toast/toast.d.ts +0 -0
  439. /package/{components → dist/components}/toast/toast.d.ts.map +0 -0
  440. /package/{components → dist/components}/toast/toast.js +0 -0
  441. /package/{components → dist/components}/toast/toast.js.map +0 -0
  442. /package/{components → dist/components}/toast/toast.store.d.ts +0 -0
  443. /package/{components → dist/components}/toast/toast.store.d.ts.map +0 -0
  444. /package/{components → dist/components}/toast/toast.store.js +0 -0
  445. /package/{components → dist/components}/toast/toast.store.js.map +0 -0
  446. /package/{components → dist/components}/toast/toast.type.d.ts +0 -0
  447. /package/{components → dist/components}/toast/toast.type.d.ts.map +0 -0
  448. /package/{components → dist/components}/tooltip/index.d.ts +0 -0
  449. /package/{components → dist/components}/tooltip/index.d.ts.map +0 -0
  450. /package/{components → dist/components}/tooltip/tooltip.d.ts +0 -0
  451. /package/{components → dist/components}/tooltip/tooltip.d.ts.map +0 -0
  452. /package/{components → dist/components}/tooltip/tooltip.js +0 -0
  453. /package/{components → dist/components}/tooltip/tooltip.js.map +0 -0
  454. /package/{components → dist/components}/tooltip/tooltip.types.d.ts +0 -0
  455. /package/{components → dist/components}/tooltip/tooltip.types.d.ts.map +0 -0
  456. /package/{components → dist/components}/tour/index.d.ts +0 -0
  457. /package/{components → dist/components}/tour/index.d.ts.map +0 -0
  458. /package/{components → dist/components}/tour/tour.d.ts +0 -0
  459. /package/{components → dist/components}/tour/tour.types.d.ts +0 -0
  460. /package/{components → dist/components}/tour/tour.types.d.ts.map +0 -0
  461. /package/{components → dist/components}/upload/index.d.ts +0 -0
  462. /package/{components → dist/components}/upload/index.d.ts.map +0 -0
  463. /package/{components → dist/components}/upload/upload.d.ts +0 -0
  464. /package/{components → dist/components}/upload/upload.d.ts.map +0 -0
  465. /package/{components → dist/components}/upload/upload.js +0 -0
  466. /package/{components → dist/components}/upload/upload.js.map +0 -0
  467. /package/{components → dist/components}/upload/upload.types.d.ts +0 -0
  468. /package/{components → dist/components}/upload/upload.types.d.ts.map +0 -0
  469. /package/{components → dist/components}/z-index/index.d.ts +0 -0
  470. /package/{components → dist/components}/z-index/index.d.ts.map +0 -0
  471. /package/{components → dist/components}/z-index/z-index.context.d.ts +0 -0
  472. /package/{components → dist/components}/z-index/z-index.context.d.ts.map +0 -0
  473. /package/{components → dist/components}/z-index/z-index.context.js +0 -0
  474. /package/{components → dist/components}/z-index/z-index.context.js.map +0 -0
  475. /package/{components → dist/components}/z-index/z-index.d.ts +0 -0
  476. /package/{components → dist/components}/z-index/z-index.d.ts.map +0 -0
  477. /package/{components → dist/components}/z-index/z-index.js +0 -0
  478. /package/{components → dist/components}/z-index/z-index.js.map +0 -0
  479. /package/{components → dist/components}/z-index/z-index.store.d.ts +0 -0
  480. /package/{components → dist/components}/z-index/z-index.store.d.ts.map +0 -0
  481. /package/{components → dist/components}/z-index/z-index.store.js +0 -0
  482. /package/{components → dist/components}/z-index/z-index.store.js.map +0 -0
  483. /package/{components → dist/components}/z-index/z-index.types.d.ts +0 -0
  484. /package/{components → dist/components}/z-index/z-index.types.d.ts.map +0 -0
  485. /package/{components → dist/components}/z-index/z-index.types.js +0 -0
  486. /package/{lib.d.ts → dist/lib.d.ts} +0 -0
  487. /package/{lib.d.ts.map → dist/lib.d.ts.map} +0 -0
  488. /package/{lib.js → dist/lib.js} +0 -0
  489. /package/{type.d.ts → dist/type.d.ts} +0 -0
  490. /package/{type.d.ts.map → dist/type.d.ts.map} +0 -0
  491. /package/{utils → dist/utils}/cn.d.ts +0 -0
  492. /package/{utils → dist/utils}/cn.d.ts.map +0 -0
  493. /package/{utils → dist/utils}/cn.js +0 -0
  494. /package/{utils → dist/utils}/cn.js.map +0 -0
  495. /package/{utils → dist/utils}/element-tracker.js +0 -0
  496. /package/{utils → dist/utils}/element-tracker.js.map +0 -0
  497. /package/{utils → dist/utils}/helper.d.ts +0 -0
  498. /package/{utils → dist/utils}/helper.d.ts.map +0 -0
  499. /package/{utils → dist/utils}/helper.js +0 -0
  500. /package/{utils → dist/utils}/helper.js.map +0 -0
  501. /package/{utils → dist/utils}/hoc.js +0 -0
  502. /package/{utils → dist/utils}/hoc.js.map +0 -0
@@ -0,0 +1,484 @@
1
+ ## COMPONENT IDENTITY
2
+ - **Import**: `import { Tab } from 'solid-tom-ui';`
3
+ - **Exports**: `Tab` (named export), `TabItem`, `TabProps`, `BaseTabProps` (type exports)
4
+ - **Framework**: SolidJS
5
+ - **Purpose**: Tab navigation component with multiple visual styles and controlled/uncontrolled active tab state
6
+
7
+ ---
8
+
9
+ ## TYPE REFERENCE
10
+
11
+ ### `TabItem`
12
+
13
+ ```ts
14
+ type TabItem = {
15
+ key: string; // REQUIRED. Unique identifier for the tab.
16
+ label?: string; // Display label. Default fallback: `Tab ${index + 1}`
17
+ children: SolidComponent; // Tab panel content. string | JSX.Element | () => JSX.Element
18
+ icon?: SolidComponent; // Icon rendered before label.
19
+ disabled?: boolean; // Blocks click; adds opacity-50 pointer-events-none.
20
+ closable?: boolean; // Default: true. Set to false to hide close button.
21
+ pinned?: boolean; // Default: false. Pinned tabs float to front of header.
22
+ };
23
+ ```
24
+
25
+ ### `TabProps` — discriminated union on `tabPlacement`
26
+
27
+ ```ts
28
+ type TabProps = HorizontalTabProps | VerticalTabProps;
29
+
30
+ type HorizontalTabProps = BaseTabProps & {
31
+ tabPlacement?: 'horizontal'; // Default when omitted
32
+ position?: 'top' | 'bottom'; // Default: 'top'
33
+ };
34
+
35
+ type VerticalTabProps = BaseTabProps & {
36
+ tabPlacement: 'vertical'; // Must be explicitly set
37
+ position?: 'left' | 'right'; // Default: 'left'
38
+ };
39
+ ```
40
+
41
+ ### `BaseTabProps`
42
+
43
+ | Prop | Type | Default | Description |
44
+ |---|---|---|---|
45
+ | `items` | `Accessor<TabItem[]>` | **required** | SolidJS accessor (signal getter) for the tab list. |
46
+ | `setItems` | `Setter<TabItem[]>` | **required** | SolidJS setter for the tab list. The component mutates items internally for add/remove/pin/rename. |
47
+ | `color` | `BaseColorProps` | `'primary'` | Color theme for active state, pin indicator, and active gradient. |
48
+ | `variants` | `'lift' \| 'box' \| 'border'` | `'box'` | Visual style variant for tab items. |
49
+ | `align` | `'left' \| 'center' \| 'right'` | `'left'` | Horizontal alignment of tab items in the header (maps to `justify-start/center/end`). |
50
+ | `defaultActiveKey` | `string` | first item's `key` | Initial active tab key. Uncontrolled — not reactive after mount. |
51
+ | `canAdd` | `boolean` | `true` | Show the `+` add button in the header. |
52
+ | `canPin` | `boolean` | `false` | Show pin/unpin button on hover. Pinned tabs move to front of header. |
53
+ | `canRename` | `boolean` | `true` | Allow double-click to rename tab label inline. |
54
+ | `preRender` | `boolean` | `false` | If `true`, keep panel in DOM after first activation (`display:hidden` when inactive). If `false`, unmount panel when inactive. |
55
+ | `onChange` | `(activeKey: string) => void` | — | Fires when active tab changes. |
56
+ | `onAdd` | `() => TabItem \| void` | — | Custom add handler. Return a `TabItem` to use it; return `void` to have the component create a default tab. |
57
+ | `onRemove` | `(key: string, label: string) => Promise<boolean> \| boolean \| void` | — | Called before removal. Return `false` to abort. Async supported. |
58
+ | `onPin` | `(key: string, pinned: boolean) => void` | — | Fires after pin state changes. |
59
+ | `onRename` | `(key: string, newLabel: string) => void` | — | Fires after rename completes (Enter or blur). Not called if value is empty or unchanged. |
60
+ | `class` | `Partial<Record<'root' \| 'header' \| 'item' \| 'content' \| 'addButton', string>>` | — | Merge custom classes onto specific structural elements. |
61
+
62
+ ---
63
+
64
+ ## BEHAVIORAL RULES (inferred from implementation)
65
+
66
+ ### State management — signal pair required
67
+
68
+ `Tab` requires an externally owned `[items, setItems]` signal pair.
69
+ The component calls `setItems` directly for: add, remove, pin/unpin, rename.
70
+ **The consumer owns the data; the component owns only `activeKey` internally.**
71
+
72
+ ```tsx
73
+ const [items, setItems] = createSignal<TabItem[]>([...]);
74
+ <Tab items={items} setItems={setItems} />
75
+ ```
76
+
77
+ ### Active key management
78
+
79
+ - Initialized once from `defaultActiveKey` or `items()[0].key`.
80
+ - Not controllable from outside after mount (no `activeKey` prop).
81
+ - Auto-corrects: if `items` changes and active key no longer exists in the list, resets to `items()[0].key`.
82
+ - On remove of the active tab: switches to the next tab (`currentIndex + 1`), or the previous (`currentIndex - 1`) if no next exists.
83
+
84
+ ### Pinned tabs
85
+
86
+ - Pinned items are sorted to the **front** of the header via `sortedItems` memo: `[...pinned, ...unpinned]`.
87
+ - A visual separator (`sui-tab-separator`) renders between pinned and unpinned groups when both exist.
88
+ - Pinned items always use `preRender = true` regardless of the global `preRender` prop — their content is kept in the DOM once rendered.
89
+ - Pin button (`canPin={true}`) is hidden by default, revealed on hover (opacity transition).
90
+ - `handlePinTab` toggles `item.pinned` and calls `setItems` → triggers reactive re-sort.
91
+
92
+ ### Content rendering (`preRender`)
93
+
94
+ ```
95
+ preRender=false (default):
96
+ shouldRenderContent = activeKey === item.key
97
+ → Panel unmounted when tab is not active (content resets on re-activation)
98
+
99
+ preRender=true:
100
+ shouldRenderContent = renderedTabs.has(item.key) || isActive
101
+ → Panel rendered on first activation, then kept mounted with class="hidden" when inactive
102
+ → Content state is preserved between activations
103
+
104
+ Pinned tabs always use preRender=true behavior regardless of global prop.
105
+ ```
106
+
107
+ ### Add tab behavior
108
+
109
+ ```
110
+ onAdd defined → calls onAdd()
111
+ → if returns TabItem: appends to items, sets activeKey to new tab
112
+ → if returns void: no-op (consumer handles mutation themselves)
113
+
114
+ onAdd NOT defined → creates default tab:
115
+ key: createUniqueId()
116
+ label: `Tab ${items().length + 1}`
117
+ children: <div>New Tab Content</div>
118
+ ```
119
+
120
+ ### Remove tab behavior
121
+
122
+ 1. Checks `item.closable !== false` — if `false`, abort silently.
123
+ 2. Calls `onRemove(key, label)` if defined — awaits result.
124
+ 3. If result is `false`, abort.
125
+ 4. If active tab is being removed, switches active to adjacent tab.
126
+ 5. Filters item from `items` via `setItems`.
127
+ 6. Removes key from `renderedTabs` set.
128
+
129
+ Middle-mouse-button click (`button === 1`) on a tab item also triggers removal if `closable !== false`.
130
+
131
+ ### Rename behavior
132
+
133
+ - Triggered by `dblclick` on tab item (if `canRename=true` and not disabled).
134
+ - Renders an `<input class="sui-tab-rename-input">` in place of the label span.
135
+ - Input auto-focuses and selects all text on mount (via `setTimeout(..., 0)`).
136
+ - Commits on: `Enter` key or `blur`.
137
+ - Cancels on: `Escape` key.
138
+ - Only commits if new value is non-empty AND different from current label.
139
+ - `setItems` updates `label`; `onRename` callback fires after update.
140
+
141
+ ### `position` validation / `computedPosition`
142
+
143
+ ```
144
+ tabPlacement='horizontal': position must be 'top' | 'bottom' → defaults to 'top'
145
+ tabPlacement='vertical': position must be 'left' | 'right' → defaults to 'left'
146
+ ```
147
+ Invalid positions are silently corrected by `computedPosition` memo.
148
+
149
+ ### Variants × position matrix (CSS behavior)
150
+
151
+ | Variant | Horizontal Top | Horizontal Bottom | Vertical Left | Vertical Right |
152
+ |---|---|---|---|---|
153
+ | `box` | Rounded tab items, shadow on active | Same | Full-width items, left color-bar on pinned | Same |
154
+ | `border` | Bottom border accent line | Top border accent line | Left border accent line | Right border accent line |
155
+ | `lift` | Rounded-top tabs, translate-y +1px active | Rounded-bottom tabs, -translate-y active | Rounded-left tabs, no right border | Rounded-right tabs, no left border |
156
+
157
+ ---
158
+
159
+ ## USAGE PATTERNS
160
+
161
+ ### 1. Minimal horizontal tabs
162
+
163
+ ```tsx
164
+ const [items, setItems] = createSignal<TabItem[]>([
165
+ { key: 'a', label: 'Tab A', children: <div>Content A</div> },
166
+ { key: 'b', label: 'Tab B', children: <div>Content B</div> },
167
+ ]);
168
+
169
+ <Tab items={items} setItems={setItems} />
170
+ ```
171
+
172
+ ### 2. With icons
173
+
174
+ ```tsx
175
+ import Home from 'lucide-solid/icons/home';
176
+
177
+ const [items, setItems] = createSignal<TabItem[]>([
178
+ {
179
+ key: 'home',
180
+ label: 'Home',
181
+ icon: <Home size={14} />,
182
+ children: <div class="p-4">Home content</div>,
183
+ },
184
+ ]);
185
+
186
+ <Tab items={items} setItems={setItems} />
187
+ ```
188
+
189
+ ### 3. onChange callback
190
+
191
+ ```tsx
192
+ <Tab
193
+ items={items}
194
+ setItems={setItems}
195
+ onChange={(key) => {
196
+ console.log('Active tab changed to:', key);
197
+ // key is the `key` field of the newly active TabItem
198
+ }}
199
+ />
200
+ ```
201
+
202
+ ### 4. Variant styles
203
+
204
+ ```tsx
205
+ // box (default)
206
+ <Tab items={items} setItems={setItems} variants="box" />
207
+
208
+ // border — clean underline style
209
+ <Tab items={items} setItems={setItems} variants="border" />
210
+
211
+ // lift — elevated card-like tabs
212
+ <Tab items={items} setItems={setItems} variants="lift" />
213
+ ```
214
+
215
+ ### 5. Placement and position combos
216
+
217
+ ```tsx
218
+ // Horizontal top (default)
219
+ <Tab items={items} setItems={setItems} tabPlacement="horizontal" position="top" />
220
+
221
+ // Horizontal bottom
222
+ <Tab items={items} setItems={setItems} tabPlacement="horizontal" position="bottom" />
223
+
224
+ // Vertical left
225
+ <Tab items={items} setItems={setItems} tabPlacement="vertical" position="left" />
226
+
227
+ // Vertical right
228
+ <Tab items={items} setItems={setItems} tabPlacement="vertical" position="right" />
229
+ ```
230
+
231
+ ### 6. Custom add behavior (`onAdd`)
232
+
233
+ ```tsx
234
+ let counter = 1;
235
+
236
+ <Tab
237
+ items={items}
238
+ setItems={setItems}
239
+ canAdd
240
+ onAdd={() => {
241
+ const key = createUniqueId();
242
+ return {
243
+ key,
244
+ label: `Document ${counter++}`,
245
+ children: <div class="p-4">New document content</div>,
246
+ };
247
+ }}
248
+ />
249
+ ```
250
+
251
+ ### 7. Guarded remove (`onRemove`)
252
+
253
+ ```tsx
254
+ <Tab
255
+ items={items}
256
+ setItems={setItems}
257
+ onRemove={async (key, label) => {
258
+ const confirmed = await showConfirmDialog(`Close "${label}"?`);
259
+ return confirmed; // false → abort removal
260
+ }}
261
+ />
262
+ ```
263
+
264
+ ### 8. Non-closable tab
265
+
266
+ ```tsx
267
+ const [items, setItems] = createSignal<TabItem[]>([
268
+ { key: 'home', label: 'Home', closable: false, children: <div>Always here</div> },
269
+ { key: 'doc', label: 'Document', children: <div>Closable tab</div> },
270
+ ]);
271
+
272
+ <Tab items={items} setItems={setItems} />
273
+ // "Home" tab has no close button and cannot be closed by middle-click
274
+ ```
275
+
276
+ ### 9. Disabled tab
277
+
278
+ ```tsx
279
+ const [items, setItems] = createSignal<TabItem[]>([
280
+ { key: 'a', label: 'Active', children: <div>Active content</div> },
281
+ { key: 'b', label: 'Disabled', disabled: true, children: <div>Unreachable</div> },
282
+ ]);
283
+
284
+ <Tab items={items} setItems={setItems} />
285
+ // Disabled tab: opacity-50, pointer-events-none, click ignored
286
+ ```
287
+
288
+ ### 10. Pin tabs (`canPin`)
289
+
290
+ ```tsx
291
+ <Tab items={items} setItems={setItems} canPin onPin={(key, pinned) => console.log(key, pinned)} />
292
+ // Hover a tab → pin icon appears
293
+ // Click pin → tab moves to front of header
294
+ // Pinned tabs always preRender (content kept in DOM)
295
+ ```
296
+
297
+ ### 11. Rename tabs (`canRename`)
298
+
299
+ ```tsx
300
+ // canRename=true by default
301
+ <Tab items={items} setItems={setItems} onRename={(key, newLabel) => console.log(key, newLabel)} />
302
+ // Double-click a tab label to enter edit mode
303
+ // Enter/blur → save, Escape → cancel
304
+ ```
305
+
306
+ ### 12. Preserve tab content (`preRender`)
307
+
308
+ ```tsx
309
+ <Tab
310
+ items={items}
311
+ setItems={setItems}
312
+ preRender={true}
313
+ // Tabs that have been visited stay mounted (display:hidden when inactive)
314
+ // Use for stateful content like forms, scroll positions, etc.
315
+ />
316
+ ```
317
+
318
+ ### 13. Lazy content with deferred init
319
+
320
+ ```tsx
321
+ const [items, setItems] = createSignal<TabItem[]>([
322
+ {
323
+ key: 'expensive',
324
+ label: 'Report',
325
+ // Pass as function to defer evaluation until tab is first activated
326
+ children: () => <ExpensiveChart />,
327
+ },
328
+ ]);
329
+
330
+ <Tab items={items} setItems={setItems} preRender={false} />
331
+ // children() only evaluated when tab first becomes active
332
+ ```
333
+
334
+ ### 14. Start at a specific tab
335
+
336
+ ```tsx
337
+ <Tab items={items} setItems={setItems} defaultActiveKey="settings" />
338
+ // Opens on the tab with key='settings'
339
+ ```
340
+
341
+ ### 15. Tabs with external control (add/remove from outside)
342
+
343
+ ```tsx
344
+ const [items, setItems] = createSignal<TabItem[]>([...]);
345
+
346
+ // Add from outside:
347
+ const addTab = () => setItems(prev => [...prev, { key: createUniqueId(), label: 'New', children: <div/> }]);
348
+
349
+ // Remove from outside:
350
+ const removeTab = (key: string) => setItems(prev => prev.filter(i => i.key !== key));
351
+
352
+ <Tab items={items} setItems={setItems} />
353
+ ```
354
+
355
+ ### 16. Alignment
356
+
357
+ ```tsx
358
+ <Tab items={items} setItems={setItems} align="center" />
359
+ <Tab items={items} setItems={setItems} align="right" />
360
+ ```
361
+
362
+ ### 17. Custom classes
363
+
364
+ ```tsx
365
+ <Tab
366
+ items={items}
367
+ setItems={setItems}
368
+ class={{
369
+ root: 'rounded-xl shadow-lg',
370
+ header: 'bg-base-100 px-2',
371
+ item: 'text-xs',
372
+ content: 'p-4 bg-white',
373
+ addButton: 'border-dashed',
374
+ }}
375
+ />
376
+ ```
377
+
378
+ ### 18. Full-featured: vertical settings panel
379
+
380
+ ```tsx
381
+ const [items, setItems] = createSignal<TabItem[]>([
382
+ { key: 'general', label: 'General', icon: <SettingsIcon size={14} />, closable: false, children: <GeneralSettings /> },
383
+ { key: 'profile', label: 'Profile', icon: <UserIcon size={14} />, closable: false, children: <ProfileSettings /> },
384
+ { key: 'notif', label: 'Notifications', icon: <BellIcon size={14} />, closable: false, children: <NotifSettings /> },
385
+ ]);
386
+
387
+ <div class="h-[500px]">
388
+ <Tab
389
+ items={items}
390
+ setItems={setItems}
391
+ tabPlacement="vertical"
392
+ position="left"
393
+ variants="border"
394
+ color="primary"
395
+ canAdd={false}
396
+ canPin={false}
397
+ canRename={false}
398
+ preRender={true}
399
+ class={{ root: 'rounded-xl border border-base-300' }}
400
+ />
401
+ </div>
402
+ ```
403
+
404
+ ---
405
+
406
+ ## CSS CLASSES (public API for customization)
407
+
408
+ | Class | Applied to |
409
+ |---|---|
410
+ | `sui-tab` | Root `<div>` |
411
+ | `sui-tab-horizontal` | Root when `tabPlacement='horizontal'` |
412
+ | `sui-tab-vertical` | Root when `tabPlacement='vertical'` |
413
+ | `sui-tab-box` | Root when `variants='box'` |
414
+ | `sui-tab-border` | Root when `variants='border'` |
415
+ | `sui-tab-lift` | Root when `variants='lift'` |
416
+ | `sui-tab-top` | Root when `position='top'` |
417
+ | `sui-tab-bottom` | Root when `position='bottom'` |
418
+ | `sui-tab-left` | Root when `position='left'` |
419
+ | `sui-tab-right` | Root when `position='right'` |
420
+ | `sui-tab-header` | Header `<div>` containing tab items |
421
+ | `sui-align-left/center/right` | Header alignment modifier |
422
+ | `sui-tab-item` | Individual tab `<div>` |
423
+ | `sui-tab-active` | Active tab item |
424
+ | `sui-tab-pinned` | Pinned tab item |
425
+ | `sui-tab-item-icon` | Icon wrapper `<span>` |
426
+ | `sui-tab-item-label` | Label `<span>` (truncated, max-w-40) |
427
+ | `sui-tab-actions` | Pin + close buttons wrapper (opacity-0, shown on hover/active) |
428
+ | `sui-tab-action-btn` | Each action button |
429
+ | `sui-action-pin` | Pin button |
430
+ | `sui-action-close` | Close button (red on hover) |
431
+ | `sui-tab-add-btn` | Add `+` button |
432
+ | `sui-tab-separator` | Divider between pinned and unpinned groups |
433
+ | `sui-tab-content` | Content area `<div>` |
434
+ | `sui-tab-content-panel` | Per-tab panel `<div>` (`hidden` class when inactive) |
435
+ | `sui-tab-rename-input` | Inline rename `<input>` |
436
+ | `sui-tab-empty` | Empty state `<div>` when `items.length === 0` |
437
+
438
+ Use `class={{ root, header, item, content, addButton }}` prop to append custom classes.
439
+
440
+ ---
441
+
442
+ ## CONSTRAINTS & EDGE CASES
443
+
444
+ - `items` and `setItems` are **both required**. The component directly calls `setItems` for add, remove, pin, and rename — passing a readonly array is not safe.
445
+ - `activeKey` is **not externally controllable** after mount. Use `defaultActiveKey` for initial tab, then rely on `onChange` to observe changes.
446
+ - If `items()` changes such that `activeKey` no longer matches any item, active key silently resets to `items()[0].key`. Guard against this when removing tabs programmatically from outside.
447
+ - `preRender=false` + tab with stateful content (forms, scroll position): state resets on each activation. Use `preRender=true` or set `pinned=true` to preserve state.
448
+ - Pinned tabs **always** use `preRender=true` logic — their panel is never unmounted once first rendered, regardless of the global `preRender` prop.
449
+ - `onAdd` returning `void` does NOT add any tab. The component only calls `setItems` if `onAdd()` returns a `TabItem` object. If `onAdd` is undefined, the component creates a default tab.
450
+ - `onRemove` returning `false` (or resolving `false`) aborts removal. `void` / `undefined` / `true` all allow removal to proceed.
451
+ - `canRename=true` only applies if the tab is not disabled. Disabled tabs cannot be renamed.
452
+ - The rename input auto-focuses using `setTimeout(..., 0)`. If your environment blocks `setTimeout`, auto-focus will not work.
453
+ - `children` rendered as `{item.children as Element}` — pass static JSX or a function `() => JSX.Element`. Functions are called during SolidJS's fine-grained rendering; heavy computations should be wrapped in `createMemo` inside the children.
454
+ - Vertical header has `max-w-60 min-w-40` and `overflow-y-auto` — tab label text is truncated at `max-w-40` (`sui-tab-item-label`). Long labels will be clipped.
455
+ - The component renders `size-full` (100% width and height) — always wrap in a container with explicit dimensions.
456
+ - `tabPlacement='vertical'` with `position='top'` or `'bottom'` is silently corrected to `'left'`. Similarly `tabPlacement='horizontal'` with `position='left'` or `'right'` → corrected to `'top'`.
457
+
458
+ ---
459
+
460
+ ## DO / DON'T
461
+
462
+ **DO**
463
+ - Always create `[items, setItems] = createSignal<TabItem[]>([...])` and pass both to `Tab`.
464
+ - Use unique, stable `key` values for each `TabItem` — keys are used for DOM identity, active tracking, and rendered-tabs set.
465
+ - Pass `children` as `() => <JSX>` (function) for expensive content to defer evaluation until first activation.
466
+ - Set `closable: false` on tabs that must always remain open (e.g., home, main dashboard).
467
+ - Set `preRender={true}` when tab content is stateful (forms, scroll positions, editors).
468
+ - Wrap the `<Tab>` in a container with explicit `height` — it uses `h-full` internally.
469
+ - Use `defaultActiveKey` to set the initial active tab instead of relying on array order.
470
+ - Import from the barrel: `import { Tab } from 'solid-tom-ui'`.
471
+
472
+ **DON'T**
473
+ - Don't try to control `activeKey` externally — the component manages it internally. Use `onChange` to observe it.
474
+ - Don't mutate `items` array directly — always use `setItems`. Direct mutation bypasses SolidJS reactivity.
475
+ - Don't use `tabPlacement='vertical'` with `position='top'/'bottom'` — position is silently corrected to `'left'`.
476
+ - Don't omit `setItems` — the component writes to it on add, remove, pin, and rename operations.
477
+ - Don't pass `children` as a memoized constant outside signals if it contains reactive values — use `() => <JSX>` form to keep reactivity intact.
478
+ - Don't import `TabExamples` (from `tab.example.tsx`) in production — it is a demo component only (not exported from `solid-tom-ui`).
479
+ - Don't rely on `label` for identity — always use `key`. Labels can be renamed; keys are stable identifiers.
480
+ ---
481
+
482
+ ## Component Conventions
483
+
484
+ > **CSS encoding**: internal CSS classes use short encoded names (e.g. `tb01`, `tb02`) per project convention.