@luzmo/lucero 1.0.1-alpha.82 → 1.0.1-alpha.84
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/README.dist.md +94 -0
- package/README.md +480 -69
- package/dist/LICENSE +16 -0
- package/dist/README.md +94 -0
- package/{components → dist/components}/action-menu/index.cjs +1 -1
- package/{components → dist/components}/action-menu/index.js +1 -1
- package/{components/action-menu-CxDKUjMI.cjs → dist/components/action-menu-CJyB0mmO.cjs} +1 -1
- package/{components/action-menu-CoL6H5DW.js → dist/components/action-menu-FiS1vhW7.js} +1 -1
- package/dist/components/chat-message/index.cjs +18 -0
- package/{components → dist/components}/chat-message/index.js +1 -1
- package/{components/chat-message-D0w4eA3E.cjs → dist/components/chat-message-CNE-mGuP.cjs} +1 -1
- package/{components/chat-message-CoT3CcJv.js → dist/components/chat-message-DJgocVNj.js} +1 -1
- package/dist/components/index.cjs +18 -0
- package/{components → dist/components}/index.js +15 -14
- package/{components → dist/components}/menu/index.cjs +1 -1
- package/{components → dist/components}/menu/index.js +1 -1
- package/{components/menu-CAUpKCpi.js → dist/components/menu--ukVtSq7.js} +1 -1
- package/{components/menu-VfLGjKpA.cjs → dist/components/menu-DAA51y45.cjs} +1 -1
- package/{components → dist/components}/options/index.cjs +1 -1
- package/{components → dist/components}/options/index.js +1 -1
- package/{components/options-COEUg184.cjs → dist/components/options-BPNAm4MW.cjs} +1 -1
- package/{components/options-BqQ0AbDb.js → dist/components/options-Dz-ejkxF.js} +1 -1
- package/{components → dist/components}/picker/index.cjs +1 -1
- package/{components → dist/components}/picker/index.js +1 -1
- package/{components/picker-DY0tXRQl.cjs → dist/components/picker-C4RVOxLq.cjs} +1 -1
- package/{components/picker-DL-eOn9O.js → dist/components/picker-agQW7YNo.js} +1 -1
- package/dist/components/select/index.cjs +18 -0
- package/{components → dist/components}/select/index.js +1 -1
- package/{components/select-5LijJqtV.cjs → dist/components/select--vrG59GQ.cjs} +1 -1
- package/{components/select-vJh47cZ5.js → dist/components/select-DPeI0jP9.js} +1 -1
- package/dist/components/skeleton-loader/index.cjs +18 -0
- package/dist/components/skeleton-loader/index.d.ts +7 -0
- package/dist/components/skeleton-loader/index.js +25 -0
- package/dist/components/skeleton-loader/skeleton-loader.d.ts +22 -0
- package/dist/components/skeleton-loader-B8NgELvX.cjs +18 -0
- package/dist/components/skeleton-loader-C1XG3m_u.js +46 -0
- package/dist/components/slider/index.cjs +18 -0
- package/{components → dist/components}/slider/index.js +1 -1
- package/dist/components/status-light/index.cjs +18 -0
- package/{components → dist/components}/status-light/index.js +1 -1
- package/dist/components/suggestion/index.cjs +18 -0
- package/{components → dist/components}/suggestion/index.js +1 -1
- package/dist/components/switch/index.cjs +18 -0
- package/{components → dist/components}/switch/index.js +1 -1
- package/{components → dist/components}/tabs/index.cjs +1 -1
- package/{components → dist/components}/tabs/index.js +1 -1
- package/{components/tabs-BXqhaKKj.cjs → dist/components/tabs-BfTgzdid.cjs} +1 -1
- package/{components/tabs-0fYsddQN.js → dist/components/tabs-BthdwrmW.js} +1 -1
- package/{components → dist/components}/toast/index.cjs +1 -1
- package/{components → dist/components}/toast/index.js +1 -1
- package/dist/components/top-nav/index.cjs +18 -0
- package/{components → dist/components}/top-nav/index.js +1 -1
- package/{components/top-nav-CMVB3G_v.js → dist/components/top-nav-DVQ5ASMa.js} +1 -1
- package/{components/top-nav-bekRXHUk.cjs → dist/components/top-nav-DlTojz8S.cjs} +1 -1
- package/{custom-elements.json → dist/custom-elements.json} +1 -1
- package/{index.d.ts → dist/index.d.ts} +1 -0
- package/dist/package.json +399 -0
- package/package.json +141 -373
- package/components/chat-message/index.cjs +0 -18
- package/components/index.cjs +0 -18
- package/components/select/index.cjs +0 -18
- package/components/slider/index.cjs +0 -18
- package/components/status-light/index.cjs +0 -18
- package/components/suggestion/index.cjs +0 -18
- package/components/switch/index.cjs +0 -18
- package/components/top-nav/index.cjs +0 -18
- /package/{components → dist/components}/accordion/accordion-item.d.ts +0 -0
- /package/{components → dist/components}/accordion/accordion.d.ts +0 -0
- /package/{components → dist/components}/accordion/index.cjs +0 -0
- /package/{components → dist/components}/accordion/index.d.ts +0 -0
- /package/{components → dist/components}/accordion/index.js +0 -0
- /package/{components → dist/components}/accordion-BHBIfsLU.cjs +0 -0
- /package/{components → dist/components}/accordion-DC7cjb1c.js +0 -0
- /package/{components → dist/components}/action-bar/action-bar.d.ts +0 -0
- /package/{components → dist/components}/action-bar/index.cjs +0 -0
- /package/{components → dist/components}/action-bar/index.d.ts +0 -0
- /package/{components → dist/components}/action-bar/index.js +0 -0
- /package/{components → dist/components}/action-bar-BMHZ4e_p.cjs +0 -0
- /package/{components → dist/components}/action-bar-CmLjsljR.js +0 -0
- /package/{components → dist/components}/action-button/action-button.d.ts +0 -0
- /package/{components → dist/components}/action-button/index.cjs +0 -0
- /package/{components → dist/components}/action-button/index.d.ts +0 -0
- /package/{components → dist/components}/action-button/index.js +0 -0
- /package/{components → dist/components}/action-button-B4_UEJle.js +0 -0
- /package/{components → dist/components}/action-button-G0PWSrZo.cjs +0 -0
- /package/{components → dist/components}/action-group/action-group.d.ts +0 -0
- /package/{components → dist/components}/action-group/index.cjs +0 -0
- /package/{components → dist/components}/action-group/index.d.ts +0 -0
- /package/{components → dist/components}/action-group/index.js +0 -0
- /package/{components → dist/components}/action-group-CH8FTW0i.cjs +0 -0
- /package/{components → dist/components}/action-group-DYKpp-mz.js +0 -0
- /package/{components → dist/components}/action-menu/action-menu.d.ts +0 -0
- /package/{components → dist/components}/action-menu/index.d.ts +0 -0
- /package/{components → dist/components}/avatar/avatar.d.ts +0 -0
- /package/{components → dist/components}/avatar/index.cjs +0 -0
- /package/{components → dist/components}/avatar/index.d.ts +0 -0
- /package/{components → dist/components}/avatar/index.js +0 -0
- /package/{components → dist/components}/avatar-CyY_ZSD0.js +0 -0
- /package/{components → dist/components}/avatar-PulwjkMI.cjs +0 -0
- /package/{components → dist/components}/badge/badge.d.ts +0 -0
- /package/{components → dist/components}/badge/index.cjs +0 -0
- /package/{components → dist/components}/badge/index.d.ts +0 -0
- /package/{components → dist/components}/badge/index.js +0 -0
- /package/{components → dist/components}/badge-D1Ry32wi.cjs +0 -0
- /package/{components → dist/components}/badge-D6p2hPj8.js +0 -0
- /package/{components → dist/components}/button/button-base.d.ts +0 -0
- /package/{components → dist/components}/button/button.d.ts +0 -0
- /package/{components → dist/components}/button/clear-button.d.ts +0 -0
- /package/{components → dist/components}/button/close-button.d.ts +0 -0
- /package/{components → dist/components}/button/index.cjs +0 -0
- /package/{components → dist/components}/button/index.d.ts +0 -0
- /package/{components → dist/components}/button/index.js +0 -0
- /package/{components → dist/components}/button-CRNRP8P0.js +0 -0
- /package/{components → dist/components}/button-D3ZTogni.cjs +0 -0
- /package/{components → dist/components}/button-base-BYV3Lp3P.cjs +0 -0
- /package/{components → dist/components}/button-base-SHgEJgk2.js +0 -0
- /package/{components → dist/components}/button-group/button-group.d.ts +0 -0
- /package/{components → dist/components}/button-group/index.cjs +0 -0
- /package/{components → dist/components}/button-group/index.d.ts +0 -0
- /package/{components → dist/components}/button-group/index.js +0 -0
- /package/{components → dist/components}/button-group-CJVpgiLq.js +0 -0
- /package/{components → dist/components}/button-group-rEK_YaF3.cjs +0 -0
- /package/{components → dist/components}/calendar/calendar.d.ts +0 -0
- /package/{components → dist/components}/calendar/index.cjs +0 -0
- /package/{components → dist/components}/calendar/index.d.ts +0 -0
- /package/{components → dist/components}/calendar/index.js +0 -0
- /package/{components → dist/components}/calendar-CKr5T_zV.js +0 -0
- /package/{components → dist/components}/calendar-WRhzTEyZ.cjs +0 -0
- /package/{components → dist/components}/chat-message/chat-message.d.ts +0 -0
- /package/{components → dist/components}/chat-message/index.d.ts +0 -0
- /package/{components → dist/components}/chat-message-group/chat-message-group.d.ts +0 -0
- /package/{components → dist/components}/chat-message-group/index.cjs +0 -0
- /package/{components → dist/components}/chat-message-group/index.d.ts +0 -0
- /package/{components → dist/components}/chat-message-group/index.js +0 -0
- /package/{components → dist/components}/chat-message-group-B4U2MzHx.js +0 -0
- /package/{components → dist/components}/chat-message-group-COmhCN-R.cjs +0 -0
- /package/{components → dist/components}/checkbox/checkbox-base.d.ts +0 -0
- /package/{components → dist/components}/checkbox/checkbox-mixin.d.ts +0 -0
- /package/{components → dist/components}/checkbox/checkbox.d.ts +0 -0
- /package/{components → dist/components}/checkbox/index.cjs +0 -0
- /package/{components → dist/components}/checkbox/index.d.ts +0 -0
- /package/{components → dist/components}/checkbox/index.js +0 -0
- /package/{components → dist/components}/checkbox-CPS-tR_i.js +0 -0
- /package/{components → dist/components}/checkbox-DFwDrIdY.cjs +0 -0
- /package/{components → dist/components}/checkbox-mixin-C5sLMo5L.js +0 -0
- /package/{components → dist/components}/checkbox-mixin-D4HeLrMj.cjs +0 -0
- /package/{components → dist/components}/chunk-D-qHiVGv.cjs +0 -0
- /package/{components → dist/components}/close-button-BeXYep8K.js +0 -0
- /package/{components → dist/components}/close-button-BzapEpcF.cjs +0 -0
- /package/{components → dist/components}/color-area/color-area.d.ts +0 -0
- /package/{components → dist/components}/color-area/index.cjs +0 -0
- /package/{components → dist/components}/color-area/index.d.ts +0 -0
- /package/{components → dist/components}/color-area/index.js +0 -0
- /package/{components → dist/components}/color-area-DA3ps2-c.cjs +0 -0
- /package/{components → dist/components}/color-area-DViRjuKo.js +0 -0
- /package/{components → dist/components}/color-controller-DueaXfnX.cjs +0 -0
- /package/{components → dist/components}/color-controller-G2_v2xSl.js +0 -0
- /package/{components → dist/components}/color-field/color-field.d.ts +0 -0
- /package/{components → dist/components}/color-field/index.cjs +0 -0
- /package/{components → dist/components}/color-field/index.d.ts +0 -0
- /package/{components → dist/components}/color-field/index.js +0 -0
- /package/{components → dist/components}/color-field-CxdIoSq6.js +0 -0
- /package/{components → dist/components}/color-field-D7_7z2A2.cjs +0 -0
- /package/{components → dist/components}/color-handle/color-handle.d.ts +0 -0
- /package/{components → dist/components}/color-handle/index.cjs +0 -0
- /package/{components → dist/components}/color-handle/index.d.ts +0 -0
- /package/{components → dist/components}/color-handle/index.js +0 -0
- /package/{components → dist/components}/color-handle-BOusOFFx.js +0 -0
- /package/{components → dist/components}/color-handle-Cka48yPY.cjs +0 -0
- /package/{components → dist/components}/color-loupe/color-loupe.d.ts +0 -0
- /package/{components → dist/components}/color-loupe/index.cjs +0 -0
- /package/{components → dist/components}/color-loupe/index.d.ts +0 -0
- /package/{components → dist/components}/color-loupe/index.js +0 -0
- /package/{components → dist/components}/color-loupe-DMk8uWZW.cjs +0 -0
- /package/{components → dist/components}/color-loupe-bEzi2P0y.js +0 -0
- /package/{components → dist/components}/color-menu/color-menu.d.ts +0 -0
- /package/{components → dist/components}/color-menu/index.cjs +0 -0
- /package/{components → dist/components}/color-menu/index.d.ts +0 -0
- /package/{components → dist/components}/color-menu/index.js +0 -0
- /package/{components → dist/components}/color-menu-DwbTxeqv.cjs +0 -0
- /package/{components → dist/components}/color-menu-Lxc9PTzl.js +0 -0
- /package/{components → dist/components}/color-palette/color-palette.d.ts +0 -0
- /package/{components → dist/components}/color-palette/index.cjs +0 -0
- /package/{components → dist/components}/color-palette/index.d.ts +0 -0
- /package/{components → dist/components}/color-palette/index.js +0 -0
- /package/{components → dist/components}/color-palette-349EkPMg.cjs +0 -0
- /package/{components → dist/components}/color-palette-BAdaNySC.js +0 -0
- /package/{components → dist/components}/color-palette-group/color-palette-group.d.ts +0 -0
- /package/{components → dist/components}/color-palette-group/index.cjs +0 -0
- /package/{components → dist/components}/color-palette-group/index.d.ts +0 -0
- /package/{components → dist/components}/color-palette-group/index.js +0 -0
- /package/{components → dist/components}/color-palette-group-BvP09zmT.cjs +0 -0
- /package/{components → dist/components}/color-palette-group-D8Mavsd2.js +0 -0
- /package/{components → dist/components}/color-picker/color-picker.d.ts +0 -0
- /package/{components → dist/components}/color-picker/index.cjs +0 -0
- /package/{components → dist/components}/color-picker/index.d.ts +0 -0
- /package/{components → dist/components}/color-picker/index.js +0 -0
- /package/{components → dist/components}/color-picker-CSWiU-X5.cjs +0 -0
- /package/{components → dist/components}/color-picker-DqjfTvYf.js +0 -0
- /package/{components → dist/components}/color-slider/color-slider.d.ts +0 -0
- /package/{components → dist/components}/color-slider/index.cjs +0 -0
- /package/{components → dist/components}/color-slider/index.d.ts +0 -0
- /package/{components → dist/components}/color-slider/index.js +0 -0
- /package/{components → dist/components}/color-slider-DxjJ72ue.cjs +0 -0
- /package/{components → dist/components}/color-slider-ihAIFt5p.js +0 -0
- /package/{components → dist/components}/condition-attribute-with-id-DauPaLSS.cjs +0 -0
- /package/{components → dist/components}/condition-attribute-with-id-Duo51HZ7.js +0 -0
- /package/{components → dist/components}/date-range-picker/date-range-picker.d.ts +0 -0
- /package/{components → dist/components}/date-range-picker/index.cjs +0 -0
- /package/{components → dist/components}/date-range-picker/index.d.ts +0 -0
- /package/{components → dist/components}/date-range-picker/index.js +0 -0
- /package/{components → dist/components}/date-range-picker/types.d.ts +0 -0
- /package/{components → dist/components}/date-range-picker-BdRQep--.js +0 -0
- /package/{components → dist/components}/date-range-picker-CgitOe0i.cjs +0 -0
- /package/{components → dist/components}/date-time-picker/date-time-picker.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/index.cjs +0 -0
- /package/{components → dist/components}/date-time-picker/index.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/index.js +0 -0
- /package/{components → dist/components}/date-time-picker/shared/helpers.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/date/day-segment.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/date/month-segment.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/date/year-segment.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/date-time-segments.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/editable-segment.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/literal-segment.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/modifiers/clear-modifier.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/modifiers/decrement-modifier.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/modifiers/increment-modifier.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/modifiers/input-modifier.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/modifiers/segments-modifier.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/segments-factory.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/segments-formatter.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/time/day-period-segment.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/time/hour-segment.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/time/millisecond-segment.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/time/minute-segment.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/segments/time/second-segment.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker/shared/types.d.ts +0 -0
- /package/{components → dist/components}/date-time-picker-Bz8XwSOR.cjs +0 -0
- /package/{components → dist/components}/date-time-picker-Ct_ln8Ot.js +0 -0
- /package/{components → dist/components}/decorate-B2wePfNm.cjs +0 -0
- /package/{components → dist/components}/decorate-aGxJUVxg.js +0 -0
- /package/{components → dist/components}/dependency-manger-CHy9t__e.cjs +0 -0
- /package/{components → dist/components}/dependency-manger-DMrulWcJ.js +0 -0
- /package/{components → dist/components}/divider/divider.d.ts +0 -0
- /package/{components → dist/components}/divider/index.cjs +0 -0
- /package/{components → dist/components}/divider/index.d.ts +0 -0
- /package/{components → dist/components}/divider/index.js +0 -0
- /package/{components → dist/components}/divider-Dn8XqbB6.cjs +0 -0
- /package/{components → dist/components}/divider-cU0lVwOp.js +0 -0
- /package/{components → dist/components}/divider.module-C65RfSUa.js +0 -0
- /package/{components → dist/components}/divider.module-CL60P_z8.cjs +0 -0
- /package/{components → dist/components}/element-resolution-Bs1x89vU.js +0 -0
- /package/{components → dist/components}/element-resolution-C0aiOB0Y.cjs +0 -0
- /package/{components → dist/components}/field-group/field-group.d.ts +0 -0
- /package/{components → dist/components}/field-group/index.cjs +0 -0
- /package/{components → dist/components}/field-group/index.d.ts +0 -0
- /package/{components → dist/components}/field-group/index.js +0 -0
- /package/{components → dist/components}/field-group-C7ROsWq3.js +0 -0
- /package/{components → dist/components}/field-group-OcI5Lgu7.cjs +0 -0
- /package/{components → dist/components}/field-label/field-label.d.ts +0 -0
- /package/{components → dist/components}/field-label/index.cjs +0 -0
- /package/{components → dist/components}/field-label/index.d.ts +0 -0
- /package/{components → dist/components}/field-label/index.js +0 -0
- /package/{components → dist/components}/field-label-BCl6R1uO.cjs +0 -0
- /package/{components → dist/components}/field-label-CtGCEmdp.js +0 -0
- /package/{components → dist/components}/focus-group-BshI1RpM.js +0 -0
- /package/{components → dist/components}/focus-group-SF8Kj7iB.cjs +0 -0
- /package/{components → dist/components}/focus-visible-B0NNezGc.cjs +0 -0
- /package/{components → dist/components}/focus-visible-CrooVCUu.js +0 -0
- /package/{components → dist/components}/focusable-BmS8IzhH.js +0 -0
- /package/{components → dist/components}/focusable-CupEoHmn.cjs +0 -0
- /package/{components → dist/components}/focusable-selectors-5n5liBn0.cjs +0 -0
- /package/{components → dist/components}/focusable-selectors-Bg60_Kra.js +0 -0
- /package/{components → dist/components}/get-label-from-slot-5vVnfSgN.js +0 -0
- /package/{components → dist/components}/get-label-from-slot-LO_DZP60.cjs +0 -0
- /package/{components → dist/components}/icon/icon-base.d.ts +0 -0
- /package/{components → dist/components}/icon/icon.d.ts +0 -0
- /package/{components → dist/components}/icon/index.cjs +0 -0
- /package/{components → dist/components}/icon/index.d.ts +0 -0
- /package/{components → dist/components}/icon/index.js +0 -0
- /package/{components → dist/components}/icon-B7hKwn_q.cjs +0 -0
- /package/{components → dist/components}/icon-CwBAE1eU.js +0 -0
- /package/{components → dist/components}/infield-button/index.cjs +0 -0
- /package/{components → dist/components}/infield-button/index.d.ts +0 -0
- /package/{components → dist/components}/infield-button/index.js +0 -0
- /package/{components → dist/components}/infield-button/infield-button.d.ts +0 -0
- /package/{components → dist/components}/infield-button-B2z0dLzq.js +0 -0
- /package/{components → dist/components}/infield-button-BVKotWqr.cjs +0 -0
- /package/{components → dist/components}/label/index.cjs +0 -0
- /package/{components → dist/components}/label/index.d.ts +0 -0
- /package/{components → dist/components}/label/index.js +0 -0
- /package/{components → dist/components}/label/label.d.ts +0 -0
- /package/{components → dist/components}/label-ClJE2esm.js +0 -0
- /package/{components → dist/components}/label-CqolZbJo.cjs +0 -0
- /package/{components → dist/components}/language-resolution-BYemISJC.cjs +0 -0
- /package/{components → dist/components}/language-resolution-BpfGTC29.js +0 -0
- /package/{components → dist/components}/like-anchor-BZJXts_H.cjs +0 -0
- /package/{components → dist/components}/like-anchor-DeOXX-MX.js +0 -0
- /package/{components → dist/components}/manage-help-text-CF0xBh0F.js +0 -0
- /package/{components → dist/components}/manage-help-text-D9VbYRf_.cjs +0 -0
- /package/{components → dist/components}/menu/index.d.ts +0 -0
- /package/{components → dist/components}/menu/menu-divider.d.ts +0 -0
- /package/{components → dist/components}/menu/menu-group.d.ts +0 -0
- /package/{components → dist/components}/menu/menu-item.d.ts +0 -0
- /package/{components → dist/components}/menu/menu.d.ts +0 -0
- /package/{components → dist/components}/multi-language-field/index.cjs +0 -0
- /package/{components → dist/components}/multi-language-field/index.d.ts +0 -0
- /package/{components → dist/components}/multi-language-field/index.js +0 -0
- /package/{components → dist/components}/multi-language-field/multi-language-field.d.ts +0 -0
- /package/{components → dist/components}/multi-language-field-BzY75rOY.js +0 -0
- /package/{components → dist/components}/multi-language-field-DmoMyCBH.cjs +0 -0
- /package/{components → dist/components}/number-field/index.cjs +0 -0
- /package/{components → dist/components}/number-field/index.d.ts +0 -0
- /package/{components → dist/components}/number-field/index.js +0 -0
- /package/{components → dist/components}/number-field/number-field.d.ts +0 -0
- /package/{components → dist/components}/number-field-B4RSFeTR.cjs +0 -0
- /package/{components → dist/components}/number-field-C66dTUMM.js +0 -0
- /package/{components → dist/components}/observe-slot-presence-BCqd3VSd.js +0 -0
- /package/{components → dist/components}/observe-slot-presence-Dx8hzNzK.cjs +0 -0
- /package/{components → dist/components}/observe-slot-text-BhTcGuHY.cjs +0 -0
- /package/{components → dist/components}/observe-slot-text-Ddf1OC6F.js +0 -0
- /package/{components → dist/components}/options/index.d.ts +0 -0
- /package/{components → dist/components}/options/option.d.ts +0 -0
- /package/{components → dist/components}/options/options-divider.d.ts +0 -0
- /package/{components → dist/components}/options/options.d.ts +0 -0
- /package/{components → dist/components}/overlay/abstract-overlay.d.ts +0 -0
- /package/{components → dist/components}/overlay/click-controller.d.ts +0 -0
- /package/{components → dist/components}/overlay/events.d.ts +0 -0
- /package/{components → dist/components}/overlay/full-size-plugin.d.ts +0 -0
- /package/{components → dist/components}/overlay/hover-controller.d.ts +0 -0
- /package/{components → dist/components}/overlay/index.cjs +0 -0
- /package/{components → dist/components}/overlay/index.d.ts +0 -0
- /package/{components → dist/components}/overlay/index.js +0 -0
- /package/{components → dist/components}/overlay/interaction-controller.d.ts +0 -0
- /package/{components → dist/components}/overlay/loader.d.ts +0 -0
- /package/{components → dist/components}/overlay/longpress-controller.d.ts +0 -0
- /package/{components → dist/components}/overlay/overlay-dialog.d.ts +0 -0
- /package/{components → dist/components}/overlay/overlay-events.d.ts +0 -0
- /package/{components → dist/components}/overlay/overlay-no-popover.d.ts +0 -0
- /package/{components → dist/components}/overlay/overlay-popover.d.ts +0 -0
- /package/{components → dist/components}/overlay/overlay-stack.d.ts +0 -0
- /package/{components → dist/components}/overlay/overlay-timer.d.ts +0 -0
- /package/{components → dist/components}/overlay/overlay-trigger-directive.d.ts +0 -0
- /package/{components → dist/components}/overlay/overlay-trigger.d.ts +0 -0
- /package/{components → dist/components}/overlay/overlay-types.d.ts +0 -0
- /package/{components → dist/components}/overlay/overlay.d.ts +0 -0
- /package/{components → dist/components}/overlay/placement-controller.d.ts +0 -0
- /package/{components → dist/components}/overlay/slottable-request-directive.d.ts +0 -0
- /package/{components → dist/components}/overlay/slottable-request-event.d.ts +0 -0
- /package/{components → dist/components}/overlay/strategies.d.ts +0 -0
- /package/{components → dist/components}/overlay/virtual-trigger.d.ts +0 -0
- /package/{components → dist/components}/overlay-8tN0KPbR.js +0 -0
- /package/{components → dist/components}/overlay-CMd2Dnpv.cjs +0 -0
- /package/{components → dist/components}/overlay-CwR_36OV.js +0 -0
- /package/{components → dist/components}/overlay-DdrfkOry.cjs +0 -0
- /package/{components → dist/components}/pending-state-DFcNf5rd.js +0 -0
- /package/{components → dist/components}/pending-state-DIeF18qg.cjs +0 -0
- /package/{components → dist/components}/picker/index.d.ts +0 -0
- /package/{components → dist/components}/picker/picker.d.ts +0 -0
- /package/{components → dist/components}/picker-button/index.cjs +0 -0
- /package/{components → dist/components}/picker-button/index.d.ts +0 -0
- /package/{components → dist/components}/picker-button/index.js +0 -0
- /package/{components → dist/components}/picker-button/picker-button.d.ts +0 -0
- /package/{components → dist/components}/picker-button-BLbeT3Yu.js +0 -0
- /package/{components → dist/components}/picker-button-D34YXyXp.cjs +0 -0
- /package/{components → dist/components}/platform-B7Sk7Qon.cjs +0 -0
- /package/{components → dist/components}/platform-D4V_cOJF.js +0 -0
- /package/{components → dist/components}/popover/index.cjs +0 -0
- /package/{components → dist/components}/popover/index.d.ts +0 -0
- /package/{components → dist/components}/popover/index.js +0 -0
- /package/{components → dist/components}/popover/popover.d.ts +0 -0
- /package/{components → dist/components}/popover-DyC9xGhX.js +0 -0
- /package/{components → dist/components}/popover-dgL04x6P.cjs +0 -0
- /package/{components → dist/components}/progress-bar/index.cjs +0 -0
- /package/{components → dist/components}/progress-bar/index.d.ts +0 -0
- /package/{components → dist/components}/progress-bar/index.js +0 -0
- /package/{components → dist/components}/progress-bar/progress-bar.d.ts +0 -0
- /package/{components → dist/components}/progress-bar-BR28tISC.cjs +0 -0
- /package/{components → dist/components}/progress-bar-DHgFRml1.js +0 -0
- /package/{components → dist/components}/progress-circle/index.cjs +0 -0
- /package/{components → dist/components}/progress-circle/index.d.ts +0 -0
- /package/{components → dist/components}/progress-circle/index.js +0 -0
- /package/{components → dist/components}/progress-circle/progress-circle.d.ts +0 -0
- /package/{components → dist/components}/progress-circle-Cg_ua9Ff.js +0 -0
- /package/{components → dist/components}/progress-circle-DuzwUiGN.cjs +0 -0
- /package/{components → dist/components}/progress-steps/index.cjs +0 -0
- /package/{components → dist/components}/progress-steps/index.d.ts +0 -0
- /package/{components → dist/components}/progress-steps/index.js +0 -0
- /package/{components → dist/components}/progress-steps/progress-steps.d.ts +0 -0
- /package/{components → dist/components}/progress-steps/types.d.ts +0 -0
- /package/{components → dist/components}/progress-steps-Da8aZWx3.js +0 -0
- /package/{components → dist/components}/progress-steps-WriXaZpE.cjs +0 -0
- /package/{components → dist/components}/prompt-box/controllers/attachments-controller.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/controllers/recording-controller.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/controllers/rich-input-controller.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/controllers/trigger-menu-controller.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/index.cjs +0 -0
- /package/{components → dist/components}/prompt-box/index.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/index.js +0 -0
- /package/{components → dist/components}/prompt-box/keyboard-focus-tracker.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/prompt-box-templates.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/prompt-box.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/range-from-point.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/selection-utils.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/slot-state-sync.d.ts +0 -0
- /package/{components → dist/components}/prompt-box/types.d.ts +0 -0
- /package/{components → dist/components}/prompt-box-Bnnqs_Eg.js +0 -0
- /package/{components → dist/components}/prompt-box-CiipC5xS.cjs +0 -0
- /package/{components → dist/components}/radio/index.cjs +0 -0
- /package/{components → dist/components}/radio/index.d.ts +0 -0
- /package/{components → dist/components}/radio/index.js +0 -0
- /package/{components → dist/components}/radio/radio-group.d.ts +0 -0
- /package/{components → dist/components}/radio/radio.d.ts +0 -0
- /package/{components → dist/components}/radio-BzEPGUmQ.js +0 -0
- /package/{components → dist/components}/radio-d-2GUbYE.cjs +0 -0
- /package/{components → dist/components}/random-id-B51lUxUB.cjs +0 -0
- /package/{components → dist/components}/random-id-Dd4boCPV.js +0 -0
- /package/{components → dist/components}/rolldown-runtime-CAFD8bLK.js +0 -0
- /package/{components → dist/components}/roving-tabindex-B7x5ePUB.cjs +0 -0
- /package/{components → dist/components}/roving-tabindex-BP6mQbXf.js +0 -0
- /package/{components/scaled-indicator-BoLeYSgL.js → dist/components/scaled-indicator-BcO2BOsf.js} +0 -0
- /package/{components/scaled-indicator-DF45Sc3W.cjs → dist/components/scaled-indicator-p8-3k2cJ.cjs} +0 -0
- /package/{components → dist/components}/search/index.cjs +0 -0
- /package/{components → dist/components}/search/index.d.ts +0 -0
- /package/{components → dist/components}/search/index.js +0 -0
- /package/{components → dist/components}/search/search.d.ts +0 -0
- /package/{components → dist/components}/search-CmLfd2dF.js +0 -0
- /package/{components → dist/components}/search-DRTD4xsE.cjs +0 -0
- /package/{components → dist/components}/segments-factory-CHo9oQw7.cjs +0 -0
- /package/{components → dist/components}/segments-factory-D0IveW-q.js +0 -0
- /package/{components → dist/components}/select/index.d.ts +0 -0
- /package/{components → dist/components}/select/select.d.ts +0 -0
- /package/{components → dist/components}/sized-mixin-DaBoZkVS.js +0 -0
- /package/{components → dist/components}/sized-mixin-StFA4y0J.cjs +0 -0
- /package/{components → dist/components}/slider/index.d.ts +0 -0
- /package/{components → dist/components}/slider/slider.d.ts +0 -0
- /package/{components/slider-Fy-VeKrU.js → dist/components/slider-3QBnq0S8.js} +0 -0
- /package/{components/slider-D8w2ipBg.cjs → dist/components/slider-uXRKcOz5.cjs} +0 -0
- /package/{components → dist/components}/slottable-request-event-DZ2Z_BLk.js +0 -0
- /package/{components → dist/components}/slottable-request-event-gAcEQan2.cjs +0 -0
- /package/{components → dist/components}/status-light/index.d.ts +0 -0
- /package/{components → dist/components}/status-light/status-light.d.ts +0 -0
- /package/{components/status-light-DXWPBufE.js → dist/components/status-light-Bf8jGu4G.js} +0 -0
- /package/{components/status-light-BG_kopZQ.cjs → dist/components/status-light-CBaAFRUc.cjs} +0 -0
- /package/{components → dist/components}/strategies-DhxJGIZT.js +0 -0
- /package/{components → dist/components}/strategies-kuvLVIKO.cjs +0 -0
- /package/{components → dist/components}/streaming-listener-2NcP7ys7.js +0 -0
- /package/{components → dist/components}/streaming-listener-BnDW38lt.cjs +0 -0
- /package/{components → dist/components}/suggestion/index.d.ts +0 -0
- /package/{components → dist/components}/suggestion/suggestion.d.ts +0 -0
- /package/{components/suggestion-CoB4dtAn.cjs → dist/components/suggestion-CEJiW_7y.cjs} +0 -0
- /package/{components/suggestion-DFC4JEK1.js → dist/components/suggestion-DK5gxxDI.js} +0 -0
- /package/{components → dist/components}/swatch/index.cjs +0 -0
- /package/{components → dist/components}/swatch/index.d.ts +0 -0
- /package/{components → dist/components}/swatch/index.js +0 -0
- /package/{components → dist/components}/swatch/swatch-group.d.ts +0 -0
- /package/{components → dist/components}/swatch/swatch.d.ts +0 -0
- /package/{components → dist/components}/swatch-BLuV-hlF.js +0 -0
- /package/{components → dist/components}/swatch-G70JUe6I.cjs +0 -0
- /package/{components → dist/components}/switch/index.d.ts +0 -0
- /package/{components → dist/components}/switch/switch.d.ts +0 -0
- /package/{components/switch-C5g5t5x2.js → dist/components/switch-BdE-hI69.js} +0 -0
- /package/{components/switch-COhz9ka9.cjs → dist/components/switch-KzkrF-ob.cjs} +0 -0
- /package/{components → dist/components}/tabs/index.d.ts +0 -0
- /package/{components → dist/components}/tabs/tab-panel.d.ts +0 -0
- /package/{components → dist/components}/tabs/tab.d.ts +0 -0
- /package/{components → dist/components}/tabs/tabs-overflow.d.ts +0 -0
- /package/{components → dist/components}/tabs/tabs.d.ts +0 -0
- /package/{components → dist/components}/tags/index.cjs +0 -0
- /package/{components → dist/components}/tags/index.d.ts +0 -0
- /package/{components → dist/components}/tags/index.js +0 -0
- /package/{components → dist/components}/tags/tag.d.ts +0 -0
- /package/{components → dist/components}/tags/tags.d.ts +0 -0
- /package/{components → dist/components}/tags-D5d4qKdQ.js +0 -0
- /package/{components → dist/components}/tags-DWkhLadz.cjs +0 -0
- /package/{components → dist/components}/text-field/help-text-manager.d.ts +0 -0
- /package/{components → dist/components}/text-field/help-text.d.ts +0 -0
- /package/{components → dist/components}/text-field/index.cjs +0 -0
- /package/{components → dist/components}/text-field/index.d.ts +0 -0
- /package/{components → dist/components}/text-field/index.js +0 -0
- /package/{components → dist/components}/text-field/manage-help-text.d.ts +0 -0
- /package/{components → dist/components}/text-field/text-field.d.ts +0 -0
- /package/{components → dist/components}/text-field-A4Obzs4l.cjs +0 -0
- /package/{components → dist/components}/text-field-BoGAvXvh.js +0 -0
- /package/{components → dist/components}/text-field-Cs8HYRYL.js +0 -0
- /package/{components → dist/components}/text-field-FJr8ZUhI.cjs +0 -0
- /package/{components → dist/components}/text-field.module-Btsve-VN.js +0 -0
- /package/{components → dist/components}/text-field.module-D5oDP7MB.cjs +0 -0
- /package/{components → dist/components}/toast/index.d.ts +0 -0
- /package/{components → dist/components}/toast/toast.d.ts +0 -0
- /package/{components/toast-DL40wb8G.cjs → dist/components/toast-CJSQUzoW.cjs} +0 -0
- /package/{components/toast-BoPYq3c-.js → dist/components/toast-DKwphMrp.js} +0 -0
- /package/{components → dist/components}/tooltip/index.cjs +0 -0
- /package/{components → dist/components}/tooltip/index.d.ts +0 -0
- /package/{components → dist/components}/tooltip/index.js +0 -0
- /package/{components → dist/components}/tooltip/tooltip-directive.d.ts +0 -0
- /package/{components → dist/components}/tooltip/tooltip.d.ts +0 -0
- /package/{components → dist/components}/tooltip-C3O4AQ1l.js +0 -0
- /package/{components → dist/components}/tooltip-DY1trLtg.cjs +0 -0
- /package/{components → dist/components}/top-nav/index.d.ts +0 -0
- /package/{components → dist/components}/top-nav/top-nav-item.d.ts +0 -0
- /package/{components → dist/components}/top-nav/top-nav.d.ts +0 -0
- /package/{components → dist/components}/utils.cjs +0 -0
- /package/{components → dist/components}/utils.js +0 -0
- /package/{components → dist/components}/voice-recorder-477xPHRU.js +0 -0
- /package/{components → dist/components}/voice-recorder-BUtmSvPO.cjs +0 -0
- /package/{utils → dist/utils}/base.d.ts +0 -0
- /package/{utils → dist/utils}/button-interaction-controllers/desktop-controller.d.ts +0 -0
- /package/{utils → dist/utils}/button-interaction-controllers/interaction-controller.d.ts +0 -0
- /package/{utils → dist/utils}/button-interaction-controllers/mobile-controller.d.ts +0 -0
- /package/{utils → dist/utils}/button-interaction-controllers/strategies.d.ts +0 -0
- /package/{utils → dist/utils}/condition-attribute-with-id.d.ts +0 -0
- /package/{utils → dist/utils}/first-focusable-in.d.ts +0 -0
- /package/{utils → dist/utils}/focus-visible.d.ts +0 -0
- /package/{utils → dist/utils}/focusable-selectors.d.ts +0 -0
- /package/{utils → dist/utils}/focusable.d.ts +0 -0
- /package/{utils → dist/utils}/get-css-variable.d.ts +0 -0
- /package/{utils → dist/utils}/get-label-from-slot.d.ts +0 -0
- /package/{utils → dist/utils}/index.d.ts +0 -0
- /package/{utils → dist/utils}/like-anchor.d.ts +0 -0
- /package/{utils → dist/utils}/observe-slot-presence.d.ts +0 -0
- /package/{utils → dist/utils}/observe-slot-text.d.ts +0 -0
- /package/{utils → dist/utils}/platform.d.ts +0 -0
- /package/{utils → dist/utils}/random-id.d.ts +0 -0
- /package/{utils → dist/utils}/reactive-controllers/color-controller.d.ts +0 -0
- /package/{utils → dist/utils}/reactive-controllers/color.d.ts +0 -0
- /package/{utils → dist/utils}/reactive-controllers/dependency-manger.d.ts +0 -0
- /package/{utils → dist/utils}/reactive-controllers/element-resolution.d.ts +0 -0
- /package/{utils → dist/utils}/reactive-controllers/focus-group.d.ts +0 -0
- /package/{utils → dist/utils}/reactive-controllers/language-resolution.d.ts +0 -0
- /package/{utils → dist/utils}/reactive-controllers/match-media.d.ts +0 -0
- /package/{utils → dist/utils}/reactive-controllers/pending-state.d.ts +0 -0
- /package/{utils → dist/utils}/reactive-controllers/roving-tabindex.d.ts +0 -0
- /package/{utils → dist/utils}/reparent-child.d.ts +0 -0
- /package/{utils → dist/utils}/scaled-indicator.d.ts +0 -0
- /package/{utils → dist/utils}/sized-mixin.d.ts +0 -0
- /package/{utils → dist/utils}/streaming-listener.d.ts +0 -0
- /package/{utils → dist/utils}/voice-recorder.d.ts +0 -0
package/README.dist.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Lucero
|
|
2
|
+
|
|
3
|
+
**Luzmo's Design System** — A collection of reusable web components built with [Lit](https://lit.dev/) for creating consistent, accessible, and beautiful user interfaces.
|
|
4
|
+
|
|
5
|
+
## Alpha
|
|
6
|
+
|
|
7
|
+
> ⚠️ This package is in alpha state. Do not use in production. Expect breaking changes.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @luzmo/lucero
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
Import individual components:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import '@luzmo/lucero/button';
|
|
21
|
+
import '@luzmo/lucero/text-field';
|
|
22
|
+
import '@luzmo/lucero/menu';
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Use in your HTML:
|
|
26
|
+
|
|
27
|
+
```html
|
|
28
|
+
<luzmo-button variant="primary">Click me</luzmo-button>
|
|
29
|
+
<luzmo-text-field
|
|
30
|
+
label="Email"
|
|
31
|
+
placeholder="Enter your email"
|
|
32
|
+
></luzmo-text-field>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Available Components
|
|
36
|
+
|
|
37
|
+
| Component | Import |
|
|
38
|
+
| -------------------- | ------------------------------------ |
|
|
39
|
+
| Accordion | `@luzmo/lucero/accordion` |
|
|
40
|
+
| Action Bar | `@luzmo/lucero/action-bar` |
|
|
41
|
+
| Action Button | `@luzmo/lucero/action-button` |
|
|
42
|
+
| Action Group | `@luzmo/lucero/action-group` |
|
|
43
|
+
| Action Menu | `@luzmo/lucero/action-menu` |
|
|
44
|
+
| Avatar | `@luzmo/lucero/avatar` |
|
|
45
|
+
| Button | `@luzmo/lucero/button` |
|
|
46
|
+
| Button Group | `@luzmo/lucero/button-group` |
|
|
47
|
+
| Calendar | `@luzmo/lucero/calendar` |
|
|
48
|
+
| Chat Message | `@luzmo/lucero/chat-message` |
|
|
49
|
+
| Chat Message Group | `@luzmo/lucero/chat-message-group` |
|
|
50
|
+
| Checkbox | `@luzmo/lucero/checkbox` |
|
|
51
|
+
| Color Area | `@luzmo/lucero/color-area` |
|
|
52
|
+
| Color Field | `@luzmo/lucero/color-field` |
|
|
53
|
+
| Color Menu | `@luzmo/lucero/color-menu` |
|
|
54
|
+
| Color Palette | `@luzmo/lucero/color-palette` |
|
|
55
|
+
| Color Picker | `@luzmo/lucero/color-picker` |
|
|
56
|
+
| Color Slider | `@luzmo/lucero/color-slider` |
|
|
57
|
+
| Date Time Picker | `@luzmo/lucero/date-time-picker` |
|
|
58
|
+
| Divider | `@luzmo/lucero/divider` |
|
|
59
|
+
| Field Group | `@luzmo/lucero/field-group` |
|
|
60
|
+
| Field Label | `@luzmo/lucero/field-label` |
|
|
61
|
+
| Icon | `@luzmo/lucero/icon` |
|
|
62
|
+
| Menu | `@luzmo/lucero/menu` |
|
|
63
|
+
| Multi Language Field | `@luzmo/lucero/multi-language-field` |
|
|
64
|
+
| Number Field | `@luzmo/lucero/number-field` |
|
|
65
|
+
| Options | `@luzmo/lucero/options` |
|
|
66
|
+
| Picker | `@luzmo/lucero/picker` |
|
|
67
|
+
| Picker Button | `@luzmo/lucero/picker-button` |
|
|
68
|
+
| Progress Circle | `@luzmo/lucero/progress-circle` |
|
|
69
|
+
| Prompt Box | `@luzmo/lucero/prompt-box` |
|
|
70
|
+
| Radio | `@luzmo/lucero/radio` |
|
|
71
|
+
| Search | `@luzmo/lucero/search` |
|
|
72
|
+
| Select | `@luzmo/lucero/select` |
|
|
73
|
+
| Slider | `@luzmo/lucero/slider` |
|
|
74
|
+
| Suggestion | `@luzmo/lucero/suggestion` |
|
|
75
|
+
| Swatch | `@luzmo/lucero/swatch` |
|
|
76
|
+
| Switch | `@luzmo/lucero/switch` |
|
|
77
|
+
| Tabs | `@luzmo/lucero/tabs` |
|
|
78
|
+
| Tags | `@luzmo/lucero/tags` |
|
|
79
|
+
| Text Field | `@luzmo/lucero/text-field` |
|
|
80
|
+
| Toast | `@luzmo/lucero/toast` |
|
|
81
|
+
| Tooltip | `@luzmo/lucero/tooltip` |
|
|
82
|
+
|
|
83
|
+
## Browser Support
|
|
84
|
+
|
|
85
|
+
- Last 2 versions of Chrome
|
|
86
|
+
- Last 2 versions of Firefox
|
|
87
|
+
- Last 2 versions of Safari
|
|
88
|
+
- Last 2 versions of Edge
|
|
89
|
+
|
|
90
|
+
## License
|
|
91
|
+
|
|
92
|
+
Copyright © 2025 Luzmo. All rights reserved.
|
|
93
|
+
|
|
94
|
+
Lucero must be used according to the [Luzmo Terms of Service](https://www.luzmo.com/information-pages/terms-of-use). This license allows users with a current active Luzmo account to use Lucero.
|
package/README.md
CHANGED
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Luzmo's Design System** — A collection of reusable web components built with [Lit](https://lit.dev/) for creating consistent, accessible, and beautiful user interfaces.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
> ⚠️ This package is in alpha state. Do not use in production. Expect breaking changes.
|
|
5
|
+
Lucero provides the foundational UI building blocks used across Luzmo products, ensuring visual consistency and reducing development time.
|
|
8
6
|
|
|
9
7
|
## Installation
|
|
10
8
|
|
|
@@ -12,83 +10,496 @@
|
|
|
12
10
|
npm install @luzmo/lucero
|
|
13
11
|
```
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Import individual components:
|
|
18
|
-
|
|
19
|
-
```typescript
|
|
13
|
+
```ts
|
|
20
14
|
import '@luzmo/lucero/button';
|
|
21
|
-
import '@luzmo/lucero/text-field';
|
|
22
|
-
import '@luzmo/lucero/menu';
|
|
23
15
|
```
|
|
24
16
|
|
|
25
|
-
Use in your HTML:
|
|
26
|
-
|
|
27
17
|
```html
|
|
28
|
-
<luzmo-button
|
|
29
|
-
<luzmo-text-field
|
|
30
|
-
label="Email"
|
|
31
|
-
placeholder="Enter your email"
|
|
32
|
-
></luzmo-text-field>
|
|
18
|
+
<luzmo-button>Click me</luzmo-button>
|
|
33
19
|
```
|
|
34
20
|
|
|
35
|
-
##
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
| Action Menu | `@luzmo/lucero/action-menu` |
|
|
44
|
-
| Avatar | `@luzmo/lucero/avatar` |
|
|
45
|
-
| Button | `@luzmo/lucero/button` |
|
|
46
|
-
| Button Group | `@luzmo/lucero/button-group` |
|
|
47
|
-
| Calendar | `@luzmo/lucero/calendar` |
|
|
48
|
-
| Chat Message | `@luzmo/lucero/chat-message` |
|
|
49
|
-
| Chat Message Group | `@luzmo/lucero/chat-message-group` |
|
|
50
|
-
| Checkbox | `@luzmo/lucero/checkbox` |
|
|
51
|
-
| Color Area | `@luzmo/lucero/color-area` |
|
|
52
|
-
| Color Field | `@luzmo/lucero/color-field` |
|
|
53
|
-
| Color Menu | `@luzmo/lucero/color-menu` |
|
|
54
|
-
| Color Palette | `@luzmo/lucero/color-palette` |
|
|
55
|
-
| Color Picker | `@luzmo/lucero/color-picker` |
|
|
56
|
-
| Color Slider | `@luzmo/lucero/color-slider` |
|
|
57
|
-
| Date Time Picker | `@luzmo/lucero/date-time-picker` |
|
|
58
|
-
| Divider | `@luzmo/lucero/divider` |
|
|
59
|
-
| Field Group | `@luzmo/lucero/field-group` |
|
|
60
|
-
| Field Label | `@luzmo/lucero/field-label` |
|
|
61
|
-
| Icon | `@luzmo/lucero/icon` |
|
|
62
|
-
| Menu | `@luzmo/lucero/menu` |
|
|
63
|
-
| Multi Language Field | `@luzmo/lucero/multi-language-field` |
|
|
64
|
-
| Number Field | `@luzmo/lucero/number-field` |
|
|
65
|
-
| Options | `@luzmo/lucero/options` |
|
|
66
|
-
| Picker | `@luzmo/lucero/picker` |
|
|
67
|
-
| Picker Button | `@luzmo/lucero/picker-button` |
|
|
68
|
-
| Progress Circle | `@luzmo/lucero/progress-circle` |
|
|
69
|
-
| Prompt Box | `@luzmo/lucero/prompt-box` |
|
|
70
|
-
| Radio | `@luzmo/lucero/radio` |
|
|
71
|
-
| Search | `@luzmo/lucero/search` |
|
|
72
|
-
| Select | `@luzmo/lucero/select` |
|
|
73
|
-
| Slider | `@luzmo/lucero/slider` |
|
|
74
|
-
| Suggestion | `@luzmo/lucero/suggestion` |
|
|
75
|
-
| Swatch | `@luzmo/lucero/swatch` |
|
|
76
|
-
| Switch | `@luzmo/lucero/switch` |
|
|
77
|
-
| Tabs | `@luzmo/lucero/tabs` |
|
|
78
|
-
| Tags | `@luzmo/lucero/tags` |
|
|
79
|
-
| Text Field | `@luzmo/lucero/text-field` |
|
|
80
|
-
| Toast | `@luzmo/lucero/toast` |
|
|
81
|
-
| Tooltip | `@luzmo/lucero/tooltip` |
|
|
82
|
-
|
|
83
|
-
## Browser Support
|
|
21
|
+
## Alpha
|
|
22
|
+
|
|
23
|
+
This repository is in alpha state. Do not use the web components in production.
|
|
24
|
+
Expect breaking changes.
|
|
25
|
+
|
|
26
|
+
## Requirements
|
|
27
|
+
|
|
28
|
+
Supported desktop browsers:
|
|
84
29
|
|
|
85
30
|
- Last 2 versions of Chrome
|
|
86
31
|
- Last 2 versions of Firefox
|
|
87
32
|
- Last 2 versions of Safari
|
|
88
33
|
- Last 2 versions of Edge
|
|
89
34
|
|
|
90
|
-
##
|
|
35
|
+
## Design System
|
|
36
|
+
|
|
37
|
+
### When to Create a Component
|
|
38
|
+
|
|
39
|
+
Create a new component when:
|
|
40
|
+
|
|
41
|
+
- **Reusability**: The UI pattern appears in 2+ places across the product
|
|
42
|
+
- **Encapsulation**: The pattern has distinct behavior, state, or styling that should be isolated
|
|
43
|
+
- **Composability**: It can be combined with other components to build complex UIs
|
|
44
|
+
|
|
45
|
+
Do **not** create a component for:
|
|
46
|
+
|
|
47
|
+
- One-off UI that won't be reused
|
|
48
|
+
- Simple styling that can be achieved with CSS
|
|
49
|
+
- Layout concerns (use CSS Grid/Flexbox instead)
|
|
50
|
+
|
|
51
|
+
### Component Scope
|
|
52
|
+
|
|
53
|
+
**Minimum scope** — A component should:
|
|
54
|
+
|
|
55
|
+
- Do one thing well (single responsibility)
|
|
56
|
+
- Be self-contained with its own styles and behavior
|
|
57
|
+
- Work independently without requiring specific parent components
|
|
58
|
+
|
|
59
|
+
**Maximum scope** — A design component should not:
|
|
60
|
+
|
|
61
|
+
- Handle business logic or data fetching
|
|
62
|
+
- Know about application-level routing or state
|
|
63
|
+
- Exceed ~1000 lines of code (consider splitting)
|
|
64
|
+
|
|
65
|
+
**Examples of good boundaries:**
|
|
66
|
+
|
|
67
|
+
| ✅ Good | ❌ Too broad | ❌ Too narrow |
|
|
68
|
+
| ------------ | ---------------------- | ---------------- |
|
|
69
|
+
| `button` | `user-dashboard` | `button-text` |
|
|
70
|
+
| `text-field` | `checkout-form` | `input-border` |
|
|
71
|
+
| `menu` | `navigation-with-auth` | `menu-item-icon` |
|
|
72
|
+
|
|
73
|
+
## Naming Conventions
|
|
74
|
+
|
|
75
|
+
### General Principles
|
|
76
|
+
|
|
77
|
+
- **No abbreviations** — use full, descriptive words (`button` not `btn`, `configuration` not `cfg`)
|
|
78
|
+
- **Consistency** — follow existing patterns in the codebase
|
|
79
|
+
- **Clarity** — names should be self-documenting
|
|
80
|
+
|
|
81
|
+
### Component Names
|
|
82
|
+
|
|
83
|
+
- **Prefix**: All components use `luzmo-` prefix
|
|
84
|
+
- **Format**: `luzmo-{component-name}` in kebab-case
|
|
85
|
+
- **Class name**: PascalCase with `Luzmo` prefix (`LuzmoButton`, `LuzmoTextField`)
|
|
86
|
+
|
|
87
|
+
```html
|
|
88
|
+
<!-- ✅ Good -->
|
|
89
|
+
<luzmo-button>
|
|
90
|
+
<luzmo-text-field>
|
|
91
|
+
<luzmo-action-menu>
|
|
92
|
+
<luzmo-date-time-picker>
|
|
93
|
+
<!-- ❌ Bad -->
|
|
94
|
+
<luzmo-btn>
|
|
95
|
+
<!-- Avoid abbreviations -->
|
|
96
|
+
<luzmo-textfield>
|
|
97
|
+
<!-- Use kebab-case for multi-word -->
|
|
98
|
+
<luzmo-ActionMenu>
|
|
99
|
+
<!-- No PascalCase in HTML --></luzmo-ActionMenu
|
|
100
|
+
></luzmo-textfield
|
|
101
|
+
></luzmo-btn
|
|
102
|
+
></luzmo-date-time-picker
|
|
103
|
+
></luzmo-action-menu
|
|
104
|
+
></luzmo-text-field
|
|
105
|
+
></luzmo-button
|
|
106
|
+
>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Attributes & Properties
|
|
110
|
+
|
|
111
|
+
| Type | HTML Attribute | JS Property | Example |
|
|
112
|
+
| --------------- | ----------------- | ----------- | ------------------------------- |
|
|
113
|
+
| Boolean | `kebab-case` | `camelCase` | `read-only` → `readOnly` |
|
|
114
|
+
| String/enum | `kebab-case` | `camelCase` | `static-color` → `staticColor` |
|
|
115
|
+
| Complex objects | _(not reflected)_ | `camelCase` | `formatOptions`, `selectedItem` |
|
|
116
|
+
|
|
117
|
+
**Rules:**
|
|
118
|
+
|
|
119
|
+
1. **Boolean attributes** — presence means `true`, absence means `false`
|
|
120
|
+
|
|
121
|
+
```html
|
|
122
|
+
<luzmo-button disabled>
|
|
123
|
+
<!-- disabled = true -->
|
|
124
|
+
<luzmo-button> <!-- disabled = false --></luzmo-button></luzmo-button
|
|
125
|
+
>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
2. **Reflect to attribute** — primitive values should sync between property and attribute
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
el.size = 'large';
|
|
132
|
+
el.getAttribute('size'); // 'large'
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
3. **Kebab in HTML, camelCase in JS** — multi-word attributes
|
|
136
|
+
|
|
137
|
+
```html
|
|
138
|
+
<luzmo-field
|
|
139
|
+
read-only
|
|
140
|
+
static-color="white"
|
|
141
|
+
pending-label="Loading..."
|
|
142
|
+
></luzmo-field>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
el.readOnly = true;
|
|
147
|
+
el.staticColor = 'white';
|
|
148
|
+
el.pendingLabel = 'Loading...';
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
4. **Common boolean attributes** — use short, descriptive adjectives:
|
|
152
|
+
|
|
153
|
+
| ✅ Good | ❌ Avoid |
|
|
154
|
+
| ---------- | ------------ |
|
|
155
|
+
| `disabled` | `isDisabled` |
|
|
156
|
+
| `readonly` | `isReadOnly` |
|
|
157
|
+
| `open` | `isOpen` |
|
|
158
|
+
| `pending` | `isPending` |
|
|
159
|
+
| `invalid` | `hasError` |
|
|
160
|
+
| `quiet` | `isQuiet` |
|
|
161
|
+
| `focused` | `isFocused` |
|
|
162
|
+
|
|
163
|
+
5. **Enum/variant attributes** — use lowercase values:
|
|
164
|
+
|
|
165
|
+
```html
|
|
166
|
+
<luzmo-button variant="primary" size="m" treatment="fill">
|
|
167
|
+
<luzmo-picker placement="bottom-start"></luzmo-picker
|
|
168
|
+
></luzmo-button>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Methods
|
|
172
|
+
|
|
173
|
+
| Type | Format | Example |
|
|
174
|
+
| -------------- | ------------ | ------------------------------------------- |
|
|
175
|
+
| Public | `camelCase` | `focus()`, `click()`, `toggle()`, `close()` |
|
|
176
|
+
| Event handlers | `handle*` | `handleChange()`, `handleKeydown()` |
|
|
177
|
+
| Internal | `_camelCase` | `_updateValue()`, `_cachedItems` |
|
|
178
|
+
|
|
179
|
+
**Rules:**
|
|
180
|
+
|
|
181
|
+
1. **Action methods** — use imperative verbs
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
toggle(open?: boolean): void // Toggle state
|
|
185
|
+
close(): void // Close the component
|
|
186
|
+
focus(options?: FocusOptions): void
|
|
187
|
+
select(): void // Select all text
|
|
188
|
+
checkValidity(): boolean // Validate and return result
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
2. **Getters/setters** — use noun-based names
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
get focusElement(): HTMLElement
|
|
195
|
+
get selectedItem(): LuzmoMenuItem | undefined
|
|
196
|
+
set value(val: string)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
3. **Internal methods** — use `@internal` JSDoc or underscore prefix
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
/** @internal */
|
|
203
|
+
protected _updateCache(): void
|
|
204
|
+
private _handleSlotchange(): void
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Events
|
|
208
|
+
|
|
209
|
+
| Type | Format | Example |
|
|
210
|
+
| ---------------- | ---------------------- | ---------------------------------- |
|
|
211
|
+
| Standard HTML | lowercase | `change`, `input`, `focus`, `blur` |
|
|
212
|
+
| Custom component | `luzmo-` + kebab-case | `luzmo-opened`, `luzmo-closed` |
|
|
213
|
+
| Internal | `luzmo-` + descriptive | `luzmo-menu-item-added-or-updated` |
|
|
214
|
+
|
|
215
|
+
**Rules:**
|
|
216
|
+
|
|
217
|
+
1. **Prefer standard events** — when behavior matches HTML semantics
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
// Use standard 'change' for value changes
|
|
221
|
+
this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
2. **Custom events** — use `luzmo-` prefix with descriptive names
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
// Component lifecycle events
|
|
228
|
+
this.dispatchEvent(
|
|
229
|
+
new Event('luzmo-opened', { bubbles: true, composed: true })
|
|
230
|
+
);
|
|
231
|
+
this.dispatchEvent(
|
|
232
|
+
new Event('luzmo-closed', { bubbles: true, composed: true })
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
// With detail data
|
|
236
|
+
this.dispatchEvent(
|
|
237
|
+
new CustomEvent('luzmo-change', {
|
|
238
|
+
detail: { value, oldValue },
|
|
239
|
+
bubbles: true,
|
|
240
|
+
composed: true
|
|
241
|
+
})
|
|
242
|
+
);
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
3. **Event naming pattern**:
|
|
246
|
+
|
|
247
|
+
| Pattern | Use case |
|
|
248
|
+
| ----------------------- | ------------------------- |
|
|
249
|
+
| `luzmo-{verb}-ed` | After action completed |
|
|
250
|
+
| `luzmo-{noun}-{action}` | Specific component events |
|
|
251
|
+
|
|
252
|
+
### CSS Custom Properties
|
|
253
|
+
|
|
254
|
+
| Type | Format | Example |
|
|
255
|
+
| ------------------ | ---------------------------- | ------------------------------------- |
|
|
256
|
+
| Design tokens | `--luzmo-{category}-{name}` | `--luzmo-primary`, `--luzmo-shadow-m` |
|
|
257
|
+
| Component-specific | `--luzmo-{component}-{prop}` | `--luzmo-button-height` |
|
|
258
|
+
|
|
259
|
+
**Examples:**
|
|
260
|
+
|
|
261
|
+
```css
|
|
262
|
+
/* Color tokens */
|
|
263
|
+
--luzmo-primary
|
|
264
|
+
--luzmo-background-color
|
|
265
|
+
--luzmo-font-color
|
|
266
|
+
--luzmo-border-color
|
|
267
|
+
|
|
268
|
+
/* Sizing/spacing */
|
|
269
|
+
--luzmo-shadow-s
|
|
270
|
+
--luzmo-shadow-m
|
|
271
|
+
--luzmo-shadow-l
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Slots
|
|
275
|
+
|
|
276
|
+
| Format | Example |
|
|
277
|
+
| ------- | ----------------------------------------------- |
|
|
278
|
+
| Default | `<slot></slot>` — main content |
|
|
279
|
+
| Named | `<slot name="icon">`, `<slot name="help-text">` |
|
|
280
|
+
|
|
281
|
+
**Common slot names:**
|
|
282
|
+
|
|
283
|
+
- `icon` — icon slot
|
|
284
|
+
- `label` — label content
|
|
285
|
+
- `help-text` — helper text below field
|
|
286
|
+
- `negative-help-text` — error message
|
|
287
|
+
- `description` — descriptive text
|
|
288
|
+
- `tooltip` — tooltip content
|
|
289
|
+
|
|
290
|
+
### File Names
|
|
291
|
+
|
|
292
|
+
| Type | Format | Example |
|
|
293
|
+
| ------------ | ----------------------------- | ------------------------ |
|
|
294
|
+
| Component | `{component}.ts` | `button.ts` |
|
|
295
|
+
| Styles | `{component}.module.scss` | `button.module.scss` |
|
|
296
|
+
| Stories | `{component}.stories.ts` | `button.stories.ts` |
|
|
297
|
+
| Unit tests | `{component}.test.ts` | `button.test.ts` |
|
|
298
|
+
| Visual tests | `{component}-visual.test.ts` | `button-visual.test.ts` |
|
|
299
|
+
| Memory tests | `{component}-memory.test.ts` | `button-memory.test.ts` |
|
|
300
|
+
| Interactions | `{component}.interactions.ts` | `button.interactions.ts` |
|
|
301
|
+
|
|
302
|
+
### TypeScript Types & Interfaces
|
|
303
|
+
|
|
304
|
+
| Type | Format | Example |
|
|
305
|
+
| ---------- | ---------- | ------------------------------------ |
|
|
306
|
+
| Types | PascalCase | `ButtonVariants`, `Placement` |
|
|
307
|
+
| Interfaces | PascalCase | `MenuChildItem`, `OpenableElement` |
|
|
308
|
+
| Enums | PascalCase | `OverlayState`, `TriggerInteraction` |
|
|
309
|
+
|
|
310
|
+
### Common Naming Patterns Summary
|
|
311
|
+
|
|
312
|
+
| Category | Pattern | ✅ Good | ❌ Avoid |
|
|
313
|
+
| ---------- | --------------------------- | ----------------- | --------------------- |
|
|
314
|
+
| Components | `luzmo-{name}` | `luzmo-button` | `luzmo-btn` |
|
|
315
|
+
| Properties | camelCase | `pendingLabel` | `pending_label` |
|
|
316
|
+
| Attributes | kebab-case | `pending-label` | `pendingLabel` |
|
|
317
|
+
| Methods | camelCase verb | `handleChange()` | `change_handler()` |
|
|
318
|
+
| Events | `luzmo-` prefix | `luzmo-opened` | `onOpen`, `openEvent` |
|
|
319
|
+
| CSS vars | `--luzmo-{name}` | `--luzmo-primary` | `--primary` |
|
|
320
|
+
| Internal | `_camelCase` or `@internal` | `_cachedItems` | `cachedItems__` |
|
|
321
|
+
|
|
322
|
+
## CSS Reset Protection
|
|
323
|
+
|
|
324
|
+
Lucero components are used in host apps that include CSS resets (Tailwind, Normalize, etc.). Tailwind's preflight injects `* { border-width: 0; border-style: solid; border-color: #e5e7eb; }`, which — per the CSS cascade spec — overrides normal `:host` styles in Shadow DOM because outer-context author styles take precedence.
|
|
325
|
+
|
|
326
|
+
**Rule**: All `border-width`, `border-style`, `border-color`, and `border` shorthand declarations on any `:host(...)` selector (including state variants and pseudo-elements) **must** use `!important`.
|
|
327
|
+
|
|
328
|
+
```scss
|
|
329
|
+
:host {
|
|
330
|
+
// a lot of reset css from libraries like tailwind, so we set !important
|
|
331
|
+
border-width: var(--luzmo-tag-border-width, var(--tag-border-width)) !important;
|
|
332
|
+
border-style: solid !important;
|
|
333
|
+
border-color: var(
|
|
334
|
+
--highcontrast-tag-border-color,
|
|
335
|
+
var(--luzmo-tag-border-color, var(--tag-border-color))
|
|
336
|
+
) !important;
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
This is safe because `!important` in the inner tree always beats `!important` in the outer tree, and consumer customization via CSS custom properties is unaffected. See `rules/styles.md` for the full rationale and what does/doesn't need protection.
|
|
341
|
+
|
|
342
|
+
## Testing
|
|
343
|
+
|
|
344
|
+
### Commands
|
|
345
|
+
|
|
346
|
+
| Command | Description |
|
|
347
|
+
| ---------------------------- | --------------------------------------- |
|
|
348
|
+
| `npm run test` | Run unit + visual tests in all browsers |
|
|
349
|
+
| `npm run test:chromium` | Run unit + visual tests in Chromium |
|
|
350
|
+
| `npm run test:firefox` | Run unit tests in Firefox |
|
|
351
|
+
| `npm run test:webkit` | Run unit tests in WebKit |
|
|
352
|
+
| `npm run test:visual` | Run visual regression tests only |
|
|
353
|
+
| `npm run test:visual:update` | Update visual regression screenshots |
|
|
354
|
+
| `npm run test:memory` | Run memory leak tests |
|
|
355
|
+
| `npm run test:storybook` | Run Storybook interaction tests |
|
|
356
|
+
| `npm run test:all` | Run all tests |
|
|
357
|
+
|
|
358
|
+
### Test File Structure
|
|
359
|
+
|
|
360
|
+
```
|
|
361
|
+
src/components/{component}/
|
|
362
|
+
├── {component}.ts # Component implementation
|
|
363
|
+
├── {component}.module.scss # Component styles
|
|
364
|
+
├── tests/
|
|
365
|
+
│ ├── *.test.ts # Unit + behavioral a11y tests
|
|
366
|
+
│ ├── *-a11y.test.ts # Static axe-core a11y scan
|
|
367
|
+
│ ├── *-visual.test.ts # Visual regression tests
|
|
368
|
+
│ ├── *-memory.test.ts # Memory leak tests
|
|
369
|
+
│ ├── *.interactions.ts # Storybook interaction tests
|
|
370
|
+
│ └── __screenshots__/ # Visual test reference images
|
|
371
|
+
└── stories/
|
|
372
|
+
└── *.stories.ts # Storybook stories
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
See [File Names](#file-names) for naming conventions.
|
|
376
|
+
|
|
377
|
+
### Test Types
|
|
378
|
+
|
|
379
|
+
#### Unit Tests (`*.test.ts`)
|
|
380
|
+
|
|
381
|
+
Standard Vitest tests for component behavior, accessibility, and API validation.
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
import { fixture, expect } from '@open-wc/testing';
|
|
385
|
+
import { html } from 'lit';
|
|
386
|
+
|
|
387
|
+
describe('Component', () => {
|
|
388
|
+
it('should render', async () => {
|
|
389
|
+
const el = await fixture(html`<luzmo-component></luzmo-component>`);
|
|
390
|
+
expect(el).to.exist;
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
#### Visual Regression Tests (`*-visual.test.ts`)
|
|
396
|
+
|
|
397
|
+
Screenshot-based tests using Storybook stories. Run only in Chromium.
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
import { composeStories } from 'storybook/preview-api';
|
|
401
|
+
import * as stories from '../stories/{component}.stories';
|
|
402
|
+
|
|
403
|
+
const composedStories = composeStories(stories);
|
|
404
|
+
|
|
405
|
+
it('Default - renders correctly', async () => {
|
|
406
|
+
const el = await renderStory(composedStories.Default);
|
|
407
|
+
await expect(el).toMatchScreenshot('{component}-default');
|
|
408
|
+
});
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
#### Memory Tests (`*-memory.test.ts`)
|
|
412
|
+
|
|
413
|
+
Tests for memory leaks when components mount/unmount repeatedly.
|
|
414
|
+
|
|
415
|
+
```typescript
|
|
416
|
+
import { testForMemoryLeaks } from '../../../test-utils/testing-helpers.js';
|
|
417
|
+
import { componentMarkup } from '../stories/template.js';
|
|
418
|
+
|
|
419
|
+
testForMemoryLeaks(componentMarkup({}));
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
#### Interaction Tests (`*.interactions.ts`)
|
|
423
|
+
|
|
424
|
+
Storybook play functions for testing user interactions. Used in stories with `play` property.
|
|
425
|
+
|
|
426
|
+
```typescript
|
|
427
|
+
import { expect, userEvent } from 'storybook/test';
|
|
428
|
+
|
|
429
|
+
export const testDefault = async ({ canvasElement }) => {
|
|
430
|
+
const el = canvasElement.querySelector('luzmo-component');
|
|
431
|
+
await expect(el).toBeInTheDocument();
|
|
432
|
+
await userEvent.click(el);
|
|
433
|
+
};
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
#### Accessibility Tests
|
|
437
|
+
|
|
438
|
+
Every component must include two types of accessibility tests:
|
|
439
|
+
|
|
440
|
+
##### Static A11y Tests (`*-a11y.test.ts`)
|
|
441
|
+
|
|
442
|
+
Axe-core scans that check for WCAG 2.x violations on the component's default rendering. Create a separate `*-a11y.test.ts` file for each component:
|
|
443
|
+
|
|
444
|
+
```typescript
|
|
445
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
446
|
+
import { a11yFixture, html, runAxe } from '../../../test-utils/a11y-test-helpers';
|
|
447
|
+
import '../';
|
|
448
|
+
|
|
449
|
+
afterEach(() => { document.body.innerHTML = ''; });
|
|
450
|
+
|
|
451
|
+
describe('luzmo-component - accessibility', () => {
|
|
452
|
+
it('has no axe violations', async () => {
|
|
453
|
+
const { el } = await a11yFixture(html`
|
|
454
|
+
<luzmo-component label="Example"></luzmo-component>
|
|
455
|
+
`);
|
|
456
|
+
const results = await runAxe(el);
|
|
457
|
+
expect(results.violations).toEqual([]);
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
##### Behavioral A11y Tests (in `*.test.ts`)
|
|
463
|
+
|
|
464
|
+
Keyboard navigation, focus management, and ARIA state transition tests. Added as a `describe('keyboard navigation', ...)` block in the main test file. Expected coverage depends on the component's ARIA role:
|
|
465
|
+
|
|
466
|
+
| ARIA pattern | Expected keyboard tests |
|
|
467
|
+
|---|---|
|
|
468
|
+
| Composite widget (menu, listbox, radio group, toolbar, tablist) | Arrow key navigation, Home/End, skip disabled, wrap-around |
|
|
469
|
+
| Expandable (accordion, disclosure, combobox, picker) | Enter/Space to toggle, Escape to close, focus management on open/close |
|
|
470
|
+
| Value (slider, number-field, color-area) | Arrow keys to adjust value, Home/End for min/max, step modifiers |
|
|
471
|
+
| Overlay (dialog, popover) | Escape to dismiss, focus trap (modal), focus return to trigger |
|
|
472
|
+
| Form submit (prompt-box, search) | Enter to submit |
|
|
473
|
+
|
|
474
|
+
Example (roving tabindex navigation):
|
|
475
|
+
|
|
476
|
+
```typescript
|
|
477
|
+
it('moves focus with ArrowDown', async () => {
|
|
478
|
+
const el = await fixture(html`
|
|
479
|
+
<luzmo-component>
|
|
480
|
+
<luzmo-item class="first">A</luzmo-item>
|
|
481
|
+
<luzmo-item class="second">B</luzmo-item>
|
|
482
|
+
</luzmo-component>
|
|
483
|
+
`);
|
|
484
|
+
const first = el.querySelector('.first');
|
|
485
|
+
const second = el.querySelector('.second');
|
|
486
|
+
await elementUpdated(el);
|
|
487
|
+
|
|
488
|
+
first.focus();
|
|
489
|
+
await elementUpdated(el);
|
|
490
|
+
|
|
491
|
+
el.dispatchEvent(arrowDownEvent());
|
|
492
|
+
await nextFrame();
|
|
493
|
+
|
|
494
|
+
expect(document.activeElement).to.equal(second);
|
|
495
|
+
});
|
|
496
|
+
```
|
|
91
497
|
|
|
92
|
-
|
|
498
|
+
### Expectations
|
|
93
499
|
|
|
94
|
-
|
|
500
|
+
- **All components** should have unit tests covering core functionality
|
|
501
|
+
- **All components** must have a static axe a11y test (`*-a11y.test.ts`)
|
|
502
|
+
- **Interactive components** must have behavioral keyboard navigation tests in their main `*.test.ts`
|
|
503
|
+
- **Visual tests** should cover key visual states (default, disabled, sizes, variants)
|
|
504
|
+
- **Memory tests** ensure components don't leak memory on mount/unmount cycles
|
|
505
|
+
- **Interaction tests** validate user flows in Storybook
|
package/dist/LICENSE
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Lucero - The design system for Luzmo.
|
|
2
|
+
|
|
3
|
+
Copyright © 2025 Luzmo
|
|
4
|
+
All rights reserved.
|
|
5
|
+
Lucero (“Luzmo Design System”) must be used according to the Luzmo Terms of Service.
|
|
6
|
+
This license allows users with a current active Luzmo account to use Lucero.
|
|
7
|
+
This license terminates automatically if a user no longer has an active Luzmo account.
|
|
8
|
+
Please view the Luzmo Terms of Service at: https://www.luzmo.com/information-pages/terms-of-use.
|
|
9
|
+
|
|
10
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
11
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
12
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
13
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
14
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
15
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
16
|
+
SOFTWARE.
|