{"version":3,"sources":["api.js","components/ParagraphForm.js","components/Paragraph.js","components/NavMenu.js","components/BannerImage.jsx","components/Layout.js","components/ScrollToTop.jsx","components/TitleBlock.jsx","components/Home.js","components/Gallery.js","components/Testimonials.js","components/Contacts.js","App.js","index.js"],"names":["apiRoot","window","location","origin","getParagraphUri","key","putParagraphUri","getPhotoListUri","putPhotoListUri","getParagraphAsync","a","fetch","response","text","json","updateParagraphAsync","paragraph","init","method","headers","body","JSON","stringify","status","error","photos","form","ParagraphForm","onSave","onCancel","initialState","createValueFromString","createEmptyValue","useState","editorState","setEditorState","Form","onSubmit","markdown","toString","Row","Col","xs","span","offset","lg","Label","className","value","toolbarConfig","display","INLINE_STYLE_BUTTONS","label","style","BLOCK_TYPE_BUTTONS","onChange","Button","type","onClick","Paragraph","getParagraph","saveParagraph","paragraphKey","canEdit","loading","editing","paragraphState","setParagraphState","then","data","renderEditParagraph","newParagraph","editButton","renderViewParagraph","NavMenu","props","toggleNavbar","bind","state","collapsed","this","setState","Container","fluid","Navbar","expand","collapseOnSelect","Nav","Link","as","to","href","Brand","Toggle","aria-controls","Collapse","id","NavLink","exact","Component","displayName","name","BannerImage","Layout","children","ScrollToTop","prevProps","pathname","scrollTo","withRouter","TitleBlock","sm","md","xl","title","Cookies","get","api","Home","getPhotos","EditImageCard","photo","imagekey","src","alt","updatePhoto","deletePhoto","editingImage","setEditingImage","Card","event","preventDefault","stopPropagation","fields","target","photoAlt","newFile","files","length","Control","size","defaultValue","placeholder","Img","Footer","InsertImageCard","addPhoto","insertingImage","setInsertingImage","characters","i","Math","floor","random","randomPhotoKey","Gallery","galleryState","setGalleryState","updatePhotos","filemap","FormData","append","file","oldKey","newPhotos","galleryPhoto","push","Map","set","addPhotoAtPosition","position","foundPosition","foundPhotoToDelete","startEditing","stopEditing","CardColumns","map","p","ix","uri","imageCard","testimonials","msg","author","org","loc","testimonialCard","index","Body","Text","Testimonials","Contacts","App","path","baseUrl","document","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","render","basename"],"mappings":"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","file":"static/js/main.c92cad62.chunk.js","sourcesContent":["\r\nlet apiRoot = `${window.location.origin}/api`;\r\n\r\nconst getParagraphUri = (key) => `${apiRoot}/paragraph/${key}`;\r\nconst putParagraphUri = getParagraphUri;\r\n\r\nconst getPhotoUri = (key) => `${apiRoot}/photo/${key}`;\r\nconst putPhotoUri = getPhotoUri;\r\nconst postPhotoUri = `${apiRoot}/photo`;\r\n\r\nconst getPhotoListUri = (key) => `${apiRoot}/photolist/${key}`;\r\nconst putPhotoListUri = getPhotoListUri;\r\n\r\nexport async function getParagraphAsync(key) {\r\n var response;\r\n try {\r\n response = await fetch(getParagraphUri(key));\r\n\r\n } catch (e) {\r\n return {key, text: ''};\r\n }\r\n\r\n try {\r\n return response.json();\r\n } catch (e2) {\r\n return {key, text: ''};\r\n }\r\n}\r\n\r\nexport async function updateParagraphAsync(paragraph) {\r\n const init = {\r\n method: 'PUT',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(paragraph),\r\n };\r\n\r\n const response = await fetch(putParagraphUri(paragraph.key), init);\r\n return response.json();\r\n}\r\n\r\nexport async function getPhotoAsync(key) {\r\n var response;\r\n try {\r\n response = await fetch(getPhotoUri(key));\r\n\r\n } catch (e) {\r\n return { key, uri: '', alt: '' };\r\n }\r\n\r\n try {\r\n return response.json();\r\n } catch (e2) {\r\n return { key, uri: '', alt: '' };\r\n }\r\n}\r\n\r\nexport async function updatePhotoAsync(photo) {\r\n const init = {\r\n method: 'PUT',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(photo),\r\n };\r\n\r\n const response = await fetch(putPhotoUri(photo.key), init);\r\n return response.json();\r\n}\r\n\r\nexport async function getPhotoListAsync(key) {\r\n var response;\r\n try {\r\n response = await fetch(getPhotoListUri(key));\r\n if (response.status !== 200) {\r\n let exception = {error: response.text}\r\n throw exception\r\n }\r\n\r\n } catch (e) {\r\n return { key, photos: [] };\r\n }\r\n\r\n try {\r\n return response.json();\r\n } catch (e2) {\r\n return { key, photos:[] };\r\n }\r\n}\r\n\r\nexport async function updatePhotoListAsync(photoList) {\r\n const init = {\r\n method: 'PUT',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(photoList),\r\n };\r\n\r\n const response = await fetch(putPhotoListUri(photoList.key), init);\r\n return response.json();\r\n}\r\n\r\nexport async function uploadMultipartPhotoAsync(form) {\r\n const init = {\r\n method: 'POST',\r\n body: form\r\n }\r\n\r\n const response = await fetch(postPhotoUri, init)\r\n return response.json()\r\n}\r\n\r\nexport async function updatePhotoListWithFilesAsync(key, form) {\r\n const init = {\r\n method: 'PUT',\r\n body: form\r\n }\r\n\r\n const response = await fetch(putPhotoListUri(key), init)\r\n return response.json()\r\n}\r\n","import React, { useState } from 'react'\r\nimport Row from 'react-bootstrap/Row'\r\nimport Col from 'react-bootstrap/Col'\r\nimport Form from 'react-bootstrap/Form'\r\nimport Button from 'react-bootstrap/Button'\r\nimport RichTextEditor, { createValueFromString, createEmptyValue } from 'react-rte'\r\nimport './ParagraphForm.css'\r\n\r\nexport default function ParagraphForm({ text, onSave, onCancel }) {\r\n\r\n const initialState = text ? createValueFromString(text, 'markdown') : createEmptyValue()\r\n const [editorState, setEditorState] = useState(initialState)\r\n\r\n const handleChange = (value) => {\r\n setEditorState(value)\r\n };\r\n\r\n const handleSubmit = () => {\r\n let markdown = editorState.toString('markdown')\r\n onSave(markdown)\r\n };\r\n\r\n /* EXAMPLE FROM https://github.com/sstur/react-rte\r\n const toolbarConfig = {\r\n // Optionally specify the groups to display (displayed in the order listed).\r\n display: ['INLINE_STYLE_BUTTONS', 'BLOCK_TYPE_BUTTONS', 'LINK_BUTTONS', 'BLOCK_TYPE_DROPDOWN', 'HISTORY_BUTTONS'],\r\n INLINE_STYLE_BUTTONS: [\r\n { label: 'Bold', style: 'BOLD', className: 'custom-css-class' },\r\n { label: 'Italic', style: 'ITALIC' },\r\n { label: 'Underline', style: 'UNDERLINE' }\r\n ],\r\n BLOCK_TYPE_DROPDOWN: [\r\n { label: 'Normal', style: 'unstyled' },\r\n { label: 'Heading Large', style: 'header-one' },\r\n { label: 'Heading Medium', style: 'header-two' },\r\n { label: 'Heading Small', style: 'header-three' }\r\n ],\r\n BLOCK_TYPE_BUTTONS: [\r\n { label: 'UL', style: 'unordered-list-item' },\r\n { label: 'OL', style: 'ordered-list-item' }\r\n ]\r\n };\r\n */\r\n\r\n const toolbarConfig = {\r\n // Optionally specify the groups to display (displayed in the order listed).\r\n display: ['INLINE_STYLE_BUTTONS', 'BLOCK_TYPE_BUTTONS', 'LINK_BUTTONS', 'HISTORY_BUTTONS'],\r\n INLINE_STYLE_BUTTONS: [\r\n { label: 'Bold', style: 'BOLD' },\r\n { label: 'Italic', style: 'ITALIC' }\r\n ],\r\n BLOCK_TYPE_BUTTONS: [\r\n { label: 'UL', style: 'unordered-list-item' }\r\n ]\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n editing paragraph...\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n","import React, { useState } from 'react'\r\nimport Row from 'react-bootstrap/Row'\r\nimport Col from 'react-bootstrap/Col'\r\nimport Button from 'react-bootstrap/Button'\r\nimport ReactMarkdown from 'react-markdown'\r\nimport ParagraphForm from './ParagraphForm'\r\nimport './Paragraph.css'\r\n\r\nfunction Paragraph({getParagraph, saveParagraph, paragraphKey, canEdit}) {\r\n\r\n const [paragraphState, setParagraphState] = useState({text: '', loading: true, editing: false});\r\n\r\n if (paragraphState.loading) {\r\n getParagraph(paragraphKey)\r\n .then(\r\n data => setParagraphState( { ...paragraphState, text: data.text, loading: false} )\r\n )\r\n\r\n return (
Loading...
);\r\n\r\n } else {\r\n\r\n const save = newParagraph => \r\n saveParagraph(newParagraph, paragraphKey)\r\n .then( setParagraphState( { text: newParagraph, loading: false, editing: false} ) )\r\n \r\n const startEditing = () => { setParagraphState({ ...paragraphState, editing: true }) }\r\n const cancelEditing = () => { setParagraphState({...paragraphState, editing: false})}\r\n\r\n const renderEditParagraph = (\r\n \r\n );\r\n\r\n const editButton = (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n const renderViewParagraph = (\r\n <>\r\n \r\n \r\n {paragraphState.text}\r\n \r\n \r\n {canEdit ? editButton : null}\r\n \r\n );\r\n\r\n return (\r\n <>\r\n {paragraphState.editing ? renderEditParagraph : renderViewParagraph }\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default Paragraph;","import React, { Component } from 'react';\r\nimport Container from 'react-bootstrap/Container';\r\nimport Row from 'react-bootstrap/Row'\r\nimport Col from 'react-bootstrap/Col'\r\nimport Navbar from 'react-bootstrap/NavBar';\r\nimport Nav from 'react-bootstrap/Nav';\r\nimport { Link, NavLink } from 'react-router-dom';\r\nimport './NavMenu.css';\r\n\r\nexport class NavMenu extends Component {\r\n static displayName = NavMenu.name;\r\n\r\n constructor (props) {\r\n super(props);\r\n\r\n this.toggleNavbar = this.toggleNavbar.bind(this);\r\n this.state = {\r\n collapsed: true\r\n };\r\n this.className = props.className;\r\n }\r\n\r\n toggleNavbar () {\r\n this.setState({\r\n collapsed: !this.state.collapsed\r\n });\r\n }\r\n\r\n render () {\r\n return (\r\n \r\n \r\n {/* lg={{ span: 8, offset: 2 }}> */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport './BannerImage.css';\r\n\r\nfunction BannerImage(props) {\r\n var className = 'banner-image'\r\n if (props.className) {\r\n className = className + ' ' + props.className;\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n \r\n );\r\n}\r\n\r\nexport default BannerImage;\r\n","import React from 'react';\r\nimport Container from 'react-bootstrap/Container';\r\nimport { NavMenu } from './NavMenu';\r\nimport BannerImage from './BannerImage';\r\nimport './Layout.css';\r\n\r\nexport const Layout = (props) => {\r\n return (\r\n <>\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n {props.children}\r\n \r\n
\r\n \r\n );\r\n}\r\n\r\nexport default Layout;\r\n","import { Component } from 'react';\r\nimport { withRouter } from 'react-router-dom';\r\n\r\nclass ScrollToTop extends Component {\r\n componentDidUpdate(prevProps) {\r\n if (this.props.location.pathname !== prevProps.location.pathname) {\r\n window.scrollTo(0, 0)\r\n }\r\n }\r\n\r\n render() {\r\n return this.props.children\r\n }\r\n}\r\n\r\nexport default withRouter(ScrollToTop)","import React from 'react';\r\nimport Row from 'react-bootstrap/Row';\r\nimport Col from 'react-bootstrap/Col';\r\n\r\nfunction TitleBlock(props) {\r\n const { xs, sm, md, lg, xl, title } = props\r\n return (\r\n <>\r\n \r\n \r\n

{title}

\r\n \r\n
\r\n \r\n );\r\n}\r\n\r\nexport default TitleBlock;\r\n","import Cookies from 'js-cookie';\r\nimport React from 'react';\r\nimport Row from 'react-bootstrap/Row';\r\nimport Col from 'react-bootstrap/Col';\r\nimport TitleBlock from './TitleBlock'\r\nimport Paragraph from './Paragraph';\r\nimport * as api from '../api';\r\n\r\n\r\nlet isAdmin = (Cookies.get('admin_mode') === \"true\");\r\nlet canEdit = isAdmin;\r\n\r\nasync function getParagraph(key) {\r\n try {\r\n return api.getParagraphAsync(key)\r\n } catch {\r\n return {text: ''};\r\n }\r\n}\r\n\r\nasync function saveParagraph(text, key) {\r\n const paragraph = { key, text }\r\n\r\n return api.updateParagraphAsync(paragraph);\r\n}\r\n\r\nfunction Home() {\r\n return (\r\n <>\r\n \r\n\r\n \r\n\r\n \r\n \r\n

Please contact Heather for a no obligation quote.

\r\n \r\n
\r\n \r\n );\r\n}\r\n\r\nexport default Home;\r\n","import Cookies from 'js-cookie'\r\nimport * as api from '../api'\r\nimport React, { useState } from 'react'\r\nimport Row from 'react-bootstrap/Row'\r\nimport Col from 'react-bootstrap/Col'\r\nimport Button from 'react-bootstrap/Button'\r\nimport Card from 'react-bootstrap/Card'\r\nimport CardColumns from 'react-bootstrap/CardColumns'\r\nimport Form from 'react-bootstrap/Form'\r\nimport TitleBlock from './TitleBlock'\r\n\r\nlet isAdmin = (Cookies.get('admin_mode') === \"true\")\r\nlet canEdit = isAdmin\r\n\r\nconst getPhotos = (key) => api.getPhotoListAsync(key)\r\n\r\nconst image = ({ key, uri, alt }) => ({ key, src: uri, alt })\r\n\r\nconst imageCard = ({key, src, alt}) => (\r\n \r\n \r\n \r\n)\r\n\r\nconst EditImageCard = ({ photo, imagekey, src, alt, updatePhoto, deletePhoto }) => {\r\n let [editingImage, setEditingImage] = useState(false)\r\n\r\n let key = imagekey\r\n\r\n const editingImageCardContent = () => {\r\n\r\n const updateImage = (event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n let form = event.target\r\n let fields = form.children\r\n let alt = fields.photoAlt.value\r\n\r\n let photo = {\r\n key,\r\n alt\r\n }\r\n\r\n if (fields.newFile.files.length > 0) {\r\n updatePhoto(key, photo, fields.newFile.files[0])\r\n } else {\r\n updatePhoto(key, photo)\r\n }\r\n\r\n setEditingImage(false)\r\n }\r\n\r\n const cancelEditingImage = (event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n setEditingImage(false)\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const readyToEditImageCardContent = () => {\r\n\r\n const startEditingImage = (event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n setEditingImage(true)\r\n }\r\n\r\n const deleteImage = (event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n deletePhoto(key)\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {editingImage ? editingImageCardContent() : readyToEditImageCardContent()}\r\n \r\n )\r\n}\r\n\r\nconst randomPhotoKey = () => {\r\n let key = ''\r\n\r\n let characters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']\r\n for (var i = 0; i < 8; i++) {\r\n let randomIndex = Math.floor(Math.random() * characters.length)\r\n key = key + characters[randomIndex]\r\n }\r\n\r\n return key\r\n}\r\n\r\nconst InsertImageCard = ({ addPhoto }) => {\r\n let [insertingImage, setInsertingImage] = useState(false)\r\n\r\n const insertingImageCardContent = () => {\r\n\r\n const insertImage = (event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n let form = event.target\r\n let fields = form.children\r\n\r\n if (fields.newFile.files.length === 0) {\r\n return\r\n }\r\n\r\n let alt = fields.photoAlt.value\r\n let key = randomPhotoKey()\r\n\r\n let photo = {\r\n key,\r\n alt\r\n }\r\n\r\n addPhoto(photo, fields.newFile.files[0])\r\n setInsertingImage(false)\r\n }\r\n\r\n const cancelInsertingImage = (event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n setInsertingImage(false)\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const readyToInsertImageCardContent = () => {\r\n\r\n const startInsertingImage = (event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n setInsertingImage(true)\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {insertingImage ? insertingImageCardContent() : readyToInsertImageCardContent()}\r\n \r\n )\r\n}\r\n\r\nfunction Gallery() {\r\n\r\n const [galleryState, setGalleryState] = useState({ photos: [], loading: true, editing: false });\r\n\r\n if (galleryState.loading) {\r\n getPhotos('gallery')\r\n .then(\r\n ({ photos }) => setGalleryState( {...galleryState, photos, loading: false} )\r\n )\r\n\r\n return (
Loading...
)\r\n }\r\n\r\n const updatePhotos = (photos, filemap) => {\r\n let form = new FormData()\r\n form.append('photolist', JSON.stringify( { key: 'gallery', photos } ))\r\n for (let [key, file] of filemap) {\r\n form.append(key, file, key)\r\n }\r\n return api.updatePhotoListWithFilesAsync('gallery', form)\r\n }\r\n\r\n const updatePhoto = (oldKey, photo, file) => {\r\n let newPhotos = []\r\n for (let galleryPhoto of galleryState.photos) {\r\n if (galleryPhoto.key === oldKey) {\r\n newPhotos.push(photo)\r\n } else {\r\n newPhotos.push(galleryPhoto)\r\n }\r\n }\r\n\r\n let filemap = new Map()\r\n if (file) {\r\n filemap.set(photo.key, file)\r\n }\r\n\r\n updatePhotos(newPhotos, filemap)\r\n setGalleryState({ ...galleryState, photos: newPhotos })\r\n }\r\n\r\n const addPhoto = (position, photo, file) => {\r\n let foundPosition = false\r\n let newPhotos = []\r\n let i = 0;\r\n for (let galleryPhoto of galleryState.photos) {\r\n if (i === position) {\r\n foundPosition = true\r\n newPhotos.push(photo)\r\n }\r\n\r\n newPhotos.push(galleryPhoto)\r\n i++\r\n }\r\n\r\n if (!foundPosition) {\r\n newPhotos.push(photo)\r\n }\r\n\r\n let filemap = new Map()\r\n filemap.set(photo.key, file)\r\n\r\n updatePhotos(newPhotos, filemap)\r\n setGalleryState({ ...galleryState, photos: newPhotos })\r\n }\r\n\r\n const addPhotoAtPosition = (position) => (photo, file) => addPhoto(position, photo, file)\r\n \r\n const deletePhoto = (key) => {\r\n let newPhotos = []\r\n let foundPhotoToDelete = false\r\n for (let galleryPhoto of galleryState.photos) {\r\n if (galleryPhoto.key !== key) {\r\n newPhotos.push(galleryPhoto)\r\n } else {\r\n foundPhotoToDelete = true\r\n }\r\n }\r\n\r\n if (foundPhotoToDelete) {\r\n updatePhotos(newPhotos, new Map())\r\n setGalleryState({...galleryState, photos: newPhotos})\r\n }\r\n }\r\n\r\n const startEditing = (event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n setGalleryState({ ...galleryState, editing: true })\r\n }\r\n\r\n const stopEditing = (event) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n setGalleryState({ ...galleryState, editing: false })\r\n }\r\n\r\n const editButton = () => \r\n\r\n const renderViewGallery = () =>\r\n <>\r\n \r\n {galleryState.photos.map(p => imageCard(image(p)))}\r\n \r\n { canEdit ? editButton() : null }\r\n \r\n\r\n const renderEditGallery = () =>\r\n <>\r\n \r\n {galleryState.photos.map( (p, ix) =>\r\n <>\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {galleryState.editing ? renderEditGallery() : renderViewGallery()}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default Gallery;","import React from 'react';\r\nimport Row from 'react-bootstrap/Row';\r\nimport Col from 'react-bootstrap/Col';\r\nimport Card from 'react-bootstrap/Card';\r\nimport CardColumns from 'react-bootstrap/CardColumns';\r\nimport TitleBlock from './TitleBlock'\r\n\r\nconst testimonials = [\r\n{\r\n msg: 'Heather - thank you so much for providing the vegetarian canapés and sandwiches for my 50th bash. Everything was fantastically presented and tasted delicious. I would definitely recommend you.',\r\n author: 'Caroline Whitehurst',\r\n event: '',\r\n org: 'Cramond',\r\n loc: ''\r\n},\r\n{\r\n msg: 'Everyone loved the food, apparently there was a real buzz about lunch',\r\n author: 'Nadia',\r\n event: '',\r\n org: 'Scottish Wildlife Trust',\r\n loc: ''\r\n},\r\n{\r\n msg: 'Dear Heather, just to say a big thank you for the super food you made for Sunday and for delivering and setting everything out. We have had lots of thank yous and they all say it was the best party yet!! With good wishes, Iona and Brian Hughes.',\r\n author: '',\r\n event: 'Summer garden party',\r\n org: '',\r\n loc: 'Edinburgh'\r\n},\r\n{\r\n msg: 'The food was great and your manner is lovely and friendly.',\r\n author: 'C McKerracher',\r\n event: '',\r\n org: '',\r\n loc: ''\r\n},\r\n{\r\n msg: 'Heather, the food was brilliant! we were all stuffed to the gills! You did a fantastic job in our very primitive conditions. Thank you so much.',\r\n author: 'J Cameron',\r\n event: 'Razmatazz volunteers dinner',\r\n org: 'Redhall walled Garden',\r\n loc: 'Edinburgh'\r\n},\r\n{\r\n msg: 'Great buffet, nothing but compiliments from all and it made it so much easier for us to enjoy ourselves, which we really did.',\r\n author: 'S Robertson',\r\n event: 'Perthshire garden party',\r\n org: '',\r\n loc: ''\r\n},\r\n{\r\n msg: 'Thanks again, so much for Friday, it was a truly fabulous lunch, I have already had an email from Gavin at BAA commenting on how good the soup was!',\r\n author: 'K McIntosh',\r\n event: 'buffet lunch at Drum Castle',\r\n org: 'National Trust for Scotland',\r\n loc: ''\r\n},\r\n{\r\n msg: 'You were fab! Thanks so much Heather and to Ryan. I was more than happy with the buffet',\r\n author: 'J Bond',\r\n event: 'Volunteer\\'s Christmas Ceilidh',\r\n org: 'National Trust for Scotland',\r\n loc: ''\r\n},\r\n{\r\n msg: 'A huge THANK YOU to you and Ryan for the wonderful dinner and lunches at Mar Lodge. Thanks so much for all your hard work preparing for the event...everyone was completely enthralled with the tastes and range of dishes, all beautifully presented',\r\n author: 'J Duncan',\r\n event: '',\r\n org: 'BTCV',\r\n loc: ''\r\n},\r\n{\r\n msg: 'The catering on Saturday was well appreciated. Everyone remarked on the high quality and tastiness of the food. Thank you again for all your efforts.',\r\n author: 'J Stewart',\r\n event: 'canapés and buffet',\r\n org: '',\r\n loc: 'Dunblane'\r\n},\r\n{\r\n msg: 'Thanks Heather, the breakfast was fantastic and we have had lots of positive feedback from the guests',\r\n author: 'P Brown',\r\n event: 'charity breakfast',\r\n org: 'St Thomas\\' Church',\r\n loc: 'Edinburgh'\r\n}\r\n];\r\n\r\n\r\nconst testimonialCard = ({ msg, author, org }, index) => (\r\n \r\n \r\n \"{msg}\"\r\n {author}{org ? ` (${org})` : ''}\r\n \r\n \r\n);\r\n\r\nfunction Testimonials() {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {testimonials.map(testimonialCard)}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default Testimonials;","import Cookies from 'js-cookie';\r\nimport React from 'react';\r\nimport Row from 'react-bootstrap/Row';\r\nimport Col from 'react-bootstrap/Col';\r\nimport TitleBlock from './TitleBlock'\r\nimport Paragraph from './Paragraph';\r\nimport * as api from '../api';\r\n\r\n\r\nlet isAdmin = (Cookies.get('admin_mode') === \"true\");\r\nlet canEdit = isAdmin;\r\n\r\nasync function getParagraph(key) {\r\n try {\r\n return api.getParagraphAsync(key)\r\n } catch {\r\n return {text: ''};\r\n }\r\n}\r\n\r\nasync function saveParagraph(text, key) {\r\n const paragraph = { key, text }\r\n\r\n return api.updateParagraphAsync(paragraph);\r\n}\r\n\r\nfunction Contacts() {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default Contacts;\r\n","import Cookies from 'js-cookie';\r\nimport * as api from './api';\r\nimport React from 'react';\r\nimport { Route, Switch, Redirect } from 'react-router';\r\nimport Row from 'react-bootstrap/Row';\r\nimport Col from 'react-bootstrap/Col';\r\nimport Paragraph from './components/Paragraph';\r\nimport { Layout } from './components/Layout';\r\nimport ScrollToTop from './components/ScrollToTop'\r\nimport Home from './components/Home';\r\n//import Menus from './components/Menus';\r\nimport Gallery from './components/Gallery';\r\nimport Testimonials from './components/Testimonials';\r\nimport Contacts from './components/Contacts';\r\n\r\nimport './custom.css'\r\n\r\nfunction App() {\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n{/*\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n*/}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nlet isAdmin = (Cookies.get('admin_mode') === \"true\");\r\nlet canEdit = isAdmin;\r\n\r\nasync function getParagraph(key) {\r\n try {\r\n return api.getParagraphAsync(key)\r\n } catch {\r\n return { text: '' };\r\n }\r\n}\r\n\r\nasync function saveParagraph(text, key) {\r\n const paragraph = { key, text }\r\n\r\n return api.updateParagraphAsync(paragraph);\r\n}\r\n\r\nfunction Brunch() {\r\n return (\r\n \r\n \r\n

Brunch

\r\n \r\n \r\n
\r\n );\r\n}\r\nfunction Canapes() {\r\n return (\r\n \r\n \r\n

Canapés

\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nfunction Sandwiches() {\r\n return (\r\n \r\n \r\n

Sandwich Platters

\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nfunction KidsParties() {\r\n return (\r\n \r\n \r\n

Kids' Parties

\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\n\r\nexport default App;\r\n\r\n","import 'es6-shim'\r\nimport React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport { BrowserRouter as Router } from 'react-router-dom'\r\nimport App from './App'\r\n//import registerServiceWorker from './registerServiceWorker'\r\n//import 'bootstrap/dist/css/bootstrap.css'\r\n\r\nimport './App.scss'\r\n\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement);\r\n\r\n// Uncomment the line above that imports the registerServiceWorker function\r\n// and the line below to register the generated service worker.\r\n// By default create-react-app includes a service worker to improve the\r\n// performance of the application by caching static assets. This service\r\n// worker can interfere with the Identity UI, so it is\r\n// disabled by default when Identity is being used.\r\n//\r\n//registerServiceWorker();\r\n\r\n"],"sourceRoot":""}