@tartaguti/ui-components 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/README.md +192 -2
- package/THIRD-PARTY-NOTICES.md +29 -0
- package/custom-elements.json +16899 -0
- package/dist/accordion/tt-accordion-item.d.ts +32 -0
- package/dist/accordion/tt-accordion-item.d.ts.map +1 -0
- package/dist/accordion/tt-accordion-item.js +247 -0
- package/dist/accordion/tt-accordion-item.js.map +1 -0
- package/dist/accordion/tt-accordion.d.ts +28 -0
- package/dist/accordion/tt-accordion.d.ts.map +1 -0
- package/dist/accordion/tt-accordion.js +148 -0
- package/dist/accordion/tt-accordion.js.map +1 -0
- package/dist/bento/tt-bento-item.d.ts +35 -0
- package/dist/bento/tt-bento-item.d.ts.map +1 -0
- package/dist/bento/tt-bento-item.js +201 -0
- package/dist/bento/tt-bento-item.js.map +1 -0
- package/dist/bento/tt-bento.d.ts +25 -0
- package/dist/bento/tt-bento.d.ts.map +1 -0
- package/dist/bento/tt-bento.js +314 -0
- package/dist/bento/tt-bento.js.map +1 -0
- package/dist/floating.d.ts +61 -0
- package/dist/floating.d.ts.map +1 -0
- package/dist/floating.js +120 -0
- package/dist/floating.js.map +1 -0
- package/dist/index.d.ts +92 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction/tt-draggable.d.ts +29 -0
- package/dist/interaction/tt-draggable.d.ts.map +1 -0
- package/dist/interaction/tt-draggable.js +66 -0
- package/dist/interaction/tt-draggable.js.map +1 -0
- package/dist/interaction/tt-droppable.d.ts +37 -0
- package/dist/interaction/tt-droppable.d.ts.map +1 -0
- package/dist/interaction/tt-droppable.js +108 -0
- package/dist/interaction/tt-droppable.js.map +1 -0
- package/dist/interaction/tt-resizable.d.ts +45 -0
- package/dist/interaction/tt-resizable.d.ts.map +1 -0
- package/dist/interaction/tt-resizable.js +210 -0
- package/dist/interaction/tt-resizable.js.map +1 -0
- package/dist/interaction/tt-reveal.d.ts +54 -0
- package/dist/interaction/tt-reveal.d.ts.map +1 -0
- package/dist/interaction/tt-reveal.js +302 -0
- package/dist/interaction/tt-reveal.js.map +1 -0
- package/dist/motion.d.ts +8 -0
- package/dist/motion.d.ts.map +1 -0
- package/dist/motion.js +49 -0
- package/dist/motion.js.map +1 -0
- package/dist/overlay.d.ts +7 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +121 -0
- package/dist/overlay.js.map +1 -0
- package/dist/safe-url.d.ts +14 -0
- package/dist/safe-url.d.ts.map +1 -0
- package/dist/safe-url.js +46 -0
- package/dist/safe-url.js.map +1 -0
- package/dist/scroll-lock.d.ts +22 -0
- package/dist/scroll-lock.d.ts.map +1 -0
- package/dist/scroll-lock.js +56 -0
- package/dist/scroll-lock.js.map +1 -0
- package/dist/sidebar/tt-menu-group.d.ts +69 -0
- package/dist/sidebar/tt-menu-group.d.ts.map +1 -0
- package/dist/sidebar/tt-menu-group.js +358 -0
- package/dist/sidebar/tt-menu-group.js.map +1 -0
- package/dist/sidebar/tt-menu-item.d.ts +70 -0
- package/dist/sidebar/tt-menu-item.d.ts.map +1 -0
- package/dist/sidebar/tt-menu-item.js +502 -0
- package/dist/sidebar/tt-menu-item.js.map +1 -0
- package/dist/sidebar/tt-sidebar-footer.d.ts +39 -0
- package/dist/sidebar/tt-sidebar-footer.d.ts.map +1 -0
- package/dist/sidebar/tt-sidebar-footer.js +205 -0
- package/dist/sidebar/tt-sidebar-footer.js.map +1 -0
- package/dist/sidebar/tt-sidebar-header.d.ts +31 -0
- package/dist/sidebar/tt-sidebar-header.d.ts.map +1 -0
- package/dist/sidebar/tt-sidebar-header.js +150 -0
- package/dist/sidebar/tt-sidebar-header.js.map +1 -0
- package/dist/sidebar/tt-sidebar.d.ts +72 -0
- package/dist/sidebar/tt-sidebar.d.ts.map +1 -0
- package/dist/sidebar/tt-sidebar.js +539 -0
- package/dist/sidebar/tt-sidebar.js.map +1 -0
- package/dist/sr-only.d.ts +15 -0
- package/dist/sr-only.d.ts.map +1 -0
- package/dist/sr-only.js +27 -0
- package/dist/sr-only.js.map +1 -0
- package/dist/tokens.css +1124 -0
- package/dist/tt-alert.d.ts +26 -0
- package/dist/tt-alert.d.ts.map +1 -0
- package/dist/tt-alert.js +165 -0
- package/dist/tt-alert.js.map +1 -0
- package/dist/tt-aspect-ratio.d.ts +40 -0
- package/dist/tt-aspect-ratio.d.ts.map +1 -0
- package/dist/tt-aspect-ratio.js +98 -0
- package/dist/tt-aspect-ratio.js.map +1 -0
- package/dist/tt-auth.d.ts +75 -0
- package/dist/tt-auth.d.ts.map +1 -0
- package/dist/tt-auth.js +520 -0
- package/dist/tt-auth.js.map +1 -0
- package/dist/tt-avatar.d.ts +26 -0
- package/dist/tt-avatar.d.ts.map +1 -0
- package/dist/tt-avatar.js +169 -0
- package/dist/tt-avatar.js.map +1 -0
- package/dist/tt-badge.d.ts +36 -0
- package/dist/tt-badge.d.ts.map +1 -0
- package/dist/tt-badge.js +135 -0
- package/dist/tt-badge.js.map +1 -0
- package/dist/tt-breadcrumbs.d.ts +22 -0
- package/dist/tt-breadcrumbs.d.ts.map +1 -0
- package/dist/tt-breadcrumbs.js +144 -0
- package/dist/tt-breadcrumbs.js.map +1 -0
- package/dist/tt-button-group.d.ts +32 -0
- package/dist/tt-button-group.d.ts.map +1 -0
- package/dist/tt-button-group.js +132 -0
- package/dist/tt-button-group.js.map +1 -0
- package/dist/tt-button.d.ts +31 -0
- package/dist/tt-button.d.ts.map +1 -0
- package/dist/tt-button.js +483 -0
- package/dist/tt-button.js.map +1 -0
- package/dist/tt-card.d.ts +26 -0
- package/dist/tt-card.d.ts.map +1 -0
- package/dist/tt-card.js +429 -0
- package/dist/tt-card.js.map +1 -0
- package/dist/tt-chart.d.ts +36 -0
- package/dist/tt-chart.d.ts.map +1 -0
- package/dist/tt-chart.js +332 -0
- package/dist/tt-chart.js.map +1 -0
- package/dist/tt-checkbox-group.d.ts +38 -0
- package/dist/tt-checkbox-group.d.ts.map +1 -0
- package/dist/tt-checkbox-group.js +243 -0
- package/dist/tt-checkbox-group.js.map +1 -0
- package/dist/tt-checkbox.d.ts +35 -0
- package/dist/tt-checkbox.d.ts.map +1 -0
- package/dist/tt-checkbox.js +354 -0
- package/dist/tt-checkbox.js.map +1 -0
- package/dist/tt-code-block.d.ts +37 -0
- package/dist/tt-code-block.d.ts.map +1 -0
- package/dist/tt-code-block.js +409 -0
- package/dist/tt-code-block.js.map +1 -0
- package/dist/tt-collapsible.d.ts +71 -0
- package/dist/tt-collapsible.d.ts.map +1 -0
- package/dist/tt-collapsible.js +206 -0
- package/dist/tt-collapsible.js.map +1 -0
- package/dist/tt-combobox.d.ts +107 -0
- package/dist/tt-combobox.d.ts.map +1 -0
- package/dist/tt-combobox.js +816 -0
- package/dist/tt-combobox.js.map +1 -0
- package/dist/tt-company-card.d.ts +30 -0
- package/dist/tt-company-card.d.ts.map +1 -0
- package/dist/tt-company-card.js +382 -0
- package/dist/tt-company-card.js.map +1 -0
- package/dist/tt-comparison-table.d.ts +59 -0
- package/dist/tt-comparison-table.d.ts.map +1 -0
- package/dist/tt-comparison-table.js +441 -0
- package/dist/tt-comparison-table.js.map +1 -0
- package/dist/tt-component-doc.d.ts +63 -0
- package/dist/tt-component-doc.d.ts.map +1 -0
- package/dist/tt-component-doc.js +585 -0
- package/dist/tt-component-doc.js.map +1 -0
- package/dist/tt-confirm.d.ts +45 -0
- package/dist/tt-confirm.d.ts.map +1 -0
- package/dist/tt-confirm.js +151 -0
- package/dist/tt-confirm.js.map +1 -0
- package/dist/tt-contact-list.d.ts +18 -0
- package/dist/tt-contact-list.d.ts.map +1 -0
- package/dist/tt-contact-list.js +101 -0
- package/dist/tt-contact-list.js.map +1 -0
- package/dist/tt-copy-button.d.ts +25 -0
- package/dist/tt-copy-button.d.ts.map +1 -0
- package/dist/tt-copy-button.js +194 -0
- package/dist/tt-copy-button.js.map +1 -0
- package/dist/tt-data-table.d.ts +96 -0
- package/dist/tt-data-table.d.ts.map +1 -0
- package/dist/tt-data-table.js +812 -0
- package/dist/tt-data-table.js.map +1 -0
- package/dist/tt-divider.d.ts +19 -0
- package/dist/tt-divider.d.ts.map +1 -0
- package/dist/tt-divider.js +104 -0
- package/dist/tt-divider.js.map +1 -0
- package/dist/tt-drawer.d.ts +38 -0
- package/dist/tt-drawer.d.ts.map +1 -0
- package/dist/tt-drawer.js +433 -0
- package/dist/tt-drawer.js.map +1 -0
- package/dist/tt-dropdown-menu.d.ts +57 -0
- package/dist/tt-dropdown-menu.d.ts.map +1 -0
- package/dist/tt-dropdown-menu.js +631 -0
- package/dist/tt-dropdown-menu.js.map +1 -0
- package/dist/tt-empty-state.d.ts +13 -0
- package/dist/tt-empty-state.d.ts.map +1 -0
- package/dist/tt-empty-state.js +94 -0
- package/dist/tt-empty-state.js.map +1 -0
- package/dist/tt-example.d.ts +33 -0
- package/dist/tt-example.d.ts.map +1 -0
- package/dist/tt-example.js +250 -0
- package/dist/tt-example.js.map +1 -0
- package/dist/tt-file-upload.d.ts +85 -0
- package/dist/tt-file-upload.d.ts.map +1 -0
- package/dist/tt-file-upload.js +662 -0
- package/dist/tt-file-upload.js.map +1 -0
- package/dist/tt-filter.d.ts +62 -0
- package/dist/tt-filter.d.ts.map +1 -0
- package/dist/tt-filter.js +393 -0
- package/dist/tt-filter.js.map +1 -0
- package/dist/tt-form.d.ts +33 -0
- package/dist/tt-form.d.ts.map +1 -0
- package/dist/tt-form.js +202 -0
- package/dist/tt-form.js.map +1 -0
- package/dist/tt-grid.d.ts +22 -0
- package/dist/tt-grid.d.ts.map +1 -0
- package/dist/tt-grid.js +106 -0
- package/dist/tt-grid.js.map +1 -0
- package/dist/tt-icon.d.ts +20 -0
- package/dist/tt-icon.d.ts.map +1 -0
- package/dist/tt-icon.js +510 -0
- package/dist/tt-icon.js.map +1 -0
- package/dist/tt-image.d.ts +59 -0
- package/dist/tt-image.d.ts.map +1 -0
- package/dist/tt-image.js +314 -0
- package/dist/tt-image.js.map +1 -0
- package/dist/tt-inbox.d.ts +45 -0
- package/dist/tt-inbox.d.ts.map +1 -0
- package/dist/tt-inbox.js +275 -0
- package/dist/tt-inbox.js.map +1 -0
- package/dist/tt-input.d.ts +43 -0
- package/dist/tt-input.d.ts.map +1 -0
- package/dist/tt-input.js +476 -0
- package/dist/tt-input.js.map +1 -0
- package/dist/tt-kbd.d.ts +39 -0
- package/dist/tt-kbd.d.ts.map +1 -0
- package/dist/tt-kbd.js +145 -0
- package/dist/tt-kbd.js.map +1 -0
- package/dist/tt-key-values.d.ts +17 -0
- package/dist/tt-key-values.d.ts.map +1 -0
- package/dist/tt-key-values.js +126 -0
- package/dist/tt-key-values.js.map +1 -0
- package/dist/tt-knowledge-doc.d.ts +24 -0
- package/dist/tt-knowledge-doc.d.ts.map +1 -0
- package/dist/tt-knowledge-doc.js +120 -0
- package/dist/tt-knowledge-doc.js.map +1 -0
- package/dist/tt-layout.d.ts +36 -0
- package/dist/tt-layout.d.ts.map +1 -0
- package/dist/tt-layout.js +318 -0
- package/dist/tt-layout.js.map +1 -0
- package/dist/tt-modal.d.ts +32 -0
- package/dist/tt-modal.d.ts.map +1 -0
- package/dist/tt-modal.js +553 -0
- package/dist/tt-modal.js.map +1 -0
- package/dist/tt-navbar.d.ts +33 -0
- package/dist/tt-navbar.d.ts.map +1 -0
- package/dist/tt-navbar.js +390 -0
- package/dist/tt-navbar.js.map +1 -0
- package/dist/tt-page-header.d.ts +28 -0
- package/dist/tt-page-header.d.ts.map +1 -0
- package/dist/tt-page-header.js +166 -0
- package/dist/tt-page-header.js.map +1 -0
- package/dist/tt-page.d.ts +14 -0
- package/dist/tt-page.d.ts.map +1 -0
- package/dist/tt-page.js +163 -0
- package/dist/tt-page.js.map +1 -0
- package/dist/tt-pagination.d.ts +27 -0
- package/dist/tt-pagination.d.ts.map +1 -0
- package/dist/tt-pagination.js +194 -0
- package/dist/tt-pagination.js.map +1 -0
- package/dist/tt-preview.d.ts +11 -0
- package/dist/tt-preview.d.ts.map +1 -0
- package/dist/tt-preview.js +68 -0
- package/dist/tt-preview.js.map +1 -0
- package/dist/tt-product.d.ts +40 -0
- package/dist/tt-product.d.ts.map +1 -0
- package/dist/tt-product.js +590 -0
- package/dist/tt-product.js.map +1 -0
- package/dist/tt-profile-card.d.ts +23 -0
- package/dist/tt-profile-card.d.ts.map +1 -0
- package/dist/tt-profile-card.js +199 -0
- package/dist/tt-profile-card.js.map +1 -0
- package/dist/tt-progress.d.ts +26 -0
- package/dist/tt-progress.d.ts.map +1 -0
- package/dist/tt-progress.js +156 -0
- package/dist/tt-progress.js.map +1 -0
- package/dist/tt-quantity.d.ts +36 -0
- package/dist/tt-quantity.d.ts.map +1 -0
- package/dist/tt-quantity.js +396 -0
- package/dist/tt-quantity.js.map +1 -0
- package/dist/tt-radio-group.d.ts +50 -0
- package/dist/tt-radio-group.d.ts.map +1 -0
- package/dist/tt-radio-group.js +372 -0
- package/dist/tt-radio-group.js.map +1 -0
- package/dist/tt-rating.d.ts +54 -0
- package/dist/tt-rating.d.ts.map +1 -0
- package/dist/tt-rating.js +312 -0
- package/dist/tt-rating.js.map +1 -0
- package/dist/tt-search.d.ts +47 -0
- package/dist/tt-search.d.ts.map +1 -0
- package/dist/tt-search.js +360 -0
- package/dist/tt-search.js.map +1 -0
- package/dist/tt-section.d.ts +13 -0
- package/dist/tt-section.d.ts.map +1 -0
- package/dist/tt-section.js +98 -0
- package/dist/tt-section.js.map +1 -0
- package/dist/tt-select.d.ts +62 -0
- package/dist/tt-select.d.ts.map +1 -0
- package/dist/tt-select.js +662 -0
- package/dist/tt-select.js.map +1 -0
- package/dist/tt-skeleton.d.ts +20 -0
- package/dist/tt-skeleton.d.ts.map +1 -0
- package/dist/tt-skeleton.js +143 -0
- package/dist/tt-skeleton.js.map +1 -0
- package/dist/tt-slider.d.ts +74 -0
- package/dist/tt-slider.d.ts.map +1 -0
- package/dist/tt-slider.js +426 -0
- package/dist/tt-slider.js.map +1 -0
- package/dist/tt-social-links.d.ts +34 -0
- package/dist/tt-social-links.d.ts.map +1 -0
- package/dist/tt-social-links.js +242 -0
- package/dist/tt-social-links.js.map +1 -0
- package/dist/tt-sparkline.d.ts +19 -0
- package/dist/tt-sparkline.d.ts.map +1 -0
- package/dist/tt-sparkline.js +191 -0
- package/dist/tt-sparkline.js.map +1 -0
- package/dist/tt-spinner.d.ts +19 -0
- package/dist/tt-spinner.d.ts.map +1 -0
- package/dist/tt-spinner.js +93 -0
- package/dist/tt-spinner.js.map +1 -0
- package/dist/tt-stack.d.ts +42 -0
- package/dist/tt-stack.d.ts.map +1 -0
- package/dist/tt-stack.js +158 -0
- package/dist/tt-stack.js.map +1 -0
- package/dist/tt-stat.d.ts +17 -0
- package/dist/tt-stat.d.ts.map +1 -0
- package/dist/tt-stat.js +134 -0
- package/dist/tt-stat.js.map +1 -0
- package/dist/tt-switch.d.ts +39 -0
- package/dist/tt-switch.d.ts.map +1 -0
- package/dist/tt-switch.js +254 -0
- package/dist/tt-switch.js.map +1 -0
- package/dist/tt-switcher.d.ts +23 -0
- package/dist/tt-switcher.d.ts.map +1 -0
- package/dist/tt-switcher.js +203 -0
- package/dist/tt-switcher.js.map +1 -0
- package/dist/tt-table-cell.d.ts +26 -0
- package/dist/tt-table-cell.d.ts.map +1 -0
- package/dist/tt-table-cell.js +121 -0
- package/dist/tt-table-cell.js.map +1 -0
- package/dist/tt-table-row.d.ts +31 -0
- package/dist/tt-table-row.d.ts.map +1 -0
- package/dist/tt-table-row.js +72 -0
- package/dist/tt-table-row.js.map +1 -0
- package/dist/tt-table.d.ts +44 -0
- package/dist/tt-table.d.ts.map +1 -0
- package/dist/tt-table.js +270 -0
- package/dist/tt-table.js.map +1 -0
- package/dist/tt-tabs.d.ts +31 -0
- package/dist/tt-tabs.d.ts.map +1 -0
- package/dist/tt-tabs.js +223 -0
- package/dist/tt-tabs.js.map +1 -0
- package/dist/tt-tag-list.d.ts +19 -0
- package/dist/tt-tag-list.d.ts.map +1 -0
- package/dist/tt-tag-list.js +136 -0
- package/dist/tt-tag-list.js.map +1 -0
- package/dist/tt-text.d.ts +52 -0
- package/dist/tt-text.d.ts.map +1 -0
- package/dist/tt-text.js +337 -0
- package/dist/tt-text.js.map +1 -0
- package/dist/tt-textarea.d.ts +43 -0
- package/dist/tt-textarea.d.ts.map +1 -0
- package/dist/tt-textarea.js +356 -0
- package/dist/tt-textarea.js.map +1 -0
- package/dist/tt-thread.d.ts +62 -0
- package/dist/tt-thread.d.ts.map +1 -0
- package/dist/tt-thread.js +374 -0
- package/dist/tt-thread.js.map +1 -0
- package/dist/tt-toast.d.ts +49 -0
- package/dist/tt-toast.d.ts.map +1 -0
- package/dist/tt-toast.js +440 -0
- package/dist/tt-toast.js.map +1 -0
- package/dist/tt-toggle-group.d.ts +73 -0
- package/dist/tt-toggle-group.d.ts.map +1 -0
- package/dist/tt-toggle-group.js +273 -0
- package/dist/tt-toggle-group.js.map +1 -0
- package/dist/tt-toggle.d.ts +54 -0
- package/dist/tt-toggle.d.ts.map +1 -0
- package/dist/tt-toggle.js +232 -0
- package/dist/tt-toggle.js.map +1 -0
- package/dist/tt-toolbar.d.ts +26 -0
- package/dist/tt-toolbar.d.ts.map +1 -0
- package/dist/tt-toolbar.js +164 -0
- package/dist/tt-toolbar.js.map +1 -0
- package/dist/tt-tooltip.d.ts +42 -0
- package/dist/tt-tooltip.d.ts.map +1 -0
- package/dist/tt-tooltip.js +299 -0
- package/dist/tt-tooltip.js.map +1 -0
- package/package.json +84 -4
- package/vscode.html-custom-data.json +2911 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { LitElement, html, css } from "lit";
|
|
8
|
+
import { customElement, state } from "lit/decorators.js";
|
|
9
|
+
import { deepActiveElement } from "./overlay.js";
|
|
10
|
+
import "./tt-modal.js";
|
|
11
|
+
import "./tt-button.js";
|
|
12
|
+
/**
|
|
13
|
+
* Confirmation dialog with a promise-based API. Mount one near the app
|
|
14
|
+
* root, then anywhere else:
|
|
15
|
+
*
|
|
16
|
+
* if (await confirm({ heading: "Delete request?", danger: true })) {
|
|
17
|
+
* ...
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* The promise is the point. The alternative is a dialog component plus
|
|
21
|
+
* open state plus two event handlers plus a variable remembering what you
|
|
22
|
+
* were about to do, spread across every caller. Here the decision reads
|
|
23
|
+
* as one line, in the order it happens.
|
|
24
|
+
*/
|
|
25
|
+
let TTConfirm = class TTConfirm extends LitElement {
|
|
26
|
+
constructor() {
|
|
27
|
+
super(...arguments);
|
|
28
|
+
/*
|
|
29
|
+
Where focus was when the question was asked.
|
|
30
|
+
|
|
31
|
+
tt-modal returns focus itself, but only when its `open` goes false.
|
|
32
|
+
Settling here REMOVES the modal from the page instead, so that code
|
|
33
|
+
never runs and focus fell to <body>: after "Delete?" a keyboard user
|
|
34
|
+
was sent back to the top of the document. This component removes the
|
|
35
|
+
dialog, so this component owns putting focus back.
|
|
36
|
+
*/
|
|
37
|
+
this.returnFocus = null;
|
|
38
|
+
}
|
|
39
|
+
connectedCallback() {
|
|
40
|
+
super.connectedCallback();
|
|
41
|
+
registry.add(this);
|
|
42
|
+
}
|
|
43
|
+
disconnectedCallback() {
|
|
44
|
+
registry.delete(this);
|
|
45
|
+
// Never leave a caller awaiting forever if the dialog is torn down.
|
|
46
|
+
this.pending?.resolve(false);
|
|
47
|
+
this.pending = undefined;
|
|
48
|
+
super.disconnectedCallback();
|
|
49
|
+
}
|
|
50
|
+
ask(options) {
|
|
51
|
+
// A second request while one is open resolves the first as cancelled,
|
|
52
|
+
// rather than silently dropping its promise.
|
|
53
|
+
this.pending?.resolve(false);
|
|
54
|
+
// Kept from the FIRST ask if one is already open: the dialog itself is
|
|
55
|
+
// not where focus should return to.
|
|
56
|
+
if (!this.pending) {
|
|
57
|
+
this.returnFocus = deepActiveElement();
|
|
58
|
+
}
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
this.pending = {
|
|
61
|
+
heading: options.heading,
|
|
62
|
+
message: options.message ?? "",
|
|
63
|
+
confirmLabel: options.confirmLabel ?? "Confirm",
|
|
64
|
+
cancelLabel: options.cancelLabel ?? "Cancel",
|
|
65
|
+
danger: options.danger ?? false,
|
|
66
|
+
resolve,
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
settle(confirmed) {
|
|
71
|
+
this.pending?.resolve(confirmed);
|
|
72
|
+
this.pending = undefined;
|
|
73
|
+
const target = this.returnFocus;
|
|
74
|
+
this.returnFocus = null;
|
|
75
|
+
// After the render that removes the dialog, or the focus call lands
|
|
76
|
+
// on an element that is still behind an open modal.
|
|
77
|
+
this.updateComplete.then(() => target?.focus?.());
|
|
78
|
+
}
|
|
79
|
+
static { this.styles = css `
|
|
80
|
+
/* The browser's own [hidden] rule loses to any :host display, so a
|
|
81
|
+
hidden element would still show. Important, so it always wins. */
|
|
82
|
+
:host([hidden]) {
|
|
83
|
+
display: none !important;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
:host {
|
|
87
|
+
display: contents;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
p {
|
|
91
|
+
margin: 0;
|
|
92
|
+
}
|
|
93
|
+
`; }
|
|
94
|
+
render() {
|
|
95
|
+
const pending = this.pending;
|
|
96
|
+
if (!pending)
|
|
97
|
+
return html ``;
|
|
98
|
+
return html `
|
|
99
|
+
<!-- tt-modal already handles Escape, backdrop click and focus
|
|
100
|
+
restore, so cancelling is covered by all three routes. -->
|
|
101
|
+
<tt-modal
|
|
102
|
+
open
|
|
103
|
+
size="small"
|
|
104
|
+
heading=${pending.heading}
|
|
105
|
+
@tt-close=${() => this.settle(false)}
|
|
106
|
+
>
|
|
107
|
+
${pending.message ? html `<p>${pending.message}</p>` : ""}
|
|
108
|
+
|
|
109
|
+
<!-- autofocus: tt-modal focuses it on open, so Enter cancels. -->
|
|
110
|
+
<tt-button
|
|
111
|
+
slot="footer"
|
|
112
|
+
variant="secondary"
|
|
113
|
+
autofocus
|
|
114
|
+
@tt-button-click=${() => this.settle(false)}
|
|
115
|
+
>
|
|
116
|
+
${pending.cancelLabel}
|
|
117
|
+
</tt-button>
|
|
118
|
+
|
|
119
|
+
<tt-button
|
|
120
|
+
slot="footer"
|
|
121
|
+
variant=${pending.danger ? "danger" : "primary"}
|
|
122
|
+
@tt-button-click=${() => this.settle(true)}
|
|
123
|
+
>
|
|
124
|
+
${pending.confirmLabel}
|
|
125
|
+
</tt-button>
|
|
126
|
+
</tt-modal>
|
|
127
|
+
`;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
__decorate([
|
|
131
|
+
state()
|
|
132
|
+
], TTConfirm.prototype, "pending", void 0);
|
|
133
|
+
TTConfirm = __decorate([
|
|
134
|
+
customElement("tt-confirm")
|
|
135
|
+
], TTConfirm);
|
|
136
|
+
export { TTConfirm };
|
|
137
|
+
const registry = new Set();
|
|
138
|
+
/**
|
|
139
|
+
* Ask for confirmation from anywhere. Requires a <tt-confirm> mounted in
|
|
140
|
+
* the page. Resolves false if none is mounted, so a missing dialog can
|
|
141
|
+
* never silently confirm a destructive action.
|
|
142
|
+
*/
|
|
143
|
+
export function confirm(options) {
|
|
144
|
+
const target = registry.values().next().value;
|
|
145
|
+
if (!target) {
|
|
146
|
+
console.warn("confirm() called but no <tt-confirm> is mounted.");
|
|
147
|
+
return Promise.resolve(false);
|
|
148
|
+
}
|
|
149
|
+
return target.ask(options);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=tt-confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tt-confirm.js","sourceRoot":"","sources":["../src/tt-confirm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
export interface Contact {
|
|
3
|
+
name: string;
|
|
4
|
+
role: string;
|
|
5
|
+
email: string;
|
|
6
|
+
phone?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class TTContactList extends LitElement {
|
|
9
|
+
contacts: Contact[];
|
|
10
|
+
static styles: import("lit").CSSResult;
|
|
11
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
12
|
+
}
|
|
13
|
+
declare global {
|
|
14
|
+
interface HTMLElementTagNameMap {
|
|
15
|
+
"tt-contact-list": TTContactList;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=tt-contact-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tt-contact-list.d.ts","sourceRoot":"","sources":["../src/tt-contact-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAO5C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBACa,aAAc,SAAQ,UAAU;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAM;IAEpD,MAAM,CAAC,MAAM,0BA4DX;IAEF,MAAM;CAoBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,aAAa,CAAC;KAClC;CACF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { LitElement, html, css } from "lit";
|
|
8
|
+
import { customElement, property } from "lit/decorators.js";
|
|
9
|
+
let TTContactList = class TTContactList extends LitElement {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
12
|
+
this.contacts = [];
|
|
13
|
+
}
|
|
14
|
+
static { this.styles = css `
|
|
15
|
+
/* The browser's own [hidden] rule loses to any :host display, so a
|
|
16
|
+
hidden element would still show. Important, so it always wins. */
|
|
17
|
+
:host([hidden]) {
|
|
18
|
+
display: none !important;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
:host {
|
|
22
|
+
display: block;
|
|
23
|
+
font-family: var(--tt-font-sans);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
ul {
|
|
27
|
+
display: flex;
|
|
28
|
+
flex-direction: column;
|
|
29
|
+
gap: var(--tt-space-4);
|
|
30
|
+
|
|
31
|
+
margin: 0;
|
|
32
|
+
padding: 0;
|
|
33
|
+
list-style: none;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
li {
|
|
37
|
+
display: flex;
|
|
38
|
+
flex-direction: column;
|
|
39
|
+
min-width: 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.name {
|
|
43
|
+
font-size: var(--tt-text-sm);
|
|
44
|
+
font-weight: var(--tt-weight-semibold);
|
|
45
|
+
color: var(--tt-foreground);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.role {
|
|
49
|
+
font-size: var(--tt-text-xs);
|
|
50
|
+
color: var(--tt-muted-foreground);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Styled here because these links render in this shadow root. */
|
|
54
|
+
a {
|
|
55
|
+
margin-top: 2px;
|
|
56
|
+
|
|
57
|
+
/* Emails and numbers are long with no natural break points. */
|
|
58
|
+
overflow-wrap: anywhere;
|
|
59
|
+
|
|
60
|
+
font-size: var(--tt-text-sm);
|
|
61
|
+
color: inherit;
|
|
62
|
+
text-decoration: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
a:hover {
|
|
66
|
+
text-decoration: underline;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
a:focus-visible {
|
|
70
|
+
outline: var(--tt-ring-width) solid var(--tt-ring);
|
|
71
|
+
outline-offset: var(--tt-ring-offset);
|
|
72
|
+
border-radius: var(--tt-radius-sm);
|
|
73
|
+
}
|
|
74
|
+
`; }
|
|
75
|
+
render() {
|
|
76
|
+
return html `
|
|
77
|
+
<ul part="list">
|
|
78
|
+
${this.contacts.map((contact) => html `
|
|
79
|
+
<li part="contact">
|
|
80
|
+
<span class="name">${contact.name}</span>
|
|
81
|
+
<span class="role">${contact.role}</span>
|
|
82
|
+
|
|
83
|
+
<a href="mailto:${contact.email}">${contact.email}</a>
|
|
84
|
+
|
|
85
|
+
${contact.phone
|
|
86
|
+
? html `<a href="tel:${contact.phone}">${contact.phone}</a>`
|
|
87
|
+
: ""}
|
|
88
|
+
</li>
|
|
89
|
+
`)}
|
|
90
|
+
</ul>
|
|
91
|
+
`;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
__decorate([
|
|
95
|
+
property({ type: Array })
|
|
96
|
+
], TTContactList.prototype, "contacts", void 0);
|
|
97
|
+
TTContactList = __decorate([
|
|
98
|
+
customElement("tt-contact-list")
|
|
99
|
+
], TTContactList);
|
|
100
|
+
export { TTContactList };
|
|
101
|
+
//# sourceMappingURL=tt-contact-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tt-contact-list.js","sourceRoot":"","sources":["../src/tt-contact-list.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAcrD,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;QACsB,aAAQ,GAAc,EAAE,CAAC;IAoFtD,CAAC;aAlFQ,WAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DlB,AA5DY,CA4DX;IAEF,MAAM;QACJ,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,QAAQ,CAAC,GAAG,CACjB,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAA;;mCAEQ,OAAO,CAAC,IAAI;mCACZ,OAAO,CAAC,IAAI;;gCAEf,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;;gBAE/C,OAAO,CAAC,KAAK;YACb,CAAC,CAAC,IAAI,CAAA,gBAAgB,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,MAAM;YAC3D,CAAC,CAAC,EAAE;;WAET,CACF;;KAEJ,CAAC;IACJ,CAAC;;AAnF0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;+CAA0B;AADzC,aAAa;IADzB,aAAa,CAAC,iBAAiB,CAAC;GACpB,aAAa,CAqFzB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
/**
|
|
3
|
+
* Copies a string to the clipboard and confirms it in place.
|
|
4
|
+
*
|
|
5
|
+
* The confirmation matters more than the copying: without it nobody knows
|
|
6
|
+
* whether the click worked, and they click again.
|
|
7
|
+
*/
|
|
8
|
+
export declare class TTCopyButton extends LitElement {
|
|
9
|
+
value: string;
|
|
10
|
+
label: string;
|
|
11
|
+
copiedLabel: string;
|
|
12
|
+
iconOnly: boolean;
|
|
13
|
+
private copied;
|
|
14
|
+
private timer?;
|
|
15
|
+
disconnectedCallback(): void;
|
|
16
|
+
private copy;
|
|
17
|
+
static styles: import("lit").CSSResult[];
|
|
18
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
19
|
+
}
|
|
20
|
+
declare global {
|
|
21
|
+
interface HTMLElementTagNameMap {
|
|
22
|
+
"tt-copy-button": TTCopyButton;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=tt-copy-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tt-copy-button.d.ts","sourceRoot":"","sources":["../src/tt-copy-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAI5C;;;;;GAKG;AACH,qBACa,YAAa,SAAQ,UAAU;IACd,KAAK,SAAM;IAEX,KAAK,SAAU;IAEY,WAAW,SAAY;IAGV,QAAQ,UAAS;IAE5E,OAAO,CAAC,MAAM,CAAS;IAEhC,OAAO,CAAC,KAAK,CAAC,CAAgC;IAE9C,oBAAoB;YAKN,IAAI;IAsBlB,MAAM,CAAC,MAAM,4BAyFV;IAEH,MAAM;CAqCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,YAAY,CAAC;KAChC;CACF"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { LitElement, html, css } from "lit";
|
|
8
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
9
|
+
import { srOnly } from "./sr-only.js";
|
|
10
|
+
/**
|
|
11
|
+
* Copies a string to the clipboard and confirms it in place.
|
|
12
|
+
*
|
|
13
|
+
* The confirmation matters more than the copying: without it nobody knows
|
|
14
|
+
* whether the click worked, and they click again.
|
|
15
|
+
*/
|
|
16
|
+
let TTCopyButton = class TTCopyButton extends LitElement {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
this.value = "";
|
|
20
|
+
this.label = "Copy";
|
|
21
|
+
this.copiedLabel = "Copied";
|
|
22
|
+
// Show only the icon, for tight spots like a table cell.
|
|
23
|
+
this.iconOnly = false;
|
|
24
|
+
this.copied = false;
|
|
25
|
+
}
|
|
26
|
+
disconnectedCallback() {
|
|
27
|
+
clearTimeout(this.timer);
|
|
28
|
+
super.disconnectedCallback();
|
|
29
|
+
}
|
|
30
|
+
async copy() {
|
|
31
|
+
try {
|
|
32
|
+
await navigator.clipboard.writeText(this.value);
|
|
33
|
+
this.copied = true;
|
|
34
|
+
clearTimeout(this.timer);
|
|
35
|
+
this.timer = setTimeout(() => (this.copied = false), 2000);
|
|
36
|
+
this.dispatchEvent(new CustomEvent("tt-copy", {
|
|
37
|
+
detail: { value: this.value },
|
|
38
|
+
bubbles: true,
|
|
39
|
+
composed: true,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Clipboard access needs a secure context and can be refused.
|
|
44
|
+
// Failing silently beats throwing out of a click handler.
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
static { this.styles = [srOnly, css `
|
|
48
|
+
/* The browser's own [hidden] rule loses to any :host display, so a
|
|
49
|
+
hidden element would still show. Important, so it always wins. */
|
|
50
|
+
:host([hidden]) {
|
|
51
|
+
display: none !important;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
:host {
|
|
55
|
+
display: inline-flex;
|
|
56
|
+
font-family: var(--tt-font-sans);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
button {
|
|
60
|
+
display: inline-flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
gap: var(--tt-space-2);
|
|
63
|
+
|
|
64
|
+
padding: 4px var(--tt-space-2);
|
|
65
|
+
|
|
66
|
+
border: 1px solid var(--tt-border);
|
|
67
|
+
border-radius: var(--tt-radius);
|
|
68
|
+
|
|
69
|
+
background: transparent;
|
|
70
|
+
color: var(--tt-muted-foreground);
|
|
71
|
+
|
|
72
|
+
font: inherit;
|
|
73
|
+
font-size: var(--tt-text-xs);
|
|
74
|
+
font-weight: var(--tt-weight-medium);
|
|
75
|
+
|
|
76
|
+
cursor: pointer;
|
|
77
|
+
|
|
78
|
+
transition:
|
|
79
|
+
color var(--tt-duration-normal) var(--tt-ease),
|
|
80
|
+
border-color var(--tt-duration-normal) var(--tt-ease);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
button:hover {
|
|
84
|
+
color: var(--tt-foreground);
|
|
85
|
+
border-color: var(--tt-border-strong);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
button:focus-visible {
|
|
89
|
+
outline: var(--tt-ring-width) solid var(--tt-ring);
|
|
90
|
+
outline-offset: var(--tt-ring-offset);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
button.copied {
|
|
94
|
+
color: var(--tt-success);
|
|
95
|
+
border-color: var(--tt-success);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
:host([icon-only]) button {
|
|
99
|
+
padding: 4px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
:host([icon-only]) .text {
|
|
103
|
+
/* Present for screen readers, invisible on screen: the icon alone
|
|
104
|
+
announces nothing. */
|
|
105
|
+
position: absolute;
|
|
106
|
+
width: 1px;
|
|
107
|
+
height: 1px;
|
|
108
|
+
overflow: hidden;
|
|
109
|
+
clip-path: inset(50%);
|
|
110
|
+
white-space: nowrap;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
svg {
|
|
114
|
+
width: 14px;
|
|
115
|
+
height: 14px;
|
|
116
|
+
flex: 0 0 auto;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/*
|
|
120
|
+
A full touch target on a touchscreen, and the compact look with a
|
|
121
|
+
mouse. Its height comes from padding, and the touch block in
|
|
122
|
+
tokens.css only raises the --tt-control-* tokens, so it stayed 25px
|
|
123
|
+
tall on a phone. medium, not small: medium is the step that reaches
|
|
124
|
+
44px under touch.
|
|
125
|
+
*/
|
|
126
|
+
@media (pointer: coarse) {
|
|
127
|
+
button {
|
|
128
|
+
min-height: var(--tt-control-md);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
:host([icon-only]) button {
|
|
132
|
+
justify-content: center;
|
|
133
|
+
min-width: var(--tt-control-md);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
`]; }
|
|
137
|
+
render() {
|
|
138
|
+
return html `
|
|
139
|
+
<button
|
|
140
|
+
part="button"
|
|
141
|
+
class=${this.copied ? "copied" : ""}
|
|
142
|
+
type="button"
|
|
143
|
+
@click=${this.copy}
|
|
144
|
+
>
|
|
145
|
+
${this.copied
|
|
146
|
+
? html `
|
|
147
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor"
|
|
148
|
+
stroke-width="2.5" stroke-linecap="round"
|
|
149
|
+
stroke-linejoin="round" aria-hidden="true">
|
|
150
|
+
<path d="M20 6 9 17l-5-5" />
|
|
151
|
+
</svg>
|
|
152
|
+
`
|
|
153
|
+
: html `
|
|
154
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor"
|
|
155
|
+
stroke-width="2" stroke-linecap="round"
|
|
156
|
+
stroke-linejoin="round" aria-hidden="true">
|
|
157
|
+
<rect x="9" y="9" width="12" height="12" rx="2" />
|
|
158
|
+
<path d="M5 15V5a2 2 0 0 1 2-2h10" />
|
|
159
|
+
</svg>
|
|
160
|
+
`}
|
|
161
|
+
|
|
162
|
+
<span class="text">
|
|
163
|
+
${this.copied ? this.copiedLabel : this.label}
|
|
164
|
+
</span>
|
|
165
|
+
</button>
|
|
166
|
+
|
|
167
|
+
<!-- The button's own text changes, and a changing NAME is not
|
|
168
|
+
announced. A status region is. -->
|
|
169
|
+
<span class="sr-only" role="status">
|
|
170
|
+
${this.copied ? this.copiedLabel : ""}
|
|
171
|
+
</span>
|
|
172
|
+
`;
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
__decorate([
|
|
176
|
+
property({ type: String })
|
|
177
|
+
], TTCopyButton.prototype, "value", void 0);
|
|
178
|
+
__decorate([
|
|
179
|
+
property({ type: String })
|
|
180
|
+
], TTCopyButton.prototype, "label", void 0);
|
|
181
|
+
__decorate([
|
|
182
|
+
property({ type: String, attribute: "copied-label" })
|
|
183
|
+
], TTCopyButton.prototype, "copiedLabel", void 0);
|
|
184
|
+
__decorate([
|
|
185
|
+
property({ type: Boolean, attribute: "icon-only", reflect: true })
|
|
186
|
+
], TTCopyButton.prototype, "iconOnly", void 0);
|
|
187
|
+
__decorate([
|
|
188
|
+
state()
|
|
189
|
+
], TTCopyButton.prototype, "copied", void 0);
|
|
190
|
+
TTCopyButton = __decorate([
|
|
191
|
+
customElement("tt-copy-button")
|
|
192
|
+
], TTCopyButton);
|
|
193
|
+
export { TTCopyButton };
|
|
194
|
+
//# sourceMappingURL=tt-copy-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tt-copy-button.js","sourceRoot":"","sources":["../src/tt-copy-button.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;;;GAKG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAArC;;QACuB,UAAK,GAAG,EAAE,CAAC;QAEX,UAAK,GAAG,MAAM,CAAC;QAEY,gBAAW,GAAG,QAAQ,CAAC;QAE9E,yDAAyD;QACW,aAAQ,GAAG,KAAK,CAAC;QAEpE,WAAM,GAAG,KAAK,CAAC;IA+JlC,CAAC;IA3JC,oBAAoB;QAClB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,KAAK,CAAC,oBAAoB,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEhD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YAEnB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;YAE3D,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,SAAS,EAAE;gBACzB,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;gBAC7B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;YAC9D,0DAA0D;QAC5D,CAAC;IACH,CAAC;aAEM,WAAM,GAAG,CAAC,MAAM,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyF3B,CAAC,AAzFW,CAyFV;IAEH,MAAM;QACJ,OAAO,IAAI,CAAA;;;gBAGC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;;iBAE1B,IAAI,CAAC,IAAI;;UAEhB,IAAI,CAAC,MAAM;YACX,CAAC,CAAC,IAAI,CAAA;;;;;;aAMH;YACH,CAAC,CAAC,IAAI,CAAA;;;;;;;aAOH;;;YAGD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;;;;;;;UAO7C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;;KAExC,CAAC;IACJ,CAAC;;AAvK2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CAAY;AAEX;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CAAgB;AAEY;IAAtD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;iDAAwB;AAGV;IAAnE,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;8CAAkB;AAEpE;IAAhB,KAAK,EAAE;4CAAwB;AAVrB,YAAY;IADxB,aAAa,CAAC,gBAAgB,CAAC;GACnB,YAAY,CAyKxB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
import type { TemplateResult } from "lit";
|
|
3
|
+
import "./tt-checkbox.js";
|
|
4
|
+
import "./tt-skeleton.js";
|
|
5
|
+
import "./tt-empty-state.js";
|
|
6
|
+
import "./tt-dropdown-menu.js";
|
|
7
|
+
import "./tt-icon.js";
|
|
8
|
+
import type { MenuAction } from "./tt-dropdown-menu.js";
|
|
9
|
+
export type DataCell = string | number | TemplateResult;
|
|
10
|
+
export type DataRow = Record<string, DataCell> & {
|
|
11
|
+
id: string;
|
|
12
|
+
};
|
|
13
|
+
export interface DataColumn {
|
|
14
|
+
key: string;
|
|
15
|
+
label: string;
|
|
16
|
+
sortable?: boolean;
|
|
17
|
+
align?: "start" | "end";
|
|
18
|
+
width?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SortState {
|
|
21
|
+
key: string;
|
|
22
|
+
direction: "asc" | "desc";
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Working table: sorting, selection, row actions, sticky header, and
|
|
26
|
+
* loading and empty states. With visible-rows it is virtualized: a box
|
|
27
|
+
* that many rows tall, holding only the rows in view, so ten thousand
|
|
28
|
+
* rows scroll as smoothly as ten.
|
|
29
|
+
*
|
|
30
|
+
* It owns nothing. Sort state and selection come in as properties and
|
|
31
|
+
* changes go out as events, so the page stays the single source of truth
|
|
32
|
+
* and can put either in a URL. Sorting itself is the page's job too: it
|
|
33
|
+
* knows whether the data is an in-memory array or a server query.
|
|
34
|
+
*/
|
|
35
|
+
export declare class TTDataTable extends LitElement {
|
|
36
|
+
columns: DataColumn[];
|
|
37
|
+
rows: DataRow[];
|
|
38
|
+
label: string;
|
|
39
|
+
private rowLabel;
|
|
40
|
+
private rowName;
|
|
41
|
+
sort?: SortState;
|
|
42
|
+
selectable: boolean;
|
|
43
|
+
selected: string[];
|
|
44
|
+
rowActions: MenuAction[];
|
|
45
|
+
loading: boolean;
|
|
46
|
+
loadingRows: number;
|
|
47
|
+
emptyHeading: string;
|
|
48
|
+
emptyDescription: string;
|
|
49
|
+
clickableRows: boolean;
|
|
50
|
+
visibleRows: number;
|
|
51
|
+
private firstInView;
|
|
52
|
+
private rowHeight;
|
|
53
|
+
private headerHeight;
|
|
54
|
+
private columnWidths;
|
|
55
|
+
private widthUnit;
|
|
56
|
+
private wrap?;
|
|
57
|
+
private frame;
|
|
58
|
+
private resizeObserver?;
|
|
59
|
+
private wrapWidth;
|
|
60
|
+
private lastRange;
|
|
61
|
+
private get virtual();
|
|
62
|
+
/** The slice of rows in the page: the ones in view plus OVERSCAN each side. */
|
|
63
|
+
private get inPage();
|
|
64
|
+
connectedCallback(): void;
|
|
65
|
+
disconnectedCallback(): void;
|
|
66
|
+
firstUpdated(): void;
|
|
67
|
+
updated(): void;
|
|
68
|
+
private observeWidth;
|
|
69
|
+
private measureSoon;
|
|
70
|
+
private measure;
|
|
71
|
+
private handleScroll;
|
|
72
|
+
private syncToScroll;
|
|
73
|
+
private announceRange;
|
|
74
|
+
private get hasActions();
|
|
75
|
+
private get columnCount();
|
|
76
|
+
private get allSelected();
|
|
77
|
+
private get someSelected();
|
|
78
|
+
private emitSelection;
|
|
79
|
+
private toggleAll;
|
|
80
|
+
private toggleRow;
|
|
81
|
+
private toggleSort;
|
|
82
|
+
private clickRow;
|
|
83
|
+
private chooseAction;
|
|
84
|
+
static styles: import("lit").CSSResult[];
|
|
85
|
+
private renderHeader;
|
|
86
|
+
private renderLoading;
|
|
87
|
+
private renderRow;
|
|
88
|
+
private renderRows;
|
|
89
|
+
render(): TemplateResult<1>;
|
|
90
|
+
}
|
|
91
|
+
declare global {
|
|
92
|
+
interface HTMLElementTagNameMap {
|
|
93
|
+
"tt-data-table": TTDataTable;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=tt-data-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tt-data-table.d.ts","sourceRoot":"","sources":["../src/tt-data-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAK1C,OAAO,kBAAkB,CAAC;AAC1B,OAAO,kBAAkB,CAAC;AAC1B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,cAAc,CAAC;AAExD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG;IAG/C,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAExB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CAC3B;AAYD;;;;;;;;;;GAUG;AACH,qBACa,WAAY,SAAQ,UAAU;IACd,OAAO,EAAE,UAAU,EAAE,CAAM;IAE3B,IAAI,EAAE,OAAO,EAAE,CAAM;IAOpB,KAAK,SAAM;IAUvC,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,OAAO;IAMa,IAAI,CAAC,EAAE,SAAS,CAAC;IAEhB,UAAU,UAAS;IAErB,QAAQ,EAAE,MAAM,EAAE,CAAM;IAGE,UAAU,EAAE,UAAU,EAAE,CAAM;IAEtD,OAAO,UAAS;IAEU,WAAW,SAAK;IAEf,YAAY,SAAsB;IAE9B,gBAAgB,SAAM;IAGxB,aAAa,UAAS;IAWzB,WAAW,SAAK;IAG9D,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,YAAY,CAAK;IAWzB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,SAAS,CAAmB;IAE7B,OAAO,CAAC,IAAI,CAAC,CAAc;IAE3C,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAM;IAEvB,OAAO,KAAK,OAAO,GAElB;IAED,+EAA+E;IAC/E,OAAO,KAAK,MAAM,GASjB;IAED,iBAAiB;IAMjB,oBAAoB;IAOpB,YAAY;IAIZ,OAAO;IAMP,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,OAAO;IA8Bf,OAAO,CAAC,YAAY,CAOlB;IAEF,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,aAAa;IAgBrB,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,WAAW,GAItB;IAUD,OAAO,KAAK,WAAW,GAKtB;IAED,OAAO,KAAK,YAAY,GAKvB;IAED,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,YAAY;IAgBpB,MAAM,CAAC,MAAM,4BAmNX;IAEF,OAAO,CAAC,YAAY;IA2EpB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,SAAS;IAiEjB,OAAO,CAAC,UAAU;IAqBlB,MAAM;CAkDP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,WAAW,CAAC;KAC9B;CACF"}
|