@datagouv/components-next 0.0.1
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/README.md +150 -0
- package/assets/main.css +136 -0
- package/assets/placeholders/author.png +0 -0
- package/assets/placeholders/dataset.png +0 -0
- package/assets/placeholders/news.png +0 -0
- package/assets/placeholders/organization.png +0 -0
- package/assets/placeholders/reuse.png +0 -0
- package/assets/tailwind.config.js +24 -0
- package/dist/components.css +2 -0
- package/dist/locales/de.js +155 -0
- package/dist/locales/en.js +155 -0
- package/dist/locales/es.js +155 -0
- package/dist/locales/fr.js +155 -0
- package/dist/locales/it.js +155 -0
- package/dist/locales/pt.js +155 -0
- package/dist/locales/sr.js +155 -0
- package/package.json +72 -0
- package/src/components/AppLink.vue +51 -0
- package/src/components/Avatar.vue +27 -0
- package/src/components/AvatarWithName.vue +26 -0
- package/src/components/BannerAction.vue +39 -0
- package/src/components/BrandedButton.vue +170 -0
- package/src/components/CopyButton.vue +84 -0
- package/src/components/DataserviceCard.vue +184 -0
- package/src/components/DatasetCard.vue +198 -0
- package/src/components/DatasetInformationPanel.vue +210 -0
- package/src/components/DatasetQuality.vue +68 -0
- package/src/components/DatasetQualityInline.vue +32 -0
- package/src/components/DatasetQualityItem.vue +32 -0
- package/src/components/DatasetQualityItemWarning.vue +21 -0
- package/src/components/DatasetQualityScore.vue +35 -0
- package/src/components/DatasetQualityTooltipContent.vue +79 -0
- package/src/components/DescriptionDetails.vue +23 -0
- package/src/components/DescriptionList/DescriptionDetails.stories.ts +43 -0
- package/src/components/DescriptionList/DescriptionList.stories.ts +47 -0
- package/src/components/DescriptionList/DescriptionTerm.stories.ts +28 -0
- package/src/components/DescriptionList.vue +8 -0
- package/src/components/DescriptionTerm.vue +8 -0
- package/src/components/ExtraAccordion.vue +78 -0
- package/src/components/Icons/Archive.vue +21 -0
- package/src/components/Icons/Code.vue +21 -0
- package/src/components/Icons/Documentation.vue +21 -0
- package/src/components/Icons/File.vue +21 -0
- package/src/components/Icons/Image.vue +7 -0
- package/src/components/Icons/Link.vue +21 -0
- package/src/components/Icons/Table.vue +21 -0
- package/src/components/OrganizationCard.vue +68 -0
- package/src/components/OrganizationNameWithCertificate.vue +45 -0
- package/src/components/OwnerType.vue +43 -0
- package/src/components/OwnerTypeIcon.vue +18 -0
- package/src/components/Pagination.vue +205 -0
- package/src/components/Placeholder.vue +29 -0
- package/src/components/ReadMore.vue +107 -0
- package/src/components/ResourceAccordion/DataStructure.vue +87 -0
- package/src/components/ResourceAccordion/EditButton.vue +34 -0
- package/src/components/ResourceAccordion/Metadata.vue +171 -0
- package/src/components/ResourceAccordion/Preview.vue +229 -0
- package/src/components/ResourceAccordion/PreviewLoader.vue +148 -0
- package/src/components/ResourceAccordion/ResourceAccordion.vue +484 -0
- package/src/components/ResourceAccordion/ResourceIcon.vue +16 -0
- package/src/components/ResourceAccordion/SchemaBadge.vue +148 -0
- package/src/components/ResourceAccordion/SchemaLoader.vue +30 -0
- package/src/components/ResourceAccordion/Swagger.vue +46 -0
- package/src/components/ResourceAccordion/france.svg +1 -0
- package/src/components/ReuseCard.vue +106 -0
- package/src/components/ReuseDetails.vue +45 -0
- package/src/components/SimpleBanner.vue +24 -0
- package/src/components/SmallChart.vue +149 -0
- package/src/components/StatBox.vue +100 -0
- package/src/components/Tabs/Tab.vue +62 -0
- package/src/components/Tabs/TabGroup.vue +20 -0
- package/src/components/Tabs/TabList.vue +15 -0
- package/src/components/Tabs/TabPanel.vue +7 -0
- package/src/components/Tabs/TabPanels.vue +7 -0
- package/src/components/Toggletip.vue +62 -0
- package/src/components/ToggletipButton.vue +14 -0
- package/src/composables/useActiveDescendant.ts +103 -0
- package/src/composables/useReuseType.ts +14 -0
- package/src/config.ts +33 -0
- package/src/functions/api.ts +96 -0
- package/src/functions/api.types.ts +41 -0
- package/src/functions/config.ts +12 -0
- package/src/functions/datasets.ts +24 -0
- package/src/functions/dates.ts +85 -0
- package/src/functions/helpers.ts +38 -0
- package/src/functions/markdown.ts +47 -0
- package/src/functions/matomo.ts +3 -0
- package/src/functions/organizations.ts +85 -0
- package/src/functions/owned.ts +11 -0
- package/src/functions/resources.ts +99 -0
- package/src/functions/reuses.ts +28 -0
- package/src/functions/schemas.ts +96 -0
- package/src/functions/tabularApi.ts +27 -0
- package/src/functions/users.ts +7 -0
- package/src/locales/de.json +154 -0
- package/src/locales/en.json +154 -0
- package/src/locales/es.json +154 -0
- package/src/locales/fr.json +154 -0
- package/src/locales/it.json +154 -0
- package/src/locales/pt.json +154 -0
- package/src/locales/sr.json +154 -0
- package/src/main.ts +147 -0
- package/src/types/badges.ts +5 -0
- package/src/types/contact_point.ts +7 -0
- package/src/types/dataservices.ts +68 -0
- package/src/types/datasets.ts +80 -0
- package/src/types/frequency.ts +6 -0
- package/src/types/granularity.ts +6 -0
- package/src/types/harvest.ts +3 -0
- package/src/types/keyboard.ts +1 -0
- package/src/types/licenses.ts +9 -0
- package/src/types/organizations.ts +41 -0
- package/src/types/owned.ts +9 -0
- package/src/types/resources.ts +37 -0
- package/src/types/reuses.ts +49 -0
- package/src/types/site.ts +23 -0
- package/src/types/topics.ts +20 -0
- package/src/types/ui.ts +3 -0
- package/src/types/users.ts +10 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<dd
|
|
3
|
+
class="text-sm ml-0 mt-0 mb-4 text-gray-medium h-8 flex flex-wrap items-center"
|
|
4
|
+
>
|
|
5
|
+
<div
|
|
6
|
+
v-if="withEllipsis"
|
|
7
|
+
class="text-overflow-ellipsis"
|
|
8
|
+
>
|
|
9
|
+
<slot />
|
|
10
|
+
</div>
|
|
11
|
+
<slot v-else />
|
|
12
|
+
</dd>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<script setup lang="ts">
|
|
16
|
+
type Props = {
|
|
17
|
+
withEllipsis?: boolean
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
withDefaults(defineProps<Props>(), {
|
|
21
|
+
withEllipsis: true,
|
|
22
|
+
})
|
|
23
|
+
</script>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import DescriptionDetails from './DescriptionDetails.vue';
|
|
3
|
+
|
|
4
|
+
const meta = {
|
|
5
|
+
title: "Components/Description List/Description Details",
|
|
6
|
+
component: DescriptionDetails,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
docs: {
|
|
10
|
+
description: {
|
|
11
|
+
component: "The Description Details is a styled `<dd>` to use in the `<DescriptionList>` component."
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
} satisfies Meta<typeof DescriptionDetails>;
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
|
|
19
|
+
export const Simple: StoryObj<typeof meta> = {
|
|
20
|
+
render: (args) => ({
|
|
21
|
+
components: { DescriptionDetails },
|
|
22
|
+
setup() {
|
|
23
|
+
return { args };
|
|
24
|
+
},
|
|
25
|
+
template: '<dl class="fr-col-2"><DescriptionDetails v-bind="args">Some content inside the description details</DescriptionDetails></dl>',
|
|
26
|
+
}),
|
|
27
|
+
args: {
|
|
28
|
+
withEllipsis: false
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const WithEllipsis: StoryObj<typeof meta> = {
|
|
33
|
+
render: (args) => ({
|
|
34
|
+
components: { DescriptionDetails },
|
|
35
|
+
setup() {
|
|
36
|
+
return { args };
|
|
37
|
+
},
|
|
38
|
+
template: '<dl class="fr-col-2"><DescriptionDetails v-bind="args">Some content inside the description details</DescriptionDetails></dl>',
|
|
39
|
+
}),
|
|
40
|
+
args: {
|
|
41
|
+
withEllipsis: true
|
|
42
|
+
}
|
|
43
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import DescriptionList from './DescriptionList.vue';
|
|
3
|
+
import DescriptionTerm from './DescriptionTerm.vue';
|
|
4
|
+
import DescriptionDetails from './DescriptionDetails.vue';
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
title: "Components/Description List/Description List",
|
|
8
|
+
component: DescriptionList,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
parameters: {
|
|
11
|
+
docs: {
|
|
12
|
+
description: {
|
|
13
|
+
component: "The Description Details is a styled `<dd>` to use in the `<DescriptionList>` component."
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
} satisfies Meta<typeof DescriptionList>;
|
|
18
|
+
|
|
19
|
+
export default meta;
|
|
20
|
+
|
|
21
|
+
export const Simple: StoryObj<typeof meta> = {
|
|
22
|
+
render: (args) => ({
|
|
23
|
+
components: { DescriptionDetails, DescriptionList, DescriptionTerm },
|
|
24
|
+
setup() {
|
|
25
|
+
return { args };
|
|
26
|
+
},
|
|
27
|
+
template: `<DescriptionList>
|
|
28
|
+
<DescriptionTerm>The Term</DescriptionTerm>
|
|
29
|
+
<DescriptionDetails :withEllipsis="false">A really long details so we can see if it wraps to a new line or add ellipsis.</DescriptionDetails>
|
|
30
|
+
</DescriptionList>`,
|
|
31
|
+
}),
|
|
32
|
+
args: {}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const WithEllipsis: StoryObj<typeof meta> = {
|
|
36
|
+
render: (args) => ({
|
|
37
|
+
components: { DescriptionDetails, DescriptionList, DescriptionTerm },
|
|
38
|
+
setup() {
|
|
39
|
+
return { args };
|
|
40
|
+
},
|
|
41
|
+
template: `<DescriptionList>
|
|
42
|
+
<DescriptionTerm>The Term</DescriptionTerm>
|
|
43
|
+
<DescriptionDetails>A really long details so we can see if it wraps to a new line or add ellipsis.</DescriptionDetails>
|
|
44
|
+
</DescriptionList>`,
|
|
45
|
+
}),
|
|
46
|
+
args: {}
|
|
47
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import DescriptionTerm from './DescriptionTerm.vue';
|
|
3
|
+
|
|
4
|
+
const meta = {
|
|
5
|
+
title: "Components/Description List/Description Term",
|
|
6
|
+
component: DescriptionTerm,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
docs: {
|
|
10
|
+
description: {
|
|
11
|
+
component: "The Description Term is a styled `<dt>` to use in the `<DescriptionList>` component."
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
} satisfies Meta<typeof DescriptionTerm>;
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
|
|
19
|
+
export const Simple: StoryObj<typeof meta> = {
|
|
20
|
+
render: (args) => ({
|
|
21
|
+
components: { DescriptionTerm },
|
|
22
|
+
setup() {
|
|
23
|
+
return { args };
|
|
24
|
+
},
|
|
25
|
+
template: '<dl class="fr-col-2"><DescriptionTerm v-bind="args">The term</DescriptionTerm></dl>',
|
|
26
|
+
}),
|
|
27
|
+
args: {}
|
|
28
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<Disclosure
|
|
3
|
+
v-slot="{ open }"
|
|
4
|
+
as="div"
|
|
5
|
+
>
|
|
6
|
+
<header
|
|
7
|
+
class="flex flex-wrap items-center pb-6 mb-6 border-bottom border-gray-default"
|
|
8
|
+
>
|
|
9
|
+
<div class="fr-col">
|
|
10
|
+
<component
|
|
11
|
+
:is="titleLevel"
|
|
12
|
+
class="subtitle subtitle--uppercase fr-m-0"
|
|
13
|
+
>
|
|
14
|
+
{{ titleText }}
|
|
15
|
+
</component>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="fr-col-auto">
|
|
18
|
+
<DisclosureButton
|
|
19
|
+
:as="BrandedButton"
|
|
20
|
+
color="secondary-softer"
|
|
21
|
+
keep-margins-even-without-borders
|
|
22
|
+
:icon="open ? RiArrowUpSLine : RiArrowDownSLine"
|
|
23
|
+
>
|
|
24
|
+
<template v-if="open">
|
|
25
|
+
{{ $t('Close details') }}
|
|
26
|
+
</template>
|
|
27
|
+
<template v-else>
|
|
28
|
+
{{ buttonText }}
|
|
29
|
+
</template>
|
|
30
|
+
</DisclosureButton>
|
|
31
|
+
</div>
|
|
32
|
+
</header>
|
|
33
|
+
<DisclosurePanel
|
|
34
|
+
:id="accordionId"
|
|
35
|
+
class="accordion-content"
|
|
36
|
+
>
|
|
37
|
+
<div class="pb-6 mb-6 border-bottom border-gray-default">
|
|
38
|
+
<div
|
|
39
|
+
class="fr-grid-row fr-grid-row--gutters fr-text--sm fr-m-0"
|
|
40
|
+
data-testid="extra-list"
|
|
41
|
+
>
|
|
42
|
+
<div
|
|
43
|
+
v-for="(value, key) in extra"
|
|
44
|
+
:key="key"
|
|
45
|
+
class="fr-col-12 fr-col-sm-6 fr-col-md-4"
|
|
46
|
+
>
|
|
47
|
+
<h3 class="subtitle fr-mb-1v">
|
|
48
|
+
{{ key }}
|
|
49
|
+
</h3>
|
|
50
|
+
<p class="text-sm m-0 text-gray-medium break-all">
|
|
51
|
+
{{ value }}
|
|
52
|
+
</p>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
</DisclosurePanel>
|
|
57
|
+
</Disclosure>
|
|
58
|
+
</template>
|
|
59
|
+
|
|
60
|
+
<script setup lang="ts">
|
|
61
|
+
import { useId } from 'vue'
|
|
62
|
+
import {
|
|
63
|
+
Disclosure,
|
|
64
|
+
DisclosureButton,
|
|
65
|
+
DisclosurePanel,
|
|
66
|
+
} from '@headlessui/vue'
|
|
67
|
+
import { RiArrowDownSLine, RiArrowUpSLine } from '@remixicon/vue'
|
|
68
|
+
import BrandedButton from './BrandedButton.vue'
|
|
69
|
+
|
|
70
|
+
const accordionId = useId()
|
|
71
|
+
|
|
72
|
+
defineProps<{
|
|
73
|
+
buttonText: string
|
|
74
|
+
titleText: string
|
|
75
|
+
extra: Record<string, unknown>
|
|
76
|
+
titleLevel: 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'div'
|
|
77
|
+
}>()
|
|
78
|
+
</script>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg
|
|
3
|
+
width="100%"
|
|
4
|
+
height="100%"
|
|
5
|
+
viewBox="0 0 14 13"
|
|
6
|
+
version="1.1"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
9
|
+
xml:space="preserve"
|
|
10
|
+
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
|
11
|
+
><rect
|
|
12
|
+
x="0"
|
|
13
|
+
y="0"
|
|
14
|
+
width="14"
|
|
15
|
+
height="12.25"
|
|
16
|
+
style="fill:none;"
|
|
17
|
+
/><path
|
|
18
|
+
d="M12.688,0l-11.376,0c-0.738,0 -1.312,0.602 -1.312,1.313l-0,2.187c-0,0.246 0.191,0.438 0.437,0.438l0.438,-0.001l-0,7.438c-0,0.492 0.383,0.875 0.875,0.875l10.5,0c0.465,0 0.875,-0.383 0.875,-0.875l-0,-7.438l0.437,0c0.219,0 0.438,-0.191 0.438,-0.437l-0,-2.188c-0,-0.71 -0.602,-1.312 -1.313,-1.312Zm-0.875,10.938l-9.625,-0.001l0,-7l9.625,0l0,7Zm0.875,-8.312l-11.375,-0l0,-1.313l11.375,0l0,1.313Zm-7.109,3.937l2.844,0c0.164,0 0.328,-0.136 0.328,-0.328l0,-0.656c0,-0.164 -0.164,-0.328 -0.328,-0.328l-2.844,-0c-0.191,-0 -0.328,0.164 -0.328,0.328l-0,0.656c-0,0.192 0.137,0.328 0.328,0.328Z"
|
|
19
|
+
style="fill-rule:nonzero;"
|
|
20
|
+
/></svg>
|
|
21
|
+
</template>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg
|
|
3
|
+
width="100%"
|
|
4
|
+
height="100%"
|
|
5
|
+
viewBox="0 0 11 14"
|
|
6
|
+
version="1.1"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
9
|
+
xml:space="preserve"
|
|
10
|
+
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
|
11
|
+
><rect
|
|
12
|
+
x="0"
|
|
13
|
+
y="0"
|
|
14
|
+
width="10.5"
|
|
15
|
+
height="14"
|
|
16
|
+
style="fill:none;"
|
|
17
|
+
/><path
|
|
18
|
+
d="M4.074,9.57l0,-0.027l-0.902,-0.793l0.902,-0.766c0.11,-0.109 0.11,-0.246 0.028,-0.355l-0.493,-0.52c-0.082,-0.082 -0.246,-0.082 -0.328,0l-1.586,1.477c-0.082,0.109 -0.082,0.246 0,0.355l1.586,1.477c0.055,0.027 0.11,0.055 0.164,0.055c0.055,-0 0.137,-0.028 0.164,-0.055l0.493,-0.52c0.082,-0.109 0.082,-0.246 -0.028,-0.328Zm6.016,-6.89l-2.27,-2.297c-0.246,-0.246 -0.601,-0.383 -0.929,-0.383l-5.579,-0c-0.738,-0 -1.312,0.602 -1.312,1.312l-0,11.375c-0,0.739 0.574,1.313 1.312,1.313l7.876,-0c0.71,-0 1.312,-0.574 1.312,-1.313l0,-9.078c0,-0.328 -0.164,-0.683 -0.41,-0.929Zm-3.09,-1.258l2.078,2.078l-2.078,-0l0,-2.078Zm2.188,11.265l-7.876,0l0,-11.375l4.376,0l-0.001,2.844c0,0.383 0.274,0.656 0.657,0.656l2.843,0l0,7.875Zm-3.472,-6.835c-0.137,-0.028 -0.246,0.054 -0.301,0.164l-1.477,5.168c-0.054,0.109 0.028,0.246 0.165,0.273l0.656,0.219c0.136,0.027 0.273,-0.055 0.301,-0.164l1.503,-5.168c0.028,-0.11 -0.054,-0.246 -0.164,-0.301l-0.683,-0.191Zm0.683,2.105l0,0.027l0.903,0.766l-0.903,0.793c-0.109,0.109 -0.109,0.246 -0.027,0.355l0.492,0.52c0.082,0.082 0.246,0.082 0.328,-0l1.586,-1.477c0.082,-0.109 0.082,-0.273 0,-0.355l-1.586,-1.477c-0.082,-0.082 -0.246,-0.082 -0.328,0l-0.492,0.52c-0.082,0.082 -0.082,0.246 0.027,0.328Z"
|
|
19
|
+
style="fill-rule:nonzero;"
|
|
20
|
+
/></svg>
|
|
21
|
+
</template>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg
|
|
3
|
+
width="100%"
|
|
4
|
+
height="100%"
|
|
5
|
+
viewBox="0 0 13 14"
|
|
6
|
+
version="1.1"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
9
|
+
xml:space="preserve"
|
|
10
|
+
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
|
11
|
+
><rect
|
|
12
|
+
x="0"
|
|
13
|
+
y="0"
|
|
14
|
+
width="12.25"
|
|
15
|
+
height="14"
|
|
16
|
+
style="fill:none;"
|
|
17
|
+
/><path
|
|
18
|
+
d="M3.5,4.156c0,0.137 0.082,0.219 0.219,0.219l5.687,0c0.11,0 0.219,-0.082 0.219,-0.219l0,-0.875c0,-0.109 -0.109,-0.218 -0.219,-0.218l-5.687,-0c-0.137,-0 -0.219,0.109 -0.219,0.218l-0,0.875Zm0.219,2.407l5.687,-0c0.11,-0 0.219,-0.083 0.219,-0.219l0,-0.875c0,-0.11 -0.109,-0.219 -0.219,-0.219l-5.687,0c-0.137,0 -0.219,0.109 -0.219,0.219l-0,0.875c-0,0.136 0.082,0.219 0.219,0.219Zm8.175,4.375c0.192,-0.028 0.356,-0.219 0.356,-0.438l-0,-10.062c-0,-0.219 -0.219,-0.438 -0.438,-0.438l-9.625,0c-1.23,0 -2.187,0.984 -2.187,2.188l-0,9.625c-0,1.23 0.957,2.187 2.187,2.187l9.625,0c0.219,0 0.438,-0.191 0.438,-0.437l-0,-0.438c-0,-0.191 -0.164,-0.383 -0.356,-0.41c-0.136,-0.356 -0.136,-1.422 0,-1.777Zm-1.121,-0c-0.082,0.492 -0.082,1.285 0,1.75l-8.586,-0c-0.492,-0 -0.875,-0.383 -0.875,-0.875c0,-0.465 0.383,-0.875 0.875,-0.875l8.586,-0Zm0.164,-9.625l0,8.312l-8.75,0c-0.328,0 -0.628,0.082 -0.875,0.191l0,-7.628c0,-0.465 0.383,-0.875 0.875,-0.875l8.75,-0Z"
|
|
19
|
+
style="fill-rule:nonzero;"
|
|
20
|
+
/></svg>
|
|
21
|
+
</template>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg
|
|
3
|
+
width="100%"
|
|
4
|
+
height="100%"
|
|
5
|
+
viewBox="0 0 11 14"
|
|
6
|
+
version="1.1"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
9
|
+
xml:space="preserve"
|
|
10
|
+
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
|
11
|
+
><rect
|
|
12
|
+
x="0"
|
|
13
|
+
y="0"
|
|
14
|
+
width="10.5"
|
|
15
|
+
height="14"
|
|
16
|
+
style="fill:none;"
|
|
17
|
+
/><path
|
|
18
|
+
d="M10.09,2.68l-2.27,-2.297c-0.246,-0.246 -0.601,-0.383 -0.929,-0.383l-5.579,0c-0.738,0 -1.312,0.602 -1.312,1.313l-0,11.375c-0,0.738 0.574,1.312 1.312,1.312l7.876,0c0.71,0 1.312,-0.574 1.312,-1.313l0,-9.078c0,-0.328 -0.164,-0.683 -0.41,-0.929Zm-1.012,0.82l-2.078,0l0,-2.078l2.078,2.078Zm-7.765,9.188l-0,-11.376l4.375,0l-0,2.844c-0,0.383 0.273,0.656 0.656,0.656l2.844,0l-0,7.876l-7.875,-0.001Z"
|
|
19
|
+
style="fill-rule:nonzero;"
|
|
20
|
+
/></svg>
|
|
21
|
+
</template>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg
|
|
3
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
4
|
+
viewBox="0 0 24 24"
|
|
5
|
+
fill="currentColor"
|
|
6
|
+
><path d="M2.9918 21C2.44405 21 2 20.5551 2 20.0066V3.9934C2 3.44476 2.45531 3 2.9918 3H21.0082C21.556 3 22 3.44495 22 3.9934V20.0066C22 20.5552 21.5447 21 21.0082 21H2.9918ZM20 15V5H4V19L14 9L20 15ZM20 17.8284L14 11.8284L6.82843 19H20V17.8284ZM8 11C6.89543 11 6 10.1046 6 9C6 7.89543 6.89543 7 8 7C9.10457 7 10 7.89543 10 9C10 10.1046 9.10457 11 8 11Z" /></svg>
|
|
7
|
+
</template>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg
|
|
3
|
+
width="100%"
|
|
4
|
+
height="100%"
|
|
5
|
+
viewBox="0 0 14 14"
|
|
6
|
+
version="1.1"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
9
|
+
xml:space="preserve"
|
|
10
|
+
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
|
11
|
+
><rect
|
|
12
|
+
x="0"
|
|
13
|
+
y="0"
|
|
14
|
+
width="13.986"
|
|
15
|
+
height="13.986"
|
|
16
|
+
style="fill:none;"
|
|
17
|
+
/><path
|
|
18
|
+
d="M8.593,5.394c-0.301,-0.301 -0.629,-0.52 -0.985,-0.711c-0.136,-0.055 -0.273,-0.028 -0.382,0.082l-0.11,0.109c-0.246,0.219 -0.383,0.52 -0.41,0.82c-0.027,0.137 0.055,0.274 0.164,0.356c0.192,0.082 0.492,0.273 0.629,0.437c0.902,0.903 0.902,2.352 0,3.254l-2.051,2.051c-0.902,0.902 -2.351,0.902 -3.254,0c-0.902,-0.902 -0.902,-2.352 0,-3.254l1.258,-1.258c0.082,-0.082 0.11,-0.191 0.082,-0.3c-0.054,-0.274 -0.109,-0.739 -0.137,-1.04c0,-0.273 -0.355,-0.41 -0.546,-0.218c-0.329,0.328 -0.848,0.847 -1.723,1.722c-1.504,1.504 -1.504,3.938 -0,5.414c1.477,1.504 3.91,1.504 5.414,0c2.242,-2.242 2.133,-2.132 2.297,-2.351c1.23,-1.477 1.148,-3.719 -0.246,-5.113Zm4.265,-4.266c-1.476,-1.504 -3.91,-1.504 -5.414,-0c-2.242,2.242 -2.132,2.133 -2.297,2.352c-1.23,1.476 -1.148,3.718 0.247,5.113c0.3,0.301 0.628,0.519 0.984,0.711c0.137,0.054 0.273,0.027 0.383,-0.082l0.109,-0.11c0.246,-0.218 0.383,-0.519 0.41,-0.82c0.028,-0.137 -0.054,-0.273 -0.164,-0.355c-0.191,-0.082 -0.492,-0.274 -0.629,-0.438c-0.902,-0.902 -0.902,-2.351 0,-3.254l2.051,-2.051c0.902,-0.902 2.352,-0.902 3.254,0c0.902,0.903 0.902,2.352 0,3.254l-1.258,1.258c-0.082,0.082 -0.109,0.192 -0.082,0.301c0.055,0.273 0.11,0.738 0.137,1.039c-0,0.273 0.355,0.41 0.547,0.219c0.328,-0.328 0.847,-0.848 1.722,-1.723c1.504,-1.504 1.504,-3.937 0,-5.414Z"
|
|
19
|
+
style="fill-rule:nonzero;"
|
|
20
|
+
/></svg>
|
|
21
|
+
</template>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<svg
|
|
3
|
+
width="100%"
|
|
4
|
+
height="100%"
|
|
5
|
+
viewBox="0 0 14 13"
|
|
6
|
+
version="1.1"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
9
|
+
xml:space="preserve"
|
|
10
|
+
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
|
11
|
+
><rect
|
|
12
|
+
x="0"
|
|
13
|
+
y="0"
|
|
14
|
+
width="14"
|
|
15
|
+
height="12.25"
|
|
16
|
+
style="fill:none;"
|
|
17
|
+
/><path
|
|
18
|
+
d="M12.688,0l-11.376,0c-0.738,0 -1.312,0.602 -1.312,1.313l-0,9.625c-0,0.738 0.574,1.312 1.312,1.312l11.375,0c0.711,0 1.313,-0.574 1.313,-1.313l-0,-9.625c-0,-0.71 -0.602,-1.312 -1.313,-1.312Zm-6.343,10.938l-4.867,-0.001c-0.11,0 -0.165,-0.054 -0.165,-0.164l0,-3.554l5.032,-0l-0,3.718Zm-0,-5.031l-5.032,0l0,-3.719l5.032,0l-0,3.719Zm6.179,5.031l-4.867,0l0,-3.718l5.031,-0l0,3.554c0,0.11 -0.082,0.164 -0.164,0.164Zm0.164,-5.031l-5.031,0l0,-3.719l5.031,0l0,3.719Z"
|
|
19
|
+
style="fill-rule:nonzero;"
|
|
20
|
+
/></svg>
|
|
21
|
+
</template>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="border border-gray-default relative fr-enlarge-link">
|
|
3
|
+
<div class="h-[4.5rem] pt-4 px-4 bg-blue-lighter" />
|
|
4
|
+
<div class="px-4 pb-4 pt-5 mt-2">
|
|
5
|
+
<div class="inline-flex border border-gray-default p-1.5 absolute top-4 left-4 bg-white">
|
|
6
|
+
<img
|
|
7
|
+
:src="organization.logo_thumbnail"
|
|
8
|
+
width="64"
|
|
9
|
+
height="64"
|
|
10
|
+
alt=""
|
|
11
|
+
loading="lazy"
|
|
12
|
+
>
|
|
13
|
+
</div>
|
|
14
|
+
<p class="mb-0.5 font-bold">
|
|
15
|
+
<NuxtLinkLocale
|
|
16
|
+
:to="`/organizations/${organization.slug}`"
|
|
17
|
+
>
|
|
18
|
+
<OrganizationNameWithCertificate
|
|
19
|
+
:show-type="false"
|
|
20
|
+
:organization
|
|
21
|
+
/>
|
|
22
|
+
</NuxtLinkLocale>
|
|
23
|
+
</p>
|
|
24
|
+
<div class="mb-2 flex flex-wrap items-center">
|
|
25
|
+
<OwnerType
|
|
26
|
+
v-if="type !== 'other'"
|
|
27
|
+
class="mb-0 text-sm after:content-['—'] after:ml-1"
|
|
28
|
+
:type
|
|
29
|
+
/>
|
|
30
|
+
<div>
|
|
31
|
+
<div class="text-gray-medium flex items-center text-sm gap-0.5">
|
|
32
|
+
<RiDatabase2Line class="size-4 -mt-1" /> {{ organization.metrics.datasets }}
|
|
33
|
+
<RiTerminalLine class="size-4 -mt-1 ml-1" /> {{ organization.metrics.dataservices }}
|
|
34
|
+
<RiLineChartLine class="size-4 -mt-1 ml-1" /> {{ organization.metrics.reuses }}
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
<p class="mt-1 mb-0">
|
|
39
|
+
<TextClamp
|
|
40
|
+
v-if="description"
|
|
41
|
+
:text="description"
|
|
42
|
+
:max-lines="3"
|
|
43
|
+
/>
|
|
44
|
+
</p>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</template>
|
|
48
|
+
|
|
49
|
+
<script setup lang="ts">
|
|
50
|
+
import { RiLineChartLine, RiDatabase2Line, RiTerminalLine } from '@remixicon/vue'
|
|
51
|
+
import { computed, ref, watchEffect } from 'vue'
|
|
52
|
+
import { removeMarkdown } from '../functions/markdown'
|
|
53
|
+
import { getOrganizationType } from '../functions/organizations'
|
|
54
|
+
import type { Organization } from '../types/organizations'
|
|
55
|
+
import OwnerType from './OwnerType.vue'
|
|
56
|
+
import OrganizationNameWithCertificate from './OrganizationNameWithCertificate.vue'
|
|
57
|
+
|
|
58
|
+
const props = defineProps<{
|
|
59
|
+
organization: Organization
|
|
60
|
+
}>()
|
|
61
|
+
|
|
62
|
+
const type = computed(() => getOrganizationType(props.organization))
|
|
63
|
+
|
|
64
|
+
const description = ref('')
|
|
65
|
+
watchEffect(async () => {
|
|
66
|
+
description.value = await removeMarkdown(props.organization.description)
|
|
67
|
+
})
|
|
68
|
+
</script>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="flex gap-1 items-center truncate">
|
|
3
|
+
<OwnerTypeIcon
|
|
4
|
+
v-if="showType"
|
|
5
|
+
:type="getOrganizationType(organization)"
|
|
6
|
+
/>
|
|
7
|
+
<div
|
|
8
|
+
class="mb-0 truncate flex-initial"
|
|
9
|
+
:class="{ 'text-sm': size === 'sm' }"
|
|
10
|
+
>
|
|
11
|
+
{{ organization.name }}
|
|
12
|
+
</div>
|
|
13
|
+
<RiCheckboxCircleLine
|
|
14
|
+
v-if="isOrganizationCertified(organization)"
|
|
15
|
+
class="flex-none"
|
|
16
|
+
:class="{
|
|
17
|
+
'size-4': size === 'sm',
|
|
18
|
+
'size-5': size === 'base',
|
|
19
|
+
}"
|
|
20
|
+
:title="t('The identity of this public service is certified by {certifier}', { certifier: config.name })"
|
|
21
|
+
aria-hidden="true"
|
|
22
|
+
/>
|
|
23
|
+
</div>
|
|
24
|
+
</template>
|
|
25
|
+
|
|
26
|
+
<script setup lang="ts">
|
|
27
|
+
import { RiCheckboxCircleLine } from '@remixicon/vue'
|
|
28
|
+
import { useI18n } from 'vue-i18n'
|
|
29
|
+
import { getOrganizationType, isOrganizationCertified } from '../functions/organizations'
|
|
30
|
+
import type { Organization } from '../types/organizations'
|
|
31
|
+
import { useComponentsConfig } from '../config'
|
|
32
|
+
import OwnerTypeIcon from './OwnerTypeIcon.vue'
|
|
33
|
+
|
|
34
|
+
const config = useComponentsConfig()
|
|
35
|
+
|
|
36
|
+
const { t } = useI18n()
|
|
37
|
+
withDefaults(defineProps<{
|
|
38
|
+
organization: Organization
|
|
39
|
+
showType?: boolean
|
|
40
|
+
size?: 'base' | 'sm'
|
|
41
|
+
}>(), {
|
|
42
|
+
showType: true,
|
|
43
|
+
size: 'base',
|
|
44
|
+
})
|
|
45
|
+
</script>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div :class="`${colorClass} flex items-center gap-1`">
|
|
3
|
+
<OwnerTypeIcon
|
|
4
|
+
:type="type"
|
|
5
|
+
class="size-4 -mt-1"
|
|
6
|
+
/>
|
|
7
|
+
<div :class="sizeClass">
|
|
8
|
+
{{ name }}
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script setup lang="ts">
|
|
14
|
+
import { computed } from 'vue'
|
|
15
|
+
import { findOrganizationType, type OrganizationTypes, type UserType } from '../functions/organizations'
|
|
16
|
+
import OwnerTypeIcon from './OwnerTypeIcon.vue'
|
|
17
|
+
|
|
18
|
+
const props = withDefaults(defineProps<{
|
|
19
|
+
type: OrganizationTypes | UserType
|
|
20
|
+
size?: 'base' | 'sm' | 'xs'
|
|
21
|
+
color?: 'black' | 'gray'
|
|
22
|
+
}>(), {
|
|
23
|
+
size: 'sm',
|
|
24
|
+
color: 'gray',
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
const colorClass = computed(() => {
|
|
28
|
+
return {
|
|
29
|
+
black: 'text-gray-title',
|
|
30
|
+
gray: 'text-gray-medium',
|
|
31
|
+
}[props.color]
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
const sizeClass = computed(() => {
|
|
35
|
+
return {
|
|
36
|
+
base: 'text-base',
|
|
37
|
+
sm: 'text-sm',
|
|
38
|
+
xs: 'text-xs',
|
|
39
|
+
}[props.size]
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
const name = computed(() => findOrganizationType(props.type).label)
|
|
43
|
+
</script>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<component
|
|
3
|
+
:is="icon"
|
|
4
|
+
v-if="icon"
|
|
5
|
+
class="size-3.5 flex-none"
|
|
6
|
+
/>
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<script setup lang="ts">
|
|
10
|
+
import { computed } from 'vue'
|
|
11
|
+
import { findOrganizationType, type OrganizationTypes, type UserType } from '../functions/organizations'
|
|
12
|
+
|
|
13
|
+
const props = defineProps<{
|
|
14
|
+
type: OrganizationTypes | UserType
|
|
15
|
+
}>()
|
|
16
|
+
|
|
17
|
+
const icon = computed(() => findOrganizationType(props.type).icon)
|
|
18
|
+
</script>
|