@0001-labs/design-system-1 0.3.0-alpha.28 → 0.3.0
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/button-label.ts +28 -0
- package/DS1/0-face/calendar.ts +6 -4
- package/DS1/0-face/carousel.ts +70 -0
- package/DS1/0-face/constraint-panel.ts +422 -0
- package/DS1/0-face/constraint-site.ts +200 -0
- package/DS1/0-face/constraints.ts +281 -0
- package/DS1/0-face/copy-text.ts +1 -1
- package/DS1/0-face/cut-fade.ts +312 -0
- package/DS1/0-face/define.ts +30 -2
- package/DS1/0-face/face-correction.ts +96 -0
- package/DS1/0-face/failures.ts +32 -0
- package/DS1/0-face/feedback-overlays.ts +5 -3
- package/DS1/0-face/feedback.ts +3 -0
- package/DS1/0-face/focus-vision.swift +31 -0
- package/DS1/0-face/focus.ts +181 -0
- package/DS1/0-face/google-face-metrics.json +102 -0
- package/DS1/0-face/grid.ts +61 -4
- package/DS1/0-face/i18n.ts +36 -18
- package/DS1/0-face/layout-inspector.ts +124 -98
- package/DS1/0-face/preference-options.ts +4 -0
- package/DS1/0-face/scaling.ts +21 -3
- package/DS1/0-face/shape.ts +43 -0
- package/DS1/0-face/text-contrast.ts +164 -0
- package/DS1/0-face/theme-bootstrap.js +43 -0
- package/DS1/0-face/toast-queue.ts +7 -1
- package/DS1/0-face/translations/da.json +10 -1
- package/DS1/0-face/translations/de.json +10 -1
- package/DS1/0-face/translations/en.json +10 -1
- package/DS1/0-face/translations/es.json +10 -1
- package/DS1/0-face/translations/fi.json +10 -1
- package/DS1/0-face/translations/fr.json +10 -1
- package/DS1/0-face/translations/is.json +10 -1
- package/DS1/0-face/translations/it.json +10 -1
- package/DS1/0-face/translations/ja.json +10 -1
- package/DS1/0-face/translations/ko.json +10 -1
- package/DS1/0-face/translations/nb.json +10 -1
- package/DS1/0-face/translations/pt-BR.json +10 -1
- package/DS1/0-face/translations/pt.json +10 -1
- package/DS1/0-face/translations/sv.json +10 -1
- package/DS1/0-face/translations/zh.json +10 -1
- package/DS1/0-face/word-wrap.ts +113 -0
- package/DS1/1-root/card.css +47 -20
- package/DS1/1-root/carousel.css +7 -0
- package/DS1/1-root/cjk.css +1 -1
- package/DS1/1-root/component-tokens.css +3 -2
- package/DS1/1-root/context.css +44 -6
- package/DS1/1-root/controls.css +99 -8
- package/DS1/1-root/document.css +9 -1
- package/DS1/1-root/empty.css +46 -5
- package/DS1/1-root/figures.css +50 -3
- package/DS1/1-root/fonts.css +1 -1
- package/DS1/1-root/footer.css +147 -16
- package/DS1/1-root/foundation.ts +60 -0
- package/DS1/1-root/guide.css +35 -0
- package/DS1/1-root/header.css +30 -9
- package/DS1/1-root/material.css +67 -0
- package/DS1/1-root/notice.css +10 -2
- package/DS1/1-root/one.css +14 -7
- package/DS1/1-root/progress.css +9 -1
- package/DS1/1-root/row.css +68 -2
- package/DS1/1-root/table.css +47 -4
- package/DS1/1-root/text.css +26 -0
- package/DS1/2-core/button-split.ts +10 -5
- package/DS1/2-core/chart/chart.css +71 -2
- package/DS1/2-core/chart/grid-chart.ts +2 -1
- package/DS1/2-core/ds-activity.ts +32 -0
- package/DS1/2-core/ds-app-chrome.ts +1 -0
- package/DS1/2-core/ds-avatar.ts +35 -6
- package/DS1/2-core/ds-badge.ts +8 -1
- package/DS1/2-core/ds-button.ts +7 -1
- package/DS1/2-core/ds-chart.ts +184 -49
- package/DS1/2-core/ds-cycle.ts +27 -186
- package/DS1/2-core/ds-device-bezel.ts +1 -0
- package/DS1/2-core/ds-empty.ts +6 -4
- package/DS1/2-core/ds-input.ts +23 -3
- package/DS1/2-core/ds-message.ts +22 -0
- package/DS1/2-core/ds-number.ts +349 -0
- package/DS1/2-core/ds-progress.ts +3 -0
- package/DS1/2-core/ds-radio.ts +3 -0
- package/DS1/2-core/ds-stat.ts +3 -0
- package/DS1/2-core/ds-switch.ts +5 -1
- package/DS1/2-core/ds-tag.ts +9 -2
- package/DS1/2-core/ds-text.ts +7 -0
- package/DS1/2-core/ds-token.ts +3 -0
- package/DS1/2-core/ds-tooltip.ts +17 -2
- package/DS1/2-core/ds-window.ts +1 -0
- package/DS1/2-core/generated/ds-icon-map.ts +47 -5
- package/DS1/2-core/generated/icons-extra.ts +24 -3
- package/DS1/2-core/generated/icons-immediate.ts +3 -3
- package/DS1/2-core/number-expression.ts +64 -0
- package/DS1/2-core/styles/ds-activity.css +16 -0
- package/DS1/2-core/styles/ds-badge.css +4 -1
- package/DS1/2-core/styles/ds-button-host.css +45 -12
- package/DS1/2-core/styles/ds-button-split.css +8 -0
- package/DS1/2-core/styles/ds-button.css +92 -19
- package/DS1/2-core/styles/ds-card.css +6 -0
- package/DS1/2-core/styles/ds-checkbox.css +20 -8
- package/DS1/2-core/styles/ds-image.css +2 -1
- package/DS1/2-core/styles/ds-input.css +37 -4
- package/DS1/2-core/styles/ds-number.css +127 -0
- package/DS1/2-core/styles/ds-radio.css +4 -1
- package/DS1/2-core/styles/ds-switch.css +34 -4
- package/DS1/2-core/styles/ds-tag.css +32 -5
- package/DS1/2-core/styles/ds-text.css +13 -4
- package/DS1/2-core/styles/ds-token.css +4 -1
- package/DS1/2-core/styles/ds-tooltip.css +13 -7
- package/DS1/3-unit/calendar-base.ts +5 -2
- package/DS1/3-unit/ds-calendar.ts +711 -37
- package/DS1/3-unit/ds-carousel.ts +13 -1
- package/DS1/3-unit/ds-context.ts +40 -2
- package/DS1/3-unit/ds-form.ts +45 -10
- package/DS1/3-unit/ds-list.ts +31 -3
- package/DS1/3-unit/ds-matrix.ts +3 -0
- package/DS1/3-unit/ds-menu.ts +9 -5
- package/DS1/3-unit/ds-row.ts +17 -2
- package/DS1/3-unit/ds-select.ts +1 -1
- package/DS1/3-unit/ds-sidebar.ts +18 -3
- package/DS1/3-unit/ds-table-of-contents.ts +166 -0
- package/DS1/3-unit/ds-tabs.ts +40 -2
- package/DS1/3-unit/styles/ds-calendar.css +356 -42
- package/DS1/3-unit/styles/ds-context.css +38 -0
- package/DS1/3-unit/styles/ds-list.css +26 -1
- package/DS1/3-unit/styles/ds-matrix.css +4 -1
- package/DS1/3-unit/styles/ds-row.css +39 -0
- package/DS1/3-unit/styles/ds-select.css +22 -12
- package/DS1/3-unit/styles/ds-sidebar.css +16 -2
- package/DS1/3-unit/styles/ds-table-of-contents.css +40 -0
- package/DS1/3-unit/styles/ds-tabs.css +95 -0
- package/DS1/4-page/ds-document.ts +3 -0
- package/DS1/4-page/ds-footer.ts +93 -18
- package/DS1/4-page/ds-header.ts +5 -1
- package/DS1/4-page/ds-overlay.ts +8 -3
- package/DS1/4-page/ds-page.ts +22 -1
- package/DS1/4-page/email.ts +7 -4
- package/DS1/4-page/styles/ds-container.css +0 -1
- package/DS1/4-page/styles/ds-overlay.css +7 -0
- package/DS1/4-page/styles/ds-page.css +10 -0
- package/DS1/5-visual-kit/app-chrome.ts +129 -0
- package/DS1/5-visual-kit/bezels.ts +394 -0
- package/DS1/5-visual-kit/browser-icons.LICENSE +53 -0
- package/DS1/5-visual-kit/browser-icons.ts +47 -0
- package/DS1/5-visual-kit/browser-styles.ts +53 -0
- package/DS1/5-visual-kit/device-bezel.ts +55 -0
- package/DS1/5-visual-kit/instagram-frame.ts +15 -0
- package/DS1/5-visual-kit/instagram.ts +41 -0
- package/DS1/5-visual-kit/mobile-chrome.ts +25 -0
- package/DS1/5-visual-kit/native-icon-paths.ts +145 -0
- package/DS1/5-visual-kit/window.ts +22 -0
- package/DS1/components.ts +1 -0
- package/DS1/index.ts +14 -1
- package/DS1/react/choice.ts +4 -2
- package/DS1/react/context.ts +11 -6
- package/DS1/react/empty.ts +2 -2
- package/DS1/react/footer.ts +5 -5
- package/DS1/react/header.ts +1 -1
- package/DS1/react/message.ts +4 -2
- package/DS1/react/number.ts +53 -0
- package/DS1/react/sidebar.ts +4 -2
- package/DS1/react/table-of-contents.ts +28 -0
- package/DS1/x-flag/LICENSE.md +26 -0
- package/DS1/x-flag/ac.svg +1 -0
- package/DS1/x-flag/ad.svg +1 -0
- package/DS1/x-flag/ae.svg +1 -0
- package/DS1/x-flag/af.svg +1 -0
- package/DS1/x-flag/ag.svg +1 -0
- package/DS1/x-flag/ai.svg +1 -0
- package/DS1/x-flag/al.svg +1 -0
- package/DS1/x-flag/am.svg +1 -0
- package/DS1/x-flag/ao.svg +1 -0
- package/DS1/x-flag/aq.svg +1 -0
- package/DS1/x-flag/ar.svg +1 -0
- package/DS1/x-flag/as.svg +1 -0
- package/DS1/x-flag/at.svg +1 -0
- package/DS1/x-flag/au.svg +1 -0
- package/DS1/x-flag/aw.svg +1 -0
- package/DS1/x-flag/ax.svg +1 -0
- package/DS1/x-flag/az.svg +1 -0
- package/DS1/x-flag/ba.svg +1 -0
- package/DS1/x-flag/bb.svg +1 -0
- package/DS1/x-flag/bd.svg +1 -0
- package/DS1/x-flag/be.svg +1 -0
- package/DS1/x-flag/bf.svg +1 -0
- package/DS1/x-flag/bg.svg +1 -0
- package/DS1/x-flag/bh.svg +1 -0
- package/DS1/x-flag/bi.svg +1 -0
- package/DS1/x-flag/bj.svg +1 -0
- package/DS1/x-flag/bl.svg +1 -0
- package/DS1/x-flag/bm.svg +1 -0
- package/DS1/x-flag/bn.svg +1 -0
- package/DS1/x-flag/bo.svg +1 -0
- package/DS1/x-flag/bq-bo.svg +1 -0
- package/DS1/x-flag/bq-sa.svg +1 -0
- package/DS1/x-flag/bq-se.svg +1 -0
- package/DS1/x-flag/bq.svg +1 -0
- package/DS1/x-flag/br.svg +1 -0
- package/DS1/x-flag/bs.svg +1 -0
- package/DS1/x-flag/bt.svg +1 -0
- package/DS1/x-flag/bv.svg +1 -0
- package/DS1/x-flag/bw.svg +1 -0
- package/DS1/x-flag/by.svg +1 -0
- package/DS1/x-flag/bz.svg +1 -0
- package/DS1/x-flag/ca.svg +1 -0
- package/DS1/x-flag/cc.svg +1 -0
- package/DS1/x-flag/cd.svg +1 -0
- package/DS1/x-flag/cf.svg +1 -0
- package/DS1/x-flag/cg.svg +1 -0
- package/DS1/x-flag/ch.svg +1 -0
- package/DS1/x-flag/ci.svg +1 -0
- package/DS1/x-flag/ck.svg +1 -0
- package/DS1/x-flag/cl.svg +1 -0
- package/DS1/x-flag/cm.svg +1 -0
- package/DS1/x-flag/cn.svg +1 -0
- package/DS1/x-flag/co.svg +1 -0
- package/DS1/x-flag/cr.svg +1 -0
- package/DS1/x-flag/cu.svg +1 -0
- package/DS1/x-flag/cv.svg +1 -0
- package/DS1/x-flag/cw.svg +1 -0
- package/DS1/x-flag/cx.svg +1 -0
- package/DS1/x-flag/cy.svg +1 -0
- package/DS1/x-flag/cz.svg +1 -0
- package/DS1/x-flag/de.svg +1 -0
- package/DS1/x-flag/dj.svg +1 -0
- package/DS1/x-flag/dk.svg +1 -0
- package/DS1/x-flag/dm.svg +1 -0
- package/DS1/x-flag/do.svg +1 -0
- package/DS1/x-flag/dz.svg +1 -0
- package/DS1/x-flag/ec.svg +1 -0
- package/DS1/x-flag/ee.svg +1 -0
- package/DS1/x-flag/eg.svg +1 -0
- package/DS1/x-flag/eh.svg +1 -0
- package/DS1/x-flag/er.svg +1 -0
- package/DS1/x-flag/es-ct.svg +1 -0
- package/DS1/x-flag/es.svg +1 -0
- package/DS1/x-flag/et.svg +1 -0
- package/DS1/x-flag/eu.svg +1 -0
- package/DS1/x-flag/fi.svg +1 -0
- package/DS1/x-flag/fj.svg +1 -0
- package/DS1/x-flag/fk.svg +1 -0
- package/DS1/x-flag/fm.svg +1 -0
- package/DS1/x-flag/fo.svg +1 -0
- package/DS1/x-flag/fr.svg +1 -0
- package/DS1/x-flag/ga.svg +1 -0
- package/DS1/x-flag/gb-eng.svg +1 -0
- package/DS1/x-flag/gb-nir.svg +1 -0
- package/DS1/x-flag/gb-sct.svg +1 -0
- package/DS1/x-flag/gb-wls.svg +1 -0
- package/DS1/x-flag/gb.svg +1 -0
- package/DS1/x-flag/gd.svg +1 -0
- package/DS1/x-flag/ge.svg +1 -0
- package/DS1/x-flag/gf.svg +1 -0
- package/DS1/x-flag/gg.svg +1 -0
- package/DS1/x-flag/gh.svg +1 -0
- package/DS1/x-flag/gi.svg +1 -0
- package/DS1/x-flag/gl.svg +1 -0
- package/DS1/x-flag/gm.svg +1 -0
- package/DS1/x-flag/gn.svg +1 -0
- package/DS1/x-flag/gp.svg +1 -0
- package/DS1/x-flag/gq.svg +1 -0
- package/DS1/x-flag/gr.svg +1 -0
- package/DS1/x-flag/gs.svg +1 -0
- package/DS1/x-flag/gt.svg +1 -0
- package/DS1/x-flag/gu.svg +1 -0
- package/DS1/x-flag/gw.svg +1 -0
- package/DS1/x-flag/gy.svg +1 -0
- package/DS1/x-flag/hk.svg +1 -0
- package/DS1/x-flag/hm.svg +1 -0
- package/DS1/x-flag/hn.svg +1 -0
- package/DS1/x-flag/hr.svg +1 -0
- package/DS1/x-flag/ht.svg +1 -0
- package/DS1/x-flag/hu.svg +1 -0
- package/DS1/x-flag/ic.svg +1 -0
- package/DS1/x-flag/id.svg +1 -0
- package/DS1/x-flag/ie.svg +1 -0
- package/DS1/x-flag/il.svg +1 -0
- package/DS1/x-flag/im.svg +1 -0
- package/DS1/x-flag/in.svg +1 -0
- package/DS1/x-flag/io.svg +1 -0
- package/DS1/x-flag/iq.svg +1 -0
- package/DS1/x-flag/ir.svg +1 -0
- package/DS1/x-flag/is.svg +1 -0
- package/DS1/x-flag/it.svg +1 -0
- package/DS1/x-flag/je.svg +1 -0
- package/DS1/x-flag/jm.svg +1 -0
- package/DS1/x-flag/jo.svg +1 -0
- package/DS1/x-flag/jp.svg +1 -0
- package/DS1/x-flag/ke.svg +1 -0
- package/DS1/x-flag/kg.svg +1 -0
- package/DS1/x-flag/kh.svg +1 -0
- package/DS1/x-flag/ki.svg +1 -0
- package/DS1/x-flag/km.svg +1 -0
- package/DS1/x-flag/kn.svg +1 -0
- package/DS1/x-flag/kp.svg +1 -0
- package/DS1/x-flag/kr.svg +1 -0
- package/DS1/x-flag/kw.svg +1 -0
- package/DS1/x-flag/ky.svg +1 -0
- package/DS1/x-flag/kz.svg +1 -0
- package/DS1/x-flag/la.svg +1 -0
- package/DS1/x-flag/lb.svg +1 -0
- package/DS1/x-flag/lc.svg +1 -0
- package/DS1/x-flag/li.svg +1 -0
- package/DS1/x-flag/lk.svg +1 -0
- package/DS1/x-flag/lr.svg +1 -0
- package/DS1/x-flag/ls.svg +1 -0
- package/DS1/x-flag/lt.svg +1 -0
- package/DS1/x-flag/lu.svg +1 -0
- package/DS1/x-flag/lv.svg +1 -0
- package/DS1/x-flag/ly.svg +1 -0
- package/DS1/x-flag/ma.svg +1 -0
- package/DS1/x-flag/mc.svg +1 -0
- package/DS1/x-flag/md.svg +1 -0
- package/DS1/x-flag/me.svg +1 -0
- package/DS1/x-flag/mf.svg +1 -0
- package/DS1/x-flag/mg.svg +1 -0
- package/DS1/x-flag/mh.svg +1 -0
- package/DS1/x-flag/mk.svg +1 -0
- package/DS1/x-flag/ml.svg +1 -0
- package/DS1/x-flag/mm.svg +1 -0
- package/DS1/x-flag/mn.svg +1 -0
- package/DS1/x-flag/mo.svg +1 -0
- package/DS1/x-flag/mp.svg +1 -0
- package/DS1/x-flag/mq.svg +1 -0
- package/DS1/x-flag/mr.svg +1 -0
- package/DS1/x-flag/ms.svg +1 -0
- package/DS1/x-flag/mt.svg +1 -0
- package/DS1/x-flag/mu.svg +1 -0
- package/DS1/x-flag/mv.svg +1 -0
- package/DS1/x-flag/mw.svg +1 -0
- package/DS1/x-flag/mx.svg +1 -0
- package/DS1/x-flag/my.svg +1 -0
- package/DS1/x-flag/mz.svg +1 -0
- package/DS1/x-flag/na.svg +1 -0
- package/DS1/x-flag/nc.svg +1 -0
- package/DS1/x-flag/ne.svg +1 -0
- package/DS1/x-flag/nf.svg +1 -0
- package/DS1/x-flag/ng.svg +1 -0
- package/DS1/x-flag/ni.svg +1 -0
- package/DS1/x-flag/nl.svg +1 -0
- package/DS1/x-flag/no.svg +1 -0
- package/DS1/x-flag/np.svg +1 -0
- package/DS1/x-flag/nr.svg +1 -0
- package/DS1/x-flag/nu.svg +1 -0
- package/DS1/x-flag/nz.svg +1 -0
- package/DS1/x-flag/om.svg +1 -0
- package/DS1/x-flag/pa.svg +1 -0
- package/DS1/x-flag/pe.svg +1 -0
- package/DS1/x-flag/pf.svg +1 -0
- package/DS1/x-flag/pg.svg +1 -0
- package/DS1/x-flag/ph.svg +1 -0
- package/DS1/x-flag/pk.svg +1 -0
- package/DS1/x-flag/pl.svg +1 -0
- package/DS1/x-flag/pm.svg +1 -0
- package/DS1/x-flag/pn.svg +1 -0
- package/DS1/x-flag/pr.svg +1 -0
- package/DS1/x-flag/ps.svg +1 -0
- package/DS1/x-flag/pt.svg +1 -0
- package/DS1/x-flag/pw.svg +1 -0
- package/DS1/x-flag/py.svg +1 -0
- package/DS1/x-flag/qa.svg +1 -0
- package/DS1/x-flag/re.svg +1 -0
- package/DS1/x-flag/ro.svg +1 -0
- package/DS1/x-flag/rs.svg +1 -0
- package/DS1/x-flag/ru.svg +1 -0
- package/DS1/x-flag/rw.svg +1 -0
- package/DS1/x-flag/sa.svg +1 -0
- package/DS1/x-flag/sb.svg +1 -0
- package/DS1/x-flag/sc.svg +1 -0
- package/DS1/x-flag/sd.svg +1 -0
- package/DS1/x-flag/se.svg +1 -0
- package/DS1/x-flag/sg.svg +1 -0
- package/DS1/x-flag/sh.svg +1 -0
- package/DS1/x-flag/si.svg +1 -0
- package/DS1/x-flag/sj.svg +1 -0
- package/DS1/x-flag/sk.svg +1 -0
- package/DS1/x-flag/sl.svg +1 -0
- package/DS1/x-flag/sm.svg +1 -0
- package/DS1/x-flag/sn.svg +1 -0
- package/DS1/x-flag/so.svg +1 -0
- package/DS1/x-flag/sr.svg +1 -0
- package/DS1/x-flag/ss.svg +1 -0
- package/DS1/x-flag/st.svg +1 -0
- package/DS1/x-flag/sv.svg +1 -0
- package/DS1/x-flag/sx.svg +1 -0
- package/DS1/x-flag/sy.svg +1 -0
- package/DS1/x-flag/sz.svg +1 -0
- package/DS1/x-flag/ta.svg +1 -0
- package/DS1/x-flag/tc.svg +1 -0
- package/DS1/x-flag/td.svg +1 -0
- package/DS1/x-flag/tf.svg +1 -0
- package/DS1/x-flag/tg.svg +1 -0
- package/DS1/x-flag/th.svg +1 -0
- package/DS1/x-flag/tj.svg +1 -0
- package/DS1/x-flag/tk.svg +1 -0
- package/DS1/x-flag/tl.svg +1 -0
- package/DS1/x-flag/tm.svg +1 -0
- package/DS1/x-flag/tn.svg +1 -0
- package/DS1/x-flag/to.svg +1 -0
- package/DS1/x-flag/tr.svg +1 -0
- package/DS1/x-flag/tt.svg +1 -0
- package/DS1/x-flag/tv.svg +1 -0
- package/DS1/x-flag/tw.svg +1 -0
- package/DS1/x-flag/tz.svg +1 -0
- package/DS1/x-flag/ua.svg +1 -0
- package/DS1/x-flag/ug.svg +1 -0
- package/DS1/x-flag/um.svg +1 -0
- package/DS1/x-flag/us.svg +1 -0
- package/DS1/x-flag/uy.svg +1 -0
- package/DS1/x-flag/uz.svg +1 -0
- package/DS1/x-flag/va.svg +1 -0
- package/DS1/x-flag/vc.svg +1 -0
- package/DS1/x-flag/ve.svg +1 -0
- package/DS1/x-flag/vg.svg +1 -0
- package/DS1/x-flag/vi.svg +1 -0
- package/DS1/x-flag/vn.svg +1 -0
- package/DS1/x-flag/vu.svg +1 -0
- package/DS1/x-flag/wf.svg +1 -0
- package/DS1/x-flag/ws.svg +1 -0
- package/DS1/x-flag/xk.svg +1 -0
- package/DS1/x-flag/ye.svg +1 -0
- package/DS1/x-flag/yt.svg +1 -0
- package/DS1/x-flag/za.svg +1 -0
- package/DS1/x-flag/zm.svg +1 -0
- package/DS1/x-flag/zw.svg +1 -0
- package/DS1/x-icon/android.svg +9 -0
- package/DS1/x-icon/arrange-check.svg +1 -1
- package/DS1/x-icon/arrange-page.svg +1 -1
- package/DS1/x-icon/chrome.svg +7 -0
- package/DS1/x-icon/edge-brand.svg +6 -0
- package/DS1/x-icon/firefox.svg +4 -0
- package/DS1/x-icon/health.svg +3 -0
- package/DS1/x-icon/left.svg +2 -3
- package/DS1/x-icon/linux.svg +1 -0
- package/DS1/x-icon/material.svg +1 -0
- package/DS1/x-icon/milestone-planned.svg +3 -0
- package/DS1/x-icon/milestone.svg +3 -0
- package/DS1/x-icon/more.svg +1 -5
- package/DS1/x-icon/network.svg +3 -0
- package/DS1/x-icon/opera.svg +4 -0
- package/DS1/x-icon/prediction.svg +3 -0
- package/DS1/x-icon/priority-high.svg +3 -0
- package/DS1/x-icon/priority-low.svg +3 -0
- package/DS1/x-icon/priority-medium.svg +3 -0
- package/DS1/x-icon/project.svg +3 -0
- package/DS1/x-icon/redo.svg +2 -2
- package/DS1/x-icon/repeat-small.svg +3 -0
- package/DS1/x-icon/safari.svg +4 -0
- package/DS1/x-icon/scaling.svg +3 -0
- package/DS1/x-icon/tabs.svg +4 -0
- package/DS1/x-icon/windows.svg +5 -0
- package/README.md +3 -3
- package/dist/0-face/button-label.d.ts +5 -0
- package/dist/0-face/button-label.d.ts.map +1 -0
- package/dist/0-face/button-label.js +31 -0
- package/dist/0-face/calendar.d.ts +1 -1
- package/dist/0-face/calendar.d.ts.map +1 -1
- package/dist/0-face/calendar.js +6 -3
- package/dist/0-face/carousel.d.ts +9 -0
- package/dist/0-face/carousel.d.ts.map +1 -1
- package/dist/0-face/carousel.js +80 -0
- package/dist/0-face/constraint-panel.d.ts +43 -0
- package/dist/0-face/constraint-panel.d.ts.map +1 -0
- package/dist/0-face/constraint-panel.js +429 -0
- package/dist/0-face/constraint-site.d.ts +72 -0
- package/dist/0-face/constraint-site.d.ts.map +1 -0
- package/dist/0-face/constraint-site.js +185 -0
- package/dist/0-face/constraints.d.ts +47 -0
- package/dist/0-face/constraints.d.ts.map +1 -0
- package/dist/0-face/constraints.js +247 -0
- package/dist/0-face/copy-text.js +1 -1
- package/dist/0-face/cut-fade.d.ts +112 -0
- package/dist/0-face/cut-fade.d.ts.map +1 -0
- package/dist/0-face/cut-fade.js +274 -0
- package/dist/0-face/define.d.ts.map +1 -1
- package/dist/0-face/define.js +24 -3
- package/dist/0-face/face-correction.d.ts +51 -0
- package/dist/0-face/face-correction.d.ts.map +1 -0
- package/dist/0-face/face-correction.js +80 -0
- package/dist/0-face/failures.d.ts +16 -0
- package/dist/0-face/failures.d.ts.map +1 -0
- package/dist/0-face/failures.js +21 -0
- package/dist/0-face/feedback-overlays.d.ts.map +1 -1
- package/dist/0-face/feedback-overlays.js +5 -3
- package/dist/0-face/feedback.d.ts +2 -0
- package/dist/0-face/feedback.d.ts.map +1 -1
- package/dist/0-face/feedback.js +1 -0
- package/dist/0-face/focus.d.ts +71 -0
- package/dist/0-face/focus.d.ts.map +1 -0
- package/dist/0-face/focus.js +196 -0
- package/dist/0-face/grid.d.ts +11 -1
- package/dist/0-face/grid.d.ts.map +1 -1
- package/dist/0-face/grid.js +90 -4
- package/dist/0-face/i18n.d.ts.map +1 -1
- package/dist/0-face/i18n.js +38 -16
- package/dist/0-face/layout-inspector.d.ts +5 -1
- package/dist/0-face/layout-inspector.d.ts.map +1 -1
- package/dist/0-face/layout-inspector.js +130 -104
- package/dist/0-face/preference-options.d.ts +4 -0
- package/dist/0-face/preference-options.d.ts.map +1 -1
- package/dist/0-face/scaling.d.ts +8 -1
- package/dist/0-face/scaling.d.ts.map +1 -1
- package/dist/0-face/scaling.js +19 -2
- package/dist/0-face/shape.d.ts +35 -0
- package/dist/0-face/shape.d.ts.map +1 -0
- package/dist/0-face/shape.js +23 -0
- package/dist/0-face/text-contrast.d.ts +22 -0
- package/dist/0-face/text-contrast.d.ts.map +1 -0
- package/dist/0-face/text-contrast.js +178 -0
- package/dist/0-face/theme-bootstrap.js +56 -0
- package/dist/0-face/toast-queue.d.ts +4 -0
- package/dist/0-face/toast-queue.d.ts.map +1 -1
- package/dist/0-face/toast-queue.js +4 -1
- package/dist/0-face/translations/da.json +10 -1
- package/dist/0-face/translations/de.json +10 -1
- package/dist/0-face/translations/en.json +10 -1
- package/dist/0-face/translations/es.json +10 -1
- package/dist/0-face/translations/fi.json +10 -1
- package/dist/0-face/translations/fr.json +10 -1
- package/dist/0-face/translations/is.json +10 -1
- package/dist/0-face/translations/it.json +10 -1
- package/dist/0-face/translations/ja.json +10 -1
- package/dist/0-face/translations/ko.json +10 -1
- package/dist/0-face/translations/nb.json +10 -1
- package/dist/0-face/translations/pt-BR.json +10 -1
- package/dist/0-face/translations/pt.json +10 -1
- package/dist/0-face/translations/sv.json +10 -1
- package/dist/0-face/translations/zh.json +10 -1
- package/dist/0-face/word-wrap.d.ts +6 -0
- package/dist/0-face/word-wrap.d.ts.map +1 -0
- package/dist/0-face/word-wrap.js +119 -0
- package/dist/1-root/foundation.d.ts +12 -0
- package/dist/1-root/foundation.d.ts.map +1 -0
- package/dist/1-root/foundation.js +59 -0
- package/dist/2-core/button-split.d.ts +1 -0
- package/dist/2-core/button-split.d.ts.map +1 -1
- package/dist/2-core/button-split.js +9 -4
- package/dist/2-core/chart/grid-chart.d.ts +2 -0
- package/dist/2-core/chart/grid-chart.d.ts.map +1 -1
- package/dist/2-core/chart/grid-chart.js +2 -1
- package/dist/2-core/ds-activity.d.ts +25 -0
- package/dist/2-core/ds-activity.d.ts.map +1 -0
- package/dist/2-core/ds-activity.js +28 -0
- package/dist/2-core/ds-app-chrome.d.ts +2 -0
- package/dist/2-core/ds-app-chrome.d.ts.map +1 -0
- package/dist/2-core/ds-app-chrome.js +1 -0
- package/dist/2-core/ds-avatar.d.ts +7 -0
- package/dist/2-core/ds-avatar.d.ts.map +1 -1
- package/dist/2-core/ds-avatar.js +41 -6
- package/dist/2-core/ds-badge.d.ts +7 -1
- package/dist/2-core/ds-badge.d.ts.map +1 -1
- package/dist/2-core/ds-badge.js +8 -1
- package/dist/2-core/ds-button.d.ts +12 -0
- package/dist/2-core/ds-button.d.ts.map +1 -1
- package/dist/2-core/ds-button.js +4 -0
- package/dist/2-core/ds-chart.d.ts +28 -3
- package/dist/2-core/ds-chart.d.ts.map +1 -1
- package/dist/2-core/ds-chart.js +110 -130
- package/dist/2-core/ds-cycle.d.ts +2 -2
- package/dist/2-core/ds-cycle.d.ts.map +1 -1
- package/dist/2-core/ds-cycle.js +36 -171
- package/dist/2-core/ds-device-bezel.d.ts +2 -0
- package/dist/2-core/ds-device-bezel.d.ts.map +1 -0
- package/dist/2-core/ds-device-bezel.js +1 -0
- package/dist/2-core/ds-empty.d.ts +2 -2
- package/dist/2-core/ds-empty.d.ts.map +1 -1
- package/dist/2-core/ds-empty.js +6 -4
- package/dist/2-core/ds-input.d.ts +7 -0
- package/dist/2-core/ds-input.d.ts.map +1 -1
- package/dist/2-core/ds-input.js +23 -3
- package/dist/2-core/ds-message.d.ts +11 -0
- package/dist/2-core/ds-message.d.ts.map +1 -1
- package/dist/2-core/ds-message.js +18 -0
- package/dist/2-core/ds-number.d.ts +86 -0
- package/dist/2-core/ds-number.d.ts.map +1 -0
- package/dist/2-core/ds-number.js +326 -0
- package/dist/2-core/ds-progress.d.ts +3 -0
- package/dist/2-core/ds-progress.d.ts.map +1 -1
- package/dist/2-core/ds-progress.js +3 -0
- package/dist/2-core/ds-radio.d.ts +3 -0
- package/dist/2-core/ds-radio.d.ts.map +1 -1
- package/dist/2-core/ds-radio.js +10 -1
- package/dist/2-core/ds-stat.d.ts +3 -0
- package/dist/2-core/ds-stat.d.ts.map +1 -1
- package/dist/2-core/ds-stat.js +3 -0
- package/dist/2-core/ds-switch.d.ts +14 -1
- package/dist/2-core/ds-switch.d.ts.map +1 -1
- package/dist/2-core/ds-switch.js +3 -1
- package/dist/2-core/ds-tag.d.ts +8 -1
- package/dist/2-core/ds-tag.d.ts.map +1 -1
- package/dist/2-core/ds-tag.js +12 -2
- package/dist/2-core/ds-text.d.ts +7 -0
- package/dist/2-core/ds-text.d.ts.map +1 -1
- package/dist/2-core/ds-text.js +7 -0
- package/dist/2-core/ds-token.d.ts +3 -0
- package/dist/2-core/ds-token.d.ts.map +1 -1
- package/dist/2-core/ds-token.js +3 -0
- package/dist/2-core/ds-tooltip.d.ts.map +1 -1
- package/dist/2-core/ds-tooltip.js +23 -2
- package/dist/2-core/ds-window.d.ts +2 -0
- package/dist/2-core/ds-window.d.ts.map +1 -0
- package/dist/2-core/ds-window.js +1 -0
- package/dist/2-core/generated/ds-icon-map.d.ts +27 -6
- package/dist/2-core/generated/ds-icon-map.d.ts.map +1 -1
- package/dist/2-core/generated/ds-icon-map.js +47 -5
- package/dist/2-core/generated/icons-extra.d.ts.map +1 -1
- package/dist/2-core/generated/icons-extra.js +24 -3
- 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 +3 -3
- package/dist/2-core/number-expression.d.ts +12 -0
- package/dist/2-core/number-expression.d.ts.map +1 -0
- package/dist/2-core/number-expression.js +82 -0
- package/dist/3-unit/calendar-base.d.ts +5 -0
- package/dist/3-unit/calendar-base.d.ts.map +1 -1
- package/dist/3-unit/calendar-base.js +3 -2
- package/dist/3-unit/ds-calendar.d.ts +197 -4
- package/dist/3-unit/ds-calendar.d.ts.map +1 -1
- package/dist/3-unit/ds-calendar.js +687 -45
- package/dist/3-unit/ds-carousel.d.ts +3 -0
- package/dist/3-unit/ds-carousel.d.ts.map +1 -1
- package/dist/3-unit/ds-carousel.js +13 -1
- package/dist/3-unit/ds-context.d.ts +18 -1
- package/dist/3-unit/ds-context.d.ts.map +1 -1
- package/dist/3-unit/ds-context.js +37 -1
- package/dist/3-unit/ds-form.d.ts +9 -0
- package/dist/3-unit/ds-form.d.ts.map +1 -1
- package/dist/3-unit/ds-form.js +50 -10
- package/dist/3-unit/ds-list.d.ts +20 -1
- package/dist/3-unit/ds-list.d.ts.map +1 -1
- package/dist/3-unit/ds-list.js +31 -3
- package/dist/3-unit/ds-matrix.d.ts +3 -0
- package/dist/3-unit/ds-matrix.d.ts.map +1 -1
- package/dist/3-unit/ds-matrix.js +3 -0
- package/dist/3-unit/ds-menu.d.ts.map +1 -1
- package/dist/3-unit/ds-menu.js +17 -1
- package/dist/3-unit/ds-row.d.ts +13 -0
- package/dist/3-unit/ds-row.d.ts.map +1 -1
- package/dist/3-unit/ds-row.js +15 -2
- package/dist/3-unit/ds-select.js +1 -1
- package/dist/3-unit/ds-sidebar.d.ts +17 -0
- package/dist/3-unit/ds-sidebar.d.ts.map +1 -1
- package/dist/3-unit/ds-sidebar.js +14 -3
- package/dist/3-unit/ds-table-of-contents.d.ts +68 -0
- package/dist/3-unit/ds-table-of-contents.d.ts.map +1 -0
- package/dist/3-unit/ds-table-of-contents.js +190 -0
- package/dist/3-unit/ds-tabs.d.ts +32 -1
- package/dist/3-unit/ds-tabs.d.ts.map +1 -1
- package/dist/3-unit/ds-tabs.js +39 -1
- package/dist/4-page/ds-document.d.ts +3 -0
- package/dist/4-page/ds-document.d.ts.map +1 -1
- package/dist/4-page/ds-document.js +3 -0
- package/dist/4-page/ds-footer.d.ts +47 -7
- package/dist/4-page/ds-footer.d.ts.map +1 -1
- package/dist/4-page/ds-footer.js +58 -14
- package/dist/4-page/ds-header.d.ts +6 -0
- package/dist/4-page/ds-header.d.ts.map +1 -1
- package/dist/4-page/ds-header.js +4 -1
- package/dist/4-page/ds-overlay.d.ts +2 -2
- package/dist/4-page/ds-overlay.d.ts.map +1 -1
- package/dist/4-page/ds-overlay.js +8 -3
- package/dist/4-page/ds-page.d.ts +12 -0
- package/dist/4-page/ds-page.d.ts.map +1 -1
- package/dist/4-page/ds-page.js +19 -1
- package/dist/4-page/email.d.ts +2 -0
- package/dist/4-page/email.d.ts.map +1 -1
- package/dist/4-page/email.js +5 -4
- package/dist/5-visual-kit/app-chrome.d.ts +98 -0
- package/dist/5-visual-kit/app-chrome.d.ts.map +1 -0
- package/dist/5-visual-kit/app-chrome.js +119 -0
- package/dist/5-visual-kit/bezels.d.ts +30 -0
- package/dist/5-visual-kit/bezels.d.ts.map +1 -0
- package/dist/5-visual-kit/bezels.js +388 -0
- package/dist/5-visual-kit/browser-icons.d.ts +5 -0
- package/dist/5-visual-kit/browser-icons.d.ts.map +1 -0
- package/dist/5-visual-kit/browser-icons.js +51 -0
- package/dist/5-visual-kit/browser-styles.d.ts +3 -0
- package/dist/5-visual-kit/browser-styles.d.ts.map +1 -0
- package/dist/5-visual-kit/browser-styles.js +52 -0
- package/dist/5-visual-kit/device-bezel.d.ts +84 -0
- package/dist/5-visual-kit/device-bezel.d.ts.map +1 -0
- package/dist/5-visual-kit/device-bezel.js +56 -0
- package/dist/5-visual-kit/instagram-frame.d.ts +8 -0
- package/dist/5-visual-kit/instagram-frame.d.ts.map +1 -0
- package/dist/5-visual-kit/instagram-frame.js +13 -0
- package/dist/5-visual-kit/instagram.d.ts +18 -0
- package/dist/5-visual-kit/instagram.d.ts.map +1 -0
- package/dist/5-visual-kit/instagram.js +39 -0
- package/dist/5-visual-kit/mobile-chrome.d.ts +4 -0
- package/dist/5-visual-kit/mobile-chrome.d.ts.map +1 -0
- package/dist/5-visual-kit/mobile-chrome.js +24 -0
- package/dist/5-visual-kit/native-icon-paths.d.ts +146 -0
- package/dist/5-visual-kit/native-icon-paths.d.ts.map +1 -0
- package/dist/5-visual-kit/native-icon-paths.js +145 -0
- package/dist/5-visual-kit/window.d.ts +51 -0
- package/dist/5-visual-kit/window.d.ts.map +1 -0
- package/dist/5-visual-kit/window.js +20 -0
- package/dist/browser-icons-BFbS1tIx.js +56 -0
- package/dist/browser-icons-BFbS1tIx.js.map +1 -0
- package/dist/browser-icons-CT8qU77Z.js +48 -0
- package/dist/browser-icons-CT8qU77Z.js.map +1 -0
- package/dist/components.d.ts +1 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +1 -0
- package/dist/design-system-1.bundle.js +5514 -2077
- package/dist/design-system-1.bundle.js.map +1 -1
- package/dist/design-system-1.bundle.min.js +7026 -4628
- package/dist/design-system-1.bundle.min.js.map +1 -1
- package/dist/design-system-1.css +1 -1
- package/dist/feedback.js +197 -167
- package/dist/feedback.js.map +1 -1
- package/dist/{icons-extra-CRxxWFjX.js → icons-extra-BMPvmQPI.js} +25 -4
- package/dist/icons-extra-BMPvmQPI.js.map +1 -0
- package/dist/{icons-extra-H5pqCM_R.js → icons-extra-BfYOw-cR.js} +83 -5
- package/dist/icons-extra-BfYOw-cR.js.map +1 -0
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/instagram-CKofs55A.js +50 -0
- package/dist/instagram-CKofs55A.js.map +1 -0
- package/dist/instagram-CcYf5oiM.js +48 -0
- package/dist/instagram-CcYf5oiM.js.map +1 -0
- package/dist/lit-Ce_uWYM4.js +612 -0
- package/dist/lit-Ce_uWYM4.js.map +1 -0
- package/dist/lit-DGUVm1Ce.js +557 -0
- package/dist/lit-DGUVm1Ce.js.map +1 -0
- package/dist/native-icon-paths-CB9evXBM.js +93 -0
- package/dist/native-icon-paths-CB9evXBM.js.map +1 -0
- package/dist/native-icon-paths-zay-3g_n.js +150 -0
- package/dist/native-icon-paths-zay-3g_n.js.map +1 -0
- package/dist/react/avatar.d.ts +1 -1
- package/dist/react/choice.d.ts +4 -0
- package/dist/react/choice.d.ts.map +1 -1
- package/dist/react/choice.js +2 -2
- package/dist/react/context.d.ts +19 -4
- package/dist/react/context.d.ts.map +1 -1
- package/dist/react/context.js +4 -4
- package/dist/react/empty.d.ts +2 -2
- package/dist/react/empty.d.ts.map +1 -1
- package/dist/react/empty.js +1 -1
- package/dist/react/footer.d.ts +5 -5
- package/dist/react/footer.d.ts.map +1 -1
- package/dist/react/footer.js +2 -2
- package/dist/react/header.d.ts +2 -2
- package/dist/react/header.d.ts.map +1 -1
- package/dist/react/message.d.ts +4 -0
- package/dist/react/message.d.ts.map +1 -1
- package/dist/react/message.js +2 -2
- package/dist/react/number.d.ts +53 -0
- package/dist/react/number.d.ts.map +1 -0
- package/dist/react/number.js +25 -0
- package/dist/react/page.d.ts +1 -1
- package/dist/react/sidebar.d.ts +4 -0
- package/dist/react/sidebar.d.ts.map +1 -1
- package/dist/react/sidebar.js +2 -2
- package/dist/react/table-of-contents.d.ts +19 -0
- package/dist/react/table-of-contents.d.ts.map +1 -0
- package/dist/react/table-of-contents.js +28 -0
- package/dist/{shared-words-CdMDVtXx.js → shared-words-C5cjxMjZ.js} +151 -16
- package/dist/shared-words-C5cjxMjZ.js.map +1 -0
- package/dist/{shared-words-BtRee8xR.js → shared-words-Cdm7xd-_.js} +163 -28
- package/dist/shared-words-Cdm7xd-_.js.map +1 -0
- package/package.json +23 -12
- package/DS1/3-unit/ds-calendar-large.ts +0 -353
- package/DS1/3-unit/styles/ds-calendar-large.css +0 -178
- package/dist/3-unit/ds-calendar-large.d.ts +0 -142
- package/dist/3-unit/ds-calendar-large.d.ts.map +0 -1
- package/dist/3-unit/ds-calendar-large.js +0 -308
- package/dist/icons-extra-CRxxWFjX.js.map +0 -1
- package/dist/icons-extra-H5pqCM_R.js.map +0 -1
- package/dist/shared-words-BtRee8xR.js.map +0 -1
- package/dist/shared-words-CdMDVtXx.js.map +0 -1
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Inspect a page's layout without changing its size, opacity, or interaction:
|
|
3
|
+
* named areas in dashed outlines with their name and size, text and fields in
|
|
4
|
+
* green boxes, and every component (a custom element) outlined with its tag name.
|
|
5
|
+
*/
|
|
2
6
|
export function createLayoutInspector() {
|
|
3
7
|
const root = document.documentElement;
|
|
4
8
|
const overlay = document.createElement('div');
|
|
@@ -17,116 +21,110 @@ export function createLayoutInspector() {
|
|
|
17
21
|
color-scheme: inherit !important;
|
|
18
22
|
}
|
|
19
23
|
:host([hidden]) { display: none !important; }
|
|
20
|
-
.
|
|
21
|
-
.
|
|
22
|
-
.area {
|
|
24
|
+
.boxes { position: absolute; inset: 0; overflow: hidden; }
|
|
25
|
+
.box {
|
|
23
26
|
position: absolute;
|
|
24
27
|
box-sizing: border-box;
|
|
25
|
-
|
|
26
|
-
place-items: center;
|
|
27
|
-
background: color-mix(in srgb, var(--pastel) 40%, transparent);
|
|
28
|
-
border: 1px solid color-mix(in srgb, var(--pastel) 65%, #82718d);
|
|
28
|
+
border: 1px solid var(--tint);
|
|
29
29
|
}
|
|
30
|
-
.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
color: var(--base-slate, CanvasText);
|
|
36
|
-
font: 400 14px/20px var(--font-regular, var(--typeface-regular, sans-serif));
|
|
37
|
-
text-align: center;
|
|
38
|
-
overflow-wrap: anywhere;
|
|
39
|
-
}
|
|
40
|
-
.area[data-container] {
|
|
41
|
-
background: transparent;
|
|
42
|
-
}
|
|
43
|
-
.area[data-container] > .name {
|
|
44
|
-
position: absolute;
|
|
45
|
-
top: 0;
|
|
46
|
-
left: 0;
|
|
47
|
-
}
|
|
48
|
-
.area[data-compact] .name {
|
|
30
|
+
.area { --tint: #efc9dc; border-style: dashed; }
|
|
31
|
+
.text { --tint: #bfe0cd; background: color-mix(in srgb, var(--tint) 18%, transparent); }
|
|
32
|
+
.field { --tint: #bfe0cd; background: color-mix(in srgb, var(--tint) 45%, transparent); }
|
|
33
|
+
.component { --tint: #d5c9ef; }
|
|
34
|
+
.tag {
|
|
49
35
|
position: absolute;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
font
|
|
57
|
-
line-height: 16px;
|
|
58
|
-
white-space: nowrap;
|
|
59
|
-
}
|
|
60
|
-
.dimensions {
|
|
61
|
-
display: block;
|
|
62
|
-
font-size: 12px;
|
|
63
|
-
line-height: 16px;
|
|
36
|
+
box-sizing: border-box;
|
|
37
|
+
display: flex;
|
|
38
|
+
gap: 6px;
|
|
39
|
+
padding: 0 4px;
|
|
40
|
+
background: var(--tint);
|
|
41
|
+
color: #2a2530;
|
|
42
|
+
font: 400 12px/16px var(--font-regular, var(--typeface-regular, sans-serif));
|
|
64
43
|
font-variant-numeric: tabular-nums;
|
|
65
44
|
white-space: nowrap;
|
|
66
45
|
}
|
|
46
|
+
.area > .tag { top: -1px; right: -1px; }
|
|
47
|
+
.component > .tag { bottom: 100%; left: -1px; }
|
|
48
|
+
.component[data-inside] > .tag { bottom: auto; top: -1px; }
|
|
49
|
+
.measure { opacity: 0.7; }
|
|
67
50
|
@media print { :host { display: none !important; } }
|
|
68
|
-
</style><div class="
|
|
51
|
+
</style><div class="boxes"></div>`;
|
|
69
52
|
document.body.appendChild(overlay);
|
|
70
|
-
const layer = shadow.querySelector<HTMLDivElement>('.
|
|
71
|
-
|
|
53
|
+
const layer = shadow.querySelector<HTMLDivElement>('.boxes')!;
|
|
54
|
+
type Kind = 'area' | 'text' | 'field' | 'component';
|
|
55
|
+
// A page of thousands of words draws its first boxes and stops.
|
|
56
|
+
const limit = 2000;
|
|
57
|
+
const fields = new Set(['input', 'textarea', 'select', 'img', 'picture', 'svg', 'video', 'canvas', 'iframe']);
|
|
58
|
+
const skipped = new Set(['script', 'style', 'template', 'noscript', 'link', 'meta', 'slot']);
|
|
59
|
+
// Primitives drawn as what they show rather than named: words, an icon,
|
|
60
|
+
// and a gap with nothing to see.
|
|
61
|
+
const primitives: Record<string, Kind | 'none'> = { 'ds-text': 'text', 'ds-icon': 'field', 'ds-gap': 'none' };
|
|
72
62
|
let frame = 0;
|
|
73
63
|
let visible = false;
|
|
74
64
|
const observed = new Set<HTMLElement>();
|
|
75
65
|
const observedRoots = new Set<ShadowRoot>();
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (
|
|
84
|
-
|
|
85
|
-
|
|
66
|
+
const collect = () => {
|
|
67
|
+
const areas: HTMLElement[] = [];
|
|
68
|
+
const words: [HTMLElement, Kind][] = [];
|
|
69
|
+
const components: HTMLElement[] = [];
|
|
70
|
+
const visit = (parent: Element | ShadowRoot, inText: boolean) => {
|
|
71
|
+
for (const element of Array.from(parent.children) as HTMLElement[]) {
|
|
72
|
+
const name = element.localName;
|
|
73
|
+
if (skipped.has(name) || element.hasAttribute('data-ds-layout-overlay') || element.hasAttribute('data-ds-grid-overlay')) continue;
|
|
74
|
+
if (element.hasAttribute('data-ds-area')) areas.push(element);
|
|
75
|
+
const primitive = primitives[name];
|
|
76
|
+
if (primitive === 'none') continue;
|
|
77
|
+
const component = !primitive && name.includes('-');
|
|
78
|
+
if (component) components.push(element);
|
|
79
|
+
if (fields.has(name) || primitive === 'field') {
|
|
80
|
+
if (!inText) words.push([element, 'field']);
|
|
81
|
+
continue;
|
|
86
82
|
}
|
|
87
|
-
|
|
88
|
-
|
|
83
|
+
const text = !inText && !component && (primitive === 'text' || Array.from(element.childNodes).some((node) =>
|
|
84
|
+
node.nodeType === Node.TEXT_NODE && node.textContent!.trim() !== ''));
|
|
85
|
+
if (text) words.push([element, 'text']);
|
|
86
|
+
// A design system component is drawn whole; an app's own component is
|
|
87
|
+
// opened, so what it holds is drawn too.
|
|
88
|
+
const content = element.shadowRoot;
|
|
89
|
+
if (content && !primitive && (!name.startsWith('ds-') || element.hasAttribute('data-ds-layout-root'))) {
|
|
90
|
+
if (!observedRoots.has(content)) {
|
|
91
|
+
mutations.observe(content, { subtree: true, childList: true, characterData: true });
|
|
92
|
+
observedRoots.add(content);
|
|
93
|
+
}
|
|
94
|
+
visit(content, inText || text);
|
|
95
|
+
}
|
|
96
|
+
visit(element, inText || text);
|
|
97
|
+
}
|
|
89
98
|
};
|
|
90
|
-
|
|
91
|
-
if (named.length) return named;
|
|
99
|
+
visit(document.querySelector<HTMLElement>('[data-ds-inspect-active]') ?? document.body, false);
|
|
92
100
|
// Semantic fallback for pages that have not supplied their own area names.
|
|
93
|
-
|
|
101
|
+
const named = areas.length ? areas : Array.from(document.querySelectorAll<HTMLElement>('header, main, section, footer, one-footer'))
|
|
94
102
|
.filter((element) => !element.querySelector('section, header, footer, one-footer'));
|
|
103
|
+
return { areas: named, words, components };
|
|
95
104
|
};
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
for (const
|
|
102
|
-
|
|
105
|
+
|
|
106
|
+
const tag = (name: string, ...measures: string[]) => {
|
|
107
|
+
const label = document.createElement('span');
|
|
108
|
+
label.className = 'tag';
|
|
109
|
+
label.textContent = name;
|
|
110
|
+
for (const measure of measures) {
|
|
111
|
+
const part = document.createElement('span');
|
|
112
|
+
part.className = 'measure';
|
|
113
|
+
part.textContent = measure;
|
|
114
|
+
label.appendChild(part);
|
|
103
115
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
panel.style.left = `${rect.left}px`;
|
|
115
|
-
panel.style.top = `${rect.top}px`;
|
|
116
|
-
panel.style.width = `${rect.width}px`;
|
|
117
|
-
panel.style.height = `${rect.height}px`;
|
|
118
|
-
panel.style.setProperty('--pastel', colors[index % colors.length] ?? null);
|
|
119
|
-
const label = document.createElement('span');
|
|
120
|
-
label.className = 'name';
|
|
116
|
+
return label;
|
|
117
|
+
};
|
|
118
|
+
const box = (element: HTMLElement, kind: Kind, rect: DOMRect) => {
|
|
119
|
+
const panel = document.createElement('div');
|
|
120
|
+
panel.className = `box ${kind}`;
|
|
121
|
+
panel.style.left = `${rect.left}px`;
|
|
122
|
+
panel.style.top = `${rect.top}px`;
|
|
123
|
+
panel.style.width = `${rect.width}px`;
|
|
124
|
+
panel.style.height = `${rect.height}px`;
|
|
125
|
+
if (kind === 'area') {
|
|
121
126
|
const areaName = element.dataset.dsArea || element.getAttribute('aria-label') ||
|
|
122
127
|
(element.localName === 'one-footer' ? 'footer' : element.localName);
|
|
123
|
-
label.textContent = areaName.replace(/[-_]/g, ' ').replace(/^./, (letter) => letter.toUpperCase());
|
|
124
|
-
const dimensions = document.createElement('span');
|
|
125
|
-
dimensions.className = 'dimensions';
|
|
126
|
-
dimensions.textContent = `${Number(rect.width.toFixed(1))} × ${Number(rect.height.toFixed(1))} px`;
|
|
127
|
-
label.appendChild(dimensions);
|
|
128
|
-
const ratio = document.createElement('span');
|
|
129
|
-
ratio.className = 'dimensions';
|
|
130
128
|
// Reduce dimensions measured to a tenth of a CSS pixel; use a decimal
|
|
131
129
|
// for fluid shapes whose exact fraction would be too long to read.
|
|
132
130
|
const width = Math.max(1, Math.round(rect.width * 10));
|
|
@@ -138,14 +136,42 @@ export function createLayoutInspector() {
|
|
|
138
136
|
}
|
|
139
137
|
const horizontal = width / divisor;
|
|
140
138
|
const vertical = height / divisor;
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
139
|
+
panel.appendChild(tag(
|
|
140
|
+
areaName.replace(/[-_]/g, ' ').replace(/^./, (letter) => letter.toUpperCase()),
|
|
141
|
+
`${Number(rect.width.toFixed(1))} × ${Number(rect.height.toFixed(1))}`,
|
|
142
|
+
horizontal <= 100 && vertical <= 100 ? `${horizontal}:${vertical}` : `≈ ${Number((rect.width / rect.height).toFixed(2))}:1`,
|
|
143
|
+
));
|
|
144
|
+
} else if (kind === 'component') {
|
|
145
|
+
// A name with no room above the component stands inside it.
|
|
146
|
+
panel.toggleAttribute('data-inside', rect.top < 16);
|
|
147
|
+
panel.appendChild(tag(element.localName));
|
|
148
|
+
}
|
|
149
|
+
return panel;
|
|
150
|
+
};
|
|
151
|
+
const render = () => {
|
|
152
|
+
frame = 0;
|
|
153
|
+
if (!visible) return;
|
|
154
|
+
const { areas, words, components } = collect();
|
|
155
|
+
const watched = new Set([...areas, ...components]);
|
|
156
|
+
for (const element of observed) {
|
|
157
|
+
if (!watched.has(element)) { resize.unobserve(element); observed.delete(element); }
|
|
158
|
+
}
|
|
159
|
+
for (const element of watched) {
|
|
160
|
+
if (!observed.has(element)) { resize.observe(element); observed.add(element); }
|
|
161
|
+
}
|
|
162
|
+
// Areas first, then words, then components, so component names lie on top.
|
|
163
|
+
const drawn: HTMLElement[] = [];
|
|
164
|
+
const draw = (element: HTMLElement, kind: Kind) => {
|
|
165
|
+
if (drawn.length >= limit) return;
|
|
166
|
+
const rect = element.getBoundingClientRect();
|
|
167
|
+
if (!rect.width || !rect.height || rect.bottom <= 0 || rect.top >= innerHeight || rect.right <= 0 || rect.left >= innerWidth) return;
|
|
168
|
+
if (getComputedStyle(element).visibility === 'hidden') return;
|
|
169
|
+
drawn.push(box(element, kind, rect));
|
|
170
|
+
};
|
|
171
|
+
areas.forEach((element) => draw(element, 'area'));
|
|
172
|
+
words.forEach(([element, kind]) => draw(element, kind));
|
|
173
|
+
components.forEach((element) => draw(element, 'component'));
|
|
174
|
+
layer.replaceChildren(...drawn);
|
|
149
175
|
};
|
|
150
176
|
const schedule = () => { if (visible && !frame) frame = requestAnimationFrame(render); };
|
|
151
177
|
const resize = new ResizeObserver(schedule);
|
|
@@ -22,6 +22,10 @@ export interface PreferenceOptions {
|
|
|
22
22
|
* (`--background`) by default. `false` leaves both to the page.
|
|
23
23
|
*/
|
|
24
24
|
themePaper?: { light: string; dark: string } | false;
|
|
25
|
+
/** Where the shape is stored: `"ds-one:shape"` by default. */
|
|
26
|
+
shapeStorageKey?: string;
|
|
27
|
+
/** The shape for a visitor who has chosen none; without it the components keep their own corners. */
|
|
28
|
+
shapeDefault?: "square" | "rounded" | "circular";
|
|
25
29
|
}
|
|
26
30
|
|
|
27
31
|
declare global {
|
package/DS1/0-face/scaling.ts
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* mobile browser, or a touch screen whose shorter side is at most 820px) is
|
|
6
6
|
* drawn as if the screen were 280 units wide: the scale is the page's width
|
|
7
7
|
* over 280, never under 0.75 or over 2, so a 375px phone draws everything a
|
|
8
|
-
* third larger.
|
|
8
|
+
* third larger. The page's width is never taken as more than the screen's, so
|
|
9
|
+
* a page that a phone has widened and zoomed out never scales itself larger.
|
|
9
10
|
*
|
|
10
11
|
* `startScaling()` puts the scale on the page and keeps it there through
|
|
11
12
|
* resizes and turns; `applyScaling()` does it once. Both set `--sf` and, on a
|
|
@@ -145,10 +146,27 @@ export function applyScaling(options: ScalingOptions = {}): number {
|
|
|
145
146
|
return applyPage(root ?? document.documentElement, config);
|
|
146
147
|
}
|
|
147
148
|
|
|
149
|
+
/**
|
|
150
|
+
* The screen's own width as it is held, in CSS pixels: the widest a page on it
|
|
151
|
+
* is laid out at, or 0 when the browser does not say. iOS gives the screen's
|
|
152
|
+
* upright width whichever way it is turned, so the side is taken by the turn.
|
|
153
|
+
*/
|
|
154
|
+
export function screenWidth(): number {
|
|
155
|
+
const { width = 0, height = 0 } = window.screen ?? {};
|
|
156
|
+
if (!width || !height) return 0;
|
|
157
|
+
const turn = window.screen.orientation?.type;
|
|
158
|
+
const landscape = turn ? turn.startsWith("landscape") : window.matchMedia?.("(orientation: landscape)").matches ?? width > height;
|
|
159
|
+
return landscape ? Math.max(width, height) : Math.min(width, height);
|
|
160
|
+
}
|
|
161
|
+
|
|
148
162
|
function applyPage(root: HTMLElement, config: Partial<ScalingConfig>): number {
|
|
149
163
|
const mobile = detectMobileDevice();
|
|
150
|
-
// The page's width without its scroll bar
|
|
151
|
-
|
|
164
|
+
// The page's width without its scroll bar, never more than the screen's: when something reaches
|
|
165
|
+
// past the edge, a phone's browser widens the page and zooms out, and a scale read from that
|
|
166
|
+
// width would draw everything larger, which keeps the page too wide and zoomed out.
|
|
167
|
+
const page = document.documentElement.clientWidth || window.innerWidth || 0;
|
|
168
|
+
const held = mobile ? screenWidth() : 0;
|
|
169
|
+
const width = held ? Math.min(page, held) : page;
|
|
152
170
|
const factor = mobile ? calculateScalingFactor(width, { ...defaultScalingConfig, ...config }, window.devicePixelRatio || 1) : 1;
|
|
153
171
|
root.style.setProperty("--sf", String(factor));
|
|
154
172
|
root.toggleAttribute("data-mobile", mobile);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Square, rounded or circular: the corners every component draws, chosen once
|
|
3
|
+
* and remembered (Ezo's Shape setting, for every product).
|
|
4
|
+
*
|
|
5
|
+
* The runtime is the second part of `theme-bootstrap.js`, which a page inlines
|
|
6
|
+
* in its <head> so the first paint already has the shape; imported here, it
|
|
7
|
+
* installs itself when the page did not. It marks the root with
|
|
8
|
+
* `data-ds-shape`, which `1-root/component-appearance.css` reads: square
|
|
9
|
+
* corners, rounded ones (squircles where the browser draws them) or pills. A
|
|
10
|
+
* visitor who has chosen nothing sees `shapeDefault` from
|
|
11
|
+
* `window.DS_ONE_PREFERENCES`, or the components' own corners. Offer the
|
|
12
|
+
* choice with `<ds-cycle type="shape">`.
|
|
13
|
+
*/
|
|
14
|
+
import "./theme-bootstrap.js";
|
|
15
|
+
|
|
16
|
+
export type Shape = "square" | "rounded" | "circular";
|
|
17
|
+
export const SHAPES: readonly Shape[] = ["square", "rounded", "circular"];
|
|
18
|
+
|
|
19
|
+
/** `window.DS_ONE_SHAPE`, installed by `theme-bootstrap.js`. */
|
|
20
|
+
export interface ShapeRuntime {
|
|
21
|
+
/** The shape in effect, or null when none is chosen. */
|
|
22
|
+
shape(): Shape | null;
|
|
23
|
+
/** Choose and remember a shape, and put it on the page. */
|
|
24
|
+
set(shape: Shape): void;
|
|
25
|
+
/** Read the stored choice and the options again, and put them on the page. */
|
|
26
|
+
apply(): Shape | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare global {
|
|
30
|
+
interface Window {
|
|
31
|
+
DS_ONE_SHAPE?: ShapeRuntime;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** The shape in effect: the stored choice, else `shapeDefault`, else rounded (the components' own corners). */
|
|
36
|
+
export function getShape(): Shape {
|
|
37
|
+
return window.DS_ONE_SHAPE?.shape() ?? "rounded";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Choose and remember a shape. */
|
|
41
|
+
export function setShape(shape: Shape): void {
|
|
42
|
+
window.DS_ONE_SHAPE?.set(shape);
|
|
43
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// Rendered text, across slots and open shadow roots. Token pairs alone cannot
|
|
2
|
+
// tell what ink a component actually draws on its own surface.
|
|
3
|
+
export type RGBA = [number, number, number, number];
|
|
4
|
+
const clear: RGBA = [0, 0, 0, 0];
|
|
5
|
+
export const TEXT_CONTRAST_MINIMUM = 4.5;
|
|
6
|
+
export const contrastRatio = (a: RGBA, b: RGBA) => {
|
|
7
|
+
const luminance = (c: RGBA) => c.slice(0, 3).map(v => v <= .04045 ? v / 12.92 : ((v + .055) / 1.055) ** 2.4)
|
|
8
|
+
.reduce((sum, v, i) => sum + v * [0.2126, 0.7152, 0.0722][i]!, 0);
|
|
9
|
+
const [high, low] = [luminance(a), luminance(b)].sort((x, y) => y - x);
|
|
10
|
+
return (high! + .05) / (low! + .05);
|
|
11
|
+
};
|
|
12
|
+
export function composite(top: RGBA, bottom: RGBA): RGBA {
|
|
13
|
+
const alpha = top[3] + bottom[3] * (1 - top[3]);
|
|
14
|
+
return alpha ? [...[0, 1, 2].map(i => (top[i]! * top[3] + bottom[i]! * bottom[3] * (1 - top[3])) / alpha), alpha] as RGBA : [...clear];
|
|
15
|
+
}
|
|
16
|
+
const styleOf = (e: Element, pseudo?: string) => e.ownerDocument.defaultView!.getComputedStyle(e, pseudo);
|
|
17
|
+
/** The painted parent, including the slot's styles and the shadow host's surface. */
|
|
18
|
+
export function paintedParent(e: Element): Element | null {
|
|
19
|
+
return e.assignedSlot ?? e.parentElement ?? (e.getRootNode() as ShadowRoot).host ?? null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Computed RGB stays full precision; modern colour spaces use the browser's sRGB canvas conversion. */
|
|
23
|
+
export function colorReader(document: Document) {
|
|
24
|
+
const cache = new Map<string, RGBA | null>();
|
|
25
|
+
let context: CanvasRenderingContext2D | null | undefined;
|
|
26
|
+
return (value: string): RGBA | null => {
|
|
27
|
+
if (cache.has(value)) return cache.get(value)!;
|
|
28
|
+
let color: RGBA | null = null;
|
|
29
|
+
if (value === 'transparent') color = [...clear];
|
|
30
|
+
const rgb = /^rgba?\(([^)]+)\)$/.exec(value);
|
|
31
|
+
if (rgb) {
|
|
32
|
+
const parts = rgb[1]!.split(/[\s,/]+/).filter(Boolean);
|
|
33
|
+
if (parts.length >= 3) color = [...parts.slice(0, 3).map(v => parseFloat(v) / (v.endsWith('%') ? 100 : 255)), parts[3] ? parseFloat(parts[3]) / (parts[3].endsWith('%') ? 100 : 1) : 1] as RGBA;
|
|
34
|
+
} else if (value && document.defaultView?.CSS.supports('color', value)) {
|
|
35
|
+
context ??= document.createElement('canvas').getContext('2d', { willReadFrequently: true });
|
|
36
|
+
if (context) {
|
|
37
|
+
context.clearRect(0, 0, 1, 1);
|
|
38
|
+
context.fillStyle = value;
|
|
39
|
+
context.fillRect(0, 0, 1, 1);
|
|
40
|
+
color = Array.from(context.getImageData(0, 0, 1, 1).data, v => v / 255) as RGBA;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
cache.set(value, color);
|
|
44
|
+
return color;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
type TextSample = { element: Element; text: string; pseudo?: string; paintElement?: Element };
|
|
49
|
+
function visible(e: Element) {
|
|
50
|
+
if (!e.getClientRects().length && styleOf(e).display !== 'contents') return false;
|
|
51
|
+
if (styleOf(e).visibility !== 'visible') return false;
|
|
52
|
+
for (let p: Element | null = e; p; p = paintedParent(p)) {
|
|
53
|
+
const s = styleOf(p);
|
|
54
|
+
if (s.display === 'none' || s.contentVisibility === 'hidden' || Number(s.opacity) === 0
|
|
55
|
+
|| p.matches(':disabled, [aria-disabled="true"], [data-ds-constraint-panel]')) return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Text nodes are visited once in their composed position; hidden menus and inactive controls do not count. */
|
|
61
|
+
function textSamples(root: ParentNode): TextSample[] {
|
|
62
|
+
const samples: TextSample[] = [];
|
|
63
|
+
const seen = new Set<Node>();
|
|
64
|
+
function visit(node: Node) {
|
|
65
|
+
if (seen.has(node)) return;
|
|
66
|
+
seen.add(node);
|
|
67
|
+
if (node.nodeType === 3) {
|
|
68
|
+
const text = node.textContent?.trim();
|
|
69
|
+
const element = node.parentElement;
|
|
70
|
+
const paintElement = (node as Text).assignedSlot ?? element;
|
|
71
|
+
if (text && element && paintElement && visible(paintElement)) {
|
|
72
|
+
const range = element.ownerDocument.createRange();
|
|
73
|
+
range.selectNodeContents(node);
|
|
74
|
+
if (Array.from(range.getClientRects()).some(r => r.width > 0 && r.height > 0)) samples.push({ element, text, paintElement });
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (node.nodeType === 1) {
|
|
79
|
+
const e = node as Element;
|
|
80
|
+
if (e.matches('script, style, template, noscript, option, [data-ds-constraint-panel]')) return;
|
|
81
|
+
if (visible(e)) {
|
|
82
|
+
if (e.localName === 'input' || e.localName === 'textarea') {
|
|
83
|
+
const input = e as HTMLInputElement;
|
|
84
|
+
if (!['hidden', 'checkbox', 'radio', 'range', 'color', 'file', 'image'].includes(input.type)) {
|
|
85
|
+
if (input.value) samples.push({ element: e, text: input.type === 'password' ? 'Password value' : input.value });
|
|
86
|
+
else if (input.placeholder) samples.push({ element: e, text: input.placeholder, pseudo: '::placeholder' });
|
|
87
|
+
}
|
|
88
|
+
} else if (e.localName === 'select') {
|
|
89
|
+
const text = (e as unknown as HTMLSelectElement).selectedOptions[0]?.textContent?.trim();
|
|
90
|
+
if (text) samples.push({ element: e, text });
|
|
91
|
+
}
|
|
92
|
+
for (const pseudo of ['::before', '::after']) {
|
|
93
|
+
const s = styleOf(e, pseudo);
|
|
94
|
+
if (/^["'].*["']$/.test(s.content) && s.content.slice(1, -1).trim() && s.display !== 'none' && s.visibility === 'visible' && Number(s.opacity) !== 0) {
|
|
95
|
+
samples.push({ element: e, text: s.content.slice(1, -1), pseudo });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (e.localName === 'slot') {
|
|
100
|
+
const assigned = (e as HTMLSlotElement).assignedNodes({ flatten: true });
|
|
101
|
+
(assigned.length ? assigned : Array.from(e.childNodes)).forEach(visit);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (e.shadowRoot) { visit(e.shadowRoot); return; }
|
|
105
|
+
// Values/placeholder above represent these controls, not their fallback children.
|
|
106
|
+
if (e.matches('input, textarea, select')) return;
|
|
107
|
+
}
|
|
108
|
+
node.childNodes.forEach(visit);
|
|
109
|
+
}
|
|
110
|
+
visit(root as Node);
|
|
111
|
+
return samples;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export type TextContrastResult = { element: Element; text: string; ratio?: number; reason?: string; foreground?: string; background?: string };
|
|
115
|
+
const rgbLabel = (c: RGBA) => `rgb(${c.slice(0, 3).map(v => Math.round(v * 255)).join(', ')})`;
|
|
116
|
+
|
|
117
|
+
export function measureTextContrast(root: ParentNode): TextContrastResult[] {
|
|
118
|
+
const document = (root as Node).ownerDocument ?? root as Document;
|
|
119
|
+
const read = colorReader(document);
|
|
120
|
+
const styles = new Map<Element, CSSStyleDeclaration>();
|
|
121
|
+
const style = (e: Element) => { if (!styles.has(e)) styles.set(e, styleOf(e)); return styles.get(e)!; };
|
|
122
|
+
return textSamples(root).map(({ element, text, pseudo, paintElement = element }) => {
|
|
123
|
+
const result: TextContrastResult = { element, text: text.replace(/\s+/g, ' ').slice(0, 60) };
|
|
124
|
+
const inkStyle = pseudo ? styleOf(element, pseudo) : style(paintElement);
|
|
125
|
+
let foreground = read(inkStyle.getPropertyValue('-webkit-text-fill-color') || inkStyle.color);
|
|
126
|
+
let background: RGBA = [...clear];
|
|
127
|
+
if (!foreground) return { ...result, reason: 'The rendered text colour could not be resolved.' };
|
|
128
|
+
const chain: CSSStyleDeclaration[] = [];
|
|
129
|
+
if (pseudo) chain.push(inkStyle);
|
|
130
|
+
for (let p: Element | null = paintElement; p; p = paintedParent(p)) chain.push(style(p));
|
|
131
|
+
for (const s of chain) {
|
|
132
|
+
if (s.mixBlendMode && s.mixBlendMode !== 'normal' || s.filter && s.filter !== 'none' || s.backdropFilter && s.backdropFilter !== 'none') {
|
|
133
|
+
return { ...result, reason: 'A blend or filter needs a visual contrast review.' };
|
|
134
|
+
}
|
|
135
|
+
if (background[3] < 1 && s.backgroundImage && s.backgroundImage !== 'none') {
|
|
136
|
+
return { ...result, reason: 'Text over an image or gradient needs a visual contrast review.' };
|
|
137
|
+
}
|
|
138
|
+
const fill = read(s.backgroundColor);
|
|
139
|
+
if (!fill) return { ...result, reason: 'The rendered background colour could not be resolved.' };
|
|
140
|
+
foreground = composite(foreground, fill);
|
|
141
|
+
background = composite(background, fill);
|
|
142
|
+
const opacity = Number(s.opacity);
|
|
143
|
+
foreground[3] *= opacity;
|
|
144
|
+
background[3] *= opacity;
|
|
145
|
+
}
|
|
146
|
+
// With no declared page background, compare both possible user-agent canvases.
|
|
147
|
+
// Usually the opaque html/body surface makes these identical.
|
|
148
|
+
const candidates: RGBA[] = [[1, 1, 1, 1], [0, 0, 0, 1]];
|
|
149
|
+
const pairs = candidates.map(canvas => ({ foreground: composite(foreground!, canvas), background: composite(background, canvas) }));
|
|
150
|
+
const values = pairs.map(pair => ({ ...pair, ratio: contrastRatio(pair.foreground, pair.background) })).sort((a, b) => a.ratio - b.ratio);
|
|
151
|
+
const worst = values[0]!;
|
|
152
|
+
if (background[3] < 1 && worst.ratio < TEXT_CONTRAST_MINIMUM) return { ...result, reason: 'Declare an opaque page background so text contrast can be verified.' };
|
|
153
|
+
return { ...result, ratio: worst.ratio, foreground: rgbLabel(worst.foreground), background: rgbLabel(worst.background) };
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function inspectTextContrast(root: ParentNode) {
|
|
158
|
+
return measureTextContrast(root).flatMap(result => {
|
|
159
|
+
const label = `“${result.text}”`;
|
|
160
|
+
// What cannot be measured is a review for a person, not a broken rule; a colour that could not be read is.
|
|
161
|
+
if (result.reason) return [{ element: result.element, message: `${label}: ${result.reason}`, review: /visual contrast review/.test(result.reason) }];
|
|
162
|
+
return result.ratio! < TEXT_CONTRAST_MINIMUM ? [{ element: result.element, message: `${label} has ${result.ratio!.toFixed(2)}:1 text contrast (${result.foreground} on ${result.background}); at least ${TEXT_CONTRAST_MINIMUM}:1 is required.` }] : [];
|
|
163
|
+
});
|
|
164
|
+
}
|
|
@@ -182,3 +182,46 @@
|
|
|
182
182
|
window.addEventListener("storage", function (event) { if (event.key === null || event.key === key()) apply(); });
|
|
183
183
|
window.addEventListener("pageshow", function () { apply(); });
|
|
184
184
|
})();
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* The shape, on before the first paint as well: square, rounded or circular,
|
|
188
|
+
* the corners every component draws (component-appearance.css keys on
|
|
189
|
+
* `data-ds-shape` on the root). Rounded draws squircles where the browser
|
|
190
|
+
* can. With nothing stored it is `shapeDefault` from
|
|
191
|
+
* `window.DS_ONE_PREFERENCES`, and without that the root carries no shape and
|
|
192
|
+
* the components keep their own corners. It is stored under `shapeStorageKey`
|
|
193
|
+
* (`"ds-one:shape"`), applied again when another tab stores one, and changed
|
|
194
|
+
* with `window.DS_ONE_SHAPE.set(shape)`, which dispatches `shape-changed` on
|
|
195
|
+
* window with `{ shape }`.
|
|
196
|
+
*/
|
|
197
|
+
(function () {
|
|
198
|
+
if (typeof window === "undefined" || typeof document === "undefined" || window.DS_ONE_SHAPE) return;
|
|
199
|
+
var root = document.documentElement;
|
|
200
|
+
var SHAPES = ["square", "rounded", "circular"];
|
|
201
|
+
var session = null;
|
|
202
|
+
function options() { return window.DS_ONE_PREFERENCES || {}; }
|
|
203
|
+
function key() { return options().shapeStorageKey || "ds-one:shape"; }
|
|
204
|
+
function stored() {
|
|
205
|
+
if (session) return session;
|
|
206
|
+
try {
|
|
207
|
+
var saved = window.localStorage.getItem(key());
|
|
208
|
+
if (SHAPES.indexOf(saved) >= 0) return saved;
|
|
209
|
+
} catch { /* Storage can be blocked. */ }
|
|
210
|
+
return SHAPES.indexOf(options().shapeDefault) >= 0 ? options().shapeDefault : null;
|
|
211
|
+
}
|
|
212
|
+
function apply() {
|
|
213
|
+
var shape = stored();
|
|
214
|
+
if (shape) root.setAttribute("data-ds-shape", shape);
|
|
215
|
+
else root.removeAttribute("data-ds-shape");
|
|
216
|
+
return shape;
|
|
217
|
+
}
|
|
218
|
+
function set(shape) {
|
|
219
|
+
if (SHAPES.indexOf(shape) < 0) return;
|
|
220
|
+
try { window.localStorage.setItem(key(), shape); session = null; } catch { session = shape; }
|
|
221
|
+
apply();
|
|
222
|
+
window.dispatchEvent(new CustomEvent("shape-changed", { detail: { shape: shape } }));
|
|
223
|
+
}
|
|
224
|
+
window.DS_ONE_SHAPE = { shape: stored, set: set, apply: apply };
|
|
225
|
+
apply();
|
|
226
|
+
window.addEventListener("storage", function (event) { if (event.key === null || event.key === key()) apply(); });
|
|
227
|
+
})();
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
* says `important: false`.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
+
import { reportFailure, type Failure } from "./failures";
|
|
25
|
+
|
|
24
26
|
export type ToastId = string | number;
|
|
25
27
|
export type ToastType = "default" | "success" | "info" | "warning" | "error" | "loading";
|
|
26
28
|
export type ToastPosition = "top-left" | "top-center" | "top-right" | "bottom-left" | "bottom-center" | "bottom-right";
|
|
@@ -31,6 +33,9 @@ export type ToastPosition = "top-left" | "top-center" | "top-right" | "bottom-le
|
|
|
31
33
|
*/
|
|
32
34
|
export interface ToastButton { label: string; onClick?: (event: MouseEvent) => void; href?: string }
|
|
33
35
|
export interface ToastOptions {
|
|
36
|
+
/** A real failed operation to report. Omit for validation and expected refusals.
|
|
37
|
+
* Authored code and summary only; the visible title/description are never reported. */
|
|
38
|
+
failure?: Failure;
|
|
34
39
|
/** Reuse an id to update a toast in place, as Sonner does. */
|
|
35
40
|
id?: ToastId;
|
|
36
41
|
description?: string;
|
|
@@ -122,6 +127,7 @@ function show(title: string, type: ToastType, options: ToastOptions = {}): Toast
|
|
|
122
127
|
const data: ToastData = { ...options, ...(important === undefined ? {} : { important }), id, title, type };
|
|
123
128
|
// A copy: a listener may add or remove listeners while it hears the toast.
|
|
124
129
|
for (const listener of Array.from(state.toasters.size ? state.toasters : state.fallbacks)) listener({ toast: data });
|
|
130
|
+
if (type === "error" && options.failure) reportFailure(options.failure);
|
|
125
131
|
return id;
|
|
126
132
|
}
|
|
127
133
|
|
|
@@ -142,7 +148,7 @@ export const toast = Object.assign(
|
|
|
142
148
|
Promise.resolve(typeof promise === "function" ? promise() : promise)
|
|
143
149
|
.then(
|
|
144
150
|
value => { show(typeof success === "function" ? success(value) : success, "success", { ...options, id }); },
|
|
145
|
-
reason => { show(typeof error === "function" ? error(reason) : error, "error", { ...options, id }); },
|
|
151
|
+
reason => { show(typeof error === "function" ? error(reason) : error, "error", { ...options, id, ...(options.failure ? { failure: { ...options.failure, error: reason } } : {}) }); },
|
|
146
152
|
)
|
|
147
153
|
.finally(() => done?.());
|
|
148
154
|
return id;
|
|
@@ -30,6 +30,10 @@
|
|
|
30
30
|
"Light": "Lys",
|
|
31
31
|
"Dark": "Mørk",
|
|
32
32
|
"System": "System",
|
|
33
|
+
"Shape": "Form",
|
|
34
|
+
"Square": "Firkantet",
|
|
35
|
+
"Rounded": "Afrundet",
|
|
36
|
+
"Circular": "Cirkulær",
|
|
33
37
|
"Note": "Note",
|
|
34
38
|
"Page": "Side",
|
|
35
39
|
"Red": "Rød",
|
|
@@ -124,6 +128,11 @@
|
|
|
124
128
|
"Total": "I alt",
|
|
125
129
|
"End date": "Slutdato",
|
|
126
130
|
"Include time": "Medtag klokkeslæt",
|
|
127
|
-
"Time": "Klokkeslæt"
|
|
131
|
+
"Time": "Klokkeslæt",
|
|
132
|
+
"Day": "Dag",
|
|
133
|
+
"Week": "Uge",
|
|
134
|
+
"Month": "Måned",
|
|
135
|
+
"Swimlane": "Baner",
|
|
136
|
+
"View": "Visning"
|
|
128
137
|
}
|
|
129
138
|
}
|
|
@@ -30,6 +30,10 @@
|
|
|
30
30
|
"Light": "Hell",
|
|
31
31
|
"Dark": "Dunkel",
|
|
32
32
|
"System": "System",
|
|
33
|
+
"Shape": "Form",
|
|
34
|
+
"Square": "Eckig",
|
|
35
|
+
"Rounded": "Abgerundet",
|
|
36
|
+
"Circular": "Rund",
|
|
33
37
|
"Note": "Notiz",
|
|
34
38
|
"Page": "Seite",
|
|
35
39
|
"Red": "Rot",
|
|
@@ -124,6 +128,11 @@
|
|
|
124
128
|
"Total": "Gesamt",
|
|
125
129
|
"End date": "Enddatum",
|
|
126
130
|
"Include time": "Uhrzeit hinzufügen",
|
|
127
|
-
"Time": "Uhrzeit"
|
|
131
|
+
"Time": "Uhrzeit",
|
|
132
|
+
"Day": "Tag",
|
|
133
|
+
"Week": "Woche",
|
|
134
|
+
"Month": "Monat",
|
|
135
|
+
"Swimlane": "Bahnen",
|
|
136
|
+
"View": "Ansicht"
|
|
128
137
|
}
|
|
129
138
|
}
|