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.
- 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 +9 -10
- 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,233 @@
|
|
|
1
|
+
## COMPONENT IDENTITY
|
|
2
|
+
- **Import**: `import { ContextMenu, createContextMenuHandle } from 'solid-tom-ui';`
|
|
3
|
+
- **Exports**: `ContextMenu` (renderer), `createContextMenuHandle` (factory)
|
|
4
|
+
- **Framework**: SolidJS
|
|
5
|
+
- **Purpose**: Context-aware right-click menu with a registry pattern. Each UI zone registers its own items independently; the menu builds the visible list from the current context at trigger time. No coupling between zones — each feature owns its items.
|
|
6
|
+
|
|
7
|
+
## TYPE SIGNATURES
|
|
8
|
+
|
|
9
|
+
### createContextMenuHandle
|
|
10
|
+
```typescript
|
|
11
|
+
import { createContextMenuHandle } from 'solid-tom-ui';
|
|
12
|
+
|
|
13
|
+
function createContextMenuHandle<TContext extends Record<string, unknown>>(): ContextMenuHandle<TContext>;
|
|
14
|
+
|
|
15
|
+
type ContextMenuHandle<TContext> = {
|
|
16
|
+
register: (item: RegistryItem<TContext>) => void;
|
|
17
|
+
unregister: (key: string) => void;
|
|
18
|
+
trigger: (e: MouseEvent, ctx: TContext) => void;
|
|
19
|
+
};
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### ContextMenu
|
|
23
|
+
```typescript
|
|
24
|
+
import { ContextMenu } from 'solid-tom-ui';
|
|
25
|
+
|
|
26
|
+
type ContextMenuProps<TContext> = {
|
|
27
|
+
handle: ContextMenuHandle<TContext>; // REQUIRED: handle from createContextMenuHandle()
|
|
28
|
+
class?: Partial<Record<
|
|
29
|
+
'content' | 'item' | 'separator' | 'submenu',
|
|
30
|
+
string
|
|
31
|
+
>>; // CSS slot overrides
|
|
32
|
+
};
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### RegistryItem (discriminated union)
|
|
36
|
+
```typescript
|
|
37
|
+
// Shared base fields
|
|
38
|
+
type BaseRegistryItem<TContext> = {
|
|
39
|
+
key: string; // REQUIRED: unique ID for dedup / unregister
|
|
40
|
+
label: string; // REQUIRED: display text
|
|
41
|
+
when?: (ctx: TContext) => boolean; // visibility predicate — omit = always visible
|
|
42
|
+
disabled?: (ctx: TContext) => boolean; // disable predicate — omit = always enabled
|
|
43
|
+
shortcut?: string; // display-only hint (e.g. "Ctrl+C"), not bound
|
|
44
|
+
prefixIcon?: JSXElement; // icon element rendered to the left of label
|
|
45
|
+
order?: number; // sort order, lower = higher up (default: 100)
|
|
46
|
+
group?: string; // items in the same group are visually grouped;
|
|
47
|
+
// separators are auto-inserted between groups
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Action item
|
|
51
|
+
type ActionRegistryItem<TContext> = BaseRegistryItem<TContext> & {
|
|
52
|
+
type: 'item';
|
|
53
|
+
onClick: (ctx: TContext) => void; // REQUIRED for 'item'
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// Submenu item
|
|
57
|
+
type SubmenuRegistryItem<TContext> = BaseRegistryItem<TContext> & {
|
|
58
|
+
type: 'submenu';
|
|
59
|
+
items: RegistryItem<TContext>[]; // REQUIRED for 'submenu'; one level deep
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
type RegistryItem<TContext> = ActionRegistryItem<TContext> | SubmenuRegistryItem<TContext>;
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## KEY RULES
|
|
66
|
+
- `createContextMenuHandle<TContext>()` is generic — define your own context type that describes UI state at the moment of right-click
|
|
67
|
+
- Only **one** context menu may be open at a time (shared singleton open/close state) — multiple handles still share this state
|
|
68
|
+
- `<ContextMenu>` **must** be rendered in the JSX tree, typically near the app root to avoid z-index conflicts
|
|
69
|
+
- `prefixIcon` accepts a `JSXElement` (rendered JSX), not a function component
|
|
70
|
+
- Submenus are **one level deep** only — nested `items` arrays inside a submenu are not supported
|
|
71
|
+
- `shortcut` is display-only and does **not** bind keyboard events — wire those separately
|
|
72
|
+
|
|
73
|
+
## MINIMAL SETUP
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
import { createContextMenuHandle, ContextMenu } from 'solid-tom-ui';
|
|
77
|
+
|
|
78
|
+
// 1. Define context shape
|
|
79
|
+
type MyCtx = { zone: 'editor' | 'sidebar'; hasSelection: boolean };
|
|
80
|
+
|
|
81
|
+
// 2. Create handle (component level or module scope)
|
|
82
|
+
const handle = createContextMenuHandle<MyCtx>();
|
|
83
|
+
|
|
84
|
+
// 3. Register items
|
|
85
|
+
handle.register({
|
|
86
|
+
key: 'copy',
|
|
87
|
+
type: 'item',
|
|
88
|
+
label: 'Copy',
|
|
89
|
+
when: ctx => ctx.hasSelection,
|
|
90
|
+
onClick: ctx => console.log('copy in', ctx.zone),
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// 4. Render once near app root
|
|
94
|
+
<ContextMenu handle={handle} />
|
|
95
|
+
|
|
96
|
+
// 5. Trigger on right-click
|
|
97
|
+
<div onContextMenu={e => handle.trigger(e, { zone: 'editor', hasSelection: true })}>
|
|
98
|
+
Right-click here
|
|
99
|
+
</div>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## USAGE PATTERNS
|
|
103
|
+
|
|
104
|
+
### Module-scoped handle (shared across components)
|
|
105
|
+
```ts
|
|
106
|
+
// context-menu.handle.ts
|
|
107
|
+
export type AppCtx = { zone: string; isFile: boolean };
|
|
108
|
+
export const appMenuHandle = createContextMenuHandle<AppCtx>();
|
|
109
|
+
|
|
110
|
+
// FileExplorer.tsx — registers its own items
|
|
111
|
+
appMenuHandle.register({ key: 'rename', type: 'item', label: 'Rename', when: ctx => ctx.isFile, onClick: ctx => rename(ctx) });
|
|
112
|
+
|
|
113
|
+
// Editor.tsx — registers independent items
|
|
114
|
+
appMenuHandle.register({ key: 'copy', type: 'item', label: 'Copy', when: ctx => ctx.zone === 'editor', onClick: () => copy() });
|
|
115
|
+
|
|
116
|
+
// App.tsx — render once
|
|
117
|
+
<ContextMenu handle={appMenuHandle} />
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Dynamic registration / unregistration
|
|
121
|
+
```ts
|
|
122
|
+
handle.register({ key: 'admin-delete', type: 'item', label: 'Delete', onClick: () => deleteItem() });
|
|
123
|
+
|
|
124
|
+
// Later (e.g. user logs out):
|
|
125
|
+
handle.unregister('admin-delete');
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Grouped items with separators
|
|
129
|
+
```ts
|
|
130
|
+
handle.register({ key: 'cut', type: 'item', label: 'Cut', group: 'clipboard', order: 10, onClick: () => cut() });
|
|
131
|
+
handle.register({ key: 'copy', type: 'item', label: 'Copy', group: 'clipboard', order: 11, onClick: () => copy() });
|
|
132
|
+
handle.register({ key: 'paste', type: 'item', label: 'Paste', group: 'clipboard', order: 12, onClick: () => paste() });
|
|
133
|
+
handle.register({ key: 'delete', type: 'item', label: 'Delete', group: 'danger', order: 20, onClick: () => del() });
|
|
134
|
+
// Separator is auto-inserted between 'clipboard' and 'danger' groups
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Submenu
|
|
138
|
+
```ts
|
|
139
|
+
handle.register({
|
|
140
|
+
key: 'export',
|
|
141
|
+
type: 'submenu',
|
|
142
|
+
label: 'Export as',
|
|
143
|
+
items: [
|
|
144
|
+
{ key: 'export-png', type: 'item', label: 'PNG', onClick: () => exportPng() },
|
|
145
|
+
{ key: 'export-svg', type: 'item', label: 'SVG', onClick: () => exportSvg() },
|
|
146
|
+
{ key: 'export-pdf', type: 'item', label: 'PDF', onClick: () => exportPdf() },
|
|
147
|
+
],
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Icon and keyboard shortcut hints
|
|
152
|
+
```ts
|
|
153
|
+
import Copy from 'lucide-solid/icons/copy';
|
|
154
|
+
|
|
155
|
+
handle.register({
|
|
156
|
+
key: 'copy',
|
|
157
|
+
type: 'item',
|
|
158
|
+
label: 'Copy',
|
|
159
|
+
prefixIcon: <Copy size={14} />,
|
|
160
|
+
shortcut: 'Ctrl+C',
|
|
161
|
+
onClick: () => copy(),
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Multiple independent menus (separate context types)
|
|
166
|
+
```ts
|
|
167
|
+
const editorMenu = createContextMenuHandle<EditorCtx>();
|
|
168
|
+
const tableMenu = createContextMenuHandle<TableCtx>();
|
|
169
|
+
|
|
170
|
+
<ContextMenu handle={editorMenu} />
|
|
171
|
+
<ContextMenu handle={tableMenu} />
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### CSS slot override
|
|
175
|
+
```tsx
|
|
176
|
+
<ContextMenu
|
|
177
|
+
handle={handle}
|
|
178
|
+
class={{
|
|
179
|
+
content: 'rounded-xl shadow-2xl',
|
|
180
|
+
item: 'text-sm',
|
|
181
|
+
separator: 'my-1 opacity-30',
|
|
182
|
+
submenu: 'font-medium',
|
|
183
|
+
}}
|
|
184
|
+
/>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## DECISION RULES
|
|
188
|
+
|
|
189
|
+
**Single handle vs multiple handles:**
|
|
190
|
+
- One shared context type across the entire app → single module-scoped handle
|
|
191
|
+
- Completely separate feature areas with different context shapes → separate handles per area
|
|
192
|
+
|
|
193
|
+
**`when` vs `disabled`:**
|
|
194
|
+
- Item doesn't belong to this context at all → use `when` (hides the item)
|
|
195
|
+
- Item belongs but action is not available right now → use `disabled` (shows grayed-out)
|
|
196
|
+
|
|
197
|
+
**`order` and `group`:**
|
|
198
|
+
- Use `group` to visually separate categories (separators are automatic)
|
|
199
|
+
- Use `order` to control position within a group (lower number = higher position)
|
|
200
|
+
- If order is not specified, items are rendered in registration order (default: 100)
|
|
201
|
+
|
|
202
|
+
**`prefixIcon`:**
|
|
203
|
+
- Pass a rendered JSX element: `prefixIcon={<Copy size={14} />}`
|
|
204
|
+
- Import icons by direct path to avoid bundling the entire lucide library
|
|
205
|
+
|
|
206
|
+
## ANTI-PATTERNS
|
|
207
|
+
```tsx
|
|
208
|
+
// ❌ Rendering ContextMenu deep in a child component — may cause z-index issues
|
|
209
|
+
<Modal>
|
|
210
|
+
<ContextMenu handle={handle} /> // wrong — render near app root instead
|
|
211
|
+
</Modal>
|
|
212
|
+
|
|
213
|
+
// ❌ Passing a function component as prefixIcon (it won't render)
|
|
214
|
+
prefixIcon={Copy} // wrong
|
|
215
|
+
prefixIcon={<Copy size={14} />} // ✅ pass JSX element
|
|
216
|
+
|
|
217
|
+
// ❌ Nesting submenus more than one level deep (not supported)
|
|
218
|
+
{
|
|
219
|
+
type: 'submenu',
|
|
220
|
+
items: [{ type: 'submenu', items: [...] }] // second level ignored
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// ❌ Expecting shortcut to bind a keyboard event
|
|
224
|
+
shortcut: 'Ctrl+Z' // display only — wire onKeyDown separately
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## Component Conventions
|
|
230
|
+
|
|
231
|
+
> **CSS encoding**: internal CSS classes use short encoded names (e.g. `cm01`, `cm02`) per project convention.
|
|
232
|
+
|
|
233
|
+
> **Unique IDs**: if this component needs to generate HTML `id` attributes, always use `createUniqueId()` from `solid-js` — never `Math.random()` or `Date.now()`.
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
## COMPONENT IDENTITY
|
|
2
|
+
- **Import**: `import { Diff } from 'solid-tom-ui';`
|
|
3
|
+
- **Export**: `Diff` (named export)
|
|
4
|
+
- **Framework**: SolidJS
|
|
5
|
+
- **Purpose**: Interactive image/content comparison slider — user drags a resizer to reveal left vs right panels; NOT a `ParentComponent`, content passed via `images` prop array
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## TYPE SIGNATURE
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
type DiffProps = {
|
|
13
|
+
images: SolidComponent[]; // REQUIRED — must be exactly 2 elements
|
|
14
|
+
class?: string; // extra classes on root <figure>
|
|
15
|
+
};
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## CLASS SLOTS
|
|
19
|
+
|
|
20
|
+
`Diff` is a single-element component — the `class` prop targets the root `<figure>` only. There are no named slots.
|
|
21
|
+
|
|
22
|
+
> **CSS encoding**: internal CSS classes follow the project convention using short encoded names (e.g. `df01`, `df02`). Do not reference DaisyUI's `diff-item-1` / `diff-item-2` class names directly in your own styles — use the `class` prop or wrap with your own container.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## PROP REFERENCE
|
|
27
|
+
|
|
28
|
+
| Prop | Type | Required | Description |
|
|
29
|
+
| -------- | ------------------ | -------- | ------------------------------------------------------------------------------------- |
|
|
30
|
+
| `images` | `SolidComponent[]` | ✅ YES | Array of **exactly 2** JSX elements — index `0` = left panel, index `1` = right panel |
|
|
31
|
+
| `class` | `string` | ❌ NO | Extra Tailwind classes appended to the root `<figure>` element |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## HARD CONSTRAINT: `images` must have exactly 2 elements
|
|
36
|
+
|
|
37
|
+
- Passing fewer or more than 2 elements → component returns `<></>` (renders nothing) and fires `console.warn('You need to provide exactly 2 images')`
|
|
38
|
+
- There is no partial rendering fallback — the entire component is suppressed
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
// ✅ Valid
|
|
42
|
+
images={[<img src="a.webp" />, <img src="b.webp" />]}
|
|
43
|
+
|
|
44
|
+
// ❌ Invalid — renders nothing
|
|
45
|
+
images={[<img src="a.webp" />]}
|
|
46
|
+
images={[<img src="a.webp" />, <img src="b.webp" />, <img src="c.webp" />]}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## INTERNAL DOM STRUCTURE
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
<figure class="diff aspect-video [class]" tabindex="0">
|
|
55
|
+
│
|
|
56
|
+
├── <div class="diff-item-1" role="img" tabindex="0">
|
|
57
|
+
│ {images[0]} ← LEFT panel (revealed by dragging resizer right)
|
|
58
|
+
│ </div>
|
|
59
|
+
│
|
|
60
|
+
├── <div class="diff-item-2" role="img">
|
|
61
|
+
│ {images[1]} ← RIGHT panel (base/background layer)
|
|
62
|
+
│ </div>
|
|
63
|
+
│
|
|
64
|
+
└── <div class="diff-resizer"></div> ← invisible drag handle
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Layer rendering order
|
|
68
|
+
|
|
69
|
+
- `diff-item-2` (right/background) renders behind — visible in full by default
|
|
70
|
+
- `diff-item-1` (left/foreground) renders on top with `z-index: 1`, clipped by the resizer position
|
|
71
|
+
- Dragging resizer RIGHT → reveals more of `images[0]` (left panel)
|
|
72
|
+
- Dragging resizer LEFT → reveals more of `images[1]` (right panel)
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## INTERACTION MECHANISM — CSS-only, no JS state
|
|
77
|
+
|
|
78
|
+
The slider is driven entirely by CSS using a native `resize: horizontal` invisible div (`.diff-resizer`):
|
|
79
|
+
|
|
80
|
+
- Default resizer position: `width: 50cqi` → panels shown 50/50
|
|
81
|
+
- Resizer `min-width: 1rem`, `max-width: calc(100cqi - 1rem)` — cannot be dragged beyond edges
|
|
82
|
+
- **Keyboard accessible**: `<figure tabindex="0">` and `<div class="diff-item-1" tabindex="0">` both focusable
|
|
83
|
+
- Focus on `<figure>` → resizer snaps to `min-width: 95cqi` (left panel nearly full)
|
|
84
|
+
- Focus on `diff-item-1` → resizer snaps to `min-width: 5cqi` (right panel nearly full)
|
|
85
|
+
- Snap transitions animated with `transition: min-width 0.3s ease-out`
|
|
86
|
+
|
|
87
|
+
Agents do NOT manage any open/close or drag state — it is fully CSS-driven.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## CONTENT RULES FOR `images[0]` AND `images[1]`
|
|
92
|
+
|
|
93
|
+
Both slots accept **any JSX element**, not just `<img>`. Internal CSS applies to all direct children:
|
|
94
|
+
|
|
95
|
+
```css
|
|
96
|
+
/* Applied to direct children of both diff-item-1 and diff-item-2 */
|
|
97
|
+
position: absolute;
|
|
98
|
+
top: 0;
|
|
99
|
+
bottom: 0;
|
|
100
|
+
left: 0;
|
|
101
|
+
height: 100%;
|
|
102
|
+
width: 100cqi;
|
|
103
|
+
object-fit: cover;
|
|
104
|
+
object-position: center;
|
|
105
|
+
pointer-events: none;
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### What this means for agents:
|
|
109
|
+
|
|
110
|
+
- **`<img>`**: works perfectly — `object-fit: cover` is applied automatically
|
|
111
|
+
- **`<div>`**: also works — div fills the full panel area. Use `grid place-content-center` or flex for internal layout
|
|
112
|
+
- **Interactive elements inside panels**: will NOT work — `pointer-events: none` is applied to all children. Do NOT put buttons, links, or inputs inside `images`
|
|
113
|
+
- **Do NOT add layout wrappers** around the img/div — children are positioned absolutely with `width: 100cqi`
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## ASPECT RATIO
|
|
118
|
+
|
|
119
|
+
- Root `<figure>` always has class `aspect-video` (16:9 ratio) applied by default
|
|
120
|
+
- To change aspect ratio, override via `class` prop:
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
// Square
|
|
124
|
+
<Diff images={[...]} class="aspect-square" />
|
|
125
|
+
|
|
126
|
+
// Custom ratio
|
|
127
|
+
<Diff images={[...]} class="aspect-4/3" />
|
|
128
|
+
|
|
129
|
+
// Fixed height
|
|
130
|
+
<Diff images={[...]} class="h-100" />
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## USAGE PATTERNS
|
|
136
|
+
|
|
137
|
+
### Pattern 1 — Image vs image (most common)
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
<Diff
|
|
141
|
+
images={[
|
|
142
|
+
<img alt="before" src="/images/before.webp" />,
|
|
143
|
+
<img alt="after" src="/images/after.webp" />,
|
|
144
|
+
]}
|
|
145
|
+
/>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Pattern 2 — Image vs custom div content
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
<Diff
|
|
152
|
+
images={[
|
|
153
|
+
<img alt="photo" src="/images/photo.webp" />,
|
|
154
|
+
<div class="bg-base-200 text-base-content grid place-content-center text-6xl font-black">
|
|
155
|
+
BEFORE
|
|
156
|
+
</div>,
|
|
157
|
+
]}
|
|
158
|
+
/>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Pattern 3 — Custom aspect ratio
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
<Diff
|
|
165
|
+
class="aspect-square w-100"
|
|
166
|
+
images={[
|
|
167
|
+
<img alt="original" src="/images/original.webp" />,
|
|
168
|
+
<img alt="filtered" src="/images/filtered.webp" />,
|
|
169
|
+
]}
|
|
170
|
+
/>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Pattern 4 — Two styled div panels
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
<Diff
|
|
177
|
+
images={[
|
|
178
|
+
<div class="bg-primary text-primary-content grid place-content-center text-4xl font-bold">
|
|
179
|
+
Dark Mode
|
|
180
|
+
</div>,
|
|
181
|
+
<div class="bg-base-100 text-base-content grid place-content-center text-4xl font-bold">
|
|
182
|
+
Light Mode
|
|
183
|
+
</div>,
|
|
184
|
+
]}
|
|
185
|
+
/>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## BEHAVIOR NOTES FOR AGENTS
|
|
191
|
+
|
|
192
|
+
1. **`images[0]` = left (foreground), `images[1]` = right (background)** — the order determines which panel is clipped by the drag handle. Left panel sits on top and is revealed by dragging right.
|
|
193
|
+
|
|
194
|
+
2. **Component is a `<figure>` element** — semantically appropriate for media comparison. Root is not a `<div>`.
|
|
195
|
+
|
|
196
|
+
3. **`pointer-events: none` on all panel children** — nothing inside `images[0]` or `images[1]` can be clicked, hovered, or interacted with. Only the resizer handle is interactive.
|
|
197
|
+
|
|
198
|
+
4. **No JS drag state** — the drag interaction is entirely driven by the native browser `resize: horizontal` CSS property on `.diff-resizer`. No SolidJS signals or event handlers involved.
|
|
199
|
+
|
|
200
|
+
5. **`class` prop targets the root `<figure>` only** — cannot target internal `.diff-item-1`, `.diff-item-2`, or `.diff-resizer` via this prop.
|
|
201
|
+
|
|
202
|
+
6. **Width fills container** — root `<figure>` has `width: 100%`. Wrap in a sized container or use `class="w-[500px]"` to constrain.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## COMMON MISTAKES TO AVOID
|
|
207
|
+
|
|
208
|
+
| Mistake | Correct approach |
|
|
209
|
+
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
|
210
|
+
| Passing 1 or 3+ items in `images` | Always pass exactly 2 elements — no more, no less |
|
|
211
|
+
| Putting interactive elements (buttons, links) inside `images` | `pointer-events: none` blocks all interactions inside panels |
|
|
212
|
+
| Wrapping `<img>` in an extra `<div>` | Pass `<img>` directly — children are already positioned absolutely to fill the panel |
|
|
213
|
+
| Expecting `class` to style inner panels | `class` only applies to the root `<figure>` |
|
|
214
|
+
| Assuming left panel is `images[1]` | `images[0]` = left/foreground (clipped), `images[1]` = right/background |
|
|
215
|
+
| Using without a sized container | Add `w-full`, `w-[Npx]` or similar to control width |
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## FULL EXAMPLE
|
|
220
|
+
|
|
221
|
+
```tsx
|
|
222
|
+
import { Diff } from 'solid-tom-ui';
|
|
223
|
+
|
|
224
|
+
// Image comparison
|
|
225
|
+
<Diff
|
|
226
|
+
images={[
|
|
227
|
+
<img alt="sharp" src="/images/sharp.webp" />,
|
|
228
|
+
<img alt="blurred" src="/images/blurred.webp" />,
|
|
229
|
+
]}
|
|
230
|
+
/>
|
|
231
|
+
|
|
232
|
+
// Image vs label panel, square aspect
|
|
233
|
+
<Diff
|
|
234
|
+
class="aspect-square w-full max-w-lg"
|
|
235
|
+
images={[
|
|
236
|
+
<img alt="photo" src="/images/photo.webp" />,
|
|
237
|
+
<div class="bg-neutral text-neutral-content grid place-content-center text-5xl font-black">
|
|
238
|
+
Solid UI
|
|
239
|
+
</div>,
|
|
240
|
+
]}
|
|
241
|
+
/>
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
> **Unique IDs**: if this component needs to generate HTML `id` attributes, always use `createUniqueId()` from `solid-js` — never `Math.random()` or `Date.now()`.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
## COMPONENT IDENTITY
|
|
2
|
+
- **Import**: `import { Divider } from 'solid-tom-ui';`
|
|
3
|
+
- **Export**: `Divider` (named export)
|
|
4
|
+
- **Framework**: SolidJS
|
|
5
|
+
- **Purpose**: Flexible visual separator — renders a plain line or a line with centered content (text, icons, badges); supports horizontal and vertical orientations
|
|
6
|
+
|
|
7
|
+
## Props
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Default | Description |
|
|
10
|
+
| ------------- | --------------------------------------------- | -------------- | --------------------------------------------------------------------------- |
|
|
11
|
+
| `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | Direction of the dividing line |
|
|
12
|
+
| `variant` | `'solid' \| 'dashed' \| 'dotted'` | `'solid'` | Border style of the line |
|
|
13
|
+
| `align` | `'start' \| 'center' \| 'end'` | `'center'` | Position of children content along the line (only applies when children is present) |
|
|
14
|
+
| `thickness` | `1 \| 2 \| 3 \| 4` | `1` | Line thickness in pixels |
|
|
15
|
+
| `color` | `BaseColorProps` | — | Màu hệ thống cho đường kẻ và text content — dùng `--color` CSS variable |
|
|
16
|
+
| `class` | `Partial<Record<'root' \| 'line' \| 'content', string>>` | — | Override classes for individual slots (see Class Slots below) |
|
|
17
|
+
| `children` | `JSX.Element` | — | Content rendered between the two line segments |
|
|
18
|
+
|
|
19
|
+
## Class Slots
|
|
20
|
+
|
|
21
|
+
`Divider` exposes a unified `class` prop with three named slots:
|
|
22
|
+
|
|
23
|
+
| Slot | Element | When available |
|
|
24
|
+
| --------- | -------------------------------------------- | ------------------ |
|
|
25
|
+
| `root` | `<hr>` (plain) or `<div>` (with children) | Always |
|
|
26
|
+
| `line` | Both leading and trailing line segments | Only with children |
|
|
27
|
+
| `content` | `<span>` wrapping children content | Only with children |
|
|
28
|
+
|
|
29
|
+
> **CSS encoding**: internal CSS classes use short encoded names (e.g. `dv01`, `dv02`) per project convention.
|
|
30
|
+
|
|
31
|
+
## Render Behavior
|
|
32
|
+
|
|
33
|
+
The component has two distinct render paths:
|
|
34
|
+
|
|
35
|
+
- **No children** → renders a single `<hr>` element (plain line, zero markup overhead).
|
|
36
|
+
- **With children** → renders a `<div>` containing a leading line, a content `<span>`, and a trailing line. The `align` prop controls how flex space is distributed between the two segments.
|
|
37
|
+
|
|
38
|
+
## Basic Usage
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
// Plain horizontal line
|
|
42
|
+
<Divider />
|
|
43
|
+
|
|
44
|
+
// Dashed / dotted
|
|
45
|
+
<Divider variant="dashed" />
|
|
46
|
+
<Divider variant="dotted" />
|
|
47
|
+
|
|
48
|
+
// With label
|
|
49
|
+
<Divider>OR</Divider>
|
|
50
|
+
<Divider>Section Title</Divider>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Alignment
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
<Divider align="start">Left-aligned label</Divider>
|
|
57
|
+
<Divider align="center">Center (default)</Divider>
|
|
58
|
+
<Divider align="end">Right-aligned label</Divider>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Thickness
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
<Divider thickness={1}>1px (default)</Divider>
|
|
65
|
+
<Divider thickness={2}>2px</Divider>
|
|
66
|
+
<Divider thickness={3}>3px</Divider>
|
|
67
|
+
<Divider thickness={4}>4px</Divider>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Custom Line Color
|
|
71
|
+
|
|
72
|
+
Use `class={{ line: '...' }}` to override the line color. This class is applied to **both** line segments.
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
<Divider class={{ line: 'border-primary/50' }}>Primary</Divider>
|
|
76
|
+
<Divider class={{ line: 'border-error/60' }} variant="dotted">Error</Divider>
|
|
77
|
+
<Divider class={{ line: 'border-amber-400/60' }} thickness={2}>Amber</Divider>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Custom Children (Icons, Badges)
|
|
81
|
+
|
|
82
|
+
Any JSX can be passed as children:
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
// Badge
|
|
86
|
+
<Divider class={{ line: 'border-primary/40' }}>
|
|
87
|
+
<span class="bg-primary/10 text-primary rounded-full px-3 py-0.5 text-xs font-semibold">
|
|
88
|
+
New Section
|
|
89
|
+
</span>
|
|
90
|
+
</Divider>
|
|
91
|
+
|
|
92
|
+
// Icon + text
|
|
93
|
+
<Divider class={{ line: 'border-success/40' }} variant="dashed">
|
|
94
|
+
<span class="text-success flex items-center gap-1.5 text-sm font-medium">
|
|
95
|
+
<CheckIcon class="h-3.5 w-3.5" />
|
|
96
|
+
Completed
|
|
97
|
+
</span>
|
|
98
|
+
</Divider>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Vertical Divider
|
|
102
|
+
|
|
103
|
+
Use `orientation="vertical"` to create a vertical separator inside a flex row. The parent **must** use `items-stretch` (or set an explicit height) for the line to fill the available space.
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
// Plain vertical line between items
|
|
107
|
+
<div class="flex items-stretch gap-4">
|
|
108
|
+
<span>Left</span>
|
|
109
|
+
<Divider orientation="vertical" />
|
|
110
|
+
<span>Right</span>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
// Vertical with label (parent needs an explicit height)
|
|
114
|
+
<div class="flex h-32 items-stretch gap-4">
|
|
115
|
+
<span class="flex items-center">Panel A</span>
|
|
116
|
+
<Divider orientation="vertical" variant="dashed">OR</Divider>
|
|
117
|
+
<span class="flex items-center">Panel B</span>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
// Colored vertical line
|
|
121
|
+
<Divider orientation="vertical" class={{ line: 'border-primary/40' }} />
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Real-world Example — Login Form
|
|
125
|
+
|
|
126
|
+
```tsx
|
|
127
|
+
<div class="space-y-4">
|
|
128
|
+
<button class="btn btn-primary w-full">Continue with Google</button>
|
|
129
|
+
<button class="btn btn-neutral btn-outline w-full">Continue with GitHub</button>
|
|
130
|
+
<Divider>OR</Divider>
|
|
131
|
+
<input class="input input-bordered w-full" placeholder="Email address" />
|
|
132
|
+
<button class="btn btn-primary w-full">Sign in</button>
|
|
133
|
+
</div>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Accessibility
|
|
137
|
+
|
|
138
|
+
- Both render paths emit `role="separator"` and `aria-orientation` matching the `orientation` prop.
|
|
139
|
+
- Content inside `children` is wrapped in a `<span>` with `select-none` to prevent accidental text selection of decorative labels.
|
|
140
|
+
|
|
141
|
+
## Common Mistakes
|
|
142
|
+
|
|
143
|
+
| Mistake | Fix |
|
|
144
|
+
| --- | --- |
|
|
145
|
+
| Using `class="border-primary"` as string | `class` is now a slot object — use `class={{ root: '...' }}` |
|
|
146
|
+
| Coloring lines without effect | Use `class={{ line: 'border-primary/50' }}`, not `class={{ root: '...' }}` |
|
|
147
|
+
| Vertical divider not visible | Ensure parent has `items-stretch` or a fixed height |
|
|
148
|
+
| `align` has no effect | `align` only works when `children` is provided |
|
|
149
|
+
| `line` / `content` slots not applying | These slots only apply when `children` is present |
|
|
150
|
+
|
|
151
|
+
> **Unique IDs**: if this component needs to generate HTML `id` attributes, always use `createUniqueId()` from `solid-js` — never `Math.random()` or `Date.now()`.
|