@baravak/risloo-profile-cli 4.46.3 → 4.75.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/.agents/skills/create-profile/SKILL.md +14 -0
- package/.claude/settings.local.json +1 -3
- package/.claude/skills/create-profile/SKILL.md +203 -0
- package/AGENTS.md +413 -0
- package/CLAUDE.md +2 -185
- package/package.json +1 -1
- package/src/cli-commands/Executor.js +8 -2
- package/src/cli-commands/ExtractExecutor.js +55 -21
- package/src/cli-commands/GiftExecutor.js +1 -0
- package/src/handlebars/importPartials.js +10 -44
- package/src/handlebars/init.js +17 -11
- package/src/publish/json/profiles/BSSI93.json +392 -0
- package/src/publish/json/profiles/FRHPT93.json +2 -2
- package/src/publish/json/profiles/ISKS93.json +288 -0
- package/src/publish/json/profiles/MCMI9A.json +1540 -0
- package/src/publish/json/profiles/NEO93.json +3858 -0
- package/src/publish/json/profiles/NEO9A.json +1159 -1
- package/src/publish/json/profiles/NEO9Q.json +3856 -0
- package/src/publish/json/profiles/NEO9V.json +1157 -0
- package/src/publish/json/profiles/RIASEC9A.json +2775 -0
- package/src/publish/json/profiles/RSI93.json +359 -0
- package/src/samples/AEQ93.js +1 -1
- package/src/samples/AMS93.js +1 -1
- package/src/samples/AMS9A.js +3 -1
- package/src/samples/BAOMEIS93.js +1 -1
- package/src/samples/BEQI93.js +1 -1
- package/src/samples/BSCT93.js +5 -0
- package/src/samples/BSSI93.js +93 -0
- package/src/samples/CAATS93.js +1 -1
- package/src/samples/CERQ93.js +1 -1
- package/src/samples/CRAAS93.js +1 -1
- package/src/samples/DSWLS93.js +1 -1
- package/src/samples/EMSS93.js +1 -1
- package/src/samples/EPQ9A.js +6 -1
- package/src/samples/FACES93.js +6 -0
- package/src/samples/FRHPT93.js +41 -13
- package/src/samples/GMIT93.js +1 -1
- package/src/samples/HPL93.js +1 -1
- package/src/samples/ISKS93.js +62 -0
- package/src/samples/IUS93.js +1 -1
- package/src/samples/JCSI93.js +1 -1
- package/src/samples/JPFQ93.js +5 -0
- package/src/samples/KJGI93.js +1 -1
- package/src/samples/LMIQ93.js +1 -1
- package/src/samples/MCMI9A.js +530 -0
- package/src/samples/MMFAD93.js +1 -1
- package/src/samples/MOCI93.js +1 -1
- package/src/samples/NEO93.js +279 -0
- package/src/samples/NEO9A.js +93 -60
- package/src/samples/NEO9Q.js +281 -0
- package/src/samples/NEO9V.js +218 -0
- package/src/samples/OBQ4493.js +1 -1
- package/src/samples/PIES93.js +1 -1
- package/src/samples/PIES9A.js +4 -0
- package/src/samples/PMCIEF93.js +7 -1
- package/src/samples/PSWQ93.js +1 -1
- package/src/samples/RIASEC93.js +1 -1
- package/src/samples/RIASEC9A.js +256 -0
- package/src/samples/RSI93.js +89 -0
- package/src/samples/SASQ93.js +1 -1
- package/src/samples/SDCAQ93.js +1 -1
- package/src/samples/STAIY93.js +1 -1
- package/src/samples/WAQ93.js +1 -1
- package/src/samples/YBOCS93.js +1 -1
- package/src/samples/YPI93.js +5 -1
- package/views/profiles/MCMI9A_facets_partial.hbs +96 -0
- package/views/profiles/MCMI9A_main_partial.hbs +262 -0
- package/views/profiles/MCMI9A_noteworthy_partial.hbs +66 -0
- package/views/profiles/MCMI9A_vertical_label_partial.hbs +8 -0
- package/views/profiles/NEO_long_facets.hbs +125 -0
- package/views/profiles/NEO_main.hbs +152 -0
- package/views/profiles/NEO_short_facets.hbs +82 -0
- package/views/profiles/samples/BSCT93.hbs +17 -17
- package/views/profiles/samples/BSSI93.hbs +102 -0
- package/views/profiles/samples/FRHPT93_1.hbs +568 -87
- package/views/profiles/samples/FRHPT93_2.hbs +90 -76
- package/views/profiles/samples/FRHPT93_3.hbs +2 -2
- package/views/profiles/samples/FRHPT93_4.hbs +2 -2
- package/views/profiles/samples/FRHPT93_5.hbs +103 -0
- package/views/profiles/samples/FRHPT9A.hbs +7 -7
- package/views/profiles/samples/ISKS93.hbs +38 -0
- package/views/profiles/samples/MCMI9A_1.hbs +3 -0
- package/views/profiles/samples/MCMI9A_2.hbs +3 -0
- package/views/profiles/samples/MCMI9A_3.hbs +3 -0
- package/views/profiles/samples/MCMI9A_4.hbs +3 -0
- package/views/profiles/samples/NEO93_1.hbs +14 -0
- package/views/profiles/samples/NEO93_2.hbs +15 -0
- package/views/profiles/samples/NEO93_3.hbs +15 -0
- package/views/profiles/samples/NEO9A.hbs +14 -29
- package/views/profiles/samples/NEO9Q_1.hbs +13 -0
- package/views/profiles/samples/NEO9Q_2.hbs +14 -0
- package/views/profiles/samples/NEO9Q_3.hbs +14 -0
- package/views/profiles/samples/NEO9V_1.hbs +13 -0
- package/views/profiles/samples/NEO9V_2.hbs +3 -0
- package/views/profiles/samples/RIASEC9A_1.hbs +38 -0
- package/views/profiles/samples/RIASEC9A_2.hbs +67 -0
- package/views/profiles/samples/RIASEC9A_3.hbs +93 -0
- package/views/profiles/samples/RSI93.hbs +101 -0
- package/a.json +0 -4805
- package/src/publish/json/profiles/BSCT93_t1.json +0 -512
- package/src/publish/json/profiles/BSCT93_t2.json +0 -512
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
<defs>
|
|
2
|
+
<linearGradient id="neoMainGradient" x1="0" y1="0" x2="1" y2="0">
|
|
3
|
+
<stop stop-color="{{colors.light}}"/>
|
|
4
|
+
<stop offset="1" stop-color="{{colors.dark}}"/>
|
|
5
|
+
</linearGradient>
|
|
6
|
+
<clipPath id="neoMainBarClip">
|
|
7
|
+
{{bar 500 24 (object tl=0 bl=0 tr=4 br=4) (toRad 0)}}
|
|
8
|
+
</clipPath>
|
|
9
|
+
<linearGradient id="neoRedTab" x1="0" y1="23" x2="190" y2="23" gradientUnits="userSpaceOnUse">
|
|
10
|
+
<stop stop-color="#FFF1F2"/>
|
|
11
|
+
<stop offset="1" stop-color="#FFE4E6"/>
|
|
12
|
+
</linearGradient>
|
|
13
|
+
<linearGradient id="neoRedArrow" x1="595" y1="651" x2="580" y2="651" gradientUnits="userSpaceOnUse">
|
|
14
|
+
<stop stop-color="#FFF1F2"/>
|
|
15
|
+
<stop offset="1" stop-color="#FECDD3"/>
|
|
16
|
+
</linearGradient>
|
|
17
|
+
<linearGradient id="neoYellowTab" x1="0" y1="23" x2="190" y2="23" gradientUnits="userSpaceOnUse">
|
|
18
|
+
<stop stop-color="#FEFCE8"/>
|
|
19
|
+
<stop offset="1" stop-color="#FEF9C3"/>
|
|
20
|
+
</linearGradient>
|
|
21
|
+
<linearGradient id="neoYellowArrow" x1="595" y1="597" x2="580" y2="597" gradientUnits="userSpaceOnUse">
|
|
22
|
+
<stop stop-color="#FEFCE8"/>
|
|
23
|
+
<stop offset="1" stop-color="#FEF08A"/>
|
|
24
|
+
</linearGradient>
|
|
25
|
+
<clipPath id="neoRedBoxClip"><rect y="628" width="800" height="46" rx="8"/></clipPath>
|
|
26
|
+
<clipPath id="neoYellowBoxClip"><rect y="574" width="800" height="46" rx="8"/></clipPath>
|
|
27
|
+
<filter id="neoMainSplit" x="{{math barX '-' 3}}" y="26" width="7" height="294" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
28
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
29
|
+
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
30
|
+
<feOffset dx="1"/>
|
|
31
|
+
<feGaussianBlur stdDeviation="1.5"/>
|
|
32
|
+
<feComposite in2="hardAlpha" operator="out"/>
|
|
33
|
+
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"/>
|
|
34
|
+
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1"/>
|
|
35
|
+
<feBlend mode="normal" in="SourceGraphic" in2="effect1" result="shape"/>
|
|
36
|
+
</filter>
|
|
37
|
+
</defs>
|
|
38
|
+
|
|
39
|
+
<g transform="translate({{padding.x}}, {{padding.y}})">
|
|
40
|
+
<g transform="translate({{frameX}}, 128)">
|
|
41
|
+
{{#if tAxis}}
|
|
42
|
+
<line x1="{{math barX '+' 19.5}}" y1="29.5" x2="{{math barX '+' 19.5}}" y2="316.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
43
|
+
<line x1="{{math barX '+' 139.5}}" y1="29.5" x2="{{math barX '+' 139.5}}" y2="316.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
44
|
+
<line x1="{{math barX '+' 219.5}}" y1="29.5" x2="{{math barX '+' 219.5}}" y2="316.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
45
|
+
<line x1="{{math barX '+' 299.5}}" y1="29.5" x2="{{math barX '+' 299.5}}" y2="316.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
46
|
+
<line x1="{{math barX '+' 379.5}}" y1="29.5" x2="{{math barX '+' 379.5}}" y2="316.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
47
|
+
<line x1="{{math barX '+' 499.5}}" y1="29.5" x2="{{math barX '+' 499.5}}" y2="316.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
48
|
+
|
|
49
|
+
<text x="{{math barX '+' 19.5}}" y="9" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">20</text>
|
|
50
|
+
<text x="{{math barX '+' 139.5}}" y="9" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">35</text>
|
|
51
|
+
<text x="{{math barX '+' 219.5}}" y="9" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">45</text>
|
|
52
|
+
<text x="{{math barX '+' 299.5}}" y="9" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">55</text>
|
|
53
|
+
<text x="{{math barX '+' 379.5}}" y="9" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">65</text>
|
|
54
|
+
<text x="{{math barX '+' 499.5}}" y="9" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">80</text>
|
|
55
|
+
|
|
56
|
+
<text x="{{math barX '+' 79.5}}" y="23" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">بسیار پایین</text>
|
|
57
|
+
<text x="{{math barX '+' 179.5}}" y="23" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">پایین</text>
|
|
58
|
+
<text x="{{math barX '+' 259.5}}" y="23" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">طبیعی</text>
|
|
59
|
+
<text x="{{math barX '+' 339.5}}" y="23" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">بالا</text>
|
|
60
|
+
<text x="{{math barX '+' 439.5}}" y="23" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">بسیار بالا</text>
|
|
61
|
+
{{else}}
|
|
62
|
+
<line x1="{{math barX '+' 124.5}}" y1="29.5" x2="{{math barX '+' 124.5}}" y2="316.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
63
|
+
<line x1="{{math barX '+' 249.5}}" y1="29.5" x2="{{math barX '+' 249.5}}" y2="316.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
64
|
+
<line x1="{{math barX '+' 374.5}}" y1="29.5" x2="{{math barX '+' 374.5}}" y2="316.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
65
|
+
<line x1="{{math barX '+' 499.5}}" y1="29.5" x2="{{math barX '+' 499.5}}" y2="316.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
66
|
+
|
|
67
|
+
<text x="{{math barX '-' 0.5}}" y="14" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">0</text>
|
|
68
|
+
<text x="{{math barX '+' 249.5}}" y="14" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">50 ٪</text>
|
|
69
|
+
<text x="{{math barX '+' 499.5}}" y="14" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="start">100 ٪</text>
|
|
70
|
+
{{/if}}
|
|
71
|
+
|
|
72
|
+
<text x="{{rawCenter}}" y="9" font-size="12" font-weight="400" fill="#64748B" text-anchor="middle">نمره خام</text>
|
|
73
|
+
<text x="{{rawCenter}}" y="23" font-size="12" font-weight="400" fill="#64748B" text-anchor="middle">از {{rawMax}}</text>
|
|
74
|
+
|
|
75
|
+
{{#each items as |item index|}}
|
|
76
|
+
<g transform="translate(0, {{math index '*' 56}})">
|
|
77
|
+
<g transform="translate({{../barX}}, 49)">
|
|
78
|
+
{{bar 500 24 (object tl=0 bl=0 tr=4 br=4) (toRad 0) fill='#E2E8F0' fill-opacity='0.5'}}
|
|
79
|
+
{{bar item.barW 24 (object tl=0 bl=0 tr=4 br=4) (toRad 0) fill='url(#neoMainGradient)' clip-path='url(#neoMainBarClip)'}}
|
|
80
|
+
{{#if ../tAxis}}
|
|
81
|
+
<text x="{{math item.barW '+' (ternary item.inside -6 6)}}" y="12" dy=".3em" font-size="14" font-weight="500" fill="{{ternary item.inside 'white' ../colors.dark}}" text-anchor="{{ternary item.inside 'start' 'end'}}">{{item.score}}</text>
|
|
82
|
+
{{else}}
|
|
83
|
+
<text x="{{math item.barW '+' (ternary item.inside -6 6)}}" y="12" dy=".3em" font-size="14" font-weight="500" fill="{{ternary item.inside 'white' ../colors.dark}}" text-anchor="{{ternary item.inside 'start' 'end'}}">{{item.percentage}} ٪</text>
|
|
84
|
+
{{/if}}
|
|
85
|
+
</g>
|
|
86
|
+
|
|
87
|
+
<rect x="{{../rawX}}" y="49.5" width="35" height="23" rx="3.5" stroke="{{../colors.accent}}" fill="none"/>
|
|
88
|
+
<text x="{{../rawCenter}}" y="61" dy=".3em" font-size="14" font-weight="500" fill="{{../colors.accent}}" text-anchor="middle">{{item.mark}}</text>
|
|
89
|
+
|
|
90
|
+
<text x="{{math ../barX '-' 36}}" y="61" dy=".3em" font-size="13" font-weight="400" fill="#475569" text-anchor="start">{{item.fa}}</text>
|
|
91
|
+
<text x="{{math ../barX '-' 27.5}}" y="61" dy=".3em" font-size="13" font-weight="400" fill="#475569" text-anchor="middle">-</text>
|
|
92
|
+
<text x="{{math ../barX '-' 14}}" y="61" dy=".3em" font-size="13" font-weight="400" fill="#475569" text-anchor="middle">{{item.letter}}</text>
|
|
93
|
+
|
|
94
|
+
{{#if ../showLevels}}
|
|
95
|
+
<text x="{{../levelX}}" y="61" dy=".3em" font-size="12" font-weight="400" fill="#64748B" text-anchor="middle">{{item.levelText}}</text>
|
|
96
|
+
{{/if}}
|
|
97
|
+
</g>
|
|
98
|
+
{{/each}}
|
|
99
|
+
|
|
100
|
+
<g opacity="0.5" filter="url(#neoMainSplit)">
|
|
101
|
+
<line x1="{{math barX '-' 0.5}}" y1="29.5" x2="{{math barX '-' 0.5}}" y2="316.5" stroke="white" stroke-linecap="round"/>
|
|
102
|
+
</g>
|
|
103
|
+
</g>
|
|
104
|
+
|
|
105
|
+
{{#if showRed}}
|
|
106
|
+
<g transform="translate({{alertX}}, 0)">
|
|
107
|
+
{{#if compactAlert}}
|
|
108
|
+
<g clip-path="url(#neoRedBoxClip)">
|
|
109
|
+
<rect y="628" width="800" height="46" rx="8" fill="#FFF1F2"/>
|
|
110
|
+
{{#each redErrors as |error|}}
|
|
111
|
+
<text x="{{math 540 '-' (math error.start '+' (math error.length '/' 2))}}" y="651" dy=".3em" font-size="13" font-weight="400" fill="#57534E" text-anchor="middle">{{error.text}}</text>
|
|
112
|
+
{{/each}}
|
|
113
|
+
<path d="M580 651L595 636L595 666L580 651Z" fill="url(#neoRedArrow)"/>
|
|
114
|
+
<rect width="190" height="46" transform="translate(610 628)" fill="url(#neoRedTab)"/>
|
|
115
|
+
<text x="691" y="651" dy=".3em" font-size="14" font-weight="500" fill="#BE123C" text-anchor="middle">آزمون نامعتبر است</text>
|
|
116
|
+
<path d="M758.5 647L764.5 655M764.5 647L758.5 655M761.5 660C763.887 660 766.176 659.052 767.864 657.364C769.552 655.676 770.5 653.387 770.5 651C770.5 648.613 769.552 646.324 767.864 644.636C766.176 642.948 763.887 642 761.5 642C759.113 642 756.824 642.948 755.136 644.636C753.448 646.324 752.5 648.613 752.5 651C752.5 653.387 753.448 655.676 755.136 657.364C756.824 659.052 759.113 660 761.5 660Z" stroke="#BE123C" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
|
|
117
|
+
</g>
|
|
118
|
+
<rect x="0.5" y="628.5" width="799" height="45" rx="7.5" stroke="#FECDD3" fill="none"/>
|
|
119
|
+
{{else}}
|
|
120
|
+
<g clip-path="url(#neoRedBoxClip)">
|
|
121
|
+
<rect y="628" width="800" height="46" rx="8" fill="#FFF1F2"/>
|
|
122
|
+
{{#each redErrors as |error|}}
|
|
123
|
+
<text x="{{math 540 '-' (math error.start '+' (math error.length '/' 2))}}" y="650" dy=".3em" font-size="13" font-weight="400" fill="#57534E" text-anchor="middle">{{error.text}}</text>
|
|
124
|
+
{{#unless error.last}}<circle cx="{{math 540 '-' (math error.start '+' (math error.length '+' 26))}}" cy="650" r="2" fill="#A1A1AA"/>{{/unless}}
|
|
125
|
+
{{/each}}
|
|
126
|
+
<path d="M580 651L595 636L595 666L580 651Z" fill="url(#neoRedArrow)"/>
|
|
127
|
+
<rect width="190" height="46" transform="translate(610 628)" fill="url(#neoRedTab)"/>
|
|
128
|
+
<text x="691" y="651" dy=".3em" font-size="14" font-weight="500" fill="#BE123C" text-anchor="middle">آزمون نامعتبر است</text>
|
|
129
|
+
<path d="M758.5 647L764.5 655M764.5 647L758.5 655M761.5 660C763.887 660 766.176 659.052 767.864 657.364C769.552 655.676 770.5 653.387 770.5 651C770.5 648.613 769.552 646.324 767.864 644.636C766.176 642.948 763.887 642 761.5 642C759.113 642 756.824 642.948 755.136 644.636C753.448 646.324 752.5 648.613 752.5 651C752.5 653.387 753.448 655.676 755.136 657.364C756.824 659.052 759.113 660 761.5 660Z" stroke="#BE123C" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
|
|
130
|
+
</g>
|
|
131
|
+
<rect x="0.5" y="628.5" width="799" height="45" rx="7.5" stroke="#FECDD3" fill="none"/>
|
|
132
|
+
{{/if}}
|
|
133
|
+
</g>
|
|
134
|
+
{{/if}}
|
|
135
|
+
|
|
136
|
+
{{#if showYellow}}
|
|
137
|
+
<g transform="translate({{alertX}}, 0)">
|
|
138
|
+
<g clip-path="url(#neoYellowBoxClip)">
|
|
139
|
+
<rect y="574" width="800" height="46" rx="8" fill="#FEFCE8"/>
|
|
140
|
+
{{#each yellowErrors as |error|}}
|
|
141
|
+
<text x="{{math 540 '-' (math error.start '+' (math error.length '/' 2))}}" y="596" dy=".3em" font-size="13" font-weight="400" fill="#57534E" text-anchor="middle">{{error.text}}</text>
|
|
142
|
+
{{#unless error.last}}<circle cx="{{math 540 '-' (math error.start '+' (math error.length '+' 26))}}" cy="596" r="2" fill="#A1A1AA"/>{{/unless}}
|
|
143
|
+
{{/each}}
|
|
144
|
+
<path d="M580 597L595 582L595 612L580 597Z" fill="url(#neoYellowArrow)"/>
|
|
145
|
+
<rect width="190" height="46" transform="translate(610 574)" fill="url(#neoYellowTab)"/>
|
|
146
|
+
<text x="691" y="597" dy=".3em" font-size="14" font-weight="500" fill="#CA8A04" text-anchor="middle">با احتیاط تفسیر شود</text>
|
|
147
|
+
<path d="M767 594.666V598.221M767 600.888H767.009M765.545 589.858L758.34 601.888C758.191 602.145 758.113 602.437 758.112 602.734C758.111 603.031 758.188 603.323 758.335 603.581C758.482 603.839 758.694 604.054 758.95 604.205C759.206 604.356 759.497 604.437 759.794 604.44H774.206C774.503 604.437 774.794 604.355 775.05 604.205C775.306 604.054 775.518 603.839 775.665 603.581C775.812 603.323 775.889 603.031 775.888 602.735C775.887 602.438 775.809 602.146 775.661 601.889L768.455 589.857C768.304 589.607 768.09 589.4 767.835 589.256C767.58 589.113 767.293 589.037 767 589.037C766.708 589.037 766.42 589.113 766.165 589.256C765.91 589.4 765.697 589.607 765.545 589.857V589.858Z" stroke="#CA8A04" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
|
|
148
|
+
</g>
|
|
149
|
+
<rect x="0.5" y="574.5" width="799" height="45" rx="7.5" stroke="#FEF08A" fill="none"/>
|
|
150
|
+
</g>
|
|
151
|
+
{{/if}}
|
|
152
|
+
</g>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<defs>
|
|
2
|
+
<linearGradient id="neoShortPrimary" x1="0" y1="0" x2="1" y2="0">
|
|
3
|
+
<stop stop-color="{{colors.light}}"/>
|
|
4
|
+
<stop offset="1" stop-color="{{colors.dark}}"/>
|
|
5
|
+
</linearGradient>
|
|
6
|
+
<linearGradient id="neoShortSecondary" x1="0" y1="0" x2="1" y2="0">
|
|
7
|
+
<stop stop-color="#C7D2FE"/>
|
|
8
|
+
<stop offset="1" stop-color="#4338CA"/>
|
|
9
|
+
</linearGradient>
|
|
10
|
+
<clipPath id="neoShortBarClip">
|
|
11
|
+
{{bar 300 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0)}}
|
|
12
|
+
</clipPath>
|
|
13
|
+
<filter id="neoShortSplit" x="364" y="18" width="7" height="644" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
14
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
15
|
+
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
16
|
+
<feOffset dx="1"/>
|
|
17
|
+
<feGaussianBlur stdDeviation="1.5"/>
|
|
18
|
+
<feComposite in2="hardAlpha" operator="out"/>
|
|
19
|
+
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"/>
|
|
20
|
+
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1"/>
|
|
21
|
+
<feBlend mode="normal" in="SourceGraphic" in2="effect1" result="shape"/>
|
|
22
|
+
</filter>
|
|
23
|
+
</defs>
|
|
24
|
+
|
|
25
|
+
<g transform="translate({{padding.x}}, {{padding.y}})">
|
|
26
|
+
<text x="366.5" y="14" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">0</text>
|
|
27
|
+
<text x="516.5" y="14" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="middle">50 ٪</text>
|
|
28
|
+
<text x="666.5" y="14" font-size="12" font-weight="400" fill="#94A3B8" text-anchor="start">100 ٪</text>
|
|
29
|
+
<path d="M683 2.5V9.5M680 6.5L683 9.5L686 6.5" stroke="#64748B" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
|
|
30
|
+
<text x="692" y="7" dy=".3em" font-size="12" font-weight="400" fill="#64748B" text-anchor="end">نمره خام</text>
|
|
31
|
+
|
|
32
|
+
{{#each blocks as |block blockIndex|}}
|
|
33
|
+
<g transform="translate(0, {{math blockIndex '*' 126}})">
|
|
34
|
+
{{#if block.isBlue}}
|
|
35
|
+
<rect y="33" width="760" height="110" rx="8" fill="#F8FAFC"/>
|
|
36
|
+
<rect width="180" height="110" transform="translate(0 33)" fill="#F1F5F9"/>
|
|
37
|
+
{{/if}}
|
|
38
|
+
|
|
39
|
+
<text x="90" y="53" dy=".3em" font-size="12" font-weight="500" fill="#64748B" text-anchor="middle">{{block.letter}}</text>
|
|
40
|
+
<text x="90" y="73" dy=".3em" font-size="15" font-weight="500" fill="#334155" text-anchor="middle">{{block.fa}}</text>
|
|
41
|
+
<rect x="50" y="95.5" width="80" height="1" rx="0.5" fill="#E2E8F0"/>
|
|
42
|
+
<rect x="42" y="108.5" width="44" height="20" rx="4" fill="{{ternary block.isBlue ../colors.accent '#4F46E5'}}"/>
|
|
43
|
+
<text x="64" y="119" dy=".3em" font-size="14" font-weight="600" fill="white" text-anchor="middle">{{block.percentage}} ٪</text>
|
|
44
|
+
<text x="99" y="119" dy=".3em" text-anchor="end"><tspan font-size="15" font-weight="500" fill="#334155">{{block.mark}}</tspan><tspan font-size="13" font-weight="500" fill="#64748B"> از 48</tspan></text>
|
|
45
|
+
|
|
46
|
+
</g>
|
|
47
|
+
{{/each}}
|
|
48
|
+
|
|
49
|
+
<line x1="441.5" y1="21.5" x2="441.5" y2="658.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
50
|
+
<line x1="516.5" y1="21.5" x2="516.5" y2="658.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
51
|
+
<line x1="591.5" y1="21.5" x2="591.5" y2="658.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
52
|
+
<line x1="666.5" y1="21.5" x2="666.5" y2="658.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
53
|
+
|
|
54
|
+
{{#each blocks as |block blockIndex|}}
|
|
55
|
+
<g transform="translate(0, {{math blockIndex '*' 126}})">
|
|
56
|
+
{{#each block.facets as |facet facetIndex|}}
|
|
57
|
+
<g transform="translate(0, {{math facetIndex '*' 28}})">
|
|
58
|
+
<g transform="translate(367, {{ternary (boolean block.facets.length '===' 2) 66 52}})">
|
|
59
|
+
{{bar 300 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0) fill='#E2E8F0' fill-opacity='0.5'}}
|
|
60
|
+
</g>
|
|
61
|
+
<text x="360" y="{{ternary (boolean block.facets.length '===' 2) 74 60}}" dy=".3em" font-size="13" font-weight="400" fill="#475569" text-anchor="start">{{facet.fa}}</text>
|
|
62
|
+
<text x="679" y="{{ternary (boolean block.facets.length '===' 2) 74 60}}" dy=".3em" text-anchor="start" direction="ltr"><tspan font-size="13" font-weight="500" fill="{{ternary block.isBlue ../../colors.accent '#4F46E5'}}">{{facet.mark}}</tspan><tspan dx="2" font-size="12" font-weight="300" fill="#64748B">/</tspan><tspan dx="2" font-size="12" font-weight="400" fill="#64748B">{{facet.max}}</tspan></text>
|
|
63
|
+
</g>
|
|
64
|
+
{{/each}}
|
|
65
|
+
</g>
|
|
66
|
+
{{/each}}
|
|
67
|
+
|
|
68
|
+
{{#each blocks as |block blockIndex|}}
|
|
69
|
+
<g transform="translate(0, {{math blockIndex '*' 126}})">
|
|
70
|
+
{{#each block.facets as |facet facetIndex|}}
|
|
71
|
+
<g transform="translate(367, {{math (math facetIndex '*' 28) '+' (ternary (boolean block.facets.length '===' 2) 66 52)}})">
|
|
72
|
+
{{bar facet.barW 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0) fill=(ternary block.isBlue 'url(#neoShortPrimary)' 'url(#neoShortSecondary)') clip-path='url(#neoShortBarClip)'}}
|
|
73
|
+
<text x="{{math facet.barW '+' (ternary facet.inside -4 6)}}" y="8" dy=".3em" font-size="13" font-weight="500" fill="{{ternary facet.inside 'white' (ternary block.isBlue ../../colors.dark '#4338CA')}}" text-anchor="{{ternary facet.inside 'start' 'end'}}">{{facet.percentage}} ٪</text>
|
|
74
|
+
</g>
|
|
75
|
+
{{/each}}
|
|
76
|
+
</g>
|
|
77
|
+
{{/each}}
|
|
78
|
+
|
|
79
|
+
<g opacity="0.5" filter="url(#neoShortSplit)">
|
|
80
|
+
<line x1="366.5" y1="21.5" x2="366.5" y2="658.5" stroke="white" stroke-linecap="round"/>
|
|
81
|
+
</g>
|
|
82
|
+
</g>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<stop stop-color="#FFFBEB" stop-opacity="0.25"/>
|
|
5
5
|
<stop offset="1" stop-color="#FEF3C7" stop-opacity="0.5"/>
|
|
6
6
|
</linearGradient>
|
|
7
|
-
<linearGradient id="totalbg" x1="
|
|
7
|
+
<linearGradient id="totalbg" x1="9" y1="{{total.gradY1}}" x2="9" y2="{{total.gradY2}}" gradientUnits="userSpaceOnUse">
|
|
8
8
|
<stop stop-color="#94A3B8"/>
|
|
9
9
|
<stop offset="1" stop-color="#334155"/>
|
|
10
10
|
</linearGradient>
|
|
@@ -25,16 +25,16 @@
|
|
|
25
25
|
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3465_114726"/>
|
|
26
26
|
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3465_114726" result="shape"/>
|
|
27
27
|
</filter>
|
|
28
|
-
<filter id="totalvsp" x="0" y="0
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
28
|
+
<filter id="totalvsp" x="0" y="0" width="34" height="14" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
29
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
30
|
+
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
31
|
+
<feOffset dx="2"/>
|
|
32
|
+
<feGaussianBlur stdDeviation="3"/>
|
|
33
|
+
<feComposite in2="hardAlpha" operator="out"/>
|
|
34
|
+
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"/>
|
|
35
|
+
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5405_142130"/>
|
|
36
|
+
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5405_142130" result="shape"/>
|
|
37
|
+
</filter>
|
|
38
38
|
</defs>
|
|
39
39
|
<g transform="translate({{spec.profile.padding.x}}, {{spec.profile.padding.y}})">
|
|
40
40
|
<g transform="translate(109, 21)">
|
|
@@ -84,15 +84,15 @@
|
|
|
84
84
|
</g>
|
|
85
85
|
</g>
|
|
86
86
|
<g transform="translate(637, 1)">
|
|
87
|
-
<text x="
|
|
87
|
+
<text x="23" y="9" text-anchor="start" font-weight="400" font-size="12" fill="#475569">۱۰۰ ٪</text>
|
|
88
88
|
{{bar 18 230 (object tr=2 tl=2 br=0 bl=0) (toRad 0) fill="#F1F5F9" transform="translate(30, 4)"}}
|
|
89
89
|
{{bar 18 (math 230 '*' total.p) (object tr=2 tl=2 br=0 bl=0) (toRad 0) fill="url(#totalbg)" transform=total.transform}}
|
|
90
|
-
<g transform="translate(
|
|
91
|
-
<
|
|
90
|
+
<g transform="translate(24, 228)" opacity="0.5" filter="url(#totalvsp)">
|
|
91
|
+
<path d="M5 7H25" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
|
92
92
|
</g>
|
|
93
|
-
<text x="56" y="{{math 234 '-' (math 230 '*' total.p)}}" font-weight="600" font-size="18" dy="0" fill="#334155">{{total.percentage}} ٪</text>
|
|
94
|
-
<text x="56" y="{{math 234 '-' (math 230 '*' total.p)}}" font-weight="400" font-size="12" dy="
|
|
95
|
-
<text font-weight="400" font-size="12" fill="#475569" transform="rotate(-90,0,0) translate(-
|
|
93
|
+
<text x="56" y="{{math 234 '-' (math 230 '*' total.p)}}" font-weight="600" font-size="18" dy="0" fill="#334155" text-anchor="end">{{total.percentage}} ٪</text>
|
|
94
|
+
<text x="56" y="{{math 234 '-' (math 230 '*' total.p)}}" font-weight="400" font-size="12" dy="14" fill="#64748B" text-anchor="end">{{total.mark}} از {{total.label.max}}</text>
|
|
95
|
+
<text font-weight="400" font-size="12" fill="#475569" transform="rotate(-90,0,0) translate(-200,20)">نمره کل</text>
|
|
96
96
|
</g>
|
|
97
97
|
</g>
|
|
98
98
|
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
{{#> layout}}
|
|
2
|
+
|
|
3
|
+
<defs>
|
|
4
|
+
{{! Per-bar gradient: light pink at the bottom → magenta at the tip }}
|
|
5
|
+
<linearGradient id="barGrad" x1="0" y1="1" x2="0" y2="0">
|
|
6
|
+
<stop stop-color="#F9A8D4"/>
|
|
7
|
+
<stop offset="1" stop-color="#BE185D"/>
|
|
8
|
+
</linearGradient>
|
|
9
|
+
|
|
10
|
+
{{! Ring-gauge gradient (coords are local to the gauge centre) }}
|
|
11
|
+
<linearGradient id="gaugeGrad" x1="70" y1="-69.23" x2="-58.83" y2="125.6" gradientUnits="userSpaceOnUse">
|
|
12
|
+
<stop stop-color="#94A3B8"/>
|
|
13
|
+
<stop offset="0.5" stop-color="#475569"/>
|
|
14
|
+
<stop offset="1" stop-color="#475569"/>
|
|
15
|
+
</linearGradient>
|
|
16
|
+
|
|
17
|
+
<clipPath id="gauge-roll">
|
|
18
|
+
{{gauge 70 49 (object tl=6 tr=6 bl=6 br=6) (object start=(toRad -90) end=(toRad 180)) false}}
|
|
19
|
+
</clipPath>
|
|
20
|
+
|
|
21
|
+
{{! Drop shadow for the white baseline (offset up, soft blur) }}
|
|
22
|
+
<filter id="baseShadow" x="26" y="323" width="386" height="7" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
23
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
24
|
+
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
25
|
+
<feOffset dy="-1"/>
|
|
26
|
+
<feGaussianBlur stdDeviation="1.5"/>
|
|
27
|
+
<feComposite in2="hardAlpha" operator="out"/>
|
|
28
|
+
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"/>
|
|
29
|
+
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1"/>
|
|
30
|
+
<feBlend mode="normal" in="SourceGraphic" in2="effect1" result="shape"/>
|
|
31
|
+
</filter>
|
|
32
|
+
</defs>
|
|
33
|
+
|
|
34
|
+
<g transform="translate({{spec.profile.padding.x}}, {{spec.profile.padding.y}})">
|
|
35
|
+
|
|
36
|
+
{{! ===================== Vertical bar chart ===================== }}
|
|
37
|
+
|
|
38
|
+
{{! Background tracks }}
|
|
39
|
+
{{#each factors as |factor|}}
|
|
40
|
+
<g transform="translate({{factor.trackLeft}}, 27)">
|
|
41
|
+
{{bar 28 300 (object tl=4 tr=4 bl=0 br=0) (toRad 0) fill="#F8FAFC"}}
|
|
42
|
+
</g>
|
|
43
|
+
{{/each}}
|
|
44
|
+
|
|
45
|
+
{{! Gridlines (25/50/75/100 %) + labelled axis at 100 % and 50 % }}
|
|
46
|
+
<line x1="69.5" y1="27.5" x2="408.5" y2="27.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
47
|
+
<line x1="69.5" y1="102.5" x2="408.5" y2="102.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
48
|
+
<line x1="69.5" y1="177.5" x2="408.5" y2="177.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
49
|
+
<line x1="69.5" y1="252.5" x2="408.5" y2="252.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="6 6"/>
|
|
50
|
+
<text x="53" y="27.5" text-anchor="end" dy=".35em" font-size="12" fill="#94A3B8" direction="ltr">٪ 100</text>
|
|
51
|
+
<text x="53" y="177.5" text-anchor="end" dy=".35em" font-size="12" fill="#94A3B8" direction="ltr">٪ 50</text>
|
|
52
|
+
|
|
53
|
+
{{! Value bars + inside/outside percentage label }}
|
|
54
|
+
{{#each factors as |factor|}}
|
|
55
|
+
{{#if factor.barH}}
|
|
56
|
+
<g transform="translate({{factor.trackLeft}}, {{factor.topY}})">
|
|
57
|
+
{{bar 28 factor.barH (object tl=4 tr=4 bl=0 br=0) (toRad 0) fill="url(#barGrad)"}}
|
|
58
|
+
</g>
|
|
59
|
+
{{/if}}
|
|
60
|
+
{{#if (boolean factor.pct '>=' 25)}}
|
|
61
|
+
<text transform="rotate(-90 {{factor.cx}} {{math factor.topY '+' 22}})" x="{{factor.cx}}" y="{{math factor.topY '+' 22}}" text-anchor="middle" dy=".32em" font-size="16" font-weight="600" fill="white">{{factor.pct}} ٪</text>
|
|
62
|
+
{{else}}
|
|
63
|
+
<text transform="rotate(-90 {{factor.cx}} {{math factor.topY '-' 15}})" x="{{math factor.cx '+' 8}}" y="{{math factor.topY '-' 15}}" text-anchor="middle" dy=".32em" font-size="16" font-weight="600" fill="#BE185D">{{factor.pct}} ٪</text>
|
|
64
|
+
{{/if}}
|
|
65
|
+
{{/each}}
|
|
66
|
+
|
|
67
|
+
{{! Domain names under each bar }}
|
|
68
|
+
{{#each factors as |factor|}}
|
|
69
|
+
{{#each factor.lines as |line lineIndex|}}
|
|
70
|
+
<text x="{{factor.cx}}" y="{{math 352 '+' (math 18 '*' lineIndex)}}" text-anchor="middle" font-size="14" fill="#334155">{{line}}</text>
|
|
71
|
+
{{/each}}
|
|
72
|
+
{{/each}}
|
|
73
|
+
|
|
74
|
+
{{! White shadowed baseline (0 %), drawn on top of the bars }}
|
|
75
|
+
<g opacity="0.5" filter="url(#baseShadow)">
|
|
76
|
+
<line x1="29.5" y1="327.5" x2="408.5" y2="327.5" stroke="white" stroke-linecap="round"/>
|
|
77
|
+
</g>
|
|
78
|
+
|
|
79
|
+
{{! ===== "raw score" header row: legend + per-bar raw/max fractions ===== }}
|
|
80
|
+
<text x="38" y="9" text-anchor="start" dy=".3em" font-size="12" fill="#94A3B8">نمره خام</text>
|
|
81
|
+
<path d="M45.5 8L52.5 8M49.5 11L52.5 8L49.5 5" stroke="#94A3B8" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
|
|
82
|
+
{{#each factors as |factor|}}
|
|
83
|
+
<text x="{{factor.cx}}" y="9" text-anchor="middle" dy=".3em" direction="ltr"><tspan font-weight="700" font-size="16" fill="#BE185D">{{factor.mark}}</tspan><tspan font-weight="300" font-size="12" fill="#64748B"> / </tspan><tspan font-weight="400" font-size="13" fill="#64748B">{{factor.max}}</tspan></text>
|
|
84
|
+
{{/each}}
|
|
85
|
+
|
|
86
|
+
{{! ===================== Total score ring gauge ===================== }}
|
|
87
|
+
<g transform="translate(220.5, 498)">
|
|
88
|
+
{{gauge 70 49 (object tl=6 tr=6 bl=6 br=6) (object start=(toRad -90) end=(toRad 180)) false clip-path="url(#gauge-roll)" fill="#F1F5F9"}}
|
|
89
|
+
{{#if total.mark}}{{gauge 70 49 (object tl=6 tr=6 bl=6 br=6) (object start=(toRad -90) end=total.zeta) false clip-path="url(#gauge-roll)" fill="url(#gaugeGrad)"}}{{/if}}
|
|
90
|
+
|
|
91
|
+
<text x="0" y="-2" text-anchor="middle" font-size="24" font-weight="600" fill="#334155" direction="ltr">٪ {{total.pct}}</text>
|
|
92
|
+
<text x="0" y="26" text-anchor="middle" font-size="15" font-weight="500" fill="#64748B">{{total.mark}} از {{total.max}}</text>
|
|
93
|
+
|
|
94
|
+
<text x="-52" y="-6" text-anchor="middle" font-size="14" fill="#64748B" direction="ltr">٪ 100</text>
|
|
95
|
+
<text x="-11" y="-56" text-anchor="middle" font-size="14" fill="#64748B">0</text>
|
|
96
|
+
|
|
97
|
+
<text x="0" y="104" text-anchor="middle" font-size="16" font-weight="500" fill="#475569">نمره کل</text>
|
|
98
|
+
</g>
|
|
99
|
+
|
|
100
|
+
</g>
|
|
101
|
+
|
|
102
|
+
{{/layout}}
|