feat: fiche de Communauté (socle)

- acteur community (identité, géographie, histoire, objectifs, taille/effectif)
- 4 Domaines x 2 jauges avec états (Crise/Bas/Stable/Opulent), moral, réserves
- onglets Identité / Domaines / Ressources, édition ProseMirror (formInput)
- header avec fond, totem, niveau, effectif ; icône par défaut
- libellé du type via typeLabels (sans écraser TYPES.* du core)
This commit is contained in:
2026-08-04 17:20:29 +02:00
parent 8d8428cad3
commit 6247f65590
17 changed files with 1080 additions and 7 deletions
@@ -0,0 +1,54 @@
<div class="tab domains sheet-part {{#if @root.tabs.domains.active}}active{{/if}}" data-group="sheet" data-tab="domains">
<section class="community-section">
<h3>{{ localize 'COMMUNITY.size_title' }}</h3>
<div class="flexrow community-size">
<div class="form-group" style="flex: 1;">
<label for="system.size.value">{{ localize 'COMMUNITY.size_label' }}</label>
{{#if isEditMode}}
<select name="system.size.value" data-dtype="Number">
{{#each sizeOptions as |cfg level|}}
<option value="{{ level }}" {{#ife @root.system.size.value level}}selected{{/ife}}>{{ localize cfg.label }}</option>
{{/each}}
</select>
{{else}}
<span>{{ sizeLabel }}</span>
{{/if}}
</div>
<div class="form-group" style="flex: 1;">
<label for="system.population">{{ localize 'COMMUNITY.population' }}</label>
{{#if isEditMode}}
<input type="number" name="system.population" value="{{system.population}}" data-dtype="Number" min="0" />
{{else}}
<span>{{system.population}}</span>
{{/if}}
</div>
</div>
{{#if sizeInfo}}
<p class="community-size-info">
{{ localize 'COMMUNITY.population_range' }}: <strong>{{ sizeInfo.population }}</strong> ·
{{ localize 'COMMUNITY.figures' }}: <strong>{{ sizeInfo.figures }}+</strong> ·
{{ localize 'COMMUNITY.companies' }}: <strong>{{ sizeInfo.companies }}+</strong>
</p>
{{/if}}
</section>
{{#each domains}}
<section class="community-section">
<h3>{{ this.label }}</h3>
<div class="grid grid-2col">
{{#each this.sections}}
<div class="gauge {{ this.state }}">
<label for="system.domains.{{ this.domainKey }}.{{ this.key }}.value">{{ this.label }}</label>
{{#if @root.isEditMode}}
<input type="number" name="system.domains.{{ this.domainKey }}.{{ this.key }}.value"
value="{{ this.gauge.value }}" data-dtype="Number" min="0" />
{{else}}
<span class="gauge-value">{{ this.gauge.value }}D</span>
{{/if}}
<span class="gauge-state {{ this.state }}">{{ this.stateLabel }}</span>
</div>
{{/each}}
</div>
</section>
{{/each}}
</div>
@@ -0,0 +1,137 @@
<div class="tab identity sheet-part {{#if @root.tabs.identity.active}}active{{/if}}" data-group="sheet" data-tab="identity">
<section class="community-section">
<h3>{{ localize 'COMMUNITY.identity' }}</h3>
<div class="grid grid-2col">
<div class="form-group">
<label for="system.identity.origin">{{ localize 'COMMUNITY.origin' }}</label>
{{#if isEditMode}}
<input type="text" name="system.identity.origin" value="{{system.identity.origin}}" data-dtype="String" />
{{else}}
<span>{{system.identity.origin}}</span>
{{/if}}
</div>
<div class="form-group">
<label for="system.identity.theme">{{ localize 'COMMUNITY.theme' }}</label>
{{#if isEditMode}}
<input type="text" name="system.identity.theme" value="{{system.identity.theme}}" data-dtype="String" />
{{else}}
<span>{{system.identity.theme}}</span>
{{/if}}
</div>
<div class="form-group">
<label for="system.identity.age">{{ localize 'COMMUNITY.age_label' }}</label>
{{#if isEditMode}}
<select name="system.identity.age" data-dtype="String">
{{#each ageOptions}}
<option value="{{ this.key }}" {{#ife @root.system.identity.age this.key}}selected{{/ife}}>{{ this.label }}</option>
{{/each}}
</select>
{{else}}
<span>{{#each ageOptions}}{{#ife @root.system.identity.age this.key}}{{ this.label }}{{/ife}}{{/each}}</span>
{{/if}}
</div>
<div class="form-group">
<label>{{ localize 'COMMUNITY.instincts' }}</label>
{{#if isEditMode}}
<input type="text" name="system.identity.instincts" value="{{system.identity.instincts}}" data-dtype="String" />
{{else}}
<span>{{system.identity.instincts}}</span>
{{/if}}
</div>
<div class="form-group">
<label>{{ localize 'COMMUNITY.prohibits' }}</label>
{{#if isEditMode}}
<input type="text" name="system.identity.prohibits" value="{{system.identity.prohibits}}" data-dtype="String" />
{{else}}
<span>{{system.identity.prohibits}}</span>
{{/if}}
</div>
</div>
<div class="form-group">
<label for="system.identity.notes">{{ localize 'COMMUNITY.notes' }}</label>
{{formInput systemFields.identity.fields.notes enriched=enrichedNotes value=system.identity.notes name="system.identity.notes" toggled=true}}
</div>
</section>
<section class="community-section">
<h3>{{ localize 'COMMUNITY.location' }}</h3>
<div class="grid grid-2col">
<div class="form-group">
<label for="system.location.sector">{{ localize 'COMMUNITY.sector' }}</label>
{{#if isEditMode}}
<input type="text" name="system.location.sector" value="{{system.location.sector}}" data-dtype="String" />
{{else}}
<span>{{system.location.sector}}</span>
{{/if}}
</div>
<div class="form-group">
<label for="system.location.placeType">{{ localize 'COMMUNITY.placeType' }}</label>
{{#if isEditMode}}
<input type="text" name="system.location.placeType" value="{{system.location.placeType}}" data-dtype="String" />
{{else}}
<span>{{system.location.placeType}}</span>
{{/if}}
</div>
</div>
<div class="form-group">
<label for="system.location.landmarks">{{ localize 'COMMUNITY.landmarks' }}</label>
{{formInput systemFields.location.fields.landmarks enriched=enrichedLandmarks value=system.location.landmarks name="system.location.landmarks" toggled=true}}
</div>
<div class="form-group">
<label for="system.location.territory">{{ localize 'COMMUNITY.territory' }}</label>
{{formInput systemFields.location.fields.territory enriched=enrichedTerritory value=system.location.territory name="system.location.territory" toggled=true}}
</div>
</section>
<section class="community-section">
<h3>{{ localize 'COMMUNITY.history' }}</h3>
<div class="form-group">
<label for="system.history.founding">{{ localize 'COMMUNITY.founding' }}</label>
{{#if isEditMode}}
<input type="text" name="system.history.founding" value="{{system.history.founding}}" data-dtype="String" />
{{else}}
<span>{{system.history.founding}}</span>
{{/if}}
</div>
<div class="form-group">
<label for="system.history.events">{{ localize 'COMMUNITY.events' }}</label>
{{formInput systemFields.history.fields.events enriched=enrichedEvents value=system.history.events name="system.history.events" toggled=true}}
</div>
<div class="form-group">
<label for="system.history.relations">{{ localize 'COMMUNITY.history_relations' }}</label>
{{formInput systemFields.history.fields.relations enriched=enrichedRelations value=system.history.relations name="system.history.relations" toggled=true}}
</div>
</section>
<section class="community-section">
<h3>{{ localize 'COMMUNITY.objectives' }}</h3>
<div class="form-group">
<label for="system.objectives.major">{{ localize 'COMMUNITY.objective_major' }}</label>
{{#if isEditMode}}
<input type="text" name="system.objectives.major" value="{{system.objectives.major}}" data-dtype="String" />
{{else}}
<span>{{system.objectives.major}}</span>
{{/if}}
</div>
<div class="form-group">
<label>{{ localize 'COMMUNITY.objectives_minor' }}</label>
<ol class="items-list">
{{#each system.objectives.minor as |obj index|}}
<li class="item flexrow" data-index="{{index}}">
{{#if @root.isEditMode}}
<input type="text" name="system.objectives.minor.{{index}}" value="{{obj}}" data-dtype="String" style="flex: 1;" />
<a data-action="deleteObjective" data-index="{{index}}" title="{{ localize 'VERMINE.delete' }}"><i class="fas fa-trash"></i></a>
{{else}}
<span style="flex: 1;">{{obj}}</span>
{{/if}}
</li>
{{/each}}
{{#if isEditMode}}
<li class="item flexrow">
<a data-action="addObjective" title="{{ localize 'VERMINE.add' }}"><i class="fas fa-plus"></i> {{ localize 'COMMUNITY.add_objective' }}</a>
</li>
{{/if}}
</ol>
</div>
</section>
</div>
+79
View File
@@ -0,0 +1,79 @@
<div class="tab main sheet-part" data-group="sheet" data-tab="main">
{{!-- Toggle Edit/Play --}}
<div class="sheet-header-toggle">
{{#if isEditMode}}
<button type="button" data-action="toggleSheet">{{localize "VERMINE.playMode"}}</button>
{{else}}
<button type="button" data-action="toggleSheet">{{localize "VERMINE.editMode"}}</button>
{{/if}}
</div>
{{!-- HEADER --}}
<header class="char-header grid grid-12col w-full">
<div class="grid-span-2 community-portrait">
<img class="profile-img" src="{{actor.img}}" data-action="editImage" data-edit="img" width="110"
height="110" title="{{actor.name}}" />
</div>
<section class="char-details grid-span-6">
<h1 class="char-name flexrow flex-group-left w-full">
<label>{{ localize 'IDENTITY.name' }}</label>
{{#if isEditMode}}
<input name="name" type="text" value="{{actor.name}}" placeholder="{{ localize 'COMMUNITY.name_placeholder' }}" />
{{else}}
<span>{{actor.name}}</span>
{{/if}}
</h1>
<div class="profile flexrow flex-group-center">
<label>{{ localize 'IDENTITY.profile' }}</label>
{{#if isEditMode}}
<input name="system.identity.profile" type="text" value="{{system.identity.profile}}" data-dtype="String" />
{{else}}
<span>{{#if system.identity.profile}}{{system.identity.profile}}{{else}}{{ localize 'COMMUNITY.profile_hint' }}{{/if}}</span>
{{/if}}
</div>
<div class="origin flexrow flex-group-center">
<label>{{ localize 'COMMUNITY.origin' }}</label>
{{#if isEditMode}}
<input name="system.identity.origin" type="text" value="{{system.identity.origin}}" data-dtype="String" />
{{else}}
<span>{{system.identity.origin}}</span>
{{/if}}
</div>
</section>
<section class="char-level grid-span-4">
<h1 class="char-vermine2047 flexrow flex-group-left w-full">
{{#if (eq system.identity.totem "")}}
<a data-action="chooseTotem" class="chooseTotem">{{ localize 'COMMUNITY.choose_totem' }}&hellip;</a>
{{ else }}
<a data-action="chooseTotem" class="chooseTotem">{{ smarttl "TOTEMS" system.identity.totem }}</a>
{{/if}}
</h1>
<div class="level flexrow flex-group-center">
<label>{{ localize 'VERMINE.level' }}</label>
{{#if isEditMode}}
<input name="system.level.value" type="number" value="{{system.level.value}}" data-dtype="Number" min="{{system.level.min}}" max="{{system.level.max}}" />
{{else}}
<span>{{system.level.value}}</span>
{{/if}}
<span>/ {{system.level.max}}</span>
</div>
<div class="population flexrow flex-group-center">
<label>{{ localize 'COMMUNITY.population' }}</label>
{{#if isEditMode}}
<input name="system.population" type="number" value="{{system.population}}" data-dtype="Number" min="0" />
{{else}}
<span>{{system.population}}</span>
{{/if}}
</div>
</section>
</header>
{{#if resolvedGroup}}
<div class="community-linked-group">
<span class="label">{{ localize 'COMMUNITY.linked_group' }}:</span>
<span class="value">{{ resolvedGroup.name }}</span>
</div>
{{/if}}
</div>
@@ -0,0 +1,63 @@
<div class="tab resources sheet-part {{#if @root.tabs.resources.active}}active{{/if}}" data-group="sheet" data-tab="resources">
<section class="community-section">
<h3>{{ localize 'COMMUNITY.reserves' }}</h3>
<div class="grid grid-3col">
<div class="form-group">
<label for="system.reserve.value">{{ localize 'COMMUNITY.group_reserve' }}</label>
{{#if isEditMode}}
<input type="number" name="system.reserve.value" value="{{system.reserve.value}}" data-dtype="Number" min="0" max="{{system.reserve.max}}" />
{{else}}
<span>{{system.reserve.value}} / {{system.reserve.max}}</span>
{{/if}}
</div>
<div class="form-group">
<label for="system.material">{{ localize 'COMMUNITY.material_dice' }}</label>
{{#if isEditMode}}
<input type="number" name="system.material" value="{{system.material}}" data-dtype="Number" min="0" />
{{else}}
<span>{{system.material}}D</span>
{{/if}}
</div>
<div class="form-group">
<label for="system.experience.dice">{{ localize 'COMMUNITY.experience_dice' }}</label>
{{#if isEditMode}}
<input type="number" name="system.experience.dice" value="{{system.experience.dice}}" data-dtype="Number" min="0" />
{{else}}
<span>{{system.experience.dice}}D</span>
{{/if}}
</div>
</div>
</section>
<section class="community-section">
<h3>{{ localize 'COMMUNITY.morale' }}</h3>
<div class="flexrow">
<div class="form-group" style="flex: 1;">
<label for="system.morale.value">{{ localize 'COMMUNITY.morale_value' }}</label>
{{#if isEditMode}}
<input type="number" name="system.morale.value" value="{{system.morale.value}}" data-dtype="Number" min="0" max="7" />
{{else}}
<span>{{system.morale.value}}</span>
{{/if}}
</div>
<div class="form-group" style="flex: 1;">
<label>{{ localize 'COMMUNITY.morale_state' }}</label>
<span class="morale-level {{ system.morale.level }}">{{ localize (concat 'COMMUNITY.morale_levels.' system.morale.level) }}</span>
</div>
</div>
{{#if system.allDomainsLow}}
<p class="community-warning">{{ localize 'COMMUNITY.morale_blocked' }}</p>
{{/if}}
</section>
<section class="community-section">
<h3>{{ localize 'COMMUNITY.habitants_title' }}</h3>
<p class="community-hint">{{ localize 'COMMUNITY.habitants_coming' }}</p>
{{#if resolvedGroup}}
<p class="community-linked-group">
<span class="label">{{ localize 'COMMUNITY.linked_group' }}:</span>
<span class="value">{{ resolvedGroup.name }}</span>
</p>
{{/if}}
</section>
</div>