@0001-labs/design-system-1 0.3.0-alpha.13 → 0.3.0-alpha.15
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 +14 -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 +891 -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/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 +300 -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-message.ts +218 -0
- package/DS1/2-core/ds-notice.ts +10 -0
- package/DS1/2-core/ds-progress.ts +380 -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 +238 -128
- package/DS1/2-core/generated/icon-avatar.ts +2 -0
- package/DS1/2-core/generated/icons-extra.ts +120 -65
- package/DS1/2-core/generated/icons-immediate.ts +1 -1
- 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 +10 -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-notice.css +32 -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-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 +366 -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 +134 -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 +24 -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/message.ts +73 -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 +71 -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-android-screen-stats.svg → chevron-down.svg} +1 -1
- package/DS1/x-icon/{ezo-item-button-start.svg → chevron-left.svg} +1 -1
- package/DS1/x-icon/{ezo-android-screen-lists.svg → chevron-right.svg} +1 -1
- package/DS1/x-icon/{ezo-item-button-reopen.svg → chevron-up.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/minus.svg +3 -0
- 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/stop.svg +3 -0
- 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 +11 -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/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-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-message.d.ts +154 -0
- package/dist/2-core/ds-message.d.ts.map +1 -0
- package/dist/2-core/ds-message.js +177 -0
- package/dist/2-core/ds-notice.d.ts +13 -0
- package/dist/2-core/ds-notice.d.ts.map +1 -0
- package/dist/2-core/ds-notice.js +11 -0
- 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-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-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-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/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 +120 -65
- package/dist/2-core/generated/ds-icon-map.d.ts.map +1 -1
- package/dist/2-core/generated/ds-icon-map.js +238 -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 +120 -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/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 +149 -0
- package/dist/3-unit/ds-sidebar.d.ts.map +1 -0
- package/dist/3-unit/ds-sidebar.js +342 -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/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-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 +12322 -5523
- package/dist/design-system-1.bundle.js.map +1 -1
- package/dist/design-system-1.bundle.min.js +8771 -4115
- 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-BoAACA4X.js → icons-extra-CiDDs7_-.js} +404 -312
- package/dist/icons-extra-CiDDs7_-.js.map +1 -0
- package/dist/{icons-extra-DlxTo_Y4.js → icons-extra-hauwCx07.js} +121 -66
- package/dist/icons-extra-hauwCx07.js.map +1 -0
- package/dist/index.d.ts +21 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -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/{split.js → button-split.js} +12 -9
- 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/message.d.ts +66 -0
- package/dist/react/message.d.ts.map +1 -0
- package/dist/react/message.js +37 -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 +54 -0
- package/dist/react/sidebar.d.ts.map +1 -0
- package/dist/react/sidebar.js +48 -0
- 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/toast.d.ts +37 -0
- package/dist/react/toast.d.ts.map +1 -0
- package/dist/react/toast.js +55 -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/package.json +19 -6
- 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/dist/2-core/ds-banner.d.ts +0 -68
- package/dist/2-core/ds-banner.d.ts.map +0 -1
- package/dist/2-core/ds-banner.js +0 -98
- package/dist/2-core/ds-date.d.ts +0 -16
- package/dist/2-core/ds-date.d.ts.map +0 -1
- package/dist/2-core/ds-date.js +0 -15
- package/dist/2-core/ds-language.d.ts +0 -75
- package/dist/2-core/ds-language.d.ts.map +0 -1
- package/dist/2-core/ds-language.js +0 -74
- package/dist/2-core/ds-pagedots.d.ts +0 -32
- package/dist/2-core/ds-pagedots.d.ts.map +0 -1
- package/dist/2-core/ds-pagedots.js +0 -36
- package/dist/2-core/ds-split.d.ts +0 -75
- package/dist/2-core/ds-split.d.ts.map +0 -1
- package/dist/2-core/ds-split.js +0 -101
- package/dist/2-core/ds-textarea.d.ts +0 -46
- package/dist/2-core/ds-textarea.d.ts.map +0 -1
- package/dist/2-core/ds-textarea.js +0 -121
- package/dist/4-page/ds-layout.d.ts +0 -31
- package/dist/4-page/ds-layout.d.ts.map +0 -1
- package/dist/4-page/ds-layout.js +0 -930
- package/dist/icons-extra-BoAACA4X.js.map +0 -1
- package/dist/icons-extra-DlxTo_Y4.js.map +0 -1
- package/dist/react/split.d.ts +0 -15
- package/dist/react/split.d.ts.map +0 -1
- package/dist/shared-words-Cg6Phtx0.js +0 -915
- package/dist/shared-words-Cg6Phtx0.js.map +0 -1
- package/dist/shared-words-Ddz0yUEF.js +0 -933
- package/dist/shared-words-Ddz0yUEF.js.map +0 -1
- /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
package/dist/3-unit/ds-row.js
CHANGED
|
@@ -1,14 +1,36 @@
|
|
|
1
1
|
import { LitElement, html, unsafeCSS } from "lit";
|
|
2
|
+
import { ifDefined } from "lit/directives/if-defined.js";
|
|
2
3
|
import styles from "./styles/ds-row.css?inline";
|
|
3
4
|
import { define } from "../0-face/define";
|
|
5
|
+
/** The values `aria-current` takes besides `page`. */
|
|
6
|
+
const CURRENT = new Set(["page", "step", "location", "date", "time", "true"]);
|
|
4
7
|
/**
|
|
5
8
|
* A horizontal run of elements one row (`--ds-row-height`) tall.
|
|
6
9
|
*
|
|
10
|
+
* With `href` the whole row is one link, with `interactive` one button: it
|
|
11
|
+
* shows the pointer over it, the press and the focus ring across the row,
|
|
12
|
+
* and its content keeps the row's layout. Controls in the `end` slot stay
|
|
13
|
+
* separately pressable. `current` marks the destination being shown
|
|
14
|
+
* (`aria-current="page"`); `nav` draws the row as a navigation row.
|
|
15
|
+
*
|
|
7
16
|
* @element ds-row
|
|
8
17
|
* @attr fill - Spread the children from edge to edge.
|
|
9
18
|
* @attr centered - Centre the children.
|
|
10
19
|
* @attr end - Push the children to the end.
|
|
11
20
|
* @attr auto - Size to the content instead of one row.
|
|
21
|
+
* @attr stacked - Stack the children, each on its own line, sized to them (a tile or a card).
|
|
22
|
+
* @attr href - Make the row a link to this address.
|
|
23
|
+
* @attr interactive - Make the row a button.
|
|
24
|
+
* @attr disabled - Keep the row from being pressed.
|
|
25
|
+
* @attr current - The destination being shown: `aria-current="page"`, or the value given (`step`, `location`, …).
|
|
26
|
+
* @attr nav - Draw a navigation row: corners of two pixels, as the sidebar's rows.
|
|
27
|
+
* @attr label - The accessible name, when the row's words do not say it.
|
|
28
|
+
* @attr target - Where a link opens (`_blank`, …).
|
|
29
|
+
* @attr rel - The link's relationship (`noopener`, …).
|
|
30
|
+
* @slot - The row's content, inside its press target.
|
|
31
|
+
* @slot end - Controls of their own after the content, outside the press target.
|
|
32
|
+
* @fires ds-row-press - `{ href }`: the row was pressed. Cancel it to route a link yourself; a modified click on a link is left to the browser.
|
|
33
|
+
* @csspart target - The link or button that is the row's press target.
|
|
12
34
|
*/
|
|
13
35
|
export class Row extends LitElement {
|
|
14
36
|
constructor() {
|
|
@@ -17,9 +39,57 @@ export class Row extends LitElement {
|
|
|
17
39
|
this.centered = false;
|
|
18
40
|
this.end = false;
|
|
19
41
|
this.auto = false;
|
|
42
|
+
this.stacked = false;
|
|
43
|
+
this.href = undefined;
|
|
44
|
+
this.interactive = false;
|
|
45
|
+
this.disabled = false;
|
|
46
|
+
this.current = undefined;
|
|
47
|
+
this.nav = false;
|
|
48
|
+
this.label = undefined;
|
|
49
|
+
this.target = undefined;
|
|
50
|
+
this.rel = undefined;
|
|
51
|
+
}
|
|
52
|
+
/** The `aria-current` value, or none. */
|
|
53
|
+
get currentValue() {
|
|
54
|
+
const value = this.current;
|
|
55
|
+
if (value === null || value === undefined || value === "false")
|
|
56
|
+
return undefined;
|
|
57
|
+
return CURRENT.has(value) ? value : "page";
|
|
58
|
+
}
|
|
59
|
+
/** Focuses the press target, so `row.focus()` lands on the link or button. */
|
|
60
|
+
focus(options) {
|
|
61
|
+
const target = this.renderRoot?.querySelector(".target");
|
|
62
|
+
if (target)
|
|
63
|
+
target.focus(options);
|
|
64
|
+
else
|
|
65
|
+
super.focus(options);
|
|
66
|
+
}
|
|
67
|
+
press(event) {
|
|
68
|
+
if (this.disabled) {
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// A link keeps the browser's new tab, download and context menu.
|
|
73
|
+
if (this.href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0))
|
|
74
|
+
return;
|
|
75
|
+
const go = this.dispatchEvent(new CustomEvent("ds-row-press", { detail: { href: this.href || undefined }, bubbles: true, composed: true, cancelable: true }));
|
|
76
|
+
if (!go)
|
|
77
|
+
event.preventDefault();
|
|
20
78
|
}
|
|
21
79
|
render() {
|
|
22
|
-
|
|
80
|
+
if (!this.href && !this.interactive)
|
|
81
|
+
return html `<slot></slot>`;
|
|
82
|
+
const current = this.currentValue;
|
|
83
|
+
const label = this.label || undefined;
|
|
84
|
+
const content = html `<slot></slot>`;
|
|
85
|
+
const target = this.href
|
|
86
|
+
? this.disabled
|
|
87
|
+
? html `<a class="target" part="target" role="link" aria-disabled="true" aria-label=${ifDefined(label)}>${content}</a>`
|
|
88
|
+
: html `<a class="target" part="target" href=${this.href} target=${ifDefined(this.target || undefined)} rel=${ifDefined(this.rel || undefined)}
|
|
89
|
+
aria-current=${ifDefined(current)} aria-label=${ifDefined(label)} @click=${this.press}>${content}</a>`
|
|
90
|
+
: html `<button class="target" part="target" type="button" ?disabled=${this.disabled}
|
|
91
|
+
aria-current=${ifDefined(current)} aria-label=${ifDefined(label)} @click=${this.press}>${content}</button>`;
|
|
92
|
+
return html `${target}<slot name="end"></slot>`;
|
|
23
93
|
}
|
|
24
94
|
}
|
|
25
95
|
Row.properties = {
|
|
@@ -27,6 +97,15 @@ Row.properties = {
|
|
|
27
97
|
centered: { type: Boolean, reflect: true },
|
|
28
98
|
end: { type: Boolean, reflect: true },
|
|
29
99
|
auto: { type: Boolean, reflect: true },
|
|
100
|
+
stacked: { type: Boolean, reflect: true },
|
|
101
|
+
href: { type: String, reflect: true },
|
|
102
|
+
interactive: { type: Boolean, reflect: true },
|
|
103
|
+
disabled: { type: Boolean, reflect: true },
|
|
104
|
+
current: { type: String, reflect: true },
|
|
105
|
+
nav: { type: Boolean, reflect: true },
|
|
106
|
+
label: { type: String },
|
|
107
|
+
target: { type: String },
|
|
108
|
+
rel: { type: String },
|
|
30
109
|
};
|
|
31
110
|
Row.styles = unsafeCSS(styles);
|
|
32
111
|
define("ds-row", Row);
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
import "../0-face/tooltips";
|
|
3
|
+
import "../2-core/ds-button";
|
|
4
|
+
import "../2-core/ds-icon";
|
|
5
|
+
import "./ds-row";
|
|
6
|
+
/** Visible rows. The application owns hierarchy, expansion, selection and routing. */
|
|
7
|
+
export interface SidebarItem {
|
|
8
|
+
id: string;
|
|
9
|
+
/** Words a person reads; shown as written, never translated. */
|
|
10
|
+
label: string;
|
|
11
|
+
/** Decorative leading icon; the label remains the accessible name. */
|
|
12
|
+
icon?: string;
|
|
13
|
+
/** 0 for a row at the root; each level stands further in. */
|
|
14
|
+
depth?: number;
|
|
15
|
+
href?: string;
|
|
16
|
+
/** `true` open, `false` closed; leave it out for a leaf. */
|
|
17
|
+
expanded?: boolean;
|
|
18
|
+
/** The destination being shown (navigation). */
|
|
19
|
+
current?: boolean;
|
|
20
|
+
/** The row chosen (a tree). */
|
|
21
|
+
selected?: boolean;
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** Small muted words at the row's end: a count, a size. */
|
|
24
|
+
meta?: string;
|
|
25
|
+
action?: {
|
|
26
|
+
id: string;
|
|
27
|
+
label: string;
|
|
28
|
+
icon?: string;
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
};
|
|
31
|
+
/** Opt this row out of an enabled navigation reorder surface. */
|
|
32
|
+
reorderable?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface SidebarMoveDetail {
|
|
35
|
+
id: string;
|
|
36
|
+
targetId: string;
|
|
37
|
+
position: "before" | "after";
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Compact navigation composed from Row, Button and Icon: the application's
|
|
41
|
+
* places, each row a link or a button and its own Tab stop. A label cut
|
|
42
|
+
* short by the column's width shows in full in the shared tooltip
|
|
43
|
+
* (`data-tooltip`, drawn by `0-face/tooltips.ts`); a label that fits carries
|
|
44
|
+
* none, and no row carries the browser's `title`.
|
|
45
|
+
*
|
|
46
|
+
* With `tree`, it is a tree of the things inside one place (files, groups, a
|
|
47
|
+
* page's parts): rows one square high, each level one square further in, a
|
|
48
|
+
* disclosure arrow on its own square before each label. `role="tree"` with
|
|
49
|
+
* one `role="treeitem"` per row, `aria-level`, `aria-expanded` and
|
|
50
|
+
* `aria-selected`; one Tab stop, the keyboard of the tree pattern (see
|
|
51
|
+
* `0-face/sidebar.ts`). The application keeps the rows: it passes the
|
|
52
|
+
* visible ones in `items`, in order, and answers the events.
|
|
53
|
+
*
|
|
54
|
+
* @element ds-sidebar
|
|
55
|
+
* @attr label - The navigation's or the tree's accessible name.
|
|
56
|
+
* @attr tree - A tree of nested things instead of navigation.
|
|
57
|
+
* @fires sidebar-toggle - `{ id, expanded }`: a row asks to open or close.
|
|
58
|
+
* @fires sidebar-activate - `{ id }`: a row was pressed (navigation), or Enter or a double click opened one (a tree).
|
|
59
|
+
* @fires sidebar-select - `{ id }`: a click, Space or Enter chose a tree row.
|
|
60
|
+
* @fires sidebar-action - `{ id, action }`: a row's own action was pressed.
|
|
61
|
+
*/
|
|
62
|
+
export declare class Sidebar extends LitElement {
|
|
63
|
+
static properties: {
|
|
64
|
+
items: {
|
|
65
|
+
attribute: boolean;
|
|
66
|
+
};
|
|
67
|
+
label: {
|
|
68
|
+
type: StringConstructor;
|
|
69
|
+
};
|
|
70
|
+
empty: {
|
|
71
|
+
type: StringConstructor;
|
|
72
|
+
};
|
|
73
|
+
expandIcon: {
|
|
74
|
+
type: StringConstructor;
|
|
75
|
+
attribute: string;
|
|
76
|
+
};
|
|
77
|
+
collapseIcon: {
|
|
78
|
+
type: StringConstructor;
|
|
79
|
+
attribute: string;
|
|
80
|
+
};
|
|
81
|
+
disclosurePosition: {
|
|
82
|
+
type: StringConstructor;
|
|
83
|
+
attribute: string;
|
|
84
|
+
reflect: boolean;
|
|
85
|
+
};
|
|
86
|
+
tree: {
|
|
87
|
+
type: BooleanConstructor;
|
|
88
|
+
reflect: boolean;
|
|
89
|
+
};
|
|
90
|
+
reorderable: {
|
|
91
|
+
type: BooleanConstructor;
|
|
92
|
+
reflect: boolean;
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
items: SidebarItem[];
|
|
96
|
+
label: string;
|
|
97
|
+
empty: string;
|
|
98
|
+
/** Optional navigation disclosure pair; tree navigation keeps its directional arrow. */
|
|
99
|
+
expandIcon?: string;
|
|
100
|
+
collapseIcon?: string;
|
|
101
|
+
/** Place navigation disclosures before the label; default preserves trailing disclosures. */
|
|
102
|
+
disclosurePosition?: "start" | "end";
|
|
103
|
+
tree: boolean;
|
|
104
|
+
reorderable: boolean;
|
|
105
|
+
private dragId?;
|
|
106
|
+
static styles: import("lit").CSSResult;
|
|
107
|
+
/** In a tree, the row that holds the Tab stop. */
|
|
108
|
+
private focusId?;
|
|
109
|
+
constructor();
|
|
110
|
+
private resizeObserver?;
|
|
111
|
+
private fontsReady;
|
|
112
|
+
connectedCallback(): void;
|
|
113
|
+
disconnectedCallback(): void;
|
|
114
|
+
updated(): void;
|
|
115
|
+
/** Only a label that does not fit its row gets a tooltip, holding the whole label. */
|
|
116
|
+
private markCutLabels;
|
|
117
|
+
private request;
|
|
118
|
+
private toggle;
|
|
119
|
+
private activate;
|
|
120
|
+
/** Moves the focus to a row after `updateComplete`. */
|
|
121
|
+
focusItem(id: string): void;
|
|
122
|
+
/** Scrolls the current destination, or the selected tree row, into view. */
|
|
123
|
+
scrollToCurrent(): void;
|
|
124
|
+
/** The row a pointer or keyboard event happened on, for a context menu or a drag of the application's own. */
|
|
125
|
+
itemFromEvent(event: Event): SidebarItem | undefined;
|
|
126
|
+
private row;
|
|
127
|
+
/** A tree's Tab stop: the row last focused while it is still shown, else the selected row, else the first available. */
|
|
128
|
+
private stop;
|
|
129
|
+
private press;
|
|
130
|
+
private open;
|
|
131
|
+
private treeKeydown;
|
|
132
|
+
private renderTree;
|
|
133
|
+
private canMove;
|
|
134
|
+
private parent;
|
|
135
|
+
private moveAllowed;
|
|
136
|
+
private clearDrag;
|
|
137
|
+
private dragStart;
|
|
138
|
+
private dragOver;
|
|
139
|
+
private drop;
|
|
140
|
+
private navigate;
|
|
141
|
+
private renderDisclosure;
|
|
142
|
+
render(): import("lit").TemplateResult<1>;
|
|
143
|
+
}
|
|
144
|
+
declare global {
|
|
145
|
+
interface HTMLElementTagNameMap {
|
|
146
|
+
"ds-sidebar": Sidebar;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=ds-sidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ds-sidebar.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-sidebar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA4B,MAAM,KAAK,CAAC;AAK3D,OAAO,oBAAoB,CAAC;AAC5B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,UAAU,CAAC;AAGlB,sFAAsF;AACtF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1E,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;CAAE;AAElG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,OAAQ,SAAQ,UAAU;IACrC,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MASf;IACM,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACtB,wFAAwF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAC9B,6FAA6F;IACrF,kBAAkB,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,MAAM,CAAC,MAAM,0BAAqB;IAElC,kDAAkD;IAClD,OAAO,CAAC,OAAO,CAAC,CAAS;;IAWzB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,UAAU,CAAS;IAE3B,iBAAiB;IAWjB,oBAAoB;IAMpB,OAAO;IAKP,sFAAsF;IACtF,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,QAAQ;IAQhB,uDAAuD;IACvD,SAAS,CAAC,EAAE,EAAE,MAAM;IAOpB,4EAA4E;IAC5E,eAAe;IAIf,8GAA8G;IAC9G,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,GAAG,SAAS;IAKpD,OAAO,CAAC,GAAG;IAIX,wHAAwH;IACxH,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,UAAU;IAqClB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,QAAQ;IA4BhB,OAAO,CAAC,gBAAgB;IAUxB,MAAM;CAkCP;AAGD,OAAO,CAAC,MAAM,CAAC;IAAE,UAAU,qBAAqB;QAAG,YAAY,EAAE,OAAO,CAAA;KAAE;CAAE"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { LitElement, html, nothing, unsafeCSS } from "lit";
|
|
2
|
+
import { repeat } from "lit/directives/repeat.js";
|
|
3
|
+
import { ifDefined } from "lit/directives/if-defined.js";
|
|
4
|
+
import { define } from "../0-face/define";
|
|
5
|
+
import { treeStep } from "../0-face/sidebar";
|
|
6
|
+
import "../0-face/tooltips";
|
|
7
|
+
import "../2-core/ds-button";
|
|
8
|
+
import "../2-core/ds-icon";
|
|
9
|
+
import "./ds-row";
|
|
10
|
+
import styles from "./styles/ds-sidebar.css?inline";
|
|
11
|
+
/**
|
|
12
|
+
* Compact navigation composed from Row, Button and Icon: the application's
|
|
13
|
+
* places, each row a link or a button and its own Tab stop. A label cut
|
|
14
|
+
* short by the column's width shows in full in the shared tooltip
|
|
15
|
+
* (`data-tooltip`, drawn by `0-face/tooltips.ts`); a label that fits carries
|
|
16
|
+
* none, and no row carries the browser's `title`.
|
|
17
|
+
*
|
|
18
|
+
* With `tree`, it is a tree of the things inside one place (files, groups, a
|
|
19
|
+
* page's parts): rows one square high, each level one square further in, a
|
|
20
|
+
* disclosure arrow on its own square before each label. `role="tree"` with
|
|
21
|
+
* one `role="treeitem"` per row, `aria-level`, `aria-expanded` and
|
|
22
|
+
* `aria-selected`; one Tab stop, the keyboard of the tree pattern (see
|
|
23
|
+
* `0-face/sidebar.ts`). The application keeps the rows: it passes the
|
|
24
|
+
* visible ones in `items`, in order, and answers the events.
|
|
25
|
+
*
|
|
26
|
+
* @element ds-sidebar
|
|
27
|
+
* @attr label - The navigation's or the tree's accessible name.
|
|
28
|
+
* @attr tree - A tree of nested things instead of navigation.
|
|
29
|
+
* @fires sidebar-toggle - `{ id, expanded }`: a row asks to open or close.
|
|
30
|
+
* @fires sidebar-activate - `{ id }`: a row was pressed (navigation), or Enter or a double click opened one (a tree).
|
|
31
|
+
* @fires sidebar-select - `{ id }`: a click, Space or Enter chose a tree row.
|
|
32
|
+
* @fires sidebar-action - `{ id, action }`: a row's own action was pressed.
|
|
33
|
+
*/
|
|
34
|
+
export class Sidebar extends LitElement {
|
|
35
|
+
constructor() {
|
|
36
|
+
super();
|
|
37
|
+
this.fontsReady = false;
|
|
38
|
+
this.items = [];
|
|
39
|
+
this.label = "Navigation";
|
|
40
|
+
this.empty = "No items";
|
|
41
|
+
this.tree = false;
|
|
42
|
+
this.reorderable = false;
|
|
43
|
+
}
|
|
44
|
+
connectedCallback() {
|
|
45
|
+
super.connectedCallback();
|
|
46
|
+
if (typeof ResizeObserver !== "undefined") {
|
|
47
|
+
this.resizeObserver ?? (this.resizeObserver = new ResizeObserver(() => this.markCutLabels()));
|
|
48
|
+
this.resizeObserver.observe(this);
|
|
49
|
+
}
|
|
50
|
+
// Labels measured before the typeface arrives are measured again once it has.
|
|
51
|
+
const fonts = this.fontsReady ? undefined : document.fonts?.ready;
|
|
52
|
+
if (fonts)
|
|
53
|
+
void fonts.then(() => { this.fontsReady = true; this.markCutLabels(); });
|
|
54
|
+
}
|
|
55
|
+
disconnectedCallback() {
|
|
56
|
+
this.clearDrag();
|
|
57
|
+
this.resizeObserver?.disconnect();
|
|
58
|
+
super.disconnectedCallback();
|
|
59
|
+
}
|
|
60
|
+
updated() {
|
|
61
|
+
this.markCutLabels();
|
|
62
|
+
if (this.dragId && !this.canMove(this.items.find(item => item.id === this.dragId)))
|
|
63
|
+
this.clearDrag();
|
|
64
|
+
}
|
|
65
|
+
/** Only a label that does not fit its row gets a tooltip, holding the whole label. */
|
|
66
|
+
markCutLabels() {
|
|
67
|
+
const labels = new Map(this.items.map(item => [item.id, item.label]));
|
|
68
|
+
this.renderRoot.querySelectorAll("[data-item]").forEach(control => {
|
|
69
|
+
const name = control.querySelector(".name");
|
|
70
|
+
const label = labels.get(control.dataset.item ?? "");
|
|
71
|
+
if (label && name && name.scrollWidth > name.clientWidth)
|
|
72
|
+
control.dataset.tooltip = label;
|
|
73
|
+
else
|
|
74
|
+
delete control.dataset.tooltip;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
request(name, detail) {
|
|
78
|
+
return this.dispatchEvent(new CustomEvent(`sidebar-${name}`, { detail, bubbles: true, composed: true, cancelable: true }));
|
|
79
|
+
}
|
|
80
|
+
toggle(item) {
|
|
81
|
+
if (item.disabled)
|
|
82
|
+
return;
|
|
83
|
+
this.request("toggle", { id: item.id, expanded: !item.expanded });
|
|
84
|
+
}
|
|
85
|
+
activate(event, item) {
|
|
86
|
+
if (item.disabled) {
|
|
87
|
+
event.preventDefault();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Let native links retain new-tab, download and context-menu behaviour.
|
|
91
|
+
if (item.href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0))
|
|
92
|
+
return;
|
|
93
|
+
if (!item.href && item.expanded !== undefined) {
|
|
94
|
+
this.toggle(item);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!this.request("activate", { id: item.id }))
|
|
98
|
+
event.preventDefault();
|
|
99
|
+
}
|
|
100
|
+
/** Moves the focus to a row after `updateComplete`. */
|
|
101
|
+
focusItem(id) {
|
|
102
|
+
const row = this.row(id);
|
|
103
|
+
if (!row)
|
|
104
|
+
return;
|
|
105
|
+
if (this.tree) {
|
|
106
|
+
this.focusId = id;
|
|
107
|
+
this.requestUpdate();
|
|
108
|
+
row.tabIndex = 0;
|
|
109
|
+
}
|
|
110
|
+
row.focus();
|
|
111
|
+
}
|
|
112
|
+
/** Scrolls the current destination, or the selected tree row, into view. */
|
|
113
|
+
scrollToCurrent() {
|
|
114
|
+
this.renderRoot.querySelector('[aria-current="page"], [aria-selected="true"]')?.scrollIntoView({ block: "nearest" });
|
|
115
|
+
}
|
|
116
|
+
/** The row a pointer or keyboard event happened on, for a context menu or a drag of the application's own. */
|
|
117
|
+
itemFromEvent(event) {
|
|
118
|
+
const row = event.composedPath().find((node) => node instanceof HTMLElement && node.dataset.item !== undefined && this.renderRoot.contains(node));
|
|
119
|
+
return row ? this.items.find(item => item.id === row.dataset.item) : undefined;
|
|
120
|
+
}
|
|
121
|
+
row(id) {
|
|
122
|
+
return [...this.renderRoot.querySelectorAll("[data-item]")].find(row => row.dataset.item === id);
|
|
123
|
+
}
|
|
124
|
+
/** A tree's Tab stop: the row last focused while it is still shown, else the selected row, else the first available. */
|
|
125
|
+
stop() {
|
|
126
|
+
const usable = this.items.filter(item => !item.disabled);
|
|
127
|
+
return usable.find(item => item.id === this.focusId)?.id ?? usable.find(item => item.selected)?.id ?? usable[0]?.id;
|
|
128
|
+
}
|
|
129
|
+
press(event, item) {
|
|
130
|
+
if (item.disabled)
|
|
131
|
+
return;
|
|
132
|
+
this.focusItem(item.id);
|
|
133
|
+
const disclosure = event.composedPath().some(node => node instanceof HTMLElement && node.classList.contains("disclosure"));
|
|
134
|
+
if (disclosure && item.expanded !== undefined)
|
|
135
|
+
this.request("toggle", { id: item.id, expanded: !item.expanded });
|
|
136
|
+
else
|
|
137
|
+
this.request("select", { id: item.id });
|
|
138
|
+
}
|
|
139
|
+
open(event, item) {
|
|
140
|
+
if (item.disabled || event.composedPath().some(node => node instanceof HTMLElement && node.classList.contains("disclosure")))
|
|
141
|
+
return;
|
|
142
|
+
this.request("activate", { id: item.id });
|
|
143
|
+
}
|
|
144
|
+
treeKeydown(event, item) {
|
|
145
|
+
if (event.altKey || event.ctrlKey || event.metaKey)
|
|
146
|
+
return;
|
|
147
|
+
const index = this.items.indexOf(item);
|
|
148
|
+
const step = treeStep(this.items.map(row => ({ level: Math.max(0, row.depth ?? 0) + 1, expanded: row.expanded, disabled: row.disabled, label: row.label })), index, event.key);
|
|
149
|
+
if (!step)
|
|
150
|
+
return;
|
|
151
|
+
event.preventDefault();
|
|
152
|
+
if (step.toggle !== undefined)
|
|
153
|
+
this.request("toggle", { id: item.id, expanded: step.toggle });
|
|
154
|
+
if (step.select)
|
|
155
|
+
this.request("select", { id: item.id });
|
|
156
|
+
if (step.activate)
|
|
157
|
+
this.request("activate", { id: item.id });
|
|
158
|
+
const target = step.focus === undefined ? undefined : this.items[step.focus];
|
|
159
|
+
if (target)
|
|
160
|
+
this.focusItem(target.id);
|
|
161
|
+
}
|
|
162
|
+
renderTree() {
|
|
163
|
+
const stop = this.stop();
|
|
164
|
+
// Each row's place among its siblings, for aria-setsize and aria-posinset.
|
|
165
|
+
const places = new Map();
|
|
166
|
+
const open = [];
|
|
167
|
+
for (const item of this.items) {
|
|
168
|
+
const depth = Math.max(0, item.depth ?? 0);
|
|
169
|
+
open.length = depth + 1;
|
|
170
|
+
const siblings = (open[depth] ?? (open[depth] = []));
|
|
171
|
+
siblings.push(item);
|
|
172
|
+
for (const [index, sibling] of siblings.entries())
|
|
173
|
+
places.set(sibling.id, [index + 1, siblings.length]);
|
|
174
|
+
}
|
|
175
|
+
return html `<slot name="header"></slot><div class="tree" role="tree" aria-label=${ifDefined(this.label || undefined)} part="tree">
|
|
176
|
+
${repeat(this.items, item => item.id, item => {
|
|
177
|
+
const depth = Math.max(0, item.depth ?? 0);
|
|
178
|
+
const [position, size] = places.get(item.id) ?? [1, 1];
|
|
179
|
+
return html `<div class="item" role="treeitem" data-item=${item.id}
|
|
180
|
+
aria-level=${depth + 1} aria-setsize=${size} aria-posinset=${position}
|
|
181
|
+
aria-expanded=${ifDefined(item.expanded === undefined ? undefined : String(item.expanded))}
|
|
182
|
+
aria-selected=${String(Boolean(item.selected))}
|
|
183
|
+
aria-disabled=${ifDefined(item.disabled ? "true" : undefined)}
|
|
184
|
+
tabindex=${item.id === stop ? 0 : -1}
|
|
185
|
+
style=${`--depth:${depth}`}
|
|
186
|
+
@click=${(event) => this.press(event, item)}
|
|
187
|
+
@dblclick=${(event) => this.open(event, item)}
|
|
188
|
+
@keydown=${(event) => this.treeKeydown(event, item)}
|
|
189
|
+
@focus=${() => { this.focusId = item.id; }}>
|
|
190
|
+
<span class="disclosure" aria-hidden="true">${item.expanded === undefined ? nothing : html `<ds-icon type="right" ?data-open=${item.expanded}></ds-icon>`}</span>
|
|
191
|
+
${item.icon ? html `<span class="icon" aria-hidden="true"><ds-icon type=${item.icon}></ds-icon></span>` : nothing}
|
|
192
|
+
<span class="label">${item.label}</span>
|
|
193
|
+
${item.meta ? html `<span class="meta">${item.meta}</span>` : nothing}
|
|
194
|
+
</div>`;
|
|
195
|
+
})}
|
|
196
|
+
${this.items.length ? nothing : html `<p class="empty" role="status">${this.empty}</p>`}
|
|
197
|
+
</div><slot name="footer"></slot>`;
|
|
198
|
+
}
|
|
199
|
+
canMove(item) {
|
|
200
|
+
return Boolean(this.reorderable && !this.tree && item && !item.disabled && item.reorderable !== false);
|
|
201
|
+
}
|
|
202
|
+
parent(item) {
|
|
203
|
+
const depth = item.depth ?? 0;
|
|
204
|
+
return this.items.slice(0, this.items.indexOf(item)).reverse().find(row => (row.depth ?? 0) < depth)?.id;
|
|
205
|
+
}
|
|
206
|
+
moveAllowed(source, target) {
|
|
207
|
+
return this.canMove(source) && this.canMove(target) && source.id !== target.id &&
|
|
208
|
+
(source.depth ?? 0) === (target.depth ?? 0) && this.parent(source) === this.parent(target);
|
|
209
|
+
}
|
|
210
|
+
clearDrag() {
|
|
211
|
+
this.dragId = undefined;
|
|
212
|
+
this.renderRoot.querySelectorAll("[data-drop]").forEach(row => row.removeAttribute("data-drop"));
|
|
213
|
+
}
|
|
214
|
+
dragStart(event, item) {
|
|
215
|
+
if (!this.canMove(item) || !event.dataTransfer || event.composedPath().some(node => node instanceof HTMLElement && (node.classList.contains("action") || node.classList.contains("disclosure")))) {
|
|
216
|
+
event.preventDefault();
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
this.dragId = item.id;
|
|
220
|
+
event.dataTransfer.effectAllowed = "move";
|
|
221
|
+
event.dataTransfer.setData("text/plain", item.id);
|
|
222
|
+
}
|
|
223
|
+
dragOver(event, target) {
|
|
224
|
+
this.renderRoot.querySelectorAll("[data-drop]").forEach(row => row.removeAttribute("data-drop"));
|
|
225
|
+
if (!this.moveAllowed(this.items.find(item => item.id === this.dragId), target))
|
|
226
|
+
return;
|
|
227
|
+
event.preventDefault();
|
|
228
|
+
if (event.dataTransfer)
|
|
229
|
+
event.dataTransfer.dropEffect = "move";
|
|
230
|
+
const row = event.currentTarget;
|
|
231
|
+
const bounds = row.getBoundingClientRect();
|
|
232
|
+
row.dataset.drop = event.clientY < bounds.top + bounds.height / 2 ? "before" : "after";
|
|
233
|
+
}
|
|
234
|
+
drop(event, target) {
|
|
235
|
+
const source = this.items.find(item => item.id === this.dragId);
|
|
236
|
+
const position = event.currentTarget.dataset.drop;
|
|
237
|
+
if (this.moveAllowed(source, target) && (position === "before" || position === "after")) {
|
|
238
|
+
event.preventDefault();
|
|
239
|
+
this.request("move", { id: source.id, targetId: target.id, position });
|
|
240
|
+
}
|
|
241
|
+
this.clearDrag();
|
|
242
|
+
}
|
|
243
|
+
navigate(event, item) {
|
|
244
|
+
if (event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey && this.canMove(item) && (event.key === "ArrowUp" || event.key === "ArrowDown")) {
|
|
245
|
+
event.preventDefault();
|
|
246
|
+
const siblings = this.items.filter(row => this.moveAllowed(item, row) || row.id === item.id);
|
|
247
|
+
const target = siblings[siblings.indexOf(item) + (event.key === "ArrowUp" ? -1 : 1)];
|
|
248
|
+
if (target)
|
|
249
|
+
this.request("move", { id: item.id, targetId: target.id, position: event.key === "ArrowUp" ? "before" : "after" });
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
|
|
253
|
+
return;
|
|
254
|
+
const index = this.items.indexOf(item);
|
|
255
|
+
let target;
|
|
256
|
+
const available = this.items.filter(row => !row.disabled);
|
|
257
|
+
const position = available.indexOf(item);
|
|
258
|
+
if (event.key === "ArrowDown")
|
|
259
|
+
target = available[Math.min(position + 1, available.length - 1)];
|
|
260
|
+
else if (event.key === "ArrowUp")
|
|
261
|
+
target = available[Math.max(position - 1, 0)];
|
|
262
|
+
else if (event.key === "Home")
|
|
263
|
+
target = available[0];
|
|
264
|
+
else if (event.key === "End")
|
|
265
|
+
target = available[available.length - 1];
|
|
266
|
+
else if (event.key === "ArrowRight") {
|
|
267
|
+
if (item.expanded === false)
|
|
268
|
+
this.toggle(item);
|
|
269
|
+
else if (item.expanded && (this.items[index + 1]?.depth ?? 0) > (item.depth ?? 0))
|
|
270
|
+
target = this.items[index + 1];
|
|
271
|
+
}
|
|
272
|
+
else if (event.key === "ArrowLeft") {
|
|
273
|
+
if (item.expanded)
|
|
274
|
+
this.toggle(item);
|
|
275
|
+
else
|
|
276
|
+
target = this.items.slice(0, index).reverse().find(row => (row.depth ?? 0) < (item.depth ?? 0) && !row.disabled);
|
|
277
|
+
}
|
|
278
|
+
else
|
|
279
|
+
return;
|
|
280
|
+
event.preventDefault();
|
|
281
|
+
if (target && !target.disabled)
|
|
282
|
+
this.focusItem(target.id);
|
|
283
|
+
}
|
|
284
|
+
renderDisclosure(item) {
|
|
285
|
+
return item.expanded !== undefined ? html `
|
|
286
|
+
<ds-button control="slotted" icon class="disclosure" ?disabled=${item.disabled}>
|
|
287
|
+
<button type="button" aria-label=${`${item.expanded ? "Collapse" : "Expand"} ${item.label}`}
|
|
288
|
+
aria-expanded=${item.expanded} @click=${() => this.toggle(item)}>
|
|
289
|
+
<ds-icon type=${(item.expanded ? this.collapseIcon : this.expandIcon) || "right"} aria-hidden="true" ?data-open=${item.expanded && !this.collapseIcon}></ds-icon>
|
|
290
|
+
</button>
|
|
291
|
+
</ds-button>` : nothing;
|
|
292
|
+
}
|
|
293
|
+
render() {
|
|
294
|
+
if (this.tree)
|
|
295
|
+
return this.renderTree();
|
|
296
|
+
return html `<slot name="header"></slot><nav aria-label=${this.label}>
|
|
297
|
+
${repeat(this.items, item => item.id, item => html `
|
|
298
|
+
<ds-row class="row" ?data-current=${item.current} ?data-disabled=${item.disabled}
|
|
299
|
+
style=${`--depth:${Math.max(0, item.depth ?? 0)}`}
|
|
300
|
+
draggable=${this.canMove(item) ? "true" : "false"}
|
|
301
|
+
@dragstart=${(event) => this.dragStart(event, item)}
|
|
302
|
+
@dragover=${(event) => this.dragOver(event, item)}
|
|
303
|
+
@dragleave=${(event) => { if (!event.currentTarget.contains(event.relatedTarget))
|
|
304
|
+
event.currentTarget.removeAttribute("data-drop"); }}
|
|
305
|
+
@drop=${(event) => this.drop(event, item)}
|
|
306
|
+
@dragend=${() => this.clearDrag()}>
|
|
307
|
+
${this.disclosurePosition === "start" ? this.renderDisclosure(item) : nothing}
|
|
308
|
+
<ds-button control="slotted" class="choice" ?disabled=${item.disabled}>
|
|
309
|
+
${item.href && !item.disabled ? html `
|
|
310
|
+
<a href=${item.href} draggable=${ifDefined(this.reorderable ? "false" : undefined)} data-item=${item.id} aria-current=${ifDefined(item.current ? "page" : undefined)}
|
|
311
|
+
@click=${(event) => this.activate(event, item)}
|
|
312
|
+
@keydown=${(event) => this.navigate(event, item)}><span class="name">${item.icon ? html `<ds-icon type=${item.icon} aria-hidden="true"></ds-icon>` : nothing}${item.label}</span></a>` : html `
|
|
313
|
+
<button type="button" data-item=${item.id} ?disabled=${item.disabled}
|
|
314
|
+
aria-expanded=${ifDefined(item.expanded === undefined ? undefined : String(item.expanded))}
|
|
315
|
+
aria-current=${ifDefined(item.current ? "page" : undefined)}
|
|
316
|
+
@click=${(event) => this.activate(event, item)}
|
|
317
|
+
@keydown=${(event) => this.navigate(event, item)}><span class="name">${item.icon ? html `<ds-icon type=${item.icon} aria-hidden="true"></ds-icon>` : nothing}${item.label}</span></button>`}
|
|
318
|
+
</ds-button>
|
|
319
|
+
${this.disclosurePosition !== "start" ? this.renderDisclosure(item) : nothing}
|
|
320
|
+
<span class="spacer" aria-hidden="true"></span>
|
|
321
|
+
${item.meta ? html `<span class="meta">${item.meta}</span>` : nothing}
|
|
322
|
+
${item.action ? html `<ds-button control="slotted" ?fit=${!item.action.icon} ?icon=${Boolean(item.action.icon)} class="action" ?disabled=${item.disabled || item.action.disabled}><button type="button"
|
|
323
|
+
aria-label=${`${item.action.label}: ${item.label}`}
|
|
324
|
+
@click=${() => { if (!item.disabled && !item.action?.disabled)
|
|
325
|
+
this.request("action", { id: item.id, action: item.action.id }); }}>${item.action.icon ? html `<ds-icon type=${item.action.icon} aria-hidden="true"></ds-icon>` : item.action.label}</button></ds-button>` : nothing}
|
|
326
|
+
</ds-row>`)}
|
|
327
|
+
${this.items.length ? nothing : html `<p class="empty" role="status">${this.empty}</p>`}
|
|
328
|
+
</nav><slot name="footer"></slot>`;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
Sidebar.properties = {
|
|
332
|
+
items: { attribute: false },
|
|
333
|
+
label: { type: String },
|
|
334
|
+
empty: { type: String },
|
|
335
|
+
expandIcon: { type: String, attribute: "expand-icon" },
|
|
336
|
+
collapseIcon: { type: String, attribute: "collapse-icon" },
|
|
337
|
+
disclosurePosition: { type: String, attribute: "disclosure-position", reflect: true },
|
|
338
|
+
tree: { type: Boolean, reflect: true },
|
|
339
|
+
reorderable: { type: Boolean, reflect: true },
|
|
340
|
+
};
|
|
341
|
+
Sidebar.styles = unsafeCSS(styles);
|
|
342
|
+
define("ds-sidebar", Sidebar);
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { LitElement } from "lit";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
/** A column: the key it reads from each row, its header, and whether it holds numbers. */
|
|
3
|
+
export interface TableColumn {
|
|
4
|
+
key: string;
|
|
5
|
+
label: string;
|
|
6
|
+
/** Sets the column to its end in tabular figures. Unset, a column of numbers is numeric. */
|
|
7
|
+
numeric?: boolean;
|
|
7
8
|
}
|
|
9
|
+
/** A row: values by column key, or by column position. */
|
|
10
|
+
export type TableRow = Record<string, unknown> | readonly unknown[];
|
|
8
11
|
export declare class DsTable extends LitElement {
|
|
9
12
|
static properties: {
|
|
10
13
|
data: {
|
|
@@ -13,16 +16,31 @@ export declare class DsTable extends LitElement {
|
|
|
13
16
|
columns: {
|
|
14
17
|
type: ArrayConstructor;
|
|
15
18
|
};
|
|
16
|
-
|
|
19
|
+
footer: {
|
|
20
|
+
type: ObjectConstructor;
|
|
21
|
+
};
|
|
22
|
+
sticky: {
|
|
17
23
|
type: BooleanConstructor;
|
|
18
|
-
|
|
24
|
+
reflect: boolean;
|
|
25
|
+
};
|
|
26
|
+
label: {
|
|
27
|
+
type: StringConstructor;
|
|
19
28
|
};
|
|
20
29
|
};
|
|
30
|
+
/** The body rows. */
|
|
21
31
|
data: TableRow[];
|
|
22
|
-
columns
|
|
23
|
-
|
|
32
|
+
/** Headers as labels (`"Users"` reads `users`) or columns; unset, the first row's keys. */
|
|
33
|
+
columns: (string | TableColumn)[];
|
|
34
|
+
/** A totals row under the body. */
|
|
35
|
+
footer: TableRow | undefined;
|
|
36
|
+
/** Keeps the first column in place while the table scrolls sideways. */
|
|
37
|
+
sticky: boolean;
|
|
38
|
+
/** The table's accessible name. */
|
|
39
|
+
label: string | undefined;
|
|
24
40
|
constructor();
|
|
25
|
-
static styles: import("lit").CSSResult;
|
|
41
|
+
static styles: import("lit").CSSResult[];
|
|
42
|
+
private resolvedColumns;
|
|
43
|
+
private row;
|
|
26
44
|
render(): import("lit").TemplateResult<1>;
|
|
27
45
|
}
|
|
28
46
|
declare global {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ds-table.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-table.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ds-table.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-table.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAA4B,MAAM,KAAK,CAAC;AAK3D,0FAA0F;AAC1F,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,4FAA4F;IAC5F,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,OAAO,EAAE,CAAC;AAKpE,qBAAa,OAAQ,SAAQ,UAAU;IACrC,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;MAMf;IAEF,qBAAqB;IACb,IAAI,EAAE,QAAQ,EAAE,CAAC;IACzB,2FAA2F;IACnF,OAAO,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC;IAC1C,mCAAmC;IAC3B,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC,wEAAwE;IAChE,MAAM,EAAE,OAAO,CAAC;IACxB,mCAAmC;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;;IASlC,MAAM,CAAC,MAAM,4BAA6D;IAE1E,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,GAAG;IASX,MAAM;CAcP;AAaD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}
|