@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,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated by scripts/toast-assets.mjs from 2-core/styles/ds-toast.css (with the
|
|
3
|
+
* sheets it imports) and the x-icon files it names. Never edit it: change those
|
|
4
|
+
* files and run `vp run generate:toast-assets`.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** The toast's stylesheet, the same one `<ds-toast>` imports. */
|
|
8
|
+
export const toastStyles: string = "[data-ds-shape=\"square\"], :host([data-ds-shape=\"square\"]){--ds-corner-size: 0px;--ds-corner-shape: round;--ds-button-inset: 0.5px}[data-ds-shape=\"rounded\"], :host([data-ds-shape=\"rounded\"]){--ds-corner-size: 4px;--ds-corner-shape: round;--ds-button-inset: 2.5px}[data-ds-shape=\"circular\"], :host([data-ds-shape=\"circular\"]){--ds-corner-size: 999px;--ds-corner-shape: round;--ds-button-inset: 5px}@supports (corner-shape: squircle){[data-ds-shape=\"rounded\"], :host([data-ds-shape=\"rounded\"]){--ds-corner-size: 8px;--ds-corner-shape: squircle}}:root, :host, :where([data-ds-surface]){--ds-unit: calc(var(--ds-1, 20px) * var(--ds-sf, 1));--ds-control-height: calc(var(--ds-control-size, var(--ds-08, 16px)) * var(--ds-sf, 1));--ds-row-height: calc(var(--ds-row-size, var(--ds-1, 20px)) * var(--ds-sf, 1));--ds-type-size-default: calc(var(--ds-text-size, 14px) * var(--ds-sf, 1));--ds-type-size-small: calc(var(--ds-small-text-size, 10px) * var(--ds-sf, 1));--ds-type-size-heading: calc(var(--ds-heading-text-size, 13px) * var(--ds-sf, 1));--ds-type-size-display: calc(var(--ds-display-text-size, 20px) * var(--ds-sf, 1));--ds-type-lineheight-default: calc(var(--ds-text-leading, 16px) * var(--ds-sf, 1));--ds-type-letterspacing-default: calc(var(--ds-text-tracking, -0.3px) * var(--ds-sf, 1));--ds-radius: calc(var(--ds-corner-size, 4px) * var(--ds-sf, 1));--ds-radius-card: calc(var(--ds-card-corner-size, 4px) * var(--ds-sf, 1))}:host{--ds-toast-width: calc(16 * var(--ds-unit));--ds-toast-offset: var(--ds-unit);--ds-toast-gap: calc(var(--ds-unit) - var(--ds-control-height));--ds-toast-background: var(--ds-tooltip-background, light-dark(var(--ds-black, #2a2a2a), var(--ds-white, #ffffff)));--ds-toast-color: var(--ds-tooltip-color, light-dark(var(--ds-white, #ffffff), var(--ds-black, #2a2a2a)));display: contents}section{display: contents}ol{--lift: -1;position: fixed;z-index: 2147483000;box-sizing: border-box;width: min(var(--ds-toast-width), calc(100% - 2 * var(--ds-toast-offset)));height: calc(var(--height) + var(--gaps) * var(--ds-toast-gap));margin: 0;padding: 0;list-style: none;outline: none;pointer-events: none}ol[data-y=\"top\"]{--lift: 1;top: calc(var(--ds-toast-offset) + env(safe-area-inset-top, 0px))}ol[data-y=\"bottom\"]{bottom: calc(var(--ds-toast-offset) + env(safe-area-inset-bottom, 0px))}ol[data-x=\"left\"]{left: var(--ds-toast-offset)}ol[data-x=\"right\"]{right: var(--ds-toast-offset)}ol[data-x=\"center\"]{left: 50%;transform: translateX(-50%)}:host([contained]) ol{position: absolute;z-index: var(--ds-toast-z-index, 60)}:host([contained]) ol[data-y=\"top\"]{top: var(--ds-toast-offset)}:host([contained]) ol[data-y=\"bottom\"]{bottom: var(--ds-toast-offset)}.toast{--swipe: 0px;position: absolute;left: 0;right: 0;box-sizing: border-box;width: max-content;max-width: 100%;overflow: hidden;border-radius: var(--ds-radius);background: var(--ds-toast-background);color: var(--ds-toast-color);font-family: var(--ds-typeface-regular);font-feature-settings: var(--ds-font-features);font-size: var(--ds-type-size-default);line-height: var(--ds-control-height);letter-spacing: var(--ds-type-letterspacing-default);outline: none;touch-action: none;user-select: none;pointer-events: auto;opacity: 0;transition: transform 400ms ease, opacity 400ms ease}ol[data-y=\"bottom\"] .toast{bottom: 0}ol[data-y=\"top\"] .toast{top: 0}ol[data-x=\"center\"] .toast{margin-inline: auto}ol[data-x=\"left\"] .toast{margin-right: auto}ol[data-x=\"right\"] .toast{margin-left: auto}.toast:focus-visible{outline: 2px solid var(--ds-focus-ring);outline-offset: 1px}.toast[data-mounted=\"false\"]{transform: translateY(calc(var(--lift) * -100%))}.toast[data-mounted=\"true\"]{opacity: 1}ol[data-expanded=\"false\"] .toast[data-mounted=\"true\"]{transform: translateY(calc(var(--lift) * var(--index) * var(--ds-toast-gap) + var(--swipe))) scale(calc(1 - var(--index) * 0.05))}ol[data-expanded=\"false\"] .toast[data-front=\"false\"]{height: var(--front-height)}ol[data-expanded=\"false\"] .toast[data-front=\"false\"] .body{opacity: 0}ol[data-expanded=\"true\"] .toast[data-mounted=\"true\"]{transform: translateY(calc(var(--lift) * (var(--offset) + var(--index) * var(--ds-toast-gap)) + var(--swipe)))}.toast[data-visible=\"false\"]{opacity: 0;pointer-events: none}.toast[data-swiping=\"true\"]{transition: none}.toast[data-removed=\"true\"]{opacity: 0;pointer-events: none}.toast[data-removed=\"true\"][data-front=\"true\"]{transform: translateY(calc(var(--lift) * -100%))}.toast[data-swipe-out=\"true\"]{transform: translateY(calc(var(--swipe) + var(--lift) * -100%))}.body{display: flex;align-items: flex-start;gap: calc(4px * var(--ds-sf));box-sizing: border-box;min-height: var(--ds-control-height);padding-inline: calc(4px * var(--ds-sf));transition: opacity 400ms ease}.icon{display: inline-flex;flex: 0 0 auto;align-items: center;justify-content: center;width: var(--ds-control-height);height: var(--ds-control-height);--ds-icon-color: currentColor}.icon:first-child{margin-left: calc(-4px * var(--ds-sf))}.icon > svg, .close > svg{width: calc(14px * var(--ds-sf));height: calc(14px * var(--ds-sf))}.content{flex: 1 1 auto;min-width: 0}.title, .description{white-space: normal;overflow-wrap: anywhere}.description{opacity: 0.7}.button{flex: 0 0 auto;margin: 0 0 0 calc(4px * var(--ds-sf));padding: 0;border: 0;background: none;color: inherit;font: inherit;letter-spacing: inherit;text-decoration: underline;text-underline-offset: 2px;cursor: pointer}a.button{display: inline-block}.button.cancel{opacity: 0.7}.button:focus-visible, .close:focus-visible{outline: 1px solid currentColor;outline-offset: 1px;border-radius: 1px}.close{display: inline-flex;flex: 0 0 auto;align-items: center;justify-content: center;width: var(--ds-control-height);height: var(--ds-control-height);margin: 0 calc(-4px * var(--ds-sf)) 0 0;padding: 0;border: 0;background: none;color: inherit;cursor: pointer;--ds-icon-color: currentColor}.spinner{width: calc(10px * var(--ds-sf));height: calc(10px * var(--ds-sf));box-sizing: border-box;border: 1px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color: currentColor;border-radius: 50%;animation: ds-toast-spin 720ms linear infinite}@keyframes ds-toast-spin{to{transform: rotate(360deg)}}:host([rich-colors]) .toast[data-type=\"success\"]{--ds-toast-background: var(--ds-apple-green)}:host([rich-colors]) .toast[data-type=\"info\"]{--ds-toast-background: var(--ds-zenith-blue)}:host([rich-colors]) .toast[data-type=\"warning\"]{--ds-toast-background: var(--ds-orange)}:host([rich-colors]) .toast[data-type=\"error\"]{--ds-toast-background: var(--ds-tuned-red)}:host([rich-colors]) .toast:is([data-type=\"success\"], [data-type=\"info\"], [data-type=\"warning\"], [data-type=\"error\"]){--ds-toast-color: var(--ds-black)}@media (prefers-reduced-motion: reduce){.toast, .body{transition: none}.spinner{animation: none}}";
|
|
9
|
+
|
|
10
|
+
export type ToastIconName = "check" | "close" | "notifications" | "warning";
|
|
11
|
+
|
|
12
|
+
/** The icons the page toaster draws: the toast types' own and the close button's. */
|
|
13
|
+
export const toastIcons: Readonly<Record<ToastIconName, string>> = {
|
|
14
|
+
"check": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.68649 11.884L12.443 6.13601L11.736 5.42715L6.68835 10.4827L4.26399 8.0501L3.55696 8.74525L6.68649 11.884Z\" fill=\"currentColor\"/>\n</svg>\n",
|
|
15
|
+
"close": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M12.1215 4.58087L8.70453 7.99397L12.1176 11.4169L11.4106 12.112L7.99847 8.69108L4.58636 12.112L3.87836 11.4031L7.29535 7.99005L3.88226 4.56716L4.58929 3.87201L8.0014 7.29294L11.4145 3.87201L12.1215 4.58087Z\" fill=\"currentColor\"/>\n</svg>\n",
|
|
16
|
+
"notifications": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M4.5 11.5V7.5C4.5 5.567 6.067 4 8 4C9.933 4 11.5 5.567 11.5 7.5V11.5M3 11.5H13M8 2.5V4M6.5 13.5H9.5\" stroke=\"currentColor\" stroke-width=\"0.92\"/>\n</svg>\n",
|
|
17
|
+
"warning": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 1.8L15.2 14.3H0.8L8 1.8ZM8 3.8L2.53 13.3H13.47L8 3.8ZM7.5 6.3H8.5V10.3H7.5V6.3ZM7.5 11.3H8.5V12.3H7.5V11.3Z\" fill=\"#1E1E1E\"/>\n</svg>\n",
|
|
18
|
+
};
|
package/DS1/0-face/grid-fit.ts
CHANGED
|
@@ -7,7 +7,7 @@ export function initGridFit(): void {
|
|
|
7
7
|
const measure = document.createElement('div');
|
|
8
8
|
measure.setAttribute('aria-hidden', 'true');
|
|
9
9
|
measure.style.cssText = 'position:fixed;left:0;top:0;width:0;height:var(--ds-grid-unit,20px);visibility:hidden;pointer-events:none;contain:strict';
|
|
10
|
-
document.body.
|
|
10
|
+
document.body.appendChild(measure);
|
|
11
11
|
const originalMinimums = new Map<HTMLElement, string>();
|
|
12
12
|
const observed = new Set<HTMLElement>();
|
|
13
13
|
let frame = 0;
|
package/DS1/0-face/grid.ts
CHANGED
|
@@ -41,7 +41,7 @@ export function initGridShortcut(): void {
|
|
|
41
41
|
}
|
|
42
42
|
@media print { :host { display: none !important; } }
|
|
43
43
|
</style><div class="grid"></div>`;
|
|
44
|
-
document.body.
|
|
44
|
+
document.body.appendChild(overlay);
|
|
45
45
|
const layout = createLayoutInspector();
|
|
46
46
|
|
|
47
47
|
const updatePosition = () => {
|
|
@@ -67,7 +67,8 @@ export function initGridShortcut(): void {
|
|
|
67
67
|
if (preview.get('grid') === '1') setVisible(true);
|
|
68
68
|
if (preview.get('layout') === '1') layout.toggle();
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
// A bundler's development flag (Vite's import.meta.env.DEV); absent elsewhere.
|
|
71
|
+
if ((import.meta as ImportMeta & { env?: { DEV?: boolean } }).env?.DEV) {
|
|
71
72
|
const mobile = window.matchMedia('(max-width: 768px)');
|
|
72
73
|
let taps = 0;
|
|
73
74
|
let lastTap = 0;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The site header's script for pages without Lit: plain TypeScript, no
|
|
3
|
+
* framework. Loading it starts every `.ds-header` on the page (1-root/header.css
|
|
4
|
+
* draws them); call `startHeaders()` again for one added later.
|
|
5
|
+
*
|
|
6
|
+
* Each header's menu button (`.ds-header__toggle`) opens its navigation and
|
|
7
|
+
* actions in a drawer (`0-face/drawer.ts`): a panel over the screen with focus
|
|
8
|
+
* kept inside, closed by Escape, its close button, a link or the screen
|
|
9
|
+
* widening, the page's scroll held behind it. The close button is named by the
|
|
10
|
+
* toggle's `data-close-label`, "Close" without one; the page writes both names
|
|
11
|
+
* in its own language. A navigation where no link is marked `aria-current`
|
|
12
|
+
* gets `aria-current="page"` on the link to the address being read.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* <header class="ds-header">
|
|
16
|
+
* <a class="ds-header__brand" href="/">Name</a>
|
|
17
|
+
* <nav class="ds-header__nav" id="site-nav" aria-label="Main">
|
|
18
|
+
* <a href="/">Home</a> <a href="/help">Help</a>
|
|
19
|
+
* </nav>
|
|
20
|
+
* <button class="ds-button ds-button--icon ds-header__toggle" type="button"
|
|
21
|
+
* aria-label="Menu" aria-controls="site-nav" data-close-label="Close">
|
|
22
|
+
* <span class="ds-icon" style="--ds-icon: url(/ds1/icons/menu.svg)" aria-hidden="true"></span>
|
|
23
|
+
* <span class="ds-icon" style="--ds-icon: url(/ds1/icons/close.svg)" aria-hidden="true"></span>
|
|
24
|
+
* </button>
|
|
25
|
+
* </header>
|
|
26
|
+
* <script type="module">import "/ds1/0-face/header.ts";</script>
|
|
27
|
+
*/
|
|
28
|
+
import { attachDrawer, type Drawer } from "./drawer";
|
|
29
|
+
|
|
30
|
+
const started = new WeakMap<Element, Drawer>();
|
|
31
|
+
|
|
32
|
+
/** A path without a trailing slash or an index file, for comparing addresses. */
|
|
33
|
+
function normalise(path: string): string {
|
|
34
|
+
return path.replace(/\/index\.html?$/, "/").replace(/\.html?$/, "").replace(/\/+$/, "") || "/";
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Marks the link to the address being read with `aria-current="page"`, unless
|
|
39
|
+
* one of the links is marked already. Returns the marked link, if any.
|
|
40
|
+
*/
|
|
41
|
+
export function markCurrentLink(links: Iterable<HTMLAnchorElement>, location: { href: string } = globalThis.location): HTMLAnchorElement | null {
|
|
42
|
+
const all = [...links];
|
|
43
|
+
const marked = all.find(link => link.hasAttribute("aria-current") && link.getAttribute("aria-current") !== "false");
|
|
44
|
+
if (marked || !location) return marked ?? null;
|
|
45
|
+
const here = new URL(location.href);
|
|
46
|
+
const match = all.find(link => {
|
|
47
|
+
if (!link.getAttribute("href") || link.getAttribute("href")!.startsWith("#")) return false;
|
|
48
|
+
const target = new URL(link.href, here);
|
|
49
|
+
return target.origin === here.origin && normalise(target.pathname) === normalise(here.pathname);
|
|
50
|
+
});
|
|
51
|
+
match?.setAttribute("aria-current", "page");
|
|
52
|
+
return match ?? null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Starts every `.ds-header` inside `root` that has not started yet, and returns their drawers. */
|
|
56
|
+
export function startHeaders(root: ParentNode = document): Drawer[] {
|
|
57
|
+
const drawers: Drawer[] = [];
|
|
58
|
+
for (const header of root.querySelectorAll<HTMLElement>(".ds-header")) {
|
|
59
|
+
const nav = header.querySelector<HTMLElement>(":scope > .ds-header__nav");
|
|
60
|
+
if (nav) markCurrentLink(nav.querySelectorAll<HTMLAnchorElement>("a[href]"));
|
|
61
|
+
if (started.has(header)) continue;
|
|
62
|
+
const toggle = header.querySelector<HTMLElement>(":scope > .ds-header__toggle");
|
|
63
|
+
if (!toggle) continue;
|
|
64
|
+
const drawer = attachDrawer({
|
|
65
|
+
toggle,
|
|
66
|
+
content: () => [...header.querySelectorAll(":scope > :is(.ds-header__nav, .ds-header__actions)")],
|
|
67
|
+
closeLabel: toggle.dataset.closeLabel,
|
|
68
|
+
});
|
|
69
|
+
started.set(header, drawer);
|
|
70
|
+
drawers.push(drawer);
|
|
71
|
+
}
|
|
72
|
+
return drawers;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (typeof document !== "undefined") {
|
|
76
|
+
if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", () => startHeaders(), { once: true });
|
|
77
|
+
else startHeaders();
|
|
78
|
+
}
|
package/DS1/0-face/i18n.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
normalizeLanguage,
|
|
8
8
|
} from "./languages";
|
|
9
9
|
import type { Language } from "./languages";
|
|
10
|
-
import { configureLanguageRouting } from "./language-routing";
|
|
10
|
+
import { configureLanguageRouting, parseLanguagePath } from "./language-routing";
|
|
11
11
|
import type { LanguageRoutingOptions } from "./language-routing";
|
|
12
12
|
import { readLanguageFile, resolveText } from "./translations-format";
|
|
13
13
|
import type {
|
|
@@ -38,6 +38,8 @@ export type TranslationMap = Record<string, TranslationData>;
|
|
|
38
38
|
export type I18nOptions = {
|
|
39
39
|
/** Fetch external words at startup. Disable when the product supplies them in code. */
|
|
40
40
|
autoLoad?: boolean;
|
|
41
|
+
/** Ignore saved choices and avoid writes on browser-managed surfaces. */
|
|
42
|
+
persist?: boolean;
|
|
41
43
|
/**
|
|
42
44
|
* Every language the product speaks. When set, the picker offers these
|
|
43
45
|
* whether or not their words have arrived yet, which matters when a page
|
|
@@ -81,6 +83,31 @@ export type I18nOptions = {
|
|
|
81
83
|
* here, the product's `languages` get a prefix.
|
|
82
84
|
*/
|
|
83
85
|
routing?: LanguageRoutingOptions;
|
|
86
|
+
/**
|
|
87
|
+
* Take the language from the address: on a page whose path starts with a
|
|
88
|
+
* language prefix (`/ja/…`, by `routing`), that language is the current one
|
|
89
|
+
* from the start, and it is not stored, so following a link to `/ja/…`
|
|
90
|
+
* never overwrites the choice a person made. `setLanguage` still stores
|
|
91
|
+
* what a person chooses. The theme bootstrap reads it too, so `lang` is
|
|
92
|
+
* right before the first paint. Off by default.
|
|
93
|
+
*/
|
|
94
|
+
languageFromAddress?: boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Where the language is written as `lang`: the document's root element by
|
|
97
|
+
* default; an element (an embedded surface, such as a prototype in another
|
|
98
|
+
* language than the page around it) to keep it there; `false` to write it
|
|
99
|
+
* nowhere. The theme bootstrap writes the root's `lang` only by default.
|
|
100
|
+
*/
|
|
101
|
+
langTarget?: HTMLElement | false;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/** What `setLanguage` does besides changing the language. */
|
|
105
|
+
export type SetLanguageOptions = {
|
|
106
|
+
/**
|
|
107
|
+
* Store the choice, so the next visit opens in it. On by default; `false`
|
|
108
|
+
* keeps it to this page (a language an address names, a preview).
|
|
109
|
+
*/
|
|
110
|
+
remember?: boolean;
|
|
84
111
|
};
|
|
85
112
|
|
|
86
113
|
// Bundled translations (keys.json may not exist - will use external translations if not available)
|
|
@@ -142,6 +169,7 @@ function storageKey(): string {
|
|
|
142
169
|
}
|
|
143
170
|
|
|
144
171
|
function readStoredLanguage(): LanguageCode | null {
|
|
172
|
+
if (i18nOptions.persist === false) return null;
|
|
145
173
|
try {
|
|
146
174
|
return (storage()?.getItem(storageKey()) as LanguageCode | null) || null;
|
|
147
175
|
} catch {
|
|
@@ -150,6 +178,7 @@ function readStoredLanguage(): LanguageCode | null {
|
|
|
150
178
|
}
|
|
151
179
|
|
|
152
180
|
function storeLanguage(language: LanguageCode): void {
|
|
181
|
+
if (i18nOptions.persist === false) return;
|
|
153
182
|
try {
|
|
154
183
|
storage()?.setItem(storageKey(), language);
|
|
155
184
|
} catch {
|
|
@@ -684,7 +713,7 @@ export function getBrowserLanguage(): LanguageCode {
|
|
|
684
713
|
// ============================================================================
|
|
685
714
|
|
|
686
715
|
function dispatchLanguageChanged(language: LanguageCode): void {
|
|
687
|
-
if (typeof window === "undefined") {
|
|
716
|
+
if (typeof window === "undefined" || typeof window.dispatchEvent !== "function") {
|
|
688
717
|
return;
|
|
689
718
|
}
|
|
690
719
|
window.dispatchEvent(
|
|
@@ -696,17 +725,42 @@ function dispatchLanguageChanged(language: LanguageCode): void {
|
|
|
696
725
|
);
|
|
697
726
|
}
|
|
698
727
|
|
|
728
|
+
/** The language the address names (`/ja/…`), when the product takes it from there. */
|
|
729
|
+
function addressLanguage(): LanguageCode | null {
|
|
730
|
+
if (!i18nOptions.languageFromAddress || typeof window === "undefined") {
|
|
731
|
+
return null;
|
|
732
|
+
}
|
|
733
|
+
const path = window.location?.pathname;
|
|
734
|
+
// The product's routing, also before configureI18n has passed it on.
|
|
735
|
+
return path ? parseLanguagePath(path, routingOptions()).language : null;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/** The element whose `lang` follows the language, or null when none does. */
|
|
739
|
+
function langElement(): HTMLElement | null {
|
|
740
|
+
const target = i18nOptions.langTarget;
|
|
741
|
+
if (target === false) {
|
|
742
|
+
return null;
|
|
743
|
+
}
|
|
744
|
+
if (target) {
|
|
745
|
+
return target;
|
|
746
|
+
}
|
|
747
|
+
return typeof document !== "undefined" ? (document.documentElement ?? null) : null;
|
|
748
|
+
}
|
|
749
|
+
|
|
699
750
|
// Create a reactive signal for the current language (Portfolio pattern)
|
|
700
751
|
export const currentLanguage = {
|
|
701
|
-
value: readStoredLanguage() || getBrowserLanguage(),
|
|
702
|
-
set: function (lang: LanguageCode) {
|
|
752
|
+
value: addressLanguage() || readStoredLanguage() || getBrowserLanguage(),
|
|
753
|
+
set: function (lang: LanguageCode, options: SetLanguageOptions = {}) {
|
|
703
754
|
this.value = lang;
|
|
704
|
-
|
|
755
|
+
if (options.remember !== false) {
|
|
756
|
+
storeLanguage(lang);
|
|
757
|
+
}
|
|
705
758
|
void loadLanguage(lang);
|
|
706
759
|
// What reads the document's language (dates, screen readers, hyphenation)
|
|
707
760
|
// follows too, rather than keeping the language the page was opened in.
|
|
708
|
-
|
|
709
|
-
|
|
761
|
+
const element = langElement();
|
|
762
|
+
if (element) {
|
|
763
|
+
element.lang = lang;
|
|
710
764
|
}
|
|
711
765
|
dispatchLanguageChanged(lang);
|
|
712
766
|
},
|
|
@@ -719,23 +773,30 @@ export const currentLanguage = {
|
|
|
719
773
|
* language's file if one is now configured.
|
|
720
774
|
*/
|
|
721
775
|
export function configureI18n(next: I18nOptions): void {
|
|
776
|
+
const previousPersist = i18nOptions.persist;
|
|
722
777
|
const previousKey = storageKey();
|
|
723
778
|
const previousLanguages = i18nOptions.languages;
|
|
779
|
+
const previousAddress = i18nOptions.languageFromAddress;
|
|
780
|
+
const previousRouting = i18nOptions.routing;
|
|
724
781
|
i18nOptions = { ...i18nOptions, ...next };
|
|
725
782
|
|
|
726
783
|
applyRouting();
|
|
727
784
|
|
|
728
785
|
if (
|
|
786
|
+
i18nOptions.persist !== previousPersist ||
|
|
729
787
|
storageKey() !== previousKey ||
|
|
730
|
-
i18nOptions.languages !== previousLanguages
|
|
788
|
+
i18nOptions.languages !== previousLanguages ||
|
|
789
|
+
i18nOptions.languageFromAddress !== previousAddress ||
|
|
790
|
+
(i18nOptions.languageFromAddress && i18nOptions.routing !== previousRouting)
|
|
731
791
|
) {
|
|
732
|
-
// The
|
|
733
|
-
// the product speaks
|
|
792
|
+
// The language the address names, else the stored choice under the new
|
|
793
|
+
// key, or the browser's language, as one the product speaks
|
|
734
794
|
const stored = readStoredLanguage();
|
|
735
795
|
let language: LanguageCode = stored || getBrowserLanguage();
|
|
736
796
|
if (stored && configuredLanguages()) {
|
|
737
797
|
language = resolvePreferredLanguage(stored) ?? defaultLanguage;
|
|
738
798
|
}
|
|
799
|
+
language = addressLanguage() ?? language;
|
|
739
800
|
if (language !== currentLanguage.value) {
|
|
740
801
|
currentLanguage.value = language;
|
|
741
802
|
dispatchLanguageChanged(language);
|
|
@@ -756,10 +817,14 @@ function applyRouting(): void {
|
|
|
756
817
|
if (!i18nOptions.routing && !i18nOptions.languages) {
|
|
757
818
|
return;
|
|
758
819
|
}
|
|
759
|
-
configureLanguageRouting(
|
|
820
|
+
configureLanguageRouting(routingOptions());
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
function routingOptions(): LanguageRoutingOptions {
|
|
824
|
+
return {
|
|
760
825
|
...(i18nOptions.languages ? { languages: i18nOptions.languages } : {}),
|
|
761
826
|
...i18nOptions.routing,
|
|
762
|
-
}
|
|
827
|
+
};
|
|
763
828
|
}
|
|
764
829
|
|
|
765
830
|
let sharedWordsLoad: Promise<void> | null = null;
|
|
@@ -801,8 +866,11 @@ if (typeof window !== "undefined" && typeof document !== "undefined") {
|
|
|
801
866
|
}
|
|
802
867
|
}
|
|
803
868
|
|
|
804
|
-
// Listen for external translations being loaded
|
|
805
|
-
|
|
869
|
+
// Listen for external translations being loaded. Only where window takes events:
|
|
870
|
+
// a server or worker runtime may define a window without them, and the timer
|
|
871
|
+
// below would otherwise throw after the code that imported this has finished.
|
|
872
|
+
const eventful = () => typeof window !== "undefined" && typeof window.addEventListener === "function" && typeof window.dispatchEvent === "function";
|
|
873
|
+
if (eventful()) {
|
|
806
874
|
window.addEventListener("translations-ready", () => {
|
|
807
875
|
// Dispatch that translations are loaded
|
|
808
876
|
window.dispatchEvent(new CustomEvent("translations-loaded"));
|
|
@@ -814,7 +882,7 @@ if (typeof window !== "undefined") {
|
|
|
814
882
|
// Initialize translations on module load
|
|
815
883
|
// Use setTimeout to give other parts of the app time to set up event listeners first
|
|
816
884
|
setTimeout(() => {
|
|
817
|
-
if (
|
|
885
|
+
if (!eventful()) {
|
|
818
886
|
return;
|
|
819
887
|
}
|
|
820
888
|
window.dispatchEvent(new CustomEvent("translations-loaded"));
|
|
@@ -892,6 +960,10 @@ export function translate(key: string, params?: TranslationParams): string {
|
|
|
892
960
|
return textInLanguage(key, currentLanguage.value, params);
|
|
893
961
|
}
|
|
894
962
|
|
|
963
|
+
// The feedback module (`./feedback-words.ts`) reads its default words through
|
|
964
|
+
// this when the page loads the language module, and English without it.
|
|
965
|
+
(globalThis as unknown as Record<symbol, unknown>)[Symbol.for("design-system-1.translate")] = translate;
|
|
966
|
+
|
|
895
967
|
/**
|
|
896
968
|
* A key's text in a given language, whatever the page's own language is (a
|
|
897
969
|
* drawing made for one language, say). The fallback order: the language, its
|
|
@@ -1016,8 +1088,11 @@ export function loadTranslations(
|
|
|
1016
1088
|
}
|
|
1017
1089
|
}
|
|
1018
1090
|
|
|
1019
|
-
|
|
1020
|
-
|
|
1091
|
+
/**
|
|
1092
|
+
* Change the language: store it (unless `remember: false`), fetch its words,
|
|
1093
|
+
* write it as `lang` (see `langTarget`) and announce `language-changed`.
|
|
1094
|
+
*/
|
|
1095
|
+
export function setLanguage(language: LanguageCode, options?: SetLanguageOptions): void {
|
|
1021
1096
|
// The signal owns persistence, loading, document language and notification.
|
|
1022
|
-
currentLanguage.set(language);
|
|
1097
|
+
currentLanguage.set(language, options);
|
|
1023
1098
|
}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyboard shortcuts on every platform: the platform's command key, a guard
|
|
3
|
+
* that leaves typing alone, the label a shortcut is written with, and one call
|
|
4
|
+
* that binds a shortcut. Plain TypeScript with no framework and no language
|
|
5
|
+
* runtime, for any page.
|
|
6
|
+
*
|
|
7
|
+
* A shortcut is written once, in lower case, its parts joined with `+`:
|
|
8
|
+
* `"mod+shift+d"`, `"mod+enter"`, `"alt+arrowup"`, `"escape"`, `"?"`. `mod`
|
|
9
|
+
* is ⌘ on a Mac, iPhone or iPad and Ctrl everywhere else; `ctrl`, `meta`,
|
|
10
|
+
* `alt` and `shift` name a key as it is. The key is a letter, a digit, a
|
|
11
|
+
* symbol or one of the named keys (`enter`, `escape`, `tab`, `space`,
|
|
12
|
+
* `backspace`, `delete`, `home`, `end`, `pageup`, `pagedown`, the arrows
|
|
13
|
+
* `arrowup` … `arrowright`, `f1` … `f12`; `plus` for `+`).
|
|
14
|
+
*
|
|
15
|
+
* - `modKey()` is the command key's label: ⌘, or Ctrl.
|
|
16
|
+
* - `isTyping(event)` is true while focus is in a text field, a select, a
|
|
17
|
+
* contenteditable or a textbox, or a composition (an input method) is open.
|
|
18
|
+
* - `shortcutLabel("mod+shift+d")` writes it as the platform does: ⇧⌘D on
|
|
19
|
+
* Apple platforms, in Apple's order (⌃ ⌥ ⇧ ⌘), and Ctrl+Shift+D elsewhere.
|
|
20
|
+
* Arrows are drawn as arrows (↑), which every DS1 typeface sets in Inter.
|
|
21
|
+
* - `ariaKeyShortcuts("mod+shift+d")` is the value for `aria-keyshortcuts`
|
|
22
|
+
* on the control the shortcut presses: Meta+Shift+D or Control+Shift+D.
|
|
23
|
+
* - `matchesShortcut(event, "mod+d")` reads a keydown; a letter matches by
|
|
24
|
+
* its physical key too, so it works on other layouts and with ⌥ held.
|
|
25
|
+
* - `onShortcut("mod+k", handler)` listens for it on the document (or a
|
|
26
|
+
* `target`), leaves it alone while typing unless `typing: true`, prevents
|
|
27
|
+
* the browser's own action, and returns the function that unbinds it.
|
|
28
|
+
*
|
|
29
|
+
* The key names written as words (Ctrl, Shift, Alt, Enter, Esc, Tab, Space,
|
|
30
|
+
* Backspace, Del, Home, End, PgUp, PgDn) are the shared words (`key.ctrl` …)
|
|
31
|
+
* in the page's language where the page loads the language module with
|
|
32
|
+
* `configureI18n({ sharedWords: true })`, and English otherwise;
|
|
33
|
+
* `setKeyWords()` gives a product's own.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
export type KeyPlatform = "apple" | "other";
|
|
37
|
+
|
|
38
|
+
export interface ShortcutOptions {
|
|
39
|
+
/** The platform to write or read the shortcut for; the device's own by default. */
|
|
40
|
+
platform?: KeyPlatform;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** A shortcut taken apart: its modifiers as keys on this platform, and its key. */
|
|
44
|
+
export interface Shortcut {
|
|
45
|
+
ctrl: boolean;
|
|
46
|
+
meta: boolean;
|
|
47
|
+
alt: boolean;
|
|
48
|
+
shift: boolean;
|
|
49
|
+
/** The key, in lower case as written (`d`, `enter`, `arrowup`, `?`). */
|
|
50
|
+
key: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The ids of the key names written as words, each a shared word. */
|
|
54
|
+
export type KeyWord =
|
|
55
|
+
| "key.ctrl" | "key.shift" | "key.alt" | "key.enter" | "key.escape" | "key.tab" | "key.space"
|
|
56
|
+
| "key.backspace" | "key.delete" | "key.home" | "key.end" | "key.pageup" | "key.pagedown";
|
|
57
|
+
/** A table of the words to change, or a function that gives each word. */
|
|
58
|
+
export type KeyWords = Partial<Record<KeyWord, string>> | ((word: KeyWord) => string);
|
|
59
|
+
|
|
60
|
+
const ENGLISH: Record<KeyWord, string> = {
|
|
61
|
+
"key.ctrl": "Ctrl", "key.shift": "Shift", "key.alt": "Alt", "key.enter": "Enter", "key.escape": "Esc",
|
|
62
|
+
"key.tab": "Tab", "key.space": "Space", "key.backspace": "Backspace", "key.delete": "Del",
|
|
63
|
+
"key.home": "Home", "key.end": "End", "key.pageup": "PgUp", "key.pagedown": "PgDn",
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/** Where the language module leaves its `translate()`; on `globalThis`, so every copy of either module finds it. */
|
|
67
|
+
const TRANSLATOR = Symbol.for("design-system-1.translate");
|
|
68
|
+
let words: KeyWords | null = null;
|
|
69
|
+
|
|
70
|
+
/** Give the key names of a product's own, or `null` to go back to the shared words (or English). */
|
|
71
|
+
export function setKeyWords(next: KeyWords | null): void {
|
|
72
|
+
words = next;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** A key's name as a word, in the page's language. */
|
|
76
|
+
export function keyWord(word: KeyWord): string {
|
|
77
|
+
if (typeof words === "function") return words(word);
|
|
78
|
+
const own = words?.[word];
|
|
79
|
+
if (own !== undefined) return own;
|
|
80
|
+
const translate = (globalThis as unknown as Record<symbol, unknown>)[TRANSLATOR];
|
|
81
|
+
if (typeof translate === "function") {
|
|
82
|
+
const text = String(translate(word));
|
|
83
|
+
// Without the shared words the language module answers with the id itself.
|
|
84
|
+
if (text && text !== word) return text;
|
|
85
|
+
}
|
|
86
|
+
return ENGLISH[word];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** True on a Mac, iPhone or iPad, where ⌘ is the command key and Ctrl-click is the right click. */
|
|
90
|
+
export function isApplePlatform(): boolean {
|
|
91
|
+
if (typeof navigator === "undefined") return false;
|
|
92
|
+
const data = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData;
|
|
93
|
+
const platform = data?.platform || navigator.platform || "";
|
|
94
|
+
return /mac|iphone|ipad|ipod|ios/i.test(platform);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const platformOf = (options?: ShortcutOptions): KeyPlatform => options?.platform ?? (isApplePlatform() ? "apple" : "other");
|
|
98
|
+
|
|
99
|
+
/** The command key's label: ⌘ on Apple platforms, Ctrl (in the page's language) elsewhere. */
|
|
100
|
+
export function modKey(options?: ShortcutOptions): string {
|
|
101
|
+
return platformOf(options) === "apple" ? "⌘" : keyWord("key.ctrl");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** True when the command key is held: ⌘ on Apple platforms, Ctrl elsewhere. */
|
|
105
|
+
export function isModKey(event: { metaKey: boolean; ctrlKey: boolean }, options?: ShortcutOptions): boolean {
|
|
106
|
+
return platformOf(options) === "apple" ? event.metaKey : event.ctrlKey;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Input types a person types into; a checkbox or a button leaves shortcuts alone. */
|
|
110
|
+
const TEXT_INPUTS = new Set(["", "text", "search", "email", "url", "tel", "password", "number", "date", "datetime-local", "month", "time", "week"]);
|
|
111
|
+
|
|
112
|
+
/** The element an event started on, inside open shadow roots too. */
|
|
113
|
+
function origin(event: Event): Element | null {
|
|
114
|
+
const path = typeof event.composedPath === "function" ? event.composedPath() : [];
|
|
115
|
+
const first = path.find(node => node instanceof Element) ?? event.target;
|
|
116
|
+
return first instanceof Element ? first : null;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* True while a person is typing: focus is in a text field, a textarea, a
|
|
121
|
+
* select, a contenteditable or an element with a textbox, searchbox or
|
|
122
|
+
* combobox role, or an input method is composing. A shortcut ignores it.
|
|
123
|
+
*/
|
|
124
|
+
export function isTyping(event: Event): boolean {
|
|
125
|
+
const keyboard = event as KeyboardEvent;
|
|
126
|
+
if (keyboard.isComposing || keyboard.keyCode === 229) return true;
|
|
127
|
+
let element = origin(event);
|
|
128
|
+
// The event's origin is the field; a host that forwards focus has it in its shadow root.
|
|
129
|
+
while (element?.shadowRoot?.activeElement) element = element.shadowRoot.activeElement;
|
|
130
|
+
if (!element) return false;
|
|
131
|
+
if (element instanceof HTMLInputElement) return TEXT_INPUTS.has(element.type.toLowerCase()) && !element.readOnly;
|
|
132
|
+
if (element instanceof HTMLTextAreaElement) return !element.readOnly;
|
|
133
|
+
if (element instanceof HTMLSelectElement) return true;
|
|
134
|
+
if (element instanceof HTMLElement && element.isContentEditable) return true;
|
|
135
|
+
// Some DOMs (and tests) leave isContentEditable unset; read the attribute along the way up.
|
|
136
|
+
if (element.closest('[contenteditable]:not([contenteditable="false"])')) return true;
|
|
137
|
+
return Boolean(element.closest('[role="textbox"], [role="searchbox"], [role="combobox"]'));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const ALIASES: Record<string, string> = {
|
|
141
|
+
esc: "escape", return: "enter", del: "delete", up: "arrowup", down: "arrowdown", left: "arrowleft", right: "arrowright",
|
|
142
|
+
spacebar: "space", " ": "space", pgup: "pageup", pgdn: "pagedown", cmd: "meta", command: "meta", control: "ctrl", option: "alt", opt: "alt",
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
/** Take a shortcut apart; `mod` becomes ⌘ (meta) on Apple platforms and Ctrl elsewhere. */
|
|
146
|
+
export function parseShortcut(shortcut: string, options?: ShortcutOptions): Shortcut {
|
|
147
|
+
const apple = platformOf(options) === "apple";
|
|
148
|
+
const parts = shortcut.trim().toLowerCase().split("+").map(part => part.trim());
|
|
149
|
+
// "mod++" and a trailing "+" name the plus key.
|
|
150
|
+
const raw = parts[parts.length - 1] === "" ? "plus" : parts.pop()!;
|
|
151
|
+
const result: Shortcut = { ctrl: false, meta: false, alt: false, shift: false, key: ALIASES[raw] ?? raw };
|
|
152
|
+
for (const part of parts) {
|
|
153
|
+
const name = ALIASES[part] ?? part;
|
|
154
|
+
if (name === "mod") result[apple ? "meta" : "ctrl"] = true;
|
|
155
|
+
else if (name === "ctrl" || name === "meta" || name === "alt" || name === "shift") result[name] = true;
|
|
156
|
+
else if (name !== "") throw new Error(`Unknown modifier in shortcut "${shortcut}": ${part}`);
|
|
157
|
+
}
|
|
158
|
+
if (!result.key) throw new Error(`A shortcut names a key: "${shortcut}"`);
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Named keys as KeyboardEvent.key gives them. */
|
|
163
|
+
const EVENT_KEYS: Record<string, string> = {
|
|
164
|
+
enter: "Enter", escape: "Escape", tab: "Tab", space: " ", backspace: "Backspace", delete: "Delete",
|
|
165
|
+
home: "Home", end: "End", pageup: "PageUp", pagedown: "PageDown", insert: "Insert",
|
|
166
|
+
arrowup: "ArrowUp", arrowdown: "ArrowDown", arrowleft: "ArrowLeft", arrowright: "ArrowRight", plus: "+",
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
/** Keys whose character already needs Shift on most layouts, so Shift is not asked of them. */
|
|
170
|
+
const shifted = (key: string) => key.length === 1 && !/[a-z0-9]/.test(key);
|
|
171
|
+
|
|
172
|
+
/** True when a keydown is the shortcut. */
|
|
173
|
+
export function matchesShortcut(event: KeyboardEvent, shortcut: string | Shortcut, options?: ShortcutOptions): boolean {
|
|
174
|
+
const wanted = typeof shortcut === "string" ? parseShortcut(shortcut, options) : shortcut;
|
|
175
|
+
if (event.ctrlKey !== wanted.ctrl || event.metaKey !== wanted.meta || event.altKey !== wanted.alt) return false;
|
|
176
|
+
if (!shifted(wanted.key) && event.shiftKey !== wanted.shift) return false;
|
|
177
|
+
if (shifted(wanted.key) && wanted.shift && !event.shiftKey) return false;
|
|
178
|
+
const key = wanted.key;
|
|
179
|
+
if (/^[a-z]$/.test(key)) return event.key.toLowerCase() === key || event.code === `Key${key.toUpperCase()}`;
|
|
180
|
+
if (/^[0-9]$/.test(key)) return event.key === key || event.code === `Digit${key}`;
|
|
181
|
+
if (/^f([1-9]|1[0-9]|2[0-4])$/.test(key)) return event.key.toLowerCase() === key;
|
|
182
|
+
const named = EVENT_KEYS[key];
|
|
183
|
+
if (named) return event.key === named || (key === "space" && event.code === "Space");
|
|
184
|
+
return event.key.toLowerCase() === key;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Apple's symbols for its modifiers and keys, as its menus write them. */
|
|
188
|
+
const APPLE_KEYS: Record<string, string> = {
|
|
189
|
+
enter: "↩", escape: "⎋", tab: "⇥", backspace: "⌫", delete: "⌦", home: "↖", end: "↘", pageup: "⇞", pagedown: "⇟",
|
|
190
|
+
};
|
|
191
|
+
const ARROWS: Record<string, string> = { arrowup: "↑", arrowdown: "↓", arrowleft: "←", arrowright: "→" };
|
|
192
|
+
const WORDS: Record<string, KeyWord> = {
|
|
193
|
+
enter: "key.enter", escape: "key.escape", tab: "key.tab", space: "key.space", backspace: "key.backspace",
|
|
194
|
+
delete: "key.delete", home: "key.home", end: "key.end", pageup: "key.pageup", pagedown: "key.pagedown",
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
function keyLabel(key: string, apple: boolean): string {
|
|
198
|
+
if (ARROWS[key]) return ARROWS[key]!;
|
|
199
|
+
if (key === "plus") return "+";
|
|
200
|
+
if (apple && APPLE_KEYS[key]) return APPLE_KEYS[key]!;
|
|
201
|
+
if (WORDS[key]) return keyWord(WORDS[key]!);
|
|
202
|
+
if (/^f\d{1,2}$/.test(key)) return key.toUpperCase();
|
|
203
|
+
if (key === "insert") return "Ins";
|
|
204
|
+
return key.length === 1 ? key.toUpperCase() : key[0]!.toUpperCase() + key.slice(1);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* A shortcut as the platform writes it: ⇧⌘D on Apple platforms (⌃ ⌥ ⇧ ⌘,
|
|
209
|
+
* then the key, with no space between), Ctrl+Shift+D elsewhere (Ctrl, Alt,
|
|
210
|
+
* Shift, then the key, joined with +).
|
|
211
|
+
*/
|
|
212
|
+
export function shortcutLabel(shortcut: string, options?: ShortcutOptions): string {
|
|
213
|
+
const apple = platformOf(options) === "apple";
|
|
214
|
+
const parts = parseShortcut(shortcut, options);
|
|
215
|
+
const key = keyLabel(parts.key, apple);
|
|
216
|
+
if (apple) return `${parts.ctrl ? "⌃" : ""}${parts.alt ? "⌥" : ""}${parts.shift ? "⇧" : ""}${parts.meta ? "⌘" : ""}${key}`;
|
|
217
|
+
return [
|
|
218
|
+
parts.meta ? "Meta" : "",
|
|
219
|
+
parts.ctrl ? keyWord("key.ctrl") : "",
|
|
220
|
+
parts.alt ? keyWord("key.alt") : "",
|
|
221
|
+
parts.shift ? keyWord("key.shift") : "",
|
|
222
|
+
key,
|
|
223
|
+
].filter(Boolean).join("+");
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** The value for `aria-keyshortcuts`: the modifiers and key by their KeyboardEvent names, `Meta+Shift+D`. */
|
|
227
|
+
export function ariaKeyShortcuts(shortcut: string, options?: ShortcutOptions): string {
|
|
228
|
+
const parts = parseShortcut(shortcut, options);
|
|
229
|
+
const key = parts.key === "space" ? "Space" : EVENT_KEYS[parts.key] ?? parts.key.toUpperCase();
|
|
230
|
+
return [parts.ctrl && "Control", parts.alt && "Alt", parts.shift && "Shift", parts.meta && "Meta", key].filter(Boolean).join("+");
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export interface OnShortcutOptions extends ShortcutOptions {
|
|
234
|
+
/** Where to listen: the document by default; a panel or a field listens to its own keys. */
|
|
235
|
+
target?: EventTarget;
|
|
236
|
+
/** Also while typing in a field (a save shortcut, say); left alone by default. */
|
|
237
|
+
typing?: boolean;
|
|
238
|
+
/** Prevent the browser's own action for the shortcut; on by default. */
|
|
239
|
+
preventDefault?: boolean;
|
|
240
|
+
/** Also on a held key's repeats; on by default. */
|
|
241
|
+
repeat?: boolean;
|
|
242
|
+
/** Listen in the capture phase, before the page's own handlers. */
|
|
243
|
+
capture?: boolean;
|
|
244
|
+
/** Unbind when this signal aborts. */
|
|
245
|
+
signal?: AbortSignal;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Run `handler` when a shortcut, or one of several, is pressed. A keydown
|
|
250
|
+
* already handled (`defaultPrevented`) is left alone. Returns the function
|
|
251
|
+
* that unbinds it.
|
|
252
|
+
*/
|
|
253
|
+
export function onShortcut(shortcut: string | string[], handler: (event: KeyboardEvent) => void, options: OnShortcutOptions = {}): () => void {
|
|
254
|
+
const target = options.target ?? (typeof document === "undefined" ? undefined : document);
|
|
255
|
+
if (!target) return () => {};
|
|
256
|
+
const shortcuts = (Array.isArray(shortcut) ? shortcut : [shortcut]).map(text => text.trim());
|
|
257
|
+
const listener = (event: Event) => {
|
|
258
|
+
const keyboard = event as KeyboardEvent;
|
|
259
|
+
if (keyboard.defaultPrevented) return;
|
|
260
|
+
if (keyboard.repeat && options.repeat === false) return;
|
|
261
|
+
if (!options.typing && isTyping(keyboard)) return;
|
|
262
|
+
// Read the platform per press, so a test or a product that sets it later is followed.
|
|
263
|
+
if (!shortcuts.some(text => matchesShortcut(keyboard, text, options))) return;
|
|
264
|
+
if (options.preventDefault !== false) keyboard.preventDefault();
|
|
265
|
+
handler(keyboard);
|
|
266
|
+
};
|
|
267
|
+
const capture = Boolean(options.capture);
|
|
268
|
+
target.addEventListener("keydown", listener, { capture });
|
|
269
|
+
const off = () => {
|
|
270
|
+
target.removeEventListener("keydown", listener, { capture });
|
|
271
|
+
options.signal?.removeEventListener("abort", off);
|
|
272
|
+
};
|
|
273
|
+
options.signal?.addEventListener("abort", off, { once: true });
|
|
274
|
+
if (options.signal?.aborted) off();
|
|
275
|
+
return off;
|
|
276
|
+
}
|