@ebrains/react 2.4.1 → 3.1.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/color-primary-palette_6.entry.esm.js +106 -106
- package/components-section.entry.esm.js +1 -1
- package/correct-use-of-colors.entry.esm.js +33 -33
- package/docs-palettes.entry.esm.js +1 -1
- package/docs-tokens.entry.esm.js +1 -1
- package/eds-accordion_53.entry.esm.js +1966 -0
- package/eds-app-root.entry.esm.js +4 -4
- package/eds-cookies-preference.entry.esm.js +3 -3
- package/eds-feedback.entry.esm.js +5 -5
- package/eds-frame.entry.esm.js +7 -7
- package/eds-gauge.entry.esm.js +8 -9
- package/eds-gitlab-contributors.entry.esm.js +287 -0
- package/eds-icon-bluesky.entry.esm.js +1 -1
- package/eds-icon-eu.entry.esm.js +2 -2
- package/eds-icon-facebook.entry.esm.js +1 -1
- package/eds-icon-gitlab.entry.esm.js +1 -1
- package/eds-icon-linkedin.entry.esm.js +1 -1
- package/eds-icon-mastodon.entry.esm.js +1 -1
- package/eds-icon-twitter.entry.esm.js +1 -1
- package/eds-icon-youtube.entry.esm.js +1 -1
- package/eds-input-search.entry.esm.js +96 -0
- package/eds-modal.entry.esm.js +88 -31
- package/eds-pie.entry.esm.js +38 -4
- package/eds-section-core_2.entry.esm.js +5 -5
- package/eds-splash-screen.entry.esm.js +4 -12
- package/eds-timeline.entry.esm.js +8 -14
- package/eds-toast-manager.entry.esm.js +1 -1
- package/eds-trl-badge.entry.esm.js +186 -0
- package/eu-8ac3e99c.esm.js +7 -0
- package/incorrect-use-of-colors.entry.esm.js +8 -8
- package/index.esm.js +1 -1
- package/index.esm2.js +22 -142
- package/logo-space.entry.esm.js +138 -17
- package/logo-variations-horizontal_2.entry.esm.js +28 -54
- package/logo-variations-tabs.entry.esm.js +1 -1
- package/logo-wrong-usage.entry.esm.js +33 -33
- package/negative-84eec72e.esm.js +104 -0
- package/package.json +1 -1
- package/positive-cc986d7c.esm.js +65 -0
- package/src/components.d.ts +11 -2
- package/src/generated/components.d.ts +0 -1
- package/svg-repository.entry.esm.js +7 -254
- package/token-list_3.entry.esm.js +79 -51
- package/token-ratios.entry.esm.js +3 -3
- package/token-spacing.entry.esm.js +26 -26
- package/token-typography.entry.esm.js +88 -79
- package/arrow-diagonal-black-8f0494c3.esm.js +0 -3
- package/arrow-right-9322ba8a.esm.js +0 -5
- package/bin-37cad2f0.esm.js +0 -3
- package/bookmark-c200037c.esm.js +0 -16
- package/chevron-down-6144c823.esm.js +0 -12
- package/chevron-left-ca6c66e1.esm.js +0 -11
- package/chevron-right-b88ed2d4.esm.js +0 -5
- package/chevron-up-c66bd477.esm.js +0 -12
- package/clone-dab56639.esm.js +0 -3
- package/close-87fc0d63.esm.js +0 -5
- package/copy-03b72cb6.esm.js +0 -5
- package/download-47746956.esm.js +0 -18
- package/draft-dd5dada2.esm.js +0 -3
- package/edit-3893a517.esm.js +0 -3
- package/eds-accordion_37.entry.esm.js +0 -1201
- package/eds-card-desc_2.entry.esm.js +0 -85
- package/eds-card-generic.entry.esm.js +0 -116
- package/eds-card-project.entry.esm.js +0 -209
- package/eds-card-section.entry.esm.js +0 -56
- package/eds-card-tags.entry.esm.js +0 -27
- package/eds-card-tool.entry.esm.js +0 -105
- package/eds-footer.entry.esm.js +0 -145
- package/eds-fullscreen-menu.entry.esm.js +0 -143
- package/eds-icon-arrow-diagonal.entry.esm.js +0 -21
- package/eds-icon-arrow-right.entry.esm.js +0 -21
- package/eds-icon-bin.entry.esm.js +0 -21
- package/eds-icon-bookmark.entry.esm.js +0 -21
- package/eds-icon-chevron-down.entry.esm.js +0 -21
- package/eds-icon-chevron-left.entry.esm.js +0 -21
- package/eds-icon-chevron-right.entry.esm.js +0 -21
- package/eds-icon-chevron-up.entry.esm.js +0 -21
- package/eds-icon-clone.entry.esm.js +0 -21
- package/eds-icon-close.entry.esm.js +0 -21
- package/eds-icon-copy.entry.esm.js +0 -21
- package/eds-icon-download.entry.esm.js +0 -21
- package/eds-icon-draft.entry.esm.js +0 -21
- package/eds-icon-edit.entry.esm.js +0 -21
- package/eds-icon-external.entry.esm.js +0 -21
- package/eds-icon-loader.entry.esm.js +0 -21
- package/eds-icon-menu.entry.esm.js +0 -21
- package/eds-icon-minus.entry.esm.js +0 -21
- package/eds-icon-more.entry.esm.js +0 -21
- package/eds-icon-paper.entry.esm.js +0 -21
- package/eds-icon-plus.entry.esm.js +0 -21
- package/eds-icon-portal.entry.esm.js +0 -21
- package/eds-icon-private.entry.esm.js +0 -21
- package/eds-icon-public.entry.esm.js +0 -21
- package/eds-icon-search.entry.esm.js +0 -21
- package/eds-icon-star.entry.esm.js +0 -21
- package/eds-icon-start.entry.esm.js +0 -21
- package/eds-icon-success.entry.esm.js +0 -21
- package/eds-icon-thumbs-down.entry.esm.js +0 -21
- package/eds-icon-thumbs-up.entry.esm.js +0 -21
- package/eds-icon-tutorial.entry.esm.js +0 -21
- package/eds-icon-unknown.entry.esm.js +0 -21
- package/eds-icon-updown.entry.esm.js +0 -21
- package/eds-icon-user.entry.esm.js +0 -21
- package/eds-icon-view.entry.esm.js +0 -21
- package/eds-progress-bar.entry.esm.js +0 -52
- package/eds-social-networks.entry.esm.js +0 -73
- package/eds-trl.entry.esm.js +0 -68
- package/eu-9ddde93a.esm.js +0 -30
- package/index-39c58238.esm.js +0 -58
- package/loader-c9628637.esm.js +0 -30
- package/logo-color-7f1fd803.esm.js +0 -115
- package/logo-color-margins-ff8ce71b.esm.js +0 -118
- package/logo-white-no-bg-f382f86f.esm.js +0 -1021
- package/menu-340ea948.esm.js +0 -11
- package/minus-b30a7c71.esm.js +0 -11
- package/more-4449d549.esm.js +0 -13
- package/paper-8e74ea31.esm.js +0 -15
- package/plus-89c07be2.esm.js +0 -12
- package/portal-d6c8ce56.esm.js +0 -18
- package/private-1c25ff8e.esm.js +0 -25
- package/public-d4d8c585.esm.js +0 -16
- package/search-fbcd79c2.esm.js +0 -12
- package/star-0da9b5e9.esm.js +0 -5
- package/start-65126a4f.esm.js +0 -3
- package/success-443809da.esm.js +0 -18
- package/thumbs-down-a18fd049.esm.js +0 -5
- package/thumbs-up-c19a71bc.esm.js +0 -6
- package/tutotial-150ee1fd.esm.js +0 -27
- package/unknown-ed01a24c.esm.js +0 -22
- package/up-and-down-8b69ca97.esm.js +0 -12
- package/user-71ebdc15.esm.js +0 -16
- package/view-e900f2d4.esm.js +0 -3
|
@@ -34,18 +34,18 @@ const EdsAppRoot = class {
|
|
|
34
34
|
}
|
|
35
35
|
render() {
|
|
36
36
|
return h("div", {
|
|
37
|
-
key: '
|
|
37
|
+
key: 'c9192fb7e315fa8fe41c9ee512f4573951865208'
|
|
38
38
|
}, h("eds-splash-screen", {
|
|
39
|
-
key: '
|
|
39
|
+
key: 'e3d413597cc370692c593abd4017d97e1c172219',
|
|
40
40
|
inverse: true,
|
|
41
41
|
initPromise: this.combinedInitPromise
|
|
42
42
|
}), h("eds-login", {
|
|
43
|
-
key: '
|
|
43
|
+
key: '2821e64738053db4809663aa918f98c4df358201',
|
|
44
44
|
"keycloak-url": "http://localhost:8080",
|
|
45
45
|
"keycloak-realm": "nigeor-realm",
|
|
46
46
|
"keycloak-client-id": "stencil-app"
|
|
47
47
|
}), h("main", {
|
|
48
|
-
key: '
|
|
48
|
+
key: '4680b74ec0f74b8060b020f726f6696b41b43a9e'
|
|
49
49
|
}, this.isAuthenticated ? h("h1", null, "Welcome, authenticated user!") : h("h1", null, "Please log in.")));
|
|
50
50
|
}
|
|
51
51
|
};
|
|
@@ -9,7 +9,7 @@ const EdsCookiesPreference = class {
|
|
|
9
9
|
constructor(hostRef) {
|
|
10
10
|
registerInstance(this, hostRef);
|
|
11
11
|
this.buttonText = 'Cookies Preferences';
|
|
12
|
-
this.intent =
|
|
12
|
+
this.intent = 'secondary';
|
|
13
13
|
this.showMatomoNotice = false;
|
|
14
14
|
this.noticeKey = 0;
|
|
15
15
|
}
|
|
@@ -29,9 +29,9 @@ const EdsCookiesPreference = class {
|
|
|
29
29
|
}
|
|
30
30
|
render() {
|
|
31
31
|
return h("div", {
|
|
32
|
-
key: '
|
|
32
|
+
key: '0a1f75fe95820dd8f994193f86b52b684f5fd240'
|
|
33
33
|
}, h("eds-link", {
|
|
34
|
-
key: '
|
|
34
|
+
key: 'd3b5740fa53b30a39296b23cd95da1ad2d8d730d',
|
|
35
35
|
size: "small",
|
|
36
36
|
intent: this.intent,
|
|
37
37
|
label: this.buttonText,
|
|
@@ -61,20 +61,20 @@ const EdsFeedback = class {
|
|
|
61
61
|
const levelNum = this.headingLevel.replace('h', '');
|
|
62
62
|
const headingClass = `f-heading-${levelNum.padStart(2, '0')} my-4`;
|
|
63
63
|
return h("div", {
|
|
64
|
-
key: '
|
|
64
|
+
key: '5eddbd664389530e209698e5e435c853c8f50b9f',
|
|
65
65
|
class: "grid inline"
|
|
66
66
|
}, h(HeadingTag, {
|
|
67
|
-
key: '
|
|
67
|
+
key: '22d1d4a44a116f78bbfa66946d8b7a9f95779524',
|
|
68
68
|
class: headingClass
|
|
69
69
|
}, this.label), h("p", {
|
|
70
|
-
key: '
|
|
70
|
+
key: 'd3e5abefa5d0e1e32281b5088251fb9c304b8d2a',
|
|
71
71
|
class: "f-body-01 text-light"
|
|
72
72
|
}, this.description), h("eds-rating", {
|
|
73
|
-
key: '
|
|
73
|
+
key: '65f1e772ac885d20f46e147aedeb55ab2ec871fe',
|
|
74
74
|
"rating-type": this.type,
|
|
75
75
|
"rating-count": this.count
|
|
76
76
|
}), this.selectedRating > 0 && this.parsedMappings[this.selectedRating - 1] && h("span", {
|
|
77
|
-
key: '
|
|
77
|
+
key: 'f660ceb9889d560ec1687c6f17bdbbe6a89f90ee',
|
|
78
78
|
class: "f-ui-04 text-lighter"
|
|
79
79
|
}, this.parsedMappings[this.selectedRating - 1]));
|
|
80
80
|
}
|
package/eds-frame.entry.esm.js
CHANGED
|
@@ -3,7 +3,7 @@ import 'react';
|
|
|
3
3
|
import 'react/jsx-runtime';
|
|
4
4
|
import 'react-dom';
|
|
5
5
|
|
|
6
|
-
const edsFrameCss = ".bg-inverse{background-color:
|
|
6
|
+
const edsFrameCss = ".bg-inverse{background-color:#FFFFFF;border:1px solid #ECECEC;color:#07140D}.min-h-156{min-height:156px}.rounded{border-radius:0.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:16px}.rounded-md{border-radius:12px}.border-soft{border-color:#ECECEC}.border-softer{border-color:#ECECEC}.border-softest{border-color:#f2f2f2}.effect-focus-within{outline-width:3px;outline-offset:2px;outline-color:#00FF9D}.effect-focus-within:focus-within{outline-style:solid}.relative{position:relative}.flex{display:flex}.grow{flex-grow:1}.flex-col{flex-direction:column}.border-2{border-width:0}.w-full{width:100%}.h-full{height:100%}.h-auto{height:auto}.effect-height{transition-duration:300ms;transition-timing-function:cubic-bezier(0, 0, 0.2, 1);transition-property:height}.items-center{align-items:center}.justify-between{justify-content:space-between}.py-8{padding-top:0.75rem;padding-bottom:0.75rem}.px-12{padding-left:1rem;padding-right:1rem}.py-8.px-12{border-bottom:1px solid #ECECEC}.f-ui-02{font-family:'IBM Plex Sans', sans-serif;font-size:0.8125rem;font-weight:600;color:#07140D;line-height:1.4}.ml-auto{margin-left:auto}.border-t-2{border-top-width:1px;border-color:#ECECEC}.border{border:1px solid #ECECEC}.container{width:calc(var(--container-width, 100%) - (2 * var(--breakout-container-outer-gutter, var(--container-outer-gutter, var(--outer-gutter, 0)))));margin-right:auto;margin-left:auto;color:#7A7B7A}.container>*{--container-outer-gutter:0;--breakout-container-outer-gutter:0}.ml-8{margin-left:0.5rem}.mr-8{margin-right:0.5rem}.mt-16{margin-top:1rem}iframe{border-radius:0 0 12px 12px}";
|
|
7
7
|
const EdsFrameStyle0 = edsFrameCss;
|
|
8
8
|
const EdsFrame = class {
|
|
9
9
|
constructor(hostRef) {
|
|
@@ -13,7 +13,7 @@ const EdsFrame = class {
|
|
|
13
13
|
this.urlLabel = 'Open';
|
|
14
14
|
this.errorMessage = 'Could not load the requested content. Please check the URL or try again later.';
|
|
15
15
|
this.url = undefined;
|
|
16
|
-
this.intent = '
|
|
16
|
+
this.intent = 'cta';
|
|
17
17
|
this.size = 'auto';
|
|
18
18
|
this.iframeError = false;
|
|
19
19
|
}
|
|
@@ -73,13 +73,13 @@ const EdsFrame = class {
|
|
|
73
73
|
}
|
|
74
74
|
render() {
|
|
75
75
|
return h("div", {
|
|
76
|
-
key: '
|
|
76
|
+
key: 'ddbc978054f645eb990cde6bdd26647bd01eeb1a',
|
|
77
77
|
class: this.articleClasses()
|
|
78
78
|
}, h("div", {
|
|
79
|
-
key: '
|
|
79
|
+
key: '0a16fbd950742b8a75428b3705deaa03ef785a5b',
|
|
80
80
|
class: "effect-height flex items-center justify-between py-8 px-12"
|
|
81
81
|
}, h("span", {
|
|
82
|
-
key: '
|
|
82
|
+
key: '0c2a84cae101ec1e5352ed7be7b874b6ec45f37d',
|
|
83
83
|
class: "f-ui-02"
|
|
84
84
|
}, this.frameLabel), !this.iframeError && this.url && this.urlLabel ? h("eds-link", {
|
|
85
85
|
label: this.urlLabel,
|
|
@@ -88,9 +88,9 @@ const EdsFrame = class {
|
|
|
88
88
|
class: "ml-auto",
|
|
89
89
|
external: true,
|
|
90
90
|
disabled: false,
|
|
91
|
-
icon: "arrow-
|
|
91
|
+
icon: "arrow-up-right"
|
|
92
92
|
}) : null), h("div", {
|
|
93
|
-
key: '
|
|
93
|
+
key: 'c001f1b33c5136820155b0299e83b6dc49fbbd43',
|
|
94
94
|
class: "border-softer"
|
|
95
95
|
}, this.iframeError ? h("div", {
|
|
96
96
|
class: "container ml-8 mr-8 mt-16"
|
package/eds-gauge.entry.esm.js
CHANGED
|
@@ -6,10 +6,9 @@ import 'react-dom';
|
|
|
6
6
|
const edsGaugeCss = ".relative{position:relative}.absolute{position:absolute}.inline-block{display:inline-block}.rounded-full{border-radius:9999px}.overflow-hidden{overflow:hidden}.bg-inverse{background-color:var(--white)}.bg-current{background-color:currentColor}.bg-dark{background-color:var(--grey-300)}.bg-darker{background-color:var(--grey-400)}.bg-default{background-color:var(--grey-200)}.bg-strong{background-color:var(--grey-700)}.bg-strongest{background-color:var(--black)}.inset-0{inset:0rem}.flex{display:flex}.items-center{align-items:center}.justify-center{justify-content:center}.f-body-01{font-family:var(--f-body-01-fontFamily);font-weight:var(--f-body-01-fontWeight);font-size:var(--f-body-01-fontSize);line-height:var(--f-body-01-lineHeight);letter-spacing:var(--f-body-01-letterSpacing)}.text-default{color:var(--black)}";
|
|
7
7
|
const EdsGaugeStyle0 = edsGaugeCss;
|
|
8
8
|
const BACKGROUND_VARIANTS = {
|
|
9
|
-
default: '
|
|
10
|
-
dark: '
|
|
11
|
-
|
|
12
|
-
black: '#000000'
|
|
9
|
+
default: 'var(--grey-light)',
|
|
10
|
+
dark: 'var(--grey-dark)',
|
|
11
|
+
black: 'var(--brand-black)'
|
|
13
12
|
};
|
|
14
13
|
const EdsGauge = class {
|
|
15
14
|
constructor(hostRef) {
|
|
@@ -39,7 +38,7 @@ const EdsGauge = class {
|
|
|
39
38
|
const containerStyle = {
|
|
40
39
|
width: `${diameter}px`,
|
|
41
40
|
height: `${diameter}px`,
|
|
42
|
-
background: `conic-gradient(
|
|
41
|
+
background: `conic-gradient(var(--brand-green) 0deg ${angle}deg, ${emptyColor} ${angle}deg 360deg)`
|
|
43
42
|
};
|
|
44
43
|
const maskStyle = {
|
|
45
44
|
width: `${innerDiameter}px`,
|
|
@@ -51,7 +50,7 @@ const EdsGauge = class {
|
|
|
51
50
|
fontSize: `${fontSize}px`
|
|
52
51
|
};
|
|
53
52
|
return h("div", {
|
|
54
|
-
key: '
|
|
53
|
+
key: '5629f8adbc6f144aad49062883cb85ecf24fc16c',
|
|
55
54
|
role: "progressbar",
|
|
56
55
|
"aria-valuemin": this.valueMin,
|
|
57
56
|
"aria-valuemax": this.valueMax,
|
|
@@ -60,14 +59,14 @@ const EdsGauge = class {
|
|
|
60
59
|
class: "relative inline-block rounded-full overflow-hidden",
|
|
61
60
|
style: containerStyle
|
|
62
61
|
}, h("div", {
|
|
63
|
-
key: '
|
|
62
|
+
key: 'd668b54b0a5f4bf260a2f1153781c59741bd8694',
|
|
64
63
|
class: "absolute bg-inverse rounded-full",
|
|
65
64
|
style: maskStyle
|
|
66
65
|
}), h("div", {
|
|
67
|
-
key: '
|
|
66
|
+
key: 'f08feba97d30ed893a72a7e07e412aa82ea8cd3d',
|
|
68
67
|
class: "absolute inset-0 flex items-center justify-center"
|
|
69
68
|
}, h("span", {
|
|
70
|
-
key: '
|
|
69
|
+
key: '2a8dccde44677d4a4b742cd992144d6cf399ee9b',
|
|
71
70
|
class: "f-body-01 text-default",
|
|
72
71
|
style: textStyle
|
|
73
72
|
}, clamped)));
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { r as registerInstance, h } from './index.esm2.js';
|
|
2
|
+
import 'react';
|
|
3
|
+
import 'react/jsx-runtime';
|
|
4
|
+
import 'react-dom';
|
|
5
|
+
|
|
6
|
+
const edsGitlabContributorsCss = ".container{width:calc(var(--container-width, 100%) - (2 * var(--breakout-container-outer-gutter, var(--container-outer-gutter, var(--outer-gutter, 0)))));margin-right:auto;margin-left:auto}.container>*{--container-outer-gutter:0;--breakout-container-outer-gutter:0}.flex{display:flex}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.grid{display:grid}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.gap-2{gap:0.5rem;}.gap-4{gap:1rem;}.gap-6{gap:1.5rem;}.p-5{padding:1.25rem;}.p-12{padding:3rem;}.pb-2{padding-bottom:0.25rem;}.pb-4{padding-bottom:1rem;}.mb-6{margin-bottom:1.5rem;}.m-0{margin:0}.mt-auto{margin-top:auto}.w-full{width:100%}.min-w-0{min-width:0}.text-xs{font-size:0.75rem;line-height:1rem}.text-sm{font-size:0.875rem;line-height:1.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-2xl{font-size:1.5rem;line-height:2rem}.font-semibold{font-weight:600}.whitespace-nowrap{white-space:nowrap}.overflow-hidden{overflow:hidden}.text-ellipsis{text-overflow:ellipsis}.no-underline{text-decoration:none}.text-gray-600{color:var(--eds-color-gray-600, #4b5563)}.text-gray-900{color:var(--eds-color-gray-900, #111827)}.border-gray-200{border-color:var(--eds-color-gray-200, #e5e7eb)}.bg-white{background-color:var(--eds-color-white, #ffffff)}.text-primary-600{color:var(--eds-color-primary-600, #2563eb)}.hover\\:text-primary-600:hover{color:var(--eds-color-primary-600, #2563eb)}.border-primary-300{border-color:var(--eds-color-primary-300, #93c5fd)}.hover\\:border-primary-300:hover{border-color:var(--eds-color-primary-300, #93c5fd)}.text-success-600{color:var(--eds-color-success-600, #16a34a)}.text-error-600{color:var(--eds-color-error-600, #dc2626)}.border{border-width:1px}.border-b{border-bottom-width:1px}.rounded-lg{border-radius:var(--eds-radius-lg, 0.5rem);}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.transition-colors{transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.duration-200{transition-duration:200ms}.shadow-md{box-shadow:0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)}.hover\\:shadow-md:hover{box-shadow:0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)}.-translate-y-0\\.5{transform:translateY(-0.125rem);}.hover\\:-translate-y-0\\.5:hover{transform:translateY(-0.125rem)}.grid-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr))}@media (min-width: 640px){.sm\\:grid-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr))}}@media (min-width: 768px){.md\\:grid-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr))}}@media (min-width: 1024px){.lg\\:grid-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr))}.lg\\:grid-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr))}}.contributor-card{will-change:transform, box-shadow, border-color}.loading{position:relative;min-height:8rem;padding:1rem 1.25rem;color:var(--grey-dark, #7A7B7A);font-size:0.9375rem;border:1px solid rgba(0, 0, 0, 0.08);border-radius:0.25rem;background-color:rgba(0, 0, 0, 0.02)}.f-ui-01{font-family:var(--f-ui-01-fontFamily);font-weight:var(--f-ui-01-fontWeight);font-size:var(--f-ui-01-fontSize);line-height:var(--f-ui-01-lineHeight);letter-spacing:var(--f-ui-01-letterSpacing)}.text-default{color:var(--black)}.text-light{color:var(--grey-700)}.text-lighter{color:var(--grey-600)}";
|
|
7
|
+
const EdsGitlabContributorsStyle0 = edsGitlabContributorsCss;
|
|
8
|
+
const EdsGitlabContributors = class {
|
|
9
|
+
constructor(hostRef) {
|
|
10
|
+
registerInstance(this, hostRef);
|
|
11
|
+
this.accessToken = undefined;
|
|
12
|
+
this.projectId = '3360';
|
|
13
|
+
this.apiUrl = 'https://gitlab.ebrains.eu/api/v4';
|
|
14
|
+
this.path = undefined;
|
|
15
|
+
this.limit = 50;
|
|
16
|
+
this.minCommits = 1;
|
|
17
|
+
this.showStats = true;
|
|
18
|
+
this.columns = '4';
|
|
19
|
+
this.sortBy = 'commits';
|
|
20
|
+
this.contributors = [];
|
|
21
|
+
this.loading = true;
|
|
22
|
+
this.error = '';
|
|
23
|
+
}
|
|
24
|
+
async componentWillLoad() {
|
|
25
|
+
await this.fetchContributors();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Parses projectId prop to handle single or multiple project IDs
|
|
29
|
+
*/
|
|
30
|
+
getProjectIds() {
|
|
31
|
+
return this.projectId.split(',').map(id => id.trim()).filter(id => id.length > 0);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Fetches commits by path and aggregates by author for a single project
|
|
35
|
+
*/
|
|
36
|
+
async fetchCommitsByPathForProject(projectId) {
|
|
37
|
+
const commits = [];
|
|
38
|
+
let page = 1;
|
|
39
|
+
const perPage = 100; // GitLab max per page
|
|
40
|
+
// Fetch all commits with pagination
|
|
41
|
+
while (true) {
|
|
42
|
+
const url = `${this.apiUrl}/projects/${encodeURIComponent(projectId)}/repository/commits?path=${encodeURIComponent(this.path)}&per_page=${perPage}&page=${page}`;
|
|
43
|
+
const response = await fetch(url, {
|
|
44
|
+
headers: {
|
|
45
|
+
'PRIVATE-TOKEN': this.accessToken
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(`GitLab API error: ${response.status} ${response.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
const pageCommits = await response.json();
|
|
52
|
+
if (pageCommits.length === 0) {
|
|
53
|
+
break; // No more pages
|
|
54
|
+
}
|
|
55
|
+
commits.push(...pageCommits);
|
|
56
|
+
// Stop if we have enough commits or no more pages
|
|
57
|
+
if (pageCommits.length < perPage) {
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
page++;
|
|
61
|
+
}
|
|
62
|
+
// Aggregate commits by author email
|
|
63
|
+
const authorMap = new Map();
|
|
64
|
+
for (const commit of commits) {
|
|
65
|
+
const email = commit.author_email.toLowerCase();
|
|
66
|
+
if (authorMap.has(email)) {
|
|
67
|
+
authorMap.get(email).commits++;
|
|
68
|
+
} else {
|
|
69
|
+
authorMap.set(email, {
|
|
70
|
+
name: commit.author_name,
|
|
71
|
+
email: commit.author_email,
|
|
72
|
+
commits: 1
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Convert to GitLabContributor format
|
|
77
|
+
return Array.from(authorMap.values()).map(author => ({
|
|
78
|
+
name: author.name,
|
|
79
|
+
email: author.email,
|
|
80
|
+
commits: author.commits,
|
|
81
|
+
additions: 0,
|
|
82
|
+
// Not available from commits API
|
|
83
|
+
deletions: 0 // Not available from commits API
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Fetches contributors from a single project
|
|
88
|
+
* For project 1505 (monorepo), applies path filter if provided
|
|
89
|
+
* For other projects, fetches all contributors
|
|
90
|
+
*/
|
|
91
|
+
async fetchContributorsForProject(projectId) {
|
|
92
|
+
// Only apply path filter for project 1505 (the monorepo)
|
|
93
|
+
const shouldUsePath = this.path && projectId === '1505';
|
|
94
|
+
if (shouldUsePath) {
|
|
95
|
+
// Fetch commits by path and aggregate by author (for monorepo)
|
|
96
|
+
return await this.fetchCommitsByPathForProject(projectId);
|
|
97
|
+
} else {
|
|
98
|
+
// Use contributors API for entire repository
|
|
99
|
+
const contributorsResponse = await fetch(`${this.apiUrl}/projects/${encodeURIComponent(projectId)}/repository/contributors?per_page=100`, {
|
|
100
|
+
headers: {
|
|
101
|
+
'PRIVATE-TOKEN': this.accessToken
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
if (!contributorsResponse.ok) {
|
|
105
|
+
throw new Error(`GitLab API error: ${contributorsResponse.status} ${contributorsResponse.statusText}`);
|
|
106
|
+
}
|
|
107
|
+
return await contributorsResponse.json();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Fetches contributors from GitLab API (supports multiple projects)
|
|
112
|
+
*/
|
|
113
|
+
async fetchContributors() {
|
|
114
|
+
if (!this.accessToken) {
|
|
115
|
+
this.error = 'Access token is required for internal projects';
|
|
116
|
+
this.loading = false;
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
this.loading = true;
|
|
121
|
+
this.error = '';
|
|
122
|
+
const projectIds = this.getProjectIds();
|
|
123
|
+
let allContributorsData = [];
|
|
124
|
+
// Fetch contributors from all projects
|
|
125
|
+
for (const projectId of projectIds) {
|
|
126
|
+
const contributorsData = await this.fetchContributorsForProject(projectId);
|
|
127
|
+
allContributorsData.push(...contributorsData);
|
|
128
|
+
}
|
|
129
|
+
// Filter by minimum commits and exclude bot contributors
|
|
130
|
+
const filteredContributors = allContributorsData.filter(c => {
|
|
131
|
+
// Exclude if commits are below minimum
|
|
132
|
+
if (c.commits < this.minCommits) return false;
|
|
133
|
+
// Exclude GitLab CI and other bots
|
|
134
|
+
const email = c.email.toLowerCase();
|
|
135
|
+
const name = c.name.toLowerCase();
|
|
136
|
+
// Common bot identifiers
|
|
137
|
+
const botPatterns = ['gitlab-ci', 'gitlab ci', 'noreply@gitlab', 'bot@', 'automation@'];
|
|
138
|
+
return !botPatterns.some(pattern => email.includes(pattern) || name.includes(pattern));
|
|
139
|
+
});
|
|
140
|
+
// Aggregate duplicate contributors by username
|
|
141
|
+
const aggregatedContributors = this.aggregateContributors(filteredContributors);
|
|
142
|
+
// Sort contributors
|
|
143
|
+
if (this.sortBy === 'commits') {
|
|
144
|
+
aggregatedContributors.sort((a, b) => b.commits - a.commits);
|
|
145
|
+
} else {
|
|
146
|
+
aggregatedContributors.sort((a, b) => a.username.localeCompare(b.username));
|
|
147
|
+
}
|
|
148
|
+
// Apply limit after sorting
|
|
149
|
+
this.contributors = aggregatedContributors.slice(0, this.limit);
|
|
150
|
+
this.loading = false;
|
|
151
|
+
} catch (err) {
|
|
152
|
+
this.error = err instanceof Error ? err.message : 'Failed to fetch contributors';
|
|
153
|
+
this.loading = false;
|
|
154
|
+
console.error('Error fetching GitLab contributors:', err);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Extracts username from email address (part before @)
|
|
159
|
+
*/
|
|
160
|
+
extractUsernameFromEmail(email) {
|
|
161
|
+
if (!email || !email.includes('@')) {
|
|
162
|
+
return email || 'unknown';
|
|
163
|
+
}
|
|
164
|
+
return email.split('@')[0];
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Aggregates duplicate contributors by username (extracted from email)
|
|
168
|
+
* Combines commits, additions, and deletions for the same person
|
|
169
|
+
*/
|
|
170
|
+
aggregateContributors(contributors) {
|
|
171
|
+
const aggregated = new Map();
|
|
172
|
+
for (const contributor of contributors) {
|
|
173
|
+
// Extract username from email
|
|
174
|
+
const username = this.extractUsernameFromEmail(contributor.email);
|
|
175
|
+
const key = username.toLowerCase();
|
|
176
|
+
if (aggregated.has(key)) {
|
|
177
|
+
// Aggregate with existing contributor
|
|
178
|
+
const existing = aggregated.get(key);
|
|
179
|
+
existing.commits += contributor.commits;
|
|
180
|
+
existing.additions += contributor.additions;
|
|
181
|
+
existing.deletions += contributor.deletions;
|
|
182
|
+
} else {
|
|
183
|
+
// Add new contributor with extracted username
|
|
184
|
+
aggregated.set(key, Object.assign(Object.assign({}, contributor), {
|
|
185
|
+
username
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return Array.from(aggregated.values());
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Gets first and last name from full name
|
|
193
|
+
*/
|
|
194
|
+
parseName(fullName) {
|
|
195
|
+
const parts = fullName.trim().split(' ');
|
|
196
|
+
if (parts.length === 1) {
|
|
197
|
+
return {
|
|
198
|
+
firstName: parts[0],
|
|
199
|
+
lastName: ''
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
const firstName = parts[0];
|
|
203
|
+
const lastName = parts.slice(1).join(' ');
|
|
204
|
+
return {
|
|
205
|
+
firstName,
|
|
206
|
+
lastName
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Format large numbers with K suffix
|
|
211
|
+
*/
|
|
212
|
+
formatNumber(num) {
|
|
213
|
+
if (num >= 1000) {
|
|
214
|
+
return `${(num / 1000).toFixed(1)}K`;
|
|
215
|
+
}
|
|
216
|
+
return num.toString();
|
|
217
|
+
}
|
|
218
|
+
render() {
|
|
219
|
+
if (this.loading) {
|
|
220
|
+
// Spinner placeholder mirrors eds-kg-learning-resources exactly —
|
|
221
|
+
// same `.loading` wrapper (position: relative + min-height so the
|
|
222
|
+
// absolutely-positioned spinner anchors inside the box instead of
|
|
223
|
+
// escaping to the page), same eds-spinner props (sm/primary/
|
|
224
|
+
// transparent + message-as-prop), and the same role+aria-live for
|
|
225
|
+
// screen-reader announcement. Keep these two components in sync if
|
|
226
|
+
// the loading affordance ever changes.
|
|
227
|
+
return h("div", {
|
|
228
|
+
class: "loading",
|
|
229
|
+
role: "status",
|
|
230
|
+
"aria-live": "polite"
|
|
231
|
+
}, h("eds-spinner", {
|
|
232
|
+
size: "sm",
|
|
233
|
+
variant: "primary",
|
|
234
|
+
background: "transparent",
|
|
235
|
+
message: "Loading contributors..."
|
|
236
|
+
}));
|
|
237
|
+
}
|
|
238
|
+
if (this.error) {
|
|
239
|
+
return h("eds-alert", {
|
|
240
|
+
message: "Error loading contributors",
|
|
241
|
+
intent: "error"
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
if (this.contributors.length === 0) {
|
|
245
|
+
return h("eds-alert", {
|
|
246
|
+
message: "No contributors found for this project.",
|
|
247
|
+
intent: "error"
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
const gridClass = `grid gap-6 w-full ${this.columns === '2' ? 'grid-cols-1 sm:grid-cols-2' : this.columns === '3' ? 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3' : this.columns === '4' ? 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4' : 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-5'}`;
|
|
251
|
+
return h("div", {
|
|
252
|
+
class: "w-full"
|
|
253
|
+
}, h("div", {
|
|
254
|
+
class: gridClass
|
|
255
|
+
}, this.contributors.map(contributor => {
|
|
256
|
+
const {
|
|
257
|
+
firstName,
|
|
258
|
+
lastName
|
|
259
|
+
} = this.parseName(contributor.name);
|
|
260
|
+
return h("div", {
|
|
261
|
+
class: "contributor-card flex flex-row gap-4 p-5 bg-white border border-gray-200 rounded-lg transition-all duration-200",
|
|
262
|
+
key: contributor.email
|
|
263
|
+
}, h("div", {
|
|
264
|
+
class: "flex-shrink-0"
|
|
265
|
+
}, h("eds-avatar", {
|
|
266
|
+
firstName: firstName,
|
|
267
|
+
lastName: lastName,
|
|
268
|
+
color: "black"
|
|
269
|
+
})), h("div", {
|
|
270
|
+
class: "min-w-0 flex flex-col gap-2"
|
|
271
|
+
}, h("span", {
|
|
272
|
+
class: "f-ui-01 text-default pb-2 m-0 whitespace-nowrap overflow-hidden text-ellipsis"
|
|
273
|
+
}, "@", contributor.username), h("div", {
|
|
274
|
+
class: "flex flex-col gap-2 mt-auto"
|
|
275
|
+
}, h("div", {
|
|
276
|
+
class: "flex items-center gap-2 font-semibold"
|
|
277
|
+
}, h("span", {
|
|
278
|
+
class: "text-light"
|
|
279
|
+
}, this.formatNumber(contributor.commits)), h("span", {
|
|
280
|
+
class: "text-lighter"
|
|
281
|
+
}, contributor.commits === 1 ? 'commit' : 'commits')))));
|
|
282
|
+
})));
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
EdsGitlabContributors.style = EdsGitlabContributorsStyle0;
|
|
286
|
+
|
|
287
|
+
export { EdsGitlabContributors as eds_gitlab_contributors };
|
package/eds-icon-eu.entry.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as registerInstance, h } from './index.esm2.js';
|
|
2
|
-
import { e as euSvg } from './eu-
|
|
2
|
+
import { e as euSvg } from './eu-8ac3e99c.esm.js';
|
|
3
3
|
import 'react';
|
|
4
4
|
import 'react/jsx-runtime';
|
|
5
5
|
import 'react-dom';
|
|
@@ -11,7 +11,7 @@ const EdsIconEu = class {
|
|
|
11
11
|
}
|
|
12
12
|
render() {
|
|
13
13
|
return h("span", {
|
|
14
|
-
key: '
|
|
14
|
+
key: '56f0efdfb37b2dd4474dc2e69ef649915a9f4bbc',
|
|
15
15
|
class: this.class,
|
|
16
16
|
innerHTML: euSvg
|
|
17
17
|
});
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { r as registerInstance, c as createEvent, h, g as getElement } from './index.esm2.js';
|
|
2
|
+
import { s as sendAnalytics } from './analytics-d99780e3.esm.js';
|
|
3
|
+
import 'react';
|
|
4
|
+
import 'react/jsx-runtime';
|
|
5
|
+
import 'react-dom';
|
|
6
|
+
|
|
7
|
+
const EdsInputSearch = class {
|
|
8
|
+
constructor(hostRef) {
|
|
9
|
+
registerInstance(this, hostRef);
|
|
10
|
+
this.search = createEvent(this, "search", 7);
|
|
11
|
+
/**
|
|
12
|
+
* Keydown event listener to detect Command+K (Mac) or Ctrl+K (Windows/Linux)
|
|
13
|
+
* and focus the input element when triggered.
|
|
14
|
+
*
|
|
15
|
+
* @param e - The keyboard event.
|
|
16
|
+
*/
|
|
17
|
+
this.keydownListener = e => {
|
|
18
|
+
// Check for Command+K (Mac) or Ctrl+K (Windows/Linux)
|
|
19
|
+
if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {
|
|
20
|
+
e.preventDefault();
|
|
21
|
+
// Focus the input if it's available and not disabled
|
|
22
|
+
if (this.inputElement && !this.disabled) {
|
|
23
|
+
this.inputElement.focus();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
/*onInput = (e: any) => {
|
|
28
|
+
// eslint-disable-next-line
|
|
29
|
+
console.log('on input:', e);
|
|
30
|
+
};*/
|
|
31
|
+
this.onChange = e => {
|
|
32
|
+
// eslint-disable-next-line
|
|
33
|
+
this.search.emit({
|
|
34
|
+
event: 'change',
|
|
35
|
+
value: e.target.value
|
|
36
|
+
});
|
|
37
|
+
sendAnalytics({
|
|
38
|
+
category: 'ui-component',
|
|
39
|
+
parentContext: null,
|
|
40
|
+
tag: this.el.tagName.toLowerCase(),
|
|
41
|
+
name: e.target.value || '',
|
|
42
|
+
action: 'search'
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
this.name = undefined;
|
|
46
|
+
this.inputId = 'search-main';
|
|
47
|
+
this.placeholder = 'Search...';
|
|
48
|
+
this.value = undefined;
|
|
49
|
+
this.disabled = false;
|
|
50
|
+
this.required = false;
|
|
51
|
+
this.decorate = undefined;
|
|
52
|
+
this.label = 'Search';
|
|
53
|
+
}
|
|
54
|
+
componentDidLoad() {
|
|
55
|
+
// Assign the native input element after the component loads
|
|
56
|
+
this.inputElement = this.el.querySelector('input');
|
|
57
|
+
document.addEventListener('keydown', this.keydownListener);
|
|
58
|
+
}
|
|
59
|
+
disconnectedCallback() {
|
|
60
|
+
// Clean up the event listener when the component is removed
|
|
61
|
+
document.removeEventListener('keydown', this.keydownListener);
|
|
62
|
+
}
|
|
63
|
+
async getInputElement() {
|
|
64
|
+
// Return the native input element
|
|
65
|
+
return this.inputElement;
|
|
66
|
+
}
|
|
67
|
+
render() {
|
|
68
|
+
return h("div", {
|
|
69
|
+
key: '52676b3559e14b5153f7d8f0fa6cd12e49354d87',
|
|
70
|
+
class: "relative flex items-center"
|
|
71
|
+
}, h("eds-icon-wrapper", {
|
|
72
|
+
key: '754e8753607c01dab63d156d306f3325547049aa',
|
|
73
|
+
name: "search",
|
|
74
|
+
class: "absolute top-1/2 left-[14px] -translate-y-1/2 text-lightest",
|
|
75
|
+
"aria-hidden": "true"
|
|
76
|
+
}), h("input", {
|
|
77
|
+
key: 'b49d523195711316c0817de67776d379a6c7248b',
|
|
78
|
+
id: this.inputId || this.name,
|
|
79
|
+
name: this.name,
|
|
80
|
+
placeholder: this.placeholder,
|
|
81
|
+
value: this.value || '',
|
|
82
|
+
required: this.required,
|
|
83
|
+
disabled: this.disabled,
|
|
84
|
+
type: "search",
|
|
85
|
+
"aria-label": this.placeholder,
|
|
86
|
+
class: `input pl-36 ${this.decorate}`,
|
|
87
|
+
//onInput={this.onInput}
|
|
88
|
+
onChange: this.onChange
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
get el() {
|
|
92
|
+
return getElement(this);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export { EdsInputSearch as eds_input_search };
|