Placeholder loading anim. Multiline text support.
This commit is contained in:
		
							parent
							
								
									3b66ecfbdd
								
							
						
					
					
						commit
						a4c0732b55
					
				| @ -37,7 +37,11 @@ export const personalData: PersonalData = { | |||||||
|                 position: 'Software Engineer', |                 position: 'Software Engineer', | ||||||
|                 company: 'Q2 Interactive', |                 company: 'Q2 Interactive', | ||||||
|                 timerange: '2009 - 2013', |                 timerange: '2009 - 2013', | ||||||
|                 description: '', |                 description: `Development and project lead of multiple web applications:
 | ||||||
|  |                 - CRM system (PHP backend with Android frontend), | ||||||
|  |                 - Accounting web app, | ||||||
|  |                 - e-commerce sites.`,
 | ||||||
|  |                 tags: ['PHP', 'Java', 'Server hosting', 'Linux', 'Android'] | ||||||
|             } |             } | ||||||
|         ] |         ] | ||||||
|     }, |     }, | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| import React from 'react'; | import React from 'react'; | ||||||
| import Card from 'react-bootstrap/Card'; | import Card from 'react-bootstrap/Card'; | ||||||
| import { useAutoFocus, useFocusedElement } from '../../hooks/FocusedElement'; | import { useAutoFocus } from '../../hooks/FocusedElement'; | ||||||
|  | import { Placeholder } from 'react-bootstrap'; | ||||||
| 
 | 
 | ||||||
