@baravak/risloo-profile-cli 4.46.3 → 4.70.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.
Files changed (92) hide show
  1. package/.agents/skills/create-profile/SKILL.md +14 -0
  2. package/.claude/settings.local.json +1 -3
  3. package/.claude/skills/create-profile/SKILL.md +80 -0
  4. package/AGENTS.md +239 -0
  5. package/CLAUDE.md +2 -185
  6. package/package.json +1 -1
  7. package/src/cli-commands/Executor.js +8 -2
  8. package/src/cli-commands/ExtractExecutor.js +55 -21
  9. package/src/cli-commands/GiftExecutor.js +1 -0
  10. package/src/handlebars/importPartials.js +10 -44
  11. package/src/handlebars/init.js +17 -11
  12. package/src/publish/json/profiles/BSSI93.json +392 -0
  13. package/src/publish/json/profiles/FRHPT93.json +2 -2
  14. package/src/publish/json/profiles/ISKS93.json +288 -0
  15. package/src/publish/json/profiles/MCMI9A.json +1540 -0
  16. package/src/publish/json/profiles/NEO93.json +3858 -0
  17. package/src/publish/json/profiles/NEO9A.json +1159 -1
  18. package/src/publish/json/profiles/NEO9Q.json +3856 -0
  19. package/src/publish/json/profiles/NEO9V.json +1157 -0
  20. package/src/publish/json/profiles/RIASEC9A.json +2775 -0
  21. package/src/publish/json/profiles/RSI93.json +359 -0
  22. package/src/samples/AEQ93.js +1 -1
  23. package/src/samples/AMS93.js +1 -1
  24. package/src/samples/AMS9A.js +3 -1
  25. package/src/samples/BAOMEIS93.js +1 -1
  26. package/src/samples/BEQI93.js +1 -1
  27. package/src/samples/BSCT93.js +5 -0
  28. package/src/samples/BSSI93.js +93 -0
  29. package/src/samples/CAATS93.js +1 -1
  30. package/src/samples/CERQ93.js +1 -1
  31. package/src/samples/CRAAS93.js +1 -1
  32. package/src/samples/DSWLS93.js +1 -1
  33. package/src/samples/EMSS93.js +1 -1
  34. package/src/samples/EPQ9A.js +6 -1
  35. package/src/samples/FACES93.js +6 -0
  36. package/src/samples/FRHPT93.js +41 -13
  37. package/src/samples/GMIT93.js +1 -1
  38. package/src/samples/HPL93.js +1 -1
  39. package/src/samples/ISKS93.js +62 -0
  40. package/src/samples/IUS93.js +1 -1
  41. package/src/samples/JCSI93.js +1 -1
  42. package/src/samples/JPFQ93.js +5 -0
  43. package/src/samples/KJGI93.js +1 -1
  44. package/src/samples/LMIQ93.js +1 -1
  45. package/src/samples/MMFAD93.js +1 -1
  46. package/src/samples/MOCI93.js +1 -1
  47. package/src/samples/NEO93.js +277 -0
  48. package/src/samples/NEO9A.js +91 -60
  49. package/src/samples/NEO9Q.js +279 -0
  50. package/src/samples/NEO9V.js +215 -0
  51. package/src/samples/OBQ4493.js +1 -1
  52. package/src/samples/PIES93.js +1 -1
  53. package/src/samples/PIES9A.js +4 -0
  54. package/src/samples/PMCIEF93.js +7 -1
  55. package/src/samples/PSWQ93.js +1 -1
  56. package/src/samples/RIASEC93.js +1 -1
  57. package/src/samples/RIASEC9A.js +256 -0
  58. package/src/samples/RSI93.js +89 -0
  59. package/src/samples/SASQ93.js +1 -1
  60. package/src/samples/SDCAQ93.js +1 -1
  61. package/src/samples/STAIY93.js +1 -1
  62. package/src/samples/WAQ93.js +1 -1
  63. package/src/samples/YBOCS93.js +1 -1
  64. package/src/samples/YPI93.js +5 -1
  65. package/views/profiles/NEO_long_facets.hbs +125 -0
  66. package/views/profiles/NEO_main.hbs +150 -0
  67. package/views/profiles/NEO_short_facets.hbs +82 -0
  68. package/views/profiles/samples/BSCT93.hbs +17 -17
  69. package/views/profiles/samples/BSSI93.hbs +102 -0
  70. package/views/profiles/samples/FRHPT93_1.hbs +568 -87
  71. package/views/profiles/samples/FRHPT93_2.hbs +90 -76
  72. package/views/profiles/samples/FRHPT93_3.hbs +2 -2
  73. package/views/profiles/samples/FRHPT93_4.hbs +2 -2
  74. package/views/profiles/samples/FRHPT93_5.hbs +103 -0
  75. package/views/profiles/samples/FRHPT9A.hbs +7 -7
  76. package/views/profiles/samples/ISKS93.hbs +38 -0
  77. package/views/profiles/samples/NEO93_1.hbs +14 -0
  78. package/views/profiles/samples/NEO93_2.hbs +15 -0
  79. package/views/profiles/samples/NEO93_3.hbs +15 -0
  80. package/views/profiles/samples/NEO9A.hbs +14 -29
  81. package/views/profiles/samples/NEO9Q_1.hbs +13 -0
  82. package/views/profiles/samples/NEO9Q_2.hbs +14 -0
  83. package/views/profiles/samples/NEO9Q_3.hbs +14 -0
  84. package/views/profiles/samples/NEO9V_1.hbs +13 -0
  85. package/views/profiles/samples/NEO9V_2.hbs +3 -0
  86. package/views/profiles/samples/RIASEC9A_1.hbs +38 -0
  87. package/views/profiles/samples/RIASEC9A_2.hbs +67 -0
  88. package/views/profiles/samples/RIASEC9A_3.hbs +93 -0
  89. package/views/profiles/samples/RSI93.hbs +101 -0
  90. package/a.json +0 -4805
  91. package/src/publish/json/profiles/BSCT93_t1.json +0 -512
  92. package/src/publish/json/profiles/BSCT93_t2.json +0 -512
