cec-nuxt-lib 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,8 @@
1
+ # Cec Vue Lib
2
+ Nuxt modules for use with Blocks
3
+
4
+ [![npm version][npm-version-src]][npm-version-href]
5
+ [![npm downloads][npm-downloads-src]][npm-downloads-href]
6
+ [![License][license-src]][license-href]
7
+ [![Nuxt][nuxt-src]][nuxt-href]
8
+
@@ -0,0 +1,5 @@
1
+ module.exports = function(...args) {
2
+ return import('./module.mjs').then(m => m.default.call(this, ...args))
3
+ }
4
+ const _meta = module.exports.meta = require('./module.json')
5
+ module.exports.getMeta = () => Promise.resolve(_meta)
@@ -0,0 +1,7 @@
1
+ import * as _nuxt_schema from '@nuxt/schema';
2
+
3
+ interface ModuleOptions {
4
+ }
5
+ declare const _default: _nuxt_schema.NuxtModule<ModuleOptions>;
6
+
7
+ export { type ModuleOptions, _default as default };
@@ -0,0 +1,7 @@
1
+ import * as _nuxt_schema from '@nuxt/schema';
2
+
3
+ interface ModuleOptions {
4
+ }
5
+ declare const _default: _nuxt_schema.NuxtModule<ModuleOptions>;
6
+
7
+ export { type ModuleOptions, _default as default };
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "cec-vue-lib",
3
+ "configKey": "cec-vue-lib",
4
+ "version": "0.0.1"
5
+ }
@@ -0,0 +1,19 @@
1
+ import { defineNuxtModule, createResolver, addComponentsDir, addImportsDir } from '@nuxt/kit';
2
+
3
+ const module = defineNuxtModule({
4
+ meta: {
5
+ name: "cec-vue-lib",
6
+ configKey: "cec-vue-lib"
7
+ },
8
+ // Default configuration options of the Nuxt module
9
+ defaults: {},
10
+ setup(options, nuxt) {
11
+ const resolver = createResolver(import.meta.url);
12
+ addComponentsDir({
13
+ path: resolver.resolve("./runtime/components")
14
+ });
15
+ addImportsDir(resolver.resolve("./runtime/composables"));
16
+ }
17
+ });
18
+
19
+ export { module as default };
@@ -0,0 +1,60 @@
1
+ <script setup lang="ts">
2
+ import { useRoute } from 'vue-router';
3
+ import { useState } from '#app';
4
+ const path = useState('path');
5
+ const route = useRoute();
6
+ let length = path.value.split('/').length - 1;
7
+ const truePath = route.path === '/' ? path.value : path.value + route.path;
8
+ let routes = route.path.split('/');
9
+
10
+ const makeLink = (i) => {
11
+ let diff = i - length;
12
+ if (!diff) {
13
+ return '/';
14
+ }
15
+ return routes.slice(0, diff + 1).join('/');
16
+ };
17
+
18
+ const toTitleCase = (str) => {
19
+ return str
20
+ .split('_')
21
+ .map((w) => w[0].toUpperCase() + w.slice(1))
22
+ .join(' ');
23
+ };
24
+
25
+ let hrefs = truePath.replace(/-/g, '_').split('/');
26
+ const links = hrefs.map((e, i) =>
27
+ !e
28
+ ? 'Home'
29
+ : truePath.includes('/parties/') && i === hrefs.length - 1
30
+ ? toTitleCase(e)
31
+ : `${e[0].toUpperCase()}${e
32
+ .slice(1)
33
+ .replace(/[-_]/g, ' ')
34
+ .replace(/\shmo\s/, ' HMO ')}`
35
+ );
36
+ </script>
37
+ <template>
38
+ <div class="cec-breadcrumb-bg">
39
+ <div class="container">
40
+ <div class="row">
41
+ <div class="col">
42
+ <nav class="no-print-url" aria-label="breadcrumb">
43
+ <ol class="breadcrumb cec-breadcrumb my-0 py-2">
44
+ <li class="breadcrumb-item" v-for="(l, i) in links" :key="i">
45
+ <span v-if="i === links.length - 1">{{ l }}</span>
46
+ <NuxtLink v-else-if="i >= length" :to="makeLink(i)">
47
+ {{ l }}</NuxtLink
48
+ >
49
+ <a v-else-if="!i" href="/home-page">{{ l }}</a>
50
+ <a v-else :href="'/' + hrefs.slice(1, i + 1).join('/')">
51
+ {{ l }}</a
52
+ >
53
+ </li>
54
+ </ol>
55
+ </nav>
56
+ </div>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </template>
@@ -0,0 +1,104 @@
1
+ <script setup lang="ts">
2
+ const props = defineProps({
3
+ reviewed: {
4
+ type: String,
5
+ required: true,
6
+ },
7
+ path: {
8
+ type: String,
9
+ required: true,
10
+ },
11
+ title: {
12
+ type: String,
13
+ required: true,
14
+ },
15
+ });
16
+
17
+ const { path, title, reviewed } = props;
18
+ </script>
19
+
20
+ <template>
21
+ <div class="container mt-5">
22
+ <div class="row">
23
+ <div class="col-lg-8">
24
+ <p>
25
+ <small>Page last reviewed: {{ reviewed }} </small>
26
+ </p>
27
+ <div class="accordion pb-4">
28
+ <div class="accordion-item">
29
+ <h2 class="accordion-header" id="headingOne">
30
+ <button
31
+ class="accordion-button collapsed bg-light fw-bold"
32
+ style="outline: 1px solid #a5a5a5"
33
+ type="button"
34
+ data-bs-toggle="collapse"
35
+ data-bs-target="#collapseOne"
36
+ aria-expanded="true"
37
+ aria-controls="collapseOne"
38
+ >
39
+ Can we improve this page?
40
+ </button>
41
+ </h2>
42
+ <div
43
+ id="collapseOne"
44
+ class="accordion-collapse collapse"
45
+ aria-labelledby="headingOne"
46
+ data-bs-parent="#accordionExample"
47
+ >
48
+ <div class="accordion-body px-3">
49
+ <div class="py-4" id="feedback">
50
+ <ul class="list-unstyled list-inline">
51
+ <li class="list-inline-item me-3">
52
+ <a
53
+ :href="`https://digital-core.cheshireeast.gov.uk/w/webpage/request?form=improve_this_page&pageTitle=${encodeURIComponent(title)}&pagePath=https://www.cheshireeast.gov.uk${path}`"
54
+ id="yes-feedback"
55
+ class="liberty_form_link btn btn-lg btn-outline-secondary btn-example-1 btn-chevron rounded-pill text-left"
56
+ >Yes<span class="visually-hidden">
57
+ - this page can be improved.</span
58
+ ></a
59
+ >
60
+ </li>
61
+ <li class="list-inline-item">
62
+ <a
63
+ href="#feedback"
64
+ id="feedback-no"
65
+ class="btn btn-lg btn-outline-secondary btn-example-1 btn-chevron rounded-pill text-left"
66
+ >No<span class="visually-hidden">
67
+ - this page can't be improved.</span
68
+ ></a
69
+ >
70
+ </li>
71
+ </ul>
72
+ <div id="feedback-content" class="hide">
73
+ <!-- feedback received icon -->
74
+ <p class="ms-2 mt-5 mb-0">
75
+ <svg
76
+ xmlns="http://www.w3.org/2000/svg"
77
+ width="32"
78
+ height="32"
79
+ fill="currentColor"
80
+ class="bi bi-check-square"
81
+ viewBox="0 0 16 16"
82
+ >
83
+ <path
84
+ d="M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"
85
+ />
86
+ <path
87
+ d="M10.97 4.97a.75.75 0 0 1 1.071 1.05l-3.992 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.235.235 0 0 1 .02-.022z"
88
+ />
89
+ </svg>
90
+ <!-- / feedback received icon -->
91
+ <span class="ms-1 ms-md-3"
92
+ >Thank you for your feedback.</span
93
+ >
94
+ </p>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ </div>
104
+ </template>
@@ -0,0 +1,191 @@
1
+ <template>
2
+ <footer class="mt-5">
3
+ <div class="py-4 footer-header">
4
+ <div class="container position-relative">
5
+ <div class="row">
6
+ <div class="col-md-4">
7
+ <nav>
8
+ <h2 class="fs-4 mb-3 pb-2">Using this site</h2>
9
+ <ul class="list-unstyled cec-sub-nav">
10
+ <li>
11
+ <a href="/a_to_z_site_index/a_to_z_site_index.aspx"
12
+ >A to Z site index</a
13
+ >
14
+ </li>
15
+ <li>
16
+ <a
17
+ href="/council_and_democracy/council_information/website_information/accessibility.aspx"
18
+ >Accessibility</a
19
+ >
20
+ </li>
21
+ <li>
22
+ <a
23
+ href="/council_and_democracy/council_information/website_information/cookies.aspx"
24
+ >Cookies</a
25
+ >
26
+ </li>
27
+ <li>
28
+ <a
29
+ href="/council_and_democracy/council_information/website_information/privacy-notices/privacy-notice.aspx"
30
+ >Privacy policy</a
31
+ >
32
+ </li>
33
+ </ul>
34
+ </nav>
35
+ </div>
36
+ <div class="col-md-4">
37
+ <h2 class="fs-4 mb-3 pb-2 mt-4 mt-md-0">Follow us</h2>
38
+ <nav>
39
+ <ul class="list-unstyled cec-sub-nav m-0">
40
+ <li>
41
+ <i class="me-2" role="img" aria-label="Twitter">
42
+ <svg
43
+ xmlns="http://www.w3.org/2000/svg"
44
+ shape-rendering="geometricPrecision"
45
+ text-rendering="geometricPrecision"
46
+ image-rendering="optimizeQuality"
47
+ fill-rule="evenodd"
48
+ clip-rule="evenodd"
49
+ viewBox="0 0 512 462.799"
50
+ width="22"
51
+ height="22"
52
+ >
53
+ <path
54
+ fill-rule="nonzero"
55
+ d="M403.229 0h78.506L310.219 196.04 512 462.799H354.002L230.261 301.007 88.669 462.799h-78.56l183.455-209.683L0 0h161.999l111.856 147.88L403.229 0zm-27.556 415.805h43.505L138.363 44.527h-46.68l283.99 371.278z"
56
+ ></path>
57
+ <title>Twitter icon</title>
58
+ </svg>
59
+ </i>
60
+ <a
61
+ title="(external link)"
62
+ href="https://twitter.com/CheshireEast"
63
+ >X (Twitter)</a
64
+ >
65
+ </li>
66
+ <li>
67
+ <i class="me-2" role="img" aria-label="Facebook">
68
+ <svg
69
+ xmlns="http://www.w3.org/2000/svg"
70
+ width="22"
71
+ height="22"
72
+ fill="currentColor"
73
+ class="bi bi-facebook"
74
+ viewBox="0 0 16 16"
75
+ >
76
+ <path
77
+ d="M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951z"
78
+ />
79
+ <title>Facebook icon</title>
80
+ </svg>
81
+ </i>
82
+ <a
83
+ title="(external link)"
84
+ href="https://www.facebook.com/CheshireEastCouncil"
85
+ >Facebook</a
86
+ >
87
+ </li>
88
+ <li>
89
+ <i class="me-2" role="img" aria-label="LinkedIn">
90
+ <svg
91
+ xmlns="http://www.w3.org/2000/svg"
92
+ width="22"
93
+ height="22"
94
+ fill="currentColor"
95
+ class="bi bi-linkedin"
96
+ viewBox="0 0 16 16"
97
+ >
98
+ <path
99
+ d="M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854V1.146zm4.943 12.248V6.169H2.542v7.225h2.401zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248-.822 0-1.359.54-1.359 1.248 0 .694.521 1.248 1.327 1.248h.016zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016a5.54 5.54 0 0 1 .016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225h2.4z"
100
+ />
101
+ <title>LinkedIn icon</title>
102
+ </svg>
103
+ </i>
104
+ <a
105
+ title="(external link)"
106
+ href="https://www.linkedin.com/company/cheshire-east-borough-council"
107
+ >LinkedIn</a
108
+ >
109
+ </li>
110
+ <li>
111
+ <i class="me-2" role="img" aria-label="Instagram">
112
+ <svg
113
+ xmlns="http://www.w3.org/2000/svg"
114
+ width="22"
115
+ height="22"
116
+ fill="currentColor"
117
+ class="bi bi-instagram"
118
+ viewBox="0 0 16 16"
119
+ >
120
+ <path
121
+ d="M8 0C5.829 0 5.556.01 4.703.048 3.85.088 3.269.222 2.76.42a3.917 3.917 0 0 0-1.417.923A3.927 3.927 0 0 0 .42 2.76C.222 3.268.087 3.85.048 4.7.01 5.555 0 5.827 0 8.001c0 2.172.01 2.444.048 3.297.04.852.174 1.433.372 1.942.205.526.478.972.923 1.417.444.445.89.719 1.416.923.51.198 1.09.333 1.942.372C5.555 15.99 5.827 16 8 16s2.444-.01 3.298-.048c.851-.04 1.434-.174 1.943-.372a3.916 3.916 0 0 0 1.416-.923c.445-.445.718-.891.923-1.417.197-.509.332-1.09.372-1.942C15.99 10.445 16 10.173 16 8s-.01-2.445-.048-3.299c-.04-.851-.175-1.433-.372-1.941a3.926 3.926 0 0 0-.923-1.417A3.911 3.911 0 0 0 13.24.42c-.51-.198-1.092-.333-1.943-.372C10.443.01 10.172 0 7.998 0h.003zm-.717 1.442h.718c2.136 0 2.389.007 3.232.046.78.035 1.204.166 1.486.275.373.145.64.319.92.599.28.28.453.546.598.92.11.281.24.705.275 1.485.039.843.047 1.096.047 3.231s-.008 2.389-.047 3.232c-.035.78-.166 1.203-.275 1.485a2.47 2.47 0 0 1-.599.919c-.28.28-.546.453-.92.598-.28.11-.704.24-1.485.276-.843.038-1.096.047-3.232.047s-2.39-.009-3.233-.047c-.78-.036-1.203-.166-1.485-.276a2.478 2.478 0 0 1-.92-.598 2.48 2.48 0 0 1-.6-.92c-.109-.281-.24-.705-.275-1.485-.038-.843-.046-1.096-.046-3.233 0-2.136.008-2.388.046-3.231.036-.78.166-1.204.276-1.486.145-.373.319-.64.599-.92.28-.28.546-.453.92-.598.282-.11.705-.24 1.485-.276.738-.034 1.024-.044 2.515-.045v.002zm4.988 1.328a.96.96 0 1 0 0 1.92.96.96 0 0 0 0-1.92zm-4.27 1.122a4.109 4.109 0 1 0 0 8.217 4.109 4.109 0 0 0 0-8.217zm0 1.441a2.667 2.667 0 1 1 0 5.334 2.667 2.667 0 0 1 0-5.334z"
122
+ ></path>
123
+ <title>Instagram icon</title>
124
+ </svg>
125
+ </i>
126
+ <a
127
+ title="(external link)"
128
+ href="https://www.instagram.com/cheshireeast"
129
+ >Instagram</a
130
+ >
131
+ </li>
132
+ <li class="mb-0">
133
+ <a
134
+ href="/council_and_democracy/council_information/media_hub/our-social-media-accounts.aspx"
135
+ >All social media accounts</a
136
+ >
137
+ </li>
138
+ </ul>
139
+ </nav>
140
+ </div>
141
+ <div class="col-md-4">
142
+ <h2 class="fs-4 mb-3 pb-2 mt-5 mt-md-0">
143
+ Cheshire East Council<span class="hidden"> suggested links</span>
144
+ </h2>
145
+ <nav>
146
+ <ul class="list-unstyled cec-sub-nav">
147
+ <li>
148
+ <a
149
+ href="/council_and_democracy/customer-services/contact-us.aspx"
150
+ >Contact us</a
151
+ ><span class="hidden"> at Cheshire East Council</span>
152
+ </li>
153
+ <li>
154
+ <a href="/jobs_and_careers/jobs-and-careers.aspx"
155
+ >Jobs - working for us</a
156
+ >
157
+ </li>
158
+ <li>
159
+ <a
160
+ href="https://public.govdelivery.com/accounts/UKCHESHEC/subscriber/new?qsp"
161
+ >Sign up to email updates</a
162
+ >
163
+ </li>
164
+ </ul>
165
+ <p>
166
+ Cheshire East Council is committed to equality and diversity.
167
+ </p>
168
+ </nav>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ </div>
173
+ <!-- / footer header -->
174
+ <div class="py-2">
175
+ <div class="container py-2">
176
+ <div class="row">
177
+ <div class="col-12">
178
+ <p class="mb-0 text-md-end text-white">
179
+ <a
180
+ class="footer-copyright"
181
+ title="Copyright and Disclaimer"
182
+ href="/council_and_democracy/council_information/website_information/copyright_and_disclaimer.aspx"
183
+ ><strong>&copy; Cheshire East Council</strong></a
184
+ >
185
+ </p>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </footer>
191
+ </template>
@@ -0,0 +1,257 @@
1
+ <script setup lang="ts">
2
+ import { onMounted } from 'vue';
3
+ // Cookie control config.
4
+ const config = {
5
+ apiKey: 'c1a902dfad207b122cca32738e623af375e1d2ee',
6
+ product: 'PRO_MULTISITE',
7
+ mode: 'gdpr',
8
+ consentCookieExpiry: '365',
9
+ statement: {
10
+ description: 'For more information visit our',
11
+ name: 'Cookies page',
12
+ url: '/council_and_democracy/council_information/website_information/website_information.aspx',
13
+ updated: '08/09/2020',
14
+ },
15
+ accessibility: {
16
+ outline: true,
17
+ },
18
+ optionalCookies: [
19
+ {
20
+ name: 'analytics',
21
+ label: 'Analytics cookies',
22
+ description:
23
+ 'We would like to set Google Analytics cookies. This helps us to improve our website by collecting and reporting information on its usage and is done in a way that does not directly identify anyone.',
24
+ cookies: [
25
+ '_ga',
26
+ '_gid',
27
+ '__utma',
28
+ '__utmt',
29
+ '__utmb',
30
+ '__utmc',
31
+ '__utmz',
32
+ '__utm.gif',
33
+ ],
34
+ onAccept: function () {
35
+ // Add Google Analytics via GTM
36
+ // assumes the associated event has been created within GTM
37
+ // and that event in turn loads analytics
38
+ dataLayer.push({
39
+ event: 'analytics_consent_given',
40
+ });
41
+ // End Google Analytics
42
+ },
43
+ onRevoke: function () {},
44
+ },
45
+ {
46
+ name: 'marketing',
47
+ label: 'Marketing cookies',
48
+ description:
49
+ 'We would like to embed Facebook feeds. In return they use marketing cookies to track visitors across websites. The intention is to display ads that are relevant and engaging for the individual user and thereby more valuable for publishers and third party advertisers.',
50
+ cookies: ['guest_id', 'personalization_id'],
51
+ onAccept: function () {
52
+ // Facebook feed
53
+ !(function (d, s, id) {
54
+ var js,
55
+ fjs = d.getElementsByTagName(s)[0];
56
+ if (d.getElementById(id)) return;
57
+ js = d.createElement(s);
58
+ js.id = id;
59
+ js.src = '//connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v2.3';
60
+ fjs.parentNode.insertBefore(js, fjs);
61
+ })(document, 'script', 'facebook-jssdk');
62
+ },
63
+ onRevoke: function () {
64
+ fjs('consent', 'revoke');
65
+ },
66
+ },
67
+ ],
68
+ position: 'LEFT',
69
+ theme: 'DARK',
70
+ branding: {
71
+ fontColor: '#FFF',
72
+ fontSizeTitle: '1.2em',
73
+ fontSizeIntro: '1em',
74
+ fontSizeHeaders: '1em',
75
+ fontSize: '1em',
76
+ backgroundColor: '#206c49',
77
+ toggleText: '#fff',
78
+ toggleColor: '#68907e',
79
+ toggleBackground: '#144a31',
80
+ buttonIcon: null,
81
+ buttonIconWidth: '64px',
82
+ buttonIconHeight: '64px',
83
+ removeIcon: false,
84
+ removeAbout: true,
85
+ },
86
+ };
87
+
88
+ const updateToggleText = () => {
89
+ const x = document.getElementById('baToggleText');
90
+ if (x.innerText === 'Listen and translate') {
91
+ x.innerText = 'Close listen and translate';
92
+ } else {
93
+ x.innerText = 'Listen and translate';
94
+ }
95
+ };
96
+
97
+ const doSearch = () => {
98
+ let search = searchTextBox.value;
99
+ if (search !== 'Enter keywords') {
100
+ window.location.href =
101
+ '/search.aspx?search_keywords=' + encodeURIComponent(search);
102
+ }
103
+ };
104
+
105
+ // Set some things up once page has mounted.
106
+ onMounted(() => {
107
+ const searchBtn = document.getElementById(
108
+ 'SearchQueryControl_SearchButton',
109
+ );
110
+ const searchTextBox = document.getElementById('searchTextBox');
111
+ searchBtn.addEventListener('click', doSearch);
112
+ searchTextBox.addEventListener('focus', () => (searchTextBox.value = ''));
113
+ searchTextBox.addEventListener('keydown', (event) => {
114
+ if (event.key === 'Enter') {
115
+ doSearch();
116
+ }
117
+ });
118
+ try {
119
+ CookieControl.load(config);
120
+ } catch (ignore) {
121
+ console.log('No cookie control');
122
+ }
123
+ try {
124
+ BrowseAloud.disableBrowsealoudAnalytics();
125
+ } catch (ignore) {
126
+ console.log('No reachdeck.');
127
+ }
128
+ });
129
+ </script>
130
+
131
+ <template>
132
+ <div>
133
+ <div class="visually-hidden-focusable overflow-hidden">
134
+ <div class="d-print-none">
135
+ <a
136
+ tabindex="1"
137
+ id="skip"
138
+ class="skip-to-content position-absolute py-1 px-2"
139
+ style="z-index: 100000"
140
+ href="#app"
141
+ >Skip to content</a
142
+ >
143
+ </div>
144
+ </div>
145
+ <div id="__ba_panel"></div>
146
+ <header class="cec-header">
147
+ <div class="container">
148
+ <div class="float-start">
149
+ <a
150
+ class="navbar-brand border border-0 border-secondary"
151
+ title="Home"
152
+ href="/home.aspx"
153
+ >
154
+ <img
155
+ title="Home page"
156
+ alt="Cheshire East Council home page"
157
+ height="70"
158
+ width="155"
159
+ src="https://www.cheshireeast.gov.uk/images/non_user/cec-logo-colour-155x70px.png"
160
+ />
161
+ <span class="visually-hidden"
162
+ >Cheshire East Council website home page</span
163
+ ></a
164
+ >
165
+ </div>
166
+ <div class="float-end icon-bank">
167
+ <ul class="mb-2 mb-lg-0 ps-0 ms-auto d-inline list-unstyled">
168
+ <li class="nav-item d-inline text-end">
169
+ <div class="ba_listenTranslateToggle d-inline">
170
+ <a
171
+ class="nav-link pe-0 d-inline ps-0"
172
+ onclick="BrowseAloud.panel.toggleBar(); updateToggleText()"
173
+ href="#"
174
+ >
175
+ <i role="img" aria-label="Listen">
176
+ <svg
177
+ class="d-inline"
178
+ xmlns="http://www.w3.org/2000/svg"
179
+ width="22"
180
+ height="22"
181
+ viewBox="0 0 24 24"
182
+ >
183
+ <path
184
+ d="M22 0v24l-11-6v-2.278l9 4.909v-17.262l-9 4.91v-2.279l11-6zm-13 6v12h-7v-12h7z"
185
+ ></path>
186
+ <title>Audio icon</title>
187
+ </svg>
188
+ </i>
189
+ <i role="img" aria-label="Translate">
190
+ <svg
191
+ class="d-inline"
192
+ xmlns="http://www.w3.org/2000/svg"
193
+ width="24"
194
+ height="24"
195
+ viewBox="0 0 24 24"
196
+ >
197
+ <path
198
+ d="M17.246 4.042c-3.36 0-3.436-2.895-7.337-2.895-2.108 0-4.075.98-4.909 1.694v-2.841h-2v24h2v-9.073c1.184-.819 2.979-1.681 4.923-1.681 3.684 0 4.201 2.754 7.484 2.754 2.122 0 3.593-1.359 3.593-1.359v-12.028s-1.621 1.429-3.754 1.429zm1.754 9.544c-.4.207-.959.414-1.593.414-.972 0-1.498-.363-2.371-.964-1.096-.755-2.596-1.79-5.113-1.79-1.979 0-3.71.679-4.923 1.339v-7.488c1.019-.902 2.865-1.949 4.909-1.949 1.333 0 1.894.439 2.741 1.103.966.756 2.288 1.792 4.596 1.792.627 0 1.215-.086 1.754-.223v7.766z"
199
+ ></path>
200
+ <title>Translate icon</title>
201
+ </svg>
202
+ </i>
203
+ <span id="baToggleText" class="d-none d-lg-inline"
204
+ >Listen and translate</span
205
+ >
206
+ </a>
207
+ </div>
208
+ </li>
209
+ <li class="nav-item d-inline text-end">
210
+ <a
211
+ class="nav-link d-inline pe-0"
212
+ href="/account/cheshire-east-account.aspx"
213
+ >
214
+ <i role="img" aria-label="Account">
215
+ <svg
216
+ xmlns="http://www.w3.org/2000/svg"
217
+ width="26"
218
+ height="26"
219
+ fill="Black"
220
+ class="bi bi-person"
221
+ viewBox="0 0 16 16"
222
+ >
223
+ <path
224
+ d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0zm4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4zm-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664h10z"
225
+ />
226
+ <title>Account icon</title>
227
+ </svg>
228
+ </i>
229
+ <span class="d-none d-lg-inline">My account</span>
230
+ </a>
231
+ </li>
232
+ </ul>
233
+ </div>
234
+ <div class="cec-search-site">
235
+ <div class="sys_search-query-control">
236
+ <label for="searchTextBox" class="hidden sys_search-label"
237
+ >Search</label
238
+ >
239
+ <input
240
+ type="text"
241
+ value="Enter keywords"
242
+ id="searchTextBox"
243
+ class="sys_searchbox"
244
+ />
245
+ <input
246
+ type="button"
247
+ id="SearchQueryControl_SearchButton"
248
+ value="Search"
249
+ class="sys_button sys_searchbutton sys_search-button"
250
+ />
251
+ </div>
252
+ </div>
253
+ </div>
254
+ <div style="clear: both"></div>
255
+ </header>
256
+ </div>
257
+ </template>
@@ -0,0 +1,146 @@
1
+ <script setup>
2
+ import { useHead } from '#app';
3
+ import { onMounted } from 'vue';
4
+ import { useState } from '#app';
5
+
6
+ const showChat = useState('showChat', () => false);
7
+
8
+ const openChat = () => {
9
+ showChat.value = !showChat.value;
10
+ };
11
+
12
+ const styleOptions = {
13
+ hideUploadButton: true,
14
+ avatarBorderRadius: '50%',
15
+ botAvatarInitials: 'CEC',
16
+ avatarSize: 40,
17
+ botAvatarImage:
18
+ 'https://bot-framework.azureedge.net/bot-icons-v1/a248a9a7-5a00-4923-a58a-31ce3199d509_G6n7eqCFC7JI8NWE7T8ro8rMD6CuwB2x9A65wLF1UyU8uC.png',
19
+ userAvatarImage:
20
+ 'https://content.powerapps.com/resource/makerx/static/media/user.0d06c38a.svg',
21
+ userAvatarInitials: 'You',
22
+ backgroundColor: 'rgba(249,249,249,1)',
23
+ sendBoxButtonColor: '#206c49',
24
+ timestampColor: '#212529',
25
+ };
26
+
27
+ const BOT_ID = 'da657b31-7cec-40a8-afea-fe17480f1550';
28
+ const theURL =
29
+ 'https://powerva.microsoft.com/api/botmanagement/v1/directline/directlinetoken?botId=' +
30
+ BOT_ID;
31
+
32
+ useHead({
33
+ script: [
34
+ {
35
+ src: 'https://cdn.botframework.com/botframework-webchat/latest/webchat.js',
36
+ },
37
+ ],
38
+ });
39
+ onMounted(() => {
40
+ const removeTabind = () => {
41
+ const divs = Array.from(document.querySelectorAll('div')).filter(
42
+ (e) => !e.innerHTML && e.hasAttribute('tabindex')
43
+ );
44
+ if (!divs.length) {
45
+ setTimeout(removeTabind, 10);
46
+ } else {
47
+ divs.forEach((e) => e.removeAttribute('tabindex'));
48
+ }
49
+ };
50
+ const store = WebChat.createStore(
51
+ {},
52
+ ({ dispatch }) =>
53
+ (next) =>
54
+ (action) => {
55
+ if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
56
+ dispatch({
57
+ meta: {
58
+ method: 'keyboard',
59
+ },
60
+ payload: {
61
+ activity: {
62
+ channelData: {
63
+ postBack: true,
64
+ },
65
+ name: 'startConversation',
66
+ type: 'event',
67
+ },
68
+ },
69
+ type: 'DIRECT_LINE/POST_ACTIVITY',
70
+ });
71
+ }
72
+ return next(action);
73
+ }
74
+ );
75
+
76
+ fetch(theURL)
77
+ .then((response) => response.json())
78
+ .then((conversationInfo) => {
79
+ WebChat.renderWebChat(
80
+ {
81
+ directLine: WebChat.createDirectLine({
82
+ token: conversationInfo.token,
83
+ }),
84
+ store: store,
85
+ styleOptions,
86
+ },
87
+ document.getElementById('webchat')
88
+ );
89
+ })
90
+ .catch((err) => console.error('An error occurred: ' + err));
91
+ removeTabind();
92
+ });
93
+ </script>
94
+
95
+ <template>
96
+ <div>
97
+ <a href="#" @click="openChat" class="openwebchatbutton"
98
+ ><img
99
+ alt="Can I help you button"
100
+ src="https://www.cheshireeast.gov.uk/images/non_user/cecilia-button.png"
101
+ /><span class="sr-only">Open or close Cecilia chat bot</span></a
102
+ >
103
+ <div
104
+ v-show="showChat"
105
+ id="chatWindow"
106
+ class="chat-popup"
107
+ style="position: relative; width: 400px; min-width: 400px; height: 100%"
108
+ >
109
+ <div id="webchat-wrapper">
110
+ <div id="webchat-header">
111
+ Cecilia<a href="#" @click="openChat" class="minimisechatbutton"
112
+ ><svg
113
+ preserveAspectRatio="xMidYMid meet"
114
+ xmlns="http://www.w3.org/2000/svg"
115
+ fill="white"
116
+ width="20"
117
+ height="20"
118
+ stroke="white"
119
+ stroke-width="3"
120
+ viewBox="0 0 32 32"
121
+ aria-hidden="true"
122
+ >
123
+ <path d="M8 15H24V17H8z"></path></svg
124
+ ><span class="sr-only">Close chat window</span></a
125
+ >
126
+ </div>
127
+ <div id="webchat" role="main"></div>
128
+ <div id="webchat-footer">
129
+ <small
130
+ ><a
131
+ target="_blank"
132
+ href="https://www.cheshireeast.gov.uk/council_and_democracy/council_information/website_information/privacy-notices/cecilia-%E2%80%93-chat-bot-privacy-notice.aspx"
133
+ >Privacy notice<span class="sr-only">
134
+ (link opens in a new window)</span
135
+ ></a
136
+ ></small
137
+ >
138
+ </div>
139
+ </div>
140
+ </div>
141
+ </div>
142
+ </template>
143
+
144
+ <style scoped>
145
+ .chat-popup#chatWindow{display:block}.react-film__filmstrip__list li{list-style:none}
146
+ </style>
@@ -0,0 +1,87 @@
1
+ <script setup>
2
+ import { useState } from '#app';
3
+ const pages = useState('pages');
4
+ const pageIndex = useState('pageIndex');
5
+ const scrollTo = useState('scrollTo');
6
+ const showResultsNum = useState('showResultsNum');
7
+
8
+ const goToPage = (n) => {
9
+ pageIndex.value = n;
10
+ scrollTo.value.scrollIntoView();
11
+ };
12
+ </script>
13
+
14
+ <template>
15
+ <div>
16
+ <nav
17
+ v-if="pages.length > 1"
18
+ role="navigation"
19
+ aria-label="Results data navigation"
20
+ >
21
+ <ol class="pagination d-flex flex-wrap my-2 ms-0">
22
+ <li class="page-item mb-2">
23
+ <button
24
+ class="page-link rounded"
25
+ type="button"
26
+ aria-label="First"
27
+ :class="{ disabled: !pageIndex }"
28
+ @click="goToPage(0)"
29
+ >
30
+ First
31
+ </button>
32
+ </li>
33
+ <li class="page-item mb-2">
34
+ <button
35
+ class="page-link rounded"
36
+ type="button"
37
+ aria-label="Previous"
38
+ :class="{ disabled: !pageIndex }"
39
+ @click="goToPage(pageIndex - 1)"
40
+ >
41
+ Previous
42
+ </button>
43
+ </li>
44
+ <li class="page-item mb-2 rounded disabled current">
45
+ <button class="page-link rounded" type="button">
46
+ {{ pageIndex + 1 }}
47
+ </button>
48
+ </li>
49
+ <li class="page-item mb-2">
50
+ <button
51
+ class="page-link rounded"
52
+ type="button"
53
+ aria-label="Next"
54
+ :class="{ disabled: pageIndex + 1 === pages.length }"
55
+ @click="goToPage(pageIndex + 1)"
56
+ >
57
+ Next
58
+ </button>
59
+ </li>
60
+ <li class="page-item mb-2">
61
+ <button
62
+ class="page-link rounded"
63
+ type="button"
64
+ aria-label="Last"
65
+ :class="{ disabled: pageIndex === pages.length - 1 }"
66
+ @click="goToPage(pages.length - 1)"
67
+ >
68
+ Last
69
+ </button>
70
+ </li>
71
+ </ol>
72
+ </nav>
73
+ <p>
74
+ <span v-if="showResultsNum"
75
+ >Total results:
76
+ {{
77
+ pages.reduce((acc, p) => {
78
+ return acc + p.length;
79
+ }, 0)
80
+ }}.&nbsp;</span
81
+ >
82
+ <span v-if="pages.length > 1"
83
+ >Viewing page {{ pageIndex + 1 }} of {{ pages.length }}.</span
84
+ >
85
+ </p>
86
+ </div>
87
+ </template>
@@ -0,0 +1 @@
1
+ export declare const useMakePages: () => (items: any, pageSize: any) => any[][];
@@ -0,0 +1,7 @@
1
+ export const useMakePages = () => {
2
+ return (items, pageSize) => {
3
+ let temp = [...items];
4
+ let pages = Array.from({ length: Math.ceil(items.length / pageSize) }, () => temp.splice(0, pageSize));
5
+ return pages;
6
+ };
7
+ };
@@ -0,0 +1,16 @@
1
+
2
+ import type { ModuleOptions } from './module.js'
3
+
4
+
5
+ declare module '@nuxt/schema' {
6
+ interface NuxtConfig { ['cec-vue-lib']?: Partial<ModuleOptions> }
7
+ interface NuxtOptions { ['cec-vue-lib']?: ModuleOptions }
8
+ }
9
+
10
+ declare module 'nuxt/schema' {
11
+ interface NuxtConfig { ['cec-vue-lib']?: Partial<ModuleOptions> }
12
+ interface NuxtOptions { ['cec-vue-lib']?: ModuleOptions }
13
+ }
14
+
15
+
16
+ export type { ModuleOptions, default } from './module.js'
@@ -0,0 +1,16 @@
1
+
2
+ import type { ModuleOptions } from './module'
3
+
4
+
5
+ declare module '@nuxt/schema' {
6
+ interface NuxtConfig { ['cec-vue-lib']?: Partial<ModuleOptions> }
7
+ interface NuxtOptions { ['cec-vue-lib']?: ModuleOptions }
8
+ }
9
+
10
+ declare module 'nuxt/schema' {
11
+ interface NuxtConfig { ['cec-vue-lib']?: Partial<ModuleOptions> }
12
+ interface NuxtOptions { ['cec-vue-lib']?: ModuleOptions }
13
+ }
14
+
15
+
16
+ export type { ModuleOptions, default } from './module'
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "version": "0.0.1",
3
+ "name": "cec-nuxt-lib",
4
+ "description": "Nuxt components and assets",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/types.d.ts",
10
+ "import": "./dist/module.mjs",
11
+ "require": "./dist/module.cjs"
12
+ }
13
+ },
14
+ "main": "./dist/module.cjs",
15
+ "types": "./dist/types.d.ts",
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "prepack": "nuxt-module-build build",
21
+ "dev": "nuxi dev playground",
22
+ "dev:build": "nuxi build playground",
23
+ "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground",
24
+ "release": "npm run lint && npm run test && npm run prepack && changelogen --release && npm publish && git push --follow-tags",
25
+ "lint": "eslint .",
26
+ "test": "vitest run",
27
+ "test:watch": "vitest watch",
28
+ "link": "npm link"
29
+ },
30
+ "dependencies": {
31
+ "@nuxt/kit": "^3.11.2"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^20.12.4",
35
+ "@nuxt/devtools": "latest",
36
+ "@nuxt/eslint-config": "^0.2.0",
37
+ "@nuxt/module-builder": "^0.5.5",
38
+ "@nuxt/schema": "^3.11.2",
39
+ "@nuxt/test-utils": "^3.12.0",
40
+ "changelogen": "^0.5.5",
41
+ "eslint": "^8.57.0",
42
+ "nuxt": "^3.11.2",
43
+ "vitest": "^1.4.0"
44
+ }
45
+ }