@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,165 @@
|
|
|
1
|
+
// ds-footer.ts
|
|
2
|
+
// A site footer: the brand, columns of links, the language and theme, and the
|
|
3
|
+
// copyright. Drawn by 1-root/footer.css, the same classes a page without
|
|
4
|
+
// scripts writes.
|
|
5
|
+
|
|
6
|
+
import { LitElement, html, nothing, unsafeCSS } from "lit";
|
|
7
|
+
import { getText } from "../0-face/i18n";
|
|
8
|
+
import { define } from "../0-face/define";
|
|
9
|
+
import "../2-core/ds-cycle";
|
|
10
|
+
import metrics from "../1-root/component-metrics.css?inline";
|
|
11
|
+
import controls from "../1-root/controls.css?inline";
|
|
12
|
+
import styles from "./styles/ds-footer.css?inline";
|
|
13
|
+
|
|
14
|
+
/** A link in a footer column. */
|
|
15
|
+
export interface FooterLink {
|
|
16
|
+
/** The words: a translation key, or as written with the footer's `literal`. */
|
|
17
|
+
label: string;
|
|
18
|
+
href: string;
|
|
19
|
+
/** Opens elsewhere: in a new tab, with no referrer. */
|
|
20
|
+
external?: boolean;
|
|
21
|
+
/** The page being read: `aria-current="page"`. */
|
|
22
|
+
current?: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** A footer column: a heading and its links. */
|
|
26
|
+
export interface FooterColumn {
|
|
27
|
+
heading?: string;
|
|
28
|
+
links: FooterLink[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** The settings a footer offers, each a `ds-cycle` of that type. */
|
|
32
|
+
export type FooterPreference = "language" | "theme";
|
|
33
|
+
const PREFERENCES: readonly FooterPreference[] = ["language", "theme"];
|
|
34
|
+
|
|
35
|
+
/** The preferences named by an attribute: every one when it is present but empty. */
|
|
36
|
+
export function footerPreferences(value: string | null | undefined): FooterPreference[] {
|
|
37
|
+
if (value == null || value === "false") return [];
|
|
38
|
+
const named = value.split(/[\s,]+/).filter(Boolean);
|
|
39
|
+
if (!named.length || named.includes("true")) return [...PREFERENCES];
|
|
40
|
+
return PREFERENCES.filter(name => named.includes(name));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @element ds-footer
|
|
45
|
+
* @prop {string} brand - The site's name, a link home: a translation key, or
|
|
46
|
+
* the words as they stand with `literal`. The `brand` slot takes its place.
|
|
47
|
+
* @prop {string} href - Where the brand links. `/` by default.
|
|
48
|
+
* @prop {string} tagline - A line about the site under the brand.
|
|
49
|
+
* @prop {FooterColumn[]} columns - The columns of links, eight squares each.
|
|
50
|
+
* @prop {string} label - The columns' accessible name, as a navigation; without it they are plain lists.
|
|
51
|
+
* @prop {string} owner - Who holds the copyright: the brand by default.
|
|
52
|
+
* @prop {number} year - The copyright's year: this year by default.
|
|
53
|
+
* @prop {string} preferences - `language`, `theme` or both, as `ds-cycle`
|
|
54
|
+
* buttons at the end of the last row; present but empty, both.
|
|
55
|
+
* @prop {boolean} literal - Show the words as written, never looked up.
|
|
56
|
+
*
|
|
57
|
+
* @slot brand - The brand, when it is more than words: a logo, a link of the page's own.
|
|
58
|
+
* @slot preferences - Controls of the page's own beside or in place of the cycles.
|
|
59
|
+
* @slot legal - The last line, in place of the copyright.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* <ds-footer brand="Name" tagline="What it does" preferences literal
|
|
63
|
+
* columns='[{"heading":"Product","links":[{"label":"Download","href":"/download"}]}]'>
|
|
64
|
+
* </ds-footer>
|
|
65
|
+
*/
|
|
66
|
+
export class Footer extends LitElement {
|
|
67
|
+
static properties = {
|
|
68
|
+
brand: { type: String },
|
|
69
|
+
href: { type: String },
|
|
70
|
+
tagline: { type: String },
|
|
71
|
+
columns: { type: Array },
|
|
72
|
+
label: { type: String },
|
|
73
|
+
owner: { type: String },
|
|
74
|
+
year: { type: Number },
|
|
75
|
+
preferences: { type: String },
|
|
76
|
+
literal: { type: Boolean, reflect: true },
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
static styles = [unsafeCSS(metrics), unsafeCSS(controls), unsafeCSS(styles)];
|
|
80
|
+
|
|
81
|
+
declare brand: string | undefined;
|
|
82
|
+
declare href: string;
|
|
83
|
+
declare tagline: string | undefined;
|
|
84
|
+
declare columns: FooterColumn[];
|
|
85
|
+
declare label: string | undefined;
|
|
86
|
+
declare owner: string | undefined;
|
|
87
|
+
declare year: number | undefined;
|
|
88
|
+
declare preferences: string | null | undefined;
|
|
89
|
+
declare literal: boolean;
|
|
90
|
+
|
|
91
|
+
private readonly relabel = () => this.requestUpdate();
|
|
92
|
+
|
|
93
|
+
constructor() {
|
|
94
|
+
super();
|
|
95
|
+
this.href = "/";
|
|
96
|
+
this.columns = [];
|
|
97
|
+
this.literal = false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
connectedCallback() {
|
|
101
|
+
super.connectedCallback();
|
|
102
|
+
window.addEventListener("language-changed", this.relabel);
|
|
103
|
+
window.addEventListener("translations-loaded", this.relabel);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
disconnectedCallback() {
|
|
107
|
+
window.removeEventListener("language-changed", this.relabel);
|
|
108
|
+
window.removeEventListener("translations-loaded", this.relabel);
|
|
109
|
+
super.disconnectedCallback();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private words(value: string | undefined): string {
|
|
113
|
+
if (!value) return "";
|
|
114
|
+
return this.literal ? value : getText(value) || value;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private slotted(name: string): boolean {
|
|
118
|
+
return [...this.children].some(node => node.getAttribute("slot") === name);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private link(link: FooterLink) {
|
|
122
|
+
return html`<li><a href=${link.href} aria-current=${link.current ? "page" : nothing}
|
|
123
|
+
target=${link.external ? "_blank" : nothing} rel=${link.external ? "noopener noreferrer" : nothing}>${this.words(link.label)}</a></li>`;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
render() {
|
|
127
|
+
const columns = (Array.isArray(this.columns) ? this.columns : []).filter(column => column && Array.isArray(column.links));
|
|
128
|
+
const preferences = footerPreferences(this.preferences);
|
|
129
|
+
const hasPreferences = preferences.length > 0 || this.slotted("preferences");
|
|
130
|
+
const owner = this.owner ? this.words(this.owner) : this.words(this.brand);
|
|
131
|
+
const year = Number.isFinite(this.year) ? this.year : new Date().getFullYear();
|
|
132
|
+
const brandSlotted = this.slotted("brand");
|
|
133
|
+
const hasBrand = brandSlotted || Boolean(this.brand) || Boolean(this.tagline);
|
|
134
|
+
const list = columns.map(column => html`<div class="ds-footer__column" part="column">
|
|
135
|
+
${column.heading ? html`<h2 class="ds-footer__heading" part="heading">${this.words(column.heading)}</h2>` : nothing}
|
|
136
|
+
<ul class="ds-footer__links">${column.links.map(link => this.link(link))}</ul>
|
|
137
|
+
</div>`);
|
|
138
|
+
return html`<footer class="ds-footer" part="footer">
|
|
139
|
+
<div class="ds-footer__brand" part="brand" ?hidden=${!hasBrand}>
|
|
140
|
+
<slot name="brand" @slotchange=${this.relabel}>${this.brand ? html`<a class="ds-footer__mark" href=${this.href || "/"}>${this.words(this.brand)}</a>` : nothing}</slot>
|
|
141
|
+
${this.tagline ? html`<p class="ds-footer__tagline" part="tagline">${this.words(this.tagline)}</p>` : nothing}
|
|
142
|
+
</div>
|
|
143
|
+
${columns.length
|
|
144
|
+
? this.label
|
|
145
|
+
? html`<nav class="ds-footer__columns" part="columns" aria-label=${this.words(this.label)}>${list}</nav>`
|
|
146
|
+
: html`<div class="ds-footer__columns" part="columns">${list}</div>`
|
|
147
|
+
: nothing}
|
|
148
|
+
<div class="ds-footer__base" part="base">
|
|
149
|
+
<p class="ds-footer__legal" part="legal"><slot name="legal" @slotchange=${this.relabel}>${owner ? `© ${year} ${owner}` : `© ${year}`}</slot></p>
|
|
150
|
+
<div class="ds-footer__preferences" part="preferences" ?hidden=${!hasPreferences}>
|
|
151
|
+
${preferences.map(type => html`<ds-cycle type=${type}></ds-cycle>`)}
|
|
152
|
+
<slot name="preferences" @slotchange=${this.relabel}></slot>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
</footer>`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
define("ds-footer", Footer);
|
|
160
|
+
|
|
161
|
+
declare global {
|
|
162
|
+
interface HTMLElementTagNameMap {
|
|
163
|
+
"ds-footer": Footer;
|
|
164
|
+
}
|
|
165
|
+
}
|
package/DS1/4-page/ds-grid.ts
CHANGED
|
@@ -1,74 +1,54 @@
|
|
|
1
|
-
// ds-grid.ts
|
|
2
|
-
// Simple grid layout component
|
|
3
|
-
|
|
4
1
|
import { LitElement, html, unsafeCSS } from "lit";
|
|
5
|
-
import {
|
|
2
|
+
import { styleMap } from "lit/directives/style-map.js";
|
|
3
|
+
import { define } from "../0-face/define";
|
|
6
4
|
import styles from "./styles/ds-grid.css?inline";
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
define(name: string, constructor: typeof LitElement): void;
|
|
11
|
-
}
|
|
12
|
-
var customElements: CustomElementRegistry;
|
|
13
|
-
}
|
|
6
|
+
export type GridPattern = "grid" | "lines" | "columns" | "dots" | "none";
|
|
7
|
+
const patterns = new Set<GridPattern>(["grid", "lines", "columns", "dots", "none"]);
|
|
14
8
|
|
|
9
|
+
/** Decorative paper or an alignment overlay; never arranges or captures content. */
|
|
15
10
|
export class Grid extends LitElement {
|
|
16
11
|
static properties = {
|
|
17
|
-
align: { type: String },
|
|
12
|
+
align: { type: String, reflect: true },
|
|
13
|
+
pattern: { type: String, reflect: true },
|
|
14
|
+
size: { type: Number },
|
|
15
|
+
rowSize: { type: Number, attribute: "row-size" },
|
|
16
|
+
color: { type: String },
|
|
17
|
+
paper: { type: String },
|
|
18
|
+
contained: { type: Boolean, reflect: true },
|
|
18
19
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
declare align: "left" | "center" | "right";
|
|
21
|
+
declare pattern: GridPattern;
|
|
22
|
+
declare size: number;
|
|
23
|
+
declare rowSize: number | undefined;
|
|
24
|
+
declare color: string;
|
|
25
|
+
declare paper: string;
|
|
26
|
+
declare contained: boolean;
|
|
24
27
|
static styles = unsafeCSS(styles);
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
super
|
|
28
|
-
this.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
this.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
this.resizeTimeout = setTimeout(() => {
|
|
36
|
-
this.updateMobileClass();
|
|
37
|
-
}, 100);
|
|
38
|
-
};
|
|
39
|
-
window.addEventListener("resize", this.resizeObserver);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
disconnectedCallback() {
|
|
43
|
-
super.disconnectedCallback();
|
|
44
|
-
if (this.resizeObserver) {
|
|
45
|
-
window.removeEventListener("resize", this.resizeObserver);
|
|
46
|
-
}
|
|
47
|
-
if (this.resizeTimeout) {
|
|
48
|
-
clearTimeout(this.resizeTimeout);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
private updateMobileClass() {
|
|
53
|
-
const isMobile = detectMobileDevice();
|
|
54
|
-
if (isMobile) {
|
|
55
|
-
this.classList.add("mobile");
|
|
56
|
-
this.classList.remove("desktop");
|
|
57
|
-
} else {
|
|
58
|
-
this.classList.add("desktop");
|
|
59
|
-
this.classList.remove("mobile");
|
|
60
|
-
}
|
|
29
|
+
constructor() {
|
|
30
|
+
super();
|
|
31
|
+
this.align = "center";
|
|
32
|
+
this.pattern = "grid";
|
|
33
|
+
this.size = 20;
|
|
34
|
+
this.rowSize = undefined;
|
|
35
|
+
this.color = "";
|
|
36
|
+
this.paper = "";
|
|
37
|
+
this.contained = false;
|
|
61
38
|
}
|
|
62
39
|
|
|
63
40
|
render() {
|
|
64
|
-
|
|
41
|
+
const size = Number.isFinite(this.size) && this.size > 0 ? this.size : 20;
|
|
42
|
+
const row = Number.isFinite(this.rowSize) && this.rowSize! > 0 ? this.rowSize! : size;
|
|
43
|
+
return html`<div aria-hidden="true" class="paper" data-pattern=${patterns.has(this.pattern) ? this.pattern : "grid"}
|
|
44
|
+
style=${styleMap({
|
|
45
|
+
"--pitch-x": `${size}px`,
|
|
46
|
+
"--pitch-y": `${row}px`,
|
|
47
|
+
"--ink": this.color || "var(--ds-grid-color, color-mix(in srgb, var(--ds-text-color, var(--text-color, currentColor)) 12%, transparent))",
|
|
48
|
+
"--paper": this.paper || "var(--ds-grid-paper, transparent)",
|
|
49
|
+
})}></div>`;
|
|
65
50
|
}
|
|
66
51
|
}
|
|
67
52
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
declare global {
|
|
71
|
-
interface HTMLElementTagNameMap {
|
|
72
|
-
"ds-grid": Grid;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
53
|
+
define("ds-grid", Grid);
|
|
54
|
+
declare global { interface HTMLElementTagNameMap { "ds-grid": Grid } }
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// ds-header.ts
|
|
2
|
+
// A site header: the brand, the navigation with the page you are on, and the
|
|
3
|
+
// actions, folding into a drawer on a narrow screen. Drawn by 1-root/header.css,
|
|
4
|
+
// the same classes a page without scripts writes, and opened by 0-face/drawer.ts.
|
|
5
|
+
|
|
6
|
+
import { LitElement, html, nothing, unsafeCSS, type PropertyValues } from "lit";
|
|
7
|
+
import { getText } from "../0-face/i18n";
|
|
8
|
+
import { define } from "../0-face/define";
|
|
9
|
+
import { attachDrawer, type Drawer } from "../0-face/drawer";
|
|
10
|
+
import { markCurrentLink } from "../0-face/header";
|
|
11
|
+
import "../2-core/ds-icon";
|
|
12
|
+
import metrics from "../1-root/component-metrics.css?inline";
|
|
13
|
+
import controls from "../1-root/controls.css?inline";
|
|
14
|
+
import styles from "./styles/ds-header.css?inline";
|
|
15
|
+
|
|
16
|
+
/** The shared word that names the menu button and its drawer. */
|
|
17
|
+
export const MENU_LABEL = "Menu";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @element ds-header
|
|
21
|
+
* @prop {string} brand - The site's name, a link home: a translation key, or
|
|
22
|
+
* the words as they stand with `literal`. The `brand` slot takes its place.
|
|
23
|
+
* @prop {string} href - Where the brand links. `/` by default.
|
|
24
|
+
* @prop {string} label - The navigation's accessible name, when a page has more than one.
|
|
25
|
+
* @prop {boolean} literal - Show `brand` as written, never looked up.
|
|
26
|
+
* @prop {boolean} sticky - Stay at the top of the page as it scrolls, on the paper.
|
|
27
|
+
*
|
|
28
|
+
* @slot - The navigation: `<a href>` links, one square high. The link to the
|
|
29
|
+
* address being read gets `aria-current="page"` unless one is marked.
|
|
30
|
+
* @slot brand - The brand, when it is more than words: a logo, a link of the page's own.
|
|
31
|
+
* @slot actions - Buttons or links at the end of the row.
|
|
32
|
+
*
|
|
33
|
+
* @fires ds-header-menu - The drawer opened or closed; `detail.open` says which.
|
|
34
|
+
*
|
|
35
|
+
* Below thirty squares of width the navigation and actions fold away and a
|
|
36
|
+
* menu button (the shared word "Menu") opens them in a drawer over the page:
|
|
37
|
+
* focus stays inside it, Escape, its close button, a link or the screen
|
|
38
|
+
* widening close it, and the page holds its scroll meanwhile.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* <ds-header brand="Name" literal>
|
|
42
|
+
* <a href="/">Home</a>
|
|
43
|
+
* <a href="/help">Help</a>
|
|
44
|
+
* <ds-button slot="actions" primary href="/download">Download</ds-button>
|
|
45
|
+
* </ds-header>
|
|
46
|
+
*/
|
|
47
|
+
export class Header extends LitElement {
|
|
48
|
+
static properties = {
|
|
49
|
+
brand: { type: String },
|
|
50
|
+
href: { type: String },
|
|
51
|
+
label: { type: String },
|
|
52
|
+
literal: { type: Boolean, reflect: true },
|
|
53
|
+
sticky: { type: Boolean, reflect: true },
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
static styles = [unsafeCSS(metrics), unsafeCSS(controls), unsafeCSS(styles)];
|
|
57
|
+
|
|
58
|
+
declare brand: string | undefined;
|
|
59
|
+
declare href: string;
|
|
60
|
+
declare label: string | undefined;
|
|
61
|
+
declare literal: boolean;
|
|
62
|
+
declare sticky: boolean;
|
|
63
|
+
|
|
64
|
+
private drawer: Drawer | null = null;
|
|
65
|
+
private readonly relabel = () => this.requestUpdate();
|
|
66
|
+
|
|
67
|
+
constructor() {
|
|
68
|
+
super();
|
|
69
|
+
this.href = "/";
|
|
70
|
+
this.literal = false;
|
|
71
|
+
this.sticky = false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Whether the drawer is open. */
|
|
75
|
+
get menuOpen(): boolean {
|
|
76
|
+
return this.drawer?.isOpen ?? false;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Open the drawer (on a narrow screen, where the menu button shows). */
|
|
80
|
+
openMenu(): void { this.drawer?.open(); }
|
|
81
|
+
|
|
82
|
+
/** Close the drawer. */
|
|
83
|
+
closeMenu(): void { this.drawer?.close(); }
|
|
84
|
+
|
|
85
|
+
connectedCallback() {
|
|
86
|
+
super.connectedCallback();
|
|
87
|
+
window.addEventListener("language-changed", this.relabel);
|
|
88
|
+
window.addEventListener("translations-loaded", this.relabel);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
disconnectedCallback() {
|
|
92
|
+
window.removeEventListener("language-changed", this.relabel);
|
|
93
|
+
window.removeEventListener("translations-loaded", this.relabel);
|
|
94
|
+
this.drawer?.destroy();
|
|
95
|
+
this.drawer = null;
|
|
96
|
+
super.disconnectedCallback();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
protected firstUpdated() {
|
|
100
|
+
markCurrentLink(this.links());
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
protected updated(changed: PropertyValues<this>) {
|
|
104
|
+
super.updated(changed);
|
|
105
|
+
if (this.drawer) return;
|
|
106
|
+
const root = this.renderRoot;
|
|
107
|
+
const toggle = root.querySelector<HTMLElement>('[part="toggle"]');
|
|
108
|
+
const panel = root.querySelector<HTMLDialogElement>('[part="drawer"]');
|
|
109
|
+
if (!toggle || !panel) return;
|
|
110
|
+
this.drawer = attachDrawer({
|
|
111
|
+
toggle,
|
|
112
|
+
panel,
|
|
113
|
+
content: () => [...root.querySelectorAll(':is([part="nav"], [part="actions"]):not([hidden])')],
|
|
114
|
+
onToggle: open => this.dispatchEvent(new CustomEvent("ds-header-menu", { bubbles: true, composed: true, detail: { open } })),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private words(value: string | undefined): string {
|
|
119
|
+
if (!value) return "";
|
|
120
|
+
return this.literal ? value : getText(value) || value;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Light-DOM children that fill a slot: elements, or text that is not blank. */
|
|
124
|
+
private slotted(name: string): boolean {
|
|
125
|
+
return [...this.childNodes].some(node => name
|
|
126
|
+
? node instanceof Element && node.getAttribute("slot") === name
|
|
127
|
+
: node instanceof Element ? !node.hasAttribute("slot") : node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim()));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
private links(): HTMLAnchorElement[] {
|
|
131
|
+
return [...this.children].filter((child): child is HTMLAnchorElement => child instanceof HTMLAnchorElement && !child.hasAttribute("slot"));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private onNavChange = () => {
|
|
135
|
+
markCurrentLink(this.links());
|
|
136
|
+
this.requestUpdate();
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
render() {
|
|
140
|
+
const menu = getText(MENU_LABEL) || MENU_LABEL;
|
|
141
|
+
const close = getText("Close") || "Close";
|
|
142
|
+
const hasNav = this.slotted("");
|
|
143
|
+
const hasActions = this.slotted("actions");
|
|
144
|
+
const brand = this.slotted("brand")
|
|
145
|
+
? html`<span class="ds-header__brand" part="brand"><slot name="brand" @slotchange=${this.relabel}></slot></span>`
|
|
146
|
+
: this.brand
|
|
147
|
+
? html`<a class="ds-header__brand" part="brand" href=${this.href || "/"}>${this.words(this.brand)}</a>`
|
|
148
|
+
: html`<slot name="brand" @slotchange=${this.relabel}></slot>`;
|
|
149
|
+
return html`<header class="ds-header${this.sticky ? " ds-header--sticky" : ""}" part="header">
|
|
150
|
+
${brand}
|
|
151
|
+
<nav class="ds-header__nav" part="nav" id="nav" aria-label=${this.label ? this.words(this.label) : nothing} ?hidden=${!hasNav}><slot @slotchange=${this.onNavChange}></slot></nav>
|
|
152
|
+
<div class="ds-header__actions" part="actions" ?hidden=${!hasActions}><slot name="actions" @slotchange=${this.relabel}></slot></div>
|
|
153
|
+
<button class="ds-button ds-button--icon ds-header__toggle" part="toggle" type="button" aria-label=${menu} aria-controls="drawer" ?hidden=${!hasNav && !hasActions}>
|
|
154
|
+
<ds-icon type="menu" size="large" aria-hidden="true"></ds-icon><ds-icon type="close" size="large" aria-hidden="true"></ds-icon>
|
|
155
|
+
</button>
|
|
156
|
+
<dialog class="ds-dialog ds-drawer" part="drawer" id="drawer" aria-label=${menu}>
|
|
157
|
+
<div class="ds-drawer__bar"><button class="ds-button ds-button--icon ds-drawer__close" part="close" type="button" aria-label=${close}>
|
|
158
|
+
<ds-icon type="close" size="large" aria-hidden="true"></ds-icon>
|
|
159
|
+
</button></div>
|
|
160
|
+
</dialog>
|
|
161
|
+
</header>`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
define("ds-header", Header);
|
|
166
|
+
|
|
167
|
+
declare global {
|
|
168
|
+
interface HTMLElementTagNameMap {
|
|
169
|
+
"ds-header": Header;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { LitElement, html, unsafeCSS, type PropertyValues } from "lit";
|
|
2
|
+
import { ifDefined } from "lit/directives/if-defined.js";
|
|
3
|
+
import { define } from "../0-face/define";
|
|
4
|
+
import { attachDrawer, type Drawer } from "../0-face/drawer";
|
|
5
|
+
import { getText } from "../0-face/i18n";
|
|
6
|
+
import "../2-core/ds-icon";
|
|
7
|
+
import controls from "../1-root/controls.css?inline";
|
|
8
|
+
import styles from "./styles/ds-page.css?inline";
|
|
9
|
+
|
|
10
|
+
export type PageLayout = "sidebar" | "split" | "inspector" | "column" | "centered" | "tiles";
|
|
11
|
+
export const PAGE_LAYOUTS: readonly PageLayout[] = ["sidebar", "split", "inspector", "column", "centered", "tiles"];
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A standard page: where units stand on the grid. Every layout uses the same
|
|
15
|
+
* five areas, so content can move between layouts without being rewritten.
|
|
16
|
+
*
|
|
17
|
+
* - `slot="header"` runs along the top of the main area
|
|
18
|
+
* - `slot="nav"` is the leading column: navigation, or the list in `split`
|
|
19
|
+
* - the default slot is the main area
|
|
20
|
+
* - `slot="aside"` is the trailing column, shown by `inspector`
|
|
21
|
+
* - `slot="footer"` runs along the bottom of the main area
|
|
22
|
+
*
|
|
23
|
+
* Columns are whole squares: `sidebar` and `inspector` lead with 12, `split`
|
|
24
|
+
* with 16; `column` is 32 wide and `centered` 16, and `measure` sets either in
|
|
25
|
+
* whole squares. A centred column stands on a whole square: the room beside it
|
|
26
|
+
* is rounded down to squares, so the column never straddles a grid line.
|
|
27
|
+
* `tiles` places each main child in a 12-square tile. Below 30 squares of
|
|
28
|
+
* width every layout stacks.
|
|
29
|
+
*
|
|
30
|
+
* With `drawer`, the navigation folds away below 30 squares instead of
|
|
31
|
+
* standing above the work: a menu button one square wide stands before the
|
|
32
|
+
* header and opens it in a drawer over the page (0-face/drawer.ts, the
|
|
33
|
+
* header's), with focus kept inside, closed by Escape, its close button, a
|
|
34
|
+
* link or the page widening, and the page's scroll held behind it.
|
|
35
|
+
*
|
|
36
|
+
* @element ds-page
|
|
37
|
+
* @attr layout - `sidebar`, `split`, `inspector`, `column`, `centered` or `tiles`.
|
|
38
|
+
* @attr divided - Draws a hairline between the columns.
|
|
39
|
+
* @attr measure - Width of the `column` or `centered` column in whole squares.
|
|
40
|
+
* @attr fill - Takes its container's height; each column scrolls on its own.
|
|
41
|
+
* @attr view - Labels each area with its slot name, for inspection.
|
|
42
|
+
* @attr drawer - Folds the navigation into a drawer on a narrow page.
|
|
43
|
+
* @attr drawer-label - The menu button's and drawer's name: a translation key, the shared word "Menu" by default.
|
|
44
|
+
* @fires ds-page-drawer - The drawer opened or closed; `detail.open` says which.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* <ds-page layout="sidebar">
|
|
48
|
+
* <ds-sidebar slot="nav" label="Projects"></ds-sidebar>
|
|
49
|
+
* <ds-row slot="header" fill>…</ds-row>
|
|
50
|
+
* <ds-list>…</ds-list>
|
|
51
|
+
* </ds-page>
|
|
52
|
+
*/
|
|
53
|
+
export class Page extends LitElement {
|
|
54
|
+
static properties = {
|
|
55
|
+
layout: { type: String, reflect: true },
|
|
56
|
+
divided: { type: Boolean, reflect: true },
|
|
57
|
+
measure: { type: Number, reflect: true },
|
|
58
|
+
fill: { type: Boolean, reflect: true },
|
|
59
|
+
view: { type: Boolean, reflect: true },
|
|
60
|
+
drawer: { type: Boolean, reflect: true },
|
|
61
|
+
drawerLabel: { type: String, attribute: "drawer-label" },
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
declare layout: PageLayout;
|
|
65
|
+
declare divided: boolean;
|
|
66
|
+
declare measure: number | undefined;
|
|
67
|
+
declare fill: boolean;
|
|
68
|
+
declare view: boolean;
|
|
69
|
+
declare drawer: boolean;
|
|
70
|
+
declare drawerLabel: string | undefined;
|
|
71
|
+
|
|
72
|
+
static styles = [unsafeCSS(controls), unsafeCSS(styles)];
|
|
73
|
+
|
|
74
|
+
private navigationDrawer: Drawer | null = null;
|
|
75
|
+
private readonly relabel = () => this.requestUpdate();
|
|
76
|
+
|
|
77
|
+
constructor() {
|
|
78
|
+
super();
|
|
79
|
+
this.layout = "sidebar";
|
|
80
|
+
this.divided = false;
|
|
81
|
+
this.fill = false;
|
|
82
|
+
this.view = false;
|
|
83
|
+
this.drawer = false;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
connectedCallback() {
|
|
87
|
+
super.connectedCallback();
|
|
88
|
+
window.addEventListener("language-changed", this.relabel);
|
|
89
|
+
window.addEventListener("translations-loaded", this.relabel);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
disconnectedCallback() {
|
|
93
|
+
window.removeEventListener("language-changed", this.relabel);
|
|
94
|
+
window.removeEventListener("translations-loaded", this.relabel);
|
|
95
|
+
this.navigationDrawer?.destroy();
|
|
96
|
+
this.navigationDrawer = null;
|
|
97
|
+
super.disconnectedCallback();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Whether the navigation drawer is open. */
|
|
101
|
+
get drawerOpen(): boolean {
|
|
102
|
+
return this.navigationDrawer?.isOpen ?? false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Open the navigation drawer (on a narrow page with `drawer`). */
|
|
106
|
+
openDrawer(): void { this.navigationDrawer?.open(); }
|
|
107
|
+
|
|
108
|
+
/** Close the navigation drawer. */
|
|
109
|
+
closeDrawer(): void { this.navigationDrawer?.close(); }
|
|
110
|
+
|
|
111
|
+
protected updated(changed: PropertyValues<this>) {
|
|
112
|
+
super.updated(changed);
|
|
113
|
+
if (!changed.has("drawer")) return;
|
|
114
|
+
if (!this.drawer) {
|
|
115
|
+
this.navigationDrawer?.destroy();
|
|
116
|
+
this.navigationDrawer = null;
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const root = this.renderRoot;
|
|
120
|
+
const toggle = root.querySelector<HTMLElement>('[part="drawer-toggle"]');
|
|
121
|
+
const panel = root.querySelector<HTMLDialogElement>('[part="drawer"]');
|
|
122
|
+
const nav = root.querySelector('[part="nav"]');
|
|
123
|
+
if (!toggle || !panel || !nav || this.navigationDrawer) return;
|
|
124
|
+
this.navigationDrawer = attachDrawer({
|
|
125
|
+
toggle, panel, content: [nav],
|
|
126
|
+
onToggle: open => this.dispatchEvent(new CustomEvent("ds-page-drawer", { bubbles: true, composed: true, detail: { open } })),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
render() {
|
|
131
|
+
const label = getText(this.drawerLabel || "Menu") || this.drawerLabel || "Menu";
|
|
132
|
+
const close = getText("Close") || "Close";
|
|
133
|
+
return html`
|
|
134
|
+
<div class="page" part="page" style=${ifDefined(measureStyle(this.measure))}>
|
|
135
|
+
<div class="bar" part="bar" ?hidden=${!this.drawer}>
|
|
136
|
+
<button class="ds-button ds-button--icon" part="drawer-toggle" type="button" aria-label=${label} aria-controls="drawer">
|
|
137
|
+
<ds-icon type="menu" size="large" aria-hidden="true"></ds-icon><ds-icon type="close" size="large" aria-hidden="true"></ds-icon>
|
|
138
|
+
</button>
|
|
139
|
+
</div>
|
|
140
|
+
<dialog class="ds-dialog ds-drawer" part="drawer" id="drawer" aria-label=${label}>
|
|
141
|
+
<div class="ds-drawer__bar"><button class="ds-button ds-button--icon ds-drawer__close" part="drawer-close" type="button" aria-label=${close}>
|
|
142
|
+
<ds-icon type="close" size="large" aria-hidden="true"></ds-icon>
|
|
143
|
+
</button></div>
|
|
144
|
+
</dialog>
|
|
145
|
+
<div class="area nav" part="nav" data-area="nav"><slot name="nav"></slot></div>
|
|
146
|
+
<div class="area header" part="header" data-area="header"><slot name="header"></slot></div>
|
|
147
|
+
<div class="area main" part="main" data-area="main"><slot></slot></div>
|
|
148
|
+
<div class="area aside" part="aside" data-area="aside"><slot name="aside"></slot></div>
|
|
149
|
+
<div class="area footer" part="footer" data-area="footer"><slot name="footer"></slot></div>
|
|
150
|
+
</div>
|
|
151
|
+
`;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
firstUpdated() {
|
|
155
|
+
// An area with nothing in it takes no room, so a header or footer is optional.
|
|
156
|
+
this.renderRoot.querySelectorAll("slot").forEach(slot => {
|
|
157
|
+
const sync = () => slot.parentElement?.toggleAttribute("data-empty", slot.assignedNodes({ flatten: true }).every(empty));
|
|
158
|
+
slot.addEventListener("slotchange", sync);
|
|
159
|
+
sync();
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* A measure is a count of squares: 28 is 28 squares, never 28.5 or 28px. A
|
|
166
|
+
* fraction rounds to the nearest square, and anything that is not a positive
|
|
167
|
+
* number is ignored so the layout keeps its own width.
|
|
168
|
+
*/
|
|
169
|
+
export function measureStyle(measure: number | null | undefined): string | undefined {
|
|
170
|
+
const squares = Math.round(Number(measure));
|
|
171
|
+
return Number.isFinite(squares) && squares >= 1 ? `--ds-page-measure: calc(${squares} * var(--ds-unit))` : undefined;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function empty(node: Node): boolean {
|
|
175
|
+
return node.nodeType === Node.TEXT_NODE ? !node.textContent?.trim() : node.nodeType !== Node.ELEMENT_NODE;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
define("ds-page", Page);
|
|
179
|
+
|
|
180
|
+
declare global {
|
|
181
|
+
interface HTMLElementTagNameMap {
|
|
182
|
+
"ds-page": Page;
|
|
183
|
+
}
|
|
184
|
+
}
|
package/DS1/4-page/email.ts
CHANGED
|
@@ -40,9 +40,8 @@ export function gridText(content: string): string {
|
|
|
40
40
|
return `<div class="ds-email-ink" style="display:block;position:relative;top:2px;padding-left:2px">${content}</div>`
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
/** Static equivalent of
|
|
44
|
-
*
|
|
45
|
-
* Ezo client/design/2-core/styles/ezo-text.css: centered 15px line in a 16px text box.
|
|
43
|
+
/** Static equivalent of a primary ds-button containing ds-text:
|
|
44
|
+
* a 16px control with a 0.5px horizontal inset, and a centered 15px line in a 16px text box.
|
|
46
45
|
* Half-pixel vertical padding reproduces that centering without Lit or flexbox.
|
|
47
46
|
*/
|
|
48
47
|
export function primaryEmailButton(
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* ds-document.css */
|
|
2
|
+
/* The element places the two columns; 1-root/document.css draws them, and the
|
|
3
|
+
writing in the page is drawn by prose.css, which the element brings. */
|
|
4
|
+
|
|
5
|
+
:host {
|
|
6
|
+
display: block;
|
|
7
|
+
min-width: 0;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
:host([hidden]),
|
|
11
|
+
[hidden] {
|
|
12
|
+
display: none !important;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* The page's own contents take the list's place. */
|
|
16
|
+
::slotted([slot="contents"]) {
|
|
17
|
+
margin: 0;
|
|
18
|
+
}
|