{"version":3,"sources":["types.ts","Footer.tsx","Constants.ts","Header.tsx","Contact.tsx","Persona.tsx","Masonry.tsx","Lightbox.tsx","Api.ts","Portfolio.tsx","Spatula.tsx","SpatulaCollection.tsx","Home.tsx","index.tsx"],"names":["Language","Page","Footer","className","href","target","rel","moment","format","PORTFOLIO_IMAGE_ROOT_PATH","AVAILABLE_LANGUAGES","language","GR","caption","title","EN","TEXTS","contact","persona","details","pdf","text","link","spatula","collection","imageCaption","index","length","Categories","portfolioCategories","onCategorySelectionChange","map","category","type","checked","get","value","onChange","SpatulaItems","spatulaItemsCount","selectedSpatulaRangeIdx","onSpatulaItemChange","chunks","range","chunk","idx","endRange","startRange","endRangeCaption","id","toString","name","MenuLinks","page","Object","values","key","SPATULA_PROJECT_COLLECTION","to","classnames","selected","Languages","i","lang","Header","props","size","Contact","match","params","Persona","dangerouslySetInnerHTML","__html","download","COL_WIDTH","MasonryComponent","columnCount","masonry","React","cache","CellMeasurerCache","defaultHeight","defaultWidth","fixedWidth","cellPositioner","createCellPositioner","cellMeasurerCache","columnWidth","spacer","renderCell","parent","style","data","list","description","image","height","categoryImage","date","rowIndex","width","onClick","handleItemClick","src","onItemClick","handleResize","calculateColumnCount","resetCellPositioner","current","recomputeCellPositions","onResize","this","autoHeight","cellCount","cellRenderer","ref","clearAll","clearCellPositions","Math","floor","reset","getPreviousIndex","getNextIndex","LightboxComponent","state","selectedPhotoIndex","photoIndex","handleNextImage","setState","images","handlePreviousImage","onCloseRequest","wrapperClassName","animationDuration","animationOnKeyInput","mainSrc","nextSrc","getImage","prevSrc","onMoveNextRequest","onMovePrevRequest","direction","fetchData","url","fetch","qs","then","x","json","catch","err","console","error","Portfolio","items","lightboxOpen","selectedId","renderImageCaption","find","zoomImages","imageCount","handleLightboxClose","renderLightbox","renderPortfolioItems","Promise","all","portfolioDesigns","categories","imageName","imageFolderName","folderName","onSetCategories","Immutable","portfolioItems","categoryID","dateText","mainImageName","zooms","categoryId","visibleCategories","filter","cat","visibleItems","Spatula","SpatulaCollection","spatulaItems","lighboxOpen","selectedItemId","renderCaption","selectedItem","dimensions","handleGridItemClick","onSetSpatulaItemsCount","fetchSpatulaItems","prevProps","batchNumber","spatulas","originalHeightInCM","originalWidthInCM","MainBody","onLocationChange","location","useLocation","useEffect","pathname","includes","PORTFOLIO","exact","path","render","PERSONA","component","SPATULA_PROJECT","DOWNLOADS","undefined","CONTACT","Home","handleSpatulaItemChange","e","Number","handleCategorySelectionChange","categoryIdx","findIndex","update","set","handleSetCategories","handleSetSpatulaItemsCount","handleLocationChange","Component","App","ReactDOM","document","getElementById"],"mappings":"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","file":"static/js/main.1db2d0a3.chunk.js","sourcesContent":["import * as Immutable from 'immutable';\nimport { RouteComponentProps } from 'react-router-dom';\n\nexport enum Language {\n GR = 'gr',\n EN = 'en'\n}\n\nexport enum Page {\n PORTFOLIO = 'portfolio',\n PERSONA = 'persona',\n SPATULA_PROJECT = 'spatula-project',\n DOWNLOADS = 'downloads',\n CONTACT = 'contact',\n SPATULA_PROJECT_COLLECTION = 'spatula-collection'\n}\n\nexport interface Store {\n lang: Language;\n}\n\nexport interface RouterProps\n extends RouteComponentProps<{\n lang: Language;\n page: Page;\n }> {}\n\nexport interface PortfolioCategory {\n id: number;\n name: string;\n selected: boolean;\n imageFolderName: string;\n imageName: string;\n}\n\nexport interface IPortfolioCategory extends Immutable.Map {\n set(key: T, value: PortfolioCategory[T]): this;\n get(key: T): PortfolioCategory[T];\n toJS(): PortfolioCategory;\n}\n\nexport interface PortfolioItem {\n id: number;\n image: string;\n description: string;\n categoryId: number;\n date: string;\n height: number;\n zoomImages?: string[];\n categoryImage?: string;\n}\n\nexport interface SpatulaCollectionItem {\n id: number;\n image: string;\n description: string;\n dimensions: string;\n}\n","import * as React from 'react';\nimport moment from 'moment-timezone';\n\nconst Footer: React.FC = () => (\n
\n
\n \n © Konstantinos Siskakis 2020. All rights reserved. Design &\n Development:{' '}\n \n personalized.at\n \n . {moment().format('dddd, DD MMMM YYYY')}\n \n
\n);\n\nexport default Footer;\n","import { Language } from './types';\n\nexport const API_ROOT_PATH =\n 'https://personalizedgenericapi.azurewebsites.net/api/Grafist';\nexport const PORTFOLIO_IMAGE_ROOT_PATH =\n 'https://d8lc6s7bpjqw2.cloudfront.net/grafist/images/portfolio/categories';\nexport const ORIGINS_IMAGE_ROOT_PATH =\n 'https://d8lc6s7bpjqw2.cloudfront.net/grafist/images/portfolio/origins';\nexport const SPATULA_IMAGE_ROOT_PATH =\n 'https://d8lc6s7bpjqw2.cloudfront.net/grafist/images/spatulaProject/collection';\n\nexport const AVAILABLE_LANGUAGES = [\n {\n language: Language.GR,\n caption: 'ε',\n title: 'Ελληνικά'\n },\n {\n language: Language.EN,\n caption: 'e',\n title: 'English'\n }\n];\n\nexport const TEXTS = {\n [Language.GR]: {\n contact: 'Επαφή',\n persona: {\n title: 'Ιστορία',\n details:\n 'ΓΕΝΝΗΘΗΚΕ στην Κρήτη.\\n' +\n '

Στα 17, σχεδίασε τα πρώτα του (φανταστικά) λογότυπα. Η γραφή, τα γράμματα και η τυπογραφία τον συνεπήραν αργότερα. ' +\n 'Μελέτησε διεξοδικά τη βυζαντινή γραφή και σχεδίασε πολλές βυζαντινές, τυπογραφικές αλλά και μοντέρνες γραμματοσειρές. ' +\n 'Στη Θεσσαλονίκη, σπούδασε Γραφιστική στον «Όμιλο Δημητρέλλη».

\\n' +\n '

Το 1994 είχε την τύχη να γνωρίσει το τυπογραφικό εργαστήρι «Γράμμα». Ξεκίνησε μαζί με τον Θ. Βαρθολομαίο το στήσιμο ' +\n 'ενός υποτυπώδους δημιουργικού ατελιέ για την κάλυψη των αναγκών του τυπογραφείου. Η συνέχεια, 20 και πλέον χρόνια μετά, ' +\n 'είναι λίγο πολύ γνωστή. Ένα πλήρες δημιουργικό τμήμα και μια σειρά εργασιών σε ολόκληρο το φάσμα των γραφικών τεχνών.

\\n' +\n '

Μεγάλες αγάπες παραμένουν η μουσική, η φωτογραφία και ο κινηματογράφος, και η σχεδίαση γραμμάτων.

',\n pdf: {\n text: 'Μπορείτε να κατεβάσετε ένα βιογραφικό σημείωμα,',\n link: 'εδώ'\n }\n },\n spatula: {\n collection: 'Η Συλλογή',\n details:\n '

Το Spatula Project είναι μια προσπάθεια που κράτησε είκοσι δύο ολόκληρα χρόνια. Αποτελεί τη συλλογή αποτυπωμάτων τυπογραφικού μελανιού ' +\n 'πάνω σε μια πληθώρα χαρτιών, που άλλοτε είχε χρηστική σημασία και άλλοτε όχι. Ο τυπογράφος, στην προσπάθειά του να ετοιμάσει το ζητούμενο χρώμα, ' +\n 'χρειάζεται πάντα ένα κομμάτι χαρτί, το οποίο λειτουργεί σαν βάση παρασκευής. Πάνω εκεί αναμειγνύει με την τυπογραφική σπάτουλα (εξ ού και το όνομα ' +\n 'της συλλογής) τα κατάλληλα ποσοστά πρωταρχικών χρωμάτων ώστε να θα δώσουν το τελικό χρώμα (Pantone). Έτσι, το χαρτί αυτό, παίζει το ρόλο ενός ' +\n '«ζωγραφικού καμβά», πάνω στον οποίο ο τυπογράφος-τεχνίτης δημιουργεί τυχαία –τονίζω αυτό το τυχαία– αλλόκοτα, αισθησιακά, ονειρικά, φανταστικά, ' +\n 'συμπλέγματα χρωμάτων. Χρωματικά μοτίβα που δεν μπορούν να δημιουργηθούν με καμία εκούσια προσπάθεια – προκύπτουν πάντα στην τύχη! Είναι, δηλαδή, ' +\n 'μια τέχνη της τυχαιότητας (random art).

\\n' +\n '

Το «δειγματολόγιο» των χαρτιών αποτελεί μια γιγαντιαία συλλογή ειδών, κατηγοριών, μεγεθών και ποιοτήτων που αντικατοπτρίζουν απλά, το εύρος των ' +\n 'εργασιών που τυπώνει ένα καλλιτεχνικό τυπογραφείο στη διάρκεια δύο δεκαετιών. Από το πιο απλό, φθηνό και ταπεινό χαρτί, μέχρι το χειροποίητο, πανάκριβο ' +\n 'χαρτί εισαγωγής, η αποτύπωση είναι μία: τυχαία και χωρίς καμία εικαστική σκοπιμότητα. Μόνο τη δημιουργία του κατάλληλου χρώματος για την εκτύπωση. Χαρτί ' +\n 'τυπωμένο, διπλο- και τριπλοτυπωμένο, χαρτί με εικαστικά στοιχεία, χαρτί με εικόνες, σχήματα, αφηρημένες έννοιες, μετά την «επέλαση» του μελανιού. Ένα ' +\n 'μυστήριο θαύμα. Κάθε ένα κομμάτι, από το πιο μικρό των 10x10εκ. μέχρι το μεγαλύτερο των 35x50εκ., είναι τόσο μοναδικό, που αποτελεί ένα μικρό (ή και ' +\n 'μεγάλο) «έργο τέχνης»!

\\n' +\n '

Η συλλογή αυτή, όταν άρχισε να δείχνει το μέγεθος και την αξία της, ψηφιοποιήθηκε σε υπερηψηλή ανάλυση και αρχειοθετήθηκε με σκοπό την πώλησή της ' +\n '(χαρτί και ηλεκτρονικό αρχείο) σε οποίον μπορεί να κατανοήσει το μέγεθος αυτής της ιδιαίτερης καλλιτεχνικής αξίας. Όλη τη συλλογή, μπορείτε να βρείτε ' +\n 'στο σύνδεσμο “Η Συλλογή”.

'\n },\n imageCaption: (index: number, length: number) =>\n `Εικόνα ${index + 1} από ${length}`\n },\n [Language.EN]: {\n contact: 'Contact',\n persona: {\n title: 'History',\n details:\n 'BORN in Creta isl., Greece.\\n' +\n '

At the age of 17, he designed his first (imaginary) logos. Paleography, glyphs and typography fascinated him later. ' +\n 'He studied thoroughly the byzantine writing and designed a lot of byzantine, typographic but also modern fonts. ' +\n 'He studied graphic design in the \"Dimitrelli\" School, in Thessaloniki.

\\n' +\n '

In 1994 he was lucky enough to join the typographic workshop \"Gramma\". He started with Th. Vartholomeos the setup ' +\n 'of a creative studio to cover the needs of the printing house. All the rest, more than 20 years later, ' +\n 'is more or less known. A fully creative department and a series of works across the full range of graphic arts.

\\n' +\n '

Fonts design, music, photography and cinema still remain objects of great desire.

',\n pdf: {\n text: 'You can download the Curriculum Vitae,',\n link: 'here'\n }\n },\n spatula: {\n collection: 'The Collection',\n details:\n '

The Spatula Project is an effort that lasted 20 whole years. It consists of a selection of imprints of typography ink on a wide range of papers, ' +\n 'that sometimes can be of use while others not. While trying to prepare the necessary color, the typographer always needs a piece of paper that is used ' +\n 'as a production base. On that paper, he mixes the suitable primary colors with the typography spatula (thus the collection name) so he can get the final color (Pantone). ' +\n 'So, this paper, has the role of a \"painting canvas\", on which the typographer creates random, bizarre, sensual, dreamy, fantastic color clusters. Color motifs ' +\n 'that cannot be created on purpose – they are always randomly created! They are, what we call, a \"Random Art\".

\\n' +\n '

The paper \"samples\" is a wide collection of different categories, sizes and qualities of paper that merely reflect the range of works that an artistic ' +\n 'printing shop prints in two decades: from the simplest, cheapest and most humble paper to the handmade, most expensive imported paper, the imprint is one: ' +\n 'random and without any artistic purpose. It aims only to the creation of the necessary color for the printing. A paper printed twice and thrice, a paper with artistic elements, ' +\n 'a paper with images, shapes, abstract concepts after the ink \"charge\". A mysterious miracle! Each piece, from the smallest 10x10cm to the biggest 35x50cm is so unique that could ' +\n 'be considered a small (or big) \"piece of art\"!

\\n' +\n '

When its size and value started showing, this collection was digitized in super high resolution and saved so that it can be sold (paper and electronic files) ' +\n 'to whomever can understand its special artistic value. You can view the complete collection under \"The Collection\" link.

'\n },\n imageCaption: (index: number, length: number) =>\n `Image ${index + 1} of ${length}`\n }\n};\n","import * as React from 'react';\nimport * as Immutable from 'immutable';\nimport { range } from 'lodash';\nimport { IPortfolioCategory, Language, Page } from './types';\n// import FontAwesomeIcon from 'react-fontawesome';\nimport classnames from 'classnames';\nimport { Link } from 'react-router-dom';\nimport { AVAILABLE_LANGUAGES } from './Constants';\n\nconst SPATULA_CHUNK_SIZE = 100;\n\ninterface Props {\n language: Language;\n page: Page;\n portfolioCategories: Immutable.List;\n spatulaItemsCount: number;\n selectedSpatulaRangeIdx: number;\n onCategorySelectionChange: (e: React.ChangeEvent) => void;\n onSpatulaItemChange: (e: React.ChangeEvent) => void;\n}\n\nconst Categories: React.FC = ({\n portfolioCategories,\n onCategorySelectionChange\n}) => (\n
\n {portfolioCategories.map(category => (\n
\n \n
{category.get('name')}
\n
\n ))}\n
\n);\n\nconst SpatulaItems: React.FC = ({\n spatulaItemsCount,\n selectedSpatulaRangeIdx,\n onSpatulaItemChange\n}) => {\n const chunks = range(0, spatulaItemsCount, SPATULA_CHUNK_SIZE);\n\n return (\n
\n {chunks.map((chunk, idx) => {\n const endRange = (idx + 1) * SPATULA_CHUNK_SIZE;\n const startRange = chunk + 1;\n\n const endRangeCaption =\n endRange > spatulaItemsCount ? spatulaItemsCount : endRange;\n\n return (\n
\n \n
\n {startRange}\n {endRangeCaption === startRange\n ? null\n : ` - ${endRangeCaption}`}\n
\n
\n );\n })}\n
\n );\n};\n\nconst MenuLinks: React.FC = ({ language, page }) => (\n
\n {Object.values(Page).map(key =>\n key !== Page.SPATULA_PROJECT_COLLECTION ? (\n \n
\n \n {page === key ?
: null}\n
\n
\n \n ) : null\n )}\n
\n);\n\nconst Languages: React.FC = ({ language, page }) => (\n
\n {AVAILABLE_LANGUAGES.map(({ language: lang, caption, title }, i) => (\n \n \n {caption}\n \n {i < AVAILABLE_LANGUAGES.length - 1 && '/'}\n \n ))}\n
\n);\n\nconst Header: React.FC = props => (\n
\n
\n
\n
\n
\n
{}
\n
\n {/*
\n \n \n
*/}\n \n
\n
\n
\n {!!props.portfolioCategories.size && }\n {!!props.spatulaItemsCount && }\n
\n
\n);\n\nexport default Header;\n","import * as React from 'react';\nimport { RouterProps } from './types';\nimport { TEXTS } from './Constants';\nimport FontAwesomeIcon from 'react-fontawesome';\n\nconst Contact: React.FC = ({\n match: {\n params: { lang }\n }\n}) => (\n
\n
\n
\n
{TEXTS[lang].contact}
\n
\n
\n
web:
\n
\n \n www.grafist.eu\n {' '}\n /{' '}\n \n www.anagrafi.com\n \n
\n
\n
\n
facebook:
\n
\n \n Anagrafi Fonts\n \n
\n
\n
\n
twitter:
\n
\n \n triafonienta\n \n
\n
\n
\n
email:
\n
\n \n triafonienta@gmail.com\n \n
\n \n info@anagrafi.com\n {' '}\n /{' '}\n \n k.siskakis@grafist.eu\n \n
\n
\n
\n
issuu:
\n
\n \n www.issuu.com/anagrafi\n \n
\n
\n
\n
linkedin:
\n
\n \n Konstantinos Siskakis\n \n
\n
\n
\n
pinterest:
\n
\n \n www.pinterest.com/anagrafi\n \n
\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n
\n
\n
\n);\n\nexport default Contact;\n","import * as React from 'react';\nimport { RouterProps } from './types';\nimport { TEXTS } from './Constants';\nimport FontAwesomeIcon from 'react-fontawesome';\n\nconst Persona: React.FC = ({\n match: {\n params: { lang }\n }\n}) => (\n
\n
\n
\n
{TEXTS[lang].persona.title}
\n \n
\n \n
\n {TEXTS[lang].persona.pdf.text}{' '}\n \n {TEXTS[lang].persona.pdf.link}\n \n
\n
\n
\n
\n);\n\nexport default Persona;\n","import * as React from 'react';\nimport {\n Masonry,\n CellMeasurerCache,\n AutoSizer,\n Size,\n CellMeasurer\n} from 'react-virtualized';\nimport {\n createCellPositioner,\n MasonryCellProps\n} from 'react-virtualized/dist/es/Masonry';\nimport { PortfolioItem } from './types';\n\ninterface Props {\n list: PortfolioItem[];\n onItemClick: (id: number) => void;\n}\n\nconst GUTTER_SIZE = 15;\nconst COL_WIDTH = 220;\nconst COL_HEIGHT = 200;\n\nexport default class MasonryComponent extends React.Component {\n private columnCount: number = 0;\n private masonry = React.createRef();\n\n private cache = new CellMeasurerCache({\n defaultHeight: COL_HEIGHT,\n defaultWidth: COL_WIDTH,\n fixedWidth: true\n });\n\n private cellPositioner = createCellPositioner({\n cellMeasurerCache: this.cache,\n columnCount: this.columnCount,\n columnWidth: COL_WIDTH,\n spacer: GUTTER_SIZE\n });\n\n render() {\n return (\n \n {({ width, height }) => (\n \n )}\n \n );\n }\n\n componentDidUpdate() {\n this.cache.clearAll();\n this.resetCellPositioner();\n this.masonry.current?.clearCellPositions();\n }\n\n private renderCell = ({ index, parent, key, style }: MasonryCellProps) => {\n const data = this.props.list[index];\n\n if (!data) {\n return null;\n }\n\n const { description, image, id, height, categoryImage, date } = data;\n\n return (\n \n \n {/* eslint-disable-next-line jsx-a11y/alt-text*/}\n \n \n
\n
\n {/* eslint-disable-next-line jsx-a11y/alt-text*/}\n \n {date}\n
\n
\n \n );\n };\n\n private handleItemClick = (id: number) => () => {\n this.props.onItemClick(id);\n };\n\n private handleResize = ({ width }: Size) => {\n this.calculateColumnCount(width);\n this.resetCellPositioner();\n this.masonry.current?.recomputeCellPositions();\n };\n\n private calculateColumnCount(width: number) {\n this.columnCount = Math.floor(width / (COL_WIDTH + GUTTER_SIZE));\n }\n\n private resetCellPositioner() {\n this.cellPositioner.reset({\n columnCount: this.columnCount,\n columnWidth: COL_WIDTH,\n spacer: GUTTER_SIZE\n });\n }\n}\n","import * as React from 'react';\nimport Lightbox from 'react-image-lightbox';\n\ninterface Props {\n images: string[];\n caption: (selectedPhotoIndex: number) => React.ReactNode;\n photoIndex?: number;\n onCloseRequest: () => void;\n}\n\ninterface State {\n selectedPhotoIndex: number;\n}\n\nconst getPreviousIndex = (index: number, length: number): number =>\n (index + length - 1) % length;\n\nconst getNextIndex = (index: number, length: number): number => (index + 1) % length;\n\nexport default class LightboxComponent extends React.Component {\n state: State = {\n selectedPhotoIndex: this.props.photoIndex || 0\n };\n\n render() {\n const { images, caption, onCloseRequest } = this.props;\n const { selectedPhotoIndex } = this.state;\n\n return (\n \n );\n }\n\n private getImage(direction: 1 | -1) {\n const { selectedPhotoIndex } = this.state;\n const { images } = this.props;\n\n if (images.length === 1) {\n return undefined;\n }\n\n return direction === 1\n ? images[getNextIndex(selectedPhotoIndex, images.length)]\n : images[getPreviousIndex(selectedPhotoIndex, images.length)];\n }\n\n private handleNextImage = () => {\n this.setState(({ selectedPhotoIndex }) => ({\n selectedPhotoIndex: getNextIndex(\n selectedPhotoIndex,\n this.props.images.length\n )\n }));\n };\n\n private handlePreviousImage = () => {\n this.setState(({ selectedPhotoIndex }) => ({\n selectedPhotoIndex: getPreviousIndex(\n selectedPhotoIndex,\n this.props.images.length\n )\n }));\n };\n}\n","import * as qs from 'qs';\nimport { API_ROOT_PATH } from './Constants';\n\nexport const fetchData = (url: string, params?: Record) =>\n fetch(`${API_ROOT_PATH}${url}${params ? `?${qs.stringify(params)}` : ''}`)\n .then(x => x.json())\n .catch(err => console.error(err));\n","import * as React from 'react';\nimport * as Immutable from 'immutable';\nimport { ORIGINS_IMAGE_ROOT_PATH, PORTFOLIO_IMAGE_ROOT_PATH, TEXTS } from './Constants';\nimport Masonry from './Masonry';\nimport Lightbox from './Lightbox';\nimport { fetchData } from './Api';\nimport {\n IPortfolioCategory,\n PortfolioCategory,\n PortfolioItem,\n RouterProps\n} from './types';\n\ninterface Props extends RouterProps {\n portfolioCategories: Immutable.List;\n onSetCategories: (categories: Immutable.List) => void;\n}\n\ninterface State {\n items: PortfolioItem[];\n lightboxOpen: boolean;\n selectedId: number | null;\n}\n\nexport default class Portfolio extends React.Component {\n state: State = {\n items: [],\n lightboxOpen: false,\n selectedId: null\n };\n\n render() {\n return (\n
\n {this.renderLightbox()}\n {this.renderPortfolioItems()}\n
\n );\n }\n\n componentDidMount() {\n Promise.all([fetchData('/GetCategories'), fetchData('/GetDesigns')]).then(\n ([portfolioCategories, portfolioDesigns]: Record[][]) => {\n const categories: PortfolioCategory[] = portfolioCategories.map(\n ({ id, name, imageName, folderName }) => ({\n id,\n name,\n imageName,\n imageFolderName: folderName,\n selected: true\n })\n );\n\n this.props.onSetCategories(Immutable.fromJS(categories));\n\n const portfolioItems: PortfolioItem[] = portfolioDesigns.map(\n ({\n categoryID,\n dateText,\n description,\n id,\n mainImageName,\n zooms,\n height\n }) => {\n const { imageFolderName, imageName } = categories.find(\n ({ id }) => id === categoryID\n );\n\n return {\n categoryId: categoryID,\n date: dateText,\n description: description,\n id: id,\n image: `${PORTFOLIO_IMAGE_ROOT_PATH}/${imageFolderName}/${mainImageName}`,\n zoomImages: zooms.map(\n ({ imageName }) =>\n `${PORTFOLIO_IMAGE_ROOT_PATH}/${imageFolderName}/${imageName}`\n ),\n height: height,\n categoryImage: `${ORIGINS_IMAGE_ROOT_PATH}/${imageName}`\n };\n }\n );\n\n this.setState({\n items: portfolioItems\n });\n }\n );\n }\n\n private renderPortfolioItems() {\n const { items } = this.state;\n const { portfolioCategories } = this.props;\n\n const visibleCategories = portfolioCategories.filter(\n cat => !!cat.get('selected')\n );\n const visibleItems = items.filter(\n ({ categoryId }) =>\n !!visibleCategories.find(cat => cat.get('id') === categoryId)\n );\n\n return ;\n }\n\n private renderLightbox() {\n const { lightboxOpen, selectedId, items } = this.state;\n const data = items.find(({ id }) => id === selectedId);\n\n if (!lightboxOpen || !data || !data.zoomImages) {\n return null;\n }\n\n return (\n \n );\n }\n\n private renderImageCaption = (selectedPhotoIndex: number) => {\n const { selectedId, items } = this.state;\n const { zoomImages, description } = items.find(({ id }) => id === selectedId);\n\n const imageCount =\n zoomImages.length > 1\n ? TEXTS[this.props.match.params.lang].imageCaption(\n selectedPhotoIndex,\n zoomImages.length\n )\n : null;\n\n return (\n
\n \n
{imageCount}
\n
\n );\n };\n\n private handleLightboxClose = () => {\n this.setState({\n lightboxOpen: false,\n selectedId: null\n });\n };\n\n private handleItemClick = (id: number) => {\n this.setState({\n lightboxOpen: true,\n selectedId: id\n });\n };\n}\n","import * as React from 'react';\nimport { Link } from 'react-router-dom';\nimport { TEXTS } from './Constants';\nimport { RouterProps, Page } from './types';\n\nconst Spatula: React.FC = ({\n match: {\n params: { lang }\n }\n}) => (\n
\n
\n
\n
The Spatula Project
\n
\n \n \n {TEXTS[lang].spatula.collection}\n \n
\n
\n
\n);\n\nexport default Spatula;\n","import * as React from 'react';\nimport { fetchData } from './Api';\nimport { SPATULA_IMAGE_ROOT_PATH, TEXTS } from './Constants';\nimport Lightbox from './Lightbox';\nimport { RouterProps, SpatulaCollectionItem } from './types';\n\ninterface Props extends RouterProps {\n selectedSpatulaRangeIdx: number;\n onSetSpatulaItemsCount: (spatulaItemsCount: number) => void;\n}\n\ninterface State {\n spatulaItems: SpatulaCollectionItem[];\n lighboxOpen: boolean;\n selectedItemId: number;\n}\n\nexport default class SpatulaCollection extends React.Component {\n state: State = {\n spatulaItems: [],\n lighboxOpen: false,\n selectedItemId: 0\n };\n\n render() {\n return (\n
\n
\n {this.state.spatulaItems.map(\n ({ description, dimensions, image }, idx) => (\n \n {/* eslint-disable-next-line jsx-a11y/alt-text*/}\n \n
\n {description}\n
\n
\n \n {/* eslint-disable-next-line jsx-a11y/alt-text*/}\n
\n {dimensions}cm\n
\n
\n )\n )}\n {this.renderLightbox()}\n
\n
\n );\n }\n\n componentDidMount() {\n fetchData('/GetTotalSpatulasCount').then(this.props.onSetSpatulaItemsCount);\n this.fetchSpatulaItems();\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.selectedSpatulaRangeIdx !== this.props.selectedSpatulaRangeIdx) {\n this.fetchSpatulaItems();\n }\n }\n\n private fetchSpatulaItems() {\n fetchData('/GetSpatulas', {\n batchNumber: this.props.selectedSpatulaRangeIdx\n }).then(spatulas => {\n this.setState({\n spatulaItems: spatulas.map(\n ({ imageName, originalHeightInCM, originalWidthInCM, id }) =>\n ({\n id,\n description: imageName,\n dimensions: `${originalHeightInCM}x${originalWidthInCM}`,\n image: `${SPATULA_IMAGE_ROOT_PATH}/${imageName}`\n } as SpatulaCollectionItem)\n )\n });\n });\n }\n\n private renderLightbox() {\n const { lighboxOpen, selectedItemId, spatulaItems } = this.state;\n\n if (!lighboxOpen || !spatulaItems.length) {\n return null;\n }\n\n const images = spatulaItems.map(({ image }) => `${image}_bg`);\n\n return (\n \n );\n }\n\n private renderCaption = (selectedPhotoIndex: number) => {\n const { spatulaItems } = this.state;\n const selectedItem = spatulaItems[selectedPhotoIndex];\n\n if (!selectedItem) {\n return null;\n }\n\n const imageCount =\n spatulaItems.length > 1\n ? TEXTS[this.props.match.params.lang].imageCaption(\n selectedPhotoIndex,\n spatulaItems.length\n )\n : null;\n\n return (\n
\n
\n {selectedItem.description}\n
\n
\n Dimensions (H x W): {selectedItem.dimensions}cm\n
\n
{imageCount}
\n
\n );\n };\n\n private handleLightboxClose = () => {\n this.setState({\n lighboxOpen: false,\n selectedItemId: 0\n });\n };\n\n private handleGridItemClick = (id: number) => () => {\n this.setState({\n lighboxOpen: true,\n selectedItemId: id\n });\n };\n}\n","import React from 'react';\nimport * as Immutable from 'immutable';\nimport { Route, Switch, useLocation } from 'react-router-dom';\nimport Header from './Header';\nimport Contact from './Contact';\nimport Persona from './Persona';\nimport Portfolio from './Portfolio';\nimport { IPortfolioCategory, RouterProps, Page } from './types';\nimport Spatula from './Spatula';\nimport SpatulaCollection from './SpatulaCollection';\n\ninterface State {\n portfolioCategories: Immutable.List;\n spatulaItemsCount: number;\n selectedSpatulaRangeIdx: number;\n}\n\ninterface Props {\n portfolioCategories: Immutable.List;\n spatulaItemsCount: number;\n selectedSpatulaRangeIdx: number;\n onLocationChange: () => void;\n onSetCategories: (categories: Immutable.List) => void;\n onSetSpatulaItemsCount: (spatulaItemsCount: number) => void;\n}\n\nconst MainBody: React.FC = ({\n onLocationChange,\n portfolioCategories,\n selectedSpatulaRangeIdx,\n onSetCategories,\n onSetSpatulaItemsCount\n}) => {\n const location = useLocation();\n\n React.useEffect(() => {\n const { pathname } = location;\n\n if (\n !pathname.includes(Page.PORTFOLIO) &&\n !pathname.includes(Page.SPATULA_PROJECT_COLLECTION)\n ) {\n onLocationChange();\n }\n }, [location, onLocationChange]);\n\n return (\n \n (\n \n )}\n />\n \n \n \n \n (\n \n )}\n />\n \n );\n};\n\nexport default class Home extends React.Component {\n state: State = {\n portfolioCategories: Immutable.List(),\n spatulaItemsCount: 0,\n selectedSpatulaRangeIdx: 0\n };\n\n render() {\n const {\n portfolioCategories,\n spatulaItemsCount,\n selectedSpatulaRangeIdx\n } = this.state;\n const { lang, page } = this.props.match.params;\n\n return (\n <>\n \n \n \n );\n }\n\n private handleSpatulaItemChange = (e: React.ChangeEvent) => {\n this.setState({ selectedSpatulaRangeIdx: Number(e.target.id) });\n };\n\n private handleCategorySelectionChange = (\n e: React.ChangeEvent\n ) => {\n const { portfolioCategories } = this.state;\n const id = e.target.value;\n const selected = e.target.checked;\n\n const categoryIdx = portfolioCategories.findIndex(\n cat => cat.get('id') === Number(id)\n );\n\n if (categoryIdx < 0) {\n return;\n }\n\n this.setState({\n portfolioCategories: portfolioCategories.update(categoryIdx, category =>\n category.set('selected', selected)\n )\n });\n };\n\n private handleSetCategories = (\n portfolioCategories: Immutable.List\n ) => {\n this.setState({\n portfolioCategories,\n selectedSpatulaRangeIdx: 0,\n spatulaItemsCount: 0\n });\n };\n\n private handleSetSpatulaItemsCount = (spatulaItemsCount: number) => {\n this.setState({\n spatulaItemsCount,\n portfolioCategories: Immutable.List()\n });\n };\n\n private handleLocationChange = () => {\n this.setState({\n portfolioCategories: Immutable.List(),\n selectedSpatulaRangeIdx: 0,\n spatulaItemsCount: 0\n });\n };\n}\n","import * as React from 'react';\nimport ReactDOM from 'react-dom';\nimport Footer from './Footer';\nimport { Link } from 'react-router-dom';\nimport Home from './Home';\nimport { BrowserRouter as Router, Route, Switch } from 'react-router-dom';\nimport { Page, Language } from './types';\n\nimport './styles/main.less';\n\nconst App: React.FC<{}> = () => (\n <>\n \n \n \n \n
\n
\n
\n
\n \n κωνσταντίνος\n
\n σισκάκης\n \n
\n
\n \n konstantinos\n
\n siskakis\n \n
\n
\n
\n \n \n \n