131 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.