@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.
Files changed (119) hide show
  1. package/README.md +150 -0
  2. package/assets/main.css +136 -0
  3. package/assets/placeholders/author.png +0 -0
  4. package/assets/placeholders/dataset.png +0 -0
  5. package/assets/placeholders/news.png +0 -0
  6. package/assets/placeholders/organization.png +0 -0
  7. package/assets/placeholders/reuse.png +0 -0
  8. package/assets/tailwind.config.js +24 -0
  9. package/dist/components.css +2 -0
  10. package/dist/locales/de.js +155 -0
  11. package/dist/locales/en.js +155 -0
  12. package/dist/locales/es.js +155 -0
  13. package/dist/locales/fr.js +155 -0
  14. package/dist/locales/it.js +155 -0
  15. package/dist/locales/pt.js +155 -0
  16. package/dist/locales/sr.js +155 -0
  17. package/package.json +72 -0
  18. package/src/components/AppLink.vue +51 -0
  19. package/src/components/Avatar.vue +27 -0
  20. package/src/components/AvatarWithName.vue +26 -0
  21. package/src/components/BannerAction.vue +39 -0
  22. package/src/components/BrandedButton.vue +170 -0
  23. package/src/components/CopyButton.vue +84 -0
  24. package/src/components/DataserviceCard.vue +184 -0
  25. package/src/components/DatasetCard.vue +198 -0
  26. package/src/components/DatasetInformationPanel.vue +210 -0
  27. package/src/components/DatasetQuality.vue +68 -0
  28. package/src/components/DatasetQualityInline.vue +32 -0
  29. package/src/components/DatasetQualityItem.vue +32 -0
  30. package/src/components/DatasetQualityItemWarning.vue +21 -0
  31. package/src/components/DatasetQualityScore.vue +35 -0
  32. package/src/components/DatasetQualityTooltipContent.vue +79 -0
  33. package/src/components/DescriptionDetails.vue +23 -0
  34. package/src/components/DescriptionList/DescriptionDetails.stories.ts +43 -0
  35. package/src/components/DescriptionList/DescriptionList.stories.ts +47 -0
  36. package/src/components/DescriptionList/DescriptionTerm.stories.ts +28 -0
  37. package/src/components/DescriptionList.vue +8 -0
  38. package/src/components/DescriptionTerm.vue +8 -0
  39. package/src/components/ExtraAccordion.vue +78 -0
  40. package/src/components/Icons/Archive.vue +21 -0
  41. package/src/components/Icons/Code.vue +21 -0
  42. package/src/components/Icons/Documentation.vue +21 -0
  43. package/src/components/Icons/File.vue +21 -0
  44. package/src/components/Icons/Image.vue +7 -0
  45. package/src/components/Icons/Link.vue +21 -0
  46. package/src/components/Icons/Table.vue +21 -0
  47. package/src/components/OrganizationCard.vue +68 -0
  48. package/src/components/OrganizationNameWithCertificate.vue +45 -0
  49. package/src/components/OwnerType.vue +43 -0
  50. package/src/components/OwnerTypeIcon.vue +18 -0
  51. package/src/components/Pagination.vue +205 -0
  52. package/src/components/Placeholder.vue +29 -0
  53. package/src/components/ReadMore.vue +107 -0
  54. package/src/components/ResourceAccordion/DataStructure.vue +87 -0
  55. package/src/components/ResourceAccordion/EditButton.vue +34 -0
  56. package/src/components/ResourceAccordion/Metadata.vue +171 -0
  57. package/src/components/ResourceAccordion/Preview.vue +229 -0
  58. package/src/components/ResourceAccordion/PreviewLoader.vue +148 -0
  59. package/src/components/ResourceAccordion/ResourceAccordion.vue +484 -0
  60. package/src/components/ResourceAccordion/ResourceIcon.vue +16 -0
  61. package/src/components/ResourceAccordion/SchemaBadge.vue +148 -0
  62. package/src/components/ResourceAccordion/SchemaLoader.vue +30 -0
  63. package/src/components/ResourceAccordion/Swagger.vue +46 -0
  64. package/src/components/ResourceAccordion/france.svg +1 -0
  65. package/src/components/ReuseCard.vue +106 -0
  66. package/src/components/ReuseDetails.vue +45 -0
  67. package/src/components/SimpleBanner.vue +24 -0
  68. package/src/components/SmallChart.vue +149 -0
  69. package/src/components/StatBox.vue +100 -0
  70. package/src/components/Tabs/Tab.vue +62 -0
  71. package/src/components/Tabs/TabGroup.vue +20 -0
  72. package/src/components/Tabs/TabList.vue +15 -0
  73. package/src/components/Tabs/TabPanel.vue +7 -0
  74. package/src/components/Tabs/TabPanels.vue +7 -0
  75. package/src/components/Toggletip.vue +62 -0
  76. package/src/components/ToggletipButton.vue +14 -0
  77. package/src/composables/useActiveDescendant.ts +103 -0
  78. package/src/composables/useReuseType.ts +14 -0
  79. package/src/config.ts +33 -0
  80. package/src/functions/api.ts +96 -0
  81. package/src/functions/api.types.ts +41 -0
  82. package/src/functions/config.ts +12 -0
  83. package/src/functions/datasets.ts +24 -0
  84. package/src/functions/dates.ts +85 -0
  85. package/src/functions/helpers.ts +38 -0
  86. package/src/functions/markdown.ts +47 -0
  87. package/src/functions/matomo.ts +3 -0
  88. package/src/functions/organizations.ts +85 -0
  89. package/src/functions/owned.ts +11 -0
  90. package/src/functions/resources.ts +99 -0
  91. package/src/functions/reuses.ts +28 -0
  92. package/src/functions/schemas.ts +96 -0
  93. package/src/functions/tabularApi.ts +27 -0
  94. package/src/functions/users.ts +7 -0
  95. package/src/locales/de.json +154 -0
  96. package/src/locales/en.json +154 -0
  97. package/src/locales/es.json +154 -0
  98. package/src/locales/fr.json +154 -0
  99. package/src/locales/it.json +154 -0
  100. package/src/locales/pt.json +154 -0
  101. package/src/locales/sr.json +154 -0
  102. package/src/main.ts +147 -0
  103. package/src/types/badges.ts +5 -0
  104. package/src/types/contact_point.ts +7 -0
  105. package/src/types/dataservices.ts +68 -0
  106. package/src/types/datasets.ts +80 -0
  107. package/src/types/frequency.ts +6 -0
  108. package/src/types/granularity.ts +6 -0
  109. package/src/types/harvest.ts +3 -0
  110. package/src/types/keyboard.ts +1 -0
  111. package/src/types/licenses.ts +9 -0
  112. package/src/types/organizations.ts +41 -0
  113. package/src/types/owned.ts +9 -0
  114. package/src/types/resources.ts +37 -0
  115. package/src/types/reuses.ts +49 -0
  116. package/src/types/site.ts +23 -0
  117. package/src/types/topics.ts +20 -0
  118. package/src/types/ui.ts +3 -0
  119. 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,8 @@
1
+ <template>
2
+ <dl class="fr-my-0">
3
+ <slot />
4
+ </dl>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ </script>
@@ -0,0 +1,8 @@
1
+ <template>
2
+ <dt class="fr-text--sm fr-my-0 fr-text--bold">
3
+ <slot />
4
+ </dt>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ </script>
@@ -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>