diff --git a/README.md b/README.md index e3c92d5..6c73d90 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ Gameplay capabilities now include: - Rolemaster create/edit forms now keep the expression authoritative, show generic Rolemaster syntax help, and reveal `FumbleRange` only when the expression is an open-ended percentile roll - Rolemaster roll execution now supports generic standard Rolemaster rolls (`NdS+x`, with implicit count `1` for `dS`) plus open-ended percentile (`d100!+x`) with recursive high-end chaining and low-end subtraction based on `FumbleRange`; low-end trigger rolls are shown for auditability but do not count toward the total - Compact campaign-log summaries stay dense for Rolemaster rolls, while lazy-loaded roll detail includes ordered die metadata for each open-ended follow-up step -- Play screen campaign logs now include a bottom-mounted custom roll composer that records arbitrary expressions against the selected character without creating a skill; invalid expressions stay inline on the field with tooltip/error styling instead of using error toasts +- Play screen campaign logs now include a detached bottom custom-roll panel below the scrollable log feed; it records arbitrary expressions against the selected character without creating a skill, and invalid expressions stay inline on the field with tooltip/error styling instead of using error toasts - Startup migration coverage is validated against a copied temp-file instance of `RpgRoller/App_Data/rpgroller.development.db` before feature work is considered complete ## Prerequisites diff --git a/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor b/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor index adc2f75..5128f93 100644 --- a/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor +++ b/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor @@ -1,80 +1,83 @@ diff --git a/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs b/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs index d818dde..0957e14 100644 --- a/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs +++ b/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs @@ -23,7 +23,7 @@ public partial class CampaignLogPanel { try { - await JS.InvokeVoidAsync("rpgRollerApi.scrollElementToBottom", LogPanelRef); + await JS.InvokeVoidAsync("rpgRollerApi.scrollElementToBottom", LogFeedRef); } catch (JSDisconnectedException) { @@ -44,6 +44,7 @@ public partial class CampaignLogPanel private RpgRollerApiClient ApiClient { get; set; } = null!; private ElementReference LogPanelRef { get; set; } + private ElementReference LogFeedRef { get; set; } private ElementReference CustomRollInputRef { get; set; } private int LastRenderedLogCount { get; set; } private Guid? LastRenderedLogRollId { get; set; } diff --git a/RpgRoller/wwwroot/styles.css b/RpgRoller/wwwroot/styles.css index 25ae13f..34b88e2 100644 --- a/RpgRoller/wwwroot/styles.css +++ b/RpgRoller/wwwroot/styles.css @@ -336,12 +336,21 @@ select:focus-visible { min-height: 0; display: grid; gap: 1rem; - align-content: start; + grid-template-rows: auto minmax(0, 1fr) auto; + align-content: stretch; } .app-play .log-panel { + overflow: hidden; +} + +.log-panel-feed { + min-height: 0; + display: grid; + align-content: start; overflow-y: auto; overscroll-behavior: contain; + padding-right: 0.15rem; } .skill-list { @@ -618,11 +627,17 @@ select:focus-visible { gap: 0.7rem; } +.custom-roll-panel { + border-top: 1px solid color-mix(in srgb, var(--card-border) 72%, #ffffff 28%); + background: color-mix(in srgb, var(--card) 88%, #ffffff 12%); + border-radius: 0.95rem; + padding: 0.85rem 0.9rem 0.9rem; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45); +} + .custom-roll-composer { display: grid; gap: 0.45rem; - padding-top: 0.2rem; - border-top: 1px solid color-mix(in srgb, var(--card-border) 72%, #ffffff 28%); } .custom-roll-composer-head {