@mono-lit/helper 0.0.0-stage → 0.0.1
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/LICENSE.md +55 -0
- package/README.md +34 -2
- package/dist/breakpoints-CAbhDUht.js +84 -0
- package/dist/checkbox-Cqpie9Ap.js +4 -0
- package/dist/chip-DBUUa2eB.js +4 -0
- package/dist/chip-limits-BMoO31JM.js +213 -0
- package/dist/chip-strip-Cw3gyz0q.js +213 -0
- package/dist/color-DHYrfXsX.js +253 -0
- package/dist/css-class-BRKRzHx-.js +60 -0
- package/dist/css-size-DhHSVZJK.js +37 -0
- package/dist/data/theme/presets.json.d.ts +140 -0
- package/dist/data-search-Bwo5bg8K.js +573 -0
- package/dist/data-source-controller-C50Qyfzh.js +178 -0
- package/dist/data-source-options-BTpfrOZ_.js +535 -0
- package/dist/data-source-options-CQSTZHPE.js +537 -0
- package/dist/data-source-read-CUX-lgrQ.js +216 -0
- package/dist/data-source-read-DL88aH8t.js +217 -0
- package/dist/decorate-DEXtNagw.js +141 -0
- package/dist/element-props-CLB6yvbm.js +114 -0
- package/dist/esm-Ptok4SQZ.js +2026 -0
- package/dist/excel-CY6zGkcx.js +608 -0
- package/dist/excel-DopRbEMK.js +608 -0
- package/dist/export-BvlBx_GZ.js +2302 -0
- package/dist/export.d.ts +1 -0
- package/dist/export.js +2302 -0
- package/dist/field-icons-BoOG6KrL.js +51 -0
- package/dist/field-path-C92eGLg3.js +251 -0
- package/dist/filter-builder-Bke3qOgJ.js +205 -0
- package/dist/filter-builder-CE4zE0V5.js +205 -0
- package/dist/filter-eval-DIfU2EAn.js +173 -0
- package/dist/filter-odata-C1vSGZaY.js +591 -0
- package/dist/form-control-core-B8d7k6vk.js +223 -0
- package/dist/form-control-core-eeRr0zLU.js +223 -0
- package/dist/hydration-flush-RB5Tz5nl.js +1001 -0
- package/dist/icon-CJkTlmTb.js +55 -0
- package/dist/icon-dVhYJUIH.js +17 -0
- package/dist/import-BgJdkwBI.js +606 -0
- package/dist/import.d.ts +1 -0
- package/dist/import.js +606 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +16 -0
- package/dist/index.node-DjvYOL-J.js +395 -0
- package/dist/index.node.d.ts +1 -0
- package/dist/index.node.js +16 -0
- package/dist/input-zGOULADt.js +4 -0
- package/dist/layout-var-CZnzMC0s.js +73 -0
- package/dist/light-slots-BVJwyg_2.js +244 -0
- package/dist/light-slots-DW1WgfgT.js +254 -0
- package/dist/markdown-DfqrfOJN.js +20146 -0
- package/dist/mono-button-CoVnBLav.js +873 -0
- package/dist/mono-button.shadow-FfP_hMH4.js +784 -0
- package/dist/mono-data-chart-ChU4Ii3p.js +738 -0
- package/dist/mono-data-dropdown-BAUl58kW.js +357 -0
- package/dist/mono-data-grid-CLBK8clE.js +4140 -0
- package/dist/mono-data-grid-Db80FzdZ.js +4142 -0
- package/dist/mono-element-B0kP_96P.js +232 -0
- package/dist/mono-event-Bi1qP9uN.js +129 -0
- package/dist/mono-form-controller-5PfsU4qa.js +409 -0
- package/dist/mono-modal-controller-BMO3n3rP.js +223 -0
- package/dist/mono-ui-CPV7rrdo.js +358 -0
- package/dist/notifier-CE4yxMUQ.js +88 -0
- package/dist/nuxt.d.ts +1 -0
- package/dist/nuxt.js +130 -0
- package/dist/popup-portal-BziRX1yG.js +465 -0
- package/dist/popup-stack-CEEMib__.js +189 -0
- package/dist/rate-limit-BBa2PO79.js +521 -0
- package/dist/reactive-BHsqVjRh.js +789 -0
- package/dist/reactive-D3EERqgO.js +47 -0
- package/dist/search.d.ts +1 -0
- package/dist/search.js +97 -0
- package/dist/src/components/accordion/accordion-core.d.ts +62 -0
- package/dist/src/components/accordion/accordion-types.d.ts +62 -0
- package/dist/src/components/accordion/index.d.ts +3 -0
- package/dist/src/components/accordion/index.shadow.d.ts +5 -0
- package/dist/src/components/accordion/mono-accordion.d.ts +55 -0
- package/dist/src/components/accordion/mono-accordion.shadow.d.ts +56 -0
- package/dist/src/components/alert/alert-core.d.ts +46 -0
- package/dist/src/components/alert/alert-types.d.ts +44 -0
- package/dist/src/components/alert/index.d.ts +3 -0
- package/dist/src/components/alert/index.shadow.d.ts +5 -0
- package/dist/src/components/alert/mono-alert.d.ts +44 -0
- package/dist/src/components/alert/mono-alert.shadow.d.ts +34 -0
- package/dist/src/components/breadcrumb/breadcrumb-core.d.ts +61 -0
- package/dist/src/components/breadcrumb/breadcrumb-list-core.d.ts +49 -0
- package/dist/src/components/breadcrumb/breadcrumb-render.d.ts +31 -0
- package/dist/src/components/breadcrumb/breadcrumb-types.d.ts +117 -0
- package/dist/src/components/breadcrumb/breadcrumb-utils.d.ts +43 -0
- package/dist/src/components/breadcrumb/index.d.ts +6 -0
- package/dist/src/components/breadcrumb/index.shadow.d.ts +8 -0
- package/dist/src/components/breadcrumb/mono-breadcrumb-list.d.ts +29 -0
- package/dist/src/components/breadcrumb/mono-breadcrumb-list.shadow.d.ts +48 -0
- package/dist/src/components/breadcrumb/mono-breadcrumb.d.ts +38 -0
- package/dist/src/components/breadcrumb/mono-breadcrumb.shadow.d.ts +73 -0
- package/dist/src/components/button/button-core.d.ts +90 -0
- package/dist/src/components/button/button-dropdown-core.d.ts +57 -0
- package/dist/src/components/button/button-dropdown-types.d.ts +129 -0
- package/dist/src/components/button/button-types.d.ts +219 -0
- package/dist/src/components/button/button-utils.d.ts +18 -0
- package/dist/src/components/button/index.button-dropdown.d.ts +4 -0
- package/dist/src/components/button/index.button-dropdown.shadow.d.ts +4 -0
- package/dist/src/components/button/index.d.ts +8 -0
- package/dist/src/components/button/index.shadow.d.ts +5 -0
- package/dist/src/components/button/mono-button-dropdown.d.ts +35 -0
- package/dist/src/components/button/mono-button-dropdown.shadow.d.ts +45 -0
- package/dist/src/components/button/mono-button.d.ts +123 -0
- package/dist/src/components/button/mono-button.shadow.d.ts +56 -0
- package/dist/src/components/card/card-core.d.ts +74 -0
- package/dist/src/components/card/card-types.d.ts +137 -0
- package/dist/src/components/card/card-utils.d.ts +23 -0
- package/dist/src/components/card/index.d.ts +4 -0
- package/dist/src/components/card/index.shadow.d.ts +6 -0
- package/dist/src/components/card/mono-card.d.ts +56 -0
- package/dist/src/components/card/mono-card.shadow.d.ts +52 -0
- package/dist/src/components/chart/chart-core.d.ts +43 -0
- package/dist/src/components/chart/chart-odata.d.ts +52 -0
- package/dist/src/components/chart/chart-types.d.ts +337 -0
- package/dist/src/components/chart/index.d.ts +8 -0
- package/dist/src/components/chart/index.shadow.d.ts +7 -0
- package/dist/src/components/chart/mono-chart-presets.d.ts +43 -0
- package/dist/src/components/chart/mono-chart-presets.shadow.d.ts +43 -0
- package/dist/src/components/chart/mono-chart.d.ts +30 -0
- package/dist/src/components/chart/mono-chart.shadow.d.ts +22 -0
- package/dist/src/components/chart/mono-data-chart.d.ts +27 -0
- package/dist/src/components/checkbox/checkbox-core.d.ts +53 -0
- package/dist/src/components/checkbox/checkbox-types.d.ts +69 -0
- package/dist/src/components/checkbox/checkbox-utils.d.ts +35 -0
- package/dist/src/components/checkbox/index.d.ts +4 -0
- package/dist/src/components/checkbox/index.shadow.d.ts +5 -0
- package/dist/src/components/checkbox/mono-checkbox.d.ts +34 -0
- package/dist/src/components/checkbox/mono-checkbox.shadow.d.ts +45 -0
- package/dist/src/components/chip/chip-core.d.ts +58 -0
- package/dist/src/components/chip/chip-types.d.ts +142 -0
- package/dist/src/components/chip/chip-utils.d.ts +24 -0
- package/dist/src/components/chip/index.d.ts +8 -0
- package/dist/src/components/chip/index.shadow.d.ts +6 -0
- package/dist/src/components/chip/mono-chip.d.ts +48 -0
- package/dist/src/components/chip/mono-chip.shadow.d.ts +33 -0
- package/dist/src/components/chip/mono-status-dot.d.ts +34 -0
- package/dist/src/components/date/date-core.d.ts +80 -0
- package/dist/src/components/date/date-types.d.ts +163 -0
- package/dist/src/components/date/index.d.ts +3 -0
- package/dist/src/components/date/index.shadow.d.ts +4 -0
- package/dist/src/components/date/mono-date.d.ts +22 -0
- package/dist/src/components/date/mono-date.shadow.d.ts +31 -0
- package/dist/src/components/drawer/drawer-core.d.ts +99 -0
- package/dist/src/components/drawer/drawer-types.d.ts +153 -0
- package/dist/src/components/drawer/index.d.ts +3 -0
- package/dist/src/components/drawer/index.shadow.d.ts +4 -0
- package/dist/src/components/drawer/mono-drawer.d.ts +45 -0
- package/dist/src/components/drawer/mono-drawer.shadow.d.ts +46 -0
- package/dist/src/components/dropdown/dropdown-core.d.ts +33 -0
- package/dist/src/components/dropdown/dropdown-types.d.ts +88 -0
- package/dist/src/components/dropdown/index.d.ts +3 -0
- package/dist/src/components/dropdown/index.shadow.d.ts +4 -0
- package/dist/src/components/dropdown/mono-dropdown.d.ts +34 -0
- package/dist/src/components/dropdown/mono-dropdown.shadow.d.ts +28 -0
- package/dist/src/components/dropdown-table/dropdown-table-core.d.ts +65 -0
- package/dist/src/components/dropdown-table/dropdown-table-types.d.ts +278 -0
- package/dist/src/components/dropdown-table/index.d.ts +5 -0
- package/dist/src/components/dropdown-table/index.shadow.d.ts +6 -0
- package/dist/src/components/dropdown-table/mono-data-dropdown.d.ts +152 -0
- package/dist/src/components/dropdown-table/mono-dropdown-table.d.ts +46 -0
- package/dist/src/components/dropdown-table/mono-dropdown-table.shadow.d.ts +22 -0
- package/dist/src/components/file-upload/file-upload-core.d.ts +60 -0
- package/dist/src/components/file-upload/file-upload-types.d.ts +145 -0
- package/dist/src/components/file-upload/file-upload-utils.d.ts +16 -0
- package/dist/src/components/file-upload/index.d.ts +4 -0
- package/dist/src/components/file-upload/index.shadow.d.ts +5 -0
- package/dist/src/components/file-upload/mono-file-upload.d.ts +33 -0
- package/dist/src/components/file-upload/mono-file-upload.shadow.d.ts +50 -0
- package/dist/src/components/filter/filter-builder-core.d.ts +36 -0
- package/dist/src/components/filter/filter-builder.d.ts +23 -0
- package/dist/src/components/filter/filter-odata.d.ts +27 -0
- package/dist/src/components/filter/filter-operators.d.ts +13 -0
- package/dist/src/components/filter/filter-types.d.ts +253 -0
- package/dist/src/components/filter/index.d.ts +6 -0
- package/dist/src/components/filter/index.shadow.d.ts +7 -0
- package/dist/src/components/filter/mono-filter-builder.d.ts +21 -0
- package/dist/src/components/filter/mono-filter-builder.shadow.d.ts +17 -0
- package/dist/src/components/form/form-control-core.d.ts +37 -0
- package/dist/src/components/form/form-rules.d.ts +25 -0
- package/dist/src/components/form/form-types.d.ts +307 -0
- package/dist/src/components/form/index.d.ts +6 -0
- package/dist/src/components/form/mono-form-controller.d.ts +16 -0
- package/dist/src/components/input/index.d.ts +6 -0
- package/dist/src/components/input/index.shadow.d.ts +8 -0
- package/dist/src/components/input/input-core.d.ts +91 -0
- package/dist/src/components/input/input-format.d.ts +118 -0
- package/dist/src/components/input/input-types.d.ts +179 -0
- package/dist/src/components/input/input-utils.d.ts +10 -0
- package/dist/src/components/input/mono-input.d.ts +46 -0
- package/dist/src/components/input/mono-input.shadow.d.ts +34 -0
- package/dist/src/components/menu/index.d.ts +6 -0
- package/dist/src/components/menu/index.shadow.d.ts +7 -0
- package/dist/src/components/menu/menu-core.d.ts +65 -0
- package/dist/src/components/menu/menu-render.d.ts +55 -0
- package/dist/src/components/menu/menu-types.d.ts +195 -0
- package/dist/src/components/menu/menu-utils.d.ts +53 -0
- package/dist/src/components/menu/mono-menu-list.d.ts +118 -0
- package/dist/src/components/menu/mono-menu.d.ts +39 -0
- package/dist/src/components/menu/mono-menu.shadow.d.ts +40 -0
- package/dist/src/components/modal/index.d.ts +4 -0
- package/dist/src/components/modal/index.shadow.d.ts +5 -0
- package/dist/src/components/modal/modal-core.d.ts +110 -0
- package/dist/src/components/modal/modal-types.d.ts +304 -0
- package/dist/src/components/modal/mono-modal-controller.d.ts +4 -0
- package/dist/src/components/modal/mono-modal.d.ts +45 -0
- package/dist/src/components/modal/mono-modal.shadow.d.ts +50 -0
- package/dist/src/components/nav/index.d.ts +4 -0
- package/dist/src/components/nav/index.shadow.d.ts +6 -0
- package/dist/src/components/nav/mono-nav.d.ts +41 -0
- package/dist/src/components/nav/mono-nav.shadow.d.ts +21 -0
- package/dist/src/components/nav/nav-core.d.ts +34 -0
- package/dist/src/components/nav/nav-types.d.ts +48 -0
- package/dist/src/components/nav/nav-utils.d.ts +12 -0
- package/dist/src/components/radio/index.d.ts +4 -0
- package/dist/src/components/radio/index.shadow.d.ts +5 -0
- package/dist/src/components/radio/mono-radio.d.ts +31 -0
- package/dist/src/components/radio/mono-radio.shadow.d.ts +35 -0
- package/dist/src/components/radio/radio-core.d.ts +45 -0
- package/dist/src/components/radio/radio-types.d.ts +58 -0
- package/dist/src/components/radio/radio-utils.d.ts +12 -0
- package/dist/src/components/rich-text-editor/index.d.ts +5 -0
- package/dist/src/components/rich-text-editor/index.shadow.d.ts +6 -0
- package/dist/src/components/rich-text-editor/mono-rich-text-editor.d.ts +31 -0
- package/dist/src/components/rich-text-editor/mono-rich-text-editor.shadow.d.ts +34 -0
- package/dist/src/components/rich-text-editor/rich-text-editor-core.d.ts +100 -0
- package/dist/src/components/rich-text-editor/rich-text-editor-loader.d.ts +17 -0
- package/dist/src/components/rich-text-editor/rich-text-editor-toolbar.d.ts +65 -0
- package/dist/src/components/rich-text-editor/rich-text-editor-types.d.ts +231 -0
- package/dist/src/components/select/index.d.ts +4 -0
- package/dist/src/components/select/index.shadow.d.ts +5 -0
- package/dist/src/components/select/mono-select.d.ts +69 -0
- package/dist/src/components/select/mono-select.shadow.d.ts +48 -0
- package/dist/src/components/select/select-core.d.ts +98 -0
- package/dist/src/components/select/select-types.d.ts +258 -0
- package/dist/src/components/select/select-utils.d.ts +7 -0
- package/dist/src/components/sidebar/index.d.ts +4 -0
- package/dist/src/components/sidebar/index.shadow.d.ts +6 -0
- package/dist/src/components/sidebar/mono-sidebar.d.ts +34 -0
- package/dist/src/components/sidebar/mono-sidebar.shadow.d.ts +27 -0
- package/dist/src/components/sidebar/sidebar-core.d.ts +51 -0
- package/dist/src/components/sidebar/sidebar-types.d.ts +119 -0
- package/dist/src/components/sidebar/sidebar-utils.d.ts +55 -0
- package/dist/src/components/switch/index.d.ts +4 -0
- package/dist/src/components/switch/index.shadow.d.ts +5 -0
- package/dist/src/components/switch/mono-switch.d.ts +31 -0
- package/dist/src/components/switch/mono-switch.shadow.d.ts +36 -0
- package/dist/src/components/switch/switch-core.d.ts +49 -0
- package/dist/src/components/switch/switch-types.d.ts +64 -0
- package/dist/src/components/switch/switch-utils.d.ts +12 -0
- package/dist/src/components/table/array-source.d.ts +44 -0
- package/dist/src/components/table/date-filter-tree.d.ts +93 -0
- package/dist/src/components/table/grouping.d.ts +55 -0
- package/dist/src/components/table/index.d.ts +33 -0
- package/dist/src/components/table/index.shadow.d.ts +47 -0
- package/dist/src/components/table/mono-data-grid.d.ts +1756 -0
- package/dist/src/components/table/mono-table-checkbox-core.d.ts +76 -0
- package/dist/src/components/table/mono-table-checkbox.d.ts +34 -0
- package/dist/src/components/table/mono-table-checkbox.shadow.d.ts +26 -0
- package/dist/src/components/table/mono-table-detail-core.d.ts +87 -0
- package/dist/src/components/table/mono-table-detail.d.ts +32 -0
- package/dist/src/components/table/mono-table-detail.shadow.d.ts +31 -0
- package/dist/src/components/table/mono-table-empty-core.d.ts +60 -0
- package/dist/src/components/table/mono-table-empty.d.ts +35 -0
- package/dist/src/components/table/mono-table-empty.shadow.d.ts +40 -0
- package/dist/src/components/table/mono-table-error-core.d.ts +84 -0
- package/dist/src/components/table/mono-table-error.d.ts +28 -0
- package/dist/src/components/table/mono-table-error.shadow.d.ts +21 -0
- package/dist/src/components/table/mono-table-info-core.d.ts +13 -0
- package/dist/src/components/table/mono-table-info.d.ts +19 -0
- package/dist/src/components/table/mono-table-info.shadow.d.ts +14 -0
- package/dist/src/components/table/mono-table-loading-core.d.ts +41 -0
- package/dist/src/components/table/mono-table-loading.d.ts +50 -0
- package/dist/src/components/table/mono-table-loading.shadow.d.ts +14 -0
- package/dist/src/components/table/mono-table-page-size-core.d.ts +14 -0
- package/dist/src/components/table/mono-table-page-size.d.ts +16 -0
- package/dist/src/components/table/mono-table-page-size.shadow.d.ts +11 -0
- package/dist/src/components/table/mono-table-paging-core.d.ts +22 -0
- package/dist/src/components/table/mono-table-paging-group-core.d.ts +18 -0
- package/dist/src/components/table/mono-table-paging-group.d.ts +20 -0
- package/dist/src/components/table/mono-table-paging-group.shadow.d.ts +13 -0
- package/dist/src/components/table/mono-table-paging.d.ts +16 -0
- package/dist/src/components/table/mono-table-paging.shadow.d.ts +11 -0
- package/dist/src/components/table/mono-table-search-core.d.ts +74 -0
- package/dist/src/components/table/mono-table-search.d.ts +34 -0
- package/dist/src/components/table/mono-table-search.shadow.d.ts +21 -0
- package/dist/src/components/table/mono-table-sort-core.d.ts +35 -0
- package/dist/src/components/table/mono-table-sort.d.ts +38 -0
- package/dist/src/components/table/mono-table-sort.shadow.d.ts +20 -0
- package/dist/src/components/table/mono-table-summary-core.d.ts +26 -0
- package/dist/src/components/table/mono-table-summary.d.ts +24 -0
- package/dist/src/components/table/mono-table-summary.shadow.d.ts +14 -0
- package/dist/src/components/table/mono-table-th-core.d.ts +56 -0
- package/dist/src/components/table/mono-table-th.d.ts +41 -0
- package/dist/src/components/table/mono-table-th.shadow.d.ts +19 -0
- package/dist/src/components/table/store-group-source.d.ts +24 -0
- package/dist/src/components/table/table-controller-core.d.ts +40 -0
- package/dist/src/components/table/table-filter-icons.d.ts +3 -0
- package/dist/src/components/table/table-menu-core.d.ts +65 -0
- package/dist/src/components/table/table-overlay.d.ts +165 -0
- package/dist/src/components/table/table-sort-icons.d.ts +4 -0
- package/dist/src/components/table/table-sort-utils.d.ts +20 -0
- package/dist/src/components/table/table-types.d.ts +475 -0
- package/dist/src/components/tabs/index.d.ts +3 -0
- package/dist/src/components/tabs/index.shadow.d.ts +4 -0
- package/dist/src/components/tabs/mono-tabs.d.ts +33 -0
- package/dist/src/components/tabs/mono-tabs.shadow.d.ts +37 -0
- package/dist/src/components/tabs/tabs-core.d.ts +57 -0
- package/dist/src/components/tabs/tabs-types.d.ts +65 -0
- package/dist/src/components/tag-input/index.d.ts +4 -0
- package/dist/src/components/tag-input/index.shadow.d.ts +5 -0
- package/dist/src/components/tag-input/mono-tag-input.d.ts +66 -0
- package/dist/src/components/tag-input/mono-tag-input.shadow.d.ts +40 -0
- package/dist/src/components/tag-input/tag-input-core.d.ts +108 -0
- package/dist/src/components/tag-input/tag-input-types.d.ts +394 -0
- package/dist/src/components/tag-input/tag-input-utils.d.ts +8 -0
- package/dist/src/components/textarea/index.d.ts +4 -0
- package/dist/src/components/textarea/index.shadow.d.ts +5 -0
- package/dist/src/components/textarea/mono-textarea.d.ts +29 -0
- package/dist/src/components/textarea/mono-textarea.shadow.d.ts +31 -0
- package/dist/src/components/textarea/textarea-core.d.ts +60 -0
- package/dist/src/components/textarea/textarea-types.d.ts +131 -0
- package/dist/src/components/textarea/textarea-utils.d.ts +7 -0
- package/dist/src/components/tooltip/control-tooltip.d.ts +36 -0
- package/dist/src/components/tooltip/index.d.ts +6 -0
- package/dist/src/components/tooltip/tooltip-config.d.ts +27 -0
- package/dist/src/components/tooltip/tooltip-declarative.d.ts +41 -0
- package/dist/src/components/tooltip/tooltip-loader.d.ts +1 -0
- package/dist/src/components/tooltip/tooltip-types.d.ts +110 -0
- package/dist/src/composables/breakpoints.d.ts +59 -0
- package/dist/src/composables/chip-limits.d.ts +48 -0
- package/dist/src/composables/chip-strip.d.ts +93 -0
- package/dist/src/composables/color.d.ts +103 -0
- package/dist/src/composables/css-class.d.ts +27 -0
- package/dist/src/composables/css-size.d.ts +40 -0
- package/dist/src/composables/data-source-controller.d.ts +84 -0
- package/dist/src/composables/element-props.d.ts +46 -0
- package/dist/src/composables/field-icons.d.ts +7 -0
- package/dist/src/composables/hybird-prop.d.ts +79 -0
- package/dist/src/composables/hydration-flush.d.ts +34 -0
- package/dist/src/composables/icon.d.ts +17 -0
- package/dist/src/composables/layout-var.d.ts +34 -0
- package/dist/src/composables/light-slots.d.ts +133 -0
- package/dist/src/composables/mdi-glyphs.d.ts +4 -0
- package/dist/src/composables/mono-element.d.ts +9 -0
- package/dist/src/composables/mono-event.d.ts +55 -0
- package/dist/src/composables/mono-pending.d.ts +8 -0
- package/dist/src/composables/mono-skeleton.d.ts +193 -0
- package/dist/src/composables/mono-ui.d.ts +58 -0
- package/dist/src/composables/notifier.d.ts +46 -0
- package/dist/src/composables/popup-portal.d.ts +226 -0
- package/dist/src/composables/popup-stack.d.ts +70 -0
- package/dist/src/composables/rate-limit.d.ts +108 -0
- package/dist/src/composables/reactive.d.ts +53 -0
- package/dist/src/composables/shadow-css.d.ts +42 -0
- package/dist/src/composables/visibility.d.ts +36 -0
- package/dist/src/data/theme/index.d.ts +30 -0
- package/dist/src/data/theme/presets.d.ts +94 -0
- package/dist/src/entries/index.d.ts +2 -0
- package/dist/src/entries/index.node.d.ts +42 -0
- package/dist/src/entries/search.d.ts +3 -0
- package/dist/src/export/detail.d.ts +29 -0
- package/dist/src/export/download.d.ts +9 -0
- package/dist/src/export/excel/index.d.ts +27 -0
- package/dist/src/export/excel/nodes.d.ts +123 -0
- package/dist/src/export/expression.d.ts +36 -0
- package/dist/src/export/helpers.d.ts +6 -0
- package/dist/src/export/index.d.ts +13 -0
- package/dist/src/export/markdown.d.ts +52 -0
- package/dist/src/export/resolve-data.d.ts +31 -0
- package/dist/src/export/sentinel.d.ts +97 -0
- package/dist/src/export/sheet-name.d.ts +45 -0
- package/dist/src/export/styles.d.ts +33 -0
- package/dist/src/export/template.d.ts +10 -0
- package/dist/src/export/types.d.ts +259 -0
- package/dist/src/import/coerce.d.ts +38 -0
- package/dist/src/import/index.d.ts +16 -0
- package/dist/src/import/match.d.ts +54 -0
- package/dist/src/import/parse.d.ts +15 -0
- package/dist/src/import/types.d.ts +153 -0
- package/dist/src/nuxt/index.d.ts +94 -0
- package/dist/src/search/data-search.d.ts +207 -0
- package/dist/src/search/field-path.d.ts +107 -0
- package/dist/src/search/filter-eval.d.ts +30 -0
- package/dist/src/search/index.d.ts +22 -0
- package/dist/src/search/odata-search.d.ts +18 -0
- package/dist/src/search/search-expr.d.ts +160 -0
- package/dist/src/utils/data-source-apply.d.ts +97 -0
- package/dist/src/utils/data-source-options.d.ts +116 -0
- package/dist/src/utils/data-source-read.d.ts +85 -0
- package/dist/src/utils/data-source-summary.d.ts +55 -0
- package/dist/src/utils/normalize-error.d.ts +60 -0
- package/dist/src/vite/index.d.ts +48 -0
- package/dist/src/vite/mono-client-only.d.ts +35 -0
- package/dist/src/vite/mono-ssr-stub.d.ts +20 -0
- package/dist/src/vite/shadow-manifest.d.ts +8 -0
- package/dist/styles-BIJ31TM4.js +20146 -0
- package/dist/tooltip-CysgRgBi.js +760 -0
- package/dist/tooltip.d.ts +1 -0
- package/dist/tooltip.js +2 -0
- package/dist/ui/accordion.d.ts +1 -0
- package/dist/ui/accordion.js +466 -0
- package/dist/ui/alert.d.ts +1 -0
- package/dist/ui/alert.js +221 -0
- package/dist/ui/breadcrumb.d.ts +1 -0
- package/dist/ui/breadcrumb.js +902 -0
- package/dist/ui/button-dropdown.d.ts +1 -0
- package/dist/ui/button-dropdown.js +679 -0
- package/dist/ui/button.d.ts +1 -0
- package/dist/ui/button.js +63 -0
- package/dist/ui/card.d.ts +1 -0
- package/dist/ui/card.js +511 -0
- package/dist/ui/chart.d.ts +1 -0
- package/dist/ui/chart.js +808 -0
- package/dist/ui/checkbox.d.ts +1 -0
- package/dist/ui/checkbox.js +413 -0
- package/dist/ui/chip.d.ts +1 -0
- package/dist/ui/chip.js +558 -0
- package/dist/ui/date.d.ts +1 -0
- package/dist/ui/date.js +686 -0
- package/dist/ui/drawer.d.ts +1 -0
- package/dist/ui/drawer.js +901 -0
- package/dist/ui/dropdown-table.d.ts +1 -0
- package/dist/ui/dropdown-table.js +1291 -0
- package/dist/ui/dropdown.d.ts +1 -0
- package/dist/ui/dropdown.js +586 -0
- package/dist/ui/file-upload.d.ts +1 -0
- package/dist/ui/file-upload.js +688 -0
- package/dist/ui/filter.d.ts +1 -0
- package/dist/ui/filter.js +400 -0
- package/dist/ui/font/files/geist-47c091c9.woff2 +0 -0
- package/dist/ui/font/files/geist-8dd77544.woff2 +0 -0
- package/dist/ui/font/files/geist-b9248b1e.woff2 +0 -0
- package/dist/ui/font/files/geist-d40d74b4.woff2 +0 -0
- package/dist/ui/font/files/geist-f493429a.woff2 +0 -0
- package/dist/ui/font/files/geistmono-03737868.woff2 +0 -0
- package/dist/ui/font/files/geistmono-421a7e38.woff2 +0 -0
- package/dist/ui/font/files/geistmono-48ef518d.woff2 +0 -0
- package/dist/ui/font/files/geistmono-5df35d39.woff2 +0 -0
- package/dist/ui/font/files/geistmono-7de289a4.woff2 +0 -0
- package/dist/ui/font/files/geistmono-e976128f.woff2 +0 -0
- package/dist/ui/font/files/inter-05cf802c.woff2 +0 -0
- package/dist/ui/font/files/inter-2b2f25a4.woff2 +0 -0
- package/dist/ui/font/files/inter-467acc7a.woff2 +0 -0
- package/dist/ui/font/files/inter-6e85163c.woff2 +0 -0
- package/dist/ui/font/files/inter-7048add3.woff2 +0 -0
- package/dist/ui/font/files/inter-9be0371e.woff2 +0 -0
- package/dist/ui/font/files/inter-a28b7e31.woff2 +0 -0
- package/dist/ui/font/files/poppins-054df55a.woff2 +0 -0
- package/dist/ui/font/files/poppins-0ee5dc9a.woff2 +0 -0
- package/dist/ui/font/files/poppins-0f44cb18.woff2 +0 -0
- package/dist/ui/font/files/poppins-0ff0d30c.woff2 +0 -0
- package/dist/ui/font/files/poppins-13045147.woff2 +0 -0
- package/dist/ui/font/files/poppins-1db57cd9.woff2 +0 -0
- package/dist/ui/font/files/poppins-2cf2a902.woff2 +0 -0
- package/dist/ui/font/files/poppins-39e7f079.woff2 +0 -0
- package/dist/ui/font/files/poppins-9607042d.woff2 +0 -0
- package/dist/ui/font/files/poppins-9a88fc1f.woff2 +0 -0
- package/dist/ui/font/files/poppins-b8f4f752.woff2 +0 -0
- package/dist/ui/font/files/poppins-f5e57db4.woff2 +0 -0
- package/dist/ui/font/geist-mono.css +104 -0
- package/dist/ui/font/geist.css +168 -0
- package/dist/ui/font/inter.css +232 -0
- package/dist/ui/font/poppins.css +104 -0
- package/dist/ui/form.d.ts +1 -0
- package/dist/ui/form.js +3 -0
- package/dist/ui/index.css +21826 -0
- package/dist/ui/input.d.ts +1 -0
- package/dist/ui/input.js +1176 -0
- package/dist/ui/menu.d.ts +1 -0
- package/dist/ui/menu.js +1289 -0
- package/dist/ui/modal.d.ts +1 -0
- package/dist/ui/modal.js +995 -0
- package/dist/ui/nav.d.ts +1 -0
- package/dist/ui/nav.js +295 -0
- package/dist/ui/radio.d.ts +1 -0
- package/dist/ui/radio.js +379 -0
- package/dist/ui/rich-text-editor.d.ts +1 -0
- package/dist/ui/rich-text-editor.js +1338 -0
- package/dist/ui/select.d.ts +1 -0
- package/dist/ui/select.js +2066 -0
- package/dist/ui/shadow/accordion.js +442 -0
- package/dist/ui/shadow/alert.js +218 -0
- package/dist/ui/shadow/breadcrumb.js +919 -0
- package/dist/ui/shadow/button-dropdown.js +696 -0
- package/dist/ui/shadow/button.js +63 -0
- package/dist/ui/shadow/card.js +524 -0
- package/dist/ui/shadow/chart.js +1569 -0
- package/dist/ui/shadow/checkbox.js +457 -0
- package/dist/ui/shadow/chip.js +559 -0
- package/dist/ui/shadow/date.js +712 -0
- package/dist/ui/shadow/drawer.js +869 -0
- package/dist/ui/shadow/dropdown-table.js +1620 -0
- package/dist/ui/shadow/dropdown.js +547 -0
- package/dist/ui/shadow/file-upload.js +731 -0
- package/dist/ui/shadow/filter.js +402 -0
- package/dist/ui/shadow/input.js +1150 -0
- package/dist/ui/shadow/menu.js +899 -0
- package/dist/ui/shadow/modal.js +1193 -0
- package/dist/ui/shadow/nav.js +240 -0
- package/dist/ui/shadow/radio.js +408 -0
- package/dist/ui/shadow/rich-text-editor.js +1344 -0
- package/dist/ui/shadow/select.js +2033 -0
- package/dist/ui/shadow/sidebar.js +606 -0
- package/dist/ui/shadow/switch.js +428 -0
- package/dist/ui/shadow/table.js +4755 -0
- package/dist/ui/shadow/tabs.js +372 -0
- package/dist/ui/shadow/tag-input.js +2846 -0
- package/dist/ui/shadow/textarea.js +816 -0
- package/dist/ui/sidebar.d.ts +1 -0
- package/dist/ui/sidebar.js +659 -0
- package/dist/ui/switch.d.ts +1 -0
- package/dist/ui/switch.js +398 -0
- package/dist/ui/table.d.ts +1 -0
- package/dist/ui/table.js +4654 -0
- package/dist/ui/tabs.d.ts +1 -0
- package/dist/ui/tabs.js +379 -0
- package/dist/ui/tag-input.d.ts +1 -0
- package/dist/ui/tag-input.js +2819 -0
- package/dist/ui/textarea.d.ts +1 -0
- package/dist/ui/textarea.js +819 -0
- package/dist/ui/theme/legacy.css +293 -0
- package/dist/ui/theme/luma.css +743 -0
- package/dist/ui/theme/lyra.css +754 -0
- package/dist/ui/theme/maia.css +673 -0
- package/dist/ui/theme/mira.css +802 -0
- package/dist/ui/theme/nova.css +662 -0
- package/dist/ui/theme/one.css +699 -0
- package/dist/ui/theme/rhea.css +742 -0
- package/dist/ui/theme/sera.css +845 -0
- package/dist/ui/theme/tokens.css +261 -0
- package/dist/ui/theme/vega.css +467 -0
- package/dist/vite-C5iUK7so.js +329 -0
- package/dist/vite.d.ts +1 -0
- package/dist/vite.js +2 -0
- package/dist/vue.d.ts +282 -0
- package/package.json +411 -3
|
@@ -0,0 +1,784 @@
|
|
|
1
|
+
import { a as __decorate, f as customElement, i as withShadowUtilityStyles, l as defineHybridPropAliases, r as toShadowCss, s as booleanStringConverter, t as flushSsrHydration } from "./hydration-flush-RB5Tz5nl.js";
|
|
2
|
+
import { t as dispatchMonoEvent } from "./mono-event-Bi1qP9uN.js";
|
|
3
|
+
import { t as buildSizeStyle } from "./css-size-DhHSVZJK.js";
|
|
4
|
+
import { a as rateLimitHasChanged, i as rateLimitConverter, n as normalizeDebounce, r as normalizeThrottle, t as createRateLimiter } from "./rate-limit-BBa2PO79.js";
|
|
5
|
+
import { LitElement, html, isServer, nothing, unsafeCSS } from "lit";
|
|
6
|
+
import { property, query, state } from "lit/decorators.js";
|
|
7
|
+
import { ifDefined } from "lit/directives/if-defined.js";
|
|
8
|
+
import { styleMap } from "lit/directives/style-map.js";
|
|
9
|
+
//#region src/components/button/button-core.ts
|
|
10
|
+
/**
|
|
11
|
+
* `MonoButtonCore` — all render-mode-agnostic logic for `mono-button`: reactive
|
|
12
|
+
* props, hybrid aliases, the camelCase attribute fallbacks, the slot-presence
|
|
13
|
+
* `@state` (`_hasIcon`), class/getter computation, sizing, click/keyboard
|
|
14
|
+
* interactivity, and the imperative `focus/blur/click`. No `render()` — the light
|
|
15
|
+
* build keeps its `[data-mono-slot]` capture strategy and the shadow build uses
|
|
16
|
+
* native `<slot>` (each ships its own `render()`, mirroring `mono-card`).
|
|
17
|
+
*
|
|
18
|
+
* The `rounded="full"` auto-"icon-only when empty" refinement depends on light-DOM slot
|
|
19
|
+
* introspection, so it lives behind the `_defaultIsEmpty()` hook (defaults to
|
|
20
|
+
* `false` here; the light build overrides it). SSR-safe: no `document`/`window`
|
|
21
|
+
* access; `_buttonElement` (`@query`) is lazy and `focus/blur/click` only run
|
|
22
|
+
* client-side.
|
|
23
|
+
*/
|
|
24
|
+
var MonoButtonCore = (superClass) => {
|
|
25
|
+
class MonoButtonCoreClass extends superClass {
|
|
26
|
+
constructor(...args) {
|
|
27
|
+
super(...args);
|
|
28
|
+
this.cssClass = {};
|
|
29
|
+
this._hasIcon = false;
|
|
30
|
+
this._hasPrepend = false;
|
|
31
|
+
this._hasAppend = false;
|
|
32
|
+
this._pending = 0;
|
|
33
|
+
this._running = 0;
|
|
34
|
+
this._throttler = null;
|
|
35
|
+
this._debouncer = null;
|
|
36
|
+
this._directRunning = 0;
|
|
37
|
+
this._lastPhase = "idle";
|
|
38
|
+
defineHybridPropAliases(this, [
|
|
39
|
+
"iconPosition",
|
|
40
|
+
"badgeColor",
|
|
41
|
+
"iconOnly",
|
|
42
|
+
"ariaLabelText",
|
|
43
|
+
"cssClass",
|
|
44
|
+
"noAutoLoading",
|
|
45
|
+
"minWidth",
|
|
46
|
+
"maxWidth",
|
|
47
|
+
"minHeight",
|
|
48
|
+
"maxHeight"
|
|
49
|
+
]);
|
|
50
|
+
this.size = "md";
|
|
51
|
+
this.color = "primary";
|
|
52
|
+
this.variant = "solid";
|
|
53
|
+
this.disabled = false;
|
|
54
|
+
this.loading = false;
|
|
55
|
+
this.href = void 0;
|
|
56
|
+
this.target = void 0;
|
|
57
|
+
this.type = "button";
|
|
58
|
+
this.iconPosition = "left";
|
|
59
|
+
this.prepend = {};
|
|
60
|
+
this.append = {};
|
|
61
|
+
this.badge = void 0;
|
|
62
|
+
this.badgeColor = "red";
|
|
63
|
+
this.iconOnly = false;
|
|
64
|
+
this.glass = false;
|
|
65
|
+
this.tooltip = void 0;
|
|
66
|
+
this.ariaLabelText = void 0;
|
|
67
|
+
this.throttle = void 0;
|
|
68
|
+
this.debounce = void 0;
|
|
69
|
+
this.handler = void 0;
|
|
70
|
+
this.noAutoLoading = false;
|
|
71
|
+
this._isActive = false;
|
|
72
|
+
}
|
|
73
|
+
static get observedAttributes() {
|
|
74
|
+
return [
|
|
75
|
+
...super.observedAttributes ?? [],
|
|
76
|
+
"iconposition",
|
|
77
|
+
"badgecolor",
|
|
78
|
+
"icononly",
|
|
79
|
+
"arialabeltext",
|
|
80
|
+
"noautoloading",
|
|
81
|
+
"prepend",
|
|
82
|
+
"append"
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
86
|
+
super.attributeChangedCallback(name, oldValue, newValue);
|
|
87
|
+
if (oldValue === newValue) return;
|
|
88
|
+
if (name === "icononly") {
|
|
89
|
+
this.iconOnly = this._toBoolean(newValue);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (name === "prepend" || name === "append") {
|
|
93
|
+
this._setAffix(name, newValue);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (name === "iconposition") {
|
|
97
|
+
this.iconPosition = newValue ?? "left";
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (name === "badgecolor") {
|
|
101
|
+
this.badgeColor = newValue ?? "red";
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (name === "noautoloading") {
|
|
105
|
+
this.noAutoLoading = this._toBoolean(newValue);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (name === "arialabeltext") this.ariaLabelText = newValue ?? void 0;
|
|
109
|
+
}
|
|
110
|
+
willUpdate(changed) {
|
|
111
|
+
for (const key of [
|
|
112
|
+
"disabled",
|
|
113
|
+
"loading",
|
|
114
|
+
"iconOnly",
|
|
115
|
+
"glass",
|
|
116
|
+
"noAutoLoading"
|
|
117
|
+
]) if (typeof this[key] === "string") this[key] = this._toBoolean(this[key]);
|
|
118
|
+
if (changed.has("throttle")) this._invalidateLimiter("throttle");
|
|
119
|
+
if (changed.has("debounce")) this._invalidateLimiter("debounce");
|
|
120
|
+
super.willUpdate?.(changed);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Limiters are built on demand rather than up front: nothing schedules a
|
|
124
|
+
* timer server-side, and a disposed one (config change, disconnect) simply
|
|
125
|
+
* rebuilds on the next click — which is also what makes the element
|
|
126
|
+
* survive being moved or re-activated under `<KeepAlive>`.
|
|
127
|
+
*/
|
|
128
|
+
_ensureThrottler() {
|
|
129
|
+
if (this._throttler) return this._throttler;
|
|
130
|
+
const config = normalizeThrottle(this.throttle);
|
|
131
|
+
if (!config) return null;
|
|
132
|
+
this._throttler = createRateLimiter({
|
|
133
|
+
kind: "throttle",
|
|
134
|
+
config,
|
|
135
|
+
run: (...args) => this._runLimited("throttle", args[0]),
|
|
136
|
+
onChange: () => this._syncLoading()
|
|
137
|
+
});
|
|
138
|
+
return this._throttler;
|
|
139
|
+
}
|
|
140
|
+
_ensureDebouncer() {
|
|
141
|
+
if (this._debouncer) return this._debouncer;
|
|
142
|
+
const config = normalizeDebounce(this.debounce);
|
|
143
|
+
if (!config) return null;
|
|
144
|
+
this._debouncer = createRateLimiter({
|
|
145
|
+
kind: "debounce",
|
|
146
|
+
config,
|
|
147
|
+
run: (...args) => this._runLimited("debounce", args[0]),
|
|
148
|
+
onChange: () => this._syncLoading()
|
|
149
|
+
});
|
|
150
|
+
return this._debouncer;
|
|
151
|
+
}
|
|
152
|
+
/** Drop a limiter so the next click rebuilds it with the current config. */
|
|
153
|
+
_invalidateLimiter(kind) {
|
|
154
|
+
if (kind === "throttle") {
|
|
155
|
+
this._throttler?.dispose();
|
|
156
|
+
this._throttler = null;
|
|
157
|
+
} else {
|
|
158
|
+
this._debouncer?.dispose();
|
|
159
|
+
this._debouncer = null;
|
|
160
|
+
}
|
|
161
|
+
this._syncLoading();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Mirror the limiters' counters into reactive state and report transitions.
|
|
165
|
+
*
|
|
166
|
+
* The two pipelines are independent, so the button is busy while *either*
|
|
167
|
+
* is — hence the sum. Direct (unlimited) work counts as running only: it
|
|
168
|
+
* never waits.
|
|
169
|
+
*/
|
|
170
|
+
_syncLoading() {
|
|
171
|
+
const pending = this.noAutoLoading ? 0 : (this._throttler?.pending ?? 0) + (this._debouncer?.pending ?? 0);
|
|
172
|
+
const running = this.noAutoLoading ? 0 : (this._throttler?.running ?? 0) + (this._debouncer?.running ?? 0) + this._directRunning;
|
|
173
|
+
if (this._pending !== pending) this._pending = pending;
|
|
174
|
+
if (this._running !== running) this._running = running;
|
|
175
|
+
const phase = running > 0 ? "running" : pending > 0 ? "pending" : "idle";
|
|
176
|
+
if (phase === this._lastPhase) return;
|
|
177
|
+
this._lastPhase = phase;
|
|
178
|
+
dispatchMonoEvent(this, "loading-change", {
|
|
179
|
+
loading: phase !== "idle",
|
|
180
|
+
phase
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Drop anything waiting — the debounce timer and the throttle queue — without
|
|
185
|
+
* touching work already running. Each limiter rebuilds itself on the next click.
|
|
186
|
+
*/
|
|
187
|
+
cancelPending() {
|
|
188
|
+
this._throttler?.cancel();
|
|
189
|
+
this._debouncer?.cancel();
|
|
190
|
+
this._syncLoading();
|
|
191
|
+
}
|
|
192
|
+
disconnectedCallback() {
|
|
193
|
+
this._throttler?.dispose();
|
|
194
|
+
this._debouncer?.dispose();
|
|
195
|
+
this._throttler = null;
|
|
196
|
+
this._debouncer = null;
|
|
197
|
+
super.disconnectedCallback();
|
|
198
|
+
}
|
|
199
|
+
_cls(base, key) {
|
|
200
|
+
const extra = this.cssClass?.[key];
|
|
201
|
+
return extra ? `${base} ${extra}` : base;
|
|
202
|
+
}
|
|
203
|
+
_toBoolean(value) {
|
|
204
|
+
if (typeof value === "boolean") return value;
|
|
205
|
+
if (typeof value === "string") {
|
|
206
|
+
const normalized = value.toLowerCase().trim();
|
|
207
|
+
return normalized === "" || normalized === "true";
|
|
208
|
+
}
|
|
209
|
+
return Boolean(value);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Whether the default (text) slot is empty — drives the `rounded="full"`
|
|
213
|
+
* auto-icon-only refinement. Requires light-DOM introspection, so the core
|
|
214
|
+
* returns `false` (no auto-iconize); the light build overrides it.
|
|
215
|
+
*/
|
|
216
|
+
_defaultIsEmpty() {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Icon-only, explicitly or by inference.
|
|
221
|
+
*
|
|
222
|
+
* The inference: a fully-rounded button with no text in it is a circle
|
|
223
|
+
* holding one glyph, which is the shape people reach for as a FAB. It used to
|
|
224
|
+
* hang off `fab && (circle || shape === 'circle')`; `rounded="full"` is the
|
|
225
|
+
* one prop those three collapsed into.
|
|
226
|
+
*/
|
|
227
|
+
get _isIconOnlyLike() {
|
|
228
|
+
return this.iconOnly || this.rounded === "full" && this._defaultIsEmpty();
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* What the spinner follows: the `loading` prop (a manual override that
|
|
232
|
+
* always wins) OR either self-driven phase.
|
|
233
|
+
*/
|
|
234
|
+
get _effectiveLoading() {
|
|
235
|
+
return this.loading || this._pending > 0 || this._running > 0;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Whether a click produces anything the user can observe. A spinning button
|
|
239
|
+
* is a disabled button in every phase, the wait included — no event, no
|
|
240
|
+
* handler, no form submit.
|
|
241
|
+
*
|
|
242
|
+
* This is the *behavioural* answer; `_isInert` is the structural one. They
|
|
243
|
+
* differ during the wait, and that gap is deliberate — see `_isInert`.
|
|
244
|
+
*/
|
|
245
|
+
get _isBlocked() {
|
|
246
|
+
return this.disabled || this._effectiveLoading;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Whether the native control carries `disabled` — everything `_isBlocked`
|
|
250
|
+
* covers EXCEPT the self-driven wait.
|
|
251
|
+
*
|
|
252
|
+
* A natively disabled button dispatches no click event at all. If the wait
|
|
253
|
+
* were inert, repeat clicks could never reach the debouncer to reset its
|
|
254
|
+
* timer, and `debounce` would quietly degrade from "run once the user
|
|
255
|
+
* stops" into "wait, then run, ignoring the rest". So while waiting the
|
|
256
|
+
* control stays live and merely *looks* and *behaves* disabled: clicks land,
|
|
257
|
+
* are swallowed by `_handleClick`, and only extend the wait.
|
|
258
|
+
*/
|
|
259
|
+
get _isInert() {
|
|
260
|
+
return this.disabled || this.loading || this._running > 0;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Where the spinner is drawn.
|
|
264
|
+
*
|
|
265
|
+
* It replaces the ICON, wherever the icon sits — so `icon-position="right"` spins on the
|
|
266
|
+
* right, and a button with no icon grows a leading spinner in the slot an icon would have
|
|
267
|
+
* used. The caption always stays readable.
|
|
268
|
+
*
|
|
269
|
+
* This used to be two looks. Self-driven loading kept the caption and TRAILED the spinner
|
|
270
|
+
* after it, while the `loading` prop blanked the caption and centred the spinner — so a
|
|
271
|
+
* button with an icon rendered icon + label + spinner all at once, and which of the two
|
|
272
|
+
* looks you got depended on how loading had been switched on. `MonoConfirm` sets BOTH, and
|
|
273
|
+
* so blanked the very caption it had just changed to "Menyimpan...".
|
|
274
|
+
*
|
|
275
|
+
* One rule now, whatever triggered it.
|
|
276
|
+
*/
|
|
277
|
+
get _showsSpinner() {
|
|
278
|
+
return this._effectiveLoading;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Spinning because a call is waiting rather than executing. Drives the
|
|
282
|
+
* `pending` class, which restores `pointer-events` so those clicks can be
|
|
283
|
+
* absorbed — hence the hard-block exclusions, which must never be made
|
|
284
|
+
* clickable again.
|
|
285
|
+
*/
|
|
286
|
+
get _isPendingOnly() {
|
|
287
|
+
return this._pending > 0 && this._running === 0 && !this.loading && !this.disabled;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* `prepend` / `append` are object props, so the real binding is
|
|
291
|
+
* `:append.prop="{…}"`. This covers the two ways a STRING can arrive: a
|
|
292
|
+
* hand-written JSON attribute (`append='{"border":true}'`, incl. DSD/SSR) and
|
|
293
|
+
* Vue's `String(value)` mirror of a plain `:append="{…}"` binding — which
|
|
294
|
+
* yields `"[object Object]"` and must be ignored, or it would wipe the
|
|
295
|
+
* property set moments later.
|
|
296
|
+
*/
|
|
297
|
+
_setAffix(name, value) {
|
|
298
|
+
const assign = (v) => {
|
|
299
|
+
if (name === "prepend") this.prepend = v;
|
|
300
|
+
else this.append = v;
|
|
301
|
+
};
|
|
302
|
+
if (value == null) return assign({});
|
|
303
|
+
if (typeof value === "object") return assign(value);
|
|
304
|
+
if (typeof value !== "string") return;
|
|
305
|
+
const trimmed = value.trim();
|
|
306
|
+
if (!trimmed) return assign({});
|
|
307
|
+
if (!trimmed.startsWith("{")) return;
|
|
308
|
+
if (!trimmed.endsWith("}")) return;
|
|
309
|
+
try {
|
|
310
|
+
assign(JSON.parse(trimmed));
|
|
311
|
+
} catch {}
|
|
312
|
+
}
|
|
313
|
+
/** The affix config, always an object (either can be assigned null). */
|
|
314
|
+
_affix(name) {
|
|
315
|
+
const value = name === "prepend" ? this.prepend : this.append;
|
|
316
|
+
return value && typeof value === "object" ? value : {};
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Whether an affix zone is inert. Follows the button's `disabled` by default
|
|
320
|
+
* so the control dims as one, but NOT its `loading` — a busy main action with
|
|
321
|
+
* a live trailing menu is the case this feature exists for.
|
|
322
|
+
*/
|
|
323
|
+
_affixDisabled(name) {
|
|
324
|
+
const own = this._affix(name).disabled;
|
|
325
|
+
return own === void 0 ? this.disabled : own;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* The wrapper the whole stylesheet is keyed on.
|
|
329
|
+
*
|
|
330
|
+
* Its ATTRIBUTES mirror the props one for one — `<div mono-button
|
|
331
|
+
* mono-size="sm" mono-color="danger" mono-variant="outline">` — so a
|
|
332
|
+
* hand-written twin reads like the tag, and `button.css` selects on them
|
|
333
|
+
* exactly as Basecoat selects on `data-size` / `data-variant`. A prop at its
|
|
334
|
+
* default (md / primary / solid / left) emits NO attribute — absence IS the
|
|
335
|
+
* default in the sheet — so the rendered wrapper carries exactly what the
|
|
336
|
+
* author wrote, and a hand-written twin can be compared to it 1:1. The classes
|
|
337
|
+
* (`mono-button sm outline-danger`) are still emitted as inert hooks for
|
|
338
|
+
* consumer CSS until 2.0; no rule reads them. Bound in the template (not set
|
|
339
|
+
* in `updated()`) so the SSR build carries them.
|
|
340
|
+
*/
|
|
341
|
+
_renderWrapper(inner, style) {
|
|
342
|
+
return html`<div
|
|
343
|
+
class=${this._buttonClasses}
|
|
344
|
+
style=${style ?? nothing}
|
|
345
|
+
mono-button
|
|
346
|
+
mono-size=${this.size === "md" ? nothing : this.size}
|
|
347
|
+
mono-color=${this.color === "primary" ? nothing : this.color}
|
|
348
|
+
mono-variant=${this.variant === "solid" ? nothing : this.variant}
|
|
349
|
+
mono-rounded=${ifDefined(this.rounded)}
|
|
350
|
+
mono-icon-position=${this.iconPosition === "left" ? nothing : this.iconPosition}
|
|
351
|
+
?mono-icon-only=${this._isIconOnlyLike}
|
|
352
|
+
?mono-glass=${Boolean(this.glass)}
|
|
353
|
+
?mono-loading=${this._effectiveLoading}
|
|
354
|
+
?mono-pending=${this._isPendingOnly}
|
|
355
|
+
?mono-sized=${this._hasSize}
|
|
356
|
+
>${inner}</div>`;
|
|
357
|
+
}
|
|
358
|
+
/** @deprecated inert since the Basecoat port — see `_renderWrapper`. */
|
|
359
|
+
get _buttonClasses() {
|
|
360
|
+
const classes = [this._isIconOnlyLike ? "mono-button-icon" : "mono-button"];
|
|
361
|
+
classes.push(this.size);
|
|
362
|
+
if (this.variant === "solid") classes.push(this.color);
|
|
363
|
+
else if (this.variant === "outline") classes.push(`outline-${this.color}`);
|
|
364
|
+
else if (this.variant === "tonal") classes.push(`tonal-${this.color}`);
|
|
365
|
+
else if (this.variant === "text") classes.push(`plain-${this.color}`);
|
|
366
|
+
if (this.rounded) classes.push(`rounded-${this.rounded}`);
|
|
367
|
+
if (this.glass) classes.push("glass");
|
|
368
|
+
if (this._effectiveLoading) classes.push("loading");
|
|
369
|
+
if (this._isPendingOnly) classes.push("pending");
|
|
370
|
+
if (this._hasSize) classes.push("sized");
|
|
371
|
+
if (this.disabled) classes.push("disabled");
|
|
372
|
+
if (this._isActive) classes.push("active");
|
|
373
|
+
if (this.cssClass?.root) classes.push(this.cssClass.root);
|
|
374
|
+
return classes.join(" ");
|
|
375
|
+
}
|
|
376
|
+
/** The `badge-color` value the badge's `mono-badge` attribute carries (red by default). */
|
|
377
|
+
get _badgeColor() {
|
|
378
|
+
return this.badgeColor === "green" || this.badgeColor === "orange" || this.badgeColor === "cobalt" ? this.badgeColor : "red";
|
|
379
|
+
}
|
|
380
|
+
/** @deprecated inert since the Basecoat port — the badge is styled by `mono-badge`. */
|
|
381
|
+
get _badgeClass() {
|
|
382
|
+
let base = "btn-badge bb-red";
|
|
383
|
+
if (this.badgeColor === "green") base = "btn-badge bb-green";
|
|
384
|
+
else if (this.badgeColor === "orange") base = "btn-badge bb-orange";
|
|
385
|
+
else if (this.badgeColor === "cobalt") base = "btn-badge bb-cobalt";
|
|
386
|
+
return this.cssClass?.badge ? `${base} ${this.cssClass.badge}` : base;
|
|
387
|
+
}
|
|
388
|
+
get _ariaLabel() {
|
|
389
|
+
return this.ariaLabelText || this.tooltip;
|
|
390
|
+
}
|
|
391
|
+
/** True when any sizing prop is set — drives the `sized` class + host styles. */
|
|
392
|
+
get _hasSize() {
|
|
393
|
+
return Object.keys(buildSizeStyle(this)).length > 0;
|
|
394
|
+
}
|
|
395
|
+
/** Inline sizing object (used by the shadow build via `styleMap`). */
|
|
396
|
+
_sizeStyle() {
|
|
397
|
+
return buildSizeStyle(this);
|
|
398
|
+
}
|
|
399
|
+
_handleClick(event) {
|
|
400
|
+
if (this._isBlocked) {
|
|
401
|
+
event.preventDefault();
|
|
402
|
+
event.stopPropagation();
|
|
403
|
+
this._absorbWhileWaiting(event);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
const awaited = [];
|
|
407
|
+
dispatchMonoEvent(this, "click", {
|
|
408
|
+
originalEvent: event,
|
|
409
|
+
result: void 0,
|
|
410
|
+
waitUntil: (promise) => {
|
|
411
|
+
awaited.push(Promise.resolve(promise));
|
|
412
|
+
}
|
|
413
|
+
}, { sourceEvent: event });
|
|
414
|
+
const throttler = this._ensureThrottler();
|
|
415
|
+
const debouncer = this._ensureDebouncer();
|
|
416
|
+
const rateLimited = Boolean(throttler || debouncer);
|
|
417
|
+
if (throttler) throttler.call(event);
|
|
418
|
+
if (debouncer) debouncer.call(event);
|
|
419
|
+
const runsHandlerHere = !rateLimited && Boolean(this.handler);
|
|
420
|
+
if (runsHandlerHere || awaited.length > 0) this._runDirect(event, runsHandlerHere, awaited);
|
|
421
|
+
this._maybeSubmitForm(event);
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* A click that arrived while the button was already busy.
|
|
425
|
+
*
|
|
426
|
+
* It stays silent — no `mno-click`, no handler, no form submit — but a
|
|
427
|
+
* debounce still needs to *hear* it: the contract is "run once the user
|
|
428
|
+
* stops", so every repeat has to push the deadline out. Feeding the
|
|
429
|
+
* debouncer does exactly that (`p-debounce` clears and re-arms its timer on
|
|
430
|
+
* each call), which is why the waiting phase is deliberately not inert.
|
|
431
|
+
*
|
|
432
|
+
* Nothing is absorbed once work is actually running — a click then would
|
|
433
|
+
* queue a second execution, which is the opposite of what a busy button
|
|
434
|
+
* should do — nor while `disabled`/`loading` hard-block the control. A
|
|
435
|
+
* throttle is deliberately not fed either: its contract is a rate, not a
|
|
436
|
+
* quiet period, and every absorbed call would become another execution.
|
|
437
|
+
*/
|
|
438
|
+
_absorbWhileWaiting(event) {
|
|
439
|
+
if (this.disabled || this.loading) return;
|
|
440
|
+
if (this._running > 0 || this._pending === 0) return;
|
|
441
|
+
this._ensureDebouncer()?.call(event);
|
|
442
|
+
}
|
|
443
|
+
/** Immediate (unlimited) work: the handler and/or `waitUntil` promises. */
|
|
444
|
+
async _runDirect(event, runHandler, awaited) {
|
|
445
|
+
this._directRunning++;
|
|
446
|
+
this._syncLoading();
|
|
447
|
+
try {
|
|
448
|
+
if (runHandler) await this.handler?.(event);
|
|
449
|
+
if (awaited.length) await Promise.allSettled(awaited);
|
|
450
|
+
} finally {
|
|
451
|
+
this._directRunning--;
|
|
452
|
+
this._syncLoading();
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* The work a limiter performs: run the handler, then emit the matching
|
|
457
|
+
* rate-limited event carrying its resolved result, then wait for anything
|
|
458
|
+
* listeners registered. The enclosing limiter is what tracks this as the
|
|
459
|
+
* `running` phase.
|
|
460
|
+
*/
|
|
461
|
+
async _runLimited(kind, event) {
|
|
462
|
+
const result = this.handler ? await this.handler(event) : void 0;
|
|
463
|
+
const awaited = [];
|
|
464
|
+
dispatchMonoEvent(this, kind, {
|
|
465
|
+
originalEvent: event,
|
|
466
|
+
result,
|
|
467
|
+
waitUntil: (promise) => {
|
|
468
|
+
awaited.push(Promise.resolve(promise));
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
if (awaited.length) await Promise.allSettled(awaited);
|
|
472
|
+
return result;
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Native form submission doesn't cross a shadow boundary: in the shadow build the
|
|
476
|
+
* real `<button type="submit">` lives in the shadow root, so clicking it never
|
|
477
|
+
* submits the light-DOM `<form>` the host sits in (the inner button's form owner
|
|
478
|
+
* is `null`). When there's no native association, submit/reset the host's closest
|
|
479
|
+
* form manually via `requestSubmit()`/`reset()` (which still fires the form's
|
|
480
|
+
* `submit` event + constraint validation). The light build's inner `<button>` IS
|
|
481
|
+
* form-associated, so `innerForm` is truthy there and this is skipped — no double
|
|
482
|
+
* submit.
|
|
483
|
+
*/
|
|
484
|
+
_maybeSubmitForm(event) {
|
|
485
|
+
if (event.defaultPrevented || this.href || this.type !== "submit" && this.type !== "reset") return;
|
|
486
|
+
if (this._buttonElement?.form) return;
|
|
487
|
+
const form = this.closest("form");
|
|
488
|
+
if (!form) return;
|
|
489
|
+
if (this.type === "submit") form.requestSubmit();
|
|
490
|
+
else form.reset();
|
|
491
|
+
}
|
|
492
|
+
_handleKeyDown(event) {
|
|
493
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
494
|
+
event.preventDefault();
|
|
495
|
+
this._buttonElement?.click();
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
_handleFocus() {
|
|
499
|
+
this._isActive = true;
|
|
500
|
+
}
|
|
501
|
+
_handleBlur() {
|
|
502
|
+
this._isActive = false;
|
|
503
|
+
}
|
|
504
|
+
focus() {
|
|
505
|
+
this._buttonElement?.focus();
|
|
506
|
+
}
|
|
507
|
+
blur() {
|
|
508
|
+
this._buttonElement?.blur();
|
|
509
|
+
}
|
|
510
|
+
click() {
|
|
511
|
+
this._buttonElement?.click();
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "size", void 0);
|
|
515
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "color", void 0);
|
|
516
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "variant", void 0);
|
|
517
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "rounded", void 0);
|
|
518
|
+
__decorate([property({
|
|
519
|
+
reflect: true,
|
|
520
|
+
converter: booleanStringConverter
|
|
521
|
+
})], MonoButtonCoreClass.prototype, "disabled", void 0);
|
|
522
|
+
__decorate([property({
|
|
523
|
+
reflect: true,
|
|
524
|
+
converter: booleanStringConverter
|
|
525
|
+
})], MonoButtonCoreClass.prototype, "loading", void 0);
|
|
526
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "width", void 0);
|
|
527
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "height", void 0);
|
|
528
|
+
__decorate([property({
|
|
529
|
+
type: String,
|
|
530
|
+
attribute: "min-width"
|
|
531
|
+
})], MonoButtonCoreClass.prototype, "minWidth", void 0);
|
|
532
|
+
__decorate([property({
|
|
533
|
+
type: String,
|
|
534
|
+
attribute: "max-width"
|
|
535
|
+
})], MonoButtonCoreClass.prototype, "maxWidth", void 0);
|
|
536
|
+
__decorate([property({
|
|
537
|
+
type: String,
|
|
538
|
+
attribute: "min-height"
|
|
539
|
+
})], MonoButtonCoreClass.prototype, "minHeight", void 0);
|
|
540
|
+
__decorate([property({
|
|
541
|
+
type: String,
|
|
542
|
+
attribute: "max-height"
|
|
543
|
+
})], MonoButtonCoreClass.prototype, "maxHeight", void 0);
|
|
544
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "href", void 0);
|
|
545
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "target", void 0);
|
|
546
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "type", void 0);
|
|
547
|
+
__decorate([property({
|
|
548
|
+
type: String,
|
|
549
|
+
attribute: "icon-position"
|
|
550
|
+
})], MonoButtonCoreClass.prototype, "iconPosition", void 0);
|
|
551
|
+
__decorate([property({ attribute: false })], MonoButtonCoreClass.prototype, "prepend", void 0);
|
|
552
|
+
__decorate([property({ attribute: false })], MonoButtonCoreClass.prototype, "append", void 0);
|
|
553
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "badge", void 0);
|
|
554
|
+
__decorate([property({
|
|
555
|
+
type: String,
|
|
556
|
+
attribute: "badge-color"
|
|
557
|
+
})], MonoButtonCoreClass.prototype, "badgeColor", void 0);
|
|
558
|
+
__decorate([property({
|
|
559
|
+
attribute: "icon-only",
|
|
560
|
+
reflect: true,
|
|
561
|
+
converter: booleanStringConverter
|
|
562
|
+
})], MonoButtonCoreClass.prototype, "iconOnly", void 0);
|
|
563
|
+
__decorate([property({
|
|
564
|
+
reflect: true,
|
|
565
|
+
converter: booleanStringConverter
|
|
566
|
+
})], MonoButtonCoreClass.prototype, "glass", void 0);
|
|
567
|
+
__decorate([property({ type: String })], MonoButtonCoreClass.prototype, "tooltip", void 0);
|
|
568
|
+
__decorate([property({
|
|
569
|
+
type: String,
|
|
570
|
+
attribute: "aria-label-text"
|
|
571
|
+
})], MonoButtonCoreClass.prototype, "ariaLabelText", void 0);
|
|
572
|
+
__decorate([property({ attribute: false })], MonoButtonCoreClass.prototype, "cssClass", void 0);
|
|
573
|
+
__decorate([property({
|
|
574
|
+
converter: rateLimitConverter,
|
|
575
|
+
hasChanged: rateLimitHasChanged
|
|
576
|
+
})], MonoButtonCoreClass.prototype, "throttle", void 0);
|
|
577
|
+
__decorate([property({
|
|
578
|
+
converter: rateLimitConverter,
|
|
579
|
+
hasChanged: rateLimitHasChanged
|
|
580
|
+
})], MonoButtonCoreClass.prototype, "debounce", void 0);
|
|
581
|
+
__decorate([property({ attribute: false })], MonoButtonCoreClass.prototype, "handler", void 0);
|
|
582
|
+
__decorate([property({
|
|
583
|
+
attribute: "no-auto-loading",
|
|
584
|
+
reflect: true,
|
|
585
|
+
converter: booleanStringConverter
|
|
586
|
+
})], MonoButtonCoreClass.prototype, "noAutoLoading", void 0);
|
|
587
|
+
__decorate([state()], MonoButtonCoreClass.prototype, "_isActive", void 0);
|
|
588
|
+
__decorate([state()], MonoButtonCoreClass.prototype, "_hasIcon", void 0);
|
|
589
|
+
__decorate([state()], MonoButtonCoreClass.prototype, "_hasPrepend", void 0);
|
|
590
|
+
__decorate([state()], MonoButtonCoreClass.prototype, "_hasAppend", void 0);
|
|
591
|
+
__decorate([state()], MonoButtonCoreClass.prototype, "_pending", void 0);
|
|
592
|
+
__decorate([state()], MonoButtonCoreClass.prototype, "_running", void 0);
|
|
593
|
+
__decorate([query("div > button, div > a")], MonoButtonCoreClass.prototype, "_buttonElement", void 0);
|
|
594
|
+
return MonoButtonCoreClass;
|
|
595
|
+
};
|
|
596
|
+
//#endregion
|
|
597
|
+
//#region src/components/button/button.css?raw
|
|
598
|
+
var button_default = "/* =========================================================================\r\n mono-button — a port of Basecoat's `.btn` (basecoat-css@1.0.2, vega style).\r\n\r\n Styled by ATTRIBUTE, like Basecoat (`.btn[data-size='sm']`) — and the\r\n attributes mirror the element's props one for one, so hand-written markup\r\n reads like the Lit / Vue tag:\r\n\r\n <mono-button size=\"sm\" color=\"danger\" variant=\"outline\" rounded=\"full\">\r\n <div mono-button mono-size=\"sm\" mono-color=\"danger\" mono-variant=\"outline\" mono-rounded=\"full\">\r\n <button>…</button>\r\n </div>\r\n\r\n An absent attribute is the prop's default (`:not([mono-size])` = md,\r\n `:not([mono-color])` = primary, `:not([mono-variant])` = solid). The element\r\n renders these attributes on its wrapper (both builds); the old classes\r\n (`.mono-button.sm.outline-primary`) are still emitted as inert hooks for\r\n consumer CSS until 2.0 but no rule here reads them.\r\n\r\n Selector map (ours ≡ upstream):\r\n [mono-button] > :is(button, a) ≡ .btn\r\n [mono-size=\"xs|sm|md|lg\"] ≡ .btn[data-size='xs'|'sm'|default|'lg']\r\n [mono-size=\"xl|xxl\"] ≡ EXTENSION (h-11 / h-12 on the same grid)\r\n [mono-icon-only][mono-size=…] ≡ .btn[data-size='icon-<size>']\r\n [mono-variant=\"solid\"][mono-color=<hue>] ≡ .btn[data-variant='primary'] with the hue swapped\r\n [mono-variant=\"solid\"][mono-color=\"secondary\"]≡ .btn[data-variant='secondary']\r\n [mono-variant=\"solid\"][mono-color=\"light\"] ≡ .btn[data-variant='outline']\r\n [mono-variant=\"outline\"][mono-color=<hue>] ≡ EXTENSION (outline pattern, hue-inked)\r\n [mono-variant=\"tonal\"][mono-color=<hue>] ≡ .btn[data-variant='destructive'] with the hue swapped\r\n [mono-variant=\"text\"] ≡ .btn[data-variant='ghost'] (+ hue ink)\r\n [mono-link] ≡ .btn[data-variant='link']\r\n [mono-content] > [mono-icon]:first/last-child ≡ has-[[data-icon='inline-start'|'inline-end']]\r\n [mono-affix=\"prepend|append\"] ≡ .button-group siblings\r\n\r\n Inner parts are attributes too, so a hand-written button is attributes all\r\n the way down: [mono-native] on the <button>/<a>, [mono-content],\r\n [mono-icon] (+ [mono-spinning] / [mono-empty] / [mono-hidden]), [mono-text],\r\n [mono-badge=\"red|green|orange|cobalt\"], [mono-affix=\"prepend|append\"]\r\n (+ [mono-divider] / [mono-disabled] / [mono-empty]).\r\n\r\n Values are copied from the compiled vendor sheet (vendor/basecoat/basecoat-\r\n vega.cdn.css) through the token layer: `--spacing` → `--mono-spacing`,\r\n `--text-sm` → `--mono-text-sm`, `--radius-md` → `--mono-radius-md`,\r\n `--color-x` → `--x`, Tailwind's `--tw-ring-*` stack → the two-slot\r\n `box-shadow: ring, shadow` below, and every `dark:` variant → a\r\n `--mono-mode-*` token (a selector cannot cross a shadow boundary; an\r\n inherited custom property can).\r\n\r\n FLAVORS (Basecoat's other seven styles, src/data/theme/flavors/*.css) set the\r\n `--mono-button-<size>-*` style knobs read below — `-radius`, `-padding-inline`,\r\n `-icon-padding`, `-gap`, `-font-size`, `-line-height`, `-icon-size` — plus\r\n `--mono-button-font-weight` / `-text-transform` / `-letter-spacing` /\r\n `-icon-size` / `-outline-shadow` / `-outline-bg` / `-outline-hover-bg` /\r\n `-link-decoration`. Every fallback here is vega's value\r\n (`node scripts/basecoat-styles.mjs --varying \"^\\.btn\"` prints the matrix).\r\n\r\n The public `--mono-button-*` knobs and the three-tier resolver\r\n (`--mono-button-x` → `--_mono-button-x-preset` → base) are unchanged: a\r\n colour/variant class only ever writes a `*-preset` slot, so a consumer's\r\n own `--mono-button-bg` on the host still wins.\r\n ========================================================================= */\r\n\r\nmono-button {\r\n display: inline-block;\r\n}\r\n\r\n[mono-button] {\r\n /* ── palette: each slot is a public knob over a Basecoat token ─────────── */\r\n --_mono-button-primary: var(--mono-button-primary, var(--primary));\r\n --_mono-button-primary-foreground: var(--mono-button-primary-foreground, var(--primary-foreground));\r\n --_mono-button-secondary: var(--mono-button-secondary, var(--secondary));\r\n --_mono-button-secondary-foreground: var(--mono-button-secondary-foreground, var(--secondary-foreground));\r\n --_mono-button-success: var(--mono-button-success, var(--success));\r\n --_mono-button-success-foreground: var(--mono-button-success-foreground, var(--success-foreground));\r\n --_mono-button-danger: var(--mono-button-danger, var(--destructive));\r\n --_mono-button-danger-foreground: var(--mono-button-danger-foreground, var(--destructive-foreground));\r\n --_mono-button-warning: var(--mono-button-warning, var(--warning));\r\n --_mono-button-warning-foreground: var(--mono-button-warning-foreground, var(--warning-foreground));\r\n --_mono-button-info: var(--mono-button-info, var(--info));\r\n --_mono-button-info-foreground: var(--mono-button-info-foreground, var(--info-foreground));\r\n --_mono-button-teal: var(--mono-button-teal, var(--teal));\r\n --_mono-button-teal-foreground: var(--mono-button-teal-foreground, var(--teal-foreground));\r\n --_mono-button-purple: var(--mono-button-purple, var(--purple));\r\n --_mono-button-purple-foreground: var(--mono-button-purple-foreground, var(--purple-foreground));\r\n --_mono-button-dark: var(--mono-button-dark, var(--dark));\r\n --_mono-button-dark-foreground: var(--mono-button-dark-foreground, var(--dark-foreground));\r\n --_mono-button-neutral: var(--mono-button-neutral, var(--neutral));\r\n --_mono-button-neutral-foreground: var(--mono-button-neutral-foreground, var(--neutral-foreground));\r\n --_mono-button-text: var(--mono-button-text, var(--foreground));\r\n --_mono-button-background: var(--mono-button-background, var(--background));\r\n --_mono-button-muted: var(--mono-button-muted, var(--muted));\r\n --_mono-button-border: var(--mono-button-border, var(--mono-mode-outline-border));\r\n\r\n /* ── tonal tint ramp: `bg-x/10 hover:bg-x/20` (dark 20 / 30) ────────────\r\n One alpha pair for every hue instead of the old srgb-with-white mixes;\r\n the per-colour `--mono-button-<c>-soft(-hover)` knobs below still win. */\r\n --_mono-button-tint: var(--mono-button-tint, var(--mono-mode-tint));\r\n --_mono-button-tint-hover: var(--mono-button-tint-hover, var(--mono-mode-tint-hover));\r\n --_mono-button-primary-soft: var(--mono-button-primary-soft, color-mix(in oklab, var(--_mono-button-primary) var(--_mono-button-tint), transparent));\r\n --_mono-button-primary-soft-hover: var(--mono-button-primary-soft-hover, color-mix(in oklab, var(--_mono-button-primary) var(--_mono-button-tint-hover), transparent));\r\n --_mono-button-success-soft: var(--mono-button-success-soft, color-mix(in oklab, var(--_mono-button-success) var(--_mono-button-tint), transparent));\r\n --_mono-button-success-soft-hover: var(--mono-button-success-soft-hover, color-mix(in oklab, var(--_mono-button-success) var(--_mono-button-tint-hover), transparent));\r\n --_mono-button-danger-soft: var(--mono-button-danger-soft, color-mix(in oklab, var(--_mono-button-danger) var(--_mono-button-tint), transparent));\r\n --_mono-button-danger-soft-hover: var(--mono-button-danger-soft-hover, color-mix(in oklab, var(--_mono-button-danger) var(--_mono-button-tint-hover), transparent));\r\n --_mono-button-warning-soft: var(--mono-button-warning-soft, color-mix(in oklab, var(--_mono-button-warning) var(--_mono-button-tint), transparent));\r\n --_mono-button-warning-soft-hover: var(--mono-button-warning-soft-hover, color-mix(in oklab, var(--_mono-button-warning) var(--_mono-button-tint-hover), transparent));\r\n --_mono-button-info-soft: var(--mono-button-info-soft, color-mix(in oklab, var(--_mono-button-info) var(--_mono-button-tint), transparent));\r\n --_mono-button-info-soft-hover: var(--mono-button-info-soft-hover, color-mix(in oklab, var(--_mono-button-info) var(--_mono-button-tint-hover), transparent));\r\n --_mono-button-teal-soft: var(--mono-button-teal-soft, color-mix(in oklab, var(--_mono-button-teal) var(--_mono-button-tint), transparent));\r\n --_mono-button-teal-soft-hover: var(--mono-button-teal-soft-hover, color-mix(in oklab, var(--_mono-button-teal) var(--_mono-button-tint-hover), transparent));\r\n --_mono-button-purple-soft: var(--mono-button-purple-soft, color-mix(in oklab, var(--_mono-button-purple) var(--_mono-button-tint), transparent));\r\n --_mono-button-purple-soft-hover: var(--mono-button-purple-soft-hover, color-mix(in oklab, var(--_mono-button-purple) var(--_mono-button-tint-hover), transparent));\r\n --_mono-button-dark-soft: var(--mono-button-dark-soft, color-mix(in oklab, var(--_mono-button-dark) var(--_mono-button-tint), transparent));\r\n --_mono-button-dark-soft-hover: var(--mono-button-dark-soft-hover, color-mix(in oklab, var(--_mono-button-dark) var(--_mono-button-tint-hover), transparent));\r\n --_mono-button-neutral-soft: var(--mono-button-neutral-soft, color-mix(in oklab, var(--_mono-button-neutral) var(--_mono-button-tint), transparent));\r\n --_mono-button-neutral-soft-hover: var(--mono-button-neutral-soft-hover, color-mix(in oklab, var(--_mono-button-neutral) var(--_mono-button-tint-hover), transparent));\r\n\r\n /* ── corner: .btn is rounded-md; xs/sm clamp it (set by the size classes) ── */\r\n --_mono-button-radius: var(--mono-button-radius, var(--_mono-button-radius-preset, var(--mono-button-md-radius, var(--mono-radius-md))));\r\n\r\n /* ── focus ring colour: `--ring`, or the hue for tonal (destructive idiom) ── */\r\n --_mono-button-ring-color: var(--mono-button-ring-color, var(--_mono-button-ring-color-preset, var(--ring)));\r\n\r\n /* ── the painted result — three tiers, base = .btn[data-variant='primary'] ── */\r\n --_mono-button-bg: var(--mono-button-bg, var(--_mono-button-bg-preset, var(--_mono-button-primary)));\r\n --_mono-button-color: var(--mono-button-color, var(--_mono-button-color-preset, var(--_mono-button-primary-foreground)));\r\n --_mono-button-border-color: var(--mono-button-border-color, var(--_mono-button-border-color-preset, transparent));\r\n --_mono-button-shadow: var(--mono-button-shadow, var(--_mono-button-shadow-preset, 0 0 #0000));\r\n /* Hover falls back to the RESTING colour at 80% (`hover:bg-primary/80`), so a\r\n consumer who overrides only the resting colour keeps a matching hover. */\r\n --_mono-button-hover-bg: var(--mono-button-hover-bg, var(--_mono-button-hover-bg-preset, color-mix(in oklab, var(--_mono-button-bg) 80%, transparent)));\r\n --_mono-button-hover-color: var(--mono-button-hover-color, var(--_mono-button-hover-color-preset, var(--_mono-button-color)));\r\n --_mono-button-hover-border-color: var(--mono-button-hover-border-color, var(--_mono-button-hover-border-color-preset, var(--_mono-button-border-color)));\r\n --_mono-button-hover-shadow: var(--mono-button-hover-shadow, var(--_mono-button-hover-shadow-preset, var(--_mono-button-shadow)));\r\n\r\n /* ── box: how much room the control takes, and where its content sits ────\r\n Both are `auto` / `center` for a standalone button. They exist as KNOBS\r\n because a button placed inside another component's list — a\r\n `mono-button-dropdown` menu row — has to stretch and left-align, and that\r\n component cannot reach the control with a selector: in the shadow build the\r\n control lives behind a boundary. An inherited custom property crosses it. */\r\n --_mono-button-width: var(--mono-button-width, auto);\r\n --_mono-button-justify: var(--mono-button-justify, center);\r\n /* The press nudge, as a knob for the same reason: a list row must not twitch\r\n under the pointer, and the menu that holds it cannot reach the control. */\r\n --_mono-button-press-translate: var(--mono-button-press-translate, 0 1px);\r\n\r\n /* The focus / invalid ring slot — `0 0 #0000` until a state sets it. Kept as a\r\n slot so a variant can neutralise the resting shadow without ever writing\r\n `box-shadow: none` (which would out-specify the ring). */\r\n --_mono-button-ring: 0 0 #0000;\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n position: relative;\r\n font-family: inherit;\r\n user-select: none;\r\n cursor: pointer;\r\n text-decoration: none;\r\n width: var(--_mono-button-width);\r\n /* ALWAYS transparent — reserves the control's 1px border on the wrapper so\r\n the wrapper matches the control's outer box. Not `--mono-button-border-color`:\r\n that is declared HERE for the affix zones, and painting it would ring the\r\n control twice. */\r\n border: var(--mono-border-width) solid transparent;\r\n}\r\n\r\n/* A page-level `* { box-sizing: border-box }` reset does NOT cross a shadow\r\n boundary; scoped here so the `<a>` form of an icon-only button measures the\r\n same in both builds. */\r\n[mono-button],\r\n[mono-button] * {\r\n box-sizing: border-box;\r\n}\r\n\r\n/* =========================================\r\n The control\r\n ========================================= */\r\n\r\n/* basecoat@1.0.2 components/button.css .btn */\r\n/* basecoat@1.0.2 styles/vega.css .btn — mono: `--tw-ring-*` stack flattened to\r\n the ring + shadow slots; the label font/transform are public knobs so a\r\n flavor reaches the shadow build */\r\n[mono-button] > :is(button, a) {\r\n --_mono-button-font-weight: var(--mono-button-font-weight, var(--mono-font-weight-medium));\r\n --_mono-button-text-transform: var(--mono-button-text-transform, none);\r\n --_mono-button-letter-spacing: var(--mono-button-letter-spacing, normal);\r\n\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: var(--_mono-button-justify);\r\n width: var(--_mono-button-width);\r\n position: relative;\r\n white-space: nowrap;\r\n user-select: none;\r\n cursor: pointer;\r\n text-decoration: none;\r\n outline-style: none;\r\n border-radius: var(--_mono-button-radius);\r\n border: var(--mono-border-width) solid var(--_mono-button-border-color);\r\n background-clip: padding-box;\r\n background: var(--_mono-button-bg);\r\n color: var(--_mono-button-color);\r\n box-shadow: var(--_mono-button-ring), var(--_mono-button-shadow);\r\n font-family: inherit;\r\n font-size: var(--mono-text-sm);\r\n line-height: var(--mono-text-sm--lh);\r\n font-weight: var(--_mono-button-font-weight);\r\n text-transform: var(--_mono-button-text-transform);\r\n letter-spacing: var(--_mono-button-letter-spacing);\r\n transition-property: all;\r\n transition-timing-function: var(--mono-ease);\r\n transition-duration: var(--mono-duration);\r\n\r\n /* focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 */\r\n &:focus-visible {\r\n border-color: var(--_mono-button-ring-color);\r\n --_mono-button-ring: 0 0 0 var(--mono-ring-width) color-mix(in oklab, var(--_mono-button-ring-color) var(--mono-ring-alpha), transparent);\r\n }\r\n\r\n /* aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20\r\n (dark: border /50, ring /40 — carried by the mode tokens) */\r\n &[aria-invalid='true'] {\r\n border-color: var(--mono-mode-invalid-border);\r\n --_mono-button-ring: 0 0 0 var(--mono-ring-width) var(--mono-mode-invalid-ring);\r\n }\r\n\r\n /* active:not-aria-[haspopup]:translate-y-px */\r\n &:active:not([aria-haspopup]):not([mono-disabled]):not(:disabled) {\r\n translate: var(--_mono-button-press-translate);\r\n }\r\n\r\n /* disabled:pointer-events-none disabled:opacity-50 */\r\n &:disabled,\r\n &[mono-disabled] {\r\n pointer-events: none;\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n & svg,\r\n & [mono-icon] {\r\n pointer-events: none;\r\n flex-shrink: 0;\r\n }\r\n}\r\n\r\n/* Every Basecoat hover sits behind `@media (hover: hover)`: no sticky hover on touch. */\r\n@media (hover: hover) {\r\n [mono-button] > :is(button, a):hover:not([mono-disabled]):not(:disabled) {\r\n background: var(--_mono-button-hover-bg);\r\n color: var(--_mono-button-hover-color);\r\n border-color: var(--_mono-button-hover-border-color);\r\n --_mono-button-shadow: var(--_mono-button-hover-shadow);\r\n }\r\n}\r\n\r\n/* =========================================\r\n Sizes — the control height IS the token (see tests/perf/field-heights)\r\n ========================================= */\r\n\r\n/* The unqualified control carries the `md` metrics ON PURPOSE: hand-written\r\n `<div mono-button>` markup that names no size renders exactly like `size=\"md\"`. */\r\n/* basecoat@1.0.2 styles/vega.css .btn:not([data-size]), .btn[data-size='default'] — h-9 gap-1.5 px-2.5 */\r\n[mono-button]:not([mono-icon-only]) > :is(button, a) {\r\n --_mono-button-gap: var(--mono-button-md-gap, calc(var(--mono-spacing) * 1.5));\r\n --_mono-button-icon-padding: var(--mono-button-md-icon-padding, calc(var(--mono-spacing) * 2));\r\n min-height: var(--mono-control-height-md);\r\n padding-inline: var(--mono-button-md-padding-inline, calc(var(--mono-spacing) * 2.5));\r\n padding-block: 0;\r\n font-size: var(--mono-button-md-font-size, var(--mono-text-sm));\r\n line-height: var(--mono-button-md-line-height, var(--mono-text-sm--lh));\r\n}\r\n\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-size='xs'] — h-6 gap-1 px-2 text-xs rounded-[min(var(--radius-md),8px)] */\r\n[mono-button][mono-size=\"xs\"] {\r\n --_mono-button-radius-preset: var(--mono-button-xs-radius, min(var(--mono-radius-md), 8px));\r\n}\r\n[mono-button][mono-size=\"xs\"]:not([mono-icon-only]) > :is(button, a) {\r\n --_mono-button-gap: var(--mono-button-xs-gap, var(--mono-spacing));\r\n --_mono-button-icon-padding: var(--mono-button-xs-icon-padding, calc(var(--mono-spacing) * 1.5));\r\n min-height: var(--mono-control-height-xs);\r\n padding-inline: var(--mono-button-xs-padding-inline, calc(var(--mono-spacing) * 2));\r\n font-size: var(--mono-button-xs-font-size, var(--mono-text-xs));\r\n line-height: var(--mono-button-xs-line-height, var(--mono-text-xs--lh));\r\n}\r\n\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-size='sm'] — h-8 gap-1 px-2.5 rounded-[min(var(--radius-md),10px)] */\r\n[mono-button][mono-size=\"sm\"] {\r\n --_mono-button-radius-preset: var(--mono-button-sm-radius, min(var(--mono-radius-md), 10px));\r\n}\r\n[mono-button][mono-size=\"sm\"]:not([mono-icon-only]) > :is(button, a) {\r\n --_mono-button-gap: var(--mono-button-sm-gap, var(--mono-spacing));\r\n --_mono-button-icon-padding: var(--mono-button-sm-icon-padding, calc(var(--mono-spacing) * 1.5));\r\n min-height: var(--mono-control-height-sm);\r\n padding-inline: var(--mono-button-sm-padding-inline, calc(var(--mono-spacing) * 2.5));\r\n font-size: var(--mono-button-sm-font-size, var(--mono-button-md-font-size, var(--mono-text-sm)));\r\n line-height: var(--mono-button-sm-line-height, var(--mono-button-md-line-height, var(--mono-text-sm--lh)));\r\n}\r\n\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-size='lg'] — h-10 gap-1.5 px-2.5 */\r\n[mono-button][mono-size=\"lg\"]:not([mono-icon-only]) > :is(button, a) {\r\n --_mono-button-gap: var(--mono-button-lg-gap, calc(var(--mono-spacing) * 1.5));\r\n --_mono-button-icon-padding: var(--mono-button-lg-icon-padding, calc(var(--mono-spacing) * 2));\r\n min-height: var(--mono-control-height-lg);\r\n padding-inline: var(--mono-button-lg-padding-inline, calc(var(--mono-spacing) * 2.5));\r\n font-size: var(--mono-button-lg-font-size, var(--mono-button-md-font-size, var(--mono-text-sm)));\r\n line-height: var(--mono-button-lg-line-height, var(--mono-button-md-line-height, var(--mono-text-sm--lh)));\r\n}\r\n\r\n/* EXTENSION — xl / xxl continue the grid: h-11 gap-2 px-3 text-base, h-12 gap-2 px-4 text-lg */\r\n[mono-button][mono-size=\"xl\"]:not([mono-icon-only]) > :is(button, a) {\r\n --_mono-button-gap: var(--mono-button-xl-gap, calc(var(--mono-spacing) * 2));\r\n --_mono-button-icon-padding: var(--mono-button-xl-icon-padding, calc(var(--mono-spacing) * 2.5));\r\n min-height: var(--mono-control-height-xl);\r\n padding-inline: var(--mono-button-xl-padding-inline, calc(var(--mono-spacing) * 3));\r\n font-size: var(--mono-button-xl-font-size, var(--mono-text-base));\r\n line-height: var(--mono-button-xl-line-height, var(--mono-text-base--lh));\r\n}\r\n[mono-button][mono-size=\"xxl\"]:not([mono-icon-only]) > :is(button, a) {\r\n --_mono-button-gap: var(--mono-button-xxl-gap, calc(var(--mono-spacing) * 2));\r\n --_mono-button-icon-padding: var(--mono-button-xxl-icon-padding, calc(var(--mono-spacing) * 3));\r\n min-height: var(--mono-control-height-xxl);\r\n padding-inline: var(--mono-button-xxl-padding-inline, calc(var(--mono-spacing) * 4));\r\n font-size: var(--mono-button-xxl-font-size, var(--mono-text-lg));\r\n line-height: var(--mono-button-xxl-line-height, var(--mono-text-lg--lh));\r\n}\r\n\r\n/* has-[[data-icon='inline-start']]:pl-2 / has-[[data-icon='inline-end']]:pr-2\r\n (xs/sm: 1.5). Our icon box is the first or last child of `[mono-content]`\r\n depending on `icon-position`; `:not([mono-empty])` is the light /\r\n shadow spelling of \"there is something in it\" — an icon OR the spinner that\r\n replaces it, so both builds tighten the same side while loading. */\r\n[mono-button] > :is(button, a):has(> [mono-content] > [mono-icon]:first-child:not([mono-empty])) {\r\n padding-left: var(--_mono-button-icon-padding);\r\n}\r\n[mono-button] > :is(button, a):has(> [mono-content] > [mono-icon]:last-child:not([mono-empty])) {\r\n padding-right: var(--_mono-button-icon-padding);\r\n}\r\n\r\n/* Icon-only: a square of the control height.\r\n basecoat@1.0.2 styles/vega.css .btn[data-size='icon'] — size-9 (md) */\r\n[mono-button][mono-icon-only] > :is(button, a) {\r\n width: var(--mono-control-height-md);\r\n height: var(--mono-control-height-md);\r\n padding: 0;\r\n}\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-size='icon-xs'] — size-6 rounded-[min(var(--radius-md),8px)] */\r\n[mono-button][mono-icon-only][mono-size=\"xs\"] > :is(button, a) {\r\n width: var(--mono-control-height-xs);\r\n height: var(--mono-control-height-xs);\r\n}\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-size='icon-sm'] — size-8 rounded-[min(var(--radius-md),10px)] */\r\n[mono-button][mono-icon-only][mono-size=\"sm\"] > :is(button, a) {\r\n width: var(--mono-control-height-sm);\r\n height: var(--mono-control-height-sm);\r\n}\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-size='icon-lg'] — size-10 */\r\n[mono-button][mono-icon-only][mono-size=\"lg\"] > :is(button, a) {\r\n width: var(--mono-control-height-lg);\r\n height: var(--mono-control-height-lg);\r\n}\r\n/* EXTENSION — size-11 / size-12 */\r\n[mono-button][mono-icon-only][mono-size=\"xl\"] > :is(button, a) {\r\n width: var(--mono-control-height-xl);\r\n height: var(--mono-control-height-xl);\r\n}\r\n[mono-button][mono-icon-only][mono-size=\"xxl\"] > :is(button, a) {\r\n width: var(--mono-control-height-xxl);\r\n height: var(--mono-control-height-xxl);\r\n}\r\n\r\n/* =========================================\r\n Content\r\n ========================================= */\r\n\r\n[mono-button] [mono-content] {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--_mono-button-gap, calc(var(--mono-spacing) * 1.5));\r\n min-width: 0;\r\n line-height: inherit;\r\n}\r\n\r\n[mono-button] [mono-text] {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 0;\r\n position: relative;\r\n transition: opacity var(--mono-duration) var(--mono-ease);\r\n}\r\n\r\n/* The icon box. `[&_svg:not([class*='size-'])]:size-4` (xs: size-3) — our\r\n icons are UnoCSS `i-*` mask spans as often as SVGs, so the box itself is\r\n sized and whatever is inside fills it. Every rule is scoped under\r\n [mono-button] so a consumer's own [mono-icon] elsewhere is untouched. */\r\n[mono-button] [mono-icon] {\r\n --_mono-button-icon-size: var(--mono-button-md-icon-size, var(--mono-button-icon-size, calc(var(--mono-spacing) * 4)));\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: 0 0 auto;\r\n width: var(--_mono-button-icon-size);\r\n height: var(--_mono-button-icon-size);\r\n line-height: 1;\r\n}\r\n\r\n[mono-button][mono-size=\"xs\"] [mono-icon] {\r\n --_mono-button-icon-size: var(--mono-button-xs-icon-size, calc(var(--mono-spacing) * 3));\r\n}\r\n[mono-button][mono-icon-only]:is(:not([mono-size]), [mono-size=\"md\"]) [mono-icon] {\r\n --_mono-button-icon-size: var(--mono-button-icononly-md-icon-size, var(--mono-button-md-icon-size, var(--mono-button-icon-size, calc(var(--mono-spacing) * 4))));\r\n}\r\n[mono-button][mono-size=\"sm\"] [mono-icon] {\r\n --_mono-button-icon-size: var(--mono-button-sm-icon-size, var(--mono-button-icon-size, calc(var(--mono-spacing) * 4)));\r\n}\r\n[mono-button][mono-size=\"lg\"] [mono-icon] {\r\n --_mono-button-icon-size: var(--mono-button-lg-icon-size, var(--mono-button-icon-size, calc(var(--mono-spacing) * 4)));\r\n}\r\n\r\n/* EXTENSION — the two larger steps get a size-5 glyph */\r\n[mono-button]:is([mono-size=\"xl\"], [mono-size=\"xxl\"]) [mono-icon] {\r\n --_mono-button-icon-size: var(--mono-button-xl-icon-size, calc(var(--mono-spacing) * 5));\r\n}\r\n\r\n[mono-button] [mono-icon] > svg,\r\n[mono-button] [mono-icon] > span,\r\n[mono-button] [mono-icon] > * {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n/* The SHADOW build's icon arrives through a `<slot>`; `[mono-icon] > svg`\r\n cannot reach assigned nodes. Inert in the light build. */\r\n[mono-button] [mono-icon] ::slotted(svg),\r\n[mono-button] [mono-icon] ::slotted(*) {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n[mono-button] [mono-icon][mono-hidden] {\r\n display: none !important;\r\n}\r\n\r\n/* =========================================\r\n Badge (mono extension; painted with the role tokens) — `mono-badge` takes the\r\n `badge-color` value: red (default) | green | orange | cobalt\r\n ========================================= */\r\n\r\n[mono-button] > :is(button, a) [mono-badge] {\r\n position: absolute;\r\n top: calc(var(--mono-spacing) * -1);\r\n right: calc(var(--mono-spacing) * -1);\r\n min-width: calc(var(--mono-spacing) * 5);\r\n height: calc(var(--mono-spacing) * 5);\r\n padding: 0 calc(var(--mono-spacing) * 1.5);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--mono-radius-full);\r\n font-size: var(--mono-text-xs);\r\n line-height: 1;\r\n font-weight: var(--mono-font-weight-semibold);\r\n pointer-events: none;\r\n}\r\n\r\n[mono-button] [mono-badge]:is(:not([mono-badge=\"\"]), [mono-badge=\"red\"]):not([mono-badge=\"green\"]):not([mono-badge=\"orange\"]):not([mono-badge=\"cobalt\"]) {\r\n background-color: var(--_mono-button-danger);\r\n color: var(--_mono-button-danger-foreground);\r\n}\r\n\r\n[mono-button] [mono-badge=\"green\"] {\r\n background-color: var(--_mono-button-success);\r\n color: var(--_mono-button-success-foreground);\r\n}\r\n\r\n[mono-button] [mono-badge=\"orange\"] {\r\n background-color: var(--_mono-button-warning);\r\n color: var(--_mono-button-warning-foreground);\r\n}\r\n\r\n[mono-button] [mono-badge=\"cobalt\"] {\r\n background-color: var(--_mono-button-primary);\r\n color: var(--_mono-button-primary-foreground);\r\n}\r\n\r\n/* =========================================\r\n Colours\r\n -----------------------------------------\r\n `mono-color` × `mono-variant` (solid | outline | tonal | text). Two kinds of\r\n colour:\r\n\r\n hues primary success danger warning info teal purple dark\r\n ink = the colour, fill = the colour, on-fill = `--<c>-foreground`\r\n surfaces secondary (shadcn's muted surface — NOT a second brand hue)\r\n light (the page background)\r\n\r\n Each hue publishes its palette into `--_mono-button-c*`, and ONE rule per\r\n variant does the styling; the two layers set disjoint properties, so their\r\n order does not matter. No attribute = the default (primary / solid).\r\n ========================================= */\r\n\r\n[mono-button]:is(:not([mono-color]), [mono-color=\"primary\"]) {\r\n --_mono-button-c: var(--_mono-button-primary);\r\n --_mono-button-c-foreground: var(--_mono-button-primary-foreground);\r\n --_mono-button-c-soft: var(--_mono-button-primary-soft);\r\n --_mono-button-c-soft-hover: var(--_mono-button-primary-soft-hover);\r\n}\r\n[mono-button][mono-color=\"success\"] {\r\n --_mono-button-c: var(--_mono-button-success);\r\n --_mono-button-c-foreground: var(--_mono-button-success-foreground);\r\n --_mono-button-c-soft: var(--_mono-button-success-soft);\r\n --_mono-button-c-soft-hover: var(--_mono-button-success-soft-hover);\r\n}\r\n[mono-button][mono-color=\"danger\"] {\r\n --_mono-button-c: var(--_mono-button-danger);\r\n --_mono-button-c-foreground: var(--_mono-button-danger-foreground);\r\n --_mono-button-c-soft: var(--_mono-button-danger-soft);\r\n --_mono-button-c-soft-hover: var(--_mono-button-danger-soft-hover);\r\n}\r\n[mono-button][mono-color=\"warning\"] {\r\n --_mono-button-c: var(--_mono-button-warning);\r\n --_mono-button-c-foreground: var(--_mono-button-warning-foreground);\r\n --_mono-button-c-soft: var(--_mono-button-warning-soft);\r\n --_mono-button-c-soft-hover: var(--_mono-button-warning-soft-hover);\r\n}\r\n[mono-button][mono-color=\"info\"] {\r\n --_mono-button-c: var(--_mono-button-info);\r\n --_mono-button-c-foreground: var(--_mono-button-info-foreground);\r\n --_mono-button-c-soft: var(--_mono-button-info-soft);\r\n --_mono-button-c-soft-hover: var(--_mono-button-info-soft-hover);\r\n}\r\n[mono-button][mono-color=\"teal\"] {\r\n --_mono-button-c: var(--_mono-button-teal);\r\n --_mono-button-c-foreground: var(--_mono-button-teal-foreground);\r\n --_mono-button-c-soft: var(--_mono-button-teal-soft);\r\n --_mono-button-c-soft-hover: var(--_mono-button-teal-soft-hover);\r\n}\r\n[mono-button][mono-color=\"purple\"] {\r\n --_mono-button-c: var(--_mono-button-purple);\r\n --_mono-button-c-foreground: var(--_mono-button-purple-foreground);\r\n --_mono-button-c-soft: var(--_mono-button-purple-soft);\r\n --_mono-button-c-soft-hover: var(--_mono-button-purple-soft-hover);\r\n}\r\n[mono-button][mono-color=\"dark\"] {\r\n --_mono-button-c: var(--_mono-button-dark);\r\n --_mono-button-c-foreground: var(--_mono-button-dark-foreground);\r\n --_mono-button-c-soft: var(--_mono-button-dark-soft);\r\n --_mono-button-c-soft-hover: var(--_mono-button-dark-soft-hover);\r\n}\r\n/* neutral — the mid grey with white ink (chip / card have it; the form demos'\r\n Discard buttons used it and silently painted primary). */\r\n[mono-button][mono-color=\"neutral\"] {\r\n --_mono-button-c: var(--_mono-button-neutral);\r\n --_mono-button-c-foreground: var(--_mono-button-neutral-foreground);\r\n --_mono-button-c-soft: var(--_mono-button-neutral-soft);\r\n --_mono-button-c-soft-hover: var(--_mono-button-neutral-soft-hover);\r\n}\r\n\r\n/* ── solid ────────────────────────────────────────────────────────────── */\r\n\r\n/* basecoat@1.0.2 styles/vega.css .btn:not([data-variant]), .btn[data-variant='primary']\r\n — bg-primary text-primary-foreground hover:bg-primary/80, generalised per hue */\r\n[mono-button]:is(:not([mono-variant]), [mono-variant=\"solid\"]):is(:not([mono-color]), [mono-color=\"primary\"], [mono-color=\"success\"], [mono-color=\"danger\"], [mono-color=\"warning\"], [mono-color=\"info\"], [mono-color=\"teal\"], [mono-color=\"purple\"], [mono-color=\"dark\"], [mono-color=\"neutral\"]) {\r\n --_mono-button-bg-preset: var(--_mono-button-c);\r\n --_mono-button-color-preset: var(--_mono-button-c-foreground);\r\n --_mono-button-border-color-preset: transparent;\r\n --_mono-button-shadow-preset: 0 0 #0000;\r\n --_mono-button-hover-bg-preset: color-mix(in oklab, var(--_mono-button-c) 80%, transparent);\r\n --_mono-button-hover-color-preset: var(--_mono-button-c-foreground);\r\n --_mono-button-hover-border-color-preset: transparent;\r\n --_mono-button-hover-shadow-preset: 0 0 #0000;\r\n}\r\n\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-variant='secondary']\r\n — bg-secondary text-secondary-foreground hover:bg-[color-mix(in oklch,var(--secondary),var(--foreground) 5%)] */\r\n[mono-button]:is(:not([mono-variant]), [mono-variant=\"solid\"])[mono-color=\"secondary\"] {\r\n --_mono-button-bg-preset: var(--_mono-button-secondary);\r\n --_mono-button-color-preset: var(--_mono-button-secondary-foreground);\r\n --_mono-button-border-color-preset: transparent;\r\n --_mono-button-shadow-preset: 0 0 #0000;\r\n --_mono-button-hover-bg-preset: color-mix(in oklch, var(--_mono-button-secondary), var(--_mono-button-text) 5%);\r\n --_mono-button-hover-color-preset: var(--_mono-button-secondary-foreground);\r\n --_mono-button-hover-border-color-preset: transparent;\r\n --_mono-button-hover-shadow-preset: 0 0 #0000;\r\n}\r\n\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-variant='outline']\r\n — border-border bg-background shadow-xs hover:bg-muted hover:text-foreground\r\n dark:border-input dark:bg-input/30 dark:hover:bg-input/50 (mode tokens) */\r\n[mono-button]:is(:not([mono-variant]), [mono-variant=\"solid\"])[mono-color=\"light\"] {\r\n --_mono-button-bg-preset: var(--mono-button-outline-bg, var(--mono-mode-outline-bg));\r\n --_mono-button-color-preset: var(--_mono-button-text);\r\n --_mono-button-border-color-preset: var(--_mono-button-border);\r\n --_mono-button-shadow-preset: var(--mono-button-outline-shadow, var(--mono-shadow-xs));\r\n --_mono-button-hover-bg-preset: var(--mono-button-outline-hover-bg, var(--mono-mode-surface-hover));\r\n --_mono-button-hover-color-preset: var(--_mono-button-text);\r\n --_mono-button-hover-border-color-preset: var(--_mono-button-border);\r\n --_mono-button-hover-shadow-preset: var(--mono-button-outline-shadow, var(--mono-shadow-xs));\r\n}\r\n\r\n/* ── outline ──────────────────────────────────────────────────────────── */\r\n\r\n/* EXTENSION — the outline pattern inked in the hue: border + label in the\r\n colour, hover lays the tonal tint under it (Basecoat never inverts to a\r\n solid fill on hover). */\r\n[mono-button][mono-variant=\"outline\"]:is(:not([mono-color]), [mono-color=\"primary\"], [mono-color=\"success\"], [mono-color=\"danger\"], [mono-color=\"warning\"], [mono-color=\"info\"], [mono-color=\"teal\"], [mono-color=\"purple\"], [mono-color=\"dark\"], [mono-color=\"neutral\"]) {\r\n --_mono-button-bg-preset: transparent;\r\n --_mono-button-color-preset: var(--_mono-button-c);\r\n --_mono-button-border-color-preset: var(--_mono-button-c);\r\n --_mono-button-shadow-preset: var(--mono-button-outline-shadow, var(--mono-shadow-xs));\r\n --_mono-button-hover-bg-preset: var(--_mono-button-c-soft);\r\n --_mono-button-hover-color-preset: var(--_mono-button-c);\r\n --_mono-button-hover-border-color-preset: var(--_mono-button-c);\r\n --_mono-button-hover-shadow-preset: var(--mono-button-outline-shadow, var(--mono-shadow-xs));\r\n --_mono-button-ring-color-preset: var(--_mono-button-c);\r\n}\r\n\r\n/* EXTENSION — outline on the two surfaces: the vendor outline with a neutral border */\r\n[mono-button][mono-variant=\"outline\"][mono-color=\"secondary\"] {\r\n --_mono-button-bg-preset: transparent;\r\n --_mono-button-color-preset: var(--_mono-button-secondary-foreground);\r\n --_mono-button-border-color-preset: var(--_mono-button-border);\r\n --_mono-button-shadow-preset: var(--mono-button-outline-shadow, var(--mono-shadow-xs));\r\n --_mono-button-hover-bg-preset: var(--_mono-button-secondary);\r\n --_mono-button-hover-color-preset: var(--_mono-button-secondary-foreground);\r\n --_mono-button-hover-border-color-preset: var(--_mono-button-border);\r\n --_mono-button-hover-shadow-preset: var(--mono-button-outline-shadow, var(--mono-shadow-xs));\r\n}\r\n[mono-button][mono-variant=\"outline\"][mono-color=\"light\"] {\r\n --_mono-button-bg-preset: transparent;\r\n --_mono-button-color-preset: var(--_mono-button-text);\r\n --_mono-button-border-color-preset: var(--_mono-button-border);\r\n --_mono-button-shadow-preset: var(--mono-button-outline-shadow, var(--mono-shadow-xs));\r\n --_mono-button-hover-bg-preset: var(--mono-mode-surface-hover);\r\n --_mono-button-hover-color-preset: var(--_mono-button-text);\r\n --_mono-button-hover-border-color-preset: var(--_mono-button-border);\r\n --_mono-button-hover-shadow-preset: var(--mono-button-outline-shadow, var(--mono-shadow-xs));\r\n}\r\n\r\n/* ── tonal ────────────────────────────────────────────────────────────── */\r\n\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-variant='destructive']\r\n — bg-destructive/10 text-destructive hover:bg-destructive/20\r\n dark:bg-destructive/20 dark:hover:bg-destructive/30\r\n focus-visible:border-destructive/40 focus-visible:ring-destructive/20\r\n generalised per hue; the label keeps its colour so tonal never reads solid */\r\n[mono-button][mono-variant=\"tonal\"]:is(:not([mono-color]), [mono-color=\"primary\"], [mono-color=\"success\"], [mono-color=\"danger\"], [mono-color=\"warning\"], [mono-color=\"info\"], [mono-color=\"teal\"], [mono-color=\"purple\"], [mono-color=\"dark\"], [mono-color=\"neutral\"]) {\r\n --_mono-button-bg-preset: var(--_mono-button-c-soft);\r\n --_mono-button-color-preset: var(--_mono-button-c);\r\n --_mono-button-border-color-preset: transparent;\r\n --_mono-button-shadow-preset: 0 0 #0000;\r\n --_mono-button-hover-bg-preset: var(--_mono-button-c-soft-hover);\r\n --_mono-button-hover-color-preset: var(--_mono-button-c);\r\n --_mono-button-hover-border-color-preset: transparent;\r\n --_mono-button-hover-shadow-preset: 0 0 #0000;\r\n --_mono-button-ring-color-preset: var(--_mono-button-c);\r\n}\r\n[mono-button][mono-variant=\"tonal\"]:is(:not([mono-color]), [mono-color=\"primary\"], [mono-color=\"success\"], [mono-color=\"danger\"], [mono-color=\"warning\"], [mono-color=\"info\"], [mono-color=\"teal\"], [mono-color=\"purple\"], [mono-color=\"dark\"], [mono-color=\"neutral\"]) > :is(button, a):focus-visible {\r\n border-color: color-mix(in oklab, var(--_mono-button-c) 40%, transparent);\r\n --_mono-button-ring: 0 0 0 var(--mono-ring-width) color-mix(in oklab, var(--_mono-button-c) var(--_mono-button-tint-hover), transparent);\r\n}\r\n\r\n/* EXTENSION — tonal on the surfaces: the secondary / muted fill, hover at 80% */\r\n[mono-button][mono-variant=\"tonal\"][mono-color=\"secondary\"] {\r\n --_mono-button-bg-preset: var(--_mono-button-secondary);\r\n --_mono-button-color-preset: var(--_mono-button-secondary-foreground);\r\n --_mono-button-border-color-preset: transparent;\r\n --_mono-button-shadow-preset: 0 0 #0000;\r\n --_mono-button-hover-bg-preset: color-mix(in oklab, var(--_mono-button-secondary) 80%, transparent);\r\n --_mono-button-hover-color-preset: var(--_mono-button-secondary-foreground);\r\n --_mono-button-hover-border-color-preset: transparent;\r\n --_mono-button-hover-shadow-preset: 0 0 #0000;\r\n}\r\n[mono-button][mono-variant=\"tonal\"][mono-color=\"light\"] {\r\n --_mono-button-bg-preset: var(--_mono-button-muted);\r\n --_mono-button-color-preset: var(--_mono-button-text);\r\n --_mono-button-border-color-preset: transparent;\r\n --_mono-button-shadow-preset: 0 0 #0000;\r\n --_mono-button-hover-bg-preset: color-mix(in oklab, var(--_mono-button-muted) 80%, transparent);\r\n --_mono-button-hover-color-preset: var(--_mono-button-text);\r\n --_mono-button-hover-border-color-preset: transparent;\r\n --_mono-button-hover-shadow-preset: 0 0 #0000;\r\n}\r\n\r\n/* ── text (ghost) ─────────────────────────────────────────────────────── */\r\n\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-variant='ghost']\r\n — hover:bg-muted hover:text-foreground dark:hover:bg-muted/50\r\n generalised: a hue keeps its ink and hovers onto its own tint. The two\r\n `--mono-button-plain-*` reads are public knobs a flavor sets (Material's\r\n wash-only hover); they must stay literal `var(--mono-button-…)` here. */\r\n[mono-button][mono-variant=\"text\"]:is(:not([mono-color]), [mono-color=\"primary\"], [mono-color=\"success\"], [mono-color=\"danger\"], [mono-color=\"warning\"], [mono-color=\"info\"], [mono-color=\"teal\"], [mono-color=\"purple\"], [mono-color=\"dark\"], [mono-color=\"neutral\"]) {\r\n --_mono-button-bg-preset: transparent;\r\n --_mono-button-color-preset: var(--_mono-button-c);\r\n --_mono-button-border-color-preset: transparent;\r\n --_mono-button-shadow-preset: 0 0 #0000;\r\n --_mono-button-hover-bg-preset: var(--mono-button-plain-hover-bg, var(--_mono-button-c-soft));\r\n --_mono-button-hover-color-preset: var(--_mono-button-c);\r\n --_mono-button-hover-border-color-preset: var(--mono-button-plain-hover-border-color, transparent);\r\n --_mono-button-hover-shadow-preset: 0 0 #0000;\r\n}\r\n/* ghost verbatim for the two surfaces */\r\n[mono-button][mono-variant=\"text\"]:is([mono-color=\"secondary\"], [mono-color=\"light\"]) {\r\n --_mono-button-bg-preset: transparent;\r\n --_mono-button-color-preset: var(--_mono-button-text);\r\n --_mono-button-border-color-preset: transparent;\r\n --_mono-button-shadow-preset: 0 0 #0000;\r\n --_mono-button-hover-bg-preset: var(--mono-button-plain-hover-bg, var(--mono-mode-ghost-hover));\r\n --_mono-button-hover-color-preset: var(--_mono-button-text);\r\n --_mono-button-hover-border-color-preset: var(--mono-button-plain-hover-border-color, transparent);\r\n --_mono-button-hover-shadow-preset: 0 0 #0000;\r\n}\r\n\r\n/* A text button has no chrome to anchor the focus ring against, so it also\r\n takes its hover look on keyboard focus — the ring still draws on top. */\r\n[mono-button][mono-variant=\"text\"] > :is(button, a):focus-visible {\r\n background: var(--_mono-button-hover-bg);\r\n color: var(--_mono-button-hover-color);\r\n}\r\n\r\n/* Pressing a text button carries it one rung further, onto the hover tint. */\r\n[mono-button][mono-variant=\"text\"]:is(:not([mono-color]), [mono-color=\"primary\"], [mono-color=\"success\"], [mono-color=\"danger\"], [mono-color=\"warning\"], [mono-color=\"info\"], [mono-color=\"teal\"], [mono-color=\"purple\"], [mono-color=\"dark\"], [mono-color=\"neutral\"]) > :is(button, a):active:not([mono-disabled]):not(:disabled) {\r\n background: var(--_mono-button-c-soft-hover);\r\n}\r\n\r\n/* =========================================\r\n Special types\r\n ========================================= */\r\n\r\n/* basecoat@1.0.2 styles/vega.css .btn[data-variant='link'] — text-primary underline-offset-4 hover:underline */\r\n[mono-button][mono-link] > :is(button, a) {\r\n --_mono-button-bg-preset: transparent;\r\n --_mono-button-color-preset: var(--_mono-button-primary);\r\n --_mono-button-border-color-preset: transparent;\r\n --_mono-button-shadow-preset: 0 0 #0000;\r\n --_mono-button-hover-bg-preset: transparent;\r\n --_mono-button-hover-color-preset: var(--_mono-button-primary);\r\n --_mono-button-hover-border-color-preset: transparent;\r\n --_mono-button-hover-shadow-preset: 0 0 #0000;\r\n text-underline-offset: 4px;\r\n text-decoration-line: var(--mono-button-link-decoration, none);\r\n}\r\n@media (hover: hover) {\r\n [mono-button][mono-link] > :is(button, a):hover {\r\n text-decoration-line: underline;\r\n }\r\n}\r\n\r\n/* EXTENSION — dashed: the outline surface with a dashed edge, primary ink */\r\n[mono-button][mono-dashed] > :is(button, a) {\r\n --_mono-button-bg-preset: var(--mono-mode-outline-bg);\r\n --_mono-button-color-preset: var(--_mono-button-primary);\r\n --_mono-button-border-color-preset: var(--_mono-button-border);\r\n --_mono-button-shadow-preset: 0 0 #0000;\r\n --_mono-button-hover-bg-preset: var(--_mono-button-primary-soft);\r\n --_mono-button-hover-color-preset: var(--_mono-button-primary);\r\n --_mono-button-hover-border-color-preset: var(--_mono-button-primary);\r\n --_mono-button-hover-shadow-preset: 0 0 #0000;\r\n border-style: dashed;\r\n}\r\n\r\n/* EXTENSION — glass: a translucent white surface for painted backgrounds */\r\n[mono-button][mono-glass] > :is(button, a) {\r\n --_mono-button-bg-preset: color-mix(in oklab, white 18%, transparent);\r\n --_mono-button-color-preset: white;\r\n --_mono-button-border-color-preset: color-mix(in oklab, white 30%, transparent);\r\n --_mono-button-shadow-preset: var(--mono-shadow-md);\r\n --_mono-button-hover-bg-preset: color-mix(in oklab, white 28%, transparent);\r\n --_mono-button-hover-color-preset: white;\r\n --_mono-button-hover-border-color-preset: color-mix(in oklab, white 50%, transparent);\r\n --_mono-button-hover-shadow-preset: var(--mono-shadow-lg);\r\n backdrop-filter: blur(10px);\r\n}\r\n\r\n/* =========================================\r\n Rounded — one prop for corners, on the Basecoat radius ladder\r\n -----------------------------------------\r\n Sets the PRESET rather than `border-radius`, so a consumer's own\r\n `--mono-button-radius` still wins without anything here needing\r\n `!important`. Steps map onto Basecoat's ladder: xs = radius-sm … xxl = 4xl.\r\n ========================================= */\r\n\r\n[mono-button][mono-rounded=\"none\"] { --_mono-button-radius-preset: 0; }\r\n[mono-button][mono-rounded=\"xs\"] { --_mono-button-radius-preset: var(--mono-radius-sm); }\r\n[mono-button][mono-rounded=\"sm\"] { --_mono-button-radius-preset: var(--mono-radius-md); }\r\n[mono-button][mono-rounded=\"md\"] { --_mono-button-radius-preset: var(--mono-radius-lg); }\r\n[mono-button][mono-rounded=\"lg\"] { --_mono-button-radius-preset: var(--mono-radius-xl); }\r\n[mono-button][mono-rounded=\"xl\"] { --_mono-button-radius-preset: var(--mono-radius-2xl); }\r\n[mono-button][mono-rounded=\"xxl\"] { --_mono-button-radius-preset: var(--mono-radius-4xl); }\r\n[mono-button][mono-rounded=\"full\"] { --_mono-button-radius-preset: var(--mono-radius-full); }\r\n\r\n/* =========================================\r\n Loading\r\n ========================================= */\r\n\r\n[mono-button][mono-loading] > :is(button, a) {\r\n position: relative;\r\n pointer-events: none;\r\n opacity: 0.85;\r\n}\r\n\r\n/* `pending` = self-driven loading that is still only WAITING (the debounce\r\n timer or the throttle queue). Clicks are let back through on purpose: a\r\n debounce has to SEE the repeat clicks to reset its timer. */\r\n[mono-button][mono-loading][mono-pending] > :is(button, a) {\r\n pointer-events: auto;\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n}\r\n\r\n/* ── The spinner — drawn INSIDE the icon box, so it replaces the icon, follows\r\n `icon-position`, and cannot change the button's height (the box was already\r\n reserved; tests/perf/field-heights asserts exactly that). ── */\r\n\r\n[mono-button] [mono-icon][mono-spinning] > *,\r\n[mono-button] [mono-icon][mono-spinning] ::slotted(*) {\r\n visibility: hidden;\r\n}\r\n\r\n/* A button with no icon still reserves the box while spinning; `mono-empty`\r\n collapses it the rest of the time (the shadow build marks an unassigned slot\r\n the same way — icon and affix zones alike). */\r\n[mono-button] [mono-icon][mono-empty],\r\n[mono-button] [mono-affix][mono-empty] {\r\n display: none;\r\n}\r\n\r\n[mono-button] [mono-icon][mono-spinning] {\r\n position: relative;\r\n}\r\n\r\n[mono-button] [mono-icon][mono-spinning]::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border: 2px solid currentColor;\r\n border-right-color: transparent;\r\n border-radius: 50%;\r\n animation: mono-button-spin 0.65s linear infinite;\r\n}\r\n\r\n[mono-button]:is([mono-size=\"xs\"], [mono-size=\"sm\"]) [mono-icon][mono-spinning]::after {\r\n border-width: 1.5px;\r\n}\r\n\r\n@keyframes mono-button-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n/* =========================================\r\n Sizing — width/height set on the host; `sized` makes the wrapper + control\r\n fill it. Icon-only is included so a fixed square (a FAB) works.\r\n ========================================= */\r\n\r\n[mono-button][mono-sized] {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n[mono-button][mono-sized] > :is(button, a) {\r\n width: 100%;\r\n height: 100%;\r\n flex: 1;\r\n justify-content: center;\r\n}\r\n\r\n.sr-only {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border-width: 0;\r\n}\r\n\r\n/* =========================================\r\n Media\r\n ========================================= */\r\n\r\n@media (prefers-contrast: high) {\r\n [mono-button] > :is(button, a) {\r\n border-width: 2px;\r\n }\r\n\r\n /* Outline, tonal and text are low-contrast by design — force a solid fill in\r\n the hue. `light` / `secondary` have no hue to fill with. */\r\n [mono-button]:is([mono-variant=\"outline\"], [mono-variant=\"tonal\"], [mono-variant=\"text\"]):is(:not([mono-color]), [mono-color=\"primary\"], [mono-color=\"success\"], [mono-color=\"danger\"], [mono-color=\"warning\"], [mono-color=\"info\"], [mono-color=\"teal\"], [mono-color=\"purple\"], [mono-color=\"dark\"], [mono-color=\"neutral\"]) > :is(button, a) {\r\n background: var(--_mono-button-c);\r\n color: var(--_mono-button-c-foreground);\r\n }\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n [mono-button] > :is(button, a) {\r\n transition: none;\r\n }\r\n\r\n [mono-button] > :is(button, a):active {\r\n translate: none;\r\n }\r\n\r\n [mono-button] [mono-icon][mono-spinning]::after {\r\n animation: none;\r\n }\r\n}\r\n\r\n/* =========================================================================\r\n Prepend / append affixes ≡ .button-group siblings\r\n -------------------------------------------------------------------------\r\n `slot=\"prepend\"` / `slot=\"append\"` render as `[mono-affix]` SIBLINGS of the native control,\r\n never inside it (a `<button>` may not contain interactive content). The zones\r\n paint themselves from the same `--_mono-button-*` variables the control\r\n uses — which is why the colour rules above declare them on the ROOT.\r\n ========================================================================= */\r\n\r\n/* basecoat@1.0.2 styles/vega.css .button-group > :is(span, label, output) — display:flex items-center */\r\n[mono-button] > [mono-affix] {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: 0 0 auto;\r\n align-self: stretch;\r\n box-sizing: border-box;\r\n background: var(--_mono-button-bg);\r\n color: var(--_mono-button-color);\r\n border: var(--mono-border-width) solid var(--_mono-button-border-color);\r\n padding: 0 var(--mono-button-md-padding-inline, calc(var(--mono-spacing) * 2.5));\r\n gap: var(--mono-spacing);\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n/* The light build re-appends slotted nodes into a `[data-mono-slot]` element;\r\n blockify it so an inline icon span actually renders its box. */\r\n[mono-button] > [mono-affix] > [data-mono-slot] {\r\n display: inline-flex;\r\n align-items: center;\r\n}\r\n\r\n/* basecoat@1.0.2 components/button-group.css .button-group — the group shares\r\n ONE ring: `*:not(:first-child)` squares its start corners and drops its start\r\n border, `*:not(:last-child)` squares its end corners.\r\n `:not([mono-empty])` is load-bearing: the SHADOW build always renders the\r\n zone (its `<slot>` must stay in the tree) and marks it `mono-empty`; `:has()`\r\n matches on presence, which `display: none` does not undo. */\r\n[mono-button]:has(> [mono-affix=\"prepend\"]:not([mono-empty])) > :is(button, a) {\r\n border-start-start-radius: 0;\r\n border-end-start-radius: 0;\r\n border-inline-start-width: 0;\r\n}\r\n\r\n[mono-button]:has(> [mono-affix=\"append\"]:not([mono-empty])) > :is(button, a) {\r\n border-start-end-radius: 0;\r\n border-end-end-radius: 0;\r\n border-inline-end-width: 0;\r\n}\r\n\r\n[mono-button] > [mono-affix=\"prepend\"] {\r\n border-start-start-radius: var(--_mono-button-radius);\r\n border-end-start-radius: var(--_mono-button-radius);\r\n border-start-end-radius: 0;\r\n border-end-end-radius: 0;\r\n border-inline-end-width: 0;\r\n}\r\n\r\n[mono-button] > [mono-affix=\"append\"] {\r\n border-start-end-radius: var(--_mono-button-radius);\r\n border-end-end-radius: var(--_mono-button-radius);\r\n border-start-start-radius: 0;\r\n border-end-start-radius: 0;\r\n border-inline-start-width: 0;\r\n}\r\n\r\n/* ── The divider — `hr[role='separator']`: restores the one edge the rules\r\n above removed, single-width, the ring's own colour. */\r\n[mono-button] > [mono-affix=\"prepend\"][mono-divider] {\r\n border-inline-end-width: var(--mono-border-width);\r\n}\r\n\r\n[mono-button] > [mono-affix=\"append\"][mono-divider] {\r\n border-inline-start-width: var(--mono-border-width);\r\n}\r\n\r\n[mono-button] > [mono-affix][mono-disabled] {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n}\r\n\r\n/* Per-size padding, mirroring the control's own steps. */\r\n[mono-button][mono-size=\"xs\"] > [mono-affix] { padding: 0 var(--mono-button-xs-padding-inline, calc(var(--mono-spacing) * 2)); }\r\n[mono-button][mono-size=\"sm\"] > [mono-affix] { padding: 0 var(--mono-button-sm-padding-inline, calc(var(--mono-spacing) * 2.5)); }\r\n[mono-button][mono-size=\"lg\"] > [mono-affix] { padding: 0 var(--mono-button-lg-padding-inline, calc(var(--mono-spacing) * 2.5)); }\r\n[mono-button][mono-size=\"xl\"] > [mono-affix] { padding: 0 var(--mono-button-xl-padding-inline, calc(var(--mono-spacing) * 3)); }\r\n[mono-button][mono-size=\"xxl\"] > [mono-affix] { padding: 0 var(--mono-button-xxl-padding-inline, calc(var(--mono-spacing) * 4)); }\r\n";
|
|
599
|
+
//#endregion
|
|
600
|
+
//#region src/components/button/mono-button.shadow.ts
|
|
601
|
+
var SHADOW_EXTRA_CSS = "";
|
|
602
|
+
var MonoButtonShadow = class MonoButtonShadow extends withShadowUtilityStyles(MonoButtonCore(LitElement)) {
|
|
603
|
+
static {
|
|
604
|
+
this.disableWarning?.("change-in-update");
|
|
605
|
+
}
|
|
606
|
+
static {
|
|
607
|
+
this.styles = [unsafeCSS(toShadowCss(button_default, {
|
|
608
|
+
host: "mono-button",
|
|
609
|
+
append: SHADOW_EXTRA_CSS
|
|
610
|
+
}))];
|
|
611
|
+
}
|
|
612
|
+
connectedCallback() {
|
|
613
|
+
super.connectedCallback();
|
|
614
|
+
if (isServer) return;
|
|
615
|
+
flushSsrHydration(this);
|
|
616
|
+
}
|
|
617
|
+
firstUpdated(changed) {
|
|
618
|
+
super.firstUpdated?.(changed);
|
|
619
|
+
if (isServer) return;
|
|
620
|
+
this._hasIcon = this._slotHasContent(this._iconSlot());
|
|
621
|
+
this._hasPrepend = this._slotHasContent(this._affixSlot("prepend"));
|
|
622
|
+
this._hasAppend = this._slotHasContent(this._affixSlot("append"));
|
|
623
|
+
}
|
|
624
|
+
updated(changed) {
|
|
625
|
+
super.updated?.(changed);
|
|
626
|
+
if (!isServer) this._applyHostSize();
|
|
627
|
+
}
|
|
628
|
+
_iconSlot() {
|
|
629
|
+
return this.renderRoot.querySelector("slot[name=\"icon\"]");
|
|
630
|
+
}
|
|
631
|
+
_slotHasContent(slot) {
|
|
632
|
+
return !!slot && slot.assignedNodes({ flatten: true }).some((n) => n.nodeType === Node.ELEMENT_NODE || !!(n.textContent ?? "").trim());
|
|
633
|
+
}
|
|
634
|
+
/**
|
|
635
|
+
* An affix zone. Unlike the light build's conditional target, the wrapper is
|
|
636
|
+
* ALWAYS rendered here: the native `<slot>` has to exist for DSD to project
|
|
637
|
+
* into it and for the scan to see it, so emptiness is a `?data-empty`
|
|
638
|
+
* attribute the shadow-only CSS hides — the same shape the icon region uses.
|
|
639
|
+
*
|
|
640
|
+
* `stopPropagation` on `click` / `mno-click` keeps a nested control's own
|
|
641
|
+
* click from surfacing as this button's action (a split button's caret must
|
|
642
|
+
* not run the button's `@click`); see the light build's `_guardAffixEvents`.
|
|
643
|
+
*/
|
|
644
|
+
_renderAffix(name) {
|
|
645
|
+
const has = name === "prepend" ? this._hasPrepend : this._hasAppend;
|
|
646
|
+
return html`<span
|
|
647
|
+
class=${[
|
|
648
|
+
`button-${name}`,
|
|
649
|
+
this._affix(name).divider ? "has-divider" : "",
|
|
650
|
+
this._affixDisabled(name) ? "disabled" : "",
|
|
651
|
+
this.cssClass?.[name] ?? ""
|
|
652
|
+
].filter(Boolean).join(" ")}
|
|
653
|
+
mono-affix=${name}
|
|
654
|
+
?mono-divider=${Boolean(this._affix(name).divider)}
|
|
655
|
+
?mono-disabled=${this._affixDisabled(name)}
|
|
656
|
+
?mono-empty=${!has}
|
|
657
|
+
@click=${(e) => e.stopPropagation()}
|
|
658
|
+
@mno-click=${(e) => e.stopPropagation()}
|
|
659
|
+
@mnoClick=${(e) => e.stopPropagation()}
|
|
660
|
+
>
|
|
661
|
+
<slot
|
|
662
|
+
name=${name}
|
|
663
|
+
@slotchange=${(e) => this._onAffixSlotChange(name, e)}
|
|
664
|
+
></slot>
|
|
665
|
+
</span>`;
|
|
666
|
+
}
|
|
667
|
+
_affixSlot(name) {
|
|
668
|
+
return this.renderRoot.querySelector("slot[name=\"" + name + "\"]");
|
|
669
|
+
}
|
|
670
|
+
_onAffixSlotChange(name, event) {
|
|
671
|
+
const has = this._slotHasContent(event.target);
|
|
672
|
+
if (name === "prepend") this._hasPrepend = has;
|
|
673
|
+
else this._hasAppend = has;
|
|
674
|
+
}
|
|
675
|
+
_onIconSlotChange(event) {
|
|
676
|
+
this._hasIcon = this._slotHasContent(event.target);
|
|
677
|
+
}
|
|
678
|
+
/** Host sizing (client-only; mirrors the light build's `_applyHostSize`). */
|
|
679
|
+
_applyHostSize() {
|
|
680
|
+
const style = buildSizeStyle(this);
|
|
681
|
+
for (const prop of [
|
|
682
|
+
"width",
|
|
683
|
+
"height",
|
|
684
|
+
"min-width",
|
|
685
|
+
"max-width",
|
|
686
|
+
"min-height",
|
|
687
|
+
"max-height"
|
|
688
|
+
]) {
|
|
689
|
+
const value = style[prop];
|
|
690
|
+
if (value) this.style.setProperty(prop, value);
|
|
691
|
+
else this.style.removeProperty(prop);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
_renderBadge() {
|
|
695
|
+
if (!this.badge) return nothing;
|
|
696
|
+
return html`<span class=${this._badgeClass} mono-badge=${this._badgeColor}>${this.badge}</span>`;
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* The icon box, which is also where the spinner is drawn.
|
|
700
|
+
*
|
|
701
|
+
* `spinning` paints the ring and hides the slotted icon; `data-empty` collapses the box when
|
|
702
|
+
* there is neither. Matches the light build exactly — the two used to differ here, with light
|
|
703
|
+
* keeping the span and shadow unmounting it.
|
|
704
|
+
*/
|
|
705
|
+
_iconSpan() {
|
|
706
|
+
return html`
|
|
707
|
+
<span class=${[this._cls("button-icon", "icon"), this._showsSpinner ? "spinning" : ""].filter(Boolean).join(" ")} mono-icon ?mono-spinning=${this._showsSpinner} ?mono-empty=${!this._hasIcon && !this._showsSpinner}>
|
|
708
|
+
<slot name="icon" @slotchange=${(e) => this._onIconSlotChange(e)}></slot>
|
|
709
|
+
</span>
|
|
710
|
+
`;
|
|
711
|
+
}
|
|
712
|
+
_renderIconOnlyContent() {
|
|
713
|
+
return html`
|
|
714
|
+
${this._iconSpan()}
|
|
715
|
+
${this._renderBadge()}
|
|
716
|
+
`;
|
|
717
|
+
}
|
|
718
|
+
_renderNormalContent() {
|
|
719
|
+
const contentBase = this.iconPosition === "right" ? "button-content icon-right" : "button-content icon-left";
|
|
720
|
+
const contentClass = this._cls(contentBase, "content");
|
|
721
|
+
const textClass = this._cls("button-text", "text");
|
|
722
|
+
return html`
|
|
723
|
+
<div class=${contentClass} mono-content>
|
|
724
|
+
${this.iconPosition === "left" ? this._iconSpan() : nothing}
|
|
725
|
+
<span class=${textClass} mono-text><slot></slot></span>
|
|
726
|
+
${this.iconPosition === "right" ? this._iconSpan() : nothing}
|
|
727
|
+
</div>
|
|
728
|
+
|
|
729
|
+
${this._renderBadge()}
|
|
730
|
+
`;
|
|
731
|
+
}
|
|
732
|
+
_renderContent() {
|
|
733
|
+
return this._isIconOnlyLike ? this._renderIconOnlyContent() : this._renderNormalContent();
|
|
734
|
+
}
|
|
735
|
+
render() {
|
|
736
|
+
const isDisabled = this._isBlocked;
|
|
737
|
+
const isInert = this._isInert;
|
|
738
|
+
const sizeStyle = styleMap(this._sizeStyle());
|
|
739
|
+
if (this.href) return this._renderWrapper(html`
|
|
740
|
+
${this._renderAffix("prepend")}
|
|
741
|
+
<a
|
|
742
|
+
class=${"mono-button-native" + (this.cssClass?.main ? " " + this.cssClass.main : "")}
|
|
743
|
+
mono-native
|
|
744
|
+
href=${ifDefined(this.href)}
|
|
745
|
+
target=${ifDefined(this.target)}
|
|
746
|
+
title=${ifDefined(this.tooltip)}
|
|
747
|
+
aria-label=${ifDefined(this._ariaLabel)}
|
|
748
|
+
role="button"
|
|
749
|
+
aria-disabled=${isDisabled ? "true" : "false"}
|
|
750
|
+
aria-busy=${this._effectiveLoading ? "true" : "false"}
|
|
751
|
+
@click=${this._handleClick}
|
|
752
|
+
@keydown=${this._handleKeyDown}
|
|
753
|
+
@focus=${this._handleFocus}
|
|
754
|
+
@blur=${this._handleBlur}
|
|
755
|
+
>
|
|
756
|
+
${this._renderContent()}
|
|
757
|
+
</a>
|
|
758
|
+
${this._renderAffix("append")}
|
|
759
|
+
`, sizeStyle);
|
|
760
|
+
return this._renderWrapper(html`
|
|
761
|
+
${this._renderAffix("prepend")}
|
|
762
|
+
<button
|
|
763
|
+
class=${ifDefined(this.cssClass?.main)}
|
|
764
|
+
mono-native
|
|
765
|
+
type=${this.type}
|
|
766
|
+
title=${ifDefined(this.tooltip)}
|
|
767
|
+
aria-label=${ifDefined(this._ariaLabel)}
|
|
768
|
+
?disabled=${isInert}
|
|
769
|
+
aria-disabled=${isDisabled ? "true" : "false"}
|
|
770
|
+
aria-busy=${this._effectiveLoading ? "true" : "false"}
|
|
771
|
+
@click=${this._handleClick}
|
|
772
|
+
@keydown=${this._handleKeyDown}
|
|
773
|
+
@focus=${this._handleFocus}
|
|
774
|
+
@blur=${this._handleBlur}
|
|
775
|
+
>
|
|
776
|
+
${this._renderContent()}
|
|
777
|
+
</button>
|
|
778
|
+
${this._renderAffix("append")}
|
|
779
|
+
`, sizeStyle);
|
|
780
|
+
}
|
|
781
|
+
};
|
|
782
|
+
MonoButtonShadow = __decorate([customElement("mono-shadow-button")], MonoButtonShadow);
|
|
783
|
+
//#endregion
|
|
784
|
+
export { button_default as n, MonoButtonCore as r, MonoButtonShadow as t };
|