@atlashub/smartstack-cli 3.7.0 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +365 -2
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
- package/templates/agents/action.md +1 -0
- package/templates/agents/ba-writer.md +33 -0
- package/templates/agents/explore-codebase.md +1 -0
- package/templates/agents/explore-docs.md +1 -0
- package/templates/agents/fix-grammar.md +1 -0
- package/templates/agents/snipper.md +1 -0
- package/templates/skills/admin/SKILL.md +6 -0
- package/templates/skills/ai-prompt/SKILL.md +32 -136
- package/templates/skills/ai-prompt/steps/step-01-implementation.md +122 -0
- package/templates/skills/apex/SKILL.md +120 -0
- package/templates/skills/apex/_shared.md +86 -0
- package/templates/skills/apex/references/agent-teams-protocol.md +164 -0
- package/templates/skills/apex/references/smartstack-layers.md +173 -0
- package/templates/skills/apex/steps/step-00-init.md +156 -0
- package/templates/skills/apex/steps/step-01-analyze.md +169 -0
- package/templates/skills/apex/steps/step-02-plan.md +160 -0
- package/templates/skills/apex/steps/step-03-execute.md +166 -0
- package/templates/skills/apex/steps/step-04-validate.md +138 -0
- package/templates/skills/apex/steps/step-05-examine.md +124 -0
- package/templates/skills/apex/steps/step-06-resolve.md +105 -0
- package/templates/skills/apex/steps/step-07-tests.md +130 -0
- package/templates/skills/apex/steps/step-08-run-tests.md +115 -0
- package/templates/skills/application/SKILL.md +10 -0
- package/templates/skills/application/references/backend-controller-hierarchy.md +58 -0
- package/templates/skills/application/references/backend-entity-seeding.md +72 -0
- package/templates/skills/application/references/backend-verification.md +88 -0
- package/templates/skills/application/references/frontend-verification.md +111 -0
- package/templates/skills/application/references/nav-fallback-procedure.md +200 -0
- package/templates/skills/application/references/provider-template.md +134 -0
- package/templates/skills/application/references/test-frontend.md +73 -0
- package/templates/skills/application/references/test-prerequisites.md +72 -0
- package/templates/skills/application/steps/step-01-navigation.md +7 -198
- package/templates/skills/application/steps/step-03b-provider.md +4 -128
- package/templates/skills/application/steps/step-04-backend.md +20 -350
- package/templates/skills/application/steps/step-05-frontend.md +12 -101
- package/templates/skills/application/steps/step-07-tests.md +12 -132
- package/templates/skills/business-analyse/SKILL.md +11 -2
- package/templates/skills/business-analyse/html/ba-interactive.html +3214 -2246
- package/templates/skills/business-analyse/html/build-html.js +77 -0
- package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +130 -0
- package/templates/skills/business-analyse/html/src/scripts/02-navigation.js +22 -0
- package/templates/skills/business-analyse/html/src/scripts/03-render-cadrage.js +208 -0
- package/templates/skills/business-analyse/html/src/scripts/04-render-modules.js +211 -0
- package/templates/skills/business-analyse/html/src/scripts/05-render-specs.js +554 -0
- package/templates/skills/business-analyse/html/src/scripts/06-render-consolidation.js +110 -0
- package/templates/skills/business-analyse/html/src/scripts/07-render-handoff.js +90 -0
- package/templates/skills/business-analyse/html/src/scripts/08-editing.js +45 -0
- package/templates/skills/business-analyse/html/src/scripts/09-export.js +168 -0
- package/templates/skills/business-analyse/html/src/scripts/10-comments.js +171 -0
- package/templates/skills/business-analyse/html/src/scripts/11-review-panel.js +161 -0
- package/templates/skills/business-analyse/html/src/styles/01-variables.css +38 -0
- package/templates/skills/business-analyse/html/src/styles/02-layout.css +101 -0
- package/templates/skills/business-analyse/html/src/styles/03-navigation.css +62 -0
- package/templates/skills/business-analyse/html/src/styles/04-cards.css +196 -0
- package/templates/skills/business-analyse/html/src/styles/05-modules.css +325 -0
- package/templates/skills/business-analyse/html/src/styles/06-wireframes.css +230 -0
- package/templates/skills/business-analyse/html/src/styles/07-comments.css +184 -0
- package/templates/skills/business-analyse/html/src/styles/08-review-panel.css +241 -0
- package/templates/skills/business-analyse/html/src/template.html +623 -0
- package/templates/skills/business-analyse/references/cadrage-structure-cards.md +78 -0
- package/templates/skills/business-analyse/references/cadrage-vibe-coding.md +97 -0
- package/templates/skills/business-analyse/references/consolidation-structural-checks.md +92 -0
- package/templates/skills/business-analyse/references/deploy-data-build.md +121 -0
- package/templates/skills/business-analyse/references/deploy-modes.md +49 -0
- package/templates/skills/business-analyse/references/handoff-file-templates.md +119 -0
- package/templates/skills/business-analyse/references/handoff-mappings.md +81 -0
- package/templates/skills/business-analyse/references/html-data-mapping.md +10 -2
- package/templates/skills/business-analyse/references/init-schema-deployment.md +65 -0
- package/templates/skills/business-analyse/references/review-data-mapping.md +363 -0
- package/templates/skills/business-analyse/references/spec-auto-inference.md +57 -0
- package/templates/skills/business-analyse/references/ui-dashboard-spec.md +85 -0
- package/templates/skills/business-analyse/references/ui-resource-cards.md +110 -0
- package/templates/skills/business-analyse/references/validate-incremental-html.md +55 -0
- package/templates/skills/business-analyse/steps/step-00-init.md +35 -68
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +5 -194
- package/templates/skills/business-analyse/steps/step-03a-data.md +6 -49
- package/templates/skills/business-analyse/steps/step-03b-ui.md +12 -178
- package/templates/skills/business-analyse/steps/step-03d-validate.md +3 -48
- package/templates/skills/business-analyse/steps/step-04-consolidation.md +9 -104
- package/templates/skills/business-analyse/steps/step-05a-handoff.md +25 -441
- package/templates/skills/business-analyse/steps/step-05b-deploy.md +19 -187
- package/templates/skills/business-analyse/steps/step-06-review.md +277 -0
- package/templates/skills/cc-agent/references/agent-behavior-patterns.md +95 -0
- package/templates/skills/cc-agent/steps/step-02-generate.md +5 -78
- package/templates/skills/check-version/SKILL.md +7 -0
- package/templates/skills/controller/references/controller-code-templates.md +159 -0
- package/templates/skills/controller/references/permission-sync-templates.md +152 -0
- package/templates/skills/controller/steps/step-03-generate.md +6 -158
- package/templates/skills/controller/steps/step-04-perms.md +5 -144
- package/templates/skills/debug/SKILL.md +7 -0
- package/templates/skills/explore/SKILL.md +6 -0
- package/templates/skills/feature-full/SKILL.md +39 -142
- package/templates/skills/feature-full/steps/step-01-implementation.md +120 -0
- package/templates/skills/gitflow/references/init-config-template.md +135 -0
- package/templates/skills/gitflow/references/init-name-normalization.md +103 -0
- package/templates/skills/gitflow/references/plan-template.md +69 -0
- package/templates/skills/gitflow/references/start-efcore-preflight.md +70 -0
- package/templates/skills/gitflow/references/start-local-config.md +110 -0
- package/templates/skills/gitflow/steps/step-init.md +18 -289
- package/templates/skills/gitflow/steps/step-plan.md +6 -63
- package/templates/skills/gitflow/steps/step-start.md +16 -126
- package/templates/skills/mcp/SKILL.md +9 -213
- package/templates/skills/mcp/steps/step-01-healthcheck.md +108 -0
- package/templates/skills/mcp/steps/step-02-tools.md +73 -0
- package/templates/skills/notification/SKILL.md +7 -0
- package/templates/skills/quick-search/SKILL.md +5 -0
- package/templates/skills/ralph-loop/SKILL.md +99 -381
- package/templates/skills/ralph-loop/references/category-rules.md +259 -0
- package/templates/skills/ralph-loop/references/compact-loop.md +182 -0
- package/templates/skills/ralph-loop/references/task-transform-legacy.md +259 -0
- package/templates/skills/ralph-loop/references/team-orchestration.md +189 -0
- package/templates/skills/ralph-loop/steps/step-00-init.md +111 -383
- package/templates/skills/ralph-loop/steps/step-01-task.md +79 -896
- package/templates/skills/ralph-loop/steps/step-02-execute.md +68 -680
- package/templates/skills/ralph-loop/steps/step-03-commit.md +47 -277
- package/templates/skills/ralph-loop/steps/step-04-check.md +124 -607
- package/templates/skills/ralph-loop/steps/step-05-report.md +68 -367
- package/templates/skills/refactor/SKILL.md +12 -176
- package/templates/skills/refactor/steps/step-01-discover.md +60 -0
- package/templates/skills/refactor/steps/step-02-execute.md +67 -0
- package/templates/skills/review-code/SKILL.md +19 -257
- package/templates/skills/review-code/steps/step-01-smartstack.md +96 -0
- package/templates/skills/review-code/steps/step-02-detailed-review.md +80 -0
- package/templates/skills/review-code/steps/step-03-react.md +44 -0
- package/templates/skills/ui-components/SKILL.md +7 -0
- package/templates/skills/utils/SKILL.md +6 -0
- package/templates/skills/validate/SKILL.md +6 -0
- package/templates/skills/validate-feature/SKILL.md +8 -0
- package/templates/skills/workflow/SKILL.md +40 -118
- package/templates/skills/workflow/steps/step-01-implementation.md +84 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/* ============================================
|
|
2
|
+
REVIEW PANEL
|
|
3
|
+
============================================ */
|
|
4
|
+
let reviewPanelOpen = false;
|
|
5
|
+
let reviewFilter = 'all';
|
|
6
|
+
|
|
7
|
+
function toggleReviewPanel() {
|
|
8
|
+
reviewPanelOpen = !reviewPanelOpen;
|
|
9
|
+
const panel = document.getElementById('reviewPanel');
|
|
10
|
+
const body = document.getElementById('appBody');
|
|
11
|
+
const btn = document.getElementById('reviewToggleBtn');
|
|
12
|
+
|
|
13
|
+
if (reviewPanelOpen) {
|
|
14
|
+
panel.classList.add('visible');
|
|
15
|
+
body.classList.add('review-open');
|
|
16
|
+
btn.classList.add('active');
|
|
17
|
+
} else {
|
|
18
|
+
panel.classList.remove('visible');
|
|
19
|
+
body.classList.remove('review-open');
|
|
20
|
+
btn.classList.remove('active');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
renderReviewPanel();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function filterReviewComments(filter) {
|
|
27
|
+
reviewFilter = filter;
|
|
28
|
+
// Update active filter button
|
|
29
|
+
document.querySelectorAll('.review-filter-btn').forEach(btn => {
|
|
30
|
+
btn.classList.toggle('active', btn.dataset.filter === filter);
|
|
31
|
+
});
|
|
32
|
+
renderReviewPanel();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function renderReviewPanel() {
|
|
36
|
+
const comments = data.comments || [];
|
|
37
|
+
|
|
38
|
+
// Update header badge
|
|
39
|
+
const toReviewCount = comments.filter(c => c.status === 'to-review').length;
|
|
40
|
+
const badge = document.getElementById('reviewBadge');
|
|
41
|
+
if (badge) {
|
|
42
|
+
badge.textContent = toReviewCount;
|
|
43
|
+
badge.classList.toggle('hidden', toReviewCount === 0);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Update stats
|
|
47
|
+
const totalEl = document.getElementById('reviewStatTotal');
|
|
48
|
+
const toReviewEl = document.getElementById('reviewStatToReview');
|
|
49
|
+
const validatedEl = document.getElementById('reviewStatValidated');
|
|
50
|
+
if (totalEl) totalEl.textContent = comments.length;
|
|
51
|
+
if (toReviewEl) toReviewEl.textContent = toReviewCount;
|
|
52
|
+
if (validatedEl) validatedEl.textContent = comments.filter(c => c.status === 'validated').length;
|
|
53
|
+
|
|
54
|
+
// Filter comments
|
|
55
|
+
let filtered = comments;
|
|
56
|
+
if (reviewFilter === 'to-review') {
|
|
57
|
+
filtered = comments.filter(c => c.status === 'to-review');
|
|
58
|
+
} else if (reviewFilter === 'validated') {
|
|
59
|
+
filtered = comments.filter(c => c.status === 'validated');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Render comment list
|
|
63
|
+
const container = document.getElementById('reviewCommentsList');
|
|
64
|
+
if (!container) return;
|
|
65
|
+
|
|
66
|
+
if (filtered.length === 0) {
|
|
67
|
+
container.innerHTML = '<div class="review-empty">Aucun commentaire' +
|
|
68
|
+
(reviewFilter !== 'all' ? ' avec ce filtre' : '') + '.</div>';
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
container.innerHTML = filtered.map((c, i) => {
|
|
73
|
+
const globalIndex = data.comments.indexOf(c);
|
|
74
|
+
const sectionLabel = getSectionLabel(c.sectionId);
|
|
75
|
+
const date = c.timestamp ? new Date(c.timestamp).toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit' }) : '';
|
|
76
|
+
|
|
77
|
+
return `
|
|
78
|
+
<div class="review-comment-item" onclick="navigateToComment('${c.sectionId}', ${c.cardIndex})">
|
|
79
|
+
<div class="review-comment-section">${sectionLabel}</div>
|
|
80
|
+
<div class="review-comment-text">${c.content}</div>
|
|
81
|
+
<div class="review-comment-footer">
|
|
82
|
+
<span class="review-comment-author">${c.author || 'Utilisateur'} - ${date}</span>
|
|
83
|
+
<div class="review-comment-actions">
|
|
84
|
+
<button class="review-action-btn ${c.status === 'validated' ? 'reject' : 'validate'}"
|
|
85
|
+
onclick="event.stopPropagation();toggleCommentStatus(${globalIndex})"
|
|
86
|
+
title="${c.status === 'validated' ? 'Remettre a revoir' : 'Valider'}">
|
|
87
|
+
${c.status === 'validated' ? 'A revoir' : 'Valider'}
|
|
88
|
+
</button>
|
|
89
|
+
<button class="review-action-btn delete"
|
|
90
|
+
onclick="event.stopPropagation();deleteComment(${globalIndex})"
|
|
91
|
+
title="Supprimer">
|
|
92
|
+
✕
|
|
93
|
+
</button>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
`;
|
|
98
|
+
}).join('');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function getSectionLabel(sectionId) {
|
|
102
|
+
const labels = {
|
|
103
|
+
'cadrage-problem': 'Probleme',
|
|
104
|
+
'cadrage-current': 'Situation actuelle',
|
|
105
|
+
'cadrage-vision': 'Vision',
|
|
106
|
+
'cadrage-stakeholders': 'Parties prenantes',
|
|
107
|
+
'cadrage-scope': 'Perimetre',
|
|
108
|
+
'cadrage-risks': 'Risques',
|
|
109
|
+
'cadrage-success': 'Criteres',
|
|
110
|
+
'decomp-modules': 'Domaines',
|
|
111
|
+
'decomp-dependencies': 'Dependances',
|
|
112
|
+
'consol-interactions': 'Interactions',
|
|
113
|
+
'consol-permissions': 'Acces',
|
|
114
|
+
'consol-flows': 'Parcours',
|
|
115
|
+
'handoff-summary': 'Synthese'
|
|
116
|
+
};
|
|
117
|
+
if (labels[sectionId]) return labels[sectionId];
|
|
118
|
+
if (sectionId.startsWith('module-spec-')) {
|
|
119
|
+
const code = sectionId.replace('module-spec-', '');
|
|
120
|
+
const mod = data.modules.find(m => m.code === code);
|
|
121
|
+
return mod ? mod.name : code;
|
|
122
|
+
}
|
|
123
|
+
// Handle list-based sectionIds (ucList-*, brList-*, entList-*)
|
|
124
|
+
const listMatch = sectionId.match(/^(uc|br|ent)List-(.+)$/);
|
|
125
|
+
if (listMatch) {
|
|
126
|
+
const tabLabels = { uc: 'Cas d\'utilisation', br: 'Regles metier', ent: 'Donnees' };
|
|
127
|
+
const mod = data.modules.find(m => m.code === listMatch[2]);
|
|
128
|
+
const modName = mod ? mod.name : listMatch[2];
|
|
129
|
+
return modName + ' > ' + (tabLabels[listMatch[1]] || listMatch[1]);
|
|
130
|
+
}
|
|
131
|
+
return sectionId;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function navigateToComment(sectionId, cardIndex) {
|
|
135
|
+
// Handle list-based sectionIds (ucList-*, brList-*, entList-*) → navigate to module + tab
|
|
136
|
+
const listMatch = sectionId.match(/^(uc|br|ent)List-(.+)$/);
|
|
137
|
+
if (listMatch) {
|
|
138
|
+
const [, tabType, moduleCode] = listMatch;
|
|
139
|
+
showSection('module-spec-' + moduleCode);
|
|
140
|
+
setTimeout(() => {
|
|
141
|
+
switchTab(moduleCode, tabType);
|
|
142
|
+
scrollToCommentThread(sectionId, cardIndex);
|
|
143
|
+
}, 150);
|
|
144
|
+
} else {
|
|
145
|
+
showSection(sectionId);
|
|
146
|
+
scrollToCommentThread(sectionId, cardIndex);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function scrollToCommentThread(sectionId, cardIndex) {
|
|
151
|
+
setTimeout(() => {
|
|
152
|
+
const thread = document.getElementById('comment-thread-' + sectionId + '-' + cardIndex);
|
|
153
|
+
if (thread && !thread.classList.contains('visible')) {
|
|
154
|
+
thread.classList.add('visible');
|
|
155
|
+
}
|
|
156
|
+
const container = document.querySelector(`.comment-btn-container[data-section-id="${sectionId}"][data-card-index="${cardIndex}"]`);
|
|
157
|
+
if (container) {
|
|
158
|
+
container.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
159
|
+
}
|
|
160
|
+
}, 100);
|
|
161
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* ============================================
|
|
2
|
+
DESIGN SYSTEM - SmartStack Business Analysis
|
|
3
|
+
============================================ */
|
|
4
|
+
:root {
|
|
5
|
+
--primary: #6366f1;
|
|
6
|
+
--primary-dark: #4f46e5;
|
|
7
|
+
--primary-light: #818cf8;
|
|
8
|
+
--secondary: #f97316;
|
|
9
|
+
--accent: #06b6d4;
|
|
10
|
+
--bg-dark: #0f172a;
|
|
11
|
+
--bg-card: #1e293b;
|
|
12
|
+
--bg-hover: #334155;
|
|
13
|
+
--bg-input: #151d2e;
|
|
14
|
+
--text: #b8c4d1;
|
|
15
|
+
--text-muted: #8a9bb0;
|
|
16
|
+
--text-bright: #e2e8f0;
|
|
17
|
+
--border: #334155;
|
|
18
|
+
--border-light: #475569;
|
|
19
|
+
--success: #22c55e;
|
|
20
|
+
--warning: #eab308;
|
|
21
|
+
--error: #ef4444;
|
|
22
|
+
--info: #3b82f6;
|
|
23
|
+
--sidebar-width: 280px;
|
|
24
|
+
--header-height: 52px;
|
|
25
|
+
--transition-fast: 0.15s ease;
|
|
26
|
+
--transition-normal: 0.3s ease;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
30
|
+
html { scroll-behavior: smooth; }
|
|
31
|
+
|
|
32
|
+
body {
|
|
33
|
+
font-family: 'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif;
|
|
34
|
+
background: var(--bg-dark);
|
|
35
|
+
color: var(--text);
|
|
36
|
+
line-height: 1.7;
|
|
37
|
+
min-height: 100vh;
|
|
38
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* ============================================
|
|
2
|
+
LAYOUT
|
|
3
|
+
============================================ */
|
|
4
|
+
.app { display: flex; flex-direction: column; min-height: 100vh; }
|
|
5
|
+
|
|
6
|
+
.header {
|
|
7
|
+
background: var(--bg-card);
|
|
8
|
+
border-bottom: 1px solid var(--border);
|
|
9
|
+
height: var(--header-height);
|
|
10
|
+
display: flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
padding: 0 1.5rem;
|
|
13
|
+
gap: 1rem;
|
|
14
|
+
position: sticky;
|
|
15
|
+
top: 0;
|
|
16
|
+
z-index: 100;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.header-logo {
|
|
20
|
+
width: 32px; height: 32px;
|
|
21
|
+
background: linear-gradient(135deg, var(--primary), var(--secondary));
|
|
22
|
+
border-radius: 6px;
|
|
23
|
+
display: flex; align-items: center; justify-content: center;
|
|
24
|
+
font-weight: 700; font-size: 0.85rem; color: #fff;
|
|
25
|
+
flex-shrink: 0;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.header-title { font-size: 1rem; font-weight: 600; color: var(--text-bright); }
|
|
29
|
+
.header-sep { width: 1px; height: 24px; background: var(--border); }
|
|
30
|
+
.header-app-name { font-size: 0.9rem; color: var(--primary-light); font-weight: 500; }
|
|
31
|
+
.header-spacer { flex: 1; }
|
|
32
|
+
|
|
33
|
+
.header-actions { display: flex; gap: 0.5rem; }
|
|
34
|
+
|
|
35
|
+
.body { display: flex; flex: 1; }
|
|
36
|
+
|
|
37
|
+
/* ============================================
|
|
38
|
+
SIDEBAR - Container
|
|
39
|
+
============================================ */
|
|
40
|
+
.sidebar {
|
|
41
|
+
width: var(--sidebar-width);
|
|
42
|
+
background: var(--bg-card);
|
|
43
|
+
border-right: 1px solid var(--border);
|
|
44
|
+
overflow-y: auto;
|
|
45
|
+
height: calc(100vh - var(--header-height));
|
|
46
|
+
position: sticky;
|
|
47
|
+
top: var(--header-height);
|
|
48
|
+
flex-shrink: 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.sidebar::-webkit-scrollbar { width: 4px; }
|
|
52
|
+
.sidebar::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }
|
|
53
|
+
|
|
54
|
+
/* ============================================
|
|
55
|
+
MAIN CONTENT - FULL WIDTH
|
|
56
|
+
============================================ */
|
|
57
|
+
.main {
|
|
58
|
+
flex: 1;
|
|
59
|
+
padding: 2rem 3rem;
|
|
60
|
+
overflow-y: auto;
|
|
61
|
+
height: calc(100vh - var(--header-height));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.section { margin-bottom: 4rem; }
|
|
65
|
+
.section-title {
|
|
66
|
+
font-size: 1.4rem;
|
|
67
|
+
color: var(--text-bright);
|
|
68
|
+
font-weight: 600;
|
|
69
|
+
margin-bottom: 0.5rem;
|
|
70
|
+
padding-bottom: 0.5rem;
|
|
71
|
+
border-bottom: 2px solid var(--primary);
|
|
72
|
+
}
|
|
73
|
+
.section-subtitle {
|
|
74
|
+
font-size: 0.9rem;
|
|
75
|
+
color: var(--text-muted);
|
|
76
|
+
margin-bottom: 1.5rem;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* ============================================
|
|
80
|
+
RESPONSIVE
|
|
81
|
+
============================================ */
|
|
82
|
+
@media (max-width: 768px) {
|
|
83
|
+
.sidebar { display: none; }
|
|
84
|
+
.main { padding: 1rem; }
|
|
85
|
+
.form-row { grid-template-columns: 1fr; }
|
|
86
|
+
.stakeholder-grid { grid-template-columns: 1fr; }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* ============================================
|
|
90
|
+
PRINT
|
|
91
|
+
============================================ */
|
|
92
|
+
@media print {
|
|
93
|
+
.sidebar, .header-actions, .add-btn, .uc-actions, .inline-form, .module-card-remove, .phase-progress { display: none !important; }
|
|
94
|
+
.main { max-width: 100%; padding: 0; }
|
|
95
|
+
.section { display: block !important; page-break-inside: avoid; }
|
|
96
|
+
body { background: #fff; color: #1a1a1a; }
|
|
97
|
+
.card, .uc-item, .br-item, .module-card, .entity-block, .interaction-item { border-color: #ddd; }
|
|
98
|
+
.tab-panel { display: block !important; }
|
|
99
|
+
.tab-bar { display: none; }
|
|
100
|
+
.review-panel, .comment-btn-container { display: none !important; }
|
|
101
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/* ============================================
|
|
2
|
+
SIDEBAR - Navigation 5 niveaux
|
|
3
|
+
============================================ */
|
|
4
|
+
.nav-group { padding: 1rem 0; }
|
|
5
|
+
.nav-group + .nav-group { border-top: 1px solid var(--border); }
|
|
6
|
+
|
|
7
|
+
.nav-group-title {
|
|
8
|
+
font-size: 0.65rem;
|
|
9
|
+
text-transform: uppercase;
|
|
10
|
+
letter-spacing: 0.1em;
|
|
11
|
+
color: var(--text-muted);
|
|
12
|
+
padding: 0 1rem;
|
|
13
|
+
margin-bottom: 0.5rem;
|
|
14
|
+
font-weight: 600;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.nav-item {
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
gap: 0.5rem;
|
|
21
|
+
padding: 0.45rem 1rem;
|
|
22
|
+
color: var(--text);
|
|
23
|
+
text-decoration: none;
|
|
24
|
+
font-size: 0.85rem;
|
|
25
|
+
cursor: pointer;
|
|
26
|
+
transition: all var(--transition-fast);
|
|
27
|
+
border-left: 3px solid transparent;
|
|
28
|
+
}
|
|
29
|
+
.nav-item:hover { background: var(--bg-hover); color: var(--text-bright); }
|
|
30
|
+
.nav-item.active { background: rgba(99,102,241,0.1); border-left-color: var(--primary); color: var(--primary-light); font-weight: 500; }
|
|
31
|
+
|
|
32
|
+
.nav-item .nav-icon { font-size: 1rem; width: 20px; text-align: center; }
|
|
33
|
+
.nav-item .nav-badge {
|
|
34
|
+
margin-left: auto;
|
|
35
|
+
font-size: 0.65rem;
|
|
36
|
+
background: var(--bg-hover);
|
|
37
|
+
padding: 0.1rem 0.4rem;
|
|
38
|
+
border-radius: 10px;
|
|
39
|
+
color: var(--text-muted);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.nav-children { margin-left: 1.2rem; }
|
|
43
|
+
.nav-children .nav-item { font-size: 0.8rem; padding: 0.3rem 1rem; }
|
|
44
|
+
|
|
45
|
+
/* ============================================
|
|
46
|
+
PHASE PROGRESS
|
|
47
|
+
============================================ */
|
|
48
|
+
.phase-progress {
|
|
49
|
+
display: flex; align-items: center; gap: 0.3rem;
|
|
50
|
+
padding: 0.75rem 1rem; border-bottom: 1px solid var(--border);
|
|
51
|
+
}
|
|
52
|
+
.phase-dot {
|
|
53
|
+
width: 24px; height: 24px; border-radius: 50%;
|
|
54
|
+
display: flex; align-items: center; justify-content: center;
|
|
55
|
+
font-size: 0.6rem; font-weight: 700; color: var(--text-muted);
|
|
56
|
+
background: var(--bg-hover); border: 2px solid var(--border);
|
|
57
|
+
transition: all var(--transition-fast);
|
|
58
|
+
}
|
|
59
|
+
.phase-dot.completed { background: var(--success); border-color: var(--success); color: #fff; }
|
|
60
|
+
.phase-dot.current { background: var(--primary); border-color: var(--primary); color: #fff; }
|
|
61
|
+
.phase-line { flex: 1; height: 2px; background: var(--border); }
|
|
62
|
+
.phase-line.completed { background: var(--success); }
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/* ============================================
|
|
2
|
+
BUTTONS
|
|
3
|
+
============================================ */
|
|
4
|
+
.btn {
|
|
5
|
+
padding: 0.4rem 0.9rem;
|
|
6
|
+
border-radius: 6px;
|
|
7
|
+
border: 1px solid var(--border);
|
|
8
|
+
background: var(--bg-hover);
|
|
9
|
+
color: var(--text);
|
|
10
|
+
font-size: 0.8rem;
|
|
11
|
+
cursor: pointer;
|
|
12
|
+
transition: all var(--transition-fast);
|
|
13
|
+
font-family: inherit;
|
|
14
|
+
}
|
|
15
|
+
.btn:hover { border-color: var(--primary); color: var(--text-bright); }
|
|
16
|
+
.btn-primary { background: var(--primary); border-color: var(--primary); color: #fff; }
|
|
17
|
+
.btn-primary:hover { background: var(--primary-dark); }
|
|
18
|
+
.btn-success { background: var(--success); border-color: var(--success); color: #fff; }
|
|
19
|
+
.btn-sm { padding: 0.25rem 0.6rem; font-size: 0.75rem; }
|
|
20
|
+
|
|
21
|
+
/* ============================================
|
|
22
|
+
EDITABLE CARDS
|
|
23
|
+
============================================ */
|
|
24
|
+
.card {
|
|
25
|
+
background: var(--bg-card);
|
|
26
|
+
border: 1px solid var(--border);
|
|
27
|
+
border-radius: 10px;
|
|
28
|
+
padding: 1.5rem;
|
|
29
|
+
margin-bottom: 1rem;
|
|
30
|
+
transition: border-color var(--transition-fast);
|
|
31
|
+
}
|
|
32
|
+
.card:hover { border-color: var(--border-light); }
|
|
33
|
+
|
|
34
|
+
.card-header {
|
|
35
|
+
display: flex;
|
|
36
|
+
align-items: center;
|
|
37
|
+
gap: 0.75rem;
|
|
38
|
+
margin-bottom: 0.75rem;
|
|
39
|
+
}
|
|
40
|
+
.card-label {
|
|
41
|
+
font-size: 0.7rem;
|
|
42
|
+
text-transform: uppercase;
|
|
43
|
+
letter-spacing: 0.08em;
|
|
44
|
+
color: var(--text-muted);
|
|
45
|
+
font-weight: 600;
|
|
46
|
+
}
|
|
47
|
+
.card-title {
|
|
48
|
+
font-size: 1.05rem;
|
|
49
|
+
color: var(--text-bright);
|
|
50
|
+
font-weight: 600;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.editable {
|
|
54
|
+
border: 1px dashed transparent;
|
|
55
|
+
border-radius: 6px;
|
|
56
|
+
padding: 0.4rem 0.6rem;
|
|
57
|
+
transition: all var(--transition-fast);
|
|
58
|
+
min-height: 1.5em;
|
|
59
|
+
outline: none;
|
|
60
|
+
}
|
|
61
|
+
.editable:hover { border-color: var(--border-light); background: var(--bg-input); }
|
|
62
|
+
.editable:focus { border-color: var(--primary); background: var(--bg-input); box-shadow: 0 0 0 2px rgba(99,102,241,0.2); }
|
|
63
|
+
.editable[data-placeholder]:empty::before {
|
|
64
|
+
content: attr(data-placeholder);
|
|
65
|
+
color: var(--text-muted);
|
|
66
|
+
font-style: italic;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* ============================================
|
|
70
|
+
PRIORITY BADGES
|
|
71
|
+
============================================ */
|
|
72
|
+
.priority {
|
|
73
|
+
display: inline-flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
gap: 0.3rem;
|
|
76
|
+
padding: 0.2rem 0.6rem;
|
|
77
|
+
border-radius: 12px;
|
|
78
|
+
font-size: 0.7rem;
|
|
79
|
+
font-weight: 600;
|
|
80
|
+
text-transform: uppercase;
|
|
81
|
+
letter-spacing: 0.05em;
|
|
82
|
+
}
|
|
83
|
+
.priority-vital { background: rgba(239,68,68,0.15); color: #f87171; border: 1px solid rgba(239,68,68,0.3); }
|
|
84
|
+
.priority-important { background: rgba(234,179,8,0.15); color: #facc15; border: 1px solid rgba(234,179,8,0.3); }
|
|
85
|
+
.priority-optional { background: rgba(34,197,94,0.15); color: #4ade80; border: 1px solid rgba(34,197,94,0.3); }
|
|
86
|
+
.priority-excluded { background: rgba(100,116,139,0.15); color: #94a3b8; border: 1px solid rgba(100,116,139,0.3); }
|
|
87
|
+
|
|
88
|
+
/* ============================================
|
|
89
|
+
STATUS BADGES
|
|
90
|
+
============================================ */
|
|
91
|
+
.status {
|
|
92
|
+
display: inline-flex; align-items: center; gap: 0.3rem;
|
|
93
|
+
padding: 0.15rem 0.5rem; border-radius: 10px;
|
|
94
|
+
font-size: 0.7rem; font-weight: 500;
|
|
95
|
+
}
|
|
96
|
+
.status-dot { width: 6px; height: 6px; border-radius: 50%; }
|
|
97
|
+
.status-draft .status-dot { background: var(--text-muted); }
|
|
98
|
+
.status-draft { color: var(--text-muted); }
|
|
99
|
+
.status-progress .status-dot { background: var(--info); }
|
|
100
|
+
.status-progress { color: var(--info); }
|
|
101
|
+
.status-done .status-dot { background: var(--success); }
|
|
102
|
+
.status-done { color: var(--success); }
|
|
103
|
+
|
|
104
|
+
/* ============================================
|
|
105
|
+
ADD BUTTON
|
|
106
|
+
============================================ */
|
|
107
|
+
.add-btn {
|
|
108
|
+
display: flex;
|
|
109
|
+
align-items: center;
|
|
110
|
+
justify-content: center;
|
|
111
|
+
gap: 0.5rem;
|
|
112
|
+
width: 100%;
|
|
113
|
+
padding: 0.75rem;
|
|
114
|
+
border: 2px dashed var(--border);
|
|
115
|
+
border-radius: 8px;
|
|
116
|
+
background: transparent;
|
|
117
|
+
color: var(--text-muted);
|
|
118
|
+
font-size: 0.85rem;
|
|
119
|
+
cursor: pointer;
|
|
120
|
+
transition: all var(--transition-fast);
|
|
121
|
+
font-family: inherit;
|
|
122
|
+
}
|
|
123
|
+
.add-btn:hover {
|
|
124
|
+
border-color: var(--primary);
|
|
125
|
+
color: var(--primary-light);
|
|
126
|
+
background: rgba(99,102,241,0.05);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* ============================================
|
|
130
|
+
INLINE FORM (for adding items)
|
|
131
|
+
============================================ */
|
|
132
|
+
.inline-form {
|
|
133
|
+
background: var(--bg-card);
|
|
134
|
+
border: 2px solid var(--primary);
|
|
135
|
+
border-radius: 10px;
|
|
136
|
+
padding: 1.25rem;
|
|
137
|
+
margin-bottom: 1rem;
|
|
138
|
+
display: none;
|
|
139
|
+
}
|
|
140
|
+
.inline-form.visible { display: block; }
|
|
141
|
+
.inline-form-title {
|
|
142
|
+
font-size: 0.9rem;
|
|
143
|
+
font-weight: 600;
|
|
144
|
+
color: var(--primary-light);
|
|
145
|
+
margin-bottom: 1rem;
|
|
146
|
+
}
|
|
147
|
+
.form-group { margin-bottom: 0.75rem; }
|
|
148
|
+
.form-label {
|
|
149
|
+
display: block;
|
|
150
|
+
font-size: 0.75rem;
|
|
151
|
+
color: var(--text-muted);
|
|
152
|
+
margin-bottom: 0.3rem;
|
|
153
|
+
font-weight: 500;
|
|
154
|
+
}
|
|
155
|
+
.form-input, .form-textarea, .form-select {
|
|
156
|
+
width: 100%;
|
|
157
|
+
padding: 0.5rem 0.75rem;
|
|
158
|
+
background: var(--bg-input);
|
|
159
|
+
border: 1px solid var(--border);
|
|
160
|
+
border-radius: 6px;
|
|
161
|
+
color: var(--text);
|
|
162
|
+
font-size: 0.85rem;
|
|
163
|
+
font-family: inherit;
|
|
164
|
+
transition: border-color var(--transition-fast);
|
|
165
|
+
}
|
|
166
|
+
.form-input:focus, .form-textarea:focus, .form-select:focus {
|
|
167
|
+
outline: none;
|
|
168
|
+
border-color: var(--primary);
|
|
169
|
+
box-shadow: 0 0 0 2px rgba(99,102,241,0.2);
|
|
170
|
+
}
|
|
171
|
+
.form-textarea { min-height: 80px; resize: vertical; }
|
|
172
|
+
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; }
|
|
173
|
+
.form-actions {
|
|
174
|
+
display: flex; gap: 0.5rem; justify-content: flex-end;
|
|
175
|
+
margin-top: 1rem; padding-top: 0.75rem; border-top: 1px solid var(--border);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* ============================================
|
|
179
|
+
NOTIFICATION BAR
|
|
180
|
+
============================================ */
|
|
181
|
+
.notification {
|
|
182
|
+
position: fixed;
|
|
183
|
+
bottom: 1.5rem;
|
|
184
|
+
right: 1.5rem;
|
|
185
|
+
padding: 0.75rem 1.25rem;
|
|
186
|
+
border-radius: 8px;
|
|
187
|
+
font-size: 0.85rem;
|
|
188
|
+
font-weight: 500;
|
|
189
|
+
z-index: 200;
|
|
190
|
+
transform: translateY(100px);
|
|
191
|
+
opacity: 0;
|
|
192
|
+
transition: all 0.3s ease;
|
|
193
|
+
}
|
|
194
|
+
.notification.visible { transform: translateY(0); opacity: 1; }
|
|
195
|
+
.notification-success { background: var(--success); color: #fff; }
|
|
196
|
+
.notification-info { background: var(--info); color: #fff; }
|