124 private links
Click on the button, if yuo can !
const { useState, useRef, useEffect, useLayoutEffect, createContext } = React;
/**
* Globals
*/
const CONSTANTS = {
assetPath: "https://s3-us-west-2.amazonaws.com/s.cdpn.io/184729",
}
const ASSETS = {
head: `${CONSTANTS.assetPath}/head.svg`,
waiting: `${CONSTANTS.assetPath}/hand.svg`,
stalking: `${CONSTANTS.assetPath}/hand-waiting.svg`,
grabbing: `${CONSTANTS.assetPath}/hand.svg`,
grabbed: `${CONSTANTS.assetPath}/hand-with-cursor.svg`,
shaka: `${CONSTANTS.assetPath}/hand-surfs-up.svg`
}
// Preload images
Object.keys(ASSETS).forEach(key => {
const img = new Image();
img.src = ASSETS[key];
});
/**
* Shared hooks
*/
// Hover state - https://dev.to/spaciecat/hover-states-with-react-hooks-4023
const useHover = () => {
const ref = useRef();
const [hovered, setHovered] = useState(false);
const enter = () => setHovered(true);
const leave = () => setHovered(false);
useEffect(
() => {
ref.current.addEventListener("mouseenter", enter);
ref.current.addEventListener("mouseleave", leave);
return () => {
ref.current.removeEventListener("mouseenter", enter);
ref.current.removeEventListener("mouseleave", leave);
};
},
[ref]
);
return [ref, hovered];
};
// Mouse position
const useMousePosition = () => {
const [position, setPosition] = useState({ x: 0, y: 0 });
useEffect(() => {
const setFromEvent = e => setPosition({ x: e.clientX, y: e.clientY });
window.addEventListener("mousemove", setFromEvent);
return () => {
window.removeEventListener("mousemove", setFromEvent);
};
}, []);
return position;
};
// Element position
const usePosition = () => {
const ref = useRef();
const [position, setPosition] = useState({});
const handleResize = () => {
setPosition(ref.current.getBoundingClientRect());
};
useLayoutEffect(() => {
handleResize();
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, [ref.current]);
return [ref, position];
};
/**
* React Components
*/
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
debug: false,
cursorGrabbed: false,
gameOver: false,
};
this.handleToggleDebug = this.handleToggleDebug.bind(this);
this.handleButtonClicked = this.handleButtonClicked.bind(this);
this.handleCursorGrabbed = this.handleCursorGrabbed.bind(this);
}
handleToggleDebug() {
this.setState({
debug: !this.state.debug
});
}
handleCursorGrabbed() {
this.setState({
cursorGrabbed: true
});
setTimeout(() => {
this.setState({
cursorGrabbed: false
});
}, 2000)
}
handleButtonClicked() {
this.setState({
gameOver: true
});
setTimeout(() => {
this.setState({
gameOver: false
});
}, 4000)
}
render() {
const { cursorGrabbed, gameOver, debug } = this.state;
const screenStyle = cursorGrabbed ? { cursor: "none" } : {};
const appClass = debug ? "app app--debug" : "app";
return (
<div className={appClass} style={screenStyle}>
<section className="container">
<h1>Hello!</h1>
<h2>Welcome to the internet.</h2>
<p>This is a classic website, no traps or weird stuff!</p>
<p>Feel free to browse, relax and, I don't know, click the button down there? Might as well, right?</p>
<button
className="debug-button"
onClick={this.handleToggleDebug}>
Debug
</button>
</section>
<button
className="trap-button"
onClick={this.handleButtonClicked}>
{ gameOver && "Nice one" }
{ cursorGrabbed && "Gotcha!" }
{ !gameOver && !cursorGrabbed && "Button!"}
</button>
<div className="grab-zone-wrapper">
<GrabZone
onCursorGrabbed={this.handleCursorGrabbed}
cursorGrabbed={cursorGrabbed}
gameOver={gameOver}
/>
</div>
</div>
);
}
}
// GrabZone (The hover trigger zone)
const GrabZone = ({ cursorGrabbed, gameOver, onCursorGrabbed }) => {
const [outerRef, outerHovered] = useHover();
const [innerRef, innerHovered] = useHover();
const [isExtended, setExtendedArm] = useState(false);
let state = "waiting";
if (outerHovered) {
state = "stalking";
}
if (innerHovered) {
state = "grabbing";
}
if (cursorGrabbed) {
state = "grabbed";
}
if (gameOver) {
state = "shaka"
}
// If state is grabbing for a long time, they're being clever!
useEffect(() => {
let timer;
if (state === "grabbing") {
timer = setTimeout(() => {
// Not so clever now, are they?
setExtendedArm(true);
timer = null;
}, 2000);
}
return () => {
setExtendedArm(false);
if (timer) {
clearTimeout(timer);
}
};
},
[state]
);
return (
<div className="grab-zone" ref={outerRef}>
<div className="grab-zone__debug">
<strong>Debug info:</strong>
<p>Current state: {state}</p>
<p>Extended arm: {isExtended ? "Yes" : "No"}</p>
</div>
<div className="grab-zone__danger" ref={innerRef}>
<Grabber
state={state}
gameOver={gameOver}
extended={isExtended}
onCursorGrabbed={onCursorGrabbed}
/>
</div>
</div>
);
};
// Grabber (The graphic)
const Grabber = ({ state, gameOver, extended, onCursorGrabbed }) => {
const mousePos = useMousePosition();
const [ref, position] = usePosition();
const hasCursor = false;
// Calculate rotation of armWrapper
const x = position.left + position.width * 0.5;
const y = position.top + position.height * 0.5;
const angle = gameOver ? 0 : Math.atan2(mousePos.x - x, -(mousePos.y - y)) * (180 / Math.PI);
// Ensure value is within acceptable range (-75 to 75)
const rotation = Math.min(Math.max(parseInt(angle), -79), 79);
const grabberClass = `grabber grabber--${state} ${extended && "grabber--extended"}`;
const wrapperStyle = { transform: `rotate(${rotation}deg)` };
let handImageSrc = ASSETS[state];
return (
<div className={grabberClass}>
<div className="grabber__body"></div>
<img className="grabber__face" src={ASSETS.head} />
<div className="grabber__arm-wrapper" ref={ref} style={wrapperStyle}>
<div className="grabber__arm">
<img
className="grabber__hand"
src={handImageSrc}
onMouseEnter={onCursorGrabbed}
/>
</div>
</div>
</div>
);
};
// Render app
ReactDOM.render(<App />, document.getElementById("app"));
html {
font-size: 18px;
@media (min-width: 900px) {
font-size: 24px;
}
}
body {
font-family: 'Montserrat', sans-serif;
font-weight: 300;
line-height: 1.45;
color: #0F1108;
}
h1 {
font-size: 2.2rem;
margin: 0;
font-weight: 600;
line-height: 1.15;
@media (min-width: 900px) {
font-size: 2.488rem;
}
}
h2 {
font-size: 1.4rem;
margin: 0.5rem 0;
line-height: 1.15;
font-weight: 200;
@media (min-width: 900px) {
margin: 1rem 0;
font-size: 1.44rem;
}
}
p {
margin-top: 0.25rem;
@media (min-width: 900px) {
margin-top: 0.5rem;
}
}
a {
color: #0F1108;
text-decoration: none;
border-bottom: currentcolor 1px solid;
}
// General modules
.container {
max-width: 520px;
margin: 0 auto;
padding: 0 1rem 100px 1rem;
@media (min-width: 900px) {
max-width: 650px;
padding: 0 1rem 90px 1rem;
}
}
// Full-screen wrapper
.app {
position: relative;
background: #F2E9DE;
display: flex;
align-items: center;
justify-content: center;
min-height: calc(100vh - 2rem);
margin: 1rem;
overflow: hidden;
// Modifiers
&--debug {
.grab-zone {
background: rgba(0, 0, 0, 0.15);
}
.grab-zone__debug {
display: block;
}
.grab-zone__danger {
background: rgba(0, 0, 0, 0.15);
}
.grabber__arm-wrapper {
background: rgba(0, 0, 0, 0.15);
}
}
}
.grab-zone-wrapper {
position: absolute;
bottom: 0;
right: 0;
transform: translateX(30%) translateY(50%);
}
.grab-zone {
display: flex;
align-items: center;
justify-content: center;
width: 700px;
height: 700px;
border-radius: 50%;
&__danger {
display: flex;
align-items: center;
justify-content: center;
width: 400px;
height: 400px;
border-radius: 50%;
}
&__debug {
display: none;
position: absolute;
width: 300px;
top: -100px;
font-size: 14px;
text-align: center;
text-transform: uppercase;
}
}
.grabber {
position: relative;
width: 100px;
height: 100px;
&__arm-wrapper {
position: absolute;
top: -80px;
width: 24px;
height: 260px;
}
&__arm {
position: relative;
width: 24px;
height: 200px;
background: #7D9A9E;
border-radius: 20px;
overflow: visible;
transform: translateY(100%);
transition: transform 0.2s ease;
}
&__hand {
display: block;
position: absolute;
top: -12px;
transform: scale(1.4) rotate(-10deg) translateY(100%);
transform-origin: bottom center;
transition: transform 0.3s ease;
}
&__face {
position: absolute;
width: 75px;
height: 84px;
right: 5%;
transition: transform 0.3s ease;
}
&__body {
position: absolute;
top: 50%;
left: 0%;
width: 110px;
height: 95px;
border-radius: 50%;
background: #7D9A9E;
transition: transform 0.3s ease;
}
// Modifiers
&--waiting {
.grabber__hand {
transform: scale(1.4) rotate(-10deg);
}
.grabber__arm {
transform: translateY(80%);
}
.grabber__face {
transform: translateY(60%);
}
}
// Modifiers
&--stalking {
.grabber__hand {
transform: scale(1.4) rotate(-10deg);
}
.grabber__arm {
transform: translateY(70%);
}
.grabber__face {
transform: translateY(10%);
}
}
&--grabbing {
.grabber__face {
transform: translateY(-40%) rotate(10deg);
}
.grabber__arm {
transform: translateY(0%);
}
.grabber__body {
transform: translateY(-20%);
}
.grabber__hand {
transform: scale(1.7) rotate(10deg);
}
}
&--grabbed {
.grabber__arm {
transition: transform 1s ease;
}
.grabber__hand {
transition: transform 2.5s ease;
}
.grabber__face {
transform: translateY(70%);
transition: transform 1s ease;
}
.grabber__body {
transform: translateY(50%);
transition: transform 1s ease;
}
}
&--extended {
.grabber__arm {
transform: translateY(-20%);
}
.grabber__face {
transform: translateY(-60%) rotate(15deg);
}
.grabber__body {
transform: translateY(-40%);
}
}
&--shaka {
.grabber__arm {
transform: translateY(50%);
}
.grabber__hand {
transform: scale(2.5) translateY(10%);
animation: shaka 0.5s infinite alternate forwards;
transform-origin: 55% 60%;
}
.grabber__face {
transform: translateY(70%);
transition: transform 1s ease;
}
.grabber__body {
transform: translateY(50%);
transition: transform 1s ease;
}
}
}
.trap-button {
position: absolute;
bottom: 80px;
right: 70px;
min-width: 125px;
background: #8ECACC;
color: white;
border-radius: 5px;
padding: 0.4rem 0.5rem;
font-weight: 600;
font-size: 18px;
letter-spacing: 1px;
text-transform: uppercase;
}
.debug-button {
position: fixed;
top: 0;
right: 0;
background: transparent;
padding: 1rem;
margin: 1rem;
font-size: 16px;
text-transform: uppercase;
letter-spacing: 1px;
opacity: 0.5;
}
@keyframes shaka {
0% { transform: scale(2.5) translateY(0%) rotate(-20deg); }
100% { transform: scale(2.5) translateY(0%) rotate(20deg); }
}
<div id="app"></div>
Il y en a qui se font chier
Redimensionner une image automatiquement : http://lehollandaisvolant.net/?mode=links&id=20130718014626
Effets sur le header en défilant : http://tympanus.net/Development/HeaderEffects/
Expérimentations css3 : http://hakim.se/experiments/assorted-css-animations
7 templates metro ui : http://smashinghub.com/7-free-metro-ui-template.htm
35 infographies et cheat sheet pour les social media manager et marketeux : http://www.hongkiat.com/blog/cheatsheets-social-media-marketers/
Flat design dans le print : http://designmodo.com/flat-design-web-print/
http://www.lafermeduweb.net/veille/un-mockup-de-charte-graphique-pour-presenter-vos-idees-a-votre-client-357389298238099458.html
http://www.lafermeduweb.net/veille/mettre-dans-la-file-queue-vos-requetes-ajax-357386742229241857.html
Utiliser l'accéléromètre des mobiles en JS : http://www.inserthtml.com/2013/07/javascript-accelerometer/
Afficher la batterie : http://www.hongkiat.com/blog/html5-battery-status/
http://webdesigntunes.com/freebies/free-responsive-html5-templates/
http://www.cssauthor.com/daily-mobile-ui-design-inspiration-83/
http://www.lafermeduweb.net/veille/creer-un-chat-temps-reel-avec-meteor-et-les-meteor-streams-359553514311135236.html
http://www.lafermeduweb.net/veille/4-outils-pour-mettre-en-place-des-tests-css-automatiques-359556066662555648.html
http://www.lafermeduweb.net/veille/flatilicious-un-pack-de-48-icones-flat-ui-gratuites-360290855287918592.html
http://www.lafermeduweb.net/veille/creer-son-propre-player-mp3-en-html5-360285857254617088.html
http://www.lafermeduweb.net/veille/accelerer-son-workflow-de-developpement-avec-grunt-js-360283292966199296.html
http://www.lafermeduweb.net/veille/un-nouveau-tutoriel-en-developpement-android-360280763385643009.html
http://www.lafermeduweb.net/veille/les-nouvelles-statistiques-facebook-decryptees-360278287043395584.html
http://www.lafermeduweb.net/veille/optimisez-vos-sites-responsive-pour-gagner-en-performances-359921035698634752.html
http://www.lafermeduweb.net/veille/slimmenu-un-plugin-jquery-pour-creer-des-menus-avances-et-responsive-359918389201862656.html
http://www.lafermeduweb.net/veille/trackez-vos-visiteurs-en-temps-reel-avec-couchbase-elasticsearch-et-kibana-359916024822378497.html
http://www.lafermeduweb.net/veille/pointer-js-normalisez-les-evenements-de-clic-sur-mobile-et-desktop-360643178434539520.html
http://www.lafermeduweb.net/veille/une-decomposition-complete-de-backbone-js-pour-comprendre-ses-entrailles-361737867015364608.html
http://www.lafermeduweb.net/veille/css-guidelines-une-collection-d-astuces-css-interessantes-361735395546894337.html
http://www.lafermeduweb.net/veille/une-recherche-ui-interessante-sur-le-futur-des-sites-de-compagnies-aeriennes-361732832936214530.html
http://www.lafermeduweb.net/veille/un-kit-de-wireframing-pour-ios-7-sous-illustrator-361730356631707648.html
http://www.lafermeduweb.net/veille/comment-creer-un-cube-en-css3-361727884676694016.html
générer bruit http://noisepng.com/
générer template :http://ink.sapo.pt/typography
http://www.lafermeduweb.net/veille/nedb-l-equivalent-de-sqlite-pour-node-js-371874766384533504.html
http://www.lafermeduweb.net/veille/une-collection-de-gestes-tactiles-animes-pour-vos-tutoriels-guides-371879702275035137.html
http://www.lafermeduweb.net/billet/koala-une-interface-pour-compiler-sass-compass-less-coffeescript-1621.html
http://www.lafermeduweb.net/veille/emmet-livestyle-repercutez-en-direct-vos-modifications-css-de-sublime-text-dans-chrome-ou-safari-371887285647970304.html
Effet sur les liens : http://tympanus.net/Development/CreativeLinkEffects/
Créer des interfaces en 3D http://tridiv.com/
404 http://www.hongkiat.com/blog/funny-creative-error-404/
Web Storage : http://www.sitepoint.com/html5-web-storage/
Icones monuments : http://www.noupe.com/freebie/exclusive-vector-freebie-250-ultimate-world-monuments-icon-pack-by-freepik-78439.html
Formulaire CB : http://kenkeiter.com/skeuocard/
Tester webfont http://typewonder.com/
Optimisations android : http://www.hongkiat.com/blog/speed-up-android/
Dashboard http://www.lafermeduweb.net/billet/oocharts-une-api-pour-creer-vos-propres-dashboard-google-analytics-1623.html
Responsive http://www.lafermeduweb.net/veille/les-etapes-a-suivre-pour-creer-un-design-responsive-372609525532360704.html
Navifgation circulaire: http://www.lafermeduweb.net/veille/une-navigation-de-menu-circulaire-originale-avec-transitions-css-372604479910461440.html
Maniipuler jdom en JS http://www.lafermeduweb.net/veille/html-js-une-bibliotheque-js-pour-manipuler-plus-facilement-le-dom-372599577448546304.html
Progress Bar : http://css-tricks.com/html5-element/
Aide responsive pour placer les blocs : http://www.responsivewebcss.com/
Afficher code sur une page : http://www.sitepoint.com/best-practice-for-code-examples/
Taille automatique iframe aec jquery : http://sly777.github.io/Iframe-Height-Jquery-Plugin/
Menu moderne : http://tympanus.net/Development/MultiLevelPushMenu/
Plugin pour créer des ombres "allongées" : http://thepetedesign.com/demos/jquery_flat_shadow_demo.html
Inspiration design http://thedesigninspiration.com/
Editer contenu (webkit en tout cas KO avec FF) http://jakiestfu.github.io/Medium.js/docs/
Blur http://www.sitepoint.com/how-to-use-motion-blur-in-css3-animations/
10 musr have pour le responsive http://www.bestdesigntuts.com/10-must-have-responsive-web-design-tools-for-designers
Detecter lce que le navigateur supporte http://www.hongkiat.com/blog/css-supports-rule/
Tuto bootsrap http://www.sitepoint.com/building-responsive-websites-using-twitter-bootstrap/
UI Git : https://npmjs.org/package/ungit
Gérer Favicon https://github.com/audreyr/favicon-cheat-sheet
Template admin bootstrap http://www.egrappler.com/templatevamp-free-twitter-bootstrap-admin-template/
API gratuite méteo http://developer.worldweatheronline.com/
15 design page unique http://www.sitepoint.com/15-creative-single-page-web-designs/
Select sexy jquery et api http://www.bartos.me/heapbox/
15 plugins JS de code highlighting pour afficher du code http://codegeekz.com/15-code-syntax-highlighters-to-prettify-your-code/
Astuces Git : http://sixrevisions.com/web-development/git-tips/
Domotique http://ni-c.github.io/heimcontrol.js/
Icones linéaires http://www.cssauthor.com/free-line-icons-for-web-and-ui-designs
CV http://www.lafermeduweb.net/billet/30-exemples-de-cv-design-et-creatifs-pour-votre-inspiration-1628.html
CSS 3 animations: cheat sheat http://www.justinaguilar.com/animations/index.html
Layout horizontal http://tympanus.net/Development/TripleViewLayout/
Sidebar Transitions: Transition effects for off-canvas views http://tympanus.net/Development/SidebarTransitions/#
jQuery Plugin Registry http://plugins.jquery.com/
3D Shading with Box-Shadows http://tympanus.net/Tutorials/3DShadingWithBoxShadows/
LovelyUI: Une collection d'interfaces mobiles pour inspiration http://www.lovelyui.com/
Font dev http://www.slant.co/topics/67/~what-are-the-best-programming-fonts
40 Free Fonts for Flat Design http://www.hongkiat.com/blog/flat-design-free-fonts/
Flattastic UI Kit http://www.webdesignerdepot.com/2013/08/free-download-flattastic-ui-kit/?ref=lafermeduweb
Des mockups de smartphones et tablettes sous Android http://dribbble.com/shots/1224225-Freebie-Android-Devices
Animo.js plugin jQuery manipuler les animations CSS3 http://labs.bigroomstudios.com/libraries/animo-js
20 icones mobiles Flat http://www.hongkiat.com/blog/flat-mobile-app-icon/
Ajouter des tags, comme l'interface puppet https://github.com/dscout/velge
Tester site résolution http://quirktools.com/screenfly/
Créer des cartes interactives http://www.lafermeduweb.net/billet/mapael-creez-des-cartes-vectorielles-interactives-avec-jquery-1634.html
Webmail libre : http://www.lafermeduweb.net/billet/mailpile-un-webmail-100-opensource-complet-et-moderne-1640.html
Script php mail poubelle http://book.knah-tsaeb.org/?fwmb5w
Protéger deconnexion : http://www.lafermeduweb.net/billet/failsafe-protegez-vos-applis-web-des-deconnexions-1638.html
Monster Id : https://github.com/KevinGaudin/monsterid.js
Des icones : http://www.cssauthor.com/free-icons-for-web-and-user-interface-design-19/
600 thèmes wordpress : http://www.cssauthor.com/free-wordpress-themes/
Fabriquer des requetes HTTP sans curl : http://requests.ryanmccue.info/
Défiler pleine page : http://alvarotrigo.com/fullPage/
Player HTML5 : http://praegnanz.de/html5video/
Pack icones Meteo : http://freecns.yanlu.de/cumulus/
Pour dessiner : http://leimi.github.io/drawingboard.js/
10 webapp pour chat : http://codegeekz.com/10-free-chat-applications-for-your-websites/
30 sites template une page : http://www.webdesignerdepot.com/2013/10/30-one-page-sites-youll-wish-you-had-built/
"Landing" exemple dropbox, nous rejoindre etc: http://sixrevisions.com/web_design/minimalist-landing-pages-deconstruct/
Changer automatiquement la couleur d'un élément selon la couleur qui est dessous : http://www.webresourcesdepot.com/auto-change-the-color-of-elements-according-to-the-background-backgroundcheck/
Très impressionnante page de présentation d'un produit.
Avec animation, rotation de la page + zoom.
Portefolio sous forme de timeline.
Très sympa
Gallerie simple pour photo sous format grille + visionneuse.