/* Shared controls: opt in per screen/dialog; keep combat, artwork and hold handlers independent. */
:root {
  --ga-font-page: 1.125rem;
  --ga-font-section: .9375rem;
  --ga-font-body: .875rem;
  --ga-font-control: .875rem;
  --ga-font-note: .75rem;
  --ga-font-caption: .6875rem;
  --ga-font-item-name: .8125rem;
  --ga-space-1: 4px;
  --ga-space-2: 8px;
  --ga-space-3: 12px;
  --ga-space-4: 16px;
  --ga-space-6: 24px;
  --ga-touch: 44px;
  --ga-action-height: 48px;
  --ga-hold-height: 52px;
  --ga-radius-control: 3px;
  --ga-radius-choice: 2px;
  --ga-radius-panel: 4px;
  --ga-control-border: color-mix(in srgb, var(--line), var(--muted) 22%);
  --ga-control-bg: linear-gradient(180deg, var(--surface-2), var(--surface));
  --ga-control-shadow: inset 0 1px rgb(255 245 207 / 8%), inset 0 -2px rgb(0 0 0 / 22%), 0 2px 0 rgb(0 0 0 / 28%);
  --ga-action-bg: radial-gradient(ellipse at 50% 0, rgb(255 225 147 / 19%), transparent 75%), linear-gradient(180deg, var(--primary-hover), var(--primary-bg) 55%, color-mix(in srgb, var(--primary-bg), #000 18%));
  --ga-action-shadow: inset 0 1px rgb(255 242 187 / 42%), inset 0 -2px rgb(29 19 7 / 40%), 0 3px 0 rgb(29 19 7 / 58%), 0 5px 12px rgb(0 0 0 / 22%);
}

.ga-ui { font-size: var(--ga-font-body); line-height: 1.65; }
.ga-ui :is(button, input, select, textarea) { font-family: inherit; }
.ga-ui :is(.primary-button, .secondary-button, .danger-button, .text-button) {
  min-height: var(--ga-touch); padding: var(--ga-space-2) var(--ga-space-3);
  border-radius: var(--ga-radius-control); font-size: var(--ga-font-control);
  font-weight: 600; line-height: 1.45; text-decoration: none; overflow-wrap: anywhere;
}
.ga-ui .secondary-button {
  border: 1px solid var(--ga-control-border); background: var(--ga-control-bg);
  color: var(--text); box-shadow: var(--ga-control-shadow);
}
.ga-ui .primary-button {
  min-height: var(--ga-action-height); border: 1px solid var(--primary-border);
  background: var(--ga-action-bg); color: var(--primary-text);
  box-shadow: var(--ga-action-shadow); font-weight: 700;
  text-shadow: 0 1px 2px rgb(0 0 0 / 35%);
}
.ga-ui .text-button { color: var(--muted); background: transparent; box-shadow: none; }
.ga-ui .danger-button {
  border: 1px solid color-mix(in srgb, var(--red), var(--line) 40%);
  background: linear-gradient(180deg, color-mix(in srgb, var(--red), var(--surface) 82%), var(--surface));
  color: var(--red); box-shadow: var(--ga-control-shadow);
}
.ga-ui :is(.primary-button, .secondary-button, .danger-button):disabled { opacity: .5; cursor: not-allowed; }
.ga-ui :is(button, input, select, textarea, summary):focus-visible {
  outline: 2px solid var(--gold-strong); outline-offset: 2px;
}
.ga-ui :is(input:not([type="checkbox"]):not([type="radio"]), select, textarea) {
  min-width: 0; min-height: var(--ga-touch); border-radius: var(--ga-radius-choice);
  color: var(--text); font-size: max(16px, 1rem); line-height: 1.5;
}
.ga-ui select { padding: var(--ga-space-2) var(--ga-space-3); border: 1px solid var(--ga-control-border); background-color: var(--input); }
.ga-ui :is(.orb-command-trigger, .character-combat-option, .combat-role-choice) {
  min-height: var(--ga-action-height); border-color: var(--ga-control-border);
  border-radius: var(--ga-radius-control); background: var(--ga-control-bg);
  color: var(--text); box-shadow: var(--ga-control-shadow);
}
.ga-ui :is(.orb-category-button, .orb-purpose-button, .character-theme-option) {
  min-height: var(--ga-touch); border-color: var(--ga-control-border);
  border-radius: var(--ga-radius-choice); background: var(--ga-control-bg);
  color: var(--muted); box-shadow: inset 0 1px rgb(var(--ga-highlight-rgb, 255 245 207) / 5%);
}
.ga-ui :is(.orb-category-button, .orb-purpose-button, .character-combat-option, .combat-role-choice)[aria-pressed="true"] {
  border-color: var(--selected-border); color: var(--selected-text);
  background: linear-gradient(145deg, color-mix(in srgb, var(--selected-start), var(--surface) 45%), var(--surface));
  box-shadow: inset 0 1px rgb(var(--ga-highlight-rgb, 255 225 147) / 16%), inset 0 0 0 1px rgb(var(--accent-rgb) / 12%);
}

/* Existing card and dialog layouts remain intact; only semantic text roles share a scale. */
.ga-ui :is(.orb-person-copy h2, .orb-picker-heading h2, .party-settings-dialog-heading h2) { font-size: var(--ga-font-page); line-height: 1.4; }
.ga-ui :is(.orb-section-heading h2, .orb-combat-buttons legend, .party-settings-section-heading strong) { font-size: var(--ga-font-section); line-height: 1.5; }
.ga-ui :is(.orb-picker-item-title strong, .orb-command-copy strong, .character-combat-option strong, .combat-role-choice > span strong) { font-size: var(--ga-font-control); line-height: 1.45; }
.ga-ui :is(.orb-slot strong, .orb-member-tabs strong, .orb-category-button strong, .orb-purpose-button) { font-size: var(--ga-font-note); line-height: 1.45; }
.ga-ui :is(.orb-picker-item-description, .orb-command-copy > span, .character-combat-option small, .combat-role-choice > span small, .orb-cost-note, .orb-drag-help, .orb-picker-footer > p, .orb-review-footer > p, .orb-review-loss strong, .party-settings-heading-copy > p, .party-blessing-card p) { font-size: var(--ga-font-note); line-height: 1.65; }
.ga-ui :is(.orb-picker-heading p, .orb-picker-item-meta, .orb-command-copy small, .orb-category-button small, .orb-purpose-button small, .orb-slot small, .orb-command-number, .orb-picker-list-heading > span, .orb-picker-list-heading > small) { font-size: var(--ga-font-caption); line-height: 1.5; }
.ga-ui :is(.orb-picker-close, .party-settings-close) { min-width: var(--ga-touch); min-height: var(--ga-touch); }
.ga-ui .orb-actions { gap: var(--ga-space-2); }
.ga-ui .orb-command-grid { gap: var(--ga-space-2); }
.ga-ui .orb-command-trigger { padding: var(--ga-space-2); }
.ga-ui .orb-review-footer button { font-size: var(--ga-font-control); }
.ga-ui .orb-review-footer .primary-button { background: var(--ga-action-bg); box-shadow: var(--ga-action-shadow); }
.ga-ui .character-settings-current-copy strong { font-size: var(--ga-font-section); white-space: normal; overflow: visible; overflow-wrap: anywhere; text-overflow: clip; }
.ga-ui .character-settings-current-copy :is(small, em) { font-size: var(--ga-font-caption); }
.ga-ui.party-settings-dialog .character-settings-current > .character-settings-change { min-height: var(--ga-touch); font-size: var(--ga-font-note); }
.ga-ui .party-settings-jump-nav button { min-height: var(--ga-touch); }
.ga-ui .party-settings-jump-nav span { font-size: var(--ga-font-note); }
.ga-ui :is(.party-settings-jump-nav small, .party-settings-section-heading > em, .party-inline-roles-heading > em) { font-size: var(--ga-font-caption); }
.ga-ui .character-combat-option { grid-template-columns: minmax(0, 1fr) 20px; padding: var(--ga-space-3); }
.ga-ui .character-combat-option > i { display: grid; width: 20px; height: 20px; padding: 0; place-items: center; border-radius: 50%; color: var(--selected-text); font-size: 0; }
.ga-ui .character-combat-option > i::after { content: "✓"; font-size: var(--ga-font-note); }
.ga-ui .party-role-stat-grid { grid-template-columns: repeat(auto-fit, minmax(min(100%, 112px), 1fr)); gap: var(--ga-space-2); }
.ga-ui .party-role-stat strong { font-size: var(--ga-font-control); white-space: normal; overflow: visible; overflow-wrap: anywhere; text-overflow: clip; }
.ga-ui .party-role-stat small { font-size: var(--ga-font-caption); white-space: normal; overflow: visible; text-overflow: clip; }
.ga-ui .party-role-status-heading > small { font-size: var(--ga-font-caption); }
@media (hover: hover) {
  .ga-ui :is(.primary-button, .secondary-button):hover:not(:disabled) { border-color: var(--gold-strong); }
}
@media (prefers-reduced-motion: reduce) {
  .ga-ui :is(button, input, select, textarea) { transition: none; }
}

/* Utility rollout: explicit page/dialog opt-ins. Portrait stages and battle HUD keep their own geometry. */
.ga-ui .equipment-equip-button {
  min-height: var(--ga-action-height); padding: var(--ga-space-2) var(--ga-space-3);
  border: 1px solid var(--primary-border); border-radius: var(--ga-radius-control);
  background: var(--ga-action-bg); color: var(--primary-text); box-shadow: var(--ga-action-shadow);
  font-size: var(--ga-font-control); font-weight: 700; line-height: 1.45;
}
.ga-ui .equipment-equip-button:disabled { opacity: .5; cursor: not-allowed; }
.ga-ui .primary-button.tavern-danger {
  border-color: color-mix(in srgb, var(--red), var(--line) 40%);
  background: linear-gradient(180deg, color-mix(in srgb, var(--red), var(--surface) 82%), var(--surface));
  color: var(--red); box-shadow: var(--ga-control-shadow);
}
.ga-ui .text-button.tavern-delete { color: var(--red); }
.ga-ui.page-layout .page-heading .page-heading-copy h1,
.ga-ui:is([role="dialog"]) > h2,
.ga-ui :is(.inventory-filter-heading, .equip-compare-header, .sale-heading, .character-picker-dialog-heading) h2 {
  font-size: var(--ga-font-page); line-height: 1.4; overflow-wrap: anywhere;
}
.ga-ui :is(.section-heading h2, .section-heading h3, .arcane-section-heading h2, .equipment-board-heading strong, .equipment-accordion-heading strong,
  .settings-section-heading h3, .utility-section-heading h3, .formation-roster-heading h3,
  .items-category-heading strong, .menu-category h2, .library-heading h2) {
  font-size: var(--ga-font-section); line-height: 1.5;
}
.ga-ui.page-layout .page-heading .page-heading-copy p,
.ga-ui.page-layout :is(.setting-copy > span, .setting-copy > small, .setting-copy > p),
.ga-ui :is(.page-heading-copy p, .settings-intro, .setting-row-description, .setting-description,
  .combat-role-intro, .library-result-count, .library-empty, .inventory-result-count,
  .list-result-summary, .equipment-accordion-summary, .inventory-item-copy p,
  .workshop-slot-meter, .equipment-empty-note, .equipment-effect-copy p) {
  font-size: var(--ga-font-note); line-height: 1.65;
}
.ga-ui :is(.equipment-gear-name, .hero-equipped-list dd, .inventory-item-copy strong,
  .combat-role-member-name, .party-team-picker-trigger, .setting-copy > strong, .setting-row-label, .setting-label) {
  font-size: var(--ga-font-control); line-height: 1.5;
}
.ga-ui :is(.setting-choices button, .library-type-tabs button, .library-status-filters button,
  .catalog-view-tabs button, .grimoire-shelf-tabs button, .party-team-tabs button,
  .companion-help-tabs button, .traversal-ranking-tabs button, .inventory-filter-trigger,
  .inventory-filter-option, .party-team-picker-trigger) {
  min-width: 0; min-height: var(--ga-touch); padding: var(--ga-space-2) var(--ga-space-3);
  border: 1px solid var(--ga-control-border); border-radius: var(--ga-radius-choice);
  background: var(--ga-control-bg); color: var(--text); font-size: var(--ga-font-control);
  line-height: 1.45; box-shadow: inset 0 1px rgb(var(--ga-highlight-rgb, 255 245 207) / 5%);
}
.ga-ui :is(.setting-choices button, .library-type-tabs button, .library-status-filters button,
  .catalog-view-tabs button, .grimoire-shelf-tabs button, .party-team-tabs button,
  .companion-help-tabs button, .traversal-ranking-tabs button, .inventory-filter-option):is([aria-pressed="true"], [aria-selected="true"]) {
  border-color: var(--selected-border); color: var(--selected-text);
  background: linear-gradient(145deg, color-mix(in srgb, var(--selected-start), var(--surface) 45%), var(--surface));
  box-shadow: inset 0 1px rgb(var(--ga-highlight-rgb, 255 225 147) / 16%), inset 0 0 0 1px rgb(var(--accent-rgb) / 12%);
}
.ga-ui :is(.inventory-filter-close, .equip-compare-close, .sale-close, .character-picker-close,
  .party-team-picker-close, .build-preset-icon-close, .command-picker-close, .dialog-close-button) {
  min-width: var(--ga-touch); min-height: var(--ga-touch); font-size: var(--ga-font-page);
}
.ga-ui :is(.inventory-filter-trigger > strong, .equipment-accordion-heading strong,
  .hero-equipped-list dd, .equipment-gear-name, .equipment-gear-fixed-name b,
  .combat-role-member-name, .party-team-picker-trigger > span, .formation-member-copy strong) {
  min-width: 0; white-space: normal; overflow: visible; text-overflow: clip; overflow-wrap: anywhere;
}
.ga-ui .equipment-gear-stats { grid-template-columns: minmax(0, 1fr); }
.ga-ui .equipment-gear-stats > span { min-width: 0; flex-wrap: wrap; }
.ga-ui .equipment-gear-stats b { white-space: normal; overflow-wrap: anywhere; font-size: var(--ga-font-control); }
.ga-ui .equipment-gear-stats > span > span { font-size: var(--ga-font-caption); }
.ga-ui .equipment-party-identity { grid-template-columns: minmax(0, 1fr); width: max-content; }
.ga-ui .equipment-party-identity strong { white-space: normal; overflow: visible; overflow-wrap: anywhere; font-size: var(--ga-font-control); line-height: 1.4; }
.ga-ui .equipment-party-identity .home-party-role { font-size: var(--ga-font-caption); }
.ga-ui .setting-choices { grid-auto-columns: minmax(0, 1fr); }
.ga-ui .setting-choices button { white-space: normal; overflow-wrap: anywhere; }
.ga-ui .inventory-control-deck .inventory-filter-trigger { min-height: var(--ga-touch); padding: var(--ga-space-2); }
.ga-ui .inventory-control-deck .inventory-filter-trigger > strong { font-size: var(--ga-font-note); }
.ga-ui .combat-role-members > button { height: auto; min-height: 128px; }
.ga-ui .hero-equipped-list dd { margin: 0; }
.ga-ui .sale-grade-filter { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: var(--ga-space-2); font-size: var(--ga-font-note); }
.ga-ui .sale-grade-filter > span { color: var(--muted); }
.ga-ui .sale-grade-picker { position: relative; }
.ga-ui .sale-grade-trigger {
  display: flex; align-items: center; justify-content: space-between; gap: var(--ga-space-2);
  min-height: var(--ga-action-height); padding: var(--ga-space-2);
  border: 1px solid var(--ga-control-border); border-radius: var(--ga-radius-choice);
  background: var(--ga-control-bg); color: var(--text); font-size: var(--ga-font-control);
  cursor: pointer; list-style: none;
}
.ga-ui .sale-grade-trigger::-webkit-details-marker { display: none; }
.ga-ui .sale-grade-trigger i { font-style: normal; }
.ga-ui .sale-grade-picker[open] .sale-grade-trigger i { transform: rotate(180deg); }
.ga-ui .sale-grade-options {
  position: absolute; z-index: 2; top: 100%; right: 0; left: 0;
  display: grid; grid-template-columns: repeat(auto-fit, minmax(64px, 1fr)); gap: var(--ga-space-1);
  max-height: min(30dvh, 220px); margin-top: var(--ga-space-1); padding: var(--ga-space-1);
  border: 1px solid var(--line); background: var(--inset); overflow-y: auto; overscroll-behavior: contain;
  box-shadow: var(--ga-control-shadow);
}
.ga-ui .sale-grade-options button {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  min-height: var(--ga-touch); padding: var(--ga-space-1); border: 1px solid var(--ga-control-border);
  border-radius: var(--ga-radius-choice); background: var(--ga-control-bg); color: var(--text);
  font-size: var(--ga-font-note); font-variant-numeric: tabular-nums;
}
.ga-ui .sale-grade-options button[data-grade="all"] { grid-column: 1 / -1; }
.ga-ui .sale-grade-options button small { font-size: var(--ga-font-caption); color: var(--muted); }
.ga-ui .sale-grade-options button[aria-pressed="true"] { border-color: var(--gold); color: var(--gold-strong); }
.ga-ui .sale-grade-picker :is(summary, button):focus-visible { outline: 2px solid var(--gold-strong); outline-offset: -2px; }
.ga-ui.sale-dialog .sale-quick-actions button { min-height: var(--ga-touch); }
.ga-ui .stat-grid { grid-template-columns: repeat(auto-fit, minmax(min(100%, 110px), 1fr)); gap: var(--ga-space-2); }
.ga-ui .stat-tip-trigger strong { white-space: normal; overflow: visible; text-overflow: clip; overflow-wrap: anywhere; font-size: var(--ga-font-control); }
.ga-ui .stat-tip-trigger .stat-label { white-space: normal; overflow: visible; text-overflow: clip; font-size: var(--ga-font-caption); }
.ga-ui .library-type-tabs button small { font-size: var(--ga-font-caption); }
@media (max-width: 420px) {
  .ga-ui .theme-setting-choices { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ga-ui .inventory-filter-options { grid-template-columns: minmax(0, 1fr); }
}

/* Utility tabs share squared frames and wider copy; circular art/status marks stay circular. */
.ga-ui:is([role="dialog"], [role="alertdialog"]),
.ga-ui :is(section, article, fieldset, .panel, .page-heading, .equipment-item-card, .workshop-forge-card,
  .equipment-loadout-board, .equipment-parameter-board, .hero-command-summary,
  .orb-person-card, .orb-setting-card, .orb-combat-buttons, .orb-review-person,
  .menu-card, .settings-section, .utility-section, .items-category-panel,
  .inventory-item-card, .grimoire-shop-card, .owned-book-card, .help-topic,
  .equip-compare-choice, .sale-item, .formation-member-card) {
  border-radius: var(--ga-radius-panel);
}
.ga-ui :is(.orb-slot, .orb-picker-item, .equipment-gear-slot-count,
  .equipment-gear-heading .rarity-badge, .equipment-effect-row) {
  border-radius: var(--ga-radius-choice);
}
.ga-ui :is(.equipment-gear-name, .hero-equipped-list dd,
  .workshop-forge-card h2, .equip-compare-item-summary h3) {
  font-size: var(--ga-font-item-name); line-height: 1.5; letter-spacing: 0;
}
.ga-ui .hero-equipped-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.ga-ui .equipment-loadout-board .hero-equipped-slot {
  grid-template-columns: minmax(0, 1fr); align-content: start; gap: 2px;
}
.ga-ui .equipment-loadout-board .hero-equipped-slot dt {
  display: flex; gap: 3px;
}
.ga-ui .equipment-loadout-board .hero-equipped-grade {
  flex-shrink: 0; margin-left: auto; padding: 0 var(--ga-space-1);
  border: 1px solid var(--muted); border-radius: var(--ga-radius-choice);
  color: var(--text); font-size: var(--ga-font-caption); line-height: 1.5;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.ga-ui .equipment-parameter-board .stat-grid {
  grid-template-columns: repeat(5, minmax(0, 1fr)); gap: var(--ga-space-1);
}
.ga-ui .equipment-parameter-board .stat-tip-trigger {
  grid-template-columns: minmax(0, 1fr); justify-items: center; gap: 2px;
  min-height: 64px; padding: 6px 2px; text-align: center;
}
.ga-ui .equipment-parameter-board .stat-tip-cue { top: 4px; right: 3px; transform: none; }
.ga-ui .equipment-accordion-content { padding-inline: var(--ga-space-2); }
@media (max-width: 700px) {
  body:not(.battle-active) #app:has(> .ga-ui) { padding-inline: var(--ga-space-2); }
  .ga-ui.equipment-deck-shell {
    width: 100%; margin-inline: 0; padding-inline: var(--ga-space-2);
    border-inline-width: 1px; border-radius: var(--ga-radius-panel);
  }
  .ga-ui .equipment-loadout-board { padding-inline: var(--ga-space-2); }
  .ga-ui .hero-equipped-list .hero-equipped-slot { padding-inline: var(--ga-space-1); }
  .ga-ui .equipment-gear-summary { padding-inline: var(--ga-space-2); column-gap: var(--ga-space-2); }
}
/* Same-name weapon traits: scoped additions, no shared component overrides. */
.equipment-configuration { display: flex; flex-wrap: wrap; align-items: baseline; gap: .35rem; min-width: 0; font-size: var(--ga-font-item-name); line-height: 1.6; overflow-wrap: anywhere; }
.equipment-configuration b { font-weight: 600; }
.equipment-configuration em { font-style: normal; border: 1px solid currentColor; border-radius: .3rem; padding: 0 .35rem; }
.equipment-configuration-new { color: var(--gold-strong); }
.equipment-configuration-update { color: var(--selected-text); }
.equipment-configuration-effect { flex-basis: 100%; font-weight: 400; }
.inventory-disposition-item .equipment-configuration { color: var(--text); font-size: var(--ga-font-item-name); }
.inventory-disposition-item .equipment-configuration-effect { color: var(--muted); font-size: var(--ga-font-body); }
.equipment-gear-name > .equipment-configuration { font-weight: 400; margin-top: var(--ga-space-1); }
.equipment-configuration-progress { font-weight: 600; }
.equipment-configuration-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); gap: 12px; }
.equipment-configuration-weapon { min-width: 0; border: 1px solid var(--line); border-radius: var(--ga-radius-panel); padding: var(--ga-space-3); color: var(--text); background: var(--surface); overflow-wrap: anywhere; }
.equipment-configuration-weapon h3, .equipment-configuration-weapon h4 { margin: 0 0 8px; font-size: var(--ga-font-section); }
.equipment-configuration-weapon h3 small, .equipment-configuration-weapon h4 small { white-space: nowrap; }
.equipment-configuration-collection .equipment-configuration-part + .equipment-configuration-part { margin-top: var(--ga-space-4); }
.equipment-configuration-collection .equipment-configuration-part-heading { display: flex; align-items: center; gap: var(--ga-space-2); font-size: var(--ga-font-section); }
.equipment-configuration-weapon p { margin: 0 0 8px; font-size: var(--ga-font-note); color: var(--muted); }
.equipment-configuration-weapon ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.equipment-configuration-weapon li { display: grid; gap: 4px; padding: var(--ga-space-2); border-radius: var(--ga-radius-choice); background: var(--surface-2); line-height: 1.6; }
.equipment-configuration-weapon li span { font-size: var(--ga-font-note); color: var(--muted); }
.equipment-configuration-weapon .is-found { border-inline-start: 2px solid var(--gold-strong); }
.library-view-tabs:has([data-view="configurations"]) > button { flex: 1 0 28%; border-radius: var(--ga-radius-control); }
@media (min-width: 640px) { .library-view-tabs:has([data-view="configurations"]) > button { flex-basis: 13%; } }