| export type Props = { | export type Props = { | ||||||
|     heading?: string, |     heading?: string, | ||||||
| @ -10,6 +11,20 @@ export type Props = { | |||||||
|     description: string |     description: string | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | export function JobCardPlaceholder() { | ||||||
|  |     return <Card className='job-card'> | ||||||
|  |         <Card.Body> | ||||||
|  |         <Placeholder as={Card.Title} animation="glow"> | ||||||
|  |             <Placeholder xs={6} /> | ||||||
|  |         </Placeholder> | ||||||
|  |         <Placeholder as={Card.Text} animation="glow"> | ||||||
|  |             <Placeholder xs={7} /> <Placeholder xs={4} /> <Placeholder xs={5} />{' '} | ||||||
|  |             <Placeholder xs={4} /> <Placeholder xs={3} /> | ||||||
|  |         </Placeholder> | ||||||
|  |         </Card.Body> | ||||||
|  |     </Card> | ||||||
|  | } | ||||||
|  | 
 | ||||||
| export default function JobCard(props: Props) { | export default function JobCard(props: Props) { | ||||||
|     const focusRef = useAutoFocus<HTMLDivElement>([props.position, props.company, props.timerange].join(' - ')) |     const focusRef = useAutoFocus<HTMLDivElement>([props.position, props.company, props.timerange].join(' - ')) | ||||||
|     return ( |     return ( | ||||||
| @ -22,7 +37,7 @@ export default function JobCard(props: Props) { | |||||||
|                 <Card.Subtitle> |                 <Card.Subtitle> | ||||||
|                     <span className='company-name'>{props.company}</span>, <span className='timerange'>{props.timerange}</span> |                     <span className='company-name'>{props.company}</span>, <span className='timerange'>{props.timerange}</span> | ||||||
|                     </Card.Subtitle> |                     </Card.Subtitle> | ||||||
|                 <Card.Text>{props.description}</Card.Text> |                 <Card.Text className='multiline'>{props.description}</Card.Text> | ||||||
|             </Card.Body> |             </Card.Body> | ||||||
|         </Card> |         </Card> | ||||||
|     ); |     ); | ||||||
|  | |||||||
| @ -40,7 +40,7 @@ export default function JobsAccordion(props: JobListProps) { | |||||||
|       {jobs.previous?.map((job, index) => ( |       {jobs.previous?.map((job, index) => ( | ||||||
|       <Accordion.Item eventKey={`previous-${index}`} key={index}> |       <Accordion.Item eventKey={`previous-${index}`} key={index}> | ||||||
|         <Accordion.Header><JobTitle job={job} /></Accordion.Header> |         <Accordion.Header><JobTitle job={job} /></Accordion.Header> | ||||||
|         <Accordion.Body> |         <Accordion.Body className='multiline'> | ||||||
|         {job.description} |         {job.description} | ||||||
|         </Accordion.Body> |         </Accordion.Body> | ||||||
|       </Accordion.Item> |       </Accordion.Item> | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ import React from 'react'; | |||||||
| import Container from 'react-bootstrap/Container'; | import Container from 'react-bootstrap/Container'; | ||||||
| import Col from 'react-bootstrap/Col'; | import Col from 'react-bootstrap/Col'; | ||||||
| import Row from 'react-bootstrap/Row'; | import Row from 'react-bootstrap/Row'; | ||||||
| import JobCard from './JobCard'; | import JobCard, { JobCardPlaceholder } from './JobCard'; | ||||||
| import { partition } from '../../utils'; | import { partition } from '../../utils'; | ||||||
| import { JobListProps } from './types'; | import { JobListProps } from './types'; | ||||||
| 
 | 
 | ||||||
| @ -16,6 +16,13 @@ const defaultProps = { | |||||||
|   currentHeading: 'Currently', |   currentHeading: 'Currently', | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | export function JobsCardsPlaceholder() { | ||||||
|  |   return <Container> | ||||||
|  |     <Row><Col><JobCardPlaceholder /></Col></Row> | ||||||
|  |     <Row><Col><JobCardPlaceholder /></Col></Row> | ||||||
|  |   </Container> | ||||||
|  | } | ||||||
|  | 
 | ||||||
| export default function JobsCards(props: JobListProps) { | export default function JobsCards(props: JobListProps) { | ||||||
|   const {jobs} = props |   const {jobs} = props | ||||||
|   const config = {...defaultProps, ...props} |   const config = {...defaultProps, ...props} | ||||||
|  | |||||||
| @ -4,7 +4,7 @@ import Container from 'react-bootstrap/Container'; | |||||||
| import useSize from '../../hooks/Size'; | import useSize from '../../hooks/Size'; | ||||||
| import { JobListProps } from './types'; | import { JobListProps } from './types'; | ||||||
| import JobsAccordion from './JobsAccordion'; | import JobsAccordion from './JobsAccordion'; | ||||||
| import JobsCards from './JobsCards'; | import JobsCards, { JobsCardsPlaceholder } from './JobsCards'; | ||||||
| 
 | 
 | ||||||
| export type Props = { | export type Props = { | ||||||
|   heading: string, |   heading: string, | ||||||
| @ -18,7 +18,8 @@ const defaultProps = { | |||||||
| export default function JobHistory(props: Props) { | export default function JobHistory(props: Props) { | ||||||
|   const {SizeWrapper, size} = useSize() |   const {SizeWrapper, size} = useSize() | ||||||
| 
 | 
 | ||||||
|   const jobsList = size.width < 600 ? <JobsAccordion {...props} /> : <JobsCards {...props} /> |   const jobsList = size.width === 0 ? <JobsCardsPlaceholder /> : ( | ||||||
|  |     size.width < 600 ? <JobsAccordion {...props} /> : <JobsCards {...props} />) | ||||||
| 
 | 
 | ||||||
|   return ( |   return ( | ||||||
|     <Container> |     <Container> | ||||||
|  | |||||||
| @ -61,3 +61,9 @@ body { | |||||||
| .accordion-button.collapsed { | .accordion-button.collapsed { | ||||||
|     background-color: lavender; |     background-color: lavender; | ||||||
| } | } | ||||||
|  | .accordion { | ||||||
|  |     margin: 1rem; | ||||||
|  | } | ||||||
|  | .multiline { | ||||||
|  |     white-space: pre-line; | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user