@tessera-ui/core 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -12
- package/dist/components/index.js +1 -1
- package/dist/components/{p-O8aQgWRZ.js → p-2ydrBbXU.js} +2 -2
- package/dist/components/p-A0saON5E.js +2 -0
- package/dist/components/p-B046Q9mB.js +2 -0
- package/dist/components/{p-C7JaUlNB.js → p-B4_cDa1A.js} +2 -2
- package/dist/components/{p-BdzH6wlc.js → p-BCv5H01l.js} +2 -2
- package/dist/components/p-BGnwokOT.js +2 -0
- package/dist/components/p-BMu62WKn.js +2 -0
- package/dist/components/p-BT1uIgln.js +2 -0
- package/dist/components/p-BUWioFPq.js +2 -0
- package/dist/components/{p-v-L32wKy.js → p-BdeYJARM.js} +2 -2
- package/dist/components/{p-DhQ7X_TL.js → p-BnX1KON4.js} +2 -2
- package/dist/components/{p-DwJ7Jt3k.js → p-BsX7YKf7.js} +2 -2
- package/dist/components/p-BzSptDZ8.js +2 -0
- package/dist/components/p-C4C_ntgI.js +2 -0
- package/dist/components/p-C4jvuley.js +2 -0
- package/dist/components/{p-BP-fZfRb.js → p-CGcBFblJ.js} +2 -2
- package/dist/components/p-CJvp9tpd.js +2 -0
- package/dist/components/{p-DD986daz.js → p-COpYtD-7.js} +2 -2
- package/dist/components/{p-C8wd1644.js → p-CV-_3uEV.js} +2 -2
- package/dist/components/p-CXpxj5LF.js +2 -0
- package/dist/components/{p-CEQXPxzU.js → p-Ccf23RDb.js} +2 -2
- package/dist/components/{p-SopsdO_f.js → p-Ccpbt1Ou.js} +2 -2
- package/dist/components/{p-DMPxu5Po.js → p-CgLMjfKE.js} +2 -2
- package/dist/components/p-D2rKVDAH.js +2 -0
- package/dist/components/{p-zveaarwa.js → p-D33ZtGZF.js} +2 -2
- package/dist/components/{p-Fot2uNwg.js → p-DHBR8Qn_.js} +2 -2
- package/dist/components/{p-faVXXwqR.js → p-DOtFbUdh.js} +2 -2
- package/dist/components/{p-BjiDgszq.js → p-DelBi-6m.js} +2 -2
- package/dist/components/{p-Cy_Ad-Jy.js → p-DgbNUE6a.js} +2 -2
- package/dist/components/{p-DTAVTqnc.js → p-I5_iFNxb.js} +2 -2
- package/dist/components/p-IZ8R1wr2.js +2 -0
- package/dist/components/{p-B_NL55YI.js → p-LcG5Mdyq.js} +2 -2
- package/dist/components/{p-BcoU0ISN.js → p-XuOQBHK0.js} +2 -2
- package/dist/components/p-_EbBBIv1.js +2 -0
- package/dist/components/p-_vCbug8y.js +2 -0
- package/dist/components/{p-B0ZXNFSa.js → p-b-zWbmXM.js} +2 -2
- package/dist/components/{p-DwUH8YQW.js → p-e-hrdd0t.js} +2 -2
- package/dist/components/p-gtluIo4p.js +2 -0
- package/dist/components/p-o-GUod2W.js +2 -0
- package/dist/components/{p-DooMF1E0.js → p-w9y5VC-3.js} +2 -2
- package/dist/components/ts-accordion-item.js +1 -1
- package/dist/components/ts-accordion.js +1 -1
- package/dist/components/ts-alert.js +1 -1
- package/dist/components/ts-avatar.js +1 -1
- package/dist/components/ts-badge.js +1 -1
- package/dist/components/ts-banner.js +1 -1
- package/dist/components/ts-breadcrumb-item.js +1 -1
- package/dist/components/ts-breadcrumb.js +1 -1
- package/dist/components/ts-button.js +1 -1
- package/dist/components/ts-card.js +1 -1
- package/dist/components/ts-checkbox.js +1 -1
- package/dist/components/ts-chip.js +1 -1
- package/dist/components/ts-container.js +1 -1
- package/dist/components/ts-date-picker.js +1 -1
- package/dist/components/ts-dialog.js +1 -1
- package/dist/components/ts-divider.js +1 -1
- package/dist/components/ts-drawer.js +1 -1
- package/dist/components/ts-empty-state.js +1 -1
- package/dist/components/ts-file-upload.js +1 -1
- package/dist/components/ts-grid.js +1 -1
- package/dist/components/ts-icon.js +1 -1
- package/dist/components/ts-input.js +1 -1
- package/dist/components/ts-menu-item.js +1 -1
- package/dist/components/ts-menu.js +1 -1
- package/dist/components/ts-modal.js +1 -1
- package/dist/components/ts-nav-item.js +1 -1
- package/dist/components/ts-nav.js +1 -1
- package/dist/components/ts-pagination.js +1 -1
- package/dist/components/ts-popover.js +1 -1
- package/dist/components/ts-progress.js +1 -1
- package/dist/components/ts-radio.js +1 -1
- package/dist/components/ts-row.js +1 -1
- package/dist/components/ts-select.js +1 -1
- package/dist/components/ts-skeleton.js +1 -1
- package/dist/components/ts-slider.js +1 -1
- package/dist/components/ts-spacer.js +1 -1
- package/dist/components/ts-spinner.js +1 -1
- package/dist/components/ts-stack.js +1 -1
- package/dist/components/ts-step.js +1 -1
- package/dist/components/ts-stepper.js +1 -1
- package/dist/components/ts-switch-group.js +1 -1
- package/dist/components/ts-switch-option.js +1 -1
- package/dist/components/ts-tab-panel.js +1 -1
- package/dist/components/ts-table.js +1 -1
- package/dist/components/ts-tabs.js +1 -1
- package/dist/components/ts-textarea.js +1 -1
- package/dist/components/ts-toast.js +1 -1
- package/dist/components/ts-toggle.js +1 -1
- package/dist/components/ts-toolbar.js +1 -1
- package/dist/components/ts-tooltip.js +1 -1
- package/dist/components/ts-tree-item.js +1 -1
- package/dist/components/ts-tree.js +1 -1
- package/package.json +24 -3
- package/dist/cjs/aria-CeYIvz3U.js.map +0 -1
- package/dist/cjs/index-Bel_x2OU.js.map +0 -1
- package/dist/cjs/index.cjs.js.map +0 -1
- package/dist/cjs/loader.cjs.js.map +0 -1
- package/dist/cjs/lucide-B1gCqJ3G.js.map +0 -1
- package/dist/cjs/tessera-ui.cjs.js.map +0 -1
- package/dist/cjs/ts-accordion-item.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-accordion.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-alert.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-avatar.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-badge.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-banner.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-breadcrumb-item.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-breadcrumb.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-button.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-card.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-checkbox.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-chip.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-container.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-date-picker.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-dialog.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-divider.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-drawer.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-empty-state.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-file-upload.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-grid.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-icon-CfbhgAgr.js.map +0 -1
- package/dist/cjs/ts-icon.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-input.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-menu-item.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-menu.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-modal.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-nav-item.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-nav.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-pagination.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-popover.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-progress.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-radio.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-row.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-select.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-skeleton.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-slider.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-spacer.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-spinner.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-stack.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-step.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-stepper.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-switch-group.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-switch-option.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-tab-panel.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-table.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-tabs.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-textarea.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-toast.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-toggle.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-toolbar.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-tooltip.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-tree-item.cjs.entry.js.map +0 -1
- package/dist/cjs/ts-tree.cjs.entry.js.map +0 -1
- package/dist/collection/components/accordion/accordion-item.js.map +0 -1
- package/dist/collection/components/accordion/accordion-item.stories.js +0 -4
- package/dist/collection/components/accordion/accordion-item.stories.js.map +0 -1
- package/dist/collection/components/accordion/accordion.js.map +0 -1
- package/dist/collection/components/accordion/accordion.stories.js +0 -90
- package/dist/collection/components/accordion/accordion.stories.js.map +0 -1
- package/dist/collection/components/alert/alert.js.map +0 -1
- package/dist/collection/components/alert/alert.stories.js +0 -128
- package/dist/collection/components/alert/alert.stories.js.map +0 -1
- package/dist/collection/components/avatar/avatar.js.map +0 -1
- package/dist/collection/components/avatar/avatar.stories.js +0 -138
- package/dist/collection/components/avatar/avatar.stories.js.map +0 -1
- package/dist/collection/components/badge/badge.js.map +0 -1
- package/dist/collection/components/badge/badge.stories.js +0 -193
- package/dist/collection/components/badge/badge.stories.js.map +0 -1
- package/dist/collection/components/banner/banner.js.map +0 -1
- package/dist/collection/components/banner/banner.stories.js +0 -92
- package/dist/collection/components/banner/banner.stories.js.map +0 -1
- package/dist/collection/components/breadcrumb/breadcrumb-item.js.map +0 -1
- package/dist/collection/components/breadcrumb/breadcrumb-item.stories.js +0 -4
- package/dist/collection/components/breadcrumb/breadcrumb-item.stories.js.map +0 -1
- package/dist/collection/components/breadcrumb/breadcrumb.js.map +0 -1
- package/dist/collection/components/breadcrumb/breadcrumb.stories.js +0 -88
- package/dist/collection/components/breadcrumb/breadcrumb.stories.js.map +0 -1
- package/dist/collection/components/button/button.js.map +0 -1
- package/dist/collection/components/button/button.stories.js +0 -219
- package/dist/collection/components/button/button.stories.js.map +0 -1
- package/dist/collection/components/card/card.js.map +0 -1
- package/dist/collection/components/card/card.stories.js +0 -221
- package/dist/collection/components/card/card.stories.js.map +0 -1
- package/dist/collection/components/checkbox/checkbox.js.map +0 -1
- package/dist/collection/components/checkbox/checkbox.stories.js +0 -90
- package/dist/collection/components/checkbox/checkbox.stories.js.map +0 -1
- package/dist/collection/components/chip/chip.js.map +0 -1
- package/dist/collection/components/chip/chip.stories.js +0 -139
- package/dist/collection/components/chip/chip.stories.js.map +0 -1
- package/dist/collection/components/container/container.js.map +0 -1
- package/dist/collection/components/container/container.stories.js +0 -138
- package/dist/collection/components/container/container.stories.js.map +0 -1
- package/dist/collection/components/date-picker/date-picker.js.map +0 -1
- package/dist/collection/components/date-picker/date-picker.stories.js +0 -119
- package/dist/collection/components/date-picker/date-picker.stories.js.map +0 -1
- package/dist/collection/components/dialog/dialog.js.map +0 -1
- package/dist/collection/components/dialog/dialog.stories.js +0 -147
- package/dist/collection/components/dialog/dialog.stories.js.map +0 -1
- package/dist/collection/components/divider/divider.js.map +0 -1
- package/dist/collection/components/divider/divider.stories.js +0 -94
- package/dist/collection/components/divider/divider.stories.js.map +0 -1
- package/dist/collection/components/drawer/drawer.js.map +0 -1
- package/dist/collection/components/drawer/drawer.stories.js +0 -143
- package/dist/collection/components/drawer/drawer.stories.js.map +0 -1
- package/dist/collection/components/empty-state/empty-state.js.map +0 -1
- package/dist/collection/components/empty-state/empty-state.stories.js +0 -113
- package/dist/collection/components/empty-state/empty-state.stories.js.map +0 -1
- package/dist/collection/components/file-upload/file-upload.js.map +0 -1
- package/dist/collection/components/file-upload/file-upload.stories.js +0 -107
- package/dist/collection/components/file-upload/file-upload.stories.js.map +0 -1
- package/dist/collection/components/grid/grid.js.map +0 -1
- package/dist/collection/components/grid/grid.stories.js +0 -134
- package/dist/collection/components/grid/grid.stories.js.map +0 -1
- package/dist/collection/components/icon/icon-registry.js.map +0 -1
- package/dist/collection/components/icon/icon.js.map +0 -1
- package/dist/collection/components/icon/icon.stories.js +0 -119
- package/dist/collection/components/icon/icon.stories.js.map +0 -1
- package/dist/collection/components/input/input.js.map +0 -1
- package/dist/collection/components/input/input.stories.js +0 -151
- package/dist/collection/components/input/input.stories.js.map +0 -1
- package/dist/collection/components/menu/menu-item.js.map +0 -1
- package/dist/collection/components/menu/menu-item.stories.js +0 -4
- package/dist/collection/components/menu/menu-item.stories.js.map +0 -1
- package/dist/collection/components/menu/menu.js.map +0 -1
- package/dist/collection/components/menu/menu.stories.js +0 -126
- package/dist/collection/components/menu/menu.stories.js.map +0 -1
- package/dist/collection/components/modal/modal.js.map +0 -1
- package/dist/collection/components/modal/modal.stories.js +0 -233
- package/dist/collection/components/modal/modal.stories.js.map +0 -1
- package/dist/collection/components/nav/nav-item.js.map +0 -1
- package/dist/collection/components/nav/nav-item.stories.js +0 -4
- package/dist/collection/components/nav/nav-item.stories.js.map +0 -1
- package/dist/collection/components/nav/nav.js.map +0 -1
- package/dist/collection/components/nav/nav.stories.js +0 -106
- package/dist/collection/components/nav/nav.stories.js.map +0 -1
- package/dist/collection/components/pagination/pagination.js.map +0 -1
- package/dist/collection/components/pagination/pagination.stories.js +0 -92
- package/dist/collection/components/pagination/pagination.stories.js.map +0 -1
- package/dist/collection/components/popover/popover.js.map +0 -1
- package/dist/collection/components/popover/popover.stories.js +0 -112
- package/dist/collection/components/popover/popover.stories.js.map +0 -1
- package/dist/collection/components/progress/progress.js.map +0 -1
- package/dist/collection/components/progress/progress.stories.js +0 -132
- package/dist/collection/components/progress/progress.stories.js.map +0 -1
- package/dist/collection/components/radio/radio.js.map +0 -1
- package/dist/collection/components/radio/radio.stories.js +0 -77
- package/dist/collection/components/radio/radio.stories.js.map +0 -1
- package/dist/collection/components/row/row.js.map +0 -1
- package/dist/collection/components/row/row.stories.js +0 -172
- package/dist/collection/components/row/row.stories.js.map +0 -1
- package/dist/collection/components/select/select.js.map +0 -1
- package/dist/collection/components/select/select.stories.js +0 -138
- package/dist/collection/components/select/select.stories.js.map +0 -1
- package/dist/collection/components/skeleton/skeleton.js.map +0 -1
- package/dist/collection/components/skeleton/skeleton.stories.js +0 -140
- package/dist/collection/components/skeleton/skeleton.stories.js.map +0 -1
- package/dist/collection/components/slider/slider.js.map +0 -1
- package/dist/collection/components/slider/slider.stories.js +0 -100
- package/dist/collection/components/slider/slider.stories.js.map +0 -1
- package/dist/collection/components/spacer/spacer.js.map +0 -1
- package/dist/collection/components/spacer/spacer.stories.js +0 -90
- package/dist/collection/components/spacer/spacer.stories.js.map +0 -1
- package/dist/collection/components/spinner/spinner.js.map +0 -1
- package/dist/collection/components/spinner/spinner.stories.js +0 -88
- package/dist/collection/components/spinner/spinner.stories.js.map +0 -1
- package/dist/collection/components/stack/stack.js.map +0 -1
- package/dist/collection/components/stack/stack.stories.js +0 -121
- package/dist/collection/components/stack/stack.stories.js.map +0 -1
- package/dist/collection/components/stepper/step.js.map +0 -1
- package/dist/collection/components/stepper/step.stories.js +0 -4
- package/dist/collection/components/stepper/step.stories.js.map +0 -1
- package/dist/collection/components/stepper/stepper.js.map +0 -1
- package/dist/collection/components/stepper/stepper.stories.js +0 -130
- package/dist/collection/components/stepper/stepper.stories.js.map +0 -1
- package/dist/collection/components/switch-group/switch-group.js.map +0 -1
- package/dist/collection/components/switch-group/switch-group.stories.js +0 -132
- package/dist/collection/components/switch-group/switch-group.stories.js.map +0 -1
- package/dist/collection/components/switch-group/switch-option.js.map +0 -1
- package/dist/collection/components/switch-group/switch-option.stories.js +0 -4
- package/dist/collection/components/switch-group/switch-option.stories.js.map +0 -1
- package/dist/collection/components/table/table.js.map +0 -1
- package/dist/collection/components/table/table.stories.js +0 -147
- package/dist/collection/components/table/table.stories.js.map +0 -1
- package/dist/collection/components/tabs/tab-panel.js.map +0 -1
- package/dist/collection/components/tabs/tab-panel.stories.js +0 -4
- package/dist/collection/components/tabs/tab-panel.stories.js.map +0 -1
- package/dist/collection/components/tabs/tabs.js.map +0 -1
- package/dist/collection/components/tabs/tabs.stories.js +0 -187
- package/dist/collection/components/tabs/tabs.stories.js.map +0 -1
- package/dist/collection/components/textarea/textarea.js.map +0 -1
- package/dist/collection/components/textarea/textarea.stories.js +0 -130
- package/dist/collection/components/textarea/textarea.stories.js.map +0 -1
- package/dist/collection/components/toast/toast.js.map +0 -1
- package/dist/collection/components/toast/toast.stories.js +0 -91
- package/dist/collection/components/toast/toast.stories.js.map +0 -1
- package/dist/collection/components/toggle/toggle.js.map +0 -1
- package/dist/collection/components/toggle/toggle.stories.js +0 -145
- package/dist/collection/components/toggle/toggle.stories.js.map +0 -1
- package/dist/collection/components/toolbar/toolbar.js.map +0 -1
- package/dist/collection/components/toolbar/toolbar.stories.js +0 -131
- package/dist/collection/components/toolbar/toolbar.stories.js.map +0 -1
- package/dist/collection/components/tooltip/tooltip.js.map +0 -1
- package/dist/collection/components/tooltip/tooltip.stories.js +0 -186
- package/dist/collection/components/tooltip/tooltip.stories.js.map +0 -1
- package/dist/collection/components/tree/tree-item.js.map +0 -1
- package/dist/collection/components/tree/tree-item.stories.js +0 -4
- package/dist/collection/components/tree/tree-item.stories.js.map +0 -1
- package/dist/collection/components/tree/tree.js.map +0 -1
- package/dist/collection/components/tree/tree.stories.js +0 -121
- package/dist/collection/components/tree/tree.stories.js.map +0 -1
- package/dist/collection/index.js.map +0 -1
- package/dist/collection/theme/tokens.js.map +0 -1
- package/dist/collection/types/index.js.map +0 -1
- package/dist/collection/utils/aria.js.map +0 -1
- package/dist/collection/utils/dom.js.map +0 -1
- package/dist/collection/utils/events.js.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/components/p-6RDSLDuS.js +0 -2
- package/dist/components/p-6RDSLDuS.js.map +0 -1
- package/dist/components/p-B0ZXNFSa.js.map +0 -1
- package/dist/components/p-BCgm2utU.js +0 -2
- package/dist/components/p-BCgm2utU.js.map +0 -1
- package/dist/components/p-BFN5hUo4.js +0 -2
- package/dist/components/p-BFN5hUo4.js.map +0 -1
- package/dist/components/p-BOxYojS-.js.map +0 -1
- package/dist/components/p-BP-fZfRb.js.map +0 -1
- package/dist/components/p-B_NL55YI.js.map +0 -1
- package/dist/components/p-BcoU0ISN.js.map +0 -1
- package/dist/components/p-BdzH6wlc.js.map +0 -1
- package/dist/components/p-BeErYjKz.js +0 -2
- package/dist/components/p-BeErYjKz.js.map +0 -1
- package/dist/components/p-BjiDgszq.js.map +0 -1
- package/dist/components/p-BjyTgfXe.js +0 -2
- package/dist/components/p-BjyTgfXe.js.map +0 -1
- package/dist/components/p-BlZHjan9.js +0 -2
- package/dist/components/p-BlZHjan9.js.map +0 -1
- package/dist/components/p-C7JaUlNB.js.map +0 -1
- package/dist/components/p-C8wd1644.js.map +0 -1
- package/dist/components/p-CEQXPxzU.js.map +0 -1
- package/dist/components/p-CGh7W07E.js +0 -2
- package/dist/components/p-CGh7W07E.js.map +0 -1
- package/dist/components/p-CHtE5caV.js +0 -2
- package/dist/components/p-CHtE5caV.js.map +0 -1
- package/dist/components/p-CSNeA_zh.js +0 -2
- package/dist/components/p-CSNeA_zh.js.map +0 -1
- package/dist/components/p-CbHlJvjF.js +0 -2
- package/dist/components/p-CbHlJvjF.js.map +0 -1
- package/dist/components/p-CkQOAizb.js +0 -2
- package/dist/components/p-CkQOAizb.js.map +0 -1
- package/dist/components/p-Cy_Ad-Jy.js.map +0 -1
- package/dist/components/p-DD986daz.js.map +0 -1
- package/dist/components/p-DFnNsZtI.js +0 -2
- package/dist/components/p-DFnNsZtI.js.map +0 -1
- package/dist/components/p-DMPxu5Po.js.map +0 -1
- package/dist/components/p-DMuI5d5r.js +0 -2
- package/dist/components/p-DMuI5d5r.js.map +0 -1
- package/dist/components/p-DPQ1o4MP.js +0 -2
- package/dist/components/p-DPQ1o4MP.js.map +0 -1
- package/dist/components/p-DTAVTqnc.js.map +0 -1
- package/dist/components/p-DhQ7X_TL.js.map +0 -1
- package/dist/components/p-DkpyRqHf.js.map +0 -1
- package/dist/components/p-DlB-KfKY.js +0 -2
- package/dist/components/p-DlB-KfKY.js.map +0 -1
- package/dist/components/p-DooMF1E0.js.map +0 -1
- package/dist/components/p-DwJ7Jt3k.js.map +0 -1
- package/dist/components/p-DwUH8YQW.js.map +0 -1
- package/dist/components/p-Fot2uNwg.js.map +0 -1
- package/dist/components/p-O8aQgWRZ.js.map +0 -1
- package/dist/components/p-SopsdO_f.js.map +0 -1
- package/dist/components/p-TFHAUMKT.js +0 -2
- package/dist/components/p-TFHAUMKT.js.map +0 -1
- package/dist/components/p-faVXXwqR.js.map +0 -1
- package/dist/components/p-lpqZSiIf.js.map +0 -1
- package/dist/components/p-mfB_pP4L.js +0 -2
- package/dist/components/p-mfB_pP4L.js.map +0 -1
- package/dist/components/p-v-L32wKy.js.map +0 -1
- package/dist/components/p-zveaarwa.js.map +0 -1
- package/dist/components/ts-accordion-item.js.map +0 -1
- package/dist/components/ts-accordion.js.map +0 -1
- package/dist/components/ts-alert.js.map +0 -1
- package/dist/components/ts-avatar.js.map +0 -1
- package/dist/components/ts-badge.js.map +0 -1
- package/dist/components/ts-banner.js.map +0 -1
- package/dist/components/ts-breadcrumb-item.js.map +0 -1
- package/dist/components/ts-breadcrumb.js.map +0 -1
- package/dist/components/ts-button.js.map +0 -1
- package/dist/components/ts-card.js.map +0 -1
- package/dist/components/ts-checkbox.js.map +0 -1
- package/dist/components/ts-chip.js.map +0 -1
- package/dist/components/ts-container.js.map +0 -1
- package/dist/components/ts-date-picker.js.map +0 -1
- package/dist/components/ts-dialog.js.map +0 -1
- package/dist/components/ts-divider.js.map +0 -1
- package/dist/components/ts-drawer.js.map +0 -1
- package/dist/components/ts-empty-state.js.map +0 -1
- package/dist/components/ts-file-upload.js.map +0 -1
- package/dist/components/ts-grid.js.map +0 -1
- package/dist/components/ts-icon.js.map +0 -1
- package/dist/components/ts-input.js.map +0 -1
- package/dist/components/ts-menu-item.js.map +0 -1
- package/dist/components/ts-menu.js.map +0 -1
- package/dist/components/ts-modal.js.map +0 -1
- package/dist/components/ts-nav-item.js.map +0 -1
- package/dist/components/ts-nav.js.map +0 -1
- package/dist/components/ts-pagination.js.map +0 -1
- package/dist/components/ts-popover.js.map +0 -1
- package/dist/components/ts-progress.js.map +0 -1
- package/dist/components/ts-radio.js.map +0 -1
- package/dist/components/ts-row.js.map +0 -1
- package/dist/components/ts-select.js.map +0 -1
- package/dist/components/ts-skeleton.js.map +0 -1
- package/dist/components/ts-slider.js.map +0 -1
- package/dist/components/ts-spacer.js.map +0 -1
- package/dist/components/ts-spinner.js.map +0 -1
- package/dist/components/ts-stack.js.map +0 -1
- package/dist/components/ts-step.js.map +0 -1
- package/dist/components/ts-stepper.js.map +0 -1
- package/dist/components/ts-switch-group.js.map +0 -1
- package/dist/components/ts-switch-option.js.map +0 -1
- package/dist/components/ts-tab-panel.js.map +0 -1
- package/dist/components/ts-table.js.map +0 -1
- package/dist/components/ts-tabs.js.map +0 -1
- package/dist/components/ts-textarea.js.map +0 -1
- package/dist/components/ts-toast.js.map +0 -1
- package/dist/components/ts-toggle.js.map +0 -1
- package/dist/components/ts-toolbar.js.map +0 -1
- package/dist/components/ts-tooltip.js.map +0 -1
- package/dist/components/ts-tree-item.js.map +0 -1
- package/dist/components/ts-tree.js.map +0 -1
- package/dist/components.json +0 -12678
- package/dist/esm/aria-lpqZSiIf.js.map +0 -1
- package/dist/esm/index-V8-ENixA.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/loader.js.map +0 -1
- package/dist/esm/lucide-BOxYojS-.js.map +0 -1
- package/dist/esm/tessera-ui.js.map +0 -1
- package/dist/esm/ts-accordion-item.entry.js.map +0 -1
- package/dist/esm/ts-accordion.entry.js.map +0 -1
- package/dist/esm/ts-alert.entry.js.map +0 -1
- package/dist/esm/ts-avatar.entry.js.map +0 -1
- package/dist/esm/ts-badge.entry.js.map +0 -1
- package/dist/esm/ts-banner.entry.js.map +0 -1
- package/dist/esm/ts-breadcrumb-item.entry.js.map +0 -1
- package/dist/esm/ts-breadcrumb.entry.js.map +0 -1
- package/dist/esm/ts-button.entry.js.map +0 -1
- package/dist/esm/ts-card.entry.js.map +0 -1
- package/dist/esm/ts-checkbox.entry.js.map +0 -1
- package/dist/esm/ts-chip.entry.js.map +0 -1
- package/dist/esm/ts-container.entry.js.map +0 -1
- package/dist/esm/ts-date-picker.entry.js.map +0 -1
- package/dist/esm/ts-dialog.entry.js.map +0 -1
- package/dist/esm/ts-divider.entry.js.map +0 -1
- package/dist/esm/ts-drawer.entry.js.map +0 -1
- package/dist/esm/ts-empty-state.entry.js.map +0 -1
- package/dist/esm/ts-file-upload.entry.js.map +0 -1
- package/dist/esm/ts-grid.entry.js.map +0 -1
- package/dist/esm/ts-icon-Jz9ioZag.js.map +0 -1
- package/dist/esm/ts-icon.entry.js.map +0 -1
- package/dist/esm/ts-input.entry.js.map +0 -1
- package/dist/esm/ts-menu-item.entry.js.map +0 -1
- package/dist/esm/ts-menu.entry.js.map +0 -1
- package/dist/esm/ts-modal.entry.js.map +0 -1
- package/dist/esm/ts-nav-item.entry.js.map +0 -1
- package/dist/esm/ts-nav.entry.js.map +0 -1
- package/dist/esm/ts-pagination.entry.js.map +0 -1
- package/dist/esm/ts-popover.entry.js.map +0 -1
- package/dist/esm/ts-progress.entry.js.map +0 -1
- package/dist/esm/ts-radio.entry.js.map +0 -1
- package/dist/esm/ts-row.entry.js.map +0 -1
- package/dist/esm/ts-select.entry.js.map +0 -1
- package/dist/esm/ts-skeleton.entry.js.map +0 -1
- package/dist/esm/ts-slider.entry.js.map +0 -1
- package/dist/esm/ts-spacer.entry.js.map +0 -1
- package/dist/esm/ts-spinner.entry.js.map +0 -1
- package/dist/esm/ts-stack.entry.js.map +0 -1
- package/dist/esm/ts-step.entry.js.map +0 -1
- package/dist/esm/ts-stepper.entry.js.map +0 -1
- package/dist/esm/ts-switch-group.entry.js.map +0 -1
- package/dist/esm/ts-switch-option.entry.js.map +0 -1
- package/dist/esm/ts-tab-panel.entry.js.map +0 -1
- package/dist/esm/ts-table.entry.js.map +0 -1
- package/dist/esm/ts-tabs.entry.js.map +0 -1
- package/dist/esm/ts-textarea.entry.js.map +0 -1
- package/dist/esm/ts-toast.entry.js.map +0 -1
- package/dist/esm/ts-toggle.entry.js.map +0 -1
- package/dist/esm/ts-toolbar.entry.js.map +0 -1
- package/dist/esm/ts-tooltip.entry.js.map +0 -1
- package/dist/esm/ts-tree-item.entry.js.map +0 -1
- package/dist/esm/ts-tree.entry.js.map +0 -1
- package/dist/tessera-ui/index.esm.js.map +0 -1
- package/dist/tessera-ui/p-0424cd55.entry.js.map +0 -1
- package/dist/tessera-ui/p-04522bf9.entry.js.map +0 -1
- package/dist/tessera-ui/p-04aa8b90.entry.js.map +0 -1
- package/dist/tessera-ui/p-080eaf89.entry.js.map +0 -1
- package/dist/tessera-ui/p-0ec061e5.entry.js.map +0 -1
- package/dist/tessera-ui/p-122e43b7.entry.js.map +0 -1
- package/dist/tessera-ui/p-16bb8ca8.entry.js.map +0 -1
- package/dist/tessera-ui/p-16fc632b.entry.js.map +0 -1
- package/dist/tessera-ui/p-1d73f6c9.entry.js.map +0 -1
- package/dist/tessera-ui/p-24305379.entry.js.map +0 -1
- package/dist/tessera-ui/p-25f77cc9.entry.js.map +0 -1
- package/dist/tessera-ui/p-35eb8496.entry.js.map +0 -1
- package/dist/tessera-ui/p-3aec66b4.entry.js.map +0 -1
- package/dist/tessera-ui/p-4277460b.entry.js.map +0 -1
- package/dist/tessera-ui/p-441310f7.entry.js.map +0 -1
- package/dist/tessera-ui/p-491e1a75.entry.js.map +0 -1
- package/dist/tessera-ui/p-50d092ce.entry.js.map +0 -1
- package/dist/tessera-ui/p-50efadf3.entry.js.map +0 -1
- package/dist/tessera-ui/p-53846d59.entry.js.map +0 -1
- package/dist/tessera-ui/p-56f2b070.entry.js.map +0 -1
- package/dist/tessera-ui/p-6760f922.entry.js.map +0 -1
- package/dist/tessera-ui/p-69bb11ed.entry.js.map +0 -1
- package/dist/tessera-ui/p-6d35a60c.entry.js.map +0 -1
- package/dist/tessera-ui/p-6ec285ad.entry.js.map +0 -1
- package/dist/tessera-ui/p-708d4eb5.entry.js.map +0 -1
- package/dist/tessera-ui/p-79ff8ceb.entry.js.map +0 -1
- package/dist/tessera-ui/p-7e531195.entry.js.map +0 -1
- package/dist/tessera-ui/p-7fa64f00.entry.js.map +0 -1
- package/dist/tessera-ui/p-829c4307.entry.js.map +0 -1
- package/dist/tessera-ui/p-91ccef3f.entry.js.map +0 -1
- package/dist/tessera-ui/p-9209e603.entry.js.map +0 -1
- package/dist/tessera-ui/p-97a9def7.entry.js.map +0 -1
- package/dist/tessera-ui/p-9b41b538.entry.js.map +0 -1
- package/dist/tessera-ui/p-9c0504fd.entry.js.map +0 -1
- package/dist/tessera-ui/p-BOxYojS-.js.map +0 -1
- package/dist/tessera-ui/p-StBQmS8h.js.map +0 -1
- package/dist/tessera-ui/p-V8-ENixA.js.map +0 -1
- package/dist/tessera-ui/p-a120b5d6.entry.js.map +0 -1
- package/dist/tessera-ui/p-a55a5695.entry.js.map +0 -1
- package/dist/tessera-ui/p-a83d903e.entry.js.map +0 -1
- package/dist/tessera-ui/p-adc807dc.entry.js.map +0 -1
- package/dist/tessera-ui/p-b09f202c.entry.js.map +0 -1
- package/dist/tessera-ui/p-b1182592.entry.js.map +0 -1
- package/dist/tessera-ui/p-b3f60955.entry.js.map +0 -1
- package/dist/tessera-ui/p-bb9ebbd8.entry.js.map +0 -1
- package/dist/tessera-ui/p-bce40715.entry.js.map +0 -1
- package/dist/tessera-ui/p-c35c7049.entry.js.map +0 -1
- package/dist/tessera-ui/p-c59ecffa.entry.js.map +0 -1
- package/dist/tessera-ui/p-d318774a.entry.js.map +0 -1
- package/dist/tessera-ui/p-d5cbadd6.entry.js.map +0 -1
- package/dist/tessera-ui/p-e1d2b141.entry.js.map +0 -1
- package/dist/tessera-ui/p-f0bf6408.entry.js.map +0 -1
- package/dist/tessera-ui/p-f639213a.entry.js.map +0 -1
- package/dist/tessera-ui/p-fd2376e0.entry.js.map +0 -1
- package/dist/tessera-ui/p-fef9a993.entry.js.map +0 -1
- package/dist/tessera-ui/p-lpqZSiIf.js.map +0 -1
- package/dist/tessera-ui/tessera-ui.esm.js.map +0 -1
- package/dist/types/components/accordion/accordion-item.stories.d.ts +0 -5
- package/dist/types/components/accordion/accordion.stories.d.ts +0 -21
- package/dist/types/components/alert/alert.stories.d.ts +0 -34
- package/dist/types/components/avatar/avatar.stories.d.ts +0 -51
- package/dist/types/components/badge/badge.stories.d.ts +0 -50
- package/dist/types/components/banner/banner.stories.d.ts +0 -40
- package/dist/types/components/breadcrumb/breadcrumb-item.stories.d.ts +0 -5
- package/dist/types/components/breadcrumb/breadcrumb.stories.d.ts +0 -20
- package/dist/types/components/button/button.stories.d.ts +0 -73
- package/dist/types/components/card/card.stories.d.ts +0 -46
- package/dist/types/components/checkbox/checkbox.stories.d.ts +0 -58
- package/dist/types/components/chip/chip.stories.d.ts +0 -54
- package/dist/types/components/container/container.stories.d.ts +0 -21
- package/dist/types/components/date-picker/date-picker.stories.d.ts +0 -62
- package/dist/types/components/dialog/dialog.stories.d.ts +0 -39
- package/dist/types/components/divider/divider.stories.d.ts +0 -33
- package/dist/types/components/drawer/drawer.stories.d.ts +0 -43
- package/dist/types/components/empty-state/empty-state.stories.d.ts +0 -37
- package/dist/types/components/file-upload/file-upload.stories.d.ts +0 -43
- package/dist/types/components/grid/grid.stories.d.ts +0 -30
- package/dist/types/components/icon/icon.stories.d.ts +0 -42
- package/dist/types/components/input/input.stories.d.ts +0 -77
- package/dist/types/components/menu/menu-item.stories.d.ts +0 -5
- package/dist/types/components/menu/menu.stories.d.ts +0 -36
- package/dist/types/components/modal/modal.stories.d.ts +0 -47
- package/dist/types/components/nav/nav-item.stories.d.ts +0 -5
- package/dist/types/components/nav/nav.stories.d.ts +0 -27
- package/dist/types/components/pagination/pagination.stories.d.ts +0 -42
- package/dist/types/components/popover/popover.stories.d.ts +0 -38
- package/dist/types/components/progress/progress.stories.d.ts +0 -59
- package/dist/types/components/radio/radio.stories.d.ts +0 -48
- package/dist/types/components/row/row.stories.d.ts +0 -52
- package/dist/types/components/select/select.stories.d.ts +0 -73
- package/dist/types/components/skeleton/skeleton.stories.d.ts +0 -44
- package/dist/types/components/slider/slider.stories.d.ts +0 -62
- package/dist/types/components/spacer/spacer.stories.d.ts +0 -28
- package/dist/types/components/spinner/spinner.stories.d.ts +0 -33
- package/dist/types/components/stack/stack.stories.d.ts +0 -28
- package/dist/types/components/stepper/step.stories.d.ts +0 -5
- package/dist/types/components/stepper/stepper.stories.d.ts +0 -36
- package/dist/types/components/switch-group/switch-group.stories.d.ts +0 -37
- package/dist/types/components/switch-group/switch-option.stories.d.ts +0 -5
- package/dist/types/components/table/table.stories.d.ts +0 -45
- package/dist/types/components/tabs/tab-panel.stories.d.ts +0 -5
- package/dist/types/components/tabs/tabs.stories.d.ts +0 -34
- package/dist/types/components/textarea/textarea.stories.d.ts +0 -88
- package/dist/types/components/toast/toast.stories.d.ts +0 -48
- package/dist/types/components/toggle/toggle.stories.d.ts +0 -46
- package/dist/types/components/toolbar/toolbar.stories.d.ts +0 -28
- package/dist/types/components/tooltip/tooltip.stories.d.ts +0 -43
- package/dist/types/components/tree/tree-item.stories.d.ts +0 -5
- package/dist/types/components/tree/tree.stories.d.ts +0 -21
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{t,p as e,H as r,d as a,h as s,c as i}from"./p-DkpyRqHf.js";import{g as o}from"./p-lpqZSiIf.js";const n=()=>`:host{display:block;position:relative;font-family:var(--ts-font-family-base);--ts-date-picker-bg:var(--ts-color-neutral-50);--ts-date-picker-radius:var(--ts-radius-md);--ts-date-picker-focus-ring:var(--ts-focus-ring)}.date-picker__label{display:block;margin-block-end:var(--ts-spacing-1);font-size:var(--ts-font-size-sm);font-weight:var(--ts-font-weight-medium);color:var(--ts-color-text-primary)}.date-picker__trigger{display:block;width:100%;border:1px solid var(--ts-color-border-default);border-radius:var(--ts-date-picker-radius);background-color:var(--ts-date-picker-bg);color:var(--ts-color-text-primary);font-family:var(--ts-font-family-base);cursor:pointer;outline:none;transition:border-color var(--ts-transition-fast), box-shadow var(--ts-transition-fast)}.date-picker__trigger:focus-visible{box-shadow:var(--ts-date-picker-focus-ring);border-color:var(--ts-color-interactive-primary)}:host([size="sm"]) .date-picker__trigger{padding:var(--ts-spacing-1) var(--ts-spacing-2);font-size:var(--ts-font-size-sm)}:host([size="md"]) .date-picker__trigger{padding:var(--ts-spacing-2) var(--ts-spacing-3);font-size:var(--ts-font-size-md)}:host([size="lg"]) .date-picker__trigger{padding:var(--ts-spacing-3) var(--ts-spacing-4);font-size:var(--ts-font-size-lg)}:host([error]) .date-picker__trigger{border-color:var(--ts-color-danger-500)}:host([error]) .date-picker__trigger:focus-visible{box-shadow:0 0 0 3px rgba(239, 68, 68, 0.25)}.date-picker__error{display:block;margin-block-start:var(--ts-spacing-1);font-size:var(--ts-font-size-sm);color:var(--ts-color-danger-500)}:host([disabled]) .date-picker__trigger{opacity:0.5;cursor:not-allowed}.date-picker__calendar{position:absolute;inset-block-start:100%;inset-inline-start:0;z-index:var(--ts-z-dropdown, 100);margin-block-start:var(--ts-spacing-1);padding:var(--ts-spacing-3);background-color:var(--ts-color-bg-elevated);border:1px solid var(--ts-color-border-subtle);border-radius:var(--ts-radius-lg);box-shadow:var(--ts-shadow-lg);min-inline-size:280px;animation:ts-dp-fade-in 150ms ease-out}.date-picker__header{display:flex;align-items:center;justify-content:space-between;margin-block-end:var(--ts-spacing-2)}.date-picker__month-year{font-size:var(--ts-font-size-sm);font-weight:var(--ts-font-weight-semi);color:var(--ts-color-text-primary)}.date-picker__nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;border-radius:var(--ts-radius-md);background:transparent;color:var(--ts-color-text-secondary);font-size:var(--ts-font-size-lg);cursor:pointer;padding:0;line-height:1;transition:background-color var(--ts-transition-fast), color var(--ts-transition-fast)}.date-picker__nav-btn:hover{background-color:var(--ts-color-bg-hover);color:var(--ts-color-text-primary)}.date-picker__nav-btn:focus-visible{box-shadow:var(--ts-focus-ring);outline:none}.date-picker__weekdays{display:grid;grid-template-columns:repeat(7, 1fr);gap:0;margin-block-end:var(--ts-spacing-1)}.date-picker__weekday{display:flex;align-items:center;justify-content:center;font-size:var(--ts-font-size-xs);font-weight:var(--ts-font-weight-semi);color:var(--ts-color-text-tertiary);padding:var(--ts-spacing-1) 0}.date-picker__days{display:grid;grid-template-columns:repeat(7, 1fr);gap:1px}.date-picker__day{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin:1px auto;border:none;border-radius:var(--ts-radius-full);background:transparent;color:var(--ts-color-text-primary);font-family:var(--ts-font-family-base);font-size:var(--ts-font-size-sm);cursor:pointer;padding:0;transition:background-color var(--ts-transition-fast), color var(--ts-transition-fast)}.date-picker__day--empty{cursor:default}.date-picker__day:not(.date-picker__day--empty):not(.date-picker__day--disabled):hover{background-color:var(--ts-color-bg-hover)}.date-picker__day:not(.date-picker__day--empty):focus-visible{box-shadow:var(--ts-date-picker-focus-ring);outline:none}.date-picker__day--today{font-weight:var(--ts-font-weight-bold);border:1px solid var(--ts-color-interactive-primary)}.date-picker__day--selected{background-color:var(--ts-color-interactive-primary);color:var(--ts-color-text-on-primary);font-weight:var(--ts-font-weight-semi)}.date-picker__day--selected:hover{background-color:var(--ts-color-interactive-primary-hover)}.date-picker__day--disabled{opacity:0.35;cursor:not-allowed}.date-picker__day--focused{box-shadow:var(--ts-date-picker-focus-ring)}@keyframes ts-dp-fade-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}`;const d=["Su","Mo","Tu","We","Th","Fr","Sa"];const c=e(class t extends r{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow();this.tsChange=a(this,"tsChange")}get hostEl(){return this}pickerId=o("ts-date-picker");triggerEl;value;placeholder="Select date";disabled=false;min;max;label;error=false;errorMessage;size="md";name;tsChange;isOpen=false;viewMonth=(new Date).getMonth();viewYear=(new Date).getFullYear();focusedDay=null;handleValueChange(){if(this.value){const t=new Date(this.value+"T00:00:00");if(!isNaN(t.getTime())){this.viewMonth=t.getMonth();this.viewYear=t.getFullYear()}}}connectedCallback(){this.handleValueChange()}toggleCalendar=()=>{if(this.disabled)return;this.isOpen=!this.isOpen;if(this.isOpen){this.handleValueChange()}};closeCalendar=()=>{this.isOpen=false;this.focusedDay=null};prevMonth=()=>{if(this.viewMonth===0){this.viewMonth=11;this.viewYear-=1}else{this.viewMonth-=1}};nextMonth=()=>{if(this.viewMonth===11){this.viewMonth=0;this.viewYear+=1}else{this.viewMonth+=1}};selectDay=t=>{const e=String(this.viewMonth+1).padStart(2,"0");const r=String(t).padStart(2,"0");const a=`${this.viewYear}-${e}-${r}`;this.value=a;this.tsChange.emit({value:a});this.closeCalendar();this.triggerEl?.focus()};isDayDisabled(t){const e=`${this.viewYear}-${String(this.viewMonth+1).padStart(2,"0")}-${String(t).padStart(2,"0")}`;if(this.min&&e<this.min)return true;if(this.max&&e>this.max)return true;return false}isToday(t){const e=new Date;return t===e.getDate()&&this.viewMonth===e.getMonth()&&this.viewYear===e.getFullYear()}isSelected(t){if(!this.value)return false;const e=new Date(this.value+"T00:00:00");return t===e.getDate()&&this.viewMonth===e.getMonth()&&this.viewYear===e.getFullYear()}getDaysInMonth(){return new Date(this.viewYear,this.viewMonth+1,0).getDate()}getFirstDayOfWeek(){return new Date(this.viewYear,this.viewMonth,1).getDay()}getMonthName(){return new Date(this.viewYear,this.viewMonth).toLocaleString("default",{month:"long"})}handleTriggerKeydown=t=>{if(t.key==="Enter"||t.key===" "){t.preventDefault();this.toggleCalendar()}else if(t.key==="Escape"&&this.isOpen){this.closeCalendar()}};handleCalendarKeydown=t=>{const e=this.getDaysInMonth();if(t.key==="Escape"){this.closeCalendar();this.triggerEl?.focus();return}if(this.focusedDay===null){this.focusedDay=1;return}let r=this.focusedDay;switch(t.key){case"ArrowRight":t.preventDefault();r=Math.min(this.focusedDay+1,e);break;case"ArrowLeft":t.preventDefault();r=Math.max(this.focusedDay-1,1);break;case"ArrowDown":t.preventDefault();r=Math.min(this.focusedDay+7,e);break;case"ArrowUp":t.preventDefault();r=Math.max(this.focusedDay-7,1);break;case"Enter":t.preventDefault();if(!this.isDayDisabled(this.focusedDay)){this.selectDay(this.focusedDay)}return;default:return}this.focusedDay=r};handleDocumentClick=t=>{const e=t.composedPath();if(!e.includes(this.hostEl)){this.closeCalendar()}};componentDidLoad(){document.addEventListener("click",this.handleDocumentClick)}disconnectedCallback(){document.removeEventListener("click",this.handleDocumentClick)}renderCalendar(){const t=this.getDaysInMonth();const e=this.getFirstDayOfWeek();const r=[];for(let t=0;t<e;t++){r.push(null)}for(let e=1;e<=t;e++){r.push(e)}return s("div",{class:"date-picker__calendar",part:"calendar",role:"dialog","aria-label":`${this.getMonthName()} ${this.viewYear}`,onKeyDown:this.handleCalendarKeydown},s("div",{class:"date-picker__header",part:"header"},s("button",{class:"date-picker__nav-btn",type:"button","aria-label":"Previous month",onClick:this.prevMonth},"‹"),s("span",{class:"date-picker__month-year"},this.getMonthName()," ",this.viewYear),s("button",{class:"date-picker__nav-btn",type:"button","aria-label":"Next month",onClick:this.nextMonth},"›")),s("div",{class:"date-picker__grid",role:"grid","aria-label":"Calendar"},s("div",{class:"date-picker__weekdays"},d.map((t=>s("span",{class:"date-picker__weekday",role:"columnheader",key:t},t)))),s("div",{class:"date-picker__days"},r.map(((t,e)=>t===null?s("span",{class:"date-picker__day date-picker__day--empty",key:`empty-${e}`}):s("button",{class:{"date-picker__day":true,"date-picker__day--today":this.isToday(t),"date-picker__day--selected":this.isSelected(t),"date-picker__day--disabled":this.isDayDisabled(t),"date-picker__day--focused":this.focusedDay===t},part:"day",type:"button",disabled:this.isDayDisabled(t),tabindex:this.focusedDay===t?0:-1,"aria-label":`${t} ${this.getMonthName()} ${this.viewYear}`,"aria-selected":this.isSelected(t)?"true":undefined,key:`day-${t}`,onClick:()=>this.selectDay(t)},t))))))}render(){return s(i,{key:"50137a4ae337d96c546d842875d4d22a710a6473",class:{"ts-date-picker":true,"ts-date-picker--open":this.isOpen,"ts-date-picker--error":this.error,[`ts-date-picker--${this.size}`]:true}},this.label&&s("label",{key:"475c187da383d04c078f0870ae67010183983574",class:"date-picker__label",part:"label",htmlFor:this.pickerId},this.label),s("input",{key:"74f792fb4db7930dbacbf310162d89a2224480ad",ref:t=>this.triggerEl=t,class:"date-picker__trigger",part:"trigger",type:"text",id:this.pickerId,name:this.name,value:this.value||"",placeholder:this.placeholder,disabled:this.disabled,readOnly:true,"aria-haspopup":"dialog","aria-expanded":this.isOpen?"true":"false","aria-invalid":this.error?"true":undefined,onClick:this.toggleCalendar,onKeyDown:this.handleTriggerKeydown}),this.isOpen&&this.renderCalendar(),this.error&&this.errorMessage&&s("span",{key:"8b807115f167df573ff6a48d6790da72e2e82197",class:"date-picker__error",part:"error",role:"alert"},this.errorMessage))}static get watchers(){return{value:[{handleValueChange:0}]}}static get style(){return n()}},[513,"ts-date-picker",{value:[1537],placeholder:[1],disabled:[516],min:[1],max:[1],label:[1],error:[516],errorMessage:[1,"error-message"],size:[513],name:[1],isOpen:[32],viewMonth:[32],viewYear:[32],focusedDay:[32]},undefined,{value:[{handleValueChange:0}]}]);function l(){if(typeof customElements==="undefined"){return}const e=["ts-date-picker"];e.forEach((e=>{switch(e){case"ts-date-picker":if(!customElements.get(t(e))){customElements.define(t(e),c)}break}}))}l();export{c as T,l as d};
|
|
2
|
-
//# sourceMappingURL=p-DlB-KfKY.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["datePickerCss","WEEKDAYS","TsDatePicker","__stencil_proxyCustomElement","HTMLElement","pickerId","generateId","triggerEl","value","placeholder","disabled","min","max","label","error","errorMessage","size","name","tsChange","isOpen","viewMonth","Date","getMonth","viewYear","getFullYear","focusedDay","handleValueChange","this","date","isNaN","getTime","connectedCallback","toggleCalendar","closeCalendar","prevMonth","nextMonth","selectDay","day","month","String","padStart","dayStr","newValue","emit","focus","isDayDisabled","dateStr","isToday","today","getDate","isSelected","getDaysInMonth","getFirstDayOfWeek","getDay","getMonthName","toLocaleString","handleTriggerKeydown","event","key","preventDefault","handleCalendarKeydown","daysInMonth","newDay","Math","handleDocumentClick","path","composedPath","includes","hostEl","componentDidLoad","document","addEventListener","disconnectedCallback","removeEventListener","renderCalendar","firstDay","days","i","push","d","h","class","part","role","onKeyDown","type","onClick","map","wd","index","tabindex","undefined","render","Host","htmlFor","ref","el","id","readOnly"],"sources":["src/components/date-picker/date-picker.css?tag=ts-date-picker&encapsulation=shadow","src/components/date-picker/date-picker.tsx"],"sourcesContent":["/* ==========================================================================\n ts-date-picker — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-date-picker-bg Input/calendar background\n --ts-date-picker-radius Border radius\n --ts-date-picker-focus-ring Focus ring box-shadow\n ========================================================================== */\n\n:host {\n display: block;\n position: relative;\n font-family: var(--ts-font-family-base);\n\n --ts-date-picker-bg: var(--ts-color-neutral-50);\n --ts-date-picker-radius: var(--ts-radius-md);\n --ts-date-picker-focus-ring: var(--ts-focus-ring);\n}\n\n/* ---- Label ---- */\n.date-picker__label {\n display: block;\n margin-block-end: var(--ts-spacing-1);\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-medium);\n color: var(--ts-color-text-primary);\n}\n\n/* ---- Trigger Input ---- */\n.date-picker__trigger {\n display: block;\n width: 100%;\n border: 1px solid var(--ts-color-border-default);\n border-radius: var(--ts-date-picker-radius);\n background-color: var(--ts-date-picker-bg);\n color: var(--ts-color-text-primary);\n font-family: var(--ts-font-family-base);\n cursor: pointer;\n outline: none;\n transition:\n border-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n}\n\n.date-picker__trigger:focus-visible {\n box-shadow: var(--ts-date-picker-focus-ring);\n border-color: var(--ts-color-interactive-primary);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .date-picker__trigger {\n padding: var(--ts-spacing-1) var(--ts-spacing-2);\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .date-picker__trigger {\n padding: var(--ts-spacing-2) var(--ts-spacing-3);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .date-picker__trigger {\n padding: var(--ts-spacing-3) var(--ts-spacing-4);\n font-size: var(--ts-font-size-lg);\n}\n\n/* ---- Error state ---- */\n:host([error]) .date-picker__trigger {\n border-color: var(--ts-color-danger-500);\n}\n\n:host([error]) .date-picker__trigger:focus-visible {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n}\n\n.date-picker__error {\n display: block;\n margin-block-start: var(--ts-spacing-1);\n font-size: var(--ts-font-size-sm);\n color: var(--ts-color-danger-500);\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) .date-picker__trigger {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ---- Calendar Dropdown ---- */\n.date-picker__calendar {\n position: absolute;\n inset-block-start: 100%;\n inset-inline-start: 0;\n z-index: var(--ts-z-dropdown, 100);\n margin-block-start: var(--ts-spacing-1);\n padding: var(--ts-spacing-3);\n background-color: var(--ts-color-bg-elevated);\n border: 1px solid var(--ts-color-border-subtle);\n border-radius: var(--ts-radius-lg);\n box-shadow: var(--ts-shadow-lg);\n min-inline-size: 280px;\n animation: ts-dp-fade-in 150ms ease-out;\n}\n\n/* ---- Header ---- */\n.date-picker__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-block-end: var(--ts-spacing-2);\n}\n\n.date-picker__month-year {\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-primary);\n}\n\n.date-picker__nav-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: none;\n border-radius: var(--ts-radius-md);\n background: transparent;\n color: var(--ts-color-text-secondary);\n font-size: var(--ts-font-size-lg);\n cursor: pointer;\n padding: 0;\n line-height: 1;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n}\n\n.date-picker__nav-btn:hover {\n background-color: var(--ts-color-bg-hover);\n color: var(--ts-color-text-primary);\n}\n\n.date-picker__nav-btn:focus-visible {\n box-shadow: var(--ts-focus-ring);\n outline: none;\n}\n\n/* ---- Grid ---- */\n.date-picker__weekdays {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 0;\n margin-block-end: var(--ts-spacing-1);\n}\n\n.date-picker__weekday {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--ts-font-size-xs);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-tertiary);\n padding: var(--ts-spacing-1) 0;\n}\n\n.date-picker__days {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 1px;\n}\n\n/* ---- Day cells ---- */\n.date-picker__day {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n margin: 1px auto;\n border: none;\n border-radius: var(--ts-radius-full);\n background: transparent;\n color: var(--ts-color-text-primary);\n font-family: var(--ts-font-family-base);\n font-size: var(--ts-font-size-sm);\n cursor: pointer;\n padding: 0;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n}\n\n.date-picker__day--empty {\n cursor: default;\n}\n\n.date-picker__day:not(.date-picker__day--empty):not(.date-picker__day--disabled):hover {\n background-color: var(--ts-color-bg-hover);\n}\n\n.date-picker__day:not(.date-picker__day--empty):focus-visible {\n box-shadow: var(--ts-date-picker-focus-ring);\n outline: none;\n}\n\n.date-picker__day--today {\n font-weight: var(--ts-font-weight-bold);\n border: 1px solid var(--ts-color-interactive-primary);\n}\n\n.date-picker__day--selected {\n background-color: var(--ts-color-interactive-primary);\n color: var(--ts-color-text-on-primary);\n font-weight: var(--ts-font-weight-semi);\n}\n\n.date-picker__day--selected:hover {\n background-color: var(--ts-color-interactive-primary-hover);\n}\n\n.date-picker__day--disabled {\n opacity: 0.35;\n cursor: not-allowed;\n}\n\n.date-picker__day--focused {\n box-shadow: var(--ts-date-picker-focus-ring);\n}\n\n/* ---- Animation ---- */\n@keyframes ts-dp-fade-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n","import { Component, Prop, State, Event, h, Host, Element, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport { generateId } from '../../utils/aria';\n\nconst WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n\n/**\n * @part trigger - The input trigger element.\n * @part calendar - The calendar dropdown container.\n * @part header - The month/year navigation header.\n * @part grid - The day grid.\n * @part day - Individual day cell.\n * @part label - The label element.\n * @part error - The error message.\n */\n@Component({\n tag: 'ts-date-picker',\n styleUrl: 'date-picker.css',\n shadow: true,\n})\nexport class TsDatePicker {\n @Element() hostEl!: HTMLElement;\n\n private pickerId = generateId('ts-date-picker');\n private triggerEl?: HTMLInputElement;\n\n /** The selected date value in ISO format (YYYY-MM-DD). */\n @Prop({ mutable: true, reflect: true }) value?: string;\n\n /** Placeholder text for the input. */\n @Prop() placeholder = 'Select date';\n\n /** Whether the date picker is disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Minimum selectable date in ISO format. */\n @Prop() min?: string;\n\n /** Maximum selectable date in ISO format. */\n @Prop() max?: string;\n\n /** Label text for the input. */\n @Prop() label?: string;\n\n /** Whether the input is in an error state. */\n @Prop({ reflect: true }) error = false;\n\n /** Error message to display. */\n @Prop() errorMessage?: string;\n\n /** The input size. */\n @Prop({ reflect: true }) size: 'sm' | 'md' | 'lg' = 'md';\n\n /** Form field name. */\n @Prop() name?: string;\n\n /** Emitted when a date is selected. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<{ value: string }>;\n\n /** Whether the calendar dropdown is open. */\n @State() isOpen = false;\n\n /** The month currently being viewed (0-11). */\n @State() viewMonth = new Date().getMonth();\n\n /** The year currently being viewed. */\n @State() viewYear = new Date().getFullYear();\n\n /** Currently focused day in the grid for keyboard navigation. */\n @State() focusedDay: number | null = null;\n\n @Watch('value')\n handleValueChange(): void {\n if (this.value) {\n const date = new Date(this.value + 'T00:00:00');\n if (!isNaN(date.getTime())) {\n this.viewMonth = date.getMonth();\n this.viewYear = date.getFullYear();\n }\n }\n }\n\n connectedCallback(): void {\n this.handleValueChange();\n }\n\n private toggleCalendar = (): void => {\n if (this.disabled) return;\n this.isOpen = !this.isOpen;\n if (this.isOpen) {\n this.handleValueChange();\n }\n };\n\n private closeCalendar = (): void => {\n this.isOpen = false;\n this.focusedDay = null;\n };\n\n private prevMonth = (): void => {\n if (this.viewMonth === 0) {\n this.viewMonth = 11;\n this.viewYear -= 1;\n } else {\n this.viewMonth -= 1;\n }\n };\n\n private nextMonth = (): void => {\n if (this.viewMonth === 11) {\n this.viewMonth = 0;\n this.viewYear += 1;\n } else {\n this.viewMonth += 1;\n }\n };\n\n private selectDay = (day: number): void => {\n const month = String(this.viewMonth + 1).padStart(2, '0');\n const dayStr = String(day).padStart(2, '0');\n const newValue = `${this.viewYear}-${month}-${dayStr}`;\n this.value = newValue;\n this.tsChange.emit({ value: newValue });\n this.closeCalendar();\n this.triggerEl?.focus();\n };\n\n private isDayDisabled(day: number): boolean {\n const dateStr = `${this.viewYear}-${String(this.viewMonth + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n if (this.min && dateStr < this.min) return true;\n if (this.max && dateStr > this.max) return true;\n return false;\n }\n\n private isToday(day: number): boolean {\n const today = new Date();\n return (\n day === today.getDate() &&\n this.viewMonth === today.getMonth() &&\n this.viewYear === today.getFullYear()\n );\n }\n\n private isSelected(day: number): boolean {\n if (!this.value) return false;\n const date = new Date(this.value + 'T00:00:00');\n return (\n day === date.getDate() &&\n this.viewMonth === date.getMonth() &&\n this.viewYear === date.getFullYear()\n );\n }\n\n private getDaysInMonth(): number {\n return new Date(this.viewYear, this.viewMonth + 1, 0).getDate();\n }\n\n private getFirstDayOfWeek(): number {\n return new Date(this.viewYear, this.viewMonth, 1).getDay();\n }\n\n private getMonthName(): string {\n return new Date(this.viewYear, this.viewMonth).toLocaleString('default', { month: 'long' });\n }\n\n private handleTriggerKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggleCalendar();\n } else if (event.key === 'Escape' && this.isOpen) {\n this.closeCalendar();\n }\n };\n\n private handleCalendarKeydown = (event: KeyboardEvent): void => {\n const daysInMonth = this.getDaysInMonth();\n\n if (event.key === 'Escape') {\n this.closeCalendar();\n this.triggerEl?.focus();\n return;\n }\n\n if (this.focusedDay === null) {\n this.focusedDay = 1;\n return;\n }\n\n let newDay = this.focusedDay;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n newDay = Math.min(this.focusedDay + 1, daysInMonth);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n newDay = Math.max(this.focusedDay - 1, 1);\n break;\n case 'ArrowDown':\n event.preventDefault();\n newDay = Math.min(this.focusedDay + 7, daysInMonth);\n break;\n case 'ArrowUp':\n event.preventDefault();\n newDay = Math.max(this.focusedDay - 7, 1);\n break;\n case 'Enter':\n event.preventDefault();\n if (!this.isDayDisabled(this.focusedDay)) {\n this.selectDay(this.focusedDay);\n }\n return;\n default:\n return;\n }\n\n this.focusedDay = newDay;\n };\n\n private handleDocumentClick = (event: MouseEvent): void => {\n const path = event.composedPath();\n if (!path.includes(this.hostEl)) {\n this.closeCalendar();\n }\n };\n\n componentDidLoad(): void {\n document.addEventListener('click', this.handleDocumentClick);\n }\n\n disconnectedCallback(): void {\n document.removeEventListener('click', this.handleDocumentClick);\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n private renderCalendar() {\n const daysInMonth = this.getDaysInMonth();\n const firstDay = this.getFirstDayOfWeek();\n const days: (number | null)[] = [];\n\n for (let i = 0; i < firstDay; i++) {\n days.push(null);\n }\n for (let d = 1; d <= daysInMonth; d++) {\n days.push(d);\n }\n\n return (\n <div\n class=\"date-picker__calendar\"\n part=\"calendar\"\n role=\"dialog\"\n aria-label={`${this.getMonthName()} ${this.viewYear}`}\n onKeyDown={this.handleCalendarKeydown}\n >\n <div class=\"date-picker__header\" part=\"header\">\n <button\n class=\"date-picker__nav-btn\"\n type=\"button\"\n aria-label=\"Previous month\"\n onClick={this.prevMonth}\n >\n ‹\n </button>\n <span class=\"date-picker__month-year\">\n {this.getMonthName()} {this.viewYear}\n </span>\n <button\n class=\"date-picker__nav-btn\"\n type=\"button\"\n aria-label=\"Next month\"\n onClick={this.nextMonth}\n >\n ›\n </button>\n </div>\n\n <div class=\"date-picker__grid\" role=\"grid\" aria-label=\"Calendar\">\n <div class=\"date-picker__weekdays\">\n {WEEKDAYS.map((wd) => (\n <span class=\"date-picker__weekday\" role=\"columnheader\" key={wd}>\n {wd}\n </span>\n ))}\n </div>\n <div class=\"date-picker__days\">\n {days.map((day, index) =>\n day === null ? (\n <span class=\"date-picker__day date-picker__day--empty\" key={`empty-${index}`} />\n ) : (\n <button\n class={{\n 'date-picker__day': true,\n 'date-picker__day--today': this.isToday(day),\n 'date-picker__day--selected': this.isSelected(day),\n 'date-picker__day--disabled': this.isDayDisabled(day),\n 'date-picker__day--focused': this.focusedDay === day,\n }}\n part=\"day\"\n type=\"button\"\n disabled={this.isDayDisabled(day)}\n tabindex={this.focusedDay === day ? 0 : -1}\n aria-label={`${day} ${this.getMonthName()} ${this.viewYear}`}\n aria-selected={this.isSelected(day) ? 'true' : undefined}\n key={`day-${day}`}\n onClick={() => this.selectDay(day)}\n >\n {day}\n </button>\n ),\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-date-picker': true,\n 'ts-date-picker--open': this.isOpen,\n 'ts-date-picker--error': this.error,\n [`ts-date-picker--${this.size}`]: true,\n }}\n >\n {this.label && (\n <label class=\"date-picker__label\" part=\"label\" htmlFor={this.pickerId}>\n {this.label}\n </label>\n )}\n\n <input\n ref={(el) => (this.triggerEl = el)}\n class=\"date-picker__trigger\"\n part=\"trigger\"\n type=\"text\"\n id={this.pickerId}\n name={this.name}\n value={this.value || ''}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readOnly\n aria-haspopup=\"dialog\"\n aria-expanded={this.isOpen ? 'true' : 'false'}\n aria-invalid={this.error ? 'true' : undefined}\n onClick={this.toggleCalendar}\n onKeyDown={this.handleTriggerKeydown}\n />\n\n {this.isOpen && this.renderCalendar()}\n\n {this.error && this.errorMessage && (\n <span class=\"date-picker__error\" part=\"error\" role=\"alert\">\n {this.errorMessage}\n </span>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"sGAAA,MAAMA,EAAgB,IAAM,y9ICI5B,MAAMC,EAAW,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,M,MAgBzCC,EAAYC,EAAA,MAAAD,UAAAE,E,2IAGfC,SAAWC,EAAW,kBACtBC,UAGgCC,MAGhCC,YAAc,cAGGC,SAAW,MAG5BC,IAGAC,IAGAC,MAGiBC,MAAQ,MAGzBC,aAGiBC,KAA2B,KAG5CC,KAG0BC,SAGzBC,OAAS,MAGTC,WAAY,IAAIC,MAAOC,WAGvBC,UAAW,IAAIF,MAAOG,cAGtBC,WAA4B,KAGrC,iBAAAC,GACE,GAAIC,KAAKnB,MAAO,CACd,MAAMoB,EAAO,IAAIP,KAAKM,KAAKnB,MAAQ,aACnC,IAAKqB,MAAMD,EAAKE,WAAY,CAC1BH,KAAKP,UAAYQ,EAAKN,WACtBK,KAAKJ,SAAWK,EAAKJ,a,GAK3B,iBAAAO,GACEJ,KAAKD,mB,CAGCM,eAAiB,KACvB,GAAIL,KAAKjB,SAAU,OACnBiB,KAAKR,QAAUQ,KAAKR,OACpB,GAAIQ,KAAKR,OAAQ,CACfQ,KAAKD,mB,GAIDO,cAAgB,KACtBN,KAAKR,OAAS,MACdQ,KAAKF,WAAa,IAAI,EAGhBS,UAAY,KAClB,GAAIP,KAAKP,YAAc,EAAG,CACxBO,KAAKP,UAAY,GACjBO,KAAKJ,UAAY,C,KACZ,CACLI,KAAKP,WAAa,C,GAIde,UAAY,KAClB,GAAIR,KAAKP,YAAc,GAAI,CACzBO,KAAKP,UAAY,EACjBO,KAAKJ,UAAY,C,KACZ,CACLI,KAAKP,WAAa,C,GAIdgB,UAAaC,IACnB,MAAMC,EAAQC,OAAOZ,KAAKP,UAAY,GAAGoB,SAAS,EAAG,KACrD,MAAMC,EAASF,OAAOF,GAAKG,SAAS,EAAG,KACvC,MAAME,EAAW,GAAGf,KAAKJ,YAAYe,KAASG,IAC9Cd,KAAKnB,MAAQkC,EACbf,KAAKT,SAASyB,KAAK,CAAEnC,MAAOkC,IAC5Bf,KAAKM,gBACLN,KAAKpB,WAAWqC,OAAO,EAGjB,aAAAC,CAAcR,GACpB,MAAMS,EAAU,GAAGnB,KAAKJ,YAAYgB,OAAOZ,KAAKP,UAAY,GAAGoB,SAAS,EAAG,QAAQD,OAAOF,GAAKG,SAAS,EAAG,OAC3G,GAAIb,KAAKhB,KAAOmC,EAAUnB,KAAKhB,IAAK,OAAO,KAC3C,GAAIgB,KAAKf,KAAOkC,EAAUnB,KAAKf,IAAK,OAAO,KAC3C,OAAO,K,CAGD,OAAAmC,CAAQV,GACd,MAAMW,EAAQ,IAAI3B,KAClB,OACEgB,IAAQW,EAAMC,WACdtB,KAAKP,YAAc4B,EAAM1B,YACzBK,KAAKJ,WAAayB,EAAMxB,a,CAIpB,UAAA0B,CAAWb,GACjB,IAAKV,KAAKnB,MAAO,OAAO,MACxB,MAAMoB,EAAO,IAAIP,KAAKM,KAAKnB,MAAQ,aACnC,OACE6B,IAAQT,EAAKqB,WACbtB,KAAKP,YAAcQ,EAAKN,YACxBK,KAAKJ,WAAaK,EAAKJ,a,CAInB,cAAA2B,GACN,OAAO,IAAI9B,KAAKM,KAAKJ,SAAUI,KAAKP,UAAY,EAAG,GAAG6B,S,CAGhD,iBAAAG,GACN,OAAO,IAAI/B,KAAKM,KAAKJ,SAAUI,KAAKP,UAAW,GAAGiC,Q,CAG5C,YAAAC,GACN,OAAO,IAAIjC,KAAKM,KAAKJ,SAAUI,KAAKP,WAAWmC,eAAe,UAAW,CAAEjB,MAAO,Q,CAG5EkB,qBAAwBC,IAC9B,GAAIA,EAAMC,MAAQ,SAAWD,EAAMC,MAAQ,IAAK,CAC9CD,EAAME,iBACNhC,KAAKK,gB,MACA,GAAIyB,EAAMC,MAAQ,UAAY/B,KAAKR,OAAQ,CAChDQ,KAAKM,e,GAID2B,sBAAyBH,IAC/B,MAAMI,EAAclC,KAAKwB,iBAEzB,GAAIM,EAAMC,MAAQ,SAAU,CAC1B/B,KAAKM,gBACLN,KAAKpB,WAAWqC,QAChB,M,CAGF,GAAIjB,KAAKF,aAAe,KAAM,CAC5BE,KAAKF,WAAa,EAClB,M,CAGF,IAAIqC,EAASnC,KAAKF,WAElB,OAAQgC,EAAMC,KACZ,IAAK,aACHD,EAAME,iBACNG,EAASC,KAAKpD,IAAIgB,KAAKF,WAAa,EAAGoC,GACvC,MACF,IAAK,YACHJ,EAAME,iBACNG,EAASC,KAAKnD,IAAIe,KAAKF,WAAa,EAAG,GACvC,MACF,IAAK,YACHgC,EAAME,iBACNG,EAASC,KAAKpD,IAAIgB,KAAKF,WAAa,EAAGoC,GACvC,MACF,IAAK,UACHJ,EAAME,iBACNG,EAASC,KAAKnD,IAAIe,KAAKF,WAAa,EAAG,GACvC,MACF,IAAK,QACHgC,EAAME,iBACN,IAAKhC,KAAKkB,cAAclB,KAAKF,YAAa,CACxCE,KAAKS,UAAUT,KAAKF,W,CAEtB,OACF,QACE,OAGJE,KAAKF,WAAaqC,CAAM,EAGlBE,oBAAuBP,IAC7B,MAAMQ,EAAOR,EAAMS,eACnB,IAAKD,EAAKE,SAASxC,KAAKyC,QAAS,CAC/BzC,KAAKM,e,GAIT,gBAAAoC,GACEC,SAASC,iBAAiB,QAAS5C,KAAKqC,oB,CAG1C,oBAAAQ,GACEF,SAASG,oBAAoB,QAAS9C,KAAKqC,oB,CAIrC,cAAAU,GACN,MAAMb,EAAclC,KAAKwB,iBACzB,MAAMwB,EAAWhD,KAAKyB,oBACtB,MAAMwB,EAA0B,GAEhC,IAAK,IAAIC,EAAI,EAAGA,EAAIF,EAAUE,IAAK,CACjCD,EAAKE,KAAK,K,CAEZ,IAAK,IAAIC,EAAI,EAAGA,GAAKlB,EAAakB,IAAK,CACrCH,EAAKE,KAAKC,E,CAGZ,OACEC,EAAA,OACEC,MAAM,wBACNC,KAAK,WACLC,KAAK,SAAQ,aACD,GAAGxD,KAAK2B,kBAAkB3B,KAAKJ,WAC3C6D,UAAWzD,KAAKiC,uBAEhBoB,EAAA,OAAKC,MAAM,sBAAsBC,KAAK,UACpCF,EAAA,UACEC,MAAM,uBACNI,KAAK,SAAQ,aACF,iBACXC,QAAS3D,KAAKO,WAAS,KAIzB8C,EAAA,QAAMC,MAAM,2BACTtD,KAAK2B,eAAc,IAAG3B,KAAKJ,UAE9ByD,EAAA,UACEC,MAAM,uBACNI,KAAK,SAAQ,aACF,aACXC,QAAS3D,KAAKQ,WAAS,MAM3B6C,EAAA,OAAKC,MAAM,oBAAoBE,KAAK,OAAM,aAAY,YACpDH,EAAA,OAAKC,MAAM,yBACRhF,EAASsF,KAAKC,GACbR,EAAA,QAAMC,MAAM,uBAAuBE,KAAK,eAAezB,IAAK8B,GACzDA,MAIPR,EAAA,OAAKC,MAAM,qBACRL,EAAKW,KAAI,CAAClD,EAAKoD,IACdpD,IAAQ,KACN2C,EAAA,QAAMC,MAAM,2CAA2CvB,IAAK,SAAS+B,MAErET,EAAA,UACEC,MAAO,CACL,mBAAoB,KACpB,0BAA2BtD,KAAKoB,QAAQV,GACxC,6BAA8BV,KAAKuB,WAAWb,GAC9C,6BAA8BV,KAAKkB,cAAcR,GACjD,4BAA6BV,KAAKF,aAAeY,GAEnD6C,KAAK,MACLG,KAAK,SACL3E,SAAUiB,KAAKkB,cAAcR,GAC7BqD,SAAU/D,KAAKF,aAAeY,EAAM,GAAI,EAAE,aAC9B,GAAGA,KAAOV,KAAK2B,kBAAkB3B,KAAKJ,WAAU,gBAC7CI,KAAKuB,WAAWb,GAAO,OAASsD,UAC/CjC,IAAK,OAAOrB,IACZiD,QAAS,IAAM3D,KAAKS,UAAUC,IAE7BA,O,CAWjB,MAAAuD,GACE,OACEZ,EAACa,EAAI,CAAAnC,IAAA,2CACHuB,MAAO,CACL,iBAAkB,KAClB,uBAAwBtD,KAAKR,OAC7B,wBAAyBQ,KAAKb,MAC9B,CAAC,mBAAmBa,KAAKX,QAAS,OAGnCW,KAAKd,OACJmE,EAAA,SAAAtB,IAAA,2CAAOuB,MAAM,qBAAqBC,KAAK,QAAQY,QAASnE,KAAKtB,UAC1DsB,KAAKd,OAIVmE,EAAA,SAAAtB,IAAA,2CACEqC,IAAMC,GAAQrE,KAAKpB,UAAYyF,EAC/Bf,MAAM,uBACNC,KAAK,UACLG,KAAK,OACLY,GAAItE,KAAKtB,SACTY,KAAMU,KAAKV,KACXT,MAAOmB,KAAKnB,OAAS,GACrBC,YAAakB,KAAKlB,YAClBC,SAAUiB,KAAKjB,SACfwF,SAAQ,qBACM,SAAQ,gBACPvE,KAAKR,OAAS,OAAS,QAAO,eAC/BQ,KAAKb,MAAQ,OAAS6E,UACpCL,QAAS3D,KAAKK,eACdoD,UAAWzD,KAAK6B,uBAGjB7B,KAAKR,QAAUQ,KAAK+C,iBAEpB/C,KAAKb,OAASa,KAAKZ,cAClBiE,EAAA,QAAAtB,IAAA,2CAAMuB,MAAM,qBAAqBC,KAAK,QAAQC,KAAK,SAChDxD,KAAKZ,c","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["toolbarCss","TsToolbar","__stencil_proxyCustomElement","HTMLElement","variant","size","render","h","Host","key","class","this","role","part","name"],"sources":["src/components/toolbar/toolbar.css?tag=ts-toolbar&encapsulation=shadow","src/components/toolbar/toolbar.tsx"],"sourcesContent":["/* ==========================================================================\n ts-toolbar — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-toolbar-bg Background color\n --ts-toolbar-border-color Border color\n --ts-toolbar-padding Padding\n --ts-toolbar-gap Gap between items\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-toolbar-bg: var(--ts-color-bg-surface);\n --ts-toolbar-border-color: var(--ts-color-border-subtle);\n --ts-toolbar-padding: var(--ts-spacing-3);\n --ts-toolbar-gap: var(--ts-spacing-2);\n}\n\n.toolbar__base {\n display: flex;\n align-items: center;\n gap: var(--ts-toolbar-gap);\n padding-inline: var(--ts-toolbar-padding);\n padding-block: var(--ts-toolbar-padding);\n background-color: var(--ts-toolbar-bg);\n}\n\n/* ---- Variants ---- */\n:host([variant=\"bordered\"]) .toolbar__base {\n border-block-end: 1px solid var(--ts-toolbar-border-color);\n}\n\n:host([variant=\"elevated\"]) .toolbar__base {\n box-shadow: var(--ts-shadow-sm);\n border-radius: var(--ts-radius-md);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .toolbar__base {\n padding-inline: var(--ts-spacing-2);\n padding-block: var(--ts-spacing-1);\n gap: var(--ts-spacing-1);\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .toolbar__base {\n padding-inline: var(--ts-spacing-3);\n padding-block: var(--ts-spacing-2);\n gap: var(--ts-spacing-2);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .toolbar__base {\n padding-inline: var(--ts-spacing-4);\n padding-block: var(--ts-spacing-3);\n gap: var(--ts-spacing-3);\n font-size: var(--ts-font-size-lg);\n}\n\n/* ---- Layout sections ---- */\n.toolbar__start {\n display: flex;\n align-items: center;\n gap: var(--ts-toolbar-gap);\n flex-shrink: 0;\n}\n\n.toolbar__center {\n display: flex;\n align-items: center;\n gap: var(--ts-toolbar-gap);\n flex: 1;\n min-inline-size: 0;\n}\n\n.toolbar__end {\n display: flex;\n align-items: center;\n gap: var(--ts-toolbar-gap);\n flex-shrink: 0;\n margin-inline-start: auto;\n}\n\n.toolbar__start:empty,\n.toolbar__end:empty {\n display: none;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\nimport type { TsSize } from '../../types';\n\n/**\n * @slot - Default slot for toolbar items (center).\n * @slot start - Left/start-aligned items.\n * @slot end - Right/end-aligned items.\n *\n * @part base - The toolbar container.\n * @part start - The start slot wrapper.\n * @part center - The center/default slot wrapper.\n * @part end - The end slot wrapper.\n */\n@Component({\n tag: 'ts-toolbar',\n styleUrl: 'toolbar.css',\n shadow: true,\n})\nexport class TsToolbar {\n /** The toolbar variant style. */\n @Prop({ reflect: true }) variant: 'default' | 'bordered' | 'elevated' = 'default';\n\n /** The toolbar size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-toolbar': true,\n [`ts-toolbar--${this.variant}`]: true,\n [`ts-toolbar--${this.size}`]: true,\n }}\n role=\"toolbar\"\n aria-orientation=\"horizontal\"\n >\n <div class=\"toolbar__base\" part=\"base\">\n <div class=\"toolbar__start\" part=\"start\">\n <slot name=\"start\" />\n </div>\n\n <div class=\"toolbar__center\" part=\"center\">\n <slot />\n </div>\n\n <div class=\"toolbar__end\" part=\"end\">\n <slot name=\"end\" />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAa,IAAM,k8C,MCkBZC,EAASC,EAAA,MAAAD,UAAAE,E,iFAEKC,QAA+C,UAG/CC,KAAe,KAGxC,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,aAAc,KACd,CAAC,eAAeC,KAAKP,WAAY,KACjC,CAAC,eAAeO,KAAKN,QAAS,MAEhCO,KAAK,UAAS,mBACG,cAEjBL,EAAA,OAAAE,IAAA,2CAAKC,MAAM,gBAAgBG,KAAK,QAC9BN,EAAA,OAAAE,IAAA,2CAAKC,MAAM,iBAAiBG,KAAK,SAC/BN,EAAA,QAAAE,IAAA,2CAAMK,KAAK,WAGbP,EAAA,OAAAE,IAAA,2CAAKC,MAAM,kBAAkBG,KAAK,UAChCN,EAAA,QAAAE,IAAA,8CAGFF,EAAA,OAAAE,IAAA,2CAAKC,MAAM,eAAeG,KAAK,OAC7BN,EAAA,QAAAE,IAAA,2CAAMK,KAAK,U","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["dividerCss","TsDivider","__stencil_proxyCustomElement","HTMLElement","orientation","variant","label","render","hasLabel","this","h","Host","key","class","role","part"],"sources":["src/components/divider/divider.css?tag=ts-divider&encapsulation=shadow","src/components/divider/divider.tsx"],"sourcesContent":["/* ==========================================================================\n ts-divider — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-divider-color Line color\n --ts-divider-spacing Spacing above/below (or left/right for vertical)\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-divider-color: var(--ts-color-border-subtle);\n --ts-divider-spacing: var(--ts-spacing-3);\n}\n\n/* ---- Horizontal ---- */\n:host([orientation=\"horizontal\"]) {\n inline-size: 100%;\n padding-block: var(--ts-divider-spacing);\n}\n\n:host([orientation=\"horizontal\"]) .divider__base {\n display: flex;\n align-items: center;\n inline-size: 100%;\n}\n\n:host([orientation=\"horizontal\"]:not([class*=\"has-label\"])) .divider__line {\n flex: 1;\n block-size: 0;\n border-block-start: 1px solid var(--ts-divider-color);\n}\n\n:host([orientation=\"horizontal\"]) .divider__line--start,\n:host([orientation=\"horizontal\"]) .divider__line--end {\n flex: 1;\n block-size: 0;\n border-block-start: 1px solid var(--ts-divider-color);\n}\n\n/* ---- Dashed ---- */\n:host([variant=\"dashed\"]) .divider__line,\n:host([variant=\"dashed\"]) .divider__line--start,\n:host([variant=\"dashed\"]) .divider__line--end {\n border-block-start-style: dashed;\n}\n\n/* ---- Dotted ---- */\n:host([variant=\"dotted\"]) .divider__line,\n:host([variant=\"dotted\"]) .divider__line--start,\n:host([variant=\"dotted\"]) .divider__line--end {\n border-block-start-style: dotted;\n}\n\n/* ---- Label ---- */\n.divider__label {\n padding-inline: var(--ts-spacing-3);\n font-size: var(--ts-font-size-xs);\n color: var(--ts-color-text-secondary);\n white-space: nowrap;\n line-height: 1;\n}\n\n/* ---- Vertical ---- */\n:host([orientation=\"vertical\"]) {\n display: inline-block;\n block-size: 100%;\n padding-inline: var(--ts-divider-spacing);\n}\n\n:host([orientation=\"vertical\"]) .divider__base {\n display: flex;\n block-size: 100%;\n}\n\n:host([orientation=\"vertical\"]) .divider__line {\n inline-size: 0;\n block-size: 100%;\n border-inline-start: 1px solid var(--ts-divider-color);\n}\n\n:host([orientation=\"vertical\"][variant=\"dashed\"]) .divider__line {\n border-inline-start-style: dashed;\n}\n\n:host([orientation=\"vertical\"][variant=\"dotted\"]) .divider__line {\n border-inline-start-style: dotted;\n}\n\n/* ---- Has-label class (for horizontal with text) ---- */\n.ts-divider--has-label .divider__line {\n /* overridden by --start/--end when label present */\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @part base - The divider line element.\n * @part label - The optional label text.\n */\n@Component({\n tag: 'ts-divider',\n styleUrl: 'divider.css',\n shadow: true,\n})\nexport class TsDivider {\n /** The divider orientation. */\n @Prop({ reflect: true }) orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n /** The line style variant. */\n @Prop({ reflect: true }) variant: 'solid' | 'dashed' | 'dotted' = 'solid';\n\n /** Optional label text displayed in the center of the divider. */\n @Prop() label?: string;\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const hasLabel = !!this.label;\n\n return (\n <Host\n class={{\n 'ts-divider': true,\n [`ts-divider--${this.orientation}`]: true,\n [`ts-divider--${this.variant}`]: true,\n 'ts-divider--has-label': hasLabel,\n }}\n role=\"separator\"\n aria-orientation={this.orientation}\n >\n {hasLabel && this.orientation === 'horizontal' ? (\n <div class=\"divider__base\" part=\"base\">\n <span class=\"divider__line divider__line--start\" />\n <span class=\"divider__label\" part=\"label\">{this.label}</span>\n <span class=\"divider__line divider__line--end\" />\n </div>\n ) : (\n <div class=\"divider__base\" part=\"base\">\n <span class=\"divider__line\" />\n </div>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAa,IAAM,grD,MCWZC,EAASC,EAAA,MAAAD,UAAAE,E,iFAEKC,YAAyC,aAGzCC,QAAyC,QAG1DC,MAGR,MAAAC,GACE,MAAMC,IAAaC,KAAKH,MAExB,OACEI,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,aAAc,KACd,CAAC,eAAeJ,KAAKL,eAAgB,KACrC,CAAC,eAAeK,KAAKJ,WAAY,KACjC,wBAAyBG,GAE3BM,KAAK,YAAW,mBACEL,KAAKL,aAEtBI,GAAYC,KAAKL,cAAgB,aAChCM,EAAA,OAAKG,MAAM,gBAAgBE,KAAK,QAC9BL,EAAA,QAAMG,MAAM,uCACZH,EAAA,QAAMG,MAAM,iBAAiBE,KAAK,SAASN,KAAKH,OAChDI,EAAA,QAAMG,MAAM,sCAGdH,EAAA,OAAKG,MAAM,gBAAgBE,KAAK,QAC9BL,EAAA,QAAMG,MAAM,mB","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["menuItemCss","TsMenuItem","__stencil_proxyCustomElement","HTMLElement","disabled","value","href","tsSelect","baseEl","setFocus","this","focus","connectedCallback","hostEl","addEventListener","handleClick","emit","handleKeydown","event","key","preventDefault","render","isLink","Tag","linkAttrs","undefined","h","Host","class","ref","el","part","role","tabindex","onClick","onKeyDown","name"],"sources":["src/components/menu/menu-item.css?tag=ts-menu-item&encapsulation=shadow","src/components/menu/menu-item.tsx"],"sourcesContent":["/* ==========================================================================\n ts-menu-item — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-menu-item-height Item minimum height\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-menu-item-height: 2.25rem;\n}\n\n/* ---- Base ---- */\n.menu-item__base {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-2);\n min-block-size: var(--ts-menu-item-height);\n padding-inline: var(--ts-spacing-3);\n padding-block: var(--ts-spacing-1);\n font-size: var(--ts-font-size-sm);\n color: var(--ts-color-text-primary);\n text-decoration: none;\n cursor: pointer;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n outline: none;\n border: none;\n background: none;\n width: 100%;\n white-space: nowrap;\n}\n\n.menu-item__base:hover:not([aria-disabled=\"true\"]) {\n background-color: var(--ts-color-bg-hover);\n}\n\n.menu-item__base:focus-visible {\n background-color: var(--ts-color-bg-hover);\n box-shadow: inset 0 0 0 2px var(--ts-color-interactive-primary);\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) .menu-item__base {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Slot wrappers ---- */\n.menu-item__prefix,\n.menu-item__suffix {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.menu-item__prefix:empty,\n.menu-item__suffix:empty {\n display: none;\n}\n\n.menu-item__label {\n display: inline-flex;\n align-items: center;\n flex-grow: 1;\n}\n\n.menu-item__suffix {\n margin-inline-start: auto;\n padding-inline-start: var(--ts-spacing-3);\n color: var(--ts-color-text-tertiary);\n font-size: var(--ts-font-size-xs);\n}\n","import { Component, Prop, Event, h, Host, Element, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\n/**\n * @slot - Default slot for menu item label content.\n * @slot prefix - Content before the label (e.g., icon).\n * @slot suffix - Content after the label (e.g., shortcut or badge).\n *\n * @part base - The menu item container element.\n * @part prefix - The prefix slot wrapper.\n * @part label - The label wrapper.\n * @part suffix - The suffix slot wrapper.\n */\n@Component({\n tag: 'ts-menu-item',\n styleUrl: 'menu-item.css',\n shadow: true,\n})\nexport class TsMenuItem {\n @Element() hostEl!: HTMLElement;\n\n /** Disables the menu item. */\n @Prop({ reflect: true }) disabled = false;\n\n /** The value associated with this menu item. */\n @Prop({ reflect: true }) value = '';\n\n /** If provided, renders the item as a link. */\n @Prop() href?: string;\n\n /** Emitted when the menu item is selected. */\n @Event({ eventName: 'tsSelect' }) tsSelect!: EventEmitter<{ value: string }>;\n\n private baseEl?: HTMLElement;\n\n /** Focus the menu item. */\n @Method()\n async setFocus(): Promise<void> {\n this.baseEl?.focus();\n }\n\n connectedCallback(): void {\n // Allow the host element to delegate focus to the inner element\n this.hostEl.addEventListener('focus', () => {\n this.baseEl?.focus();\n });\n }\n\n private handleClick = (): void => {\n if (this.disabled) return;\n this.tsSelect.emit({ value: this.value });\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (this.disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.tsSelect.emit({ value: this.value });\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const isLink = !!this.href;\n const Tag = isLink ? 'a' : 'div';\n\n const linkAttrs = isLink\n ? {\n href: this.disabled ? undefined : this.href,\n }\n : {};\n\n return (\n <Host\n class={{\n 'ts-menu-item': true,\n 'ts-menu-item--disabled': this.disabled,\n }}\n >\n <Tag\n {...linkAttrs}\n ref={(el) => (this.baseEl = el as HTMLElement)}\n class=\"menu-item__base\"\n part=\"base\"\n role=\"menuitem\"\n tabindex={this.disabled ? -1 : 0}\n aria-disabled={this.disabled ? 'true' : undefined}\n onClick={this.handleClick}\n onKeyDown={this.handleKeydown}\n >\n <span class=\"menu-item__prefix\" part=\"prefix\">\n <slot name=\"prefix\" />\n </span>\n\n <span class=\"menu-item__label\" part=\"label\">\n <slot />\n </span>\n\n <span class=\"menu-item__suffix\" part=\"suffix\">\n <slot name=\"suffix\" />\n </span>\n </Tag>\n </Host>\n );\n }\n}\n"],"mappings":"uEAAA,MAAMA,EAAc,IAAM,ktC,MCkBbC,EAAUC,EAAA,MAAAD,UAAAE,E,2IAIIC,SAAW,MAGXC,MAAQ,GAGzBC,KAG0BC,SAE1BC,OAIR,cAAMC,GACJC,KAAKF,QAAQG,O,CAGf,iBAAAC,GAEEF,KAAKG,OAAOC,iBAAiB,SAAS,KACpCJ,KAAKF,QAAQG,OAAO,G,CAIhBI,YAAc,KACpB,GAAIL,KAAKN,SAAU,OACnBM,KAAKH,SAASS,KAAK,CAAEX,MAAOK,KAAKL,OAAQ,EAGnCY,cAAiBC,IACvB,GAAIR,KAAKN,SAAU,OACnB,GAAIc,EAAMC,MAAQ,SAAWD,EAAMC,MAAQ,IAAK,CAC9CD,EAAME,iBACNV,KAAKH,SAASS,KAAK,CAAEX,MAAOK,KAAKL,O,GAKrC,MAAAgB,GACE,MAAMC,IAAWZ,KAAKJ,KACtB,MAAMiB,EAAMD,EAAS,IAAM,MAE3B,MAAME,EAAYF,EACd,CACEhB,KAAMI,KAAKN,SAAWqB,UAAYf,KAAKJ,MAEzC,GAEJ,OACEoB,EAACC,EAAI,CAAAR,IAAA,2CACHS,MAAO,CACL,eAAgB,KAChB,yBAA0BlB,KAAKN,WAGjCsB,EAACH,EAAG,CAAAJ,IAAA,8CACEK,EACJK,IAAMC,GAAQpB,KAAKF,OAASsB,EAC5BF,MAAM,kBACNG,KAAK,OACLC,KAAK,WACLC,SAAUvB,KAAKN,UAAW,EAAK,EAAC,gBACjBM,KAAKN,SAAW,OAASqB,UACxCS,QAASxB,KAAKK,YACdoB,UAAWzB,KAAKO,eAEhBS,EAAA,QAAAP,IAAA,2CAAMS,MAAM,oBAAoBG,KAAK,UACnCL,EAAA,QAAAP,IAAA,2CAAMiB,KAAK,YAGbV,EAAA,QAAAP,IAAA,2CAAMS,MAAM,mBAAmBG,KAAK,SAClCL,EAAA,QAAAP,IAAA,8CAGFO,EAAA,QAAAP,IAAA,2CAAMS,MAAM,oBAAoBG,KAAK,UACnCL,EAAA,QAAAP,IAAA,2CAAMiB,KAAK,a","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["switchGroupCss","TsSwitchGroup","__stencil_proxyCustomElement","HTMLElement","value","size","disabled","fullWidth","tsChange","onValueChange","this","syncOptions","handleOptionSelect","event","stopPropagation","selectOption","detail","handleKeyDown","options","getOptions","enabledOptions","filter","o","length","currentIndex","findIndex","key","preventDefault","nextIndex","prevIndex","componentDidLoad","Array","from","hostEl","querySelectorAll","emit","forEach","option","active","handleSlotChange","render","h","Host","class","role","part","onSlotchange"],"sources":["src/components/switch-group/switch-group.css?tag=ts-switch-group&encapsulation=shadow","src/components/switch-group/switch-group.tsx"],"sourcesContent":["/* ==========================================================================\n ts-switch-group — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-switch-group-bg Background color\n --ts-switch-group-active-bg Active segment background\n --ts-switch-group-radius Border radius\n ========================================================================== */\n\n:host {\n display: inline-flex;\n font-family: var(--ts-font-family-base);\n\n --ts-switch-group-bg: var(--ts-color-neutral-100);\n --ts-switch-group-active-bg: var(--ts-color-bg-elevated);\n --ts-switch-group-radius: var(--ts-shape-interactive);\n}\n\n:host([full-width]) {\n display: flex;\n inline-size: 100%;\n}\n\n.switch-group__base {\n display: inline-flex;\n align-items: center;\n gap: var(--ts-spacing-1);\n padding: var(--ts-spacing-1);\n background-color: var(--ts-switch-group-bg);\n border-radius: var(--ts-switch-group-radius);\n inline-size: 100%;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .switch-group__base {\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .switch-group__base {\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .switch-group__base {\n font-size: var(--ts-font-size-lg);\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) {\n opacity: 0.5;\n pointer-events: none;\n}\n","import { Component, Prop, Event, h, Host, Element, Listen, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize } from '../../types';\n\n/**\n * @slot - Default slot for ts-switch-option children.\n *\n * @part base - The switch group container.\n */\n@Component({\n tag: 'ts-switch-group',\n styleUrl: 'switch-group.css',\n shadow: true,\n})\nexport class TsSwitchGroup {\n @Element() hostEl!: HTMLElement;\n\n /** The currently active segment value. */\n @Prop({ reflect: true, mutable: true }) value?: string;\n\n /** The size of the switch group. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Disables the entire group. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Stretch to fill the container width. */\n @Prop({ reflect: true }) fullWidth = false;\n\n /** Emitted when the active value changes. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<{ value: string }>;\n\n @Watch('value')\n onValueChange(): void {\n this.syncOptions();\n }\n\n @Listen('tsOptionSelect')\n handleOptionSelect(event: CustomEvent<{ value: string }>): void {\n event.stopPropagation();\n if (this.disabled) return;\n this.selectOption(event.detail.value);\n }\n\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent): void {\n if (this.disabled) return;\n\n const options = this.getOptions();\n const enabledOptions = options.filter(o => !o.disabled);\n if (enabledOptions.length === 0) return;\n\n const currentIndex = enabledOptions.findIndex(o => o.value === this.value);\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n event.preventDefault();\n {\n const nextIndex = (currentIndex + 1) % enabledOptions.length;\n this.selectOption(enabledOptions[nextIndex].value);\n }\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n event.preventDefault();\n {\n const prevIndex = (currentIndex - 1 + enabledOptions.length) % enabledOptions.length;\n this.selectOption(enabledOptions[prevIndex].value);\n }\n break;\n case 'Home':\n event.preventDefault();\n this.selectOption(enabledOptions[0].value);\n break;\n case 'End':\n event.preventDefault();\n this.selectOption(enabledOptions[enabledOptions.length - 1].value);\n break;\n }\n }\n\n componentDidLoad(): void {\n this.syncOptions();\n }\n\n private getOptions(): HTMLTsSwitchOptionElement[] {\n return Array.from(this.hostEl.querySelectorAll('ts-switch-option')) as HTMLTsSwitchOptionElement[];\n }\n\n private selectOption(value: string): void {\n if (value !== this.value) {\n this.value = value;\n this.tsChange.emit({ value });\n }\n this.syncOptions();\n }\n\n private syncOptions(): void {\n const options = this.getOptions();\n options.forEach(option => {\n (option as unknown as { active: boolean }).active = option.value === this.value;\n });\n }\n\n private handleSlotChange = (): void => {\n this.syncOptions();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-switch-group': true,\n [`ts-switch-group--${this.size}`]: true,\n 'ts-switch-group--disabled': this.disabled,\n 'ts-switch-group--full-width': this.fullWidth,\n }}\n role=\"radiogroup\"\n >\n <div class=\"switch-group__base\" part=\"base\">\n <slot onSlotchange={this.handleSlotChange} />\n </div>\n </Host>\n );\n }\n}\n\ninterface HTMLTsSwitchOptionElement extends HTMLElement {\n value: string;\n disabled: boolean;\n active: boolean;\n}\n"],"mappings":"uEAAA,MAAMA,EAAiB,IAAM,qvB,MCchBC,EAAaC,EAAA,MAAAD,UAAAE,E,2IAIgBC,MAGfC,KAAe,KAGfC,SAAW,MAGXC,UAAY,MAGHC,SAGlC,aAAAC,GACEC,KAAKC,a,CAIP,kBAAAC,CAAmBC,GACjBA,EAAMC,kBACN,GAAIJ,KAAKJ,SAAU,OACnBI,KAAKK,aAAaF,EAAMG,OAAOZ,M,CAIjC,aAAAa,CAAcJ,GACZ,GAAIH,KAAKJ,SAAU,OAEnB,MAAMY,EAAUR,KAAKS,aACrB,MAAMC,EAAiBF,EAAQG,QAAOC,IAAMA,EAAEhB,WAC9C,GAAIc,EAAeG,SAAW,EAAG,OAEjC,MAAMC,EAAeJ,EAAeK,WAAUH,GAAKA,EAAElB,QAAUM,KAAKN,QAEpE,OAAQS,EAAMa,KACZ,IAAK,aACL,IAAK,YACHb,EAAMc,iBACN,CACE,MAAMC,GAAaJ,EAAe,GAAKJ,EAAeG,OACtDb,KAAKK,aAAaK,EAAeQ,GAAWxB,M,CAE9C,MACF,IAAK,YACL,IAAK,UACHS,EAAMc,iBACN,CACE,MAAME,GAAaL,EAAe,EAAIJ,EAAeG,QAAUH,EAAeG,OAC9Eb,KAAKK,aAAaK,EAAeS,GAAWzB,M,CAE9C,MACF,IAAK,OACHS,EAAMc,iBACNjB,KAAKK,aAAaK,EAAe,GAAGhB,OACpC,MACF,IAAK,MACHS,EAAMc,iBACNjB,KAAKK,aAAaK,EAAeA,EAAeG,OAAS,GAAGnB,OAC5D,M,CAIN,gBAAA0B,GACEpB,KAAKC,a,CAGC,UAAAQ,GACN,OAAOY,MAAMC,KAAKtB,KAAKuB,OAAOC,iBAAiB,oB,CAGzC,YAAAnB,CAAaX,GACnB,GAAIA,IAAUM,KAAKN,MAAO,CACxBM,KAAKN,MAAQA,EACbM,KAAKF,SAAS2B,KAAK,CAAE/B,S,CAEvBM,KAAKC,a,CAGC,WAAAA,GACN,MAAMO,EAAUR,KAAKS,aACrBD,EAAQkB,SAAQC,IACbA,EAA0CC,OAASD,EAAOjC,QAAUM,KAAKN,KAAK,G,CAI3EmC,iBAAmB,KACzB7B,KAAKC,aAAa,EAIpB,MAAA6B,GACE,OACEC,EAACC,EAAI,CAAAhB,IAAA,2CACHiB,MAAO,CACL,kBAAmB,KACnB,CAAC,oBAAoBjC,KAAKL,QAAS,KACnC,4BAA6BK,KAAKJ,SAClC,8BAA+BI,KAAKH,WAEtCqC,KAAK,cAELH,EAAA,OAAAf,IAAA,2CAAKiB,MAAM,qBAAqBE,KAAK,QACnCJ,EAAA,QAAAf,IAAA,2CAAMoB,aAAcpC,KAAK6B,oB","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["dialogCss","TsDialog","__stencil_proxyCustomElement","HTMLElement","dialogEl","removeFocusTrap","previouslyFocused","dialogId","generateId","open","heading","size","dismissible","tsClose","isAnimating","handleOpenChange","isOpen","this","openDialog","closeDialog","show","close","document","activeElement","body","style","overflow","requestAnimationFrame","trapFocus","focus","emit","disconnectedCallback","handleOverlayClick","handleDialogClick","event","stopPropagation","handleKeydown","key","handleCloseClick","render","headingId","h","Host","class","onKeyDown","part","onClick","ref","el","dialog__panel","role","undefined","tabindex","type","id","name"],"sources":["src/components/dialog/dialog.css?tag=ts-dialog&encapsulation=shadow","src/components/dialog/dialog.tsx"],"sourcesContent":["/* ==========================================================================\n ts-dialog — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-dialog-bg Dialog background\n --ts-dialog-radius Dialog border radius\n --ts-dialog-shadow Dialog box-shadow\n --ts-dialog-overlay-bg Overlay background\n ========================================================================== */\n\n:host {\n font-family: var(--ts-font-family-base);\n\n --ts-dialog-bg: var(--ts-color-bg-elevated);\n --ts-dialog-radius: var(--ts-shape-overlay);\n --ts-dialog-shadow: var(--ts-shadow-xl);\n --ts-dialog-overlay-bg: var(--ts-color-bg-overlay);\n}\n\n/* ---- Overlay ---- */\n.dialog__overlay {\n position: fixed;\n inset: 0;\n z-index: var(--ts-z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--ts-spacing-4);\n background-color: var(--ts-dialog-overlay-bg);\n animation: ts-dialog-fade-in 200ms ease-out;\n}\n\n/* ---- Panel ---- */\n.dialog__panel {\n position: relative;\n background-color: var(--ts-dialog-bg);\n border-radius: var(--ts-dialog-radius);\n box-shadow: var(--ts-dialog-shadow);\n max-height: calc(100vh - var(--ts-spacing-16));\n overflow-y: auto;\n animation: ts-dialog-scale-in 250ms cubic-bezier(0.16, 1, 0.3, 1);\n outline: none;\n}\n\n/* ---- Sizes ---- */\n.dialog__panel--sm { width: 100%; max-width: 400px; }\n.dialog__panel--md { width: 100%; max-width: 520px; }\n.dialog__panel--lg { width: 100%; max-width: 680px; }\n\n/* ---- Close Button ---- */\n.dialog__close {\n position: absolute;\n inset-block-start: var(--ts-spacing-3);\n inset-inline-end: var(--ts-spacing-3);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: none;\n border-radius: var(--ts-radius-md);\n background: transparent;\n color: var(--ts-color-text-tertiary);\n font-size: var(--ts-font-size-md);\n cursor: pointer;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n z-index: 1;\n padding: 0;\n line-height: 1;\n}\n\n.dialog__close:hover {\n background-color: var(--ts-color-bg-hover);\n color: var(--ts-color-text-secondary);\n}\n\n.dialog__close:focus-visible {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Header ---- */\n.dialog__header {\n padding: var(--ts-spacing-5) var(--ts-spacing-6) var(--ts-spacing-3);\n font-size: var(--ts-font-size-lg);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-primary);\n padding-inline-end: var(--ts-spacing-10);\n}\n\n/* ---- Body ---- */\n.dialog__body {\n padding: var(--ts-spacing-3) var(--ts-spacing-6);\n font-size: var(--ts-font-size-md);\n color: var(--ts-color-text-secondary);\n line-height: var(--ts-line-height-normal);\n}\n\n/* ---- Footer ---- */\n.dialog__footer {\n padding: var(--ts-spacing-3) var(--ts-spacing-6) var(--ts-spacing-5);\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--ts-spacing-2);\n}\n\n.dialog__footer:empty {\n display: none;\n}\n\n/* ---- Animations ---- */\n@keyframes ts-dialog-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes ts-dialog-scale-in {\n from {\n opacity: 0;\n transform: scale(0.95) translateY(8px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n","import { Component, Prop, State, Event, h, Host, Element, Watch, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport { generateId, trapFocus } from '../../utils/aria';\n\n/**\n * @slot - Default slot for dialog body content.\n * @slot footer - Footer content (e.g., action buttons).\n *\n * @part overlay - The backdrop overlay.\n * @part dialog - The dialog container.\n * @part header - The heading wrapper.\n * @part body - The body content wrapper.\n * @part footer - The footer wrapper.\n * @part close - The close button.\n */\n@Component({\n tag: 'ts-dialog',\n styleUrl: 'dialog.css',\n shadow: true,\n})\nexport class TsDialog {\n @Element() hostEl!: HTMLElement;\n\n private dialogEl?: HTMLElement;\n private removeFocusTrap?: () => void;\n private previouslyFocused?: HTMLElement;\n private dialogId = generateId('ts-dialog');\n\n /** Whether the dialog is open. */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n /** The dialog heading text. */\n @Prop() heading?: string;\n\n /** The dialog's width size preset. */\n @Prop({ reflect: true }) size: 'sm' | 'md' | 'lg' = 'sm';\n\n /** Whether the dialog can be dismissed via close button, Escape, or overlay click. */\n @Prop() dismissible = true;\n\n /** Emitted when the dialog is closed. */\n @Event({ eventName: 'tsClose' }) tsClose!: EventEmitter<void>;\n\n /** Internal animation state. */\n @State() isAnimating = false;\n\n @Watch('open')\n handleOpenChange(isOpen: boolean): void {\n if (isOpen) {\n this.openDialog();\n } else {\n this.closeDialog();\n }\n }\n\n /** Programmatically open the dialog. */\n @Method()\n async show(): Promise<void> {\n this.open = true;\n }\n\n /** Programmatically close the dialog. */\n @Method()\n async close(): Promise<void> {\n this.open = false;\n }\n\n private openDialog(): void {\n this.previouslyFocused = document.activeElement as HTMLElement;\n this.isAnimating = true;\n\n document.body.style.overflow = 'hidden';\n\n requestAnimationFrame(() => {\n if (this.dialogEl) {\n this.removeFocusTrap = trapFocus(this.dialogEl);\n this.dialogEl.focus();\n }\n });\n }\n\n private closeDialog(): void {\n this.isAnimating = false;\n this.tsClose.emit();\n\n document.body.style.overflow = '';\n\n this.removeFocusTrap?.();\n this.previouslyFocused?.focus();\n }\n\n disconnectedCallback(): void {\n this.removeFocusTrap?.();\n document.body.style.overflow = '';\n }\n\n private handleOverlayClick = (): void => {\n if (this.dismissible) {\n this.close();\n }\n };\n\n private handleDialogClick = (event: MouseEvent): void => {\n event.stopPropagation();\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.dismissible) {\n event.stopPropagation();\n this.close();\n }\n };\n\n private handleCloseClick = (): void => {\n this.close();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n if (!this.open) return null;\n\n const headingId = `${this.dialogId}-heading`;\n\n return (\n <Host\n class={{\n 'ts-dialog': true,\n 'ts-dialog--open': this.open,\n }}\n onKeyDown={this.handleKeydown}\n >\n <div class=\"dialog__overlay\" part=\"overlay\" onClick={this.handleOverlayClick}>\n <div\n ref={(el) => (this.dialogEl = el)}\n class={{\n 'dialog__panel': true,\n [`dialog__panel--${this.size}`]: true,\n }}\n part=\"dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={this.heading ? headingId : undefined}\n tabindex={-1}\n onClick={this.handleDialogClick}\n >\n {this.dismissible && (\n <button\n class=\"dialog__close\"\n part=\"close\"\n type=\"button\"\n aria-label=\"Close dialog\"\n onClick={this.handleCloseClick}\n >\n ✕\n </button>\n )}\n\n {this.heading && (\n <div class=\"dialog__header\" part=\"header\" id={headingId}>\n {this.heading}\n </div>\n )}\n\n <div class=\"dialog__body\" part=\"body\">\n <slot />\n </div>\n\n <div class=\"dialog__footer\" part=\"footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"kHAAA,MAAMA,EAAY,IAAM,0vE,MCoBXC,EAAQC,EAAA,MAAAD,UAAAE,E,yIAGXC,SACAC,gBACAC,kBACAC,SAAWC,EAAW,aAGUC,KAAO,MAGvCC,QAGiBC,KAA2B,KAG5CC,YAAc,KAGWC,QAGxBC,YAAc,MAGvB,gBAAAC,CAAiBC,GACf,GAAIA,EAAQ,CACVC,KAAKC,Y,KACA,CACLD,KAAKE,a,EAMT,UAAMC,GACJH,KAAKR,KAAO,I,CAKd,WAAMY,GACJJ,KAAKR,KAAO,K,CAGN,UAAAS,GACND,KAAKX,kBAAoBgB,SAASC,cAClCN,KAAKH,YAAc,KAEnBQ,SAASE,KAAKC,MAAMC,SAAW,SAE/BC,uBAAsB,KACpB,GAAIV,KAAKb,SAAU,CACjBa,KAAKZ,gBAAkBuB,EAAUX,KAAKb,UACtCa,KAAKb,SAASyB,O,KAKZ,WAAAV,GACNF,KAAKH,YAAc,MACnBG,KAAKJ,QAAQiB,OAEbR,SAASE,KAAKC,MAAMC,SAAW,GAE/BT,KAAKZ,oBACLY,KAAKX,mBAAmBuB,O,CAG1B,oBAAAE,GACEd,KAAKZ,oBACLiB,SAASE,KAAKC,MAAMC,SAAW,E,CAGzBM,mBAAqB,KAC3B,GAAIf,KAAKL,YAAa,CACpBK,KAAKI,O,GAIDY,kBAAqBC,IAC3BA,EAAMC,iBAAiB,EAGjBC,cAAiBF,IACvB,GAAIA,EAAMG,MAAQ,UAAYpB,KAAKL,YAAa,CAC9CsB,EAAMC,kBACNlB,KAAKI,O,GAIDiB,iBAAmB,KACzBrB,KAAKI,OAAO,EAId,MAAAkB,GACE,IAAKtB,KAAKR,KAAM,OAAO,KAEvB,MAAM+B,EAAY,GAAGvB,KAAKV,mBAE1B,OACEkC,EAACC,EAAI,CACHC,MAAO,CACL,YAAa,KACb,kBAAmB1B,KAAKR,MAE1BmC,UAAW3B,KAAKmB,eAEhBK,EAAA,OAAKE,MAAM,kBAAkBE,KAAK,UAAUC,QAAS7B,KAAKe,oBACxDS,EAAA,OACEM,IAAMC,GAAQ/B,KAAKb,SAAW4C,EAC9BL,MAAO,CACLM,cAAiB,KACjB,CAAC,kBAAkBhC,KAAKN,QAAS,MAEnCkC,KAAK,SACLK,KAAK,SAAQ,aACF,OAAM,kBACAjC,KAAKP,QAAU8B,EAAYW,UAC5CC,UAAU,EACVN,QAAS7B,KAAKgB,mBAEbhB,KAAKL,aACJ6B,EAAA,UACEE,MAAM,gBACNE,KAAK,QACLQ,KAAK,SAAQ,aACF,eACXP,QAAS7B,KAAKqB,kBAAgB,KAMjCrB,KAAKP,SACJ+B,EAAA,OAAKE,MAAM,iBAAiBE,KAAK,SAASS,GAAId,GAC3CvB,KAAKP,SAIV+B,EAAA,OAAKE,MAAM,eAAeE,KAAK,QAC7BJ,EAAA,cAGFA,EAAA,OAAKE,MAAM,iBAAiBE,KAAK,UAC/BJ,EAAA,QAAMc,KAAK,c","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["chipCss","TsChip","__stencil_proxyCustomElement","HTMLElement","variant","size","removable","disabled","selected","outline","tsRemove","tsClick","handleClick","this","emit","handleRemove","event","stopPropagation","handleKeydown","key","preventDefault","handleRemoveKeydown","render","isInteractive","h","Host","class","part","role","tabindex","undefined","onClick","onKeyDown","name","type"],"sources":["src/components/chip/chip.css?tag=ts-chip&encapsulation=shadow","src/components/chip/chip.tsx"],"sourcesContent":["/* ==========================================================================\n ts-chip — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-chip-radius Border radius (pill shape)\n --ts-chip-height Chip height per size\n ========================================================================== */\n\n:host {\n display: inline-block;\n vertical-align: middle;\n font-family: var(--ts-font-family-base);\n\n --ts-chip-radius: var(--ts-radius-full, 9999px);\n --ts-chip-height: 2rem;\n}\n\n/* ---- Base ---- */\n.chip__base {\n display: inline-flex;\n align-items: center;\n gap: var(--ts-spacing-1);\n block-size: var(--ts-chip-height);\n padding-inline: var(--ts-spacing-3);\n border-radius: var(--ts-chip-radius);\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-medium);\n line-height: 1;\n cursor: pointer;\n user-select: none;\n border: 1px solid transparent;\n outline: none;\n transition:\n background-color var(--ts-transition-fast),\n border-color var(--ts-transition-fast),\n color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n}\n\n.chip__base:focus-visible {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) {\n --ts-chip-height: 1.5rem;\n}\n:host([size=\"sm\"]) .chip__base {\n padding-inline: var(--ts-spacing-2);\n font-size: var(--ts-font-size-xs);\n}\n\n:host([size=\"lg\"]) {\n --ts-chip-height: 2.5rem;\n}\n:host([size=\"lg\"]) .chip__base {\n padding-inline: var(--ts-spacing-4);\n font-size: var(--ts-font-size-md);\n}\n\n/* ---- Solid Variants ---- */\n:host([variant=\"neutral\"]:not([outline])) .chip__base {\n background-color: var(--ts-color-neutral-200);\n color: var(--ts-color-text-primary);\n}\n:host([variant=\"neutral\"]:not([outline])) .chip__base:hover {\n background-color: var(--ts-color-neutral-300);\n}\n\n:host([variant=\"primary\"]:not([outline])) .chip__base {\n background-color: var(--ts-color-primary-100, var(--ts-color-primary-500));\n color: var(--ts-color-primary-700, var(--ts-color-text-primary));\n}\n:host([variant=\"primary\"]:not([outline])) .chip__base:hover {\n background-color: var(--ts-color-primary-200, var(--ts-color-primary-600));\n}\n\n:host([variant=\"success\"]:not([outline])) .chip__base {\n background-color: var(--ts-color-success-bg);\n color: var(--ts-color-success-600);\n}\n\n:host([variant=\"warning\"]:not([outline])) .chip__base {\n background-color: var(--ts-color-warning-bg);\n color: var(--ts-color-warning-600);\n}\n\n:host([variant=\"danger\"]:not([outline])) .chip__base {\n background-color: var(--ts-color-danger-bg);\n color: var(--ts-color-danger-600);\n}\n\n:host([variant=\"info\"]:not([outline])) .chip__base {\n background-color: var(--ts-color-info-bg);\n color: var(--ts-color-info-600);\n}\n\n:host([variant=\"secondary\"]:not([outline])) .chip__base {\n background-color: var(--ts-color-neutral-100);\n color: var(--ts-color-text-secondary);\n}\n\n/* ---- Outline Variants ---- */\n:host([outline]) .chip__base {\n background-color: transparent;\n}\n\n:host([outline][variant=\"neutral\"]) .chip__base {\n border-color: var(--ts-color-border-strong);\n color: var(--ts-color-text-secondary);\n}\n:host([outline][variant=\"neutral\"]) .chip__base:hover {\n background-color: var(--ts-color-bg-subtle);\n}\n\n:host([outline][variant=\"primary\"]) .chip__base {\n border-color: var(--ts-color-primary-500);\n color: var(--ts-color-primary-600);\n}\n:host([outline][variant=\"primary\"]) .chip__base:hover {\n background-color: var(--ts-color-primary-100, var(--ts-color-interactive-primary-subtle));\n}\n\n:host([outline][variant=\"danger\"]) .chip__base {\n border-color: var(--ts-color-danger-500);\n color: var(--ts-color-danger-600);\n}\n\n:host([outline][variant=\"success\"]) .chip__base {\n border-color: var(--ts-color-success-500, var(--ts-color-success-border));\n color: var(--ts-color-success-600);\n}\n\n:host([outline][variant=\"warning\"]) .chip__base {\n border-color: var(--ts-color-warning-500, var(--ts-color-warning-border));\n color: var(--ts-color-warning-600);\n}\n\n:host([outline][variant=\"info\"]) .chip__base {\n border-color: var(--ts-color-info-500, var(--ts-color-info-border));\n color: var(--ts-color-info-600);\n}\n\n/* ---- Selected state ---- */\n:host([selected]) .chip__base {\n background-color: var(--ts-color-interactive-primary);\n color: var(--ts-color-text-on-primary);\n border-color: var(--ts-color-interactive-primary);\n}\n:host([selected]) .chip__base:hover {\n background-color: var(--ts-color-interactive-primary-hover);\n border-color: var(--ts-color-interactive-primary-hover);\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) .chip__base {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Prefix ---- */\n.chip__prefix {\n display: inline-flex;\n align-items: center;\n}\n\n.chip__prefix:empty {\n display: none;\n}\n\n/* ---- Label ---- */\n.chip__label {\n display: inline-flex;\n align-items: center;\n}\n\n/* ---- Remove button ---- */\n.chip__remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: 1.1em;\n block-size: 1.1em;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: currentColor;\n opacity: 0.6;\n cursor: pointer;\n font-size: 0.75em;\n padding: 0;\n margin-inline-start: var(--ts-spacing-1);\n line-height: 1;\n transition: opacity var(--ts-transition-fast);\n}\n\n.chip__remove:hover {\n opacity: 1;\n}\n\n.chip__remove:focus-visible {\n box-shadow: var(--ts-focus-ring);\n opacity: 1;\n}\n\n.chip__remove:disabled {\n cursor: not-allowed;\n pointer-events: none;\n}\n","import { Component, Prop, Event, h, Host } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsVariant, TsSize } from '../../types';\n\n/**\n * @slot - Default slot for chip label.\n * @slot prefix - Icon or content before the label.\n *\n * @part base - The chip container.\n * @part label - The label wrapper.\n * @part prefix - The prefix slot wrapper.\n * @part remove - The remove button.\n */\n@Component({\n tag: 'ts-chip',\n styleUrl: 'chip.css',\n shadow: true,\n})\nexport class TsChip {\n /** The chip's semantic variant. */\n @Prop({ reflect: true }) variant: TsVariant = 'neutral';\n\n /** The chip's size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Whether the chip shows a remove button. */\n @Prop({ reflect: true }) removable = false;\n\n /** Whether the chip is disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Whether the chip is selected. */\n @Prop({ reflect: true }) selected = false;\n\n /** Whether to render as outline style. */\n @Prop({ reflect: true }) outline = false;\n\n /** Emitted when the remove button is clicked. */\n @Event({ eventName: 'tsRemove' }) tsRemove!: EventEmitter<void>;\n\n /** Emitted when the chip body is clicked. */\n @Event({ eventName: 'tsClick' }) tsClick!: EventEmitter<void>;\n\n private handleClick = (): void => {\n if (this.disabled) return;\n this.tsClick.emit();\n };\n\n private handleRemove = (event: MouseEvent): void => {\n event.stopPropagation();\n if (this.disabled) return;\n this.tsRemove.emit();\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (this.disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.tsClick.emit();\n }\n };\n\n private handleRemoveKeydown = (event: KeyboardEvent): void => {\n if (this.disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n event.stopPropagation();\n this.tsRemove.emit();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const isInteractive = !this.disabled;\n\n return (\n <Host\n class={{\n 'ts-chip': true,\n [`ts-chip--${this.variant}`]: true,\n [`ts-chip--${this.size}`]: true,\n 'ts-chip--selected': this.selected,\n 'ts-chip--outline': this.outline,\n 'ts-chip--disabled': this.disabled,\n 'ts-chip--removable': this.removable,\n }}\n >\n <span\n class=\"chip__base\"\n part=\"base\"\n role=\"button\"\n tabindex={isInteractive ? '0' : undefined}\n aria-disabled={this.disabled ? 'true' : undefined}\n aria-pressed={this.selected ? 'true' : undefined}\n onClick={this.handleClick}\n onKeyDown={this.handleKeydown}\n >\n <span class=\"chip__prefix\" part=\"prefix\">\n <slot name=\"prefix\" />\n </span>\n\n <span class=\"chip__label\" part=\"label\">\n <slot />\n </span>\n\n {this.removable && (\n <button\n class=\"chip__remove\"\n part=\"remove\"\n type=\"button\"\n aria-label=\"Remove\"\n disabled={this.disabled}\n onClick={this.handleRemove}\n onKeyDown={this.handleRemoveKeydown}\n >\n \\u2715\n </button>\n )}\n </span>\n </Host>\n );\n }\n}\n"],"mappings":"uEAAA,MAAMA,EAAU,IAAM,8yI,MCkBTC,EAAMC,EAAA,MAAAD,UAAAE,E,iJAEQC,QAAqB,UAGrBC,KAAe,KAGfC,UAAY,MAGZC,SAAW,MAGXC,SAAW,MAGXC,QAAU,MAGDC,SAGDC,QAEzBC,YAAc,KACpB,GAAIC,KAAKN,SAAU,OACnBM,KAAKF,QAAQG,MAAM,EAGbC,aAAgBC,IACtBA,EAAMC,kBACN,GAAIJ,KAAKN,SAAU,OACnBM,KAAKH,SAASI,MAAM,EAGdI,cAAiBF,IACvB,GAAIH,KAAKN,SAAU,OACnB,GAAIS,EAAMG,MAAQ,SAAWH,EAAMG,MAAQ,IAAK,CAC9CH,EAAMI,iBACNP,KAAKF,QAAQG,M,GAITO,oBAAuBL,IAC7B,GAAIH,KAAKN,SAAU,OACnB,GAAIS,EAAMG,MAAQ,SAAWH,EAAMG,MAAQ,IAAK,CAC9CH,EAAMI,iBACNJ,EAAMC,kBACNJ,KAAKH,SAASI,M,GAKlB,MAAAQ,GACE,MAAMC,GAAiBV,KAAKN,SAE5B,OACEiB,EAACC,EAAI,CAAAN,IAAA,2CACHO,MAAO,CACL,UAAW,KACX,CAAC,YAAYb,KAAKT,WAAY,KAC9B,CAAC,YAAYS,KAAKR,QAAS,KAC3B,oBAAqBQ,KAAKL,SAC1B,mBAAoBK,KAAKJ,QACzB,oBAAqBI,KAAKN,SAC1B,qBAAsBM,KAAKP,YAG7BkB,EAAA,QAAAL,IAAA,2CACEO,MAAM,aACNC,KAAK,OACLC,KAAK,SACLC,SAAUN,EAAgB,IAAMO,UAAS,gBAC1BjB,KAAKN,SAAW,OAASuB,UAAS,eACnCjB,KAAKL,SAAW,OAASsB,UACvCC,QAASlB,KAAKD,YACdoB,UAAWnB,KAAKK,eAEhBM,EAAA,QAAAL,IAAA,2CAAMO,MAAM,eAAeC,KAAK,UAC9BH,EAAA,QAAAL,IAAA,2CAAMc,KAAK,YAGbT,EAAA,QAAAL,IAAA,2CAAMO,MAAM,cAAcC,KAAK,SAC7BH,EAAA,QAAAL,IAAA,8CAGDN,KAAKP,WACJkB,EAAA,UAAAL,IAAA,2CACEO,MAAM,eACNC,KAAK,SACLO,KAAK,SAAQ,aACF,SACX3B,SAAUM,KAAKN,SACfwB,QAASlB,KAAKE,aACdiB,UAAWnB,KAAKQ,qBAAmB,Y","ignoreList":[]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{t,p as e,H as n,h as s,c as i}from"./p-DkpyRqHf.js";const o=new Map;function r(t){for(const[e,n]of Object.entries(t)){o.set(e,n)}}function c(t,e){o.set(t,e)}function a(t){return o.get(t)}function l(){return Array.from(o.keys())}const h=()=>`:host{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;--ts-icon-size:1em;--ts-icon-color:currentColor;width:var(--ts-icon-size);height:var(--ts-icon-size);color:var(--ts-icon-color);line-height:0}:host([size="xs"]){--ts-icon-size:12px}:host([size="sm"]){--ts-icon-size:14px}:host([size="md"]){--ts-icon-size:16px}:host([size="lg"]){--ts-icon-size:18px}:host([size="xl"]){--ts-icon-size:20px}::slotted(svg){width:100%;height:100%;fill:currentColor}span{display:contents}span>svg{width:100%;height:100%;fill:none;stroke:currentColor}img{width:100%;height:100%}`;let u=null;function d(t){return t.split("-").map((t=>t.charAt(0).toUpperCase()+t.slice(1))).join("")}function f(t){const e=t.map((([t,e])=>{const n=Object.entries(e).map((([t,e])=>`${t}="${e}"`)).join(" ");return`<${t} ${n}/>`})).join("");return`<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${e}</svg>`}const g=e(class t extends n{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow()}get el(){return this}name;src;size="md";label;color="currentColor";svgContent;nameChanged(){this.loadIcon()}componentWillLoad(){return this.loadIcon()}isBuiltInDisabled(){return this.el.closest('[data-icons="none"]')!==null}async loadIcon(){if(this.name&&!this.src){const t=a(this.name);if(t){this.svgContent=t;return}if(this.isBuiltInDisabled()){this.svgContent=undefined;return}if(!u){try{const t=await import("./p-BOxYojS-.js");u=t.icons}catch{this.svgContent=undefined;return}}const e=d(this.name);const n=u[e];if(n){this.svgContent=f(n);return}this.svgContent=undefined}else{this.svgContent=undefined}}render(){const t=!!this.label;return s(i,{key:"f1a6c10915bf60ee50be384b8b879a73a1bf73e7",class:{"ts-icon":true,[`ts-icon--${this.size}`]:true},role:t?"img":undefined,"aria-label":t?this.label:undefined,"aria-hidden":t?undefined:"true",style:{"--ts-icon-color":this.color}},this.src?s("img",{src:this.src,alt:"",part:"img"}):this.svgContent?s("span",{part:"svg",innerHTML:this.svgContent}):s("slot",null))}static get watchers(){return{name:[{nameChanged:0}]}}static get style(){return h()}},[769,"ts-icon",{name:[513],src:[1],size:[513],label:[1],color:[513],svgContent:[32]},undefined,{name:[{nameChanged:0}]}]);function m(){if(typeof customElements==="undefined"){return}const e=["ts-icon"];e.forEach((e=>{switch(e){case"ts-icon":if(!customElements.get(t(e))){customElements.define(t(e),g)}break}}))}m();export{g as T,c as a,l as b,m as d,a as g,r};
|
|
2
|
-
//# sourceMappingURL=p-TFHAUMKT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["registry","Map","registerIcons","icons","name","svg","Object","entries","set","registerIcon","getIcon","get","getRegisteredIconNames","Array","from","keys","iconCss","lucideCache","toLucideKey","split","map","part","charAt","toUpperCase","slice","join","renderLucideSvg","nodes","children","tag","attrs","attrStr","k","v","TsIcon","__stencil_proxyCustomElement","HTMLElement","src","size","label","color","svgContent","nameChanged","this","loadIcon","componentWillLoad","isBuiltInDisabled","el","closest","registered","undefined","mod","import","key","lucideIcon","render","hasLabel","h","Host","class","role","style","alt","innerHTML"],"sources":["src/components/icon/icon-registry.ts","src/components/icon/icon.css?tag=ts-icon&encapsulation=shadow","src/components/icon/icon.tsx"],"sourcesContent":["/**\n * Icon Registry\n *\n * A global registry for SVG icon strings. Components look up icons by name\n * from this registry. Works with any icon library — register SVG strings\n * directly or use the Lucide helper (`registerLucideIcons`).\n */\n\nconst registry = new Map<string, string>();\n\n/**\n * Register multiple icons at once.\n * @param icons - A map of icon name to SVG string.\n */\nexport function registerIcons(icons: Record<string, string>): void {\n for (const [name, svg] of Object.entries(icons)) {\n registry.set(name, svg);\n }\n}\n\n/**\n * Register a single icon.\n * @param name - The icon name used in `<ts-icon name=\"...\">`.\n * @param svg - The full SVG markup string.\n */\nexport function registerIcon(name: string, svg: string): void {\n registry.set(name, svg);\n}\n\n/**\n * Retrieve an icon's SVG string by name.\n * @returns The SVG string, or `undefined` if the icon is not registered.\n */\nexport function getIcon(name: string): string | undefined {\n return registry.get(name);\n}\n\n/**\n * List all registered icon names.\n */\nexport function getRegisteredIconNames(): string[] {\n return Array.from(registry.keys());\n}\n","/* ==========================================================================\n ts-icon — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-icon-size Width & height of the icon\n --ts-icon-color Fill / stroke color\n ========================================================================== */\n\n:host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n\n --ts-icon-size: 1em;\n --ts-icon-color: currentColor;\n\n width: var(--ts-icon-size);\n height: var(--ts-icon-size);\n color: var(--ts-icon-color);\n line-height: 0;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"xs\"]) { --ts-icon-size: 12px; }\n:host([size=\"sm\"]) { --ts-icon-size: 14px; }\n:host([size=\"md\"]) { --ts-icon-size: 16px; }\n:host([size=\"lg\"]) { --ts-icon-size: 18px; }\n:host([size=\"xl\"]) { --ts-icon-size: 20px; }\n\n/* ---- Slotted SVG ---- */\n::slotted(svg) {\n width: 100%;\n height: 100%;\n fill: currentColor;\n}\n\n/* ---- Registry SVG ---- */\nspan {\n display: contents;\n}\n\nspan > svg {\n width: 100%;\n height: 100%;\n fill: none;\n stroke: currentColor;\n}\n\n/* ---- External image ---- */\nimg {\n width: 100%;\n height: 100%;\n}\n","import { Component, Prop, h, Host, Element, Watch, State } from '@stencil/core';\nimport type { TsSize } from '../../types';\nimport { getIcon } from './icon-registry';\n\ntype LucideNode = [string, Record<string, string>][];\n\n/** Cached reference to the Lucide icons map — loaded lazily on first use. */\nlet lucideCache: Record<string, LucideNode> | null = null;\n\n/**\n * Converts a PascalCase or kebab-case icon name to the PascalCase key used by Lucide.\n * e.g. \"search\" → \"Search\", \"arrow-left\" → \"ArrowLeft\"\n */\nfunction toLucideKey(name: string): string {\n return name\n .split('-')\n .map((part: string) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n}\n\n/**\n * Renders a Lucide icon node array to an SVG string.\n */\nfunction renderLucideSvg(nodes: LucideNode): string {\n const children = nodes\n .map(([tag, attrs]: [string, Record<string, string>]) => {\n const attrStr = Object.entries(attrs)\n .map(([k, v]: [string, string]) => `${k}=\"${v}\"`)\n .join(' ');\n return `<${tag} ${attrStr}/>`;\n })\n .join('');\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${children}</svg>`;\n}\n\n/**\n * @slot - Default slot for inline SVG content.\n *\n * @part img - The img element (when using src prop).\n * @part svg - The container for resolved SVG content (when using name prop).\n */\n@Component({\n tag: 'ts-icon',\n styleUrl: 'icon.css',\n shadow: true,\n})\nexport class TsIcon {\n @Element() el!: HTMLElement;\n\n /** Icon name — resolves from custom registry first, then built-in Lucide icons. Accepts kebab-case or PascalCase. */\n @Prop({ reflect: true }) name?: string;\n\n /** URL to an external SVG icon file. */\n @Prop() src?: string;\n\n /** The icon's size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Accessible label. When set, applies role=\"img\" and aria-label. When absent, sets aria-hidden=\"true\". */\n @Prop() label?: string;\n\n /** CSS color value applied to the icon. */\n @Prop({ reflect: true }) color: string = 'currentColor';\n\n @State() private svgContent?: string;\n\n @Watch('name')\n nameChanged(): void {\n this.loadIcon();\n }\n\n componentWillLoad(): void {\n return this.loadIcon() as unknown as void;\n }\n\n /**\n * Checks whether built-in Lucide icons are disabled via data-icons=\"none\"\n * on any ancestor element.\n */\n private isBuiltInDisabled(): boolean {\n return this.el.closest('[data-icons=\"none\"]') !== null;\n }\n\n private async loadIcon(): Promise<void> {\n if (this.name && !this.src) {\n // 1. Check custom registry first (allows overrides)\n const registered = getIcon(this.name);\n if (registered) {\n this.svgContent = registered;\n return;\n }\n\n // 2. If built-in icons are disabled via data-icons=\"none\", stop here\n if (this.isBuiltInDisabled()) {\n this.svgContent = undefined;\n return;\n }\n\n // 3. Lazy-load Lucide icons (only fetched on first name lookup)\n if (!lucideCache) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: { icons: Record<string, LucideNode> } = await import('lucide') as any;\n lucideCache = mod.icons;\n } catch {\n this.svgContent = undefined;\n return;\n }\n }\n\n const key = toLucideKey(this.name);\n const lucideIcon = lucideCache[key];\n if (lucideIcon) {\n this.svgContent = renderLucideSvg(lucideIcon);\n return;\n }\n\n this.svgContent = undefined;\n } else {\n this.svgContent = undefined;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const hasLabel = !!this.label;\n\n return (\n <Host\n class={{\n 'ts-icon': true,\n [`ts-icon--${this.size}`]: true,\n }}\n role={hasLabel ? 'img' : undefined}\n aria-label={hasLabel ? this.label : undefined}\n aria-hidden={hasLabel ? undefined : 'true'}\n style={{ '--ts-icon-color': this.color }}\n >\n {this.src ? (\n <img src={this.src} alt=\"\" part=\"img\" />\n ) : this.svgContent ? (\n <span part=\"svg\" innerHTML={this.svgContent}></span>\n ) : (\n <slot />\n )}\n </Host>\n );\n }\n}\n"],"mappings":"2DAQA,MAAMA,EAAW,IAAIC,IAMf,SAAUC,EAAcC,GAC5B,IAAK,MAAOC,EAAMC,KAAQC,OAAOC,QAAQJ,GAAQ,CAC/CH,EAASQ,IAAIJ,EAAMC,E,CAEvB,CAOM,SAAUI,EAAaL,EAAcC,GACzCL,EAASQ,IAAIJ,EAAMC,EACrB,CAMM,SAAUK,EAAQN,GACtB,OAAOJ,EAASW,IAAIP,EACtB,C,SAKgBQ,IACd,OAAOC,MAAMC,KAAKd,EAASe,OAC7B,CC1CA,MAAMC,EAAU,IAAM,qlBCOtB,IAAIC,EAAiD,KAMrD,SAASC,EAAYd,GACnB,OAAOA,EACJe,MAAM,KACNC,KAAKC,GAAiBA,EAAKC,OAAO,GAAGC,cAAgBF,EAAKG,MAAM,KAChEC,KAAK,GACV,CAKA,SAASC,EAAgBC,GACvB,MAAMC,EAAWD,EACdP,KAAI,EAAES,EAAKC,MACV,MAAMC,EAAUzB,OAAOC,QAAQuB,GAC5BV,KAAI,EAAEY,EAAGC,KAAyB,GAAGD,MAAMC,OAC3CR,KAAK,KACR,MAAO,IAAII,KAAOE,KAAW,IAE9BN,KAAK,IACR,MAAO,4LAA4LG,SACrM,C,MAaaM,EAAMC,EAAA,MAAAD,UAAAE,E,sGAIQhC,KAGjBiC,IAGiBC,KAAe,KAGhCC,MAGiBC,MAAgB,eAExBC,WAGjB,WAAAC,GACEC,KAAKC,U,CAGP,iBAAAC,GACE,OAAOF,KAAKC,U,CAON,iBAAAE,GACN,OAAOH,KAAKI,GAAGC,QAAQ,yBAA2B,I,CAG5C,cAAMJ,GACZ,GAAID,KAAKvC,OAASuC,KAAKN,IAAK,CAE1B,MAAMY,EAAavC,EAAQiC,KAAKvC,MAChC,GAAI6C,EAAY,CACdN,KAAKF,WAAaQ,EAClB,M,CAIF,GAAIN,KAAKG,oBAAqB,CAC5BH,KAAKF,WAAaS,UAClB,M,CAIF,IAAKjC,EAAa,CAChB,IAEE,MAAMkC,QAAmDC,OAAO,mBAChEnC,EAAckC,EAAIhD,K,CAClB,MACAwC,KAAKF,WAAaS,UAClB,M,EAIJ,MAAMG,EAAMnC,EAAYyB,KAAKvC,MAC7B,MAAMkD,EAAarC,EAAYoC,GAC/B,GAAIC,EAAY,CACdX,KAAKF,WAAaf,EAAgB4B,GAClC,M,CAGFX,KAAKF,WAAaS,S,KACb,CACLP,KAAKF,WAAaS,S,EAKtB,MAAAK,GACE,MAAMC,IAAab,KAAKJ,MAExB,OACEkB,EAACC,EAAI,CAAAL,IAAA,2CACHM,MAAO,CACL,UAAW,KACX,CAAC,YAAYhB,KAAKL,QAAS,MAE7BsB,KAAMJ,EAAW,MAAQN,UAAS,aACtBM,EAAWb,KAAKJ,MAAQW,UAAS,cAChCM,EAAWN,UAAY,OACpCW,MAAO,CAAE,kBAAmBlB,KAAKH,QAEhCG,KAAKN,IACJoB,EAAA,OAAKpB,IAAKM,KAAKN,IAAKyB,IAAI,GAAGzC,KAAK,QAC9BsB,KAAKF,WACPgB,EAAA,QAAMpC,KAAK,MAAM0C,UAAWpB,KAAKF,aAEjCgB,EAAA,a","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["popoverCss","TsPopover","__stencil_proxyCustomElement","HTMLElement","popoverId","generateId","outsideClickHandler","escapeHandler","open","placement","trigger","dismissible","tsOpen","tsClose","isVisible","handleOpenChange","newValue","this","emit","addGlobalListeners","removeGlobalListeners","connectedCallback","disconnectedCallback","show","hide","event","path","composedPath","includes","hostEl","key","setTimeout","document","addEventListener","removeEventListener","undefined","handleTriggerClick","handleTriggerKeydown","preventDefault","handleMouseEnter","handleMouseLeave","render","h","Host","class","onMouseEnter","onMouseLeave","part","onClick","onKeyDown","name","popover__panel","id","role"],"sources":["src/components/popover/popover.css?tag=ts-popover&encapsulation=shadow","src/components/popover/popover.tsx"],"sourcesContent":["/* ==========================================================================\n ts-popover — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-popover-bg Background color\n --ts-popover-radius Border radius\n --ts-popover-shadow Box shadow\n --ts-popover-max-width Max width\n ========================================================================== */\n\n:host {\n display: inline-block;\n position: relative;\n font-family: var(--ts-font-family-base);\n\n --ts-popover-bg: var(--ts-color-bg-elevated);\n --ts-popover-radius: var(--ts-radius-lg);\n --ts-popover-shadow: var(--ts-shadow-lg);\n --ts-popover-max-width: 320px;\n}\n\n.popover__trigger {\n display: inline-block;\n cursor: pointer;\n}\n\n/* ---- Panel ---- */\n.popover__panel {\n position: absolute;\n z-index: var(--ts-z-popover, 1000);\n padding: var(--ts-spacing-4);\n background-color: var(--ts-popover-bg);\n border-radius: var(--ts-popover-radius);\n box-shadow: var(--ts-popover-shadow);\n max-inline-size: var(--ts-popover-max-width);\n border: 1px solid var(--ts-color-border-subtle);\n font-size: var(--ts-font-size-sm);\n line-height: var(--ts-line-height-normal);\n opacity: 0;\n transform: scale(0.95);\n pointer-events: none;\n transition:\n opacity var(--ts-transition-fast),\n transform var(--ts-transition-fast);\n}\n\n.popover__panel--visible {\n opacity: 1;\n transform: scale(1);\n pointer-events: auto;\n}\n\n/* ---- Placements ---- */\n.popover__panel--top {\n bottom: calc(100% + 10px);\n left: 50%;\n margin-left: -50%;\n}\n.popover__panel--top-start {\n bottom: calc(100% + 10px);\n inset-inline-start: 0;\n}\n.popover__panel--top-end {\n bottom: calc(100% + 10px);\n inset-inline-end: 0;\n}\n\n.popover__panel--bottom {\n top: calc(100% + 10px);\n left: 50%;\n margin-left: -50%;\n}\n.popover__panel--bottom-start {\n top: calc(100% + 10px);\n inset-inline-start: 0;\n}\n.popover__panel--bottom-end {\n top: calc(100% + 10px);\n inset-inline-end: 0;\n}\n\n.popover__panel--left {\n inset-inline-end: calc(100% + 10px);\n top: 50%;\n transform: translateY(-50%) scale(0.95);\n}\n.popover__panel--left.popover__panel--visible {\n transform: translateY(-50%) scale(1);\n}\n\n.popover__panel--right {\n inset-inline-start: calc(100% + 10px);\n top: 50%;\n transform: translateY(-50%) scale(0.95);\n}\n.popover__panel--right.popover__panel--visible {\n transform: translateY(-50%) scale(1);\n}\n\n/* ---- Arrow ---- */\n.popover__arrow {\n position: absolute;\n inline-size: 10px;\n block-size: 10px;\n background: var(--ts-popover-bg);\n border: 1px solid var(--ts-color-border-subtle);\n transform: rotate(45deg);\n}\n\n.popover__panel--top .popover__arrow,\n.popover__panel--top-start .popover__arrow,\n.popover__panel--top-end .popover__arrow {\n bottom: -6px;\n left: 50%;\n margin-left: -5px;\n border-top: none;\n border-left: none;\n}\n\n.popover__panel--bottom .popover__arrow,\n.popover__panel--bottom-start .popover__arrow,\n.popover__panel--bottom-end .popover__arrow {\n top: -6px;\n left: 50%;\n margin-left: -5px;\n border-bottom: none;\n border-right: none;\n}\n\n.popover__panel--left .popover__arrow {\n inset-inline-end: -6px;\n top: 50%;\n margin-top: -5px;\n border-bottom: none;\n border-left: none;\n}\n\n.popover__panel--right .popover__arrow {\n inset-inline-start: -6px;\n top: 50%;\n margin-top: -5px;\n border-top: none;\n border-right: none;\n}\n\n/* ---- Content ---- */\n.popover__content {\n position: relative;\n z-index: 1;\n}\n","import { Component, Prop, Event, State, h, Host, Element, Watch, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport { generateId } from '../../utils/aria';\n\ntype TsPopoverPlacement = 'top' | 'bottom' | 'left' | 'right' | 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end';\n\n/**\n * @slot trigger - The element that triggers the popover.\n * @slot - Default slot for popover content.\n *\n * @part base - The popover container.\n * @part arrow - The popover arrow.\n * @part trigger - The trigger wrapper.\n */\n@Component({\n tag: 'ts-popover',\n styleUrl: 'popover.css',\n shadow: true,\n})\nexport class TsPopover {\n @Element() hostEl!: HTMLElement;\n\n private popoverId = generateId('ts-popover');\n private outsideClickHandler?: (event: MouseEvent) => void;\n private escapeHandler?: (event: KeyboardEvent) => void;\n\n /** Whether the popover is currently visible. */\n @Prop({ reflect: true, mutable: true }) open = false;\n\n /** Placement of the popover relative to the trigger. */\n @Prop({ reflect: true }) placement: TsPopoverPlacement = 'bottom';\n\n /** How the popover is triggered. */\n @Prop() trigger: 'click' | 'hover' | 'manual' = 'click';\n\n /** Whether the popover closes on outside click or Escape. */\n @Prop() dismissible = true;\n\n /** Emitted when the popover opens. */\n @Event({ eventName: 'tsOpen' }) tsOpen!: EventEmitter<void>;\n\n /** Emitted when the popover closes. */\n @Event({ eventName: 'tsClose' }) tsClose!: EventEmitter<void>;\n\n @State() isVisible = false;\n\n @Watch('open')\n handleOpenChange(newValue: boolean): void {\n this.isVisible = newValue;\n if (newValue) {\n this.tsOpen.emit();\n this.addGlobalListeners();\n } else {\n this.tsClose.emit();\n this.removeGlobalListeners();\n }\n }\n\n connectedCallback(): void {\n if (this.open) {\n this.isVisible = true;\n this.addGlobalListeners();\n }\n }\n\n disconnectedCallback(): void {\n this.removeGlobalListeners();\n }\n\n /** Programmatically show the popover. */\n @Method()\n async show(): Promise<void> {\n this.open = true;\n }\n\n /** Programmatically hide the popover. */\n @Method()\n async hide(): Promise<void> {\n this.open = false;\n }\n\n private addGlobalListeners(): void {\n if (this.dismissible) {\n this.outsideClickHandler = (event: MouseEvent) => {\n const path = event.composedPath();\n if (!path.includes(this.hostEl)) {\n this.open = false;\n }\n };\n this.escapeHandler = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.open = false;\n }\n };\n // Use setTimeout to avoid capturing the click that opened the popover\n setTimeout(() => {\n document.addEventListener('click', this.outsideClickHandler!);\n document.addEventListener('keydown', this.escapeHandler!);\n }, 0);\n }\n }\n\n private removeGlobalListeners(): void {\n if (this.outsideClickHandler) {\n document.removeEventListener('click', this.outsideClickHandler);\n this.outsideClickHandler = undefined;\n }\n if (this.escapeHandler) {\n document.removeEventListener('keydown', this.escapeHandler);\n this.escapeHandler = undefined;\n }\n }\n\n private handleTriggerClick = (): void => {\n if (this.trigger === 'click') {\n this.open = !this.open;\n }\n };\n\n private handleTriggerKeydown = (event: KeyboardEvent): void => {\n if (this.trigger === 'click' && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n this.open = !this.open;\n }\n };\n\n private handleMouseEnter = (): void => {\n if (this.trigger === 'hover') {\n this.open = true;\n }\n };\n\n private handleMouseLeave = (): void => {\n if (this.trigger === 'hover') {\n this.open = false;\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-popover': true,\n 'ts-popover--open': this.isVisible,\n [`ts-popover--${this.placement}`]: true,\n }}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n >\n <span\n class=\"popover__trigger\"\n part=\"trigger\"\n aria-expanded={this.isVisible ? 'true' : 'false'}\n aria-controls={this.popoverId}\n onClick={this.handleTriggerClick}\n onKeyDown={this.handleTriggerKeydown}\n >\n <slot name=\"trigger\" />\n </span>\n\n <div\n class={{\n 'popover__panel': true,\n [`popover__panel--${this.placement}`]: true,\n 'popover__panel--visible': this.isVisible,\n }}\n part=\"base\"\n id={this.popoverId}\n role=\"dialog\"\n aria-hidden={!this.isVisible ? 'true' : undefined}\n >\n <div class=\"popover__arrow\" part=\"arrow\" />\n <div class=\"popover__content\">\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"2GAAA,MAAMA,EAAa,IAAM,u+E,MCmBZC,EAASC,EAAA,MAAAD,UAAAE,E,sKAGZC,UAAYC,EAAW,cACvBC,oBACAC,cAGgCC,KAAO,MAGtBC,UAAgC,SAGjDC,QAAwC,QAGxCC,YAAc,KAGUC,OAGCC,QAExBC,UAAY,MAGrB,gBAAAC,CAAiBC,GACfC,KAAKH,UAAYE,EACjB,GAAIA,EAAU,CACZC,KAAKL,OAAOM,OACZD,KAAKE,oB,KACA,CACLF,KAAKJ,QAAQK,OACbD,KAAKG,uB,EAIT,iBAAAC,GACE,GAAIJ,KAAKT,KAAM,CACbS,KAAKH,UAAY,KACjBG,KAAKE,oB,EAIT,oBAAAG,GACEL,KAAKG,uB,CAKP,UAAMG,GACJN,KAAKT,KAAO,I,CAKd,UAAMgB,GACJP,KAAKT,KAAO,K,CAGN,kBAAAW,GACN,GAAIF,KAAKN,YAAa,CACpBM,KAAKX,oBAAuBmB,IAC1B,MAAMC,EAAOD,EAAME,eACnB,IAAKD,EAAKE,SAASX,KAAKY,QAAS,CAC/BZ,KAAKT,KAAO,K,GAGhBS,KAAKV,cAAiBkB,IACpB,GAAIA,EAAMK,MAAQ,SAAU,CAC1Bb,KAAKT,KAAO,K,GAIhBuB,YAAW,KACTC,SAASC,iBAAiB,QAAShB,KAAKX,qBACxC0B,SAASC,iBAAiB,UAAWhB,KAAKV,cAAe,GACxD,E,EAIC,qBAAAa,GACN,GAAIH,KAAKX,oBAAqB,CAC5B0B,SAASE,oBAAoB,QAASjB,KAAKX,qBAC3CW,KAAKX,oBAAsB6B,S,CAE7B,GAAIlB,KAAKV,cAAe,CACtByB,SAASE,oBAAoB,UAAWjB,KAAKV,eAC7CU,KAAKV,cAAgB4B,S,EAIjBC,mBAAqB,KAC3B,GAAInB,KAAKP,UAAY,QAAS,CAC5BO,KAAKT,MAAQS,KAAKT,I,GAId6B,qBAAwBZ,IAC9B,GAAIR,KAAKP,UAAY,UAAYe,EAAMK,MAAQ,SAAWL,EAAMK,MAAQ,KAAM,CAC5EL,EAAMa,iBACNrB,KAAKT,MAAQS,KAAKT,I,GAId+B,iBAAmB,KACzB,GAAItB,KAAKP,UAAY,QAAS,CAC5BO,KAAKT,KAAO,I,GAIRgC,iBAAmB,KACzB,GAAIvB,KAAKP,UAAY,QAAS,CAC5BO,KAAKT,KAAO,K,GAKhB,MAAAiC,GACE,OACEC,EAACC,EAAI,CAAAb,IAAA,2CACHc,MAAO,CACL,aAAc,KACd,mBAAoB3B,KAAKH,UACzB,CAAC,eAAeG,KAAKR,aAAc,MAErCoC,aAAc5B,KAAKsB,iBACnBO,aAAc7B,KAAKuB,kBAEnBE,EAAA,QAAAZ,IAAA,2CACEc,MAAM,mBACNG,KAAK,UAAS,gBACC9B,KAAKH,UAAY,OAAS,QAAO,gBACjCG,KAAKb,UACpB4C,QAAS/B,KAAKmB,mBACda,UAAWhC,KAAKoB,sBAEhBK,EAAA,QAAAZ,IAAA,2CAAMoB,KAAK,aAGbR,EAAA,OAAAZ,IAAA,2CACEc,MAAO,CACLO,eAAkB,KAClB,CAAC,mBAAmBlC,KAAKR,aAAc,KACvC,0BAA2BQ,KAAKH,WAElCiC,KAAK,OACLK,GAAInC,KAAKb,UACTiD,KAAK,SAAQ,eACCpC,KAAKH,UAAY,OAASqB,WAExCO,EAAA,OAAAZ,IAAA,2CAAKc,MAAM,iBAAiBG,KAAK,UACjCL,EAAA,OAAAZ,IAAA,2CAAKc,MAAM,oBACTF,EAAA,QAAAZ,IAAA,+C","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["idCounter","generateId","prefix","announce","message","priority","el","document","createElement","setAttribute","Object","assign","style","position","width","height","padding","margin","overflow","clip","whiteSpace","border","body","appendChild","requestAnimationFrame","textContent","setTimeout","remove","prefersReducedMotion","window","matchMedia","matches","trapFocus","container","focusableSelectors","join","handleKeydown","event","key","focusableElements","Array","from","querySelectorAll","length","preventDefault","firstFocusable","lastFocusable","shiftKey","activeElement","focus","addEventListener","removeEventListener"],"sources":["src/utils/aria.ts"],"sourcesContent":["/**\n * Tessera UI — Accessibility Utilities\n *\n * Helpers for consistent ARIA patterns across components.\n */\n\n/** Generate a unique ID for ARIA relationships */\nlet idCounter = 0;\nexport function generateId(prefix = 'q'): string {\n idCounter += 1;\n return `${prefix}-${idCounter}`;\n}\n\n/** Reset ID counter (for testing) */\nexport function resetIdCounter(): void {\n idCounter = 0;\n}\n\n/**\n * Announce a message to screen readers via a live region.\n * Creates a temporary `aria-live` element, inserts the message,\n * and removes it after the AT has time to read it.\n */\nexport function announce(message: string, priority: 'polite' | 'assertive' = 'polite'): void {\n const el = document.createElement('div');\n el.setAttribute('aria-live', priority);\n el.setAttribute('role', 'status');\n el.setAttribute('aria-atomic', 'true');\n Object.assign(el.style, {\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: '0',\n margin: '-1px',\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: '0',\n });\n\n document.body.appendChild(el);\n\n // Delay to ensure the live region is registered before content is added\n requestAnimationFrame(() => {\n el.textContent = message;\n setTimeout(() => el.remove(), 1000);\n });\n}\n\n/**\n * Check if the user prefers reduced motion.\n */\nexport function prefersReducedMotion(): boolean {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Trap focus within a container element.\n * Returns a cleanup function to remove the trap.\n */\nexport function trapFocus(container: HTMLElement): () => void {\n const focusableSelectors = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(', ');\n\n function handleKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Tab') return;\n\n const focusableElements = Array.from(\n container.querySelectorAll<HTMLElement>(focusableSelectors)\n );\n\n if (focusableElements.length === 0) {\n event.preventDefault();\n return;\n }\n\n const firstFocusable = focusableElements[0];\n const lastFocusable = focusableElements[focusableElements.length - 1];\n\n if (event.shiftKey) {\n if (document.activeElement === firstFocusable) {\n event.preventDefault();\n lastFocusable.focus();\n }\n } else {\n if (document.activeElement === lastFocusable) {\n event.preventDefault();\n firstFocusable.focus();\n }\n }\n }\n\n container.addEventListener('keydown', handleKeydown);\n return () => container.removeEventListener('keydown', handleKeydown);\n}\n"],"mappings":"AAOA,IAAIA,EAAY,EACV,SAAUC,EAAWC,EAAS,KAClCF,GAAa,EACb,MAAO,GAAGE,KAAUF,GACtB,C,SAYgBG,EAASC,EAAiBC,EAAmC,UAC3E,MAAMC,EAAKC,SAASC,cAAc,OAClCF,EAAGG,aAAa,YAAaJ,GAC7BC,EAAGG,aAAa,OAAQ,UACxBH,EAAGG,aAAa,cAAe,QAC/BC,OAAOC,OAAOL,EAAGM,MAAO,CACtBC,SAAU,WACVC,MAAO,MACPC,OAAQ,MACRC,QAAS,IACTC,OAAQ,OACRC,SAAU,SACVC,KAAM,mBACNC,WAAY,SACZC,OAAQ,MAGVd,SAASe,KAAKC,YAAYjB,GAG1BkB,uBAAsB,KACpBlB,EAAGmB,YAAcrB,EACjBsB,YAAW,IAAMpB,EAAGqB,UAAU,IAAK,GAEvC,C,SAKgBC,IACd,OAAOC,OAAOC,WAAW,oCAAoCC,OAC/D,CAMM,SAAUC,EAAUC,GACxB,MAAMC,EAAqB,CACzB,UACA,yBACA,wBACA,yBACA,2BACA,mCACAC,KAAK,MAEP,SAASC,EAAcC,GACrB,GAAIA,EAAMC,MAAQ,MAAO,OAEzB,MAAMC,EAAoBC,MAAMC,KAC9BR,EAAUS,iBAA8BR,IAG1C,GAAIK,EAAkBI,SAAW,EAAG,CAClCN,EAAMO,iBACN,M,CAGF,MAAMC,EAAiBN,EAAkB,GACzC,MAAMO,EAAgBP,EAAkBA,EAAkBI,OAAS,GAEnE,GAAIN,EAAMU,SAAU,CAClB,GAAIxC,SAASyC,gBAAkBH,EAAgB,CAC7CR,EAAMO,iBACNE,EAAcG,O,MAEX,CACL,GAAI1C,SAASyC,gBAAkBF,EAAe,CAC5CT,EAAMO,iBACNC,EAAeI,O,GAKrBhB,EAAUiB,iBAAiB,UAAWd,GACtC,MAAO,IAAMH,EAAUkB,oBAAoB,UAAWf,EACxD,Q","ignoreList":[]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{t,p as s,H as o,d as a,h as i,c as e}from"./p-DkpyRqHf.js";const r=()=>`:host{display:block;position:fixed;z-index:var(--ts-z-toast, 9000);font-family:var(--ts-font-family-base);pointer-events:none;--ts-toast-radius:var(--ts-radius-xl);--ts-toast-shadow:var(--ts-shadow-lg);--ts-toast-max-width:420px}:host([position="top-right"]){inset-block-start:var(--ts-spacing-4);inset-inline-end:var(--ts-spacing-4)}:host([position="top-left"]){inset-block-start:var(--ts-spacing-4);inset-inline-start:var(--ts-spacing-4)}:host([position="bottom-right"]){inset-block-end:var(--ts-spacing-4);inset-inline-end:var(--ts-spacing-4)}:host([position="bottom-left"]){inset-block-end:var(--ts-spacing-4);inset-inline-start:var(--ts-spacing-4)}:host([position="top-center"]){inset-block-start:var(--ts-spacing-4);inset-inline-start:50%;transform:translateX(-50%)}:host([position="bottom-center"]){inset-block-end:var(--ts-spacing-4);inset-inline-start:50%;transform:translateX(-50%)}.toast__base{display:flex;align-items:flex-start;gap:var(--ts-spacing-3);padding:var(--ts-spacing-3) var(--ts-spacing-4);border-radius:var(--ts-toast-radius);box-shadow:var(--ts-toast-shadow);max-inline-size:var(--ts-toast-max-width);pointer-events:auto;border:1px solid transparent;font-size:var(--ts-font-size-sm);line-height:var(--ts-line-height-normal);animation:ts-toast-slide-in 0.3s ease-out}@keyframes ts-toast-slide-in{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}:host([variant="info"]) .toast__base{background-color:var(--ts-color-info-bg);border-color:var(--ts-color-info-border);color:var(--ts-color-info-600)}:host([variant="success"]) .toast__base{background-color:var(--ts-color-success-bg);border-color:var(--ts-color-success-border);color:var(--ts-color-success-600)}:host([variant="warning"]) .toast__base{background-color:var(--ts-color-warning-bg);border-color:var(--ts-color-warning-border);color:var(--ts-color-warning-600)}:host([variant="danger"]) .toast__base{background-color:var(--ts-color-danger-bg);border-color:var(--ts-color-danger-border);color:var(--ts-color-danger-600)}:host([variant="neutral"]) .toast__base{background-color:var(--ts-color-bg-subtle);border-color:var(--ts-color-border-subtle);color:var(--ts-color-text-secondary)}.toast__icon{display:flex;align-items:center;font-size:1.15em;flex-shrink:0;margin-block-start:1px}.toast__message{flex:1;min-inline-size:0}.toast__action{display:flex;align-items:center;flex-shrink:0}.toast__action:empty{display:none}.toast__close{display:flex;align-items:center;justify-content:center;flex-shrink:0;inline-size:1.5rem;block-size:1.5rem;border:none;border-radius:var(--ts-radius-sm);background:transparent;color:currentColor;opacity:0.6;cursor:pointer;font-size:0.8em;transition:opacity var(--ts-transition-fast);padding:0;line-height:1}.toast__close:hover{opacity:1}.toast__close:focus-visible{box-shadow:var(--ts-focus-ring);opacity:1}`;const n=s(class t extends o{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow();this.tsClose=a(this,"tsClose")}autoCloseTimer;variant="info";duration=5e3;dismissible=true;open=false;position="top-right";tsClose;isVisible=false;handleOpenChange(t){if(t){this.isVisible=true;this.startAutoClose()}else{this.isVisible=false;this.clearAutoClose()}}connectedCallback(){if(this.open){this.isVisible=true;this.startAutoClose()}}disconnectedCallback(){this.clearAutoClose()}async close(){this.open=false;this.isVisible=false;this.clearAutoClose();this.tsClose.emit()}async show(){this.open=true}startAutoClose(){this.clearAutoClose();if(this.duration>0){this.autoCloseTimer=setTimeout((()=>{this.close()}),this.duration)}}clearAutoClose(){if(this.autoCloseTimer){clearTimeout(this.autoCloseTimer);this.autoCloseTimer=undefined}}handleClose=()=>{this.close()};renderIcon(){const t={info:"ℹ",success:"✓",warning:"⚠",danger:"✕",neutral:"ℹ"};return i("span",{class:"toast__icon-symbol","aria-hidden":"true"},t[this.variant]||"ℹ")}render(){if(!this.isVisible)return null;const t=this.variant==="danger"?"assertive":"polite";return i(e,{class:{"ts-toast":true,[`ts-toast--${this.variant}`]:true,[`ts-toast--${this.position}`]:true,"ts-toast--open":this.isVisible},role:"status","aria-live":t},i("div",{class:"toast__base",part:"base"},i("div",{class:"toast__icon",part:"icon"},this.renderIcon()),i("div",{class:"toast__message",part:"message"},i("slot",null)),i("div",{class:"toast__action",part:"action"},i("slot",{name:"action"})),this.dismissible&&i("button",{class:"toast__close",part:"close",type:"button","aria-label":"Dismiss notification",onClick:this.handleClose},"\\u2715")))}static get watchers(){return{open:[{handleOpenChange:0}]}}static get style(){return r()}},[769,"ts-toast",{variant:[513],duration:[2],dismissible:[4],open:[1540],position:[513],isVisible:[32],close:[64],show:[64]},undefined,{open:[{handleOpenChange:0}]}]);function l(){if(typeof customElements==="undefined"){return}const s=["ts-toast"];s.forEach((s=>{switch(s){case"ts-toast":if(!customElements.get(t(s))){customElements.define(t(s),n)}break}}))}l();export{n as T,l as d};
|
|
2
|
-
//# sourceMappingURL=p-mfB_pP4L.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["toastCss","TsToast","__stencil_proxyCustomElement","HTMLElement","autoCloseTimer","variant","duration","dismissible","open","position","tsClose","isVisible","handleOpenChange","newValue","this","startAutoClose","clearAutoClose","connectedCallback","disconnectedCallback","close","emit","show","setTimeout","clearTimeout","undefined","handleClose","renderIcon","icons","info","success","warning","danger","neutral","h","class","render","ariaLive","Host","role","part","name","type","onClick"],"sources":["src/components/toast/toast.css?tag=ts-toast&encapsulation=shadow","src/components/toast/toast.tsx"],"sourcesContent":["/* ==========================================================================\n ts-toast — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-toast-radius Border radius\n --ts-toast-shadow Box shadow\n --ts-toast-max-width Maximum width\n ========================================================================== */\n\n:host {\n display: block;\n position: fixed;\n z-index: var(--ts-z-toast, 9000);\n font-family: var(--ts-font-family-base);\n pointer-events: none;\n\n --ts-toast-radius: var(--ts-radius-xl);\n --ts-toast-shadow: var(--ts-shadow-lg);\n --ts-toast-max-width: 420px;\n}\n\n/* ---- Positions ---- */\n:host([position=\"top-right\"]) {\n inset-block-start: var(--ts-spacing-4);\n inset-inline-end: var(--ts-spacing-4);\n}\n\n:host([position=\"top-left\"]) {\n inset-block-start: var(--ts-spacing-4);\n inset-inline-start: var(--ts-spacing-4);\n}\n\n:host([position=\"bottom-right\"]) {\n inset-block-end: var(--ts-spacing-4);\n inset-inline-end: var(--ts-spacing-4);\n}\n\n:host([position=\"bottom-left\"]) {\n inset-block-end: var(--ts-spacing-4);\n inset-inline-start: var(--ts-spacing-4);\n}\n\n:host([position=\"top-center\"]) {\n inset-block-start: var(--ts-spacing-4);\n inset-inline-start: 50%;\n transform: translateX(-50%);\n}\n\n:host([position=\"bottom-center\"]) {\n inset-block-end: var(--ts-spacing-4);\n inset-inline-start: 50%;\n transform: translateX(-50%);\n}\n\n/* ---- Base ---- */\n.toast__base {\n display: flex;\n align-items: flex-start;\n gap: var(--ts-spacing-3);\n padding: var(--ts-spacing-3) var(--ts-spacing-4);\n border-radius: var(--ts-toast-radius);\n box-shadow: var(--ts-toast-shadow);\n max-inline-size: var(--ts-toast-max-width);\n pointer-events: auto;\n border: 1px solid transparent;\n font-size: var(--ts-font-size-sm);\n line-height: var(--ts-line-height-normal);\n animation: ts-toast-slide-in 0.3s ease-out;\n}\n\n@keyframes ts-toast-slide-in {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* ---- Variants ---- */\n:host([variant=\"info\"]) .toast__base {\n background-color: var(--ts-color-info-bg);\n border-color: var(--ts-color-info-border);\n color: var(--ts-color-info-600);\n}\n\n:host([variant=\"success\"]) .toast__base {\n background-color: var(--ts-color-success-bg);\n border-color: var(--ts-color-success-border);\n color: var(--ts-color-success-600);\n}\n\n:host([variant=\"warning\"]) .toast__base {\n background-color: var(--ts-color-warning-bg);\n border-color: var(--ts-color-warning-border);\n color: var(--ts-color-warning-600);\n}\n\n:host([variant=\"danger\"]) .toast__base {\n background-color: var(--ts-color-danger-bg);\n border-color: var(--ts-color-danger-border);\n color: var(--ts-color-danger-600);\n}\n\n:host([variant=\"neutral\"]) .toast__base {\n background-color: var(--ts-color-bg-subtle);\n border-color: var(--ts-color-border-subtle);\n color: var(--ts-color-text-secondary);\n}\n\n/* ---- Icon ---- */\n.toast__icon {\n display: flex;\n align-items: center;\n font-size: 1.15em;\n flex-shrink: 0;\n margin-block-start: 1px;\n}\n\n/* ---- Message ---- */\n.toast__message {\n flex: 1;\n min-inline-size: 0;\n}\n\n/* ---- Action ---- */\n.toast__action {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.toast__action:empty {\n display: none;\n}\n\n/* ---- Close button ---- */\n.toast__close {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n inline-size: 1.5rem;\n block-size: 1.5rem;\n border: none;\n border-radius: var(--ts-radius-sm);\n background: transparent;\n color: currentColor;\n opacity: 0.6;\n cursor: pointer;\n font-size: 0.8em;\n transition: opacity var(--ts-transition-fast);\n padding: 0;\n line-height: 1;\n}\n\n.toast__close:hover {\n opacity: 1;\n}\n\n.toast__close:focus-visible {\n box-shadow: var(--ts-focus-ring);\n opacity: 1;\n}\n","import { Component, Prop, Event, State, h, Host, Watch, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\ntype TsToastVariant = 'info' | 'success' | 'warning' | 'danger' | 'neutral';\ntype TsToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\n\n/**\n * @slot - Default slot for message content.\n * @slot action - Optional action button.\n *\n * @part base - The toast container.\n * @part icon - The variant icon wrapper.\n * @part message - The message wrapper.\n * @part action - The action slot wrapper.\n * @part close - The close button.\n */\n@Component({\n tag: 'ts-toast',\n styleUrl: 'toast.css',\n shadow: true,\n})\nexport class TsToast {\n private autoCloseTimer?: ReturnType<typeof setTimeout>;\n\n /** The toast's visual variant. */\n @Prop({ reflect: true }) variant: TsToastVariant = 'info';\n\n /** Auto-dismiss duration in ms. Set 0 to disable. */\n @Prop() duration = 5000;\n\n /** Whether the toast shows a close button. */\n @Prop() dismissible = true;\n\n /** Whether the toast is visible. */\n @Prop({ reflect: true, mutable: true }) open = false;\n\n /** Position of the toast on screen. */\n @Prop({ reflect: true }) position: TsToastPosition = 'top-right';\n\n /** Emitted when the toast is dismissed. */\n @Event({ eventName: 'tsClose' }) tsClose!: EventEmitter<void>;\n\n @State() isVisible = false;\n\n @Watch('open')\n handleOpenChange(newValue: boolean): void {\n if (newValue) {\n this.isVisible = true;\n this.startAutoClose();\n } else {\n this.isVisible = false;\n this.clearAutoClose();\n }\n }\n\n connectedCallback(): void {\n if (this.open) {\n this.isVisible = true;\n this.startAutoClose();\n }\n }\n\n disconnectedCallback(): void {\n this.clearAutoClose();\n }\n\n /** Programmatically close the toast. */\n @Method()\n async close(): Promise<void> {\n this.open = false;\n this.isVisible = false;\n this.clearAutoClose();\n this.tsClose.emit();\n }\n\n /** Programmatically show the toast. */\n @Method()\n async show(): Promise<void> {\n this.open = true;\n }\n\n private startAutoClose(): void {\n this.clearAutoClose();\n if (this.duration > 0) {\n this.autoCloseTimer = setTimeout(() => {\n this.close();\n }, this.duration);\n }\n }\n\n private clearAutoClose(): void {\n if (this.autoCloseTimer) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = undefined;\n }\n }\n\n private handleClose = (): void => {\n this.close();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n private renderIcon() {\n const icons: Record<string, string> = {\n info: '\\u2139',\n success: '\\u2713',\n warning: '\\u26A0',\n danger: '\\u2715',\n neutral: '\\u2139',\n };\n return <span class=\"toast__icon-symbol\" aria-hidden=\"true\">{icons[this.variant] || '\\u2139'}</span>;\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n if (!this.isVisible) return null;\n\n const ariaLive = this.variant === 'danger' ? 'assertive' : 'polite';\n\n return (\n <Host\n class={{\n 'ts-toast': true,\n [`ts-toast--${this.variant}`]: true,\n [`ts-toast--${this.position}`]: true,\n 'ts-toast--open': this.isVisible,\n }}\n role=\"status\"\n aria-live={ariaLive}\n >\n <div class=\"toast__base\" part=\"base\">\n <div class=\"toast__icon\" part=\"icon\">\n {this.renderIcon()}\n </div>\n\n <div class=\"toast__message\" part=\"message\">\n <slot />\n </div>\n\n <div class=\"toast__action\" part=\"action\">\n <slot name=\"action\" />\n </div>\n\n {this.dismissible && (\n <button\n class=\"toast__close\"\n part=\"close\"\n type=\"button\"\n aria-label=\"Dismiss notification\"\n onClick={this.handleClose}\n >\n \\u2715\n </button>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"kEAAA,MAAMA,EAAW,IAAM,qyF,MCqBVC,EAAOC,EAAA,MAAAD,UAAAE,E,gHACVC,eAGiBC,QAA0B,OAG3CC,SAAW,IAGXC,YAAc,KAGkBC,KAAO,MAGtBC,SAA4B,YAGpBC,QAExBC,UAAY,MAGrB,gBAAAC,CAAiBC,GACf,GAAIA,EAAU,CACZC,KAAKH,UAAY,KACjBG,KAAKC,gB,KACA,CACLD,KAAKH,UAAY,MACjBG,KAAKE,gB,EAIT,iBAAAC,GACE,GAAIH,KAAKN,KAAM,CACbM,KAAKH,UAAY,KACjBG,KAAKC,gB,EAIT,oBAAAG,GACEJ,KAAKE,gB,CAKP,WAAMG,GACJL,KAAKN,KAAO,MACZM,KAAKH,UAAY,MACjBG,KAAKE,iBACLF,KAAKJ,QAAQU,M,CAKf,UAAMC,GACJP,KAAKN,KAAO,I,CAGN,cAAAO,GACND,KAAKE,iBACL,GAAIF,KAAKR,SAAW,EAAG,CACrBQ,KAAKV,eAAiBkB,YAAW,KAC/BR,KAAKK,OAAO,GACXL,KAAKR,S,EAIJ,cAAAU,GACN,GAAIF,KAAKV,eAAgB,CACvBmB,aAAaT,KAAKV,gBAClBU,KAAKV,eAAiBoB,S,EAIlBC,YAAc,KACpBX,KAAKK,OAAO,EAIN,UAAAO,GACN,MAAMC,EAAgC,CACpCC,KAAM,IACNC,QAAS,IACTC,QAAS,IACTC,OAAQ,IACRC,QAAS,KAEX,OAAOC,EAAA,QAAMC,MAAM,qBAAoB,cAAa,QAAQP,EAAMb,KAAKT,UAAY,I,CAIrF,MAAA8B,GACE,IAAKrB,KAAKH,UAAW,OAAO,KAE5B,MAAMyB,EAAWtB,KAAKT,UAAY,SAAW,YAAc,SAE3D,OACE4B,EAACI,EAAI,CACHH,MAAO,CACL,WAAY,KACZ,CAAC,aAAapB,KAAKT,WAAY,KAC/B,CAAC,aAAaS,KAAKL,YAAa,KAChC,iBAAkBK,KAAKH,WAEzB2B,KAAK,SAAQ,YACFF,GAEXH,EAAA,OAAKC,MAAM,cAAcK,KAAK,QAC5BN,EAAA,OAAKC,MAAM,cAAcK,KAAK,QAC3BzB,KAAKY,cAGRO,EAAA,OAAKC,MAAM,iBAAiBK,KAAK,WAC/BN,EAAA,cAGFA,EAAA,OAAKC,MAAM,gBAAgBK,KAAK,UAC9BN,EAAA,QAAMO,KAAK,YAGZ1B,KAAKP,aACJ0B,EAAA,UACEC,MAAM,eACNK,KAAK,QACLE,KAAK,SAAQ,aACF,uBACXC,QAAS5B,KAAKW,aAAW,Y","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["skeletonCss","TsSkeleton","__stencil_proxyCustomElement","HTMLElement","variant","width","height","lines","animation","render","style","this","lineElements","i","isLast","push","h","class","skeleton__line","part","Host"],"sources":["src/components/skeleton/skeleton.css?tag=ts-skeleton&encapsulation=shadow","src/components/skeleton/skeleton.tsx"],"sourcesContent":["/* ==========================================================================\n ts-skeleton — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-skeleton-radius Border radius\n --ts-skeleton-height Default line height\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-skeleton-radius: var(--ts-radius-sm);\n --ts-skeleton-height: 1em;\n --ts-color-skeleton-base: var(--ts-color-neutral-200);\n --ts-color-skeleton-pulse: var(--ts-color-neutral-300);\n}\n\n.skeleton__base {\n display: flex;\n flex-direction: column;\n gap: var(--ts-spacing-2);\n width: 100%;\n height: 100%;\n}\n\n/* ---- Line (text variant) ---- */\n.skeleton__line {\n block-size: var(--ts-skeleton-height);\n inline-size: 100%;\n border-radius: var(--ts-skeleton-radius);\n background-color: var(--ts-color-skeleton-base);\n}\n\n.skeleton__line--last {\n inline-size: 75%;\n}\n\n/* ---- Circular variant ---- */\n:host([variant=\"circular\"]) .skeleton__base {\n border-radius: 50%;\n background-color: var(--ts-color-skeleton-base);\n aspect-ratio: 1;\n}\n\n/* ---- Rectangular variant ---- */\n:host([variant=\"rectangular\"]) .skeleton__base {\n border-radius: var(--ts-skeleton-radius);\n background-color: var(--ts-color-skeleton-base);\n min-block-size: var(--ts-skeleton-height);\n}\n\n/* ---- Pulse animation ---- */\n:host([animation=\"pulse\"]) .skeleton__line,\n:host([animation=\"pulse\"][variant=\"circular\"]) .skeleton__base,\n:host([animation=\"pulse\"][variant=\"rectangular\"]) .skeleton__base {\n animation: ts-skeleton-pulse 1.5s ease-in-out infinite;\n}\n\n@keyframes ts-skeleton-pulse {\n 0%, 100% { background-color: var(--ts-color-skeleton-base); }\n 50% { background-color: var(--ts-color-skeleton-pulse); }\n}\n\n/* ---- Wave animation ---- */\n:host([animation=\"wave\"]) .skeleton__line,\n:host([animation=\"wave\"][variant=\"circular\"]) .skeleton__base,\n:host([animation=\"wave\"][variant=\"rectangular\"]) .skeleton__base {\n background: linear-gradient(\n 90deg,\n var(--ts-color-skeleton-base) 25%,\n var(--ts-color-skeleton-pulse) 50%,\n var(--ts-color-skeleton-base) 75%\n );\n background-size: 200% 100%;\n animation: ts-skeleton-wave 1.5s ease-in-out infinite;\n}\n\n@keyframes ts-skeleton-wave {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n}\n\n/* ---- No animation ---- */\n:host([animation=\"none\"]) .skeleton__line,\n:host([animation=\"none\"][variant=\"circular\"]) .skeleton__base,\n:host([animation=\"none\"][variant=\"rectangular\"]) .skeleton__base {\n animation: none;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @part base - The skeleton element container.\n * @part line - Individual skeleton line (text variant).\n */\n@Component({\n tag: 'ts-skeleton',\n styleUrl: 'skeleton.css',\n shadow: true,\n})\nexport class TsSkeleton {\n /** The skeleton shape variant. */\n @Prop({ reflect: true }) variant: 'text' | 'circular' | 'rectangular' = 'text';\n\n /** CSS width of the skeleton. */\n @Prop() width = '100%';\n\n /** CSS height of the skeleton. */\n @Prop() height?: string;\n\n /** Number of lines to render (text variant only). */\n @Prop() lines = 1;\n\n /** Animation style. */\n @Prop({ reflect: true }) animation: 'pulse' | 'wave' | 'none' = 'pulse';\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const style: Record<string, string> = {};\n if (this.width) style['width'] = this.width;\n if (this.height) style['height'] = this.height;\n\n if (this.variant === 'text') {\n const lineElements = [];\n for (let i = 0; i < this.lines; i++) {\n const isLast = i === this.lines - 1 && this.lines > 1;\n lineElements.push(\n <div\n class={{\n 'skeleton__line': true,\n 'skeleton__line--last': isLast,\n }}\n part=\"line\"\n />,\n );\n }\n\n return (\n <Host\n class={{\n 'ts-skeleton': true,\n [`ts-skeleton--${this.variant}`]: true,\n [`ts-skeleton--${this.animation}`]: true,\n }}\n style={style}\n aria-hidden=\"true\"\n >\n <div class=\"skeleton__base\" part=\"base\">\n {lineElements}\n </div>\n </Host>\n );\n }\n\n return (\n <Host\n class={{\n 'ts-skeleton': true,\n [`ts-skeleton--${this.variant}`]: true,\n [`ts-skeleton--${this.animation}`]: true,\n }}\n style={style}\n aria-hidden=\"true\"\n >\n <div class=\"skeleton__base\" part=\"base\" />\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAc,IAAM,k1D,MCWbC,EAAUC,EAAA,MAAAD,UAAAE,E,iFAEIC,QAA+C,OAGhEC,MAAQ,OAGRC,OAGAC,MAAQ,EAGSC,UAAuC,QAGhE,MAAAC,GACE,MAAMC,EAAgC,GACtC,GAAIC,KAAKN,MAAOK,EAAM,SAAWC,KAAKN,MACtC,GAAIM,KAAKL,OAAQI,EAAM,UAAYC,KAAKL,OAExC,GAAIK,KAAKP,UAAY,OAAQ,CAC3B,MAAMQ,EAAe,GACrB,IAAK,IAAIC,EAAI,EAAGA,EAAIF,KAAKJ,MAAOM,IAAK,CACnC,MAAMC,EAASD,IAAMF,KAAKJ,MAAQ,GAAKI,KAAKJ,MAAQ,EACpDK,EAAaG,KACXC,EAAA,OACEC,MAAO,CACLC,eAAkB,KAClB,uBAAwBJ,GAE1BK,KAAK,S,CAKX,OACEH,EAACI,EAAI,CACHH,MAAO,CACL,cAAe,KACf,CAAC,gBAAgBN,KAAKP,WAAY,KAClC,CAAC,gBAAgBO,KAAKH,aAAc,MAEtCE,MAAOA,EAAK,cACA,QAEZM,EAAA,OAAKC,MAAM,iBAAiBE,KAAK,QAC9BP,G,CAMT,OACEI,EAACI,EAAI,CACHH,MAAO,CACL,cAAe,KACf,CAAC,gBAAgBN,KAAKP,WAAY,KAClC,CAAC,gBAAgBO,KAAKH,aAAc,MAEtCE,MAAOA,EAAK,cACA,QAEZM,EAAA,OAAKC,MAAM,iBAAiBE,KAAK,S","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["sliderCss","TsSlider","__stencil_proxyCustomElement","HTMLElement","trackEl","dragging","value","min","max","step","disabled","label","showValue","size","tsInput","tsChange","percentage","range","this","clampAndStep","val","stepped","Math","round","updateValueFromPosition","clientX","rect","getBoundingClientRect","ratio","left","width","rawValue","handleMouseDown","event","preventDefault","emit","handleMouseMove","e","handleMouseUp","document","removeEventListener","addEventListener","handleKeyDown","newValue","bigStep","key","render","percent","h","Host","class","part","ref","el","onMouseDown","style","role","tabindex","undefined","insetInlineStart","onKeyDown"],"sources":["src/components/slider/slider.css?tag=ts-slider&encapsulation=shadow","src/components/slider/slider.tsx"],"sourcesContent":["/* ==========================================================================\n ts-slider — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-slider-track-bg Track background color\n --ts-slider-fill-bg Fill background color\n --ts-slider-thumb-bg Thumb background color\n --ts-slider-thumb-size Thumb dimensions\n ========================================================================== */\n\n:host {\n display: block;\n\n --ts-slider-track-bg: var(--ts-color-neutral-200);\n --ts-slider-fill-bg: var(--ts-color-interactive-primary);\n --ts-slider-thumb-bg: var(--ts-color-neutral-0);\n --ts-slider-thumb-size: 1.25rem;\n}\n\n/* ---- Label ---- */\n.slider__label {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-family: var(--ts-font-family-base);\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-primary);\n margin-block-end: var(--ts-spacing-2);\n}\n\n.slider__value {\n font-family: var(--ts-font-family-base);\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-secondary);\n}\n\n/* ---- Track ---- */\n.slider__track {\n position: relative;\n block-size: var(--ts-slider-thumb-size);\n display: flex;\n align-items: center;\n cursor: pointer;\n}\n\n.slider__track::before {\n content: '';\n position: absolute;\n inset-inline: 0;\n block-size: 4px;\n background-color: var(--ts-slider-track-bg);\n border-radius: var(--ts-radius-full);\n}\n\n/* ---- Fill ---- */\n.slider__fill {\n position: absolute;\n inset-inline-start: 0;\n block-size: 4px;\n background-color: var(--ts-slider-fill-bg);\n border-radius: var(--ts-radius-full);\n pointer-events: none;\n}\n\n/* ---- Thumb ---- */\n.slider__thumb {\n position: absolute;\n inline-size: var(--ts-slider-thumb-size);\n block-size: var(--ts-slider-thumb-size);\n border-radius: var(--ts-radius-full);\n background-color: var(--ts-slider-thumb-bg);\n border: 2px solid var(--ts-slider-fill-bg);\n box-shadow: var(--ts-shadow-sm);\n transform: translateX(-50%);\n cursor: grab;\n outline: none;\n transition:\n box-shadow var(--ts-transition-fast),\n transform var(--ts-transition-fast);\n}\n\n.slider__thumb:focus-visible {\n box-shadow: var(--ts-focus-ring);\n}\n\n.slider__thumb:active {\n cursor: grabbing;\n transform: translateX(-50%) scale(1.1);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) {\n --ts-slider-thumb-size: 1rem;\n}\n\n:host([size=\"sm\"]) .slider__track::before,\n:host([size=\"sm\"]) .slider__fill {\n block-size: 3px;\n}\n\n:host([size=\"lg\"]) {\n --ts-slider-thumb-size: 1.5rem;\n}\n\n:host([size=\"lg\"]) .slider__track::before,\n:host([size=\"lg\"]) .slider__fill {\n block-size: 6px;\n}\n\n/* ---- Disabled ---- */\n:host(.ts-slider--disabled) {\n opacity: 0.5;\n}\n\n:host(.ts-slider--disabled) .slider__track {\n cursor: not-allowed;\n}\n\n:host(.ts-slider--disabled) .slider__thumb {\n cursor: not-allowed;\n}\n","import { Component, Prop, Event, State, h, Host, Element } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize } from '../../types';\n\n/**\n * @part track - The slider track.\n * @part fill - The filled portion of the track.\n * @part thumb - The draggable thumb.\n * @part label - The value label.\n */\n@Component({\n tag: 'ts-slider',\n styleUrl: 'slider.css',\n shadow: true,\n})\nexport class TsSlider {\n @Element() hostEl!: HTMLElement;\n\n private trackEl?: HTMLElement;\n\n @State() dragging = false;\n\n /** Current slider value. */\n @Prop({ mutable: true, reflect: true }) value = 0;\n\n /** Minimum value. */\n @Prop() min = 0;\n\n /** Maximum value. */\n @Prop() max = 100;\n\n /** Step increment. */\n @Prop() step = 1;\n\n /** Disables the slider. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Accessible label. */\n @Prop() label?: string;\n\n /** Whether to display the current value. */\n @Prop({ reflect: true }) showValue = false;\n\n /** The size of the slider. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Emitted continuously during drag. */\n @Event({ eventName: 'tsInput' }) tsInput!: EventEmitter<{ value: number }>;\n\n /** Emitted when drag ends (value committed). */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<{ value: number }>;\n\n private get percentage(): number {\n const range = this.max - this.min;\n if (range <= 0) return 0;\n return ((this.value - this.min) / range) * 100;\n }\n\n private clampAndStep(val: number): number {\n // Snap to step\n const stepped = Math.round((val - this.min) / this.step) * this.step + this.min;\n // Clamp\n return Math.min(this.max, Math.max(this.min, stepped));\n }\n\n private updateValueFromPosition(clientX: number): void {\n if (!this.trackEl) return;\n const rect = this.trackEl.getBoundingClientRect();\n const ratio = (clientX - rect.left) / rect.width;\n const rawValue = this.min + ratio * (this.max - this.min);\n this.value = this.clampAndStep(rawValue);\n }\n\n private handleMouseDown = (event: MouseEvent): void => {\n if (this.disabled) return;\n event.preventDefault();\n this.dragging = true;\n this.updateValueFromPosition(event.clientX);\n this.tsInput.emit({ value: this.value });\n\n const handleMouseMove = (e: MouseEvent): void => {\n this.updateValueFromPosition(e.clientX);\n this.tsInput.emit({ value: this.value });\n };\n\n const handleMouseUp = (): void => {\n this.dragging = false;\n this.tsChange.emit({ value: this.value });\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (this.disabled) return;\n\n let newValue = this.value;\n const bigStep = this.step * 10;\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n event.preventDefault();\n newValue = this.clampAndStep(this.value + this.step);\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n event.preventDefault();\n newValue = this.clampAndStep(this.value - this.step);\n break;\n case 'PageUp':\n event.preventDefault();\n newValue = this.clampAndStep(this.value + bigStep);\n break;\n case 'PageDown':\n event.preventDefault();\n newValue = this.clampAndStep(this.value - bigStep);\n break;\n case 'Home':\n event.preventDefault();\n newValue = this.min;\n break;\n case 'End':\n event.preventDefault();\n newValue = this.max;\n break;\n default:\n return;\n }\n\n if (newValue !== this.value) {\n this.value = newValue;\n this.tsInput.emit({ value: this.value });\n this.tsChange.emit({ value: this.value });\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const percent = this.percentage;\n\n return (\n <Host\n class={{\n 'ts-slider': true,\n [`ts-slider--${this.size}`]: true,\n 'ts-slider--disabled': this.disabled,\n }}\n >\n {this.label && (\n <label class=\"slider__label\" part=\"label\">\n {this.label}\n {this.showValue && <span class=\"slider__value\">{this.value}</span>}\n </label>\n )}\n {!this.label && this.showValue && (\n <span class=\"slider__value\" part=\"label\" aria-hidden=\"true\">\n {this.value}\n </span>\n )}\n <div\n class=\"slider__track\"\n part=\"track\"\n ref={(el) => (this.trackEl = el)}\n onMouseDown={this.handleMouseDown}\n >\n <div\n class=\"slider__fill\"\n part=\"fill\"\n style={{ width: `${percent}%` }}\n />\n <div\n class=\"slider__thumb\"\n part=\"thumb\"\n role=\"slider\"\n tabindex={this.disabled ? -1 : 0}\n aria-valuenow={this.value}\n aria-valuemin={this.min}\n aria-valuemax={this.max}\n aria-label={this.label || undefined}\n aria-disabled={this.disabled ? 'true' : undefined}\n style={{ insetInlineStart: `${percent}%` }}\n onKeyDown={this.handleKeyDown}\n />\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"uEAAA,MAAMA,EAAY,IAAM,ygE,MCeXC,EAAQC,EAAA,MAAAD,UAAAE,E,0KAGXC,QAECC,SAAW,MAGoBC,MAAQ,EAGxCC,IAAM,EAGNC,IAAM,IAGNC,KAAO,EAGUC,SAAW,MAG5BC,MAGiBC,UAAY,MAGZC,KAAe,KAGPC,QAGCC,SAElC,cAAYC,GACV,MAAMC,EAAQC,KAAKV,IAAMU,KAAKX,IAC9B,GAAIU,GAAS,EAAG,OAAO,EACvB,OAASC,KAAKZ,MAAQY,KAAKX,KAAOU,EAAS,G,CAGrC,YAAAE,CAAaC,GAEnB,MAAMC,EAAUC,KAAKC,OAAOH,EAAMF,KAAKX,KAAOW,KAAKT,MAAQS,KAAKT,KAAOS,KAAKX,IAE5E,OAAOe,KAAKf,IAAIW,KAAKV,IAAKc,KAAKd,IAAIU,KAAKX,IAAKc,G,CAGvC,uBAAAG,CAAwBC,GAC9B,IAAKP,KAAKd,QAAS,OACnB,MAAMsB,EAAOR,KAAKd,QAAQuB,wBAC1B,MAAMC,GAASH,EAAUC,EAAKG,MAAQH,EAAKI,MAC3C,MAAMC,EAAWb,KAAKX,IAAMqB,GAASV,KAAKV,IAAMU,KAAKX,KACrDW,KAAKZ,MAAQY,KAAKC,aAAaY,E,CAGzBC,gBAAmBC,IACzB,GAAIf,KAAKR,SAAU,OACnBuB,EAAMC,iBACNhB,KAAKb,SAAW,KAChBa,KAAKM,wBAAwBS,EAAMR,SACnCP,KAAKJ,QAAQqB,KAAK,CAAE7B,MAAOY,KAAKZ,QAEhC,MAAM8B,EAAmBC,IACvBnB,KAAKM,wBAAwBa,EAAEZ,SAC/BP,KAAKJ,QAAQqB,KAAK,CAAE7B,MAAOY,KAAKZ,OAAQ,EAG1C,MAAMgC,EAAgB,KACpBpB,KAAKb,SAAW,MAChBa,KAAKH,SAASoB,KAAK,CAAE7B,MAAOY,KAAKZ,QACjCiC,SAASC,oBAAoB,YAAaJ,GAC1CG,SAASC,oBAAoB,UAAWF,EAAc,EAGxDC,SAASE,iBAAiB,YAAaL,GACvCG,SAASE,iBAAiB,UAAWH,EAAc,EAG7CI,cAAiBT,IACvB,GAAIf,KAAKR,SAAU,OAEnB,IAAIiC,EAAWzB,KAAKZ,MACpB,MAAMsC,EAAU1B,KAAKT,KAAO,GAE5B,OAAQwB,EAAMY,KACZ,IAAK,aACL,IAAK,UACHZ,EAAMC,iBACNS,EAAWzB,KAAKC,aAAaD,KAAKZ,MAAQY,KAAKT,MAC/C,MACF,IAAK,YACL,IAAK,YACHwB,EAAMC,iBACNS,EAAWzB,KAAKC,aAAaD,KAAKZ,MAAQY,KAAKT,MAC/C,MACF,IAAK,SACHwB,EAAMC,iBACNS,EAAWzB,KAAKC,aAAaD,KAAKZ,MAAQsC,GAC1C,MACF,IAAK,WACHX,EAAMC,iBACNS,EAAWzB,KAAKC,aAAaD,KAAKZ,MAAQsC,GAC1C,MACF,IAAK,OACHX,EAAMC,iBACNS,EAAWzB,KAAKX,IAChB,MACF,IAAK,MACH0B,EAAMC,iBACNS,EAAWzB,KAAKV,IAChB,MACF,QACE,OAGJ,GAAImC,IAAazB,KAAKZ,MAAO,CAC3BY,KAAKZ,MAAQqC,EACbzB,KAAKJ,QAAQqB,KAAK,CAAE7B,MAAOY,KAAKZ,QAChCY,KAAKH,SAASoB,KAAK,CAAE7B,MAAOY,KAAKZ,O,GAKrC,MAAAwC,GACE,MAAMC,EAAU7B,KAAKF,WAErB,OACEgC,EAACC,EAAI,CAAAJ,IAAA,2CACHK,MAAO,CACL,YAAa,KACb,CAAC,cAAchC,KAAKL,QAAS,KAC7B,sBAAuBK,KAAKR,WAG7BQ,KAAKP,OACJqC,EAAA,SAAAH,IAAA,2CAAOK,MAAM,gBAAgBC,KAAK,SAC/BjC,KAAKP,MACLO,KAAKN,WAAaoC,EAAA,QAAAH,IAAA,2CAAMK,MAAM,iBAAiBhC,KAAKZ,SAGvDY,KAAKP,OAASO,KAAKN,WACnBoC,EAAA,QAAAH,IAAA,2CAAMK,MAAM,gBAAgBC,KAAK,QAAO,cAAa,QAClDjC,KAAKZ,OAGV0C,EAAA,OAAAH,IAAA,2CACEK,MAAM,gBACNC,KAAK,QACLC,IAAMC,GAAQnC,KAAKd,QAAUiD,EAC7BC,YAAapC,KAAKc,iBAElBgB,EAAA,OAAAH,IAAA,2CACEK,MAAM,eACNC,KAAK,OACLI,MAAO,CAAEzB,MAAO,GAAGiB,QAErBC,EAAA,OAAAH,IAAA,2CACEK,MAAM,gBACNC,KAAK,QACLK,KAAK,SACLC,SAAUvC,KAAKR,UAAW,EAAK,EAAC,gBACjBQ,KAAKZ,MAAK,gBACVY,KAAKX,IAAG,gBACRW,KAAKV,IAAG,aACXU,KAAKP,OAAS+C,UAAS,gBACpBxC,KAAKR,SAAW,OAASgD,UACxCH,MAAO,CAAEI,iBAAkB,GAAGZ,MAC9Ba,UAAW1C,KAAKwB,iB","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["alertCss","TsAlert","__stencil_proxyCustomElement","HTMLElement","variant","closable","isVisible","tsClose","close","this","emit","show","handleClose","renderDefaultIcon","icons","info","success","warning","danger","primary","secondary","neutral","h","render","Host","class","role","part","name","type","onClick"],"sources":["src/components/alert/alert.css?tag=ts-alert&encapsulation=shadow","src/components/alert/alert.tsx"],"sourcesContent":["/* ==========================================================================\n ts-alert — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-alert-radius Border radius\n --ts-alert-font-size Message font size\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-alert-radius: var(--ts-radius-lg);\n --ts-alert-font-size: var(--ts-font-size-sm);\n}\n\n.alert__base {\n display: flex;\n align-items: flex-start;\n gap: var(--ts-spacing-3);\n padding: var(--ts-spacing-4) var(--ts-spacing-4);\n border-radius: var(--ts-alert-radius);\n border: 1px solid transparent;\n border-inline-start: 3px solid transparent;\n font-size: var(--ts-alert-font-size);\n line-height: var(--ts-line-height-normal);\n}\n\n/* ---- Variants ---- */\n:host([variant=\"info\"]) .alert__base {\n background-color: var(--ts-color-info-bg);\n border-color: var(--ts-color-info-border);\n border-inline-start-color: var(--ts-color-info-500);\n color: var(--ts-color-info-600);\n}\n\n:host([variant=\"success\"]) .alert__base {\n background-color: var(--ts-color-success-bg);\n border-color: var(--ts-color-success-border);\n border-inline-start-color: var(--ts-color-success-500);\n color: var(--ts-color-success-600);\n}\n\n:host([variant=\"warning\"]) .alert__base {\n background-color: var(--ts-color-warning-bg);\n border-color: var(--ts-color-warning-border);\n border-inline-start-color: var(--ts-color-warning-500);\n color: var(--ts-color-warning-600);\n}\n\n:host([variant=\"danger\"]) .alert__base {\n background-color: var(--ts-color-danger-bg);\n border-color: var(--ts-color-danger-border);\n border-inline-start-color: var(--ts-color-danger-500);\n color: var(--ts-color-danger-600);\n}\n\n:host([variant=\"neutral\"]) .alert__base {\n background-color: var(--ts-color-bg-subtle);\n border-color: var(--ts-color-border-subtle);\n border-inline-start-color: var(--ts-color-neutral-400);\n color: var(--ts-color-text-secondary);\n}\n\n/* ---- Icon ---- */\n.alert__icon {\n display: flex;\n align-items: center;\n font-size: 1.25em;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n/* ---- Message ---- */\n.alert__message {\n flex: 1;\n min-width: 0;\n}\n\n/* ---- Action ---- */\n.alert__action {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.alert__action:empty {\n display: none;\n}\n\n/* ---- Close Button ---- */\n.alert__close {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1.5rem;\n height: 1.5rem;\n border: none;\n border-radius: var(--ts-radius-sm);\n background: transparent;\n color: currentColor;\n opacity: 0.6;\n cursor: pointer;\n font-size: 0.8em;\n transition: opacity var(--ts-transition-fast);\n padding: 0;\n line-height: 1;\n}\n\n.alert__close:hover {\n opacity: 1;\n}\n\n.alert__close:focus-visible {\n box-shadow: var(--ts-focus-ring);\n opacity: 1;\n}\n","import { Component, Prop, Event, State, h, Host, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsVariant } from '../../types';\n\n/**\n * @slot - Default slot for alert message content.\n * @slot icon - Custom icon to override the default variant icon.\n * @slot action - Action buttons or links displayed at the end.\n *\n * @part base - The alert container.\n * @part icon - The icon wrapper.\n * @part message - The message wrapper.\n * @part action - The action slot wrapper.\n * @part close - The close button.\n */\n@Component({\n tag: 'ts-alert',\n styleUrl: 'alert.css',\n shadow: true,\n})\nexport class TsAlert {\n /** The alert's semantic variant. */\n @Prop({ reflect: true }) variant: TsVariant = 'info';\n\n /** Whether the alert can be dismissed. */\n @Prop() closable = false;\n\n /** Whether the alert is currently visible. */\n @State() isVisible = true;\n\n /** Emitted when the alert is closed. */\n @Event({ eventName: 'tsClose' }) tsClose!: EventEmitter<void>;\n\n /** Programmatically close the alert. */\n @Method()\n async close(): Promise<void> {\n this.isVisible = false;\n this.tsClose.emit();\n }\n\n /** Programmatically show the alert. */\n @Method()\n async show(): Promise<void> {\n this.isVisible = true;\n }\n\n private handleClose = (): void => {\n this.close();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n private renderDefaultIcon() {\n const icons: Record<string, string> = {\n info: 'ℹ',\n success: '✓',\n warning: '⚠',\n danger: '✕',\n primary: 'ℹ',\n secondary: 'ℹ',\n neutral: 'ℹ',\n };\n return <span aria-hidden=\"true\">{icons[this.variant] || 'ℹ'}</span>;\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n if (!this.isVisible) return null;\n\n return (\n <Host\n class={{\n 'ts-alert': true,\n [`ts-alert--${this.variant}`]: true,\n }}\n role=\"alert\"\n >\n <div class=\"alert__base\" part=\"base\">\n <div class=\"alert__icon\" part=\"icon\">\n <slot name=\"icon\">{this.renderDefaultIcon()}</slot>\n </div>\n\n <div class=\"alert__message\" part=\"message\">\n <slot />\n </div>\n\n <div class=\"alert__action\" part=\"action\">\n <slot name=\"action\" />\n </div>\n\n {this.closable && (\n <button\n class=\"alert__close\"\n part=\"close\"\n type=\"button\"\n aria-label=\"Close alert\"\n onClick={this.handleClose}\n >\n ✕\n </button>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"uEAAA,MAAMA,EAAW,IAAM,8lE,MCoBVC,EAAOC,EAAA,MAAAD,UAAAE,E,gHAEOC,QAAqB,OAGtCC,SAAW,MAGVC,UAAY,KAGYC,QAIjC,WAAMC,GACJC,KAAKH,UAAY,MACjBG,KAAKF,QAAQG,M,CAKf,UAAMC,GACJF,KAAKH,UAAY,I,CAGXM,YAAc,KACpBH,KAAKD,OAAO,EAIN,iBAAAK,GACN,MAAMC,EAAgC,CACpCC,KAAM,IACNC,QAAS,IACTC,QAAS,IACTC,OAAQ,IACRC,QAAS,IACTC,UAAW,IACXC,QAAS,KAEX,OAAOC,EAAA,sBAAkB,QAAQR,EAAML,KAAKL,UAAY,I,CAI1D,MAAAmB,GACE,IAAKd,KAAKH,UAAW,OAAO,KAE5B,OACEgB,EAACE,EAAI,CACHC,MAAO,CACL,WAAY,KACZ,CAAC,aAAahB,KAAKL,WAAY,MAEjCsB,KAAK,SAELJ,EAAA,OAAKG,MAAM,cAAcE,KAAK,QAC5BL,EAAA,OAAKG,MAAM,cAAcE,KAAK,QAC5BL,EAAA,QAAMM,KAAK,QAAQnB,KAAKI,sBAG1BS,EAAA,OAAKG,MAAM,iBAAiBE,KAAK,WAC/BL,EAAA,cAGFA,EAAA,OAAKG,MAAM,gBAAgBE,KAAK,UAC9BL,EAAA,QAAMM,KAAK,YAGZnB,KAAKJ,UACJiB,EAAA,UACEG,MAAM,eACNE,KAAK,QACLE,KAAK,SAAQ,aACF,cACXC,QAASrB,KAAKG,aAAW,M","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["badgeCss","TsBadge","__stencil_proxyCustomElement","HTMLElement","variant","size","pill","dot","outline","render","h","Host","key","class","this","part"],"sources":["src/components/badge/badge.css?tag=ts-badge&encapsulation=shadow","src/components/badge/badge.tsx"],"sourcesContent":["/* ==========================================================================\n ts-badge — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-badge-radius Border radius\n --ts-badge-font-weight Label font weight\n ========================================================================== */\n\n:host {\n display: inline-flex;\n vertical-align: middle;\n font-family: var(--ts-font-family-base);\n\n --ts-badge-radius: var(--ts-shape-badge);\n --ts-badge-font-weight: var(--ts-font-weight-medium);\n}\n\n.badge__base {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-weight: var(--ts-badge-font-weight);\n letter-spacing: 0;\n line-height: 1;\n white-space: nowrap;\n border-radius: var(--ts-badge-radius);\n border: 1px solid transparent;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"xs\"]) .badge__base { padding: 2px var(--ts-spacing-1); font-size: 0.625rem; }\n:host([size=\"sm\"]) .badge__base { padding: 3px var(--ts-spacing-2); font-size: var(--ts-font-size-xs); }\n:host([size=\"md\"]) .badge__base { padding: var(--ts-spacing-1) var(--ts-spacing-3); font-size: var(--ts-font-size-xs); }\n:host([size=\"lg\"]) .badge__base { padding: var(--ts-spacing-2) var(--ts-spacing-3); font-size: var(--ts-font-size-sm); }\n:host([size=\"xl\"]) .badge__base { padding: var(--ts-spacing-2) var(--ts-spacing-4); font-size: var(--ts-font-size-md); }\n\n/* ---- Pill ---- */\n:host([pill]) .badge__base {\n border-radius: var(--ts-radius-full);\n}\n\n/* ---- Dot ---- */\n:host([dot]) .badge__base {\n width: 8px;\n height: 8px;\n padding: 0;\n border-radius: var(--ts-radius-full);\n}\n\n:host([dot][size=\"lg\"]) .badge__base { width: 10px; height: 10px; }\n:host([dot][size=\"xl\"]) .badge__base { width: 12px; height: 12px; }\n\n/* ---- Solid Variants ---- */\n:host([variant=\"primary\"]:not([outline])) .badge__base { background: var(--ts-color-primary-500); color: var(--ts-color-text-on-primary); }\n:host([variant=\"success\"]:not([outline])) .badge__base { background: var(--ts-color-success-500); color: var(--ts-color-text-on-success); }\n:host([variant=\"warning\"]:not([outline])) .badge__base { background: var(--ts-color-warning-500); color: var(--ts-color-text-on-warning); }\n:host([variant=\"danger\"]:not([outline])) .badge__base { background: var(--ts-color-danger-500); color: var(--ts-color-text-on-danger); }\n:host([variant=\"info\"]:not([outline])) .badge__base { background: var(--ts-color-info-500); color: var(--ts-color-text-on-info); }\n:host([variant=\"neutral\"]:not([outline])) .badge__base { background: var(--ts-color-neutral-200); color: var(--ts-color-text-secondary); }\n:host([variant=\"secondary\"]:not([outline])) .badge__base { background: var(--ts-color-neutral-100); color: var(--ts-color-text-tertiary); }\n\n/* ---- Outline Variants ---- */\n:host([outline][variant=\"primary\"]) .badge__base { border-color: var(--ts-color-primary-500); color: var(--ts-color-primary-600); background: transparent; }\n:host([outline][variant=\"success\"]) .badge__base { border-color: var(--ts-color-success-500); color: var(--ts-color-success-600); background: transparent; }\n:host([outline][variant=\"danger\"]) .badge__base { border-color: var(--ts-color-danger-500); color: var(--ts-color-danger-600); background: transparent; }\n:host([outline][variant=\"warning\"]) .badge__base { border-color: var(--ts-color-warning-500); color: var(--ts-color-warning-600); background: transparent; }\n:host([outline][variant=\"neutral\"]) .badge__base { border-color: var(--ts-color-border-strong); color: var(--ts-color-text-tertiary); background: transparent; }\n","import { Component, Prop, h, Host } from '@stencil/core';\nimport type { TsSize, TsVariant } from '../../types';\n\n/**\n * @slot - Default slot for badge content.\n *\n * @part base - The badge element.\n */\n@Component({\n tag: 'ts-badge',\n styleUrl: 'badge.css',\n shadow: true,\n})\nexport class TsBadge {\n /** The badge's color variant. */\n @Prop({ reflect: true }) variant: TsVariant = 'primary';\n\n /** The badge's size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Renders the badge with rounded-pill shape. */\n @Prop({ reflect: true }) pill = false;\n\n /** Renders the badge as a small dot indicator (content is hidden). */\n @Prop({ reflect: true }) dot = false;\n\n /** Renders an outlined style instead of solid. */\n @Prop({ reflect: true }) outline = false;\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-badge': true,\n [`ts-badge--${this.variant}`]: true,\n [`ts-badge--${this.size}`]: true,\n 'ts-badge--pill': this.pill,\n 'ts-badge--dot': this.dot,\n 'ts-badge--outline': this.outline,\n }}\n >\n <span class=\"badge__base\" part=\"base\">\n {!this.dot && <slot />}\n </span>\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAW,IAAM,uyF,MCaVC,EAAOC,EAAA,MAAAD,UAAAE,E,iFAEOC,QAAqB,UAGrBC,KAAe,KAGfC,KAAO,MAGPC,IAAM,MAGNC,QAAU,MAGnC,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,WAAY,KACZ,CAAC,aAAaC,KAAKV,WAAY,KAC/B,CAAC,aAAaU,KAAKT,QAAS,KAC5B,iBAAkBS,KAAKR,KACvB,gBAAiBQ,KAAKP,IACtB,oBAAqBO,KAAKN,UAG5BE,EAAA,QAAAE,IAAA,2CAAMC,MAAM,cAAcE,KAAK,SAC3BD,KAAKP,KAAOG,EAAA,QAAAE,IAAA,8C","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["buttonCss","TsButton","__stencil_proxyCustomElement","HTMLElement","variant","appearance","size","disabled","loading","block","type","href","target","tsClick","tsFocus","tsBlur","handleClick","event","this","preventDefault","stopPropagation","emit","handleFocus","handleBlur","renderSpinner","h","class","part","viewBox","fill","xmlns","cx","cy","r","stroke","render","isLink","Tag","attrs","undefined","rel","role","Host","key","onClick","onFocus","onBlur","name"],"sources":["src/components/button/button.css?tag=ts-button&encapsulation=shadow","src/components/button/button.tsx"],"sourcesContent":["/* ==========================================================================\n ts-button — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-button-radius Border radius\n --ts-button-font-weight Label font weight\n --ts-button-focus-ring Focus ring box-shadow\n ========================================================================== */\n\n:host {\n display: inline-block;\n vertical-align: middle;\n\n --ts-button-radius: var(--ts-shape-interactive);\n --ts-button-font-weight: var(--ts-font-weight-medium);\n --ts-button-focus-ring: var(--ts-focus-ring);\n}\n\n:host([block]) {\n display: block;\n width: 100%;\n}\n\n/* ---- Base native element ---- */\n.button__native {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ts-spacing-2);\n width: 100%;\n border: 1px solid transparent;\n border-radius: var(--ts-button-radius);\n font-family: var(--ts-font-family-base);\n font-weight: var(--ts-button-font-weight);\n line-height: var(--ts-line-height-tight);\n text-decoration: none;\n cursor: pointer;\n transition:\n background-color var(--ts-transition-fast),\n border-color var(--ts-transition-fast),\n color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast),\n opacity var(--ts-transition-fast),\n transform var(--ts-transition-fast);\n position: relative;\n white-space: nowrap;\n user-select: none;\n -webkit-appearance: none;\n appearance: none;\n outline: none;\n}\n\n/* ---- Focus visible ---- */\n.button__native:focus-visible {\n box-shadow: var(--ts-button-focus-ring);\n}\n\n/* ---- Active press (M3 bouncier) ---- */\n.button__native:active:not([disabled]):not([aria-disabled=\"true\"]) {\n transform: scale(0.96);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"xs\"]) .button__native {\n padding: calc(var(--ts-spacing-1) + 1px) var(--ts-spacing-2);\n font-size: var(--ts-font-size-xs);\n}\n\n:host([size=\"sm\"]) .button__native {\n padding: calc(var(--ts-spacing-1) + 1px) var(--ts-spacing-3);\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .button__native {\n padding: calc(var(--ts-spacing-2) + 1px) var(--ts-spacing-4);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .button__native {\n padding: calc(var(--ts-spacing-3) + 2px) var(--ts-spacing-6);\n font-size: var(--ts-font-size-lg);\n}\n\n:host([size=\"xl\"]) .button__native {\n padding: calc(var(--ts-spacing-4) + 2px) var(--ts-spacing-8);\n font-size: var(--ts-font-size-xl);\n}\n\n/* ---- Solid Appearance ---- */\n:host([appearance=\"solid\"]) .button__native {\n border-color: transparent;\n}\n:host([appearance=\"solid\"][variant=\"primary\"]) .button__native {\n background-color: var(--ts-color-interactive-primary);\n color: var(--ts-color-text-on-primary);\n}\n:host([appearance=\"solid\"][variant=\"primary\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-interactive-primary-hover);\n}\n\n:host([appearance=\"solid\"][variant=\"success\"]) .button__native {\n background-color: var(--ts-color-success-600);\n color: var(--ts-color-text-on-success);\n}\n:host([appearance=\"solid\"][variant=\"success\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-success-500);\n}\n\n:host([appearance=\"solid\"][variant=\"danger\"]) .button__native {\n background-color: var(--ts-color-interactive-danger);\n color: var(--ts-color-text-on-danger);\n}\n:host([appearance=\"solid\"][variant=\"danger\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-interactive-danger-hover);\n}\n\n:host([appearance=\"solid\"][variant=\"warning\"]) .button__native {\n background-color: var(--ts-color-warning-600);\n color: var(--ts-color-text-on-warning);\n}\n:host([appearance=\"solid\"][variant=\"warning\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-warning-500);\n}\n\n:host([appearance=\"solid\"][variant=\"neutral\"]) .button__native {\n background-color: var(--ts-color-neutral-800);\n color: var(--ts-color-text-on-primary);\n}\n:host([appearance=\"solid\"][variant=\"neutral\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-neutral-700);\n}\n\n:host([appearance=\"solid\"][variant=\"secondary\"]) .button__native {\n background-color: var(--ts-color-neutral-200);\n color: var(--ts-color-text-primary);\n}\n:host([appearance=\"solid\"][variant=\"secondary\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-neutral-300);\n}\n\n/* ---- Outline Appearance ---- */\n:host([appearance=\"outline\"]) .button__native {\n background-color: transparent;\n}\n:host([appearance=\"outline\"][variant=\"primary\"]) .button__native {\n border-color: var(--ts-color-primary-500);\n color: var(--ts-color-interactive-primary);\n}\n:host([appearance=\"outline\"][variant=\"primary\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-interactive-primary-subtle);\n}\n\n:host([appearance=\"outline\"][variant=\"danger\"]) .button__native {\n border-color: var(--ts-color-danger-500);\n color: var(--ts-color-interactive-danger);\n}\n:host([appearance=\"outline\"][variant=\"danger\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-interactive-danger-subtle);\n}\n\n:host([appearance=\"outline\"][variant=\"neutral\"]) .button__native {\n border-color: var(--ts-color-border-default);\n color: var(--ts-color-text-secondary);\n}\n:host([appearance=\"outline\"][variant=\"neutral\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-bg-subtle);\n}\n\n/* ---- Ghost Appearance ---- */\n:host([appearance=\"ghost\"]) .button__native {\n background-color: transparent;\n border-color: transparent;\n}\n:host([appearance=\"ghost\"][variant=\"primary\"]) .button__native {\n color: var(--ts-color-interactive-primary);\n}\n:host([appearance=\"ghost\"][variant=\"primary\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-interactive-primary-subtle);\n border-color: var(--ts-color-primary-200);\n}\n\n:host([appearance=\"ghost\"][variant=\"neutral\"]) .button__native {\n color: var(--ts-color-text-secondary);\n}\n:host([appearance=\"ghost\"][variant=\"neutral\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-neutral-100);\n border-color: var(--ts-color-neutral-200);\n}\n\n/* ---- Link Appearance ---- */\n:host([appearance=\"link\"]) .button__native {\n background: none;\n border: none;\n padding: 0;\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n:host([appearance=\"link\"][variant=\"primary\"]) .button__native {\n color: var(--ts-color-interactive-primary);\n}\n:host([appearance=\"link\"]) .button__native:hover:not([disabled]) {\n text-decoration-thickness: 2px;\n}\n\n/* ---- Disabled State ---- */\n:host([disabled]) .button__native,\n.button__native[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Loading State ---- */\n:host([loading]) .button__label,\n:host([loading]) .button__prefix,\n:host([loading]) .button__suffix {\n visibility: hidden;\n}\n\n:host([loading]) .button__native {\n cursor: wait;\n position: relative;\n}\n\n/* ---- Spinner ---- */\n.button__spinner {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.button__spinner svg {\n width: 1.2em;\n height: 1.2em;\n animation: ts-spin 0.8s linear infinite;\n}\n\n@keyframes ts-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* ---- Slot wrappers ---- */\n.button__prefix,\n.button__suffix {\n display: inline-flex;\n align-items: center;\n}\n\n.button__prefix:empty,\n.button__suffix:empty {\n display: none;\n}\n\n.button__label {\n display: inline-flex;\n align-items: center;\n}\n","import { Component, Prop, Event, h, Host, Element } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize, TsVariant, TsAppearance } from '../../types';\n\n/**\n * @slot - Default slot for button label content.\n * @slot prefix - Content before the label (e.g., icon).\n * @slot suffix - Content after the label (e.g., icon).\n *\n * @part base - The native button element.\n * @part label - The label wrapper.\n * @part prefix - The prefix slot wrapper.\n * @part suffix - The suffix slot wrapper.\n * @part spinner - The loading spinner element.\n */\n@Component({\n tag: 'ts-button',\n styleUrl: 'button.css',\n shadow: true,\n})\nexport class TsButton {\n @Element() hostEl!: HTMLElement;\n\n /** The button's visual variant. */\n @Prop({ reflect: true }) variant: TsVariant = 'primary';\n\n /** The button's visual weight / appearance. */\n @Prop({ reflect: true }) appearance: TsAppearance = 'solid';\n\n /** The button's size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Renders the button in a disabled state. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Renders a loading spinner and disables the button. */\n @Prop({ reflect: true }) loading = false;\n\n /** Makes the button take the full width of its container. */\n @Prop({ reflect: true }) block = false;\n\n /** The type attribute for the native button. */\n @Prop() type: 'button' | 'submit' | 'reset' = 'button';\n\n /** An optional href — renders an anchor instead of a button. */\n @Prop() href?: string;\n\n /** Target attribute when href is set. */\n @Prop() target?: '_blank' | '_self' | '_parent' | '_top';\n\n /** Emitted when the button is clicked (not fired when disabled/loading). */\n @Event({ eventName: 'tsClick' }) tsClick!: EventEmitter<void>;\n\n /** Emitted when the button receives focus. */\n @Event({ eventName: 'tsFocus' }) tsFocus!: EventEmitter<void>;\n\n /** Emitted when the button loses focus. */\n @Event({ eventName: 'tsBlur' }) tsBlur!: EventEmitter<void>;\n\n private handleClick = (event: MouseEvent): void => {\n if (this.disabled || this.loading) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.tsClick.emit();\n };\n\n private handleFocus = (): void => {\n this.tsFocus.emit();\n };\n\n private handleBlur = (): void => {\n this.tsBlur.emit();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n private renderSpinner() {\n return (\n <span class=\"button__spinner\" part=\"spinner\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-dasharray=\"31.4 31.4\" />\n </svg>\n </span>\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const isLink = !!this.href;\n const Tag = isLink ? 'a' : 'button';\n\n const attrs = isLink\n ? {\n href: this.disabled ? undefined : this.href,\n target: this.target,\n rel: this.target === '_blank' ? 'noopener noreferrer' : undefined,\n role: 'button',\n }\n : {\n type: this.type,\n disabled: this.disabled || this.loading,\n };\n\n return (\n <Host\n class={{\n 'ts-button': true,\n [`ts-button--${this.variant}`]: true,\n [`ts-button--${this.appearance}`]: true,\n [`ts-button--${this.size}`]: true,\n 'ts-button--disabled': this.disabled,\n 'ts-button--loading': this.loading,\n 'ts-button--block': this.block,\n }}\n >\n <Tag\n {...attrs}\n class=\"button__native\"\n part=\"base\"\n aria-disabled={this.disabled || this.loading ? 'true' : undefined}\n aria-busy={this.loading ? 'true' : undefined}\n onClick={this.handleClick}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n >\n {this.loading && this.renderSpinner()}\n\n <span class=\"button__prefix\" part=\"prefix\">\n <slot name=\"prefix\" />\n </span>\n\n <span class=\"button__label\" part=\"label\">\n <slot />\n </span>\n\n <span class=\"button__suffix\" part=\"suffix\">\n <slot name=\"suffix\" />\n </span>\n </Tag>\n </Host>\n );\n }\n}\n"],"mappings":"kEAAA,MAAMA,EAAY,IAAM,0+L,MCoBXC,EAAQC,EAAA,MAAAD,UAAAE,E,qMAIMC,QAAqB,UAGrBC,WAA2B,QAG3BC,KAAe,KAGfC,SAAW,MAGXC,QAAU,MAGVC,MAAQ,MAGzBC,KAAsC,SAGtCC,KAGAC,OAGyBC,QAGAC,QAGDC,OAExBC,YAAeC,IACrB,GAAIC,KAAKX,UAAYW,KAAKV,QAAS,CACjCS,EAAME,iBACNF,EAAMG,kBACN,M,CAEFF,KAAKL,QAAQQ,MAAM,EAGbC,YAAc,KACpBJ,KAAKJ,QAAQO,MAAM,EAGbE,WAAa,KACnBL,KAAKH,OAAOM,MAAM,EAIZ,aAAAG,GACN,OACEC,EAAA,QAAMC,MAAM,kBAAkBC,KAAK,UAAS,cAAa,QACvDF,EAAA,OAAKG,QAAQ,YAAYC,KAAK,OAAOC,MAAM,8BACzCL,EAAA,UAAQM,GAAG,KAAKC,GAAG,KAAKC,EAAE,KAAKC,OAAO,eAAc,eAAc,IAAG,iBAAgB,QAAO,mBAAkB,e,CAOtH,MAAAC,GACE,MAAMC,IAAWlB,KAAKP,KACtB,MAAM0B,EAAMD,EAAS,IAAM,SAE3B,MAAME,EAAQF,EACV,CACEzB,KAAMO,KAAKX,SAAWgC,UAAYrB,KAAKP,KACvCC,OAAQM,KAAKN,OACb4B,IAAKtB,KAAKN,SAAW,SAAW,sBAAwB2B,UACxDE,KAAM,UAER,CACE/B,KAAMQ,KAAKR,KACXH,SAAUW,KAAKX,UAAYW,KAAKV,SAGtC,OACEiB,EAACiB,EAAI,CAAAC,IAAA,2CACHjB,MAAO,CACL,YAAa,KACb,CAAC,cAAcR,KAAKd,WAAY,KAChC,CAAC,cAAcc,KAAKb,cAAe,KACnC,CAAC,cAAca,KAAKZ,QAAS,KAC7B,sBAAuBY,KAAKX,SAC5B,qBAAsBW,KAAKV,QAC3B,mBAAoBU,KAAKT,QAG3BgB,EAACY,EAAG,CAAAM,IAAA,8CACEL,EACJZ,MAAM,iBACNC,KAAK,OAAM,gBACIT,KAAKX,UAAYW,KAAKV,QAAU,OAAS+B,UAAS,YACtDrB,KAAKV,QAAU,OAAS+B,UACnCK,QAAS1B,KAAKF,YACd6B,QAAS3B,KAAKI,YACdwB,OAAQ5B,KAAKK,YAEZL,KAAKV,SAAWU,KAAKM,gBAEtBC,EAAA,QAAAkB,IAAA,2CAAMjB,MAAM,iBAAiBC,KAAK,UAChCF,EAAA,QAAAkB,IAAA,2CAAMI,KAAK,YAGbtB,EAAA,QAAAkB,IAAA,2CAAMjB,MAAM,gBAAgBC,KAAK,SAC/BF,EAAA,QAAAkB,IAAA,8CAGFlB,EAAA,QAAAkB,IAAA,2CAAMjB,MAAM,iBAAiBC,KAAK,UAChCF,EAAA,QAAAkB,IAAA,2CAAMI,KAAK,a","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["cardCss","TsCard","__stencil_proxyCustomElement","HTMLElement","elevation","interactive","bordered","padding","render","h","Host","key","class","this","role","undefined","tabindex","part","name"],"sources":["src/components/card/card.css?tag=ts-card&encapsulation=shadow","src/components/card/card.tsx"],"sourcesContent":["/* ==========================================================================\n ts-card — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-card-bg Card background\n --ts-card-radius Border radius\n --ts-card-border-color Border color (when bordered)\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-card-bg: var(--ts-color-bg-elevated);\n --ts-card-radius: var(--ts-shape-container);\n --ts-card-border-color: var(--ts-color-border-subtle);\n}\n\n.card__base {\n border-radius: var(--ts-card-radius);\n background-color: var(--ts-card-bg);\n border: 1px solid transparent;\n overflow: hidden;\n transition:\n box-shadow var(--ts-transition-normal),\n transform var(--ts-transition-normal),\n border-color var(--ts-transition-normal);\n}\n\n/* ---- Elevation ---- */\n:host([elevation=\"none\"]) .card__base { box-shadow: none; }\n:host([elevation=\"sm\"]) .card__base { box-shadow: var(--ts-shadow-sm); }\n:host([elevation=\"md\"]) .card__base { box-shadow: var(--ts-shadow-md); }\n:host([elevation=\"lg\"]) .card__base { box-shadow: var(--ts-shadow-lg); }\n:host([elevation=\"xl\"]) .card__base { box-shadow: var(--ts-shadow-xl); }\n\n/* ---- Bordered ---- */\n:host([bordered]) .card__base {\n border: 1px solid var(--ts-card-border-color);\n}\n\n/* ---- Interactive ---- */\n:host([interactive]) {\n cursor: pointer;\n}\n\n:host([interactive]) .card__base:hover {\n box-shadow: var(--ts-shadow-lg);\n}\n\n:host([interactive]) .card__base:active {\n box-shadow: var(--ts-shadow-md);\n}\n\n:host([interactive]:focus-visible) .card__base {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Sections ---- */\n.card__media {\n overflow: hidden;\n}\n\n.card__media:empty {\n display: none;\n}\n\n.card__media ::slotted(img) {\n display: block;\n width: 100%;\n height: auto;\n object-fit: cover;\n}\n\n.card__header {\n border-bottom: 1px solid var(--ts-card-border-color);\n}\n\n.card__header:empty {\n display: none;\n border-bottom: none;\n}\n\n.card__footer {\n border-top: 1px solid var(--ts-card-border-color);\n}\n\n.card__footer:empty {\n display: none;\n border-top: none;\n}\n\n/* ---- Padding ---- */\n:host([padding=\"none\"]) .card__header,\n:host([padding=\"none\"]) .card__body,\n:host([padding=\"none\"]) .card__footer { padding: 0; }\n\n:host([padding=\"sm\"]) .card__header,\n:host([padding=\"sm\"]) .card__body,\n:host([padding=\"sm\"]) .card__footer { padding: var(--ts-spacing-3); }\n\n:host([padding=\"md\"]) .card__header,\n:host([padding=\"md\"]) .card__body,\n:host([padding=\"md\"]) .card__footer { padding: var(--ts-spacing-4); }\n\n:host([padding=\"lg\"]) .card__header,\n:host([padding=\"lg\"]) .card__body,\n:host([padding=\"lg\"]) .card__footer { padding: var(--ts-spacing-6); }\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for card body content.\n * @slot header - Card header content.\n * @slot footer - Card footer content.\n * @slot media - Media content (image, video) displayed at the top.\n *\n * @part base - The card container.\n * @part header - The header wrapper.\n * @part body - The body wrapper.\n * @part footer - The footer wrapper.\n * @part media - The media wrapper.\n */\n@Component({\n tag: 'ts-card',\n styleUrl: 'card.css',\n shadow: true,\n})\nexport class TsCard {\n /** Elevation level controlling the shadow depth. */\n @Prop({ reflect: true }) elevation: 'none' | 'sm' | 'md' | 'lg' | 'xl' = 'sm';\n\n /** Makes the card interactive (hover effect, cursor pointer). */\n @Prop({ reflect: true }) interactive = false;\n\n /** Border style variant. */\n @Prop({ reflect: true }) bordered = false;\n\n /** Padding size for the card body. */\n @Prop({ reflect: true }) padding: 'none' | 'sm' | 'md' | 'lg' = 'md';\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-card': true,\n [`ts-card--elevation-${this.elevation}`]: true,\n [`ts-card--padding-${this.padding}`]: true,\n 'ts-card--interactive': this.interactive,\n 'ts-card--bordered': this.bordered,\n }}\n role={this.interactive ? 'button' : undefined}\n tabindex={this.interactive ? '0' : undefined}\n >\n <div class=\"card__base\" part=\"base\">\n <div class=\"card__media\" part=\"media\">\n <slot name=\"media\" />\n </div>\n\n <div class=\"card__header\" part=\"header\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"card__body\" part=\"body\">\n <slot />\n </div>\n\n <div class=\"card__footer\" part=\"footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAU,IAAM,g+D,MCmBTC,EAAMC,EAAA,MAAAD,UAAAE,E,iFAEQC,UAAgD,KAGhDC,YAAc,MAGdC,SAAW,MAGXC,QAAuC,KAGhE,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,UAAW,KACX,CAAC,sBAAsBC,KAAKT,aAAc,KAC1C,CAAC,oBAAoBS,KAAKN,WAAY,KACtC,uBAAwBM,KAAKR,YAC7B,oBAAqBQ,KAAKP,UAE5BQ,KAAMD,KAAKR,YAAc,SAAWU,UACpCC,SAAUH,KAAKR,YAAc,IAAMU,WAEnCN,EAAA,OAAAE,IAAA,2CAAKC,MAAM,aAAaK,KAAK,QAC3BR,EAAA,OAAAE,IAAA,2CAAKC,MAAM,cAAcK,KAAK,SAC5BR,EAAA,QAAAE,IAAA,2CAAMO,KAAK,WAGbT,EAAA,OAAAE,IAAA,2CAAKC,MAAM,eAAeK,KAAK,UAC7BR,EAAA,QAAAE,IAAA,2CAAMO,KAAK,YAGbT,EAAA,OAAAE,IAAA,2CAAKC,MAAM,aAAaK,KAAK,QAC3BR,EAAA,QAAAE,IAAA,8CAGFF,EAAA,OAAAE,IAAA,2CAAKC,MAAM,eAAeK,KAAK,UAC7BR,EAAA,QAAAE,IAAA,2CAAMO,KAAK,a","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["checkboxCss","TsCheckbox","__stencil_proxyCustomElement","HTMLElement","inputId","generateId","checked","indeterminate","disabled","value","name","label","size","error","tsChange","toggle","this","emit","handleClick","handleKeydown","event","key","preventDefault","render","ariaChecked","h","Host","class","part","role","undefined","tabindex","onClick","onKeyDown","viewBox","fill","d","stroke","id"],"sources":["src/components/checkbox/checkbox.css?tag=ts-checkbox&encapsulation=shadow","src/components/checkbox/checkbox.tsx"],"sourcesContent":["/* ==========================================================================\n ts-checkbox — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-checkbox-size Checkbox box size\n --ts-checkbox-color Checked background color\n --ts-checkbox-radius Border radius\n --ts-checkbox-border-color Default border color\n ========================================================================== */\n\n:host {\n display: inline-block;\n font-family: var(--ts-font-family-base);\n\n --ts-checkbox-size: 1.25rem;\n --ts-checkbox-color: var(--ts-color-interactive-primary);\n --ts-checkbox-radius: 4px;\n --ts-checkbox-border-color: var(--ts-color-border-default);\n}\n\n/* ---- Base container ---- */\n.checkbox__base {\n display: inline-flex;\n align-items: center;\n gap: var(--ts-spacing-2);\n cursor: pointer;\n outline: none;\n}\n\n.checkbox__base:focus-visible .checkbox__control {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Control box ---- */\n.checkbox__control {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--ts-checkbox-size);\n height: var(--ts-checkbox-size);\n box-sizing: border-box;\n border: 2px solid var(--ts-checkbox-border-color);\n border-radius: var(--ts-checkbox-radius);\n background-color: var(--ts-color-bg-elevated);\n transition:\n background-color var(--ts-transition-fast),\n border-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n flex-shrink: 0;\n}\n\n/* ---- Checked & indeterminate states ---- */\n:host([checked]) .checkbox__control,\n:host([indeterminate]) .checkbox__control {\n background-color: var(--ts-checkbox-color);\n border-color: var(--ts-checkbox-color);\n color: var(--ts-color-text-on-primary);\n}\n\n/* ---- Hover ---- */\n.checkbox__base:hover:not([aria-disabled=\"true\"]) .checkbox__control {\n border-color: var(--ts-color-primary-500);\n}\n\n/* ---- Error state ---- */\n:host([error]) .checkbox__control {\n border-color: var(--ts-color-danger-500);\n}\n\n/* ---- Disabled state ---- */\n:host([disabled]) .checkbox__base {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Checkmark icon ---- */\n.checkbox__icon {\n width: 100%;\n height: 100%;\n transform: scale(1);\n transition: transform var(--ts-transition-fast);\n}\n\n:host([checked]) .checkbox__icon {\n animation: none;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) {\n --ts-checkbox-size: 1rem;\n}\n\n:host([size=\"sm\"]) .checkbox__label {\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .checkbox__label {\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) {\n --ts-checkbox-size: 1.5rem;\n}\n\n:host([size=\"lg\"]) .checkbox__label {\n font-size: var(--ts-font-size-lg);\n}\n\n/* ---- Label ---- */\n.checkbox__label {\n color: var(--ts-color-text-primary);\n line-height: var(--ts-line-height-normal);\n user-select: none;\n}\n","import { Component, Prop, Event, h, Host, Element, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsCheckboxChangeEventDetail } from '../../types';\nimport { generateId } from '../../utils/aria';\n\n/**\n * @slot - Default slot for the checkbox label.\n *\n * @part base - The checkbox container.\n * @part control - The visual checkbox box.\n * @part label - The label wrapper.\n */\n@Component({\n tag: 'ts-checkbox',\n styleUrl: 'checkbox.css',\n shadow: true,\n})\nexport class TsCheckbox {\n @Element() hostEl!: HTMLElement;\n\n private inputId = generateId('ts-checkbox');\n\n /** Whether the checkbox is checked. */\n @Prop({ mutable: true, reflect: true }) checked = false;\n\n /** Whether the checkbox is in an indeterminate state. */\n @Prop({ mutable: true, reflect: true }) indeterminate = false;\n\n /** Renders the checkbox as disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** The value associated with this checkbox. */\n @Prop() value = '';\n\n /** Name attribute for form submission. */\n @Prop() name?: string;\n\n /** Label text. If omitted, use the default slot. */\n @Prop() label?: string;\n\n /** The checkbox size. */\n @Prop({ reflect: true }) size: 'sm' | 'md' | 'lg' = 'md';\n\n /** Renders the checkbox in an error state. */\n @Prop({ reflect: true }) error = false;\n\n /** Emitted when the checked state changes. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<TsCheckboxChangeEventDetail>;\n\n /** Programmatically toggle the checkbox. */\n @Method()\n async toggle(): Promise<void> {\n if (!this.disabled) {\n this.indeterminate = false;\n this.checked = !this.checked;\n this.tsChange.emit({ checked: this.checked, value: this.value });\n }\n }\n\n private handleClick = (): void => {\n this.toggle();\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === ' ') {\n event.preventDefault();\n this.toggle();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const ariaChecked = this.indeterminate ? 'mixed' : this.checked ? 'true' : 'false';\n\n return (\n <Host\n class={{\n 'ts-checkbox': true,\n [`ts-checkbox--${this.size}`]: true,\n 'ts-checkbox--checked': this.checked,\n 'ts-checkbox--indeterminate': this.indeterminate,\n 'ts-checkbox--disabled': this.disabled,\n 'ts-checkbox--error': this.error,\n }}\n >\n <div\n class=\"checkbox__base\"\n part=\"base\"\n role=\"checkbox\"\n aria-checked={ariaChecked}\n aria-disabled={this.disabled ? 'true' : undefined}\n tabindex={this.disabled ? -1 : 0}\n onClick={this.handleClick}\n onKeyDown={this.handleKeydown}\n >\n <div class=\"checkbox__control\" part=\"control\">\n {this.checked && !this.indeterminate && (\n <svg class=\"checkbox__icon\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.5 8L6.5 11L12.5 5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n )}\n {this.indeterminate && (\n <svg class=\"checkbox__icon\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 8H12\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n )}\n </div>\n\n <label class=\"checkbox__label\" part=\"label\" id={`${this.inputId}-label`}>\n {this.label ? this.label : <slot />}\n </label>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"2GAAA,MAAMA,EAAc,IAAM,02D,MCiBbC,EAAUC,EAAA,MAAAD,UAAAE,E,2IAGbC,QAAUC,EAAW,eAGWC,QAAU,MAGVC,cAAgB,MAG/BC,SAAW,MAG5BC,MAAQ,GAGRC,KAGAC,MAGiBC,KAA2B,KAG3BC,MAAQ,MAGCC,SAIlC,YAAMC,GACJ,IAAKC,KAAKR,SAAU,CAClBQ,KAAKT,cAAgB,MACrBS,KAAKV,SAAWU,KAAKV,QACrBU,KAAKF,SAASG,KAAK,CAAEX,QAASU,KAAKV,QAASG,MAAOO,KAAKP,O,EAIpDS,YAAc,KACpBF,KAAKD,QAAQ,EAGPI,cAAiBC,IACvB,GAAIA,EAAMC,MAAQ,IAAK,CACrBD,EAAME,iBACNN,KAAKD,Q,GAKT,MAAAQ,GACE,MAAMC,EAAcR,KAAKT,cAAgB,QAAUS,KAAKV,QAAU,OAAS,QAE3E,OACEmB,EAACC,EAAI,CAAAL,IAAA,2CACHM,MAAO,CACL,cAAe,KACf,CAAC,gBAAgBX,KAAKJ,QAAS,KAC/B,uBAAwBI,KAAKV,QAC7B,6BAA8BU,KAAKT,cACnC,wBAAyBS,KAAKR,SAC9B,qBAAsBQ,KAAKH,QAG7BY,EAAA,OAAAJ,IAAA,2CACEM,MAAM,iBACNC,KAAK,OACLC,KAAK,WAAU,eACDL,EAAW,gBACVR,KAAKR,SAAW,OAASsB,UACxCC,SAAUf,KAAKR,UAAW,EAAK,EAC/BwB,QAAShB,KAAKE,YACde,UAAWjB,KAAKG,eAEhBM,EAAA,OAAAJ,IAAA,2CAAKM,MAAM,oBAAoBC,KAAK,WACjCZ,KAAKV,UAAYU,KAAKT,eACrBkB,EAAA,OAAAJ,IAAA,2CAAKM,MAAM,iBAAiBO,QAAQ,YAAYC,KAAK,OAAM,cAAa,QACtEV,EAAA,QAAAJ,IAAA,2CACEe,EAAE,uBACFC,OAAO,eAAc,eACR,IAAG,iBACD,QAAO,kBACN,WAIrBrB,KAAKT,eACJkB,EAAA,OAAAJ,IAAA,2CAAKM,MAAM,iBAAiBO,QAAQ,YAAYC,KAAK,OAAM,cAAa,QACtEV,EAAA,QAAAJ,IAAA,2CACEe,EAAE,UACFC,OAAO,eAAc,eACR,IAAG,iBACD,YAMvBZ,EAAA,SAAAJ,IAAA,2CAAOM,MAAM,kBAAkBC,KAAK,QAAQU,GAAI,GAAGtB,KAAKZ,iBACrDY,KAAKL,MAAQK,KAAKL,MAAQc,EAAA,e","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|