@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
package/dist/0-face/carousel.js
CHANGED
|
@@ -164,6 +164,83 @@ export function nearestSlide(track, slides, current = 0) {
|
|
|
164
164
|
});
|
|
165
165
|
return nearest;
|
|
166
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* A strip under the pointer. A finger, a pen or a trackpad scrolls the track
|
|
169
|
+
* natively; a mouse drags it the same way (snapping held off while it drags),
|
|
170
|
+
* and on letting go `settle` puts it on a slide. A press that ends a drag or a
|
|
171
|
+
* scroll, by any pointer, never presses what it started on, so a person can
|
|
172
|
+
* swipe across cards that open something without choosing one. Returns the
|
|
173
|
+
* function that stops it.
|
|
174
|
+
*/
|
|
175
|
+
export function dragTrack(track, settle) {
|
|
176
|
+
let held = null;
|
|
177
|
+
let moved = false;
|
|
178
|
+
let quietUntil = 0;
|
|
179
|
+
const down = (event) => {
|
|
180
|
+
if (!event.isPrimary || (event.pointerType === "mouse" && event.button !== 0))
|
|
181
|
+
return;
|
|
182
|
+
held = { id: event.pointerId, x: event.clientX, left: track.scrollLeft, mouse: event.pointerType === "mouse" };
|
|
183
|
+
moved = false;
|
|
184
|
+
};
|
|
185
|
+
const move = (event) => {
|
|
186
|
+
if (!held || event.pointerId !== held.id)
|
|
187
|
+
return;
|
|
188
|
+
const dx = event.clientX - held.x;
|
|
189
|
+
if (!moved && Math.abs(dx) < 6)
|
|
190
|
+
return;
|
|
191
|
+
if (!moved && held.mouse) {
|
|
192
|
+
try {
|
|
193
|
+
track.setPointerCapture(event.pointerId);
|
|
194
|
+
}
|
|
195
|
+
catch { /* a pointer already gone */ }
|
|
196
|
+
track.setAttribute("data-dragging", "");
|
|
197
|
+
}
|
|
198
|
+
moved = true;
|
|
199
|
+
if (held.mouse)
|
|
200
|
+
track.scrollLeft = held.left - dx;
|
|
201
|
+
};
|
|
202
|
+
const up = (event) => {
|
|
203
|
+
if (!held || event.pointerId !== held.id)
|
|
204
|
+
return;
|
|
205
|
+
const mouse = held.mouse;
|
|
206
|
+
held = null;
|
|
207
|
+
if (!moved)
|
|
208
|
+
return;
|
|
209
|
+
quietUntil = performance.now() + 400;
|
|
210
|
+
if (mouse) {
|
|
211
|
+
track.removeAttribute("data-dragging");
|
|
212
|
+
settle();
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
// A native scroll while a finger is down is a swipe: the press it ends is not a choice.
|
|
216
|
+
const scrolled = () => { if (held)
|
|
217
|
+
moved = true; };
|
|
218
|
+
const click = (event) => {
|
|
219
|
+
if (performance.now() > quietUntil)
|
|
220
|
+
return;
|
|
221
|
+
event.preventDefault();
|
|
222
|
+
event.stopPropagation();
|
|
223
|
+
};
|
|
224
|
+
// A picture in a slide would be dragged out of the page instead of the strip.
|
|
225
|
+
const dragstart = (event) => event.preventDefault();
|
|
226
|
+
track.addEventListener("pointerdown", down);
|
|
227
|
+
track.addEventListener("pointermove", move);
|
|
228
|
+
track.addEventListener("pointerup", up);
|
|
229
|
+
track.addEventListener("pointercancel", up);
|
|
230
|
+
track.addEventListener("scroll", scrolled, { passive: true });
|
|
231
|
+
track.addEventListener("click", click, true);
|
|
232
|
+
track.addEventListener("dragstart", dragstart);
|
|
233
|
+
return () => {
|
|
234
|
+
track.removeEventListener("pointerdown", down);
|
|
235
|
+
track.removeEventListener("pointermove", move);
|
|
236
|
+
track.removeEventListener("pointerup", up);
|
|
237
|
+
track.removeEventListener("pointercancel", up);
|
|
238
|
+
track.removeEventListener("scroll", scrolled);
|
|
239
|
+
track.removeEventListener("click", click, true);
|
|
240
|
+
track.removeEventListener("dragstart", dragstart);
|
|
241
|
+
track.removeAttribute("data-dragging");
|
|
242
|
+
};
|
|
243
|
+
}
|
|
167
244
|
/** Where a slide starts along the track, from the track's own start, in its scroll's terms. */
|
|
168
245
|
function startOf(track, slide) {
|
|
169
246
|
const box = track.getBoundingClientRect();
|
|
@@ -550,6 +627,8 @@ export function startCarousel(element, options = {}) {
|
|
|
550
627
|
const observer = typeof MutationObserver === "function" ? new MutationObserver(() => { label(); show(current, false); }) : undefined;
|
|
551
628
|
track.addEventListener("scroll", scrolled, { passive: true });
|
|
552
629
|
track.addEventListener("scrollend", ended);
|
|
630
|
+
// A loop's drive settles the strip itself; every other strip settles on the nearest slide.
|
|
631
|
+
const undrag = dragTrack(track, () => (loop ? undefined : go(nearestSlide(track, slides(), current), true)));
|
|
553
632
|
previousButton?.addEventListener("click", previous);
|
|
554
633
|
nextButton?.addEventListener("click", next);
|
|
555
634
|
observer?.observe(track, { childList: true });
|
|
@@ -562,6 +641,7 @@ export function startCarousel(element, options = {}) {
|
|
|
562
641
|
stop() {
|
|
563
642
|
track.removeEventListener("scroll", scrolled);
|
|
564
643
|
track.removeEventListener("scrollend", ended);
|
|
644
|
+
undrag();
|
|
565
645
|
previousButton?.removeEventListener("click", previous);
|
|
566
646
|
nextButton?.removeEventListener("click", next);
|
|
567
647
|
observer?.disconnect();
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type Constraint, type Finding } from './constraints';
|
|
2
|
+
/** The presses of C, each within 800ms of the last, that toggle the panel. */
|
|
3
|
+
export declare const CONSTRAINT_PRESSES = 5;
|
|
4
|
+
/**
|
|
5
|
+
* A panel at the page's end edge listing every small rule the page breaks
|
|
6
|
+
* (constraints.ts), each with its code, what is wrong and the element ringed
|
|
7
|
+
* on the page; pressing one scrolls to it. It measures the page as drawn when
|
|
8
|
+
* it opens and again with Page. Site measures every page of the site at every
|
|
9
|
+
* phone width (constraint-site.ts) and lists what each breaks, with a link to
|
|
10
|
+
* the page. Under what is broken it says what each rule measured and kept,
|
|
11
|
+
* and after a Site check every page it checked. It draws over the page and
|
|
12
|
+
* changes nothing in it.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createConstraintPanel(): {
|
|
15
|
+
show: (mode?: "page" | "site") => void;
|
|
16
|
+
hide: () => void;
|
|
17
|
+
run: () => void;
|
|
18
|
+
runSite: () => Promise<void>;
|
|
19
|
+
toggle: () => void;
|
|
20
|
+
readonly findings: (Finding & {
|
|
21
|
+
constraint: Constraint;
|
|
22
|
+
})[];
|
|
23
|
+
};
|
|
24
|
+
/** The device switch a site without sign-in has instead: `?ds-owner=on` once in a browser, `?ds-owner=off` to forget it. */
|
|
25
|
+
export declare const OWNER_DEVICE_KEY = "ds-owner";
|
|
26
|
+
/**
|
|
27
|
+
* Whether the viewer owns the page: `<html data-ds-owner>`, which a site with
|
|
28
|
+
* sign-in sets from its own server-checked owner, or a browser switched on as
|
|
29
|
+
* the owner's (`?ds-owner=on`) on a site without sign-in.
|
|
30
|
+
*/
|
|
31
|
+
export declare const isPageOwner: () => boolean;
|
|
32
|
+
/** What the address asks the panel to show on load: `?constraints=1` this page, `?constraints=site` every page. */
|
|
33
|
+
export declare function askedConstraints(search?: string): 'page' | 'site' | null;
|
|
34
|
+
/**
|
|
35
|
+
* Five presses of C toggle the constraint panel, for the page's owner only
|
|
36
|
+
* (`isPageOwner`): for anyone else the presses do nothing. `?constraints=1` in
|
|
37
|
+
* the address opens it for anyone once the page has loaded, since it only
|
|
38
|
+
* measures; `?constraints=site` opens it on the whole site's check. Escape
|
|
39
|
+
* hides it. Presses typed into a field, with a modifier or held down never
|
|
40
|
+
* count, and any other key starts the count again.
|
|
41
|
+
*/
|
|
42
|
+
export declare function initConstraintShortcut(): void;
|
|
43
|
+
//# sourceMappingURL=constraint-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraint-panel.d.ts","sourceRoot":"","sources":["../../DS1/0-face/constraint-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAKlF,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB;kBA2Rf,MAAM,GAAG,MAAM;;;;;;oBA9KI,UAAU;;EAuMlD;AAED,4HAA4H;AAC5H,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAiB3C;;;;GAIG;AACH,eAAO,MAAM,WAAW,eACiD,CAAC;AAE1E,mHAAmH;AACnH,wBAAgB,gBAAgB,CAAC,MAAM,SAAyB,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAIxF;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CA4C7C"}
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { measureConstraints } from './constraints';
|
|
2
|
+
import { PHONE_WIDTHS, checkSite, findSitePages, inspectInFrame, ruleLine, summarizePages, summarizeRules } from './constraint-site';
|
|
3
|
+
// appendChild, not append: a Worker project's types redefine append for its HTML rewriter.
|
|
4
|
+
/** The presses of C, each within 800ms of the last, that toggle the panel. */
|
|
5
|
+
export const CONSTRAINT_PRESSES = 5;
|
|
6
|
+
/**
|
|
7
|
+
* A panel at the page's end edge listing every small rule the page breaks
|
|
8
|
+
* (constraints.ts), each with its code, what is wrong and the element ringed
|
|
9
|
+
* on the page; pressing one scrolls to it. It measures the page as drawn when
|
|
10
|
+
* it opens and again with Page. Site measures every page of the site at every
|
|
11
|
+
* phone width (constraint-site.ts) and lists what each breaks, with a link to
|
|
12
|
+
* the page. Under what is broken it says what each rule measured and kept,
|
|
13
|
+
* and after a Site check every page it checked. It draws over the page and
|
|
14
|
+
* changes nothing in it.
|
|
15
|
+
*/
|
|
16
|
+
export function createConstraintPanel() {
|
|
17
|
+
const panel = document.createElement('div');
|
|
18
|
+
panel.setAttribute('data-ds-constraint-panel', '');
|
|
19
|
+
panel.hidden = true;
|
|
20
|
+
const shadow = panel.attachShadow({ mode: 'open' });
|
|
21
|
+
shadow.innerHTML = `<style>
|
|
22
|
+
:host {
|
|
23
|
+
all: initial !important;
|
|
24
|
+
display: block !important;
|
|
25
|
+
position: fixed !important;
|
|
26
|
+
inset: 0 !important;
|
|
27
|
+
z-index: 2147483645 !important;
|
|
28
|
+
pointer-events: none !important;
|
|
29
|
+
color-scheme: inherit !important;
|
|
30
|
+
--u: calc(20px * var(--sf, 1));
|
|
31
|
+
--paper: var(--ds-background-color, light-dark(#f9f6ef, #1e1e1e));
|
|
32
|
+
--ink: var(--ds-text-color, light-dark(#2a2a2a, #e8e8e8));
|
|
33
|
+
--muted: var(--ds-text-color-muted, light-dark(#797979, #a0a0a0));
|
|
34
|
+
--line: var(--ds-border-color, light-dark(#e8e8e8, #3c3c3c));
|
|
35
|
+
--danger: var(--ds-danger-color, light-dark(#de0331, #ff5f5f));
|
|
36
|
+
}
|
|
37
|
+
:host([hidden]) { display: none !important; }
|
|
38
|
+
.rings { position: absolute; inset: 0; overflow: hidden; }
|
|
39
|
+
.frames { position: absolute; width: 0; height: 0; overflow: hidden; }
|
|
40
|
+
.ring {
|
|
41
|
+
position: absolute;
|
|
42
|
+
box-sizing: border-box;
|
|
43
|
+
border: 2px solid var(--danger);
|
|
44
|
+
}
|
|
45
|
+
.ring[data-current] { background: color-mix(in srgb, var(--danger) 12%, transparent); }
|
|
46
|
+
.ring span {
|
|
47
|
+
position: absolute;
|
|
48
|
+
top: -2px;
|
|
49
|
+
left: -2px;
|
|
50
|
+
min-width: var(--u);
|
|
51
|
+
padding: 0 4px;
|
|
52
|
+
box-sizing: border-box;
|
|
53
|
+
background: var(--danger);
|
|
54
|
+
color: #fff;
|
|
55
|
+
font: 400 12px/16px var(--ds-typeface-regular, sans-serif);
|
|
56
|
+
font-variant-numeric: tabular-nums;
|
|
57
|
+
text-align: center;
|
|
58
|
+
}
|
|
59
|
+
aside {
|
|
60
|
+
position: absolute;
|
|
61
|
+
inset-block: 0;
|
|
62
|
+
inset-inline-end: 0;
|
|
63
|
+
box-sizing: border-box;
|
|
64
|
+
display: flex;
|
|
65
|
+
flex-direction: column;
|
|
66
|
+
width: min(calc(16 * var(--u)), 100vw);
|
|
67
|
+
padding: var(--u);
|
|
68
|
+
overflow: auto;
|
|
69
|
+
background: var(--paper);
|
|
70
|
+
box-shadow: -1px 0 0 var(--line);
|
|
71
|
+
color: var(--ink);
|
|
72
|
+
font: 400 14px/var(--u) var(--ds-typeface-regular, sans-serif);
|
|
73
|
+
pointer-events: auto;
|
|
74
|
+
}
|
|
75
|
+
header { display: flex; align-items: flex-end; gap: var(--u); height: var(--u); margin-bottom: var(--u); }
|
|
76
|
+
header strong { flex: 1; font-weight: 400; font-family: var(--ds-typeface-medium, inherit); }
|
|
77
|
+
button {
|
|
78
|
+
all: unset;
|
|
79
|
+
height: var(--u);
|
|
80
|
+
color: var(--muted);
|
|
81
|
+
cursor: pointer;
|
|
82
|
+
}
|
|
83
|
+
button:hover { color: var(--ink); }
|
|
84
|
+
button:focus-visible { outline: 2px solid var(--ds-focus-ring, var(--ink)); outline-offset: -2px; }
|
|
85
|
+
ol { margin: 0; padding: 0; list-style: none; }
|
|
86
|
+
li + li { border-top: 1px solid var(--line); }
|
|
87
|
+
li > :is(button, a, div) { display: block; width: 100%; height: auto; padding-block: calc(var(--u) / 2); color: var(--ink); text-decoration: none; }
|
|
88
|
+
li > a:hover .page { color: var(--ink); }
|
|
89
|
+
li > a:focus-visible { outline: 2px solid var(--ds-focus-ring, var(--ink)); outline-offset: -2px; }
|
|
90
|
+
.page { color: var(--muted); text-decoration: underline; text-underline-offset: 3px; overflow-wrap: anywhere; }
|
|
91
|
+
.element { color: var(--muted); overflow-wrap: anywhere; }
|
|
92
|
+
[data-status] { color: var(--muted); margin-bottom: calc(var(--u) / 2); }
|
|
93
|
+
section { margin-top: var(--u); }
|
|
94
|
+
section[hidden] { display: none; }
|
|
95
|
+
h3 { margin: 0; height: var(--u); font: inherit; font-family: var(--ds-typeface-medium, inherit); border-bottom: 1px solid var(--line); }
|
|
96
|
+
li.rule-row > div { padding-block: calc(var(--u) / 2); }
|
|
97
|
+
li.page-row > a { display: flex; justify-content: space-between; align-items: flex-end; gap: calc(var(--u) / 2); padding-block: 0; min-height: var(--u); }
|
|
98
|
+
li.page-row .page { text-decoration: none; }
|
|
99
|
+
li.page-row > a:hover .page { text-decoration: underline; }
|
|
100
|
+
.kept { color: var(--muted); white-space: nowrap; }
|
|
101
|
+
.broke { color: var(--danger); white-space: nowrap; }
|
|
102
|
+
.code { display: flex; gap: calc(var(--u) / 2); color: var(--muted); font-variant-numeric: tabular-nums; }
|
|
103
|
+
.code b { color: var(--danger); font-weight: 400; }
|
|
104
|
+
.rule { color: var(--muted); }
|
|
105
|
+
p { margin: 0; }
|
|
106
|
+
@media print { :host { display: none !important; } }
|
|
107
|
+
</style><div class="rings"></div><div class="frames"></div><aside aria-label="Constraints">
|
|
108
|
+
<header><strong>Constraints</strong><button type="button" data-run>Page</button><button type="button" data-site>Site</button><button type="button" data-close aria-label="Close">Close</button></header>
|
|
109
|
+
<p data-status aria-live="polite"></p>
|
|
110
|
+
<ol data-findings></ol>
|
|
111
|
+
<section data-rules hidden><h3>Rules</h3><ol></ol></section>
|
|
112
|
+
<section data-pages hidden><h3>Pages</h3><ol></ol></section>
|
|
113
|
+
</aside>`;
|
|
114
|
+
const rings = shadow.querySelector('.rings');
|
|
115
|
+
const list = shadow.querySelector('[data-findings]');
|
|
116
|
+
const rulesSection = shadow.querySelector('[data-rules]');
|
|
117
|
+
const rulesList = rulesSection.querySelector('ol');
|
|
118
|
+
const pagesSection = shadow.querySelector('[data-pages]');
|
|
119
|
+
const pagesList = pagesSection.querySelector('ol');
|
|
120
|
+
const status = shadow.querySelector('[data-status]');
|
|
121
|
+
const title = shadow.querySelector('strong');
|
|
122
|
+
const frames = shadow.querySelector('.frames');
|
|
123
|
+
const siteButton = shadow.querySelector('[data-site]');
|
|
124
|
+
let site = null;
|
|
125
|
+
let findings = [];
|
|
126
|
+
let current = -1;
|
|
127
|
+
let frame = 0;
|
|
128
|
+
const place = () => {
|
|
129
|
+
frame = 0;
|
|
130
|
+
rings.replaceChildren(...findings.map(({ element }, index) => {
|
|
131
|
+
const rect = element.getBoundingClientRect();
|
|
132
|
+
const ring = document.createElement('div');
|
|
133
|
+
ring.className = 'ring';
|
|
134
|
+
ring.toggleAttribute('data-current', index === current);
|
|
135
|
+
ring.style.cssText = `left:${rect.left}px;top:${rect.top}px;width:${rect.width}px;height:${rect.height}px`;
|
|
136
|
+
const number = document.createElement('span');
|
|
137
|
+
number.textContent = String(index + 1);
|
|
138
|
+
ring.appendChild(number);
|
|
139
|
+
return ring;
|
|
140
|
+
}));
|
|
141
|
+
};
|
|
142
|
+
const schedule = () => { if (!frame)
|
|
143
|
+
frame = requestAnimationFrame(place); };
|
|
144
|
+
const stopSite = () => {
|
|
145
|
+
site?.abort();
|
|
146
|
+
site = null;
|
|
147
|
+
siteButton.textContent = 'Site';
|
|
148
|
+
};
|
|
149
|
+
/** What each rule measured and kept, over `total` page views (one: this page). */
|
|
150
|
+
const showRules = (summaries, total) => {
|
|
151
|
+
rulesSection.hidden = false;
|
|
152
|
+
rulesList.replaceChildren(...summaries.map(summary => {
|
|
153
|
+
const item = document.createElement('li');
|
|
154
|
+
item.className = 'rule-row';
|
|
155
|
+
const box = document.createElement('div');
|
|
156
|
+
const code = document.createElement('span');
|
|
157
|
+
code.className = 'code';
|
|
158
|
+
code.textContent = summary.constraint.code;
|
|
159
|
+
const line = document.createElement('p');
|
|
160
|
+
line.textContent = ruleLine(summary, total);
|
|
161
|
+
const rule = document.createElement('p');
|
|
162
|
+
rule.className = 'rule';
|
|
163
|
+
rule.textContent = summary.constraint.rule;
|
|
164
|
+
for (const part of [code, line, rule])
|
|
165
|
+
box.appendChild(part);
|
|
166
|
+
item.appendChild(box);
|
|
167
|
+
return item;
|
|
168
|
+
}));
|
|
169
|
+
};
|
|
170
|
+
/** Every page the Site check opened, a row each: kept at every width, or how much it broke and where. */
|
|
171
|
+
const showPages = (results) => {
|
|
172
|
+
const pages = summarizePages(results);
|
|
173
|
+
pagesSection.hidden = !pages.length;
|
|
174
|
+
pagesList.replaceChildren(...pages.map(({ url, widths }) => {
|
|
175
|
+
const item = document.createElement('li');
|
|
176
|
+
item.className = 'page-row';
|
|
177
|
+
const link = document.createElement('a');
|
|
178
|
+
const address = new URL(url);
|
|
179
|
+
address.searchParams.set('constraints', '1');
|
|
180
|
+
link.href = address.href;
|
|
181
|
+
const path = document.createElement('span');
|
|
182
|
+
path.className = 'page';
|
|
183
|
+
path.textContent = decodeURI(new URL(url).pathname);
|
|
184
|
+
const state = document.createElement('span');
|
|
185
|
+
const failed = widths.filter(width => width.broken || width.error);
|
|
186
|
+
state.className = failed.length ? 'broke' : 'kept';
|
|
187
|
+
state.textContent = failed.length
|
|
188
|
+
? failed.map(({ width, broken, error }) => (error ? `${width}px not checked` : `${broken} at ${width}px`)).join(', ')
|
|
189
|
+
: `kept at ${widths.length} widths`;
|
|
190
|
+
link.appendChild(path);
|
|
191
|
+
link.appendChild(state);
|
|
192
|
+
item.appendChild(link);
|
|
193
|
+
return item;
|
|
194
|
+
}));
|
|
195
|
+
};
|
|
196
|
+
const run = () => {
|
|
197
|
+
stopSite();
|
|
198
|
+
const measured = measureConstraints(document);
|
|
199
|
+
findings = measured.flatMap(({ constraint, findings: found }) => found.map(finding => ({ ...finding, constraint })));
|
|
200
|
+
showRules(measured.map(({ constraint, measured: count, findings: found }) => ({ constraint, measured: count, views: count ? 1 : 0, broken: found.length })), 1);
|
|
201
|
+
pagesSection.hidden = true;
|
|
202
|
+
current = -1;
|
|
203
|
+
title.textContent = findings.length ? `Constraints · ${findings.length} broken` : 'Constraints';
|
|
204
|
+
status.textContent = findings.length ? `This page at ${Math.round(document.documentElement.clientWidth)}px.` : 'This page keeps every constraint.';
|
|
205
|
+
list.replaceChildren(...findings.map(({ constraint, message, element }, index) => {
|
|
206
|
+
const item = document.createElement('li');
|
|
207
|
+
const button = document.createElement('button');
|
|
208
|
+
button.type = 'button';
|
|
209
|
+
const code = document.createElement('span');
|
|
210
|
+
code.className = 'code';
|
|
211
|
+
const number = document.createElement('b');
|
|
212
|
+
number.textContent = String(index + 1);
|
|
213
|
+
code.appendChild(number);
|
|
214
|
+
code.appendChild(document.createTextNode(constraint.code));
|
|
215
|
+
const what = document.createElement('p');
|
|
216
|
+
what.textContent = message;
|
|
217
|
+
const rule = document.createElement('p');
|
|
218
|
+
rule.className = 'rule';
|
|
219
|
+
rule.textContent = constraint.rule;
|
|
220
|
+
for (const part of [code, what, rule])
|
|
221
|
+
button.appendChild(part);
|
|
222
|
+
button.addEventListener('click', () => {
|
|
223
|
+
current = index;
|
|
224
|
+
element.scrollIntoView({ block: 'center', behavior: 'smooth' });
|
|
225
|
+
schedule();
|
|
226
|
+
});
|
|
227
|
+
item.appendChild(button);
|
|
228
|
+
return item;
|
|
229
|
+
}));
|
|
230
|
+
place();
|
|
231
|
+
};
|
|
232
|
+
/** One broken rule on another page: its number, code and width, what is wrong, and a link to the page. */
|
|
233
|
+
const siteItem = (index, { url, width }, code, message, detail) => {
|
|
234
|
+
const item = document.createElement('li');
|
|
235
|
+
const link = document.createElement('a');
|
|
236
|
+
const address = new URL(url);
|
|
237
|
+
address.searchParams.set('constraints', '1');
|
|
238
|
+
link.href = address.href;
|
|
239
|
+
const head = document.createElement('span');
|
|
240
|
+
head.className = 'code';
|
|
241
|
+
const number = document.createElement('b');
|
|
242
|
+
number.textContent = String(index);
|
|
243
|
+
head.appendChild(number);
|
|
244
|
+
head.appendChild(document.createTextNode(`${code} · ${width}px`));
|
|
245
|
+
const what = document.createElement('p');
|
|
246
|
+
what.textContent = message;
|
|
247
|
+
const page = document.createElement('p');
|
|
248
|
+
page.className = 'page';
|
|
249
|
+
page.textContent = decodeURI(new URL(url).pathname);
|
|
250
|
+
const element = document.createElement('p');
|
|
251
|
+
element.className = 'element';
|
|
252
|
+
element.textContent = detail;
|
|
253
|
+
for (const part of [head, what, page, element])
|
|
254
|
+
link.appendChild(part);
|
|
255
|
+
item.appendChild(link);
|
|
256
|
+
return item;
|
|
257
|
+
};
|
|
258
|
+
/** Every page of the site at every phone width, listed as each comes in. */
|
|
259
|
+
const runSite = async () => {
|
|
260
|
+
if (site) {
|
|
261
|
+
stopSite();
|
|
262
|
+
status.textContent = 'Stopped.';
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const controller = new AbortController();
|
|
266
|
+
site = controller;
|
|
267
|
+
siteButton.textContent = 'Stop';
|
|
268
|
+
findings = [];
|
|
269
|
+
current = -1;
|
|
270
|
+
place();
|
|
271
|
+
list.replaceChildren();
|
|
272
|
+
rulesSection.hidden = true;
|
|
273
|
+
pagesSection.hidden = true;
|
|
274
|
+
title.textContent = 'Constraints';
|
|
275
|
+
status.textContent = 'Finding the pages…';
|
|
276
|
+
const pages = await findSitePages();
|
|
277
|
+
const widths = `${PHONE_WIDTHS.slice(0, -1).join(', ')} and ${PHONE_WIDTHS[PHONE_WIDTHS.length - 1]}px`;
|
|
278
|
+
let broken = 0;
|
|
279
|
+
const results = await checkSite({
|
|
280
|
+
pages,
|
|
281
|
+
inspect: (url, widths) => inspectInFrame(frames, url, widths),
|
|
282
|
+
signal: controller.signal,
|
|
283
|
+
onResult(result, done, total) {
|
|
284
|
+
const found = result.error ? [{ code: 'page', message: `It could not be checked: ${result.error}.`, element: '' }] : result.findings;
|
|
285
|
+
for (const { code, message, element } of found)
|
|
286
|
+
list.appendChild(siteItem(++broken, result, code, message, element));
|
|
287
|
+
title.textContent = broken ? `Constraints · ${broken} broken` : 'Constraints';
|
|
288
|
+
status.textContent = `Checking ${done} of ${total}: ${pages.length} pages at ${widths}…`;
|
|
289
|
+
},
|
|
290
|
+
});
|
|
291
|
+
if (controller.signal.aborted)
|
|
292
|
+
return;
|
|
293
|
+
showRules(summarizeRules(results), results.length);
|
|
294
|
+
showPages(results);
|
|
295
|
+
site = null;
|
|
296
|
+
siteButton.textContent = 'Site';
|
|
297
|
+
status.textContent = broken
|
|
298
|
+
? `${pages.length} pages at ${widths}: ${broken} broken.`
|
|
299
|
+
: `Every page keeps every constraint at ${widths} (${results.length} checks).`;
|
|
300
|
+
};
|
|
301
|
+
const show = (mode = 'page') => {
|
|
302
|
+
if (!panel.isConnected)
|
|
303
|
+
document.body.appendChild(panel);
|
|
304
|
+
panel.hidden = false;
|
|
305
|
+
if (mode === 'site')
|
|
306
|
+
void runSite();
|
|
307
|
+
else
|
|
308
|
+
run();
|
|
309
|
+
window.addEventListener('scroll', schedule, { passive: true, capture: true });
|
|
310
|
+
window.addEventListener('resize', schedule);
|
|
311
|
+
};
|
|
312
|
+
const hide = () => {
|
|
313
|
+
stopSite();
|
|
314
|
+
panel.hidden = true;
|
|
315
|
+
window.removeEventListener('scroll', schedule, { capture: true });
|
|
316
|
+
window.removeEventListener('resize', schedule);
|
|
317
|
+
};
|
|
318
|
+
shadow.querySelector('[data-run]').addEventListener('click', run);
|
|
319
|
+
siteButton.addEventListener('click', () => void runSite());
|
|
320
|
+
shadow.querySelector('[data-close]').addEventListener('click', hide);
|
|
321
|
+
return {
|
|
322
|
+
show,
|
|
323
|
+
hide,
|
|
324
|
+
run,
|
|
325
|
+
runSite,
|
|
326
|
+
toggle: () => (panel.hidden ? show() : hide()),
|
|
327
|
+
get findings() { return findings; },
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
/** The device switch a site without sign-in has instead: `?ds-owner=on` once in a browser, `?ds-owner=off` to forget it. */
|
|
331
|
+
export const OWNER_DEVICE_KEY = 'ds-owner';
|
|
332
|
+
/** Takes `?ds-owner=on` or `off` from the address into this browser's storage for the site. */
|
|
333
|
+
function rememberOwnerDevice() {
|
|
334
|
+
const asked = new URLSearchParams(window.location.search).get('ds-owner');
|
|
335
|
+
if (asked !== 'on' && asked !== 'off')
|
|
336
|
+
return;
|
|
337
|
+
try {
|
|
338
|
+
if (asked === 'on')
|
|
339
|
+
localStorage.setItem(OWNER_DEVICE_KEY, 'on');
|
|
340
|
+
else
|
|
341
|
+
localStorage.removeItem(OWNER_DEVICE_KEY);
|
|
342
|
+
}
|
|
343
|
+
catch { /* Storage blocked: the switch lasts this page alone. */ }
|
|
344
|
+
}
|
|
345
|
+
/** A browser switched on as the owner's with `?ds-owner=on`. */
|
|
346
|
+
const isOwnerDevice = () => {
|
|
347
|
+
try {
|
|
348
|
+
return localStorage.getItem(OWNER_DEVICE_KEY) === 'on';
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
/**
|
|
355
|
+
* Whether the viewer owns the page: `<html data-ds-owner>`, which a site with
|
|
356
|
+
* sign-in sets from its own server-checked owner, or a browser switched on as
|
|
357
|
+
* the owner's (`?ds-owner=on`) on a site without sign-in.
|
|
358
|
+
*/
|
|
359
|
+
export const isPageOwner = () => document.documentElement.hasAttribute('data-ds-owner') || isOwnerDevice()
|
|
360
|
+
|| new URLSearchParams(window.location.search).get('ds-owner') === 'on';
|
|
361
|
+
/** What the address asks the panel to show on load: `?constraints=1` this page, `?constraints=site` every page. */
|
|
362
|
+
export function askedConstraints(search = window.location.search) {
|
|
363
|
+
const asked = new URLSearchParams(search).get('constraints');
|
|
364
|
+
if (asked === 'site')
|
|
365
|
+
return 'site';
|
|
366
|
+
return asked === '1' || asked === 'page' || asked === '' ? 'page' : null;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Five presses of C toggle the constraint panel, for the page's owner only
|
|
370
|
+
* (`isPageOwner`): for anyone else the presses do nothing. `?constraints=1` in
|
|
371
|
+
* the address opens it for anyone once the page has loaded, since it only
|
|
372
|
+
* measures; `?constraints=site` opens it on the whole site's check. Escape
|
|
373
|
+
* hides it. Presses typed into a field, with a modifier or held down never
|
|
374
|
+
* count, and any other key starts the count again.
|
|
375
|
+
*/
|
|
376
|
+
export function initConstraintShortcut() {
|
|
377
|
+
if (typeof document === 'undefined')
|
|
378
|
+
return;
|
|
379
|
+
const root = document.documentElement;
|
|
380
|
+
if (root.hasAttribute('data-ds-constraints-ready'))
|
|
381
|
+
return;
|
|
382
|
+
root.setAttribute('data-ds-constraints-ready', '');
|
|
383
|
+
rememberOwnerDevice();
|
|
384
|
+
let panel = null;
|
|
385
|
+
const open = () => (panel ?? (panel = createConstraintPanel()));
|
|
386
|
+
const asked = askedConstraints();
|
|
387
|
+
// Not in a frame of the site's own check, and only once the page and its pictures have drawn.
|
|
388
|
+
if (asked && window.parent === window) {
|
|
389
|
+
if (document.readyState === 'complete')
|
|
390
|
+
open().show(asked);
|
|
391
|
+
else
|
|
392
|
+
window.addEventListener('load', () => open().show(asked), { once: true });
|
|
393
|
+
}
|
|
394
|
+
let presses = 0;
|
|
395
|
+
let lastPress = 0;
|
|
396
|
+
const reset = () => { presses = 0; };
|
|
397
|
+
window.addEventListener('blur', reset);
|
|
398
|
+
window.addEventListener('keydown', (event) => {
|
|
399
|
+
const editing = document.designMode === 'on' || event.composedPath().some(target => target instanceof HTMLElement && (target.isContentEditable || target.matches('input, textarea, select, [role="textbox"], [role="combobox"]')));
|
|
400
|
+
if (editing || event.defaultPrevented || event.isComposing || event.repeat || event.metaKey || event.ctrlKey || event.altKey) {
|
|
401
|
+
reset();
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
if (event.key === 'Escape')
|
|
405
|
+
panel?.hide();
|
|
406
|
+
if (event.key.toLowerCase() !== 'c') {
|
|
407
|
+
reset();
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
const now = performance.now();
|
|
411
|
+
presses = now - lastPress <= 800 ? presses + 1 : 1;
|
|
412
|
+
lastPress = now;
|
|
413
|
+
if (presses === CONSTRAINT_PRESSES) {
|
|
414
|
+
reset();
|
|
415
|
+
if (isPageOwner())
|
|
416
|
+
open().toggle();
|
|
417
|
+
else
|
|
418
|
+
panel?.hide();
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
if (typeof document !== 'undefined') {
|
|
423
|
+
if (document.readyState === 'loading') {
|
|
424
|
+
document.addEventListener('DOMContentLoaded', initConstraintShortcut, { once: true });
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
initConstraintShortcut();
|
|
428
|
+
}
|
|
429
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type Constraint } from './constraints';
|
|
2
|
+
/** The narrowest phone still sold, the common ones and the widest. */
|
|
3
|
+
export declare const PHONE_WIDTHS: number[];
|
|
4
|
+
/** Pages checked side by side, each in its own frame. */
|
|
5
|
+
export declare const PAGES_AT_ONCE = 3;
|
|
6
|
+
/** A rule broken on a page at a width, said in words, since the element stays in its frame. */
|
|
7
|
+
export type SiteFinding = {
|
|
8
|
+
code: string;
|
|
9
|
+
rule: string;
|
|
10
|
+
message: string;
|
|
11
|
+
element: string;
|
|
12
|
+
review?: boolean;
|
|
13
|
+
};
|
|
14
|
+
/** What one page at one width kept and broke: each rule's count of what it measured, and its findings. */
|
|
15
|
+
export type PageCheck = {
|
|
16
|
+
findings: SiteFinding[];
|
|
17
|
+
measured: Record<string, number>;
|
|
18
|
+
};
|
|
19
|
+
export type PageResult = PageCheck & {
|
|
20
|
+
url: string;
|
|
21
|
+
width: number;
|
|
22
|
+
error?: string;
|
|
23
|
+
};
|
|
24
|
+
/** An element as a person finds it: its tag, id and classes, and the start of its words. */
|
|
25
|
+
export declare function describeElement(element: Element): string;
|
|
26
|
+
/** The pages a sitemap lists on the site's own origin, in its order and once each; none when it lists none. */
|
|
27
|
+
export declare function sitemapPages(xml: string, origin: string): string[];
|
|
28
|
+
/** The site's pages: its sitemap's, or else the page itself and every page it links to on the site. */
|
|
29
|
+
export declare function findSitePages(page?: Document): Promise<string[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Opens a page once in a frame inside `host`, then makes the frame as wide as each width in turn, draws
|
|
32
|
+
* the page at that width's phone scale, and returns what every rule measured and found at each, in the
|
|
33
|
+
* order of `widths`. The page reflows at each width without loading again. The address carries `ph=out`,
|
|
34
|
+
* the analytics opt-out most trackers honour, so the check counts no visits.
|
|
35
|
+
*/
|
|
36
|
+
export declare function inspectInFrame(host: Element | ShadowRoot, url: string, widths?: number[], height?: number): Promise<PageCheck[]>;
|
|
37
|
+
/** Every rule on a page: what it measured, and each place it is broken, said in words. */
|
|
38
|
+
export declare function checkPage(page: ParentNode): PageCheck;
|
|
39
|
+
/**
|
|
40
|
+
* Checks every page at every width, `PAGES_AT_ONCE` pages side by side, and reports each page's result at
|
|
41
|
+
* each width as it comes. Stops starting pages when `signal` aborts. Whatever the pages store in this
|
|
42
|
+
* browser while they are checked is put back afterwards.
|
|
43
|
+
*/
|
|
44
|
+
export declare function checkSite({ pages, widths, inspect, onResult, signal, atOnce }: {
|
|
45
|
+
pages: string[];
|
|
46
|
+
widths?: number[];
|
|
47
|
+
/** One page at every width, in the order of `widths`. */
|
|
48
|
+
inspect: (url: string, widths: number[]) => Promise<PageCheck[]>;
|
|
49
|
+
onResult: (result: PageResult, done: number, total: number) => void;
|
|
50
|
+
signal?: AbortSignal;
|
|
51
|
+
atOnce?: number;
|
|
52
|
+
}): Promise<PageResult[]>;
|
|
53
|
+
/** A rule over a check: how many things it measured, on how many of the page views, and how often it broke. */
|
|
54
|
+
export type RuleSummary = {
|
|
55
|
+
constraint: Constraint;
|
|
56
|
+
measured: number;
|
|
57
|
+
views: number;
|
|
58
|
+
broken: number;
|
|
59
|
+
};
|
|
60
|
+
export declare function summarizeRules(results: PageCheck[]): RuleSummary[];
|
|
61
|
+
/** What a rule did, in a sentence: kept, broken, or nothing on the pages for it to measure. `views` is how many page views were checked; one is this page. */
|
|
62
|
+
export declare function ruleLine({ constraint, measured, views, broken }: RuleSummary, total: number): string;
|
|
63
|
+
/** Every page checked, in the order checked, with how much it broke at each width. */
|
|
64
|
+
export declare function summarizePages(results: PageResult[]): {
|
|
65
|
+
url: string;
|
|
66
|
+
widths: {
|
|
67
|
+
width: number;
|
|
68
|
+
broken: number;
|
|
69
|
+
error?: string;
|
|
70
|
+
}[];
|
|
71
|
+
}[];
|
|
72
|
+
//# sourceMappingURL=constraint-site.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraint-site.d.ts","sourceRoot":"","sources":["../../DS1/0-face/constraint-site.ts"],"names":[],"mappings":"AAKA,OAAO,EAAmC,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAGjF,sEAAsE;AACtE,eAAO,MAAM,YAAY,UAAuB,CAAC;AACjD,yDAAyD;AACzD,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,+FAA+F;AAC/F,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAC7G,0GAA0G;AAC1G,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AACtF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAIxD;AAED,+GAA+G;AAC/G,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAUlE;AAED,uGAAuG;AACvG,wBAAsB,aAAa,CAAC,IAAI,GAAE,QAAmB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAahF;AAID;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAiB,EAAE,MAAM,SAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAmCjJ;AAED,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAQrD;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,EAAE,KAAK,EAAE,MAAqB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAsB,EAAE,EAAE;IACnH,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,yDAAyD;IACzD,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACjE,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAuBxB;AAmBD,+GAA+G;AAC/G,MAAM,MAAM,WAAW,GAAG;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtG,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,EAAE,CAUlE;AAID,8JAA8J;AAC9J,wBAAgB,QAAQ,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpG;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,EAAE,CAMpI"}
|