Adds import support from our other project.

This commit is contained in:
2026-09-07 21:57:59 -07:00
parent a3d1a139e9
commit a3dace36de
150 changed files with 17716 additions and 21 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,300 @@
/* rulesets/sr6/templates/character_picker.css */
:root {
--sr-magenta: #950c6b;
--sr-cyan: #00e5ff;
--sr-amber: #ff9100;
--sr-dark-bg: #0e1117;
--sr-card-bg: #161b22;
--sr-card-border: #30363d;
--sr-text-bright: #f0f6fc;
--sr-text-muted: #8b949e;
--sr-accent: #950c6b;
}
body {
margin: 0;
padding: 24px;
background-color: var(--sr-dark-bg);
font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, sans-serif;
color: var(--sr-text-bright);
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
box-sizing: border-box;
}
.picker-card-wrapper {
max-width: 580px;
width: 100%;
}
.picker-card {
position: relative;
background: var(--sr-card-bg);
border: 1px solid var(--sr-card-border);
border-radius: 8px;
padding: 16px 20px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
transition: transform 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
overflow: hidden;
box-sizing: border-box;
}
.picker-card:hover {
transform: translateY(-2px);
}
/* Entity Type Variations */
.picker-card.entity-dossier {
border-left: 4px solid var(--sr-magenta);
}
.picker-card.entity-dossier:hover {
border-color: var(--sr-magenta);
box-shadow: 0 6px 20px rgba(149, 12, 107, 0.3);
}
.picker-card.entity-character {
border-left: 4px solid var(--sr-cyan);
}
.picker-card.entity-character:hover {
border-color: var(--sr-cyan);
box-shadow: 0 6px 20px rgba(0, 229, 255, 0.25);
}
.picker-card.entity-npc {
border-left: 4px solid var(--sr-amber);
}
.picker-card.entity-npc:hover {
border-color: var(--sr-amber);
box-shadow: 0 6px 20px rgba(255, 145, 0, 0.25);
}
/* Header */
.card-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 12px;
margin-bottom: 12px;
}
.header-identity {
display: flex;
flex-direction: column;
}
.title-row {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.runner-name {
font-size: 1.25rem;
font-weight: 700;
color: #ffffff;
letter-spacing: 0.5px;
}
.metatype-tag {
font-size: 0.75rem;
padding: 2px 8px;
border-radius: 4px;
background: rgba(255, 255, 255, 0.1);
color: #c9d1d9;
text-transform: uppercase;
font-weight: 600;
letter-spacing: 0.5px;
}
.runner-archetype {
font-size: 0.85rem;
color: var(--sr-text-muted);
margin-top: 2px;
font-weight: 500;
}
/* Entity Badge */
.entity-badge {
font-size: 0.7rem;
font-weight: 800;
letter-spacing: 1px;
padding: 4px 10px;
border-radius: 4px;
text-transform: uppercase;
white-space: nowrap;
}
.badge-dossier {
background: rgba(149, 12, 107, 0.2);
color: #ff40b3;
border: 1px solid var(--sr-magenta);
}
.badge-character {
background: rgba(0, 229, 255, 0.15);
color: #00e5ff;
border: 1px solid var(--sr-cyan);
}
.badge-npc {
background: rgba(255, 145, 0, 0.15);
color: #ffb74d;
border: 1px solid var(--sr-amber);
}
/* Attributes Bar */
.attributes-bar {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(36px, 1fr));
gap: 4px;
background: rgba(0, 0, 0, 0.25);
padding: 6px;
border-radius: 6px;
border: 1px solid rgba(255, 255, 255, 0.05);
margin-bottom: 12px;
}
.attr-cell {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
.attr-label {
font-size: 0.65rem;
font-weight: 700;
color: var(--sr-text-muted);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.attr-val {
font-size: 0.95rem;
font-weight: 800;
color: #ffffff;
}
/* Combat Vitals Row */
.vitals-row {
display: flex;
gap: 8px;
margin-bottom: 12px;
flex-wrap: wrap;
}
.vital-chip {
flex: 1;
min-width: 90px;
background: #21262d;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 6px;
padding: 6px 10px;
display: flex;
flex-direction: column;
}
.vital-label {
font-size: 0.65rem;
color: var(--sr-text-muted);
text-transform: uppercase;
font-weight: 700;
}
.vital-value {
font-size: 0.95rem;
font-weight: 700;
color: #58a6ff;
margin-top: 2px;
}
/* Quote / Hook Box */
.quote-box {
background: rgba(255, 255, 255, 0.03);
border-left: 2px solid rgba(255, 255, 255, 0.2);
padding: 6px 10px;
margin-bottom: 12px;
border-radius: 0 4px 4px 0;
font-size: 0.8rem;
font-style: italic;
color: #d2a8ff;
line-height: 1.3;
}
.hook-box {
background: rgba(255, 145, 0, 0.08);
border-left: 2px solid var(--sr-amber);
padding: 6px 10px;
margin-bottom: 12px;
border-radius: 0 4px 4px 0;
font-size: 0.8rem;
color: #ffcc80;
line-height: 1.3;
}
/* Gear & Skills Preview */
.tags-row {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 14px;
}
.pill-item {
font-size: 0.72rem;
background: #30363d;
color: #e6edf3;
padding: 3px 8px;
border-radius: 12px;
font-weight: 500;
}
/* Footer / Selection Action */
.card-footer {
display: flex;
justify-content: space-between;
align-items: center;
border-top: 1px solid rgba(255, 255, 255, 0.08);
padding-top: 10px;
}
.selection-info {
font-size: 0.75rem;
color: var(--sr-text-muted);
}
.select-btn {
background: transparent;
color: var(--sr-text-bright);
border: 1px solid #388bfd;
border-radius: 4px;
padding: 5px 14px;
font-size: 0.8rem;
font-weight: 600;
cursor: pointer;
transition: all 0.15s ease;
}
.select-btn:hover {
background: #1f6feb;
color: #ffffff;
}
.entity-dossier .select-btn {
border-color: var(--sr-magenta);
}
.entity-dossier .select-btn:hover {
background: var(--sr-magenta);
}
.entity-npc .select-btn {
border-color: var(--sr-amber);
}
.entity-npc .select-btn:hover {
background: var(--sr-amber);
color: #000;
}

View File

@@ -0,0 +1,166 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{#if properties.alias}}{{properties.alias}}{{else}}{{display_name}}{{/if}} | SR6 Runner Picker</title>
<link rel="stylesheet" href="/rulesets/sr6/templates/character_picker.css">
</head>
<body>
<div class="picker-card-wrapper">
<div class="picker-card entity-{{entity_type}}" data-uuid="{{uuid}}" data-entity-type="{{entity_type}}">
<!-- Card Header -->
<div class="card-header">
<div class="header-identity">
<div class="title-row">
<span class="runner-name">{{#if properties.alias}}{{properties.alias}}{{else}}{{display_name}}{{/if}}</span>
{{#if properties.metatype}}
<span class="metatype-tag">{{properties.metatype}}</span>
{{/if}}
</div>
{{#if properties.archetype}}
<span class="runner-archetype">{{properties.archetype}}</span>
{{else if properties.pitch}}
<span class="runner-archetype">{{properties.pitch}}</span>
{{/if}}
</div>
<!-- Entity Type Badge -->
<div>
{{#if (eq entity_type "dossier")}}
<span class="entity-badge badge-dossier">Dossier</span>
{{else if (eq entity_type "npc")}}
<span class="entity-badge badge-npc">NPC</span>
{{else}}
<span class="entity-badge badge-character">Character</span>
{{/if}}
</div>
</div>
<!-- Attributes Bar -->
{{#if properties.attributes}}
<div class="attributes-bar">
<div class="attr-cell">
<span class="attr-label">BOD</span>
<span class="attr-val">{{properties.attributes.body}}</span>
</div>
<div class="attr-cell">
<span class="attr-label">AGI</span>
<span class="attr-val">{{properties.attributes.agility}}</span>
</div>
<div class="attr-cell">
<span class="attr-label">REA</span>
<span class="attr-val">{{properties.attributes.reaction}}</span>
</div>
<div class="attr-cell">
<span class="attr-label">STR</span>
<span class="attr-val">{{properties.attributes.strength}}</span>
</div>
<div class="attr-cell">
<span class="attr-label">WIL</span>
<span class="attr-val">{{properties.attributes.willpower}}</span>
</div>
<div class="attr-cell">
<span class="attr-label">LOG</span>
<span class="attr-val">{{properties.attributes.logic}}</span>
</div>
<div class="attr-cell">
<span class="attr-label">INT</span>
<span class="attr-val">{{properties.attributes.intuition}}</span>
</div>
<div class="attr-cell">
<span class="attr-label">CHA</span>
<span class="attr-val">{{properties.attributes.charisma}}</span>
</div>
<div class="attr-cell">
<span class="attr-label">EDG</span>
<span class="attr-val">{{#if properties.attributes.edge}}{{properties.attributes.edge}}{{else}}—{{/if}}</span>
</div>
<div class="attr-cell">
<span class="attr-label">ESS</span>
<span class="attr-val">{{#if properties.attributes.essence}}{{properties.attributes.essence}}{{else}}6.0{{/if}}</span>
</div>
{{#if properties.attributes.magic}}
<div class="attr-cell">
<span class="attr-label">MAG</span>
<span class="attr-val">{{properties.attributes.magic}}</span>
</div>
{{/if}}
</div>
{{/if}}
<!-- Combat Vitals -->
<div class="vitals-row">
<div class="vital-chip">
<span class="vital-label">Initiative</span>
<span class="vital-value">{{#if properties.combat_info.initiative}}{{properties.combat_info.initiative}}{{else}}—{{/if}}</span>
</div>
<div class="vital-chip">
<span class="vital-label">Defense</span>
<span class="vital-value">DR {{#if properties.combat_info.defense_rating}}{{properties.combat_info.defense_rating}}{{else}}—{{/if}}</span>
</div>
<div class="vital-chip">
<span class="vital-label">Condition Track</span>
<span class="vital-value">
{{#if properties.combat_info.condition_monitor}}
{{properties.combat_info.condition_monitor}} Boxes
{{else if properties.condition_monitor}}
{{properties.condition_monitor.physical_boxes}}P / {{properties.condition_monitor.stun_boxes}}S
{{else}}
—
{{/if}}
</span>
</div>
</div>
<!-- Quote or Hook -->
{{#if properties.hook}}
<div class="hook-box">
<strong>Hook:</strong> {{properties.hook}}
</div>
{{else if properties.quote}}
<div class="quote-box">
{{properties.quote}}
</div>
{{/if}}
<!-- Skills & Gear Tags Preview -->
<div class="tags-row">
{{#if properties.primary_ranged_weapon}}
<span class="pill-item">🔫 {{properties.primary_ranged_weapon.name}}</span>
{{/if}}
{{#if properties.primary_melee_weapon}}
<span class="pill-item">⚔️ {{properties.primary_melee_weapon.name}}</span>
{{/if}}
{{#if properties.primary_armor}}
<span class="pill-item">🛡️ {{properties.primary_armor.name}}</span>
{{/if}}
{{#each properties.skills}}
{{#if (lt @index 3)}}
<span class="pill-item">★ {{name}} {{rating}}</span>
{{/if}}
{{/each}}
{{#each properties.gear}}
{{#if (lt @index 2)}}
<span class="pill-item">📦 {{name}}</span>
{{/if}}
{{/each}}
</div>
<!-- Card Footer / Selection Action -->
<div class="card-footer">
<div class="selection-info">
UUID: <small><code>{{uuid}}</code></small>
</div>
<button type="button" class="select-btn" onclick="alert('Selected: {{properties.alias}}')">
Select {{#if (eq entity_type "npc")}}NPC{{else}}Runner{{/if}}
</button>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,633 @@
/* Shadowrun 6th World (SR6) Character Sheet Styles */
:root {
--sr6-magenta: #950C6B;
--sr6-magenta-dark: #700650;
--sr6-magenta-light: #fbeaf5;
--sr6-border-pink: #A60067;
--sr6-text-dark: #181717;
--sr6-text-muted: #555555;
--sr6-bg-page: #e8e7ec;
--sr6-bg-card: rgba(255, 255, 255, 0.96);
--sr6-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
* {
box-sizing: border-box;
}
body.sr6-sheet-body {
margin: 0;
padding: 20px 10px;
background-color: var(--sr6-bg-page);
font-family: var(--sr6-font-family);
color: var(--sr6-text-dark);
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
}
/* Page Container - Matches 8.5 x 11 in Aspect Ratio */
.sr6-page {
width: 100%;
max-width: 960px;
background: #ffffff;
background-image: url('assets/_dev_sr6_circuit_bg.png');
background-size: 100% auto;
background-repeat: repeat-y;
border: 1px solid #ccc;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
padding: 20px 24px;
display: flex;
flex-direction: column;
gap: 12px;
position: relative;
}
/* Header Banner */
.sr6-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 2px solid var(--sr6-magenta);
padding-bottom: 8px;
margin-bottom: 4px;
}
.header-logo-area {
flex: 0 0 420px;
max-width: 50%;
}
.sr6-logo-img {
width: 100%;
height: auto;
display: block;
filter: drop-shadow(0 2px 4px rgba(0,0,0,0.15));
}
.header-fields {
flex: 1;
display: flex;
flex-direction: column;
gap: 4px;
padding-left: 20px;
}
.header-field-line {
display: flex;
align-items: baseline;
border-bottom: 1.5px solid #222;
padding-bottom: 1px;
}
.header-field-line .field-label {
font-size: 11px;
font-weight: 800;
letter-spacing: 0.5px;
width: 90px;
color: #111;
}
.header-field-line .field-value {
flex: 1;
font-size: 13px;
font-weight: 600;
color: #111;
padding-left: 6px;
min-height: 18px;
}
/* Rows & Grid System */
.sr6-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.row-top {
grid-template-columns: 1.05fr 0.95fr;
}
.row-mid {
grid-template-columns: 1fr 1fr;
}
.row-lower {
grid-template-columns: 1.15fr 0.85fr;
}
.row-bottom {
grid-template-columns: 1fr 1fr;
}
/* Page 2 Rows */
.p2-row-weapons {
grid-template-columns: 1.35fr 0.65fr;
}
.p2-row-armor-matrix {
grid-template-columns: 0.85fr 1.15fr;
}
.p2-row-aug-veh {
grid-template-columns: 1fr 1fr;
}
.p2-row-gear-magic {
grid-template-columns: 0.75fr 1.25fr;
}
.magic-powers-col {
display: flex;
flex-direction: column;
gap: 12px;
}
/* Card Styling */
.sr6-card {
background: var(--sr6-bg-card);
border: 1.5px solid var(--sr6-border-pink);
border-radius: 6px;
padding: 8px 10px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
display: flex;
flex-direction: column;
}
.card-title {
margin: 0 0 6px 0;
font-size: 12px;
font-weight: 900;
letter-spacing: 0.8px;
color: var(--sr6-magenta);
text-transform: uppercase;
border-bottom: 1px solid var(--sr6-magenta);
padding-bottom: 2px;
}
.card-content {
flex: 1;
display: flex;
flex-direction: column;
gap: 6px;
font-size: 11.5px;
}
/* Data Items & Labels */
.sub-label {
font-size: 9.5px;
font-weight: 700;
color: #333;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.val {
font-size: 11.5px;
font-weight: 600;
color: #111;
}
.bold-highlight {
font-weight: 800;
color: var(--sr6-magenta);
}
.data-row {
display: flex;
align-items: baseline;
border-bottom: 1px solid #ddd;
padding-bottom: 2px;
}
.data-grid {
display: grid;
gap: 6px;
}
.grid-2-col { grid-template-columns: 1fr 1fr; }
.grid-3-col { grid-template-columns: 1fr 1fr 1fr; }
.grid-4-col { grid-template-columns: 1fr 1fr 1fr 1fr; }
.data-item {
display: flex;
align-items: baseline;
gap: 4px;
border-bottom: 1px solid #eee;
padding-bottom: 2px;
}
.full-line {
grid-column: 1 / -1;
}
/* Core Combat Info */
.combat-armor-row {
display: flex;
align-items: baseline;
gap: 6px;
border-bottom: 1px solid #ccc;
padding-bottom: 3px;
}
.combat-armor-row .rtg-label {
margin-left: auto;
}
.combat-armor-row .rtg-val {
font-weight: 800;
color: var(--sr6-magenta);
}
.combat-weapon-block {
background: #fdfafd;
border: 1px solid #e0cbe0;
border-radius: 4px;
padding: 4px 6px;
}
.weapon-header {
display: flex;
justify-content: space-between;
margin-bottom: 3px;
font-weight: 700;
}
.weapon-stats-strip {
display: flex;
flex-wrap: wrap;
gap: 8px;
font-size: 10.5px;
}
.ws-item {
display: flex;
gap: 3px;
align-items: baseline;
}
.combat-defense-strip {
margin-top: auto;
padding-top: 4px;
border-top: 1.5px solid var(--sr6-magenta);
}
/* Attributes Card */
.attributes-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.attr-sub-col {
display: flex;
flex-direction: column;
gap: 3px;
}
.attr-line {
display: flex;
justify-content: space-between;
align-items: baseline;
border-bottom: 1px solid #ddd;
padding: 2px 2px;
}
.attr-line.highlight-accent {
background: var(--sr6-magenta-light);
border-bottom: 1.5px solid var(--sr6-magenta);
padding: 2px 4px;
border-radius: 2px;
}
.attr-name {
font-size: 11px;
font-weight: 700;
color: #222;
}
.attr-val {
font-size: 12px;
font-weight: 800;
color: #111;
}
.attr-line.highlight-accent .attr-val {
color: var(--sr6-magenta);
font-size: 12.5px;
}
/* Edge Points Tracker */
.edge-tracker-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 3px 2px;
border-bottom: 1px solid #ddd;
}
.edge-boxes {
display: flex;
gap: 3px;
}
.edge-box {
width: 11px;
height: 11px;
border: 1.2px solid #222;
border-radius: 1px;
background: #ffffff;
}
.edge-box.filled {
background: var(--sr6-magenta);
border-color: var(--sr6-magenta-dark);
}
.edge-box.disabled {
background: #bbb;
border-color: #888;
}
/* Condition Monitor */
.monitor-tracks-wrapper {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
}
.track-column {
display: flex;
flex-direction: column;
align-items: center;
}
.track-title {
font-size: 10.5px;
font-weight: 800;
text-align: center;
color: var(--sr6-text-dark);
margin-bottom: 6px;
text-transform: uppercase;
}
.track-grid {
display: flex;
flex-direction: column;
gap: 4px;
}
.monitor-row {
display: flex;
align-items: center;
gap: 4px;
}
.row-boxes {
display: flex;
gap: 3px;
}
.damage-box {
width: 20px;
height: 20px;
border: 1.4px solid #222;
background: #ffffff;
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
}
.damage-box.box-blacked-out {
background: #222222;
border-color: #111111;
}
.damage-box.damage-filled {
background: #ffd6e8;
position: relative;
}
.damage-box.damage-filled::after {
content: "✕";
color: var(--sr6-magenta);
font-size: 14px;
font-weight: 900;
}
.penalty-tag {
font-size: 10.5px;
font-weight: 800;
color: #111;
width: 18px;
text-align: right;
}
.track-footnote {
font-size: 8.5px;
color: var(--sr6-text-muted);
text-align: center;
margin-top: 6px;
line-height: 1.15;
}
.monitor-cumulative-rule {
font-size: 8.5px;
color: #222;
background: #fdf3f8;
border: 1px solid #eecad9;
border-radius: 3px;
padding: 4px 6px;
margin-top: 6px;
line-height: 1.25;
text-align: center;
}
/* Tables (Skills, Qualities, Contacts, Weapons, etc.) */
.skills-table, .qualities-table, .contacts-table, .weapons-table, .sheet-table {
width: 100%;
border-collapse: collapse;
font-size: 10.5px;
}
.skills-table th, .qualities-table th, .contacts-table th, .weapons-table th, .sheet-table th {
background: #f5f0f4;
border-bottom: 1.5px solid var(--sr6-magenta);
padding: 3px 4px;
text-align: left;
font-size: 9.5px;
font-weight: 800;
color: #222;
}
.skills-table td, .qualities-table td, .contacts-table td, .weapons-table td, .sheet-table td {
padding: 3px 4px;
border-bottom: 1px solid #e8e8e8;
vertical-align: middle;
}
.col-rnk, .col-att, .col-dp, .col-cloy, .col-ccon {
text-align: center;
}
.col-dp {
font-weight: 800;
color: var(--sr6-magenta);
}
.skill-spec {
font-size: 9.5px;
color: var(--sr6-magenta);
font-weight: normal;
margin-left: 2px;
}
.quality-badge {
display: inline-block;
font-size: 9px;
font-weight: 700;
padding: 1px 4px;
border-radius: 2px;
}
.quality-badge.Positive {
background: #e6f7ea;
color: #1b6329;
}
.quality-badge.Negative {
background: #fde8e8;
color: #a81c1c;
}
/* Matrix Stats Card */
.matrix-ratings-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 4px;
background: #fbf5fa;
padding: 4px 6px;
border-radius: 3px;
border: 1px solid #ebd7e7;
}
.mstat-item {
display: flex;
flex-direction: column;
align-items: center;
}
.mstat-item .sub-label {
font-size: 8.5px;
}
.mstat-item .val {
font-size: 13px;
font-weight: 800;
color: var(--sr6-magenta);
}
.matrix-devices-line, .matrix-programs-line {
display: flex;
align-items: baseline;
gap: 4px;
font-size: 11px;
}
.matrix-monitor-strip {
margin-top: 4px;
display: flex;
flex-direction: column;
gap: 3px;
}
.matrix-boxes {
display: flex;
gap: 3px;
}
.matrix-box {
flex: 1;
height: 18px;
border: 1px solid #333;
display: flex;
align-items: center;
justify-content: center;
font-size: 9px;
font-weight: 700;
background: #ffffff;
}
.matrix-box.damage-filled {
background: var(--sr6-magenta);
color: #ffffff;
}
/* Vehicles & Drones */
.vehicle-block {
background: #fafafa;
border: 1px solid #eee;
padding: 6px;
border-radius: 4px;
}
.empty-placeholder {
font-size: 10px;
font-style: italic;
color: #888;
text-align: center;
padding: 8px 0;
}
/* Page Footer */
.sr6-page-footer {
font-size: 8px;
color: #777;
text-align: center;
margin-top: auto;
padding-top: 6px;
border-top: 1px solid #ddd;
}
/* Print Handling */
@media print {
body.sr6-sheet-body {
padding: 0;
background: none;
}
.sr6-page {
box-shadow: none;
border: none;
max-width: 100%;
padding: 12mm 14mm;
page-break-after: always;
}
.sr6-page.page-2 {
page-break-after: avoid;
}
}
/* Mobile Responsiveness */
@media (max-width: 768px) {
.sr6-row {
grid-template-columns: 1fr !important;
}
.header-logo-area {
max-width: 100%;
}
.sr6-header {
flex-direction: column;
gap: 8px;
}
.header-fields {
width: 100%;
padding-left: 0;
}
}

View File

@@ -0,0 +1,678 @@
<!DOCTYPE html>
<html lang="en">
<head>
<base href="/rulesets/sr6/templates/">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{#if properties.alias}}{{properties.alias}}{{else if display_name}}{{display_name}}{{else}}Shadowrunner{{/if}} - Shadowrun 6e Character Sheet</title>
<link rel="stylesheet" href="character_sheet.css">
</head>
<body class="sr6-sheet-body">
<!-- PAGE 1 -->
<div class="sr6-page page-1">
<!-- Top Header Banner -->
<header class="sr6-header">
<div class="header-logo-area">
<img src="assets/_dev_sr6_logo.png" alt="Shadowrun" class="sr6-logo-img">
</div>
<div class="header-fields">
<div class="header-field-line">
<span class="field-label">CHARACTER</span>
<span class="field-value">{{#if properties.alias}}{{properties.alias}}{{else}}{{display_name}}{{/if}}</span>
</div>
<div class="header-field-line">
<span class="field-label">PLAYER</span>
<span class="field-value">{{properties.player}}</span>
</div>
<div class="header-field-line">
<span class="field-label">NOTES</span>
<span class="field-value">{{properties.notes}}</span>
</div>
</div>
</header>
<!-- Top Row: Personal Data & Core Combat Info -->
<div class="sr6-row row-top">
<!-- Personal Data Box -->
<section class="sr6-card personal-data-card">
<h3 class="card-title">PERSONAL DATA</h3>
<div class="card-content">
<div class="data-row line-alias">
<span class="sub-label">NAME/PRIMARY ALIAS</span>
<span class="val">{{#if properties.alias}}{{properties.alias}}{{else}}{{display_name}}{{/if}}{{#if properties.real_name}} ({{properties.real_name}}){{/if}}</span>
</div>
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Metatype</span> <span class="val">{{properties.metatype}}</span></div>
<div class="data-item"><span class="sub-label">Ethnicity</span> <span class="val">{{properties.ethnicity}}</span></div>
</div>
<div class="data-grid grid-4-col">
<div class="data-item"><span class="sub-label">Age</span> <span class="val">{{properties.age}}</span></div>
<div class="data-item"><span class="sub-label">Sex</span> <span class="val">{{properties.sex}}</span></div>
<div class="data-item"><span class="sub-label">Height</span> <span class="val">{{properties.height}}</span></div>
<div class="data-item"><span class="sub-label">Weight</span> <span class="val">{{properties.weight}}</span></div>
</div>
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Reputation</span> <span class="val">{{properties.reputation}}</span></div>
<div class="data-item"><span class="sub-label">Heat</span> <span class="val">{{properties.heat}}</span></div>
</div>
<div class="data-grid grid-3-col">
<div class="data-item"><span class="sub-label">Karma</span> <span class="val">{{properties.karma}}</span></div>
<div class="data-item"><span class="sub-label">Total Karma</span> <span class="val">{{properties.total_karma}}</span></div>
<div class="data-item"><span class="sub-label">Misc</span> <span class="val">{{properties.misc}}</span></div>
</div>
</div>
</section>
<!-- Core Combat Info Box -->
<section class="sr6-card combat-info-card">
<h3 class="card-title">CORE COMBAT INFO</h3>
<div class="card-content">
<div class="combat-armor-row">
<span class="sub-label">Primary Armor</span>
<span class="val">{{properties.primary_armor.name}}</span>
<span class="sub-label rtg-label">Rating</span>
<span class="val rtg-val">{{properties.primary_armor.rating}}</span>
</div>
<!-- Primary Ranged Weapon -->
<div class="combat-weapon-block">
<div class="weapon-header">
<span class="sub-label">Primary Ranged Weapon</span>
<span class="val">{{properties.primary_ranged_weapon.name}}</span>
</div>
<div class="weapon-stats-strip">
<span class="ws-item"><span class="sub-label">DV</span> <span class="val">{{properties.primary_ranged_weapon.dv}}</span></span>
<span class="ws-item"><span class="sub-label">Mode</span> <span class="val">{{properties.primary_ranged_weapon.mode}}</span></span>
<span class="ws-item"><span class="sub-label">Close</span> <span class="val">{{properties.primary_ranged_weapon.attack_rating.close}}</span></span>
<span class="ws-item"><span class="sub-label">Near</span> <span class="val">{{properties.primary_ranged_weapon.attack_rating.near}}</span></span>
<span class="ws-item"><span class="sub-label">Far</span> <span class="val">{{properties.primary_ranged_weapon.attack_rating.far}}</span></span>
<span class="ws-item"><span class="sub-label">Extreme</span> <span class="val">{{properties.primary_ranged_weapon.attack_rating.extreme}}</span></span>
<span class="ws-item"><span class="sub-label">Ammo</span> <span class="val">{{properties.primary_ranged_weapon.ammo}}</span></span>
</div>
</div>
<!-- Primary Melee Weapon -->
<div class="combat-weapon-block">
<div class="weapon-header">
<span class="sub-label">Primary Melee Weapon</span>
<span class="val">{{properties.primary_melee_weapon.name}}</span>
</div>
<div class="weapon-stats-strip">
<span class="ws-item"><span class="sub-label">DV</span> <span class="val">{{properties.primary_melee_weapon.dv}}</span></span>
<span class="ws-item"><span class="sub-label">Close</span> <span class="val">{{properties.primary_melee_weapon.close}}</span></span>
</div>
</div>
<!-- Bottom Defense & Unarmed AR -->
<div class="data-grid grid-2-col combat-defense-strip">
<div class="data-item"><span class="sub-label">Unarmed AR</span> <span class="val">{{properties.combat_info.unarmed_ar}}</span></div>
<div class="data-item"><span class="sub-label">Defense Rating</span> <span class="val bold-highlight">{{properties.combat_info.defense_rating}}</span></div>
</div>
</div>
</section>
</div>
<!-- Middle Row: Attributes & Condition Monitor -->
<div class="sr6-row row-mid">
<!-- ATTRIBUTES -->
<section class="sr6-card attributes-card">
<h3 class="card-title">ATTRIBUTES</h3>
<div class="card-content attributes-grid">
<!-- Physical & Mental Columns -->
<div class="attr-sub-col">
<div class="attr-line"><span class="attr-name">Body</span> <span class="attr-val">{{attr properties.attributes "body"}}</span></div>
<div class="attr-line"><span class="attr-name">Agility</span> <span class="attr-val">{{attr properties.attributes "agility"}}</span></div>
<div class="attr-line"><span class="attr-name">Reaction</span> <span class="attr-val">{{attr properties.attributes "reaction"}}</span></div>
<div class="attr-line"><span class="attr-name">Strength</span> <span class="attr-val">{{attr properties.attributes "strength"}}</span></div>
<div class="attr-line"><span class="attr-name">Willpower</span> <span class="attr-val">{{attr properties.attributes "willpower"}}</span></div>
<div class="attr-line"><span class="attr-name">Logic</span> <span class="attr-val">{{attr properties.attributes "logic"}}</span></div>
<div class="attr-line"><span class="attr-name">Intuition</span> <span class="attr-val">{{attr properties.attributes "intuition"}}</span></div>
<div class="attr-line"><span class="attr-name">Charisma</span> <span class="attr-val">{{attr properties.attributes "charisma"}}</span></div>
<div class="attr-line"><span class="attr-name">Edge</span> <span class="attr-val">{{attr properties.attributes "edge"}}</span></div>
<!-- Edge Points Tracker -->
<div class="edge-tracker-row">
<span class="sub-label">Edge Points</span>
<div class="edge-boxes">
{{#edgePointsBoxes (attr properties.attributes "edge") properties.attributes.edge_points}}
<span class="edge-box {{#if filled}}filled{{/if}} {{#if disabled}}disabled{{/if}}"></span>
{{/edgePointsBoxes}}
</div>
</div>
<div class="attr-line"><span class="attr-name">Unarmed AR</span> <span class="attr-val">{{properties.combat_info.unarmed_ar}}</span></div>
</div>
<!-- Special & Derived Columns -->
<div class="attr-sub-col">
<div class="attr-line"><span class="attr-name">Essence</span> <span class="attr-val">{{properties.attributes.essence}}</span></div>
<div class="attr-line"><span class="attr-name">Magic/Resonance</span> <span class="attr-val">{{#if properties.attributes.magic}}{{properties.attributes.magic}}{{else if properties.attributes.resonance}}{{properties.attributes.resonance}}{{else}}—{{/if}}</span></div>
<div class="attr-line highlight-accent"><span class="attr-name">Initiative</span> <span class="attr-val">{{properties.combat_info.initiative}}</span></div>
<div class="attr-line"><span class="attr-name">Matrix Initiative</span> <span class="attr-val">{{properties.combat_info.matrix_initiative}}</span></div>
<div class="attr-line"><span class="attr-name">Astral Initiative</span> <span class="attr-val">{{properties.combat_info.astral_initiative}}</span></div>
<div class="attr-line"><span class="attr-name">Composure</span> <span class="attr-val">{{properties.combat_info.composure}}</span></div>
<div class="attr-line"><span class="attr-name">Judge Intentions</span> <span class="attr-val">{{properties.combat_info.judge_intentions}}</span></div>
<div class="attr-line"><span class="attr-name">Memory</span> <span class="attr-val">{{properties.combat_info.memory}}</span></div>
<div class="attr-line"><span class="attr-name">Lift/Carry</span> <span class="attr-val">{{properties.combat_info.lift_carry}}</span></div>
<div class="attr-line"><span class="attr-name">Movement</span> <span class="attr-val">{{properties.combat_info.movement}}</span></div>
<div class="attr-line highlight-accent"><span class="attr-name">Defense Rating</span> <span class="attr-val">{{properties.combat_info.defense_rating}}</span></div>
</div>
</div>
</section>
<!-- CONDITION MONITOR -->
<section class="sr6-card condition-monitor-card">
<h3 class="card-title">CONDITION MONITOR</h3>
<div class="card-content monitor-tracks-wrapper">
<!-- Physical Track -->
<div class="track-column">
<div class="track-title">Physical Damage Track</div>
<div class="track-grid">
{{#conditionMonitorRows (calcPhysicalBoxes (attr properties.attributes "body")) properties.condition_monitor.physical_damage 18}}
<div class="monitor-row">
<div class="row-boxes">
{{#each boxes}}
<div class="damage-box {{#if filled}}damage-filled{{/if}} {{#if blackedOut}}box-blacked-out{{/if}}">
<div class="inner-box"></div>
</div>
{{/each}}
</div>
<div class="penalty-tag">{{penalty}}</div>
</div>
{{/conditionMonitorRows}}
</div>
<div class="track-footnote">
Characters have 8 + (Body &divide; 2, round up) boxes on the physical damage track; black out extra boxes.
</div>
</div>
<!-- Stun Track -->
<div class="track-column">
<div class="track-title">Stun Damage Track</div>
<div class="track-grid">
{{#conditionMonitorRows (calcStunBoxes (attr properties.attributes "willpower")) properties.condition_monitor.stun_damage 12}}
<div class="monitor-row">
<div class="row-boxes">
{{#each boxes}}
<div class="damage-box {{#if filled}}damage-filled{{/if}} {{#if blackedOut}}box-blacked-out{{/if}}">
<div class="inner-box"></div>
</div>
{{/each}}
</div>
<div class="penalty-tag">{{penalty}}</div>
</div>
{{/conditionMonitorRows}}
</div>
<div class="track-footnote">
Characters have 8 + (Will &divide; 2, round up) boxes on the stun damage track; black out extra boxes.
</div>
</div>
</div>
<!-- Condition Monitor Cumulative Rule -->
<div class="monitor-cumulative-rule">
For every 3 boxes of damage on any one damage track, the character takes a &minus;1 Dice Pool modifier on tests; these modifiers are cumulative within and across damage tracks.
</div>
</section>
</div>
<!-- Lower Row: Skills & Qualities -->
<div class="sr6-row row-lower">
<!-- SKILLS (2 Columns) -->
<section class="sr6-card skills-card">
<h3 class="card-title">SKILLS</h3>
<div class="card-content skills-table-wrap">
<table class="skills-table">
<thead>
<tr>
<th class="col-skill">Skill</th>
<th class="col-rnk">RNK</th>
<th class="col-att">ATT</th>
<th class="col-dp">DP</th>
<th class="col-type">Type</th>
</tr>
</thead>
<tbody>
{{#each properties.skills}}
<tr>
<td class="col-skill">
<strong>{{this.name}}</strong>
{{#if this.specialization}}<span class="skill-spec">({{this.specialization}})</span>{{/if}}
{{#if this.expertise}}<span class="skill-spec">[{{this.expertise}}]</span>{{/if}}
</td>
<td class="col-rnk">{{this.rating}}</td>
<td class="col-att">{{this.attribute}}</td>
<td class="col-dp">{{#if this.dice_pool}}{{this.dice_pool}}{{else}}{{calcDicePool this ../properties.attributes}}{{/if}}</td>
<td class="col-type">{{this.type}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
<!-- QUALITIES -->
<section class="sr6-card qualities-card">
<h3 class="card-title">QUALITIES</h3>
<div class="card-content qualities-table-wrap">
<table class="qualities-table">
<thead>
<tr>
<th class="col-qname">Quality</th>
<th class="col-qnotes">Notes</th>
<th class="col-qtype">Type</th>
</tr>
</thead>
<tbody>
{{#each properties.qualities}}
<tr>
<td class="col-qname"><strong>{{this.name}}</strong></td>
<td class="col-qnotes">{{this.notes}}</td>
<td class="col-qtype"><span class="quality-badge {{this.type}}">{{this.type}}</span></td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
</div>
<!-- Bottom Row: IDs/Lifestyles & Contacts -->
<div class="sr6-row row-bottom">
<!-- IDs / LIFESTYLES / CURRENCY -->
<section class="sr6-card currency-card">
<h3 class="card-title">IDS / LIFESTYLES / CURRENCY</h3>
<div class="card-content">
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Primary Lifestyle</span> <span class="val">{{properties.currency_and_ids.primary_lifestyle}}</span></div>
<div class="data-item"><span class="sub-label">Nuyen</span> <span class="val bold-highlight">{{formatNuyen properties.currency_and_ids.nuyen}}</span></div>
</div>
<div class="data-item full-line">
<span class="sub-label">Licenses</span>
<span class="val">{{properties.currency_and_ids.licenses}}</span>
</div>
<div class="fake-ids-section">
<div class="sub-label fake-id-header">Fake IDs / Related Lifestyles / Funds / Licenses</div>
{{#if properties.currency_and_ids.fake_ids}}
{{#each properties.currency_and_ids.fake_ids}}
<div class="fake-id-entry">
<strong>{{this.name}} (Rtg {{this.rating}})</strong> &mdash; {{this.lifestyle}} | {{this.funds}} | Licenses: {{this.licenses}}
</div>
{{/each}}
{{else}}
<div class="empty-memo-lines">
<div class="memo-line"></div>
<div class="memo-line"></div>
</div>
{{/if}}
</div>
</div>
</section>
<!-- CONTACTS -->
<section class="sr6-card contacts-card">
<h3 class="card-title">CONTACTS</h3>
<div class="card-content contacts-table-wrap">
<table class="contacts-table">
<thead>
<tr>
<th class="col-cname">Name</th>
<th class="col-cloy">Loyalty</th>
<th class="col-ccon">Connection</th>
<th class="col-cnotes">Notes</th>
</tr>
</thead>
<tbody>
{{#each properties.contacts}}
<tr>
<td class="col-cname"><strong>{{this.name}}</strong></td>
<td class="col-cloy">{{this.loyalty}}</td>
<td class="col-ccon">{{this.connection}}</td>
<td class="col-cnotes">{{this.notes}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
</div>
<!-- Page 1 Footer Legal Notice -->
<footer class="sr6-page-footer">
&copy; 2019-20 The Topps Company, Inc. Shadowrun is a registered trademark of The Topps Company, Inc., in the United States and/or other countries. Permission given to copy for personal use.
</footer>
</div>
<!-- PAGE 2 -->
<div class="sr6-page page-2">
<!-- Top Header Banner (Page 2) -->
<header class="sr6-header">
<div class="header-logo-area">
<img src="assets/_dev_sr6_logo.png" alt="Shadowrun" class="sr6-logo-img">
</div>
<div class="header-fields">
<div class="header-field-line">
<span class="field-label">CHARACTER</span>
<span class="field-value">{{#if properties.alias}}{{properties.alias}}{{else}}{{display_name}}{{/if}}</span>
</div>
<div class="header-field-line">
<span class="field-label">PLAYER</span>
<span class="field-value">{{properties.player}}</span>
</div>
<div class="header-field-line">
<span class="field-label">NOTES</span>
<span class="field-value">{{properties.notes}}</span>
</div>
</div>
</header>
<!-- Top Row: Ranged Weapons & Melee Weapons -->
<div class="sr6-row p2-row-weapons">
<!-- RANGED WEAPONS -->
<section class="sr6-card ranged-weapons-card">
<h3 class="card-title">RANGED WEAPONS</h3>
<div class="card-content weapons-table-wrap">
<table class="weapons-table">
<thead>
<tr>
<th>Weapon</th>
<th>DV</th>
<th>Mode</th>
<th>Close</th>
<th>Near</th>
<th>Far</th>
<th>Extreme</th>
<th>Ammo</th>
</tr>
</thead>
<tbody>
{{#each properties.ranged_weapons}}
<tr>
<td><strong>{{this.name}}</strong>{{#if this.notes}} <small>({{this.notes}})</small>{{/if}}</td>
<td>{{this.dv}}</td>
<td>{{this.mode}}</td>
<td>{{this.attack_rating.close}}</td>
<td>{{this.attack_rating.near}}</td>
<td>{{this.attack_rating.far}}</td>
<td>{{this.attack_rating.extreme}}</td>
<td>{{this.ammo}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
<!-- MELEE WEAPONS -->
<section class="sr6-card melee-weapons-card">
<h3 class="card-title">MELEE WEAPONS</h3>
<div class="card-content weapons-table-wrap">
<table class="weapons-table">
<thead>
<tr>
<th>Weapon</th>
<th>DV</th>
<th>Close</th>
</tr>
</thead>
<tbody>
{{#each properties.melee_weapons}}
<tr>
<td><strong>{{this.name}}</strong>{{#if this.notes}} <small>({{this.notes}})</small>{{/if}}</td>
<td>{{this.dv}}</td>
<td>{{this.close}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
</div>
<!-- Mid Upper Row: Armor & Matrix Stats -->
<div class="sr6-row p2-row-armor-matrix">
<!-- ARMOR -->
<section class="sr6-card armor-card">
<h3 class="card-title">ARMOR</h3>
<div class="card-content">
<table class="sheet-table">
<thead>
<tr>
<th>Armor</th>
<th>Rating</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
{{#each properties.armor}}
<tr>
<td><strong>{{this.name}}</strong></td>
<td>{{this.rating}}</td>
<td>{{this.notes}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
<!-- MATRIX STATS -->
<section class="sr6-card matrix-card">
<h3 class="card-title">MATRIX STATS</h3>
<div class="card-content">
<div class="matrix-ratings-grid">
<div class="mstat-item"><span class="sub-label">Attack</span> <span class="val">{{properties.matrix_stats.attack}}</span></div>
<div class="mstat-item"><span class="sub-label">Sleaze</span> <span class="val">{{properties.matrix_stats.sleaze}}</span></div>
<div class="mstat-item"><span class="sub-label">Data Proc.</span> <span class="val">{{properties.matrix_stats.data_processing}}</span></div>
<div class="mstat-item"><span class="sub-label">Firewall</span> <span class="val">{{properties.matrix_stats.firewall}}</span></div>
</div>
<div class="matrix-devices-line">
<span class="sub-label">Devices/DR:</span>
<span class="val">{{properties.matrix_stats.device_name}} (DR {{properties.matrix_stats.device_rating}})</span>
</div>
<div class="matrix-programs-line">
<span class="sub-label">Programs:</span>
<span class="val">
{{#if properties.matrix_stats.programs}}
{{#each properties.matrix_stats.programs}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}
{{else}}
None loaded
{{/if}}
</span>
</div>
<div class="matrix-monitor-strip">
<span class="sub-label">Matrix Condition Monitor</span>
<div class="matrix-boxes">
{{#matrixMonitorBoxes 12 properties.matrix_stats.matrix_damage}}
<div class="matrix-box {{#if filled}}damage-filled{{/if}}">{{index}}</div>
{{/matrixMonitorBoxes}}
</div>
</div>
</div>
</section>
</div>
<!-- Mid Lower Row: Augmentations & Vehicles -->
<div class="sr6-row p2-row-aug-veh">
<!-- AUGMENTATIONS -->
<section class="sr6-card aug-card">
<h3 class="card-title">AUGMENTATIONS</h3>
<div class="card-content">
<table class="sheet-table">
<thead>
<tr>
<th>Augmentation</th>
<th>Rating</th>
<th>Notes</th>
<th>Essence</th>
</tr>
</thead>
<tbody>
{{#each properties.augmentations}}
<tr>
<td><strong>{{this.name}}</strong></td>
<td>{{this.rating}}</td>
<td>{{this.notes}}</td>
<td>{{this.essence}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
<!-- VEHICLE -->
<section class="sr6-card vehicle-card">
<h3 class="card-title">VEHICLE</h3>
<div class="card-content">
{{#if properties.vehicles}}
{{#each properties.vehicles}}
<div class="vehicle-block">
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Vehicle</span> <span class="val bold-highlight">{{this.name}}</span></div>
<div class="data-item"><span class="sub-label">Handling</span> <span class="val">{{this.handling}}</span></div>
</div>
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Acceleration</span> <span class="val">{{this.acceleration}}</span></div>
<div class="data-item"><span class="sub-label">Speed Interval</span> <span class="val">{{this.speed_interval}}</span></div>
</div>
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Top Speed</span> <span class="val">{{this.top_speed}}</span></div>
<div class="data-item"><span class="sub-label">Body</span> <span class="val">{{this.body}}</span></div>
</div>
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Armor</span> <span class="val">{{this.armor}}</span></div>
<div class="data-item"><span class="sub-label">Pilot</span> <span class="val">{{this.pilot}}</span></div>
</div>
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Sensor</span> <span class="val">{{this.sensor}}</span></div>
<div class="data-item"><span class="sub-label">Seats</span> <span class="val">{{this.seats}}</span></div>
</div>
<div class="data-item full-line"><span class="sub-label">Notes</span> <span class="val">{{this.notes}}</span></div>
</div>
{{/each}}
{{else}}
<div class="empty-placeholder">— No vehicle / drone listed —</div>
{{/if}}
</div>
</section>
</div>
<!-- Bottom Row: Gear & Spells/Powers -->
<div class="sr6-row p2-row-gear-magic">
<!-- GEAR -->
<section class="sr6-card gear-card">
<h3 class="card-title">GEAR</h3>
<div class="card-content">
<table class="sheet-table">
<thead>
<tr>
<th>Item</th>
<th>Rating / Qty</th>
</tr>
</thead>
<tbody>
{{#each properties.gear}}
<tr>
<td><strong>{{this.name}}</strong>{{#if this.notes}} <small>({{this.notes}})</small>{{/if}}</td>
<td>{{#if this.rating}}Rtg {{this.rating}}{{else if this.quantity}}x{{this.quantity}}{{else}}—{{/if}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
<!-- SPELLS / COMPLEX FORMS & ADEPT POWERS -->
<div class="magic-powers-col">
<!-- Spells / Complex Forms -->
<section class="sr6-card spells-card">
<h3 class="card-title">SPELLS / PREPARATIONS / RITUALS / COMPLEX FORMS</h3>
<div class="card-content">
<table class="sheet-table">
<thead>
<tr>
<th>S/P/R/CF</th>
<th>Type/Target</th>
<th>Range</th>
<th>Duration</th>
<th>Drain</th>
</tr>
</thead>
<tbody>
{{#each properties.spells}}
<tr>
<td><strong>{{this.name}}</strong> <small>({{this.category}})</small></td>
<td>{{this.type_target}}</td>
<td>{{this.range}}</td>
<td>{{this.duration}}</td>
<td>{{this.drain}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
<!-- Adept Powers or Other Abilities -->
<section class="sr6-card adept-card">
<h3 class="card-title">ADEPT POWERS OR OTHER ABILITIES</h3>
<div class="card-content">
<table class="sheet-table">
<thead>
<tr>
<th>Name</th>
<th>Level</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
{{#each properties.adept_powers}}
<tr>
<td><strong>{{this.name}}</strong></td>
<td>{{this.level}}</td>
<td>{{this.notes}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
</div>
</div>
<!-- Page 2 Footer Legal Notice -->
<footer class="sr6-page-footer">
&copy; 2019-20 The Topps Company, Inc. Shadowrun is a registered trademark of The Topps Company, Inc., in the United States and/or other countries. Permission given to copy for personal use.
</footer>
</div>
</body>
</html>

View File

@@ -0,0 +1,308 @@
/* Shadowrunner Dossier Stylesheet - Extends character_sheet.css */
.dossier-cover-page {
padding: 36px 32px;
display: flex;
flex-direction: column;
gap: 20px;
background: #ffffff url('assets/_dev_sr6_circuit_bg.png') repeat-y;
background-size: 100% auto;
}
.dossier-cover-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 2px solid var(--sr6-magenta);
padding-bottom: 12px;
}
.dossier-logo {
max-width: 280px;
height: auto;
}
.dossier-tag {
font-size: 13px;
font-weight: 900;
letter-spacing: 1.5px;
color: var(--sr6-magenta);
background: var(--sr6-magenta-light);
padding: 6px 12px;
border-radius: 4px;
border: 1px solid var(--sr6-magenta);
}
.cover-hero-banner {
background: rgba(24, 23, 23, 0.96);
color: #ffffff;
padding: 24px 28px;
border-radius: 8px;
border-left: 6px solid var(--sr6-magenta);
box-shadow: 0 6px 20px rgba(0,0,0,0.2);
}
.hero-name {
margin: 0;
font-size: 38px;
font-weight: 900;
letter-spacing: 1px;
text-transform: uppercase;
color: #ffffff;
}
.hero-archetype {
margin: 4px 0 16px 0;
font-size: 16px;
font-weight: 700;
color: #e652a8;
letter-spacing: 0.5px;
text-transform: uppercase;
}
.hero-quote {
margin: 0;
font-style: italic;
font-size: 15px;
line-height: 1.45;
color: #dddddd;
border-left: 3px solid var(--sr6-magenta);
padding-left: 12px;
}
.cover-pitch-card {
background: var(--sr6-bg-card);
border: 1.5px solid var(--sr6-border-pink);
border-radius: 6px;
padding: 16px 20px;
}
.pitch-title {
margin: 0 0 8px 0;
font-size: 13px;
font-weight: 900;
color: var(--sr6-magenta);
letter-spacing: 0.5px;
}
.pitch-body {
margin: 0;
font-size: 14px;
line-height: 1.5;
color: #222;
font-weight: 500;
}
.cover-quickstart-guide {
background: #fdfafd;
border: 1px solid #dcbdd8;
border-radius: 6px;
padding: 16px 20px;
}
.cover-quickstart-guide h3 {
margin: 0 0 6px 0;
font-size: 13px;
font-weight: 900;
color: #111;
}
.cover-quickstart-guide p {
margin: 0 0 12px 0;
font-size: 12px;
color: #444;
line-height: 1.4;
}
.quickstart-pills {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.quickstart-pills .pill {
background: #ffffff;
border: 1px solid var(--sr6-magenta);
padding: 4px 10px;
border-radius: 20px;
font-size: 11.5px;
color: #222;
}
.quickstart-pills .pill strong {
color: var(--sr6-magenta);
}
/* Page 4 Profile Layout */
.dossier-profile-header {
border-bottom: 2px solid var(--sr6-magenta);
padding-bottom: 6px;
margin-bottom: 8px;
}
.profile-title {
margin: 0;
font-size: 20px;
font-weight: 900;
color: var(--sr6-magenta);
letter-spacing: 0.5px;
}
.profile-subtitle {
font-size: 12px;
font-weight: 700;
color: #555;
text-transform: uppercase;
margin-top: 2px;
}
.dossier-grid-layout {
display: grid;
grid-template-columns: 1.05fr 0.95fr;
gap: 16px;
}
.profile-col {
display: flex;
flex-direction: column;
gap: 12px;
}
.dossier-section {
background: var(--sr6-bg-card);
border: 1.5px solid var(--sr6-border-pink);
border-radius: 6px;
padding: 10px 12px;
}
.dossier-sec-title {
margin: 0 0 6px 0;
font-size: 11.5px;
font-weight: 900;
letter-spacing: 0.5px;
color: var(--sr6-magenta);
text-transform: uppercase;
border-bottom: 1px solid #ebd7e7;
padding-bottom: 2px;
}
.narrative-text {
margin: 0;
font-size: 11.5px;
line-height: 1.5;
color: #222;
text-align: justify;
}
/* Sample Actions Table */
.sample-actions-table {
width: 100%;
border-collapse: collapse;
font-size: 10.5px;
}
.sample-actions-table th {
background: #f7eef5;
border-bottom: 1.5px solid var(--sr6-magenta);
padding: 3px 4px;
text-align: left;
font-size: 9.5px;
font-weight: 800;
}
.sample-actions-table td {
padding: 3px 4px;
border-bottom: 1px solid #eee;
vertical-align: middle;
}
.action-pill {
display: inline-block;
font-size: 8.5px;
font-weight: 800;
padding: 1px 4px;
border-radius: 2px;
text-transform: uppercase;
}
.action-pill.Major {
background: #fde8e8;
color: #a81c1c;
}
.action-pill.Minor {
background: #e8f0fe;
color: #1a56db;
}
.action-pill.Free {
background: #e6f7ea;
color: #1b6329;
}
/* Vital Contacts List */
.contacts-detail-list, .hangout-list, .downtime-list {
margin: 0;
padding-left: 16px;
font-size: 11px;
line-height: 1.4;
color: #222;
}
.contacts-detail-list li, .hangout-list li, .downtime-list li {
margin-bottom: 4px;
}
.hangouts-downtime-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
/* Edge Boosts */
.edge-boosts-grid {
display: flex;
flex-direction: column;
gap: 4px;
}
.edge-boost-pill {
background: #faf6f9;
border: 1px solid #ebd7e7;
border-radius: 4px;
padding: 4px 6px;
display: flex;
align-items: baseline;
gap: 6px;
font-size: 10.5px;
}
.edge-cost {
font-size: 9.5px;
font-weight: 900;
color: #ffffff;
background: var(--sr6-magenta);
padding: 1px 5px;
border-radius: 2px;
white-space: nowrap;
}
.edge-name {
font-weight: 700;
color: #111;
}
.edge-boost-pill small {
color: #555;
margin-left: auto;
}
@media print {
.dossier-cover-page {
page-break-after: always;
}
.dossier-profile-page {
page-break-after: avoid;
}
}

View File

@@ -0,0 +1,429 @@
<!DOCTYPE html>
<html lang="en">
<head>
<base href="/rulesets/sr6/templates/">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{#if properties.alias}}{{properties.alias}}{{else if display_name}}{{display_name}}{{else}}Shadowrunner{{/if}} - Runner Dossier</title>
<link rel="stylesheet" href="character_sheet.css">
<link rel="stylesheet" href="dossier_sheet.css">
</head>
<body class="sr6-sheet-body dossier-body">
<!-- DOSSIER PAGE 1: COVER SPLASH -->
<div class="sr6-page dossier-cover-page">
<header class="dossier-cover-header">
<img src="assets/_dev_sr6_logo.png" alt="Shadowrun" class="dossier-logo">
<div class="dossier-tag">SHADOWRUNNER DOSSIER</div>
</header>
<div class="cover-hero-banner">
<h1 class="hero-name">{{#if properties.alias}}{{properties.alias}}{{else}}{{display_name}}{{/if}}</h1>
<h2 class="hero-archetype">{{properties.archetype}}</h2>
{{#if properties.quote}}
<blockquote class="hero-quote">
{{properties.quote}}
</blockquote>
{{/if}}
</div>
<div class="cover-pitch-card">
<h3 class="pitch-title">WHY PLAY THIS RUNNER?</h3>
<p class="pitch-body">{{properties.pitch}}</p>
</div>
<div class="cover-quickstart-guide">
<h3>READ THIS FIRST</h3>
<p>All you need to read are these pages, and with your GM, you can dive right into the shadows! Review your core stats, roll your dice pools, and unleash havoc across the sprawl.</p>
<div class="quickstart-pills">
<span class="pill">Metatype: <strong>{{properties.metatype}}</strong></span>
<span class="pill">Initiative: <strong>{{properties.combat_info.initiative}}</strong></span>
<span class="pill">Defense Rating: <strong>{{properties.combat_info.defense_rating}}</strong></span>
<span class="pill">Primary DV: <strong>{{properties.primary_ranged_weapon.dv}}</strong></span>
</div>
</div>
<footer class="sr6-page-footer">
&copy; 2019-20 The Topps Company, Inc. Shadowrun is a registered trademark of The Topps Company, Inc. Permission given to copy for personal use.
</footer>
</div>
<!-- DOSSIER PAGES 2 & 3: THE RUNNER'S DATA & COMBAT RECORD -->
<!-- (Embeds the full 2-page character sheet layout) -->
<div class="sr6-page page-1">
<header class="sr6-header">
<div class="header-logo-area">
<img src="assets/_dev_sr6_logo.png" alt="Shadowrun" class="sr6-logo-img">
</div>
<div class="header-fields">
<div class="header-field-line">
<span class="field-label">CHARACTER</span>
<span class="field-value">{{#if properties.alias}}{{properties.alias}}{{else}}{{display_name}}{{/if}}</span>
</div>
<div class="header-field-line">
<span class="field-label">PLAYER</span>
<span class="field-value">{{properties.player}}</span>
</div>
<div class="header-field-line">
<span class="field-label">NOTES</span>
<span class="field-value">{{properties.notes}}</span>
</div>
</div>
</header>
<!-- Top Row: Personal Data & Core Combat Info -->
<div class="sr6-row row-top">
<section class="sr6-card personal-data-card">
<h3 class="card-title">PERSONAL DATA</h3>
<div class="card-content">
<div class="data-row line-alias">
<span class="sub-label">NAME/PRIMARY ALIAS</span>
<span class="val">{{#if properties.alias}}{{properties.alias}}{{else}}{{display_name}}{{/if}}{{#if properties.real_name}} ({{properties.real_name}}){{/if}}</span>
</div>
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Metatype</span> <span class="val">{{properties.metatype}}</span></div>
<div class="data-item"><span class="sub-label">Ethnicity</span> <span class="val">{{properties.ethnicity}}</span></div>
</div>
<div class="data-grid grid-4-col">
<div class="data-item"><span class="sub-label">Age</span> <span class="val">{{properties.age}}</span></div>
<div class="data-item"><span class="sub-label">Sex</span> <span class="val">{{properties.sex}}</span></div>
<div class="data-item"><span class="sub-label">Height</span> <span class="val">{{properties.height}}</span></div>
<div class="data-item"><span class="sub-label">Weight</span> <span class="val">{{properties.weight}}</span></div>
</div>
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Reputation</span> <span class="val">{{properties.reputation}}</span></div>
<div class="data-item"><span class="sub-label">Heat</span> <span class="val">{{properties.heat}}</span></div>
</div>
<div class="data-grid grid-3-col">
<div class="data-item"><span class="sub-label">Karma</span> <span class="val">{{properties.karma}}</span></div>
<div class="data-item"><span class="sub-label">Total Karma</span> <span class="val">{{properties.total_karma}}</span></div>
<div class="data-item"><span class="sub-label">Misc</span> <span class="val">{{properties.misc}}</span></div>
</div>
</div>
</section>
<section class="sr6-card combat-info-card">
<h3 class="card-title">CORE COMBAT INFO</h3>
<div class="card-content">
<div class="combat-armor-row">
<span class="sub-label">Primary Armor</span>
<span class="val">{{properties.primary_armor.name}}</span>
<span class="sub-label rtg-label">Rating</span>
<span class="val rtg-val">{{properties.primary_armor.rating}}</span>
</div>
<div class="combat-weapon-block">
<div class="weapon-header">
<span class="sub-label">Primary Ranged Weapon</span>
<span class="val">{{properties.primary_ranged_weapon.name}}</span>
</div>
<div class="weapon-stats-strip">
<span class="ws-item"><span class="sub-label">DV</span> <span class="val">{{properties.primary_ranged_weapon.dv}}</span></span>
<span class="ws-item"><span class="sub-label">Mode</span> <span class="val">{{properties.primary_ranged_weapon.mode}}</span></span>
<span class="ws-item"><span class="sub-label">Close</span> <span class="val">{{properties.primary_ranged_weapon.attack_rating.close}}</span></span>
<span class="ws-item"><span class="sub-label">Near</span> <span class="val">{{properties.primary_ranged_weapon.attack_rating.near}}</span></span>
<span class="ws-item"><span class="sub-label">Far</span> <span class="val">{{properties.primary_ranged_weapon.attack_rating.far}}</span></span>
<span class="ws-item"><span class="sub-label">Extreme</span> <span class="val">{{properties.primary_ranged_weapon.attack_rating.extreme}}</span></span>
<span class="ws-item"><span class="sub-label">Ammo</span> <span class="val">{{properties.primary_ranged_weapon.ammo}}</span></span>
</div>
</div>
<div class="combat-weapon-block">
<div class="weapon-header">
<span class="sub-label">Primary Melee Weapon</span>
<span class="val">{{properties.primary_melee_weapon.name}}</span>
</div>
<div class="weapon-stats-strip">
<span class="ws-item"><span class="sub-label">DV</span> <span class="val">{{properties.primary_melee_weapon.dv}}</span></span>
<span class="ws-item"><span class="sub-label">Close</span> <span class="val">{{properties.primary_melee_weapon.close}}</span></span>
</div>
</div>
<div class="data-grid grid-2-col combat-defense-strip">
<div class="data-item"><span class="sub-label">Unarmed AR</span> <span class="val">{{properties.combat_info.unarmed_ar}}</span></div>
<div class="data-item"><span class="sub-label">Defense Rating</span> <span class="val bold-highlight">{{properties.combat_info.defense_rating}}</span></div>
</div>
</div>
</section>
</div>
<!-- Middle Row: Attributes & Condition Monitor -->
<div class="sr6-row row-mid">
<section class="sr6-card attributes-card">
<h3 class="card-title">ATTRIBUTES</h3>
<div class="card-content attributes-grid">
<div class="attr-sub-col">
<div class="attr-line"><span class="attr-name">Body</span> <span class="attr-val">{{attr properties.attributes "body"}}</span></div>
<div class="attr-line"><span class="attr-name">Agility</span> <span class="attr-val">{{attr properties.attributes "agility"}}</span></div>
<div class="attr-line"><span class="attr-name">Reaction</span> <span class="attr-val">{{attr properties.attributes "reaction"}}</span></div>
<div class="attr-line"><span class="attr-name">Strength</span> <span class="attr-val">{{attr properties.attributes "strength"}}</span></div>
<div class="attr-line"><span class="attr-name">Willpower</span> <span class="attr-val">{{attr properties.attributes "willpower"}}</span></div>
<div class="attr-line"><span class="attr-name">Logic</span> <span class="attr-val">{{attr properties.attributes "logic"}}</span></div>
<div class="attr-line"><span class="attr-name">Intuition</span> <span class="attr-val">{{attr properties.attributes "intuition"}}</span></div>
<div class="attr-line"><span class="attr-name">Charisma</span> <span class="attr-val">{{attr properties.attributes "charisma"}}</span></div>
<div class="attr-line"><span class="attr-name">Edge</span> <span class="attr-val">{{attr properties.attributes "edge"}}</span></div>
<div class="edge-tracker-row">
<span class="sub-label">Edge Points</span>
<div class="edge-boxes">
{{#edgePointsBoxes (attr properties.attributes "edge") properties.attributes.edge_points}}
<span class="edge-box {{#if filled}}filled{{/if}} {{#if disabled}}disabled{{/if}}"></span>
{{/edgePointsBoxes}}
</div>
</div>
<div class="attr-line"><span class="attr-name">Unarmed AR</span> <span class="attr-val">{{properties.combat_info.unarmed_ar}}</span></div>
</div>
<div class="attr-sub-col">
<div class="attr-line"><span class="attr-name">Essence</span> <span class="attr-val">{{properties.attributes.essence}}</span></div>
<div class="attr-line"><span class="attr-name">Magic/Resonance</span> <span class="attr-val">{{#if properties.attributes.magic}}{{properties.attributes.magic}}{{else if properties.attributes.resonance}}{{properties.attributes.resonance}}{{else}}—{{/if}}</span></div>
<div class="attr-line highlight-accent"><span class="attr-name">Initiative</span> <span class="attr-val">{{properties.combat_info.initiative}}</span></div>
<div class="attr-line"><span class="attr-name">Matrix Initiative</span> <span class="attr-val">{{properties.combat_info.matrix_initiative}}</span></div>
<div class="attr-line"><span class="attr-name">Astral Initiative</span> <span class="attr-val">{{properties.combat_info.astral_initiative}}</span></div>
<div class="attr-line"><span class="attr-name">Composure</span> <span class="attr-val">{{properties.combat_info.composure}}</span></div>
<div class="attr-line"><span class="attr-name">Judge Intentions</span> <span class="attr-val">{{properties.combat_info.judge_intentions}}</span></div>
<div class="attr-line"><span class="attr-name">Memory</span> <span class="attr-val">{{properties.combat_info.memory}}</span></div>
<div class="attr-line"><span class="attr-name">Lift/Carry</span> <span class="attr-val">{{properties.combat_info.lift_carry}}</span></div>
<div class="attr-line"><span class="attr-name">Movement</span> <span class="attr-val">{{properties.combat_info.movement}}</span></div>
<div class="attr-line highlight-accent"><span class="attr-name">Defense Rating</span> <span class="attr-val">{{properties.combat_info.defense_rating}}</span></div>
</div>
</div>
</section>
<section class="sr6-card condition-monitor-card">
<h3 class="card-title">CONDITION MONITOR</h3>
<div class="card-content monitor-tracks-wrapper">
<div class="track-column">
<div class="track-title">Physical Damage Track</div>
<div class="track-grid">
{{#conditionMonitorRows (calcPhysicalBoxes (attr properties.attributes "body")) properties.condition_monitor.physical_damage 18}}
<div class="monitor-row">
<div class="row-boxes">
{{#each boxes}}
<div class="damage-box {{#if filled}}damage-filled{{/if}} {{#if blackedOut}}box-blacked-out{{/if}}"><div class="inner-box"></div></div>
{{/each}}
</div>
<div class="penalty-tag">{{penalty}}</div>
</div>
{{/conditionMonitorRows}}
</div>
<div class="track-footnote">8 + (Body &divide; 2, round up) boxes; black out extra boxes.</div>
</div>
<div class="track-column">
<div class="track-title">Stun Damage Track</div>
<div class="track-grid">
{{#conditionMonitorRows (calcStunBoxes (attr properties.attributes "willpower")) properties.condition_monitor.stun_damage 12}}
<div class="monitor-row">
<div class="row-boxes">
{{#each boxes}}
<div class="damage-box {{#if filled}}damage-filled{{/if}} {{#if blackedOut}}box-blacked-out{{/if}}"><div class="inner-box"></div></div>
{{/each}}
</div>
<div class="penalty-tag">{{penalty}}</div>
</div>
{{/conditionMonitorRows}}
</div>
<div class="track-footnote">8 + (Will &divide; 2, round up) boxes; black out extra boxes.</div>
</div>
</div>
<div class="monitor-cumulative-rule">
For every 3 boxes of damage on any track, take &minus;1 Dice Pool modifier; modifiers are cumulative across tracks.
</div>
</section>
</div>
<!-- Skills & Qualities -->
<div class="sr6-row row-lower">
<section class="sr6-card skills-card">
<h3 class="card-title">SKILLS</h3>
<div class="card-content skills-table-wrap">
<table class="skills-table">
<thead>
<tr><th>Skill</th><th>RNK</th><th>ATT</th><th>DP</th><th>Type</th></tr>
</thead>
<tbody>
{{#each properties.skills}}
<tr>
<td><strong>{{this.name}}</strong>{{#if this.specialization}} <span class="skill-spec">({{this.specialization}})</span>{{/if}}</td>
<td>{{this.rating}}</td>
<td>{{this.attribute}}</td>
<td class="col-dp">{{#if this.dice_pool}}{{this.dice_pool}}{{else}}{{calcDicePool this ../properties.attributes}}{{/if}}</td>
<td>{{this.type}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
<section class="sr6-card qualities-card">
<h3 class="card-title">QUALITIES</h3>
<div class="card-content qualities-table-wrap">
<table class="qualities-table">
<thead><tr><th>Quality</th><th>Notes</th><th>Type</th></tr></thead>
<tbody>
{{#each properties.qualities}}
<tr>
<td><strong>{{this.name}}</strong></td>
<td>{{this.notes}}</td>
<td><span class="quality-badge {{this.type}}">{{this.type}}</span></td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
</div>
<!-- Currency & Contacts -->
<div class="sr6-row row-bottom">
<section class="sr6-card currency-card">
<h3 class="card-title">IDS / LIFESTYLES / CURRENCY</h3>
<div class="card-content">
<div class="data-grid grid-2-col">
<div class="data-item"><span class="sub-label">Primary Lifestyle</span> <span class="val">{{properties.currency_and_ids.primary_lifestyle}}</span></div>
<div class="data-item"><span class="sub-label">Nuyen</span> <span class="val bold-highlight">{{formatNuyen properties.currency_and_ids.nuyen}}</span></div>
</div>
<div class="data-item full-line"><span class="sub-label">Licenses</span> <span class="val">{{properties.currency_and_ids.licenses}}</span></div>
</div>
</section>
<section class="sr6-card contacts-card">
<h3 class="card-title">CONTACTS</h3>
<div class="card-content contacts-table-wrap">
<table class="contacts-table">
<thead><tr><th>Name</th><th>Loyalty</th><th>Connection</th><th>Notes</th></tr></thead>
<tbody>
{{#each properties.contacts}}
<tr>
<td><strong>{{this.name}}</strong></td>
<td>{{this.loyalty}}</td>
<td>{{this.connection}}</td>
<td>{{this.notes}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</section>
</div>
<footer class="sr6-page-footer">
&copy; 2019-20 The Topps Company, Inc. Shadowrun is a registered trademark of The Topps Company, Inc.
</footer>
</div>
<!-- DOSSIER PAGE 4: PROFILE, TACTICS & SAMPLE ACTIONS -->
<div class="sr6-page dossier-profile-page">
<header class="dossier-profile-header">
<h2 class="profile-title">{{#if properties.alias}}{{properties.alias}}{{else}}{{display_name}}{{/if}} // RUNNER PROFILE</h2>
<div class="profile-subtitle">{{properties.archetype}}</div>
</header>
<div class="dossier-grid-layout">
<!-- Left Narrative Column -->
<div class="profile-col narrative-col">
<!-- Background -->
<section class="dossier-section">
<h3 class="dossier-sec-title">BACKGROUND</h3>
<p class="narrative-text">{{properties.background}}</p>
</section>
<!-- Preferred Tactics -->
<section class="dossier-section">
<h3 class="dossier-sec-title">PREFERRED TACTICS</h3>
<p class="narrative-text">{{properties.preferred_tactics}}</p>
</section>
<!-- Roleplaying Tips -->
<section class="dossier-section">
<h3 class="dossier-sec-title">ROLEPLAYING TIPS</h3>
<p class="narrative-text">{{properties.roleplaying_tips}}</p>
</section>
</div>
<!-- Right Tactical Column -->
<div class="profile-col tactical-col">
<!-- Tailored Sample Actions Table -->
<section class="dossier-section sample-actions-section">
<h3 class="dossier-sec-title">SAMPLE ACTIONS & DICE POOLS</h3>
<table class="sample-actions-table">
<thead>
<tr>
<th>Action</th>
<th>Type</th>
<th>DP</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
{{#each properties.sample_actions}}
<tr>
<td><strong>{{this.action}}</strong></td>
<td><span class="action-pill {{this.action_type}}">{{this.action_type}}</span></td>
<td class="col-dp">{{this.dice_pool}}</td>
<td><small>{{this.notes}}</small></td>
</tr>
{{/each}}
</tbody>
</table>
</section>
<!-- Vital Contacts -->
<section class="dossier-section">
<h3 class="dossier-sec-title">VITAL CONTACTS</h3>
<ul class="contacts-detail-list">
{{#each properties.vital_contacts}}
<li>
<strong>{{this.name}}</strong> &mdash; <em>{{this.role}}</em>: {{this.description}}
</li>
{{/each}}
</ul>
</section>
<!-- Favorite Hangouts & Downtime -->
<div class="hangouts-downtime-grid">
<section class="dossier-section">
<h3 class="dossier-sec-title">FAVORITE HANGOUTS</h3>
<ul class="hangout-list">
{{#each properties.favorite_hangouts}}
<li><strong>{{this.name}}</strong> ({{this.location}}): {{this.description}}</li>
{{/each}}
</ul>
</section>
<section class="dossier-section">
<h3 class="dossier-sec-title">DOWNTIME ACTIVITIES</h3>
<ul class="downtime-list">
{{#each properties.favorite_downtime_activities}}
<li>{{this}}</li>
{{/each}}
</ul>
</section>
</div>
<!-- Edge Boosts -->
{{#if properties.edge_boosts}}
<section class="dossier-section edge-boosts-section">
<h3 class="dossier-sec-title">RECOMMENDED EDGE BOOSTS</h3>
<div class="edge-boosts-grid">
{{#each properties.edge_boosts}}
<div class="edge-boost-pill">
<span class="edge-cost">{{this.cost}} Edge</span>
<span class="edge-name">{{this.name}}</span>
<small>{{this.description}}</small>
</div>
{{/each}}
</div>
</section>
{{/if}}
</div>
</div>
<footer class="sr6-page-footer">
&copy; 2019-20 The Topps Company, Inc. Shadowrun is a registered trademark of The Topps Company, Inc.
</footer>
</div>
</body>
</html>