@sarimarcus/content-sites-tourism 0.17.0 → 0.18.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/CHANGELOG.md +4 -0
- package/README.md +4 -1
- package/package.json +3 -3
- package/src/templates/CategoryFacetPage.astro +93 -0
- package/src/templates/FacetChipNav.astro +51 -0
- package/src/templates/TierFacetPage.astro +18 -94
- package/src/templates/facet.ts +23 -0
- package/src/templates/index.ts +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
All packages in the platform release in lockstep; entries are per release version.
|
|
4
4
|
|
|
5
|
+
## 0.18.0 (2026-10-02)
|
|
6
|
+
|
|
7
|
+
- `./templates`: `CategoryFacetPage` (one category of a content type: facet hero by tone, chip nav, intro, back link, `before-grid`, cards, `empty` and `footer` slots). The chip nav is shared with `TierFacetPage` through an internal `FacetChipNav`; `FacetNav` gains `accent` and an optional `all` (SLA-2744).
|
|
8
|
+
|
|
5
9
|
## 0.17.0 (2026-10-01)
|
|
6
10
|
|
|
7
11
|
- No changes; released in lockstep (SLA-2741).
|
package/README.md
CHANGED
|
@@ -6,7 +6,10 @@ pieces, tourism page templates and their utilities. Used by the Córdoba and Gra
|
|
|
6
6
|
Named entry points: `cards`, `sections`, `templates`, `schema` and `types` (`src/internal` is never exported).
|
|
7
7
|
`schema` holds the city-entity JSON-LD builders (monument, museum, restaurant, bar, dish, neighborhood, guide item
|
|
8
8
|
list) on core `schema`, and the `TourismCity` address policy they share.
|
|
9
|
-
Page templates are rendered by thin route files in each site
|
|
9
|
+
Page templates are rendered by thin route files in each site: `NeighborhoodFacetPage`, `ProximityFacetPage`,
|
|
10
|
+
`TierFacetPage` and `CategoryFacetPage`. The route keeps the filtering, URLs, the `MIN_INDEXABLE_ITEMS` noindex
|
|
11
|
+
threshold, Layout and schema; the template gets props (copy, `FacetNav` chips, tone) and slots (breadcrumb, cards,
|
|
12
|
+
`empty`, `footer`).
|
|
10
13
|
`sections` also holds `TourismNavigation`, the tourism header (Explore, Articles, Eat & Drink, Plan with a month
|
|
11
14
|
strip, Itineraries, Events and the mobile accordion) on the ui navigation shells. The site's `Navigation.astro`
|
|
12
15
|
passes every link, label and count as props (`TourismNavigationProps`) and its logo through the `logo` slot, so the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sarimarcus/content-sites-tourism",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "City-tourism vertical: city-entity components, pages templates and utilities for the tourism sites.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"astro": "^7.0.6",
|
|
38
38
|
"tailwindcss": "^4.1.18",
|
|
39
|
-
"@sarimarcus/content-sites-core": "0.
|
|
40
|
-
"@sarimarcus/content-sites-ui": "0.
|
|
39
|
+
"@sarimarcus/content-sites-core": "0.18.0",
|
|
40
|
+
"@sarimarcus/content-sites-ui": "0.18.0"
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* CategoryFacetPage — one category of a content type (/activities/category/<slug>, /restaurants/cuisine/<slug>,
|
|
4
|
+
* /monuments/type/<slug>, …). The route keeps the categories, filtering, SEO, schema, URLs and the noindex threshold,
|
|
5
|
+
* and renders the site Layout around this template. It passes the site Breadcrumb in `breadcrumb`, an inline svg in
|
|
6
|
+
* `icon` when the badge icon is not an Icon name, a widget above the grid in `before-grid`, the cards as default-slot
|
|
7
|
+
* children, what an empty category shows in
|
|
8
|
+
* `empty`, and closing blocks (FAQ, related links) in `footer`.
|
|
9
|
+
*/
|
|
10
|
+
import { Icon } from '@sarimarcus/content-sites-ui/primitives';
|
|
11
|
+
import { Container } from '@sarimarcus/content-sites-ui/layout';
|
|
12
|
+
import type { TrustedHtml } from '@sarimarcus/content-sites-ui/types';
|
|
13
|
+
import FacetHero from './FacetHero.astro';
|
|
14
|
+
import FacetChipNav from './FacetChipNav.astro';
|
|
15
|
+
import type { FacetLink, FacetNav } from './facet';
|
|
16
|
+
|
|
17
|
+
export type CategoryFacetTone = 'primary' | 'secondary' | 'accent' | 'secondary-overlay';
|
|
18
|
+
|
|
19
|
+
interface Props {
|
|
20
|
+
tone: CategoryFacetTone;
|
|
21
|
+
/** Icon name for the hero badge; omit it to use the `icon` slot. */
|
|
22
|
+
icon?: string;
|
|
23
|
+
badgeLabel: string;
|
|
24
|
+
heading: string;
|
|
25
|
+
lede: string;
|
|
26
|
+
nav: FacetNav;
|
|
27
|
+
introHtml?: TrustedHtml;
|
|
28
|
+
backLink: FacetLink;
|
|
29
|
+
/** Cards in the default slot; 0 shows the `empty` slot under the grid. */
|
|
30
|
+
itemCount: number;
|
|
31
|
+
columns?: 2 | 3;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const { tone, icon, badgeLabel, heading, lede, nav, introHtml, backLink, itemCount, columns = 2 } = Astro.props;
|
|
35
|
+
|
|
36
|
+
const heroTones: Record<CategoryFacetTone, string> = {
|
|
37
|
+
primary: 'bg-gradient-to-b from-primary to-primary-strong',
|
|
38
|
+
secondary: 'bg-gradient-to-b from-secondary to-secondary-strong',
|
|
39
|
+
accent: 'bg-gradient-to-b from-accent to-accent-strong',
|
|
40
|
+
'secondary-overlay': 'bg-gradient-to-b from-secondary to-overlay',
|
|
41
|
+
};
|
|
42
|
+
const panelTones: Record<CategoryFacetTone, string> = {
|
|
43
|
+
primary: 'bg-gradient-to-r from-primary/5 via-accent/5 to-primary/5',
|
|
44
|
+
secondary: 'bg-gradient-to-r from-secondary/5 via-primary/5 to-secondary/5',
|
|
45
|
+
accent: 'bg-gradient-to-r from-accent/5 via-primary/5 to-accent/5',
|
|
46
|
+
'secondary-overlay': 'bg-gradient-to-r from-secondary/5 via-primary/5 to-secondary/5',
|
|
47
|
+
};
|
|
48
|
+
const backHover = { primary: 'hover:text-primary', secondary: 'hover:text-secondary', accent: 'hover:text-accent' }[nav.accent ?? 'primary'];
|
|
49
|
+
const gridClass = columns === 3 ? 'grid gap-6 sm:grid-cols-2 lg:grid-cols-3' : 'grid gap-6 lg:grid-cols-2';
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
<FacetHero
|
|
53
|
+
bgClass={heroTones[tone]}
|
|
54
|
+
badgeToneClass="bg-overlay-foreground/20 text-overlay-foreground"
|
|
55
|
+
badgeLabel={badgeLabel}
|
|
56
|
+
heading={heading}
|
|
57
|
+
lede={lede}
|
|
58
|
+
icon={icon}
|
|
59
|
+
>
|
|
60
|
+
<slot name="breadcrumb" slot="breadcrumb" />
|
|
61
|
+
<slot name="icon" slot="icon" />
|
|
62
|
+
</FacetHero>
|
|
63
|
+
|
|
64
|
+
<main class="py-12 lg:py-20">
|
|
65
|
+
<Container>
|
|
66
|
+
<FacetChipNav nav={nav} panelBg={panelTones[tone]} />
|
|
67
|
+
|
|
68
|
+
{introHtml && (
|
|
69
|
+
<div class="mb-10 p-6 lg:p-8 bg-muted/30 rounded-2xl">
|
|
70
|
+
<div class="prose prose-lg max-w-measure-wide">
|
|
71
|
+
<p class="text-foreground/80 leading-relaxed" set:html={introHtml} />
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
)}
|
|
75
|
+
|
|
76
|
+
<a
|
|
77
|
+
href={backLink.href}
|
|
78
|
+
class={`inline-flex items-center gap-2 text-sm text-muted-foreground ${backHover} transition-colors mb-8`}
|
|
79
|
+
>
|
|
80
|
+
<Icon name="arrow-left" class="w-4 h-4" />
|
|
81
|
+
{backLink.label}
|
|
82
|
+
</a>
|
|
83
|
+
|
|
84
|
+
<slot name="before-grid" />
|
|
85
|
+
|
|
86
|
+
<div class={gridClass}>
|
|
87
|
+
<slot />
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
{itemCount === 0 && <slot name="empty" />}
|
|
91
|
+
<slot name="footer" />
|
|
92
|
+
</Container>
|
|
93
|
+
</main>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* FacetChipNav — internal to the facet templates: the chip row linking a facet's sibling values, with counts. `panel`
|
|
4
|
+
* boxes it under a heading with large outline chips; `inline` is a bare row of muted chips.
|
|
5
|
+
*/
|
|
6
|
+
import { Badge, Chip } from '@sarimarcus/content-sites-ui/primitives';
|
|
7
|
+
import type { FacetNav, FacetNavItem } from './facet';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
nav: FacetNav;
|
|
11
|
+
/** Panel background, e.g. `bg-gradient-to-r from-secondary/5 via-primary/5 to-secondary/5`. */
|
|
12
|
+
panelBg?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const { nav, panelBg = 'bg-gradient-to-r from-secondary/5 via-primary/5 to-secondary/5' } = Astro.props;
|
|
16
|
+
const panel = nav.variant === 'panel';
|
|
17
|
+
const NavWrap = panel ? 'section' : 'div';
|
|
18
|
+
const navWrapClass = panel ? `mb-10 p-6 ${panelBg} rounded-2xl border border-border` : 'mb-10';
|
|
19
|
+
const accent = nav.accent ?? 'primary';
|
|
20
|
+
const chip = panel
|
|
21
|
+
? { size: 'lg' as const, tone: 'outline' as const, accent }
|
|
22
|
+
: { size: 'md' as const, tone: 'muted' as const, accent };
|
|
23
|
+
const allChipProps = nav.all && (panel ? { href: nav.all.href, ...chip, class: 'gap-2' } : { href: nav.all.href, ...chip });
|
|
24
|
+
const itemChipProps = (t: FacetNavItem) => ({
|
|
25
|
+
href: t.href,
|
|
26
|
+
...chip,
|
|
27
|
+
active: t.active,
|
|
28
|
+
'aria-current': t.active ? ('page' as const) : undefined,
|
|
29
|
+
...(panel ? { class: t.active ? 'gap-2 shadow-md' : 'gap-2' } : {}),
|
|
30
|
+
});
|
|
31
|
+
const countTone = (active: boolean) => (active ? 'bg-overlay-foreground/20' : panel ? 'bg-muted' : 'bg-background');
|
|
32
|
+
const countClass = panel ? '![font-weight:inherit]' : '!px-1.5 ![font-weight:inherit]';
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
<NavWrap class={navWrapClass}>
|
|
36
|
+
{panel && <h2 class="text-lg font-normal text-foreground font-display mb-5">{nav.heading}</h2>}
|
|
37
|
+
<nav class={panel ? 'flex flex-wrap gap-3' : 'flex flex-wrap gap-2'} aria-label={nav.label}>
|
|
38
|
+
{nav.all && allChipProps && (
|
|
39
|
+
<Chip {...allChipProps}>
|
|
40
|
+
{nav.all.label}
|
|
41
|
+
<Badge tone="custom" toneClass={countTone(false)} size="sm" lines={0} class={countClass}>{nav.all.count}</Badge>
|
|
42
|
+
</Chip>
|
|
43
|
+
)}
|
|
44
|
+
{nav.items.map((t) => (
|
|
45
|
+
<Chip {...itemChipProps(t)}>
|
|
46
|
+
{t.label}{t.detail && <span class="text-xs opacity-75">{t.detail}</span>}
|
|
47
|
+
<Badge tone="custom" toneClass={countTone(t.active)} size="sm" lines={0} class={countClass}>{t.count}</Badge>
|
|
48
|
+
</Chip>
|
|
49
|
+
))}
|
|
50
|
+
</nav>
|
|
51
|
+
</NavWrap>
|
|
@@ -3,35 +3,19 @@
|
|
|
3
3
|
* TierFacetPage — one price tier of a content type (/activities/price/<tier>, /restaurants/price/<tier>). The route
|
|
4
4
|
* keeps the tiers, filtering, SEO, schema and URLs, and renders the site Layout around this template. It passes the
|
|
5
5
|
* site Breadcrumb in the `breadcrumb` slot, the cards (through its card adapters) as default-slot children and its
|
|
6
|
-
* closing links in `footer`. Every string arrives as a prop.
|
|
6
|
+
* closing links in `footer`. Every string arrives as a prop. It is CategoryFacetPage with tier chips and FacetEmpty.
|
|
7
7
|
*/
|
|
8
|
-
import { Badge, Chip, Icon } from '@sarimarcus/content-sites-ui/primitives';
|
|
9
|
-
import { Container } from '@sarimarcus/content-sites-ui/layout';
|
|
10
8
|
import type { TrustedHtml } from '@sarimarcus/content-sites-ui/types';
|
|
11
|
-
import
|
|
9
|
+
import CategoryFacetPage from './CategoryFacetPage.astro';
|
|
12
10
|
import FacetEmpty from './FacetEmpty.astro';
|
|
13
|
-
import type { FacetEmptyState, FacetLink } from './facet';
|
|
11
|
+
import type { FacetEmptyState, FacetLink, FacetNav, FacetNavItem } from './facet';
|
|
14
12
|
|
|
15
13
|
export type TierFacetTone = 'secondary' | 'secondary-overlay';
|
|
16
14
|
|
|
17
|
-
export
|
|
18
|
-
href: string;
|
|
19
|
-
label: string;
|
|
20
|
-
/** Range shown after the label, punctuation included, e.g. "(Under €25)". */
|
|
21
|
-
detail: string;
|
|
22
|
-
count: number;
|
|
23
|
-
active: boolean;
|
|
24
|
-
}
|
|
15
|
+
export type TierNavItem = FacetNavItem & { detail: string };
|
|
25
16
|
|
|
26
|
-
export interface TierNav {
|
|
27
|
-
|
|
28
|
-
variant: 'panel' | 'inline';
|
|
29
|
-
/** Panel heading; `panel` only. */
|
|
30
|
-
heading?: string;
|
|
31
|
-
/** aria-label of the chip nav. */
|
|
32
|
-
label: string;
|
|
33
|
-
/** The unfiltered listing. */
|
|
34
|
-
all: { href: string; label: string; count: number };
|
|
17
|
+
export interface TierNav extends Omit<FacetNav, 'all' | 'items'> {
|
|
18
|
+
all: NonNullable<FacetNav['all']>;
|
|
35
19
|
tiers: TierNavItem[];
|
|
36
20
|
}
|
|
37
21
|
|
|
@@ -52,82 +36,22 @@ interface Props {
|
|
|
52
36
|
}
|
|
53
37
|
|
|
54
38
|
const { tone, icon, badgeLabel, heading, lede, nav, introHtml, backLink, itemCount, empty, columns = 2 } = Astro.props;
|
|
55
|
-
|
|
56
|
-
const heroTones: Record<TierFacetTone, string> = {
|
|
57
|
-
secondary: 'bg-gradient-to-b from-secondary to-secondary-strong',
|
|
58
|
-
'secondary-overlay': 'bg-gradient-to-b from-secondary to-overlay',
|
|
59
|
-
};
|
|
60
|
-
const panel = nav.variant === 'panel';
|
|
61
|
-
const NavWrap = panel ? 'section' : 'div';
|
|
62
|
-
const navWrapClass = panel
|
|
63
|
-
? 'mb-10 p-6 bg-gradient-to-r from-secondary/5 via-primary/5 to-secondary/5 rounded-2xl border border-border'
|
|
64
|
-
: 'mb-10';
|
|
65
|
-
const chip = panel
|
|
66
|
-
? { size: 'lg' as const, tone: 'outline' as const, accent: 'primary' as const }
|
|
67
|
-
: { size: 'md' as const, tone: 'muted' as const, accent: 'primary' as const };
|
|
68
|
-
const allChipProps = panel ? { href: nav.all.href, ...chip, class: 'gap-2' } : { href: nav.all.href, ...chip };
|
|
69
|
-
const tierChipProps = (t: TierNavItem) => ({
|
|
70
|
-
href: t.href,
|
|
71
|
-
...chip,
|
|
72
|
-
active: t.active,
|
|
73
|
-
'aria-current': t.active ? ('page' as const) : undefined,
|
|
74
|
-
...(panel ? { class: t.active ? 'gap-2 shadow-md' : 'gap-2' } : {}),
|
|
75
|
-
});
|
|
76
|
-
const countTone = (active: boolean) => (active ? 'bg-overlay-foreground/20' : panel ? 'bg-muted' : 'bg-background');
|
|
77
|
-
const countClass = panel ? '![font-weight:inherit]' : '!px-1.5 ![font-weight:inherit]';
|
|
78
|
-
const gridClass = columns === 3 ? 'grid gap-6 sm:grid-cols-2 lg:grid-cols-3' : 'grid gap-6 lg:grid-cols-2';
|
|
79
39
|
---
|
|
80
40
|
|
|
81
|
-
<
|
|
82
|
-
|
|
83
|
-
|
|
41
|
+
<CategoryFacetPage
|
|
42
|
+
tone={tone}
|
|
43
|
+
icon={icon}
|
|
84
44
|
badgeLabel={badgeLabel}
|
|
85
45
|
heading={heading}
|
|
86
46
|
lede={lede}
|
|
87
|
-
|
|
47
|
+
nav={{ ...nav, items: nav.tiers }}
|
|
48
|
+
introHtml={introHtml}
|
|
49
|
+
backLink={backLink}
|
|
50
|
+
itemCount={itemCount}
|
|
51
|
+
columns={columns}
|
|
88
52
|
>
|
|
89
53
|
<slot name="breadcrumb" slot="breadcrumb" />
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
<
|
|
93
|
-
|
|
94
|
-
<NavWrap class={navWrapClass}>
|
|
95
|
-
{panel && <h2 class="text-lg font-normal text-foreground font-display mb-5">{nav.heading}</h2>}
|
|
96
|
-
<nav class={panel ? 'flex flex-wrap gap-3' : 'flex flex-wrap gap-2'} aria-label={nav.label}>
|
|
97
|
-
<Chip {...allChipProps}>
|
|
98
|
-
{nav.all.label}
|
|
99
|
-
<Badge tone="custom" toneClass={countTone(false)} size="sm" lines={0} class={countClass}>{nav.all.count}</Badge>
|
|
100
|
-
</Chip>
|
|
101
|
-
{nav.tiers.map((t) => (
|
|
102
|
-
<Chip {...tierChipProps(t)}>
|
|
103
|
-
{t.label}<span class="text-xs opacity-75">{t.detail}</span>
|
|
104
|
-
<Badge tone="custom" toneClass={countTone(t.active)} size="sm" lines={0} class={countClass}>{t.count}</Badge>
|
|
105
|
-
</Chip>
|
|
106
|
-
))}
|
|
107
|
-
</nav>
|
|
108
|
-
</NavWrap>
|
|
109
|
-
|
|
110
|
-
{introHtml && (
|
|
111
|
-
<div class="mb-10 p-6 lg:p-8 bg-muted/30 rounded-2xl">
|
|
112
|
-
<div class="prose prose-lg max-w-measure-wide">
|
|
113
|
-
<p class="text-foreground/80 leading-relaxed" set:html={introHtml} />
|
|
114
|
-
</div>
|
|
115
|
-
</div>
|
|
116
|
-
)}
|
|
117
|
-
|
|
118
|
-
<a
|
|
119
|
-
href={backLink.href}
|
|
120
|
-
class="inline-flex items-center gap-2 text-sm text-muted-foreground hover:text-primary transition-colors mb-8"
|
|
121
|
-
>
|
|
122
|
-
<Icon name="arrow-left" class="w-4 h-4" />
|
|
123
|
-
{backLink.label}
|
|
124
|
-
</a>
|
|
125
|
-
|
|
126
|
-
<div class={gridClass}>
|
|
127
|
-
<slot />
|
|
128
|
-
</div>
|
|
129
|
-
|
|
130
|
-
{itemCount === 0 && <FacetEmpty {...empty} />}
|
|
131
|
-
<slot name="footer" />
|
|
132
|
-
</Container>
|
|
133
|
-
</main>
|
|
54
|
+
<slot />
|
|
55
|
+
<FacetEmpty slot="empty" {...empty} />
|
|
56
|
+
<slot name="footer" slot="footer" />
|
|
57
|
+
</CategoryFacetPage>
|
package/src/templates/facet.ts
CHANGED
|
@@ -12,3 +12,26 @@ export interface FacetEmptyState {
|
|
|
12
12
|
message: string;
|
|
13
13
|
link: FacetLink;
|
|
14
14
|
}
|
|
15
|
+
|
|
16
|
+
export interface FacetNavItem {
|
|
17
|
+
href: string;
|
|
18
|
+
label: string;
|
|
19
|
+
/** Shown after the label, punctuation included, e.g. "(Under €25)". */
|
|
20
|
+
detail?: string;
|
|
21
|
+
count: number;
|
|
22
|
+
active: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface FacetNav {
|
|
26
|
+
/** `panel`: boxed, headed, large outline chips. `inline`: bare row of muted chips. */
|
|
27
|
+
variant: 'panel' | 'inline';
|
|
28
|
+
/** Panel heading; `panel` only. */
|
|
29
|
+
heading?: string;
|
|
30
|
+
/** aria-label of the chip nav. */
|
|
31
|
+
label: string;
|
|
32
|
+
/** Chip colour; default primary. */
|
|
33
|
+
accent?: 'primary' | 'secondary' | 'accent';
|
|
34
|
+
/** The unfiltered listing, first in the row. */
|
|
35
|
+
all?: { href: string; label: string; count: number };
|
|
36
|
+
items: FacetNavItem[];
|
|
37
|
+
}
|
package/src/templates/index.ts
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
export { default as NeighborhoodFacetPage } from './NeighborhoodFacetPage.astro';
|
|
3
3
|
export { default as ProximityFacetPage } from './ProximityFacetPage.astro';
|
|
4
4
|
export { default as TierFacetPage } from './TierFacetPage.astro';
|
|
5
|
-
export
|
|
5
|
+
export { default as CategoryFacetPage } from './CategoryFacetPage.astro';
|
|
6
|
+
export type { FacetEmptyState, FacetLink, FacetNav, FacetNavItem } from './facet';
|
|
6
7
|
export type { NeighborhoodFacetTone } from './NeighborhoodFacetPage.astro';
|
|
7
8
|
export type { ProximityIntroSection, ProximityEditorialGroup } from './ProximityFacetPage.astro';
|
|
8
9
|
export type { TierFacetTone, TierNav, TierNavItem } from './TierFacetPage.astro';
|
|
10
|
+
export type { CategoryFacetTone } from './CategoryFacetPage.astro';
|