@@ -39,46 +39,53 @@ const getLongestLang = (arr) =>
3939 * Creates a node to display usage of a programming language in percentage
4040 * using text and a horizontal progress bar.
4141 *
42- *@param {object[] } props Function properties.
42+ *@param {object } props Function properties.
4343 *@param {number } props.width The card width
4444 *@param {string } props.name Name of the programming language.
4545 *@param {string } props.color Color of the programming language.
4646 *@param {string } props.progress Usage of the programming language in percentage.
47+ *@param {number } props.index Index of the programming language.
4748 *@returns {string } Programming language SVG node.
4849 */
49- const createProgressTextNode = ( { width, color, name, progress} ) => {
50+ const createProgressTextNode = ( { width, color, name, progress, index} ) => {
51+ const staggerDelay = ( index + 3 ) * 150 ;
5052const paddingRight = 95 ;
5153const progressTextX = width - paddingRight + 10 ;
5254const progressWidth = width - paddingRight ;
5355
5456return `
55- <text data-testid="lang-name" x="2" y="15" class="lang-name">${ name } </text>
56- <text x="${ progressTextX } " y="34" class="lang-name">${ progress } %</text>
57- ${ createProgressNode ( {
58- x :0 ,
59- y :25 ,
60- color,
61- width :progressWidth ,
62- progress,
63- progressBarBackgroundColor :"#ddd" ,
64- } ) }
57+ <g class="stagger" style="animation-delay:${ staggerDelay } ms">
58+ <text data-testid="lang-name" x="2" y="15" class="lang-name">${ name } </text>
59+ <text x="${ progressTextX } " y="34" class="lang-name">${ progress } %</text>
60+ ${ createProgressNode ( {
61+ x :0 ,
62+ y :25 ,
63+ color,
64+ width :progressWidth ,
65+ progress,
66+ progressBarBackgroundColor :"#ddd" ,
67+ delay :staggerDelay + 300 ,
68+ } ) }
69+ </g>
6570 ` ;
6671} ;
6772
6873/**
6974 * Creates a text only node to display usage of a programming language in percentage.
7075 *
71- *@param {object[] } props Function properties.
76+ *@param {object } props Function properties.
7277 *@param {Lang } props.lang Programming language object.
7378 *@param {number } props.totalSize Total size of all languages.
79+ *@param {number } props.index Index of the programming language.
7480 *@returns {string } Compact layout programming language SVG node.
7581 */
76- const createCompactLangNode = ( { lang, totalSize} ) => {
82+ const createCompactLangNode = ( { lang, totalSize, index } ) => {
7783const percentage = ( ( lang . size / totalSize ) * 100 ) . toFixed ( 2 ) ;
84+ const staggerDelay = ( index + 3 ) * 150 ;
7885const color = lang . color || "#858585" ;
7986
8087return `
81- <g>
88+ <g >
8289 <circle cx="5" cy="6" r="5" fill="${ color } " />
8390 <text data-testid="lang-name" x="15" y="10" class='lang-name'>
8491${ lang . name } ${ percentage } %
@@ -104,7 +111,6 @@ const createLanguageTextNode = ({ langs, totalSize }) => {
104111createCompactLangNode ( {
105112 lang,
106113 totalSize,
107- //@ts -ignore
108114 index,
109115} ) ,
110116) ;
@@ -134,12 +140,13 @@ const createLanguageTextNode = ({ langs, totalSize }) => {
134140 */
135141const renderNormalLayout = ( langs , width , totalLanguageSize ) => {
136142return flexLayout ( {
137- items :langs . map ( ( lang ) => {
143+ items :langs . map ( ( lang , index ) => {
138144return createProgressTextNode ( {
139- width : width ,
145+ width,
140146name :lang . name ,
141147color :lang . color || DEFAULT_LANG_COLOR ,
142148progress :( ( lang . size / totalLanguageSize ) * 100 ) . toFixed ( 2 ) ,
149+ index,
143150} ) ;
144151} ) ,
145152gap :40 ,
@@ -187,7 +194,7 @@ const renderCompactLayout = (langs, width, totalLanguageSize) => {
187194
188195return `
189196 <mask id="rect-mask">
190- <rect x="0" y="0" width="${ offsetWidth } " height="8" fill="white" rx="5" />
197+ <rect x="0" y="0" width="${ offsetWidth } " height="8" fill="white" rx="5"/>
191198 </mask>
192199${ compactProgressBar }
193200
@@ -276,6 +283,7 @@ const renderTopLanguages = (topLangs, options = {}) => {
276283 langs_count= DEFAULT_LANGS_COUNT ,
277284 border_radius,
278285 border_color,
286+ disable_animations,
279287} = options ;
280288
281289const i18n = new I18n ( {
@@ -324,11 +332,43 @@ const renderTopLanguages = (topLangs, options = {}) => {
324332 colors,
325333} ) ;
326334
327- card . disableAnimations ( ) ;
335+ if ( disable_animations ) card . disableAnimations ( ) ;
336+
328337card . setHideBorder ( hide_border ) ;
329338card . setHideTitle ( hide_title ) ;
330339card . setCSS (
331- `.lang-name { font: 400 11px 'Segoe UI', Ubuntu, Sans-Serif; fill:${ colors . textColor } }` ,
340+ `
341+ @keyframes slideInAnimation {
342+ from {
343+ width: 0;
344+ }
345+ to {
346+ width: calc(100%-100px);
347+ }
348+ }
349+ @keyframes growWidthAnimation {
350+ from {
351+ width: 0;
352+ }
353+ to {
354+ width: 100%;
355+ }
356+ }
357+ .lang-name {
358+ font: 400 11px "Segoe UI", Ubuntu, Sans-Serif;
359+ fill:${ colors . textColor } ;
360+ }
361+ .stagger {
362+ opacity: 0;
363+ animation: fadeInAnimation 0.3s ease-in-out forwards;
364+ }
365+ #rect-mask rect{
366+ animation: slideInAnimation 1s ease-in-out forwards;
367+ }
368+ .lang-progress{
369+ animation: growWidthAnimation 0.6s ease-in-out forwards;
370+ }
371+ ` ,
332372) ;
333373
334374return card . render ( `