@@ -1,103 +1,117 @@
1
1
  {{#> layout}}
2
2
 
3
3
  <defs>
4
- <linearGradient id="bgbar1">
4
+ <linearGradient id="bgbarg">
5
5
  <stop stop-color="{{colors.bars.[0].[0]}}"/>
6
6
  <stop offset="1" stop-color="{{colors.bars.[0].[1]}}"/>
7
7
  </linearGradient>
8
- <linearGradient id="bgbar2">
9
- <stop stop-color="{{colors.bars.[1].[0]}}"/>
10
- <stop offset="1" stop-color="{{colors.bars.[1].[1]}}"/>
11
- </linearGradient>
12
- <clipPath id="cobar">
13
- {{bar 250 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0)}}
8
+ <clipPath id="cbgbarg">
9
+ {{bar 480 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0)}}
14
10
  </clipPath>
15
-
16
- <filter id="split" x="0" y="0" width="7" height="{{ternary (boolean groups.length '==' 3) 462 614}}" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
11
+ <linearGradient id="bgind" x1="97" y1="0" x2="97" y2="83" gradientUnits="userSpaceOnUse">
12
+ <stop stop-color="#F8FAFC"/>
13
+ <stop offset="1" stop-color="#F5F3FF"/>
14
+ </linearGradient>
15
+ <linearGradient id="error" x1="15" y1="15" x2="0" y2="15" gradientUnits="userSpaceOnUse">
16
+ <stop stop-color="#FFF1F2"/>
17
+ <stop offset="1" stop-color="#FECDD3"/>
18
+ </linearGradient>
19
+ <filter id="split" x="0" y="0" width="7" height="462" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
17
20
  <feFlood flood-opacity="0" result="BackgroundImageFix"/>
18
21
  <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"/>
19
22
  <feOffset dx="1"/>
20
23
  <feGaussianBlur stdDeviation="1.5"/>
21
24
  <feComposite in2="hardAlpha" operator="out"/>
22
25
  <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"/>
23
- <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5334_139730"/>
24
- <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5334_139730" result="shape"/>
26
+ <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5334_134825"/>
27
+ <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5334_134825" result="shape"/>
25
28
  </filter>
26
29
  </defs>
27
- <g transform="translate({{spec.profile.padding.x}}, {{spec.profile.padding.y}})">
28
- <g transform="translate(0, 4)">
30
+ <g transform="translate({{spec.profile.padding.[1].x}}, {{spec.profile.padding.[1].y}})">
31
+ <g>
29
32
  <g transform="translate(0, 48)">
