@datagouv/components-next 0.0.30 → 0.0.32

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 (51) hide show
  1. package/README.md +41 -2
  2. package/assets/main.css +4 -0
  3. package/dist/{JsonPreview.client-DEoTeNS0.js → JsonPreview.client-BRhCOHlE.js} +12 -12
  4. package/dist/{MapContainer.client-CNmXA5i0.js → MapContainer.client-Dhfz-YU8.js} +1 -1
  5. package/dist/{PdfPreview.client-CsVdmxPR.js → PdfPreview.client--W0FK7CN.js} +5 -5
  6. package/dist/{Pmtiles.client-GgcBwFa0.js → Pmtiles.client-B6vRTwrm.js} +1 -1
  7. package/dist/Swagger.client-ch5H8aT2.js +4 -0
  8. package/dist/{XmlPreview.client-C0lxnMVl.js → XmlPreview.client-BcbnRWAp.js} +14 -14
  9. package/dist/components-next.css +1 -1
  10. package/dist/components-next.js +73 -59
  11. package/dist/components.css +1 -1
  12. package/dist/{main-D5CXGAAc.js → main-yWiuApVL.js} +13683 -13594
  13. package/dist/{vue3-xml-viewer.common-WmBgOZ5X.js → vue3-xml-viewer.common-1QyofKqS.js} +1 -1
  14. package/package.json +1 -1
  15. package/src/components/Avatar.vue +2 -1
  16. package/src/components/BrandedButton.vue +4 -1
  17. package/src/components/ClientOnly.vue +17 -0
  18. package/src/components/DataserviceCard.vue +50 -78
  19. package/src/components/DatasetCard.vue +6 -11
  20. package/src/components/DatasetInformationPanel.vue +1 -1
  21. package/src/components/DatasetQuality.vue +1 -3
  22. package/src/components/DatasetQualityInline.vue +3 -3
  23. package/src/components/ExtraAccordion.vue +1 -4
  24. package/src/components/OrganizationCard.vue +9 -7
  25. package/src/components/OwnerType.vue +1 -1
  26. package/src/components/Placeholder.vue +9 -3
  27. package/src/components/ResourceAccordion/DataStructure.vue +6 -5
  28. package/src/components/ResourceAccordion/JsonPreview.client.vue +5 -5
  29. package/src/components/ResourceAccordion/PdfPreview.client.vue +3 -3
  30. package/src/components/ResourceAccordion/Preview.vue +5 -5
  31. package/src/components/ResourceAccordion/ResourceAccordion.vue +2 -2
  32. package/src/components/ResourceAccordion/SchemaBadge.vue +7 -3
  33. package/src/components/ResourceAccordion/XmlPreview.client.vue +5 -5
  34. package/src/components/Tabs/TabGroup.vue +13 -1
  35. package/src/components/Toggletip.vue +75 -47
  36. package/src/components/ValueWatcher.vue +18 -0
  37. package/src/composables/useActiveDescendant.ts +1 -1
  38. package/src/composables/useReuseType.ts +2 -1
  39. package/src/config.ts +5 -4
  40. package/src/functions/datasets.ts +1 -1
  41. package/src/functions/organizations.ts +14 -0
  42. package/src/functions/reuses.ts +10 -7
  43. package/src/functions/schemas.ts +32 -31
  44. package/src/functions/tabularApi.ts +2 -3
  45. package/src/functions/users.ts +2 -2
  46. package/src/main.ts +24 -6
  47. package/src/types/dataservices.ts +1 -0
  48. package/src/types/datasets.ts +1 -0
  49. package/src/types/site.ts +3 -0
  50. package/dist/Swagger.client-2tUSrvmQ.js +0 -4
  51. package/src/components/ToggletipButton.vue +0 -14
@@ -4,6 +4,8 @@
4
4
  :class="{
5
5
  'tabs-sm': size === 'sm',
6
6
  }"
7
+ :default-index="props.defaultIndex"
8
+ @change="onChange"
7
9
  >
8
10
  <slot />
9
11
  </TabGroup>
@@ -12,9 +14,19 @@
12
14
  <script setup lang="ts">
13
15
  import { TabGroup } from '@headlessui/vue'
14
16
 
