@0001-labs/design-system-1 0.3.0-alpha.27 → 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/library-tokens.ts +1 -2
- 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/palette.ts +3 -3
- 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 +10 -6
- 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/1-root/library-tokens.d.ts.map +1 -1
- package/dist/1-root/library-tokens.js +1 -2
- package/dist/1-root/palette.d.ts +2 -2
- package/dist/1-root/palette.d.ts.map +1 -1
- package/dist/1-root/palette.js +3 -3
- 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 +5505 -2068
- 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 +24 -13
- package/DS1/1-root/one.semantic.css +0 -735
- 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
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image focus: where a photo's subject is, so a picture cut to its box
|
|
3
|
+
* (`object-fit: cover`) keeps it in view instead of its middle. A person's
|
|
4
|
+
* face first, then whatever in the picture holds the most detail. Plain
|
|
5
|
+
* TypeScript with no imports, for the browser and for a build script alike.
|
|
6
|
+
*
|
|
7
|
+
* The focus is a point of the picture, across and down from 0 to 1, and it is
|
|
8
|
+
* written as the picture's `object-position` (`objectPosition()`), so a
|
|
9
|
+
* cover crop of any shape keeps that point in view. Work it out once, where
|
|
10
|
+
* the page is built, and write it into the markup, so the first paint is
|
|
11
|
+
* already cut right. On a Mac, `focus-vision.swift` finds the faces and the
|
|
12
|
+
* salient part with Apple's Vision framework, and `focusFromRegions()` turns
|
|
13
|
+
* them into the focus; elsewhere, or where it finds nothing, `focusOf()`
|
|
14
|
+
* reads the pixels:
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* // swift 0-face/focus-vision.swift *.jpg > regions.json
|
|
18
|
+
* import { focusFromRegions, focusOf, objectPosition } from "./0-face/focus.ts";
|
|
19
|
+
* const focus = focusFromRegions(regions[name]) ?? focusOf(data, info.width, info.height, info.channels);
|
|
20
|
+
* // <img src="…" style="object-position: 50% 18%">
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* A page with no build step marks a picture `data-ds-focus="auto"` and calls
|
|
24
|
+
* `startFocus()`: once the picture has loaded, its focus is found and kept in
|
|
25
|
+
* the browser, so it is right from the first paint on the next visit. A
|
|
26
|
+
* picture whose focus a person chose says so, `data-ds-focus="40% 20%"`, and
|
|
27
|
+
* is never measured. A picture from another host without CORS cannot be read
|
|
28
|
+
* and keeps its middle.
|
|
29
|
+
*/
|
|
30
|
+
export const CENTRE = { x: 0.5, y: 0.5 };
|
|
31
|
+
/** The width a picture is measured at; enough to find a face, and cheap. */
|
|
32
|
+
export const FOCUS_SAMPLE = 64;
|
|
33
|
+
/** Whether a pixel's colour is skin, in YCbCr, for any skin tone. */
|
|
34
|
+
function isSkin(r, g, b) {
|
|
35
|
+
const y = 0.299 * r + 0.587 * g + 0.114 * b;
|
|
36
|
+
const cb = 128 - 0.168736 * r - 0.331264 * g + 0.5 * b;
|
|
37
|
+
const cr = 128 + 0.5 * r - 0.418688 * g - 0.081312 * b;
|
|
38
|
+
return y > 40 && cb >= 77 && cb <= 127 && cr >= 137 && cr <= 173 && r > g && r > b;
|
|
39
|
+
}
|
|
40
|
+
const clamp = (value) => Math.min(1, Math.max(0, value));
|
|
41
|
+
/**
|
|
42
|
+
* The focus of a picture from its pixels (RGB or RGBA, row by row), measured
|
|
43
|
+
* small (about `FOCUS_SAMPLE` across). Skin that gathers into a face wins:
|
|
44
|
+
* the highest band of rows dense with skin, since a face stands above hands
|
|
45
|
+
* and arms. Without one, the centre of the picture's detail (where neighbouring
|
|
46
|
+
* pixels differ most), drawn a little towards the middle so a busy edge does
|
|
47
|
+
* not take the crop.
|
|
48
|
+
*/
|
|
49
|
+
export function focusOf(pixels, width, height, channels = 4) {
|
|
50
|
+
if (width < 2 || height < 2)
|
|
51
|
+
return CENTRE;
|
|
52
|
+
const at = (x, y) => (y * width + x) * channels;
|
|
53
|
+
const luma = new Float32Array(width * height);
|
|
54
|
+
const skin = new Uint8Array(width * height);
|
|
55
|
+
let skinCount = 0;
|
|
56
|
+
for (let y = 0; y < height; y++) {
|
|
57
|
+
for (let x = 0; x < width; x++) {
|
|
58
|
+
const i = at(x, y);
|
|
59
|
+
const r = pixels[i], g = pixels[i + 1], b = pixels[i + 2];
|
|
60
|
+
luma[y * width + x] = 0.299 * r + 0.587 * g + 0.114 * b;
|
|
61
|
+
if (isSkin(r, g, b)) {
|
|
62
|
+
skin[y * width + x] = 1;
|
|
63
|
+
skinCount++;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// A face: skin over at least half a percent of the picture, in a band of rows.
|
|
68
|
+
if (skinCount >= width * height * 0.005) {
|
|
69
|
+
const band = Math.max(2, Math.round(height / 10));
|
|
70
|
+
const rows = new Float32Array(height);
|
|
71
|
+
for (let y = 0; y < height; y++)
|
|
72
|
+
for (let x = 0; x < width; x++)
|
|
73
|
+
rows[y] += skin[y * width + x];
|
|
74
|
+
let densest = 0;
|
|
75
|
+
const bands = [];
|
|
76
|
+
for (let y = 0; y + band <= height; y++) {
|
|
77
|
+
let sum = 0;
|
|
78
|
+
for (let k = 0; k < band; k++)
|
|
79
|
+
sum += rows[y + k];
|
|
80
|
+
bands.push(sum);
|
|
81
|
+
densest = Math.max(densest, sum);
|
|
82
|
+
}
|
|
83
|
+
const top = bands.findIndex(sum => sum >= densest * 0.45);
|
|
84
|
+
if (top >= 0) {
|
|
85
|
+
let sx = 0, sy = 0, n = 0;
|
|
86
|
+
for (let y = top; y < Math.min(height, top + band * 2); y++) {
|
|
87
|
+
for (let x = 0; x < width; x++)
|
|
88
|
+
if (skin[y * width + x]) {
|
|
89
|
+
sx += x;
|
|
90
|
+
sy += y;
|
|
91
|
+
n++;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (n)
|
|
95
|
+
return { x: clamp((sx / n + 0.5) / width), y: clamp((sy / n + 0.5) / height) };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Otherwise the picture's detail.
|
|
99
|
+
let sx = 0, sy = 0, total = 0;
|
|
100
|
+
for (let y = 1; y < height - 1; y++) {
|
|
101
|
+
for (let x = 1; x < width - 1; x++) {
|
|
102
|
+
const i = y * width + x;
|
|
103
|
+
const energy = Math.abs(luma[i + 1] - luma[i - 1]) + Math.abs(luma[i + width] - luma[i - width]);
|
|
104
|
+
sx += x * energy;
|
|
105
|
+
sy += y * energy;
|
|
106
|
+
total += energy;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!total)
|
|
110
|
+
return CENTRE;
|
|
111
|
+
const pull = 0.35;
|
|
112
|
+
return {
|
|
113
|
+
x: clamp(((sx / total + 0.5) / width) * (1 - pull) + 0.5 * pull),
|
|
114
|
+
y: clamp(((sy / total + 0.5) / height) * (1 - pull) + 0.5 * pull),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The focus from what a detector found (`focus-vision.swift`: Apple's face
|
|
119
|
+
* detection and attention-based saliency), or `undefined` when it found
|
|
120
|
+
* nothing. Faces win: the point between them across, and down a little above
|
|
121
|
+
* the top of the highest, so a crop keeps the heads whole with room above
|
|
122
|
+
* them. Otherwise the middle of everything salient.
|
|
123
|
+
*/
|
|
124
|
+
export function focusFromRegions(found) {
|
|
125
|
+
const faces = (found.faces ?? []).filter(face => face.w * face.h > 0.0005);
|
|
126
|
+
if (faces.length) {
|
|
127
|
+
const biggest = Math.max(...faces.map(face => face.w * face.h));
|
|
128
|
+
const kept = faces.filter(face => face.w * face.h >= biggest * 0.25);
|
|
129
|
+
const left = Math.min(...kept.map(face => face.x));
|
|
130
|
+
const right = Math.max(...kept.map(face => face.x + face.w));
|
|
131
|
+
const top = Math.min(...kept.map(face => face.y));
|
|
132
|
+
const height = Math.max(...kept.map(face => face.h));
|
|
133
|
+
return { x: clamp((left + right) / 2), y: clamp(top - height * 0.35) };
|
|
134
|
+
}
|
|
135
|
+
const salient = found.salient ?? [];
|
|
136
|
+
if (!salient.length)
|
|
137
|
+
return undefined;
|
|
138
|
+
const left = Math.min(...salient.map(r => r.x));
|
|
139
|
+
const right = Math.max(...salient.map(r => r.x + r.w));
|
|
140
|
+
const top = Math.min(...salient.map(r => r.y));
|
|
141
|
+
const bottom = Math.max(...salient.map(r => r.y + r.h));
|
|
142
|
+
return { x: clamp((left + right) / 2), y: clamp((top + bottom) / 2) };
|
|
143
|
+
}
|
|
144
|
+
/** The focus as CSS `object-position`, in whole percents. */
|
|
145
|
+
export function objectPosition(focus) {
|
|
146
|
+
return `${Math.round(focus.x * 100)}% ${Math.round(focus.y * 100)}%`;
|
|
147
|
+
}
|
|
148
|
+
const KEY = "ds-focus:";
|
|
149
|
+
/** Finds and sets the focus of one picture marked `data-ds-focus="auto"`, once it has loaded. */
|
|
150
|
+
export function focusImage(image) {
|
|
151
|
+
const chosen = image.dataset.dsFocus;
|
|
152
|
+
if (chosen && chosen !== "auto") {
|
|
153
|
+
image.style.objectPosition = chosen;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const source = image.currentSrc || image.src;
|
|
157
|
+
try {
|
|
158
|
+
const kept = localStorage.getItem(KEY + source);
|
|
159
|
+
if (kept) {
|
|
160
|
+
image.style.objectPosition = kept;
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch { /* Storage can be blocked. */ }
|
|
165
|
+
const measure = () => {
|
|
166
|
+
if (!image.naturalWidth)
|
|
167
|
+
return;
|
|
168
|
+
const width = FOCUS_SAMPLE;
|
|
169
|
+
const height = Math.max(2, Math.round((image.naturalHeight / image.naturalWidth) * width));
|
|
170
|
+
const canvas = document.createElement("canvas");
|
|
171
|
+
canvas.width = width;
|
|
172
|
+
canvas.height = height;
|
|
173
|
+
const context = canvas.getContext("2d", { willReadFrequently: true });
|
|
174
|
+
if (!context)
|
|
175
|
+
return;
|
|
176
|
+
try {
|
|
177
|
+
context.drawImage(image, 0, 0, width, height);
|
|
178
|
+
const position = objectPosition(focusOf(context.getImageData(0, 0, width, height).data, width, height, 4));
|
|
179
|
+
image.style.objectPosition = position;
|
|
180
|
+
try {
|
|
181
|
+
localStorage.setItem(KEY + source, position);
|
|
182
|
+
}
|
|
183
|
+
catch { /* Storage can be blocked. */ }
|
|
184
|
+
}
|
|
185
|
+
catch { /* A picture from another host without CORS cannot be read; it keeps its middle. */ }
|
|
186
|
+
};
|
|
187
|
+
if (image.complete)
|
|
188
|
+
measure();
|
|
189
|
+
else
|
|
190
|
+
image.addEventListener("load", measure, { once: true });
|
|
191
|
+
}
|
|
192
|
+
/** Sets the focus of every picture marked `data-ds-focus` in `root`. */
|
|
193
|
+
export function startFocus(root = document) {
|
|
194
|
+
for (const image of root.querySelectorAll("img[data-ds-focus]"))
|
|
195
|
+
focusImage(image);
|
|
196
|
+
}
|
package/dist/0-face/grid.d.ts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** The presses of one key, each within 800ms of the last, that toggle an overlay. */
|
|
2
|
+
export declare const GRID_PRESSES = 5;
|
|
3
|
+
/**
|
|
4
|
+
* Five presses of G toggle the grid and five of L inspect the layout, on every
|
|
5
|
+
* page that loads this module and for everyone who reads it: never put them
|
|
6
|
+
* behind a user, an owner or a development check. Escape hides both. Presses
|
|
7
|
+
* typed into a field, with a modifier or held down never count, and any other
|
|
8
|
+
* key starts the count again.
|
|
9
|
+
* A nested scrolling viewport opts in with data-ds-grid-scroll: its grid follows
|
|
10
|
+
* its content while the page grid remains aligned outside the viewport.
|
|
11
|
+
*/
|
|
2
12
|
export declare function initGridShortcut(): void;
|
|
3
13
|
//# sourceMappingURL=grid.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../DS1/0-face/grid.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../DS1/0-face/grid.ts"],"names":[],"mappings":"AAIA,qFAAqF;AACrF,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAiLvC"}
|
package/dist/0-face/grid.js
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { createLayoutInspector } from './layout-inspector';
|
|
2
2
|
import { initGridFit } from './grid-fit';
|
|
3
|
-
|
|
3
|
+
import { initConstraintShortcut } from './constraint-panel';
|
|
4
|
+
/** The presses of one key, each within 800ms of the last, that toggle an overlay. */
|
|
5
|
+
export const GRID_PRESSES = 5;
|
|
6
|
+
/**
|
|
7
|
+
* Five presses of G toggle the grid and five of L inspect the layout, on every
|
|
8
|
+
* page that loads this module and for everyone who reads it: never put them
|
|
9
|
+
* behind a user, an owner or a development check. Escape hides both. Presses
|
|
10
|
+
* typed into a field, with a modifier or held down never count, and any other
|
|
11
|
+
* key starts the count again.
|
|
12
|
+
* A nested scrolling viewport opts in with data-ds-grid-scroll: its grid follows
|
|
13
|
+
* its content while the page grid remains aligned outside the viewport.
|
|
14
|
+
*/
|
|
4
15
|
export function initGridShortcut() {
|
|
5
16
|
if (typeof document === "undefined")
|
|
6
17
|
return;
|
|
@@ -10,6 +21,8 @@ export function initGridShortcut() {
|
|
|
10
21
|
root.setAttribute("data-ds-grid-ready", "");
|
|
11
22
|
root.setAttribute("data-design-system", "1");
|
|
12
23
|
initGridFit();
|
|
24
|
+
// Five presses of C, for the page's owner alone (constraint-panel.ts).
|
|
25
|
+
initConstraintShortcut();
|
|
13
26
|
const overlay = document.createElement("div");
|
|
14
27
|
overlay.setAttribute("data-ds-grid-overlay", "");
|
|
15
28
|
overlay.setAttribute("aria-hidden", "true");
|
|
@@ -43,19 +56,92 @@ export function initGridShortcut() {
|
|
|
43
56
|
</style><div class="grid"></div>`;
|
|
44
57
|
document.body.appendChild(overlay);
|
|
45
58
|
const layout = createLayoutInspector();
|
|
59
|
+
const pageGrid = shadow.querySelector('.grid');
|
|
60
|
+
const scopedGrids = new Map();
|
|
61
|
+
let tracking = false;
|
|
62
|
+
const resize = new ResizeObserver(() => { if (tracking)
|
|
63
|
+
updatePosition(); });
|
|
64
|
+
const regionsChanged = new MutationObserver(() => { if (tracking)
|
|
65
|
+
updatePosition(); });
|
|
46
66
|
const updatePosition = () => {
|
|
47
67
|
overlay.style.setProperty("--ds-grid-scroll-x", `${window.scrollX}px`);
|
|
48
68
|
overlay.style.setProperty("--ds-grid-scroll-y", `${window.scrollY}px`);
|
|
69
|
+
const present = new Set();
|
|
70
|
+
const holes = [];
|
|
71
|
+
document.querySelectorAll('[data-ds-grid-scroll]').forEach(element => {
|
|
72
|
+
const rect = element.getBoundingClientRect();
|
|
73
|
+
let left = rect.left + element.clientLeft, top = rect.top + element.clientTop;
|
|
74
|
+
let right = left + element.clientWidth, bottom = top + element.clientHeight;
|
|
75
|
+
// The overlay must respect enclosing scroll viewports as the content does.
|
|
76
|
+
for (let parent = element.parentElement; parent; parent = parent.parentElement) {
|
|
77
|
+
const style = getComputedStyle(parent), box = parent.getBoundingClientRect();
|
|
78
|
+
if (/(auto|scroll|hidden|clip)/.test(style.overflowX)) {
|
|
79
|
+
left = Math.max(left, box.left + parent.clientLeft);
|
|
80
|
+
right = Math.min(right, box.left + parent.clientLeft + parent.clientWidth);
|
|
81
|
+
}
|
|
82
|
+
if (/(auto|scroll|hidden|clip)/.test(style.overflowY)) {
|
|
83
|
+
top = Math.max(top, box.top + parent.clientTop);
|
|
84
|
+
bottom = Math.min(bottom, box.top + parent.clientTop + parent.clientHeight);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
left = Math.max(0, left);
|
|
88
|
+
top = Math.max(0, top);
|
|
89
|
+
right = Math.min(innerWidth, right);
|
|
90
|
+
bottom = Math.min(innerHeight, bottom);
|
|
91
|
+
if (right <= left || bottom <= top || !element.getClientRects().length)
|
|
92
|
+
return;
|
|
93
|
+
present.add(element);
|
|
94
|
+
let grid = scopedGrids.get(element);
|
|
95
|
+
if (!grid) {
|
|
96
|
+
grid = document.createElement('div');
|
|
97
|
+
grid.className = 'grid';
|
|
98
|
+
grid.setAttribute('data-ds-grid-region', '');
|
|
99
|
+
shadow.append(grid);
|
|
100
|
+
scopedGrids.set(element, grid);
|
|
101
|
+
resize.observe(element);
|
|
102
|
+
}
|
|
103
|
+
const style = getComputedStyle(element);
|
|
104
|
+
for (const property of ['--ds-grid-unit', '--unit', '--sf', '--ds-grid-color', '--ds-grid-origin-x', '--ds-grid-origin-y', '--ds-grid-line-offset']) {
|
|
105
|
+
const value = style.getPropertyValue(property);
|
|
106
|
+
if (value)
|
|
107
|
+
grid.style.setProperty(property, value);
|
|
108
|
+
else
|
|
109
|
+
grid.style.removeProperty(property);
|
|
110
|
+
}
|
|
111
|
+
Object.assign(grid.style, { inset: 'auto', left: `${left}px`, top: `${top}px`, width: `${right - left}px`, height: `${bottom - top}px` });
|
|
112
|
+
grid.style.setProperty('--ds-grid-scroll-x', `${window.scrollX + left + element.scrollLeft}px`);
|
|
113
|
+
grid.style.setProperty('--ds-grid-scroll-y', `${window.scrollY + top + element.scrollTop}px`);
|
|
114
|
+
// Opposite winding makes each viewport a hole in the page grid.
|
|
115
|
+
holes.push(`M${left},${top}V${bottom}H${right}V${top}Z`);
|
|
116
|
+
});
|
|
117
|
+
scopedGrids.forEach((grid, element) => { if (!present.has(element)) {
|
|
118
|
+
resize.unobserve(element);
|
|
119
|
+
grid.remove();
|
|
120
|
+
scopedGrids.delete(element);
|
|
121
|
+
} });
|
|
122
|
+
pageGrid.style.clipPath = holes.length ? `path("M0,0H${innerWidth}V${innerHeight}H0Z ${holes.join(' ')}")` : '';
|
|
49
123
|
};
|
|
50
124
|
const setVisible = (visible) => {
|
|
51
125
|
overlay.hidden = !visible;
|
|
52
126
|
root.toggleAttribute("data-ds-grid-visible", visible);
|
|
53
127
|
if (visible) {
|
|
128
|
+
tracking = true;
|
|
54
129
|
updatePosition();
|
|
55
|
-
|
|
130
|
+
document.addEventListener('scroll', updatePosition, { passive: true, capture: true });
|
|
131
|
+
window.addEventListener('scroll', updatePosition, { passive: true });
|
|
132
|
+
window.addEventListener('resize', updatePosition, { passive: true });
|
|
133
|
+
regionsChanged.observe(document.body, { childList: true, subtree: true });
|
|
56
134
|
}
|
|
57
135
|
else {
|
|
58
|
-
|
|
136
|
+
tracking = false;
|
|
137
|
+
document.removeEventListener('scroll', updatePosition, true);
|
|
138
|
+
window.removeEventListener('scroll', updatePosition);
|
|
139
|
+
window.removeEventListener('resize', updatePosition);
|
|
140
|
+
regionsChanged.disconnect();
|
|
141
|
+
resize.disconnect();
|
|
142
|
+
scopedGrids.forEach(grid => grid.remove());
|
|
143
|
+
scopedGrids.clear();
|
|
144
|
+
pageGrid.style.clipPath = '';
|
|
59
145
|
}
|
|
60
146
|
window.dispatchEvent(new CustomEvent("design-system-grid-changed", { detail: { visible } }));
|
|
61
147
|
};
|
|
@@ -126,7 +212,7 @@ export function initGridShortcut() {
|
|
|
126
212
|
presses = key === lastKey && now - lastPress <= 800 ? presses + 1 : 1;
|
|
127
213
|
lastKey = key;
|
|
128
214
|
lastPress = now;
|
|
129
|
-
if (presses ===
|
|
215
|
+
if (presses === GRID_PRESSES) {
|
|
130
216
|
reset();
|
|
131
217
|
if (key === 'g')
|
|
132
218
|
setVisible(overlay.hidden !== false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../DS1/0-face/i18n.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAG/B,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAGlC,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;AAGF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IACpC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC;IACpE;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IAC9C;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CAClC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,QAAQ,EAAc,CAAC;AAMlE,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACtD,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B;CACF;AAyVD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BlE;AAiFD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,MAAM,CA6CR;AAqCD;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAqBjD;AA0CD,eAAO,MAAM,eAAe;;gBAEL,YAAY,YAAW,kBAAkB;CAc/D,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAsCrD;AAmBD;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAU/C;
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../DS1/0-face/i18n.ts"],"names":[],"mappings":"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"}
|
package/dist/0-face/i18n.js
CHANGED
|
@@ -577,17 +577,47 @@ export function loadSharedWords() {
|
|
|
577
577
|
}
|
|
578
578
|
return sharedWordsLoad;
|
|
579
579
|
}
|
|
580
|
+
/**
|
|
581
|
+
* The words a page loads as it starts (the shared words, the translations file), announced once
|
|
582
|
+
* between them: each announcement redraws every translated word on the page, so three arrivals in
|
|
583
|
+
* the first half second used to redraw it three times. A load that never ends holds the
|
|
584
|
+
* announcement back no longer than `STARTUP_WAIT`.
|
|
585
|
+
*/
|
|
586
|
+
const startupLoads = [];
|
|
587
|
+
const STARTUP_WAIT = 1000;
|
|
588
|
+
let announcement = null;
|
|
589
|
+
let announced = false;
|
|
590
|
+
/** The window this module loaded into, which hears its announcements. */
|
|
591
|
+
const page = typeof window !== "undefined" ? window : undefined;
|
|
592
|
+
function announceTranslations() {
|
|
593
|
+
if (announcement)
|
|
594
|
+
return;
|
|
595
|
+
const wait = new Promise((resolve) => setTimeout(resolve, STARTUP_WAIT));
|
|
596
|
+
announcement = Promise.race([Promise.allSettled(startupLoads.splice(0)), wait]).then(() => {
|
|
597
|
+
announcement = null;
|
|
598
|
+
announced = true;
|
|
599
|
+
if (!eventful() || !page)
|
|
600
|
+
return;
|
|
601
|
+
page.dispatchEvent(new CustomEvent("translations-loaded"));
|
|
602
|
+
// Dispatch language-changed to update all components
|
|
603
|
+
dispatchLanguageChanged(currentLanguage.value);
|
|
604
|
+
});
|
|
605
|
+
}
|
|
580
606
|
applyRouting();
|
|
581
607
|
if (i18nOptions.sharedWords) {
|
|
582
|
-
|
|
608
|
+
startupLoads.push(loadSharedWords());
|
|
583
609
|
}
|
|
584
610
|
// Auto-load translations when this module is imported (for CDN bundle).
|
|
585
611
|
// Waits a task, so a product can configure the module first, even after a
|
|
586
612
|
// dynamic import.
|
|
587
613
|
if (typeof window !== "undefined" && typeof document !== "undefined") {
|
|
614
|
+
let started = () => { };
|
|
615
|
+
startupLoads.push(new Promise((resolve) => (started = resolve)));
|
|
588
616
|
const start = () => {
|
|
589
617
|
if (i18nOptions.autoLoad !== false)
|
|
590
|
-
void loadExternalTranslations();
|
|
618
|
+
void loadExternalTranslations().finally(started);
|
|
619
|
+
else
|
|
620
|
+
started();
|
|
591
621
|
};
|
|
592
622
|
if (document.readyState === "loading") {
|
|
593
623
|
document.addEventListener("DOMContentLoaded", start);
|
|
@@ -602,21 +632,13 @@ if (typeof window !== "undefined" && typeof document !== "undefined") {
|
|
|
602
632
|
// below would otherwise throw after the code that imported this has finished.
|
|
603
633
|
const eventful = () => typeof window !== "undefined" && typeof window.addEventListener === "function" && typeof window.dispatchEvent === "function";
|
|
604
634
|
if (eventful()) {
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
dispatchLanguageChanged(currentLanguage.value);
|
|
610
|
-
});
|
|
611
|
-
// Initialize translations on module load
|
|
612
|
-
// Use setTimeout to give other parts of the app time to set up event listeners first
|
|
635
|
+
// New words: translations-loaded and language-changed, once for everything still arriving.
|
|
636
|
+
window.addEventListener("translations-ready", announceTranslations);
|
|
637
|
+
// A page whose words were all there at once still hears translations-loaded once, after its
|
|
638
|
+
// listeners have had a moment to attach; one already announced or on its way is enough.
|
|
613
639
|
setTimeout(() => {
|
|
614
|
-
if (
|
|
615
|
-
|
|
616
|
-
}
|
|
617
|
-
window.dispatchEvent(new CustomEvent("translations-loaded"));
|
|
618
|
-
// Also dispatch language-changed with the current language
|
|
619
|
-
dispatchLanguageChanged(currentLanguage.value);
|
|
640
|
+
if (eventful() && !announced && window === page)
|
|
641
|
+
announceTranslations();
|
|
620
642
|
}, 100);
|
|
621
643
|
}
|
|
622
644
|
// ============================================================================
|
|
@@ -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 declare function createLayoutInspector(): {
|
|
3
7
|
toggle: () => void;
|
|
4
8
|
hide: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-inspector.d.ts","sourceRoot":"","sources":["../../DS1/0-face/layout-inspector.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"layout-inspector.d.ts","sourceRoot":"","sources":["../../DS1/0-face/layout-inspector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,qBAAqB;;;EA4MpC"}
|