@ponchia/ui 0.6.3 → 0.6.5

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.
Files changed (51) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +7 -7
  3. package/behaviors/glyph.d.ts +7 -0
  4. package/behaviors/glyph.d.ts.map +1 -1
  5. package/behaviors/glyph.js +58 -4
  6. package/behaviors/index.d.ts +2 -0
  7. package/behaviors/index.d.ts.map +1 -1
  8. package/behaviors/index.js +2 -0
  9. package/behaviors/sources.d.ts +28 -0
  10. package/behaviors/sources.d.ts.map +1 -0
  11. package/behaviors/sources.js +158 -0
  12. package/classes/classes.json +210 -4
  13. package/classes/index.d.ts +75 -1
  14. package/classes/index.js +95 -1
  15. package/css/dots.css +210 -3
  16. package/css/report.css +359 -7
  17. package/css/skins.css +9 -0
  18. package/css/sources.css +18 -0
  19. package/css/spark.css +14 -0
  20. package/css/table.css +7 -1
  21. package/css/tokens.css +8 -1
  22. package/dist/bronto.css +1 -1
  23. package/dist/css/dots.css +1 -1
  24. package/dist/css/report.css +1 -1
  25. package/dist/css/skins.css +1 -1
  26. package/dist/css/sources.css +1 -1
  27. package/dist/css/spark.css +1 -1
  28. package/dist/css/table.css +1 -1
  29. package/dist/css/tokens.css +1 -1
  30. package/docs/dots.md +146 -0
  31. package/docs/frontier-primitives.md +262 -0
  32. package/docs/glyphs.md +114 -0
  33. package/docs/package-contract.md +263 -0
  34. package/docs/reference.md +115 -1
  35. package/docs/reporting.md +296 -16
  36. package/docs/sources.md +32 -0
  37. package/docs/stability.md +6 -3
  38. package/glyphs/glyphs.d.ts +61 -0
  39. package/glyphs/glyphs.js +593 -30
  40. package/llms.txt +79 -25
  41. package/package.json +13 -3
  42. package/qwik/index.d.ts +1 -0
  43. package/qwik/index.d.ts.map +1 -1
  44. package/qwik/index.js +5 -0
  45. package/react/index.d.ts +1 -0
  46. package/react/index.d.ts.map +1 -1
  47. package/react/index.js +3 -0
  48. package/solid/index.d.ts +2 -0
  49. package/solid/index.d.ts.map +1 -1
  50. package/solid/index.js +3 -0
  51. package/tokens/skins.js +22 -9