30
- {{#each groups as |item index|}}
31
- {{setVar "color" (ternary (even index) ../colors.bars.[0] ../colors.bars.[1])}}
32
- <g transform="translate(0, {{math index '*' 152}})">
33
- <rect width="800" height="136" rx="8" fill="{{ternary (even index) '#F8FAFC' 'white'}}" />
34
- {{bar 180 136 (object tl=8 bl=8 tr=0 br=0) (toRad 0) fill=(ternary (even index) '#F1F5F9' 'white') }}
35
- {{#if (boolean level '===' undefined)}}
36
- <text x="90" y="57" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">{{key}}</text>
37
- <text x="90" y="77" font-size="15" font-weight="500" dy=".3em" fill="#334155" text-anchor="middle">{{label.fa}}</text>
38
- {{else}}
39
- <text x="90" y="23.5" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">{{key}}</text>
40
- <text x="90" y="44.5" font-size="15" font-weight="500" dy=".3em" fill="#334155" text-anchor="middle">{{label.fa}}</text>
41
- <rect x="50" y="65.5" width="80" height="1" rx="0.5" fill="#E2E8F0"/>
42
- <rect x="100.5" y="78.5" width="40" height="20" rx="4" fill="{{color.[2]}}" />
43
- <text x="120.5" y="88.5" font-size="14" font-weight="600" dy=".3em" fill="#FFFFFF" text-anchor="middle">{{percentageText}} ٪</text>
44
- <text x="90" y="111.5" font-size="12" font-weight="400" dy=".3em" fill="{{color.[2]}}" text-anchor="middle">{{levelText}}</text>
45
- <text x="92.5" y="88.5" font-size="15" font-weight="500" dy=".3em" fill="#334155" text-anchor="start">
46
- <tspan>
47
- {{mark}}
48
- </tspan>
49
- <tspan fill="#64748B" font-size="14" font-weight="500">از 144</tspan>
50
- </text>
51
- {{/if}}
52
- <g transform="translate(389, {{ternary (boolean item.length '===' 4) 12 28}})">
53
- {{#each subs as |sub i|}}
54
- <g transform="translate(0, {{math i '*' 32}})">
55
- {{bar 250 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0) fill='#E2E8F080' clip-path="url(#cobar)"}}
56
- </g>
57
- {{/each}}
33
+ <g>
34
+ {{#each groups as |item index|}}
35
+ <g transform="translate(0, {{math index '*' 40}})">
36
+ <rect width="800" height="40" fill="{{ternary (even index) '#F8FAFC' 'none'}}" rx="8" />
37
+ {{bar 480 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0) fill='#E2E8F080' transform='translate(158, 12)'}}
58
38
  </g>
59
- </g>
60
- {{/each}}
39
+ {{/each}}
40
+ </g>
41
+ <g>
42
+ <text x="156.5" y="-24" font-size="12" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="middle">0</text>
43
+ <text x="397.5" y="-24" font-size="12" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="middle">50 ٪</text>
44
+ <text x="632" y="-24" font-size="12" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="middle">100 ٪</text>
45
+ <text x="754" y="-19" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">رده‌بندی</text>
46
+ <text x="677" y="-33" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">نمره خام</text>
47
+ <text x="677" y="-19" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">از 144</text>
48
+ <line x1="277.5" y1="-8.5" x2="277.5" y2="446.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
49
+ <line x1="397.5" y1="-8.5" x2="397.5" y2="446.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
50
+ <line x1="517.5" y1="-8.5" x2="517.5" y2="446.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
51
+ <line x1="637.5" y1="-8.5" x2="637.5" y2="446.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
52
+ <rect x="709" y="-48" width="1" height="496" fill="#F1F5F9"/>
53
+
61
54
  </g>
62
- <line x1="451.25" y1="40.5" x2="451.25" y2="{{ternary (boolean groups.length '==' 3) '495.5' '647.5'}}" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
63
- <line x1="513.25" y1="40.5" x2="513.25" y2="{{ternary (boolean groups.length '==' 3) '495.5' '647.5'}}" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
64
- <line x1="576.25" y1="40.5" x2="576.25" y2="{{ternary (boolean groups.length '==' 3) '495.5' '647.5'}}" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
65
- <line x1="638.25" y1="40.5" x2="638.25" y2="{{ternary (boolean groups.length '==' 3) '495.5' '647.5'}}" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
66
- <rect x="709" width="1" height="{{ternary (boolean groups.length '==' 3) 496 648}}" fill="#F1F5F9"/>
67
- <text x="387.5" y="24" font-size="12" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="middle">0</text>
68
- <text x="514.5" y="24" font-size="12" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="middle">50 ٪</text>
69
- <text x="637" y="24" font-size="12" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="middle">100 ٪</text>
70
- <text x="754" y="27" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">رده‌بندی</text>
71
- <text x="677" y="13" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">نمره خام</text>
72
- <text x="677" y="27" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">از 36</text>
73
-
74
- <g transform="translate(0, 48)">
75
- {{#each groups as |item index|}}
76
- {{setVar "color" (ternary (even index) ../colors.bars.[0] ../colors.bars.[1])}}
77
- <g transform="translate(0, {{math index '*' 152}})">
78
- <g transform="translate(389, {{ternary (boolean item.length '===' 4) 12 28}})">
79
- {{#each subs as |sub i|}}
80
- <g transform="translate(0, {{math i '*' 32}})">
81
- {{bar (math percentage '*' 250) 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0) fill=../bg}}
82
- <text x="-9" y="9" font-size="13" font-weight="400" dy=".3em" fill="#475569" text-anchor="start">{{sub.label.fa}}</text>
83
- <rect x="270" y="-.5" width="36" height="17" rx="4" fill="none" stroke="{{../color.[3]}}" />
84
- <text x="288" y="9" font-size="13" font-weight="500" dy=".3em" fill="{{../color.[2]}}" text-anchor="middle">{{sub.mark}}</text>
85
- <text x="366" y="9" font-size="12" font-weight="400" dy=".3em" fill="#64748B" text-anchor="middle">{{sub.levelText}}</text>
86
- {{#if (boolean percentage '>' 0.24)}}
87
- <text x="{{math (math percentage '*' 250) '-' 4}}" y="9" font-size="13" font-weight="500" dy=".3em" fill="#FFFFFF" text-anchor="start">{{sub.percentageText}} ٪</text>
55
+ <g>
56
+ {{#each groups as |item index|}}
57
+ <g transform="translate(0, {{math index '*' 40}})">
58
+ {{# if (boolean key '!==' 'MO')}}
59
+ <g transform='translate(158, 12)'>
60
+ {{bar (math 480 '*' percentage) 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0) fill='url(#bgbarg)' clip-path='url(#cbgbarg)'}}
61
+ <text x="{{math (math 480 '*' percentage) '+' (ternary (boolean percentage '<=' 0.24) 4 -6)}}" y="8" font-size="13" font-weight="500" dy=".3em" fill="{{ternary (boolean percentage '<=' 0.24) ../colors.bars.[0].[1] 'white'}}" text-anchor="{{ternary (boolean percentage '<=' 0.24) 'end' 'start'}}">
62
+ {{percentageText}} ٪
63
+ </text>
64
+ </g>
65
+ <rect x="659" y="11" width="36" height="18" rx="4" fill="{{../colors.bars.[0].[2]}}" />
66
+ <text x="677" y="20" font-size="13" font-weight="500" dy=".3em" fill="white" text-anchor="middle">{{item.mark}}</text>
67
+ <text x="755" y="20" font-size="12" font-weight="400" dy=".3em" fill="#64748B" text-anchor="middle">{{item.levelText}}</text>
68
+ <text x="149" y="20" font-size="13" font-weight="400" dy=".3em" fill="#475569" text-anchor="start">{{item.key}}</text>
69
+ <text x="121" y="20" font-size="13" font-weight="400" dy=".3em" fill="#475569" text-anchor="start">-</text>
70
+ <text x="110" y="20" font-size="13" font-weight="400" dy=".3em" fill="#475569" text-anchor="start">{{item.label.fa}}</text>
88
71
  {{else}}
89
- <text x="{{math (math percentage '*' 250) '+' 6}}" y="9" font-size="13" font-weight="500" dy=".3em" fill="{{../color.[1]}}" text-anchor="end">{{sub.percentageText}} ٪</text>
72
+ <rect x="659" y="11" width="36" height="18" rx="4" fill="#CBD5E1" />
73
+ <text x="677" y="20" font-size="13" font-weight="500" dy=".3em" fill="white" text-anchor="middle">-</text>
74
+ <text x="755" y="20" font-size="13" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">-</text>
75
+ <text x="149" y="20" font-size="13" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="start">{{item.key}}</text>
76
+ <text x="121" y="20" font-size="13" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="start">-</text>
77
+ <text x="110" y="20" font-size="13" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="start">{{item.label.fa}}</text>
90
78
  {{/if}}
91
- </g>
92
- {{/each}}
79
+
93
80
  </g>
94
- </g>
95
- {{/each}}
81
+ {{/each}}
82
+ </g>
83
+ <g opacity="0.5" filter="url(#split)" transform="translate(154.5, -10.5)">
84
+ <line x1="2.5" y1="3.5" x2="2.5" y2="458.5" stroke="white" stroke-linecap="round"/>
85
+ </g>
96
86
  </g>
97
- <g opacity="0.5" filter="url(#split)" transform="translate(386, 37.5)">
98
- <line x1="2.5" y1="3.5" x2="2.5" y2="{{ternary (boolean groups.length '==' 3) 458.5 610.5}}" stroke="white" stroke-linecap="round"/>
87
+ </g>
88
+ <g transform="translate(0, 520)">
89
+ {{#each indicators as |item index|}}
90
+ <g transform="translate({{math index '*' 202}}, 0)">
91
+ <rect width="194" height="83" fill="url(#bgind)" stroke="#EDE9FE" rx="8" />
92
+ <text x="142" y="29.5" font-size="16" font-weight="600" dy=".3em" fill="#5B21B6" text-anchor="middle">{{item.mark}}</text>
93
+ <text x="72" y="29.5" font-size="14" font-weight="500" dy=".3em" fill="#334155" text-anchor="middle">{{item.levelText}}</text>
94
+ <path d="M 8.78 3.78 h -8.75 m 0 0 l 3.75 3.75 m -3.75 -3.75 l 3.75 -3.75" stroke="#94A3B8" stroke-linecap="round" stroke-linejoin="round" transform="translate(112.62, 25.75)"/>
95
+ <text x="97" y="55" font-size="13" font-weight="400" dy=".3em" fill="#64748B" text-anchor="middle">{{item.label.fa}}</text>
96
+ </g>
97
+ {{/each}}
98
+ </g>
99
+ {{#if (boolean validityErrors.length '!==' 0)}}
100
+ <g transform="translate(0, 611)">
101
+ <rect width="800" height="46" fill="#FFF1F2" stroke="#FECDD3" rx="8" />
102
+ <path d="M 8.9 5.63 v 3.5556 m 0 2.6667 h 0.0089 m -1.464 -11.0303 l -7.2053 12.0303 c -0.1485 0.2572 -0.2271 0.5488 -0.228 0.8459 c -0.0009 0.297 0.0761 0.5891 0.2231 0.8472 c 0.1471 0.258 0.3591 0.4731 0.6151 0.6238 c 0.256 0.1507 0.5469 0.2317 0.844 0.2351 h 14.4125 c 0.2968 -0.0035 0.5877 -0.0845 0.8435 -0.2352 c 0.2559 -0.1506 0.4679 -0.3656 0.6149 -0.6235 c 0.147 -0.258 0.224 -0.5499 0.2233 -0.8468 c -0.0008 -0.2969 -0.0792 -0.5884 -0.2275 -0.8456 l -7.2053 -12.0321 c -0.1516 -0.2502 -0.3652 -0.4571 -0.6201 -0.6007 c -0.2549 -0.1436 -0.5425 -0.219 -0.8351 -0.219 c -0.2926 0 -0.5802 0.0754 -0.8351 0.219 c -0.2549 0.1436 -0.4685 0.3505 -0.6201 0.6007 v 0.0009 z" transform="translate(729.61, 15.04)" fill="none" stroke="#BE123C" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
103
+ <text x="690" y="23" font-size="14" font-weight="500" dy=".3em" fill="#BE123C" text-anchor="middle">فاقد اعتبار</text>
104
+ <path d="M 0 0 l 15 -15 l 0 30 l -15 -15 z" fill="url(#error)" transform="translate(580, 23)"/>
105
+ <g transform="translate(0, 23)">
106
+ {{#each validityErrors as |error index|}}
107
+ <text x="{{math 532 '-' (math start '+' (math length '/' 2))}}" y="0" font-size="13" font-weight="400" dy=".3em" fill="#57534E" text-anchor="middle">{{error.error}}</text>
108
+ {{#if (boolean error.last '===' false)}}
109
+ <circle cx="{{math 532 '-' (math start '+' (math length '+' 26))}}" cy="2" r="2" fill="#A1A1AA"/>
110
+ {{/if}}
111
+ {{/each}}
99
112
  </g>
100
113
  </g>
114
+ {{/if}}
101
115
  </g>
102
116
 
103
117
  {{/layout}}
@@ -24,7 +24,7 @@
24
24
  <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5334_139730" result="shape"/>
25
25
  </filter>
26
26
  </defs>
27
- <g transform="translate({{spec.profile.padding.x}}, {{spec.profile.padding.y}})">
27
+ <g transform="translate({{spec.profile.padding.[1].x}}, {{spec.profile.padding.[1].y}})">
28
28
  <g transform="translate(0, 4)">
29
29
  <g transform="translate(0, 48)">
30
30
  {{#each groups as |item index|}}
@@ -46,7 +46,7 @@
46
46
  <tspan>
47
47
  {{mark}}
48
48
  </tspan>
49
- <tspan fill="#64748B" font-size="13" font-weight="500">از 144</tspan>
49
+ <tspan fill="#64748B" font-size="14" font-weight="500">از 144</tspan>
50
50
  </text>
51
51
  {{/if}}
52
52
  <g transform="translate(389, {{ternary (boolean item.length '===' 4) 12 28}})">
@@ -24,7 +24,7 @@
24
24
  <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5334_139730" result="shape"/>
25
25
  </filter>
26
26
  </defs>
27
- <g transform="translate({{spec.profile.padding.x}}, {{spec.profile.padding.y}})">
27
+ <g transform="translate({{spec.profile.padding.[1].x}}, {{spec.profile.padding.[1].y}})">
28
28
  <g transform="translate(0, 4)">
29
29
  <g transform="translate(0, 48)">
30
30
  {{#each groups as |item index|}}
@@ -46,7 +46,7 @@
46
46
  <tspan>
47
47
  {{mark}}
48
48
  </tspan>
49
- <tspan fill="#64748B" font-size="14" font-weight="500">از 144</tspan>
49
+ <tspan fill="#64748B" font-size="13" font-weight="500">از 144</tspan>
50
50
  </text>
51
51
  {{/if}}
52
52
  <g transform="translate(389, {{ternary (boolean item.length '===' 4) 12 28}})">
@@ -0,0 +1,103 @@
1
+ {{#> layout}}
2
+
3
+ <defs>
4
+ <linearGradient id="bgbar1">
5
+ <stop stop-color="{{colors.bars.[0].[0]}}"/>
6
+ <stop offset="1" stop-color="{{colors.bars.[0].[1]}}"/>
7
+ </linearGradient>
8
+ <linearGradient id="bgbar2">
9
+ <stop stop-color="{{colors.bars.[1].[0]}}"/>
10
+ <stop offset="1" stop-color="{{colors.bars.[1].[1]}}"/>
11
+ </linearGradient>
12
+ <clipPath id="cobar">
13
+ {{bar 250 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0)}}
14
+ </clipPath>
15
+
16
+ <filter id="split" x="0" y="0" width="7" height="{{ternary (boolean groups.length '==' 3) 462 614}}" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
17
+ <feFlood flood-opacity="0" result="BackgroundImageFix"/>
18
+ <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"/>
19
+ <feOffset dx="1"/>
20
+ <feGaussianBlur stdDeviation="1.5"/>
21
+ <feComposite in2="hardAlpha" operator="out"/>
22
+ <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"/>
23
+ <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5334_139730"/>
24
+ <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5334_139730" result="shape"/>
25
+ </filter>
26
+ </defs>
27
+ <g transform="translate({{spec.profile.padding.[1].x}}, {{spec.profile.padding.[1].y}})">
28
+ <g transform="translate(0, 4)">
29
+ <g transform="translate(0, 48)">
30
+ {{#each groups as |item index|}}
31
+ {{setVar "color" (ternary (even index) ../colors.bars.[0] ../colors.bars.[1])}}
32
+ <g transform="translate(0, {{math index '*' 152}})">
33
+ <rect width="800" height="136" rx="8" fill="{{ternary (even index) '#F8FAFC' 'white'}}" />
34
+ {{bar 180 136 (object tl=8 bl=8 tr=0 br=0) (toRad 0) fill=(ternary (even index) '#F1F5F9' 'white') }}
35
+ {{#if (boolean level '===' undefined)}}
36
+ <text x="90" y="57" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">{{key}}</text>
37
+ <text x="90" y="77" font-size="15" font-weight="500" dy=".3em" fill="#334155" text-anchor="middle">{{label.fa}}</text>
38
+ {{else}}
39
+ <text x="90" y="23.5" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">{{key}}</text>
40
+ <text x="90" y="44.5" font-size="15" font-weight="500" dy=".3em" fill="#334155" text-anchor="middle">{{label.fa}}</text>
41
+ <rect x="50" y="65.5" width="80" height="1" rx="0.5" fill="#E2E8F0"/>
42
+ <rect x="100.5" y="78.5" width="40" height="20" rx="4" fill="{{color.[2]}}" />
43
+ <text x="120.5" y="88.5" font-size="14" font-weight="600" dy=".3em" fill="#FFFFFF" text-anchor="middle">{{percentageText}} ٪</text>
44
+ <text x="90" y="111.5" font-size="12" font-weight="400" dy=".3em" fill="{{color.[2]}}" text-anchor="middle">{{levelText}}</text>
45
+ <text x="92.5" y="88.5" font-size="15" font-weight="500" dy=".3em" fill="#334155" text-anchor="start">
46
+ <tspan>
47
+ {{mark}}
48
+ </tspan>
49
+ <tspan fill="#64748B" font-size="14" font-weight="500">از 144</tspan>
50
+ </text>
51
+ {{/if}}
52
+ <g transform="translate(389, {{ternary (boolean item.length '===' 4) 12 28}})">
53
+ {{#each subs as |sub i|}}
54
+ <g transform="translate(0, {{math i '*' 32}})">
55
+ {{bar 250 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0) fill='#E2E8F080' clip-path="url(#cobar)"}}
56
+ </g>
57
+ {{/each}}
58
+ </g>
59
+ </g>
60
+ {{/each}}
61
+ </g>
62
+ <line x1="451.25" y1="40.5" x2="451.25" y2="{{ternary (boolean groups.length '==' 3) '495.5' '647.5'}}" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
63
+ <line x1="513.25" y1="40.5" x2="513.25" y2="{{ternary (boolean groups.length '==' 3) '495.5' '647.5'}}" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
64
+ <line x1="576.25" y1="40.5" x2="576.25" y2="{{ternary (boolean groups.length '==' 3) '495.5' '647.5'}}" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
65
+ <line x1="638.25" y1="40.5" x2="638.25" y2="{{ternary (boolean groups.length '==' 3) '495.5' '647.5'}}" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
66
+ <rect x="709" width="1" height="{{ternary (boolean groups.length '==' 3) 496 648}}" fill="#F1F5F9"/>
67
+ <text x="387.5" y="24" font-size="12" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="middle">0</text>
68
+ <text x="514.5" y="24" font-size="12" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="middle">50 ٪</text>
69
+ <text x="637" y="24" font-size="12" font-weight="400" dy=".3em" fill="#94A3B8" text-anchor="middle">100 ٪</text>
70
+ <text x="754" y="27" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">رده‌بندی</text>
71
+ <text x="677" y="13" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">نمره خام</text>
72
+ <text x="677" y="27" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">از 36</text>
73
+
74
+ <g transform="translate(0, 48)">
75
+ {{#each groups as |item index|}}
76
+ {{setVar "color" (ternary (even index) ../colors.bars.[0] ../colors.bars.[1])}}
77
+ <g transform="translate(0, {{math index '*' 152}})">
78
+ <g transform="translate(389, {{ternary (boolean item.length '===' 4) 12 28}})">
79
+ {{#each subs as |sub i|}}
80
+ <g transform="translate(0, {{math i '*' 32}})">
81
+ {{bar (math percentage '*' 250) 16 (object tl=0 bl=0 tr=2 br=2) (toRad 0) fill=../bg}}
82
+ <text x="-9" y="9" font-size="13" font-weight="400" dy=".3em" fill="#475569" text-anchor="start">{{sub.label.fa}}</text>
83
+ <rect x="270" y="-.5" width="36" height="17" rx="4" fill="none" stroke="{{../color.[3]}}" />
84
+ <text x="288" y="9" font-size="13" font-weight="500" dy=".3em" fill="{{../color.[2]}}" text-anchor="middle">{{sub.mark}}</text>
85
+ <text x="366" y="9" font-size="12" font-weight="400" dy=".3em" fill="#64748B" text-anchor="middle">{{sub.levelText}}</text>
86
+ {{#if (boolean percentage '>' 0.24)}}
87
+ <text x="{{math (math percentage '*' 250) '-' 4}}" y="9" font-size="13" font-weight="500" dy=".3em" fill="#FFFFFF" text-anchor="start">{{sub.percentageText}} ٪</text>
88
+ {{else}}
89
+ <text x="{{math (math percentage '*' 250) '+' 6}}" y="9" font-size="13" font-weight="500" dy=".3em" fill="{{../color.[1]}}" text-anchor="end">{{sub.percentageText}} ٪</text>
90
+ {{/if}}
91
+ </g>
92
+ {{/each}}
93
+ </g>
94
+ </g>
95
+ {{/each}}
96
+ </g>
97
+ <g opacity="0.5" filter="url(#split)" transform="translate(386, 37.5)">
98
+ <line x1="2.5" y1="3.5" x2="2.5" y2="{{ternary (boolean groups.length '==' 3) 458.5 610.5}}" stroke="white" stroke-linecap="round"/>
99
+ </g>
100
+ </g>
101
+ </g>
102
+
103
+ {{/layout}}
@@ -16,7 +16,7 @@
16
16
  <stop stop-color="#FFF1F2"/>
17
17
  <stop offset="1" stop-color="#FECDD3"/>
18
18
  </linearGradient>
19
- <filter id="split" x="0" y="0" width="7" height="342" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
19
+ <filter id="split" x="0" y="0" width="7" height="334" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
20
20
  <feFlood flood-opacity="0" result="BackgroundImageFix"/>
21
21
  <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"/>
22
22
  <feOffset dx="1"/>
@@ -45,11 +45,11 @@
45
45
  <text x="754" y="-19" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">رده‌بندی</text>
46
46
  <text x="677" y="-33" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">نمره خام</text>
47
47
  <text x="677" y="-19" font-size="12" font-weight="500" dy=".3em" fill="#64748B" text-anchor="middle">از 60</text>
48
- <line x1="277.5" y1="-8.5" x2="277.5" y2="326.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
49
- <line x1="397.5" y1="-8.5" x2="397.5" y2="326.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
50
- <line x1="517.5" y1="-8.5" x2="517.5" y2="326.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
51
- <line x1="637.5" y1="-8.5" x2="637.5" y2="326.5" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
52
- <rect x="709" y="-48" width="1" height="376" fill="#F1F5F9"/>
48
+ <line x1="277.5" y1="-8.5" x2="277.5" y2="320" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
49
+ <line x1="397.5" y1="-8.5" x2="397.5" y2="320" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
50
+ <line x1="517.5" y1="-8.5" x2="517.5" y2="320" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
51
+ <line x1="637.5" y1="-8.5" x2="637.5" y2="320" stroke="#E2E8F0" stroke-linecap="round" stroke-dasharray="5.5 5.5"/>
52
+ <rect x="709" y="-48" width="1" height="368" fill="#F1F5F9"/>
53
53
 
54
54
  </g>
55
55
  <g>
@@ -71,7 +71,7 @@
71
71
  {{/each}}
72
72
  </g>
73
73
  <g opacity="0.5" filter="url(#split)" transform="translate(154.5, -10.5)">
74
- <line x1="2.5" y1="3.5" x2="2.5" y2="338.5" stroke="white" stroke-linecap="round"/>
74
+ <line x1="2.5" y1="3.5" x2="2.5" y2="330.5" stroke="white" stroke-linecap="round"/>
75
75
  </g>
76
76
  </g>
77
77
  </g>
@@ -0,0 +1,38 @@
1
+ {{#> layout}}
2
+
3
+ <defs>
4
+ {{! Fill gradient (coords local to the gauge centre): light indigo at the
5
+ left base → deep indigo toward the top-right, matching the Figma export. }}
6
+ <linearGradient id="gaugeGrad" x1="-125" y1="0" x2="84.83" y2="-91.81" gradientUnits="userSpaceOnUse">
7
+ <stop stop-color="#818CF8"/>
8
+ <stop offset="1" stop-color="#4338CA"/>
9
+ </linearGradient>
10
+ </defs>
11
+
12
+ <g transform="translate({{spec.profile.padding.x}}, {{spec.profile.padding.y}})">
13
+ <g transform="translate(125, 167)">
14
+
15
+ {{! ===================== Semicircle gauge ===================== }}
16
+ {{! Track: full 0–100 % ring (left base → over the top → right base) }}
17
+ {{gauge 125 87.5 (object tl=6 tr=6 bl=6 br=6) (object start=(toRad 180) end=(toRad 0)) false fill="#F1F5F9"}}
18
+
19
+ {{! Fill: 0 % at the left base, sweeping clockwise to the score.
20
+ Left base rounded (tl/bl); the leading edge is a flat radial line (tr/br=0). }}
21
+ {{#if total.raw}}{{gauge 125 87.5 (object tl=6 tr=0 bl=6 br=0) (object start=(toRad 180) end=total.zeta) false fill="url(#gaugeGrad)"}}{{/if}}
22
+
23
+ {{! ===================== Labels ===================== }}
24
+ {{! Gauge title }}
25
+ <text x="0" y="-147" text-anchor="middle" font-size="18" font-weight="500" fill="#4338CA">خودشناسی انسجامی</text>
26
+
27
+ {{! Centre: big percentage (indigo) + raw fraction (gray) }}
28
+ <text x="0" y="-27" text-anchor="middle" font-size="28" font-weight="600" fill="#4F46E5" direction="ltr">٪ {{total.pct}}</text>
29
+ <text x="0" y="-1" text-anchor="middle" font-size="18" font-weight="500" fill="#64748B">{{total.raw}} از {{total.max}}</text>
30
+
31
+ {{! Base end labels: 0 % (left base) and 100 % (right base) }}
32
+ <text x="-107" y="18" text-anchor="middle" font-size="14" font-weight="500" fill="#64748B">0</text>
33
+ <text x="106" y="18" text-anchor="middle" font-size="14" font-weight="500" fill="#64748B" direction="ltr">٪ 100</text>
34
+
35
+ </g>
36
+ </g>
37
+
38
+ {{/layout}}
@@ -0,0 +1,14 @@
1
+ {{#> layout}}
2
+ {{> NEO_main
3
+ padding=spec.profile.padding.[0]
4
+ frameX=32
5
+ barX=111
6
+ rawX=627.5
7
+ rawCenter=645
8
+ rawMax=192
9
+ levelX=707
10
+ showLevels=true
11
+ tAxis=false
12
+ alertX=0
13
+ }}
14
+ {{/layout}}
@@ -0,0 +1,15 @@
1
+ {{#> layout}}
2
+ {{> NEO_long_facets
3
+ padding=spec.profile.padding.[1]
4
+ cardY=43
5
+ trackW=300
6
+ rawX=671.5
7
+ rawCenter=689
8
+ levelX=756
9
+ domainChipX=68
10
+ domainChipW=44
11
+ gridTop=23.5
12
+ gridBottom=658.5
13
+ tAxis=false
14
+ }}
15
+ {{/layout}}
@@ -0,0 +1,15 @@
1
+ {{#> layout}}
2
+ {{> NEO_long_facets
3
+ padding=spec.profile.padding.[2]
4
+ cardY=43
5
+ trackW=300
6
+ rawX=671.5
7
+ rawCenter=689
8
+ levelX=756
9
+ domainChipX=68
10
+ domainChipW=44
11
+ gridTop=23.5
12
+ gridBottom=454.5
13
+ tAxis=false
14
+ }}
15
+ {{/layout}}
@@ -1,30 +1,15 @@
1
1
  {{#> layout}}
2
- <defs>
3
- {{#each factors as | item index |}}
4
- <linearGradient id="bar-{{item.label.eng}}" x1="0%" y1="0%" x2="100%" y2="0%">
5
- <stop offset="0%" style="stop-color:{{item.label.startColor}};stop-opacity:1" />
6
- <stop offset="100%" style="stop-color:{{item.label.endColor}};stop-opacity:1" />
7
- </linearGradient>
8
- {{/each}}
9
- </defs>
10
- <g transform="translate({{spec.profile.padding.x}}, {{spec.profile.padding.y}})">
11
- {{#each factors as | item index |}}
12
- <g transform="translate(0, {{math index '*' 133}})">
13
- <rect width="866" height="117" rx="12" fill="none" stroke="#E5E7EB" />
14
- <text y="69" x="108" dy=".95em" font-size="13" font-weight="500" fill="#4B5563">{{item.label.fr}}</text>
15
- <text y="69" x="118" dy=".95em" text-anchor="end" font-size="13" font-weight="500" fill="#4B5563">-</text>
16
- <text y="69" x="139" dy=".95em" text-anchor="middle" font-size="13" font-weight="500" fill="#4B5563">{{item.label.eng}}</text>
17
- {{bar 672 16 (object tr=2 br=2 bl=0 tl=0) (toRad 0) fill=item.label.bgColor transform="translate(155,69)"}}
18
- {{#each ../steps as | step stepIndex |}}
19
- <line x1="{{math 155 '+' (math 14 '*' (indexOf item.label.steps stepIndex))}}" y1="40.5" x2="{{math 155 '+' (math 14 '*' (indexOf item.label.steps stepIndex))}}" y2="92.5" stroke="#E5E7EB" stroke-linecap="round" stroke-dasharray="6 6"/>
20
- <text y="44" x="{{math 155 '+' (indexOf item.label.stepTitle stepIndex)}}" dy=".95em" text-anchor="middle" font-size="12" font-weight="{{ternary (boolean item.raw '===' stepIndex) 500 400}}" fill="{{ternary (boolean item.raw '===' stepIndex) item.label.textColor "#9CA3AF"}}">{{step}}</text>
21
- <text y="25" x="{{math 155 '+' (math 14 '*' (indexOf item.label.steps stepIndex))}}" dy=".95em" text-anchor="middle" font-size="12" font-weight="400" fill="#9CA3AF">{{indexOf item.label.steps stepIndex}}</text>
22
- {{/each}}
23
- {{bar (math item.mark '*' 14) 16 (object tr=2 br=2 bl=0 tl=0) (toRad 0) fill=item.label.fill transform="translate(155,69)"}}
24
- <text y="71" x="{{ternary (boolean item.mark '<=' 5) (math 161 '+' (math 14 '*' item.mark)) (math 149 '+' (math 14 '*' item.mark))}}" dy=".75em" text-anchor="{{ternary (boolean item.mark '<=' 5) 'end' 'start'}}" font-size="16" font-weight="500" fill="{{ternary (boolean item.mark '<=' 5) item.label.textColor '#FFFFFF'}}">{{item.mark}}</text>
25
-
26
- </g>
27
- {{/each}}
28
-
29
- </g>
30
- {{/layout}}
2
+ {{> NEO_main
3
+ padding=spec.profile.padding
4
+ frameX=32
5
+ barX=111
6
+ rawX=627.5
7
+ rawCenter=645
8
+ rawMax=48
9
+ levelX=707
10
+ showLevels=true
11
+ tAxis=false
12
+ alertX=0
13
+ compactAlert=true
14
+ }}
15
+ {{/layout}}
@@ -0,0 +1,13 @@
1
+ {{#> layout}}
2
+ {{> NEO_main
3
+ padding=spec.profile.padding.[0]
4
+ frameX=62
5
+ barX=123
6
+ rawX=639.5
7
+ rawCenter=657
8
+ rawMax=192
9
+ showLevels=false
10
+ tAxis=true
11
+ alertX=0
12
+ }}
13
+ {{/layout}}
@@ -0,0 +1,14 @@
1
+ {{#> layout}}
2
+ {{> NEO_long_facets
3
+ padding=spec.profile.padding.[1]
4
+ cardY=49
5
+ trackW=380
6
+ rawX=759.5
7
+ rawCenter=777
8
+ domainChipX=70
9
+ domainChipW=40
10
+ gridTop=29.5
11
+ gridBottom=664.5
12
+ tAxis=true
13
+ }}
14
+ {{/layout}}
@@ -0,0 +1,14 @@
1
+ {{#> layout}}
2
+ {{> NEO_long_facets
3
+ padding=spec.profile.padding.[2]
4
+ cardY=49
5
+ trackW=380
6
+ rawX=759.5
7
+ rawCenter=777
8
+ domainChipX=70
9
+ domainChipW=40
10
+ gridTop=29.5
11
+ gridBottom=460.5
12
+ tAxis=true
13
+ }}
14
+ {{/layout}}
@@ -0,0 +1,13 @@
1
+ {{#> layout}}
2
+ {{> NEO_main
3
+ padding=spec.profile.padding.[0]
4
+ frameX=62
5
+ barX=123
6
+ rawX=639.5
7
+ rawCenter=657
8
+ rawMax=48
9
+ showLevels=false
10
+ tAxis=false
11
+ alertX=1
12
+ }}
13
+ {{/layout}}
@@ -0,0 +1,3 @@
1
+ {{#> layout}}
2
+ {{> NEO_short_facets padding=spec.profile.padding.[1]}}
3
+ {{/layout}}