@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,210 @@
|
|
|
1
|
+
import { Directive, directive } from "lit/directive.js";
|
|
2
|
+
import { PartType } from "lit/directive.js";
|
|
3
|
+
/*
|
|
4
|
+
A resize HANDLE, behaviour only: it reports movement and never applies
|
|
5
|
+
it.
|
|
6
|
+
|
|
7
|
+
Put it on the strip or corner a person grabs. The owner keeps the size,
|
|
8
|
+
which is "events up, data down": the handle cannot know what it
|
|
9
|
+
resizes, so the same directive serves a sidebar, a table column and a
|
|
10
|
+
builder's canvas. The owner's half of the deal:
|
|
11
|
+
|
|
12
|
+
- Remember the size in onResizeStart, then set start + delta in
|
|
13
|
+
onResize. The delta counts from the start of the gesture, so a late
|
|
14
|
+
or dropped move event cannot make the size drift.
|
|
15
|
+
- Clamp to your own minimum and maximum. The handle knows no bounds.
|
|
16
|
+
- Divide by any scale you draw at (a zoomed canvas). The delta is in
|
|
17
|
+
the page's pixels, not yours.
|
|
18
|
+
- Give the handle its meaning. This sets no role, ARIA or tabindex,
|
|
19
|
+
because only the owner knows the label and the current size. The
|
|
20
|
+
pattern is a focusable separator (the "window splitter"):
|
|
21
|
+
role="separator" tabindex="0" aria-label="Resize sidebar"
|
|
22
|
+
aria-orientation="vertical" aria-valuenow="280"
|
|
23
|
+
plus aria-valuemin and aria-valuemax when there are bounds.
|
|
24
|
+
aria-orientation names the LINE, not the movement: a handle dragged
|
|
25
|
+
left and right is a vertical line.
|
|
26
|
+
|
|
27
|
+
Listeners are attached ONCE and read the latest options, as in
|
|
28
|
+
tt-draggable. update() runs on every render of the template this sits
|
|
29
|
+
in, and here that is every pointer move, because an onResize that sets
|
|
30
|
+
the owner's state re-renders it. Detaching and reattaching each time
|
|
31
|
+
would strip the `resizing` attribute and lose the gesture mid-drag.
|
|
32
|
+
Keeping the newest options in a field gives the same "always current"
|
|
33
|
+
behaviour without touching the element.
|
|
34
|
+
*/
|
|
35
|
+
class ResizableDirective extends Directive {
|
|
36
|
+
constructor(partInfo) {
|
|
37
|
+
super(partInfo);
|
|
38
|
+
this.options = {};
|
|
39
|
+
this.attached = false;
|
|
40
|
+
// The pointer driving the current drag, or null between gestures.
|
|
41
|
+
this.pointerId = null;
|
|
42
|
+
this.startX = 0;
|
|
43
|
+
this.startY = 0;
|
|
44
|
+
this.delta = { dx: 0, dy: 0 };
|
|
45
|
+
this.handlePointerDown = (e) => {
|
|
46
|
+
// The main button only: a right click opens a menu, it does not resize.
|
|
47
|
+
if (e.button !== 0 || !this.element)
|
|
48
|
+
return;
|
|
49
|
+
// A press while a gesture is still open means its end never arrived
|
|
50
|
+
// (the handle was moved in the DOM mid-drag, say). Close it, so every
|
|
51
|
+
// start the owner hears is matched by exactly one end.
|
|
52
|
+
this.end();
|
|
53
|
+
/*
|
|
54
|
+
Capture sends every later move, and the release, to this element
|
|
55
|
+
even once the pointer has left it. A handle is a few pixels wide,
|
|
56
|
+
so without capture a quick drag outruns it and the resize stalls.
|
|
57
|
+
|
|
58
|
+
In a try because it throws for a pointer the browser is not
|
|
59
|
+
tracking, which is exactly what a synthetic PointerEvent in a test
|
|
60
|
+
is. Nothing else depends on it, so the gesture still runs.
|
|
61
|
+
*/
|
|
62
|
+
try {
|
|
63
|
+
this.element.setPointerCapture(e.pointerId);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Not a live pointer. See above.
|
|
67
|
+
}
|
|
68
|
+
this.pointerId = e.pointerId;
|
|
69
|
+
this.startX = e.clientX;
|
|
70
|
+
this.startY = e.clientY;
|
|
71
|
+
this.delta = { dx: 0, dy: 0 };
|
|
72
|
+
this.element.setAttribute("resizing", "");
|
|
73
|
+
this.options.onResizeStart?.();
|
|
74
|
+
};
|
|
75
|
+
this.handlePointerMove = (e) => {
|
|
76
|
+
if (e.pointerId !== this.pointerId)
|
|
77
|
+
return;
|
|
78
|
+
// Cumulative from where the press started, never per event.
|
|
79
|
+
this.delta = this.measure(e.clientX - this.startX, e.clientY - this.startY);
|
|
80
|
+
this.options.onResize?.(this.delta);
|
|
81
|
+
};
|
|
82
|
+
// pointerup, pointercancel and lostpointercapture all end a drag, and a
|
|
83
|
+
// real release fires two of them. end() only acts on the first.
|
|
84
|
+
this.handlePointerEnd = (e) => {
|
|
85
|
+
if (e.pointerId === this.pointerId)
|
|
86
|
+
this.end();
|
|
87
|
+
};
|
|
88
|
+
/*
|
|
89
|
+
Each key press is a whole gesture: start, one move, end. An owner
|
|
90
|
+
then handles the keyboard and the pointer with the same three
|
|
91
|
+
callbacks and never needs to know which one it got.
|
|
92
|
+
*/
|
|
93
|
+
this.handleKeyDown = (e) => {
|
|
94
|
+
// A key in the middle of a drag would open a second gesture inside
|
|
95
|
+
// the first, and reset the start size the owner is counting from.
|
|
96
|
+
if (this.pointerId !== null)
|
|
97
|
+
return;
|
|
98
|
+
// With Alt, Ctrl or Meta held, an arrow belongs to the browser or the
|
|
99
|
+
// system (Alt+Left is Back), not to this handle.
|
|
100
|
+
if (e.altKey || e.ctrlKey || e.metaKey)
|
|
101
|
+
return;
|
|
102
|
+
const delta = this.keyDelta(e.key);
|
|
103
|
+
if (!delta)
|
|
104
|
+
return;
|
|
105
|
+
// Only for keys this handles, or the page would scroll as well.
|
|
106
|
+
e.preventDefault();
|
|
107
|
+
const { onResizeStart, onResize, onResizeEnd } = this.options;
|
|
108
|
+
onResizeStart?.();
|
|
109
|
+
onResize?.(delta);
|
|
110
|
+
onResizeEnd?.(delta);
|
|
111
|
+
};
|
|
112
|
+
if (partInfo.type !== PartType.ELEMENT) {
|
|
113
|
+
throw new Error("The resizable directive can only be attached directly to an element (e.g. <div ${resizable()}>)");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
render(_options) {
|
|
117
|
+
// Behavior-only directive
|
|
118
|
+
}
|
|
119
|
+
update(part, [options = {}]) {
|
|
120
|
+
this.element = part.element;
|
|
121
|
+
this.options = options;
|
|
122
|
+
if (options.disabled)
|
|
123
|
+
this.detach();
|
|
124
|
+
else
|
|
125
|
+
this.attach();
|
|
126
|
+
}
|
|
127
|
+
// The axis that is not asked for is always 0, so an owner can apply
|
|
128
|
+
// both numbers without checking which one it wanted.
|
|
129
|
+
measure(dx, dy) {
|
|
130
|
+
const axis = this.options.axis ?? "x";
|
|
131
|
+
return {
|
|
132
|
+
dx: axis === "y" ? 0 : dx,
|
|
133
|
+
dy: axis === "x" ? 0 : dy,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
end() {
|
|
137
|
+
if (this.pointerId === null)
|
|
138
|
+
return;
|
|
139
|
+
this.pointerId = null;
|
|
140
|
+
this.element?.removeAttribute("resizing");
|
|
141
|
+
this.options.onResizeEnd?.(this.delta);
|
|
142
|
+
}
|
|
143
|
+
// A key for the axis that is not reported does nothing at all, so
|
|
144
|
+
// ArrowUp on a sideways handle still scrolls the page as it normally would.
|
|
145
|
+
keyDelta(key) {
|
|
146
|
+
const axis = this.options.axis ?? "x";
|
|
147
|
+
const step = this.options.step ?? 16;
|
|
148
|
+
const sideways = axis !== "y";
|
|
149
|
+
const upDown = axis !== "x";
|
|
150
|
+
switch (key) {
|
|
151
|
+
case "ArrowLeft":
|
|
152
|
+
return sideways ? { dx: -step, dy: 0 } : null;
|
|
153
|
+
case "ArrowRight":
|
|
154
|
+
return sideways ? { dx: step, dy: 0 } : null;
|
|
155
|
+
case "ArrowUp":
|
|
156
|
+
return upDown ? { dx: 0, dy: -step } : null;
|
|
157
|
+
case "ArrowDown":
|
|
158
|
+
return upDown ? { dx: 0, dy: step } : null;
|
|
159
|
+
default:
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
attach() {
|
|
164
|
+
if (this.attached || !this.element)
|
|
165
|
+
return;
|
|
166
|
+
this.attached = true;
|
|
167
|
+
/*
|
|
168
|
+
touch-action: none, or a touch drag scrolls the page instead of
|
|
169
|
+
resizing. The browser decides that a touch is a scroll before any
|
|
170
|
+
script runs, then cancels the pointer a few pixels in.
|
|
171
|
+
|
|
172
|
+
Inline, because a directive has no stylesheet of its own. So do not
|
|
173
|
+
bind the handle's own style attribute in a template: that binding
|
|
174
|
+
rewrites the whole attribute and would drop this.
|
|
175
|
+
*/
|
|
176
|
+
this.element.style.touchAction = "none";
|
|
177
|
+
this.element.addEventListener("pointerdown", this.handlePointerDown);
|
|
178
|
+
this.element.addEventListener("pointermove", this.handlePointerMove);
|
|
179
|
+
this.element.addEventListener("pointerup", this.handlePointerEnd);
|
|
180
|
+
this.element.addEventListener("pointercancel", this.handlePointerEnd);
|
|
181
|
+
this.element.addEventListener("lostpointercapture", this.handlePointerEnd);
|
|
182
|
+
this.element.addEventListener("keydown", this.handleKeyDown);
|
|
183
|
+
}
|
|
184
|
+
detach() {
|
|
185
|
+
if (!this.attached || !this.element)
|
|
186
|
+
return;
|
|
187
|
+
this.attached = false;
|
|
188
|
+
/*
|
|
189
|
+
Disabling mid-drag cancels the gesture WITHOUT calling onResizeEnd.
|
|
190
|
+
This runs inside the owner's render, and the owner is the one that
|
|
191
|
+
turned the handle off, so it already knows. A callback here would
|
|
192
|
+
be setting the owner's state in the middle of its own render.
|
|
193
|
+
*/
|
|
194
|
+
if (this.pointerId !== null &&
|
|
195
|
+
this.element.hasPointerCapture(this.pointerId)) {
|
|
196
|
+
this.element.releasePointerCapture(this.pointerId);
|
|
197
|
+
}
|
|
198
|
+
this.pointerId = null;
|
|
199
|
+
this.element.removeAttribute("resizing");
|
|
200
|
+
this.element.style.removeProperty("touch-action");
|
|
201
|
+
this.element.removeEventListener("pointerdown", this.handlePointerDown);
|
|
202
|
+
this.element.removeEventListener("pointermove", this.handlePointerMove);
|
|
203
|
+
this.element.removeEventListener("pointerup", this.handlePointerEnd);
|
|
204
|
+
this.element.removeEventListener("pointercancel", this.handlePointerEnd);
|
|
205
|
+
this.element.removeEventListener("lostpointercapture", this.handlePointerEnd);
|
|
206
|
+
this.element.removeEventListener("keydown", this.handleKeyDown);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export const resizable = directive(ResizableDirective);
|
|
210
|
+
//# sourceMappingURL=tt-resizable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tt-resizable.js","sourceRoot":"","sources":["../../src/interaction/tt-resizable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AsyncDirective } from "lit/async-directive.js";
|
|
2
|
+
import type { ElementPart, PartInfo, DirectiveParameters } from "lit/directive.js";
|
|
3
|
+
/** The way an element travels as it arrives. "none" only fades. */
|
|
4
|
+
export type RevealDirection = "up" | "down" | "left" | "right" | "none";
|
|
5
|
+
export interface RevealOptions {
|
|
6
|
+
/** Default "up": starts a little below its place and rises into it. */
|
|
7
|
+
direction?: RevealDirection;
|
|
8
|
+
/** How far it travels. A CSS length, or a number of pixels. Default --tt-reveal-distance, else 1.5rem. */
|
|
9
|
+
distance?: string | number;
|
|
10
|
+
/** Milliseconds before it starts moving. Default 0. */
|
|
11
|
+
delay?: number;
|
|
12
|
+
/** Its place in a group that arrives together. Each step adds `stagger` ms of delay. Default 0. */
|
|
13
|
+
index?: number;
|
|
14
|
+
/** Milliseconds per index step. Default 60. */
|
|
15
|
+
stagger?: number;
|
|
16
|
+
/** Default true: arrive once, then stay. false hides it again whenever it leaves the viewport, so it replays. */
|
|
17
|
+
once?: boolean;
|
|
18
|
+
/** Grows or shrinks the viewport the observer checks against. Default "0px": any pixel in view counts. */
|
|
19
|
+
rootMargin?: string;
|
|
20
|
+
/** Shown as it is, with no observer. */
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
/** Called each time it comes into view (with or without motion). */
|
|
23
|
+
onReveal?: (element: Element) => void;
|
|
24
|
+
}
|
|
25
|
+
declare class RevealDirective extends AsyncDirective {
|
|
26
|
+
private element?;
|
|
27
|
+
private options;
|
|
28
|
+
private state;
|
|
29
|
+
private unwatch?;
|
|
30
|
+
private cancelFinish?;
|
|
31
|
+
private queued;
|
|
32
|
+
constructor(partInfo: PartInfo);
|
|
33
|
+
render(_options?: RevealOptions): void;
|
|
34
|
+
update(part: ElementPart, [options]: DirectiveParameters<this>): void;
|
|
35
|
+
private sync;
|
|
36
|
+
private start;
|
|
37
|
+
private writeOffsets;
|
|
38
|
+
private handleEntry;
|
|
39
|
+
private reveal;
|
|
40
|
+
private settle;
|
|
41
|
+
private handleFocusIn;
|
|
42
|
+
private stopWatching;
|
|
43
|
+
private stop;
|
|
44
|
+
protected disconnected(): void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Fades and slides an element into place when it scrolls into view.
|
|
48
|
+
*
|
|
49
|
+
* <section ${reveal()}>...</section>
|
|
50
|
+
* ${items.map((item, i) => html`<li ${reveal({ index: i % 3 })}>...</li>`)}
|
|
51
|
+
*/
|
|
52
|
+
export declare const reveal: (_options?: RevealOptions | undefined) => import("lit-html/directive.js").DirectiveResult<typeof RevealDirective>;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=tt-reveal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tt-reveal.d.ts","sourceRoot":"","sources":["../../src/interaction/tt-reveal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAI1B,mEAAmE;AACnE,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iHAAiH;IACjH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0GAA0G;IAC1G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAoKD,cAAM,eAAgB,SAAQ,cAAc;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,KAAK,CAAiB;IAE9B,OAAO,CAAC,OAAO,CAAC,CAAa;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAa;IAClC,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,EAAE,QAAQ;IAS9B,MAAM,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI;IAI7B,MAAM,CACb,IAAI,EAAE,WAAW,EACjB,CAAC,OAAY,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,GACxC,IAAI;IA2BP,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,KAAK;IAyBb,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,WAAW,CAoBjB;IAEF,OAAO,CAAC,MAAM;IAuBd,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,aAAa,CAMnB;IAEF,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,IAAI;cAmBO,YAAY,IAAI,IAAI;CAIxC;AAED;;;;;GAKG;AACH,eAAO,MAAM,MAAM,mHAA6B,CAAC"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { AsyncDirective } from "lit/async-directive.js";
|
|
2
|
+
import { directive, PartType } from "lit/directive.js";
|
|
3
|
+
import { afterTransitions } from "../motion.js";
|
|
4
|
+
/*
|
|
5
|
+
Content that fades and rises into place as it scrolls into view.
|
|
6
|
+
|
|
7
|
+
THE STYLES ARE CSS, NOT SCRIPT. The directive only flips one attribute,
|
|
8
|
+
data-tt-reveal, from "hidden" to "in". What those two states look like
|
|
9
|
+
lives in one shared stylesheet, adopted into whichever document or
|
|
10
|
+
shadow root the element sits in, and every rule in it is inside
|
|
11
|
+
|
|
12
|
+
@media screen and (prefers-reduced-motion: no-preference)
|
|
13
|
+
|
|
14
|
+
That single query is the safety net. Reduced motion, a printout, and a
|
|
15
|
+
setting changed while the page is open all show the content at once,
|
|
16
|
+
decided by the browser, with no script to get wrong. Where the sheet
|
|
17
|
+
cannot be adopted, or IntersectionObserver is missing, nothing is ever
|
|
18
|
+
hidden at all: the failure mode is "no animation", never "no content".
|
|
19
|
+
|
|
20
|
+
Only opacity and translate, so the element keeps its box from the first
|
|
21
|
+
frame and nothing around it moves (no layout shift). translate, not
|
|
22
|
+
transform, so an element that already has a transform keeps it.
|
|
23
|
+
|
|
24
|
+
!important in the sheet, deliberately. The two states are short-lived
|
|
25
|
+
and owned by this directive, and without it any consumer rule more
|
|
26
|
+
specific than an attribute selector (".grid .card { opacity: 1 }")
|
|
27
|
+
silently cancels the hidden state, and with it the whole effect. Once
|
|
28
|
+
the element has arrived the attribute is removed, so its own styles,
|
|
29
|
+
transitions included, are back in charge.
|
|
30
|
+
|
|
31
|
+
Keyboard users never land on an invisible control: focus moving inside
|
|
32
|
+
a hidden element reveals it on the spot.
|
|
33
|
+
*/
|
|
34
|
+
const STYLES = `
|
|
35
|
+
@media screen and (prefers-reduced-motion: no-preference) {
|
|
36
|
+
[data-tt-reveal="hidden"] {
|
|
37
|
+
opacity: 0 !important;
|
|
38
|
+
translate: var(--_tt-reveal-x, 0) var(--_tt-reveal-y, 0) !important;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
[data-tt-reveal="in"] {
|
|
42
|
+
transition:
|
|
43
|
+
opacity var(--tt-reveal-duration, var(--tt-duration-slower))
|
|
44
|
+
var(--tt-ease-out) var(--_tt-reveal-delay, 0ms),
|
|
45
|
+
translate var(--tt-reveal-duration, var(--tt-duration-slower))
|
|
46
|
+
var(--tt-ease-out) var(--_tt-reveal-delay, 0ms) !important;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
// Built once, on first use, and shared by every root. null once it is
|
|
51
|
+
// known the browser cannot construct one.
|
|
52
|
+
let sheet;
|
|
53
|
+
function revealSheet() {
|
|
54
|
+
if (sheet === undefined) {
|
|
55
|
+
try {
|
|
56
|
+
sheet = new CSSStyleSheet();
|
|
57
|
+
sheet.replaceSync(STYLES);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
sheet = null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return sheet;
|
|
64
|
+
}
|
|
65
|
+
/*
|
|
66
|
+
Puts the shared sheet into the root the element lives in. A shadow root
|
|
67
|
+
sees none of the page's styles, so each root needs it once. False when
|
|
68
|
+
that is impossible: a detached element, a root in another document (an
|
|
69
|
+
iframe), or no constructable stylesheets.
|
|
70
|
+
*/
|
|
71
|
+
function adoptInto(root) {
|
|
72
|
+
if (!(root instanceof Document || root instanceof ShadowRoot))
|
|
73
|
+
return false;
|
|
74
|
+
const shared = revealSheet();
|
|
75
|
+
if (!shared)
|
|
76
|
+
return false;
|
|
77
|
+
try {
|
|
78
|
+
if (!root.adoptedStyleSheets.includes(shared)) {
|
|
79
|
+
root.adoptedStyleSheets = [...root.adoptedStyleSheets, shared];
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const pools = new Map();
|
|
88
|
+
function watch(element, rootMargin, watcher) {
|
|
89
|
+
let pool = pools.get(rootMargin);
|
|
90
|
+
if (!pool) {
|
|
91
|
+
const watchers = new Map();
|
|
92
|
+
const observer = new IntersectionObserver((entries) => {
|
|
93
|
+
for (const entry of entries)
|
|
94
|
+
watchers.get(entry.target)?.(entry);
|
|
95
|
+
}, { rootMargin, threshold: 0 });
|
|
96
|
+
pool = { observer, watchers };
|
|
97
|
+
pools.set(rootMargin, pool);
|
|
98
|
+
}
|
|
99
|
+
const owner = pool;
|
|
100
|
+
owner.watchers.set(element, watcher);
|
|
101
|
+
owner.observer.observe(element);
|
|
102
|
+
return () => {
|
|
103
|
+
if (owner.watchers.get(element) !== watcher)
|
|
104
|
+
return;
|
|
105
|
+
owner.watchers.delete(element);
|
|
106
|
+
owner.observer.unobserve(element);
|
|
107
|
+
// The last one out disconnects it, so no observer outlives its use.
|
|
108
|
+
if (owner.watchers.size === 0) {
|
|
109
|
+
owner.observer.disconnect();
|
|
110
|
+
if (pools.get(rootMargin) === owner)
|
|
111
|
+
pools.delete(rootMargin);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function toLength(distance) {
|
|
116
|
+
if (distance === undefined)
|
|
117
|
+
return "var(--tt-reveal-distance, 1.5rem)";
|
|
118
|
+
return typeof distance === "number" ? `${distance}px` : distance;
|
|
119
|
+
}
|
|
120
|
+
// Where the element starts, as the x and y it travels FROM.
|
|
121
|
+
function offsets(direction, length) {
|
|
122
|
+
switch (direction) {
|
|
123
|
+
case "down":
|
|
124
|
+
return ["0px", `calc(${length} * -1)`];
|
|
125
|
+
case "left":
|
|
126
|
+
return [length, "0px"];
|
|
127
|
+
case "right":
|
|
128
|
+
return [`calc(${length} * -1)`, "0px"];
|
|
129
|
+
case "none":
|
|
130
|
+
return ["0px", "0px"];
|
|
131
|
+
default:
|
|
132
|
+
return ["0px", length];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/*
|
|
136
|
+
An AsyncDirective rather than a plain one, for disconnected(): it is
|
|
137
|
+
told when its element leaves the page, which is where the observer is
|
|
138
|
+
given up. A plain Directive never hears about it, and the observer
|
|
139
|
+
would keep the element alive.
|
|
140
|
+
*/
|
|
141
|
+
class RevealDirective extends AsyncDirective {
|
|
142
|
+
constructor(partInfo) {
|
|
143
|
+
super(partInfo);
|
|
144
|
+
this.options = {};
|
|
145
|
+
this.state = "idle";
|
|
146
|
+
this.queued = false;
|
|
147
|
+
this.handleEntry = (entry) => {
|
|
148
|
+
// Removed without a disconnect reaching this directive (a template
|
|
149
|
+
// rendered with render() and never cleared): stop holding on to it.
|
|
150
|
+
if (!this.element?.isConnected) {
|
|
151
|
+
this.stopWatching();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (entry.isIntersecting) {
|
|
155
|
+
if (this.state === "hidden")
|
|
156
|
+
this.reveal();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Left the viewport. Only a replaying reveal goes back to hidden,
|
|
160
|
+
// and it does so instantly, out of sight.
|
|
161
|
+
if (this.options.once === false && this.state !== "hidden") {
|
|
162
|
+
this.cancelFinish?.();
|
|
163
|
+
this.element?.setAttribute("data-tt-reveal", "hidden");
|
|
164
|
+
this.state = "hidden";
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
// Tabbed into while still hidden: shown at once, not faded in under
|
|
168
|
+
// the focus ring.
|
|
169
|
+
this.handleFocusIn = () => {
|
|
170
|
+
if (this.state !== "hidden")
|
|
171
|
+
return;
|
|
172
|
+
if (this.options.once !== false)
|
|
173
|
+
this.stopWatching();
|
|
174
|
+
this.settle();
|
|
175
|
+
if (this.element)
|
|
176
|
+
this.options.onReveal?.(this.element);
|
|
177
|
+
};
|
|
178
|
+
if (partInfo.type !== PartType.ELEMENT) {
|
|
179
|
+
throw new Error("The reveal directive can only be attached directly to an element (e.g. <section ${reveal()}>)");
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
render(_options) {
|
|
183
|
+
// Behaviour-only directive
|
|
184
|
+
}
|
|
185
|
+
update(part, [options = {}]) {
|
|
186
|
+
this.element = part.element;
|
|
187
|
+
this.options = options;
|
|
188
|
+
if (options.disabled) {
|
|
189
|
+
this.stop();
|
|
190
|
+
// Re-enabling arms it again, unless it has already arrived.
|
|
191
|
+
if (this.state !== "done")
|
|
192
|
+
this.state = "idle";
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
/*
|
|
196
|
+
In a microtask, never during the render itself. On a first render
|
|
197
|
+
this runs while the template is still a detached fragment, so there
|
|
198
|
+
is no root to adopt the sheet into yet, and a style binding later
|
|
199
|
+
on the same element would overwrite the custom properties written
|
|
200
|
+
now. A microtask still runs before the first paint.
|
|
201
|
+
*/
|
|
202
|
+
if (!this.queued) {
|
|
203
|
+
this.queued = true;
|
|
204
|
+
queueMicrotask(() => {
|
|
205
|
+
this.queued = false;
|
|
206
|
+
this.sync();
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
sync() {
|
|
211
|
+
const element = this.element;
|
|
212
|
+
if (!element || !this.isConnected || this.options.disabled)
|
|
213
|
+
return;
|
|
214
|
+
if (this.state === "idle")
|
|
215
|
+
this.start(element);
|
|
216
|
+
else if (this.state === "hidden")
|
|
217
|
+
this.writeOffsets(element);
|
|
218
|
+
}
|
|
219
|
+
start(element) {
|
|
220
|
+
const supported = typeof IntersectionObserver === "function" &&
|
|
221
|
+
adoptInto(element.getRootNode());
|
|
222
|
+
// Nothing is hidden that cannot be shown again: without an observer
|
|
223
|
+
// or the stylesheet, the element simply stays as it is.
|
|
224
|
+
if (!supported) {
|
|
225
|
+
this.state = "done";
|
|
226
|
+
this.options.onReveal?.(element);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
this.writeOffsets(element);
|
|
230
|
+
element.setAttribute("data-tt-reveal", "hidden");
|
|
231
|
+
this.state = "hidden";
|
|
232
|
+
element.addEventListener("focusin", this.handleFocusIn);
|
|
233
|
+
this.unwatch = watch(element, this.options.rootMargin ?? "0px", this.handleEntry);
|
|
234
|
+
}
|
|
235
|
+
writeOffsets(element) {
|
|
236
|
+
const { direction = "up", distance, delay = 0, index = 0, stagger = 60 } = this.options;
|
|
237
|
+
const [x, y] = offsets(direction, toLength(distance));
|
|
238
|
+
element.style.setProperty("--_tt-reveal-x", x);
|
|
239
|
+
element.style.setProperty("--_tt-reveal-y", y);
|
|
240
|
+
element.style.setProperty("--_tt-reveal-delay", `${Math.max(0, delay + index * stagger)}ms`);
|
|
241
|
+
}
|
|
242
|
+
reveal() {
|
|
243
|
+
const element = this.element;
|
|
244
|
+
if (!element)
|
|
245
|
+
return;
|
|
246
|
+
element.setAttribute("data-tt-reveal", "in");
|
|
247
|
+
this.state = "in";
|
|
248
|
+
// Arriving once means there is nothing left to watch for.
|
|
249
|
+
if (this.options.once !== false)
|
|
250
|
+
this.stopWatching();
|
|
251
|
+
this.options.onReveal?.(element);
|
|
252
|
+
// Read after "in" is applied, so the durations are the reveal's own.
|
|
253
|
+
this.cancelFinish = afterTransitions([element], () => {
|
|
254
|
+
this.cancelFinish = undefined;
|
|
255
|
+
this.settle();
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
/*
|
|
259
|
+
Arrived: the attribute goes, so the element's own styles (its own
|
|
260
|
+
transitions especially) are back in charge.
|
|
261
|
+
*/
|
|
262
|
+
settle() {
|
|
263
|
+
this.element?.removeAttribute("data-tt-reveal");
|
|
264
|
+
this.state = this.options.once === false ? "shown" : "done";
|
|
265
|
+
}
|
|
266
|
+
stopWatching() {
|
|
267
|
+
this.unwatch?.();
|
|
268
|
+
this.unwatch = undefined;
|
|
269
|
+
this.element?.removeEventListener("focusin", this.handleFocusIn);
|
|
270
|
+
}
|
|
271
|
+
// Back to the element exactly as it was written, fully visible.
|
|
272
|
+
stop() {
|
|
273
|
+
this.stopWatching();
|
|
274
|
+
this.cancelFinish?.();
|
|
275
|
+
this.cancelFinish = undefined;
|
|
276
|
+
const element = this.element;
|
|
277
|
+
if (!element)
|
|
278
|
+
return;
|
|
279
|
+
element.removeAttribute("data-tt-reveal");
|
|
280
|
+
element.style.removeProperty("--_tt-reveal-x");
|
|
281
|
+
element.style.removeProperty("--_tt-reveal-y");
|
|
282
|
+
element.style.removeProperty("--_tt-reveal-delay");
|
|
283
|
+
}
|
|
284
|
+
/*
|
|
285
|
+
Left the page (or the template stopped using this directive). The
|
|
286
|
+
observer is given up and the element is left VISIBLE: if it is ever
|
|
287
|
+
put back, it should be there, not waiting on a reveal that already
|
|
288
|
+
belonged to its last visit.
|
|
289
|
+
*/
|
|
290
|
+
disconnected() {
|
|
291
|
+
this.stop();
|
|
292
|
+
this.state = "done";
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Fades and slides an element into place when it scrolls into view.
|
|
297
|
+
*
|
|
298
|
+
* <section ${reveal()}>...</section>
|
|
299
|
+
* ${items.map((item, i) => html`<li ${reveal({ index: i % 3 })}>...</li>`)}
|
|
300
|
+
*/
|
|
301
|
+
export const reveal = directive(RevealDirective);
|
|
302
|
+
//# sourceMappingURL=tt-reveal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tt-reveal.js","sourceRoot":"","sources":["../../src/interaction/tt-reveal.ts"],"names":[],"mappings":"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"}
|
package/dist/motion.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calls `done` once the transitions on every element given have had time
|
|
3
|
+
* to finish. Call it AFTER the styles being waited on are applied (the
|
|
4
|
+
* closing ones, say), so the durations it reads are theirs. Returns a
|
|
5
|
+
* cancel function, for an overlay reopened before its exit finished.
|
|
6
|
+
*/
|
|
7
|
+
export declare function afterTransitions(elements: (Element | null | undefined)[], done: () => void): () => void;
|
|
8
|
+
//# sourceMappingURL=motion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AAuCA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EACxC,IAAI,EAAE,MAAM,IAAI,GACf,MAAM,IAAI,CAUZ"}
|
package/dist/motion.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Knowing when a transition is over, for motion that has to clean up
|
|
3
|
+
after itself.
|
|
4
|
+
|
|
5
|
+
Exit motion for things that are REMOVED when they close (tt-modal,
|
|
6
|
+
tt-drawer, a dismissed tt-toast) needs it most. Removing an element ends
|
|
7
|
+
its styles at once, so there is nothing left to animate. Those
|
|
8
|
+
components keep the closing copy on the page, `inert` and click-through,
|
|
9
|
+
and drop it once its transitions have run. The reveal() directive uses
|
|
10
|
+
it the same way, to hand an element back its own styles after it
|
|
11
|
+
arrives.
|
|
12
|
+
|
|
13
|
+
A timer read from the computed durations, not `transitionend`. A
|
|
14
|
+
transition that never starts never ends: a consumer who turns motion off
|
|
15
|
+
through ::part(), or a tab in the background that paints no frames,
|
|
16
|
+
would otherwise leave the closing copy on the page for good. Reading the
|
|
17
|
+
durations also follows the reduced-motion block in tokens.css for free,
|
|
18
|
+
since that makes every one of them 1ms.
|
|
19
|
+
*/
|
|
20
|
+
// "0.25s, 150ms" -> [250, 150]
|
|
21
|
+
function toMs(list) {
|
|
22
|
+
return list.split(",").map((value) => {
|
|
23
|
+
const n = Number.parseFloat(value);
|
|
24
|
+
if (Number.isNaN(n))
|
|
25
|
+
return 0;
|
|
26
|
+
return value.trim().endsWith("ms") ? n : n * 1000;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// The longest duration plus the longest delay: a slight overestimate when
|
|
30
|
+
// the two belong to different properties, which only costs a few ms.
|
|
31
|
+
function longest(element) {
|
|
32
|
+
const style = getComputedStyle(element);
|
|
33
|
+
return (Math.max(0, ...toMs(style.transitionDuration)) +
|
|
34
|
+
Math.max(0, ...toMs(style.transitionDelay)));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Calls `done` once the transitions on every element given have had time
|
|
38
|
+
* to finish. Call it AFTER the styles being waited on are applied (the
|
|
39
|
+
* closing ones, say), so the durations it reads are theirs. Returns a
|
|
40
|
+
* cancel function, for an overlay reopened before its exit finished.
|
|
41
|
+
*/
|
|
42
|
+
export function afterTransitions(elements, done) {
|
|
43
|
+
const wait = Math.max(0, ...elements.filter((el) => !!el).map(longest));
|
|
44
|
+
// A little slack, so the last frame of the fade is painted before the
|
|
45
|
+
// element goes.
|
|
46
|
+
const timer = setTimeout(done, wait > 0 ? wait + 20 : 0);
|
|
47
|
+
return () => clearTimeout(timer);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=motion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.js","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;EAkBE;AAEF,+BAA+B;AAC/B,SAAS,IAAI,CAAC,IAAY;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACnC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAC1E,qEAAqE;AACrE,SAAS,OAAO,CAAC,OAAgB;IAC/B,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,CACL,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAC5C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAwC,EACxC,IAAgB;IAEhB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,EACD,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAC7D,CAAC;IAEF,sEAAsE;IACtE,gBAAgB;IAChB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC"}
|