@@ -1 +1 @@
1
- @layer bronto{.ui-report{--report-width: 72rem;--report-padding-block: var(--space-2xl);--report-gap: var(--space-lg);--report-measure: 74ch;--report-page-margin: 18mm;color: var(--text-soft);display: grid;gap: var(--report-gap);inline-size: min(100%,var(--report-width));margin-inline: auto;padding: var(--report-padding-block) var(--space-md)}.ui-report--compact{--report-gap: var(--space-md);--report-padding-block: var(--space-xl)}.ui-report--numbered{counter-reset: report-section}.ui-report__cover{align-content: end;border-block-end: 1px solid var(--line);display: grid;gap: var(--space-md);min-block-size: min(62vh,34rem);padding-block-end: var(--space-xl)}.ui-report__cover--compact{min-block-size: auto;padding-block: var(--space-xl) var(--space-lg)}.ui-report__head{align-items: end;border-block-end: 1px solid var(--line);display: flex;flex-wrap: wrap;gap: var(--space-md);justify-content: space-between;padding-block-end: var(--space-md)}.ui-report__title{color: var(--text);font-family: var(--display);font-size: calc(var(--text-xl) * 1.35);font-weight: var(--display-weight-strong);letter-spacing: 0;line-height: 1.05;margin: 0;max-inline-size: var(--report-measure);text-transform: uppercase;text-wrap: balance}.ui-report__subtitle{color: var(--text-dim);font-size: var(--text-lg);line-height: 1.5;margin: 0;max-inline-size: var(--report-measure)}.ui-report__meta{align-items: center;color: var(--text-dim);display: flex;flex-wrap: wrap;font-family: var(--mono);font-size: var(--text-2xs);gap: 0.55rem;letter-spacing: 0;list-style: none;margin: 0;padding: 0;text-transform: uppercase}.ui-report__meta > *{align-items: center;display: inline-flex;gap: 0.55rem}.ui-report__meta > :not(:last-child)::after{background: var(--line-strong);border-radius: 50%;block-size: 0.22rem;content: '';inline-size: 0.22rem}.ui-report__toc{border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: var(--space-xs);padding: var(--space-md)}.ui-report__toc ol,.ui-report__toc ul{display: grid;gap: 0.35rem;margin: 0;padding-inline-start: var(--space-md)}.ui-report__toc a{color: var(--text);text-decoration: underline;text-decoration-color: color-mix(in srgb,var(--accent) 45%,transparent);text-underline-offset: 0.2rem}.ui-report__summary,.ui-report__finding,.ui-report__evidence{background: var(--panel);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: var(--space-sm);padding: var(--space-md)}.ui-report__summary{border-inline-start: 2px solid var(--accent)}.ui-report__finding{border-inline-start: 2px solid var(--line-strong)}.ui-report__evidence{background: var(--panel-soft)}.ui-report__evidence:has(> .ui-table-wrap:only-child){padding: 0}.ui-report__evidence:has(> .ui-table-wrap:only-child) > .ui-table-wrap{border: 0;border-radius: var(--radius-md)}.ui-report__section{display: grid;gap: var(--space-md);scroll-margin-block-start: 6rem}.ui-report__section + .ui-report__section{border-block-start: 1px solid var(--line);padding-block-start: var(--space-xl)}.ui-report__section-head{color: var(--text);font-family: var(--display);font-size: var(--text-xl);font-weight: var(--display-weight);letter-spacing: 0;line-height: 1.1;margin: 0;text-transform: uppercase;text-wrap: balance}.ui-report--numbered .ui-report__section-head::before{color: var(--accent-text);content: counter(report-section,decimal-leading-zero) ' / ';counter-increment: report-section}.ui-report--numbered .ui-report__section--unnumbered > .ui-report__section-head::before{content: none;counter-increment: none}.ui-report__figure{display: grid;gap: var(--space-sm);margin: 0}.ui-report__caption{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;line-height: 1.5;text-transform: uppercase}.ui-report__sources,.ui-report__appendix,.ui-report__footnotes{border-block-start: 1px solid var(--line);color: var(--text-dim);display: grid;font-size: var(--text-sm);gap: var(--space-sm);padding-block-start: var(--space-md)}.ui-compare{display: grid;gap: var(--space-md);grid-template-columns: repeat(auto-fit,minmax(min(100%,16rem),1fr))}.ui-compare--2up{grid-template-columns: repeat(2,minmax(0,1fr))}@media (max-width: 33rem){.ui-compare--2up{grid-template-columns: 1fr}}.ui-compare__col{align-content: start;display: grid;gap: var(--space-sm)}.ui-compare__head{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-meter__row{align-items: center;display: grid;gap: var(--space-2xs) var(--space-md);grid-template-columns: minmax(9rem,14rem) 1fr auto;margin-block: var(--space-2xs)}.ui-meter__row .ui-meter{min-inline-size: 8rem}.ui-meter__label{color: var(--text-soft)}.ui-meter__value{color: var(--text);font-family: var(--mono);font-variant-numeric: tabular-nums;text-align: end}@media (max-width: 32rem){.ui-meter__row{grid-template-columns: 1fr}.ui-meter__value{text-align: start}}.ui-print-only{display: none !important}.ui-print-exact{-webkit-print-color-adjust: exact;print-color-adjust: exact}@media print{@page{margin: var(--report-page-margin)}.ui-report{--report-padding-block: 0;color-scheme: light;--text: #111;--text-soft: #2a2a2a;--text-dim: #555;--panel: #fff;--panel-soft: #f7f7f7;--line: #d9d9d9;--line-strong: #b3b3b3;inline-size: auto;padding: 0}.ui-report__cover{min-block-size: auto}.ui-report__cover,.ui-report__head,.ui-report__section,.ui-report__summary,.ui-report__finding,.ui-report__evidence,.ui-report__figure{break-inside: avoid}.ui-report__section-head{break-after: avoid}.ui-print-only{display: var(--print-display,block) !important}.ui-screen-only{display: none !important}.ui-break-before{break-before: page}.ui-break-after{break-after: page}.ui-keep{break-inside: avoid}}}
1
+ @layer bronto{.ui-report{--report-width: 72rem;--report-padding-block: var(--space-2xl);--report-gap: var(--space-lg);--report-measure: 74ch;color: var(--text-soft);display: grid;gap: var(--report-gap);inline-size: min(100%,var(--report-width));margin-inline: auto;padding: var(--report-padding-block) var(--space-md)}.ui-report--compact{--report-gap: var(--space-md);--report-padding-block: var(--space-xl)}.ui-report--numbered{counter-reset: report-section}.ui-report > *,.ui-report__cover > *,.ui-report__head > *,.ui-report__toc > *,.ui-report__summary > *,.ui-report__decision > *,.ui-report__finding > *,.ui-report__evidence > *,.ui-report__section > *,.ui-report__figure > *,.ui-claim > *,.ui-evidence-grid > *,.ui-evidence-ledger > *,.ui-compare > *,.ui-compare__col > *{min-inline-size: 0}.ui-report__cover{align-content: end;border-block-end: 1px solid var(--line);display: grid;gap: var(--space-md);min-block-size: min(62vh,34rem);padding-block-end: var(--space-xl)}.ui-report__cover--compact{min-block-size: auto;padding-block: var(--space-xl) var(--space-lg)}.ui-report__head{align-items: end;border-block-end: 1px solid var(--line);display: flex;flex-wrap: wrap;gap: var(--space-md);justify-content: space-between;padding-block-end: var(--space-md)}.ui-report__title{color: var(--text);font-family: var(--display);font-size: calc(var(--text-xl) * 1.35);font-weight: var(--display-weight-strong);letter-spacing: 0;line-height: 1.05;margin: 0;max-inline-size: var(--report-measure);text-transform: uppercase;text-wrap: balance}.ui-report__subtitle{color: var(--text-dim);font-size: var(--text-lg);line-height: 1.5;margin: 0;max-inline-size: var(--report-measure)}.ui-report__meta{align-items: center;color: var(--text-dim);display: flex;flex-wrap: wrap;font-family: var(--mono);font-size: var(--text-2xs);gap: 0.55rem;letter-spacing: 0;list-style: none;margin: 0;padding: 0;text-transform: uppercase}.ui-report__meta > *{align-items: center;display: inline-flex;gap: 0.55rem}.ui-report__meta > :not(:last-child)::after{background: var(--line-strong);border-radius: 50%;block-size: 0.22rem;content: '';inline-size: 0.22rem}.ui-report__toc{border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: var(--space-xs);padding: var(--space-md)}.ui-report__toc ol,.ui-report__toc ul{display: grid;gap: 0.35rem;margin: 0;padding-inline-start: var(--space-md)}.ui-report__toc a{color: var(--text);text-decoration: underline;text-decoration-color: color-mix(in srgb,var(--accent) 45%,transparent);text-underline-offset: 0.2rem}.ui-report__summary,.ui-report__finding,.ui-report__evidence{background: var(--panel);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: var(--space-sm);padding: var(--space-md)}.ui-report__summary{border-inline-start: 2px solid var(--accent)}.ui-report__decision{background: var(--panel);border: 1px solid color-mix(in srgb,var(--accent) 40%,var(--line));border-inline-start: 3px solid var(--accent);border-radius: var(--radius-md);display: grid;gap: var(--space-sm);padding: var(--space-md)}.ui-report__decision-kicker{color: var(--accent-text);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);margin: 0;text-transform: uppercase}.ui-report__decision-title{color: var(--text);font-family: var(--display);font-size: var(--text-lg);font-weight: var(--display-weight);letter-spacing: 0;line-height: 1.18;margin: 0;text-transform: uppercase;text-wrap: balance}.ui-report__decision-body{color: var(--text-soft);line-height: 1.6;margin: 0;max-inline-size: var(--report-measure)}.ui-report__decision-meta{color: var(--text-dim);display: flex;flex-wrap: wrap;font-family: var(--mono);font-size: var(--text-2xs);gap: 0.45rem 0.75rem;letter-spacing: 0}.ui-report__decision-grid{border-block-start: 1px solid var(--line);display: grid;gap: 0}.ui-report__decision-item{align-items: start;border-block-end: 1px solid var(--line);display: grid;gap: var(--space-xs);grid-template-columns: minmax(8rem,14rem) minmax(0,1fr);padding-block: var(--space-xs)}.ui-report__decision-label,.ui-report__decision-value{margin: 0}.ui-report__decision-label{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-report__decision-value{color: var(--text-soft);line-height: 1.5}.ui-report__finding{--report-finding-tone: var(--line-strong);border-inline-start: 2px solid var(--report-finding-tone)}.ui-report__finding--critical{--report-finding-tone: var(--danger)}.ui-report__finding--major{--report-finding-tone: var(--warning)}.ui-report__finding--minor{--report-finding-tone: var(--info)}.ui-report__finding--resolved{--report-finding-tone: var(--success)}.ui-report__finding-title,.ui-report__finding-claim,.ui-report__finding-impact,.ui-report__finding-remediation,.ui-report__finding-evidence,.ui-report__finding-caveat{margin: 0}.ui-report__finding-title{color: var(--text);font-size: var(--text-md);font-weight: 650;line-height: 1.25}.ui-report__finding-claim{color: var(--text);line-height: 1.6}.ui-report__finding-impact,.ui-report__finding-remediation,.ui-report__finding-evidence{color: var(--text-soft);line-height: 1.55}.ui-report__finding-caveat{color: var(--text-dim);font-size: var(--text-sm);line-height: 1.55}.ui-claim{--claim-tone: var(--accent);background: var(--panel-soft);border: 1px solid var(--line);border-inline-start: 2px solid var(--claim-tone);border-radius: var(--radius-md);display: grid;gap: var(--space-xs);padding: var(--space-sm)}.ui-claim--supported{--claim-tone: var(--success)}.ui-claim--partial{--claim-tone: var(--warning)}.ui-claim--disputed,.ui-claim--unsupported{--claim-tone: var(--danger)}.ui-claim--unknown{--claim-tone: var(--info)}.ui-claim__statement,.ui-claim__status,.ui-claim__scope,.ui-claim__basis,.ui-claim__limits,.ui-claim__refs,.ui-claim__caveat{margin: 0}.ui-claim__statement{color: var(--text);font-weight: 650;line-height: 1.45}.ui-claim__status,.ui-claim__scope,.ui-claim__refs{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;text-transform: uppercase}.ui-claim__basis,.ui-claim__limits,.ui-claim__caveat{color: var(--text-soft);font-size: var(--text-sm);line-height: 1.55}.ui-report__evidence{background: var(--panel-soft)}.ui-report__evidence:has(> .ui-table-wrap:only-child){padding: 0}.ui-report__evidence:has(> .ui-table-wrap:only-child) > .ui-table-wrap{border: 0;border-radius: var(--radius-md)}.ui-report__section{display: grid;gap: var(--space-md);scroll-margin-block-start: 6rem}.ui-report__section + .ui-report__section{border-block-start: 1px solid var(--line);padding-block-start: var(--space-xl)}.ui-report__section-head{color: var(--text);font-family: var(--display);font-size: var(--text-xl);font-weight: var(--display-weight);letter-spacing: 0;line-height: 1.1;margin: 0;text-transform: uppercase;text-wrap: balance}.ui-report--numbered .ui-report__section-head::before{color: var(--accent-text);content: counter(report-section,decimal-leading-zero) ' / ';counter-increment: report-section}.ui-report--numbered .ui-report__section--unnumbered > .ui-report__section-head::before{content: none;counter-increment: none}.ui-report__figure{display: grid;gap: var(--space-sm);margin: 0}.ui-report__caption{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;line-height: 1.5;text-transform: uppercase}.ui-evidence-grid{display: grid;gap: var(--space-sm);grid-template-columns: repeat(auto-fit,minmax(min(100%,16rem),1fr))}.ui-evidence-item{background: var(--panel-soft);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: 0.35rem;padding: var(--space-sm)}.ui-evidence-item__title{color: var(--text);font-size: var(--text-sm);font-weight: 600;margin: 0}.ui-evidence-item__meta{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0}.ui-evidence-item__body{color: var(--text-soft);font-size: var(--text-sm);line-height: 1.55;margin: 0}.ui-evidence-item__kind,.ui-evidence-item__method,.ui-evidence-item__window,.ui-evidence-item__value,.ui-evidence-item__source,.ui-evidence-item__caveat{margin: 0}.ui-evidence-item__kind,.ui-evidence-item__method,.ui-evidence-item__window,.ui-evidence-item__source{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;text-transform: uppercase}.ui-evidence-item__value{color: var(--text);font-size: var(--text-md);font-weight: 650}.ui-evidence-item__caveat{color: var(--text-dim);font-size: var(--text-sm);line-height: 1.5}.ui-evidence-ledger{display: grid;gap: var(--space-sm)}.ui-report__actions{border-block-start: 1px solid var(--line);display: grid;gap: 0}.ui-report__action{align-items: start;border-block-end: 1px solid var(--line);display: grid;gap: var(--space-xs);grid-template-columns: minmax(0,1fr) auto;padding-block: var(--space-sm)}.ui-report__action-status{align-self: start;color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-report__action-title,.ui-report__action-owner,.ui-report__action-due,.ui-report__action-priority,.ui-report__action-criteria,.ui-report__action-source{margin: 0}.ui-report__action-title{color: var(--text);font-weight: 650;line-height: 1.45}.ui-report__action-owner,.ui-report__action-due,.ui-report__action-priority,.ui-report__action-source{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;text-transform: uppercase}.ui-report__action-criteria{color: var(--text-soft);font-size: var(--text-sm);line-height: 1.5}@media (max-width: 32rem){.ui-report__decision-item,.ui-report__action{grid-template-columns: 1fr}}.ui-report__sources,.ui-report__appendix,.ui-report__footnotes{border-block-start: 1px solid var(--line);color: var(--text-dim);display: grid;font-size: var(--text-sm);gap: var(--space-sm);padding-block-start: var(--space-md)}.ui-compare{display: grid;gap: var(--space-md);grid-template-columns: repeat(auto-fit,minmax(min(100%,16rem),1fr))}.ui-compare--2up{grid-template-columns: repeat(2,minmax(0,1fr))}@media (max-width: 33rem){.ui-compare--2up{grid-template-columns: 1fr}}.ui-compare__col{align-content: start;display: grid;gap: var(--space-sm)}.ui-compare__head{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-meter__row{align-items: center;display: grid;gap: var(--space-2xs) var(--space-md);grid-template-columns: minmax(9rem,14rem) 1fr auto;margin-block: var(--space-2xs)}.ui-meter__row .ui-meter{min-inline-size: 8rem}.ui-meter__label{color: var(--text-soft)}.ui-meter__value{color: var(--text);font-family: var(--mono);font-variant-numeric: tabular-nums;text-align: end}@media (max-width: 32rem){.ui-meter__row{grid-template-columns: 1fr}.ui-meter__value{text-align: start}}.ui-print-only{display: none !important}.ui-print-exact{-webkit-print-color-adjust: exact;print-color-adjust: exact}@media print{@page{margin: 18mm}.ui-report{--report-padding-block: 0;color-scheme: light;--text: #111;--text-soft: #2a2a2a;--text-dim: #555;--panel: #fff;--panel-soft: #f7f7f7;--line: #d9d9d9;--line-strong: #b3b3b3;inline-size: auto;padding: 0}.ui-report__cover{min-block-size: auto}.ui-report__cover,.ui-report__head,.ui-report__decision,.ui-report__summary,.ui-report__finding,.ui-report__evidence,.ui-report__figure,.ui-claim,.ui-evidence-item,.ui-report__action{break-inside: avoid}.ui-report__section-head{break-after: avoid}.ui-print-only{display: var(--print-display,block) !important}.ui-screen-only{display: none !important}.ui-break-before{break-before: page}.ui-break-after{break-after: page}.ui-keep{break-inside: avoid}}}
@@ -1 +1 @@
1
- @layer bronto{:root[data-bronto-skin='amber-crt']{--accent: oklch(52% 0.11 67deg)}:root[data-theme='dark'][data-bronto-skin='amber-crt']{--accent: oklch(82% 0.15 82deg);--dotmatrix-glow: 0.4em}:root[data-bronto-skin='e-ink']{--accent: oklch(34% 0.012 250deg)}:root[data-theme='dark'][data-bronto-skin='e-ink']{--accent: oklch(84% 0.008 250deg)}:root[data-bronto-skin='phosphor-green']{--accent: oklch(52% 0.13 150deg)}:root[data-theme='dark'][data-bronto-skin='phosphor-green']{--accent: oklch(84% 0.19 150deg);--dotmatrix-glow: 0.4em}@media (prefers-color-scheme: dark){:root:not([data-theme='light'])[data-bronto-skin='amber-crt']{--accent: oklch(82% 0.15 82deg);--dotmatrix-glow: 0.4em}:root:not([data-theme='light'])[data-bronto-skin='e-ink']{--accent: oklch(84% 0.008 250deg)}:root:not([data-theme='light'])[data-bronto-skin='phosphor-green']{--accent: oklch(84% 0.19 150deg);--dotmatrix-glow: 0.4em}}}
1
+ @layer bronto{:root[data-bronto-skin='amber-crt']{--accent: oklch(52% 0.11 67deg);--dotmatrix-pulse-min: 0.35}:root[data-theme='dark'][data-bronto-skin='amber-crt']{--accent: oklch(82% 0.15 82deg);--dotmatrix-glow: 0.4em;--dotmatrix-pulse-min: 0.3}:root[data-bronto-skin='e-ink']{--accent: oklch(34% 0.012 250deg);--dotmatrix-reveal-step: 0ms}:root[data-theme='dark'][data-bronto-skin='e-ink']{--accent: oklch(84% 0.008 250deg);--dotmatrix-reveal-step: 0ms}:root[data-bronto-skin='phosphor-green']{--accent: oklch(52% 0.13 150deg);--dotmatrix-pulse-min: 0.35}:root[data-theme='dark'][data-bronto-skin='phosphor-green']{--accent: oklch(84% 0.19 150deg);--dotmatrix-glow: 0.4em;--dotmatrix-pulse-min: 0.3}@media (prefers-color-scheme: dark){:root:not([data-theme='light'])[data-bronto-skin='amber-crt']{--accent: oklch(82% 0.15 82deg);--dotmatrix-glow: 0.4em;--dotmatrix-pulse-min: 0.3}:root:not([data-theme='light'])[data-bronto-skin='e-ink']{--accent: oklch(84% 0.008 250deg);--dotmatrix-reveal-step: 0ms}:root:not([data-theme='light'])[data-bronto-skin='phosphor-green']{--accent: oklch(84% 0.19 150deg);--dotmatrix-glow: 0.4em;--dotmatrix-pulse-min: 0.3}}}
@@ -1 +1 @@
1
- @layer bronto{.ui-citation,.ui-source-card,.ui-provenance{--src-tone: var(--text-dim)}.ui-src{--src-tone: var(--text-dim);align-items: center;background: var(--panel-soft);border: 1px solid color-mix(in srgb,var(--src-tone) 45%,var(--line));border-radius: var(--radius-pill);color: var(--text-soft);display: inline-flex;font-size: var(--text-2xs);gap: 0.35rem;padding: 0.08rem 0.55rem;vertical-align: baseline}.ui-src::before{background: var(--src-tone);border-radius: 50%;block-size: 0.45rem;content: '';flex: none;inline-size: 0.45rem;print-color-adjust: exact}.ui-src--verified{--src-tone: var(--success)}.ui-src--reviewed{--src-tone: var(--accent)}.ui-src--generated{--src-tone: var(--info)}.ui-src--unverified{--src-tone: var(--text-dim)}.ui-src--stale{--src-tone: var(--warning)}.ui-src--conflict{--src-tone: var(--danger)}.ui-citation{color: var(--accent-text);font-family: var(--mono);font-size: 0.72em;font-weight: 600;text-decoration: none;vertical-align: super}.ui-citation:hover{text-decoration: underline}.ui-citation--chip{align-items: center;background: var(--panel-soft);border: 1px solid var(--line);border-radius: var(--radius-pill);color: var(--text-soft);display: inline-flex;font-size: var(--text-2xs);gap: 0.35rem;padding: 0.08rem 0.55rem;vertical-align: baseline}.ui-citation--chip::before{background: var(--src-tone);border-radius: 50%;block-size: 0.45rem;content: '';inline-size: 0.45rem;print-color-adjust: exact}.ui-source-list{display: grid;gap: var(--space-sm);list-style: none;margin: 0;padding: 0}.ui-source-list__item{margin: 0}.ui-source-card{background: var(--panel-soft);border: 1px solid var(--line);border-inline-start: 2px solid var(--src-tone);border-radius: var(--radius-md);display: grid;gap: 0.3rem;padding: 0.75rem 0.9rem;print-color-adjust: exact}.ui-source-card__title{color: var(--text);font-size: var(--text-sm);font-weight: 600;margin: 0}.ui-source-card__origin{color: var(--text-soft);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide)}.ui-source-card__time{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs)}.ui-source-card__excerpt{color: var(--text-soft);margin: 0}.ui-source-card__actions{display: flex;flex-wrap: wrap;gap: 0.5rem;margin-block-start: 0.2rem}.ui-provenance{align-items: center;color: var(--text-dim);display: inline-flex;flex-wrap: wrap;font-family: var(--mono);font-size: var(--text-2xs);gap: 0.3rem 0.75rem;letter-spacing: var(--tracking-wide)}.ui-provenance__item{align-items: center;display: inline-flex;gap: 0.35rem}.ui-provenance__item::before{background: var(--src-tone);border-radius: 50%;block-size: 0.45rem;content: '';inline-size: 0.45rem;print-color-adjust: exact}@media (forced-colors: active){.ui-citation--chip::before,.ui-provenance__item::before,.ui-src::before{background: CanvasText}.ui-source-card{border-inline-start-color: CanvasText}}@media print{.ui-citation[href]::after{content: none !important}}}
1
+ @layer bronto{.ui-citation,.ui-source-card,.ui-provenance{--src-tone: var(--text-dim)}.ui-src{--src-tone: var(--text-dim);align-items: center;background: var(--panel-soft);border: 1px solid color-mix(in srgb,var(--src-tone) 45%,var(--line));border-radius: var(--radius-pill);color: var(--text-soft);display: inline-flex;font-size: var(--text-2xs);gap: 0.35rem;padding: 0.08rem 0.55rem;vertical-align: baseline}.ui-src::before{background: var(--src-tone);border-radius: 50%;block-size: 0.45rem;content: '';flex: none;inline-size: 0.45rem;print-color-adjust: exact}.ui-src--verified{--src-tone: var(--success)}.ui-src--reviewed{--src-tone: var(--accent)}.ui-src--generated{--src-tone: var(--info)}.ui-src--unverified{--src-tone: var(--text-dim)}.ui-src--stale{--src-tone: var(--warning)}.ui-src--conflict{--src-tone: var(--danger)}.ui-citation{color: var(--accent-text);font-family: var(--mono);font-size: 0.72em;font-weight: 600;text-decoration: none;vertical-align: super}.ui-citation:hover{text-decoration: underline}.ui-citation--chip{align-items: center;background: var(--panel-soft);border: 1px solid var(--line);border-radius: var(--radius-pill);color: var(--text-soft);display: inline-flex;font-size: var(--text-2xs);gap: 0.35rem;padding: 0.08rem 0.55rem;vertical-align: baseline}.ui-citation--chip::before{background: var(--src-tone);border-radius: 50%;block-size: 0.45rem;content: '';inline-size: 0.45rem;print-color-adjust: exact}.ui-source-list{display: grid;gap: var(--space-sm);list-style: none;margin: 0;min-inline-size: 0;padding: 0}.ui-source-list__item{margin: 0;min-inline-size: 0}.ui-source-card{background: var(--panel-soft);border: 1px solid var(--line);border-inline-start: 2px solid var(--src-tone);border-radius: var(--radius-md);display: grid;gap: 0.3rem;min-inline-size: 0;padding: 0.75rem 0.9rem;print-color-adjust: exact}.ui-source-card:target,.ui-source-card.is-source-active{box-shadow: 0 0 0 3px color-mix(in srgb,var(--src-tone) 22%,transparent);outline: 2px solid var(--src-tone);outline-offset: 2px}.ui-source-card > *{min-inline-size: 0}.ui-source-card__title{color: var(--text);font-size: var(--text-sm);font-weight: 600;margin: 0;overflow-wrap: break-word}.ui-source-card__origin{color: var(--text-soft);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);overflow-wrap: anywhere}.ui-source-card__time{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);overflow-wrap: anywhere}.ui-source-card__excerpt{color: var(--text-soft);margin: 0;overflow-wrap: anywhere}.ui-source-card__actions{display: flex;flex-wrap: wrap;gap: 0.5rem;margin-block-start: 0.2rem}.ui-provenance{align-items: center;color: var(--text-dim);display: inline-flex;flex-wrap: wrap;font-family: var(--mono);font-size: var(--text-2xs);gap: 0.3rem 0.75rem;letter-spacing: var(--tracking-wide)}.ui-provenance__item{align-items: center;display: inline-flex;gap: 0.35rem}.ui-provenance__item::before{background: var(--src-tone);border-radius: 50%;block-size: 0.45rem;content: '';inline-size: 0.45rem;print-color-adjust: exact}@media (forced-colors: active){.ui-citation--chip::before,.ui-provenance__item::before,.ui-src::before{background: CanvasText}.ui-source-card{border-inline-start-color: CanvasText}}@media print{.ui-citation[href]::after{content: none !important}}}
@@ -1 +1 @@
1
- @layer bronto{.ui-spark{align-items: flex-end;block-size: 1em;display: inline-flex;gap: 1px;inline-size: max-content;vertical-align: -0.15em}.ui-spark__bar{background: currentColor;block-size: max(1px,calc(var(--v,0) * 100%));border-radius: 0.5px;flex: 0 0 0.25em;min-inline-size: 2px}.ui-spark__bar--accent{background: var(--accent)}.ui-spark__bar--pos{background: var(--success)}.ui-spark__bar--neg{background: var(--danger)}@media (forced-colors: active){.ui-spark__bar{background: CanvasText}}@media print{.ui-spark__bar{-webkit-print-color-adjust: exact;print-color-adjust: exact}}}
1
+ @layer bronto{.ui-spark{align-items: flex-end;block-size: 1em;display: inline-flex;gap: 1px;inline-size: max-content;vertical-align: -0.15em}.ui-spark__bar{background: currentColor;block-size: max(1px,calc(var(--v,0) * 100%));border-radius: 0.5px;flex: 0 0 0.25em;min-inline-size: 2px}.ui-spark__bar--accent{background: var(--accent)}.ui-spark__bar--pos{background: var(--success)}.ui-spark__bar--neg{background: var(--danger)}.ui-spark--dots .ui-spark__bar{--_dot: var(--spark-dot,0.16em);--_step: calc(var(--_dot) + var(--spark-dot-gap,0.06em));border-radius: 0;-webkit-mask: repeating-linear-gradient(to top,#000 0 var(--_dot),transparent var(--_dot) var(--_step));mask: repeating-linear-gradient(to top,#000 0 var(--_dot),transparent var(--_dot) var(--_step))}@media (forced-colors: active){.ui-spark__bar{background: CanvasText}}@media print{.ui-spark__bar{-webkit-print-color-adjust: exact;print-color-adjust: exact}}}
@@ -1 +1 @@
1
- @layer bronto{.ui-table-wrap{border: 1px solid var(--line);border-radius: var(--radius-md);overflow: auto}.ui-table{border-collapse: collapse;font-family: var(--mono);font-size: var(--text-sm);min-inline-size: 100%;inline-size: 100%}.ui-table th,.ui-table td{border-block-end: 1px solid var(--line);overflow-wrap: anywhere;padding: 0.7rem 0.85rem;text-align: start;vertical-align: top}.ui-table th{background: var(--panel);color: var(--text-dim);font-size: var(--text-2xs);font-weight: 700;letter-spacing: var(--tracking-wide);position: sticky;text-transform: uppercase;inset-block-start: 0;z-index: 1}.ui-table td{color: var(--text-soft)}.ui-table tbody tr:last-child td{border-block-end: 0}.ui-table tbody tr{transition: background-color var(--duration-fast) var(--ease-standard)}@media (hover: hover){.ui-table tbody tr:hover td{background: var(--bg-accent)}}.ui-table--dense th,.ui-table--dense td{font-size: var(--text-xs);padding: 0.42rem 0.6rem}.ui-table--comfortable th,.ui-table--comfortable td{padding: 0.95rem 1.1rem}.ui-table--lined td{border-inline-end: 1px solid var(--line)}.ui-table--lined td:last-child{border-inline-end: 0}.ui-table .is-num,.ui-table th.is-num{font-variant-numeric: tabular-nums;text-align: end}.ui-table .is-pos{color: var(--success)}.ui-table .is-neg{color: var(--danger)}.ui-table .is-key{color: var(--text);font-weight: 600}.ui-table__empty td{color: var(--text-dim);padding: 2rem;text-align: center}.ui-table__sort{align-items: center;background: none;border: 0;color: inherit;cursor: pointer;display: flex;font: inherit;gap: 0.4rem;letter-spacing: inherit;padding: 0;text-transform: inherit;inline-size: 100%}.ui-table__sort::after{content: '↕';opacity: 0.4}.ui-table th[aria-sort='ascending'] .ui-table__sort::after{content: '↑';opacity: 1}.ui-table th[aria-sort='descending'] .ui-table__sort::after{content: '↓';opacity: 1}.ui-table__select{inline-size: 1px;white-space: nowrap}.ui-table--selectable tbody tr[aria-selected='true'] td{background: var(--bg-accent)}.ui-table__toolbar{align-items: center;border: 1px solid var(--line);border-block-end: 0;border-start-start-radius: var(--radius-md);border-start-end-radius: var(--radius-md);display: flex;gap: var(--space-sm);padding: var(--space-sm) var(--space-md)}.ui-table-wrap--loading{opacity: 0.6;pointer-events: none}}
1
+ @layer bronto{.ui-table-wrap{border: 1px solid var(--line);border-radius: var(--radius-md);overflow: auto}.ui-table{border-collapse: collapse;font-family: var(--mono);font-size: var(--text-sm);min-inline-size: 100%;inline-size: 100%}.ui-table th,.ui-table td{border-block-end: 1px solid var(--line);overflow-wrap: break-word;padding: 0.7rem 0.85rem;text-align: start;vertical-align: top;word-break: normal}.ui-table th{background: var(--panel);color: var(--text-dim);font-size: var(--text-2xs);font-weight: 700;letter-spacing: var(--tracking-wide);position: sticky;text-transform: uppercase;inset-block-start: 0;z-index: 1}.ui-table td{color: var(--text-soft)}.ui-table tbody tr:last-child td{border-block-end: 0}.ui-table tbody tr{transition: background-color var(--duration-fast) var(--ease-standard)}@media (hover: hover){.ui-table tbody tr:hover td{background: var(--bg-accent)}}.ui-table--dense th,.ui-table--dense td{font-size: var(--text-xs);padding: 0.42rem 0.6rem}.ui-table--comfortable th,.ui-table--comfortable td{padding: 0.95rem 1.1rem}.ui-table--lined td{border-inline-end: 1px solid var(--line)}.ui-table--lined td:last-child{border-inline-end: 0}.ui-table--break-anywhere th,.ui-table--break-anywhere td{overflow-wrap: anywhere}.ui-table .is-num,.ui-table th.is-num{font-variant-numeric: tabular-nums;text-align: end}.ui-table .is-pos{color: var(--success)}.ui-table .is-neg{color: var(--danger)}.ui-table .is-key{color: var(--text);font-weight: 600}.ui-table__empty td{color: var(--text-dim);padding: 2rem;text-align: center}.ui-table__sort{align-items: center;background: none;border: 0;color: inherit;cursor: pointer;display: flex;font: inherit;gap: 0.4rem;letter-spacing: inherit;padding: 0;text-transform: inherit;inline-size: 100%}.ui-table__sort::after{content: '↕';opacity: 0.4}.ui-table th[aria-sort='ascending'] .ui-table__sort::after{content: '↑';opacity: 1}.ui-table th[aria-sort='descending'] .ui-table__sort::after{content: '↓';opacity: 1}.ui-table__select{inline-size: 1px;white-space: nowrap}.ui-table--selectable tbody tr[aria-selected='true'] td{background: var(--bg-accent)}.ui-table__toolbar{align-items: center;border: 1px solid var(--line);border-block-end: 0;border-start-start-radius: var(--radius-md);border-start-end-radius: var(--radius-md);display: flex;gap: var(--space-sm);padding: var(--space-sm) var(--space-md)}.ui-table-wrap--loading{opacity: 0.6;pointer-events: none}}
@@ -1 +1 @@
1
- @layer bronto{:root{--radius-xl: 4px;--radius-lg: 3px;--radius-md: 2px;--radius-sm: 1px;--radius-pill: 999px;--space-2xs: 0.25rem;--space-xs: 0.5rem;--space-sm: 0.75rem;--space-md: 1rem;--space-lg: 1.35rem;--space-xl: 1.75rem;--space-2xl: 2.5rem;--mono: 'JetBrains Mono','Fira Code','Cascadia Code','SF Mono',ui-monospace,monospace;--sans: 'Inter','SF Pro Text',-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;--dot-font: 'Doto',var(--mono);--display: var(--dot-font);--display-weight: 700;--display-weight-strong: 800;--text-2xs: 0.68rem;--text-xs: 0.76rem;--text-sm: 0.86rem;--text-base: 0.95rem;--text-lg: 1.15rem;--text-xl: 1.45rem;--tracking-wide: 0.14em;--tracking-wider: 0.22em;--ease-standard: cubic-bezier(0.2,0.8,0.2,1);--ease-spring: cubic-bezier(0.16,1,0.3,1);--ease-out: cubic-bezier(0.33,1,0.68,1);--duration-fast: 130ms;--duration-base: 200ms;--duration-slow: 360ms;--dot-size: 2px;--dot-gap: 14px;--z-base: 0;--z-raised: 10;--z-sticky: 20;--z-overlay: 30;--z-popover: 50;--z-toast: 60;--accent-1: color-mix(in oklch,var(--accent) 8%,var(--accent-ramp-end));--accent-2: color-mix(in oklch,var(--accent) 16%,var(--accent-ramp-end));--accent-3: color-mix(in oklch,var(--accent) 32%,var(--accent-ramp-end));--accent-4: color-mix(in oklch,var(--accent) 60%,var(--accent-ramp-end));--accent-5: var(--accent);--accent-6: var(--accent-strong);--surface-1: var(--bg);--surface-2: var(--bg-elevated);--surface-3: var(--panel);--surface-4: var(--panel-soft);--surface-5: var(--line);--surface-6: var(--line-strong);--bronto-color-bg: var(--bg);--bronto-color-surface: var(--panel);--bronto-color-surface-raised: var(--panel-strong);--bronto-color-border: var(--line);--bronto-color-border-strong: var(--line-strong);--bronto-color-text: var(--text);--bronto-color-text-muted: var(--text-dim);--bronto-color-action: var(--accent);--bronto-color-on-action: var(--button-text);--bronto-color-focus: var(--focus-ring);--bronto-color-success: var(--success);--bronto-color-warning: var(--warning);--bronto-color-danger: var(--danger);--bronto-color-info: var(--info);--surface: var(--panel);--surface-raised: var(--panel-strong);--surface-muted: var(--panel-soft);--border: var(--line);--border-strong: var(--line-strong)}:root,:root[data-theme='light']{color-scheme: light;--bg: #f4f4f2;--bg-elevated: #fbfbfa;--bg-accent: color-mix(in srgb,var(--accent) 6%,transparent);--panel: #ffffff;--panel-strong: #ffffff;--panel-soft: #ececea;--line: #d8d8d4;--line-strong: #a8a8a2;--text: #0a0a0a;--text-soft: #353533;--text-dim: #686863;--accent: #d71921;--accent-ramp-end: #ffffff;--accent-strong: color-mix(in srgb,var(--accent) 83%,#000);--accent-text: var(--accent-strong);--on-accent: var(--button-text);--accent-soft: color-mix(in srgb,var(--accent) 10%,transparent);--success: #2f7d4f;--success-soft: rgb(47,125,79,0.12);--warning: #806414;--warning-soft: rgb(128,100,20,0.13);--danger: #c01622;--danger-soft: rgb(192,22,34,0.1);--info: #1f63c4;--info-soft: rgb(31,99,196,0.12);--code-bg: rgb(10,10,10,0.05);--button-text: #ffffff;--field-dot: rgb(10,10,10,0.16);--field-dot-hot: rgb(10,10,10,0.4);--field-dot-accent: color-mix(in srgb,var(--accent) 78%,transparent);--focus-ring: var(--accent);--shadow: none;--shadow-raised: 0 0 0 1px var(--line-strong)}@media (prefers-color-scheme: dark){:root:not([data-theme='light']){color-scheme: dark;--bg: #121212;--bg-elevated: #181818;--bg-accent: color-mix(in srgb,var(--accent) 8%,transparent);--panel: #1c1c1c;--panel-strong: #222222;--panel-soft: #242424;--line: #383838;--line-strong: #555555;--text: #e6e6e6;--text-soft: #c8c8c8;--text-dim: #a0a0a0;--accent: #ff3b41;--accent-ramp-end: #000000;--accent-strong: color-mix(in srgb,var(--accent) 84%,#fff);--accent-text: var(--accent-strong);--on-accent: var(--button-text);--accent-soft: color-mix(in srgb,var(--accent) 14%,transparent);--success: #4ec27e;--success-soft: rgb(78,194,126,0.14);--warning: #d8bd72;--warning-soft: rgb(216,189,114,0.14);--danger: #ff4d54;--danger-soft: rgb(255,77,84,0.15);--info: #6fb0e6;--info-soft: rgb(111,176,230,0.14);--code-bg: rgb(255,255,255,0.05);--button-text: #000000;--field-dot: rgb(242,242,242,0.14);--field-dot-hot: rgb(242,242,242,0.36);--field-dot-accent: color-mix(in srgb,var(--accent) 82%,transparent);--focus-ring: var(--accent);--shadow: none;--shadow-raised: 0 0 0 1px var(--line-strong)}}:root[data-theme='dark']{color-scheme: dark;--bg: #121212;--bg-elevated: #181818;--bg-accent: color-mix(in srgb,var(--accent) 8%,transparent);--panel: #1c1c1c;--panel-strong: #222222;--panel-soft: #242424;--line: #383838;--line-strong: #555555;--text: #e6e6e6;--text-soft: #c8c8c8;--text-dim: #a0a0a0;--accent: #ff3b41;--accent-ramp-end: #000000;--accent-strong: color-mix(in srgb,var(--accent) 84%,#fff);--accent-text: var(--accent-strong);--on-accent: var(--button-text);--accent-soft: color-mix(in srgb,var(--accent) 14%,transparent);--success: #4ec27e;--success-soft: rgb(78,194,126,0.14);--warning: #d8bd72;--warning-soft: rgb(216,189,114,0.14);--danger: #ff4d54;--danger-soft: rgb(255,77,84,0.15);--info: #6fb0e6;--info-soft: rgb(111,176,230,0.14);--code-bg: rgb(255,255,255,0.05);--button-text: #000000;--field-dot: rgb(242,242,242,0.14);--field-dot-hot: rgb(242,242,242,0.36);--field-dot-accent: color-mix(in srgb,var(--accent) 82%,transparent);--focus-ring: var(--accent);--shadow: none;--shadow-raised: 0 0 0 1px var(--line-strong)}[data-density='compact']{--space-2xs: 0.2rem;--space-xs: 0.4rem;--space-sm: 0.6rem;--space-md: 0.8rem;--space-lg: 1.05rem;--space-xl: 1.35rem;--space-2xl: 1.9rem}[data-density='comfortable']{--space-2xs: 0.3rem;--space-xs: 0.6rem;--space-sm: 0.95rem;--space-md: 1.25rem;--space-lg: 1.7rem;--space-xl: 2.2rem;--space-2xl: 3.1rem}[data-contrast='high']{--line: var(--line-strong);--text-dim: var(--text-soft);--focus-ring: var(--accent);--shadow-raised: 0 0 0 1px var(--text)}@media (prefers-contrast: more){:root{--line: var(--line-strong);--text-dim: var(--text-soft);--focus-ring: var(--accent);--shadow-raised: 0 0 0 1px var(--text)}}:root[data-theme='dark'][data-surface='oled']{--bg: #000000;--bg-elevated: #0a0a0a;--panel: #101010;--panel-strong: #161616;--panel-soft: #1a1a1a}@media (prefers-color-scheme: dark){:root:not([data-theme='light'])[data-surface='oled']{--bg: #000000;--bg-elevated: #0a0a0a;--panel: #101010;--panel-strong: #161616;--panel-soft: #1a1a1a}}@media print{:root:root:root{color-scheme: light;--text: #111;--text-soft: #2a2a2a;--text-dim: #555;--bg: #fff;--bg-elevated: #fff;--panel: #fff;--panel-strong: #fff;--panel-soft: #f7f7f7;--line: #d9d9d9;--line-strong: #b3b3b3;--success: #2f7d4f;--danger: #c01622;--warning: #806414;--info: #1f63c4;--accent: #d71921}}}
1
+ @layer bronto{:root{--radius-xl: 4px;--radius-lg: 3px;--radius-md: 2px;--radius-sm: 1px;--radius-pill: 999px;--space-2xs: 0.25rem;--space-xs: 0.5rem;--space-sm: 0.75rem;--space-md: 1rem;--space-lg: 1.35rem;--space-xl: 1.75rem;--space-2xl: 2.5rem;--mono: 'JetBrains Mono','Fira Code','Cascadia Code','SF Mono',ui-monospace,monospace;--sans: 'Inter','SF Pro Text',-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;--dot-font: 'Doto',var(--mono);--display: var(--dot-font);--display-weight: 700;--display-weight-strong: 800;--text-2xs: 0.68rem;--text-xs: 0.76rem;--text-sm: 0.86rem;--text-base: 0.95rem;--text-lg: 1.15rem;--text-xl: 1.45rem;--tracking-wide: 0.14em;--tracking-wider: 0.22em;--ease-standard: cubic-bezier(0.2,0.8,0.2,1);--ease-spring: cubic-bezier(0.16,1,0.3,1);--ease-out: cubic-bezier(0.33,1,0.68,1);--duration-fast: 130ms;--duration-base: 200ms;--duration-slow: 360ms;--dot-size: 2px;--dot-gap: 14px;--z-base: 0;--z-raised: 10;--z-sticky: 20;--z-overlay: 30;--z-popover: 50;--z-toast: 60;--accent-1: color-mix(in oklch,var(--accent) 8%,var(--accent-ramp-end));--accent-2: color-mix(in oklch,var(--accent) 16%,var(--accent-ramp-end));--accent-3: color-mix(in oklch,var(--accent) 32%,var(--accent-ramp-end));--accent-4: color-mix(in oklch,var(--accent) 60%,var(--accent-ramp-end));--accent-5: var(--accent);--accent-6: var(--accent-strong);--surface-1: var(--bg);--surface-2: var(--bg-elevated);--surface-3: var(--panel);--surface-4: var(--panel-soft);--surface-5: var(--line);--surface-6: var(--line-strong);--bronto-color-bg: var(--bg);--bronto-color-surface: var(--panel);--bronto-color-surface-raised: var(--panel-strong);--bronto-color-border: var(--line);--bronto-color-border-strong: var(--line-strong);--bronto-color-text: var(--text);--bronto-color-text-muted: var(--text-dim);--bronto-color-action: var(--accent);--bronto-color-on-action: var(--button-text);--bronto-color-focus: var(--focus-ring);--bronto-color-success: var(--success);--bronto-color-warning: var(--warning);--bronto-color-danger: var(--danger);--bronto-color-info: var(--info);--surface: var(--panel);--surface-raised: var(--panel-strong);--surface-muted: var(--panel-soft);--border: var(--line);--border-strong: var(--line-strong)}:root,:root[data-theme='light']{color-scheme: light;--bg: #f4f4f2;--bg-elevated: #fbfbfa;--bg-accent: color-mix(in srgb,var(--accent) 6%,transparent);--panel: #ffffff;--panel-strong: #ffffff;--panel-soft: #ececea;--line: #d8d8d4;--line-strong: #a8a8a2;--text: #0a0a0a;--text-soft: #353533;--text-dim: #686863;--accent: #d71921;--accent-ramp-end: #ffffff;--accent-strong: color-mix(in srgb,var(--accent) 83%,#000);--accent-text: var(--accent-strong);--on-accent: var(--button-text);--accent-soft: color-mix(in srgb,var(--accent) 10%,transparent);--success: #2f7d4f;--success-soft: rgb(47,125,79,0.12);--warning: #806414;--warning-soft: rgb(128,100,20,0.13);--danger: #c01622;--danger-soft: rgb(192,22,34,0.1);--info: #1f63c4;--info-soft: rgb(31,99,196,0.12);--code-bg: rgb(10,10,10,0.05);--button-text: #ffffff;--field-dot: rgb(10,10,10,0.16);--field-dot-hot: rgb(10,10,10,0.4);--field-dot-accent: color-mix(in srgb,var(--accent) 78%,transparent);--focus-ring: var(--accent);--shadow: none;--shadow-raised: 0 0 0 1px var(--line-strong)}@media (prefers-color-scheme: dark){:root:not([data-theme='light']){color-scheme: dark;--bg: #121212;--bg-elevated: #181818;--bg-accent: color-mix(in srgb,var(--accent) 8%,transparent);--panel: #1c1c1c;--panel-strong: #222222;--panel-soft: #242424;--line: #383838;--line-strong: #555555;--text: #e6e6e6;--text-soft: #c8c8c8;--text-dim: #a0a0a0;--accent: #ff3b41;--accent-ramp-end: #000000;--accent-strong: color-mix(in srgb,var(--accent) 84%,#fff);--accent-text: var(--accent-strong);--on-accent: var(--button-text);--accent-soft: color-mix(in srgb,var(--accent) 14%,transparent);--success: #4ec27e;--success-soft: rgb(78,194,126,0.14);--warning: #d8bd72;--warning-soft: rgb(216,189,114,0.14);--danger: #ff4d54;--danger-soft: rgb(255,77,84,0.15);--info: #6fb0e6;--info-soft: rgb(111,176,230,0.14);--code-bg: rgb(255,255,255,0.05);--button-text: #000000;--field-dot: rgb(242,242,242,0.14);--field-dot-hot: rgb(242,242,242,0.36);--field-dot-accent: color-mix(in srgb,var(--accent) 82%,transparent);--focus-ring: var(--accent);--shadow: none;--shadow-raised: 0 0 0 1px var(--line-strong)}}:root[data-theme='dark']{color-scheme: dark;--bg: #121212;--bg-elevated: #181818;--bg-accent: color-mix(in srgb,var(--accent) 8%,transparent);--panel: #1c1c1c;--panel-strong: #222222;--panel-soft: #242424;--line: #383838;--line-strong: #555555;--text: #e6e6e6;--text-soft: #c8c8c8;--text-dim: #a0a0a0;--accent: #ff3b41;--accent-ramp-end: #000000;--accent-strong: color-mix(in srgb,var(--accent) 84%,#fff);--accent-text: var(--accent-strong);--on-accent: var(--button-text);--accent-soft: color-mix(in srgb,var(--accent) 14%,transparent);--success: #4ec27e;--success-soft: rgb(78,194,126,0.14);--warning: #d8bd72;--warning-soft: rgb(216,189,114,0.14);--danger: #ff4d54;--danger-soft: rgb(255,77,84,0.15);--info: #6fb0e6;--info-soft: rgb(111,176,230,0.14);--code-bg: rgb(255,255,255,0.05);--button-text: #000000;--field-dot: rgb(242,242,242,0.14);--field-dot-hot: rgb(242,242,242,0.36);--field-dot-accent: color-mix(in srgb,var(--accent) 82%,transparent);--focus-ring: var(--accent);--shadow: none;--shadow-raised: 0 0 0 1px var(--line-strong)}[data-density='compact']{--space-2xs: 0.2rem;--space-xs: 0.4rem;--space-sm: 0.6rem;--space-md: 0.8rem;--space-lg: 1.05rem;--space-xl: 1.35rem;--space-2xl: 1.9rem}[data-density='comfortable']{--space-2xs: 0.3rem;--space-xs: 0.6rem;--space-sm: 0.95rem;--space-md: 1.25rem;--space-lg: 1.7rem;--space-xl: 2.2rem;--space-2xl: 3.1rem}[data-contrast='high']{--line: var(--line-strong);--text-dim: var(--text-soft);--focus-ring: var(--accent);--shadow-raised: 0 0 0 1px var(--text)}:root[data-contrast='high']{--line: var(--line-strong);--text-dim: var(--text-soft);--focus-ring: var(--accent);--shadow-raised: 0 0 0 1px var(--text)}@media (prefers-contrast: more){:root:root{--line: var(--line-strong);--text-dim: var(--text-soft);--focus-ring: var(--accent);--shadow-raised: 0 0 0 1px var(--text)}}:root[data-theme='dark'][data-surface='oled']{--bg: #000000;--bg-elevated: #0a0a0a;--panel: #101010;--panel-strong: #161616;--panel-soft: #1a1a1a}@media (prefers-color-scheme: dark){:root:not([data-theme='light'])[data-surface='oled']{--bg: #000000;--bg-elevated: #0a0a0a;--panel: #101010;--panel-strong: #161616;--panel-soft: #1a1a1a}}@media print{:root:root:root{color-scheme: light;--text: #111;--text-soft: #2a2a2a;--text-dim: #555;--bg: #fff;--bg-elevated: #fff;--panel: #fff;--panel-strong: #fff;--panel-soft: #f7f7f7;--line: #d9d9d9;--line-strong: #b3b3b3;--success: #2f7d4f;--danger: #c01622;--warning: #806414;--info: #1f63c4;--accent: #d71921}}}
package/docs/dots.md ADDED
@@ -0,0 +1,146 @@
1
+ # Dot surfaces
2
+
3
+ The dot-matrix is the library's signature: one lit/dim/accent dot vocabulary
4
+ expressed across backgrounds, dividers, indicators, loaders, and a family of
5
+ data-bound reporting surfaces. Everything here lives in the core stylesheet
6
+ (`@ponchia/ui` / `@ponchia/ui/css`); the glyph icon set built on the same
7
+ primitive is documented in `docs/glyphs.md`.
8
+
9
+ All classes are in the typed registry (`@ponchia/ui/classes`) and the
10
+ language-neutral `classes.json`; those are authoritative.
11
+
12
+ ## Tokens
13
+
14
+ Density and expression are token-driven, so a surface re-skins without new CSS:
15
+
16
+ | Token | Role |
17
+ | --- | --- |
18
+ | `--field-dot` | the dim (unlit) dot |
19
+ | `--field-dot-hot` | a lit cell |
20
+ | `--field-dot-accent` | the accented lit cell |
21
+ | `--dot-gap` / `--dot-size` | `.ui-dotgrid` background density |
22
+ | `--dotmatrix-cols` / `--dotmatrix-gap` / `--dotmatrix-dot` | matrix density |
23
+ | `--dotmatrix-dot-radius` | `0` fuses dots into crisp pixels |
24
+
25
+ The Tier-3 **display-expression** knobs speak in brightness + time rather than
26
+ hue (a dot-matrix display has no decorative colour). They default to a no-op, so
27
+ the base render is unchanged; the opt-in colorways (`@ponchia/ui/css/skins.css`)
28
+ set them:
29
+
30
+ | Knob | Default | Effect |
31
+ | --- | --- | --- |
32
+ | `--dotmatrix-glow` | `0` (off) | phosphor bloom around lit cells |
33
+ | `--dotmatrix-pulse-min` | `0.55` | the floor the `--pulse` animation dips to |
34
+ | `--dotmatrix-reveal-step` | `3ms` | per-cell cadence of the `--reveal` scan |
35
+
36
+ ## Decorative surfaces
37
+
38
+ - `.ui-dotgrid` — a tiled dot-grid background (`--accent`, `--dense` modifiers).
39
+ - `.ui-dotfield` — a fixed full-bleed dot backdrop.
40
+ - `.ui-dotrule` — a dotted divider in place of a plain rule.
41
+ - `.ui-halftone` — render host content (an `<img>` or a box with its own
42
+ background) through a dot lattice, so a thumbnail takes on the dot look. A
43
+ **style filter**, not a data viz — the dots are a fixed lattice, not
44
+ value-modulated. Tune with `--halftone-dot` / `--halftone-gap`.
45
+
46
+ ## Indicators & loaders
47
+
48
+ - `.ui-dot` — a status dot with tones (`--accent/--success/--warning/--danger/--info`)
49
+ and a `--live` pulse ring; `.ui-status` is the dot + label row.
50
+ - `.ui-dotloader` — three blinking dots.
51
+ - `.ui-dotspinner` — the signature comet loader (`--sm` / `--lg`).
52
+ - `.ui-dotbar` — a segmented LED progress bar; light a segment with `is-on`,
53
+ or `--indeterminate` for the sweep.
54
+
55
+ ## Data-bound reporting surfaces
56
+
57
+ These map data onto the dot vocabulary. The boundary is the same as `ui-spark`
58
+ and `ui-meter`: **the host normalises the data** (lights `is-on`, sets
59
+ `data-level`, or writes `--v` 0..1) and the leaf only lays out + tones. None
60
+ compute a scale, bin, or threshold. Each is opaque to assistive tech, so the
61
+ container MUST carry a host-written `role="img"` + `aria-label` with the exact
62
+ value — rounding to whole cells is presentation-only, so keep the figure in the
63
+ label (WCAG 1.4.1).
64
+
65
+ ### `.ui-matrix` cell grid
66
+
67
+ `.ui-dotmatrix` is the raw data-bound grid (the one the glyphs render on): a grid
68
+ of `.ui-dotmatrix__cell` (with `--hot` / `--accent` tones) plus the `--reveal` /
69
+ `--pulse` animations. You map data → cell class.
70
+
71
+ ### `.ui-waffle` — unit / part-to-whole
72
+
73
+ An N×N field of dots ("73 of 100"). The host marks the lit cells with `is-on`.
74
+
75
+ ```html
76
+ <div class="ui-waffle" role="img" aria-label="73 of 100 quota met" style="--waffle-cols: 10">
77
+ <i class="is-on"></i><i class="is-on"></i><!-- … 73 lit, 27 dim … --><i></i>
78
+ </div>
79
+ ```
80
+
81
+ Knobs: `--waffle-cols` (default 10), `--waffle-gap`, `--waffle-size`.
82
+
83
+ ### `.ui-activity` — contribution / calendar heatmap
84
+
85
+ A GitHub-style density-over-time grid. Day cells flow down each weekday column
86
+ (`grid-auto-flow: column`); intensity is `data-level="0..4"`, a 5-step ramp the
87
+ host bins the data into.
88
+
89
+ ```html
90
+ <div class="ui-activity" role="img" aria-label="commits, last 12 weeks">
91
+ <i data-level="0"></i><i data-level="3"></i><i data-level="4"></i><!-- … -->
92
+ </div>
93
+ ```
94
+
95
+ Knobs: `--activity-rows` (default 7), `--activity-cell`, `--activity-gap`.
96
+
97
+ ### `.ui-level` — LED level / VU meter
98
+
99
+ A vertical column of discrete segments lit to a threshold (signal, load, VU). It
100
+ fills from the bottom; the host lights segments with `is-on`. `--warn` /
101
+ `--danger` re-point the lit colour for the whole meter when the host crosses a
102
+ threshold (the host owns the threshold).
103
+
104
+ ```html
105
+ <div class="ui-level ui-level--warn" role="img" aria-label="CPU 82%, high">
106
+ <i class="is-on"></i><i class="is-on"></i><i></i><!-- … --></div>
107
+ ```
108
+
109
+ Knobs: `--level-segments` count is up to your markup; `--level-height`,
110
+ `--level-size`, `--level-gap`.
111
+
112
+ ### `.ui-dotgauge` — radial dot gauge
113
+
114
+ A 0..1 reading (`--v`) drawn as a ring of dots filling along an arc.
115
+
116
+ ```html
117
+ <div class="ui-dotgauge" role="img" aria-label="Health 64%" style="--v: .64"></div>
118
+ ```
119
+
120
+ Knobs: `--v`, `--gauge-size`, `--gauge-sweep` (default 270deg), `--gauge-from`,
121
+ `--gauge-dot`.
122
+
123
+ ### `.ui-readout` — big dot-matrix numeric
124
+
125
+ The row wrapper produced by `renderReadout` (see `docs/glyphs.md`) — a Nothing-style
126
+ hero numeric composed from digit glyphs. Tune character spacing with
127
+ `--readout-gap`; spaces render as a `.ui-readout__spacer` of width `--readout-space`.
128
+
129
+ ### `.ui-spark--dots`
130
+
131
+ A modifier on the inline `ui-spark` dataword (`@ponchia/ui/css/spark.css`) that
132
+ renders each bar as a stack of dots instead of a solid bar — same `--v` contract.
133
+
134
+ ## Responsive density — `.ui-dotfit`
135
+
136
+ Wrap a dot surface in `.ui-dotfit` to make it respond to its **container** (the
137
+ card) rather than the viewport, via a container query — so the same component
138
+ reads well in a wide hero and a narrow tile without per-instance overrides.
139
+
140
+ ## Accessibility, forced colors & print
141
+
142
+ Lit/dim/accent encode meaning via background-color, which Windows High Contrast
143
+ Mode flattens — the dot surfaces opt out of forced-color remapping and pin lit
144
+ states to distinct system colours (the activity ramp collapses to present vs
145
+ absent). The data surfaces also set `print-color-adjust: exact` so their fills
146
+ survive printing. Animations honour `prefers-reduced-motion`.
@@ -0,0 +1,262 @@
1
+ # Frontier primitives
2
+
3
+ This is the strategic memory for Bronto's design-system differentiation. The
4
+ goal is not to out-catalog Radix, Carbon, Atlassian, Fluent, Spectrum, or
5
+ shadcn. Those systems already cover the standard component center: buttons,
6
+ forms, dialogs, tabs, menus, cards, tables, tooltips, badges, navigation,
7
+ loaders, and date inputs.
8
+
9
+ Bronto should instead own the interface layer that makes complex work legible:
10
+ explanation, provenance, relationships, command access, workbench ergonomics,
11
+ generated reports, and durable system state. In short: interfaces that explain
12
+ themselves.
13
+
14
+ ## Boundary
15
+
16
+ The pattern that worked for annotations should stay the rule:
17
+
18
+ - Bronto owns visual grammar, class vocabulary, token use, accessibility
19
+ guidance, pure geometry helpers, and small idempotent behavior kernels.
20
+ - The host owns domain state, data mapping, chart scales, tour step order,
21
+ command execution, persistence, AI/tool orchestration, and announcements that
22
+ need product-specific wording.
23
+ - New surfaces stay opt-in. They should not enter `dist/bronto.css` by default
24
+ unless they are clearly universal chrome.
25
+ - Prefer CSS and markup first. Add JS only when the browser cannot express the
26
+ behavior without measuring, filtering, keyboard state, or pointer tracking.
27
+
28
+ This keeps Bronto useful across Astro, SvelteKit, React, Solid, Qwik, plain
29
+ HTML, and generated static reports without becoming a framework component kit.
30
+
31
+ ## Already aligned in 0.5.0
32
+
33
+ The analytical/generated-report suite is already the first concrete expression
34
+ of this strategy:
35
+
36
+ - `annotations`: subject / connector / note grammar for SVG figures.
37
+ - `legends`: data keys that prevent chart meaning drifting from palette tokens.
38
+ - `marks`: semantic prose evidence and passage brackets.
39
+ - `connectors`: DOMRect leader lines between related UI regions.
40
+ - `spotlight`: the visual language of guided focus without a tour engine.
41
+ - `crosshair`: pointer/ruler/readout surface without chart-domain mapping.
42
+ - `selection`: shared selected/excluded/candidate states without hit-testing.
43
+ - `sources`: citation / source-card / source-list / provenance with a
44
+ trust-state grammar (candidate #1 below — now shipped in 0.5.0).
45
+
46
+ These are intentionally not a chart framework. They are communication
47
+ primitives.
48
+
49
+ ## 2026 scout batch — report & evidence grammar
50
+
51
+ A multi-source scout pass (2026-06-03) surfaced the next concrete batch. All
52
+ four are novel, Baseline-clean on the 2026 floor, and squarely on the
53
+ "explains itself" north star — the report / review / evidence lane. They ship
54
+ as opt-in surfaces (never default `dist/bronto.css`), CSS-and-markup first,
55
+ each with the same host-owns-state boundary that kept the chart renderer out in
56
+ 0.6.0. **All four shipped** — `ui-diff` in PR #97, then `ui-code` / `ui-spark` /
57
+ `ui-sidenote` in PR #100 — opt-in leaves, unreleased on the 0.6.0 package line.
58
+
59
+ ### `ui-diff` — line/row change grammar ✅ shipped
60
+
61
+ A CSS-grid gutter grammar (`ui-diff`, `__row --add/--remove/--context`,
62
+ `__hunk`, `--unified/--split`). The host supplies pre-classified rows; Bronto
63
+ only paints — redundant `::before` +/- sign glyphs (never colour-only), tone
64
+ tints, and optional subgrid alignment that degrades to plain grid. Composes
65
+ with the shipped `ui-compare--2up`. Boundary: all tokenizing, row alignment,
66
+ and hunk computation stay in the host — the moment Bronto parses or aligns rows
67
+ it crosses the line that deleted the bar renderer in 0.6.0. Diff is the most
68
+ explanation-dense surface Bronto does not yet own.
69
+
70
+ ### `ui-code` — fenced-code evidence chrome
71
+
72
+ A static code surface that paints already-tokenized markup (head bar,
73
+ line-number gutter via CSS counters, `.is-add` / `.is-del` / `.is-hl` line
74
+ states) and **never parses**. The host — or Shiki, via the shipped
75
+ `shiki/nothing.json` token-colour theme — supplies the token spans; Bronto owns
76
+ chrome only. Code-as-evidence for changelogs, version history, and generated
77
+ reports; pairs with the `.ui-src` provenance pill and marks. Degrades to a
78
+ plain scrollable `<pre>`.
79
+
80
+ ### `ui-spark` — inline datawords
81
+
82
+ Word-sized inline microcharts (line / bar / tristate / win-loss) for
83
+ trend-in-a-sentence inside reports and dense tables — the inline-series gap the
84
+ scalar `ui-delta` / `ui-num` / `ui-stat` leave open, and one block-level Vega
85
+ will not fill. The host normalises each point to `0..1` (`--v`); Bronto paints
86
+ geometry via inline SVG + custom properties + `currentColor`. No JS,
87
+ SSR-static, print-survivable. Boundary: Bronto refuses raw values and
88
+ min/max/scale computation, and every spark carries a host-supplied text / aria
89
+ equivalent (a bare sparkline is opaque to AT).
90
+
91
+ ### `ui-sidenote` / `ui-marginnote` — marginal explanation
92
+
93
+ Numbered margin sidenotes plus unnumbered marginnotes with CSS-counter
94
+ numbering and zero-JS responsive collapse (the Tufte `:checked` pattern);
95
+ degrades to an inline aside on narrow viewports and a footnote under
96
+ `@media print`. The channel for evidence, caveats, and provenance asides that
97
+ do not belong in the main column. Scope it as typographic margin notes,
98
+ reconciled with the existing `report.css` `__footnotes` numbering — not a
99
+ second backref engine.
100
+
101
+ ## 2026 scout batch #2 — explanation & provenance cluster ✅ shipped
102
+
103
+ A second scout pass (2026-06-04) ranked the next five and they all shipped as
104
+ opt-in leaves (unreleased on the 0.6.0 line). All clear web-native + fit +
105
+ leverage, and sit dead-centre on the explanation / provenance / orientation
106
+ lanes — not component parity.
107
+
108
+ ### `ui-textref` — deep-link to the cited sentence ✅ shipped
109
+
110
+ `@ponchia/ui/css/textref.css`. A citation whose `href` is a URL Text Fragment
111
+ (`#…:~:text=`): the browser scrolls to + highlights the exact quoted text, and
112
+ Bronto owns the on-brand `::target-text` paint (`--textref-highlight`). The
113
+ cheapest high-leverage item in the scout — extends the `sources.css` trust layer
114
+ from "label a source" to "point inside it". The host builds the fragment URL (a
115
+ three-line pure encoder, documented); no kernel. Degrades cleanly where Text
116
+ Fragments are unsupported.
117
+
118
+ ### `ui-bullet` — Stephen-Few bullet graph ✅ shipped
119
+
120
+ `@ponchia/ui/css/bullet.css`. Measure bar + target tick + 2–3 grayscale
121
+ qualitative bands — the canonical SLO / error-budget figure `ui-meter` cannot
122
+ encode. Same host-normalises-to-0..1 contract as `ui-spark` (`--v` measure,
123
+ `--t` target, `--band-lo`/`--band-hi` boundaries; `ui.bulletMeasure({ tone })`).
124
+ Few designed it grayscale, which is exactly the Nothing palette. Requires a
125
+ host-written `role="img"` + `aria-label`.
126
+
127
+ ### `ui-term` / `ui-glossary` — inline glossary ✅ shipped
128
+
129
+ `@ponchia/ui/css/term.css`. The accessible upgrade of the touch/keyboard-broken
130
+ `abbr[title]`: a `ui-term` `<button popovertarget>` whose `ui-def` definition is
131
+ a native `[popover]`, plus an end-of-document `ui-glossary` `<dl>`. The native
132
+ popover pairing gives open/Esc/light-dismiss for free — no kernel. Popovers don't
133
+ print, so the printed doc leans on the glossary block.
134
+
135
+ ### `ui-toc` — scrollspy table of contents ✅ shipped
136
+
137
+ `@ponchia/ui/css/toc.css`. A sticky contents rail (`--toc-top`) whose active
138
+ entry keys on `aria-current="true"`. CSS can't know the in-view section, so the
139
+ host mirrors it — statically, or with a small copy-paste IntersectionObserver
140
+ (no kernel ships). Degrades to a plain anchored list.
141
+
142
+ ### `ui-tree` — hierarchy outline ✅ shipped
143
+
144
+ `@ponchia/ui/css/tree.css`. A depth-indented outline on nested native
145
+ `<details>` (`ui-tree__branch`/`__leaf`/`__summary`/`__label`; add `name` for an
146
+ exclusive-accordion group). Composes the disclosure grammar `ui-accordion` owns —
147
+ it does not reinvent it. A11y honesty: a `<details>` group is a disclosure group,
148
+ NOT an ARIA `tree`; the roving-focus kernel is deferred behind a real consumer
149
+ (e.g. a workbench file pane).
150
+
151
+ ## Next strong candidates
152
+
153
+ ### 1. Source, citation, and provenance UI — ✅ shipped in 0.5.0
154
+
155
+ Shipped as `@ponchia/ui/css/sources.css` (`ui-citation`/`ui-source-card`/
156
+ `ui-source-list`/`ui-provenance` + the cross-cutting `ui-src--*` trust states),
157
+ matching the surface below. The optional `initSources` behavior now adds
158
+ source-card focus, a temporary `.is-source-active` cue, and lightweight preview
159
+ metadata over existing citation/source IDs.
160
+
161
+ Why it matters: AI output, generated reports, audit views, docs, and operational
162
+ tools all need to answer "where did this come from?" Normal UI kits have tags
163
+ and footnotes, but not a trust grammar. The shipped surface and its trust-state
164
+ vocabulary are documented with the component; richer preview popovers remain
165
+ host-owned.
166
+
167
+ ### 2. Lifecycle and system-state UI — 🟡 `ui-state` family shipped in 0.5.0
168
+
169
+ Shipped as `@ponchia/ui/css/state.css` (`ui-state` + the canonical state matrix
170
+ + `ui-syncbar`), matching the "good first build" below. `ui-job` (background
171
+ progress) and `ui-conflict` (resolution affordances) remain deferred until a
172
+ consumer needs them; `ui-review-state` is covered by the reviewed/needs-review
173
+ state modifiers.
174
+
175
+ Why it matters: serious apps spend a lot of time in states like saving, saved,
176
+ queued, offline, stale, retrying, conflicted, locked, reviewed, and background
177
+ job running. These states are usually improvised per product, so even good apps
178
+ feel inconsistent. Still deferred: `ui-job` (background progress) and
179
+ `ui-conflict` (resolution affordances), each until a consumer needs it.
180
+
181
+ ### 3. Command-first UI — ✅ shipped in 0.5.0
182
+
183
+ The keyboard-hint primitive (`.ui-shortcut` + `.ui-shortcut__sep` over `.ui-kbd`,
184
+ core chrome) landed first, then the `ui-command` palette: the
185
+ `@ponchia/ui/css/command.css` shell + the `initCommand` `data-bronto-command`
186
+ behavior (filter, roving focus, `bronto:command:select`/`close`) + `useCommand`
187
+ bindings. The host still owns the action registry and execution — Bronto only
188
+ filters and navigates.
189
+
190
+ Why it matters: command palettes turn a product from a page collection into a
191
+ tool. Existing libraries such as cmdk and kbar are good, but Bronto can own the
192
+ design-system contract: shortcuts, actions, groups, disabled reasons, context,
193
+ and command result feedback. The host still owns the action registry and
194
+ execution; global Cmd/Ctrl+K stays opt-in by design.
195
+
196
+ ### 4. Workbench UI — 🟡 inspector / property / selectionbar shipped in 0.5.0
197
+
198
+ Shipped as `@ponchia/ui/css/workbench.css` (`ui-inspector`, `ui-property`,
199
+ `ui-selectionbar`) — the low-risk CSS core below. Resizable split panes
200
+ (`ui-splitter`, an ARIA window-splitter behavior) and drag handles remain
201
+ deferred until a consumer needs them.
202
+
203
+ Why it matters: real tools need inspectors, object action bars, split panes,
204
+ resize handles, property rows, dense trees, and selected-object affordances.
205
+ Generic UI kits tend to stop at cards/tables/forms, leaving every app to build
206
+ its own half-consistent workbench. Still open: a `ui-splitter` ARIA
207
+ window-splitter behavior (focusable separator, `aria-valuemin/max/now`,
208
+ arrow-key resize) and drag/drop affordances — both deferred, and Bronto should
209
+ style drag handles, not become a drag-and-drop framework.
210
+
211
+ ### 5. Generated-content and AI trust primitives — 🟡 shipped in 0.5.0
212
+
213
+ Shipped as `@ponchia/ui/css/generated.css` (`ui-generated`, `ui-origin-label`,
214
+ `ui-reasoning`, `ui-tool-log` / `ui-tool-call`) — the origin/provenance labels,
215
+ generated-content wrapper, and tool-call log of the "good first build" below.
216
+ Chat-thread components and a `ui-confidence` widget are intentionally not shipped.
217
+
218
+ Why it matters: AI interfaces are becoming common, but most UI systems either
219
+ ship chat bubbles or nothing. Bronto should not become a chat framework. It
220
+ should own the trust surfaces around generated content. The host still owns model
221
+ metadata, tool execution, traces, redaction, and safety; chat-thread components
222
+ and a `ui-confidence` widget are intentionally not shipped (never fabricate a
223
+ precision signal the product does not have).
224
+
225
+ ## Priority
226
+
227
+ The CSS cores of candidates 1–5 shipped in 0.5.0, the 2026 scout batch shipped
228
+ in PRs #97/#100, and scout batch #2 (textref / bullet / term / toc / tree)
229
+ shipped 2026-06-04. The remaining active work, in order:
230
+
231
+ 1. `ui-job` / `ui-conflict` lifecycle surfaces (candidate 2).
232
+ 2. The `ui-splitter` ARIA window-splitter behavior + drag affordances
233
+ (candidate 4) — also the gating consumer for `ui-tree`'s deferred roving-focus
234
+ tree kernel.
235
+
236
+ Deferred items stay gated on a real consumer needing them. This order keeps
237
+ Bronto differentiated while staying inside its core philosophy: small,
238
+ framework-agnostic primitives that make complex interfaces clearer.
239
+
240
+ ## Inspiration watchlist
241
+
242
+ These are examples of the kind of older or under-supported work worth mining for
243
+ ideas. They are not dependency recommendations; the useful part is the shape of
244
+ the primitive, not the implementation stack.
245
+
246
+ | Project | Useful idea | Bronto-shaped lesson |
247
+ | --- | --- | --- |
248
+ | Susie Lu `d3-annotation` | Subject / connector / note grammar for explaining SVG figures. | Keep annotation as a grammar, not a chart engine or editor. |
249
+ | Susie Lu `d3-legend` | Colour, size, and symbol legends as reusable figure keys. | Legends belong in the design system because they explain visual encodings. |
250
+ | Twitter `labella.js` | One-dimensional label collision avoidance for timelines and dense axes. | A tiny `declutterLabels` helper can be more valuable than another component. |
251
+ | `D3-Labeler` / `d3fc-label-layout` | Greedy/simulated-annealing label placement. | Direct labels need layout helpers; host still owns chart scales and data. |
252
+ | `d3-lasso` | Possible / not-possible / selected / not-selected states while drawing a region. | Bronto should own selection vocabulary and maybe region visuals, not hit-testing. |
253
+ | `leader-line` / `react-xarrows` | Lines and arrows between DOM elements. | DOMRect connectors are broadly useful, but should be styleable and token-bound. |
254
+ | LinkedIn `hopscotch` / `chardin.js` | Guided tours as target + note + step metadata. | Bronto should own spotlight visuals, not the tour state machine. |
255
+ | `Waypoints` / `gumshoe` | Scroll-triggered section awareness and scrollspy navigation. | Long documents and reports may need section-progress/navigation affordances. |
256
+ | `mark.js`, `Rangy`, `TextHighlighter` | Search hits, user text selections, persistent text highlights. | Evidence/source marks need careful semantics around ranges and generated content. |
257
+ | `Mousetrap` / `Keypress` | Keyboard shortcut grammar and key sequences. | Command-first UI needs shortcut display and action dispatch boundaries. |
258
+ | `Split.js` | Small, unopinionated resizable split views. | Workbench panes are worth styling; behavior must follow accessible splitter rules. |
259
+ | jQuery Steps / old wizard plugins | Multi-step flows with progress, validation, and branching. | If Bronto adds stepper/wizard UI, it should be state vocabulary first. |
260
+ | `progressbar.js` | Lightweight progress shapes and determinate/indeterminate motion. | Lifecycle/job UI should make long-running work persistent and legible. |
261
+ | `react-json-view` / old JSON viewers | Inspectable structured data with collapse/copy/path affordances. | Generated/tool output needs compact inspector primitives without a React lock-in. |
262
+ | old diff viewers / `jsdifflib` | Side-by-side and inline change explanation. | Becoming `ui-diff` (2026 batch): Bronto paints the row/gutter grammar, the host pre-classifies rows — parsing and alignment stay outside Bronto. |
package/docs/glyphs.md ADDED
@@ -0,0 +1,114 @@
1
+ # Display glyphs
2
+
3
+ `@ponchia/ui/glyphs` is a small, frozen bitmap icon set rendered on the same
4
+ `.ui-dotmatrix` dot primitive as every other dot surface (see `docs/dots.md`).
5
+ CSS-first to the core: a glyph is just a grid of dot cells — `.` off, `#` hot,
6
+ `*` accent — so it re-skins with the same `--field-dot*` tokens and the Tier-3
7
+ display knobs as the rest of the dot family. No icon font, no SVG sprite, no
8
+ runtime dependency. The module is side-effect-free and SSR-safe (`renderGlyph`
9
+ returns a string; nothing touches the DOM).
10
+
11
+ ```js
12
+ import { renderGlyph } from '@ponchia/ui/glyphs';
13
+ el.innerHTML = renderGlyph('check', { label: 'Done' });
14
+ ```
15
+
16
+ The authoritative API is the generated, CI-drift-checked `glyphs/glyphs.d.ts`.
17
+ Read it before guessing a name — `GlyphName` is a literal union, so a typo is a
18
+ type error.
19
+
20
+ ## Three render paths
21
+
22
+ A glyph can be drawn three ways; pick by size regime.
23
+
24
+ | Path | Call | DOM | When |
25
+ | --- | --- | --- | --- |
26
+ | Dot display | `renderGlyph(name)` | `GLYPH_SIZE²` cells (256) | the signature dot-matrix look at display sizes |
27
+ | Solid pixel | `renderGlyph(name, { solid: true })` | 256 cells, fused | legible crisp icon at small/inline sizes (~16–24px) |
28
+ | Mask icon | `renderGlyph(name, { render: 'mask' })` | **one** `.ui-icon` node | icon-at-scale (e.g. one per table row): inherits `currentColor`, scales with the text |
29
+
30
+ The mask path is the lightest — one node instead of 256 — and the right default
31
+ for an icon repeated many times. It is single-tone: an accent `*` cell renders
32
+ the same as a hot `#` cell (both become opaque mask regions).
33
+
34
+ > Pixel-crisp sizes: the bitmap is a 16-unit grid, so the dot/solid paths look
35
+ > sharpest at integer multiples (16/32/48/64px). The mask path scales smoothly
36
+ > with the text; arbitrary `em` sizes soften the edges slightly, which is fine
37
+ > for inline use.
38
+
39
+ ### `renderGlyph(name, options)`
40
+
41
+ | Option | Type | Default | Effect |
42
+ | --- | --- | --- | --- |
43
+ | `grid` | boolean | `true` | show the unlit panel dots; `false` → glyph-only |
44
+ | `solid` | boolean | `false` | square, gapless pixels (implies glyph-only) |
45
+ | `anim` | `'reveal' \| 'pulse'` | — | decorative animation (reduced-motion-safe) |
46
+ | `label` | string | — | expose as `role="img"` with this name; omit → decorative (`aria-hidden`) |
47
+ | `dot` | CSS length | `0.08em` | one dot size (`--dotmatrix-dot`; sanitized) |
48
+ | `gap` | CSS length | — | gap between dots (`--dotmatrix-gap`; sanitized) |
49
+ | `render` | `'mask'` | — | the one-node `.ui-icon` path |
50
+ | `size` | CSS length | `1em` | with `render: 'mask'`, the icon size (`--icon-size`) |
51
+
52
+ ## Big numeric readout — `renderReadout`
53
+
54
+ Compose digits and punctuation into a row of dot-matrix glyphs — the
55
+ Nothing-style hero numeric for a KPI, clock, countdown, or percentage.
56
+
57
+ ```js
58
+ import { renderReadout } from '@ponchia/ui/glyphs';
59
+ el.innerHTML = renderReadout('12:48', { label: '12:48 remaining' });
60
+ el.innerHTML = renderReadout('73%', { label: '73 percent of quota', render: 'mask' });
61
+ ```
62
+
63
+ Recognised characters: `0-9`, `:`, `,`, `.`, `%`, `-`, `+`, and space (a blank
64
+ advance). Anything else is skipped. Every per-glyph option (`solid`, `render`,
65
+ `dot`, `gap`, `anim`) passes through to each character; `gap` sets the spacing
66
+ between characters. The digits are decorative — the readout's **value** is its
67
+ accessible name, so pass a `label` (it defaults to the raw text). Output wraps
68
+ in `.ui-readout` (see `docs/dots.md`).
69
+
70
+ ## Finding a glyph — `findGlyphs` / `GLYPH_TAGS`
71
+
72
+ Names follow the "depict, don't name the purpose" convention (`trash`, not
73
+ `delete`). `findGlyphs(query)` resolves an intent word to real names by matching
74
+ the name OR a curated search alias (`GLYPH_TAGS`), case-insensitively:
75
+
76
+ ```js
77
+ import { findGlyphs } from '@ponchia/ui/glyphs';
78
+ findGlyphs('delete'); // → ['trash']
79
+ findGlyphs('chart'); // → ['bar-chart']
80
+ findGlyphs(''); // → every name
81
+ ```
82
+
83
+ ## DOM placeholders — `initDotGlyph`
84
+
85
+ When you would rather drop a placeholder than inline markup, the optional
86
+ `initDotGlyph` behavior (`@ponchia/ui/behaviors`) expands
87
+ `[data-bronto-glyph="name"]` in place. It is idempotent and returns a cleanup.
88
+
89
+ | Attribute | Value | Effect |
90
+ | --- | --- | --- |
91
+ | `data-bronto-glyph` | glyph name | expand into a `.ui-dotmatrix` grid |
92
+ | `data-bronto-glyph-label` | text | expose as `role="img"`; omit → decorative |
93
+ | `data-bronto-glyph-solid` | — | square, gapless pixel glyph |
94
+ | `data-bronto-glyph-anim` | `reveal \| pulse` | decorative animation |
95
+ | `data-bronto-glyph-render` | `mask` | the one-node `.ui-icon` path (not 256 cells) |
96
+ | `data-bronto-glyph-size` | CSS length | with `render="mask"`, sets `--icon-size` |
97
+
98
+ An unknown name is left untouched.
99
+
100
+ ## Accessibility
101
+
102
+ - A glyph next to a text label is redundant → keep it decorative (`aria-hidden`,
103
+ the default).
104
+ - An icon-only control labels the **control** (`aria-label` on the `<button>`),
105
+ not the glyph.
106
+ - A standalone meaningful glyph passes `label` → `role="img"` + `aria-label`.
107
+ - A cell-mode glyph is a sea of 256 nodes; the wrapper carries the single
108
+ `role="img"`/`aria-hidden`, so assistive tech never walks the cells.
109
+
110
+ ## Two-tone glyphs
111
+
112
+ The accent (`*`) tone lifts one feature of a glyph onto `--field-dot-accent`.
113
+ The curated two-tone set is `spark`, `warning`, and `info`; every other glyph is
114
+ monotone. Two-tone only shows in the cell render — the mask path is single-tone.