@communitiesuk/svelte-component-library 0.1.18 → 0.2.0-alpha.2
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 +30 -6
- package/dist/assets/css/base.css +9 -0
- package/dist/assets/css/code-block.css +116 -0
- package/dist/assets/css/components.css +47 -0
- package/dist/assets/css/fonts.css +19 -0
- package/dist/assets/css/govuk-additional.css +142 -0
- package/dist/assets/css/govuk-frontend.min.css +2 -2
- package/dist/assets/css/moduk.css +1 -0
- package/dist/assets/css/moj-frontend.min copy.css +4108 -0
- package/dist/assets/css/moj-frontend.min.css +2 -0
- package/dist/assets/css/moj-frontend.min.css.map +1 -0
- package/dist/assets/css/utilities.css +0 -0
- package/dist/assets/images/govuk-crest.svg +1 -1
- package/dist/assets/js/govuk-frontend.min.js +1 -0
- package/dist/assets/js/moj-frontend.min.js +1 -0
- package/dist/assets/rebrand/images/favicon.ico +0 -0
- package/dist/assets/rebrand/images/favicon.svg +1 -0
- package/dist/assets/rebrand/images/govuk-crest.svg +1 -0
- package/dist/assets/rebrand/images/govuk-icon-180.png +0 -0
- package/dist/assets/rebrand/images/govuk-icon-192.png +0 -0
- package/dist/assets/rebrand/images/govuk-icon-512.png +0 -0
- package/dist/assets/rebrand/images/govuk-icon-mask.svg +1 -0
- package/dist/assets/rebrand/images/govuk-opengraph-image.png +0 -0
- package/dist/assets/rebrand/manifest.json +39 -0
- package/dist/components/data-vis/line-chart/Line.svelte +48 -40
- package/dist/components/data-vis/line-chart/Line.svelte.d.ts +6 -4
- package/dist/components/data-vis/line-chart/LineChart.svelte +145 -36
- package/dist/components/data-vis/line-chart/LineChart.svelte.d.ts +25 -9
- package/dist/components/data-vis/line-chart/Lines.svelte +10 -23
- package/dist/components/data-vis/line-chart/Lines.svelte.d.ts +8 -4
- package/dist/components/data-vis/line-chart/Marker.svelte +31 -5
- package/dist/components/data-vis/line-chart/Marker.svelte.d.ts +6 -2
- package/dist/components/data-vis/line-chart/SeriesLabel.svelte +7 -8
- package/dist/components/data-vis/line-chart/SeriesLabel.svelte.d.ts +2 -2
- package/dist/components/data-vis/line-chart/ValueLabel.svelte +26 -34
- package/dist/components/data-vis/line-chart/ValueLabel.svelte.d.ts +8 -4
- package/dist/components/data-vis/map/Map.svelte +299 -71
- package/dist/components/data-vis/map/Map.svelte.d.ts +39 -12
- package/dist/components/data-vis/map/NonStandardControls.svelte +10 -1
- package/dist/components/data-vis/map/NonStandardControls.svelte.d.ts +12 -11
- package/dist/components/data-vis/map/Tooltip.svelte +3 -4
- package/dist/components/data-vis/map/Tooltip.svelte.d.ts +0 -2
- package/dist/components/data-vis/map/mapUtils.d.ts +2 -0
- package/dist/components/data-vis/map/mapUtils.js +50 -0
- package/dist/components/data-vis/table/Table.svelte +28 -40
- package/dist/components/data-vis/table/Table.svelte.d.ts +0 -2
- package/dist/components/layout/Breadcrumbs.svelte +10 -12
- package/dist/components/layout/Breadcrumbs.svelte.d.ts +1 -0
- package/dist/components/layout/Footer.svelte +69 -4
- package/dist/components/layout/Footer.svelte.d.ts +3 -0
- package/dist/components/layout/Header.svelte +56 -16
- package/dist/components/layout/Header.svelte.d.ts +1 -0
- package/dist/components/layout/InternalHeader.svelte +155 -150
- package/dist/components/layout/InternalHeader.svelte.d.ts +1 -0
- package/dist/components/ui/Button.svelte +78 -4
- package/dist/components/ui/Button.svelte.d.ts +2 -0
- package/dist/components/ui/CookieBanner.svelte +356 -0
- package/dist/components/ui/CookieBanner.svelte.d.ts +18 -0
- package/dist/components/ui/FilterPanel.svelte +167 -158
- package/dist/components/ui/FilterPanel.svelte.d.ts +2 -0
- package/dist/components/ui/Masthead.svelte +35 -23
- package/dist/components/ui/Masthead.svelte.d.ts +2 -0
- package/dist/components/ui/PostcodeOrAreaSearch.svelte +200 -0
- package/dist/components/ui/PostcodeOrAreaSearch.svelte.d.ts +37 -0
- package/dist/components/ui/Search.svelte +2 -2
- package/dist/components/ui/SearchAutocomplete.svelte +104 -14
- package/dist/components/ui/SearchAutocomplete.svelte.d.ts +4 -0
- package/dist/data/IMD2019.json +32846 -0
- package/dist/data/places.csv +20039 -0
- package/dist/data/places.json +100192 -0
- package/dist/data/svgFontDimensions.json +90 -0
- package/dist/data/testData.json +52632 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/package-wrapping/BaseInformation.svelte +0 -33
- package/dist/package-wrapping/SidebarContainer.svelte +0 -7
- package/dist/utils/area-search/geoConfig.d.ts +435 -0
- package/dist/utils/area-search/geoConfig.js +291 -0
- package/dist/utils/cookiesNavigation.d.ts +44 -0
- package/dist/utils/cookiesNavigation.js +63 -0
- package/dist/utils/data-transformations/convert-csv-to-json-proper.cjs +88 -0
- package/dist/utils/data-transformations/convert-csv-to-json-proper.d.cts +1 -0
- package/dist/utils/data-transformations/convertCSV.d.ts +6 -0
- package/dist/utils/data-transformations/convertCSV.js +40 -21
- package/dist/utils/text-string-conversion/textStringConversion.d.ts +6 -0
- package/dist/utils/text-string-conversion/textStringConversion.js +10 -0
- package/package.json +18 -7
- package/dist/components/ui/Breadcrumbs.svelte +0 -198
- package/dist/components/ui/Breadcrumbs.svelte.d.ts +0 -24
- package/dist/components/ui/Footer.svelte +0 -171
- package/dist/components/ui/Footer.svelte.d.ts +0 -30
- package/dist/components/ui/Header.svelte +0 -43
- package/dist/components/ui/Header.svelte.d.ts +0 -7
- package/dist/components/ui/ServiceNavigation.svelte +0 -143
- package/dist/components/ui/ServiceNavigation.svelte.d.ts +0 -13
- package/dist/components/ui/SideNavigation.svelte +0 -346
- package/dist/components/ui/SideNavigation.svelte.d.ts +0 -25
|
@@ -3,3 +3,5 @@ export declare function getColor(value: number, breaks: number[], colors: string
|
|
|
3
3
|
export declare function filterGeo(geo: FeatureCollection, year: number | string): any;
|
|
4
4
|
export declare function jenksBreaks(data: any, numBreaks: any): any[];
|
|
5
5
|
export declare function quantileBreaks(data: number[], numBreaks: number): number[];
|
|
6
|
+
export declare function createPaintObjectFromMetric(metricProperty: string, breaks: number[], fillColors: string[], fillOpacity?: number): object;
|
|
7
|
+
export declare function extractVectorMetricValues(map: maplibregl.Map, layerId: string, metricProperty: string): number[];
|
|
@@ -84,3 +84,53 @@ export function quantileBreaks(data, numBreaks) {
|
|
|
84
84
|
breaks.push(data[len - 1]);
|
|
85
85
|
return breaks;
|
|
86
86
|
}
|
|
87
|
+
export function createPaintObjectFromMetric(metricProperty, breaks, fillColors, fillOpacity = 0.4) {
|
|
88
|
+
const usableLength = Math.min(breaks.length, fillColors.length);
|
|
89
|
+
breaks.sort((a, b) => a - b);
|
|
90
|
+
function parseNumberWithCommas(value) {
|
|
91
|
+
if (typeof value === "number")
|
|
92
|
+
return value;
|
|
93
|
+
const cleaned = value.toString().replace(/,/g, "").trim();
|
|
94
|
+
const parsed = Number(cleaned);
|
|
95
|
+
return isNaN(parsed) ? 0 : parsed;
|
|
96
|
+
}
|
|
97
|
+
const matchExpression = [
|
|
98
|
+
"step",
|
|
99
|
+
["to-number", ["get", metricProperty]],
|
|
100
|
+
"#d3d3d3", // Default color
|
|
101
|
+
];
|
|
102
|
+
for (let i = 0; i < usableLength; i++) {
|
|
103
|
+
const breakValue = parseNumberWithCommas(breaks[i]);
|
|
104
|
+
matchExpression.push(breakValue, fillColors[i]);
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
"fill-color": matchExpression,
|
|
108
|
+
"fill-opacity": fillOpacity,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export function extractVectorMetricValues(map, layerId, metricProperty) {
|
|
112
|
+
if (!map || !map.isStyleLoaded())
|
|
113
|
+
return [];
|
|
114
|
+
const features = map.queryRenderedFeatures({ layers: [layerId] });
|
|
115
|
+
const seen = new Set();
|
|
116
|
+
return features
|
|
117
|
+
.filter((f) => {
|
|
118
|
+
const id = f.id;
|
|
119
|
+
if (!id || seen.has(id))
|
|
120
|
+
return false;
|
|
121
|
+
seen.add(id);
|
|
122
|
+
return true;
|
|
123
|
+
})
|
|
124
|
+
.map((f) => {
|
|
125
|
+
const raw = f.properties?.[metricProperty];
|
|
126
|
+
if (typeof raw === "string") {
|
|
127
|
+
const cleaned = raw.replace(/,/g, "");
|
|
128
|
+
return parseFloat(cleaned);
|
|
129
|
+
}
|
|
130
|
+
else if (typeof raw === "number") {
|
|
131
|
+
return raw;
|
|
132
|
+
}
|
|
133
|
+
return NaN;
|
|
134
|
+
})
|
|
135
|
+
.filter((v) => !isNaN(v));
|
|
136
|
+
}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
import Button from "
|
|
2
|
+
import Button from "./../../ui/Button.svelte";
|
|
3
3
|
|
|
4
4
|
let {
|
|
5
|
-
componentNameProp = undefined,
|
|
6
5
|
data = undefined,
|
|
7
6
|
metaData = undefined,
|
|
8
7
|
caption = undefined,
|
|
9
8
|
colourScale = undefined,
|
|
10
9
|
} = $props();
|
|
11
10
|
|
|
12
|
-
let localCopyOfData = $
|
|
11
|
+
let localCopyOfData = $derived([...data]);
|
|
13
12
|
|
|
14
13
|
function hasUniqueValues(array, key) {
|
|
15
14
|
const seen = new Set();
|
|
@@ -22,17 +21,6 @@
|
|
|
22
21
|
return true; // All values are unique
|
|
23
22
|
}
|
|
24
23
|
|
|
25
|
-
// $inspect(
|
|
26
|
-
// localCopyOfData[0].areaName,
|
|
27
|
-
// "data type is",
|
|
28
|
-
// typeof localCopyOfData[0].areaName,
|
|
29
|
-
// );
|
|
30
|
-
// $inspect(
|
|
31
|
-
// localCopyOfData[0]["Household waste recycling rate"],
|
|
32
|
-
// "data type is",
|
|
33
|
-
// typeof localCopyOfData[0]["Household waste recycling rate"],
|
|
34
|
-
// );
|
|
35
|
-
|
|
36
24
|
let columns = [];
|
|
37
25
|
|
|
38
26
|
for (const column in localCopyOfData[0]) {
|
|
@@ -55,8 +43,6 @@
|
|
|
55
43
|
.filter((column) => column.dataType === "number")
|
|
56
44
|
.map((column) => column.key);
|
|
57
45
|
|
|
58
|
-
// $inspect("metrics is", metrics);
|
|
59
|
-
|
|
60
46
|
let sortState = $state({ column: "sortedColumn", order: "ascending" });
|
|
61
47
|
|
|
62
48
|
function updateSortState(columnToSort, sortOrder) {
|
|
@@ -133,8 +119,6 @@
|
|
|
133
119
|
}
|
|
134
120
|
|
|
135
121
|
const colorKey = Object.entries({ Good: 1, Ok: 0.5, Bad: 0 });
|
|
136
|
-
|
|
137
|
-
// $inspect("the first column key is", columns[0].key);
|
|
138
122
|
</script>
|
|
139
123
|
|
|
140
124
|
<div class="p-4">
|
|
@@ -150,8 +134,8 @@
|
|
|
150
134
|
{/if}
|
|
151
135
|
|
|
152
136
|
<div class="table-container">
|
|
137
|
+
<div id="table-caption" class="sticky-caption">{caption}</div>
|
|
153
138
|
<table class="govuk-table" data-module="moj-sortable-table">
|
|
154
|
-
<caption class="govuk-table__caption">{caption}</caption>
|
|
155
139
|
<thead class="govuk-table__head"
|
|
156
140
|
><tr class="govuk-table__row">
|
|
157
141
|
{#each columns as column}
|
|
@@ -159,7 +143,12 @@
|
|
|
159
143
|
scope="col"
|
|
160
144
|
class={`govuk-table__header ${column.dataType === "number" ? "govuk-table__header--numeric" : ""}`}
|
|
161
145
|
title={metaData[column.key].explainer}
|
|
162
|
-
aria-sort=
|
|
146
|
+
aria-sort={sortState.column !== column.key
|
|
147
|
+
? "none"
|
|
148
|
+
: sortState.column === column.key &&
|
|
149
|
+
sortState.order === "descending"
|
|
150
|
+
? "descending"
|
|
151
|
+
: "ascending"}
|
|
163
152
|
>
|
|
164
153
|
<div class="header">
|
|
165
154
|
<Button
|
|
@@ -187,27 +176,17 @@
|
|
|
187
176
|
{#each columns as column}
|
|
188
177
|
{#if column.dataType === "number"}
|
|
189
178
|
{#if colourScale === "On"}
|
|
190
|
-
{#if metaData[column.key].direction === "Higher is better"}
|
|
191
|
-
<td
|
|
192
|
-
class="govuk-table__cell govuk-table__cell--numeric"
|
|
193
|
-
style="background-color: {normToColor(
|
|
194
|
-
row[column.key + '__normalised'],
|
|
195
|
-
)}"
|
|
196
|
-
data-sort-value="42">{row[column.key]}</td
|
|
197
|
-
>
|
|
198
|
-
{:else}
|
|
199
|
-
<td
|
|
200
|
-
class="govuk-table__cell govuk-table__cell--numeric"
|
|
201
|
-
style="background-color: {normToColorReverse(
|
|
202
|
-
row[column.key + '__normalised'],
|
|
203
|
-
)}"
|
|
204
|
-
data-sort-value="42">{row[column.key]}</td
|
|
205
|
-
>
|
|
206
|
-
{/if}
|
|
207
|
-
{:else}
|
|
208
179
|
<td
|
|
209
180
|
class="govuk-table__cell govuk-table__cell--numeric"
|
|
210
|
-
|
|
181
|
+
style="background-color: {metaData[column.key].direction ===
|
|
182
|
+
'Higher is better'
|
|
183
|
+
? normToColor(row[column.key + '__normalised'])
|
|
184
|
+
: normToColorReverse(row[column.key + '__normalised'])}"
|
|
185
|
+
>{row[column.key]}</td
|
|
186
|
+
>
|
|
187
|
+
{:else}
|
|
188
|
+
<td class="govuk-table__cell govuk-table__cell--numeric"
|
|
189
|
+
>{row[column.key]}</td
|
|
211
190
|
>
|
|
212
191
|
{/if}
|
|
213
192
|
{:else}
|
|
@@ -223,8 +202,10 @@
|
|
|
223
202
|
|
|
224
203
|
<style>
|
|
225
204
|
.table-container {
|
|
226
|
-
max-height:
|
|
205
|
+
max-height: 85vh;
|
|
227
206
|
overflow-y: auto;
|
|
207
|
+
overflow-x: scroll;
|
|
208
|
+
width: 100%;
|
|
228
209
|
}
|
|
229
210
|
|
|
230
211
|
th {
|
|
@@ -234,6 +215,13 @@
|
|
|
234
215
|
background-color: white;
|
|
235
216
|
}
|
|
236
217
|
|
|
218
|
+
.sticky-caption {
|
|
219
|
+
position: sticky;
|
|
220
|
+
top: 0;
|
|
221
|
+
z-index: 2;
|
|
222
|
+
background-color: white;
|
|
223
|
+
}
|
|
224
|
+
|
|
237
225
|
.legend {
|
|
238
226
|
display: flex;
|
|
239
227
|
justify-content: center;
|
|
@@ -4,14 +4,12 @@ type Table = {
|
|
|
4
4
|
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
5
|
};
|
|
6
6
|
declare const Table: import("svelte").Component<{
|
|
7
|
-
componentNameProp?: any;
|
|
8
7
|
data?: any;
|
|
9
8
|
metaData?: any;
|
|
10
9
|
caption?: any;
|
|
11
10
|
colourScale?: any;
|
|
12
11
|
}, {}, "">;
|
|
13
12
|
type $$ComponentProps = {
|
|
14
|
-
componentNameProp?: any;
|
|
15
13
|
data?: any;
|
|
16
14
|
metaData?: any;
|
|
17
15
|
caption?: any;
|
|
@@ -26,11 +26,13 @@
|
|
|
26
26
|
collapseOnMobile = false,
|
|
27
27
|
inverse = false,
|
|
28
28
|
ariaLabel = "Breadcrumb",
|
|
29
|
+
formatBreadcrumbText,
|
|
29
30
|
} = $props<{
|
|
30
31
|
items?: BreadcrumbItem[];
|
|
31
32
|
collapseOnMobile?: boolean;
|
|
32
33
|
inverse?: boolean;
|
|
33
34
|
ariaLabel?: string;
|
|
35
|
+
formatBreadcrumbText?: (text: string[]) => string;
|
|
34
36
|
}>();
|
|
35
37
|
|
|
36
38
|
// Load all page modules for route detection
|
|
@@ -53,7 +55,7 @@
|
|
|
53
55
|
|
|
54
56
|
// Effect to update breadcrumb items when dependencies change
|
|
55
57
|
$effect(() => {
|
|
56
|
-
breadcrumbItems =
|
|
58
|
+
breadcrumbItems = generateBreadcrumbItems(page, routeModules);
|
|
57
59
|
});
|
|
58
60
|
|
|
59
61
|
// Generate breadcrumb items from the current route
|
|
@@ -156,23 +158,19 @@
|
|
|
156
158
|
/**
|
|
157
159
|
* Converts route segments to human-readable text
|
|
158
160
|
*/
|
|
159
|
-
function formatBreadcrumbText(text: string): string {
|
|
161
|
+
/*function formatBreadcrumbText(text: string): string {
|
|
160
162
|
// Handle special cases
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if (text === "user-guide") return "User Guide";
|
|
166
|
-
if (text === "playground") return "Playground";
|
|
167
|
-
if (text === "components") return "Components";
|
|
168
|
-
if (text === "local-lib") return "Local Library";
|
|
163
|
+
const urlLookupObject = {
|
|
164
|
+
ui: "UI Components",
|
|
165
|
+
"data-vis": "Data Visualization",
|
|
166
|
+
};
|
|
169
167
|
|
|
170
168
|
// Default: capitalize and replace hyphens with spaces
|
|
171
|
-
return text
|
|
169
|
+
return (text in urlLookupObject ? urlLookupObject[text] : text)
|
|
172
170
|
.split("-")
|
|
173
171
|
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
174
172
|
.join(" ");
|
|
175
|
-
}
|
|
173
|
+
}*/
|
|
176
174
|
</script>
|
|
177
175
|
|
|
178
176
|
<nav
|
|
@@ -18,6 +18,7 @@ type $$ComponentProps = {
|
|
|
18
18
|
collapseOnMobile?: boolean;
|
|
19
19
|
inverse?: boolean;
|
|
20
20
|
ariaLabel?: string;
|
|
21
|
+
formatBreadcrumbText?: (text: string[]) => string;
|
|
21
22
|
};
|
|
22
23
|
declare const Breadcrumbs: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
23
24
|
type Breadcrumbs = ReturnType<typeof Breadcrumbs>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import legacyDefaultCopyrightLogo from "./../../assets/images/govuk-crest.svg";
|
|
2
3
|
// Define component props with default values
|
|
3
4
|
// sections: array of footer navigation sections
|
|
4
5
|
// inlineLinks: array of inline footer links
|
|
@@ -14,6 +15,8 @@
|
|
|
14
15
|
// licenceTextBefore: Text to display before the licence link
|
|
15
16
|
// licenceTextAfter: Text to display after the licence link
|
|
16
17
|
// copyrightHref: URL for the crown copyright link
|
|
18
|
+
// rebrand: whether to use the new rebranded crown logo
|
|
19
|
+
// borderTopColor: custom color for the footer's top border (overrides default #1d70b8)
|
|
17
20
|
|
|
18
21
|
// Define types for component props
|
|
19
22
|
interface FooterItem {
|
|
@@ -21,6 +24,7 @@
|
|
|
21
24
|
label: string;
|
|
22
25
|
lang?: string;
|
|
23
26
|
hrefLang?: string;
|
|
27
|
+
onclick?: (event: Event) => void;
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
interface FooterSection {
|
|
@@ -37,7 +41,7 @@
|
|
|
37
41
|
containerWidth = "govuk-width-container",
|
|
38
42
|
showLicence = true,
|
|
39
43
|
showCopyright = true,
|
|
40
|
-
copyrightLogoUrl
|
|
44
|
+
copyrightLogoUrl,
|
|
41
45
|
copyrightText = "© Crown copyright",
|
|
42
46
|
crownSvgPath = "M421.5 142.8V.1l-50.7 32.3v161.1h112.4v-50.7zm-122.3-9.6A47.12 47.12 0 0 1 221 97.8c0-26 21.1-47.1 47.1-47.1 16.7 0 31.4 8.7 39.7 21.8l42.7-27.2A97.63 97.63 0 0 0 268.1 0c-36.5 0-68.3 20.1-85.1 49.7A98 98 0 0 0 97.8 0C43.9 0 0 43.9 0 97.8s43.9 97.8 97.8 97.8c36.5 0 68.3-20.1 85.1-49.7a97.76 97.76 0 0 0 149.6 25.4l19.4 22.2h3v-87.8h-80l24.3 27.5zM97.8 145c-26 0-47.1-21.1-47.1-47.1s21.1-47.1 47.1-47.1 47.2 21 47.2 47S123.8 145 97.8 145",
|
|
43
47
|
licenceHref = "https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/",
|
|
@@ -45,6 +49,8 @@
|
|
|
45
49
|
licenceTextBefore = "All content is available under the ",
|
|
46
50
|
licenceTextAfter = ", except where otherwise stated",
|
|
47
51
|
copyrightHref = "https://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/uk-government-licensing-framework/crown-copyright/",
|
|
52
|
+
rebrand = true,
|
|
53
|
+
borderTopColor = "#00625E",
|
|
48
54
|
} = $props<{
|
|
49
55
|
sections?: FooterSection[];
|
|
50
56
|
inlineLinks?: FooterItem[];
|
|
@@ -60,12 +66,46 @@
|
|
|
60
66
|
licenceTextBefore?: string;
|
|
61
67
|
licenceTextAfter?: string;
|
|
62
68
|
copyrightHref?: string;
|
|
69
|
+
rebrand?: boolean;
|
|
70
|
+
borderTopColor?: string;
|
|
63
71
|
}>();
|
|
64
72
|
</script>
|
|
65
73
|
|
|
66
74
|
<!-- Main footer container -->
|
|
67
|
-
<footer
|
|
75
|
+
<footer
|
|
76
|
+
class="govuk-footer"
|
|
77
|
+
class:govuk-footer--rebranded={rebrand}
|
|
78
|
+
style:border-top-color={borderTopColor}
|
|
79
|
+
>
|
|
68
80
|
<div class={containerWidth}>
|
|
81
|
+
{#if rebrand}
|
|
82
|
+
<!-- New rebranded crown logo for footer -->
|
|
83
|
+
<svg
|
|
84
|
+
focusable="false"
|
|
85
|
+
role="presentation"
|
|
86
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
87
|
+
viewBox="0 0 64 60"
|
|
88
|
+
height="30"
|
|
89
|
+
width="32"
|
|
90
|
+
fill="currentcolor"
|
|
91
|
+
class="govuk-footer__crown"
|
|
92
|
+
>
|
|
93
|
+
<g>
|
|
94
|
+
<circle cx="20" cy="17.6" r="3.7"></circle>
|
|
95
|
+
<circle cx="10.2" cy="23.5" r="3.7"></circle>
|
|
96
|
+
<circle cx="3.7" cy="33.2" r="3.7"></circle>
|
|
97
|
+
<circle cx="31.7" cy="30.6" r="3.7"></circle>
|
|
98
|
+
<circle cx="43.3" cy="17.6" r="3.7"></circle>
|
|
99
|
+
<circle cx="53.2" cy="23.5" r="3.7"></circle>
|
|
100
|
+
<circle cx="59.7" cy="33.2" r="3.7"></circle>
|
|
101
|
+
<circle cx="31.7" cy="30.6" r="3.7"></circle>
|
|
102
|
+
<path
|
|
103
|
+
d="M33.1,9.8c.2-.1.3-.3.5-.5l4.6,2.4v-6.8l-4.6,1.5c-.1-.2-.3-.3-.5-.5l1.9-5.9h-6.7l1.9,5.9c-.2.1-.3.3-.5.5l-4.6-1.5v6.8l4.6-2.4c.1.2.3.3.5.5l-2.6,8c-.9,2.8,1.2,5.7,4.1,5.7h0c3,0,5.1-2.9,4.1-5.7l-2.6-8ZM37,37.9s-3.4,3.8-4.1,6.1c2.2,0,4.2-.5,6.4-2.8l-.7,8.5c-2-2.8-4.4-4.1-5.7-3.8.1,3.1.5,6.7,5.8,7.2,3.7.3,6.7-1.5,7-3.8.4-2.6-2-4.3-3.7-1.6-1.4-4.5,2.4-6.1,4.9-3.2-1.9-4.5-1.8-7.7,2.4-10.9,3,4,2.6,7.3-1.2,11.1,2.4-1.3,6.2,0,4,4.6-1.2-2.8-3.7-2.2-4.2.2-.3,1.7.7,3.7,3,4.2,1.9.3,4.7-.9,7-5.9-1.3,0-2.4.7-3.9,1.7l2.4-8c.6,2.3,1.4,3.7,2.2,4.5.6-1.6.5-2.8,0-5.3l5,1.8c-2.6,3.6-5.2,8.7-7.3,17.5-7.4-1.1-15.7-1.7-24.5-1.7h0c-8.8,0-17.1.6-24.5,1.7-2.1-8.9-4.7-13.9-7.3-17.5l5-1.8c-.5,2.5-.6,3.7,0,5.3.8-.8,1.6-2.3,2.2-4.5l2.4,8c-1.5-1-2.6-1.7-3.9-1.7,2.3,5,5.2,6.2,7,5.9,2.3-.4,3.3-2.4,3-4.2-.5-2.4-3-3.1-4.2-.2-2.2-4.6,1.6-6,4-4.6-3.7-3.7-4.2-7.1-1.2-11.1,4.2,3.2,4.3,6.4,2.4,10.9,2.5-2.8,6.3-1.3,4.9,3.2-1.8-2.7-4.1-1-3.7,1.6.3,2.3,3.3,4.1,7,3.8,5.4-.5,5.7-4.2,5.8-7.2-1.3-.2-3.7,1-5.7,3.8l-.7-8.5c2.2,2.3,4.2,2.7,6.4,2.8-.7-2.3-4.1-6.1-4.1-6.1h10.6,0Z"
|
|
104
|
+
></path>
|
|
105
|
+
</g>
|
|
106
|
+
</svg>
|
|
107
|
+
{/if}
|
|
108
|
+
|
|
69
109
|
<!-- Navigation sections (optional) -->
|
|
70
110
|
{#if sections.length > 0}
|
|
71
111
|
<div class="govuk-footer__navigation">
|
|
@@ -117,6 +157,7 @@
|
|
|
117
157
|
href={link.href}
|
|
118
158
|
lang={link.lang}
|
|
119
159
|
hreflang={link.hrefLang}
|
|
160
|
+
onclick={link.onclick}
|
|
120
161
|
>
|
|
121
162
|
{link.label}
|
|
122
163
|
</a>
|
|
@@ -157,10 +198,34 @@
|
|
|
157
198
|
<!-- Crown copyright section (optional) -->
|
|
158
199
|
{#if showCopyright}
|
|
159
200
|
<div class="govuk-footer__meta-item">
|
|
201
|
+
<!--
|
|
202
|
+
Copyright logo handling:
|
|
203
|
+
|
|
204
|
+
The GOV.UK Frontend CSS uses a ::before pseudo-element on .govuk-footer__copyright-logo
|
|
205
|
+
to display the crown logo. This creates conflicts when we want to use custom logos.
|
|
206
|
+
|
|
207
|
+
Our approach:
|
|
208
|
+
1. When using a custom logo (copyrightLogoUrl provided):
|
|
209
|
+
- Remove the govuk-footer__copyright-logo class to disable the pseudo-element
|
|
210
|
+
- Apply explicit background-image styles to show the custom logo
|
|
211
|
+
|
|
212
|
+
2. When using default logos:
|
|
213
|
+
- Rebrand mode: Let the CSS pseudo-element handle it (uses rebrand assets)
|
|
214
|
+
- Legacy mode: Always use explicit styling (uses legacy assets)
|
|
215
|
+
|
|
216
|
+
This prevents logo duplication/overlap while maintaining backward compatibility.
|
|
217
|
+
-->
|
|
160
218
|
<a
|
|
161
|
-
class=
|
|
219
|
+
class={[
|
|
220
|
+
"govuk-footer__link",
|
|
221
|
+
{
|
|
222
|
+
"govuk-footer__copyright-logo": !copyrightLogoUrl && rebrand,
|
|
223
|
+
},
|
|
224
|
+
]}
|
|
162
225
|
href={copyrightHref}
|
|
163
|
-
style=
|
|
226
|
+
style={copyrightLogoUrl || !rebrand
|
|
227
|
+
? `background-image: url(${copyrightLogoUrl ?? legacyDefaultCopyrightLogo}); display: block; width: 100%; padding-top: 112px; background-repeat: no-repeat; background-position: 50% 0; background-size: 125px 102px; text-align: center;`
|
|
228
|
+
: ""}
|
|
164
229
|
>
|
|
165
230
|
{copyrightText}
|
|
166
231
|
</a>
|
|
@@ -3,6 +3,7 @@ interface FooterItem {
|
|
|
3
3
|
label: string;
|
|
4
4
|
lang?: string;
|
|
5
5
|
hrefLang?: string;
|
|
6
|
+
onclick?: (event: Event) => void;
|
|
6
7
|
}
|
|
7
8
|
interface FooterSection {
|
|
8
9
|
title: string;
|
|
@@ -24,6 +25,8 @@ type $$ComponentProps = {
|
|
|
24
25
|
licenceTextBefore?: string;
|
|
25
26
|
licenceTextAfter?: string;
|
|
26
27
|
copyrightHref?: string;
|
|
28
|
+
rebrand?: boolean;
|
|
29
|
+
borderTopColor?: string;
|
|
27
30
|
};
|
|
28
31
|
declare const Footer: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
29
32
|
type Footer = ReturnType<typeof Footer>;
|
|
@@ -4,9 +4,14 @@ Most services on GOV.UK should use the default GOV.UK header.
|
|
|
4
4
|
It should only show the GOV.UK logo and any GOV.UK-wide links and tools to help your users. Do not add the menu of GOV.UK topic links to your service's GOV.UK header. -->
|
|
5
5
|
|
|
6
6
|
<script lang="ts">
|
|
7
|
-
let {
|
|
7
|
+
let {
|
|
8
|
+
fullWidthBorder = false,
|
|
9
|
+
homepageUrl = "/",
|
|
10
|
+
rebrand = true,
|
|
11
|
+
} = $props<{
|
|
8
12
|
fullWidthBorder?: boolean;
|
|
9
13
|
homepageUrl?: string;
|
|
14
|
+
rebrand?: boolean;
|
|
10
15
|
}>();
|
|
11
16
|
</script>
|
|
12
17
|
|
|
@@ -22,21 +27,56 @@ It should only show the GOV.UK logo and any GOV.UK-wide links and tools to help
|
|
|
22
27
|
href={homepageUrl}
|
|
23
28
|
class="govuk-header__link govuk-header__link--homepage"
|
|
24
29
|
>
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
30
|
+
{#if rebrand}
|
|
31
|
+
<!-- New rebranded GOV.UK logo with integrated crown -->
|
|
32
|
+
<svg
|
|
33
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
34
|
+
focusable="false"
|
|
35
|
+
role="img"
|
|
36
|
+
viewBox="0 0 324 60"
|
|
37
|
+
height="30"
|
|
38
|
+
width="162"
|
|
39
|
+
fill="currentcolor"
|
|
40
|
+
class="govuk-header__logotype"
|
|
41
|
+
aria-label="GOV.UK"
|
|
42
|
+
>
|
|
43
|
+
<title>GOV.UK</title>
|
|
44
|
+
<g>
|
|
45
|
+
<circle cx="20" cy="17.6" r="3.7"></circle>
|
|
46
|
+
<circle cx="10.2" cy="23.5" r="3.7"></circle>
|
|
47
|
+
<circle cx="3.7" cy="33.2" r="3.7"></circle>
|
|
48
|
+
<circle cx="31.7" cy="30.6" r="3.7"></circle>
|
|
49
|
+
<circle cx="43.3" cy="17.6" r="3.7"></circle>
|
|
50
|
+
<circle cx="53.2" cy="23.5" r="3.7"></circle>
|
|
51
|
+
<circle cx="59.7" cy="33.2" r="3.7"></circle>
|
|
52
|
+
<circle cx="31.7" cy="30.6" r="3.7"></circle>
|
|
53
|
+
<path
|
|
54
|
+
d="M33.1,9.8c.2-.1.3-.3.5-.5l4.6,2.4v-6.8l-4.6,1.5c-.1-.2-.3-.3-.5-.5l1.9-5.9h-6.7l1.9,5.9c-.2.1-.3.3-.5.5l-4.6-1.5v6.8l4.6-2.4c.1.2.3.3.5.5l-2.6,8c-.9,2.8,1.2,5.7,4.1,5.7h0c3,0,5.1-2.9,4.1-5.7l-2.6-8ZM37,37.9s-3.4,3.8-4.1,6.1c2.2,0,4.2-.5,6.4-2.8l-.7,8.5c-2-2.8-4.4-4.1-5.7-3.8.1,3.1.5,6.7,5.8,7.2,3.7.3,6.7-1.5,7-3.8.4-2.6-2-4.3-3.7-1.6-1.4-4.5,2.4-6.1,4.9-3.2-1.9-4.5-1.8-7.7,2.4-10.9,3,4,2.6,7.3-1.2,11.1,2.4-1.3,6.2,0,4,4.6-1.2-2.8-3.7-2.2-4.2.2-.3,1.7.7,3.7,3,4.2,1.9.3,4.7-.9,7-5.9-1.3,0-2.4.7-3.9,1.7l2.4-8c.6,2.3,1.4,3.7,2.2,4.5.6-1.6.5-2.8,0-5.3l5,1.8c-2.6,3.6-5.2,8.7-7.3,17.5-7.4-1.1-15.7-1.7-24.5-1.7h0c-8.8,0-17.1.6-24.5,1.7-2.1-8.9-4.7-13.9-7.3-17.5l5-1.8c-.5,2.5-.6,3.7,0,5.3.8-.8,1.6-2.3,2.2-4.5l2.4,8c-1.5-1-2.6-1.7-3.9-1.7,2.3,5,5.2,6.2,7,5.9,2.3-.4,3.3-2.4,3-4.2-.5-2.4-3-3.1-4.2-.2-2.2-4.6,1.6-6,4-4.6-3.7-3.7-4.2-7.1-1.2-11.1,4.2,3.2,4.3,6.4,2.4,10.9,2.5-2.8,6.3-1.3,4.9,3.2-1.8-2.7-4.1-1-3.7,1.6.3,2.3,3.3,4.1,7,3.8,5.4-.5,5.7-4.2,5.8-7.2-1.3-.2-3.7,1-5.7,3.8l-.7-8.5c2.2,2.3,4.2,2.7,6.4,2.8-.7-2.3-4.1-6.1-4.1-6.1h10.6,0Z"
|
|
55
|
+
></path>
|
|
56
|
+
</g>
|
|
57
|
+
<circle class="govuk-logo-dot" cx="227" cy="36" r="7.3"></circle>
|
|
58
|
+
<path
|
|
59
|
+
d="M94.7,36.1c0,1.9.2,3.6.7,5.4.5,1.7,1.2,3.2,2.1,4.5.9,1.3,2.2,2.4,3.6,3.2,1.5.8,3.2,1.2,5.3,1.2s3.6-.3,4.9-.9c1.3-.6,2.3-1.4,3.1-2.3.8-.9,1.3-2,1.6-3,.3-1.1.5-2.1.5-3v-.4h-11v-6.6h19.5v24h-7.7v-5.4c-.5.8-1.2,1.6-2,2.3-.8.7-1.7,1.3-2.7,1.8-1,.5-2.1.9-3.3,1.2-1.2.3-2.5.4-3.8.4-3.2,0-6-.6-8.4-1.7-2.5-1.1-4.5-2.7-6.2-4.7-1.7-2-3-4.4-3.8-7.1-.9-2.7-1.3-5.6-1.3-8.7s.5-6,1.5-8.7,2.4-5.1,4.2-7.1c1.8-2,4-3.6,6.5-4.7s5.4-1.7,8.6-1.7s4,.2,5.9.7c1.8.5,3.5,1.1,5.1,2,1.5.9,2.9,1.9,4,3.2,1.2,1.2,2.1,2.6,2.8,4.1l-7.7,4.3c-.5-.9-1-1.8-1.6-2.6-.6-.8-1.3-1.5-2.2-2.1-.8-.6-1.7-1-2.8-1.4-1-.3-2.2-.5-3.5-.5-2,0-3.8.4-5.3,1.2s-2.7,1.9-3.6,3.2c-.9,1.3-1.7,2.8-2.1,4.6s-.7,3.5-.7,5.3v.3h0ZM152.9,13.7c3.2,0,6.1.6,8.7,1.7,2.6,1.2,4.7,2.7,6.5,4.7,1.8,2,3.1,4.4,4.1,7.1s1.4,5.6,1.4,8.7-.5,6-1.4,8.7c-.9,2.7-2.3,5.1-4.1,7.1s-4,3.6-6.5,4.7c-2.6,1.1-5.5,1.7-8.7,1.7s-6.1-.6-8.7-1.7c-2.6-1.1-4.7-2.7-6.5-4.7-1.8-2-3.1-4.4-4.1-7.1-.9-2.7-1.4-5.6-1.4-8.7s.5-6,1.4-8.7,2.3-5.1,4.1-7.1c1.8-2,4-3.6,6.5-4.7s5.4-1.7,8.7-1.7h0ZM152.9,50.4c1.9,0,3.6-.4,5-1.1,1.4-.7,2.7-1.7,3.6-3,1-1.3,1.7-2.8,2.2-4.5.5-1.7.8-3.6.8-5.7v-.2c0-2-.3-3.9-.8-5.7-.5-1.7-1.3-3.3-2.2-4.5-1-1.3-2.2-2.3-3.6-3-1.4-.7-3.1-1.1-5-1.1s-3.6.4-5,1.1c-1.5.7-2.7,1.7-3.6,3s-1.7,2.8-2.2,4.5c-.5,1.7-.8,3.6-.8,5.7v.2c0,2.1.3,4,.8,5.7.5,1.7,1.2,3.2,2.2,4.5,1,1.3,2.2,2.3,3.6,3,1.5.7,3.1,1.1,5,1.1ZM189.1,58l-12.3-44h9.8l8.4,32.9h.3l8.2-32.9h9.7l-12.3,44M262.9,50.4c1.3,0,2.5-.2,3.6-.6,1.1-.4,2-.9,2.8-1.7.8-.8,1.4-1.7,1.9-2.9.5-1.2.7-2.5.7-4.1V14h8.6v28.5c0,2.4-.4,4.6-1.3,6.6-.9,2-2.1,3.6-3.7,5-1.6,1.4-3.4,2.4-5.6,3.2-2.2.7-4.5,1.1-7.1,1.1s-4.9-.4-7.1-1.1c-2.2-.7-4-1.8-5.6-3.2s-2.8-3-3.7-5c-.9-2-1.3-4.1-1.3-6.6V14h8.7v27.2c0,1.6.2,2.9.7,4.1.5,1.2,1.1,2.1,1.9,2.9.8.8,1.7,1.3,2.8,1.7s2.3.6,3.6.6h0ZM288.5,14h8.7v19.1l15.5-19.1h10.8l-15.1,17.6,16.1,26.4h-10.2l-11.5-19.7-5.6,6.3v13.5h-8.7"
|
|
60
|
+
></path>
|
|
61
|
+
</svg>
|
|
62
|
+
{:else}
|
|
63
|
+
<!-- Original GOV.UK logo -->
|
|
64
|
+
<svg
|
|
65
|
+
focusable="false"
|
|
66
|
+
role="img"
|
|
67
|
+
class="govuk-header__logotype"
|
|
68
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
69
|
+
viewBox="0 0 148 30"
|
|
70
|
+
height="30"
|
|
71
|
+
width="148"
|
|
72
|
+
aria-label="GOV.UK"
|
|
73
|
+
>
|
|
74
|
+
<title>GOV.UK</title>
|
|
75
|
+
<path
|
|
76
|
+
d="M22.6 10.4c-1 .4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s-.1 2-1 2.4m-5.9 6.7c-.9.4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s-.1 2-1 2.4m10.8-3.7c-1 .4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s0 2-1 2.4m3.3 4.8c-1 .4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s-.1 2-1 2.4M17 4.7l2.3 1.2V2.5l-2.3.7-.2-.2.9-3h-3.4l.9 3-.2.2c-.1.1-2.3-.7-2.3-.7v3.4L15 4.7c.1.1.1.2.2.2l-1.3 4c-.1.2-.1.4-.1.6 0 1.1.8 2 1.9 2.2h.7c1-.2 1.9-1.1 1.9-2.1 0-.2 0-.4-.1-.6l-1.3-4c-.1-.2 0-.2.1-.3m-7.6 5.7c.9.4 2-.1 2.4-1 .4-.9-.1-2-1-2.4-.9-.4-2 .1-2.4 1s0 2 1 2.4m-5 3c.9.4 2-.1 2.4-1 .4-.9-.1-2-1-2.4-.9-.4-2 .1-2.4 1s.1 2 1 2.4m-3.2 4.8c.9.4 2-.1 2.4-1 .4-.9-.1-2-1-2.4-.9-.4-2 .1-2.4 1s0 2 1 2.4m14.8 11c4.4 0 8.6.3 12.3.8 1.1-4.5 2.4-7 3.7-8.8l-2.5-.9c.2 1.3.3 1.9 0 2.7-.4-.4-.8-1.1-1.1-2.3l-1.2 4c.7-.5 1.3-.8 2-.9-1.1 2.5-2.6 3.1-3.5 3-1.1-.2-1.7-1.2-1.5-2.1.3-1.2 1.5-1.5 2.1-.1 1.1-2.3-.8-3-2-2.3 1.9-1.9 2.1-3.5.6-5.6-2.1 1.6-2.1 3.2-1.2 5.5-1.2-1.4-3.2-.6-2.5 1.6.9-1.4 2.1-.5 1.9.8-.2 1.1-1.7 2.1-3.5 1.9-2.7-.2-2.9-2.1-2.9-3.6.7-.1 1.9.5 2.9 1.9l.4-4.3c-1.1 1.1-2.1 1.4-3.2 1.4.4-1.2 2.1-3 2.1-3h-5.4s1.7 1.9 2.1 3c-1.1 0-2.1-.2-3.2-1.4l.4 4.3c1-1.4 2.2-2 2.9-1.9-.1 1.5-.2 3.4-2.9 3.6-1.9.2-3.4-.8-3.5-1.9-.2-1.3 1-2.2 1.9-.8.7-2.3-1.2-3-2.5-1.6.9-2.2.9-3.9-1.2-5.5-1.5 2-1.3 3.7.6 5.6-1.2-.7-3.1 0-2 2.3.6-1.4 1.8-1.1 2.1.1.2.9-.3 1.9-1.5 2.1-.9.2-2.4-.5-3.5-3 .6 0 1.2.3 2 .9l-1.2-4c-.3 1.1-.7 1.9-1.1 2.3-.3-.8-.2-1.4 0-2.7l-2.9.9C1.3 23 2.6 25.5 3.7 30c3.7-.5 7.9-.8 12.3-.8m28.3-11.6c0 .9.1 1.7.3 2.5.2.8.6 1.5 1 2.2.5.6 1 1.1 1.7 1.5.7.4 1.5.6 2.5.6.9 0 1.7-.1 2.3-.4s1.1-.7 1.5-1.1c.4-.4.6-.9.8-1.5.1-.5.2-1 .2-1.5v-.2h-5.3v-3.2h9.4V28H55v-2.5c-.3.4-.6.8-1 1.1-.4.3-.8.6-1.3.9-.5.2-1 .4-1.6.6s-1.2.2-1.8.2c-1.5 0-2.9-.3-4-.8-1.2-.6-2.2-1.3-3-2.3-.8-1-1.4-2.1-1.8-3.4-.3-1.4-.5-2.8-.5-4.3s.2-2.9.7-4.2c.5-1.3 1.1-2.4 2-3.4.9-1 1.9-1.7 3.1-2.3 1.2-.6 2.6-.8 4.1-.8 1 0 1.9.1 2.8.3.9.2 1.7.6 2.4 1s1.4.9 1.9 1.5c.6.6 1 1.3 1.4 2l-3.7 2.1c-.2-.4-.5-.9-.8-1.2-.3-.4-.6-.7-1-1-.4-.3-.8-.5-1.3-.7-.5-.2-1.1-.2-1.7-.2-1 0-1.8.2-2.5.6-.7.4-1.3.9-1.7 1.5-.5.6-.8 1.4-1 2.2-.3.8-.4 1.9-.4 2.7zM71.5 6.8c1.5 0 2.9.3 4.2.8 1.2.6 2.3 1.3 3.1 2.3.9 1 1.5 2.1 2 3.4s.7 2.7.7 4.2-.2 2.9-.7 4.2c-.4 1.3-1.1 2.4-2 3.4-.9 1-1.9 1.7-3.1 2.3-1.2.6-2.6.8-4.2.8s-2.9-.3-4.2-.8c-1.2-.6-2.3-1.3-3.1-2.3-.9-1-1.5-2.1-2-3.4-.4-1.3-.7-2.7-.7-4.2s.2-2.9.7-4.2c.4-1.3 1.1-2.4 2-3.4.9-1 1.9-1.7 3.1-2.3 1.2-.5 2.6-.8 4.2-.8zm0 17.6c.9 0 1.7-.2 2.4-.5s1.3-.8 1.7-1.4c.5-.6.8-1.3 1.1-2.2.2-.8.4-1.7.4-2.7v-.1c0-1-.1-1.9-.4-2.7-.2-.8-.6-1.6-1.1-2.2-.5-.6-1.1-1.1-1.7-1.4-.7-.3-1.5-.5-2.4-.5s-1.7.2-2.4.5-1.3.8-1.7 1.4c-.5.6-.8 1.3-1.1 2.2-.2.8-.4 1.7-.4 2.7v.1c0 1 .1 1.9.4 2.7.2.8.6 1.6 1.1 2.2.5.6 1.1 1.1 1.7 1.4.6.3 1.4.5 2.4.5zM88.9 28 83 7h4.7l4 15.7h.1l4-15.7h4.7l-5.9 21h-5.7zm28.8-3.6c.6 0 1.2-.1 1.7-.3.5-.2 1-.4 1.4-.8.4-.4.7-.8.9-1.4.2-.6.3-1.2.3-2v-13h4.1v13.6c0 1.2-.2 2.2-.6 3.1s-1 1.7-1.8 2.4c-.7.7-1.6 1.2-2.7 1.5-1 .4-2.2.5-3.4.5-1.2 0-2.4-.2-3.4-.5-1-.4-1.9-.9-2.7-1.5-.8-.7-1.3-1.5-1.8-2.4-.4-.9-.6-2-.6-3.1V6.9h4.2v13c0 .8.1 1.4.3 2 .2.6.5 1 .9 1.4.4.4.8.6 1.4.8.6.2 1.1.3 1.8.3zm13-17.4h4.2v9.1l7.4-9.1h5.2l-7.2 8.4L148 28h-4.9l-5.5-9.4-2.7 3V28h-4.2V7zm-27.6 16.1c-1.5 0-2.7 1.2-2.7 2.7s1.2 2.7 2.7 2.7 2.7-1.2 2.7-2.7-1.2-2.7-2.7-2.7z"
|
|
77
|
+
></path>
|
|
78
|
+
</svg>
|
|
79
|
+
{/if}
|
|
40
80
|
</a>
|
|
41
81
|
</div>
|
|
42
82
|
</div>
|