@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,180 @@
|
|
|
1
|
+
// ds-notice.ts
|
|
2
|
+
// An inline notice in the flow of the page: a tone, a title and/or text,
|
|
3
|
+
// actions and an optional dismiss; with `banner`, a strip across the top of
|
|
4
|
+
// its positioning context instead. Drawn by 1-root/notice.css, the same
|
|
5
|
+
// classes a page without scripts writes.
|
|
6
|
+
|
|
7
|
+
import { LitElement, html, nothing, unsafeCSS, type PropertyValues } from "lit";
|
|
8
|
+
import { getText } from "../0-face/i18n";
|
|
9
|
+
import { define } from "../0-face/define";
|
|
10
|
+
import "./ds-icon";
|
|
11
|
+
import metrics from "../1-root/component-metrics.css?inline";
|
|
12
|
+
import controls from "../1-root/controls.css?inline";
|
|
13
|
+
import styles from "./styles/ds-notice.css?inline";
|
|
14
|
+
|
|
15
|
+
export type NoticeTone = "neutral" | "success" | "warning" | "danger";
|
|
16
|
+
const TONES: readonly NoticeTone[] = ["neutral", "success", "warning", "danger"];
|
|
17
|
+
/** The icon each tone's mark carries unless `icon` names another. */
|
|
18
|
+
export const NOTICE_ICONS: Readonly<Record<NoticeTone, string>> = {
|
|
19
|
+
neutral: "info",
|
|
20
|
+
success: "check",
|
|
21
|
+
warning: "warning",
|
|
22
|
+
danger: "warning",
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Detail of `ds-notice-dismiss`. Cancel the event to keep the notice and remove it yourself. */
|
|
26
|
+
export interface NoticeDismissDetail { tone: NoticeTone }
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @element ds-notice
|
|
30
|
+
* @prop {"neutral" | "success" | "warning" | "danger"} tone - The mark's colour
|
|
31
|
+
* and icon; danger also turns the words into the danger colour. Neutral by default.
|
|
32
|
+
* @prop {string} heading - A title: a translation key, or literal words.
|
|
33
|
+
* @prop {string} text - The text: a translation key, or literal words.
|
|
34
|
+
* @prop {boolean} literal - Show `heading` and `text` as written, never looked up.
|
|
35
|
+
* @prop {string} icon - An icon from the library in place of the tone's own.
|
|
36
|
+
* @prop {boolean} dismissible - Show a close button at the end of the first line.
|
|
37
|
+
* @prop {boolean} banner - A strip one square high across the top of its
|
|
38
|
+
* positioning context, filled in the tone's colour, its words, actions and
|
|
39
|
+
* close button on one line; it reserves no room in the flow.
|
|
40
|
+
*
|
|
41
|
+
* @slot - The text, when it needs more than words: a link, a strong word.
|
|
42
|
+
* @slot heading - The title, as inline content.
|
|
43
|
+
* @slot icon - An icon of the page's own inside the mark.
|
|
44
|
+
* @slot actions - Buttons or links on the row under the words.
|
|
45
|
+
*
|
|
46
|
+
* @fires ds-notice-dismiss - The close button was pressed. Cancelable: unless
|
|
47
|
+
* it is cancelled, the notice hides itself.
|
|
48
|
+
*
|
|
49
|
+
* The element is a live region: `role="status"`, or `role="alert"` for danger,
|
|
50
|
+
* unless the page gives it a role of its own.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* <ds-notice tone="danger" heading="Couldn't save" dismissible>
|
|
54
|
+
* Your changes are kept on this device.
|
|
55
|
+
* <ds-button slot="actions" secondary>Try again</ds-button>
|
|
56
|
+
* </ds-notice>
|
|
57
|
+
*/
|
|
58
|
+
export class Notice extends LitElement {
|
|
59
|
+
static properties = {
|
|
60
|
+
tone: { type: String, reflect: true },
|
|
61
|
+
heading: { type: String },
|
|
62
|
+
text: { type: String },
|
|
63
|
+
literal: { type: Boolean, reflect: true },
|
|
64
|
+
icon: { type: String },
|
|
65
|
+
dismissible: { type: Boolean, reflect: true },
|
|
66
|
+
banner: { type: Boolean, reflect: true },
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
static styles = [unsafeCSS(metrics), unsafeCSS(controls), unsafeCSS(styles)];
|
|
70
|
+
|
|
71
|
+
declare tone: NoticeTone;
|
|
72
|
+
declare heading: string | undefined;
|
|
73
|
+
declare text: string | undefined;
|
|
74
|
+
declare literal: boolean;
|
|
75
|
+
declare icon: string | undefined;
|
|
76
|
+
declare dismissible: boolean;
|
|
77
|
+
declare banner: boolean;
|
|
78
|
+
|
|
79
|
+
/** The role this element last set, so a role the page wrote is left alone. */
|
|
80
|
+
private ownRole: string | null = null;
|
|
81
|
+
private readonly relabel = () => this.requestUpdate();
|
|
82
|
+
|
|
83
|
+
constructor() {
|
|
84
|
+
super();
|
|
85
|
+
this.tone = "neutral";
|
|
86
|
+
this.literal = false;
|
|
87
|
+
this.dismissible = false;
|
|
88
|
+
this.banner = false;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** The tone in effect: an unknown value reads as neutral. */
|
|
92
|
+
get resolvedTone(): NoticeTone {
|
|
93
|
+
return TONES.includes(this.tone) ? this.tone : "neutral";
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
connectedCallback() {
|
|
97
|
+
super.connectedCallback();
|
|
98
|
+
window.addEventListener("language-changed", this.relabel);
|
|
99
|
+
window.addEventListener("translations-loaded", this.relabel);
|
|
100
|
+
this.syncRole();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
disconnectedCallback() {
|
|
104
|
+
window.removeEventListener("language-changed", this.relabel);
|
|
105
|
+
window.removeEventListener("translations-loaded", this.relabel);
|
|
106
|
+
super.disconnectedCallback();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
protected willUpdate(changed: PropertyValues<this>) {
|
|
110
|
+
super.willUpdate(changed);
|
|
111
|
+
if (changed.has("tone")) this.syncRole();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private syncRole() {
|
|
115
|
+
if (!this.isConnected) return;
|
|
116
|
+
const current = this.getAttribute("role");
|
|
117
|
+
if (current !== null && current !== this.ownRole) return;
|
|
118
|
+
this.ownRole = this.resolvedTone === "danger" ? "alert" : "status";
|
|
119
|
+
if (current !== this.ownRole) this.setAttribute("role", this.ownRole);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private words(value: string | undefined): string {
|
|
123
|
+
if (!value) return "";
|
|
124
|
+
return this.literal ? value : getText(value) || value;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Whether light-DOM content fills a slot: elements, or text that is not
|
|
129
|
+
* blank. The blank text between slotted children still counts as assigned
|
|
130
|
+
* to the default slot and hides its fallback, so `text` is drawn beside the
|
|
131
|
+
* slot rather than inside it.
|
|
132
|
+
*/
|
|
133
|
+
private slotted(name: string): boolean {
|
|
134
|
+
return [...this.childNodes].some(node => name
|
|
135
|
+
? node instanceof Element && node.getAttribute("slot") === name
|
|
136
|
+
: node instanceof Element ? !node.hasAttribute("slot") : node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim()));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Ask to close: hides the notice unless a listener cancels `ds-notice-dismiss`. */
|
|
140
|
+
dismiss(): boolean {
|
|
141
|
+
const event = new CustomEvent<NoticeDismissDetail>("ds-notice-dismiss", {
|
|
142
|
+
bubbles: true, composed: true, cancelable: true, detail: { tone: this.resolvedTone },
|
|
143
|
+
});
|
|
144
|
+
if (!this.dispatchEvent(event)) return false;
|
|
145
|
+
this.hidden = true;
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
render() {
|
|
150
|
+
const tone = this.resolvedTone;
|
|
151
|
+
const heading = this.words(this.heading);
|
|
152
|
+
const text = this.words(this.text);
|
|
153
|
+
const hasHeading = Boolean(heading) || this.slotted("heading");
|
|
154
|
+
const slottedText = this.slotted("");
|
|
155
|
+
const hasText = Boolean(text) || slottedText;
|
|
156
|
+
const hasActions = this.slotted("actions");
|
|
157
|
+
const changed = () => this.requestUpdate();
|
|
158
|
+
return html`<div class="ds-notice${tone === "neutral" ? "" : ` ds-notice--${tone}`}${this.banner ? " ds-notice--banner" : ""}" part="notice">
|
|
159
|
+
<span class="ds-notice__mark" part="mark" aria-hidden="true">
|
|
160
|
+
<slot name="icon" @slotchange=${changed}><ds-icon size="large" .type=${this.icon || NOTICE_ICONS[tone]}></ds-icon></slot>
|
|
161
|
+
</span>
|
|
162
|
+
<div class="ds-notice__title" part="title" ?hidden=${!hasHeading}><slot name="heading" @slotchange=${changed}>${heading}</slot></div>
|
|
163
|
+
<div class="ds-notice__text" part="text" ?hidden=${!hasText}><slot @slotchange=${changed}></slot>${slottedText ? nothing : text}</div>
|
|
164
|
+
<div class="ds-notice__actions" part="actions" ?hidden=${!hasActions}><slot name="actions" @slotchange=${changed}></slot></div>
|
|
165
|
+
${this.dismissible
|
|
166
|
+
? html`<button class="ds-button ds-button--icon ds-notice__dismiss" part="dismiss" type="button" aria-label=${getText("Close") || "Close"} @click=${() => this.dismiss()}>
|
|
167
|
+
<ds-icon type="close" aria-hidden="true"></ds-icon>
|
|
168
|
+
</button>`
|
|
169
|
+
: nothing}
|
|
170
|
+
</div>`;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
define("ds-notice", Notice);
|
|
175
|
+
|
|
176
|
+
declare global {
|
|
177
|
+
interface HTMLElementTagNameMap {
|
|
178
|
+
"ds-notice": Notice;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
// ds-progress.ts
|
|
2
|
+
// Progress, as HTML's <progress> names it: how much of a range a value fills,
|
|
3
|
+
// one square high, as a bar half a square high or the range in squares (past
|
|
4
|
+
// the end it is "over", filled whole in the danger colour); or, with `steps`,
|
|
5
|
+
// a numbered sequence of steps one square high, those before the current one
|
|
6
|
+
// done; or, with `dots`, a dot for each slide or page, one square each.
|
|
7
|
+
// Drawn by 1-root/progress.css, the same classes a page without scripts
|
|
8
|
+
// writes.
|
|
9
|
+
|
|
10
|
+
import { LitElement, html, nothing, unsafeCSS, type PropertyValues } from "lit";
|
|
11
|
+
import { getText } from "../0-face/i18n";
|
|
12
|
+
import { define } from "../0-face/define";
|
|
13
|
+
import { formatNumber } from "../0-face/format";
|
|
14
|
+
import { dotForKey, dotState } from "../0-face/carousel";
|
|
15
|
+
import { figureFormat, meterAria, type FigureFormat, type MeterAria } from "./figures";
|
|
16
|
+
import "./ds-icon";
|
|
17
|
+
import metrics from "../1-root/component-metrics.css?inline";
|
|
18
|
+
import progress from "../1-root/progress.css?inline";
|
|
19
|
+
import styles from "./styles/ds-progress.css?inline";
|
|
20
|
+
|
|
21
|
+
/** The most squares a range is drawn in. */
|
|
22
|
+
const MOST_SQUARES = 100;
|
|
23
|
+
|
|
24
|
+
/** Where a step stands: before the current one, the current one, after it, or stopped. */
|
|
25
|
+
export type StepState = "done" | "current" | "upcoming" | "failed";
|
|
26
|
+
const STATES: readonly StepState[] = ["done", "current", "upcoming", "failed"];
|
|
27
|
+
|
|
28
|
+
/** A step: its name (a translation key, or literal words), and optionally its own state and where it goes. */
|
|
29
|
+
export type Step = string | { label: string; state?: StepState; href?: string };
|
|
30
|
+
|
|
31
|
+
/** The words assistive technology reads after a step's name for its state; aria-current says the current one. */
|
|
32
|
+
const STATE_WORDS: Partial<Record<StepState, string>> = { done: "Done", failed: "Failed" };
|
|
33
|
+
|
|
34
|
+
/** Each step's state: its own if it names one, else done before `current`, current at it and upcoming after. */
|
|
35
|
+
export function stepStates(steps: readonly Step[], current: number): StepState[] {
|
|
36
|
+
return steps.map((step, index) => {
|
|
37
|
+
const own = typeof step === "object" && step ? step.state : undefined;
|
|
38
|
+
if (own && STATES.includes(own)) return own;
|
|
39
|
+
const number = index + 1;
|
|
40
|
+
return number < current ? "done" : number === current ? "current" : "upcoming";
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Detail of `select`. Cancel the event to keep the current dot where it is. */
|
|
45
|
+
export interface ProgressSelectDetail {
|
|
46
|
+
/** The dot picked, from 0. */
|
|
47
|
+
index: number;
|
|
48
|
+
/** The dot that was current. */
|
|
49
|
+
previous: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** What the element draws: a bar or squares, a sequence of steps, or dots. */
|
|
53
|
+
export type ProgressMode = "meter" | "steps" | "dots";
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @element ds-progress
|
|
57
|
+
*
|
|
58
|
+
* A value against its range (the default):
|
|
59
|
+
* @prop {number} value - The value. Past `max`, it is over.
|
|
60
|
+
* @prop {number} min - The start of the range, 0 by default.
|
|
61
|
+
* @prop {number} max - The end of the range, 1 by default.
|
|
62
|
+
* @prop {number} squares - Draw the range in this many squares, one square each, instead of a bar.
|
|
63
|
+
* @prop {boolean} over - Show it as over whatever the value, where the page decides it.
|
|
64
|
+
* @prop {string} valuetext - What the value says (`aria-valuetext`), in place of "7 of 10".
|
|
65
|
+
* @prop {"number" | "compact" | "percent" | "money"} format - How the value and the range are written in the words.
|
|
66
|
+
* @prop {string} currency - The ISO 4217 code for money.
|
|
67
|
+
* @prop {boolean} minor - The money is counted in the currency's minor unit.
|
|
68
|
+
* @prop {boolean} whole - Money in whole units only.
|
|
69
|
+
* @prop {number} digits - Decimals in the words.
|
|
70
|
+
*
|
|
71
|
+
* A sequence of steps:
|
|
72
|
+
* @prop {Step[]} steps - The steps in order: names, or `{ label, state, href }`. As an attribute, a JSON array.
|
|
73
|
+
* @prop {number} current - The number of the current step, counted from 1. Past the last, every step is done; 0, none has started.
|
|
74
|
+
* @prop {boolean} vertical - One step to a row, with each step's `step-N` slot under it.
|
|
75
|
+
* @slot step-N - In a vertical sequence, what belongs under step N (counted from 1): a line of text, a form.
|
|
76
|
+
*
|
|
77
|
+
* Dots:
|
|
78
|
+
* @prop {number} dots - A dot for each of this many pages.
|
|
79
|
+
* @prop {number} active - The current dot, from 0.
|
|
80
|
+
* @prop {boolean} end - Draw the last dot as an end marker (a ring in the text colour) unless it is current.
|
|
81
|
+
* @prop {string} dotLabel - Each dot's name, with `{index}` for its number from 1: the shared words' "Slide {index}" by default.
|
|
82
|
+
* @fires select - A person picked a dot, by a click or a key. `detail` is `{ index, previous }`. Cancelable.
|
|
83
|
+
*
|
|
84
|
+
* @prop {string} label - The element's name for assistive technology: a translation key, or literal words
|
|
85
|
+
* (the dots' group is the shared word "Slides" by default).
|
|
86
|
+
* @prop {boolean} literal - Show `label`, `valuetext`, the step names and `dotLabel` as written, never looked up.
|
|
87
|
+
*
|
|
88
|
+
* A value is `role="meter"` on the element with `aria-valuenow` (kept inside
|
|
89
|
+
* the range, as ARIA requires), `-min`, `-max` and `-valuetext` ("12 of 10,
|
|
90
|
+
* over by 2"). Steps are an ordered list; the current one carries
|
|
91
|
+
* `aria-current="step"`, a done or failed one says so in hidden words, and a
|
|
92
|
+
* step with `href` is a link reached with Tab. Dots are a group of buttons,
|
|
93
|
+
* only the current one in the tab order; the arrow keys, Home and End move
|
|
94
|
+
* to the others and pick them.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* <ds-progress label="Spent" value="7400" max="10000" format="money" currency="DKK"></ds-progress>
|
|
98
|
+
* <ds-progress label="Seats" value="7" max="10" squares="10"></ds-progress>
|
|
99
|
+
* <ds-progress current="2" steps='["Apply", "Approval", "Connect payouts"]' label="Getting started" literal></ds-progress>
|
|
100
|
+
* <ds-progress dots="5" active="1"></ds-progress>
|
|
101
|
+
*/
|
|
102
|
+
export class Progress extends LitElement {
|
|
103
|
+
static properties = {
|
|
104
|
+
value: { type: Number },
|
|
105
|
+
min: { type: Number },
|
|
106
|
+
max: { type: Number },
|
|
107
|
+
squares: { type: Number },
|
|
108
|
+
over: { type: Boolean, reflect: true },
|
|
109
|
+
valuetext: { type: String },
|
|
110
|
+
format: { type: String },
|
|
111
|
+
currency: { type: String },
|
|
112
|
+
minor: { type: Boolean },
|
|
113
|
+
whole: { type: Boolean },
|
|
114
|
+
digits: { type: Number },
|
|
115
|
+
steps: { type: Array },
|
|
116
|
+
current: { type: Number },
|
|
117
|
+
vertical: { type: Boolean, reflect: true },
|
|
118
|
+
dots: { type: Number, reflect: true },
|
|
119
|
+
active: { type: Number, reflect: true },
|
|
120
|
+
end: { type: Boolean, reflect: true },
|
|
121
|
+
dotLabel: { type: String, attribute: "dot-label" },
|
|
122
|
+
label: { type: String },
|
|
123
|
+
literal: { type: Boolean, reflect: true },
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
static styles = [unsafeCSS(metrics), unsafeCSS(progress), unsafeCSS(styles)];
|
|
127
|
+
|
|
128
|
+
declare value: number;
|
|
129
|
+
declare min: number;
|
|
130
|
+
declare max: number;
|
|
131
|
+
declare squares: number | undefined;
|
|
132
|
+
declare over: boolean;
|
|
133
|
+
declare valuetext: string | undefined;
|
|
134
|
+
declare format: FigureFormat;
|
|
135
|
+
declare currency: string | undefined;
|
|
136
|
+
declare minor: boolean;
|
|
137
|
+
declare whole: boolean;
|
|
138
|
+
declare digits: number | undefined;
|
|
139
|
+
declare steps: Step[] | undefined;
|
|
140
|
+
declare current: number;
|
|
141
|
+
declare vertical: boolean;
|
|
142
|
+
declare dots: number | undefined;
|
|
143
|
+
declare active: number;
|
|
144
|
+
declare end: boolean;
|
|
145
|
+
declare dotLabel: string | undefined;
|
|
146
|
+
declare label: string | undefined;
|
|
147
|
+
declare literal: boolean;
|
|
148
|
+
|
|
149
|
+
/** The role this element last set, so a role the page wrote is left alone. */
|
|
150
|
+
private ownRole: string | null = null;
|
|
151
|
+
private focusAfterUpdate = false;
|
|
152
|
+
private readonly relabel = () => this.requestUpdate();
|
|
153
|
+
|
|
154
|
+
constructor() {
|
|
155
|
+
super();
|
|
156
|
+
this.value = 0;
|
|
157
|
+
this.min = 0;
|
|
158
|
+
this.max = 1;
|
|
159
|
+
this.over = false;
|
|
160
|
+
this.format = "number";
|
|
161
|
+
this.minor = false;
|
|
162
|
+
this.whole = false;
|
|
163
|
+
this.current = 1;
|
|
164
|
+
this.vertical = false;
|
|
165
|
+
this.active = 0;
|
|
166
|
+
this.end = false;
|
|
167
|
+
this.literal = false;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** What the element draws, from what it was given: steps, dots, or a value against its range. */
|
|
171
|
+
get mode(): ProgressMode {
|
|
172
|
+
if (Array.isArray(this.steps)) return "steps";
|
|
173
|
+
if (this.dots !== undefined && this.dots !== null) return "dots";
|
|
174
|
+
return "meter";
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
connectedCallback() {
|
|
178
|
+
super.connectedCallback();
|
|
179
|
+
window.addEventListener("language-changed", this.relabel);
|
|
180
|
+
window.addEventListener("translations-loaded", this.relabel);
|
|
181
|
+
window.addEventListener("translations-ready", this.relabel);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
disconnectedCallback() {
|
|
185
|
+
window.removeEventListener("language-changed", this.relabel);
|
|
186
|
+
window.removeEventListener("translations-loaded", this.relabel);
|
|
187
|
+
window.removeEventListener("translations-ready", this.relabel);
|
|
188
|
+
super.disconnectedCallback();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
private words(value: string | undefined): string {
|
|
192
|
+
if (!value) return "";
|
|
193
|
+
return this.literal ? value : getText(value) || value;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
private wordsWith(value: string | undefined, fallback: string, params?: Record<string, number>): string {
|
|
197
|
+
const text = value && this.literal ? value : getText(value || fallback, params) || value || fallback;
|
|
198
|
+
return params ? text.replace(/\{\{?(\w+)\}?\}/g, (whole, name: string) => (name in params ? String(params[name]) : whole)) : text;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** Sets a role of this element's own; a role the page wrote stays. */
|
|
202
|
+
private setRole(role: string | null) {
|
|
203
|
+
const written = this.getAttribute("role");
|
|
204
|
+
if (written !== null && written !== this.ownRole) return;
|
|
205
|
+
this.ownRole = role;
|
|
206
|
+
if (role === null) this.removeAttribute("role");
|
|
207
|
+
else if (written !== role) this.setAttribute("role", role);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// ---- A value against its range ----
|
|
211
|
+
|
|
212
|
+
/** The values the element says and draws, in the current language. */
|
|
213
|
+
get aria(): MeterAria {
|
|
214
|
+
return meterAria(this.value, this.min, this.max, {
|
|
215
|
+
over: this.over, format: figureFormat(this.format), currency: this.currency,
|
|
216
|
+
minor: this.minor, whole: this.whole, digits: this.digits,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** How many squares the range is drawn in, or 0 for a bar. */
|
|
221
|
+
get squareCount(): number {
|
|
222
|
+
const count = Math.floor(Number(this.squares));
|
|
223
|
+
return Number.isFinite(count) && count > 0 ? Math.min(MOST_SQUARES, count) : 0;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ---- A sequence ----
|
|
227
|
+
|
|
228
|
+
/** Each step's state, as drawn. */
|
|
229
|
+
get states(): StepState[] {
|
|
230
|
+
return stepStates(Array.isArray(this.steps) ? this.steps : [], Number(this.current));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
private slotted(name: string): boolean {
|
|
234
|
+
return [...this.children].some(node => node.getAttribute("slot") === name);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// ---- Dots ----
|
|
238
|
+
|
|
239
|
+
/** The number of dots drawn: a whole number, never below zero. */
|
|
240
|
+
get dotCount(): number {
|
|
241
|
+
return Number.isFinite(this.dots) ? Math.max(0, Math.floor(this.dots as number)) : 0;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/** The current dot, inside the count. */
|
|
245
|
+
get currentDot(): number {
|
|
246
|
+
const active = Number.isFinite(this.active) ? Math.floor(this.active) : 0;
|
|
247
|
+
return Math.max(0, Math.min(this.dotCount - 1, active));
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** Pick a dot as a person would: fires `select` and, unless it is cancelled, makes it current. */
|
|
251
|
+
select(index: number): boolean {
|
|
252
|
+
if (this.dotCount === 0) return false;
|
|
253
|
+
const target = Math.max(0, Math.min(this.dotCount - 1, Math.floor(index)));
|
|
254
|
+
const event = new CustomEvent<ProgressSelectDetail>("select", {
|
|
255
|
+
bubbles: true, composed: true, cancelable: true, detail: { index: target, previous: this.currentDot },
|
|
256
|
+
});
|
|
257
|
+
if (!this.dispatchEvent(event)) return false;
|
|
258
|
+
this.active = target;
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
private dotKeydown(event: KeyboardEvent, index: number) {
|
|
263
|
+
const to = dotForKey(event.key, index, this.dotCount, getComputedStyle(this).direction === "rtl");
|
|
264
|
+
if (to === undefined) return;
|
|
265
|
+
event.preventDefault();
|
|
266
|
+
if (this.select(to)) {
|
|
267
|
+
this.focusAfterUpdate = true;
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
// A cancelled pick leaves the current dot as it is; focus still follows the key.
|
|
271
|
+
this.renderRoot.querySelectorAll<HTMLButtonElement>(".ds-progress__dot")[to]?.focus();
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
protected willUpdate(changed: PropertyValues<this>) {
|
|
275
|
+
super.willUpdate(changed);
|
|
276
|
+
const mode = this.mode;
|
|
277
|
+
if (mode === "meter") {
|
|
278
|
+
const aria = this.aria;
|
|
279
|
+
const label = this.words(this.label);
|
|
280
|
+
this.setRole("meter");
|
|
281
|
+
this.setAttribute("aria-valuenow", String(aria.now));
|
|
282
|
+
this.setAttribute("aria-valuemin", String(aria.min));
|
|
283
|
+
this.setAttribute("aria-valuemax", String(aria.max));
|
|
284
|
+
this.setAttribute("aria-valuetext", this.words(this.valuetext) || aria.text);
|
|
285
|
+
if (label) this.setAttribute("aria-label", label);
|
|
286
|
+
else if (changed.has("label")) this.removeAttribute("aria-label");
|
|
287
|
+
this.toggleAttribute("data-over", aria.over);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
for (const name of ["aria-valuenow", "aria-valuemin", "aria-valuemax", "aria-valuetext", "data-over"]) this.removeAttribute(name);
|
|
291
|
+
if (mode === "dots") {
|
|
292
|
+
this.setRole("group");
|
|
293
|
+
if (!this.hasAttribute("aria-labelledby")) this.setAttribute("aria-label", this.wordsWith(this.label, "Slides"));
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
// Steps name their list inside; the element itself has no role.
|
|
297
|
+
this.setRole(null);
|
|
298
|
+
if (changed.has("label") || changed.has("steps")) this.removeAttribute("aria-label");
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
protected updated(changed: PropertyValues<this>) {
|
|
302
|
+
super.updated(changed);
|
|
303
|
+
if (!this.focusAfterUpdate) return;
|
|
304
|
+
this.focusAfterUpdate = false;
|
|
305
|
+
this.renderRoot.querySelector<HTMLButtonElement>('[aria-current="true"]')?.focus();
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
private renderMeter() {
|
|
309
|
+
const aria = this.aria;
|
|
310
|
+
const count = this.squareCount;
|
|
311
|
+
const over = aria.over ? " ds-progress--over" : "";
|
|
312
|
+
if (count) {
|
|
313
|
+
const on = Math.round(aria.fraction * count);
|
|
314
|
+
return html`<div class="ds-progress ds-progress--squares${over}" part="progress">${Array.from({ length: count }, (_, index) =>
|
|
315
|
+
html`<span class="ds-progress__square${index < on ? " ds-progress__square--on" : ""}" part="square"></span>`)}</div>`;
|
|
316
|
+
}
|
|
317
|
+
return html`<div class="ds-progress${over}" part="progress" style="--ds-progress-value: ${aria.fraction}"><span class="ds-progress__fill" part="fill"></span></div>`;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
private renderSteps() {
|
|
321
|
+
const steps = Array.isArray(this.steps) ? this.steps : [];
|
|
322
|
+
const states = this.states;
|
|
323
|
+
const label = this.words(this.label);
|
|
324
|
+
const changed = () => this.requestUpdate();
|
|
325
|
+
return html`<ol class="ds-progress ds-progress--steps${this.vertical ? " ds-progress--vertical" : ""}" part="steps" aria-label=${label || nothing}>
|
|
326
|
+
${steps.map((step, index) => {
|
|
327
|
+
const state = states[index]!;
|
|
328
|
+
const name = this.words(typeof step === "string" ? step : step?.label);
|
|
329
|
+
const href = typeof step === "object" && step ? step.href : undefined;
|
|
330
|
+
const number = index + 1;
|
|
331
|
+
const said = STATE_WORDS[state];
|
|
332
|
+
const mark = state === "done" || state === "failed"
|
|
333
|
+
? html`<ds-icon size="small" type=${state === "done" ? "check" : "warning"}></ds-icon>`
|
|
334
|
+
: formatNumber(number);
|
|
335
|
+
const face = html`<span class="ds-progress__mark" part="mark" aria-hidden="true">${mark}</span><span class="ds-progress__label" part="label">${name}</span>${said
|
|
336
|
+
? html`<span class="ds-progress__state"> ${getText(said) || said}</span>`
|
|
337
|
+
: nothing}`;
|
|
338
|
+
return html`<li class="ds-progress__step${state === "upcoming" ? "" : ` ds-progress__step--${state}`}" part="step" data-state=${state} aria-current=${state === "current" ? "step" : nothing}>
|
|
339
|
+
${href ? html`<a class="ds-progress__link" part="link" href=${href}>${face}</a>` : face}
|
|
340
|
+
${this.vertical
|
|
341
|
+
? html`<div class="ds-progress__body" part="body" ?hidden=${!this.slotted(`step-${number}`)}><slot name=${`step-${number}`} @slotchange=${changed}></slot></div>`
|
|
342
|
+
: nothing}
|
|
343
|
+
</li>`;
|
|
344
|
+
})}
|
|
345
|
+
</ol>`;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
private renderDots() {
|
|
349
|
+
const current = this.currentDot;
|
|
350
|
+
return html`<div class="ds-progress ds-progress--dots" part="dots">
|
|
351
|
+
${Array.from({ length: this.dotCount }, (_, index) => {
|
|
352
|
+
const state = dotState(index, current, this.dotCount, this.end);
|
|
353
|
+
return html`<button
|
|
354
|
+
class="ds-progress__dot"
|
|
355
|
+
part="dot"
|
|
356
|
+
type="button"
|
|
357
|
+
data-state=${state}
|
|
358
|
+
aria-label=${this.wordsWith(this.dotLabel, "Slide {index}", { index: index + 1 })}
|
|
359
|
+
aria-current=${state === "current" ? "true" : "false"}
|
|
360
|
+
tabindex=${state === "current" ? 0 : -1}
|
|
361
|
+
@click=${() => this.select(index)}
|
|
362
|
+
@keydown=${(event: KeyboardEvent) => this.dotKeydown(event, index)}
|
|
363
|
+
></button>`;
|
|
364
|
+
})}
|
|
365
|
+
</div>`;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
render() {
|
|
369
|
+
const mode = this.mode;
|
|
370
|
+
return mode === "steps" ? this.renderSteps() : mode === "dots" ? this.renderDots() : this.renderMeter();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
define("ds-progress", Progress);
|
|
375
|
+
|
|
376
|
+
declare global {
|
|
377
|
+
interface HTMLElementTagNameMap {
|
|
378
|
+
"ds-progress": Progress;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { LitElement, html, unsafeCSS } from "lit";
|
|
2
|
+
import { define } from "../0-face/define";
|
|
3
|
+
import { bindSpacingHandle, type SpacingOptions } from "./spacing-handle";
|
|
4
|
+
import styles from "./styles/ds-spacing-handle.css?inline";
|
|
5
|
+
export { bindSpacingHandle, type SpacingOptions };
|
|
6
|
+
/** @internal Built-in editor control, excluded from public catalogues.
|
|
7
|
+
* Supply options with controlled value and callbacks. React uses the same
|
|
8
|
+
* controller and face on a native slider target for SSR and native focus. */
|
|
9
|
+
export class SpacingHandle extends LitElement {
|
|
10
|
+
static properties = { options: { attribute: false }, label: { type: String } };
|
|
11
|
+
static styles = unsafeCSS(styles);
|
|
12
|
+
options: SpacingOptions = { value: 0, onCommit: () => {} };
|
|
13
|
+
label = "Spacing";
|
|
14
|
+
private dispose?: () => void;
|
|
15
|
+
updated() {
|
|
16
|
+
if (!this.dispose) this.dispose = bindSpacingHandle(this.renderRoot.querySelector<HTMLElement>(".ds-spacing-control")!, () => this.options);
|
|
17
|
+
}
|
|
18
|
+
disconnectedCallback() { this.dispose?.(); this.dispose = undefined; super.disconnectedCallback(); }
|
|
19
|
+
connectedCallback() { super.connectedCallback(); this.requestUpdate(); }
|
|
20
|
+
render() { const o = this.options; return html`<span class="ds-spacing-control" role="slider" tabindex=${o.disabled ? -1 : 0} aria-label=${this.label} aria-orientation=${o.axis ?? "horizontal"} aria-valuemin=${o.min ?? 0} aria-valuemax=${o.max ?? 1000000} aria-valuenow=${o.value} aria-disabled=${!!o.disabled}><span class="ds-spacing-label">${o.value}</span></span>`; }
|
|
21
|
+
}
|
|
22
|
+
define("ds-spacing-handle", SpacingHandle);
|