@0001-labs/design-system-1 0.3.0-alpha.13 → 0.3.0-alpha.14
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/DS1/0-face/calendar.ts +194 -0
- package/DS1/0-face/carousel.ts +623 -0
- package/DS1/0-face/component-visibility.ts +13 -0
- package/DS1/0-face/copy-text.ts +96 -0
- package/DS1/0-face/device.ts +8 -58
- package/DS1/0-face/dialog-swipe.ts +249 -0
- package/DS1/0-face/dialogs.ts +208 -0
- package/DS1/0-face/drawer.ts +258 -0
- package/DS1/0-face/feedback-words.ts +36 -0
- package/DS1/0-face/feedback.ts +40 -0
- package/DS1/0-face/format.ts +700 -0
- package/DS1/0-face/generated/toast-assets.ts +18 -0
- package/DS1/0-face/grid-fit.ts +1 -1
- package/DS1/0-face/grid.ts +3 -2
- package/DS1/0-face/header.ts +78 -0
- package/DS1/0-face/i18n.ts +93 -18
- package/DS1/0-face/keys.ts +276 -0
- package/DS1/0-face/languages.ts +4 -4
- package/DS1/0-face/layout-inspector.ts +6 -6
- package/DS1/0-face/library-styles.ts +33 -0
- package/DS1/0-face/load-toaster.ts +7 -0
- package/DS1/0-face/preference-options.ts +29 -0
- package/DS1/0-face/preferences.ts +3 -11
- package/DS1/0-face/pricing.ts +98 -43
- package/DS1/0-face/scaling.ts +160 -4
- package/DS1/0-face/shared-words.ts +9 -4
- package/DS1/0-face/sidebar.ts +201 -0
- package/DS1/0-face/theme-bootstrap.js +184 -0
- package/DS1/0-face/theme.ts +89 -47
- package/DS1/0-face/toast-queue.ts +157 -0
- package/DS1/0-face/toaster.ts +384 -0
- package/DS1/0-face/tooltips.ts +157 -15
- package/DS1/0-face/translations/da.json +60 -1
- package/DS1/0-face/translations/de.json +60 -1
- package/DS1/0-face/translations/en.json +60 -1
- package/DS1/0-face/translations/es.json +60 -1
- package/DS1/0-face/translations/fi.json +60 -1
- package/DS1/0-face/translations/fr.json +60 -1
- package/DS1/0-face/translations/is.json +60 -1
- package/DS1/0-face/translations/it.json +60 -1
- package/DS1/0-face/translations/ja.json +60 -1
- package/DS1/0-face/translations/ko.json +60 -1
- package/DS1/0-face/translations/nb.json +60 -1
- package/DS1/0-face/translations/pt-BR.json +60 -1
- package/DS1/0-face/translations/pt.json +60 -1
- package/DS1/0-face/translations/sv.json +60 -1
- package/DS1/0-face/translations/zh.json +60 -1
- package/DS1/0-face/translations-format.ts +3 -4
- package/DS1/1-root/card.css +192 -0
- package/DS1/1-root/carousel.css +136 -0
- package/DS1/1-root/cjk.css +23 -0
- package/DS1/1-root/component-metrics.css +1 -0
- package/DS1/1-root/component-tokens.css +51 -8
- package/DS1/1-root/controls.css +887 -14
- package/DS1/1-root/dialog-placement.css +191 -0
- package/DS1/1-root/document.css +183 -0
- package/DS1/1-root/drawer.css +83 -0
- package/DS1/1-root/empty.css +83 -0
- package/DS1/1-root/figures.css +141 -0
- package/DS1/1-root/fonts/Iosevka-LICENSE.md +3 -1
- package/DS1/1-root/fonts/Iosevka-Regular.woff2 +0 -0
- package/DS1/1-root/fonts.css +69 -0
- package/DS1/1-root/footer.css +186 -0
- package/DS1/1-root/header.css +165 -0
- package/DS1/1-root/kbd.css +46 -0
- package/DS1/1-root/library-tokens.ts +91 -0
- package/DS1/1-root/measures.ts +53 -0
- package/DS1/1-root/notice.css +165 -0
- package/DS1/1-root/one.css +14 -84
- package/DS1/1-root/one.semantic.css +200 -148
- package/DS1/1-root/palette.css +58 -0
- package/DS1/1-root/palette.ts +19 -0
- package/DS1/1-root/progress.css +356 -0
- package/DS1/1-root/prose.css +202 -0
- package/DS1/1-root/row.css +297 -0
- package/DS1/1-root/table.css +111 -0
- package/DS1/1-root/text.css +70 -0
- package/DS1/2-core/button-split.ts +55 -0
- package/DS1/2-core/chart/chart.css +169 -0
- package/DS1/2-core/chart/grid-chart.ts +554 -0
- package/DS1/2-core/ds-avatar.ts +25 -6
- package/DS1/2-core/ds-badge.ts +10 -10
- package/DS1/2-core/ds-button.ts +111 -26
- package/DS1/2-core/ds-card.ts +135 -105
- package/DS1/2-core/ds-chart.ts +327 -0
- package/DS1/2-core/ds-composer.ts +8 -2
- package/DS1/2-core/ds-cycle.ts +97 -21
- package/DS1/2-core/ds-empty.ts +120 -0
- package/DS1/2-core/ds-icon.ts +11 -2
- package/DS1/2-core/ds-input.ts +165 -6
- package/DS1/2-core/ds-kbd.ts +78 -0
- package/DS1/2-core/ds-loading.ts +72 -0
- package/DS1/2-core/ds-notice.ts +180 -0
- package/DS1/2-core/ds-progress.ts +380 -0
- package/DS1/2-core/ds-spacing-handle.ts +22 -0
- package/DS1/2-core/ds-stat.ts +174 -0
- package/DS1/2-core/ds-switch.ts +1 -0
- package/DS1/2-core/ds-text.ts +15 -2
- package/DS1/2-core/ds-toast.ts +354 -0
- package/DS1/2-core/figures.ts +105 -0
- package/DS1/2-core/generated/ds-icon-map.ts +234 -128
- package/DS1/2-core/generated/icon-avatar.ts +2 -0
- package/DS1/2-core/generated/icons-extra.ts +118 -65
- package/DS1/2-core/generated/icons-immediate.ts +1 -1
- package/DS1/2-core/spacing-handle.ts +95 -0
- package/DS1/2-core/styles/ds-avatar.css +9 -8
- package/DS1/2-core/styles/ds-button-host.css +26 -3
- package/DS1/2-core/styles/ds-button-split.css +67 -0
- package/DS1/2-core/styles/ds-button.css +49 -15
- package/DS1/2-core/styles/ds-card.css +34 -0
- package/DS1/2-core/styles/ds-composer.css +13 -0
- package/DS1/2-core/styles/ds-cycle.css +69 -0
- package/DS1/2-core/styles/ds-empty.css +18 -0
- package/DS1/2-core/styles/ds-gap.css +1 -0
- package/DS1/2-core/styles/ds-icon.css +1 -0
- package/DS1/2-core/styles/ds-input.css +59 -6
- package/DS1/2-core/styles/ds-kbd.css +12 -0
- package/DS1/2-core/styles/ds-loading.css +13 -0
- package/DS1/2-core/styles/ds-notice.css +30 -0
- package/DS1/2-core/styles/ds-progress.css +25 -0
- package/DS1/2-core/styles/ds-select.css +2 -2
- package/DS1/2-core/styles/ds-spacing-handle.css +8 -0
- package/DS1/2-core/styles/ds-split.css +2 -62
- package/DS1/2-core/styles/ds-stat.css +34 -0
- package/DS1/2-core/styles/ds-switch.css +16 -1
- package/DS1/2-core/styles/ds-text.css +43 -12
- package/DS1/2-core/styles/ds-toast.css +182 -0
- package/DS1/2-core/styles/ds-tooltip.css +1 -0
- package/DS1/3-unit/calendar-base.ts +263 -0
- package/DS1/3-unit/ds-accordion.ts +9 -1
- package/DS1/3-unit/ds-avatar-group.ts +1 -0
- package/DS1/3-unit/ds-calendar-large.ts +349 -0
- package/DS1/3-unit/ds-calendar.ts +344 -0
- package/DS1/3-unit/ds-carousel.ts +368 -0
- package/DS1/3-unit/ds-date-picker.ts +540 -0
- package/DS1/3-unit/ds-form.ts +45 -37
- package/DS1/3-unit/ds-list.ts +48 -1
- package/DS1/3-unit/ds-matrix.ts +318 -0
- package/DS1/3-unit/ds-menu.ts +8 -4
- package/DS1/3-unit/ds-row.ts +84 -1
- package/DS1/3-unit/ds-sidebar.ts +280 -0
- package/DS1/3-unit/ds-table.ts +75 -34
- package/DS1/3-unit/styles/ds-accordion.css +1 -0
- package/DS1/3-unit/styles/ds-avatar-group.css +2 -4
- package/DS1/3-unit/styles/ds-calendar-large.css +165 -0
- package/DS1/3-unit/styles/ds-calendar.css +238 -0
- package/DS1/3-unit/styles/ds-carousel.css +30 -0
- package/DS1/3-unit/styles/ds-date-picker.css +124 -0
- package/DS1/3-unit/styles/ds-list.css +1 -0
- package/DS1/3-unit/styles/ds-matrix.css +203 -0
- package/DS1/3-unit/styles/ds-menu.css +31 -6
- package/DS1/3-unit/styles/ds-row.css +84 -2
- package/DS1/3-unit/styles/ds-sidebar.css +117 -0
- package/DS1/3-unit/styles/ds-table.css +3 -74
- package/DS1/4-page/ds-dialog.ts +40 -4
- package/DS1/4-page/ds-document.ts +240 -0
- package/DS1/4-page/ds-footer.ts +165 -0
- package/DS1/4-page/ds-grid.ts +39 -59
- package/DS1/4-page/ds-header.ts +171 -0
- package/DS1/4-page/ds-page.ts +184 -0
- package/DS1/4-page/email.ts +2 -3
- package/DS1/4-page/styles/ds-container.css +1 -0
- package/DS1/4-page/styles/ds-document.css +18 -0
- package/DS1/4-page/styles/ds-footer.css +29 -0
- package/DS1/4-page/styles/ds-grid.css +31 -85
- package/DS1/4-page/styles/ds-header.css +57 -0
- package/DS1/4-page/styles/ds-page.css +214 -0
- package/DS1/components.ts +7 -1
- package/DS1/index.ts +26 -6
- package/DS1/react/avatar.ts +4 -5
- package/DS1/react/button-split.ts +29 -0
- package/DS1/react/button.ts +32 -13
- package/DS1/react/carousel.ts +76 -0
- package/DS1/react/dialog.ts +36 -5
- package/DS1/react/document.ts +14 -0
- package/DS1/react/empty.ts +32 -0
- package/DS1/react/footer.ts +17 -0
- package/DS1/react/header.ts +15 -0
- package/DS1/react/input.ts +28 -17
- package/DS1/react/kbd.ts +21 -0
- package/DS1/react/loading.ts +18 -0
- package/DS1/react/notice.ts +59 -0
- package/DS1/react/page.ts +13 -0
- package/DS1/react/progress.ts +99 -0
- package/DS1/react/sidebar.ts +60 -0
- package/DS1/react/spacing-handle.ts +21 -0
- package/DS1/react/stat.ts +73 -0
- package/DS1/react/toast.ts +82 -0
- package/DS1/x-icon/Tabler-LICENSE.md +27 -0
- package/DS1/x-icon/airtable.svg +5 -0
- package/DS1/x-icon/attach.svg +3 -0
- package/DS1/x-icon/audio.svg +3 -0
- package/DS1/x-icon/bag-alt.svg +3 -0
- package/DS1/x-icon/bank.svg +3 -0
- package/DS1/x-icon/banknote.svg +3 -0
- package/DS1/x-icon/bolt.svg +3 -0
- package/DS1/x-icon/book-alt.svg +3 -0
- package/DS1/x-icon/book.svg +4 -0
- package/DS1/x-icon/box.svg +3 -0
- package/DS1/x-icon/briefcase.svg +3 -0
- package/DS1/x-icon/building.svg +4 -0
- package/DS1/x-icon/car.svg +3 -0
- package/DS1/x-icon/card.svg +3 -0
- package/DS1/x-icon/cart.svg +3 -0
- package/DS1/x-icon/{ezo-item-button-start.svg → chevron-left.svg} +1 -1
- package/DS1/x-icon/{ezo-android-screen-stats.svg → chevron-right.svg} +1 -1
- package/DS1/x-icon/cloud.svg +3 -0
- package/DS1/x-icon/coffee.svg +3 -0
- package/DS1/x-icon/coins.svg +3 -0
- package/DS1/x-icon/cursor.svg +3 -0
- package/DS1/x-icon/curve.svg +7 -0
- package/DS1/x-icon/dislike.svg +4 -0
- package/DS1/x-icon/dot-bank.svg +3 -0
- package/DS1/x-icon/dot-banknote.svg +3 -0
- package/DS1/x-icon/dot-banknotes.svg +3 -0
- package/DS1/x-icon/dot-card.svg +3 -0
- package/DS1/x-icon/dot-coin.svg +3 -0
- package/DS1/x-icon/dot-coins.svg +3 -0
- package/DS1/x-icon/dot-receipt.svg +3 -0
- package/DS1/x-icon/dot-safe.svg +3 -0
- package/DS1/x-icon/dot-transfer.svg +3 -0
- package/DS1/x-icon/dot-wallet.svg +3 -0
- package/DS1/x-icon/download.svg +4 -0
- package/DS1/x-icon/drive.svg +5 -0
- package/DS1/x-icon/drop.svg +3 -0
- package/DS1/x-icon/dropbox.svg +3 -0
- package/DS1/x-icon/dumbbell.svg +3 -0
- package/DS1/x-icon/eye-off.svg +3 -0
- package/DS1/x-icon/eye.svg +3 -0
- package/DS1/x-icon/facebook.svg +3 -0
- package/DS1/x-icon/figma.svg +5 -0
- package/DS1/x-icon/flame.svg +3 -0
- package/DS1/x-icon/flip.svg +5 -0
- package/DS1/x-icon/food.svg +3 -0
- package/DS1/x-icon/fuel.svg +3 -0
- package/DS1/x-icon/game.svg +3 -0
- package/DS1/x-icon/gift.svg +3 -0
- package/DS1/x-icon/github.svg +3 -0
- package/DS1/x-icon/heart.svg +3 -0
- package/DS1/x-icon/history.svg +3 -0
- package/DS1/x-icon/home-alt.svg +3 -0
- package/DS1/x-icon/income.svg +3 -0
- package/DS1/x-icon/info.svg +5 -0
- package/DS1/x-icon/instagram.svg +5 -0
- package/DS1/x-icon/jpbank.svg +3 -0
- package/DS1/x-icon/key.svg +4 -0
- package/DS1/x-icon/keyboard.svg +3 -0
- package/DS1/x-icon/like.svg +4 -0
- package/DS1/x-icon/linkedin.svg +7 -0
- package/DS1/x-icon/loom.svg +6 -0
- package/DS1/x-icon/map.svg +4 -0
- package/DS1/x-icon/medical.svg +3 -0
- package/DS1/x-icon/{ezo-android-screen-lists.svg → minus.svg} +1 -1
- package/DS1/x-icon/moon.svg +3 -0
- package/DS1/x-icon/move.svg +3 -0
- package/DS1/x-icon/music-alt.svg +3 -0
- package/DS1/x-icon/music.svg +5 -0
- package/DS1/x-icon/notion.svg +6 -0
- package/DS1/x-icon/offline.svg +3 -0
- package/DS1/x-icon/pause.svg +4 -0
- package/DS1/x-icon/paw.svg +3 -0
- package/DS1/x-icon/pdf.svg +3 -0
- package/DS1/x-icon/people.svg +5 -0
- package/DS1/x-icon/percent.svg +3 -0
- package/DS1/x-icon/phone.svg +3 -0
- package/DS1/x-icon/pill.svg +3 -0
- package/DS1/x-icon/plane.svg +3 -0
- package/DS1/x-icon/postal.svg +3 -0
- package/DS1/x-icon/present.svg +4 -0
- package/DS1/x-icon/reaction.svg +5 -0
- package/DS1/x-icon/receipt.svg +3 -0
- package/DS1/x-icon/refresh.svg +3 -0
- package/DS1/x-icon/refund.svg +3 -0
- package/DS1/x-icon/repeat.svg +3 -0
- package/DS1/x-icon/rotate.svg +4 -0
- package/DS1/x-icon/safe.svg +3 -0
- package/DS1/x-icon/school-alt.svg +3 -0
- package/DS1/x-icon/shield-alt.svg +3 -0
- package/DS1/x-icon/shield.svg +4 -0
- package/DS1/x-icon/shirt.svg +3 -0
- package/DS1/x-icon/shop.svg +3 -0
- package/DS1/x-icon/sign-in.svg +3 -0
- package/DS1/x-icon/sign-out.svg +3 -0
- package/DS1/x-icon/slack.svg +6 -0
- package/DS1/x-icon/sparkle.svg +3 -0
- package/DS1/x-icon/start.svg +4 -0
- package/DS1/x-icon/{ezo-item-button-reopen.svg → stop.svg} +1 -1
- package/DS1/x-icon/sun.svg +3 -0
- package/DS1/x-icon/system.svg +4 -0
- package/DS1/x-icon/tag.svg +3 -0
- package/DS1/x-icon/ticket.svg +3 -0
- package/DS1/x-icon/title-struck.svg +4 -0
- package/DS1/x-icon/train.svg +3 -0
- package/DS1/x-icon/transfer.svg +3 -0
- package/DS1/x-icon/tv.svg +3 -0
- package/DS1/x-icon/upload.svg +4 -0
- package/DS1/x-icon/video.svg +4 -0
- package/DS1/x-icon/vimeo.svg +3 -0
- package/DS1/x-icon/wallet.svg +3 -0
- package/DS1/x-icon/wifi.svg +3 -0
- package/DS1/x-icon/window.svg +4 -0
- package/DS1/x-icon/wrench.svg +3 -0
- package/DS1/x-icon/x-brand.svg +4 -0
- package/DS1/x-icon/youtube.svg +4 -0
- package/README.md +3 -3
- package/dist/0-face/calendar.d.ts +75 -0
- package/dist/0-face/calendar.d.ts.map +1 -0
- package/dist/0-face/calendar.js +149 -0
- package/dist/0-face/carousel.d.ts +174 -0
- package/dist/0-face/carousel.d.ts.map +1 -0
- package/dist/0-face/carousel.js +583 -0
- package/dist/0-face/component-visibility.d.ts +7 -0
- package/dist/0-face/component-visibility.d.ts.map +1 -0
- package/dist/0-face/component-visibility.js +10 -0
- package/dist/0-face/copy-text.d.ts +11 -0
- package/dist/0-face/copy-text.d.ts.map +1 -0
- package/dist/0-face/copy-text.js +97 -0
- package/dist/0-face/device.d.ts +3 -7
- package/dist/0-face/device.d.ts.map +1 -1
- package/dist/0-face/device.js +7 -41
- package/dist/0-face/dialog-swipe.d.ts +49 -0
- package/dist/0-face/dialog-swipe.d.ts.map +1 -0
- package/dist/0-face/dialog-swipe.js +239 -0
- package/dist/0-face/dialogs.d.ts +33 -0
- package/dist/0-face/dialogs.d.ts.map +1 -0
- package/dist/0-face/dialogs.js +173 -0
- package/dist/0-face/drawer.d.ts +64 -0
- package/dist/0-face/drawer.d.ts.map +1 -0
- package/dist/0-face/drawer.js +256 -0
- package/dist/0-face/feedback-words.d.ts +21 -0
- package/dist/0-face/feedback-words.d.ts.map +1 -0
- package/dist/0-face/feedback-words.js +30 -0
- package/dist/0-face/feedback.d.ts +41 -0
- package/dist/0-face/feedback.d.ts.map +1 -0
- package/dist/0-face/feedback.js +35 -0
- package/dist/0-face/format.d.ts +166 -0
- package/dist/0-face/format.d.ts.map +1 -0
- package/dist/0-face/format.js +445 -0
- package/dist/0-face/generated/toast-assets.d.ts +11 -0
- package/dist/0-face/generated/toast-assets.d.ts.map +1 -0
- package/dist/0-face/generated/toast-assets.js +14 -0
- package/dist/0-face/grid-fit.js +1 -1
- package/dist/0-face/grid.d.ts.map +1 -1
- package/dist/0-face/grid.js +2 -1
- package/dist/0-face/header.d.ts +38 -0
- package/dist/0-face/header.d.ts.map +1 -0
- package/dist/0-face/header.js +80 -0
- package/dist/0-face/i18n.d.ts +32 -2
- package/dist/0-face/i18n.d.ts.map +1 -1
- package/dist/0-face/i18n.js +65 -19
- package/dist/0-face/keys.d.ts +104 -0
- package/dist/0-face/keys.d.ts.map +1 -0
- package/dist/0-face/keys.js +253 -0
- package/dist/0-face/languages.d.ts +2 -2
- package/dist/0-face/languages.js +3 -3
- package/dist/0-face/layout-inspector.js +6 -6
- package/dist/0-face/library-styles.d.ts +7 -0
- package/dist/0-face/library-styles.d.ts.map +1 -0
- package/dist/0-face/library-styles.js +29 -0
- package/dist/0-face/load-toaster.d.ts +8 -0
- package/dist/0-face/load-toaster.d.ts.map +1 -0
- package/dist/0-face/load-toaster.js +7 -0
- package/dist/0-face/preference-options.d.ts +34 -0
- package/dist/0-face/preference-options.d.ts.map +1 -0
- package/dist/0-face/preference-options.js +1 -0
- package/dist/0-face/preferences.d.ts +3 -12
- package/dist/0-face/preferences.d.ts.map +1 -1
- package/dist/0-face/pricing.d.ts +19 -9
- package/dist/0-face/pricing.d.ts.map +1 -1
- package/dist/0-face/pricing.js +81 -40
- package/dist/0-face/scaling.d.ts +71 -1
- package/dist/0-face/scaling.d.ts.map +1 -1
- package/dist/0-face/scaling.js +108 -3
- package/dist/0-face/shared-words.d.ts +9 -4
- package/dist/0-face/shared-words.d.ts.map +1 -1
- package/dist/0-face/sidebar.d.ts +69 -0
- package/dist/0-face/sidebar.d.ts.map +1 -0
- package/dist/0-face/sidebar.js +191 -0
- package/dist/0-face/theme-bootstrap.d.ts +1 -0
- package/dist/0-face/theme-bootstrap.d.ts.map +1 -0
- package/dist/0-face/theme-bootstrap.js +214 -0
- package/dist/0-face/theme.d.ts +32 -0
- package/dist/0-face/theme.d.ts.map +1 -1
- package/dist/0-face/theme.js +69 -43
- package/dist/0-face/toast-queue.d.ts +110 -0
- package/dist/0-face/toast-queue.d.ts.map +1 -0
- package/dist/0-face/toast-queue.js +98 -0
- package/dist/0-face/toaster.d.ts +27 -0
- package/dist/0-face/toaster.d.ts.map +1 -0
- package/dist/0-face/toaster.js +373 -0
- package/dist/0-face/tooltips.d.ts +24 -1
- package/dist/0-face/tooltips.d.ts.map +1 -1
- package/dist/0-face/tooltips.js +155 -16
- package/dist/0-face/translations/da.json +60 -1
- package/dist/0-face/translations/de.json +60 -1
- package/dist/0-face/translations/en.json +60 -1
- package/dist/0-face/translations/es.json +60 -1
- package/dist/0-face/translations/fi.json +60 -1
- package/dist/0-face/translations/fr.json +60 -1
- package/dist/0-face/translations/is.json +60 -1
- package/dist/0-face/translations/it.json +60 -1
- package/dist/0-face/translations/ja.json +60 -1
- package/dist/0-face/translations/ko.json +60 -1
- package/dist/0-face/translations/nb.json +60 -1
- package/dist/0-face/translations/pt-BR.json +60 -1
- package/dist/0-face/translations/pt.json +60 -1
- package/dist/0-face/translations/sv.json +60 -1
- package/dist/0-face/translations/zh.json +60 -1
- package/dist/0-face/translations-format.d.ts.map +1 -1
- package/dist/0-face/translations-format.js +3 -4
- package/dist/0-face/tree.d.ts +69 -0
- package/dist/0-face/tree.d.ts.map +1 -0
- package/dist/0-face/tree.js +191 -0
- package/dist/1-root/library-tokens.d.ts +31 -0
- package/dist/1-root/library-tokens.d.ts.map +1 -0
- package/dist/1-root/library-tokens.js +84 -0
- package/dist/1-root/measures.d.ts +52 -0
- package/dist/1-root/measures.d.ts.map +1 -0
- package/dist/1-root/measures.js +49 -0
- package/dist/1-root/palette.d.ts +5 -0
- package/dist/1-root/palette.d.ts.map +1 -1
- package/dist/1-root/palette.js +18 -0
- package/dist/2-core/button-split.d.ts +21 -0
- package/dist/2-core/button-split.d.ts.map +1 -0
- package/dist/2-core/button-split.js +48 -0
- package/dist/2-core/chart/grid-chart.d.ts +113 -0
- package/dist/2-core/chart/grid-chart.d.ts.map +1 -0
- package/dist/2-core/chart/grid-chart.js +466 -0
- package/dist/2-core/ds-avatar.d.ts +20 -3
- package/dist/2-core/ds-avatar.d.ts.map +1 -1
- package/dist/2-core/ds-avatar.js +19 -5
- package/dist/2-core/ds-badge.js +10 -13
- package/dist/2-core/ds-banner.d.ts +23 -7
- package/dist/2-core/ds-banner.d.ts.map +1 -1
- package/dist/2-core/ds-banner.js +48 -12
- package/dist/2-core/ds-button.d.ts +76 -0
- package/dist/2-core/ds-button.d.ts.map +1 -1
- package/dist/2-core/ds-button.js +101 -26
- package/dist/2-core/ds-card.d.ts +76 -11
- package/dist/2-core/ds-card.d.ts.map +1 -1
- package/dist/2-core/ds-card.js +129 -105
- package/dist/2-core/ds-chart.d.ts +105 -0
- package/dist/2-core/ds-chart.d.ts.map +1 -0
- package/dist/2-core/ds-chart.js +390 -0
- package/dist/2-core/ds-composer.d.ts +7 -0
- package/dist/2-core/ds-composer.d.ts.map +1 -1
- package/dist/2-core/ds-composer.js +1 -1
- package/dist/2-core/ds-cycle.d.ts +36 -2
- package/dist/2-core/ds-cycle.d.ts.map +1 -1
- package/dist/2-core/ds-cycle.js +95 -18
- package/dist/2-core/ds-empty.d.ts +74 -0
- package/dist/2-core/ds-empty.d.ts.map +1 -0
- package/dist/2-core/ds-empty.js +96 -0
- package/dist/2-core/ds-icon.d.ts +6 -0
- package/dist/2-core/ds-icon.d.ts.map +1 -1
- package/dist/2-core/ds-icon.js +12 -2
- package/dist/2-core/ds-input.d.ts +39 -1
- package/dist/2-core/ds-input.d.ts.map +1 -1
- package/dist/2-core/ds-input.js +150 -6
- package/dist/2-core/ds-kbd.d.ts +48 -0
- package/dist/2-core/ds-kbd.d.ts.map +1 -0
- package/dist/2-core/ds-kbd.js +65 -0
- package/dist/2-core/ds-language.d.ts +8 -1
- package/dist/2-core/ds-language.d.ts.map +1 -1
- package/dist/2-core/ds-language.js +2 -2
- package/dist/2-core/ds-loading.d.ts +40 -0
- package/dist/2-core/ds-loading.d.ts.map +1 -0
- package/dist/2-core/ds-loading.js +63 -0
- package/dist/2-core/ds-meter.d.ts +103 -0
- package/dist/2-core/ds-meter.d.ts.map +1 -0
- package/dist/2-core/ds-meter.js +124 -0
- package/dist/2-core/ds-notice.d.ts +103 -0
- package/dist/2-core/ds-notice.d.ts.map +1 -0
- package/dist/2-core/ds-notice.js +152 -0
- package/dist/2-core/ds-pagedots.d.ts +64 -7
- package/dist/2-core/ds-pagedots.d.ts.map +1 -1
- package/dist/2-core/ds-pagedots.js +124 -18
- package/dist/2-core/ds-progress.d.ts +200 -0
- package/dist/2-core/ds-progress.d.ts.map +1 -0
- package/dist/2-core/ds-progress.js +319 -0
- package/dist/2-core/ds-spacing-handle.d.ts +25 -0
- package/dist/2-core/ds-spacing-handle.d.ts.map +1 -0
- package/dist/2-core/ds-spacing-handle.js +25 -0
- package/dist/2-core/ds-split.d.ts +4 -67
- package/dist/2-core/ds-split.d.ts.map +1 -1
- package/dist/2-core/ds-split.js +4 -98
- package/dist/2-core/ds-stat.d.ts +126 -0
- package/dist/2-core/ds-stat.d.ts.map +1 -0
- package/dist/2-core/ds-stat.js +137 -0
- package/dist/2-core/ds-steps.d.ts +72 -0
- package/dist/2-core/ds-steps.d.ts.map +1 -0
- package/dist/2-core/ds-steps.js +114 -0
- package/dist/2-core/ds-switch.d.ts +1 -0
- package/dist/2-core/ds-switch.d.ts.map +1 -1
- package/dist/2-core/ds-switch.js +1 -0
- package/dist/2-core/ds-text.d.ts +15 -2
- package/dist/2-core/ds-text.d.ts.map +1 -1
- package/dist/2-core/ds-text.js +13 -0
- package/dist/2-core/ds-textarea.d.ts.map +1 -1
- package/dist/2-core/ds-textarea.js +1 -0
- package/dist/2-core/ds-toast.d.ts +139 -0
- package/dist/2-core/ds-toast.d.ts.map +1 -0
- package/dist/2-core/ds-toast.js +329 -0
- package/dist/2-core/ds-toggle.d.ts +11 -0
- package/dist/2-core/ds-toggle.d.ts.map +1 -0
- package/dist/2-core/ds-toggle.js +10 -0
- package/dist/2-core/figures.d.ts +56 -0
- package/dist/2-core/figures.d.ts.map +1 -0
- package/dist/2-core/figures.js +70 -0
- package/dist/2-core/generated/ds-icon-map.d.ts +118 -65
- package/dist/2-core/generated/ds-icon-map.d.ts.map +1 -1
- package/dist/2-core/generated/ds-icon-map.js +234 -128
- package/dist/2-core/generated/icon-avatar.d.ts +2 -0
- package/dist/2-core/generated/icon-avatar.d.ts.map +1 -0
- package/dist/2-core/generated/icon-avatar.js +2 -0
- package/dist/2-core/generated/icons-extra.d.ts.map +1 -1
- package/dist/2-core/generated/icons-extra.js +118 -65
- package/dist/2-core/generated/icons-immediate.d.ts +1 -1
- package/dist/2-core/generated/icons-immediate.d.ts.map +1 -1
- package/dist/2-core/generated/icons-immediate.js +1 -1
- package/dist/2-core/spacing-handle.d.ts +28 -0
- package/dist/2-core/spacing-handle.d.ts.map +1 -0
- package/dist/2-core/spacing-handle.js +146 -0
- package/dist/3-unit/calendar-base.d.ts +149 -0
- package/dist/3-unit/calendar-base.d.ts.map +1 -0
- package/dist/3-unit/calendar-base.js +172 -0
- package/dist/3-unit/ds-accordion.d.ts +9 -0
- package/dist/3-unit/ds-accordion.d.ts.map +1 -1
- package/dist/3-unit/ds-accordion.js +7 -1
- package/dist/3-unit/ds-avatar-group.d.ts +1 -0
- package/dist/3-unit/ds-avatar-group.d.ts.map +1 -1
- package/dist/3-unit/ds-calendar-large.d.ts +138 -0
- package/dist/3-unit/ds-calendar-large.d.ts.map +1 -0
- package/dist/3-unit/ds-calendar-large.js +305 -0
- package/dist/3-unit/ds-calendar.d.ts +175 -0
- package/dist/3-unit/ds-calendar.d.ts.map +1 -0
- package/dist/3-unit/ds-calendar.js +303 -0
- package/dist/3-unit/ds-carousel.d.ts +182 -0
- package/dist/3-unit/ds-carousel.d.ts.map +1 -0
- package/dist/3-unit/ds-carousel.js +327 -0
- package/dist/3-unit/ds-date-picker.d.ts +203 -0
- package/dist/3-unit/ds-date-picker.d.ts.map +1 -0
- package/dist/3-unit/ds-date-picker.js +499 -0
- package/dist/3-unit/ds-form.d.ts.map +1 -1
- package/dist/3-unit/ds-form.js +38 -28
- package/dist/3-unit/ds-list.d.ts +12 -0
- package/dist/3-unit/ds-list.d.ts.map +1 -1
- package/dist/3-unit/ds-list.js +52 -1
- package/dist/3-unit/ds-matrix.d.ts +146 -0
- package/dist/3-unit/ds-matrix.d.ts.map +1 -0
- package/dist/3-unit/ds-matrix.js +248 -0
- package/dist/3-unit/ds-menu.d.ts +1 -1
- package/dist/3-unit/ds-menu.d.ts.map +1 -1
- package/dist/3-unit/ds-menu.js +7 -4
- package/dist/3-unit/ds-row.d.ts +66 -0
- package/dist/3-unit/ds-row.d.ts.map +1 -1
- package/dist/3-unit/ds-row.js +80 -1
- package/dist/3-unit/ds-sidebar.d.ts +108 -0
- package/dist/3-unit/ds-sidebar.d.ts.map +1 -0
- package/dist/3-unit/ds-sidebar.js +268 -0
- package/dist/3-unit/ds-table.d.ts +28 -10
- package/dist/3-unit/ds-table.d.ts.map +1 -1
- package/dist/3-unit/ds-table.js +53 -25
- package/dist/3-unit/ds-tree.d.ts +69 -0
- package/dist/3-unit/ds-tree.d.ts.map +1 -0
- package/dist/3-unit/ds-tree.js +136 -0
- package/dist/4-page/ds-dialog.d.ts +16 -1
- package/dist/4-page/ds-dialog.d.ts.map +1 -1
- package/dist/4-page/ds-dialog.js +39 -3
- package/dist/4-page/ds-document.d.ts +98 -0
- package/dist/4-page/ds-document.d.ts.map +1 -0
- package/dist/4-page/ds-document.js +213 -0
- package/dist/4-page/ds-footer.d.ts +100 -0
- package/dist/4-page/ds-footer.d.ts.map +1 -0
- package/dist/4-page/ds-footer.js +119 -0
- package/dist/4-page/ds-grid.d.ts +32 -12
- package/dist/4-page/ds-grid.d.ts.map +1 -1
- package/dist/4-page/ds-grid.js +30 -39
- package/dist/4-page/ds-header.d.ts +84 -0
- package/dist/4-page/ds-header.d.ts.map +1 -0
- package/dist/4-page/ds-header.js +143 -0
- package/dist/4-page/ds-layout.d.ts +1 -0
- package/dist/4-page/ds-layout.d.ts.map +1 -1
- package/dist/4-page/ds-layout.js +1 -1
- package/dist/4-page/ds-page.d.ts +110 -0
- package/dist/4-page/ds-page.d.ts.map +1 -0
- package/dist/4-page/ds-page.js +155 -0
- package/dist/4-page/email.d.ts +2 -3
- package/dist/4-page/email.d.ts.map +1 -1
- package/dist/4-page/email.js +2 -3
- package/dist/components.d.ts +4 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +4 -1
- package/dist/design-system-1.bundle.js +11304 -4322
- package/dist/design-system-1.bundle.js.map +1 -1
- package/dist/design-system-1.bundle.min.js +8867 -4132
- package/dist/design-system-1.bundle.min.js.map +1 -1
- package/dist/design-system-1.css +1 -1
- package/dist/feedback.js +541 -0
- package/dist/feedback.js.map +1 -0
- package/dist/icons-extra-B4Iotc7s.js +298 -0
- package/dist/icons-extra-B4Iotc7s.js.map +1 -0
- package/dist/icons-extra-C4sCgoUj.js +185 -0
- package/dist/icons-extra-C4sCgoUj.js.map +1 -0
- package/dist/icons-extra-DSav6uTU.js +300 -0
- package/dist/icons-extra-DSav6uTU.js.map +1 -0
- package/dist/icons-extra-Dc_yVWIz.js +1024 -0
- package/dist/icons-extra-Dc_yVWIz.js.map +1 -0
- package/dist/icons-extra-cfzoudMf.js +1030 -0
- package/dist/icons-extra-cfzoudMf.js.map +1 -0
- package/dist/icons-extra-g_xpwZhZ.js +631 -0
- package/dist/icons-extra-g_xpwZhZ.js.map +1 -0
- package/dist/index.d.ts +23 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -6
- package/dist/react/avatar.d.ts +5 -9
- package/dist/react/avatar.d.ts.map +1 -1
- package/dist/react/avatar.js +2 -2
- package/dist/react/button-split.d.ts +19 -0
- package/dist/react/button-split.d.ts.map +1 -0
- package/dist/react/button-split.js +35 -0
- package/dist/react/button.d.ts +18 -7
- package/dist/react/button.d.ts.map +1 -1
- package/dist/react/button.js +13 -4
- package/dist/react/carousel.d.ts +63 -0
- package/dist/react/carousel.d.ts.map +1 -0
- package/dist/react/carousel.js +47 -0
- package/dist/react/choice.d.ts +1 -1
- package/dist/react/context-menu.d.ts +337 -337
- package/dist/react/dialog.d.ts +684 -678
- package/dist/react/dialog.d.ts.map +1 -1
- package/dist/react/dialog.js +29 -3
- package/dist/react/document.d.ts +11 -0
- package/dist/react/document.d.ts.map +1 -0
- package/dist/react/document.js +10 -0
- package/dist/react/empty.d.ts +34 -0
- package/dist/react/empty.d.ts.map +1 -0
- package/dist/react/empty.js +8 -0
- package/dist/react/file-picker.d.ts +1 -1
- package/dist/react/footer.d.ts +13 -0
- package/dist/react/footer.d.ts.map +1 -0
- package/dist/react/footer.js +12 -0
- package/dist/react/header.d.ts +12 -0
- package/dist/react/header.d.ts.map +1 -0
- package/dist/react/header.js +11 -0
- package/dist/react/input.d.ts +31 -9
- package/dist/react/input.d.ts.map +1 -1
- package/dist/react/input.js +94 -94
- package/dist/react/kbd.d.ts +26 -0
- package/dist/react/kbd.d.ts.map +1 -0
- package/dist/react/kbd.js +8 -0
- package/dist/react/loading.d.ts +14 -0
- package/dist/react/loading.d.ts.map +1 -0
- package/dist/react/loading.js +14 -0
- package/dist/react/meter.d.ts +64 -0
- package/dist/react/meter.d.ts.map +1 -0
- package/dist/react/meter.js +15 -0
- package/dist/react/notice.d.ts +45 -0
- package/dist/react/notice.d.ts.map +1 -0
- package/dist/react/notice.js +34 -0
- package/dist/react/page.d.ts +10 -0
- package/dist/react/page.d.ts.map +1 -0
- package/dist/react/page.js +9 -0
- package/dist/react/progress.d.ts +107 -0
- package/dist/react/progress.d.ts.map +1 -0
- package/dist/react/progress.js +47 -0
- package/dist/react/sidebar.d.ts +44 -0
- package/dist/react/sidebar.d.ts.map +1 -0
- package/dist/react/sidebar.js +41 -0
- package/dist/react/spacing-handle.d.ts +13 -0
- package/dist/react/spacing-handle.d.ts.map +1 -0
- package/dist/react/spacing-handle.js +18 -0
- package/dist/react/split.d.ts +6 -14
- package/dist/react/split.d.ts.map +1 -1
- package/dist/react/split.js +5 -31
- package/dist/react/stat.d.ts +78 -0
- package/dist/react/stat.d.ts.map +1 -0
- package/dist/react/stat.js +25 -0
- package/dist/react/steps.d.ts +36 -0
- package/dist/react/steps.d.ts.map +1 -0
- package/dist/react/steps.js +10 -0
- package/dist/react/toast.d.ts +37 -0
- package/dist/react/toast.d.ts.map +1 -0
- package/dist/react/toast.js +55 -0
- package/dist/react/tree.d.ts +31 -0
- package/dist/react/tree.d.ts.map +1 -0
- package/dist/react/tree.js +37 -0
- package/dist/shared-words-BfnT24Fe.js +1635 -0
- package/dist/shared-words-BfnT24Fe.js.map +1 -0
- package/dist/shared-words-CyZYc_De.js +1818 -0
- package/dist/shared-words-CyZYc_De.js.map +1 -0
- package/dist/shared-words-DAVSET4Z.js +1800 -0
- package/dist/shared-words-DAVSET4Z.js.map +1 -0
- package/dist/shared-words-UCvnkctb.js +1653 -0
- package/dist/shared-words-UCvnkctb.js.map +1 -0
- package/package.json +16 -5
- package/DS1/2-core/ds-banner.ts +0 -122
- package/DS1/2-core/ds-date.ts +0 -24
- package/DS1/2-core/ds-language.ts +0 -94
- package/DS1/2-core/ds-pagedots.ts +0 -52
- package/DS1/2-core/ds-split.ts +0 -122
- package/DS1/2-core/ds-textarea.ts +0 -136
- package/DS1/2-core/styles/ds-banner.css +0 -77
- package/DS1/2-core/styles/ds-date.css +0 -9
- package/DS1/2-core/styles/ds-language.css +0 -78
- package/DS1/2-core/styles/ds-pagedots.css +0 -31
- package/DS1/2-core/styles/ds-textarea.css +0 -27
- package/DS1/4-page/ds-layout.ts +0 -949
- package/DS1/4-page/styles/ds-layout.css +0 -246
- package/DS1/react/split.ts +0 -42
- package/DS1/x-icon/ezo-accordion-chevron.svg +0 -11
- package/DS1/x-icon/ezo-account-close.svg +0 -1
- package/DS1/x-icon/ezo-android-screen-archive.svg +0 -4
- package/DS1/x-icon/ezo-android-screen-calendar.svg +0 -6
- package/DS1/x-icon/ezo-android-screen-camera.svg +0 -5
- package/DS1/x-icon/ezo-android-screen-check.svg +0 -3
- package/DS1/x-icon/ezo-android-screen-compose.svg +0 -4
- package/DS1/x-icon/ezo-android-screen-globe.svg +0 -1
- package/DS1/x-icon/ezo-android-screen-shared.svg +0 -5
- package/DS1/x-icon/ezo-android-screen-store.svg +0 -4
- package/DS1/x-icon/ezo-android-screen-views.svg +0 -4
- package/DS1/x-icon/ezo-android-screen-work.svg +0 -3
- package/DS1/x-icon/ezo-arrow-cursor.svg +0 -8
- package/DS1/x-icon/ezo-block-accordion.svg +0 -1
- package/DS1/x-icon/ezo-block-divider.svg +0 -1
- package/DS1/x-icon/ezo-block-group.svg +0 -1
- package/DS1/x-icon/ezo-block-image.svg +0 -1
- package/DS1/x-icon/ezo-block-section.svg +0 -1
- package/DS1/x-icon/ezo-block-table.svg +0 -1
- package/DS1/x-icon/ezo-code.svg +0 -14
- package/DS1/x-icon/ezo-down.svg +0 -3
- package/DS1/x-icon/ezo-figma-premium-star.svg +0 -5
- package/DS1/x-icon/ezo-item-button-complete.svg +0 -4
- package/DS1/x-icon/ezo-item-button-header.svg +0 -3
- package/DS1/x-icon/ezo-item-button-open.svg +0 -3
- package/DS1/x-icon/ezo-item-button-star.svg +0 -3
- package/DS1/x-icon/ezo-item-button-unheader.svg +0 -7
- package/DS1/x-icon/ezo-item-button-unstar.svg +0 -5
- package/DS1/x-icon/ezo-item-star.svg +0 -5
- package/DS1/x-icon/ezo-left.svg +0 -3
- package/DS1/x-icon/ezo-logo.svg +0 -1
- package/DS1/x-icon/ezo-mic.svg +0 -8
- package/DS1/x-icon/ezo-move-column.svg +0 -14
- package/DS1/x-icon/ezo-move-row.svg +0 -18
- package/DS1/x-icon/ezo-navigation-check.svg +0 -1
- package/DS1/x-icon/ezo-note-back.svg +0 -5
- package/DS1/x-icon/ezo-note-menu-complete.svg +0 -11
- package/DS1/x-icon/ezo-note-menu-delete.svg +0 -4
- package/DS1/x-icon/ezo-note-menu-duplicate.svg +0 -8
- package/DS1/x-icon/ezo-note-menu-note.svg +0 -5
- package/DS1/x-icon/ezo-note-menu-page.svg +0 -3
- package/DS1/x-icon/ezo-note-menu-star.svg +0 -5
- package/DS1/x-icon/ezo-note-menu-start.svg +0 -6
- package/DS1/x-icon/ezo-note-menu-stop.svg +0 -6
- package/DS1/x-icon/ezo-note-more.svg +0 -7
- package/DS1/x-icon/ezo-note-star.svg +0 -5
- package/DS1/x-icon/ezo-pattern-call-to-action.svg +0 -1
- package/DS1/x-icon/ezo-play.svg +0 -5
- package/DS1/x-icon/ezo-premium-star.svg +0 -5
- package/DS1/x-icon/ezo-setting-1xdots.svg +0 -13
- package/DS1/x-icon/ezo-setting-1xgrid.svg +0 -10
- package/DS1/x-icon/ezo-setting-1xlines.svg +0 -7
- package/DS1/x-icon/ezo-setting-2xdots.svg +0 -8
- package/DS1/x-icon/ezo-setting-2xgrid.svg +0 -8
- package/DS1/x-icon/ezo-setting-2xlines.svg +0 -6
- package/DS1/x-icon/ezo-setting-blank.svg +0 -5
- package/DS1/x-icon/ezo-store-chevron.svg +0 -1
- package/DS1/x-icon/ezo-upgrade-close.svg +0 -5
- package/DS1/x-icon/product-sources.json +0 -2557
- /package/DS1/x-icon/{ezo-password-visibility-see.svg → password-see.svg} +0 -0
- /package/DS1/x-icon/{ezo-password-visibility-unsee.svg → password-unsee.svg} +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dialogs that answer with a promise, in place of the browser's `alert()`,
|
|
3
|
+
* `confirm()` and `prompt()`, for pages without Lit or any other framework.
|
|
4
|
+
*
|
|
5
|
+
* Each is drawn on the native `dialog.ds-dialog` frame from `1-root/controls.css`
|
|
6
|
+
* (which the page loads) with its native buttons, `.ds-button--primary`,
|
|
7
|
+
* `--secondary` and `--danger`, and opened with `showModal()`, so the browser
|
|
8
|
+
* keeps the rest of the page inert behind it. Their words default to the
|
|
9
|
+
* shared words (OK, Cancel) in the page's language where the page loads the
|
|
10
|
+
* language module, and English otherwise (`./feedback-words.ts`).
|
|
11
|
+
*
|
|
12
|
+
* - Focus moves into the dialog when it opens, and back to what had it when it
|
|
13
|
+
* closes.
|
|
14
|
+
* - Escape cancels; Enter in a prompt's field confirms it.
|
|
15
|
+
* - A click on the backdrop cancels, except on a destructive confirmation
|
|
16
|
+
* (`danger`), which takes an answer.
|
|
17
|
+
* - Two never open at once: a dialog asked for while another is open waits
|
|
18
|
+
* for it to close.
|
|
19
|
+
* - A dialog asked for in a click opens within that click, so a phone shows
|
|
20
|
+
* its keyboard for a prompt's field.
|
|
21
|
+
*/
|
|
22
|
+
import { feedbackWord } from "./feedback-words";
|
|
23
|
+
/* One dialog at a time; the next waits in line. */
|
|
24
|
+
const waiting = [];
|
|
25
|
+
let open = false;
|
|
26
|
+
let count = 0;
|
|
27
|
+
function inLine(show) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const start = () => {
|
|
30
|
+
open = true;
|
|
31
|
+
show().then(resolve, reject).finally(() => {
|
|
32
|
+
open = false;
|
|
33
|
+
waiting.shift()?.();
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
if (open)
|
|
37
|
+
waiting.push(start);
|
|
38
|
+
else
|
|
39
|
+
start();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/** The element with focus, inside open shadow roots too. */
|
|
43
|
+
function focused() {
|
|
44
|
+
let active = document.activeElement;
|
|
45
|
+
while (active?.shadowRoot?.activeElement)
|
|
46
|
+
active = active.shadowRoot.activeElement;
|
|
47
|
+
return active instanceof HTMLElement ? active : null;
|
|
48
|
+
}
|
|
49
|
+
function element(name, attributes = {}, text) {
|
|
50
|
+
const node = document.createElement(name);
|
|
51
|
+
for (const [key, value] of Object.entries(attributes))
|
|
52
|
+
node.setAttribute(key, value);
|
|
53
|
+
if (text !== undefined)
|
|
54
|
+
node.textContent = text;
|
|
55
|
+
return node;
|
|
56
|
+
}
|
|
57
|
+
/** Answers `true` for the confirming button, `false` for Cancel, Escape and the backdrop; a prompt answers its text. */
|
|
58
|
+
function show(spec) {
|
|
59
|
+
return new Promise(resolve => {
|
|
60
|
+
const id = `ds-feedback-${++count}`;
|
|
61
|
+
const opener = focused();
|
|
62
|
+
const dialog = element("dialog", {
|
|
63
|
+
class: "ds-dialog",
|
|
64
|
+
role: spec.kind === "prompt" ? "dialog" : "alertdialog",
|
|
65
|
+
"aria-labelledby": `${id}-title`,
|
|
66
|
+
"data-ds-feedback": spec.kind,
|
|
67
|
+
});
|
|
68
|
+
const header = element("div", { "data-ds-dialog": "header" });
|
|
69
|
+
header.appendChild(element("h2", { id: `${id}-title`, "data-ds-dialog": "title" }, spec.title));
|
|
70
|
+
if (spec.text) {
|
|
71
|
+
header.appendChild(element("p", { id: `${id}-text`, "data-ds-dialog": "description" }, spec.text));
|
|
72
|
+
dialog.setAttribute("aria-describedby", `${id}-text`);
|
|
73
|
+
}
|
|
74
|
+
dialog.appendChild(header);
|
|
75
|
+
let input;
|
|
76
|
+
if (spec.field) {
|
|
77
|
+
const field = element("div", { "data-ds-dialog": "field" });
|
|
78
|
+
input = element("input", { id: `${id}-field`, class: "ds-input", type: "text", autocomplete: "off" });
|
|
79
|
+
input.value = spec.field.value;
|
|
80
|
+
if (spec.field.placeholder)
|
|
81
|
+
input.placeholder = spec.field.placeholder;
|
|
82
|
+
if (spec.field.label)
|
|
83
|
+
field.appendChild(element("label", { for: input.id, "data-ds-dialog": "label" }, spec.field.label));
|
|
84
|
+
else
|
|
85
|
+
input.setAttribute("aria-labelledby", `${id}-title`);
|
|
86
|
+
field.appendChild(input);
|
|
87
|
+
dialog.appendChild(field);
|
|
88
|
+
}
|
|
89
|
+
const footer = element("div", { "data-ds-dialog": "footer" });
|
|
90
|
+
const cancel = spec.cancel === undefined ? undefined : element("button", { type: "button", class: "ds-button ds-button--secondary", value: "cancel" }, spec.cancel);
|
|
91
|
+
const confirm = element("button", { type: "button", class: spec.danger ? "ds-button ds-button--secondary ds-button--danger" : "ds-button ds-button--primary", value: "confirm" }, spec.confirm);
|
|
92
|
+
if (cancel)
|
|
93
|
+
footer.appendChild(cancel);
|
|
94
|
+
footer.appendChild(confirm);
|
|
95
|
+
dialog.appendChild(footer);
|
|
96
|
+
const declined = spec.kind === "prompt" ? null : false;
|
|
97
|
+
let settled = false;
|
|
98
|
+
const finish = (confirmed) => {
|
|
99
|
+
if (settled)
|
|
100
|
+
return;
|
|
101
|
+
settled = true;
|
|
102
|
+
if (dialog.open)
|
|
103
|
+
dialog.close();
|
|
104
|
+
dialog.remove();
|
|
105
|
+
if (opener?.isConnected)
|
|
106
|
+
opener.focus({ preventScroll: true });
|
|
107
|
+
resolve(spec.kind === "alert" ? true : confirmed ? (input ? input.value : true) : declined);
|
|
108
|
+
};
|
|
109
|
+
confirm.addEventListener("click", () => finish(true));
|
|
110
|
+
cancel?.addEventListener("click", () => finish(false));
|
|
111
|
+
input?.addEventListener("keydown", event => {
|
|
112
|
+
if (event.key !== "Enter" || event.isComposing || event.shiftKey || event.altKey || event.metaKey || event.ctrlKey)
|
|
113
|
+
return;
|
|
114
|
+
event.preventDefault();
|
|
115
|
+
finish(true);
|
|
116
|
+
});
|
|
117
|
+
dialog.addEventListener("cancel", event => { event.preventDefault(); finish(false); });
|
|
118
|
+
// The browser can still close it (a second Escape): that is a cancel too.
|
|
119
|
+
dialog.addEventListener("close", () => finish(false));
|
|
120
|
+
// The backdrop is the dialog itself, outside its box; a press must start and end there.
|
|
121
|
+
const outside = (event) => {
|
|
122
|
+
if (event.target !== dialog)
|
|
123
|
+
return false;
|
|
124
|
+
const box = dialog.getBoundingClientRect();
|
|
125
|
+
return event.clientX < box.left || event.clientX > box.right || event.clientY < box.top || event.clientY > box.bottom;
|
|
126
|
+
};
|
|
127
|
+
let pressedOutside = false;
|
|
128
|
+
if (!spec.danger) {
|
|
129
|
+
dialog.addEventListener("pointerdown", event => { pressedOutside = event.button === 0 && outside(event); });
|
|
130
|
+
dialog.addEventListener("click", event => {
|
|
131
|
+
if (pressedOutside && outside(event))
|
|
132
|
+
finish(false);
|
|
133
|
+
pressedOutside = false;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const first = input ?? (spec.danger ? cancel : undefined) ?? confirm;
|
|
137
|
+
first.setAttribute("autofocus", "");
|
|
138
|
+
document.body.appendChild(dialog);
|
|
139
|
+
try {
|
|
140
|
+
dialog.showModal();
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
dialog.setAttribute("open", "");
|
|
144
|
+
}
|
|
145
|
+
first.focus();
|
|
146
|
+
input?.select();
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/** In place of `alert()`: a message with one button. Resolves when it is dismissed. */
|
|
150
|
+
export function alert(options) {
|
|
151
|
+
const { title, text, confirm } = typeof options === "string" ? { title: options } : options;
|
|
152
|
+
if (typeof document === "undefined")
|
|
153
|
+
return Promise.resolve();
|
|
154
|
+
return inLine(() => show({ kind: "alert", title, text, confirm: confirm ?? feedbackWord("OK") })).then(() => undefined);
|
|
155
|
+
}
|
|
156
|
+
/** In place of `confirm()`: resolves to `true` when confirmed, `false` otherwise. */
|
|
157
|
+
export function confirm(options) {
|
|
158
|
+
const { title, text, confirm: yes, cancel, danger } = typeof options === "string" ? { title: options } : options;
|
|
159
|
+
if (typeof document === "undefined")
|
|
160
|
+
return Promise.resolve(false);
|
|
161
|
+
return inLine(() => show({ kind: "confirm", title, text, confirm: yes ?? feedbackWord("OK"), cancel: cancel ?? feedbackWord("Cancel"), danger })).then(answer => answer === true);
|
|
162
|
+
}
|
|
163
|
+
/** In place of `prompt()`: resolves to the text written, or `null` when cancelled. */
|
|
164
|
+
export function prompt(options) {
|
|
165
|
+
const { title, text, label, value = "", placeholder, confirm: yes, cancel } = typeof options === "string" ? { title: options } : options;
|
|
166
|
+
if (typeof document === "undefined")
|
|
167
|
+
return Promise.resolve(null);
|
|
168
|
+
return inLine(() => show({
|
|
169
|
+
kind: "prompt", title, text,
|
|
170
|
+
confirm: yes ?? feedbackWord("OK"), cancel: cancel ?? feedbackWord("Cancel"),
|
|
171
|
+
field: { label, value, placeholder },
|
|
172
|
+
})).then(answer => typeof answer === "string" ? answer : null);
|
|
173
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A drawer: parts of a page folded away on a narrow screen and opened over it
|
|
3
|
+
* from a menu button. Plain TypeScript with no Lit and no framework, so a page
|
|
4
|
+
* of native HTML uses it as the elements do.
|
|
5
|
+
*
|
|
6
|
+
* `attachDrawer()` ties a toggle button to the parts it folds away (a
|
|
7
|
+
* header's navigation and actions, a page's navigation). Opening moves them
|
|
8
|
+
* into a native `<dialog class="ds-dialog ds-drawer">` laid over the screen
|
|
9
|
+
* (1-root/drawer.css draws it), shown modally so the rest of the page is
|
|
10
|
+
* inert, with a close button where the toggle stood. While it is open:
|
|
11
|
+
*
|
|
12
|
+
* - Tab and Shift+Tab go round the panel's controls and never leave it;
|
|
13
|
+
* - Escape, the close button, a link in the panel and the toggle going out of
|
|
14
|
+
* sight (the screen widened) close it;
|
|
15
|
+
* - the page behind holds its scroll, and gets it back as it was.
|
|
16
|
+
*
|
|
17
|
+
* Closing puts every part back where it was and returns focus to the toggle.
|
|
18
|
+
* The toggle carries `aria-expanded` and `aria-controls`; its accessible name
|
|
19
|
+
* stays the same (Menu) open or closed.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* const drawer = attachDrawer({ toggle, content: [nav, actions], closeLabel: "Close" });
|
|
23
|
+
* drawer.open();
|
|
24
|
+
*/
|
|
25
|
+
export interface DrawerOptions {
|
|
26
|
+
/** The button that opens the drawer, and stands for it while it is closed. */
|
|
27
|
+
toggle: HTMLElement;
|
|
28
|
+
/** What the drawer holds while it is open: moved into the panel in this order and back on closing. */
|
|
29
|
+
content: readonly Element[] | (() => readonly Element[]);
|
|
30
|
+
/**
|
|
31
|
+
* The panel to open, with its close button marked `.ds-drawer__close`. A
|
|
32
|
+
* `<dialog class="ds-dialog ds-drawer">` is made beside the toggle when none
|
|
33
|
+
* is given, its close button a copy of the toggle.
|
|
34
|
+
*/
|
|
35
|
+
panel?: HTMLDialogElement;
|
|
36
|
+
/** Where a new panel goes: after the toggle by default. */
|
|
37
|
+
container?: Element | ShadowRoot;
|
|
38
|
+
/** The panel's accessible name: the toggle's own name by default. */
|
|
39
|
+
label?: string;
|
|
40
|
+
/** The close button's accessible name. "Close" by default. */
|
|
41
|
+
closeLabel?: string;
|
|
42
|
+
/** Close when a link in the panel is followed. On by default. */
|
|
43
|
+
closeOnLink?: boolean;
|
|
44
|
+
/** Called after the drawer opens or closes. */
|
|
45
|
+
onToggle?: (open: boolean) => void;
|
|
46
|
+
}
|
|
47
|
+
export interface Drawer {
|
|
48
|
+
readonly panel: HTMLDialogElement;
|
|
49
|
+
readonly isOpen: boolean;
|
|
50
|
+
open(): void;
|
|
51
|
+
close(): void;
|
|
52
|
+
toggle(): void;
|
|
53
|
+
/** Close it, take the panel away if it was made here, and stop listening. */
|
|
54
|
+
destroy(): void;
|
|
55
|
+
}
|
|
56
|
+
/** The element that has focus, inside open shadow roots too. */
|
|
57
|
+
export declare function deepActiveElement(document: Document): Element | null;
|
|
58
|
+
/**
|
|
59
|
+
* The controls Tab reaches inside a root, in order: through open shadow roots
|
|
60
|
+
* and the elements a slot shows.
|
|
61
|
+
*/
|
|
62
|
+
export declare function tabbables(root: Element): HTMLElement[];
|
|
63
|
+
export declare function attachDrawer(options: DrawerOptions): Drawer;
|
|
64
|
+
//# sourceMappingURL=drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../DS1/0-face/drawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,WAAW,CAAC;IACpB,sGAAsG;IACtG,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,CAAC,MAAM,SAAS,OAAO,EAAE,CAAC,CAAC;IACzD;;;;OAIG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,6EAA6E;IAC7E,OAAO,IAAI,IAAI,CAAC;CACjB;AAiCD,gEAAgE;AAChE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAIpE;AAQD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,EAAE,CAUtD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA2I3D"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A drawer: parts of a page folded away on a narrow screen and opened over it
|
|
3
|
+
* from a menu button. Plain TypeScript with no Lit and no framework, so a page
|
|
4
|
+
* of native HTML uses it as the elements do.
|
|
5
|
+
*
|
|
6
|
+
* `attachDrawer()` ties a toggle button to the parts it folds away (a
|
|
7
|
+
* header's navigation and actions, a page's navigation). Opening moves them
|
|
8
|
+
* into a native `<dialog class="ds-dialog ds-drawer">` laid over the screen
|
|
9
|
+
* (1-root/drawer.css draws it), shown modally so the rest of the page is
|
|
10
|
+
* inert, with a close button where the toggle stood. While it is open:
|
|
11
|
+
*
|
|
12
|
+
* - Tab and Shift+Tab go round the panel's controls and never leave it;
|
|
13
|
+
* - Escape, the close button, a link in the panel and the toggle going out of
|
|
14
|
+
* sight (the screen widened) close it;
|
|
15
|
+
* - the page behind holds its scroll, and gets it back as it was.
|
|
16
|
+
*
|
|
17
|
+
* Closing puts every part back where it was and returns focus to the toggle.
|
|
18
|
+
* The toggle carries `aria-expanded` and `aria-controls`; its accessible name
|
|
19
|
+
* stays the same (Menu) open or closed.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* const drawer = attachDrawer({ toggle, content: [nav, actions], closeLabel: "Close" });
|
|
23
|
+
* drawer.open();
|
|
24
|
+
*/
|
|
25
|
+
const FOCUSABLE = 'a[href], area[href], button, input:not([type="hidden"]), select, textarea, iframe, summary, [contenteditable=""], [contenteditable="true"], [tabindex]';
|
|
26
|
+
/** The drawers open on each document, the last opened last: only it answers the keys. */
|
|
27
|
+
const openDrawers = new WeakMap();
|
|
28
|
+
/** The drawer that holds each document's scroll, so two drawers never fight over it. */
|
|
29
|
+
const scrollHolders = new WeakMap();
|
|
30
|
+
function holdScroll(document, owner) {
|
|
31
|
+
let held = scrollHolders.get(document);
|
|
32
|
+
if (!held) {
|
|
33
|
+
const root = document.documentElement.style;
|
|
34
|
+
held = { owners: new Set(), overflow: root.overflow, overscroll: root.overscrollBehavior, x: document.defaultView?.scrollX ?? 0, y: document.defaultView?.scrollY ?? 0 };
|
|
35
|
+
scrollHolders.set(document, held);
|
|
36
|
+
root.overflow = "hidden";
|
|
37
|
+
root.overscrollBehavior = "none";
|
|
38
|
+
}
|
|
39
|
+
held.owners.add(owner);
|
|
40
|
+
}
|
|
41
|
+
function releaseScroll(document, owner) {
|
|
42
|
+
const held = scrollHolders.get(document);
|
|
43
|
+
if (!held || !held.owners.delete(owner) || held.owners.size)
|
|
44
|
+
return;
|
|
45
|
+
const root = document.documentElement.style;
|
|
46
|
+
root.overflow = held.overflow;
|
|
47
|
+
root.overscrollBehavior = held.overscroll;
|
|
48
|
+
scrollHolders.delete(document);
|
|
49
|
+
const view = document.defaultView;
|
|
50
|
+
if (view && (view.scrollX !== held.x || view.scrollY !== held.y))
|
|
51
|
+
view.scrollTo(held.x, held.y);
|
|
52
|
+
}
|
|
53
|
+
/** The element that has focus, inside open shadow roots too. */
|
|
54
|
+
export function deepActiveElement(document) {
|
|
55
|
+
let active = document.activeElement;
|
|
56
|
+
while (active?.shadowRoot?.activeElement)
|
|
57
|
+
active = active.shadowRoot.activeElement;
|
|
58
|
+
return active;
|
|
59
|
+
}
|
|
60
|
+
function shown(element) {
|
|
61
|
+
if (element.closest("[hidden], [inert]"))
|
|
62
|
+
return false;
|
|
63
|
+
const check = element.checkVisibility;
|
|
64
|
+
return typeof check === "function" ? check.call(element, { visibilityProperty: true }) : true;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The controls Tab reaches inside a root, in order: through open shadow roots
|
|
68
|
+
* and the elements a slot shows.
|
|
69
|
+
*/
|
|
70
|
+
export function tabbables(root) {
|
|
71
|
+
const found = [];
|
|
72
|
+
const visit = (node) => {
|
|
73
|
+
if (node instanceof HTMLElement && node.matches(FOCUSABLE) && node.tabIndex >= 0 && !node.disabled && shown(node))
|
|
74
|
+
found.push(node);
|
|
75
|
+
if (node.shadowRoot)
|
|
76
|
+
for (const child of node.shadowRoot.children)
|
|
77
|
+
visit(child);
|
|
78
|
+
const children = node instanceof HTMLSlotElement ? node.assignedElements({ flatten: true }) : [...node.children];
|
|
79
|
+
for (const child of children)
|
|
80
|
+
visit(child);
|
|
81
|
+
};
|
|
82
|
+
for (const child of root.children)
|
|
83
|
+
visit(child);
|
|
84
|
+
return found;
|
|
85
|
+
}
|
|
86
|
+
export function attachDrawer(options) {
|
|
87
|
+
const { toggle } = options;
|
|
88
|
+
const document = toggle.ownerDocument;
|
|
89
|
+
const made = !options.panel;
|
|
90
|
+
const panel = options.panel ?? document.createElement("dialog");
|
|
91
|
+
let placeholders = [];
|
|
92
|
+
let open = false;
|
|
93
|
+
/** The button in the panel that closes it: made here, or the panel's own `.ds-drawer__close`. */
|
|
94
|
+
let closeButton = options.panel?.querySelector(".ds-drawer__close") ?? null;
|
|
95
|
+
if (made) {
|
|
96
|
+
panel.className = "ds-dialog ds-drawer";
|
|
97
|
+
const bar = document.createElement("div");
|
|
98
|
+
bar.className = "ds-drawer__bar";
|
|
99
|
+
// The close button is a copy of the toggle, so it shows the same icons
|
|
100
|
+
// (the second one, close) in the same place.
|
|
101
|
+
closeButton = toggle.cloneNode(true);
|
|
102
|
+
closeButton.removeAttribute("id");
|
|
103
|
+
closeButton.removeAttribute("aria-controls");
|
|
104
|
+
closeButton.removeAttribute("aria-expanded");
|
|
105
|
+
closeButton.removeAttribute("aria-haspopup");
|
|
106
|
+
closeButton.classList.remove("ds-drawer__toggle", "ds-header__toggle");
|
|
107
|
+
closeButton.classList.add("ds-drawer__close");
|
|
108
|
+
closeButton.setAttribute("aria-label", options.closeLabel || "Close");
|
|
109
|
+
if (closeButton instanceof HTMLButtonElement)
|
|
110
|
+
closeButton.type = "button";
|
|
111
|
+
bar.append(closeButton);
|
|
112
|
+
panel.append(bar);
|
|
113
|
+
if (options.container)
|
|
114
|
+
options.container.append(panel);
|
|
115
|
+
else
|
|
116
|
+
toggle.after(panel);
|
|
117
|
+
}
|
|
118
|
+
panel.classList.add("ds-drawer");
|
|
119
|
+
const label = () => options.label || toggle.getAttribute("aria-label") || toggle.textContent?.trim() || "";
|
|
120
|
+
if (!panel.hasAttribute("aria-label") && !panel.hasAttribute("aria-labelledby") && label())
|
|
121
|
+
panel.setAttribute("aria-label", label());
|
|
122
|
+
if (!panel.id)
|
|
123
|
+
panel.id = `ds-drawer-${Math.random().toString(36).slice(2, 10)}`;
|
|
124
|
+
if (!toggle.hasAttribute("aria-controls"))
|
|
125
|
+
toggle.setAttribute("aria-controls", panel.id);
|
|
126
|
+
toggle.setAttribute("aria-expanded", "false");
|
|
127
|
+
toggle.setAttribute("aria-haspopup", "dialog");
|
|
128
|
+
toggle.classList.add("ds-drawer__toggle");
|
|
129
|
+
const parts = () => (typeof options.content === "function" ? options.content() : options.content).filter(Boolean);
|
|
130
|
+
function show() {
|
|
131
|
+
if (open || !toggle.isConnected)
|
|
132
|
+
return;
|
|
133
|
+
open = true;
|
|
134
|
+
const content = parts();
|
|
135
|
+
placeholders = content.map(element => {
|
|
136
|
+
const mark = document.createComment("ds-drawer");
|
|
137
|
+
element.before(mark);
|
|
138
|
+
return [element, mark];
|
|
139
|
+
});
|
|
140
|
+
panel.append(...content);
|
|
141
|
+
holdScroll(document, drawer);
|
|
142
|
+
const stack = openDrawers.get(document) ?? [];
|
|
143
|
+
openDrawers.set(document, [...stack.filter(entry => entry !== drawer), drawer]);
|
|
144
|
+
toggle.setAttribute("aria-expanded", "true");
|
|
145
|
+
if (typeof panel.showModal === "function" && panel.isConnected) {
|
|
146
|
+
try {
|
|
147
|
+
panel.showModal();
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
panel.setAttribute("open", "");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else
|
|
154
|
+
panel.setAttribute("open", "");
|
|
155
|
+
// The panel's first control takes focus: the close button.
|
|
156
|
+
(closeButton ?? tabbables(panel)[0])?.focus({ preventScroll: true });
|
|
157
|
+
view?.addEventListener("resize", onResize);
|
|
158
|
+
// Bubbling, so a menu or dialog inside the panel takes its own Escape first.
|
|
159
|
+
document.addEventListener("keydown", onKey);
|
|
160
|
+
options.onToggle?.(true);
|
|
161
|
+
}
|
|
162
|
+
function hide() {
|
|
163
|
+
if (!open)
|
|
164
|
+
return;
|
|
165
|
+
open = false;
|
|
166
|
+
if (panel.open)
|
|
167
|
+
panel.close();
|
|
168
|
+
panel.removeAttribute("open");
|
|
169
|
+
for (const [element, mark] of placeholders) {
|
|
170
|
+
if (mark.isConnected)
|
|
171
|
+
mark.replaceWith(element);
|
|
172
|
+
else
|
|
173
|
+
mark.remove();
|
|
174
|
+
}
|
|
175
|
+
placeholders = [];
|
|
176
|
+
releaseScroll(document, drawer);
|
|
177
|
+
openDrawers.set(document, (openDrawers.get(document) ?? []).filter(entry => entry !== drawer));
|
|
178
|
+
toggle.setAttribute("aria-expanded", "false");
|
|
179
|
+
view?.removeEventListener("resize", onResize);
|
|
180
|
+
document.removeEventListener("keydown", onKey);
|
|
181
|
+
if (toggle.isConnected && shown(toggle))
|
|
182
|
+
toggle.focus({ preventScroll: true });
|
|
183
|
+
options.onToggle?.(false);
|
|
184
|
+
}
|
|
185
|
+
const view = document.defaultView;
|
|
186
|
+
const onToggleClick = () => (open ? hide() : show());
|
|
187
|
+
const onResize = () => { if (open && !shown(toggle))
|
|
188
|
+
hide(); };
|
|
189
|
+
const onKey = (event) => {
|
|
190
|
+
if (!open || event.defaultPrevented || openDrawers.get(document)?.slice(-1)[0] !== drawer)
|
|
191
|
+
return;
|
|
192
|
+
if (event.key === "Escape") {
|
|
193
|
+
event.preventDefault();
|
|
194
|
+
hide();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (event.key !== "Tab")
|
|
198
|
+
return;
|
|
199
|
+
const controls = tabbables(panel);
|
|
200
|
+
if (!controls.length) {
|
|
201
|
+
event.preventDefault();
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const active = deepActiveElement(document);
|
|
205
|
+
const first = controls[0], last = controls[controls.length - 1];
|
|
206
|
+
const index = active ? controls.indexOf(active) : -1;
|
|
207
|
+
if (event.shiftKey && index <= 0) {
|
|
208
|
+
event.preventDefault();
|
|
209
|
+
last.focus();
|
|
210
|
+
}
|
|
211
|
+
else if (!event.shiftKey && (index === -1 || active === last)) {
|
|
212
|
+
event.preventDefault();
|
|
213
|
+
first.focus();
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
// Escape on a modal dialog is its cancel: close through the drawer so the parts go back.
|
|
217
|
+
const onCancel = (event) => { event.preventDefault(); hide(); };
|
|
218
|
+
const onNativeClose = () => { if (open)
|
|
219
|
+
hide(); };
|
|
220
|
+
const onPanelClick = (event) => {
|
|
221
|
+
const path = event.composedPath();
|
|
222
|
+
if (closeButton && path.includes(closeButton)) {
|
|
223
|
+
hide();
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
// A link closes it even when a router takes the click (and prevents its default).
|
|
227
|
+
if (options.closeOnLink === false)
|
|
228
|
+
return;
|
|
229
|
+
// Only what stands inside the panel: the path up to it.
|
|
230
|
+
if (path.slice(0, path.indexOf(panel)).some(node => node instanceof Element && node.matches("a[href]")))
|
|
231
|
+
hide();
|
|
232
|
+
};
|
|
233
|
+
toggle.addEventListener("click", onToggleClick);
|
|
234
|
+
panel.addEventListener("cancel", onCancel);
|
|
235
|
+
panel.addEventListener("close", onNativeClose);
|
|
236
|
+
panel.addEventListener("click", onPanelClick);
|
|
237
|
+
const drawer = {
|
|
238
|
+
panel,
|
|
239
|
+
get isOpen() { return open; },
|
|
240
|
+
open: show,
|
|
241
|
+
close: hide,
|
|
242
|
+
toggle: onToggleClick,
|
|
243
|
+
destroy() {
|
|
244
|
+
hide();
|
|
245
|
+
toggle.removeEventListener("click", onToggleClick);
|
|
246
|
+
panel.removeEventListener("cancel", onCancel);
|
|
247
|
+
panel.removeEventListener("close", onNativeClose);
|
|
248
|
+
panel.removeEventListener("click", onPanelClick);
|
|
249
|
+
toggle.removeAttribute("aria-expanded");
|
|
250
|
+
toggle.removeAttribute("aria-haspopup");
|
|
251
|
+
if (made)
|
|
252
|
+
panel.remove();
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
return drawer;
|
|
256
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The words the feedback module shows by default (OK, Cancel, Close, Copied,
|
|
3
|
+
* Could not copy, Notifications), without importing the language runtime.
|
|
4
|
+
*
|
|
5
|
+
* - Where the page loads the language module (`./i18n.ts`, Sync 1's
|
|
6
|
+
* `languages` export), it registers its `translate()` here when it loads,
|
|
7
|
+
* and the words are the shared words in the page's language once
|
|
8
|
+
* `configureI18n({ sharedWords: true })` turns them on.
|
|
9
|
+
* - Where it does not, they read English, and no language module, no
|
|
10
|
+
* translation file and no request comes with them.
|
|
11
|
+
* - `setFeedbackWords()` gives the module words of the product's own: a table
|
|
12
|
+
* of the words it changes, or a function that translates each key.
|
|
13
|
+
*/
|
|
14
|
+
export type FeedbackWord = "OK" | "Cancel" | "Close" | "Copied" | "Could not copy" | "Notifications";
|
|
15
|
+
/** A table of the words to change, or a function that gives each word in the page's language. */
|
|
16
|
+
export type FeedbackWords = Partial<Record<FeedbackWord, string>> | ((word: FeedbackWord) => string);
|
|
17
|
+
/** Give the feedback module's default words, or `null` to go back to the language module's (or English). */
|
|
18
|
+
export declare function setFeedbackWords(next: FeedbackWords | null): void;
|
|
19
|
+
/** A default word in the page's language. */
|
|
20
|
+
export declare function feedbackWord(word: FeedbackWord): string;
|
|
21
|
+
//# sourceMappingURL=feedback-words.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-words.d.ts","sourceRoot":"","sources":["../../DS1/0-face/feedback-words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,gBAAgB,GAAG,eAAe,CAAC;AACrG,iGAAiG;AACjG,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,CAAC,CAAC;AAOrG,4GAA4G;AAC5G,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAEjE;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAMvD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The words the feedback module shows by default (OK, Cancel, Close, Copied,
|
|
3
|
+
* Could not copy, Notifications), without importing the language runtime.
|
|
4
|
+
*
|
|
5
|
+
* - Where the page loads the language module (`./i18n.ts`, Sync 1's
|
|
6
|
+
* `languages` export), it registers its `translate()` here when it loads,
|
|
7
|
+
* and the words are the shared words in the page's language once
|
|
8
|
+
* `configureI18n({ sharedWords: true })` turns them on.
|
|
9
|
+
* - Where it does not, they read English, and no language module, no
|
|
10
|
+
* translation file and no request comes with them.
|
|
11
|
+
* - `setFeedbackWords()` gives the module words of the product's own: a table
|
|
12
|
+
* of the words it changes, or a function that translates each key.
|
|
13
|
+
*/
|
|
14
|
+
/** Where the language module leaves its `translate()`; on `globalThis`, so every copy of either module finds it. */
|
|
15
|
+
const TRANSLATOR = Symbol.for("design-system-1.translate");
|
|
16
|
+
let words = null;
|
|
17
|
+
/** Give the feedback module's default words, or `null` to go back to the language module's (or English). */
|
|
18
|
+
export function setFeedbackWords(next) {
|
|
19
|
+
words = next;
|
|
20
|
+
}
|
|
21
|
+
/** A default word in the page's language. */
|
|
22
|
+
export function feedbackWord(word) {
|
|
23
|
+
if (typeof words === "function")
|
|
24
|
+
return words(word);
|
|
25
|
+
const own = words?.[word];
|
|
26
|
+
if (own !== undefined)
|
|
27
|
+
return own;
|
|
28
|
+
const translate = globalThis[TRANSLATOR];
|
|
29
|
+
return typeof translate === "function" ? String(translate(word)) : word;
|
|
30
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback without Lit: toasts, dialogs that answer with a promise, and
|
|
3
|
+
* copying text, from one import and with no framework. Use it in place of the
|
|
4
|
+
* browser's `alert()`, `confirm()` and `prompt()`, and of a page's own toasts
|
|
5
|
+
* and copy buttons.
|
|
6
|
+
*
|
|
7
|
+
* import { toast, confirm, prompt, alert, copyText } from "…/0-face/feedback";
|
|
8
|
+
*
|
|
9
|
+
* toast.success("Saved");
|
|
10
|
+
* if (await confirm({ title: "Delete this track?", confirm: "Delete", danger: true })) remove();
|
|
11
|
+
* const name = await prompt({ title: "Rename", value: track.name });
|
|
12
|
+
* await copyText(link);
|
|
13
|
+
*
|
|
14
|
+
* - `toast()` is Sonner's, as in `<ds-toast>` (based on Sonner, MIT licence):
|
|
15
|
+
* the same calls, options and stack, drawn by the page toaster
|
|
16
|
+
* (`./toaster.ts`) on a page without Lit and by `<ds-toast>` where the page
|
|
17
|
+
* has one. `configureToaster()` takes Sonner's `<Toaster />` props.
|
|
18
|
+
* - `alert()`, `confirm()` and `prompt()` are drawn on the native
|
|
19
|
+
* `dialog.ds-dialog` frame from `1-root/controls.css`, which the page loads.
|
|
20
|
+
* - Default words (`./feedback-words.ts`) are English, with no language
|
|
21
|
+
* runtime. Where the page loads the language module (`./i18n.ts`, Sync 1's
|
|
22
|
+
* `languages` export), they are the shared words in the page's language
|
|
23
|
+
* once `configureI18n({ sharedWords: true })` turns them on.
|
|
24
|
+
* `setFeedbackWords()` gives words of the product's own.
|
|
25
|
+
* - It is plain TypeScript, with no `?inline` or `?raw` import, for any
|
|
26
|
+
* bundler, runtime and type check. It adds nodes with `appendChild()`, not
|
|
27
|
+
* `append()`, which the Workers types redeclare for their HTML rewriter;
|
|
28
|
+
* tests/feedback-export-types.test.ts checks the copy under them.
|
|
29
|
+
* - A page that only copies text imports `copyText` from `./copy-text.ts`,
|
|
30
|
+
* which loads the page toaster only when it shows a toast.
|
|
31
|
+
*/
|
|
32
|
+
export { configureToaster, pageToaster, toast } from "./toaster";
|
|
33
|
+
export type { ToasterOptions } from "./toaster";
|
|
34
|
+
export type { ToastButton, ToastData, ToastId, ToastOptions, ToastPosition, ToastPromiseMessages, ToastType } from "./toast-queue";
|
|
35
|
+
export { alert, confirm, prompt } from "./dialogs";
|
|
36
|
+
export type { AlertOptions, ConfirmOptions, PromptOptions } from "./dialogs";
|
|
37
|
+
export { copyText } from "./copy-text";
|
|
38
|
+
export type { CopyTextOptions } from "./copy-text";
|
|
39
|
+
export { setFeedbackWords } from "./feedback-words";
|
|
40
|
+
export type { FeedbackWord, FeedbackWords } from "./feedback-words";
|
|
41
|
+
//# sourceMappingURL=feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../DS1/0-face/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACnI,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback without Lit: toasts, dialogs that answer with a promise, and
|
|
3
|
+
* copying text, from one import and with no framework. Use it in place of the
|
|
4
|
+
* browser's `alert()`, `confirm()` and `prompt()`, and of a page's own toasts
|
|
5
|
+
* and copy buttons.
|
|
6
|
+
*
|
|
7
|
+
* import { toast, confirm, prompt, alert, copyText } from "…/0-face/feedback";
|
|
8
|
+
*
|
|
9
|
+
* toast.success("Saved");
|
|
10
|
+
* if (await confirm({ title: "Delete this track?", confirm: "Delete", danger: true })) remove();
|
|
11
|
+
* const name = await prompt({ title: "Rename", value: track.name });
|
|
12
|
+
* await copyText(link);
|
|
13
|
+
*
|
|
14
|
+
* - `toast()` is Sonner's, as in `<ds-toast>` (based on Sonner, MIT licence):
|
|
15
|
+
* the same calls, options and stack, drawn by the page toaster
|
|
16
|
+
* (`./toaster.ts`) on a page without Lit and by `<ds-toast>` where the page
|
|
17
|
+
* has one. `configureToaster()` takes Sonner's `<Toaster />` props.
|
|
18
|
+
* - `alert()`, `confirm()` and `prompt()` are drawn on the native
|
|
19
|
+
* `dialog.ds-dialog` frame from `1-root/controls.css`, which the page loads.
|
|
20
|
+
* - Default words (`./feedback-words.ts`) are English, with no language
|
|
21
|
+
* runtime. Where the page loads the language module (`./i18n.ts`, Sync 1's
|
|
22
|
+
* `languages` export), they are the shared words in the page's language
|
|
23
|
+
* once `configureI18n({ sharedWords: true })` turns them on.
|
|
24
|
+
* `setFeedbackWords()` gives words of the product's own.
|
|
25
|
+
* - It is plain TypeScript, with no `?inline` or `?raw` import, for any
|
|
26
|
+
* bundler, runtime and type check. It adds nodes with `appendChild()`, not
|
|
27
|
+
* `append()`, which the Workers types redeclare for their HTML rewriter;
|
|
28
|
+
* tests/feedback-export-types.test.ts checks the copy under them.
|
|
29
|
+
* - A page that only copies text imports `copyText` from `./copy-text.ts`,
|
|
30
|
+
* which loads the page toaster only when it shows a toast.
|
|
31
|
+
*/
|
|
32
|
+
export { configureToaster, pageToaster, toast } from "./toaster";
|
|
33
|
+
export { alert, confirm, prompt } from "./dialogs";
|
|
34
|
+
export { copyText } from "./copy-text";
|
|
35
|
+
export { setFeedbackWords } from "./feedback-words";
|