15
- withDefaults(defineProps<{
17
+ const props = withDefaults(defineProps<{
16
18
  size?: 'sm' | 'md'
19
+ defaultIndex?: number
17
20
  }>(), {
18
21
  size: 'md',
22
+ defaultIndex: 0,
19
23
  })
24
+
25
+ const emit = defineEmits<{
26
+ change: [value: number]
27
+ }>()
28
+
29
+ const onChange = (index: number) => {
30
+ emit('change', index)
31
+ }
20
32
  </script>
@@ -1,62 +1,90 @@
1
1
  <template>
2
2
  <Popover
3
- v-slot="{ open }"
4
- class="relative text-gray-title"
5
- :focus="true"
3
+ v-slot="{ open, close }"
4
+ ref="popover"
5
+ class="relative"
6
6
  >
7
+ <!--
8
+ Little trick to watch for v-slot changes because HeadlessUI doesn't raise an event on open… :-(
9
+ Need to recompute on show because sometimes, the positions where incorrect because after first render, some div load and change the relative position of the button…
10
+ -->
11
+ <ValueWatcher
12
+ :value="open"
13
+ @changed="calculatePanelPosition"
14
+ />
7
15
  <PopoverButton
8
- v-bind="$attrs"
9
- ref="button"
10
- :as="ToggletipButton"
16
+ v-bind="buttonProps"
17
+ class="w-8 h-8 rounded-full -outline-offset-2 inline-flex items-center justify-center bg-transparent border-transparent hover:!bg-gray-some"
11
18
  >
12
- <slot />
19
+ <slot>
20
+ <RiInformationLine class="size-5" />
21
+ </slot>
13
22
  </PopoverButton>
14
- <component
15
- :is="teleportId ? Teleport : 'div'"
16
- v-if="open"
17
- :to="`#${teleportId}`"
18
- :defer="teleportId ? true : undefined"
19
- >
20
- <PopoverPanel
21
- ref="toggletip"
22
- v-slot="{ close }"
23
- class="toggletip"
24
- :class="{
25
- 'p-0': noMargin,
26
- 'left-0': position === 'right',
27
- 'ml-6 top-24': teleportId,
28
- }"
29
- >
30
- <slot
31
- name="toggletip"
32
- :close
33
- />
34
- </PopoverPanel>
35
- </component>
23
+
24
+ <ClientOnly>
25
+ <Teleport to="#tooltips">
26
+ <PopoverPanel
27
+ v-show="open"
28
+ class="toggletip absolute z-10"
29
+ :class="{
30
+ 'p-0': noMargin,
31
+ }"
32
+ :style="panelStyle"
33
+ static
34
+ >
35
+ <slot
36
+ name="toggletip"
37
+ :close
38
+ />
39
+ </PopoverPanel>
40
+ </Teleport>
41
+ </ClientOnly>
36
42
  </Popover>
37
43
  </template>
38
44
 
39
45
  <script setup lang="ts">
40
46
  import { Popover, PopoverButton, PopoverPanel } from '@headlessui/vue'
41
- import { Teleport } from 'vue'
42
- import ToggletipButton from './ToggletipButton.vue'
47
+ import { nextTick, onBeforeUnmount, onMounted, onUpdated, ref, useTemplateRef } from 'vue'
48
+ import { RiInformationLine } from '@remixicon/vue'
49
+ import ClientOnly from './ClientOnly.vue'
50
+ import ValueWatcher from './ValueWatcher.vue'
43
51
 
