@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,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The keyboard and pointer of a tree of rows, shared by `<ds-sidebar tree>`
|
|
3
|
+
* and the native `.ds-sidebar` classes of `row.css`.
|
|
4
|
+
*
|
|
5
|
+
* A tree is one stop for Tab: the row that has the focus (the selected row
|
|
6
|
+
* at first, otherwise the first) carries `tabindex="0"` and every other row
|
|
7
|
+
* `-1`. Up and Down move between rows that are not disabled, Home and End to
|
|
8
|
+
* the first and last; Right opens a closed row and enters an open one; Left
|
|
9
|
+
* closes an open row and moves to its parent; a printed character moves to
|
|
10
|
+
* the next row whose label starts with it. Space selects the row, Enter
|
|
11
|
+
* selects and activates it, as a double click does.
|
|
12
|
+
*
|
|
13
|
+
* `treeStep()` is that model alone, on the visible rows. `connectSidebar()`
|
|
14
|
+
* puts it on a native tree: rows with `role="treeitem"` and `aria-level`,
|
|
15
|
+
* flat, in order, inside an element with `role="tree"`. It dispatches the
|
|
16
|
+
* same events as `<ds-sidebar tree>` (`sidebar-toggle`, `sidebar-select`,
|
|
17
|
+
* `sidebar-activate`, each with `{ id }`), and unless the page cancels one
|
|
18
|
+
* it does what the event asks: opens or closes the row, hiding the rows
|
|
19
|
+
* inside it, or selects it.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** A visible row of a tree, as the keyboard sees it. */
|
|
23
|
+
export interface TreeRow {
|
|
24
|
+
/** 1 for a row at the root. */
|
|
25
|
+
level: number;
|
|
26
|
+
/** `true` open, `false` closed; a leaf has none. */
|
|
27
|
+
expanded?: boolean;
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
/** The words the type-ahead matches. */
|
|
30
|
+
label?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** What a key asks of the tree: move the focus to a row, open or close the row, select or activate it. */
|
|
34
|
+
export interface TreeStep {
|
|
35
|
+
focus?: number;
|
|
36
|
+
toggle?: boolean;
|
|
37
|
+
select?: boolean;
|
|
38
|
+
activate?: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const available = (rows: readonly TreeRow[], from: number, step: 1 | -1) => {
|
|
42
|
+
for (let index = from; index >= 0 && index < rows.length; index += step) if (!rows[index]!.disabled) return index;
|
|
43
|
+
return undefined;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/** The next row after `index` whose label starts with `letter`, from the top again after the last. */
|
|
47
|
+
function typeahead(rows: readonly TreeRow[], index: number, letter: string) {
|
|
48
|
+
const wanted = letter.toLocaleLowerCase();
|
|
49
|
+
for (let offset = 1; offset <= rows.length; offset++) {
|
|
50
|
+
const at = (index + offset) % rows.length;
|
|
51
|
+
const row = rows[at]!;
|
|
52
|
+
if (!row.disabled && (row.label ?? "").trim().toLocaleLowerCase().startsWith(wanted)) return at;
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* What `key` does on the row at `index` of the visible `rows`, or
|
|
59
|
+
* `undefined` when the tree leaves the key alone.
|
|
60
|
+
*/
|
|
61
|
+
export function treeStep(rows: readonly TreeRow[], index: number, key: string): TreeStep | undefined {
|
|
62
|
+
const row = rows[index];
|
|
63
|
+
if (!row) return undefined;
|
|
64
|
+
switch (key) {
|
|
65
|
+
case "ArrowDown": return { focus: available(rows, index + 1, 1) ?? index };
|
|
66
|
+
case "ArrowUp": return { focus: available(rows, index - 1, -1) ?? index };
|
|
67
|
+
case "Home": return { focus: available(rows, 0, 1) ?? index };
|
|
68
|
+
case "End": return { focus: available(rows, rows.length - 1, -1) ?? index };
|
|
69
|
+
case "ArrowRight":
|
|
70
|
+
if (row.expanded === false) return row.disabled ? {} : { toggle: true };
|
|
71
|
+
if (row.expanded && (rows[index + 1]?.level ?? 0) > row.level) return { focus: available(rows, index + 1, 1) ?? index };
|
|
72
|
+
return {};
|
|
73
|
+
case "ArrowLeft": {
|
|
74
|
+
if (row.expanded && !row.disabled) return { toggle: false };
|
|
75
|
+
for (let at = index - 1; at >= 0; at--) if (rows[at]!.level < row.level) return rows[at]!.disabled ? {} : { focus: at };
|
|
76
|
+
return {};
|
|
77
|
+
}
|
|
78
|
+
case "Enter": return row.disabled ? {} : { select: true, activate: true };
|
|
79
|
+
case " ": return row.disabled ? {} : { select: true };
|
|
80
|
+
default: {
|
|
81
|
+
// One printed character, a letter outside the basic plane included; named keys are longer.
|
|
82
|
+
if (!/^\S$/u.test(key)) return undefined;
|
|
83
|
+
const at = typeahead(rows, index, key);
|
|
84
|
+
return at === undefined ? {} : { focus: at };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** The events a tree sends, the same from `<ds-sidebar tree>` and a native tree. */
|
|
90
|
+
export interface SidebarEvents {
|
|
91
|
+
"sidebar-toggle": CustomEvent<{ id: string; expanded: boolean }>;
|
|
92
|
+
"sidebar-select": CustomEvent<{ id: string }>;
|
|
93
|
+
"sidebar-activate": CustomEvent<{ id: string }>;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const ITEM = '[role="treeitem"]';
|
|
97
|
+
const level = (item: Element) => Math.max(1, Number.parseInt(item.getAttribute("aria-level") ?? "1", 10) || 1);
|
|
98
|
+
const expandedOf = (item: Element) => {
|
|
99
|
+
const value = item.getAttribute("aria-expanded");
|
|
100
|
+
return value === null ? undefined : value === "true";
|
|
101
|
+
};
|
|
102
|
+
const disabledOf = (item: Element) => item.getAttribute("aria-disabled") === "true";
|
|
103
|
+
const labelOf = (item: Element) => (item.querySelector(".ds-sidebar__label") ?? item).textContent ?? "";
|
|
104
|
+
/** A row's name in the events: `data-id`, else its `id`. */
|
|
105
|
+
const idOf = (item: HTMLElement) => item.dataset.id ?? item.id;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Gives a native tree its keyboard and pointer. Returns a function that
|
|
109
|
+
* takes them away again.
|
|
110
|
+
*
|
|
111
|
+
* <ul class="ds-sidebar" role="tree" aria-label="Files">
|
|
112
|
+
* <li class="ds-sidebar__item" role="treeitem" aria-level="1" aria-expanded="true" data-id="src">
|
|
113
|
+
* <span class="ds-sidebar__disclosure" aria-hidden="true"></span>
|
|
114
|
+
* <span class="ds-sidebar__label">src</span>
|
|
115
|
+
* </li>
|
|
116
|
+
* <li class="ds-sidebar__item" role="treeitem" aria-level="2" data-id="main">…</li>
|
|
117
|
+
* </ul>
|
|
118
|
+
*/
|
|
119
|
+
export function connectSidebar(tree: HTMLElement): () => void {
|
|
120
|
+
const items = () => [...tree.querySelectorAll<HTMLElement>(ITEM)];
|
|
121
|
+
const visible = () => items().filter(item => !item.hidden && !item.closest("[hidden]"));
|
|
122
|
+
|
|
123
|
+
/** Exactly one visible row is the Tab stop: the focused one, else the selected one, else the first available. */
|
|
124
|
+
const rove = (focus?: HTMLElement) => {
|
|
125
|
+
const rows = visible();
|
|
126
|
+
const current = focus ?? rows.find(item => item.tabIndex === 0 && !disabledOf(item)) ?? rows.find(item => item.getAttribute("aria-selected") === "true") ?? rows.find(item => !disabledOf(item)) ?? rows[0];
|
|
127
|
+
for (const item of items()) item.tabIndex = item === current ? 0 : -1;
|
|
128
|
+
return current;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const send = <K extends keyof SidebarEvents>(name: K, detail: SidebarEvents[K]["detail"]) =>
|
|
132
|
+
tree.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true, cancelable: true }));
|
|
133
|
+
|
|
134
|
+
/** Opens or closes a row and shows or hides the rows inside it, keeping closed rows inside it closed. */
|
|
135
|
+
const toggle = (item: HTMLElement, expanded: boolean) => {
|
|
136
|
+
if (!send("sidebar-toggle", { id: idOf(item), expanded })) return;
|
|
137
|
+
item.setAttribute("aria-expanded", String(expanded));
|
|
138
|
+
const all = items();
|
|
139
|
+
const own = level(item);
|
|
140
|
+
let closedAt = Infinity;
|
|
141
|
+
for (const row of all.slice(all.indexOf(item) + 1)) {
|
|
142
|
+
const depth = level(row);
|
|
143
|
+
if (depth <= own) break;
|
|
144
|
+
if (depth <= closedAt) closedAt = Infinity;
|
|
145
|
+
row.hidden = !expanded || depth > closedAt;
|
|
146
|
+
if (expanded && !row.hidden && row.getAttribute("aria-expanded") === "false") closedAt = depth;
|
|
147
|
+
}
|
|
148
|
+
rove(item);
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const select = (item: HTMLElement) => {
|
|
152
|
+
if (!send("sidebar-select", { id: idOf(item) })) return;
|
|
153
|
+
for (const row of items()) if (row.hasAttribute("aria-selected") || row === item) row.setAttribute("aria-selected", String(row === item));
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const focus = (item: HTMLElement) => { rove(item); item.focus(); };
|
|
157
|
+
|
|
158
|
+
const keydown = (event: KeyboardEvent) => {
|
|
159
|
+
if (event.altKey || event.ctrlKey || event.metaKey) return;
|
|
160
|
+
const item = (event.target as Element | null)?.closest<HTMLElement>(ITEM);
|
|
161
|
+
if (!item || !tree.contains(item)) return;
|
|
162
|
+
const rows = visible();
|
|
163
|
+
const step = treeStep(rows.map(row => ({ level: level(row), expanded: expandedOf(row), disabled: disabledOf(row), label: labelOf(row) })), rows.indexOf(item), event.key);
|
|
164
|
+
if (!step) return;
|
|
165
|
+
event.preventDefault();
|
|
166
|
+
if (step.toggle !== undefined) toggle(item, step.toggle);
|
|
167
|
+
if (step.select) select(item);
|
|
168
|
+
if (step.activate) send("sidebar-activate", { id: idOf(item) });
|
|
169
|
+
if (step.focus !== undefined && rows[step.focus]) focus(rows[step.focus]!);
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const click = (event: MouseEvent) => {
|
|
173
|
+
const item = (event.target as Element | null)?.closest<HTMLElement>(ITEM);
|
|
174
|
+
if (!item || !tree.contains(item) || disabledOf(item)) return;
|
|
175
|
+
const disclosure = (event.target as Element).closest(".ds-sidebar__disclosure");
|
|
176
|
+
if (disclosure && expandedOf(item) !== undefined) toggle(item, !expandedOf(item));
|
|
177
|
+
else select(item);
|
|
178
|
+
focus(item);
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const dblclick = (event: MouseEvent) => {
|
|
182
|
+
const item = (event.target as Element | null)?.closest<HTMLElement>(ITEM);
|
|
183
|
+
if (!item || !tree.contains(item) || disabledOf(item) || (event.target as Element).closest(".ds-sidebar__disclosure")) return;
|
|
184
|
+
send("sidebar-activate", { id: idOf(item) });
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
if (!tree.hasAttribute("role")) tree.setAttribute("role", "tree");
|
|
188
|
+
rove();
|
|
189
|
+
// Rows the page adds or removes keep one Tab stop.
|
|
190
|
+
const observer = typeof MutationObserver === "undefined" ? undefined : new MutationObserver(() => { if (!items().some(item => item.tabIndex === 0 && !item.hidden)) rove(); });
|
|
191
|
+
observer?.observe(tree, { childList: true, subtree: true });
|
|
192
|
+
tree.addEventListener("keydown", keydown);
|
|
193
|
+
tree.addEventListener("click", click);
|
|
194
|
+
tree.addEventListener("dblclick", dblclick);
|
|
195
|
+
return () => {
|
|
196
|
+
observer?.disconnect();
|
|
197
|
+
tree.removeEventListener("keydown", keydown);
|
|
198
|
+
tree.removeEventListener("click", click);
|
|
199
|
+
tree.removeEventListener("dblclick", dblclick);
|
|
200
|
+
};
|
|
201
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design system 1's theme, on before the first paint.
|
|
3
|
+
*
|
|
4
|
+
* A classic script for the <head>: inline it before the stylesheets, or load it
|
|
5
|
+
* there with a plain <script src> (not a module), which holds rendering until
|
|
6
|
+
* it has run. It needs nothing else and waits for nothing.
|
|
7
|
+
*
|
|
8
|
+
* It reads the stored choice, light, dark or system, and puts the theme on
|
|
9
|
+
* the root element at once (with nothing stored, `themeDefault`: system
|
|
10
|
+
* unless the product says light or dark):
|
|
11
|
+
* - the class `light-theme` or `dark-theme`, the canonical mark the
|
|
12
|
+
* stylesheets key on;
|
|
13
|
+
* - `data-theme="light"` or `"dark"`, the same, for pages that key on it;
|
|
14
|
+
* - `color-scheme`, so light-dark() tokens and the browser's controls follow;
|
|
15
|
+
* - `--lightningcss-light` and `--lightningcss-dark`, so CSS compiled with
|
|
16
|
+
* Lightning CSS's light-dark() fallback follows the choice, not the system;
|
|
17
|
+
* - the canvas behind the page and the theme-color meta, in the paper.
|
|
18
|
+
* It also sets `lang` from the language module's stored choice, or from the
|
|
19
|
+
* address when the product takes the language from there.
|
|
20
|
+
*
|
|
21
|
+
* Then it keeps the page right: in system mode it follows
|
|
22
|
+
* prefers-color-scheme as it changes, and it applies the choice again when
|
|
23
|
+
* another tab stores one and when a page returns from the back-forward cache.
|
|
24
|
+
* A change after the first paint crosses over in a view transition of the
|
|
25
|
+
* root, unless the reader asks for reduced motion.
|
|
26
|
+
*
|
|
27
|
+
* `window.DS_ONE_THEME` is the runtime: `mode()`, `theme()`, `set(mode)` and
|
|
28
|
+
* `apply()`; a change dispatches `theme-changed` on window with
|
|
29
|
+
* `{ theme, mode }`. `0-face/theme.ts` runs this same file, so the components
|
|
30
|
+
* and a page without them share one implementation, whichever loads first.
|
|
31
|
+
*
|
|
32
|
+
* Set options before it on `window.DS_ONE_PREFERENCES`: `themeStorageKey`
|
|
33
|
+
* (`"ds-one:theme"` by default), `themeDefault` (`"light"`, `"dark"` or
|
|
34
|
+
* `"system"`, the default) for a visitor who has chosen nothing yet,
|
|
35
|
+
* `themeMode: "system"` to follow the system and never read or write a stored
|
|
36
|
+
* choice, and `themePaper` as `{ light, dark }` colours for the canvas, or
|
|
37
|
+
* `false` to leave the background and theme-color to the page. The language
|
|
38
|
+
* follows `window.DS_ONE_I18N`: `storageKey` (`"language"`), `persist: false`,
|
|
39
|
+
* `languages`, `routing` with `languageFromAddress: true` (a prefix such as
|
|
40
|
+
* `/ja/…` wins over the stored choice), and `langTarget` (set, the root's
|
|
41
|
+
* `lang` is left alone).
|
|
42
|
+
*/
|
|
43
|
+
(function () {
|
|
44
|
+
if (typeof window === "undefined" || typeof document === "undefined" || window.DS_ONE_THEME) return;
|
|
45
|
+
var root = document.documentElement;
|
|
46
|
+
var MODES = ["light", "dark", "system"];
|
|
47
|
+
// Design system 1's languages (0-face/languages.ts), the prefixes an address may carry by default.
|
|
48
|
+
var LANGUAGES = ["da", "de", "en", "es", "fi", "fr", "is", "it", "ja", "ko", "nb", "nn", "no", "pt", "pt-BR", "sv", "zh"];
|
|
49
|
+
var PAPER = { light: "#ffffff", dark: "#2a2a2a" };
|
|
50
|
+
// A choice that cannot be stored, or one made while the page follows the system, lasts for this page.
|
|
51
|
+
var session = null;
|
|
52
|
+
var shown = null;
|
|
53
|
+
var shownMode = null;
|
|
54
|
+
var crossing = null;
|
|
55
|
+
|
|
56
|
+
function options() { return window.DS_ONE_PREFERENCES || {}; }
|
|
57
|
+
function key() { return options().themeStorageKey || "ds-one:theme"; }
|
|
58
|
+
function query(media) {
|
|
59
|
+
try { return window.matchMedia ? window.matchMedia(media) : null; } catch { return null; }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function mode() {
|
|
63
|
+
if (session) return session;
|
|
64
|
+
if (options().themeMode === "system") return "system";
|
|
65
|
+
try {
|
|
66
|
+
var stored = window.localStorage.getItem(key());
|
|
67
|
+
if (MODES.indexOf(stored) >= 0) return stored;
|
|
68
|
+
} catch { /* Storage can be blocked. */ }
|
|
69
|
+
var first = options().themeDefault;
|
|
70
|
+
return MODES.indexOf(first) >= 0 ? first : "system";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function resolve(choice) {
|
|
74
|
+
if (choice !== "system") return choice;
|
|
75
|
+
var system = query("(prefers-color-scheme: dark)");
|
|
76
|
+
return system && system.matches ? "dark" : "light";
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function paint(theme) {
|
|
80
|
+
root.classList.remove(theme === "dark" ? "light-theme" : "dark-theme");
|
|
81
|
+
root.classList.add(theme + "-theme");
|
|
82
|
+
root.setAttribute("data-theme", theme);
|
|
83
|
+
root.style.colorScheme = theme;
|
|
84
|
+
root.style.setProperty("--lightningcss-light", theme === "light" ? "initial" : " ");
|
|
85
|
+
root.style.setProperty("--lightningcss-dark", theme === "dark" ? "initial" : " ");
|
|
86
|
+
var paper = options().themePaper;
|
|
87
|
+
if (paper === false) return;
|
|
88
|
+
var colour = (paper && paper[theme]) || PAPER[theme];
|
|
89
|
+
root.style.backgroundColor = colour;
|
|
90
|
+
var meta = document.querySelector('meta[name="theme-color"]:not([media])');
|
|
91
|
+
if (!meta && document.head) {
|
|
92
|
+
meta = document.createElement("meta");
|
|
93
|
+
meta.setAttribute("name", "theme-color");
|
|
94
|
+
document.head.appendChild(meta);
|
|
95
|
+
}
|
|
96
|
+
if (meta) meta.setAttribute("content", colour);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// The two themes are two pictures of one page: cross from one to the other.
|
|
100
|
+
function cross(theme) {
|
|
101
|
+
var reduced = query("(prefers-reduced-motion: reduce)");
|
|
102
|
+
if (typeof document.startViewTransition !== "function" || (reduced && reduced.matches) || document.visibilityState === "hidden") {
|
|
103
|
+
paint(theme);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (crossing) crossing.skipTransition();
|
|
107
|
+
var painted = false;
|
|
108
|
+
var once = function () { if (!painted) { painted = true; paint(theme); } };
|
|
109
|
+
try {
|
|
110
|
+
var transition = document.startViewTransition(once);
|
|
111
|
+
crossing = transition;
|
|
112
|
+
// A skipped crossing rejects all three promises; none may swallow the change.
|
|
113
|
+
void transition.ready.catch(function () {});
|
|
114
|
+
void transition.updateCallbackDone.catch(once);
|
|
115
|
+
void transition.finished.catch(function () {}).then(function () { if (crossing === transition) crossing = null; });
|
|
116
|
+
} catch {
|
|
117
|
+
once();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function apply() {
|
|
122
|
+
var choice = mode();
|
|
123
|
+
var theme = resolve(choice);
|
|
124
|
+
var first = shown === null;
|
|
125
|
+
var moved = theme !== shown || choice !== shownMode;
|
|
126
|
+
if (!first && theme !== shown) cross(theme);
|
|
127
|
+
else paint(theme);
|
|
128
|
+
shown = theme;
|
|
129
|
+
shownMode = choice;
|
|
130
|
+
if (!first && moved) window.dispatchEvent(new CustomEvent("theme-changed", { detail: { theme: theme, mode: choice } }));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function set(choice) {
|
|
134
|
+
if (MODES.indexOf(choice) < 0) return;
|
|
135
|
+
session = null;
|
|
136
|
+
if (options().themeMode === "system") {
|
|
137
|
+
if (choice !== "system") session = choice;
|
|
138
|
+
} else {
|
|
139
|
+
try { window.localStorage.setItem(key(), choice); } catch { session = choice; }
|
|
140
|
+
}
|
|
141
|
+
apply();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
var i18n = window.DS_ONE_I18N || {};
|
|
145
|
+
// The language an address names in its first segment (`/pt-br/…` gives pt-BR), as the language module reads it.
|
|
146
|
+
function addressLanguage() {
|
|
147
|
+
if (!i18n.languageFromAddress) return null;
|
|
148
|
+
var routing = i18n.routing || {};
|
|
149
|
+
var prefixed = (routing.languages && routing.languages.length ? routing.languages : null) || (i18n.languages && i18n.languages.length ? i18n.languages : null) || LANGUAGES;
|
|
150
|
+
var segment = String((window.location && window.location.pathname) || "").split("/")[1] || "";
|
|
151
|
+
var slug = segment.toLowerCase().replace(/_/g, "-");
|
|
152
|
+
if (!slug) return null;
|
|
153
|
+
for (var index = 0; index < prefixed.length; index++) {
|
|
154
|
+
if (String(prefixed[index]).toLowerCase().replace(/_/g, "-") === slug) return String(prefixed[index]);
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
function storedLanguage() {
|
|
159
|
+
if (i18n.persist === false) return null;
|
|
160
|
+
try {
|
|
161
|
+
var language = window.localStorage.getItem(i18n.storageKey || "language");
|
|
162
|
+
if (language && (!i18n.languages || i18n.languages.indexOf(language) >= 0)) return language;
|
|
163
|
+
} catch { /* Storage can be blocked. */ }
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
if (i18n.langTarget === undefined) {
|
|
167
|
+
var language = addressLanguage() || storedLanguage();
|
|
168
|
+
if (language && /^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(language)) root.lang = language;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
window.DS_ONE_THEME = {
|
|
172
|
+
mode: function () { return shownMode; },
|
|
173
|
+
theme: function () { return shown; },
|
|
174
|
+
set: set,
|
|
175
|
+
apply: function () { apply(); },
|
|
176
|
+
};
|
|
177
|
+
apply();
|
|
178
|
+
|
|
179
|
+
var system = query("(prefers-color-scheme: dark)");
|
|
180
|
+
if (system && system.addEventListener) system.addEventListener("change", function () { apply(); });
|
|
181
|
+
else if (system && system.addListener) system.addListener(function () { apply(); });
|
|
182
|
+
window.addEventListener("storage", function (event) { if (event.key === null || event.key === key()) apply(); });
|
|
183
|
+
window.addEventListener("pageshow", function () { apply(); });
|
|
184
|
+
})();
|
package/DS1/0-face/theme.ts
CHANGED
|
@@ -1,58 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Light, dark or system, remembered in one stored choice.
|
|
3
|
+
*
|
|
4
|
+
* The runtime is `theme-bootstrap.js`, the classic script a page inlines in
|
|
5
|
+
* its <head> so the first paint is already in the chosen theme. Imported here
|
|
6
|
+
* as well, it installs itself when the page did not inline it, so the
|
|
7
|
+
* components and a page without them share one implementation. This module
|
|
8
|
+
* mirrors it in signals for the components.
|
|
9
|
+
*
|
|
10
|
+
* The theme is marked on the root element by the class `light-theme` or
|
|
11
|
+
* `dark-theme` (canonical), `data-theme="light|dark"` (for pages that key on
|
|
12
|
+
* the attribute) and `color-scheme`. In system mode it follows
|
|
13
|
+
* prefers-color-scheme as it changes. A visitor who has chosen nothing sees
|
|
14
|
+
* `themeDefault` from `window.DS_ONE_PREFERENCES` (system unless the product
|
|
15
|
+
* says light or dark).
|
|
16
|
+
*
|
|
17
|
+
* A page without the components copies it with Sync 1's `root` export,
|
|
18
|
+
* `"modules": ["theme"]` (this file, the head script and the options type);
|
|
19
|
+
* it needs `@lit-labs/signals`.
|
|
20
|
+
*/
|
|
1
21
|
import { signal } from "@lit-labs/signals";
|
|
2
|
-
import
|
|
22
|
+
import "./theme-bootstrap.js";
|
|
23
|
+
import type { PreferenceOptions } from "./preference-options";
|
|
3
24
|
|
|
25
|
+
/** The theme on the page. */
|
|
4
26
|
export type ThemeType = "light" | "dark";
|
|
27
|
+
/** The stored choice: a theme, or the system's. */
|
|
28
|
+
export type ThemeMode = ThemeType | "system";
|
|
29
|
+
export const THEME_MODES: readonly ThemeMode[] = ["light", "dark", "system"];
|
|
5
30
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
31
|
+
/** `window.DS_ONE_THEME`, installed by `theme-bootstrap.js`. */
|
|
32
|
+
export interface ThemeRuntime {
|
|
33
|
+
/** The choice in effect: light, dark or system. */
|
|
34
|
+
mode(): ThemeMode;
|
|
35
|
+
/** The theme on the page. */
|
|
36
|
+
theme(): ThemeType;
|
|
37
|
+
/** Choose and remember light, dark or system, and put it on the page. */
|
|
38
|
+
set(mode: ThemeMode): void;
|
|
39
|
+
/** Read the stored choice, the options and the system again, and put them on the page. */
|
|
40
|
+
apply(): void;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
declare global {
|
|
44
|
+
interface Window { DS_ONE_THEME?: ThemeRuntime; }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function runtime(): ThemeRuntime | undefined {
|
|
48
|
+
return typeof window === "undefined" ? undefined : window.DS_ONE_THEME;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Options set since the head script ran (a product's storage key, system mode) take effect now.
|
|
52
|
+
runtime()?.apply();
|
|
10
53
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
if (storedTheme === "light" || storedTheme === "dark") {
|
|
14
|
-
return storedTheme;
|
|
15
|
-
}
|
|
54
|
+
export const currentTheme = signal<ThemeType>(runtime()?.theme() ?? "light");
|
|
55
|
+
export const currentThemeMode = signal<ThemeMode>(runtime()?.mode() ?? "system");
|
|
16
56
|
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
57
|
+
function sync(): void {
|
|
58
|
+
const theme = runtime();
|
|
59
|
+
if (!theme) return;
|
|
60
|
+
currentTheme.set(theme.theme());
|
|
61
|
+
currentThemeMode.set(theme.mode());
|
|
20
62
|
}
|
|
21
63
|
|
|
22
|
-
|
|
64
|
+
if (typeof window !== "undefined") window.addEventListener("theme-changed", sync);
|
|
23
65
|
|
|
66
|
+
export function getThemeMode(): ThemeMode {
|
|
67
|
+
return runtime()?.mode() ?? currentThemeMode.get();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Choose light, dark or system, store it and put it on the page; `theme-changed` follows a change. */
|
|
71
|
+
export function setThemeMode(mode: ThemeMode): void {
|
|
72
|
+
runtime()?.set(mode);
|
|
73
|
+
sync();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Choose light or dark. `setThemeMode("system")` hands the choice back to the system. */
|
|
24
77
|
export function setTheme(theme: ThemeType): void {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Initialize theme on load
|
|
51
|
-
if (typeof window !== "undefined") {
|
|
52
|
-
const theme = currentTheme.get();
|
|
53
|
-
const root = window.document?.documentElement;
|
|
54
|
-
if (root) {
|
|
55
|
-
root.classList.remove("light-theme", "dark-theme");
|
|
56
|
-
root.classList.add(`${theme}-theme`);
|
|
57
|
-
}
|
|
78
|
+
setThemeMode(theme);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Bind an automatic surface to system appearance, leaving stored choices
|
|
83
|
+
* intact: nothing is read from or written to storage until the returned
|
|
84
|
+
* function hands the page back to its stored choice.
|
|
85
|
+
*/
|
|
86
|
+
export function followSystemTheme(): () => void {
|
|
87
|
+
if (typeof window === "undefined") return () => {};
|
|
88
|
+
const previous = window.DS_ONE_PREFERENCES?.themeMode;
|
|
89
|
+
const following: PreferenceOptions = { ...window.DS_ONE_PREFERENCES, themeMode: "system" };
|
|
90
|
+
window.DS_ONE_PREFERENCES = following;
|
|
91
|
+
setThemeMode("system");
|
|
92
|
+
return () => {
|
|
93
|
+
const options = { ...window.DS_ONE_PREFERENCES };
|
|
94
|
+
if (previous) options.themeMode = previous;
|
|
95
|
+
else delete options.themeMode;
|
|
96
|
+
window.DS_ONE_PREFERENCES = options;
|
|
97
|
+
runtime()?.apply();
|
|
98
|
+
sync();
|
|
99
|
+
};
|
|
58
100
|
}
|