@ponchia/ui 0.8.1 → 0.10.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.
Files changed (85) hide show
  1. package/CHANGELOG.md +149 -3
  2. package/MIGRATIONS.json +117 -27
  3. package/README.md +19 -11
  4. package/behaviors/index.d.ts +0 -2
  5. package/behaviors/index.d.ts.map +1 -1
  6. package/behaviors/index.js +0 -2
  7. package/behaviors/popover.js +4 -4
  8. package/classes/classes.json +48 -10
  9. package/classes/index.d.ts +16 -3
  10. package/classes/index.js +28 -3
  11. package/classes/vscode.css-custom-data.json +10 -10
  12. package/css/app.css +52 -30
  13. package/css/base.css +10 -14
  14. package/css/content.css +23 -21
  15. package/css/core.css +1 -0
  16. package/css/disclosure.css +17 -17
  17. package/css/feedback.css +15 -15
  18. package/css/forms.css +8 -7
  19. package/css/navigation.css +3 -3
  20. package/css/overlay.css +37 -39
  21. package/css/primitives.css +48 -28
  22. package/css/report.css +66 -42
  23. package/css/row.css +154 -0
  24. package/css/state.css +95 -6
  25. package/css/table.css +3 -3
  26. package/css/tokens.css +10 -10
  27. package/css/workbench.css +22 -10
  28. package/dist/bronto.css +1 -1
  29. package/dist/css/app.css +1 -1
  30. package/dist/css/base.css +1 -1
  31. package/dist/css/content.css +1 -1
  32. package/dist/css/disclosure.css +1 -1
  33. package/dist/css/feedback.css +1 -1
  34. package/dist/css/forms.css +1 -1
  35. package/dist/css/navigation.css +1 -1
  36. package/dist/css/overlay.css +1 -1
  37. package/dist/css/primitives.css +1 -1
  38. package/dist/css/report-kit.css +1 -1
  39. package/dist/css/report.css +1 -1
  40. package/dist/css/row.css +1 -0
  41. package/dist/css/state.css +1 -1
  42. package/dist/css/table.css +1 -1
  43. package/dist/css/tokens.css +1 -1
  44. package/dist/css/workbench.css +1 -1
  45. package/docs/adr/0004-prune-unused-adapters.md +5 -1
  46. package/docs/adr/0005-productive-tools-and-editorial-reports.md +58 -0
  47. package/docs/adr/0006-trusted-publishing.md +92 -0
  48. package/docs/architecture.md +16 -23
  49. package/docs/command.md +1 -2
  50. package/docs/compositions.md +110 -0
  51. package/docs/frontier-primitives.md +1 -2
  52. package/docs/migrations/0.8-to-0.9.md +66 -0
  53. package/docs/migrations/0.9-to-0.10.md +47 -0
  54. package/docs/package-contract.md +13 -13
  55. package/docs/reference.md +43 -18
  56. package/docs/reporting.md +15 -9
  57. package/docs/stability.md +20 -55
  58. package/docs/state.md +47 -0
  59. package/docs/theming.md +16 -0
  60. package/docs/usage.md +60 -30
  61. package/llms.txt +7 -18
  62. package/package.json +15 -54
  63. package/tokens/figma.variables.json +20 -20
  64. package/tokens/index.js +10 -10
  65. package/tokens/index.json +20 -20
  66. package/tokens/resolved.json +10 -10
  67. package/tokens/tokens.dtcg.json +20 -20
  68. package/behaviors/modal.d.ts +0 -45
  69. package/behaviors/modal.d.ts.map +0 -1
  70. package/behaviors/modal.js +0 -373
  71. package/qwik/index.d.ts +0 -48
  72. package/qwik/index.d.ts.map +0 -1
  73. package/qwik/index.js +0 -227
  74. package/react/index.d.ts +0 -45
  75. package/react/index.d.ts.map +0 -1
  76. package/react/index.js +0 -165
  77. package/solid/index.d.ts +0 -75
  78. package/solid/index.d.ts.map +0 -1
  79. package/solid/index.js +0 -172
  80. package/svelte/index.d.ts +0 -114
  81. package/svelte/index.d.ts.map +0 -1
  82. package/svelte/index.js +0 -197
  83. package/vue/index.d.ts +0 -116
  84. package/vue/index.d.ts.map +0 -1
  85. package/vue/index.js +0 -266
