Compare commits
	
		
			2 Commits
		
	
	
		
			fb5bde70ef
			...
			e2ce420764
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						e2ce420764
	
				 | 
					
					
						|||
| 
						
						
							
						
						7583883d64
	
				 | 
					
					
						
							
								
								
									
										30
									
								
								src/resources/css/animations/ripple.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/resources/css/animations/ripple.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
:root {
 | 
			
		||||
    --ripple-color: #fff;
 | 
			
		||||
    --ripple-radius: 9999px;
 | 
			
		||||
    --ripple-duration: 600ms;
 | 
			
		||||
    --ripple-timing-function: linear;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ripple {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 0;
 | 
			
		||||
    left: 0;
 | 
			
		||||
    bottom: 0;
 | 
			
		||||
    right: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ripple span {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    border-radius: var(--ripple-radius);
 | 
			
		||||
    opacity: 0.5;
 | 
			
		||||
    background: var(--ripple-color);
 | 
			
		||||
    transform: scale(0);
 | 
			
		||||
    animation: ripple var(--ripple-duration) var(--ripple-timing-function);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@keyframes ripple {
 | 
			
		||||
    to {
 | 
			
		||||
        transform: scale(4);
 | 
			
		||||
        opacity: 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										74
									
								
								src/resources/css/resets/andy-bell.reset.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/resources/css/resets/andy-bell.reset.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
/* Box sizing rules */
 | 
			
		||||
*,
 | 
			
		||||
*::before,
 | 
			
		||||
*::after {
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Remove default margin */
 | 
			
		||||
body,
 | 
			
		||||
h1,
 | 
			
		||||
h2,
 | 
			
		||||
h3,
 | 
			
		||||
h4,
 | 
			
		||||
p,
 | 
			
		||||
figure,
 | 
			
		||||
blockquote,
 | 
			
		||||
dl,
 | 
			
		||||
dd {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
 | 
			
		||||
ul[role='list'],
 | 
			
		||||
ol[role='list'] {
 | 
			
		||||
  list-style: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Set core root defaults */
 | 
			
		||||
html:focus-within {
 | 
			
		||||
  scroll-behavior: smooth;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Set core body defaults */
 | 
			
		||||
body {
 | 
			
		||||
  min-height: 100vh;
 | 
			
		||||
  text-rendering: optimizeSpeed;
 | 
			
		||||
  line-height: 1.5;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* A elements that don't have a class get default styles */
 | 
			
		||||
a:not([class]) {
 | 
			
		||||
  text-decoration-skip-ink: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Make images easier to work with */
 | 
			
		||||
img,
 | 
			
		||||
picture {
 | 
			
		||||
  max-width: 100%;
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Inherit fonts for inputs and buttons */
 | 
			
		||||
input,
 | 
			
		||||
button,
 | 
			
		||||
textarea,
 | 
			
		||||
select {
 | 
			
		||||
  font: inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Remove all animations, transitions and smooth scroll for people that prefer not to see them */
 | 
			
		||||
@media (prefers-reduced-motion: reduce) {
 | 
			
		||||
  html:focus-within {
 | 
			
		||||
   scroll-behavior: auto;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  *,
 | 
			
		||||
  *::before,
 | 
			
		||||
  *::after {
 | 
			
		||||
    animation-duration: 0.01ms !important;
 | 
			
		||||
    animation-iteration-count: 1 !important;
 | 
			
		||||
    transition-duration: 0.01ms !important;
 | 
			
		||||
    scroll-behavior: auto !important;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										48
									
								
								src/resources/css/resets/eric-meyer.reset.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/resources/css/resets/eric-meyer.reset.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
/* http://meyerweb.com/eric/tools/css/reset/ 
 | 
			
		||||
   v2.0 | 20110126
 | 
			
		||||
   License: none (public domain)
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
html, body, div, span, applet, object, iframe,
 | 
			
		||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
 | 
			
		||||
a, abbr, acronym, address, big, cite, code,
 | 
			
		||||
del, dfn, em, img, ins, kbd, q, s, samp,
 | 
			
		||||
small, strike, strong, sub, sup, tt, var,
 | 
			
		||||
b, u, i, center,
 | 
			
		||||
dl, dt, dd, ol, ul, li,
 | 
			
		||||
fieldset, form, label, legend,
 | 
			
		||||
table, caption, tbody, tfoot, thead, tr, th, td,
 | 
			
		||||
article, aside, canvas, details, embed, 
 | 
			
		||||
figure, figcaption, footer, header, hgroup, 
 | 
			
		||||
menu, nav, output, ruby, section, summary,
 | 
			
		||||
time, mark, audio, video {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    border: 0;
 | 
			
		||||
    font-size: 100%;
 | 
			
		||||
    font: inherit;
 | 
			
		||||
    vertical-align: baseline;
 | 
			
		||||
}
 | 
			
		||||
/* HTML5 display-role reset for older browsers */
 | 
			
		||||
article, aside, details, figcaption, figure, 
 | 
			
		||||
footer, header, hgroup, menu, nav, section {
 | 
			
		||||
    display: block;
 | 
			
		||||
}
 | 
			
		||||
body {
 | 
			
		||||
    line-height: 1;
 | 
			
		||||
}
 | 
			
		||||
ol, ul {
 | 
			
		||||
    list-style: none;
 | 
			
		||||
}
 | 
			
		||||
blockquote, q {
 | 
			
		||||
    quotes: none;
 | 
			
		||||
}
 | 
			
		||||
blockquote:before, blockquote:after,
 | 
			
		||||
q:before, q:after {
 | 
			
		||||
    content: '';
 | 
			
		||||
    content: none;
 | 
			
		||||
}
 | 
			
		||||
table {
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
    border-spacing: 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										349
									
								
								src/resources/css/resets/nicolas-allagher.normalize.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										349
									
								
								src/resources/css/resets/nicolas-allagher.normalize.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,349 @@
 | 
			
		||||
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
 | 
			
		||||
 | 
			
		||||
/* Document
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the line height in all browsers.
 | 
			
		||||
 * 2. Prevent adjustments of font size after orientation changes in iOS.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
html {
 | 
			
		||||
  line-height: 1.15; /* 1 */
 | 
			
		||||
  -webkit-text-size-adjust: 100%; /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Sections
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the margin in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Render the `main` element consistently in IE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
main {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Correct the font size and margin on `h1` elements within `section` and
 | 
			
		||||
 * `article` contexts in Chrome, Firefox, and Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
h1 {
 | 
			
		||||
  font-size: 2em;
 | 
			
		||||
  margin: 0.67em 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Grouping content
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Add the correct box sizing in Firefox.
 | 
			
		||||
 * 2. Show the overflow in Edge and IE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
hr {
 | 
			
		||||
  box-sizing: content-box; /* 1 */
 | 
			
		||||
  height: 0; /* 1 */
 | 
			
		||||
  overflow: visible; /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the inheritance and scaling of font size in all browsers.
 | 
			
		||||
 * 2. Correct the odd `em` font sizing in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
pre {
 | 
			
		||||
  font-family: monospace, monospace; /* 1 */
 | 
			
		||||
  font-size: 1em; /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Text-level semantics
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the gray background on active links in IE 10.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
a {
 | 
			
		||||
  background-color: transparent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Remove the bottom border in Chrome 57-
 | 
			
		||||
 * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
abbr[title] {
 | 
			
		||||
  border-bottom: none; /* 1 */
 | 
			
		||||
  text-decoration: underline; /* 2 */
 | 
			
		||||
  text-decoration: underline dotted; /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add the correct font weight in Chrome, Edge, and Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
b,
 | 
			
		||||
strong {
 | 
			
		||||
  font-weight: bolder;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the inheritance and scaling of font size in all browsers.
 | 
			
		||||
 * 2. Correct the odd `em` font sizing in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
code,
 | 
			
		||||
kbd,
 | 
			
		||||
samp {
 | 
			
		||||
  font-family: monospace, monospace; /* 1 */
 | 
			
		||||
  font-size: 1em; /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add the correct font size in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
small {
 | 
			
		||||
  font-size: 80%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Prevent `sub` and `sup` elements from affecting the line height in
 | 
			
		||||
 * all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
sub,
 | 
			
		||||
sup {
 | 
			
		||||
  font-size: 75%;
 | 
			
		||||
  line-height: 0;
 | 
			
		||||
  position: relative;
 | 
			
		||||
  vertical-align: baseline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub {
 | 
			
		||||
  bottom: -0.25em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sup {
 | 
			
		||||
  top: -0.5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Embedded content
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the border on images inside links in IE 10.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
img {
 | 
			
		||||
  border-style: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Forms
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Change the font styles in all browsers.
 | 
			
		||||
 * 2. Remove the margin in Firefox and Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
input,
 | 
			
		||||
optgroup,
 | 
			
		||||
select,
 | 
			
		||||
textarea {
 | 
			
		||||
  font-family: inherit; /* 1 */
 | 
			
		||||
  font-size: 100%; /* 1 */
 | 
			
		||||
  line-height: 1.15; /* 1 */
 | 
			
		||||
  margin: 0; /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Show the overflow in IE.
 | 
			
		||||
 * 1. Show the overflow in Edge.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
input { /* 1 */
 | 
			
		||||
  overflow: visible;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the inheritance of text transform in Edge, Firefox, and IE.
 | 
			
		||||
 * 1. Remove the inheritance of text transform in Firefox.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
select { /* 1 */
 | 
			
		||||
  text-transform: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Correct the inability to style clickable types in iOS and Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button,
 | 
			
		||||
[type="button"],
 | 
			
		||||
[type="reset"],
 | 
			
		||||
[type="submit"] {
 | 
			
		||||
  -webkit-appearance: button;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the inner border and padding in Firefox.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button::-moz-focus-inner,
 | 
			
		||||
[type="button"]::-moz-focus-inner,
 | 
			
		||||
[type="reset"]::-moz-focus-inner,
 | 
			
		||||
[type="submit"]::-moz-focus-inner {
 | 
			
		||||
  border-style: none;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Restore the focus styles unset by the previous rule.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
button:-moz-focusring,
 | 
			
		||||
[type="button"]:-moz-focusring,
 | 
			
		||||
[type="reset"]:-moz-focusring,
 | 
			
		||||
[type="submit"]:-moz-focusring {
 | 
			
		||||
  outline: 1px dotted ButtonText;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Correct the padding in Firefox.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
fieldset {
 | 
			
		||||
  padding: 0.35em 0.75em 0.625em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the text wrapping in Edge and IE.
 | 
			
		||||
 * 2. Correct the color inheritance from `fieldset` elements in IE.
 | 
			
		||||
 * 3. Remove the padding so developers are not caught out when they zero out
 | 
			
		||||
 *    `fieldset` elements in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
legend {
 | 
			
		||||
  box-sizing: border-box; /* 1 */
 | 
			
		||||
  color: inherit; /* 2 */
 | 
			
		||||
  display: table; /* 1 */
 | 
			
		||||
  max-width: 100%; /* 1 */
 | 
			
		||||
  padding: 0; /* 3 */
 | 
			
		||||
  white-space: normal; /* 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add the correct vertical alignment in Chrome, Firefox, and Opera.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
progress {
 | 
			
		||||
  vertical-align: baseline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the default vertical scrollbar in IE 10+.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
textarea {
 | 
			
		||||
  overflow: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Add the correct box sizing in IE 10.
 | 
			
		||||
 * 2. Remove the padding in IE 10.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[type="checkbox"],
 | 
			
		||||
[type="radio"] {
 | 
			
		||||
  box-sizing: border-box; /* 1 */
 | 
			
		||||
  padding: 0; /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Correct the cursor style of increment and decrement buttons in Chrome.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[type="number"]::-webkit-inner-spin-button,
 | 
			
		||||
[type="number"]::-webkit-outer-spin-button {
 | 
			
		||||
  height: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the odd appearance in Chrome and Safari.
 | 
			
		||||
 * 2. Correct the outline style in Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[type="search"] {
 | 
			
		||||
  -webkit-appearance: textfield; /* 1 */
 | 
			
		||||
  outline-offset: -2px; /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the inner padding in Chrome and Safari on macOS.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[type="search"]::-webkit-search-decoration {
 | 
			
		||||
  -webkit-appearance: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 1. Correct the inability to style clickable types in iOS and Safari.
 | 
			
		||||
 * 2. Change font properties to `inherit` in Safari.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
::-webkit-file-upload-button {
 | 
			
		||||
  -webkit-appearance: button; /* 1 */
 | 
			
		||||
  font: inherit; /* 2 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Interactive
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Add the correct display in Edge, IE 10+, and Firefox.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
details {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Add the correct display in all browsers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
summary {
 | 
			
		||||
  display: list-item;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Misc
 | 
			
		||||
   ========================================================================== */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add the correct display in IE 10+.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
template {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add the correct display in IE 10.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[hidden] {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										96
									
								
								src/resources/js/ripple.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								src/resources/js/ripple.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
			
		||||
import { getCustomColorFromModifiers, getCustomRadiusFromModifiers, willHaveAMouseUpEvent, toStyles } from './utils';
 | 
			
		||||
 | 
			
		||||
let rippleClass = 'ripple';
 | 
			
		||||
let removeTimeout = 1000;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add a ripple effect to the element.
 | 
			
		||||
 *
 | 
			
		||||
 * @param {MouseEvent} event
 | 
			
		||||
 * @param {HTMLElement} el
 | 
			
		||||
 * @param {Array} modifiers
 | 
			
		||||
 */
 | 
			
		||||
export const addRipple = (event, el, modifiers) => {
 | 
			
		||||
    if (! willHaveAMouseUpEvent(event)) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const ripple = document.createElement('span');
 | 
			
		||||
    rippleClass.split(' ').forEach(className => ripple.classList.add(className));
 | 
			
		||||
 | 
			
		||||
    el.appendChild(ripple);
 | 
			
		||||
 | 
			
		||||
    const size = ripple.offsetWidth,
 | 
			
		||||
        position = ripple.getBoundingClientRect(),
 | 
			
		||||
        innerRipple = document.createElement('span');
 | 
			
		||||
 | 
			
		||||
    const x = event.pageX - position.left - (size / 2),
 | 
			
		||||
        y = event.pageY - position.top - (size / 2);
 | 
			
		||||
 | 
			
		||||
    const style = {
 | 
			
		||||
        top: `${y}px`,
 | 
			
		||||
        left: `${x}px`,
 | 
			
		||||
        width: `${size}px`,
 | 
			
		||||
        height: `${size}px`,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const color = getCustomColorFromModifiers(modifiers);
 | 
			
		||||
    if (color.indexOf('bg-') === 0) {
 | 
			
		||||
        // Prefix with '!' for !important (requires Tailwind).
 | 
			
		||||
        innerRipple.classList.add(`!${color}`);
 | 
			
		||||
    } else if (color.indexOf('#') === 0 || color.indexOf('rgb') === 0) {
 | 
			
		||||
        style['--ripple-color'] = color;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const radius = getCustomRadiusFromModifiers(modifiers);
 | 
			
		||||
    if (radius) {
 | 
			
		||||
        style['--ripple-radius'] = radius;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ripple.appendChild(innerRipple);
 | 
			
		||||
    innerRipple.setAttribute('style', toStyles(style));
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove the ripple from the element.
 | 
			
		||||
 *
 | 
			
		||||
 * @param {HTMLElement} el
 | 
			
		||||
 */
 | 
			
		||||
export const removeRipple = el => {
 | 
			
		||||
    setTimeout(() => {
 | 
			
		||||
        // We are only removing the first instance to prevent ripples from subsequent clicks
 | 
			
		||||
        // being removed too quickly before the ripple effect can properly be seen.
 | 
			
		||||
        const ripple = el.querySelector(`.${rippleClass.replace(' ', '.')}`);
 | 
			
		||||
 | 
			
		||||
        ripple && ripple.remove();
 | 
			
		||||
    }, removeTimeout);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function Ripple(Alpine) {
 | 
			
		||||
    Alpine.directive('ripple', (el, { modifiers, expression }, { cleanup }) => {
 | 
			
		||||
        const clickHandler = event => addRipple(event, el, modifiers);
 | 
			
		||||
        const mouseUpHandler = () => removeRipple(el);
 | 
			
		||||
 | 
			
		||||
        el.addEventListener('mousedown', clickHandler);
 | 
			
		||||
        el.addEventListener('mouseup', mouseUpHandler);
 | 
			
		||||
 | 
			
		||||
        cleanup(() => {
 | 
			
		||||
            el.removeEventListener('mousedown', clickHandler);
 | 
			
		||||
            el.removeEventListener('mouseup', mouseUpHandler);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Ripple.configure = config => {
 | 
			
		||||
    if (config.hasOwnProperty('class') && typeof config.class === 'string') {
 | 
			
		||||
        rippleClass = config.class;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (config.hasOwnProperty('removeTimeout') && typeof config.removeTimeout === 'number') {
 | 
			
		||||
        removeTimeout = config.removeTimeout;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return Ripple;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default Ripple;
 | 
			
		||||
							
								
								
									
										67
									
								
								src/resources/js/utils.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								src/resources/js/utils.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
export const getCustomColorFromModifiers = modifiers => {
 | 
			
		||||
    if (! modifiers.includes('color')) {
 | 
			
		||||
        return '';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const nextModifier = modifiers[modifiers.indexOf('color') + 1] || 'invalid-color';
 | 
			
		||||
    if (nextModifier.indexOf('#') === 0 || nextModifier.indexOf('rgb') === 0) {
 | 
			
		||||
        return nextModifier;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return nextModifier.indexOf('bg') === 0
 | 
			
		||||
        ? nextModifier
 | 
			
		||||
        : `bg-${nextModifier}`;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getCustomRadiusFromModifiers = modifiers => {
 | 
			
		||||
    if (! modifiers.includes('radius')) {
 | 
			
		||||
        return '';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let nextModifier = modifiers[modifiers.indexOf('radius') + 1] || 'invalid-radius';
 | 
			
		||||
 | 
			
		||||
    // _ allows us to use decimals, such as 0.5.
 | 
			
		||||
    nextModifier = nextModifier.replace('_', '.');
 | 
			
		||||
 | 
			
		||||
    // Separate the numeric value from the unit in nextModifier.
 | 
			
		||||
    // Possible values for nextModifier: 50, 50.5, 50.5px, 50px, 50%, 50rem, 50em
 | 
			
		||||
    const numericValue = nextModifier.match(/^[0-9]+(\.[0-9]+)?/)[0];
 | 
			
		||||
    let unit = nextModifier.replace(numericValue, '');
 | 
			
		||||
    if (! unit) {
 | 
			
		||||
        unit = '%';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return `${numericValue}${unit}`;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convert an object of style properties to a string of CSS.
 | 
			
		||||
 *
 | 
			
		||||
 * @param {Object} styles
 | 
			
		||||
 * @returns {string}
 | 
			
		||||
 */
 | 
			
		||||
export const toStyles = styles => Object.entries(styles).map(([key, value]) => `${formatStyleKey(key)}: ${value}`).join(';');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convert a style key to a CSS property.
 | 
			
		||||
 * Example: backgroundColor -> background-color
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} key
 | 
			
		||||
 * @returns {string}
 | 
			
		||||
 */
 | 
			
		||||
const formatStyleKey = key => key.replace(/([A-Z])/g, '-$1').toLowerCase();
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Some events, such as a right click or ctrl + left click won't trigger a mouseup event,
 | 
			
		||||
 * so we need to prevent the ripple from being added in those cases.
 | 
			
		||||
 *
 | 
			
		||||
 * @param {MouseEvent} event
 | 
			
		||||
 * @returns {boolean}
 | 
			
		||||
 */
 | 
			
		||||
export const willHaveAMouseUpEvent = event => {
 | 
			
		||||
    if (event.ctrlKey) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return event.button === 0 || event.button === 1;
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user