@0001-labs/design-system-1 0.3.0-alpha.13 → 0.3.0-alpha.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DS1/0-face/calendar.ts +194 -0
- package/DS1/0-face/carousel.ts +623 -0
- package/DS1/0-face/component-visibility.ts +14 -0
- package/DS1/0-face/copy-text.ts +96 -0
- package/DS1/0-face/device.ts +8 -58
- package/DS1/0-face/dialog-swipe.ts +249 -0
- package/DS1/0-face/dialogs.ts +208 -0
- package/DS1/0-face/drawer.ts +258 -0
- package/DS1/0-face/feedback-words.ts +36 -0
- package/DS1/0-face/feedback.ts +40 -0
- package/DS1/0-face/format.ts +700 -0
- package/DS1/0-face/generated/toast-assets.ts +18 -0
- package/DS1/0-face/grid-fit.ts +1 -1
- package/DS1/0-face/grid.ts +3 -2
- package/DS1/0-face/header.ts +78 -0
- package/DS1/0-face/i18n.ts +93 -18
- package/DS1/0-face/keys.ts +276 -0
- package/DS1/0-face/languages.ts +4 -4
- package/DS1/0-face/layout-inspector.ts +6 -6
- package/DS1/0-face/library-styles.ts +33 -0
- package/DS1/0-face/load-toaster.ts +7 -0
- package/DS1/0-face/preference-options.ts +29 -0
- package/DS1/0-face/preferences.ts +3 -11
- package/DS1/0-face/pricing.ts +98 -43
- package/DS1/0-face/scaling.ts +160 -4
- package/DS1/0-face/shared-words.ts +9 -4
- package/DS1/0-face/sidebar.ts +201 -0
- package/DS1/0-face/theme-bootstrap.js +184 -0
- package/DS1/0-face/theme.ts +89 -47
- package/DS1/0-face/toast-queue.ts +157 -0
- package/DS1/0-face/toaster.ts +384 -0
- package/DS1/0-face/tooltips.ts +157 -15
- package/DS1/0-face/translations/da.json +60 -1
- package/DS1/0-face/translations/de.json +60 -1
- package/DS1/0-face/translations/en.json +60 -1
- package/DS1/0-face/translations/es.json +60 -1
- package/DS1/0-face/translations/fi.json +60 -1
- package/DS1/0-face/translations/fr.json +60 -1
- package/DS1/0-face/translations/is.json +60 -1
- package/DS1/0-face/translations/it.json +60 -1
- package/DS1/0-face/translations/ja.json +60 -1
- package/DS1/0-face/translations/ko.json +60 -1
- package/DS1/0-face/translations/nb.json +60 -1
- package/DS1/0-face/translations/pt-BR.json +60 -1
- package/DS1/0-face/translations/pt.json +60 -1
- package/DS1/0-face/translations/sv.json +60 -1
- package/DS1/0-face/translations/zh.json +60 -1
- package/DS1/0-face/translations-format.ts +3 -4
- package/DS1/1-root/card.css +192 -0
- package/DS1/1-root/carousel.css +136 -0
- package/DS1/1-root/cjk.css +23 -0
- package/DS1/1-root/component-metrics.css +1 -0
- package/DS1/1-root/component-tokens.css +51 -8
- package/DS1/1-root/controls.css +891 -14
- package/DS1/1-root/dialog-placement.css +191 -0
- package/DS1/1-root/document.css +183 -0
- package/DS1/1-root/drawer.css +83 -0
- package/DS1/1-root/empty.css +83 -0
- package/DS1/1-root/figures.css +141 -0
- package/DS1/1-root/fonts/Iosevka-LICENSE.md +3 -1
- package/DS1/1-root/fonts/Iosevka-Regular.woff2 +0 -0
- package/DS1/1-root/fonts.css +69 -0
- package/DS1/1-root/footer.css +186 -0
- package/DS1/1-root/header.css +165 -0
- package/DS1/1-root/library-tokens.ts +91 -0
- package/DS1/1-root/measures.ts +53 -0
- package/DS1/1-root/notice.css +165 -0
- package/DS1/1-root/one.css +14 -84
- package/DS1/1-root/one.semantic.css +200 -148
- package/DS1/1-root/palette.css +58 -0
- package/DS1/1-root/palette.ts +19 -0
- package/DS1/1-root/progress.css +356 -0
- package/DS1/1-root/prose.css +202 -0
- package/DS1/1-root/row.css +300 -0
- package/DS1/1-root/table.css +111 -0
- package/DS1/1-root/text.css +70 -0
- package/DS1/2-core/button-split.ts +55 -0
- package/DS1/2-core/chart/chart.css +169 -0
- package/DS1/2-core/chart/grid-chart.ts +554 -0
- package/DS1/2-core/ds-avatar.ts +25 -6
- package/DS1/2-core/ds-badge.ts +10 -10
- package/DS1/2-core/ds-button.ts +111 -26
- package/DS1/2-core/ds-card.ts +135 -105
- package/DS1/2-core/ds-chart.ts +327 -0
- package/DS1/2-core/ds-composer.ts +8 -2
- package/DS1/2-core/ds-cycle.ts +97 -21
- package/DS1/2-core/ds-empty.ts +120 -0
- package/DS1/2-core/ds-icon.ts +11 -2
- package/DS1/2-core/ds-input.ts +165 -6
- package/DS1/2-core/ds-message.ts +218 -0
- package/DS1/2-core/ds-notice.ts +10 -0
- package/DS1/2-core/ds-progress.ts +380 -0
- package/DS1/2-core/ds-stat.ts +174 -0
- package/DS1/2-core/ds-switch.ts +1 -0
- package/DS1/2-core/ds-text.ts +15 -2
- package/DS1/2-core/ds-toast.ts +354 -0
- package/DS1/2-core/figures.ts +105 -0
- package/DS1/2-core/generated/ds-icon-map.ts +238 -128
- package/DS1/2-core/generated/icon-avatar.ts +2 -0
- package/DS1/2-core/generated/icons-extra.ts +120 -65
- package/DS1/2-core/generated/icons-immediate.ts +1 -1
- package/DS1/2-core/styles/ds-avatar.css +9 -8
- package/DS1/2-core/styles/ds-button-host.css +26 -3
- package/DS1/2-core/styles/ds-button-split.css +67 -0
- package/DS1/2-core/styles/ds-button.css +49 -15
- package/DS1/2-core/styles/ds-card.css +34 -0
- package/DS1/2-core/styles/ds-composer.css +13 -0
- package/DS1/2-core/styles/ds-cycle.css +10 -0
- package/DS1/2-core/styles/ds-empty.css +18 -0
- package/DS1/2-core/styles/ds-gap.css +1 -0
- package/DS1/2-core/styles/ds-icon.css +1 -0
- package/DS1/2-core/styles/ds-input.css +59 -6
- package/DS1/2-core/styles/ds-notice.css +32 -0
- package/DS1/2-core/styles/ds-progress.css +25 -0
- package/DS1/2-core/styles/ds-select.css +2 -2
- package/DS1/2-core/styles/ds-split.css +2 -62
- package/DS1/2-core/styles/ds-stat.css +34 -0
- package/DS1/2-core/styles/ds-switch.css +16 -1
- package/DS1/2-core/styles/ds-text.css +43 -12
- package/DS1/2-core/styles/ds-toast.css +182 -0
- package/DS1/2-core/styles/ds-tooltip.css +1 -0
- package/DS1/3-unit/calendar-base.ts +263 -0
- package/DS1/3-unit/ds-accordion.ts +9 -1
- package/DS1/3-unit/ds-avatar-group.ts +1 -0
- package/DS1/3-unit/ds-calendar-large.ts +349 -0
- package/DS1/3-unit/ds-calendar.ts +344 -0
- package/DS1/3-unit/ds-carousel.ts +368 -0
- package/DS1/3-unit/ds-date-picker.ts +540 -0
- package/DS1/3-unit/ds-form.ts +45 -37
- package/DS1/3-unit/ds-list.ts +48 -1
- package/DS1/3-unit/ds-matrix.ts +318 -0
- package/DS1/3-unit/ds-menu.ts +8 -4
- package/DS1/3-unit/ds-row.ts +84 -1
- package/DS1/3-unit/ds-sidebar.ts +366 -0
- package/DS1/3-unit/ds-table.ts +75 -34
- package/DS1/3-unit/styles/ds-accordion.css +1 -0
- package/DS1/3-unit/styles/ds-avatar-group.css +2 -4
- package/DS1/3-unit/styles/ds-calendar-large.css +165 -0
- package/DS1/3-unit/styles/ds-calendar.css +238 -0
- package/DS1/3-unit/styles/ds-carousel.css +30 -0
- package/DS1/3-unit/styles/ds-date-picker.css +124 -0
- package/DS1/3-unit/styles/ds-list.css +1 -0
- package/DS1/3-unit/styles/ds-matrix.css +203 -0
- package/DS1/3-unit/styles/ds-menu.css +31 -6
- package/DS1/3-unit/styles/ds-row.css +84 -2
- package/DS1/3-unit/styles/ds-sidebar.css +134 -0
- package/DS1/3-unit/styles/ds-table.css +3 -74
- package/DS1/4-page/ds-dialog.ts +40 -4
- package/DS1/4-page/ds-document.ts +240 -0
- package/DS1/4-page/ds-footer.ts +165 -0
- package/DS1/4-page/ds-grid.ts +39 -59
- package/DS1/4-page/ds-header.ts +171 -0
- package/DS1/4-page/ds-page.ts +184 -0
- package/DS1/4-page/email.ts +2 -3
- package/DS1/4-page/styles/ds-container.css +1 -0
- package/DS1/4-page/styles/ds-document.css +18 -0
- package/DS1/4-page/styles/ds-footer.css +29 -0
- package/DS1/4-page/styles/ds-grid.css +31 -85
- package/DS1/4-page/styles/ds-header.css +57 -0
- package/DS1/4-page/styles/ds-page.css +214 -0
- package/DS1/components.ts +7 -1
- package/DS1/index.ts +24 -6
- package/DS1/react/avatar.ts +4 -5
- package/DS1/react/button-split.ts +29 -0
- package/DS1/react/button.ts +32 -13
- package/DS1/react/carousel.ts +76 -0
- package/DS1/react/dialog.ts +36 -5
- package/DS1/react/document.ts +14 -0
- package/DS1/react/empty.ts +32 -0
- package/DS1/react/footer.ts +17 -0
- package/DS1/react/header.ts +15 -0
- package/DS1/react/input.ts +28 -17
- package/DS1/react/message.ts +73 -0
- package/DS1/react/notice.ts +59 -0
- package/DS1/react/page.ts +13 -0
- package/DS1/react/progress.ts +99 -0
- package/DS1/react/sidebar.ts +71 -0
- package/DS1/react/stat.ts +73 -0
- package/DS1/react/toast.ts +82 -0
- package/DS1/x-icon/Tabler-LICENSE.md +27 -0
- package/DS1/x-icon/airtable.svg +5 -0
- package/DS1/x-icon/attach.svg +3 -0
- package/DS1/x-icon/audio.svg +3 -0
- package/DS1/x-icon/bag-alt.svg +3 -0
- package/DS1/x-icon/bank.svg +3 -0
- package/DS1/x-icon/banknote.svg +3 -0
- package/DS1/x-icon/bolt.svg +3 -0
- package/DS1/x-icon/book-alt.svg +3 -0
- package/DS1/x-icon/book.svg +4 -0
- package/DS1/x-icon/box.svg +3 -0
- package/DS1/x-icon/briefcase.svg +3 -0
- package/DS1/x-icon/building.svg +4 -0
- package/DS1/x-icon/car.svg +3 -0
- package/DS1/x-icon/card.svg +3 -0
- package/DS1/x-icon/cart.svg +3 -0
- package/DS1/x-icon/{ezo-android-screen-stats.svg → chevron-down.svg} +1 -1
- package/DS1/x-icon/{ezo-item-button-start.svg → chevron-left.svg} +1 -1
- package/DS1/x-icon/{ezo-android-screen-lists.svg → chevron-right.svg} +1 -1
- package/DS1/x-icon/{ezo-item-button-reopen.svg → chevron-up.svg} +1 -1
- package/DS1/x-icon/cloud.svg +3 -0
- package/DS1/x-icon/coffee.svg +3 -0
- package/DS1/x-icon/coins.svg +3 -0
- package/DS1/x-icon/cursor.svg +3 -0
- package/DS1/x-icon/curve.svg +7 -0
- package/DS1/x-icon/dislike.svg +4 -0
- package/DS1/x-icon/dot-bank.svg +3 -0
- package/DS1/x-icon/dot-banknote.svg +3 -0
- package/DS1/x-icon/dot-banknotes.svg +3 -0
- package/DS1/x-icon/dot-card.svg +3 -0
- package/DS1/x-icon/dot-coin.svg +3 -0
- package/DS1/x-icon/dot-coins.svg +3 -0
- package/DS1/x-icon/dot-receipt.svg +3 -0
- package/DS1/x-icon/dot-safe.svg +3 -0
- package/DS1/x-icon/dot-transfer.svg +3 -0
- package/DS1/x-icon/dot-wallet.svg +3 -0
- package/DS1/x-icon/download.svg +4 -0
- package/DS1/x-icon/drive.svg +5 -0
- package/DS1/x-icon/drop.svg +3 -0
- package/DS1/x-icon/dropbox.svg +3 -0
- package/DS1/x-icon/dumbbell.svg +3 -0
- package/DS1/x-icon/eye-off.svg +3 -0
- package/DS1/x-icon/eye.svg +3 -0
- package/DS1/x-icon/facebook.svg +3 -0
- package/DS1/x-icon/figma.svg +5 -0
- package/DS1/x-icon/flame.svg +3 -0
- package/DS1/x-icon/flip.svg +5 -0
- package/DS1/x-icon/food.svg +3 -0
- package/DS1/x-icon/fuel.svg +3 -0
- package/DS1/x-icon/game.svg +3 -0
- package/DS1/x-icon/gift.svg +3 -0
- package/DS1/x-icon/github.svg +3 -0
- package/DS1/x-icon/heart.svg +3 -0
- package/DS1/x-icon/history.svg +3 -0
- package/DS1/x-icon/home-alt.svg +3 -0
- package/DS1/x-icon/income.svg +3 -0
- package/DS1/x-icon/info.svg +5 -0
- package/DS1/x-icon/instagram.svg +5 -0
- package/DS1/x-icon/jpbank.svg +3 -0
- package/DS1/x-icon/key.svg +4 -0
- package/DS1/x-icon/keyboard.svg +3 -0
- package/DS1/x-icon/like.svg +4 -0
- package/DS1/x-icon/linkedin.svg +7 -0
- package/DS1/x-icon/loom.svg +6 -0
- package/DS1/x-icon/map.svg +4 -0
- package/DS1/x-icon/medical.svg +3 -0
- package/DS1/x-icon/minus.svg +3 -0
- package/DS1/x-icon/moon.svg +3 -0
- package/DS1/x-icon/move.svg +3 -0
- package/DS1/x-icon/music-alt.svg +3 -0
- package/DS1/x-icon/music.svg +5 -0
- package/DS1/x-icon/notion.svg +6 -0
- package/DS1/x-icon/offline.svg +3 -0
- package/DS1/x-icon/pause.svg +4 -0
- package/DS1/x-icon/paw.svg +3 -0
- package/DS1/x-icon/pdf.svg +3 -0
- package/DS1/x-icon/people.svg +5 -0
- package/DS1/x-icon/percent.svg +3 -0
- package/DS1/x-icon/phone.svg +3 -0
- package/DS1/x-icon/pill.svg +3 -0
- package/DS1/x-icon/plane.svg +3 -0
- package/DS1/x-icon/postal.svg +3 -0
- package/DS1/x-icon/present.svg +4 -0
- package/DS1/x-icon/reaction.svg +5 -0
- package/DS1/x-icon/receipt.svg +3 -0
- package/DS1/x-icon/refresh.svg +3 -0
- package/DS1/x-icon/refund.svg +3 -0
- package/DS1/x-icon/repeat.svg +3 -0
- package/DS1/x-icon/rotate.svg +4 -0
- package/DS1/x-icon/safe.svg +3 -0
- package/DS1/x-icon/school-alt.svg +3 -0
- package/DS1/x-icon/shield-alt.svg +3 -0
- package/DS1/x-icon/shield.svg +4 -0
- package/DS1/x-icon/shirt.svg +3 -0
- package/DS1/x-icon/shop.svg +3 -0
- package/DS1/x-icon/sign-in.svg +3 -0
- package/DS1/x-icon/sign-out.svg +3 -0
- package/DS1/x-icon/slack.svg +6 -0
- package/DS1/x-icon/sparkle.svg +3 -0
- package/DS1/x-icon/start.svg +4 -0
- package/DS1/x-icon/stop.svg +3 -0
- package/DS1/x-icon/sun.svg +3 -0
- package/DS1/x-icon/system.svg +4 -0
- package/DS1/x-icon/tag.svg +3 -0
- package/DS1/x-icon/ticket.svg +3 -0
- package/DS1/x-icon/title-struck.svg +4 -0
- package/DS1/x-icon/train.svg +3 -0
- package/DS1/x-icon/transfer.svg +3 -0
- package/DS1/x-icon/tv.svg +3 -0
- package/DS1/x-icon/upload.svg +4 -0
- package/DS1/x-icon/video.svg +4 -0
- package/DS1/x-icon/vimeo.svg +3 -0
- package/DS1/x-icon/wallet.svg +3 -0
- package/DS1/x-icon/wifi.svg +3 -0
- package/DS1/x-icon/window.svg +4 -0
- package/DS1/x-icon/wrench.svg +3 -0
- package/DS1/x-icon/x-brand.svg +4 -0
- package/DS1/x-icon/youtube.svg +4 -0
- package/README.md +3 -3
- package/dist/0-face/calendar.d.ts +75 -0
- package/dist/0-face/calendar.d.ts.map +1 -0
- package/dist/0-face/calendar.js +149 -0
- package/dist/0-face/carousel.d.ts +174 -0
- package/dist/0-face/carousel.d.ts.map +1 -0
- package/dist/0-face/carousel.js +583 -0
- package/dist/0-face/component-visibility.d.ts +7 -0
- package/dist/0-face/component-visibility.d.ts.map +1 -0
- package/dist/0-face/component-visibility.js +11 -0
- package/dist/0-face/copy-text.d.ts +11 -0
- package/dist/0-face/copy-text.d.ts.map +1 -0
- package/dist/0-face/copy-text.js +97 -0
- package/dist/0-face/device.d.ts +3 -7
- package/dist/0-face/device.d.ts.map +1 -1
- package/dist/0-face/device.js +7 -41
- package/dist/0-face/dialog-swipe.d.ts +49 -0
- package/dist/0-face/dialog-swipe.d.ts.map +1 -0
- package/dist/0-face/dialog-swipe.js +239 -0
- package/dist/0-face/dialogs.d.ts +33 -0
- package/dist/0-face/dialogs.d.ts.map +1 -0
- package/dist/0-face/dialogs.js +173 -0
- package/dist/0-face/drawer.d.ts +64 -0
- package/dist/0-face/drawer.d.ts.map +1 -0
- package/dist/0-face/drawer.js +256 -0
- package/dist/0-face/feedback-words.d.ts +21 -0
- package/dist/0-face/feedback-words.d.ts.map +1 -0
- package/dist/0-face/feedback-words.js +30 -0
- package/dist/0-face/feedback.d.ts +41 -0
- package/dist/0-face/feedback.d.ts.map +1 -0
- package/dist/0-face/feedback.js +35 -0
- package/dist/0-face/format.d.ts +166 -0
- package/dist/0-face/format.d.ts.map +1 -0
- package/dist/0-face/format.js +445 -0
- package/dist/0-face/generated/toast-assets.d.ts +11 -0
- package/dist/0-face/generated/toast-assets.d.ts.map +1 -0
- package/dist/0-face/generated/toast-assets.js +14 -0
- package/dist/0-face/grid-fit.js +1 -1
- package/dist/0-face/grid.d.ts.map +1 -1
- package/dist/0-face/grid.js +2 -1
- package/dist/0-face/header.d.ts +38 -0
- package/dist/0-face/header.d.ts.map +1 -0
- package/dist/0-face/header.js +80 -0
- package/dist/0-face/i18n.d.ts +32 -2
- package/dist/0-face/i18n.d.ts.map +1 -1
- package/dist/0-face/i18n.js +65 -19
- package/dist/0-face/keys.d.ts +104 -0
- package/dist/0-face/keys.d.ts.map +1 -0
- package/dist/0-face/keys.js +253 -0
- package/dist/0-face/languages.d.ts +2 -2
- package/dist/0-face/languages.js +3 -3
- package/dist/0-face/layout-inspector.js +6 -6
- package/dist/0-face/library-styles.d.ts +7 -0
- package/dist/0-face/library-styles.d.ts.map +1 -0
- package/dist/0-face/library-styles.js +29 -0
- package/dist/0-face/load-toaster.d.ts +8 -0
- package/dist/0-face/load-toaster.d.ts.map +1 -0
- package/dist/0-face/load-toaster.js +7 -0
- package/dist/0-face/preference-options.d.ts +34 -0
- package/dist/0-face/preference-options.d.ts.map +1 -0
- package/dist/0-face/preference-options.js +1 -0
- package/dist/0-face/preferences.d.ts +3 -12
- package/dist/0-face/preferences.d.ts.map +1 -1
- package/dist/0-face/pricing.d.ts +19 -9
- package/dist/0-face/pricing.d.ts.map +1 -1
- package/dist/0-face/pricing.js +81 -40
- package/dist/0-face/scaling.d.ts +71 -1
- package/dist/0-face/scaling.d.ts.map +1 -1
- package/dist/0-face/scaling.js +108 -3
- package/dist/0-face/shared-words.d.ts +9 -4
- package/dist/0-face/shared-words.d.ts.map +1 -1
- package/dist/0-face/sidebar.d.ts +69 -0
- package/dist/0-face/sidebar.d.ts.map +1 -0
- package/dist/0-face/sidebar.js +191 -0
- package/dist/0-face/theme-bootstrap.d.ts +1 -0
- package/dist/0-face/theme-bootstrap.d.ts.map +1 -0
- package/dist/0-face/theme-bootstrap.js +214 -0
- package/dist/0-face/theme.d.ts +32 -0
- package/dist/0-face/theme.d.ts.map +1 -1
- package/dist/0-face/theme.js +69 -43
- package/dist/0-face/toast-queue.d.ts +110 -0
- package/dist/0-face/toast-queue.d.ts.map +1 -0
- package/dist/0-face/toast-queue.js +98 -0
- package/dist/0-face/toaster.d.ts +27 -0
- package/dist/0-face/toaster.d.ts.map +1 -0
- package/dist/0-face/toaster.js +373 -0
- package/dist/0-face/tooltips.d.ts +24 -1
- package/dist/0-face/tooltips.d.ts.map +1 -1
- package/dist/0-face/tooltips.js +155 -16
- package/dist/0-face/translations/da.json +60 -1
- package/dist/0-face/translations/de.json +60 -1
- package/dist/0-face/translations/en.json +60 -1
- package/dist/0-face/translations/es.json +60 -1
- package/dist/0-face/translations/fi.json +60 -1
- package/dist/0-face/translations/fr.json +60 -1
- package/dist/0-face/translations/is.json +60 -1
- package/dist/0-face/translations/it.json +60 -1
- package/dist/0-face/translations/ja.json +60 -1
- package/dist/0-face/translations/ko.json +60 -1
- package/dist/0-face/translations/nb.json +60 -1
- package/dist/0-face/translations/pt-BR.json +60 -1
- package/dist/0-face/translations/pt.json +60 -1
- package/dist/0-face/translations/sv.json +60 -1
- package/dist/0-face/translations/zh.json +60 -1
- package/dist/0-face/translations-format.d.ts.map +1 -1
- package/dist/0-face/translations-format.js +3 -4
- package/dist/1-root/library-tokens.d.ts +31 -0
- package/dist/1-root/library-tokens.d.ts.map +1 -0
- package/dist/1-root/library-tokens.js +84 -0
- package/dist/1-root/measures.d.ts +52 -0
- package/dist/1-root/measures.d.ts.map +1 -0
- package/dist/1-root/measures.js +49 -0
- package/dist/1-root/palette.d.ts +5 -0
- package/dist/1-root/palette.d.ts.map +1 -1
- package/dist/1-root/palette.js +18 -0
- package/dist/2-core/button-split.d.ts +21 -0
- package/dist/2-core/button-split.d.ts.map +1 -0
- package/dist/2-core/button-split.js +48 -0
- package/dist/2-core/chart/grid-chart.d.ts +113 -0
- package/dist/2-core/chart/grid-chart.d.ts.map +1 -0
- package/dist/2-core/chart/grid-chart.js +466 -0
- package/dist/2-core/ds-avatar.d.ts +20 -3
- package/dist/2-core/ds-avatar.d.ts.map +1 -1
- package/dist/2-core/ds-avatar.js +19 -5
- package/dist/2-core/ds-badge.js +10 -13
- package/dist/2-core/ds-button.d.ts +76 -0
- package/dist/2-core/ds-button.d.ts.map +1 -1
- package/dist/2-core/ds-button.js +101 -26
- package/dist/2-core/ds-card.d.ts +76 -11
- package/dist/2-core/ds-card.d.ts.map +1 -1
- package/dist/2-core/ds-card.js +129 -105
- package/dist/2-core/ds-chart.d.ts +105 -0
- package/dist/2-core/ds-chart.d.ts.map +1 -0
- package/dist/2-core/ds-chart.js +390 -0
- package/dist/2-core/ds-composer.d.ts +7 -0
- package/dist/2-core/ds-composer.d.ts.map +1 -1
- package/dist/2-core/ds-composer.js +1 -1
- package/dist/2-core/ds-cycle.d.ts +36 -2
- package/dist/2-core/ds-cycle.d.ts.map +1 -1
- package/dist/2-core/ds-cycle.js +95 -18
- package/dist/2-core/ds-empty.d.ts +74 -0
- package/dist/2-core/ds-empty.d.ts.map +1 -0
- package/dist/2-core/ds-empty.js +96 -0
- package/dist/2-core/ds-icon.d.ts +6 -0
- package/dist/2-core/ds-icon.d.ts.map +1 -1
- package/dist/2-core/ds-icon.js +12 -2
- package/dist/2-core/ds-input.d.ts +39 -1
- package/dist/2-core/ds-input.d.ts.map +1 -1
- package/dist/2-core/ds-input.js +150 -6
- package/dist/2-core/ds-message.d.ts +154 -0
- package/dist/2-core/ds-message.d.ts.map +1 -0
- package/dist/2-core/ds-message.js +177 -0
- package/dist/2-core/ds-notice.d.ts +13 -0
- package/dist/2-core/ds-notice.d.ts.map +1 -0
- package/dist/2-core/ds-notice.js +11 -0
- package/dist/2-core/ds-progress.d.ts +200 -0
- package/dist/2-core/ds-progress.d.ts.map +1 -0
- package/dist/2-core/ds-progress.js +319 -0
- package/dist/2-core/ds-stat.d.ts +126 -0
- package/dist/2-core/ds-stat.d.ts.map +1 -0
- package/dist/2-core/ds-stat.js +137 -0
- package/dist/2-core/ds-switch.d.ts +1 -0
- package/dist/2-core/ds-switch.d.ts.map +1 -1
- package/dist/2-core/ds-switch.js +1 -0
- package/dist/2-core/ds-text.d.ts +15 -2
- package/dist/2-core/ds-text.d.ts.map +1 -1
- package/dist/2-core/ds-text.js +13 -0
- package/dist/2-core/ds-toast.d.ts +139 -0
- package/dist/2-core/ds-toast.d.ts.map +1 -0
- package/dist/2-core/ds-toast.js +329 -0
- package/dist/2-core/figures.d.ts +56 -0
- package/dist/2-core/figures.d.ts.map +1 -0
- package/dist/2-core/figures.js +70 -0
- package/dist/2-core/generated/ds-icon-map.d.ts +120 -65
- package/dist/2-core/generated/ds-icon-map.d.ts.map +1 -1
- package/dist/2-core/generated/ds-icon-map.js +238 -128
- package/dist/2-core/generated/icon-avatar.d.ts +2 -0
- package/dist/2-core/generated/icon-avatar.d.ts.map +1 -0
- package/dist/2-core/generated/icon-avatar.js +2 -0
- package/dist/2-core/generated/icons-extra.d.ts.map +1 -1
- package/dist/2-core/generated/icons-extra.js +120 -65
- package/dist/2-core/generated/icons-immediate.d.ts +1 -1
- package/dist/2-core/generated/icons-immediate.d.ts.map +1 -1
- package/dist/2-core/generated/icons-immediate.js +1 -1
- package/dist/3-unit/calendar-base.d.ts +149 -0
- package/dist/3-unit/calendar-base.d.ts.map +1 -0
- package/dist/3-unit/calendar-base.js +172 -0
- package/dist/3-unit/ds-accordion.d.ts +9 -0
- package/dist/3-unit/ds-accordion.d.ts.map +1 -1
- package/dist/3-unit/ds-accordion.js +7 -1
- package/dist/3-unit/ds-avatar-group.d.ts +1 -0
- package/dist/3-unit/ds-avatar-group.d.ts.map +1 -1
- package/dist/3-unit/ds-calendar-large.d.ts +138 -0
- package/dist/3-unit/ds-calendar-large.d.ts.map +1 -0
- package/dist/3-unit/ds-calendar-large.js +305 -0
- package/dist/3-unit/ds-calendar.d.ts +175 -0
- package/dist/3-unit/ds-calendar.d.ts.map +1 -0
- package/dist/3-unit/ds-calendar.js +303 -0
- package/dist/3-unit/ds-carousel.d.ts +182 -0
- package/dist/3-unit/ds-carousel.d.ts.map +1 -0
- package/dist/3-unit/ds-carousel.js +327 -0
- package/dist/3-unit/ds-date-picker.d.ts +203 -0
- package/dist/3-unit/ds-date-picker.d.ts.map +1 -0
- package/dist/3-unit/ds-date-picker.js +499 -0
- package/dist/3-unit/ds-form.d.ts.map +1 -1
- package/dist/3-unit/ds-form.js +38 -28
- package/dist/3-unit/ds-list.d.ts +12 -0
- package/dist/3-unit/ds-list.d.ts.map +1 -1
- package/dist/3-unit/ds-list.js +52 -1
- package/dist/3-unit/ds-matrix.d.ts +146 -0
- package/dist/3-unit/ds-matrix.d.ts.map +1 -0
- package/dist/3-unit/ds-matrix.js +248 -0
- package/dist/3-unit/ds-menu.d.ts +1 -1
- package/dist/3-unit/ds-menu.d.ts.map +1 -1
- package/dist/3-unit/ds-menu.js +7 -4
- package/dist/3-unit/ds-row.d.ts +66 -0
- package/dist/3-unit/ds-row.d.ts.map +1 -1
- package/dist/3-unit/ds-row.js +80 -1
- package/dist/3-unit/ds-sidebar.d.ts +149 -0
- package/dist/3-unit/ds-sidebar.d.ts.map +1 -0
- package/dist/3-unit/ds-sidebar.js +342 -0
- package/dist/3-unit/ds-table.d.ts +28 -10
- package/dist/3-unit/ds-table.d.ts.map +1 -1
- package/dist/3-unit/ds-table.js +53 -25
- package/dist/4-page/ds-dialog.d.ts +16 -1
- package/dist/4-page/ds-dialog.d.ts.map +1 -1
- package/dist/4-page/ds-dialog.js +39 -3
- package/dist/4-page/ds-document.d.ts +98 -0
- package/dist/4-page/ds-document.d.ts.map +1 -0
- package/dist/4-page/ds-document.js +213 -0
- package/dist/4-page/ds-footer.d.ts +100 -0
- package/dist/4-page/ds-footer.d.ts.map +1 -0
- package/dist/4-page/ds-footer.js +119 -0
- package/dist/4-page/ds-grid.d.ts +32 -12
- package/dist/4-page/ds-grid.d.ts.map +1 -1
- package/dist/4-page/ds-grid.js +30 -39
- package/dist/4-page/ds-header.d.ts +84 -0
- package/dist/4-page/ds-header.d.ts.map +1 -0
- package/dist/4-page/ds-header.js +143 -0
- package/dist/4-page/ds-page.d.ts +110 -0
- package/dist/4-page/ds-page.d.ts.map +1 -0
- package/dist/4-page/ds-page.js +155 -0
- package/dist/4-page/email.d.ts +2 -3
- package/dist/4-page/email.d.ts.map +1 -1
- package/dist/4-page/email.js +2 -3
- package/dist/components.d.ts +4 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +4 -1
- package/dist/design-system-1.bundle.js +12322 -5523
- package/dist/design-system-1.bundle.js.map +1 -1
- package/dist/design-system-1.bundle.min.js +8771 -4115
- package/dist/design-system-1.bundle.min.js.map +1 -1
- package/dist/design-system-1.css +1 -1
- package/dist/feedback.js +541 -0
- package/dist/feedback.js.map +1 -0
- package/dist/{icons-extra-BoAACA4X.js → icons-extra-CiDDs7_-.js} +404 -312
- package/dist/icons-extra-CiDDs7_-.js.map +1 -0
- package/dist/{icons-extra-DlxTo_Y4.js → icons-extra-hauwCx07.js} +121 -66
- package/dist/icons-extra-hauwCx07.js.map +1 -0
- package/dist/index.d.ts +21 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -6
- package/dist/react/avatar.d.ts +5 -9
- package/dist/react/avatar.d.ts.map +1 -1
- package/dist/react/avatar.js +2 -2
- package/dist/react/button-split.d.ts +19 -0
- package/dist/react/button-split.d.ts.map +1 -0
- package/dist/react/{split.js → button-split.js} +12 -9
- package/dist/react/button.d.ts +18 -7
- package/dist/react/button.d.ts.map +1 -1
- package/dist/react/button.js +13 -4
- package/dist/react/carousel.d.ts +63 -0
- package/dist/react/carousel.d.ts.map +1 -0
- package/dist/react/carousel.js +47 -0
- package/dist/react/choice.d.ts +1 -1
- package/dist/react/context-menu.d.ts +337 -337
- package/dist/react/dialog.d.ts +684 -678
- package/dist/react/dialog.d.ts.map +1 -1
- package/dist/react/dialog.js +29 -3
- package/dist/react/document.d.ts +11 -0
- package/dist/react/document.d.ts.map +1 -0
- package/dist/react/document.js +10 -0
- package/dist/react/empty.d.ts +34 -0
- package/dist/react/empty.d.ts.map +1 -0
- package/dist/react/empty.js +8 -0
- package/dist/react/file-picker.d.ts +1 -1
- package/dist/react/footer.d.ts +13 -0
- package/dist/react/footer.d.ts.map +1 -0
- package/dist/react/footer.js +12 -0
- package/dist/react/header.d.ts +12 -0
- package/dist/react/header.d.ts.map +1 -0
- package/dist/react/header.js +11 -0
- package/dist/react/input.d.ts +31 -9
- package/dist/react/input.d.ts.map +1 -1
- package/dist/react/input.js +94 -94
- package/dist/react/message.d.ts +66 -0
- package/dist/react/message.d.ts.map +1 -0
- package/dist/react/message.js +37 -0
- package/dist/react/notice.d.ts +45 -0
- package/dist/react/notice.d.ts.map +1 -0
- package/dist/react/notice.js +34 -0
- package/dist/react/page.d.ts +10 -0
- package/dist/react/page.d.ts.map +1 -0
- package/dist/react/page.js +9 -0
- package/dist/react/progress.d.ts +107 -0
- package/dist/react/progress.d.ts.map +1 -0
- package/dist/react/progress.js +47 -0
- package/dist/react/sidebar.d.ts +54 -0
- package/dist/react/sidebar.d.ts.map +1 -0
- package/dist/react/sidebar.js +48 -0
- package/dist/react/stat.d.ts +78 -0
- package/dist/react/stat.d.ts.map +1 -0
- package/dist/react/stat.js +25 -0
- package/dist/react/toast.d.ts +37 -0
- package/dist/react/toast.d.ts.map +1 -0
- package/dist/react/toast.js +55 -0
- package/dist/shared-words-CyZYc_De.js +1818 -0
- package/dist/shared-words-CyZYc_De.js.map +1 -0
- package/dist/shared-words-DAVSET4Z.js +1800 -0
- package/dist/shared-words-DAVSET4Z.js.map +1 -0
- package/package.json +19 -6
- package/DS1/2-core/ds-banner.ts +0 -122
- package/DS1/2-core/ds-date.ts +0 -24
- package/DS1/2-core/ds-language.ts +0 -94
- package/DS1/2-core/ds-pagedots.ts +0 -52
- package/DS1/2-core/ds-split.ts +0 -122
- package/DS1/2-core/ds-textarea.ts +0 -136
- package/DS1/2-core/styles/ds-banner.css +0 -77
- package/DS1/2-core/styles/ds-date.css +0 -9
- package/DS1/2-core/styles/ds-language.css +0 -78
- package/DS1/2-core/styles/ds-pagedots.css +0 -31
- package/DS1/2-core/styles/ds-textarea.css +0 -27
- package/DS1/4-page/ds-layout.ts +0 -949
- package/DS1/4-page/styles/ds-layout.css +0 -246
- package/DS1/react/split.ts +0 -42
- package/DS1/x-icon/ezo-accordion-chevron.svg +0 -11
- package/DS1/x-icon/ezo-account-close.svg +0 -1
- package/DS1/x-icon/ezo-android-screen-archive.svg +0 -4
- package/DS1/x-icon/ezo-android-screen-calendar.svg +0 -6
- package/DS1/x-icon/ezo-android-screen-camera.svg +0 -5
- package/DS1/x-icon/ezo-android-screen-check.svg +0 -3
- package/DS1/x-icon/ezo-android-screen-compose.svg +0 -4
- package/DS1/x-icon/ezo-android-screen-globe.svg +0 -1
- package/DS1/x-icon/ezo-android-screen-shared.svg +0 -5
- package/DS1/x-icon/ezo-android-screen-store.svg +0 -4
- package/DS1/x-icon/ezo-android-screen-views.svg +0 -4
- package/DS1/x-icon/ezo-android-screen-work.svg +0 -3
- package/DS1/x-icon/ezo-arrow-cursor.svg +0 -8
- package/DS1/x-icon/ezo-block-accordion.svg +0 -1
- package/DS1/x-icon/ezo-block-divider.svg +0 -1
- package/DS1/x-icon/ezo-block-group.svg +0 -1
- package/DS1/x-icon/ezo-block-image.svg +0 -1
- package/DS1/x-icon/ezo-block-section.svg +0 -1
- package/DS1/x-icon/ezo-block-table.svg +0 -1
- package/DS1/x-icon/ezo-code.svg +0 -14
- package/DS1/x-icon/ezo-down.svg +0 -3
- package/DS1/x-icon/ezo-figma-premium-star.svg +0 -5
- package/DS1/x-icon/ezo-item-button-complete.svg +0 -4
- package/DS1/x-icon/ezo-item-button-header.svg +0 -3
- package/DS1/x-icon/ezo-item-button-open.svg +0 -3
- package/DS1/x-icon/ezo-item-button-star.svg +0 -3
- package/DS1/x-icon/ezo-item-button-unheader.svg +0 -7
- package/DS1/x-icon/ezo-item-button-unstar.svg +0 -5
- package/DS1/x-icon/ezo-item-star.svg +0 -5
- package/DS1/x-icon/ezo-left.svg +0 -3
- package/DS1/x-icon/ezo-logo.svg +0 -1
- package/DS1/x-icon/ezo-mic.svg +0 -8
- package/DS1/x-icon/ezo-move-column.svg +0 -14
- package/DS1/x-icon/ezo-move-row.svg +0 -18
- package/DS1/x-icon/ezo-navigation-check.svg +0 -1
- package/DS1/x-icon/ezo-note-back.svg +0 -5
- package/DS1/x-icon/ezo-note-menu-complete.svg +0 -11
- package/DS1/x-icon/ezo-note-menu-delete.svg +0 -4
- package/DS1/x-icon/ezo-note-menu-duplicate.svg +0 -8
- package/DS1/x-icon/ezo-note-menu-note.svg +0 -5
- package/DS1/x-icon/ezo-note-menu-page.svg +0 -3
- package/DS1/x-icon/ezo-note-menu-star.svg +0 -5
- package/DS1/x-icon/ezo-note-menu-start.svg +0 -6
- package/DS1/x-icon/ezo-note-menu-stop.svg +0 -6
- package/DS1/x-icon/ezo-note-more.svg +0 -7
- package/DS1/x-icon/ezo-note-star.svg +0 -5
- package/DS1/x-icon/ezo-pattern-call-to-action.svg +0 -1
- package/DS1/x-icon/ezo-play.svg +0 -5
- package/DS1/x-icon/ezo-premium-star.svg +0 -5
- package/DS1/x-icon/ezo-setting-1xdots.svg +0 -13
- package/DS1/x-icon/ezo-setting-1xgrid.svg +0 -10
- package/DS1/x-icon/ezo-setting-1xlines.svg +0 -7
- package/DS1/x-icon/ezo-setting-2xdots.svg +0 -8
- package/DS1/x-icon/ezo-setting-2xgrid.svg +0 -8
- package/DS1/x-icon/ezo-setting-2xlines.svg +0 -6
- package/DS1/x-icon/ezo-setting-blank.svg +0 -5
- package/DS1/x-icon/ezo-store-chevron.svg +0 -1
- package/DS1/x-icon/ezo-upgrade-close.svg +0 -5
- package/DS1/x-icon/product-sources.json +0 -2557
- package/dist/2-core/ds-banner.d.ts +0 -68
- package/dist/2-core/ds-banner.d.ts.map +0 -1
- package/dist/2-core/ds-banner.js +0 -98
- package/dist/2-core/ds-date.d.ts +0 -16
- package/dist/2-core/ds-date.d.ts.map +0 -1
- package/dist/2-core/ds-date.js +0 -15
- package/dist/2-core/ds-language.d.ts +0 -75
- package/dist/2-core/ds-language.d.ts.map +0 -1
- package/dist/2-core/ds-language.js +0 -74
- package/dist/2-core/ds-pagedots.d.ts +0 -32
- package/dist/2-core/ds-pagedots.d.ts.map +0 -1
- package/dist/2-core/ds-pagedots.js +0 -36
- package/dist/2-core/ds-split.d.ts +0 -75
- package/dist/2-core/ds-split.d.ts.map +0 -1
- package/dist/2-core/ds-split.js +0 -101
- package/dist/2-core/ds-textarea.d.ts +0 -46
- package/dist/2-core/ds-textarea.d.ts.map +0 -1
- package/dist/2-core/ds-textarea.js +0 -121
- package/dist/4-page/ds-layout.d.ts +0 -31
- package/dist/4-page/ds-layout.d.ts.map +0 -1
- package/dist/4-page/ds-layout.js +0 -930
- package/dist/icons-extra-BoAACA4X.js.map +0 -1
- package/dist/icons-extra-DlxTo_Y4.js.map +0 -1
- package/dist/react/split.d.ts +0 -15
- package/dist/react/split.d.ts.map +0 -1
- package/dist/shared-words-Cg6Phtx0.js +0 -915
- package/dist/shared-words-Cg6Phtx0.js.map +0 -1
- package/dist/shared-words-Ddz0yUEF.js +0 -933
- package/dist/shared-words-Ddz0yUEF.js.map +0 -1
- /package/DS1/x-icon/{ezo-password-visibility-see.svg → password-see.svg} +0 -0
- /package/DS1/x-icon/{ezo-password-visibility-unsee.svg → password-unsee.svg} +0 -0
package/DS1/0-face/languages.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The languages every
|
|
2
|
+
* The languages every product chooses from: one list, with the name of
|
|
3
3
|
* each in English and in itself, and how to read whatever a browser, a URL or
|
|
4
4
|
* a saved setting calls a language.
|
|
5
5
|
*
|
|
@@ -105,8 +105,8 @@ export const LANGUAGE_METADATA: Readonly<Record<Language, LanguageMetadata>> = {
|
|
|
105
105
|
|
|
106
106
|
/**
|
|
107
107
|
* Languages close enough to stand in for each other, nearest first. A product
|
|
108
|
-
* that speaks only one of them gets it for the others (
|
|
109
|
-
* `no` and `nn`
|
|
108
|
+
* that speaks only one of them gets it for the others (one that speaks `nb`
|
|
109
|
+
* reads `no` and `nn` as `nb`; one that speaks `pt-BR` reads `pt` as it), and
|
|
110
110
|
* a missing word is looked up in them before English.
|
|
111
111
|
*/
|
|
112
112
|
const RELATED_LANGUAGES: Readonly<Partial<Record<Language, readonly Language[]>>> = {
|
|
@@ -150,7 +150,7 @@ function within(language: Language, allowed: ReadonlySet<Language>): Language |
|
|
|
150
150
|
* `pt-br`, or a browser's list (`"nl-NL,da;q=0.8"`, the first language it
|
|
151
151
|
* knows wins). Pass the product's languages to land on one it speaks: a
|
|
152
152
|
* relative stands in where the product lacks the language itself, so with
|
|
153
|
-
*
|
|
153
|
+
* `nb` and `pt-BR` among them, `no` and `nn` read as `nb`, and `pt` as `pt-BR`. Returns
|
|
154
154
|
* `fallback` when nothing matches (`null` to tell).
|
|
155
155
|
*/
|
|
156
156
|
export function normalizeLanguage(
|
|
@@ -66,7 +66,7 @@ export function createLayoutInspector() {
|
|
|
66
66
|
}
|
|
67
67
|
@media print { :host { display: none !important; } }
|
|
68
68
|
</style><div class="veil"></div><div class="areas"></div>`;
|
|
69
|
-
document.body.
|
|
69
|
+
document.body.appendChild(overlay);
|
|
70
70
|
const layer = shadow.querySelector<HTMLDivElement>('.areas')!;
|
|
71
71
|
const colors = ['#efc9dc', '#d5c9ef', '#c2d9eb', '#bfe0cd', '#eee3b7', '#efcfb8'];
|
|
72
72
|
let frame = 0;
|
|
@@ -115,7 +115,7 @@ export function createLayoutInspector() {
|
|
|
115
115
|
panel.style.top = `${rect.top}px`;
|
|
116
116
|
panel.style.width = `${rect.width}px`;
|
|
117
117
|
panel.style.height = `${rect.height}px`;
|
|
118
|
-
panel.style.setProperty('--pastel', colors[index % colors.length]);
|
|
118
|
+
panel.style.setProperty('--pastel', colors[index % colors.length] ?? null);
|
|
119
119
|
const label = document.createElement('span');
|
|
120
120
|
label.className = 'name';
|
|
121
121
|
const areaName = element.dataset.dsArea || element.getAttribute('aria-label') ||
|
|
@@ -124,7 +124,7 @@ export function createLayoutInspector() {
|
|
|
124
124
|
const dimensions = document.createElement('span');
|
|
125
125
|
dimensions.className = 'dimensions';
|
|
126
126
|
dimensions.textContent = `${Number(rect.width.toFixed(1))} × ${Number(rect.height.toFixed(1))} px`;
|
|
127
|
-
label.
|
|
127
|
+
label.appendChild(dimensions);
|
|
128
128
|
const ratio = document.createElement('span');
|
|
129
129
|
ratio.className = 'dimensions';
|
|
130
130
|
// Reduce dimensions measured to a tenth of a CSS pixel; use a decimal
|
|
@@ -141,9 +141,9 @@ export function createLayoutInspector() {
|
|
|
141
141
|
ratio.textContent = horizontal <= 100 && vertical <= 100
|
|
142
142
|
? `${horizontal}:${vertical}`
|
|
143
143
|
: `≈ ${Number((rect.width / rect.height).toFixed(2))}:1`;
|
|
144
|
-
label.
|
|
145
|
-
panel.
|
|
146
|
-
fragments.
|
|
144
|
+
label.appendChild(ratio);
|
|
145
|
+
panel.appendChild(label);
|
|
146
|
+
fragments.appendChild(panel);
|
|
147
147
|
});
|
|
148
148
|
layer.replaceChildren(fragments);
|
|
149
149
|
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** A published library owns appearance; its last published snapshot covers offline starts. */
|
|
2
|
+
export function connectLibraryStyles(options: {
|
|
3
|
+
url: string;
|
|
4
|
+
fallback: string;
|
|
5
|
+
document?: Document;
|
|
6
|
+
}): () => void {
|
|
7
|
+
const doc = options.document ?? document;
|
|
8
|
+
const fallback = doc.createElement("style");
|
|
9
|
+
fallback.dataset.designLibrary = "fallback";
|
|
10
|
+
fallback.textContent = options.fallback;
|
|
11
|
+
const published = doc.createElement("link");
|
|
12
|
+
published.rel = "stylesheet";
|
|
13
|
+
published.href = options.url;
|
|
14
|
+
published.dataset.designLibrary = "published";
|
|
15
|
+
const loaded = () => {
|
|
16
|
+
// Replace, rather than layer: deleting a library rule must really delete it.
|
|
17
|
+
fallback.disabled = true;
|
|
18
|
+
published.dataset.state = "published";
|
|
19
|
+
};
|
|
20
|
+
const failed = () => {
|
|
21
|
+
fallback.disabled = false;
|
|
22
|
+
published.dataset.state = "fallback";
|
|
23
|
+
};
|
|
24
|
+
published.addEventListener("load", loaded);
|
|
25
|
+
published.addEventListener("error", failed);
|
|
26
|
+
doc.head.append(fallback, published);
|
|
27
|
+
return () => {
|
|
28
|
+
published.removeEventListener("load", loaded);
|
|
29
|
+
published.removeEventListener("error", failed);
|
|
30
|
+
published.remove();
|
|
31
|
+
fallback.remove();
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The page toaster as copyText loads it, when it shows a toast and nothing in
|
|
3
|
+
* the page draws toasts yet. Its own module, so a bundler splits the toaster
|
|
4
|
+
* off for a page that imports copyText alone (`./copy-text.ts`), and keeps it
|
|
5
|
+
* where the page imports it anyway (`./feedback.ts`) without a warning.
|
|
6
|
+
*/
|
|
7
|
+
export { pageToaster } from "./toaster";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The options a page sets on `window.DS_ONE_PREFERENCES` before the theme
|
|
3
|
+
* and preference modules load: product storage names and the theme's
|
|
4
|
+
* defaults. Product storage names are configuration; the implementation stays
|
|
5
|
+
* shared. It imports nothing, so the theme module travels with it alone.
|
|
6
|
+
*/
|
|
7
|
+
export interface PreferenceOptions {
|
|
8
|
+
storageKey?: string;
|
|
9
|
+
themeStorageKey?: string;
|
|
10
|
+
/** Follow system appearance without reading or writing a saved theme. */
|
|
11
|
+
themeMode?: "system";
|
|
12
|
+
/**
|
|
13
|
+
* The theme a visitor who has chosen nothing sees: `"system"` (the
|
|
14
|
+
* default) follows the system, `"light"` or `"dark"` keeps that theme until
|
|
15
|
+
* they choose. A stored choice always wins; `themeMode: "system"` wins over
|
|
16
|
+
* both.
|
|
17
|
+
*/
|
|
18
|
+
themeDefault?: "light" | "dark" | "system";
|
|
19
|
+
/**
|
|
20
|
+
* The canvas behind the page and the browser's theme-color, per theme, set
|
|
21
|
+
* by the theme runtime before the first paint: Design system 1's paper
|
|
22
|
+
* (`--background`) by default. `false` leaves both to the page.
|
|
23
|
+
*/
|
|
24
|
+
themePaper?: { light: string; dark: string } | false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare global {
|
|
28
|
+
interface Window { DS_ONE_PREFERENCES?: PreferenceOptions; }
|
|
29
|
+
}
|
|
@@ -1,21 +1,13 @@
|
|
|
1
1
|
import type { LanguageCode } from "./i18n";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ThemeMode } from "./theme";
|
|
3
3
|
|
|
4
4
|
export type Preferences = {
|
|
5
5
|
language?: LanguageCode;
|
|
6
|
-
theme?:
|
|
6
|
+
theme?: ThemeMode;
|
|
7
7
|
[key: string]: unknown;
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
export interface PreferenceOptions {
|
|
12
|
-
storageKey?: string;
|
|
13
|
-
themeStorageKey?: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
declare global {
|
|
17
|
-
interface Window { DS_ONE_PREFERENCES?: PreferenceOptions; }
|
|
18
|
-
}
|
|
10
|
+
export type { PreferenceOptions } from "./preference-options";
|
|
19
11
|
|
|
20
12
|
export function preferenceStorageKey(kind: "preferences" | "theme"): string {
|
|
21
13
|
const options = typeof window === "undefined" ? undefined : window.DS_ONE_PREFERENCES;
|
package/DS1/0-face/pricing.ts
CHANGED
|
@@ -1,57 +1,112 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Actual price values will be stored in a database or managed via Stripe.
|
|
2
|
+
* The currency a reader is most likely to think in, from their language or
|
|
3
|
+
* country, and prices written in it. The amounts themselves come from the
|
|
4
|
+
* product's billing (a payment service or its database); this only says how
|
|
5
|
+
* they read. Writing them is `formatMoney` in `./format`.
|
|
7
6
|
*/
|
|
8
|
-
|
|
7
|
+
import { currencySymbol, formatMoney } from "./format";
|
|
8
|
+
import type { MoneyOptions } from "./format";
|
|
9
|
+
import { currentLanguage } from "./i18n";
|
|
9
10
|
import type { LanguageCode } from "./i18n";
|
|
10
11
|
|
|
11
12
|
type PriceLabelOptions = {
|
|
12
|
-
language
|
|
13
|
+
/** The reader's language. Defaults to the current language. */
|
|
14
|
+
language?: LanguageCode;
|
|
15
|
+
/** The reader's country, when known (`US`, `GB`, `JP`); it wins over the language. */
|
|
13
16
|
country?: string;
|
|
14
17
|
};
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
/** The currency each language's readers most often pay in. */
|
|
20
|
+
const LANGUAGE_CURRENCIES: Record<string, string> = {
|
|
21
|
+
da: "DKK",
|
|
22
|
+
de: "EUR",
|
|
23
|
+
en: "USD",
|
|
24
|
+
es: "EUR",
|
|
25
|
+
fi: "EUR",
|
|
26
|
+
fr: "EUR",
|
|
27
|
+
is: "ISK",
|
|
28
|
+
it: "EUR",
|
|
29
|
+
ja: "JPY",
|
|
30
|
+
ko: "KRW",
|
|
31
|
+
nb: "NOK",
|
|
32
|
+
nn: "NOK",
|
|
33
|
+
no: "NOK",
|
|
34
|
+
pt: "EUR",
|
|
35
|
+
"pt-br": "BRL",
|
|
36
|
+
sv: "SEK",
|
|
37
|
+
zh: "CNY",
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const COUNTRY_CURRENCIES: Record<string, string> = {
|
|
41
|
+
US: "USD",
|
|
42
|
+
USA: "USD",
|
|
43
|
+
GB: "GBP",
|
|
44
|
+
UK: "GBP",
|
|
45
|
+
JP: "JPY",
|
|
46
|
+
JPN: "JPY",
|
|
47
|
+
CN: "CNY",
|
|
48
|
+
CHN: "CNY",
|
|
49
|
+
KR: "KRW",
|
|
50
|
+
KOR: "KRW",
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The short labels `getPriceLabel` has always given. Other currencies read
|
|
55
|
+
* the symbol the language writes them with.
|
|
56
|
+
*/
|
|
17
57
|
const PRICE_LABELS: Record<string, string> = {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
58
|
+
DKK: "kr.",
|
|
59
|
+
NOK: "kr.",
|
|
60
|
+
SEK: "kr.",
|
|
61
|
+
ISK: "kr.",
|
|
62
|
+
EUR: "€",
|
|
63
|
+
USD: "$",
|
|
64
|
+
GBP: "£",
|
|
65
|
+
JPY: "¥",
|
|
66
|
+
CNY: "¥",
|
|
67
|
+
KRW: "₩",
|
|
68
|
+
BRL: "R$",
|
|
28
69
|
};
|
|
29
70
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return "$";
|
|
39
|
-
}
|
|
40
|
-
if (countryUpper === "GB" || countryUpper === "UK") {
|
|
41
|
-
return "£";
|
|
42
|
-
}
|
|
43
|
-
if (countryUpper === "JP" || countryUpper === "JPN") {
|
|
44
|
-
return "¥";
|
|
45
|
-
}
|
|
46
|
-
if (countryUpper === "CN" || countryUpper === "CHN") {
|
|
47
|
-
return "¥";
|
|
48
|
-
}
|
|
49
|
-
if (countryUpper === "KR" || countryUpper === "KOR") {
|
|
50
|
-
return "₩";
|
|
51
|
-
}
|
|
71
|
+
/**
|
|
72
|
+
* The currency (ISO 4217 code) for a reader: their country's when it is
|
|
73
|
+
* known, else their language's, else USD. `pt-BR` reads BRL.
|
|
74
|
+
*/
|
|
75
|
+
export function getPriceCurrency(options: PriceLabelOptions = {}): string {
|
|
76
|
+
const country = options.country?.toUpperCase();
|
|
77
|
+
if (country && COUNTRY_CURRENCIES[country]) {
|
|
78
|
+
return COUNTRY_CURRENCIES[country];
|
|
52
79
|
}
|
|
53
80
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
81
|
+
const language = String(options.language || currentLanguage.value || "en")
|
|
82
|
+
.toLowerCase()
|
|
83
|
+
.replace(/_/g, "-");
|
|
84
|
+
const primary = language.split("-")[0] ?? "";
|
|
85
|
+
return LANGUAGE_CURRENCIES[language] ?? LANGUAGE_CURRENCIES[primary] ?? "USD";
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** The currency label for a reader: `kr.`, `€`, `$`, `£`, `¥`, `₩`. */
|
|
89
|
+
export function getPriceLabel(options: PriceLabelOptions = {}): string {
|
|
90
|
+
const currency = getPriceCurrency(options);
|
|
91
|
+
return (
|
|
92
|
+
PRICE_LABELS[currency] ??
|
|
93
|
+
currencySymbol(currency, { language: options.language })
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* A price for a reader: in `currency`, or the reader's currency
|
|
99
|
+
* (`getPriceCurrency`) when none is given, written in their language.
|
|
100
|
+
* `minor` reads the amount in cents, as payment services send it.
|
|
101
|
+
*/
|
|
102
|
+
export function formatPrice(
|
|
103
|
+
amount: number,
|
|
104
|
+
options: PriceLabelOptions & MoneyOptions & { currency?: string } = {}
|
|
105
|
+
): string {
|
|
106
|
+
const { country, currency, ...money } = options;
|
|
107
|
+
return formatMoney(
|
|
108
|
+
amount,
|
|
109
|
+
currency ?? getPriceCurrency({ language: options.language, country }),
|
|
110
|
+
money
|
|
111
|
+
);
|
|
57
112
|
}
|
package/DS1/0-face/scaling.ts
CHANGED
|
@@ -1,15 +1,64 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Design system 1's scale, `--sf`: every measure is multiplied by it.
|
|
3
|
+
*
|
|
4
|
+
* A computer stays at 1, however narrow its window. A phone or a tablet (a
|
|
5
|
+
* mobile browser, or a touch screen whose shorter side is at most 820px) is
|
|
6
|
+
* drawn as if the screen were 280 units wide: the scale is the page's width
|
|
7
|
+
* over 280, never under 0.75 or over 2, so a 375px phone draws everything a
|
|
8
|
+
* third larger.
|
|
9
|
+
*
|
|
10
|
+
* `startScaling()` puts the scale on the page and keeps it there through
|
|
11
|
+
* resizes and turns; `applyScaling()` does it once. Both set `--sf` and, on a
|
|
12
|
+
* phone or tablet, `data-mobile` on the root element. The module imports
|
|
13
|
+
* nothing, so a page without the components copies it alone (Sync 1's `root`
|
|
14
|
+
* export with `"modules": ["scaling"]`). Call it before the page renders, and
|
|
15
|
+
* the first paint is already to scale.
|
|
16
|
+
*
|
|
17
|
+
* A surface, such as a phone drawn on a page, scales to its own width
|
|
18
|
+
* instead: `startScaling({ surface: element })`, or `surface: true` for every
|
|
19
|
+
* `[data-ds-surface]` element. The same rule and snapping apply, on any
|
|
20
|
+
* device, and `--sf` and `--ds-sf` go on the surface alone.
|
|
21
|
+
*/
|
|
2
22
|
export type ScalingMode = "auto" | "fixed" | "fluid";
|
|
3
23
|
|
|
24
|
+
/**
|
|
25
|
+
* How the scale is rounded. `"layout"`: a square (20 units) is a whole number
|
|
26
|
+
* of the 1/64px steps browsers lay pages out in, so a long run of rows stays on
|
|
27
|
+
* ruled lines drawn exactly. `"pixel"`: a square is a whole number of device
|
|
28
|
+
* pixels, rounded down, so every grid line and hairline stays sharp.
|
|
29
|
+
* Without it the scale keeps three decimals.
|
|
30
|
+
*/
|
|
31
|
+
export type ScalingSnap = "layout" | "pixel" | false;
|
|
32
|
+
|
|
4
33
|
export interface ScalingConfig {
|
|
5
34
|
mode: ScalingMode;
|
|
6
35
|
baseWidth: number;
|
|
7
36
|
minScale: number;
|
|
8
37
|
maxScale: number;
|
|
38
|
+
snap?: ScalingSnap;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ScalingOptions extends Partial<ScalingConfig> {
|
|
42
|
+
/**
|
|
43
|
+
* The element that receives `--sf` and `data-mobile`; the document's root by
|
|
44
|
+
* default. With an element `surface`, the element that receives that
|
|
45
|
+
* surface's `--sf` (the surface itself by default).
|
|
46
|
+
*/
|
|
47
|
+
root?: HTMLElement;
|
|
48
|
+
/**
|
|
49
|
+
* Scale to a surface's own width rather than the page's: an element (a
|
|
50
|
+
* phone drawn on a page), or `true` for every element marked
|
|
51
|
+
* `data-ds-surface` in the document when the call is made. A surface is
|
|
52
|
+
* measured by its `clientWidth` and scaled on any device, a computer too,
|
|
53
|
+
* with the same rule and snapping; `--sf` and `--ds-sf` (for the shared
|
|
54
|
+
* components inside) go on the surface, the page and `data-mobile` are left
|
|
55
|
+
* alone. Its width must not depend on its own scale.
|
|
56
|
+
*/
|
|
57
|
+
surface?: HTMLElement | boolean;
|
|
9
58
|
}
|
|
10
59
|
|
|
11
60
|
// ============================================================================
|
|
12
|
-
// Configuration
|
|
61
|
+
// Configuration
|
|
13
62
|
// ============================================================================
|
|
14
63
|
|
|
15
64
|
export const defaultScalingConfig: ScalingConfig = {
|
|
@@ -19,7 +68,114 @@ export const defaultScalingConfig: ScalingConfig = {
|
|
|
19
68
|
maxScale: 2.0,
|
|
20
69
|
};
|
|
21
70
|
|
|
22
|
-
|
|
71
|
+
/** One square in units. */
|
|
72
|
+
const SQUARE = 20;
|
|
73
|
+
/** Browsers lay pages out in 1/64px steps. */
|
|
74
|
+
const LAYOUT_STEPS = 64;
|
|
75
|
+
|
|
76
|
+
/** The factor, rounded so that a square is a whole number of 1/64px layout steps. */
|
|
77
|
+
export function toLayoutStep(factor: number): number {
|
|
78
|
+
return Math.round(factor * SQUARE * LAYOUT_STEPS) / (SQUARE * LAYOUT_STEPS);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** The factor, rounded down so that a square is a whole number of device pixels. */
|
|
82
|
+
export function toDevicePixel(factor: number, pixelRatio = 1): number {
|
|
83
|
+
const ratio = pixelRatio > 0 ? pixelRatio : 1;
|
|
84
|
+
return Math.floor(factor * SQUARE * ratio) / (SQUARE * ratio);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function calculateScalingFactor(viewportWidth: number, config: ScalingConfig = defaultScalingConfig, pixelRatio = 1): number {
|
|
23
88
|
if (config.mode === "fixed") return 1;
|
|
24
|
-
|
|
89
|
+
const factor = Math.max(config.minScale, Math.min(config.maxScale, viewportWidth / config.baseWidth));
|
|
90
|
+
if (config.snap === "layout") return toLayoutStep(factor);
|
|
91
|
+
if (config.snap === "pixel") return toDevicePixel(factor, pixelRatio);
|
|
92
|
+
return Number(factor.toFixed(3));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// Device
|
|
97
|
+
// ============================================================================
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Whether the page is on a phone or a tablet, the screens that scale: the
|
|
101
|
+
* browser says it is mobile, or the screen takes touch and its shorter side
|
|
102
|
+
* is at most 820px. A computer is never one, however narrow its window.
|
|
103
|
+
*/
|
|
104
|
+
export function detectMobileDevice(): boolean {
|
|
105
|
+
if (typeof navigator === "undefined" || typeof window === "undefined") return false;
|
|
106
|
+
const agent = navigator.userAgent || navigator.vendor || "";
|
|
107
|
+
const byAgent = /Mobile|Android|iP(ad|hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)|Windows Phone|Phone|Tablet/i.test(agent);
|
|
108
|
+
const touch = (navigator.maxTouchPoints || 0) > 1;
|
|
109
|
+
const narrow = Math.min(window.innerWidth || 0, window.innerHeight || 0) <= 820;
|
|
110
|
+
return byAgent || (touch && narrow);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ============================================================================
|
|
114
|
+
// Applying the scale
|
|
115
|
+
// ============================================================================
|
|
116
|
+
|
|
117
|
+
/** The surfaces a call scales: the element given, or every `[data-ds-surface]` for `true`. */
|
|
118
|
+
function surfacesOf(surface: ScalingOptions["surface"]): HTMLElement[] {
|
|
119
|
+
if (!surface) return [];
|
|
120
|
+
if (surface === true) return Array.from(document.querySelectorAll<HTMLElement>("[data-ds-surface]"));
|
|
121
|
+
return [surface];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Scales one surface to its own width, whatever the device. */
|
|
125
|
+
function applySurface(surface: HTMLElement, target: HTMLElement, config: Partial<ScalingConfig>): number {
|
|
126
|
+
const factor = calculateScalingFactor(surface.clientWidth || 0, { ...defaultScalingConfig, ...config }, window.devicePixelRatio || 1);
|
|
127
|
+
// Shared components inside read --ds-sf, resolved at their own host, so they draw at the surface's scale too.
|
|
128
|
+
target.style.setProperty("--sf", String(factor));
|
|
129
|
+
target.style.setProperty("--ds-sf", String(factor));
|
|
130
|
+
return factor;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Puts the scale on the page once: `--sf`, and `data-mobile` on a phone or
|
|
135
|
+
* tablet. With `surface`, puts each surface's own scale on it instead. Returns
|
|
136
|
+
* the factor (the first surface's, or 1 when there is none).
|
|
137
|
+
*/
|
|
138
|
+
export function applyScaling(options: ScalingOptions = {}): number {
|
|
139
|
+
if (typeof document === "undefined" || typeof window === "undefined") return 1;
|
|
140
|
+
const { root, surface, ...config } = options;
|
|
141
|
+
if (surface) {
|
|
142
|
+
const factors = surfacesOf(surface).map(element => applySurface(element, (surface !== true && root) || element, config));
|
|
143
|
+
return factors[0] ?? 1;
|
|
144
|
+
}
|
|
145
|
+
return applyPage(root ?? document.documentElement, config);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function applyPage(root: HTMLElement, config: Partial<ScalingConfig>): number {
|
|
149
|
+
const mobile = detectMobileDevice();
|
|
150
|
+
// The page's width without its scroll bar.
|
|
151
|
+
const width = document.documentElement.clientWidth || window.innerWidth || 0;
|
|
152
|
+
const factor = mobile ? calculateScalingFactor(width, { ...defaultScalingConfig, ...config }, window.devicePixelRatio || 1) : 1;
|
|
153
|
+
root.style.setProperty("--sf", String(factor));
|
|
154
|
+
root.toggleAttribute("data-mobile", mobile);
|
|
155
|
+
return factor;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Puts the scale on the page now and again on every resize and turn; a
|
|
160
|
+
* surface is followed as its own size changes. Returns a function that stops
|
|
161
|
+
* following.
|
|
162
|
+
*/
|
|
163
|
+
export function startScaling(options: ScalingOptions = {}): () => void {
|
|
164
|
+
if (typeof window === "undefined" || typeof document === "undefined") return () => {};
|
|
165
|
+
const { root, surface, ...config } = options;
|
|
166
|
+
// Surfaces are found once, so the same ones are followed until stopped.
|
|
167
|
+
const surfaces = surfacesOf(surface);
|
|
168
|
+
const apply = surface
|
|
169
|
+
? () => { for (const element of surfaces) applySurface(element, (surface !== true && root) || element, config); }
|
|
170
|
+
: () => { applyPage(root ?? document.documentElement, config); };
|
|
171
|
+
apply();
|
|
172
|
+
const observer = surfaces.length && typeof ResizeObserver === "function" ? new ResizeObserver(apply) : null;
|
|
173
|
+
for (const element of surfaces) observer?.observe(element);
|
|
174
|
+
window.addEventListener("resize", apply);
|
|
175
|
+
window.addEventListener("orientationchange", apply);
|
|
176
|
+
return () => {
|
|
177
|
+
observer?.disconnect();
|
|
178
|
+
window.removeEventListener("resize", apply);
|
|
179
|
+
window.removeEventListener("orientationchange", apply);
|
|
180
|
+
};
|
|
25
181
|
}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The interface words every product shares: common buttons
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* The interface words every product shares: common buttons and actions (Try
|
|
3
|
+
* again, Undo, Redo, Copy, Copy link, Remove, Rename, Duplicate, Download,
|
|
4
|
+
* Refresh, Open, Send, Clear), Saved, Saving…, Untitled, Account, sign-in,
|
|
5
|
+
* empty states, dates, the settings ds-cycle shows, ds-notice's words, the
|
|
6
|
+
* carousel's and slide's (Carousel, Slide, Previous slide, Next slide, Pause, Play…), the feedback module's (OK, Copied, Could not copy, Notifications), a meter's
|
|
7
|
+
* words ("7 of 10") and a step's (Done, Failed), the site chrome's (Menu,
|
|
8
|
+
* Contents), the key names keys.ts writes as words (`key.ctrl`, `key.shift` …)
|
|
9
|
+
* and the names of the languages. Keyed by the English sentence,
|
|
10
|
+
* in the translations file format, one file per language in `./translations/`.
|
|
6
11
|
*
|
|
7
12
|
* A product turns them on with `configureI18n({ sharedWords: true })`; they
|
|
8
13
|
* sit beneath the product's own words, so the product's text wins. `nn` and
|