@@ -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: 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--break-anywhere{table-layout: fixed}.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%}@media (pointer: coarse){.ui-table__sort{box-sizing: border-box;margin-block: -0.7rem;min-block-size: var(--tap-target-min);padding-block: 0.7rem}.ui-table--dense .ui-table__sort{margin-block: -0.42rem;padding-block: 0.42rem}.ui-table--comfortable .ui-table__sort{margin-block: -0.95rem;padding-block: 0.95rem}}.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(--sans);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: 0;position: sticky;text-transform: none;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--break-anywhere{table-layout: fixed}.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%}@media (pointer: coarse){.ui-table__sort{box-sizing: border-box;margin-block: -0.7rem;min-block-size: var(--tap-target-min);padding-block: 0.7rem}.ui-table--dense .ui-table__sort{margin-block: -0.42rem;padding-block: 0.42rem}.ui-table--comfortable .ui-table__sort{margin-block: -0.95rem;padding-block: 0.95rem}}.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;--tap-target: max(44px,2.9rem);--tap-target-min: max(24px,1.6rem);--safe-area-top: env(safe-area-inset-top,0px);--safe-area-right: env(safe-area-inset-right,0px);--safe-area-bottom: env(safe-area-inset-bottom,0px);--safe-area-left: env(safe-area-inset-left,0px);--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.72rem;--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) 80%,#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) 80%,#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'],: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: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;--success-soft: rgb(47,125,79,0.12);--danger: #c01622;--danger-soft: rgb(192,22,34,0.1);--warning: #806414;--warning-soft: rgb(128,100,20,0.13);--info: #1f63c4;--info-soft: rgb(31,99,196,0.12);--accent: #d71921;--bg-accent: color-mix(in srgb,var(--accent) 6%,transparent);--accent-ramp-end: #ffffff;--accent-strong: color-mix(in srgb,var(--accent) 83%,#000);--accent-text: var(--accent-strong);--accent-soft: color-mix(in srgb,var(--accent) 10%,transparent);--button-text: #ffffff;--on-accent: var(--button-text);--field-dot: rgb(17,17,17,0.16);--field-dot-hot: rgb(17,17,17,0.4);--field-dot-accent: color-mix(in srgb,var(--accent) 78%,transparent);--focus-ring: var(--accent);--code-bg: rgb(17,17,17,0.05)}}}
1
+ @layer bronto{:root{--radius-xl: 8px;--radius-lg: 6px;--radius-md: 4px;--radius-sm: 2px;--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;--tap-target: max(44px,2.9rem);--tap-target-min: max(24px,1.6rem);--safe-area-top: env(safe-area-inset-top,0px);--safe-area-right: env(safe-area-inset-right,0px);--safe-area-bottom: env(safe-area-inset-bottom,0px);--safe-area-left: env(safe-area-inset-left,0px);--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.75rem;--text-xs: 0.8125rem;--text-sm: 0.875rem;--text-base: 1rem;--text-lg: 1.125rem;--text-xl: 1.5rem;--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) 80%,#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) 80%,#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'],: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: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;--success-soft: rgb(47,125,79,0.12);--danger: #c01622;--danger-soft: rgb(192,22,34,0.1);--warning: #806414;--warning-soft: rgb(128,100,20,0.13);--info: #1f63c4;--info-soft: rgb(31,99,196,0.12);--accent: #d71921;--bg-accent: color-mix(in srgb,var(--accent) 6%,transparent);--accent-ramp-end: #ffffff;--accent-strong: color-mix(in srgb,var(--accent) 83%,#000);--accent-text: var(--accent-strong);--accent-soft: color-mix(in srgb,var(--accent) 10%,transparent);--button-text: #ffffff;--on-accent: var(--button-text);--field-dot: rgb(17,17,17,0.16);--field-dot-hot: rgb(17,17,17,0.4);--field-dot-accent: color-mix(in srgb,var(--accent) 78%,transparent);--focus-ring: var(--accent);--code-bg: rgb(17,17,17,0.05)}}}
@@ -1 +1 @@
1
- @layer bronto{.ui-inspector{background: var(--panel);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: var(--space-sm);padding: var(--space-md)}.ui-inspector__head{align-items: baseline;border-block-end: 1px solid var(--line);display: flex;gap: var(--space-sm);justify-content: space-between;padding-block-end: var(--space-xs)}.ui-inspector__body{display: grid;gap: var(--space-2xs)}.ui-toolstrip{align-items: center;background: var(--panel-strong);border: 1px solid var(--line-strong);border-radius: var(--radius-md);display: flex;flex-wrap: wrap;gap: var(--space-xs);min-inline-size: 0;padding: 0.35rem}.ui-toolstrip--floating{box-shadow: var(--shadow-raised)}.ui-toolstrip--compact{gap: var(--space-2xs);padding: 0.25rem}.ui-toolstrip--pane{background: none;border: 0;border-block-end: 1px solid var(--line);border-radius: 0;flex-wrap: nowrap;gap: var(--space-2xs);overflow-x: auto;padding: 0.3rem var(--space-xs);scrollbar-width: thin}.ui-toolstrip__fill{flex: 1 1 auto;min-inline-size: 0;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.ui-toolstrip__brand{align-items: baseline;display: inline-flex;flex: 0 1 auto;gap: var(--space-xs);min-inline-size: 0;padding-inline: var(--space-xs)}.ui-toolstrip__brand strong{color: var(--text);font-size: var(--text-sm)}.ui-toolstrip__context{color: var(--text-dim);font-size: var(--text-xs);min-inline-size: 0;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.ui-toolstrip__group,.ui-toolstrip__actions{align-items: center;display: inline-flex;flex-wrap: wrap;gap: var(--space-2xs)}.ui-toolstrip__group{background: var(--panel-soft);border: 1px solid var(--line);border-radius: var(--radius-md);padding: 0.16rem}.ui-toolstrip__search{flex: 1 1 14rem;min-inline-size: min(100%,11rem)}.ui-toolstrip__actions{margin-inline-start: auto}.ui-segmented-buttons{align-items: center;background: var(--panel-soft);border: 1px solid var(--line);border-radius: var(--radius-md);display: inline-flex;flex-wrap: wrap;gap: 0.16rem;padding: 0.16rem}.ui-segmented-buttons__button{background: transparent;border: 1px solid transparent;border-radius: var(--radius-sm);color: var(--text-soft);cursor: pointer;font-family: var(--mono);font-size: var(--text-xs);font-weight: 700;letter-spacing: var(--tracking-wide);line-height: 1;min-block-size: 1.9rem;padding: 0.48rem 0.7rem;text-transform: uppercase}.ui-segmented-buttons__button[aria-pressed='true'],.ui-segmented-buttons__button.is-active{background: var(--accent);border-color: var(--accent);color: var(--button-text)}.ui-segmented-buttons__button:disabled,.ui-segmented-buttons__button[aria-disabled='true']{cursor: not-allowed;opacity: 0.45}.ui-property{align-items: baseline;display: grid;gap: var(--space-sm);grid-template-columns: minmax(6rem,38%) 1fr}.ui-property__label{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-property__value{color: var(--text);font-size: var(--text-sm);min-inline-size: 0}.ui-pane{background: var(--panel);border: 1px solid var(--line);border-radius: var(--radius-md);display: flex;flex-direction: column;min-block-size: 0;min-inline-size: 0;overflow: hidden}.ui-pane__head{align-items: center;background: var(--bg-elevated);border-block-end: 1px solid var(--line);cursor: grab;display: flex;flex: none;gap: var(--space-2xs);min-block-size: var(--pane-head,2.5rem);padding: var(--space-2xs) var(--space-xs)}.ui-pane__head:active{cursor: grabbing}.ui-pane__title{flex: 1 1 auto;font-size: var(--text-xs);min-inline-size: 0;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.ui-pane__title-input{background: var(--bg-elevated);border: 1px solid var(--accent);border-radius: var(--radius-sm);color: inherit;font: inherit;letter-spacing: inherit;margin-block: -1px;max-inline-size: 100%;min-inline-size: 0;padding: 0 0.25rem}.ui-pane__actions{display: flex;flex: 0 1 auto;flex-wrap: nowrap;gap: var(--space-2xs);min-inline-size: 0;overflow-x: auto;scrollbar-width: thin}.ui-pane__actions:empty{display: none}.ui-pane__body{display: flex;flex: 1;flex-direction: column;min-block-size: 0;min-inline-size: 0;overflow: auto}.ui-selectionbar{align-items: center;background: var(--panel-strong);border: 1px solid var(--line-strong);border-radius: var(--radius-md);box-shadow: var(--shadow-raised);display: flex;flex-wrap: wrap;gap: var(--space-sm) var(--space-md);justify-content: space-between;padding: 0.5rem 0.85rem}.ui-selectionbar__count{color: var(--text);font-family: var(--mono);font-size: var(--text-sm)}.ui-selectionbar__actions{display: flex;flex-wrap: wrap;gap: var(--space-xs)}.ui-selectionbar--anchored,.ui-toolstrip--anchored{--anchor-offset: var(--space-sm);inset-inline-start: 50%;max-inline-size: calc(100% - 2 * var(--space-md));position: absolute;transform: translateX(-50%)}.ui-selectionbar--anchored,.ui-toolstrip--anchored,.ui-selectionbar--anchor-block-end,.ui-toolstrip--anchor-block-end{inset-block: auto max(var(--anchor-offset),var(--safe-area-bottom))}.ui-selectionbar--anchor-block-start,.ui-toolstrip--anchor-block-start{inset-block: max(var(--anchor-offset),var(--safe-area-top)) auto}@media (hover: hover){.ui-segmented-buttons__button:hover:not(:disabled,[aria-disabled='true'],[aria-pressed='true'],.is-active){background: var(--panel);border-color: var(--line-strong);color: var(--text)}}.ui-splitter{--splitter-pos: 50%;--splitter-handle: 0.75rem;--splitter-pane-min: 0px;background: var(--panel);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;grid-template-columns: minmax(var(--splitter-pane-min),var(--splitter-pos)) var(--splitter-handle) minmax(0,1fr);min-block-size: 18rem;overflow: hidden}.ui-splitter--vertical{grid-template-columns: minmax(var(--splitter-pane-min),var(--splitter-pos)) var(--splitter-handle) minmax(0,1fr)}.ui-splitter--horizontal{grid-template-columns: 1fr;grid-template-rows: minmax(var(--splitter-pane-min),var(--splitter-pos)) var(--splitter-handle) minmax(0,1fr)}.ui-splitter__pane{min-block-size: 0;min-inline-size: 0;overflow: auto;padding: var(--space-md)}.ui-splitter__handle{align-self: stretch;background: var(--panel-strong);border-block: 0;border-inline: 1px solid var(--line);cursor: col-resize;display: grid;min-inline-size: var(--splitter-handle);place-items: center;touch-action: none}.ui-splitter__handle::before{background: var(--line-strong);border-radius: var(--radius-pill);block-size: 2.5rem;content: "";inline-size: 2px}.ui-splitter__handle:hover::before,.ui-splitter__handle.is-active::before,.ui-splitter__handle[aria-valuenow]:focus-visible::before{background: var(--accent)}.ui-splitter__handle:focus-visible{outline: 2px solid var(--focus-ring);outline-offset: -2px}.ui-splitter--horizontal .ui-splitter__handle{border-block: 1px solid var(--line);border-inline: 0;cursor: row-resize;min-block-size: var(--splitter-handle);min-inline-size: 0}.ui-splitter--horizontal .ui-splitter__handle::before{block-size: 2px;inline-size: 2.5rem}@media (forced-colors: active){.ui-segmented-buttons__button[aria-pressed='true'],.ui-segmented-buttons__button.is-active{background: Highlight;border-color: Highlight;color: HighlightText}.ui-splitter__handle{border-color: CanvasText}.ui-splitter__handle::before{background: CanvasText}}}
1
+ @layer bronto{.ui-inspector{container: bronto-inspector / inline-size;background: var(--panel);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: var(--space-sm);padding: var(--space-md)}.ui-inspector__head{align-items: baseline;border-block-end: 1px solid var(--line);display: flex;flex-wrap: wrap;gap: var(--space-sm);justify-content: space-between;padding-block-end: var(--space-xs)}.ui-inspector__body{display: grid;gap: var(--space-2xs)}.ui-toolstrip{align-items: center;background: var(--panel-strong);border: 1px solid var(--line-strong);border-radius: var(--radius-md);display: flex;flex-wrap: wrap;gap: var(--space-xs);min-inline-size: 0;padding: 0.35rem}.ui-toolstrip--floating{box-shadow: var(--shadow-raised)}.ui-toolstrip--compact{gap: var(--space-2xs);padding: var(--space-2xs)}.ui-toolstrip--pane{background: none;border: 0;border-block-end: 1px solid var(--line);border-radius: 0;flex-wrap: nowrap;gap: var(--space-2xs);overflow-x: auto;padding: 0.3rem var(--space-xs);scrollbar-width: thin}.ui-toolstrip__fill{flex: 1 1 auto;min-inline-size: 0;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.ui-toolstrip__brand{align-items: baseline;display: inline-flex;flex: 0 1 auto;gap: var(--space-xs);min-inline-size: 0;padding-inline: var(--space-xs)}.ui-toolstrip__brand strong{color: var(--text);font-size: var(--text-sm)}.ui-toolstrip__context{color: var(--text-dim);font-size: var(--text-xs);min-inline-size: 0;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.ui-toolstrip__group,.ui-toolstrip__actions{align-items: center;display: inline-flex;flex-wrap: wrap;gap: var(--space-2xs)}.ui-toolstrip__group{background: var(--panel-soft);border: 1px solid var(--line);border-radius: var(--radius-md);padding: 0.16rem}.ui-toolstrip__search{flex: 1 1 14rem;min-inline-size: min(100%,11rem)}.ui-toolstrip__actions{margin-inline-start: auto}.ui-segmented-buttons{align-items: center;background: var(--panel-soft);border: 1px solid var(--line);border-radius: var(--radius-md);display: inline-flex;flex-wrap: wrap;gap: 0.16rem;padding: 0.16rem}.ui-segmented-buttons__button{background: transparent;border: 1px solid transparent;border-radius: var(--radius-sm);color: var(--text-soft);cursor: pointer;font-family: var(--sans);font-size: var(--text-xs);font-weight: 700;letter-spacing: 0;line-height: 1;min-block-size: 1.9rem;padding: 0.48rem 0.7rem;text-transform: none}.ui-segmented-buttons__button[aria-pressed='true'],.ui-segmented-buttons__button.is-active{background: var(--accent);border-color: var(--accent);color: var(--button-text)}.ui-segmented-buttons__button:disabled,.ui-segmented-buttons__button[aria-disabled='true']{cursor: not-allowed;opacity: 0.45}.ui-property{align-items: baseline;display: grid;gap: var(--space-sm);grid-template-columns: minmax(0,38%) minmax(0,1fr)}.ui-property__label{color: var(--text-dim);font-family: var(--sans);font-size: var(--text-xs);overflow-wrap: anywhere;letter-spacing: 0;text-transform: none}.ui-property__value{color: var(--text);font-size: var(--text-sm);min-inline-size: 0;overflow-wrap: anywhere}@container bronto-inspector (max-inline-size: 20rem){.ui-property{gap: var(--space-2xs);grid-template-columns: minmax(0,1fr);padding-block: var(--space-xs)}}.ui-pane{background: var(--panel);border: 1px solid var(--line);border-radius: var(--radius-md);display: flex;flex-direction: column;min-block-size: 0;min-inline-size: 0;overflow: hidden}.ui-pane__head{align-items: center;background: var(--bg-elevated);border-block-end: 1px solid var(--line);cursor: grab;display: flex;flex: none;gap: var(--space-2xs);min-block-size: var(--pane-head,2.5rem);padding: var(--space-2xs) var(--space-xs)}.ui-pane__head:active{cursor: grabbing}.ui-pane__title{flex: 1 1 auto;font-size: var(--text-xs);min-inline-size: 0;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.ui-pane__title-input{background: var(--bg-elevated);border: 1px solid var(--accent);border-radius: var(--radius-sm);color: inherit;font: inherit;letter-spacing: inherit;margin-block: -1px;max-inline-size: 100%;min-inline-size: 0;padding: 0 0.25rem}.ui-pane__actions{display: flex;flex: 0 1 auto;flex-wrap: nowrap;gap: var(--space-2xs);min-inline-size: 0;overflow-x: auto;scrollbar-width: thin}.ui-pane__actions:empty{display: none}.ui-pane__body{display: flex;flex: 1;flex-direction: column;min-block-size: 0;min-inline-size: 0;overflow: auto}.ui-selectionbar{align-items: center;background: var(--panel-strong);border: 1px solid var(--line-strong);border-radius: var(--radius-md);box-shadow: var(--shadow-raised);display: flex;flex-wrap: wrap;gap: var(--space-sm) var(--space-md);justify-content: space-between;padding: 0.5rem 0.85rem}.ui-selectionbar__count{color: var(--text);font-family: var(--sans);font-size: var(--text-sm)}.ui-selectionbar__actions{display: flex;flex-wrap: wrap;gap: var(--space-xs)}.ui-selectionbar--anchored,.ui-toolstrip--anchored{--anchor-offset: var(--space-sm);inset-inline-start: 50%;max-inline-size: calc(100% - 2 * var(--space-md));position: absolute;transform: translateX(-50%)}.ui-selectionbar--anchored,.ui-toolstrip--anchored,.ui-selectionbar--anchor-block-end,.ui-toolstrip--anchor-block-end{inset-block: auto max(var(--anchor-offset),var(--safe-area-bottom))}.ui-selectionbar--anchor-block-start,.ui-toolstrip--anchor-block-start{inset-block: max(var(--anchor-offset),var(--safe-area-top)) auto}@media (hover: hover){.ui-segmented-buttons__button:hover:not(:disabled,[aria-disabled='true'],[aria-pressed='true'],.is-active){background: var(--panel);border-color: var(--line-strong);color: var(--text)}}.ui-splitter{--splitter-pos: 50%;--splitter-handle: 0.75rem;--splitter-pane-min: 0px;background: var(--panel);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;grid-template-columns: minmax(var(--splitter-pane-min),var(--splitter-pos)) var(--splitter-handle) minmax(0,1fr);min-block-size: 18rem;overflow: hidden}.ui-splitter--vertical{grid-template-columns: minmax(var(--splitter-pane-min),var(--splitter-pos)) var(--splitter-handle) minmax(0,1fr)}.ui-splitter--horizontal{grid-template-columns: 1fr;grid-template-rows: minmax(var(--splitter-pane-min),var(--splitter-pos)) var(--splitter-handle) minmax(0,1fr)}.ui-splitter__pane{min-block-size: 0;min-inline-size: 0;overflow: auto;padding: var(--space-md)}.ui-splitter__handle{align-self: stretch;background: var(--panel-strong);border-block: 0;border-inline: 1px solid var(--line);cursor: col-resize;display: grid;min-inline-size: var(--splitter-handle);place-items: center;touch-action: none}.ui-splitter__handle::before{background: var(--line-strong);border-radius: var(--radius-pill);block-size: 2.5rem;content: "";inline-size: 2px}.ui-splitter__handle:hover::before,.ui-splitter__handle.is-active::before,.ui-splitter__handle[aria-valuenow]:focus-visible::before{background: var(--accent)}.ui-splitter__handle:focus-visible{outline: 2px solid var(--focus-ring);outline-offset: -2px}.ui-splitter--horizontal .ui-splitter__handle{border-block: 1px solid var(--line);border-inline: 0;cursor: row-resize;min-block-size: var(--splitter-handle);min-inline-size: 0}.ui-splitter--horizontal .ui-splitter__handle::before{block-size: 2px;inline-size: 2.5rem}@media (forced-colors: active){.ui-segmented-buttons__button[aria-pressed='true'],.ui-segmented-buttons__button.is-active{background: Highlight;border-color: Highlight;color: HighlightText}.ui-splitter__handle{border-color: CanvasText}.ui-splitter__handle::before{background: CanvasText}}}
@@ -1,6 +1,6 @@
1
1
  # 0004. Prune unused adapter and controlled-modal surfaces
2
2
 
3
- Status: accepted
3
+ Status: implemented in 0.10.0
4
4
 
5
5
  ## Context
6
6
 
@@ -32,3 +32,7 @@ interaction.
32
32
  - Existing adapter users have one full minor to migrate.
33
33
  - Package examples continue proving compatibility during 0.7.
34
34
  - A future adapter requires real adoption evidence, not catalog symmetry.
35
+
36
+ The removal is implemented in 0.10.0. See the
37
+ [0.10 migration](../migrations/0.9-to-0.10.md) for the replacement lifecycle
38
+ and native-dialog contracts.
@@ -0,0 +1,58 @@
1
+ # 0005. Productive tools and editorial reports
2
+
3
+ Status: accepted; applies from 0.10.0
4
+
5
+ ## Context
6
+
7
+ The shared CSS and evidence vocabulary serve several independently deployed
8
+ applications and static reports. The same display typography and nested
9
+ frames were applied to everyday controls, dense panels, and long documents.
10
+ Small headings and labels were difficult to distinguish, and a narrow
11
+ workbench could fit the browser width while leaving its preview too narrow to read.
12
+
13
+ The framework adapter and controlled-modal paths deprecated in 0.7 remained
14
+ unused in the inspected downstream applications. Maintaining them multiplied
15
+ types, examples, peers, and parity checks without improving those applications.
16
+
17
+ ## Decision
18
+
19
+ Keep CSS as the universal layer, with optional dependency-free vanilla
20
+ behaviors. Default to readable sans typography and sentence case for headings,
21
+ controls, and labels. Keep `Doto` through explicit display and glyph primitives.
22
+ Use tabular numbers and fixed-width type where the content benefits from them.
23
+
24
+ Treat tools and reports as two compositions of the same identity. Tool chrome
25
+ stays quiet and compact. Reports use a reading measure, larger screen prose,
26
+ an early decision, and a separate print treatment. These are CSS and authoring
27
+ recipes, not parallel themes or rendering frameworks.
28
+
29
+ Use available container width when composing an inspector. The host still owns
30
+ whether split panes stack, collapse, or switch. Supply a complete narrow-pane
31
+ recipe instead of silently changing every resize control’s behavior.
32
+
33
+ Remove the five framework adapter entrypoints and the controlled modal in
34
+ 0.10.0. Keep native dialog styling and behavior. Maintain packed examples for
35
+ the inspected consumer stacks and the CSS/report integration boundaries.
36
+ Applications may use specialist behavior libraries for complex controls and
37
+ style them with the shared tokens; the universal package does not wrap them.
38
+
39
+ A new public surface needs a demonstrated task and evidence that the proposed
40
+ composition improves it. A shipped hand-built duplicate is useful evidence,
41
+ not a prerequisite. Prototype freely and prefer a recipe when existing classes
42
+ can express the result. Adoption percentage and class count are not targets.
43
+
44
+ ## Consequences
45
+
46
+ The release changes visual defaults and removes deprecated imports. Consumers
47
+ must review complete screens and migrate together; see the
48
+ [0.10 migration](../migrations/0.9-to-0.10.md).
49
+
50
+ Keep packed import/type checks, generated-contract checks, accessibility,
51
+ behavior, and print verification. Remove only obligations associated with
52
+ retired surface. Compare a service overview, an inspector, and a decision
53
+ report before adding catalog. The examples prove compatibility; real consumer
54
+ upgrades prove the release's practical value.
55
+
56
+ The raw default-CSS budget is 100,000 bytes and the `gzip` budget is 18,000 bytes.
57
+ This deliberate headroom replaces a nearly full ceiling. Payload changes
58
+ remain measured and reviewed; specialist report/tooling leaves stay opt-in.
@@ -0,0 +1,92 @@
1
+ # 0006. Publish to npm without a stored credential
2
+
3
+ Status: accepted; applies from 0.10.0
4
+
5
+ ## Context
6
+
7
+ Releases authenticated to npm with a granular access token held in the
8
+ `NPM_TOKEN` secret of the protected `npm-publish` environment. The token was
9
+ created on 2026-05-30 with 2FA bypass, write access to `@ponchia/ui`, and an
10
+ expiry of 2026-08-28.
11
+
12
+ The v0.10.0 release exposed the cost of that design. Every gate passed —
13
+ validation, cross-engine end-to-end, packed examples, publish preflight — the
14
+ maintainer approved the protected environment, and the publish then failed
15
+ with `E404` on an existing package. `E404` reads as "no such package", so the
16
+ first hypothesis was package metadata. The real cause was that the token had
17
+ expired eleven days earlier. A read-only `whoami` request would have returned
18
+ `401` at any point in those eleven days, but nothing was asking.
19
+
20
+ Three properties of the old design combined into that outcome:
21
+
22
+ - The credential's validity was invisible until the most expensive moment in
23
+ the pipeline, after roughly twenty minutes of gates and a human approval.
24
+ - npm's failure mode misattributes an authentication problem to the package,
25
+ so the error text actively points investigation the wrong way.
26
+ - Expiry is silent. Nothing in the repository, the environment, or CI knew the
27
+ date; it lived only in a note beside the token in the password manager.
28
+
29
+ The approval gate did not and could not help. A required reviewer releases the
30
+ job; it does not check that the job can authenticate.
31
+
32
+ Two further constraints made "rotate the token and continue" unattractive.
33
+ From August 2026 npm forbids tokens with 2FA bypass from performing token
34
+ management, so a CI token can no longer mint or rotate its successor — every
35
+ renewal is a manual browser session with a second factor. And npm has stated
36
+ that direct token publishing will be reduced further, with trusted publishing
37
+ as the endorsed path.
38
+
39
+ Trusted publishing was previously assessed as unavailable to this estate: npm
40
+ supports it only on provider-hosted runners, and most repositories here run on
41
+ self-hosted `arc-vps-*` runners because GitHub-hosted minutes are billing
42
+ blocked. That assessment does not hold for this repository. `bronto-ui` is
43
+ public, so GitHub-hosted minutes are free, and the release workflow already
44
+ runs entirely on `ubuntu-latest`.
45
+
46
+ ## Decision
47
+
48
+ Publish by trusted publishing (OIDC). No npm credential is stored.
49
+
50
+ GitHub mints a short-lived token for the workflow run; npm exchanges it for a
51
+ publish credential scoped to that run. The publisher is registered on npmjs.com
52
+ against a four-part identity: the organization `Ponchia`, the repository
53
+ `bronto-ui`, the workflow filename `release.yml`, and the environment
54
+ `npm-publish`. All four must match or the exchange is refused.
55
+
56
+ Two conditions are enforced by `check:release` rather than left to review,
57
+ because both fail only at publish time:
58
+
59
+ - `publish-npm` raises the npm CLI past 11.5.1. Node 22 bundles npm 10.x,
60
+ which predates OIDC support and falls back to looking for a token.
61
+ - `publish-npm` references neither `NODE_AUTH_TOKEN` nor `secrets.NPM_TOKEN`.
62
+ A reintroduced token takes precedence over OIDC, which would quietly restore
63
+ the failure mode this decision removes.
64
+
65
+ ## Consequences
66
+
67
+ The expiry class of failure is gone: there is no long-lived credential, so
68
+ there is no date to miss and no rotation to schedule. The blast radius of a
69
+ compromised repository secret shrinks to nothing, because the secret does not
70
+ exist. Provenance is generated automatically instead of depending on a flag.
71
+
72
+ The identity is now positional, which is the cost. Renaming `release.yml`,
73
+ moving the publish to another environment, or transferring the repository
74
+ breaks publishing until the npm-side registration is updated — a rename that
75
+ is otherwise routine becomes a release-blocking change. The workflow header
76
+ and `docs/architecture.md` both say so at the point where someone would make
77
+ that edit.
78
+
79
+ Registration itself remains a browser action requiring the maintainer's second
80
+ factor. That is a one-time cost rather than a recurring one, which is the
81
+ whole point.
82
+
83
+ The `NPM_TOKEN` secret and its password-manager entry are retired after the
84
+ first successful trusted publish, not before, so the previous path stays
85
+ available if the exchange needs debugging.
86
+
87
+ Like every other ADR, this record ships in the package. `check:pack` enforces
88
+ that: the published documentation points into `docs/adr/`, so an ADR that
89
+ exists but is not in `files` leaves a consumer following that pointer at a
90
+ 404. The decision set is published whole or not at all — a release-mechanics
91
+ record is not carved out on the grounds that consumers are unlikely to want
92
+ it.
@@ -11,9 +11,9 @@ Status: accepted · 2026-05-15 · applies from v0.2.0
11
11
  > gates, opt-in colorways, data-viz, APCA advisory reporting, and the
12
12
  > OKLCH core accent ramp.
13
13
  > - [ADR-0004 — Prune unused adapter and controlled-modal surfaces](./adr/0004-prune-unused-adapters.md)
14
- > (accepted; deprecated in 0.7) — retain the package-only adapters and
15
- > controlled modal for one migration minor, then remove them unless a real
16
- > consumer supplies adoption evidence.
14
+ > (implemented in 0.10) — remove unadopted adapters and the controlled modal.
15
+ > - [ADR-0005 Productive tools and editorial reports](./adr/0005-productive-tools-and-editorial-reports.md)
16
+ > (accepted; 0.10) readable defaults, selective display identity, and task-led composition.
17
17
 
18
18
  ## Context
19
19
 
@@ -44,11 +44,6 @@ on top of the CSS, none of which require a framework commitment**:
44
44
  ├── annotations/ pure SVG callout geometry (builds on connectors) [optional]
45
45
  ├── glyphs/ dot-matrix glyph registry/renderers [optional]
46
46
  ├── schemas/ declarative JSON contracts for report/tooling data [optional]
47
- ├── react/ deprecated React hooks over behaviors [remove >=0.8]
48
- ├── solid/ deprecated Solid primitives over behaviors [remove >=0.8]
49
- ├── qwik/ deprecated Qwik hooks over behaviors [remove >=0.8]
50
- ├── svelte/ deprecated Svelte actions over behaviors [remove >=0.8]
51
- └── vue/ deprecated Vue directives over behaviors [remove >=0.8]
52
47
  ```
53
48
 
54
49
  ### Consequences of each layer
@@ -92,11 +87,6 @@ on top of the CSS, none of which require a framework commitment**:
92
87
  - **glyphs/** — static bitmap data and SSR-safe render helpers. The
93
88
  256-cell DOM renderers are for display and solid inline icons; the `.ui-icon`
94
89
  mask renderer is for dense icon-at-scale use.
95
- - **react/** / **solid/** / **qwik/** / **svelte/** / **vue/** — deprecated
96
- lifecycle adapters over `behaviors/`. They remain compatible for the complete
97
- 0.7 minor, then may be removed in 0.8 under ADR-0004. Ten real-consumer audits
98
- found no adapter imports; framework consumers already use the vanilla
99
- initializers in their own mount/cleanup lifecycle.
100
90
  - **`css/analytical.css` — the analytical roll-up.** This convenience file
101
91
  `@import`s exactly **nine** analytical figure/evidence leaves: `figure`,
102
92
  `annotations`, `legend`, `marks`, `connectors`, `spotlight`, `crosshair`,
@@ -111,8 +101,7 @@ on top of the CSS, none of which require a framework commitment**:
111
101
  `import '@ponchia/ui'` in Vite/Astro/SvelteKit). There is no runtime JS at
112
102
  the package root — Node/runtime JS imports of `.` are not supported. All JS
113
103
  entrypoints are explicit subpaths (`/behaviors`, `/classes`, `/tokens`,
114
- `/glyphs`, `/annotations`, `/connectors`, `/react`, `/solid`, `/qwik`,
115
- `/svelte`, `/vue`, `/skins`, `/charts`, `/mermaid`, `/d2`, `/vega`). This is
104
+ `/glyphs`, `/annotations`, `/connectors`, `/skins`, `/charts`, `/mermaid`, `/d2`, `/vega`). This is
116
105
  a permanent, intentional contract.
117
106
 
118
107
  ### Surface admission rule
@@ -140,7 +129,7 @@ registries, virtualized grids, or framework component APIs.
140
129
  The repo root mixes five kinds of directory that look alike but follow very
141
130
  different rules. Two distinctions matter most: several are **path-frozen
142
131
  published subpaths** — the directory name _is_ the public import specifier
143
- (`@ponchia/ui/react` resolves to `./react/`), so they cannot be moved or
132
+ (`@ponchia/ui/behaviors` resolves to `./behaviors/`), so they cannot be moved or
144
133
  renamed — and several are **generated** and must never be hand-edited (a
145
134
  generator overwrites them and a drift gate fails CI).
146
135
 
@@ -148,7 +137,7 @@ generator overwrites them and a drift gate fails CI).
148
137
  | --- | --- | --- | --- |
149
138
  | `css/` | source | yes | The framework. Most leaves are hand-authored `@layer bronto` CSS. The palette blocks in `css/tokens.css`, plus `css/skins.css` and `css/dataviz.css`, are generated. `css/generated.css` is authored trust-surface CSS despite its name. |
150
139
  | `tokens/index.js` | source | yes | The single source of truth for token **values** (`cssVars`). |
151
- | `classes/index.js`, `behaviors/`, `annotations/`, `connectors/`, `react/`, `solid/`, `qwik/`, `svelte/`, `vue/`, `glyphs/`, `shiki/` | source · published-subpath (path-frozen) | yes — but **do not move** | Authored ESM shipped as-is; the dir name is the public import path. The `.d.ts` beside them are generated/drift-checked: `connectors`/`annotations`/`react`/`solid`/`qwik`/`svelte`/`vue`/`behaviors` are emitted from JSDoc by `tsc` (`npm run dts:emit`), `classes`/`tokens`/`glyphs` from the runtime. No leaf `.d.ts` is hand-maintained. |
140
+ | `classes/index.js`, `behaviors/`, `annotations/`, `connectors/`, `glyphs/`, `shiki/` | source · published-subpath (path-frozen) | yes — but **do not move** | Authored ESM shipped as-is; the dir name is the public import path. The `.d.ts` beside them are generated/drift-checked: `connectors`/`annotations`/`behaviors` are emitted from JSDoc by `tsc` (`npm run dts:emit`), `classes`/`tokens`/`glyphs` from the runtime. No leaf `.d.ts` is hand-maintained. |
152
141
  | `schemas/*.schema.json` | source · published schema files (path-frozen) | yes — but **do not move exported files** | Declarative JSON Schema contracts for sidecars/tooling data. Each exported schema file path is public; the directory itself is not a wildcard import. No validator runtime ships. |
153
142
  | `dist/` | generated | no | Build of `css/` (`npm run dist:build`); byte-checked by `check:dist`. |
154
143
  | `tokens/index.json`, `tokens/resolved.json`, `tokens/tokens.dtcg.json`, `tokens/figma.variables.json`, `tokens/charts.json`, `classes/index.d.ts`, `tokens/index.d.ts`, `tokens/{skins,charts}.d.ts`, `glyphs/glyphs.d.ts`, `classes/vscode.css-custom-data.json`, `docs/reference.md` | generated | no | Committed build artifacts; regenerate with `npm run prepack`, never hand-edit. Drift-checked in `npm run check`. |
@@ -184,7 +173,7 @@ are copied into consumer reports.
184
173
  | exports / import graph / source CSS `layer(bronto)` imports / layered-vs-unlayered CSS target map / `files` consistent | `check-exports.mjs` |
185
174
  | pure generated mirrors fresh — `tokens.css`/`index.json`, `dtcg.json`, `resolved.json`, `figma.variables.json`, `classes`/`tokens` `.d.ts`, `reference.md`, vscode data — each byte-equal to its generator (registry: `scripts/lib/artifacts.mjs`) | `check-fresh.mjs` |
186
175
  | `classes` `cls` ⇄ `.ui-*` selectors | `check-classes.mjs` |
187
- | `connectors`/`annotations`/`react`/`solid`/`qwik`/`svelte`/`vue`/`behaviors` `.d.ts` (+ maps) == fresh `tsc` emit of their JSDoc | `check-dts-emit.mjs` |
176
+ | `connectors`/`annotations`/`behaviors` `.d.ts` (+ maps) == fresh `tsc` emit of their JSDoc | `check-dts-emit.mjs` |
188
177
  | legend swatch colours ⊆ `charts.js` · opt-in | `check-legend.mjs` |
189
178
  | color tokens tiered · no raw chromatic color in components | `check-color-policy.mjs` |
190
179
  | `css/skins.css` ⇄ `tokens/skins.js` · colorways opt-in | `check-skins.mjs` |
@@ -193,14 +182,13 @@ are copied into consumer reports.
193
182
  | `shiki/nothing.json` valid + on rationed palette | `check-shiki.mjs` |
194
183
  | `dist/*.css` == fresh single-`@layer bronto` build of `css/` + budget | `check-dist.mjs` |
195
184
  | published tarball == intended `files` only | `check-pack.mjs` |
196
- | packed core JS/JSON public subpaths import without optional framework peers, packed JS named exports exactly match source modules, peer-backed adapters import after peers are linked, concrete CSS/doc/font subpaths resolve, and packed behavior initializers/toast no-op in a clean consumer with no DOM globals | `check-consumer-surface.mjs` |
185
+ | packed JS/JSON public subpaths import without framework peers, packed JS named exports exactly match source modules, concrete CSS/doc/font subpaths resolve, and packed behavior initializers/toast no-op in a clean consumer with no DOM globals | `check-consumer-surface.mjs` |
197
186
  | packed typed public subpaths compile through package exports in a clean TypeScript consumer | `check-consumer-types.mjs` |
198
187
  | function-level cyclomatic complexity stays ≤12 and function NLOC stays within budget, with no per-function exception list | `check-complexity.mjs` |
199
188
  | GitHub Actions workflow syntax and embedded shell snippets lint | `check:workflows` (`github-actionlint`) |
200
189
  | every shipped CSS leaf is classified as foundation or has explicit docs/demo/e2e ownership | `check-component-matrix.mjs` |
201
190
  | every public behavior export has explicit docs, unit-test, and browser-test ownership | `check-behavior-matrix.mjs` |
202
191
  | every public helper export in `classes`/`annotations`/`connectors`/`glyphs` has explicit docs, unit-test, and type-test ownership | `check-helper-matrix.mjs` |
203
- | every delegated behavior has React/Solid/Qwik hook, Svelte action, Vue directive, docs, example, unit, and type ownership | `check-binding-matrix.mjs` |
204
192
  | `@playwright/test` version ⇄ pinned Playwright container image ⇄ visual workflows/docs/local runner | `check-playwright-container.mjs` |
205
193
  | every shipped JSON schema is exported, documented, validates its public cookbook example, and rejects malformed sidecars | `check-schemas.mjs` |
206
194
  | packed public text contains no private terms, local paths, or secret-looking assignments | `check-public-hygiene.mjs` |
@@ -263,7 +251,13 @@ pointer:
263
251
  with provenance. Runs in the `npm-publish` **Environment**
264
252
  (required-reviewer protection), so after the gates and preflight pass the run
265
253
  pauses for a manual approval in the Actions UI before anything reaches npm —
266
- a guard against an accidental tag push publishing. Dist-tag is derived from
254
+ a guard against an accidental tag push publishing. Authentication is
255
+ **trusted publishing (OIDC)**: no npm token is stored anywhere, and the
256
+ credential npm mints is short-lived and bound to this repository, this
257
+ workflow filename, and this environment
258
+ ([ADR-0006](./adr/0006-trusted-publishing.md)). Renaming `release.yml` or
259
+ moving the publish to another environment breaks publishing until the
260
+ npm-side registration is updated. Dist-tag is derived from
267
261
  the tag: stable (`v0.4.0`) → `latest`; SemVer prerelease (`v0.4.0-rc.1`, any
268
262
  hyphenated identifier) → `next`, so the default `npm i @ponchia/ui` never
269
263
  moves onto an unstable build (opt in with `@ponchia/ui@next`). Post-publish
@@ -321,8 +315,7 @@ explained, not surprising.
321
315
  - Run `npm pack --dry-run --json` locally or from CI logs and confirm the
322
316
  intended file count/payload.
323
317
  - Build the packed examples matrix from the tarball, not a workspace link:
324
- `npm run test:examples` covers vanilla, Astro, SvelteKit, Vue, React, Solid,
325
- Qwik, Tailwind, and report-static, with Chromium browser smokes for runtime
318
+ `npm run test:examples` covers vanilla, Astro, SvelteKit, React, Tailwind, and report-static, with Chromium browser smokes for runtime
326
319
  examples. For a deeper consumer pass, `npm run test:examples:cross-browser`
327
320
  runs the same packed smokes in Chromium, Firefox, and WebKit; manual CI
328
321
  dispatches pass the same cross-browser flag to the reusable examples workflow.
package/docs/command.md CHANGED
@@ -34,8 +34,7 @@ stable ids, roles, `aria-controls`, `aria-expanded`,
34
34
  `aria-activedescendant`, keyboard navigation, filtering, selection, and close
35
35
  behavior. Do not bind both owners to the same palette.
36
36
 
37
- The framework adapter subpaths remain compatible in 0.7 but are deprecated for
38
- removal no earlier than 0.8. Prefer direct `initCommand()` lifecycle cleanup for
37
+ The framework adapter subpaths were removed in 0.10. Use direct `initCommand()` lifecycle cleanup for
39
38
  a DOM-authored list, or controlled host mode when the framework owns the widget.
40
39
 
41
40
  ## Markup
@@ -0,0 +1,110 @@
1
+ # Compose a tool or report
2
+
3
+ Start with the task and its important state. Use the catalog to find a part,
4
+ not to decide how many parts a page should contain.
5
+
6
+ ## Service overview
7
+
8
+ Load the core CSS and the opt-in state leaf. Use `ui-app-shell` for navigation,
9
+ `ui-app-topbar` for the page title and primary action, and `ui-app-content` for
10
+ the current state and work queue. Panels group content without adding another
11
+ frame around every metric and table.
12
+
13
+ ```css
14
+ @import '@ponchia/ui';
15
+ @import '@ponchia/ui/css/state.css';
16
+ ```
17
+
18
+ Use sentence-case labels. Keep the main action distinguishable from destructive
19
+ actions through wording and placement. Use `ui-delta--invert` when a decrease
20
+ is favorable, such as queue delay. Unknown, stale, and failed are distinct
21
+ states; do not present missing observations as success.
22
+
23
+ The complete specimen is [service.html](https://ponchia.github.io/bronto-ui/demo/service.html). On a phone,
24
+ navigation wraps and the compact metrics leave room for the work queue.
25
+ Check the main action, every navigation destination, and a long account name
26
+ at 360px and with a coarse pointer. A data table may scroll in its own region.
27
+
28
+ ## Inspector and workbench
29
+
30
+ Load `workbench.css` beside core. An inspector supplies its own container
31
+ boundary: property rows stack below 20rem of available inline size, including
32
+ inside a narrow panel on a wide desktop.
33
+
34
+ ```html
35
+ <aside class="ui-inspector" aria-label="Selected job">
36
+ <header class="ui-inspector__head"><h2>Job settings</h2></header>
37
+ <div class="ui-inspector__body">
38
+ <div class="ui-property">
39
+ <label class="ui-property__label" for="retry-count">Retry limit</label>
40
+ <div class="ui-property__value">
41
+ <input class="ui-input" id="retry-count" type="number" value="3" />
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </aside>
46
+ ```
47
+
48
+ A splitter does not choose a product's collapse policy. The
49
+ [workbench specimen](https://ponchia.github.io/bronto-ui/demo/workbench.html) stacks its two panes below 42rem
50
+ of container width and hides the inactive resize handle and resize controls.
51
+ Both panes remain available. A tool that needs a pane switch instead should
52
+ keep that policy in its own component.
53
+
54
+ Keep a badge inside a `ui-row__meta` wrapper rather than applying both classes
55
+ to the same element: the wrapper owns layout and the badge owns its tone.
56
+
57
+ Use `ui-chip--dense` for static labels inside short pane headers. Dense chips
58
+ on buttons, links, or button roles retain pointer target floors. Use regular
59
+ buttons for actions; a colored chip is not an action registry.
60
+
61
+ Test the resize control’s keyboard and pointer paths at wide sizes, then verify
62
+ that the narrow layout has no hidden keyboard-reachable resize control and both panes
63
+ have a useful reading width. Test the inspector inside a 280px parent while
64
+ the browser itself is wide.
65
+
66
+ ## Decision report
67
+
68
+ Use the core stylesheet plus `report-kit.css` for a standalone HTML report.
69
+ Use real asset URLs in HTML; package specifiers resolve only in build tools.
70
+
71
+ ```html
72
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.10.0/dist/bronto.css" />
73
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.10.0/dist/css/report-kit.css" />
74
+ <article class="ui-report">
75
+ <header class="ui-report__cover ui-report__cover--compact">
76
+ <h1 class="ui-report__title">Keep the current configuration</h1>
77
+ <p class="ui-report__subtitle">Queue delay improved; verify the next scheduled run.</p>
78
+ </header>
79
+ <section class="ui-report__section" aria-labelledby="decision-title">
80
+ <h2 class="ui-report__section-head" id="decision-title">Decision and basis</h2>
81
+ <p>The completed runs support keeping the change. The next batch remains unobserved.</p>
82
+ </section>
83
+ <details class="ui-report__toc ui-screen-only">
84
+ <summary>Contents and evidence</summary>
85
+ <ol><li><a href="#decision-title">Decision and basis</a></li></ol>
86
+ </details>
87
+ </article>
88
+ ```
89
+
90
+ Screen prose is 1.125rem with a 68ch maximum reading measure; the report can
91
+ still contain wider figures and evidence tables. Print uses 11pt ink-on-white
92
+ text. Use the `--report-measure` and `--report-width` hooks deliberately.
93
+ Do not apply `ui-display` to every report heading.
94
+
95
+ The [standalone specimen](https://ponchia.github.io/bronto-ui/demo/report-standalone.html) keeps its decision
96
+ before collapsed navigation. Verify the recommendation and its source are
97
+ findable, the text remains readable at narrow widths, and the PDF retains
98
+ claims, captions, and evidence across page boundaries.
99
+
100
+ ## Display identity
101
+
102
+ `ui-display`, dot glyphs, and readouts preserve the expressive identity.
103
+ Use them for a short hero title or deliberate display moment. Ordinary `h1`
104
+ through `h4`, prose, labels, and controls use sans typography. Fixed-width type is for
105
+ code, identifiers, and aligned data; a whole page does not need to be mono to
106
+ look technical.
107
+
108
+ Use one dominant action per local task. Separate navigation, action, severity,
109
+ and evidence status semantically even when they share a color family. Test
110
+ light and dark together, and keep keyboard focus and reduced motion visible.
@@ -185,8 +185,7 @@ a consumer needs it.
185
185
  The keyboard-hint primitive (`.ui-shortcut` + `.ui-shortcut__sep` over `.ui-kbd`,
186
186
  core chrome) landed first, then the `ui-command` palette: the
187
187
  `@ponchia/ui/css/command.css` shell + the `initCommand` `data-bronto-command`
188
- behavior (filter, roving focus, `bronto:command:select`/`close`) + `useCommand`
189
- bindings. The host still owns the action registry and execution — Bronto only
188
+ behavior (filter, roving focus, `bronto:command:select`/`close`). The host still owns the action registry and execution — Bronto only
190
189
  filters and navigates.
191
190
 
192
191
  Why it matters: command palettes turn a product from a page collection into a
@@ -0,0 +1,66 @@
1
+ # Migrating 0.8 to 0.9
2
+
3
+ Machine-readable migration graph: [`MIGRATIONS.json`](../../MIGRATIONS.json).
4
+
5
+ One required change, and it is a one-word addition.
6
+
7
+ ## 1. Add `ui-menu--dropdown` to your menus
8
+
9
+ `.ui-menu` used to weld its placement into the surface: `position: absolute`
10
+ plus an offset relative to its trigger. That made the class unusable for a menu
11
+ opened at a POINT — a canvas context menu, a long-press sheet — so a consumer
12
+ with one re-declared the panel, border, radius and shadow just to get a surface.
13
+
14
+ Placement is now opted into:
15
+
16
+ ```diff
17
+ <details class="ui-menu-host" data-bronto-menu>
18
+ <summary class="ui-button ui-button--subtle">Menu</summary>
19
+ - <div class="ui-menu">
20
+ + <div class="ui-menu ui-menu--dropdown">
21
+ ```
22
+
23
+ Without the modifier the surface renders in normal flow. Nothing else changed:
24
+ `--dropdown` carries exactly the declarations that used to be unconditional.
25
+
26
+ For a menu you position yourself, use `ui-menu--at-pointer` and set `left`/`top`
27
+ (or the logical equivalents) from the host — Bronto only takes it out of flow
28
+ and gives it the popover layer.
29
+
30
+ ## 2. Optional: adopt `ui-row`
31
+
32
+ New in the default bundle, so it costs nothing to try. If you have a list of
33
+ selectable lines that is not a table and not a menu — search results, an
34
+ explorer, an outline, backlinks, commits — that is `ui-row`:
35
+
36
+ ```html
37
+ <button class="ui-row ui-row--ruled" type="button" aria-selected="true">
38
+ <span class="ui-row__mark" aria-hidden="true">◆</span>
39
+ <span class="ui-row__title">apps/server/src/collab/room.ts</span>
40
+ <span class="ui-row__meta">4m</span>
41
+ </button>
42
+ ```
43
+
44
+ `__title` truncates; `__meta` does not. Selection reads `aria-selected` or
45
+ `aria-current`, so the visual state cannot disagree with what a screen reader
46
+ announces. Rows carrying a severity want `ui-severity-row` instead.
47
+
48
+ `ui-menu__item` composes it, so menu items and rows cannot drift apart.
49
+
50
+ ## 3. Know what `data-density` actually does
51
+
52
+ No change in behaviour — a correction to what the docs claimed. The preset
53
+ re-points the `--space-*` scale, so it moves the ~40 components whose padding is
54
+ expressed in that scale and **none** of the rest. `ui-alert` and
55
+ `ui-menu__item` are the two most likely to surprise you.
56
+
57
+ The others carry tuned pairs like `0.5rem 0.55rem` that a seven-step scale
58
+ cannot express; flattening them would change the default rendering everyone
59
+ uses. If you need a denser variant of a component that does not respond,
60
+ override its padding — and if you do that repeatedly for the same component,
61
+ report it, because that is evidence for a real `--dense` modifier.
62
+
63
+ ## Nothing else changed
64
+
65
+ No class was removed or renamed. `bronto-ui-check` will not report anything new
66
+ for a 0.8-clean consumer.
@@ -0,0 +1,47 @@
1
+ # Upgrade from 0.9 to 0.10
2
+
3
+ 0.10 changes visual defaults and removes the adapter and controlled-modal
4
+ paths deprecated in 0.7. The structured changes are in
5
+ [`MIGRATIONS.json`](../../MIGRATIONS.json).
6
+
7
+ ## Update imports and modal ownership
8
+
9
+ Remove imports from `@ponchia/ui/react`, `/solid`, `/qwik`, `/svelte`, and
10
+ `/vue`. Import class names from `@ponchia/ui/classes` and initialization functions from
11
+ `@ponchia/ui/behaviors`. Call each initialization function after the DOM root exists and
12
+ call its cleanup on component removal. The [integration guide](https://github.com/Ponchia/bronto-ui/blob/main/docs/integration.md) links
13
+ the host lifecycle recipes.
14
+
15
+ Replace `initModal`, `ModalCloseDetail`, and `@ponchia/ui/behaviors/modal` with
16
+ native `<dialog>` and `initDialog`. Remove `data-bronto-modal` and the
17
+ `ui.modal({ open: true })` option. Open with `showModal()` and close with
18
+ `close()` or the existing `data-bronto-open` / `data-bronto-close` triggers.
19
+ Use the native `cancel` and `close` events instead of `bronto:modal:close`.
20
+ The `ui-modal` and drawer classes remain; `.is-open` no longer opens them.
21
+
22
+ ## Review complete screens
23
+
24
+ - The root respects the browser's default size: 16px at the usual setting.
25
+ The small text steps are 12px, 13px, and 14px rather than approximately
26
+ 10.8px, 11.4px, and 12.9px.
27
+ - Headings and controls use sans and sentence case. Keep an intentional
28
+ display title by applying `ui-display`, not by restyling every heading.
29
+ - Service panels lose redundant frames, metrics stay compact, and narrow
30
+ navigation wraps. Remove consumer overrides that recreated those fixes.
31
+ - Reports use larger screen prose, a reading measure, and 11pt print text.
32
+ Prefer a decision before navigation; a `details.ui-report__toc` can collapse
33
+ its contents without JavaScript. A `nav.ui-report__toc` remains expanded.
34
+ - Inspectors adapt property rows to their own width. Splitter collapse policy
35
+ remains host-owned; use the [composition recipe](../compositions.md).
36
+
37
+ Check your real content at narrow, laptop, and desktop sizes, in both themes,
38
+ with keyboard and touch input. Review print output for reports. Upgrade from
39
+ the packed candidate before changing production version pins.
40
+
41
+ ## Retained and new surface
42
+
43
+ Core CSS, class recipes, vanilla behaviors, tokens, report and analytical
44
+ leaves remain framework-neutral. `ui-timestrip` and `ui-severity-tone`,
45
+ previously unreleased on main, are included. `ui-chip--dense` replaces repeated
46
+ static-label height overrides. Specialist behavior libraries may live in a
47
+ consumer; the core still has no runtime or peer dependencies.