@tessera-ui/core 0.4.1 → 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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tessera-ui.js","sources":["node_modules/.pnpm/@stencil+core@4.43.3/node_modules/@stencil/core/internal/client/patch-browser.js","@lazy-browser-entrypoint?app-data=conditional"],"sourcesContent":["/*\n Stencil Client Patch Browser v4.43.3 | MIT Licensed | https://stenciljs.com\n */\n\n// src/client/client-patch-browser.ts\nimport { BUILD, NAMESPACE } from \"@stencil/core/internal/app-data\";\nimport { consoleDevInfo, H, promiseResolve, win } from \"@stencil/core\";\nvar patchBrowser = () => {\n if (BUILD.isDev && !BUILD.isTesting) {\n consoleDevInfo(\"Running in development mode.\");\n }\n if (BUILD.cloneNodeFix) {\n patchCloneNodeFix(H.prototype);\n }\n const scriptElm = BUILD.scriptDataOpts ? win.document && Array.from(win.document.querySelectorAll(\"script\")).find(\n (s) => new RegExp(`/${NAMESPACE}(\\\\.esm)?\\\\.js($|\\\\?|#)`).test(s.src) || s.getAttribute(\"data-stencil-namespace\") === NAMESPACE\n ) : null;\n const importMeta = import.meta.url;\n const opts = BUILD.scriptDataOpts ? (scriptElm || {})[\"data-opts\"] || {} : {};\n if (importMeta !== \"\") {\n opts.resourcesUrl = new URL(\".\", importMeta).href;\n }\n return promiseResolve(opts);\n};\nvar patchCloneNodeFix = (HTMLElementPrototype) => {\n const nativeCloneNodeFn = HTMLElementPrototype.cloneNode;\n HTMLElementPrototype.cloneNode = function(deep) {\n if (this.nodeName === \"TEMPLATE\") {\n return nativeCloneNodeFn.call(this, deep);\n }\n const clonedNode = nativeCloneNodeFn.call(this, false);\n const srcChildNodes = this.childNodes;\n if (deep) {\n for (let i = 0; i < srcChildNodes.length; i++) {\n if (srcChildNodes[i].nodeType !== 2) {\n clonedNode.appendChild(srcChildNodes[i].cloneNode(true));\n }\n }\n }\n return clonedNode;\n };\n};\nexport {\n patchBrowser\n};\n","export { setNonce } from '@stencil/core';\nimport { bootstrapLazy } from '@stencil/core';\nimport { patchBrowser } from '@stencil/core/internal/client/patch-browser';\nimport { globalScripts } from '@stencil/core/internal/app-globals';\npatchBrowser().then(async (options) => {\n await globalScripts();\n return bootstrapLazy([/*!__STENCIL_LAZY_DATA__*/], options);\n});\n"],"names":[],"mappings":";;;AAAA;AACA;AACA;;AAKA,IAAI,YAAY,GAAG,MAAM;AAUzB,EAAE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG;AACpC,EAAE,MAAM,IAAI,GAAiE,EAAE;AAC/E,EAAE,IAAI,UAAU,KAAK,EAAE,EAAE;AACzB,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI;AACrD;AACA,EAAE,OAAO,cAAc,CAAC,IAAI,CAAC;AAC7B,CAAC;;ACnBD,YAAY,EAAE,CAAC,IAAI,CAAC,OAAO,OAAO,KAAK;AACvC,EAAE,MAAM,aAAa,EAAE;AACvB,EAAE,OAAO,aAAa,CAAC,4BAA4B,EAAE,OAAO,CAAC;AAC7D,CAAC,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-accordion-item.entry.js","sources":["src/components/accordion/accordion-item.css?tag=ts-accordion-item&encapsulation=shadow","src/components/accordion/accordion-item.tsx"],"sourcesContent":["/* ==========================================================================\n ts-accordion-item — Shadow DOM Scoped Styles\n ========================================================================== */\n\n:host {\n display: block;\n}\n\n/* ---- Header ---- */\n.accordion-item__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ts-spacing-2);\n padding-block: var(--ts-spacing-3);\n padding-inline: var(--ts-spacing-4);\n background: var(--ts-accordion-header-bg, transparent);\n border: none;\n cursor: pointer;\n font-family: var(--ts-font-family-base);\n font-size: var(--ts-font-size-md);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-primary);\n outline: none;\n transition: background-color var(--ts-transition-fast);\n user-select: none;\n}\n\n.accordion-item__header:hover:not([aria-disabled=\"true\"]) {\n background-color: var(--ts-color-bg-subtle);\n}\n\n.accordion-item__header:focus-visible {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) .accordion-item__header {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ---- Chevron icon ---- */\n.accordion-item__icon {\n display: inline-flex;\n align-items: center;\n transition: transform var(--ts-transition-fast);\n}\n\n.accordion-item__icon svg {\n inline-size: 1.25em;\n block-size: 1.25em;\n}\n\n:host(.ts-accordion-item--open) .accordion-item__icon {\n transform: rotate(180deg);\n}\n\n/* ---- Panel ---- */\n.accordion-item__panel {\n overflow: hidden;\n transition: max-block-size var(--ts-transition-normal);\n}\n\n.accordion-item__panel[hidden] {\n display: none;\n}\n\n.accordion-item__content {\n padding-block: var(--ts-spacing-2);\n padding-inline: var(--ts-spacing-4);\n padding-block-end: var(--ts-spacing-4);\n font-size: var(--ts-font-size-md);\n color: var(--ts-color-text-secondary);\n}\n","import { Component, Prop, Event, h, Host, State, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\nlet accordionItemId = 0;\n\n/**\n * @slot - Default slot for panel content.\n * @slot header - Custom header content (replaces heading text).\n *\n * @part header - The header button.\n * @part panel - The content panel.\n */\n@Component({\n tag: 'ts-accordion-item',\n styleUrl: 'accordion-item.css',\n shadow: true,\n})\nexport class TsAccordionItem {\n private headerId!: string;\n private panelId!: string;\n\n /** Whether the item is expanded. */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n /** Disables toggling. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Header text for the item. */\n @Prop() heading?: string;\n\n /** Emitted when the item is toggled. */\n @Event({ eventName: 'tsToggle' }) tsToggle!: EventEmitter<{ open: boolean }>;\n\n @State() internalOpen = false;\n\n @Watch('open')\n onOpenChange(newVal: boolean): void {\n this.internalOpen = newVal;\n }\n\n connectedCallback(): void {\n const id = accordionItemId++;\n this.headerId = `ts-accordion-header-${id}`;\n this.panelId = `ts-accordion-panel-${id}`;\n this.internalOpen = this.open;\n }\n\n private handleClick = (): void => {\n if (this.disabled) return;\n this.open = !this.open;\n this.internalOpen = this.open;\n this.tsToggle.emit({ open: this.open });\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.handleClick();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-accordion-item': true,\n 'ts-accordion-item--open': this.internalOpen,\n 'ts-accordion-item--disabled': this.disabled,\n }}\n >\n <div\n class=\"accordion-item__header\"\n part=\"header\"\n id={this.headerId}\n role=\"button\"\n tabindex={this.disabled ? -1 : 0}\n aria-expanded={this.internalOpen ? 'true' : 'false'}\n aria-controls={this.panelId}\n aria-disabled={this.disabled ? 'true' : undefined}\n onClick={this.handleClick}\n onKeyDown={this.handleKeyDown}\n >\n <slot name=\"header\">\n <span class=\"accordion-item__heading\">{this.heading}</span>\n </slot>\n <span class=\"accordion-item__icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </span>\n </div>\n <div\n class=\"accordion-item__panel\"\n part=\"panel\"\n id={this.panelId}\n role=\"region\"\n aria-labelledby={this.headerId}\n hidden={!this.internalOpen}\n >\n <div class=\"accordion-item__content\">\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-accordion.entry.js","sources":["src/components/accordion/accordion.css?tag=ts-accordion&encapsulation=shadow","src/components/accordion/accordion.tsx"],"sourcesContent":["/* ==========================================================================\n ts-accordion — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-accordion-border-color Border color between items\n --ts-accordion-header-bg Header background color\n --ts-accordion-radius Border radius\n ========================================================================== */\n\n:host {\n display: block;\n\n --ts-accordion-border-color: var(--ts-color-border-default);\n --ts-accordion-header-bg: transparent;\n --ts-accordion-radius: var(--ts-radius-lg);\n}\n\n::slotted(ts-accordion-item) {\n border-block-end: 1px solid var(--ts-accordion-border-color);\n}\n\n::slotted(ts-accordion-item:first-child) {\n border-start-start-radius: var(--ts-accordion-radius);\n border-start-end-radius: var(--ts-accordion-radius);\n}\n\n::slotted(ts-accordion-item:last-child) {\n border-end-start-radius: var(--ts-accordion-radius);\n border-end-end-radius: var(--ts-accordion-radius);\n border-block-end: none;\n}\n","import { Component, Prop, h, Host, Element, Listen } from '@stencil/core';\n\n/**\n * @slot - Default slot for ts-accordion-item children.\n */\n@Component({\n tag: 'ts-accordion',\n styleUrl: 'accordion.css',\n shadow: true,\n})\nexport class TsAccordion {\n @Element() hostEl!: HTMLElement;\n\n /** Allow multiple items to be open simultaneously. */\n @Prop() multiple = false;\n\n @Listen('tsToggle')\n handleToggle(event: CustomEvent<{ open: boolean }>): void {\n if (!this.multiple && event.detail.open) {\n const target = event.target as HTMLElement;\n const items = this.hostEl.querySelectorAll('ts-accordion-item');\n items.forEach((item) => {\n if (item !== target) {\n item.setAttribute('open', 'false');\n item.removeAttribute('open');\n }\n });\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host class=\"ts-accordion\">\n <slot />\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,YAAY,GAAG,MAAM,CAAC,0iBAA0iB,CAAC;;MCU1jB,WAAW,GAAA,MAAA;;;;;;IAId,QAAQ,GAAG,KAAK;AAGxB,IAAA,YAAY,CAAC,KAAqC,EAAA;QAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;AACvC,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;AAC/D,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrB,gBAAA,IAAI,IAAI,KAAK,MAAM,EAAE;AACnB,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;AAClC,oBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;;AAEhC,aAAC,CAAC;;;;IAKN,MAAM,GAAA;QACJ,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAC,KAAK,EAAC,cAAc,EAAA,EACxB,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAQ,CACH;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-alert.entry.js","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"],"names":[],"mappings":";;AAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,2lEAA2lE,CAAC;;MCoBvmE,OAAO,GAAA,MAAA;;;;;;IAEO,OAAO,GAAc,MAAM;;IAG5C,QAAQ,GAAG,KAAK;;IAGf,SAAS,GAAG,IAAI;;AAGQ,IAAA,OAAO;;AAIxC,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;;;AAKrB,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;IAGf,WAAW,GAAG,MAAW;QAC/B,IAAI,CAAC,KAAK,EAAE;AACd,KAAC;;IAGO,iBAAiB,GAAA;AACvB,QAAA,MAAM,KAAK,GAA2B;AACpC,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,OAAO,EAAE,GAAG;AACZ,YAAA,OAAO,EAAE,GAAG;AACZ,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,OAAO,EAAE,GAAG;AACZ,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,OAAO,EAAE,GAAG;SACb;AACD,QAAA,OAAO,CAAA,CAAA,MAAA,EAAA,EAAA,aAAA,EAAkB,MAAM,EAAA,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAQ;;;IAIrE,MAAM,GAAA;QACJ,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;AAEhC,QAAA,QACE,CAAA,CAAC,IAAI,EAAA,EACH,KAAK,EAAE;AACL,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,CAAC,aAAa,IAAI,CAAC,OAAO,CAAA,CAAE,GAAG,IAAI;AACpC,aAAA,EACD,IAAI,EAAC,OAAO,EAAA,EAEZ,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,aAAa,EAAC,IAAI,EAAC,MAAM,EAAA,EAClC,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,aAAa,EAAC,IAAI,EAAC,MAAM,EAAA,EAClC,CAAA,CAAA,MAAA,EAAA,EAAM,IAAI,EAAC,MAAM,EAAA,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAQ,CAC/C,EAEN,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,gBAAgB,EAAC,IAAI,EAAC,SAAS,EAAA,EACxC,CAAA,CAAA,MAAA,EAAA,IAAA,CAAQ,CACJ,EAEN,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,eAAe,EAAC,IAAI,EAAC,QAAQ,EAAA,EACtC,CAAA,CAAA,MAAA,EAAA,EAAM,IAAI,EAAC,QAAQ,EAAA,CAAG,CAClB,EAEL,IAAI,CAAC,QAAQ,KACZ,CAAA,CAAA,QAAA,EAAA,EACE,KAAK,EAAC,cAAc,EACpB,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,QAAQ,EAAA,YAAA,EACF,aAAa,EACxB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAA,EAAA,QAAA,CAGlB,CACV,CACG,CACD;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-avatar.entry.js","sources":["src/components/avatar/avatar.css?tag=ts-avatar&encapsulation=shadow","src/components/avatar/avatar.tsx"],"sourcesContent":["/* ==========================================================================\n ts-avatar — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-avatar-size Avatar dimensions\n --ts-avatar-bg Background color for initials/slot\n --ts-avatar-color Text color for initials\n --ts-avatar-radius Border radius\n ========================================================================== */\n\n:host {\n display: inline-flex;\n vertical-align: middle;\n\n --ts-avatar-size: 2.5rem;\n --ts-avatar-bg: var(--ts-color-neutral-200);\n --ts-avatar-color: var(--ts-color-text-primary);\n --ts-avatar-radius: var(--ts-shape-full);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"xs\"]) { --ts-avatar-size: 1.5rem; font-size: var(--ts-font-size-xs); }\n:host([size=\"sm\"]) { --ts-avatar-size: 2rem; font-size: var(--ts-font-size-sm); }\n:host([size=\"md\"]) { --ts-avatar-size: 2.5rem; font-size: var(--ts-font-size-md); }\n:host([size=\"lg\"]) { --ts-avatar-size: 3rem; font-size: var(--ts-font-size-lg); }\n:host([size=\"xl\"]) { --ts-avatar-size: 4rem; font-size: var(--ts-font-size-xl); }\n\n/* ---- Variant: square ---- */\n:host([variant=\"square\"]) {\n --ts-avatar-radius: var(--ts-radius-full);\n}\n\n/* ---- Base container ---- */\n.avatar__base {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--ts-avatar-size);\n height: var(--ts-avatar-size);\n border-radius: var(--ts-avatar-radius);\n background-color: var(--ts-avatar-bg);\n color: var(--ts-avatar-color);\n overflow: hidden;\n user-select: none;\n flex-shrink: 0;\n}\n\n/* ---- Image ---- */\n.avatar__image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: inherit;\n}\n\n/* ---- Initials ---- */\n.avatar__initials {\n font-family: var(--ts-font-family-base);\n font-weight: var(--ts-font-weight-semi);\n font-size: inherit;\n line-height: 1;\n text-transform: uppercase;\n}\n","import { Component, Prop, State, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for custom content (e.g., icon).\n *\n * @part base - The avatar container.\n * @part image - The avatar image element.\n * @part initials - The initials text element.\n */\n@Component({\n tag: 'ts-avatar',\n styleUrl: 'avatar.css',\n shadow: true,\n})\nexport class TsAvatar {\n /** Image URL for the avatar. */\n @Prop() src?: string;\n\n /** Alt text for the avatar image. */\n @Prop() alt?: string;\n\n /** Name used to generate initials fallback. */\n @Prop() name?: string;\n\n /** The size of the avatar. */\n @Prop({ reflect: true }) size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'md';\n\n /** Shape variant of the avatar. */\n @Prop({ reflect: true }) variant: 'circle' | 'square' = 'circle';\n\n /** Background color for the initials fallback. */\n @Prop() color?: string;\n\n /** Whether the image failed to load. */\n @State() hasError = false;\n\n private handleError = (): void => {\n this.hasError = true;\n };\n\n private getInitials(): string {\n if (!this.name) return '';\n const words = this.name.trim().split(/\\s+/);\n if (words.length === 1) {\n return words[0].charAt(0).toUpperCase();\n }\n return (words[0].charAt(0) + words[words.length - 1].charAt(0)).toUpperCase();\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const showImage = this.src && !this.hasError;\n const initials = this.getInitials();\n const showInitials = !showImage && initials;\n\n return (\n <Host\n class={{\n 'ts-avatar': true,\n [`ts-avatar--${this.size}`]: true,\n [`ts-avatar--${this.variant}`]: true,\n }}\n >\n <div\n class=\"avatar__base\"\n part=\"base\"\n role=\"img\"\n aria-label={this.alt || this.name || 'Avatar'}\n style={this.color && !showImage ? { backgroundColor: this.color } : undefined}\n >\n {showImage && (\n <img\n class=\"avatar__image\"\n part=\"image\"\n src={this.src}\n alt={this.alt || this.name || ''}\n onError={this.handleError}\n />\n )}\n {showInitials && (\n <span class=\"avatar__initials\" part=\"initials\" aria-hidden=\"true\">\n {initials}\n </span>\n )}\n {!showImage && !showInitials && <slot />}\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,SAAS,GAAG,MAAM,CAAC,qoCAAqoC,CAAC;;MCclpC,QAAQ,GAAA,MAAA;;;;;AAEX,IAAA,GAAG;;AAGH,IAAA,GAAG;;AAGH,IAAA,IAAI;;IAGa,IAAI,GAAqC,IAAI;;IAG7C,OAAO,GAAwB,QAAQ;;AAGxD,IAAA,KAAK;;IAGJ,QAAQ,GAAG,KAAK;IAEjB,WAAW,GAAG,MAAW;AAC/B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACtB,KAAC;IAEO,WAAW,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;AAC3C,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;;AAEzC,QAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE;;;IAI/E,MAAM,GAAA;QACJ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ;AAC5C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;AACnC,QAAA,MAAM,YAAY,GAAG,CAAC,SAAS,IAAI,QAAQ;QAE3C,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EACH,KAAK,EAAE;AACL,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,CAAC,cAAc,IAAI,CAAC,IAAI,CAAA,CAAE,GAAG,IAAI;AACjC,gBAAA,CAAC,cAAc,IAAI,CAAC,OAAO,CAAA,CAAE,GAAG,IAAI;AACrC,aAAA,EAAA,EAED,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,KAAK,EAAC,cAAc,EACpB,IAAI,EAAC,MAAM,EACX,IAAI,EAAC,KAAK,EAAA,YAAA,EACE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ,EAC7C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,SAAS,EAAA,EAE5E,SAAS,KACR,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,KAAK,EAAC,eAAe,EACrB,IAAI,EAAC,OAAO,EACZ,GAAG,EAAE,IAAI,CAAC,GAAG,EACb,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAChC,OAAO,EAAE,IAAI,CAAC,WAAW,GACzB,CACH,EACA,YAAY,KACX,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,KAAK,EAAC,kBAAkB,EAAC,IAAI,EAAC,UAAU,EAAA,aAAA,EAAa,MAAM,EAAA,EAC9D,QAAQ,CACJ,CACR,EACA,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAQ,CACpC,CACD;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-badge.entry.js","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"],"names":[],"mappings":";;AAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,oyFAAoyF,CAAC;;MCahzF,OAAO,GAAA,MAAA;;;;;IAEO,OAAO,GAAc,SAAS;;IAG9B,IAAI,GAAW,IAAI;;IAGnB,IAAI,GAAG,KAAK;;IAGZ,GAAG,GAAG,KAAK;;IAGX,OAAO,GAAG,KAAK;;IAGxC,MAAM,GAAA;QACJ,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EACH,KAAK,EAAE;AACL,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,CAAC,aAAa,IAAI,CAAC,OAAO,CAAA,CAAE,GAAG,IAAI;AACnC,gBAAA,CAAC,aAAa,IAAI,CAAC,IAAI,CAAA,CAAE,GAAG,IAAI;gBAChC,gBAAgB,EAAE,IAAI,CAAC,IAAI;gBAC3B,eAAe,EAAE,IAAI,CAAC,GAAG;gBACzB,mBAAmB,EAAE,IAAI,CAAC,OAAO;AAClC,aAAA,EAAA,EAED,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,KAAK,EAAC,aAAa,EAAC,IAAI,EAAC,MAAM,EAAA,EAClC,CAAC,IAAI,CAAC,GAAG,IAAI,8DAAQ,CACjB,CACF;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-banner.entry.js","sources":["src/components/banner/banner.css?tag=ts-banner&encapsulation=shadow","src/components/banner/banner.tsx"],"sourcesContent":["/* ==========================================================================\n ts-banner — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-banner-bg Background color\n --ts-banner-border-color Border color\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-banner-bg: var(--ts-color-info-bg);\n --ts-banner-border-color: var(--ts-color-info-border);\n}\n\n:host([sticky]) {\n position: sticky;\n inset-block-start: 0;\n z-index: var(--ts-z-sticky, 100);\n}\n\n.banner__base {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-3);\n padding-inline: var(--ts-spacing-4);\n padding-block: var(--ts-spacing-3);\n background-color: var(--ts-banner-bg);\n border-block-end: 1px solid var(--ts-banner-border-color);\n font-size: var(--ts-font-size-sm);\n line-height: var(--ts-line-height-normal);\n inline-size: 100%;\n}\n\n/* ---- Variants ---- */\n:host([variant=\"info\"]) {\n --ts-banner-bg: var(--ts-color-info-bg);\n --ts-banner-border-color: var(--ts-color-info-border);\n}\n:host([variant=\"info\"]) .banner__base {\n color: var(--ts-color-info-600);\n}\n\n:host([variant=\"success\"]) {\n --ts-banner-bg: var(--ts-color-success-bg);\n --ts-banner-border-color: var(--ts-color-success-border);\n}\n:host([variant=\"success\"]) .banner__base {\n color: var(--ts-color-success-600);\n}\n\n:host([variant=\"warning\"]) {\n --ts-banner-bg: var(--ts-color-warning-bg);\n --ts-banner-border-color: var(--ts-color-warning-border);\n}\n:host([variant=\"warning\"]) .banner__base {\n color: var(--ts-color-warning-600);\n}\n\n:host([variant=\"danger\"]) {\n --ts-banner-bg: var(--ts-color-danger-bg);\n --ts-banner-border-color: var(--ts-color-danger-border);\n}\n:host([variant=\"danger\"]) .banner__base {\n color: var(--ts-color-danger-600);\n}\n\n:host([variant=\"neutral\"]) {\n --ts-banner-bg: var(--ts-color-bg-subtle);\n --ts-banner-border-color: var(--ts-color-border-subtle);\n}\n:host([variant=\"neutral\"]) .banner__base {\n color: var(--ts-color-text-secondary);\n}\n\n/* ---- Icon ---- */\n.banner__icon {\n display: flex;\n align-items: center;\n font-size: 1.15em;\n flex-shrink: 0;\n}\n\n/* ---- Message ---- */\n.banner__message {\n flex: 1;\n min-inline-size: 0;\n}\n\n/* ---- Action ---- */\n.banner__action {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.banner__action:empty {\n display: none;\n}\n\n/* ---- Close Button ---- */\n.banner__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.banner__close:hover {\n opacity: 1;\n}\n\n.banner__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 message content.\n * @slot action - CTA button.\n *\n * @part base - The banner 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/dismiss button.\n */\n@Component({\n tag: 'ts-banner',\n styleUrl: 'banner.css',\n shadow: true,\n})\nexport class TsBanner {\n /** The banner's semantic variant. */\n @Prop({ reflect: true }) variant: TsVariant = 'info';\n\n /** Whether the banner can be dismissed. */\n @Prop({ reflect: true }) dismissible = false;\n\n /** Optional Lucide icon name. */\n @Prop() icon?: string;\n\n /** Whether the banner sticks to the top of the viewport. */\n @Prop({ reflect: true }) sticky = false;\n\n /** Whether the banner is currently visible. */\n @State() isVisible = true;\n\n /** Emitted when the banner is dismissed. */\n @Event({ eventName: 'tsClose' }) tsClose!: EventEmitter<void>;\n\n /** Programmatically close the banner. */\n @Method()\n async close(): Promise<void> {\n this.isVisible = false;\n this.tsClose.emit();\n }\n\n /** Programmatically show the banner. */\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: '\\u2139',\n success: '\\u2713',\n warning: '\\u26A0',\n danger: '\\u2715',\n primary: '\\u2139',\n secondary: '\\u2139',\n neutral: '\\u2139',\n };\n return <span 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 role = this.variant === 'danger' ? 'alert' : 'banner';\n const ariaLive = this.variant === 'danger' ? 'assertive' : 'polite';\n\n return (\n <Host\n class={{\n 'ts-banner': true,\n [`ts-banner--${this.variant}`]: true,\n 'ts-banner--sticky': this.sticky,\n }}\n role={role}\n aria-live={ariaLive}\n >\n <div class=\"banner__base\" part=\"base\">\n <div class=\"banner__icon\" part=\"icon\">\n {this.icon ? <ts-icon name={this.icon} /> : this.renderDefaultIcon()}\n </div>\n\n <div class=\"banner__message\" part=\"message\">\n <slot />\n </div>\n\n <div class=\"banner__action\" part=\"action\">\n <slot name=\"action\" />\n </div>\n\n {this.dismissible && (\n <button\n class=\"banner__close\"\n part=\"close\"\n type=\"button\"\n aria-label=\"Dismiss banner\"\n onClick={this.handleClose}\n >\n \\u2715\n </button>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,SAAS,GAAG,MAAM,CAAC,moEAAmoE,CAAC;;MCmBhpE,QAAQ,GAAA,MAAA;;;;;;IAEM,OAAO,GAAc,MAAM;;IAG3B,WAAW,GAAG,KAAK;;AAGpC,IAAA,IAAI;;IAGa,MAAM,GAAG,KAAK;;IAG9B,SAAS,GAAG,IAAI;;AAGQ,IAAA,OAAO;;AAIxC,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;;;AAKrB,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;IAGf,WAAW,GAAG,MAAW;QAC/B,IAAI,CAAC,KAAK,EAAE;AACd,KAAC;;IAGO,iBAAiB,GAAA;AACvB,QAAA,MAAM,KAAK,GAA2B;AACpC,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,OAAO,EAAE,QAAQ;SAClB;AACD,QAAA,OAAO,CAAA,CAAA,MAAA,EAAA,EAAA,aAAA,EAAkB,MAAM,EAAA,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAQ;;;IAI1E,MAAM,GAAA;QACJ,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;AAEhC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,QAAQ;AAC3D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,KAAK,QAAQ,GAAG,WAAW,GAAG,QAAQ;AAEnE,QAAA,QACE,CAAA,CAAC,IAAI,EAAA,EACH,KAAK,EAAE;AACL,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,CAAC,cAAc,IAAI,CAAC,OAAO,CAAA,CAAE,GAAG,IAAI;gBACpC,mBAAmB,EAAE,IAAI,CAAC,MAAM;AACjC,aAAA,EACD,IAAI,EAAE,IAAI,EAAA,WAAA,EACC,QAAQ,EAAA,EAEnB,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,cAAc,EAAC,IAAI,EAAC,MAAM,EAAA,EACnC,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,cAAc,EAAC,IAAI,EAAC,MAAM,EAAA,EAClC,IAAI,CAAC,IAAI,GAAG,CAAA,CAAA,SAAA,EAAA,EAAS,IAAI,EAAE,IAAI,CAAC,IAAI,EAAA,CAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAChE,EAEN,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,iBAAiB,EAAC,IAAI,EAAC,SAAS,EAAA,EACzC,CAAA,CAAA,MAAA,EAAA,IAAA,CAAQ,CACJ,EAEN,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,gBAAgB,EAAC,IAAI,EAAC,QAAQ,EAAA,EACvC,CAAA,CAAA,MAAA,EAAA,EAAM,IAAI,EAAC,QAAQ,EAAA,CAAG,CAClB,EAEL,IAAI,CAAC,WAAW,KACf,CAAA,CAAA,QAAA,EAAA,EACE,KAAK,EAAC,eAAe,EACrB,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,QAAQ,EAAA,YAAA,EACF,gBAAgB,EAC3B,OAAO,EAAE,IAAI,CAAC,WAAW,EAAA,EAAA,SAAA,CAGlB,CACV,CACG,CACD;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-breadcrumb-item.entry.js","sources":["src/components/breadcrumb/breadcrumb-item.css?tag=ts-breadcrumb-item&encapsulation=shadow","src/components/breadcrumb/breadcrumb-item.tsx"],"sourcesContent":["/* ==========================================================================\n ts-breadcrumb-item — Shadow DOM Scoped Styles\n ========================================================================== */\n\n:host {\n display: contents;\n}\n\n.breadcrumb-item__li {\n display: inline-flex;\n align-items: center;\n gap: var(--ts-spacing-1);\n}\n\n.breadcrumb-item__link {\n color: var(--ts-breadcrumb-link-color, var(--ts-color-interactive-primary));\n text-decoration: none;\n transition: color var(--ts-transition-fast);\n}\n\n.breadcrumb-item__link:hover {\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n.breadcrumb-item__link:focus-visible {\n box-shadow: var(--ts-focus-ring);\n border-radius: var(--ts-radius-sm);\n outline: none;\n}\n\n.breadcrumb-item__text {\n color: var(--ts-color-text-primary);\n}\n\n:host(.ts-breadcrumb-item--current) .breadcrumb-item__text {\n font-weight: var(--ts-font-weight-semi);\n}\n\n.breadcrumb-item__separator {\n color: var(--ts-breadcrumb-separator-color, var(--ts-color-text-tertiary));\n margin-inline: var(--ts-spacing-1);\n user-select: none;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for label text.\n *\n * @part link - The anchor or span element.\n * @part separator - The separator element.\n */\n@Component({\n tag: 'ts-breadcrumb-item',\n styleUrl: 'breadcrumb-item.css',\n shadow: true,\n})\nexport class TsBreadcrumbItem {\n /** If set, renders as a link. */\n @Prop() href?: string;\n\n /** Marks this item as the current page. */\n @Prop({ reflect: true }) current = false;\n\n /** Separator character (set by parent ts-breadcrumb). */\n @Prop() separator?: string;\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const isLink = !!this.href && !this.current;\n\n return (\n <Host class={{ 'ts-breadcrumb-item': true, 'ts-breadcrumb-item--current': this.current }}>\n <li class=\"breadcrumb-item__li\">\n {isLink ? (\n <a href={this.href} part=\"link\" class=\"breadcrumb-item__link\">\n <slot />\n </a>\n ) : (\n <span\n part=\"link\"\n class=\"breadcrumb-item__text\"\n aria-current={this.current ? 'page' : undefined}\n >\n <slot />\n </span>\n )}\n {this.separator && (\n <span class=\"breadcrumb-item__separator\" part=\"separator\" aria-hidden=\"true\">\n {this.separator}\n </span>\n )}\n </li>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,uwBAAuwB,CAAC;;MCa5xB,gBAAgB,GAAA,MAAA;;;;;AAEnB,IAAA,IAAI;;IAGa,OAAO,GAAG,KAAK;;AAGhC,IAAA,SAAS;;IAGjB,MAAM,GAAA;AACJ,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;AAE3C,QAAA,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAC,KAAK,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,CAAC,OAAO,EAAE,EAAA,EACtF,CAAA,CAAA,IAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAI,KAAK,EAAC,qBAAqB,EAAA,EAC5B,MAAM,IACL,CAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,uBAAuB,EAAA,EAC3D,CAAA,CAAA,MAAA,EAAA,IAAA,CAAQ,CACN,KAEJ,CAAA,CAAA,MAAA,EAAA,EACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAC,uBAAuB,EAAA,cAAA,EACf,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,SAAS,EAAA,EAE/C,CAAA,CAAA,MAAA,EAAA,IAAA,CAAQ,CACH,CACR,EACA,IAAI,CAAC,SAAS,KACb,6DAAM,KAAK,EAAC,4BAA4B,EAAC,IAAI,EAAC,WAAW,EAAA,aAAA,EAAa,MAAM,EAAA,EACzE,IAAI,CAAC,SAAS,CACV,CACR,CACE,CACA;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-breadcrumb.entry.js","sources":["src/components/breadcrumb/breadcrumb.css?tag=ts-breadcrumb&encapsulation=shadow","src/components/breadcrumb/breadcrumb.tsx"],"sourcesContent":["/* ==========================================================================\n ts-breadcrumb — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-breadcrumb-separator-color Separator color\n --ts-breadcrumb-link-color Link color\n ========================================================================== */\n\n:host {\n display: block;\n\n --ts-breadcrumb-separator-color: var(--ts-color-text-tertiary);\n --ts-breadcrumb-link-color: var(--ts-color-interactive-primary);\n}\n\n.breadcrumb__list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--ts-spacing-1);\n list-style: none;\n margin: 0;\n padding: 0;\n font-family: var(--ts-font-family-base);\n font-size: var(--ts-font-size-sm);\n}\n","import { Component, Prop, h, Host, Element } from '@stencil/core';\n\n/**\n * @slot - Default slot for ts-breadcrumb-item children.\n *\n * @part nav - The nav element.\n * @part list - The ordered list element.\n */\n@Component({\n tag: 'ts-breadcrumb',\n styleUrl: 'breadcrumb.css',\n shadow: true,\n})\nexport class TsBreadcrumb {\n @Element() hostEl!: HTMLElement;\n\n /** The separator character between breadcrumb items. */\n @Prop() separator = '/';\n\n componentDidRender(): void {\n const items = this.hostEl.querySelectorAll('ts-breadcrumb-item');\n items.forEach((item, index) => {\n if (index < items.length - 1) {\n item.setAttribute('separator', this.separator);\n } else {\n item.removeAttribute('separator');\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host class=\"ts-breadcrumb\">\n <nav part=\"nav\" aria-label=\"Breadcrumb\">\n <ol part=\"list\" class=\"breadcrumb__list\">\n <slot />\n </ol>\n </nav>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,aAAa,GAAG,MAAM,CAAC,qVAAqV,CAAC;;MCatW,YAAY,GAAA,MAAA;;;;;;IAIf,SAAS,GAAG,GAAG;IAEvB,kBAAkB,GAAA;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC;QAChE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;YAC5B,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC5B,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;;iBACzC;AACL,gBAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;;AAErC,SAAC,CAAC;;;IAIJ,MAAM,GAAA;AACJ,QAAA,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAC,KAAK,EAAC,eAAe,EAAA,EACzB,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,IAAI,EAAC,KAAK,EAAA,YAAA,EAAY,YAAY,EAAA,EACrC,CAAA,CAAA,IAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAI,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,kBAAkB,EAAA,EACtC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAQ,CACL,CACD,CACD;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-button.entry.js","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"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-card.entry.js","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"],"names":[],"mappings":";;AAAA,MAAM,OAAO,GAAG,MAAM,CAAC,69DAA69D,CAAC;;MCmBx+D,MAAM,GAAA,MAAA;;;;;IAEQ,SAAS,GAAuC,IAAI;;IAGpD,WAAW,GAAG,KAAK;;IAGnB,QAAQ,GAAG,KAAK;;IAGhB,OAAO,GAAgC,IAAI;;IAGpE,MAAM,GAAA;QACJ,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EACH,KAAK,EAAE;AACL,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAA,CAAE,GAAG,IAAI;AAC9C,gBAAA,CAAC,oBAAoB,IAAI,CAAC,OAAO,CAAA,CAAE,GAAG,IAAI;gBAC1C,sBAAsB,EAAE,IAAI,CAAC,WAAW;gBACxC,mBAAmB,EAAE,IAAI,CAAC,QAAQ;AACnC,aAAA,EACD,IAAI,EAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,GAAG,SAAS,EAC7C,QAAQ,EAAE,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,SAAS,EAAA,EAE5C,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,YAAY,EAAC,IAAI,EAAC,MAAM,EAAA,EACjC,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,aAAa,EAAC,IAAI,EAAC,OAAO,EAAA,EACnC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,OAAO,EAAA,CAAG,CACjB,EAEN,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,cAAc,EAAC,IAAI,EAAC,QAAQ,EAAA,EACrC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,QAAQ,EAAA,CAAG,CAClB,EAEN,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,YAAY,EAAC,IAAI,EAAC,MAAM,EAAA,EACjC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAQ,CACJ,EAEN,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,cAAc,EAAC,IAAI,EAAC,QAAQ,EAAA,EACrC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,QAAQ,EAAA,CAAG,CAClB,CACF,CACD;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-checkbox.entry.js","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"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-chip.entry.js","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"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-container.entry.js","sources":["src/components/container/container.css?tag=ts-container&encapsulation=shadow","src/components/container/container.tsx"],"sourcesContent":["/* ==========================================================================\n ts-container — Shadow DOM Scoped Styles\n\n Centered max-width container with responsive padding.\n\n Component tokens (Tier 3):\n --ts-container-padding Horizontal padding\n ========================================================================== */\n\n:host {\n display: block;\n margin-inline: auto;\n width: 100%;\n box-sizing: border-box;\n\n --ts-container-padding: var(--ts-grid-margin);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) {\n max-width: 640px;\n}\n\n:host([size=\"md\"]) {\n max-width: 768px;\n}\n\n:host([size=\"lg\"]) {\n max-width: 1024px;\n}\n\n:host([size=\"xl\"]) {\n max-width: 1280px;\n}\n\n:host([size=\"full\"]) {\n max-width: 100%;\n}\n\n/* ---- Padding ---- */\n:host(:not(.ts-container--no-padding)) {\n padding-inline: var(--ts-container-padding);\n}\n\n:host(.ts-container--no-padding) {\n padding-inline: 0;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for container content.\n *\n * @part base - The container element.\n */\n@Component({\n tag: 'ts-container',\n styleUrl: 'container.css',\n shadow: true,\n})\nexport class TsContainer {\n /** The maximum width of the container. */\n @Prop({ reflect: true }) size: 'sm' | 'md' | 'lg' | 'xl' | 'full' = 'lg';\n\n /** Whether to apply horizontal padding. */\n @Prop({ reflect: true }) padding: boolean = true;\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-container': true,\n 'ts-container--no-padding': !this.padding,\n }}\n >\n <slot />\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,YAAY,GAAG,MAAM,CAAC,2aAA2a,CAAC;;MCY3b,WAAW,GAAA,MAAA;;;;;IAEG,IAAI,GAAuC,IAAI;;IAG/C,OAAO,GAAY,IAAI;;IAGhD,MAAM,GAAA;QACJ,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EACH,KAAK,EAAE;AACL,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,0BAA0B,EAAE,CAAC,IAAI,CAAC,OAAO;AAC1C,aAAA,EAAA,EAED,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAQ,CACH;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-date-picker.entry.js","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"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-dialog.entry.js","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"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-divider.entry.js","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"],"names":[],"mappings":";;AAAA,MAAM,UAAU,GAAG,MAAM,CAAC,6qDAA6qD,CAAC;;MCW3rD,SAAS,GAAA,MAAA;;;;;IAEK,WAAW,GAA8B,YAAY;;IAGrD,OAAO,GAAkC,OAAO;;AAGjE,IAAA,KAAK;;IAGb,MAAM,GAAA;AACJ,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK;QAE7B,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EACH,KAAK,EAAE;AACL,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,CAAC,eAAe,IAAI,CAAC,WAAW,CAAA,CAAE,GAAG,IAAI;AACzC,gBAAA,CAAC,eAAe,IAAI,CAAC,OAAO,CAAA,CAAE,GAAG,IAAI;AACrC,gBAAA,uBAAuB,EAAE,QAAQ;aAClC,EACD,IAAI,EAAC,WAAW,EAAA,kBAAA,EACE,IAAI,CAAC,WAAW,EAAA,EAEjC,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,IAC5C,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,eAAe,EAAC,IAAI,EAAC,MAAM,EAAA,EACpC,CAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAC,oCAAoC,EAAA,CAAG,EACnD,CAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAC,gBAAgB,EAAC,IAAI,EAAC,OAAO,EAAA,EAAE,IAAI,CAAC,KAAK,CAAQ,EAC7D,CAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAC,kCAAkC,EAAA,CAAG,CAC7C,KAEN,WAAK,KAAK,EAAC,eAAe,EAAC,IAAI,EAAC,MAAM,EAAA,EACpC,CAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAC,eAAe,EAAA,CAAG,CAC1B,CACP,CACI;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-drawer.entry.js","sources":["src/components/drawer/drawer.css?tag=ts-drawer&encapsulation=shadow","src/components/drawer/drawer.tsx"],"sourcesContent":["/* ==========================================================================\n ts-drawer — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-drawer-bg Panel background\n --ts-drawer-shadow Panel box-shadow\n --ts-drawer-overlay-bg Overlay background\n ========================================================================== */\n\n:host {\n font-family: var(--ts-font-family-base);\n\n --ts-drawer-bg: var(--ts-color-bg-elevated);\n --ts-drawer-shadow: var(--ts-shadow-xl);\n --ts-drawer-overlay-bg: var(--ts-color-bg-overlay);\n}\n\n/* ---- Overlay ---- */\n.drawer__overlay {\n position: fixed;\n inset: 0;\n z-index: var(--ts-z-modal);\n background-color: var(--ts-drawer-overlay-bg);\n animation: ts-drawer-fade-in 200ms ease-out;\n}\n\n/* ---- Panel ---- */\n.drawer__panel {\n position: fixed;\n display: flex;\n flex-direction: column;\n background-color: var(--ts-drawer-bg);\n box-shadow: var(--ts-drawer-shadow);\n outline: none;\n overflow-y: auto;\n}\n\n/* ---- Placement ---- */\n.drawer__panel--start {\n inset-block-start: 0;\n inset-block-end: 0;\n inset-inline-start: 0;\n animation: ts-drawer-slide-start 250ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.drawer__panel--end {\n inset-block-start: 0;\n inset-block-end: 0;\n inset-inline-end: 0;\n animation: ts-drawer-slide-end 250ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.drawer__panel--top {\n inset-block-start: 0;\n inset-inline-start: 0;\n inset-inline-end: 0;\n animation: ts-drawer-slide-top 250ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.drawer__panel--bottom {\n inset-block-end: 0;\n inset-inline-start: 0;\n inset-inline-end: 0;\n animation: ts-drawer-slide-bottom 250ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* ---- Sizes — horizontal placement (start/end) ---- */\n.drawer__panel--start.drawer__panel--sm,\n.drawer__panel--end.drawer__panel--sm {\n inline-size: 320px;\n}\n\n.drawer__panel--start.drawer__panel--md,\n.drawer__panel--end.drawer__panel--md {\n inline-size: 440px;\n}\n\n.drawer__panel--start.drawer__panel--lg,\n.drawer__panel--end.drawer__panel--lg {\n inline-size: 640px;\n}\n\n.drawer__panel--start.drawer__panel--full,\n.drawer__panel--end.drawer__panel--full {\n inline-size: 100%;\n}\n\n/* ---- Sizes — vertical placement (top/bottom) ---- */\n.drawer__panel--top.drawer__panel--sm,\n.drawer__panel--bottom.drawer__panel--sm {\n block-size: 320px;\n}\n\n.drawer__panel--top.drawer__panel--md,\n.drawer__panel--bottom.drawer__panel--md {\n block-size: 440px;\n}\n\n.drawer__panel--top.drawer__panel--lg,\n.drawer__panel--bottom.drawer__panel--lg {\n block-size: 640px;\n}\n\n.drawer__panel--top.drawer__panel--full,\n.drawer__panel--bottom.drawer__panel--full {\n block-size: 100%;\n}\n\n/* ---- Header ---- */\n.drawer__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--ts-spacing-4) var(--ts-spacing-5);\n border-block-end: 1px solid var(--ts-color-border-default);\n}\n\n.drawer__title {\n font-size: var(--ts-font-size-lg);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-primary);\n}\n\n/* ---- Close Button ---- */\n.drawer__close {\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 padding: 0;\n line-height: 1;\n margin-inline-start: auto;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n}\n\n.drawer__close:hover {\n background-color: var(--ts-color-bg-hover);\n color: var(--ts-color-text-secondary);\n}\n\n.drawer__close:focus-visible {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Body ---- */\n.drawer__body {\n flex: 1;\n padding: var(--ts-spacing-4) var(--ts-spacing-5);\n font-size: var(--ts-font-size-md);\n color: var(--ts-color-text-secondary);\n line-height: var(--ts-line-height-normal);\n overflow-y: auto;\n}\n\n/* ---- Footer ---- */\n.drawer__footer {\n padding: var(--ts-spacing-4) var(--ts-spacing-5);\n border-block-start: 1px solid var(--ts-color-border-default);\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--ts-spacing-2);\n}\n\n.drawer__footer:empty {\n display: none;\n}\n\n/* ---- Animations ---- */\n@keyframes ts-drawer-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes ts-drawer-slide-start {\n from { transform: translateX(-100%); }\n to { transform: translateX(0); }\n}\n\n@keyframes ts-drawer-slide-end {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n@keyframes ts-drawer-slide-top {\n from { transform: translateY(-100%); }\n to { transform: translateY(0); }\n}\n\n@keyframes ts-drawer-slide-bottom {\n from { transform: translateY(100%); }\n to { transform: translateY(0); }\n}\n","import { Component, Prop, State, Event, h, Host, Element, Method, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport { generateId, trapFocus } from '../../utils/aria';\n\n/**\n * @slot - Default slot for drawer body content.\n * @slot footer - Drawer footer content (e.g., action buttons).\n *\n * @part overlay - The backdrop overlay.\n * @part panel - The slide-in panel container.\n * @part header - The header wrapper.\n * @part body - The body wrapper.\n * @part footer - The footer wrapper.\n * @part close - The close button.\n */\n@Component({\n tag: 'ts-drawer',\n styleUrl: 'drawer.css',\n shadow: true,\n})\nexport class TsDrawer {\n @Element() hostEl!: HTMLElement;\n\n private panelEl?: HTMLElement;\n private removeFocusTrap?: () => void;\n private previouslyFocused?: HTMLElement;\n private drawerId = generateId('ts-drawer');\n\n /** Whether the drawer is open. */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n /** Which edge the drawer slides in from. */\n @Prop({ reflect: true }) placement: 'start' | 'end' | 'top' | 'bottom' = 'end';\n\n /** The drawer's width/height preset. */\n @Prop({ reflect: true }) size: 'sm' | 'md' | 'lg' | 'full' = 'md';\n\n /** Whether clicking the overlay or pressing Escape closes the drawer. */\n @Prop() dismissible = true;\n\n /** Accessible heading for the drawer. */\n @Prop() heading?: string;\n\n /** Emitted when the drawer closes. */\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.openDrawer();\n } else {\n this.closeDrawer();\n }\n }\n\n /** Programmatically open the drawer. */\n @Method()\n async show(): Promise<void> {\n this.open = true;\n }\n\n /** Programmatically close the drawer. */\n @Method()\n async close(): Promise<void> {\n this.open = false;\n }\n\n private openDrawer(): 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.panelEl) {\n this.removeFocusTrap = trapFocus(this.panelEl);\n this.panelEl.focus();\n }\n });\n }\n\n private closeDrawer(): void {\n this.isAnimating = false;\n this.tsClose.emit();\n\n document.body.style.overflow = '';\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 handlePanelClick = (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 return (\n <Host\n class={{\n 'ts-drawer': true,\n 'ts-drawer--open': this.open,\n [`ts-drawer--${this.placement}`]: true,\n [`ts-drawer--${this.size}`]: true,\n }}\n onKeyDown={this.handleKeydown}\n >\n <div class=\"drawer__overlay\" part=\"overlay\" onClick={this.handleOverlayClick}>\n <div\n ref={(el) => (this.panelEl = el)}\n class={{\n 'drawer__panel': true,\n [`drawer__panel--${this.placement}`]: true,\n [`drawer__panel--${this.size}`]: true,\n }}\n part=\"panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={this.heading}\n aria-labelledby={!this.heading ? `${this.drawerId}-header` : undefined}\n tabindex={-1}\n onClick={this.handlePanelClick}\n >\n <div class=\"drawer__header\" part=\"header\" id={`${this.drawerId}-header`}>\n {this.heading && <span class=\"drawer__title\">{this.heading}</span>}\n {this.dismissible && (\n <button\n class=\"drawer__close\"\n part=\"close\"\n type=\"button\"\n aria-label=\"Close drawer\"\n onClick={this.handleCloseClick}\n >\n ✕\n </button>\n )}\n </div>\n\n <div class=\"drawer__body\" part=\"body\">\n <slot />\n </div>\n\n <div class=\"drawer__footer\" part=\"footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-empty-state.entry.js","sources":["src/components/empty-state/empty-state.css?tag=ts-empty-state&encapsulation=shadow","src/components/empty-state/empty-state.tsx"],"sourcesContent":["/* ==========================================================================\n ts-empty-state — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-empty-state-icon-size Icon size\n --ts-empty-state-icon-color Icon color\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-empty-state-icon-size: 3rem;\n --ts-empty-state-icon-color: var(--ts-color-text-tertiary);\n}\n\n.empty-state__base {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding-inline: var(--ts-spacing-6);\n padding-block: var(--ts-spacing-8);\n gap: var(--ts-spacing-3);\n}\n\n/* ---- Icon ---- */\n.empty-state__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--ts-empty-state-icon-color);\n font-size: var(--ts-empty-state-icon-size);\n margin-block-end: var(--ts-spacing-2);\n}\n\n.empty-state__icon:empty {\n display: none;\n}\n\n/* ---- Heading ---- */\n.empty-state__heading {\n margin: 0;\n font-size: var(--ts-font-size-lg);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-primary);\n line-height: var(--ts-line-height-tight);\n}\n\n/* ---- Description ---- */\n.empty-state__description {\n margin: 0;\n font-size: var(--ts-font-size-sm);\n color: var(--ts-color-text-secondary);\n line-height: var(--ts-line-height-normal);\n max-inline-size: 36ch;\n}\n\n/* ---- Content ---- */\n.empty-state__content:empty {\n display: none;\n}\n\n/* ---- Action ---- */\n.empty-state__action {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-2);\n margin-block-start: var(--ts-spacing-2);\n}\n\n.empty-state__action:empty {\n display: none;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .empty-state__base {\n padding-inline: var(--ts-spacing-4);\n padding-block: var(--ts-spacing-4);\n gap: var(--ts-spacing-2);\n}\n\n:host([size=\"sm\"]) .empty-state__icon {\n --ts-empty-state-icon-size: 2rem;\n}\n\n:host([size=\"sm\"]) .empty-state__heading {\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"sm\"]) .empty-state__description {\n font-size: var(--ts-font-size-xs);\n}\n\n:host([size=\"lg\"]) .empty-state__base {\n padding-inline: var(--ts-spacing-8);\n padding-block: var(--ts-spacing-12);\n gap: var(--ts-spacing-4);\n}\n\n:host([size=\"lg\"]) .empty-state__icon {\n --ts-empty-state-icon-size: 4.5rem;\n}\n\n:host([size=\"lg\"]) .empty-state__heading {\n font-size: var(--ts-font-size-xl);\n}\n\n:host([size=\"lg\"]) .empty-state__description {\n font-size: var(--ts-font-size-md);\n max-inline-size: 48ch;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\nimport type { TsSize } from '../../types';\n\n/**\n * @slot - Custom content below the description.\n * @slot action - CTA buttons.\n * @slot icon - Custom icon or illustration.\n *\n * @part base - The empty state container.\n * @part icon - The icon wrapper.\n * @part heading - The heading element.\n * @part description - The description text.\n * @part content - The custom content wrapper.\n * @part action - The action slot wrapper.\n */\n@Component({\n tag: 'ts-empty-state',\n styleUrl: 'empty-state.css',\n shadow: true,\n})\nexport class TsEmptyState {\n /** The heading text. */\n @Prop() heading?: string;\n\n /** The description text. */\n @Prop() description?: string;\n\n /** Lucide icon name displayed large. */\n @Prop() icon?: string;\n\n /** The size of the empty state. */\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-empty-state': true,\n [`ts-empty-state--${this.size}`]: true,\n }}\n >\n <div class=\"empty-state__base\" part=\"base\">\n <div class=\"empty-state__icon\" part=\"icon\">\n <slot name=\"icon\">\n {this.icon && <ts-icon name={this.icon} />}\n </slot>\n </div>\n\n {this.heading && (\n <h3 class=\"empty-state__heading\" part=\"heading\">\n {this.heading}\n </h3>\n )}\n\n {this.description && (\n <p class=\"empty-state__description\" part=\"description\">\n {this.description}\n </p>\n )}\n\n <div class=\"empty-state__content\" part=\"content\">\n <slot />\n </div>\n\n <div class=\"empty-state__action\" part=\"action\">\n <slot name=\"action\" />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,aAAa,GAAG,MAAM,CAAC,2yDAA2yD,CAAC;;MCoB5zD,YAAY,GAAA,MAAA;;;;;AAEf,IAAA,OAAO;;AAGP,IAAA,WAAW;;AAGX,IAAA,IAAI;;IAGa,IAAI,GAAW,IAAI;;IAG5C,MAAM,GAAA;QACJ,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EACH,KAAK,EAAE;AACL,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAA,CAAE,GAAG,IAAI;aACvC,EAAA,EAED,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,mBAAmB,EAAC,IAAI,EAAC,MAAM,EAAA,EACxC,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,mBAAmB,EAAC,IAAI,EAAC,MAAM,EAAA,EACxC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,MAAM,EAAA,EACd,IAAI,CAAC,IAAI,IAAI,CAAA,CAAA,SAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAS,IAAI,EAAE,IAAI,CAAC,IAAI,EAAA,CAAI,CACrC,CACH,EAEL,IAAI,CAAC,OAAO,KACX,CAAA,CAAA,IAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAI,KAAK,EAAC,sBAAsB,EAAC,IAAI,EAAC,SAAS,EAAA,EAC5C,IAAI,CAAC,OAAO,CACV,CACN,EAEA,IAAI,CAAC,WAAW,KACf,CAAA,CAAA,GAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAG,KAAK,EAAC,0BAA0B,EAAC,IAAI,EAAC,aAAa,EAAA,EACnD,IAAI,CAAC,WAAW,CACf,CACL,EAED,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,sBAAsB,EAAC,IAAI,EAAC,SAAS,EAAA,EAC9C,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAQ,CACJ,EAEN,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,qBAAqB,EAAC,IAAI,EAAC,QAAQ,EAAA,EAC5C,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,QAAQ,EAAA,CAAG,CAClB,CACF,CACD;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-file-upload.entry.js","sources":["src/components/file-upload/file-upload.css?tag=ts-file-upload&encapsulation=shadow","src/components/file-upload/file-upload.tsx"],"sourcesContent":["/* ==========================================================================\n ts-file-upload — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-file-upload-border-color Dropzone border color\n --ts-file-upload-bg Dropzone background\n --ts-file-upload-radius Dropzone border radius\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-file-upload-border-color: var(--ts-color-border-default);\n --ts-file-upload-bg: var(--ts-color-bg-surface);\n --ts-file-upload-radius: var(--ts-radius-md);\n}\n\n/* ---- Dropzone ---- */\n.file-upload__dropzone {\n display: flex;\n align-items: center;\n justify-content: center;\n min-block-size: 120px;\n padding: var(--ts-spacing-6);\n border: 2px dashed var(--ts-file-upload-border-color);\n border-radius: var(--ts-file-upload-radius);\n background-color: var(--ts-file-upload-bg);\n cursor: pointer;\n outline: none;\n transition:\n border-color var(--ts-transition-fast),\n background-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n}\n\n.file-upload__dropzone:hover:not([aria-disabled=\"true\"]) {\n border-color: var(--ts-color-interactive-primary);\n background-color: var(--ts-color-interactive-primary-subtle, rgba(59, 130, 246, 0.05));\n}\n\n.file-upload__dropzone:focus-visible {\n box-shadow: var(--ts-focus-ring);\n border-color: var(--ts-color-interactive-primary);\n}\n\n/* ---- Drag over state ---- */\n.file-upload__dropzone--drag-over {\n border-color: var(--ts-color-interactive-primary);\n background-color: var(--ts-color-interactive-primary-subtle, rgba(59, 130, 246, 0.1));\n border-style: solid;\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) .file-upload__dropzone {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Label ---- */\n.file-upload__label {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ts-spacing-2);\n font-size: var(--ts-font-size-sm);\n color: var(--ts-color-text-secondary);\n text-align: center;\n pointer-events: none;\n}\n\n/* ---- Hidden file input ---- */\n.file-upload__input {\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 white-space: nowrap;\n border: 0;\n}\n","import { Component, Prop, State, Event, h, Host, Element } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\n/**\n * @slot - Default slot for custom dropzone content.\n *\n * @part dropzone - The dropzone area.\n * @part label - The label text.\n * @part input - The hidden file input.\n */\n@Component({\n tag: 'ts-file-upload',\n styleUrl: 'file-upload.css',\n shadow: true,\n})\nexport class TsFileUpload {\n @Element() hostEl!: HTMLElement;\n\n private fileInputEl?: HTMLInputElement;\n\n /** Accepted file types (e.g. '.jpg,.png'). */\n @Prop() accept?: string;\n\n /** Whether multiple files can be selected. */\n @Prop() multiple = false;\n\n /** Maximum file size in bytes. */\n @Prop() maxSize?: number;\n\n /** Whether the file upload is disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Label text for the dropzone. */\n @Prop() label = 'Drop files here or click to upload';\n\n /** Form field name. */\n @Prop() name?: string;\n\n /** Emitted when files are selected or dropped. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<{ files: File[] }>;\n\n /** Whether a drag operation is over the dropzone. */\n @State() isDragOver = false;\n\n private handleClick = (): void => {\n if (this.disabled) return;\n this.fileInputEl?.click();\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.fileInputEl?.click();\n }\n };\n\n private handleFileChange = (event: Event): void => {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n const files = this.validateFiles(Array.from(input.files));\n if (files.length > 0) {\n this.tsChange.emit({ files });\n }\n }\n // Reset input so the same file can be selected again\n if (this.fileInputEl) {\n this.fileInputEl.value = '';\n }\n };\n\n private handleDragOver = (event: DragEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n if (!this.disabled) {\n this.isDragOver = true;\n }\n };\n\n private handleDragLeave = (event: DragEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver = false;\n };\n\n private handleDrop = (event: DragEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver = false;\n\n if (this.disabled) return;\n\n const droppedFiles = event.dataTransfer?.files;\n if (droppedFiles) {\n const files = this.validateFiles(Array.from(droppedFiles));\n if (files.length > 0) {\n this.tsChange.emit({ files });\n }\n }\n };\n\n private validateFiles(files: File[]): File[] {\n let validFiles = files;\n\n // Filter by accepted types\n if (this.accept) {\n const acceptedTypes = this.accept.split(',').map((t) => t.trim().toLowerCase());\n validFiles = validFiles.filter((file) => {\n const ext = '.' + file.name.split('.').pop()?.toLowerCase();\n const mime = file.type.toLowerCase();\n return acceptedTypes.some(\n (accepted) =>\n accepted === ext ||\n accepted === mime ||\n (accepted.endsWith('/*') && mime.startsWith(accepted.replace('/*', '/'))),\n );\n });\n }\n\n // Filter by max size\n if (this.maxSize) {\n validFiles = validFiles.filter((file) => file.size <= this.maxSize!);\n }\n\n // If not multiple, take only the first\n if (!this.multiple && validFiles.length > 1) {\n validFiles = [validFiles[0]];\n }\n\n return validFiles;\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-file-upload': true,\n 'ts-file-upload--drag-over': this.isDragOver,\n 'ts-file-upload--disabled': this.disabled,\n }}\n >\n <div\n class={{\n 'file-upload__dropzone': true,\n 'file-upload__dropzone--drag-over': this.isDragOver,\n }}\n part=\"dropzone\"\n role=\"button\"\n tabindex={this.disabled ? -1 : 0}\n aria-disabled={this.disabled ? 'true' : undefined}\n aria-label={this.label}\n onClick={this.handleClick}\n onKeyDown={this.handleKeydown}\n onDragOver={this.handleDragOver}\n onDragLeave={this.handleDragLeave}\n onDrop={this.handleDrop}\n >\n <span class=\"file-upload__label\" part=\"label\">\n <slot>{this.label}</slot>\n </span>\n\n <input\n ref={(el) => (this.fileInputEl = el)}\n class=\"file-upload__input\"\n part=\"input\"\n type=\"file\"\n name={this.name}\n accept={this.accept}\n multiple={this.multiple}\n disabled={this.disabled}\n tabindex={-1}\n aria-hidden=\"true\"\n onChange={this.handleFileChange}\n />\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-grid.entry.js","sources":["src/components/grid/grid.css?tag=ts-grid&encapsulation=shadow","src/components/grid/grid.tsx"],"sourcesContent":["/* ==========================================================================\n ts-grid — Shadow DOM Scoped Styles\n\n CSS Grid layout component with responsive auto-fill columns.\n ========================================================================== */\n\n:host {\n display: grid;\n width: 100%;\n box-sizing: border-box;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for grid items.\n *\n * @part base - The grid container.\n */\n@Component({\n tag: 'ts-grid',\n styleUrl: 'grid.css',\n shadow: true,\n})\nexport class TsGrid {\n /** Number of columns or 'auto' for responsive auto-fill. */\n @Prop({ reflect: true }) columns: string = 'auto';\n\n /** Spacing token number for gap between items. */\n @Prop({ reflect: true }) gap: string = '4';\n\n /** Minimum column width when columns is 'auto'. */\n @Prop({ reflect: true }) minColumnWidth: string = '280px';\n\n /** Vertical alignment of grid items. */\n @Prop({ reflect: true }) align: 'start' | 'center' | 'end' | 'stretch' = 'stretch';\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const gridTemplateColumns =\n this.columns === 'auto'\n ? `repeat(auto-fill, minmax(${this.minColumnWidth}, 1fr))`\n : `repeat(${this.columns}, 1fr)`;\n\n const style = {\n gridTemplateColumns,\n gap: `var(--ts-spacing-${this.gap})`,\n alignItems: this.align,\n };\n\n return (\n <Host style={style}>\n <slot />\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,OAAO,GAAG,MAAM,CAAC,oDAAoD,CAAC;;MCY/D,MAAM,GAAA,MAAA;;;;;IAEQ,OAAO,GAAW,MAAM;;IAGxB,GAAG,GAAW,GAAG;;IAGjB,cAAc,GAAW,OAAO;;IAGhC,KAAK,GAA2C,SAAS;;IAGlF,MAAM,GAAA;AACJ,QAAA,MAAM,mBAAmB,GACvB,IAAI,CAAC,OAAO,KAAK;AACf,cAAE,CAAA,yBAAA,EAA4B,IAAI,CAAC,cAAc,CAAA,OAAA;AACjD,cAAE,CAAA,OAAA,EAAU,IAAI,CAAC,OAAO,QAAQ;AAEpC,QAAA,MAAM,KAAK,GAAG;YACZ,mBAAmB;AACnB,YAAA,GAAG,EAAE,CAAA,iBAAA,EAAoB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAG;YACpC,UAAU,EAAE,IAAI,CAAC,KAAK;SACvB;QAED,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAC,KAAK,EAAE,KAAK,EAAA,EAChB,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAQ,CACH;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-icon-Jz9ioZag.js","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"],"names":[],"mappings":";;AAAA;;;;;;AAMG;AAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB;AAE1C;;;AAGG;AACG,SAAU,aAAa,CAAC,KAA6B,EAAA;AACzD,IAAA,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC/C,QAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;;AAE3B;AAEA;;;;AAIG;AACG,SAAU,YAAY,CAAC,IAAY,EAAE,GAAW,EAAA;AACpD,IAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;AACzB;AAEA;;;AAGG;AACG,SAAU,OAAO,CAAC,IAAY,EAAA;AAClC,IAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B;AAEA;;AAEG;SACa,sBAAsB,GAAA;IACpC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACpC;;AC1CA,MAAM,OAAO,GAAG,MAAM,CAAC,klBAAklB,CAAC;;ACM1mB;AACA,IAAI,WAAW,GAAsC,IAAI;AAEzD;;;AAGG;AACH,SAAS,WAAW,CAAC,IAAY,EAAA;AAC/B,IAAA,OAAO;SACJ,KAAK,CAAC,GAAG;SACT,GAAG,CAAC,CAAC,IAAY,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;SAClE,IAAI,CAAC,EAAE,CAAC;AACb;AAEA;;AAEG;AACH,SAAS,eAAe,CAAC,KAAiB,EAAA;IACxC,MAAM,QAAQ,GAAG;SACd,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAmC,KAAI;AACtD,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK;AACjC,aAAA,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAmB,KAAK,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAC,GAAG;aAC/C,IAAI,CAAC,GAAG,CAAC;AACZ,QAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,OAAO,IAAI;AAC/B,KAAC;SACA,IAAI,CAAC,EAAE,CAAC;IACX,OAAO,CAAA,yLAAA,EAA4L,QAAQ,CAAA,MAAA,CAAQ;AACrN;MAaa,MAAM,GAAA,MAAA;;;;;;AAIQ,IAAA,IAAI;;AAGrB,IAAA,GAAG;;IAGc,IAAI,GAAW,IAAI;;AAGpC,IAAA,KAAK;;IAGY,KAAK,GAAW,cAAc;AAEtC,IAAA,UAAU;IAG3B,WAAW,GAAA;QACT,IAAI,CAAC,QAAQ,EAAE;;IAGjB,iBAAiB,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAqB;;AAG3C;;;AAGG;IACK,iBAAiB,GAAA;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,KAAK,IAAI;;AAGhD,IAAA,MAAM,QAAQ,GAAA;QACpB,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;;YAE1B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,UAAU,GAAG,UAAU;gBAC5B;;;AAIF,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;AAC5B,gBAAA,IAAI,CAAC,UAAU,GAAG,SAAS;gBAC3B;;;YAIF,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,IAAI;;AAEF,oBAAA,MAAM,GAAG,GAA0C,MAAM,OAAO,sBAAQ,CAAQ;AAChF,oBAAA,WAAW,GAAG,GAAG,CAAC,KAAK;;AACvB,gBAAA,MAAM;AACN,oBAAA,IAAI,CAAC,UAAU,GAAG,SAAS;oBAC3B;;;YAIJ,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AAClC,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC;YACnC,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC;gBAC7C;;AAGF,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;;aACtB;AACL,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;;;;IAK/B,MAAM,GAAA;AACJ,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK;QAE7B,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EACH,KAAK,EAAE;AACL,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,CAAC,YAAY,IAAI,CAAC,IAAI,CAAA,CAAE,GAAG,IAAI;aAChC,EACD,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,EAAA,YAAA,EACtB,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS,iBAChC,QAAQ,GAAG,SAAS,GAAG,MAAM,EAC1C,KAAK,EAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,KAAK,EAAE,EAAA,EAEvC,IAAI,CAAC,GAAG,IACP,WAAK,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,KAAK,EAAA,CAAG,IACtC,IAAI,CAAC,UAAU,IACjB,CAAA,CAAA,MAAA,EAAA,EAAM,IAAI,EAAC,KAAK,EAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAA,CAAS,KAEpD,CAAA,CAAA,MAAA,EAAA,IAAA,CAAQ,CACT,CACI;;;;;;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-icon.entry.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-input.entry.js","sources":["src/components/input/input.css?tag=ts-input&encapsulation=shadow","src/components/input/input.tsx"],"sourcesContent":["/* ==========================================================================\n ts-input — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-input-bg Input background\n --ts-input-color Input text color\n --ts-input-border-color Default border color\n --ts-input-radius Border radius\n --ts-input-focus-ring Focus ring box-shadow\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-input-bg: var(--ts-color-neutral-50);\n --ts-input-color: var(--ts-color-text-primary);\n --ts-input-border-color: var(--ts-color-border-default);\n --ts-input-radius: var(--ts-radius-md);\n --ts-input-focus-ring: var(--ts-focus-ring);\n}\n\n/* ---- Label ---- */\n.input__label {\n display: block;\n margin-bottom: 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-secondary);\n line-height: var(--ts-line-height-normal);\n}\n\n.input__required {\n color: var(--ts-color-danger-500);\n}\n\n/* ---- Wrapper ---- */\n.input__wrapper {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-2);\n border: 1px solid var(--ts-input-border-color);\n border-radius: var(--ts-input-radius);\n background-color: var(--ts-input-bg);\n box-shadow: none;\n transition:\n border-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast),\n background-color var(--ts-transition-fast);\n overflow: hidden;\n}\n\n.input__wrapper--focused {\n border-color: var(--ts-color-primary-500);\n box-shadow: var(--ts-input-focus-ring);\n}\n\n.input__wrapper--error {\n border-color: var(--ts-color-danger-500);\n}\n\n.input__wrapper--error.input__wrapper--focused {\n box-shadow: 0 0 0 3px var(--ts-color-focus-ring-danger);\n}\n\n.input__wrapper--disabled {\n background-color: var(--ts-color-bg-disabled);\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* ---- Native Input ---- */\n.input__native {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-family: inherit;\n color: var(--ts-input-color);\n width: 100%;\n min-width: 0;\n}\n\n.input__native::placeholder {\n color: var(--ts-color-text-tertiary);\n}\n\n.input__native:disabled {\n cursor: not-allowed;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .input__wrapper {\n border-radius: var(--ts-radius-sm);\n}\n:host([size=\"sm\"]) .input__native {\n padding: var(--ts-spacing-1) var(--ts-spacing-2);\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .input__native {\n padding: var(--ts-spacing-2) var(--ts-spacing-3);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .input__native {\n padding: var(--ts-spacing-3) var(--ts-spacing-4);\n font-size: var(--ts-font-size-lg);\n}\n\n:host([size=\"xl\"]) .input__wrapper {\n border-radius: var(--ts-radius-lg);\n}\n:host([size=\"xl\"]) .input__native {\n padding: var(--ts-spacing-4) var(--ts-spacing-5);\n font-size: var(--ts-font-size-xl);\n}\n\n/* ---- Prefix / Suffix ---- */\n.input__prefix,\n.input__suffix {\n display: inline-flex;\n align-items: center;\n color: var(--ts-color-text-tertiary);\n}\n\n.input__prefix {\n padding-inline-start: var(--ts-spacing-3);\n}\n\n.input__suffix {\n padding-inline-end: var(--ts-spacing-3);\n}\n\n.input__prefix:empty,\n.input__suffix:empty {\n display: none;\n}\n\n/* ---- Help & Error Text ---- */\n.input__help,\n.input__error {\n margin-top: var(--ts-spacing-1);\n font-size: var(--ts-font-size-xs);\n line-height: var(--ts-line-height-normal);\n}\n\n.input__help {\n color: var(--ts-color-text-tertiary);\n}\n\n.input__error {\n color: var(--ts-color-danger-600);\n font-weight: var(--ts-font-weight-medium);\n}\n","import {\n Component,\n Prop,\n State,\n Event,\n Watch,\n h,\n Host,\n Element,\n Method,\n} from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize, TsChangeEventDetail, TsValidationEventDetail } from '../../types';\nimport { generateId } from '../../utils/aria';\n\n/**\n * @slot prefix - Content before the input (e.g., icon or currency symbol).\n * @slot suffix - Content after the input (e.g., icon or clear button).\n * @slot help-text - Help text displayed below the input.\n *\n * @part base - The outer wrapper.\n * @part label - The label element.\n * @part input - The native input element.\n * @part prefix - The prefix slot wrapper.\n * @part suffix - The suffix slot wrapper.\n * @part help-text - The help text wrapper.\n * @part error-text - The error message wrapper.\n */\n@Component({\n tag: 'ts-input',\n styleUrl: 'input.css',\n shadow: true,\n})\nexport class TsInput {\n @Element() hostEl!: HTMLElement;\n\n private inputEl?: HTMLInputElement;\n private inputId = generateId('ts-input');\n\n /** The input's value. */\n @Prop({ mutable: true, reflect: true }) value = '';\n\n /** The input type. */\n @Prop({ reflect: true }) type:\n | 'text'\n | 'email'\n | 'password'\n | 'number'\n | 'tel'\n | 'url'\n | 'search' = 'text';\n\n /** The input's size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Label text displayed above the input. */\n @Prop() label?: string;\n\n /** Placeholder text. */\n @Prop() placeholder?: string;\n\n /** Help text displayed below the input. */\n @Prop() helpText?: string;\n\n /** Renders the input in an error state with an error message. */\n @Prop() error?: string;\n\n /** Makes the input required. */\n @Prop({ reflect: true }) required = false;\n\n /** Renders the input as disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Renders the input as readonly. */\n @Prop({ reflect: true }) readonly = false;\n\n /** Maximum character length. */\n @Prop() maxlength?: number;\n\n /** Minimum character length. */\n @Prop() minlength?: number;\n\n /** Pattern for validation (regex string). */\n @Prop() pattern?: string;\n\n /** Autocomplete attribute. */\n @Prop() autocomplete?: string;\n\n /** Name attribute for form submission. */\n @Prop() name?: string;\n\n /** Whether the input is currently focused. */\n @State() hasFocus = false;\n\n /** Emitted when the value changes (on input). */\n @Event({ eventName: 'tsInput' }) tsInput!: EventEmitter<TsChangeEventDetail<string>>;\n\n /** Emitted when the value changes (on blur / commit). */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<TsChangeEventDetail<string>>;\n\n /** Emitted when the input gains focus. */\n @Event({ eventName: 'tsFocus' }) tsFocus!: EventEmitter<void>;\n\n /** Emitted when the input loses focus. */\n @Event({ eventName: 'tsBlur' }) tsBlur!: EventEmitter<void>;\n\n /** Emitted on validation. */\n @Event({ eventName: 'tsValidate' }) tsValidate!: EventEmitter<TsValidationEventDetail>;\n\n @Watch('value')\n handleValueChange(newValue: string, oldValue: string): void {\n if (newValue !== oldValue && this.inputEl) {\n this.inputEl.value = newValue;\n }\n }\n\n /** Programmatically focus the input. */\n @Method()\n async setFocus(): Promise<void> {\n this.inputEl?.focus();\n }\n\n /** Programmatically select the input text. */\n @Method()\n async selectText(): Promise<void> {\n this.inputEl?.select();\n }\n\n private handleInput = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n const previousValue = this.value;\n this.value = target.value;\n this.tsInput.emit({ value: this.value, previousValue });\n };\n\n private handleChange = (): void => {\n this.tsChange.emit({ value: this.value, previousValue: this.value });\n\n // Run native validation\n if (this.inputEl) {\n const valid = this.inputEl.checkValidity();\n this.tsValidate.emit({\n valid,\n message: this.inputEl.validationMessage,\n });\n }\n };\n\n private handleFocus = (): void => {\n this.hasFocus = true;\n this.tsFocus.emit();\n };\n\n private handleBlur = (): void => {\n this.hasFocus = false;\n this.tsBlur.emit();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const hasError = !!this.error;\n const labelId = `${this.inputId}-label`;\n const helpId = `${this.inputId}-help`;\n const errorId = `${this.inputId}-error`;\n\n return (\n <Host\n class={{\n 'ts-input': true,\n [`ts-input--${this.size}`]: true,\n 'ts-input--focused': this.hasFocus,\n 'ts-input--disabled': this.disabled,\n 'ts-input--error': hasError,\n }}\n >\n {this.label && (\n <label class=\"input__label\" part=\"label\" id={labelId} htmlFor={this.inputId}>\n {this.label}\n {this.required && <span class=\"input__required\" aria-hidden=\"true\"> *</span>}\n </label>\n )}\n\n <div\n class={{\n 'input__wrapper': true,\n 'input__wrapper--focused': this.hasFocus,\n 'input__wrapper--error': hasError,\n 'input__wrapper--disabled': this.disabled,\n }}\n part=\"base\"\n >\n <span class=\"input__prefix\" part=\"prefix\">\n <slot name=\"prefix\" />\n </span>\n\n <input\n ref={(el) => (this.inputEl = el)}\n id={this.inputId}\n class=\"input__native\"\n part=\"input\"\n type={this.type}\n value={this.value}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readOnly={this.readonly}\n required={this.required}\n maxlength={this.maxlength}\n minlength={this.minlength}\n pattern={this.pattern}\n autoComplete={this.autocomplete}\n name={this.name}\n aria-labelledby={this.label ? labelId : undefined}\n aria-describedby={hasError ? errorId : this.helpText ? helpId : undefined}\n aria-invalid={hasError ? 'true' : undefined}\n aria-required={this.required ? 'true' : undefined}\n onInput={this.handleInput}\n onChange={this.handleChange}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n />\n\n <span class=\"input__suffix\" part=\"suffix\">\n <slot name=\"suffix\" />\n </span>\n </div>\n\n {hasError && (\n <div class=\"input__error\" part=\"error-text\" id={errorId} role=\"alert\">\n {this.error}\n </div>\n )}\n\n {!hasError && this.helpText && (\n <div class=\"input__help\" part=\"help-text\" id={helpId}>\n {this.helpText}\n </div>\n )}\n </Host>\n );\n }\n}\n"],"names":[],"mappings":"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"}
|