solid-tom-ui 1.0.8 → 1.0.10
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.
- package/dist/README.md +246 -0
- package/dist/components/avatar/index.d.ts +3 -0
- package/{components → dist/components}/avatar/index.d.ts.map +1 -1
- package/dist/components/button/index.d.ts +3 -0
- package/{components → dist/components}/button/index.d.ts.map +1 -1
- package/dist/components/collapse/index.d.ts +3 -0
- package/{components → dist/components}/collapse/index.d.ts.map +1 -1
- package/dist/components/float-button/index.d.ts +3 -0
- package/{components → dist/components}/float-button/index.d.ts.map +1 -1
- package/dist/components/input/index.d.ts +3 -0
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/components/menu/index.d.ts +4 -0
- package/{components → dist/components}/menu/index.d.ts.map +1 -1
- package/{components → dist/components}/menu/menu.types.d.ts +7 -7
- package/{components → dist/components}/menu/menu.types.d.ts.map +1 -1
- package/dist/components/rating/index.d.ts +3 -0
- package/{components → dist/components}/rating/index.d.ts.map +1 -1
- package/dist/components/slider/index.d.ts +3 -0
- package/{components → dist/components}/slider/index.d.ts.map +1 -1
- package/{components → dist/components}/tour/tour.d.ts.map +1 -1
- package/{components → dist/components}/tour/tour.js +1 -1
- package/{components → dist/components}/tour/tour.js.map +1 -1
- package/{components → dist/components}/z-index/z-index.types.js.map +1 -1
- package/dist/package.json +45 -0
- package/dist/skill/avatar.skill.md.txt +255 -0
- package/dist/skill/badge.skill.md.txt +223 -0
- package/dist/skill/blank.skill.md.txt +0 -0
- package/dist/skill/breadcrumb.skill.md.txt +177 -0
- package/dist/skill/button.skill.md.txt +198 -0
- package/dist/skill/carousel.skill.md.txt +406 -0
- package/dist/skill/chat-bubble.skill.md.txt +342 -0
- package/dist/skill/checkbox.skill.md.txt +326 -0
- package/dist/skill/code-preview.skill.md.txt +240 -0
- package/dist/skill/collapse.skill.md.txt +329 -0
- package/dist/skill/context-menu.skill.md.txt +233 -0
- package/dist/skill/diff.skill.md.txt +244 -0
- package/dist/skill/divider.skill.md.txt +151 -0
- package/dist/skill/doc.skill.md.txt +191 -0
- package/dist/skill/drawer.skill.md.txt +157 -0
- package/dist/skill/dropdown.skill.md.txt +198 -0
- package/dist/skill/float-button.skill.md.txt +315 -0
- package/dist/skill/hover-3d-image.skill.md.txt +120 -0
- package/dist/skill/iframe.skill.md.txt +114 -0
- package/dist/skill/image-preview.skill.md.txt +162 -0
- package/dist/skill/indicator.skill.md.txt +60 -0
- package/dist/skill/input.skill.md.txt +489 -0
- package/dist/skill/loading.skill.md.txt +127 -0
- package/dist/skill/mansory.skill.md.txt +0 -0
- package/dist/skill/menu.skill.md.txt +476 -0
- package/dist/skill/modal.skill.md.txt +359 -0
- package/dist/skill/pagination.skill.md.txt +405 -0
- package/dist/skill/progress-bar.skill.md.txt +207 -0
- package/dist/skill/qr-code.skill.md.txt +136 -0
- package/dist/skill/rating.skill.md.txt +167 -0
- package/dist/skill/select-zone.skill.md.txt +93 -0
- package/dist/skill/select.skill.md.txt +663 -0
- package/dist/skill/skeleton.skill.md.txt +192 -0
- package/dist/skill/slider.skill.md.txt +404 -0
- package/dist/skill/splitter.skill.md.txt +411 -0
- package/dist/skill/steps.skill.md.txt +264 -0
- package/dist/skill/swap.skill.md.txt +139 -0
- package/dist/skill/switch.skill.md.txt +191 -0
- package/dist/skill/tab.skill.md.txt +484 -0
- package/dist/skill/table.example.header.md.txt +667 -0
- package/dist/skill/table.skill.md.txt +1407 -0
- package/dist/skill/text-rotate.skill.md.txt +186 -0
- package/dist/skill/timeline.skill.md.txt +247 -0
- package/dist/skill/toast.skill.md.txt +531 -0
- package/dist/skill/tooltip.skill.md.txt +222 -0
- package/dist/skill/tour.skill.md.txt +156 -0
- package/dist/skill/upload.skill.md.txt +358 -0
- package/dist/skill/z-index.skill.md.txt +0 -0
- package/{solid-ui.css → dist/solid-ui.css} +2 -2
- package/package.json +97 -9
- package/components/avatar/index.d.ts +0 -2
- package/components/button/index.d.ts +0 -2
- package/components/collapse/index.d.ts +0 -2
- package/components/float-button/index.d.ts +0 -2
- package/components/input/index.d.ts +0 -2
- package/components/input/index.d.ts.map +0 -1
- package/components/menu/index.d.ts +0 -4
- package/components/rating/index.d.ts +0 -2
- package/components/slider/index.d.ts +0 -2
- package/macos.code-workspace +0 -8
- /package/{components → dist/components}/avatar/avatar.d.ts +0 -0
- /package/{components → dist/components}/avatar/avatar.d.ts.map +0 -0
- /package/{components → dist/components}/avatar/avatar.js +0 -0
- /package/{components → dist/components}/avatar/avatar.js.map +0 -0
- /package/{components → dist/components}/avatar/avatar.types.d.ts +0 -0
- /package/{components → dist/components}/avatar/avatar.types.d.ts.map +0 -0
- /package/{components → dist/components}/badge/badge.d.ts +0 -0
- /package/{components → dist/components}/badge/badge.d.ts.map +0 -0
- /package/{components → dist/components}/badge/badge.js +0 -0
- /package/{components → dist/components}/badge/badge.js.map +0 -0
- /package/{components → dist/components}/badge/badge.types.d.ts +0 -0
- /package/{components → dist/components}/badge/badge.types.d.ts.map +0 -0
- /package/{components → dist/components}/badge/index.d.ts +0 -0
- /package/{components → dist/components}/badge/index.d.ts.map +0 -0
- /package/{components → dist/components}/blank/blank.d.ts +0 -0
- /package/{components → dist/components}/blank/blank.d.ts.map +0 -0
- /package/{components → dist/components}/blank/index.d.ts +0 -0
- /package/{components → dist/components}/blank/index.d.ts.map +0 -0
- /package/{components → dist/components}/breadcrumb/breadcrumb.d.ts +0 -0
- /package/{components → dist/components}/breadcrumb/breadcrumb.d.ts.map +0 -0
- /package/{components → dist/components}/breadcrumb/breadcrumb.js +0 -0
- /package/{components → dist/components}/breadcrumb/breadcrumb.js.map +0 -0
- /package/{components → dist/components}/breadcrumb/index.d.ts +0 -0
- /package/{components → dist/components}/breadcrumb/index.d.ts.map +0 -0
- /package/{components → dist/components}/button/button.d.ts +0 -0
- /package/{components → dist/components}/button/button.d.ts.map +0 -0
- /package/{components → dist/components}/button/button.js +0 -0
- /package/{components → dist/components}/button/button.js.map +0 -0
- /package/{components → dist/components}/button/button.types.d.ts +0 -0
- /package/{components → dist/components}/button/button.types.d.ts.map +0 -0
- /package/{components → dist/components}/carousel/carousel.d.ts +0 -0
- /package/{components → dist/components}/carousel/carousel.d.ts.map +0 -0
- /package/{components → dist/components}/carousel/carousel.js +0 -0
- /package/{components → dist/components}/carousel/carousel.js.map +0 -0
- /package/{components → dist/components}/carousel/carousel.types.d.ts +0 -0
- /package/{components → dist/components}/carousel/carousel.types.d.ts.map +0 -0
- /package/{components → dist/components}/carousel/index.d.ts +0 -0
- /package/{components → dist/components}/carousel/index.d.ts.map +0 -0
- /package/{components → dist/components}/chat-bubble/chatBubble.d.ts +0 -0
- /package/{components → dist/components}/chat-bubble/chatBubble.d.ts.map +0 -0
- /package/{components → dist/components}/chat-bubble/chatBubble.js +0 -0
- /package/{components → dist/components}/chat-bubble/chatBubble.js.map +0 -0
- /package/{components → dist/components}/chat-bubble/chatBubble.type.d.ts +0 -0
- /package/{components → dist/components}/chat-bubble/chatBubble.type.d.ts.map +0 -0
- /package/{components → dist/components}/chat-bubble/index.d.ts +0 -0
- /package/{components → dist/components}/chat-bubble/index.d.ts.map +0 -0
- /package/{components → dist/components}/checkbox/checkbox.d.ts +0 -0
- /package/{components → dist/components}/checkbox/checkbox.d.ts.map +0 -0
- /package/{components → dist/components}/checkbox/checkbox.js +0 -0
- /package/{components → dist/components}/checkbox/checkbox.js.map +0 -0
- /package/{components → dist/components}/checkbox/index.d.ts +0 -0
- /package/{components → dist/components}/checkbox/index.d.ts.map +0 -0
- /package/{components → dist/components}/collapse/collapse.d.ts +0 -0
- /package/{components → dist/components}/collapse/collapse.d.ts.map +0 -0
- /package/{components → dist/components}/collapse/collapse.js +0 -0
- /package/{components → dist/components}/collapse/collapse.js.map +0 -0
- /package/{components → dist/components}/collapse/collapse.types.d.ts +0 -0
- /package/{components → dist/components}/collapse/collapse.types.d.ts.map +0 -0
- /package/{components → dist/components}/context-menu/context-menu.d.ts +0 -0
- /package/{components → dist/components}/context-menu/context-menu.d.ts.map +0 -0
- /package/{components → dist/components}/context-menu/context-menu.js +0 -0
- /package/{components → dist/components}/context-menu/context-menu.js.map +0 -0
- /package/{components → dist/components}/context-menu/context-menu.store.d.ts +0 -0
- /package/{components → dist/components}/context-menu/context-menu.store.d.ts.map +0 -0
- /package/{components → dist/components}/context-menu/context-menu.store.js +0 -0
- /package/{components → dist/components}/context-menu/context-menu.store.js.map +0 -0
- /package/{components → dist/components}/context-menu/context-menu.types.d.ts +0 -0
- /package/{components → dist/components}/context-menu/context-menu.types.d.ts.map +0 -0
- /package/{components → dist/components}/context-menu/index.d.ts +0 -0
- /package/{components → dist/components}/context-menu/index.d.ts.map +0 -0
- /package/{components → dist/components}/diff/diff.d.ts +0 -0
- /package/{components → dist/components}/diff/diff.d.ts.map +0 -0
- /package/{components → dist/components}/diff/diff.js +0 -0
- /package/{components → dist/components}/diff/diff.js.map +0 -0
- /package/{components → dist/components}/diff/index.d.ts +0 -0
- /package/{components → dist/components}/diff/index.d.ts.map +0 -0
- /package/{components → dist/components}/divider/divider.d.ts +0 -0
- /package/{components → dist/components}/divider/divider.d.ts.map +0 -0
- /package/{components → dist/components}/divider/divider.js +0 -0
- /package/{components → dist/components}/divider/divider.js.map +0 -0
- /package/{components → dist/components}/divider/divider.types.d.ts +0 -0
- /package/{components → dist/components}/divider/divider.types.d.ts.map +0 -0
- /package/{components → dist/components}/divider/index.d.ts +0 -0
- /package/{components → dist/components}/divider/index.d.ts.map +0 -0
- /package/{components → dist/components}/drawer/drawer.d.ts +0 -0
- /package/{components → dist/components}/drawer/drawer.d.ts.map +0 -0
- /package/{components → dist/components}/drawer/drawer.js +0 -0
- /package/{components → dist/components}/drawer/drawer.js.map +0 -0
- /package/{components → dist/components}/drawer/drawer.types.d.ts +0 -0
- /package/{components → dist/components}/drawer/drawer.types.d.ts.map +0 -0
- /package/{components → dist/components}/drawer/index.d.ts +0 -0
- /package/{components → dist/components}/drawer/index.d.ts.map +0 -0
- /package/{components → dist/components}/dropdown/dropdown.d.ts +0 -0
- /package/{components → dist/components}/dropdown/dropdown.d.ts.map +0 -0
- /package/{components → dist/components}/dropdown/dropdown.js +0 -0
- /package/{components → dist/components}/dropdown/dropdown.js.map +0 -0
- /package/{components → dist/components}/dropdown/dropdown.store.d.ts +0 -0
- /package/{components → dist/components}/dropdown/dropdown.store.d.ts.map +0 -0
- /package/{components → dist/components}/dropdown/dropdown.store.js +0 -0
- /package/{components → dist/components}/dropdown/dropdown.store.js.map +0 -0
- /package/{components → dist/components}/dropdown/dropdown.types.d.ts +0 -0
- /package/{components → dist/components}/dropdown/dropdown.types.d.ts.map +0 -0
- /package/{components → dist/components}/dropdown/index.d.ts +0 -0
- /package/{components → dist/components}/dropdown/index.d.ts.map +0 -0
- /package/{components → dist/components}/float-button/float-button.d.ts +0 -0
- /package/{components → dist/components}/float-button/float-button.d.ts.map +0 -0
- /package/{components → dist/components}/float-button/float-button.js +0 -0
- /package/{components → dist/components}/float-button/float-button.js.map +0 -0
- /package/{components → dist/components}/float-button/float-button.types.d.ts +0 -0
- /package/{components → dist/components}/float-button/float-button.types.d.ts.map +0 -0
- /package/{components → dist/components}/hover-3d-image/hover-3d-example.d.ts +0 -0
- /package/{components → dist/components}/hover-3d-image/hover-3d-example.d.ts.map +0 -0
- /package/{components → dist/components}/hover-3d-image/hover-3d-image.d.ts +0 -0
- /package/{components → dist/components}/hover-3d-image/hover-3d-image.d.ts.map +0 -0
- /package/{components → dist/components}/hover-3d-image/hover-3d-image.js +0 -0
- /package/{components → dist/components}/hover-3d-image/hover-3d-image.js.map +0 -0
- /package/{components → dist/components}/hover-3d-image/index.d.ts +0 -0
- /package/{components → dist/components}/hover-3d-image/index.d.ts.map +0 -0
- /package/{components → dist/components}/image-preview/image-preview.d.ts +0 -0
- /package/{components → dist/components}/image-preview/image-preview.d.ts.map +0 -0
- /package/{components → dist/components}/image-preview/image-preview.js +0 -0
- /package/{components → dist/components}/image-preview/image-preview.js.map +0 -0
- /package/{components → dist/components}/image-preview/index.d.ts +0 -0
- /package/{components → dist/components}/image-preview/index.d.ts.map +0 -0
- /package/{components → dist/components}/indicator/index.d.ts +0 -0
- /package/{components → dist/components}/indicator/index.d.ts.map +0 -0
- /package/{components → dist/components}/indicator/indicator.d.ts +0 -0
- /package/{components → dist/components}/indicator/indicator.d.ts.map +0 -0
- /package/{components → dist/components}/indicator/indicator.js +0 -0
- /package/{components → dist/components}/indicator/indicator.js.map +0 -0
- /package/{components → dist/components}/indicator/indicator.types.d.ts +0 -0
- /package/{components → dist/components}/indicator/indicator.types.d.ts.map +0 -0
- /package/{components → dist/components}/input/input.d.ts +0 -0
- /package/{components → dist/components}/input/input.d.ts.map +0 -0
- /package/{components → dist/components}/input/input.js +0 -0
- /package/{components → dist/components}/input/input.js.map +0 -0
- /package/{components → dist/components}/input/input.types.d.ts +0 -0
- /package/{components → dist/components}/input/input.types.d.ts.map +0 -0
- /package/{components → dist/components}/input/input.utils.d.ts +0 -0
- /package/{components → dist/components}/input/input.utils.d.ts.map +0 -0
- /package/{components → dist/components}/input/input.utils.js +0 -0
- /package/{components → dist/components}/input/input.utils.js.map +0 -0
- /package/{components → dist/components}/input/variants/input-color.d.ts +0 -0
- /package/{components → dist/components}/input/variants/input-color.d.ts.map +0 -0
- /package/{components → dist/components}/input/variants/input-color.js +0 -0
- /package/{components → dist/components}/input/variants/input-color.js.map +0 -0
- /package/{components → dist/components}/input/variants/input-date.d.ts +0 -0
- /package/{components → dist/components}/input/variants/input-date.d.ts.map +0 -0
- /package/{components → dist/components}/input/variants/input-date.js +0 -0
- /package/{components → dist/components}/input/variants/input-date.js.map +0 -0
- /package/{components → dist/components}/input/variants/input-number.d.ts +0 -0
- /package/{components → dist/components}/input/variants/input-number.d.ts.map +0 -0
- /package/{components → dist/components}/input/variants/input-number.js +0 -0
- /package/{components → dist/components}/input/variants/input-number.js.map +0 -0
- /package/{components → dist/components}/input/variants/input-otp.d.ts +0 -0
- /package/{components → dist/components}/input/variants/input-otp.d.ts.map +0 -0
- /package/{components → dist/components}/input/variants/input-otp.js +0 -0
- /package/{components → dist/components}/input/variants/input-otp.js.map +0 -0
- /package/{components → dist/components}/input/variants/input-password.d.ts +0 -0
- /package/{components → dist/components}/input/variants/input-password.d.ts.map +0 -0
- /package/{components → dist/components}/input/variants/input-password.js +0 -0
- /package/{components → dist/components}/input/variants/input-password.js.map +0 -0
- /package/{components → dist/components}/input/variants/input-radio.d.ts +0 -0
- /package/{components → dist/components}/input/variants/input-radio.d.ts.map +0 -0
- /package/{components → dist/components}/input/variants/input-radio.js +0 -0
- /package/{components → dist/components}/input/variants/input-radio.js.map +0 -0
- /package/{components → dist/components}/input/variants/input-range.d.ts +0 -0
- /package/{components → dist/components}/input/variants/input-range.d.ts.map +0 -0
- /package/{components → dist/components}/input/variants/input-range.js +0 -0
- /package/{components → dist/components}/input/variants/input-range.js.map +0 -0
- /package/{components → dist/components}/input/variants/input-text.d.ts +0 -0
- /package/{components → dist/components}/input/variants/input-text.d.ts.map +0 -0
- /package/{components → dist/components}/input/variants/input-text.js +0 -0
- /package/{components → dist/components}/input/variants/input-text.js.map +0 -0
- /package/{components → dist/components}/input/variants/input-textarea.d.ts +0 -0
- /package/{components → dist/components}/input/variants/input-textarea.d.ts.map +0 -0
- /package/{components → dist/components}/input/variants/input-textarea.js +0 -0
- /package/{components → dist/components}/input/variants/input-textarea.js.map +0 -0
- /package/{components → dist/components}/loading/index.d.ts +0 -0
- /package/{components → dist/components}/loading/index.d.ts.map +0 -0
- /package/{components → dist/components}/loading/loading.d.ts +0 -0
- /package/{components → dist/components}/loading/loading.d.ts.map +0 -0
- /package/{components → dist/components}/loading/loading.js +0 -0
- /package/{components → dist/components}/loading/loading.js.map +0 -0
- /package/{components → dist/components}/mansory/index.d.ts +0 -0
- /package/{components → dist/components}/mansory/index.d.ts.map +0 -0
- /package/{components → dist/components}/mansory/mansory.d.ts +0 -0
- /package/{components → dist/components}/mansory/mansory.d.ts.map +0 -0
- /package/{components → dist/components}/mansory/mansory.js +0 -0
- /package/{components → dist/components}/mansory/mansory.js.map +0 -0
- /package/{components → dist/components}/mansory/mansory.types.d.ts +0 -0
- /package/{components → dist/components}/mansory/mansory.types.d.ts.map +0 -0
- /package/{components → dist/components}/menu/menu.d.ts +0 -0
- /package/{components → dist/components}/menu/menu.d.ts.map +0 -0
- /package/{components → dist/components}/menu/menu.data-example.d.ts +0 -0
- /package/{components → dist/components}/menu/menu.data-example.d.ts.map +0 -0
- /package/{components → dist/components}/menu/menu.js +0 -0
- /package/{components → dist/components}/menu/menu.js.map +0 -0
- /package/{components → dist/components}/modal/index.d.ts +0 -0
- /package/{components → dist/components}/modal/index.d.ts.map +0 -0
- /package/{components → dist/components}/modal/modal.d.ts +0 -0
- /package/{components → dist/components}/modal/modal.d.ts.map +0 -0
- /package/{components → dist/components}/modal/modal.js +0 -0
- /package/{components → dist/components}/modal/modal.js.map +0 -0
- /package/{components → dist/components}/modal/modalContext.d.ts +0 -0
- /package/{components → dist/components}/modal/modalContext.d.ts.map +0 -0
- /package/{components → dist/components}/modal/modalContext.js +0 -0
- /package/{components → dist/components}/modal/modalContext.js.map +0 -0
- /package/{components → dist/components}/pagination/index.d.ts +0 -0
- /package/{components → dist/components}/pagination/index.d.ts.map +0 -0
- /package/{components → dist/components}/pagination/pagination.d.ts +0 -0
- /package/{components → dist/components}/pagination/pagination.d.ts.map +0 -0
- /package/{components → dist/components}/pagination/pagination.js +0 -0
- /package/{components → dist/components}/pagination/pagination.js.map +0 -0
- /package/{components → dist/components}/pagination/pagination.types.d.ts +0 -0
- /package/{components → dist/components}/pagination/pagination.types.d.ts.map +0 -0
- /package/{components → dist/components}/progress-bar/index.d.ts +0 -0
- /package/{components → dist/components}/progress-bar/index.d.ts.map +0 -0
- /package/{components → dist/components}/progress-bar/progress-bar.d.ts +0 -0
- /package/{components → dist/components}/progress-bar/progress-bar.d.ts.map +0 -0
- /package/{components → dist/components}/progress-bar/progress-bar.js +0 -0
- /package/{components → dist/components}/progress-bar/progress-bar.js.map +0 -0
- /package/{components → dist/components}/progress-bar/progress-bar.types.d.ts +0 -0
- /package/{components → dist/components}/progress-bar/progress-bar.types.d.ts.map +0 -0
- /package/{components → dist/components}/qr-code/index.d.ts +0 -0
- /package/{components → dist/components}/qr-code/index.d.ts.map +0 -0
- /package/{components → dist/components}/qr-code/qr-code.d.ts +0 -0
- /package/{components → dist/components}/qr-code/qr-code.d.ts.map +0 -0
- /package/{components → dist/components}/qr-code/qr-code.js +0 -0
- /package/{components → dist/components}/qr-code/qr-code.js.map +0 -0
- /package/{components → dist/components}/qr-code/qr-code.types.d.ts +0 -0
- /package/{components → dist/components}/qr-code/qr-code.types.d.ts.map +0 -0
- /package/{components → dist/components}/rating/rating.d.ts +0 -0
- /package/{components → dist/components}/rating/rating.d.ts.map +0 -0
- /package/{components → dist/components}/rating/rating.js +0 -0
- /package/{components → dist/components}/rating/rating.js.map +0 -0
- /package/{components → dist/components}/rating/rating.types.d.ts +0 -0
- /package/{components → dist/components}/rating/rating.types.d.ts.map +0 -0
- /package/{components → dist/components}/select/index.d.ts +0 -0
- /package/{components → dist/components}/select/index.d.ts.map +0 -0
- /package/{components → dist/components}/select/select.d.ts +0 -0
- /package/{components → dist/components}/select/select.d.ts.map +0 -0
- /package/{components → dist/components}/select/select.js +0 -0
- /package/{components → dist/components}/select/select.js.map +0 -0
- /package/{components → dist/components}/select/select.types.d.ts +0 -0
- /package/{components → dist/components}/select/select.types.d.ts.map +0 -0
- /package/{components → dist/components}/select-zone/index.d.ts +0 -0
- /package/{components → dist/components}/select-zone/index.d.ts.map +0 -0
- /package/{components → dist/components}/select-zone/select-zone.d.ts +0 -0
- /package/{components → dist/components}/select-zone/select-zone.d.ts.map +0 -0
- /package/{components → dist/components}/select-zone/select-zone.js +0 -0
- /package/{components → dist/components}/select-zone/select-zone.js.map +0 -0
- /package/{components → dist/components}/select-zone/select-zone.types.d.ts +0 -0
- /package/{components → dist/components}/select-zone/select-zone.types.d.ts.map +0 -0
- /package/{components → dist/components}/skeleton/index.d.ts +0 -0
- /package/{components → dist/components}/skeleton/index.d.ts.map +0 -0
- /package/{components → dist/components}/skeleton/skeleton.d.ts +0 -0
- /package/{components → dist/components}/skeleton/skeleton.d.ts.map +0 -0
- /package/{components → dist/components}/skeleton/skeleton.js +0 -0
- /package/{components → dist/components}/skeleton/skeleton.js.map +0 -0
- /package/{components → dist/components}/slider/slider.d.ts +0 -0
- /package/{components → dist/components}/slider/slider.d.ts.map +0 -0
- /package/{components → dist/components}/slider/slider.js +0 -0
- /package/{components → dist/components}/slider/slider.js.map +0 -0
- /package/{components → dist/components}/slider/slider.types.d.ts +0 -0
- /package/{components → dist/components}/slider/slider.types.d.ts.map +0 -0
- /package/{components → dist/components}/splitter/index.d.ts +0 -0
- /package/{components → dist/components}/splitter/index.d.ts.map +0 -0
- /package/{components → dist/components}/splitter/splitter.d.ts +0 -0
- /package/{components → dist/components}/splitter/splitter.d.ts.map +0 -0
- /package/{components → dist/components}/splitter/splitter.js +0 -0
- /package/{components → dist/components}/splitter/splitter.js.map +0 -0
- /package/{components → dist/components}/splitter/splitter.types.d.ts +0 -0
- /package/{components → dist/components}/splitter/splitter.types.d.ts.map +0 -0
- /package/{components → dist/components}/steps/index.d.ts +0 -0
- /package/{components → dist/components}/steps/index.d.ts.map +0 -0
- /package/{components → dist/components}/steps/steps.d.ts +0 -0
- /package/{components → dist/components}/steps/steps.d.ts.map +0 -0
- /package/{components → dist/components}/steps/steps.js +0 -0
- /package/{components → dist/components}/steps/steps.js.map +0 -0
- /package/{components → dist/components}/swap/index.d.ts +0 -0
- /package/{components → dist/components}/swap/index.d.ts.map +0 -0
- /package/{components → dist/components}/swap/swap.d.ts +0 -0
- /package/{components → dist/components}/swap/swap.d.ts.map +0 -0
- /package/{components → dist/components}/swap/swap.js +0 -0
- /package/{components → dist/components}/swap/swap.js.map +0 -0
- /package/{components → dist/components}/switch/index.d.ts +0 -0
- /package/{components → dist/components}/switch/index.d.ts.map +0 -0
- /package/{components → dist/components}/switch/switch.d.ts +0 -0
- /package/{components → dist/components}/switch/switch.d.ts.map +0 -0
- /package/{components → dist/components}/switch/switch.js +0 -0
- /package/{components → dist/components}/switch/switch.js.map +0 -0
- /package/{components → dist/components}/switch/switch.types.d.ts +0 -0
- /package/{components → dist/components}/switch/switch.types.d.ts.map +0 -0
- /package/{components → dist/components}/tab/index.d.ts +0 -0
- /package/{components → dist/components}/tab/index.d.ts.map +0 -0
- /package/{components → dist/components}/tab/tab.d.ts +0 -0
- /package/{components → dist/components}/tab/tab.d.ts.map +0 -0
- /package/{components → dist/components}/tab/tab.js +0 -0
- /package/{components → dist/components}/tab/tab.js.map +0 -0
- /package/{components → dist/components}/tab/tab.types.d.ts +0 -0
- /package/{components → dist/components}/tab/tab.types.d.ts.map +0 -0
- /package/{components → dist/components}/table/index.d.ts +0 -0
- /package/{components → dist/components}/table/index.d.ts.map +0 -0
- /package/{components → dist/components}/table/index.js +0 -0
- /package/{components → dist/components}/table/table.d.ts +0 -0
- /package/{components → dist/components}/table/table.d.ts.map +0 -0
- /package/{components → dist/components}/table/table.js +0 -0
- /package/{components → dist/components}/table/table.js.map +0 -0
- /package/{components → dist/components}/table/table.types.d.ts +0 -0
- /package/{components → dist/components}/table/table.types.d.ts.map +0 -0
- /package/{components → dist/components}/text-rotate/index.d.ts +0 -0
- /package/{components → dist/components}/text-rotate/index.d.ts.map +0 -0
- /package/{components → dist/components}/text-rotate/text-rotate.d.ts +0 -0
- /package/{components → dist/components}/text-rotate/text-rotate.d.ts.map +0 -0
- /package/{components → dist/components}/text-rotate/text-rotate.js +0 -0
- /package/{components → dist/components}/text-rotate/text-rotate.js.map +0 -0
- /package/{components → dist/components}/timeline/index.d.ts +0 -0
- /package/{components → dist/components}/timeline/index.d.ts.map +0 -0
- /package/{components → dist/components}/timeline/timeline.d.ts +0 -0
- /package/{components → dist/components}/timeline/timeline.d.ts.map +0 -0
- /package/{components → dist/components}/timeline/timeline.js +0 -0
- /package/{components → dist/components}/timeline/timeline.js.map +0 -0
- /package/{components → dist/components}/timeline/timeline.types.d.ts +0 -0
- /package/{components → dist/components}/timeline/timeline.types.d.ts.map +0 -0
- /package/{components → dist/components}/toast/icons/ErrorIcon.d.ts +0 -0
- /package/{components → dist/components}/toast/icons/ErrorIcon.d.ts.map +0 -0
- /package/{components → dist/components}/toast/icons/ErrorIcon.js +0 -0
- /package/{components → dist/components}/toast/icons/ErrorIcon.js.map +0 -0
- /package/{components → dist/components}/toast/icons/IconCircle.d.ts +0 -0
- /package/{components → dist/components}/toast/icons/IconCircle.d.ts.map +0 -0
- /package/{components → dist/components}/toast/icons/IconCircle.js +0 -0
- /package/{components → dist/components}/toast/icons/IconCircle.js.map +0 -0
- /package/{components → dist/components}/toast/icons/InfoIcon.d.ts +0 -0
- /package/{components → dist/components}/toast/icons/InfoIcon.d.ts.map +0 -0
- /package/{components → dist/components}/toast/icons/InfoIcon.js +0 -0
- /package/{components → dist/components}/toast/icons/InfoIcon.js.map +0 -0
- /package/{components → dist/components}/toast/icons/LoaderIcon.d.ts +0 -0
- /package/{components → dist/components}/toast/icons/LoaderIcon.d.ts.map +0 -0
- /package/{components → dist/components}/toast/icons/LoaderIcon.js +0 -0
- /package/{components → dist/components}/toast/icons/LoaderIcon.js.map +0 -0
- /package/{components → dist/components}/toast/icons/SuccessIcon.d.ts +0 -0
- /package/{components → dist/components}/toast/icons/SuccessIcon.d.ts.map +0 -0
- /package/{components → dist/components}/toast/icons/SuccessIcon.js +0 -0
- /package/{components → dist/components}/toast/icons/SuccessIcon.js.map +0 -0
- /package/{components → dist/components}/toast/icons/WarningIcon.d.ts +0 -0
- /package/{components → dist/components}/toast/icons/WarningIcon.d.ts.map +0 -0
- /package/{components → dist/components}/toast/icons/WarningIcon.js +0 -0
- /package/{components → dist/components}/toast/icons/WarningIcon.js.map +0 -0
- /package/{components → dist/components}/toast/icons/index.d.ts +0 -0
- /package/{components → dist/components}/toast/icons/index.d.ts.map +0 -0
- /package/{components → dist/components}/toast/index.d.ts +0 -0
- /package/{components → dist/components}/toast/index.d.ts.map +0 -0
- /package/{components → dist/components}/toast/toast.d.ts +0 -0
- /package/{components → dist/components}/toast/toast.d.ts.map +0 -0
- /package/{components → dist/components}/toast/toast.js +0 -0
- /package/{components → dist/components}/toast/toast.js.map +0 -0
- /package/{components → dist/components}/toast/toast.store.d.ts +0 -0
- /package/{components → dist/components}/toast/toast.store.d.ts.map +0 -0
- /package/{components → dist/components}/toast/toast.store.js +0 -0
- /package/{components → dist/components}/toast/toast.store.js.map +0 -0
- /package/{components → dist/components}/toast/toast.type.d.ts +0 -0
- /package/{components → dist/components}/toast/toast.type.d.ts.map +0 -0
- /package/{components → dist/components}/tooltip/index.d.ts +0 -0
- /package/{components → dist/components}/tooltip/index.d.ts.map +0 -0
- /package/{components → dist/components}/tooltip/tooltip.d.ts +0 -0
- /package/{components → dist/components}/tooltip/tooltip.d.ts.map +0 -0
- /package/{components → dist/components}/tooltip/tooltip.js +0 -0
- /package/{components → dist/components}/tooltip/tooltip.js.map +0 -0
- /package/{components → dist/components}/tooltip/tooltip.types.d.ts +0 -0
- /package/{components → dist/components}/tooltip/tooltip.types.d.ts.map +0 -0
- /package/{components → dist/components}/tour/index.d.ts +0 -0
- /package/{components → dist/components}/tour/index.d.ts.map +0 -0
- /package/{components → dist/components}/tour/tour.d.ts +0 -0
- /package/{components → dist/components}/tour/tour.types.d.ts +0 -0
- /package/{components → dist/components}/tour/tour.types.d.ts.map +0 -0
- /package/{components → dist/components}/upload/index.d.ts +0 -0
- /package/{components → dist/components}/upload/index.d.ts.map +0 -0
- /package/{components → dist/components}/upload/upload.d.ts +0 -0
- /package/{components → dist/components}/upload/upload.d.ts.map +0 -0
- /package/{components → dist/components}/upload/upload.js +0 -0
- /package/{components → dist/components}/upload/upload.js.map +0 -0
- /package/{components → dist/components}/upload/upload.types.d.ts +0 -0
- /package/{components → dist/components}/upload/upload.types.d.ts.map +0 -0
- /package/{components → dist/components}/z-index/index.d.ts +0 -0
- /package/{components → dist/components}/z-index/index.d.ts.map +0 -0
- /package/{components → dist/components}/z-index/z-index.context.d.ts +0 -0
- /package/{components → dist/components}/z-index/z-index.context.d.ts.map +0 -0
- /package/{components → dist/components}/z-index/z-index.context.js +0 -0
- /package/{components → dist/components}/z-index/z-index.context.js.map +0 -0
- /package/{components → dist/components}/z-index/z-index.d.ts +0 -0
- /package/{components → dist/components}/z-index/z-index.d.ts.map +0 -0
- /package/{components → dist/components}/z-index/z-index.js +0 -0
- /package/{components → dist/components}/z-index/z-index.js.map +0 -0
- /package/{components → dist/components}/z-index/z-index.store.d.ts +0 -0
- /package/{components → dist/components}/z-index/z-index.store.d.ts.map +0 -0
- /package/{components → dist/components}/z-index/z-index.store.js +0 -0
- /package/{components → dist/components}/z-index/z-index.store.js.map +0 -0
- /package/{components → dist/components}/z-index/z-index.types.d.ts +0 -0
- /package/{components → dist/components}/z-index/z-index.types.d.ts.map +0 -0
- /package/{components → dist/components}/z-index/z-index.types.js +0 -0
- /package/{lib.d.ts → dist/lib.d.ts} +0 -0
- /package/{lib.d.ts.map → dist/lib.d.ts.map} +0 -0
- /package/{lib.js → dist/lib.js} +0 -0
- /package/{type.d.ts → dist/type.d.ts} +0 -0
- /package/{type.d.ts.map → dist/type.d.ts.map} +0 -0
- /package/{utils → dist/utils}/cn.d.ts +0 -0
- /package/{utils → dist/utils}/cn.d.ts.map +0 -0
- /package/{utils → dist/utils}/cn.js +0 -0
- /package/{utils → dist/utils}/cn.js.map +0 -0
- /package/{utils → dist/utils}/element-tracker.js +0 -0
- /package/{utils → dist/utils}/element-tracker.js.map +0 -0
- /package/{utils → dist/utils}/helper.d.ts +0 -0
- /package/{utils → dist/utils}/helper.d.ts.map +0 -0
- /package/{utils → dist/utils}/helper.js +0 -0
- /package/{utils → dist/utils}/helper.js.map +0 -0
- /package/{utils → dist/utils}/hoc.js +0 -0
- /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.
|