44
- withDefaults(defineProps<{
52
+ defineProps<{
53
+ buttonProps?: object
45
54
  noMargin?: boolean
46
- position?: 'left' | 'right'
47
- teleportId?: string
48
- }>(), {
49
- noMargin: false,
50
- position: 'left',
55
+ }>()
56
+
57
+ const popoverRef = useTemplateRef('popover')
58
+ const panelStyle = ref({})
59
+
60
+ // Since the parent of the component can have an overflow-hidden
61
+ // we teleport the popover to a #tooltips div in the layout.
62
+ // We need to compute the correct position of the tooltip.
63
+ const calculatePanelPosition = () => {
64
+ nextTick(() => {
65
+ const popover = popoverRef.value?.$el
66
+
67
+ if (!popover) {
68
+ console.error('Cannot find the popover of the Toggletip.)')
69
+ return
70
+ }
71
+ console.log(popover)
72
+ const popoverRect = popover.getBoundingClientRect()
73
+ panelStyle.value = {
74
+ left: `${popoverRect.left + window.scrollX}px`,
75
+ top: `${popoverRect.bottom + window.scrollY}px`,
76
+ }
77
+ })
78
+ }
79
+
80
+ onMounted(() => {
81
+ calculatePanelPosition()
82
+ window.addEventListener('resize', calculatePanelPosition)
51
83
  })
52
- defineOptions({ inheritAttrs: false })
53
- </script>
54
84
 
55
- <style scoped>
56
- .z-10 {
57
- z-index: 10;
58
- }
59
- .left-0 {
60
- left: 0;
61
- }
62
- </style>
85
+ onBeforeUnmount(() => {
86
+ window.removeEventListener('resize', calculatePanelPosition)
87
+ })
88
+
89
+ onUpdated(() => calculatePanelPosition())
90
+ </script>
@@ -0,0 +1,18 @@
1
+ <template>
2
+ <slot />
3
+ </template>
4
+
5
+ <script setup lang="ts" generic="T">
6
+ import { watch } from 'vue'
7
+
8
+ const props = defineProps<{
9
+ value: T
10
+ }>()
11
+ const emits = defineEmits<{
12
+ changed: [T]
13
+ }>()
14
+
15
+ watch(() => props.value, () => {
16
+ emits('changed', props.value)
17
+ })
18
+ </script>
@@ -5,7 +5,7 @@ export type Option = {
5
5
  id: string
6
6
  }
7
7
 
8
- export default function useActiveDescendant<T extends Option>(options: MaybeRefOrGetter<Array<T>>, direction: 'horizontal' | 'vertical') {
8
+ export function useActiveDescendant<T extends Option>(options: MaybeRefOrGetter<Array<T>>, direction: 'horizontal' | 'vertical') {
9
9
  const active = ref<string | undefined>()
10
10
 
11
11
  const activeOption = computed<T | undefined>(() => toValue(options).find(option => option.id === active.value))
@@ -1,8 +1,9 @@
1
1
  import { computedAsync } from '@vueuse/core'
2
2
  import { toValue, type MaybeRefOrGetter } from 'vue'
3
- import { fetchReuseTypes, getType } from '../functions/reuses'
3
+ import { useFetchReuseTypes, getType } from '../functions/reuses'
4
4
 
5
5
  export function useReuseType(id: MaybeRefOrGetter<string>) {
6
+ const fetchReuseTypes = useFetchReuseTypes()
6
7
  const label = computedAsync(async () => {
7
8
  const idValue = toValue(id)
8
9
  const types = await fetchReuseTypes()
package/src/config.ts CHANGED
@@ -7,19 +7,20 @@ export type PluginConfig = {
7
7
  apiBase: string
8
8
  devApiKey?: string | null
9
9
  datasetQualityGuideUrl?: string
10
+ maxJsonPreviewCharSize?: number // Maximum size of JSON to preview in characters. JSON preview module is partly collapsed by default so we can have a preview for large files.
11
+ maxPdfPreviewByteSize?: number // Maximum size of PDF to preview in bytes
12
+ maxXmlPreviewCharSize?: number // Maximum size of XML to preview in characters. XML preview module can NOT be collapsed by default so we should not have a preview for large files.
13
+ pmtilesViewerBaseUrl?: string | null // Base URL of a pmtiles viewer (ex: https://pmtiles.io/#url=)
10
14
  schemaValidataUrl?: string
11
15
  schemaDocumentationUrl?: string
12
16
  tabularApiUrl?: string
13
17
  tabularApiPageSize?: number
14
18
  tabularAllowRemote?: boolean
15
19
  tabularApiDataserviceId?: string
16
- pmtilesViewerBaseUrl?: string | null // Base URL of a pmtiles viewer (ex: https://pmtiles.io/#url=)
17
20
  customUseFetch?: UseFetchFunction | null
18
21
  textClamp?: string | Component | null
19
22
  appLink?: Component | null
20
- maxJsonPreviewSize?: number // Maximum size of JSON to preview in characters
21
- maxPdfPreviewSize?: number // Maximum size of PDF to preview in bytes
22
- maxXmlPreviewSize?: number // Maximum size of XML to preview in characters
23
+ clientOnly?: Component | null
23
24
  }
24
25
 
25
26
  export const configKey = Symbol() as InjectionKey<PluginConfig>
@@ -8,7 +8,7 @@ function constructUrl(baseUrl: string, path: string): string {
8
8
  return url.toString()
9
9
  }
10
10
 
11
- export default function getDatasetOEmbedHtml(type: string, id: string): string {
11
+ export function getDatasetOEmbedHtml(type: string, id: string): string {
12
12
  const config = useComponentsConfig()
13
13
 
14
14
  const staticUrl = constructUrl(config.baseUrl, 'oembed.js')
@@ -1,6 +1,7 @@
1
1
  import { useI18n } from 'vue-i18n'
2
2
  import type { Component } from 'vue'
3
3
  import { RiBankLine, RiBuilding2Line, RiCommunityLine, RiGovernmentLine, RiUserLine } from '@remixicon/vue'
4
+ import { useComponentsConfig } from '../config'
4
5
  import type { Organization } from '../types/organizations'
5
6
 
6
7
  export const CERTIFIED = 'certified'
@@ -15,6 +16,12 @@ export type OrganizationTypes = typeof PUBLIC_SERVICE | typeof ASSOCIATION | typ
15
16
 
16
17
  export type UserType = typeof USER
17
18
 
19
+ function constructUrl(baseUrl: string, path: string): string {
20
+ const url = new URL(baseUrl)
21
+ url.pathname = `${url.pathname}${path}`
22
+ return url.toString()
23
+ }
24
+
18
25
  export function isType(organization: Organization, type: OrganizationTypes) {
19
26
  return hasBadge(organization, type)
20
27
  }
@@ -83,3 +90,10 @@ export function isOrganizationCertified(organization: Organization | null): bool
83
90
  if (!organization) return false
84
91
  return hasBadge(organization, CERTIFIED) && (isType(organization, PUBLIC_SERVICE) || isType(organization, LOCAL_AUTHORITY))
85
92
  }
93
+
94
+ export function getOrganizationOEmbedHtml(type: string, id: string): string {
95
+ const config = useComponentsConfig()
96
+
97
+ const staticUrl = constructUrl(config.baseUrl, 'oembed.js')
98
+ return `<div data-udata-${type}="${id}" data-height="1500" data-width="1200"></div><script data-udata="${config.baseUrl}" src="${staticUrl}" async defer></script>`
99
+ }
@@ -4,17 +4,20 @@ import { useComponentsConfig } from '../config'
4
4
  import type { ReuseTopic, ReuseType } from '../types/reuses'
5
5
 
6
6
  let reuseTypesRequest: Promise<Array<ReuseType>> | null = null
7
+ export function useFetchReuseTypes() {
8
+ const config = useComponentsConfig()
9
+ const { locale } = useI18n()
7
10
 
8
- export async function fetchReuseTypes() {
9
- if (!reuseTypesRequest) {
10
- const config = useComponentsConfig()
11
- const { locale } = useI18n()
12
- reuseTypesRequest = ofetch<Array<ReuseType>>('api/1/reuses/types/', {
11
+ return async (): Promise<Array<ReuseType>> => {
12
+ if (reuseTypesRequest) {
13
+ return reuseTypesRequest
14
+ }
15
+
16
+ return await (reuseTypesRequest = ofetch<Array<ReuseType>>('api/1/reuses/types/', {
13
17
  baseURL: config.apiBase,
14
18
  query: { lang: locale.value },
15
- })
19
+ }))
16
20
  }
17
- return await reuseTypesRequest
18
21
  }
19
22
 
20
23
  export function getType(types: Array<ReuseType>, id: string): string {
@@ -45,20 +45,19 @@ export type SchemaResponseData = Array<RegisteredSchema>
45
45
 
46
46
  type SchemaPath = { schema_name: string } | { schema_url: string }
47
47
 
48
- const catalogRequest: Promise<Array<RegisteredSchema>> | null = null
49
-
50
- /**
51
- * Get Schema Catalog
52
- */
53
- export async function getCatalog(): Promise<SchemaResponseData> {
48
+ let catalogRequest: Promise<Array<RegisteredSchema>> | null = null
49
+ export function useGetCatalog() {
54
50
  const config = useComponentsConfig()
55
- if (catalogRequest) {
56
- return catalogRequest
57
- }
58
51
 
59
- return await ofetch('api/1/datasets/schemas/', {
60
- baseURL: config.apiBase,
61
- })
52
+ return async (): Promise<SchemaResponseData> => {
53
+ if (catalogRequest) {
54
+ return catalogRequest
55
+ }
56
+
57
+ return await (catalogRequest = ofetch('api/1/datasets/schemas/', {
58
+ baseURL: config.apiBase,
59
+ }))
60
+ }
62
61
  }
63
62
 
64
63
  export function findSchemaInCatalog(catalog: Array<RegisteredSchema>, schema: Schema | null): RegisteredSchema | null {
@@ -66,30 +65,32 @@ export function findSchemaInCatalog(catalog: Array<RegisteredSchema>, schema: Sc
66
65
  return catalog.find(registeredSchema => schema.name === registeredSchema.name) || null
67
66
  }
68
67
 
69
- export function getSchemaDocumentation(name: string): string {
68
+ export function useGetSchemaDocumentation() {
70
69
  const config = useComponentsConfig()
71
- return `${config.schemaDocumentationUrl}${name}/`
70
+ return (name: string) => `${config.schemaDocumentationUrl}${name}/`
72
71
  }
73
72
 
74
- export function getSchemaValidationUrl(resource: Resource, registeredSchema: RegisteredSchema): string | null {
73
+ export function useGetSchemaValidationUrl() {
75
74
  const config = useComponentsConfig()
76
- if (!resource.schema || !resource.schema.name) {
77
- return null
78
- }
75
+ return (resource: Resource, registeredSchema: RegisteredSchema) => {
76
+ if (!resource.schema || !resource.schema.name) {
77
+ return null
78
+ }
79
79
 
80
- let schemaPath: SchemaPath = { schema_name: `schema-datagouvfr.${resource.schema.name}` }
81
- if (resource.schema && resource.schema.version) {
82
- const schemaVersion = resource.schema.version
83
- const versionUrl = registeredSchema.versions.find(version => version.version_name === schemaVersion)?.schema_url
84
- if (versionUrl) {
85
- schemaPath = { schema_url: versionUrl }
80
+ let schemaPath: SchemaPath = { schema_name: `schema-datagouvfr.${resource.schema.name}` }
81
+ if (resource.schema && resource.schema.version) {
82
+ const schemaVersion = resource.schema.version
83
+ const versionUrl = registeredSchema.versions.find(version => version.version_name === schemaVersion)?.schema_url
84
+ if (versionUrl) {
85
+ schemaPath = { schema_url: versionUrl }
86
+ }
86
87
  }
88
+ const query = new URLSearchParams({
89
+ 'input': 'url',
90
+ 'url': resource.url,
91
+ 'header-case': 'on',
92
+ ...schemaPath,
93
+ }).toString()
94
+ return `${config.schemaValidataUrl}/table-schema?${query}`
87
95
  }
88
- const query = new URLSearchParams({
89
- 'input': 'url',
90
- 'url': resource.url,
91
- 'header-case': 'on',
92
- ...schemaPath,
93
- }).toString()
94
- return `${config.schemaValidataUrl}/table-schema?${query}`
95
96
  }
@@ -20,8 +20,7 @@ export async function getData(config: PluginConfig, id: string, page: number, so
20
20
  /**
21
21
  * Call Tabular-api to get table profile
22
22
  */
23
- export async function getProfile(id: string) {
23
+ export function useGetProfile() {
24
24
  const config = useComponentsConfig()
25
-
26
- return await ofetch(`${config.tabularApiUrl}/api/resources/${id}/profile/`)
25
+ return (id: string) => ofetch(`${config.tabularApiUrl}/api/resources/${id}/profile/`)
27
26
  }
@@ -1,7 +1,7 @@
1
1
  import type { User } from '../types/users'
2
2
  import { useComponentsConfig } from '../config'
3
3
 
4
- export function getUserAvatar(user: User, size: number) {
4
+ export function useGetUserAvatar() {
5
5
  const config = useComponentsConfig()
6
- return user.avatar_thumbnail || `${config.apiBase}/api/1/avatars/${user.id}/${size}`
6
+ return (user: User, size: number) => user.avatar_thumbnail || `${config.apiBase}/api/1/avatars/${user.id}/${size}`
7
7
  }
package/src/main.ts CHANGED
@@ -33,6 +33,7 @@ import DatasetQualityInline from './components/DatasetQualityInline.vue'
33
33
  import DatasetQualityItem from './components/DatasetQualityItem.vue'
34
34
  import DatasetQualityScore from './components/DatasetQualityScore.vue'
35
35
  import DatasetQualityTooltipContent from './components/DatasetQualityTooltipContent.vue'
36
+ import ExtraAccordion from './components/ExtraAccordion.vue'
36
37
  import OrganizationCard from './components/OrganizationCard.vue'
37
38
  import OrganizationNameWithCertificate from './components/OrganizationNameWithCertificate.vue'
38
39
  import OwnerType from './components/OwnerType.vue'
@@ -44,25 +45,34 @@ import ResourceAccordion from './components/ResourceAccordion/ResourceAccordion.
44
45
  import ResourceIcon from './components/ResourceAccordion/ResourceIcon.vue'
45
46
  import Swagger from './components/ResourceAccordion/Swagger.client.vue'
46
47
  import ReuseCard from './components/ReuseCard.vue'
48
+ import ReuseDetails from './components/ReuseDetails.vue'
47
49
  import SimpleBanner from './components/SimpleBanner.vue'
48
50
  import StatBox from './components/StatBox.vue'
51
+ import Tab from './components/Tabs/Tab.vue'
52
+ import TabGroup from './components/Tabs/TabGroup.vue'
53
+ import TabList from './components/Tabs/TabList.vue'
54
+ import TabPanel from './components/Tabs/TabPanel.vue'
55
+ import TabPanels from './components/Tabs/TabPanels.vue'
49
56
  import Tooltip from './components/Tooltip.vue'
57
+ import Toggletip from './components/Toggletip.vue'
50
58
  import type { UseFetchFunction } from './functions/api.types'
51
59
  import { configKey, useComponentsConfig, type PluginConfig } from './config.js'
52
60
 
61
+ export * from './composables/useActiveDescendant'
53
62
  export * from './composables/useReuseType'
54
63
 
55
- export * from './functions/dates'
56
- export * from './functions/organizations'
57
- export * from './functions/resources'
58
- export * from './functions/users'
59
64
  export * from './functions/datasets'
60
- export * from './functions/owned'
65
+ export * from './functions/dates'
61
66
  export * from './functions/helpers'
67
+ export * from './functions/markdown'
62
68
  export * from './functions/matomo'
63
69
  export * from './functions/never'
70
+ export * from './functions/organizations'
71
+ export * from './functions/owned'
72
+ export * from './functions/resources'
73
+ export * from './functions/reuses'
64
74
  export * from './functions/schemas'
65
- export * from './functions/markdown'
75
+ export * from './functions/users'
66
76
 
67
77
  export type {
68
78
  UseFetchFunction,
@@ -158,6 +168,7 @@ export {
158
168
  DatasetQualityScore,
159
169
  DatasetQualityTooltipContent,
160
170
  DateRangeDetails,
171
+ ExtraAccordion,
161
172
  OrganizationCard,
162
173
  OrganizationNameWithCertificate,
163
174
  OwnerType,
@@ -168,8 +179,15 @@ export {
168
179
  ResourceAccordion,
169
180
  ResourceIcon,
170
181
  ReuseCard,
182
+ ReuseDetails,
171
183
  SimpleBanner,
172
184
  StatBox,
173
185
  Swagger,
186
+ Tab,
187
+ TabGroup,
188
+ TabList,
189
+ TabPanel,
190
+ TabPanels,
174
191
  Tooltip,
192
+ Toggletip,
175
193
  }
@@ -53,6 +53,7 @@ export type Dataservice = Owned & {
53
53
  }>
54
54
  deleted_at: string | null
55
55
  description: string
56
+ featured: boolean
56
57
  machine_documentation_url: string | null
57
58
  technical_documentation_url: string | null
58
59
  business_documentation_url: string | null
@@ -69,6 +69,7 @@ export type Dataset = BaseDataset & {
69
69
  slug: string
70
70
  quality: Quality
71
71
  metrics: {
72
+ dataservices: number
72
73
  discussions: number
73
74
  discussions_open: number
74
75
  followers: number
package/src/types/site.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  export type Site = {
2
2
  id: string
3
3
  title: string
4
+ datasets_page: string | null
5
+ reuses_page: string | null
6
+ dataservices_page: string | null
4
7
  metrics: {
5
8
  'dataservices': number
6
9
  'datasets': number
@@ -1,4 +0,0 @@
1
- import { _ as f } from "./main-D5CXGAAc.js";
2
- export {
3
- f as default
4
- };
@@ -1,14 +0,0 @@
1
- <template>
2
- <BrandedButton
3
- color="secondary-softer"
4
- icon-only
5
- :icon="RiInformationLine"
6
- size="xs"
7
- keep-margins-even-without-borders
8
- />
9
- </template>
10
-
11
- <script setup lang="ts">
12
- import { RiInformationLine } from '@remixicon/vue'
13
- import BrandedButton from './BrandedButton.vue'
14
- </script>