@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,263 @@
|
|
|
1
|
+
// calendar-base.ts
|
|
2
|
+
// What ds-calendar and ds-calendar-large share: the days a person may reach,
|
|
3
|
+
// today, the selected day, the week's start, events, words in the current
|
|
4
|
+
// language and the grid's keys. Each element draws its own grid; the month
|
|
5
|
+
// calendar lays weeks in rows, the large calendar weeks in columns, and the
|
|
6
|
+
// keys follow the drawing.
|
|
7
|
+
|
|
8
|
+
import { LitElement, type PropertyValues } from "lit";
|
|
9
|
+
import { getText } from "../0-face/i18n";
|
|
10
|
+
import {
|
|
11
|
+
addDays,
|
|
12
|
+
addMonths,
|
|
13
|
+
clampDay,
|
|
14
|
+
dayLabel,
|
|
15
|
+
firstWeekday,
|
|
16
|
+
isDay,
|
|
17
|
+
readWeekday,
|
|
18
|
+
today,
|
|
19
|
+
weekdayOf,
|
|
20
|
+
type CalendarEvent,
|
|
21
|
+
type Day,
|
|
22
|
+
type Weekday,
|
|
23
|
+
} from "../0-face/calendar";
|
|
24
|
+
|
|
25
|
+
export type { CalendarEvent, Day } from "../0-face/calendar";
|
|
26
|
+
|
|
27
|
+
/** Detail of `day-press`: the day and the events on it. Cancel it to keep a selectable calendar's value. */
|
|
28
|
+
export interface CalendarDayDetail {
|
|
29
|
+
day: Day;
|
|
30
|
+
events: CalendarEvent[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Detail of `event-press`: the event and the day it was pressed on. */
|
|
34
|
+
export interface CalendarEventDetail {
|
|
35
|
+
event: CalendarEvent;
|
|
36
|
+
day: Day;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Detail of `change`: the value a person chose and the one before it. In a
|
|
41
|
+
* range, `value` is `start/end` once both are chosen and the start alone
|
|
42
|
+
* while the end is still to come.
|
|
43
|
+
*/
|
|
44
|
+
export interface CalendarChangeDetail {
|
|
45
|
+
value: string;
|
|
46
|
+
previous: string;
|
|
47
|
+
start: Day;
|
|
48
|
+
end: Day;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** A value read as a range: `2026-10-21/2026-10-24`, or one day as both ends. Times after a `T` are left off. */
|
|
52
|
+
export function readRange(value: string | null | undefined): { start: Day; end: Day } {
|
|
53
|
+
const [first = "", second = ""] = (value ?? "").split("/").map(part => part.trim().slice(0, 10));
|
|
54
|
+
const start = isDay(first) ? first : "";
|
|
55
|
+
const end = isDay(second) ? second : "";
|
|
56
|
+
if (start && end && end < start) return { start: end, end: start };
|
|
57
|
+
return { start, end };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Detail of `navigate`: the first month now shown, `YYYY-MM`. */
|
|
61
|
+
export interface CalendarNavigateDetail {
|
|
62
|
+
month: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** A month written `YYYY-MM` or a day in it, as the first of that month; `null` for anything else. */
|
|
66
|
+
export function readMonth(value: string | null | undefined): Day | null {
|
|
67
|
+
const text = value?.trim() ?? "";
|
|
68
|
+
const day = /^\d{4}-\d{2}$/.test(text) ? `${text}-01` : text;
|
|
69
|
+
return isDay(day) ? `${day.slice(0, 8)}01` : null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export abstract class CalendarBase extends LitElement {
|
|
73
|
+
static properties = {
|
|
74
|
+
value: { type: String, reflect: true },
|
|
75
|
+
min: { type: String },
|
|
76
|
+
max: { type: String },
|
|
77
|
+
today: { type: String },
|
|
78
|
+
weekStart: { type: String, attribute: "week-start" },
|
|
79
|
+
selectable: { type: Boolean, reflect: true },
|
|
80
|
+
range: { type: Boolean, reflect: true },
|
|
81
|
+
label: { type: String },
|
|
82
|
+
literal: { type: Boolean, reflect: true },
|
|
83
|
+
events: { attribute: false },
|
|
84
|
+
focusDay: { state: true },
|
|
85
|
+
hoverDay: { state: true },
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/** The selected day, `YYYY-MM-DD`, or with `range` the days `YYYY-MM-DD/YYYY-MM-DD`; empty for none. */
|
|
89
|
+
declare value: string;
|
|
90
|
+
/** The first day a person may choose. */
|
|
91
|
+
declare min: string | undefined;
|
|
92
|
+
/** The last day a person may choose. */
|
|
93
|
+
declare max: string | undefined;
|
|
94
|
+
/** The day drawn as today; the reader's own today when left out. */
|
|
95
|
+
declare today: string | undefined;
|
|
96
|
+
/** The first day of the week: `0`–`6` from Sunday, or a day's English name; the language's own when left out. */
|
|
97
|
+
declare weekStart: string | undefined;
|
|
98
|
+
/** Pressing a day selects it and fires `change`. */
|
|
99
|
+
declare selectable: boolean;
|
|
100
|
+
/** A selectable calendar chooses a first and a last day. */
|
|
101
|
+
declare range: boolean;
|
|
102
|
+
/** The grid's name: a translation key, or literal words. The month's name when left out. */
|
|
103
|
+
declare label: string | undefined;
|
|
104
|
+
/** Show `label` as written, never looked up. */
|
|
105
|
+
declare literal: boolean;
|
|
106
|
+
/** What happens on the days. */
|
|
107
|
+
declare events: CalendarEvent[];
|
|
108
|
+
/** The day that holds the grid's one Tab stop. */
|
|
109
|
+
declare focusDay: Day | undefined;
|
|
110
|
+
/** The day under the pointer, which previews a range's end. */
|
|
111
|
+
declare hoverDay: Day | undefined;
|
|
112
|
+
|
|
113
|
+
/** Weeks run along rows (a month) or along columns (the large calendar). */
|
|
114
|
+
protected abstract readonly weeksRun: "rows" | "columns";
|
|
115
|
+
|
|
116
|
+
private readonly relabel = () => this.requestUpdate();
|
|
117
|
+
|
|
118
|
+
constructor() {
|
|
119
|
+
super();
|
|
120
|
+
this.value = "";
|
|
121
|
+
this.selectable = false;
|
|
122
|
+
this.range = false;
|
|
123
|
+
this.literal = false;
|
|
124
|
+
this.events = [];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
connectedCallback() {
|
|
128
|
+
super.connectedCallback();
|
|
129
|
+
window.addEventListener("language-changed", this.relabel);
|
|
130
|
+
window.addEventListener("translations-loaded", this.relabel);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
disconnectedCallback() {
|
|
134
|
+
window.removeEventListener("language-changed", this.relabel);
|
|
135
|
+
window.removeEventListener("translations-loaded", this.relabel);
|
|
136
|
+
super.disconnectedCallback();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
protected willUpdate(changed: PropertyValues<this>) {
|
|
140
|
+
super.willUpdate(changed);
|
|
141
|
+
if (changed.has("value") && this.value && !readRange(this.value).start) this.value = "";
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Shared words, filled in: `words("Week {week}", { week: 42 })`. */
|
|
145
|
+
protected words(key: string, params?: Record<string, string | number>): string {
|
|
146
|
+
const text = getText(key, params) || key;
|
|
147
|
+
return params ? text.replace(/\{\{?(\w+)\}?\}/g, (whole, name: string) => (name in params ? String(params[name]) : whole)) : text;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** The page's name for the grid, or `fallback`. */
|
|
151
|
+
protected nameOr(fallback: string): string {
|
|
152
|
+
if (!this.label) return fallback;
|
|
153
|
+
return this.literal ? this.label : getText(this.label) || this.label;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
protected get firstDay(): Weekday {
|
|
157
|
+
return readWeekday(this.weekStart) ?? firstWeekday();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
protected get todayDay(): Day {
|
|
161
|
+
return isDay(this.today) ? this.today : today();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
protected get minDay(): Day | undefined {
|
|
165
|
+
return isDay(this.min) ? this.min : undefined;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
protected get maxDay(): Day | undefined {
|
|
169
|
+
return isDay(this.max) ? this.max : undefined;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Whether a person may choose the day. */
|
|
173
|
+
protected allowed(day: Day): boolean {
|
|
174
|
+
return clampDay(day, this.minDay, this.maxDay) === day;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** The chosen days: the first and the last of a range, or the one day twice. */
|
|
178
|
+
protected get chosen(): { start: Day; end: Day } {
|
|
179
|
+
const { start, end } = readRange(this.value);
|
|
180
|
+
return this.range ? { start, end } : { start, end: start };
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** How a day stands to the selection: an end of it, inside it, or neither; with the end still to come, the pointer previews it. */
|
|
184
|
+
protected selection(day: Day): { selected: boolean; inside: boolean; first: boolean; last: boolean } {
|
|
185
|
+
let { start, end } = this.chosen;
|
|
186
|
+
if (this.range && start && !end && this.hoverDay) end = this.hoverDay;
|
|
187
|
+
if (end && end < start) [start, end] = [end, start];
|
|
188
|
+
const selected = day === start || day === end;
|
|
189
|
+
const spans = Boolean(this.range && start && end && start !== end);
|
|
190
|
+
return { selected, inside: spans && day > start && day < end, first: spans && day === start, last: spans && day === end };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** What a day's cell is called: the whole date, then what is on it. */
|
|
194
|
+
protected cellLabel(day: Day, events: readonly CalendarEvent[]): string {
|
|
195
|
+
return [dayLabel(day), ...events.map(event => (event.time ? `${event.time} ${event.title}` : event.title))].join(", ");
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** The day a key moves to from `from`, or `null` for a key the grid leaves alone. */
|
|
199
|
+
protected keyTarget(event: KeyboardEvent, from: Day): Day | null {
|
|
200
|
+
const rtl = getComputedStyle(this).direction === "rtl";
|
|
201
|
+
const across = this.weeksRun === "rows" ? 1 : 7;
|
|
202
|
+
const down = this.weeksRun === "rows" ? 7 : 1;
|
|
203
|
+
const start = (weekdayOf(from) - this.firstDay + 7) % 7;
|
|
204
|
+
switch (event.key) {
|
|
205
|
+
case "ArrowRight": return addDays(from, rtl ? -across : across);
|
|
206
|
+
case "ArrowLeft": return addDays(from, rtl ? across : -across);
|
|
207
|
+
case "ArrowDown": return addDays(from, down);
|
|
208
|
+
case "ArrowUp": return addDays(from, -down);
|
|
209
|
+
case "Home": return addDays(from, -start);
|
|
210
|
+
case "End": return addDays(from, 6 - start);
|
|
211
|
+
case "PageUp": return addMonths(from, event.shiftKey ? -12 : -1);
|
|
212
|
+
case "PageDown": return addMonths(from, event.shiftKey ? 12 : 1);
|
|
213
|
+
default: return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/** The events a day holds, for `day-press`. */
|
|
218
|
+
protected abstract eventsOn(day: Day): CalendarEvent[];
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* A person pressed a day: `day-press` fires, and unless it is cancelled a
|
|
222
|
+
* selectable calendar takes the day and fires `change`.
|
|
223
|
+
*/
|
|
224
|
+
protected press(day: Day) {
|
|
225
|
+
const pressed = new CustomEvent<CalendarDayDetail>("day-press", {
|
|
226
|
+
bubbles: true,
|
|
227
|
+
composed: true,
|
|
228
|
+
cancelable: true,
|
|
229
|
+
detail: { day, events: this.eventsOn(day) },
|
|
230
|
+
});
|
|
231
|
+
if (!this.dispatchEvent(pressed) || !this.selectable || !this.allowed(day)) return;
|
|
232
|
+
const previous = this.value || "";
|
|
233
|
+
let value: string = day;
|
|
234
|
+
if (this.range) {
|
|
235
|
+
// The first press starts a range, the second ends it (either way round); a third starts again.
|
|
236
|
+
const { start, end } = readRange(previous);
|
|
237
|
+
if (start && !end) value = day < start ? `${day}/${start}` : `${start}/${day}`;
|
|
238
|
+
}
|
|
239
|
+
this.focusDay = day;
|
|
240
|
+
if (value === previous) return;
|
|
241
|
+
this.value = value;
|
|
242
|
+
this.hoverDay = undefined;
|
|
243
|
+
const { start, end } = readRange(value);
|
|
244
|
+
this.dispatchEvent(new CustomEvent<CalendarChangeDetail>("change", { bubbles: true, composed: true, detail: { value, previous, start, end: this.range ? end : start } }));
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
protected pressEvent(event: CalendarEvent, day: Day) {
|
|
248
|
+
this.dispatchEvent(new CustomEvent<CalendarEventDetail>("event-press", { bubbles: true, composed: true, detail: { event, day } }));
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
protected announceMonth(month: Day) {
|
|
252
|
+
this.dispatchEvent(new CustomEvent<CalendarNavigateDetail>("navigate", { bubbles: true, composed: true, detail: { month: month.slice(0, 7) } }));
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/** Puts keyboard focus on a drawn day once the grid has drawn it. */
|
|
256
|
+
protected async focusCell(day: Day) {
|
|
257
|
+
this.focusDay = day;
|
|
258
|
+
await this.updateComplete;
|
|
259
|
+
const cell = this.renderRoot.querySelector<HTMLElement>(`[data-day="${day}"]`);
|
|
260
|
+
cell?.focus({ preventScroll: true });
|
|
261
|
+
cell?.scrollIntoView?.({ block: "nearest", inline: "nearest" });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
@@ -12,6 +12,9 @@ import styles from "./styles/ds-accordion.css?inline";
|
|
|
12
12
|
* Usage (with translation text):
|
|
13
13
|
* <ds-accordion summary="How it began" details="Designed in Hokkaido"></ds-accordion>
|
|
14
14
|
*
|
|
15
|
+
* Usage (with text someone wrote, shown as it stands and never translated):
|
|
16
|
+
* <ds-accordion literal summary="Ideas for spring" details="Plant the bulbs"></ds-accordion>
|
|
17
|
+
*
|
|
15
18
|
* Usage (with slotted details content):
|
|
16
19
|
* <ds-accordion summary="How it began">
|
|
17
20
|
* <div slot="details">Rich HTML content here</div>
|
|
@@ -21,6 +24,7 @@ export class Accordion extends LitElement {
|
|
|
21
24
|
static properties = {
|
|
22
25
|
summary: { type: String },
|
|
23
26
|
details: { type: String },
|
|
27
|
+
literal: { type: Boolean, reflect: true },
|
|
24
28
|
open: { type: Boolean, reflect: true },
|
|
25
29
|
control: { type: String, reflect: true },
|
|
26
30
|
_hasSlottedContent: { type: Boolean, state: true },
|
|
@@ -28,6 +32,8 @@ export class Accordion extends LitElement {
|
|
|
28
32
|
|
|
29
33
|
declare summary: string;
|
|
30
34
|
declare details: string;
|
|
35
|
+
/** The summary and details are what someone wrote, not translation keys. */
|
|
36
|
+
declare literal: boolean;
|
|
31
37
|
declare open: boolean;
|
|
32
38
|
declare control: string;
|
|
33
39
|
declare _hasSlottedContent: boolean;
|
|
@@ -36,6 +42,7 @@ export class Accordion extends LitElement {
|
|
|
36
42
|
super();
|
|
37
43
|
this.summary = "";
|
|
38
44
|
this.details = "";
|
|
45
|
+
this.literal = false;
|
|
39
46
|
this.open = false;
|
|
40
47
|
this.control = "native";
|
|
41
48
|
this._hasSlottedContent = false;
|
|
@@ -80,7 +87,7 @@ export class Accordion extends LitElement {
|
|
|
80
87
|
<details ?open=${this.open}>
|
|
81
88
|
<summary>
|
|
82
89
|
<ds-row class="summaryRow" centered>
|
|
83
|
-
<ds-text .text=${this.summary}></ds-text>
|
|
90
|
+
<ds-text .text=${this.summary} ?literal=${this.literal}></ds-text>
|
|
84
91
|
<ds-icon class="chevron" aria-hidden="true">
|
|
85
92
|
<svg
|
|
86
93
|
viewBox="0 0 10.157 8.219"
|
|
@@ -103,6 +110,7 @@ export class Accordion extends LitElement {
|
|
|
103
110
|
? html`<ds-text
|
|
104
111
|
class="detailsText"
|
|
105
112
|
.text=${this.details}
|
|
113
|
+
?literal=${this.literal}
|
|
106
114
|
></ds-text>`
|
|
107
115
|
: ""}
|
|
108
116
|
</div>
|
|
@@ -10,6 +10,7 @@ export class AvatarGroup extends LitElement {
|
|
|
10
10
|
hasLead: { state: true },
|
|
11
11
|
hasMembers: { state: true },
|
|
12
12
|
};
|
|
13
|
+
/** Avatars have one size; `compact` is kept for products that still name it. */
|
|
13
14
|
declare size: "default" | "compact";
|
|
14
15
|
declare vertical: boolean;
|
|
15
16
|
declare private hasLead: boolean;
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
// ds-calendar-large.ts
|
|
2
|
+
// Months side by side as squares: a week to a column, the seven days down it,
|
|
3
|
+
// drawn one and a half times the grid (a square of 30px, lines of 1.5px)
|
|
4
|
+
// inside a rounded frame that scrolls sideways. A day on which something
|
|
5
|
+
// happens is filled with its colour, split into bands when several share it;
|
|
6
|
+
// a date is written only on today and where an event starts or ends.
|
|
7
|
+
|
|
8
|
+
import { html, nothing, unsafeCSS, type PropertyValues } from "lit";
|
|
9
|
+
import { define } from "../0-face/define";
|
|
10
|
+
import {
|
|
11
|
+
addDays,
|
|
12
|
+
addMonths,
|
|
13
|
+
dateNumber,
|
|
14
|
+
eventsByDay,
|
|
15
|
+
monthName,
|
|
16
|
+
monthTitle,
|
|
17
|
+
startOfMonth,
|
|
18
|
+
weekdayNames,
|
|
19
|
+
weekdayOf,
|
|
20
|
+
type CalendarEvent,
|
|
21
|
+
type Day,
|
|
22
|
+
} from "../0-face/calendar";
|
|
23
|
+
import { CalendarBase, readMonth } from "./calendar-base";
|
|
24
|
+
import "../2-core/ds-icon";
|
|
25
|
+
import metrics from "../1-root/component-metrics.css?inline";
|
|
26
|
+
import controls from "../1-root/controls.css?inline";
|
|
27
|
+
import styles from "./styles/ds-calendar-large.css?inline";
|
|
28
|
+
|
|
29
|
+
export * from "./calendar-base";
|
|
30
|
+
|
|
31
|
+
/** The fill for a day: one colour, or bands side by side. */
|
|
32
|
+
function fillOf(events: readonly CalendarEvent[]): string | undefined {
|
|
33
|
+
if (!events.length) return undefined;
|
|
34
|
+
const colours = [...new Set(events.map(event => event.color || "var(--ds-calendar-event-fill)"))];
|
|
35
|
+
if (colours.length === 1) return colours[0];
|
|
36
|
+
const share = 100 / colours.length;
|
|
37
|
+
return `linear-gradient(90deg, ${colours.map((colour, index) => `${colour} ${index * share}% ${(index + 1) * share}%`).join(", ")})`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @element ds-calendar-large
|
|
42
|
+
* @prop {string} start - The first month drawn, `YYYY-MM`; the month before
|
|
43
|
+
* today's by default.
|
|
44
|
+
* @prop {number} months - How many months are drawn: 6 by default.
|
|
45
|
+
* @prop {number} scale - How many times the grid it is drawn: 1.5 by default.
|
|
46
|
+
* @prop {string} value - The selected day, `YYYY-MM-DD`.
|
|
47
|
+
* @prop {boolean} selectable - Pressing a day selects it and fires `change`.
|
|
48
|
+
* @prop {boolean} noHeader - Leave out the title and arrows (`no-header`).
|
|
49
|
+
* @prop {string} min - The first day a person may choose.
|
|
50
|
+
* @prop {string} max - The last day a person may choose.
|
|
51
|
+
* @prop {string} weekStart - The week's first day (`week-start`); the
|
|
52
|
+
* language's own by default.
|
|
53
|
+
* @prop {string} today - The day drawn as today; the reader's own by default.
|
|
54
|
+
* @prop {CalendarEvent[]} events - What happens on the days (property only).
|
|
55
|
+
*
|
|
56
|
+
* @fires day-press - A day was pressed or chosen with Enter or Space; `{ day, events }`.
|
|
57
|
+
* @fires change - A person selected a day; `{ value, previous }`.
|
|
58
|
+
* @fires navigate - The months drawn moved on or back; `{ month }`, the first one.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* <ds-calendar-large start="2026-09" months="6"></ds-calendar-large>
|
|
62
|
+
*/
|
|
63
|
+
export class CalendarLarge extends CalendarBase {
|
|
64
|
+
static properties = {
|
|
65
|
+
...CalendarBase.properties,
|
|
66
|
+
start: { type: String, reflect: true },
|
|
67
|
+
months: { type: Number },
|
|
68
|
+
scale: { type: Number },
|
|
69
|
+
noHeader: { type: Boolean, attribute: "no-header", reflect: true },
|
|
70
|
+
visible: { state: true },
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
static styles = [unsafeCSS(metrics), unsafeCSS(controls), unsafeCSS(styles)];
|
|
74
|
+
|
|
75
|
+
declare start: string | undefined;
|
|
76
|
+
declare months: number | undefined;
|
|
77
|
+
declare scale: number | undefined;
|
|
78
|
+
declare noHeader: boolean;
|
|
79
|
+
/** The month at the start of the view, named in the title. */
|
|
80
|
+
declare visible: Day | undefined;
|
|
81
|
+
|
|
82
|
+
protected readonly weeksRun = "columns" as const;
|
|
83
|
+
|
|
84
|
+
private byDay = new Map<Day, CalendarEvent[]>();
|
|
85
|
+
private placed = false;
|
|
86
|
+
private frame = 0;
|
|
87
|
+
|
|
88
|
+
constructor() {
|
|
89
|
+
super();
|
|
90
|
+
this.noHeader = false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** The first of the first month drawn. */
|
|
94
|
+
get firstMonth(): Day {
|
|
95
|
+
return readMonth(this.start) ?? addMonths(startOfMonth(this.todayDay), -1);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private get monthCount() {
|
|
99
|
+
const count = this.months;
|
|
100
|
+
return typeof count === "number" && Number.isFinite(count) ? Math.max(1, Math.min(36, Math.floor(count))) : 6;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** The first day of each week drawn, from the week holding the first month's first day. */
|
|
104
|
+
private get weekStarts(): Day[] {
|
|
105
|
+
const first = this.firstMonth;
|
|
106
|
+
const from = addDays(first, -((weekdayOf(first) - this.firstDay + 7) % 7));
|
|
107
|
+
const last = addDays(addMonths(first, this.monthCount), -1);
|
|
108
|
+
const weeks: Day[] = [];
|
|
109
|
+
for (let day = from; day <= last; day = addDays(day, 7)) weeks.push(day);
|
|
110
|
+
return weeks;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private get lastDay(): Day {
|
|
114
|
+
return addDays(this.weekStarts.at(-1)!, 6);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
protected eventsOn(day: Day): CalendarEvent[] {
|
|
118
|
+
return this.byDay.get(day) ?? [];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
protected willUpdate(changed: PropertyValues<this>) {
|
|
122
|
+
super.willUpdate(changed);
|
|
123
|
+
const scale = typeof this.scale === "number" && Number.isFinite(this.scale) && this.scale > 0 ? this.scale : 1.5;
|
|
124
|
+
this.style.setProperty("--ds-calendar-scale", String(scale));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
protected firstUpdated() {
|
|
128
|
+
// Open on today's month when it is drawn, else on the first.
|
|
129
|
+
const today = this.todayDay;
|
|
130
|
+
this.scrollToDay(today >= this.weekStarts[0] && today <= this.lastDay ? startOfMonth(today) : this.firstMonth, false);
|
|
131
|
+
this.placed = true;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
disconnectedCallback() {
|
|
135
|
+
cancelAnimationFrame(this.frame);
|
|
136
|
+
super.disconnectedCallback();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private get scroller() {
|
|
140
|
+
return this.renderRoot.querySelector<HTMLElement>(".scroller");
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private columnOf(day: Day): number {
|
|
144
|
+
return this.weekStarts.findIndex(start => day >= start && day <= addDays(start, 6));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Scrolls the week holding `day` to the start of the view. */
|
|
148
|
+
scrollToDay(day: Day, smooth = true) {
|
|
149
|
+
const scroller = this.scroller;
|
|
150
|
+
const column = this.columnOf(day);
|
|
151
|
+
if (!scroller || column < 0) return;
|
|
152
|
+
const cell = scroller.querySelector<HTMLElement>(".cell")?.getBoundingClientRect().width ?? 30;
|
|
153
|
+
const reduce = matchMedia?.("(prefers-reduced-motion: reduce)").matches;
|
|
154
|
+
const rtl = getComputedStyle(this).direction === "rtl";
|
|
155
|
+
scroller.scrollTo({ left: (rtl ? -1 : 1) * column * cell, behavior: smooth && !reduce ? "smooth" : "auto" });
|
|
156
|
+
this.visible = startOfMonth(day);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Moves the view a month back or on; past the months drawn, the months move with it. */
|
|
160
|
+
private step(by: -1 | 1) {
|
|
161
|
+
const target = addMonths(this.visible ?? this.firstMonth, by);
|
|
162
|
+
const first = this.firstMonth;
|
|
163
|
+
const end = addMonths(first, this.monthCount);
|
|
164
|
+
if (target < first || target >= end) {
|
|
165
|
+
this.start = addMonths(first, by).slice(0, 7);
|
|
166
|
+
this.announceMonth(addMonths(first, by));
|
|
167
|
+
void this.updateComplete.then(() => this.scrollToDay(target, false));
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
this.scrollToDay(target);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** The month before, as the previous arrow does. */
|
|
174
|
+
previousMonth() { this.step(-1); }
|
|
175
|
+
|
|
176
|
+
/** The month after, as the next arrow does. */
|
|
177
|
+
nextMonth() { this.step(1); }
|
|
178
|
+
|
|
179
|
+
/** Brings today into view, moving the months drawn when it is outside them. */
|
|
180
|
+
showToday() {
|
|
181
|
+
const today = this.todayDay;
|
|
182
|
+
if (today < this.weekStarts[0] || today > this.lastDay) {
|
|
183
|
+
const first = addMonths(startOfMonth(today), -1);
|
|
184
|
+
this.start = first.slice(0, 7);
|
|
185
|
+
this.announceMonth(first);
|
|
186
|
+
void this.updateComplete.then(() => this.scrollToDay(startOfMonth(today), false));
|
|
187
|
+
} else {
|
|
188
|
+
this.scrollToDay(startOfMonth(today));
|
|
189
|
+
}
|
|
190
|
+
this.focusDay = today;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private onScroll = () => {
|
|
194
|
+
cancelAnimationFrame(this.frame);
|
|
195
|
+
this.frame = requestAnimationFrame(() => {
|
|
196
|
+
const scroller = this.scroller;
|
|
197
|
+
const cell = scroller?.querySelector<HTMLElement>(".cell")?.getBoundingClientRect().width;
|
|
198
|
+
if (!scroller || !cell) return;
|
|
199
|
+
const column = Math.min(this.weekStarts.length - 1, Math.max(0, Math.round(Math.abs(scroller.scrollLeft) / cell)));
|
|
200
|
+
// The month that owns most of the first week in view.
|
|
201
|
+
this.visible = startOfMonth(addDays(this.weekStarts[column], 3));
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
private get tabDay(): Day {
|
|
206
|
+
const first = this.weekStarts[0], last = this.lastDay;
|
|
207
|
+
for (const day of [this.focusDay, this.chosen.start, this.todayDay]) if (day && day >= first && day <= last) return day;
|
|
208
|
+
return this.firstMonth;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
private onKeyDown = (event: KeyboardEvent) => {
|
|
212
|
+
const cell = (event.target as HTMLElement).closest<HTMLElement>("[data-day]");
|
|
213
|
+
if (!cell) return;
|
|
214
|
+
const day = cell.dataset.day as Day;
|
|
215
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
216
|
+
event.preventDefault();
|
|
217
|
+
this.press(day);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const target = this.keyTarget(event, day);
|
|
221
|
+
if (!target) return;
|
|
222
|
+
event.preventDefault();
|
|
223
|
+
if (target < this.weekStarts[0] || target > this.lastDay) {
|
|
224
|
+
const by = target < this.weekStarts[0] ? -1 : 1;
|
|
225
|
+
const first = addMonths(this.firstMonth, by);
|
|
226
|
+
this.start = first.slice(0, 7);
|
|
227
|
+
this.announceMonth(first);
|
|
228
|
+
}
|
|
229
|
+
void this.focusCell(target);
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
private onClick = (event: MouseEvent) => {
|
|
233
|
+
const cell = (event.composedPath() as HTMLElement[]).find(node => node instanceof HTMLElement && node.dataset?.day);
|
|
234
|
+
if (!cell) return;
|
|
235
|
+
const day = cell.dataset.day as Day;
|
|
236
|
+
this.focusDay = day;
|
|
237
|
+
this.press(day);
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
private renderHeader() {
|
|
241
|
+
if (this.noHeader) return nothing;
|
|
242
|
+
const arrow = (which: "previous" | "next") => html`<button
|
|
243
|
+
class="ds-button ds-button--icon nav"
|
|
244
|
+
part=${which}
|
|
245
|
+
type="button"
|
|
246
|
+
aria-label=${this.words(which === "previous" ? "Previous month" : "Next month")}
|
|
247
|
+
@click=${() => (which === "previous" ? this.previousMonth() : this.nextMonth())}
|
|
248
|
+
><ds-icon type=${which === "previous" ? "chevron-left" : "chevron-right"} size="large" aria-hidden="true"></ds-icon></button>`;
|
|
249
|
+
return html`<div class="header" part="header">
|
|
250
|
+
<span class="title" aria-live="polite">${monthTitle(this.visible ?? this.firstMonth)}</span>
|
|
251
|
+
<span class="controls">
|
|
252
|
+
${arrow("previous")}
|
|
253
|
+
<button class="ds-button ds-button--secondary" part="today" type="button" @click=${() => this.showToday()}>${this.words("Today")}</button>
|
|
254
|
+
${arrow("next")}
|
|
255
|
+
</span>
|
|
256
|
+
</div>`;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
render() {
|
|
260
|
+
const weeks = this.weekStarts;
|
|
261
|
+
const first = weeks[0], last = this.lastDay;
|
|
262
|
+
this.byDay = eventsByDay(this.events ?? [], first, last);
|
|
263
|
+
const short = weekdayNames(this.firstDay, "short");
|
|
264
|
+
const narrow = weekdayNames(this.firstDay, "narrow");
|
|
265
|
+
const long = weekdayNames(this.firstDay, "long");
|
|
266
|
+
const today = this.todayDay;
|
|
267
|
+
const tab = this.tabDay;
|
|
268
|
+
// Each month's name stands over the week holding its first day.
|
|
269
|
+
const labels: { column: number; span: number; day: Day }[] = [];
|
|
270
|
+
for (let month = this.firstMonth, index = 0; index < this.monthCount; index++, month = addMonths(month, 1)) {
|
|
271
|
+
const column = this.columnOf(month);
|
|
272
|
+
const next = this.columnOf(addMonths(month, 1));
|
|
273
|
+
labels.push({ column, span: Math.max(1, (next < 0 ? weeks.length : next) - column), day: month });
|
|
274
|
+
}
|
|
275
|
+
const ends = new Set<Day>();
|
|
276
|
+
for (const event of this.events ?? []) {
|
|
277
|
+
ends.add(event.start);
|
|
278
|
+
if (event.end) ends.add(event.end);
|
|
279
|
+
}
|
|
280
|
+
return html`<div class="calendar" part="calendar" style=${`--ds-calendar-weeks: ${weeks.length}`}>
|
|
281
|
+
${this.renderHeader()}
|
|
282
|
+
<div class="body">
|
|
283
|
+
<div class="rail" part="weekdays" aria-hidden="true">
|
|
284
|
+
${short.map((name, row) => html`<span class="weekday" data-narrow=${narrow[row]}>${row % 2 === 1 ? name : ""}</span>`)}
|
|
285
|
+
</div>
|
|
286
|
+
<div class="scroller" part="scroller" @scroll=${this.onScroll}>
|
|
287
|
+
<div class="months" aria-hidden="true">
|
|
288
|
+
${labels.map(({ column, span, day }) => html`<span class="month" style=${`grid-column: ${column + 1} / span ${span}`}>${
|
|
289
|
+
day.slice(5, 7) === "01" || day === this.firstMonth ? monthTitle(day, "short") : monthName(day, "short")
|
|
290
|
+
}</span>`)}
|
|
291
|
+
</div>
|
|
292
|
+
<div class="frame" part="frame">
|
|
293
|
+
<div
|
|
294
|
+
class="grid"
|
|
295
|
+
part="grid"
|
|
296
|
+
role="grid"
|
|
297
|
+
aria-label=${this.nameOr(`${monthTitle(this.firstMonth)} – ${monthTitle(addMonths(this.firstMonth, this.monthCount - 1))}`)}
|
|
298
|
+
@keydown=${this.onKeyDown}
|
|
299
|
+
@click=${this.onClick}
|
|
300
|
+
>
|
|
301
|
+
${short.map((_, row) => html`<div role="row" class="row">
|
|
302
|
+
<span role="rowheader" class="hidden">${long[row]}</span>
|
|
303
|
+
${weeks.map((start, column) => {
|
|
304
|
+
const day = addDays(start, row);
|
|
305
|
+
const events = this.eventsOn(day);
|
|
306
|
+
const isToday = day === today;
|
|
307
|
+
const { selected, inside } = this.selection(day);
|
|
308
|
+
const written = isToday || selected || (events.length > 0 && ends.has(day));
|
|
309
|
+
const fill = fillOf(events);
|
|
310
|
+
return html`<div
|
|
311
|
+
role="gridcell"
|
|
312
|
+
class="cell"
|
|
313
|
+
part=${["cell", isToday ? "today" : "", selected ? "selected" : "", events.length ? "filled" : ""].filter(Boolean).join(" ")}
|
|
314
|
+
data-day=${day}
|
|
315
|
+
tabindex=${day === tab ? 0 : -1}
|
|
316
|
+
aria-label=${this.cellLabel(day, events)}
|
|
317
|
+
aria-selected=${this.selectable ? String(selected || inside) : nothing}
|
|
318
|
+
aria-current=${isToday ? "date" : nothing}
|
|
319
|
+
aria-disabled=${this.allowed(day) ? nothing : "true"}
|
|
320
|
+
?data-today=${isToday}
|
|
321
|
+
?data-selected=${selected}
|
|
322
|
+
?data-inside=${inside}
|
|
323
|
+
?data-filled=${events.length > 0}
|
|
324
|
+
?data-first-row=${row === 0}
|
|
325
|
+
?data-first-column=${column === 0}
|
|
326
|
+
style=${`grid-row: ${row + 1}; grid-column: ${column + 1};${fill ? ` --ds-calendar-cell-fill: ${fill};` : ""}`}
|
|
327
|
+
>${written ? html`<span class="date" aria-hidden="true">${dateNumber(day)}</span>` : nothing}</div>`;
|
|
328
|
+
})}
|
|
329
|
+
</div>`)}
|
|
330
|
+
</div>
|
|
331
|
+
</div>
|
|
332
|
+
</div>
|
|
333
|
+
</div>
|
|
334
|
+
</div>`;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
protected updated(changed: PropertyValues<this>) {
|
|
338
|
+
super.updated(changed);
|
|
339
|
+
if (this.placed && changed.has("start") && this.visible && !this.focusDay) this.scrollToDay(this.visible, false);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
define("ds-calendar-large", CalendarLarge);
|
|
344
|
+
|
|
345
|
+
declare global {
|
|
346
|
+
interface HTMLElementTagNameMap {
|
|
347
|
+
"ds-calendar-large": CalendarLarge;
|
|
348
|
+
}
|
|
349
|
+
}
|