@baravak/risloo-profile-cli 3.3.0 → 3.4.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@baravak/risloo-profile-cli",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "description": "**Risloo Profile CLI** is a library for creating profiles, reports and sheets for *psychological* samples.",
5
5
  "main": "bin/risloo.js",
6
6
  "publishConfig": {
@@ -0,0 +1 @@
1
+ {"id":"$X1H6UGU1X","scale":{"id":"$FMPS-93","title":"مقیاس کمالگرایی چند بعدی فراست"},"version":"1","edition":"","edition_version":null,"client":{"id":"GH96XXXX","name":"مراجع","user_id":"IR96XXX"},"room":{"id":"RS96XXXX","manager":{"id":"GH966XXXX","name":"درمانگر","user_id":"IR96XXXX"},"center":{"id":"RS966XXXX","acceptation":null,"status":"active","type":"counseling_center","detail":{"title":"مرکز مشاوره"}},"acceptation":null,"status":"active","type":"room"},"case":null,"code":null,"created_at":1674877621,"started_at":1674877679,"scored_at":1677946721,"closed_at":1674879321,"total_amount":0,"prepayment":false,"purchased":true,"amount":null,"billing":null,"description":"## دستور اجرای آزمون\n\nلطفا هر یک از جملات زیر را به دقت بخوانید و مشخص کنید که هر جمله تا چه اندازه در مورد شما صدق می‌کند و یکی از پنج گزینه را انتخاب کنید","psychologist_description":null,"items":[{"type":"text","text":"والدینم معیارهای بالایی را برای من قرار داده‌اند.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"3"},{"type":"text","text":"نظم و سازماندهی برای من بسیار مهم است.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"وقتی بچه بودم اگر کارها را کامل انجام نمی‌دادم تنبیه می شدم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"1"},{"type":"text","text":"اگر بالاترین استانداردها را برای خودم قرار ندهم یک فرد سطح پایین خواهم بود.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"والدینم هیچ وقت سعی نکردند اشتباهاتم را درک کنند.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"2"},{"type":"text","text":"واقعا برایم مهم است که در هر کاری که انجام می‌دهم کاملا شایسته باشم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"من فرد مرتبی هستم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"سعی می‌کنم که فرد با نظم و برنامه‌ای باشم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"اگر در کار یا تحصیل موفق نشوم فرد شگست خورده‌ای هستم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"اگر اشتباه کنم باید ناراحت شوم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"والدینم از من می‌خواستند که در همه چیز بهترین باشم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"2"},{"type":"text","text":"اهداف من از بیشتر مردم بالاتر است.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"اگر فردی در کارش بهتر از من باشد ، احساس می‌کنم در آن کار شکست خورده‌ام.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"3"},{"type":"text","text":"اگر تاحدودی موفق نشوم انگار که کاملا شکست خورده‌ام.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"2"},{"type":"text","text":"فقط عملکردهای عالی در خانواده من خوب ارزیابی می شوند.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"2"},{"type":"text","text":"من تمرکز خوبی برای رسیدن به هدفم دارم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"3"},{"type":"text","text":"حتی وقتی که چیزی را خیلی به دقت انجام می‌دهم اغلب حس می‌کنم به اندازه کافی خوب نیست.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"از اینکه در هر چیزی بهترین نباشم، بیزارم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"3"},{"type":"text","text":"اهداف من بسیار بالا هستند.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"والدینم از من توقع داشتند که عالی باشند.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"2"},{"type":"text","text":"اگر اشتباه کنم ممکن است سایرین مرا دست کم بگیرند.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"هیچ وقت احساس نکردم که بتوانم انتظارات والدینم را برآورده کنم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"2"},{"type":"text","text":"اگر در حد دیگران کارها را انجام ندهم، فرد بی‌ارزشی هستم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"2"},{"type":"text","text":"به نظر می‌رسد که در مقایسه با من، دیگران استانداردهای پایین‌تری دارند.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"اگر همیشه کارها را خوب انجام ندهم، دیگران به من احترام نمی‌گذارند.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"3"},{"type":"text","text":"انتظارات والدینم برای آینده‌ام بیشتر از انتظارات خودم بود.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"2"},{"type":"text","text":"تلاش می‌کنم فرد منظمی باشم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"معمولا در مورد چیزهای ساده‌ای که هر روز انجام می‌دهم تردید دارم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"5"},{"type":"text","text":"مرتب بودن خیلی برای من مهم است.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"در مقایسه با دیگران انتظار عملکرد بالاتری را از خودم دارم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"من فرد با برنامه‌ای هستم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"3"},{"type":"text","text":"من همیشه از کارها عقب هستم چون آنها را تکرار می‌کنم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"3"},{"type":"text","text":"برای انجام دادن کارهایم زمان زیادی صرف می‌کنم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"4"},{"type":"text","text":"هر چقدر کمتر اشتباه کنم دیگران بیشتر مرا دوست دارند.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"2"},{"type":"text","text":"هیچ وقت احساس نکردم که بتوانم استانداردهای والدینم را برآورده کنم.","answer":{"type":"optional","options":["کاملا مخالفم","مخالفم","نظری‌ ندارم","موافقم","کاملا موافقم"]},"user_answered":"2"}],"prerequisites":[{"type":"text","label":"gender","text":"جنسیت","answer":{"type":"select","options":["زن","مرد"]},"alias":"gender","force":true,"user_answered":"1"},{"type":"text","label":"age","text":"سن","answer":{"type":"number"},"alias":"age","force":true,"user_answered":"44"},{"type":"text","label":"education","text":"تحصیلات","answer":{"type":"select","options":["ابتدایی اول","ابتدایی دوم","متوسطه اول","متوسطه دوم","دیپلم","کارشناسی","کارشناسی ارشد","پزشکی عمومی","متخصص","دکتری تخصصی","حوزوی مقدمات","حوزوی سطح۱","حوزوی سطح۲","حوزوی سطح۳","حوزوی سطح۴"]},"alias":"education","force":true,"user_answered":"7"},{"type":"text","label":"marital_status","text":"وضعیت تأهل","answer":{"type":"select","options":["مجرد","متأهل"]},"alias":"marital_status","force":true,"user_answered":"1"}],"cornometer":27,"score":{"raw":88,"concern_over_mistakes":27,"parental_criticism":7,"parental_expectations":11,"doubt_about_actions":16,"organization":23,"personal_standards":27,"positive_perfectionism":50,"negative_perfectionism":61},"score_current_version":"1.0.0","score_last_version":"1.0.0","profiles":[{"id":"F963HMW","file_name":"X1H6UGU1X.json","slug":"storage/profiles/X1H6UGU1XaA1rAiVD2vmSaeUSYvFwMK5PCPSxQvloUmvz57WFxC9BPi0W7tNiWdkCThEdMMzanR6tIVcSltjCq5HbZmMiiDW7Bok2mbFmAzs9IQB3NEBuvMwgakwahXfe/X1H6UGU1X.json","mode":"profile_json","url":"https://api.risloo.local/storage/profiles/X1H6UGU1XaA1rAiVD2vmSaeUSYvFwMK5PCPSxQvloUmvz57WFxC9BPi0W7tNiWdkCThEdMMzanR6tIVcSltjCq5HbZmMiiDW7Bok2mbFmAzs9IQB3NEBuvMwgakwahXfe/X1H6UGU1X.json","type":"data","mime":"application/json","exec":"json"},{"id":"F963HMF","file_name":"X1H6UGU1X.xlsx","slug":"storage/profiles/X1H6UGU1XaA1rAiVD2vmSaeUSYvFwMK5PCPSxQvloUmvz57WFxC9BPi0W7tNiWdkCThEdMMzanR6tIVcSltjCq5HbZmMiiDW7Bok2mbFmAzs9IQB3NEBuvMwgakwahXfe/X1H6UGU1X.xlsx","mode":"profile_xlsx","url":"https://api.risloo.local/storage/profiles/X1H6UGU1XaA1rAiVD2vmSaeUSYvFwMK5PCPSxQvloUmvz57WFxC9BPi0W7tNiWdkCThEdMMzanR6tIVcSltjCq5HbZmMiiDW7Bok2mbFmAzs9IQB3NEBuvMwgakwahXfe/X1H6UGU1X.xlsx","type":"document","mime":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","exec":"xlsx"}]}
@@ -0,0 +1,115 @@
1
+ const { Profile, FS, Mappings } = require("../Profile");
2
+
3
+ class FMPS93 extends Profile {
4
+ // Number of pages
5
+ static pages = 1;
6
+
7
+ // Labels of the sample
8
+ labels = {
9
+ L1: { eng: "raw", fr: "نمره کل", max: 145},
10
+
11
+ L2: { eng: "concern_over_mistakes", fr: "نگرانی درباره اشتباهات", fill: "#DB2777", bg:"#FDF2F8", max: 45},
12
+ L3: { eng: "parental_criticism", fr: "انتقادگری والدین", fill: "#DB2777", bg:"#FDF2F8", max: 20},
13
+ L4: { eng: "parental_expectations", fr: "انتظارات والدینی", fill: "#DB2777", bg:"#FDF2F8", max: 25},
14
+ L5: { eng: "doubt_about_actions", fr: "تردید درباره کارها", fill: "#DB2777", bg:"#FDF2F8", max: 20},
15
+ L6: { eng: "organization", fr: "نظم و سازماندهی", fill: "#16A34A", bg: "#F0FDF4", max: 30},
16
+ L7: { eng: "personal_standards", fr: "معیارهای شخصی", fill: "#16A34A", bg: "#F0FDF4", max: 35},
17
+
18
+ L8: { eng: "positive_perfectionism", fr: "کمال‌گرایی مثبت" , desc : "نظم و سازماندهی، معیارهای شخصی"},
19
+ L9: { eng: "negative_perfectionism", fr: "کمال‌گرایی منفی" , desc : "نگرانی درباره اشتباهات، انتقادگری والدینی،\nانتظارات والدینی، تردید درباره کارها"},
20
+ };
21
+
22
+ profileSpec = {
23
+ /* "sample" determines some important info about the sample and profile */
24
+ /* Default prerequisites: 1. gender, 2. age, 3. education */
25
+ /* "prerequisites" is synonym to "fields" in our program */
26
+ sample: {
27
+ name: "پرسشنامه هوش هیجانی بار-آن" /* Name of the sample */,
28
+ multiProfile: false /* Whether the sample has multiple profiles or not */,
29
+ questions: false /* Determines whether to get questions from inital dataset or not */,
30
+ defaultFields: true /* Determines whether to have default prerequisites in the profile or not */,
31
+ fields: [] /* In case you want to get some additional fields and show in the profile */,
32
+ },
33
+ /* "profile" determines the dimensions of the drawn profile (to be used in svg tag viewbox) */
34
+ /* calculating its dimensions carefully is of great importance */
35
+ profile: {
36
+ get dimensions() {
37
+ return {
38
+ width: 761 + 2 * this.padding.x,
39
+ height: 556 + 2 * this.padding.y,
40
+ };
41
+ },
42
+ padding: {
43
+ x: 79,
44
+ y: 71,
45
+ },
46
+ },
47
+ gaugeItems: {
48
+ offsetX: 40.5 /* Horizontal offset between two top items */,
49
+ get distanceX() {
50
+ return this.offsetX + this.circle.R * 2;
51
+ } /* Horizontal distance between two top items */,
52
+ maxValues: {
53
+ [this.labels.L8.eng]: 65,
54
+ [this.labels.L9.eng]: 110,
55
+ } /* Maximum value of items */,
56
+ fills: {
57
+ [this.labels.L8.eng]: "#16A34A",
58
+ [this.labels.L9.eng]: "#DB2777",
59
+ } /* Color used in items */,
60
+ circle: {
61
+ R: 60 /* Radius of the outer circle of the items element */,
62
+ r: 36 /* Radius of the inner circle of the items element */,
63
+ brs: {
64
+ tl: 4 /* Top left border radius */,
65
+ bl: 4 /* Bottom left border radius */,
66
+ tr: 4 /* Top right border radius */,
67
+ br: 4 /* Bottom right border radius */,
68
+ } /* Border radiuses at each end of the gauge of the items element */,
69
+ angles: {
70
+ start: FS.toRadians(-90),
71
+ end: FS.toRadians(180),
72
+ } /* Angles of each end of the items element */,
73
+ direction: false /* Clockwise direction for the items gauge element */,
74
+ get totalAngle() {
75
+ return this.direction
76
+ ? 2 * Math.PI - (this.angles.end - this.angles.start)
77
+ : this.angles.end - this.angles.start;
78
+ },
79
+ },
80
+ },
81
+ /* "labels" part which has to be provided for each profile */
82
+ labels: Object.values(this.labels),
83
+ };
84
+
85
+ constructor(dataset, options, config = {}) {
86
+ super();
87
+ this._init(dataset, options, config);
88
+ }
89
+
90
+ _calcContext() {
91
+ const {
92
+ spec: { parameters: spec },
93
+ dataset,
94
+ } = this;
95
+
96
+ // Deconstructing the Spec of the Profile
97
+ const { raw: rawSpec, gaugeItems: gaugeItemsSpec } = spec;
98
+
99
+
100
+ let gaugeItems = dataset.score.slice(7,9).map((data) => ({
101
+ label: data.label,
102
+ mark: data.mark,
103
+ zeta:
104
+ (data.mark / gaugeItemsSpec.maxValues[data.label.eng]) * gaugeItemsSpec.circle.totalAngle +
105
+ gaugeItemsSpec.circle.angles.start,
106
+ fill: gaugeItemsSpec.fills[data.label.eng],
107
+ }));
108
+
109
+ const raw = dataset.score[0]
110
+ const items = dataset.score.slice(1, 7)
111
+ return [{ raw, items, gaugeItems }];
112
+ }
113
+ }
114
+
115
+ module.exports = FMPS93;
@@ -0,0 +1,66 @@
1
+ {{#> layout}}
2
+
3
+ <defs>
4
+ <linearGradient id="horizontal-shadow">
5
+ <stop offset="0%" stop-color="black" />
6
+ <stop offset="100%" stop-color="transparent" />
7
+ </linearGradient>
8
+ {{#with spec.gaugeItems.circle}}
9
+ <clipPath id="items-circle-roll">
10
+ {{gauge R r brs (object start=angles.start end=angles.end) false}}
11
+ </clipPath>
12
+ {{/with}}
13
+ </defs>
14
+
15
+ <g transform="translate({{spec.profile.padding.x}}, {{spec.profile.padding.y}})">
16
+ <g transform="translate(0.5, 3)">
17
+ {{!-- <rect width="760" height="310" fill="red" opacity="0.1" /> --}}
18
+ {{#each items}}
19
+ <g transform="translate(0, {{math 12 '+' (math @key '*' 52)}})">
20
+ {{bar (math 8 '*' label.max) 28 (object tl=0 tr=14 bl=0 br=14) (toRad 0) fill=label.bg transform="translate(139,0)"}}
21
+ {{bar (math 8 '*' mark) 28 (object tl=0 tr=14 bl=0 br=14) (toRad 0) fill=label.fill transform="translate(139,0)"}}
22
+ <text fill="#52525B" font-size="14px" font-weight="400" transform="translate(123,0)" text-anchor="start" y="18">{{label.fr}}</text>
23
+ <text transform="translate({{math 147 '+' (math 8 '*' label.max)}},0)" text-anchor="start" y="24" direction="ltr">
24
+ <tspan fill="{{label.fill}}" font-size="28px" font-weight="500" >{{mark}}</tspan>
25
+ <tspan fill="#71717A" font-size="20px" font-weight="400" > / {{label.max}}</tspan>
26
+ </text>
27
+ </g>
28
+ {{/each}}
29
+ <rect x="138" y="0" width="1" height="310" rx="1" fill="#FFFFFF" style="filter: drop-shadow(1px 0 2px rgba(0,0,0, .5));"/>
30
+ <g transform="translate(679, 0)">
31
+ <text x="82" y="24" fill="#A1A1AA" font-size="14px" font-weight="400" text-anchor="start">145</text>
32
+ <line x1="43" x2="59" y1="20" y2="20" stroke="#E4E4E7" stroke-dasharray="4 4" />
33
+ {{bar 40 290 (object tr=20 tl=20 br=0 bl=0) (toRad 0) transform="translate(0, 20)" fill="#F4F4F5"}}
34
+ {{bar 40 (math 2 '*' raw.mark) (object tr=20 tl=20 br=0 bl=0) (toRad 0) transform=(concat "translate(0," (concat (math 20 '+' (math 290 '-' (math 2 '*' raw.mark))) ")")) fill="#52525B"}}
35
+ <text x="20" y="{{math 50 '+' (math 290 '-' (math 2 '*' raw.mark))}}" fill="#FFFFFF" font-size="20px" font-weight="500" text-anchor="middle">{{raw.mark}}</text>
36
+
37
+ <text x="60" y="261" fill="#A1A1AA" font-size="14px" font-weight="400" text-anchor="end">29</text>
38
+ <line x1="43" x2="59" y1="257" y2="257" stroke="#E4E4E7" stroke-dasharray="4 4" />
39
+
40
+ <rect x="-2" y="310" width="44" height="1" rx="1" fill="#FFFFFF" style="filter: drop-shadow(1px 0 2px rgba(0,0,0, .5));"/>
41
+ <text transform="translate(-14, 247) rotate(270, 8, 8)" fill="#71717A" font-size="16px" font-weight="500" text-anchor="start">نمره کل</text>
42
+ </g>
43
+ </g>
44
+ <g transform="translate(123.5, 369)">
45
+ {{#each gaugeItems as |item index|}}
46
+ <g transform="translate({{math 100 '+' (math index '*' 246)}}, 60)">
47
+ {{#with @root.spec.gaugeItems.circle}}
48
+ {{gauge R r (object tl=0 tr=0 bl=0 br=0) (object start=angles.start end=angles.end) direction clip-path="url(#items-circle-roll)" fill="#F4F4F5"}}
49
+ {{gauge R r (object tl=0 tr=0 bl=0 br=0) (object start=angles.start end=item.zeta) direction clip-path="url(#items-circle-roll)" fill=item.fill fill-opacity=item.opacity}}
50
+ {{/with}}
51
+ <text x="0" y="0" text-anchor="middle" font-size="28" font-weight="600" fill="{{item.fill}}" dy="5">{{item.mark}}</text>
52
+ <text x="-8" y="-40" font-size="14" font-weight="500" fill="#71717A">0</text>
53
+ <text x="-42" y="-8" font-size="14" font-weight="500" fill="#71717A" text-anchor="middle">{{lookup @root.spec.gaugeItems.maxValues item.label.eng}}</text>
54
+ <g transform="translate(0, 80)">
55
+ <text x="0" y="0" font-size="14" font-weight="500" fill="{{item.fill}}" text-anchor="middle">{{item.label.fr}}</text>
56
+ {{#each (wrapOnNewline item.label.desc) as | line index |}}
57
+ <text x="0" y="{{math 15 '+' (math index '*' 15)}}" font-size="12" font-weight="400" fill="#A1A1AA" text-anchor="middle" dy="5">{{line}}</text>
58
+ {{/each}}
59
+ </g>
60
+ </g>
61
+ {{/each}}
62
+ </g>
63
+
64
+ </g>
65
+
66
+ {{/layout}}