diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php index e92130d..3e1382b 100644 --- a/app/Http/Controllers/Api/UserController.php +++ b/app/Http/Controllers/Api/UserController.php @@ -240,7 +240,7 @@ class UserController extends ApiController } return $this->respondError([ - 'code' => 'The code was not found or has expired' + 'code' => 'The code was not found or has expired.' ]); } @@ -278,7 +278,7 @@ class UserController extends ApiController }//end if return $this->respondWithErrors([ - 'code' => 'The code was not found or has expired' + 'code' => 'The code was not found or has expired.' ]); } diff --git a/app/Services/AnimatedGifService.php b/app/Services/AnimatedGifService.php new file mode 100644 index 0000000..e446e15 --- /dev/null +++ b/app/Services/AnimatedGifService.php @@ -0,0 +1,698 @@ + 0. + * @param integer $dataSize GIF blob size. + * @return boolean GIF file/blob is animated. + */ + public static function isAnimatedGif(string $filenameOrBlob, int $dataSize = 0) + { + $regex = '#\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)#s'; + $count = 0; + + if ($dataSize > 0) { + if (($fh = @fopen($filenameOrBlob, 'rb')) === false) { + return false; + } + + $chunk = false; + while (feof($fh) === false && $count < 2) { + $chunk = ($chunk !== '' ? substr($chunk, -20) : "") . fread($fh, (1024 * 100)); //read 100kb at a time + $count += preg_match_all($regex, $chunk, $matches); + } + + fclose($fh); + } else { + $count = preg_match_all($regex, $filenameOrBlob, $matches); + } + + return $count > 1; + } + + /** + * Extract frames of a GIF + * + * @param string $filenameOrBlob GIF filename path + * @param integer $dataSize GIF blob size. + * @param boolean $originalFrames Get original frames (with transparent background) + * + * @return array + */ + public function extract(string $filenameOrBlob, int $dataSize = 0, $originalFrames = false) + { + if (self::isAnimatedGif($filenameOrBlob) === false) { + return []; + } + + $this->reset(); + $this->parseFramesInfo($filename); + $prevImg = null; + + for ($i = 0; $i < count($this->frameSources); $i++) { + $this->frames[$i] = []; + $this->frameDurations[$i] = $this->frames[$i]['duration'] = $this->frameSources[$i]['delay_time']; + + $img = imagecreatefromstring($this->fileHeader["gifheader"] . $this->frameSources[$i]["graphicsextension"] . $this->frameSources[$i]["imagedata"] . chr(0x3b)); + + if (!$originalFrames) { + if ($i > 0) { + $prevImg = $this->frames[($i - 1)]['image']; + } else { + $prevImg = $img; + } + + $sprite = imagecreate($this->gifMaxWidth, $this->gifMaxHeight); + imagesavealpha($sprite, true); + + $transparent = imagecolortransparent($prevImg); + + if ($transparent > -1 && imagecolorstotal($prevImg) > $transparent) { + $actualTrans = imagecolorsforindex($prevImg, $transparent); + imagecolortransparent($sprite, imagecolorallocate($sprite, $actualTrans['red'], $actualTrans['green'], $actualTrans['blue'])); + } + + if ((int) $this->frameSources[$i]['disposal_method'] == 1 && $i > 0) { + imagecopy($sprite, $prevImg, 0, 0, 0, 0, $this->gifMaxWidth, $this->gifMaxHeight); + } + + imagecopyresampled($sprite, $img, $this->frameSources[$i]["offset_left"], $this->frameSources[$i]["offset_top"], 0, 0, $this->gifMaxWidth, $this->gifMaxHeight, $this->gifMaxWidth, $this->gifMaxHeight); + $img = $sprite; + }//end if + + $this->frameImages[$i] = $this->frames[$i]['image'] = $img; + }//end for + + return $this->frames; + } +} + +class GifFrameExtractor +{ + // Properties + // =================================================================================== + + /** + * @var resource + */ + private $gif; + + /** + * @var array + */ + private $frames; + + /** + * @var array + */ + private $frameDurations; + + /** + * @var array + */ + private $frameImages; + + /** + * @var array + */ + private $framePositions; + + /** + * @var array + */ + private $frameDimensions; + + /** + * @var integer + * + * (old: $this->index) + */ + private $frameNumber; + + /** + * @var array + * + * (old: $this->imagedata) + */ + private $frameSources; + + /** + * @var array + * + * (old: $this->fileHeader) + */ + private $fileHeader; + + /** + * @var integer The reader pointer in the file source + * + * (old: $this->pointer) + */ + private $pointer; + + /** + * @var integer + */ + private $gifMaxWidth; + + /** + * @var integer + */ + private $gifMaxHeight; + + /** + * @var integer + */ + private $totalDuration; + + /** + * @var integer + */ + private $handle; + + /** + * @var array + * + * (old: globaldata) + */ + private $globaldata; + + /** + * @var array + * + * (old: orgvars) + */ + private $orgvars; + + // Methods + // =================================================================================== + + + /** + * Parse the frame informations contained in the GIF file + * + * @param string $filename GIF filename path + */ + private function parseFramesInfo($filename) + { + $this->openFile($filename); + $this->parseGifHeader(); + $this->parseGraphicsExtension(0); + $this->getApplicationData(); + $this->getApplicationData(); + $this->getFrameString(0); + $this->parseGraphicsExtension(1); + $this->getCommentData(); + $this->getApplicationData(); + $this->getFrameString(1); + + while (!$this->checkByte(0x3b) && !$this->checkEOF()) { + $this->getCommentData(1); + $this->parseGraphicsExtension(2); + $this->getFrameString(2); + $this->getApplicationData(); + } + } + + /** + * Parse the gif header (old: get_gif_header) + */ + private function parseGifHeader() + { + $this->pointerForward(10); + + if ($this->readBits(($mybyte = $this->readByteInt()), 0, 1) == 1) { + $this->pointerForward(2); + $this->pointerForward(pow(2, ($this->readBits($mybyte, 5, 3) + 1)) * 3); + } else { + $this->pointerForward(2); + } + + $this->fileHeader["gifheader"] = $this->dataPart(0, $this->pointer); + + // Decoding + $this->orgvars["gifheader"] = $this->fileHeader["gifheader"]; + $this->orgvars["background_color"] = $this->orgvars["gifheader"][11]; + } + + /** + * Parse the application data of the frames (old: get_application_data) + */ + private function getApplicationData() + { + $startdata = $this->readByte(2); + + if ($startdata == chr(0x21) . chr(0xff)) { + $start = ($this->pointer - 2); + $this->pointerForward($this->readByteInt()); + $this->readDataStream($this->readByteInt()); + $this->fileHeader["applicationdata"] = $this->dataPart($start, ($this->pointer - $start)); + } else { + $this->pointerRewind(2); + } + } + + /** + * Parse the comment data of the frames (old: get_comment_data) + */ + private function getCommentData() + { + $startdata = $this->readByte(2); + + if ($startdata == chr(0x21) . chr(0xfe)) { + $start = ($this->pointer - 2); + $this->readDataStream($this->readByteInt()); + $this->fileHeader["commentdata"] = $this->dataPart($start, ($this->pointer - $start)); + } else { + $this->pointerRewind(2); + } + } + + /** + * Parse the graphic extension of the frames (old: get_graphics_extension) + * + * @param integer $type + */ + private function parseGraphicsExtension($type) + { + $startdata = $this->readByte(2); + + if ($startdata == chr(0x21) . chr(0xf9)) { + $start = ($this->pointer - 2); + $this->pointerForward($this->readByteInt()); + $this->pointerForward(1); + + if ($type == 2) { + $this->frameSources[$this->frameNumber]["graphicsextension"] = $this->dataPart($start, ($this->pointer - $start)); + } elseif ($type == 1) { + $this->orgvars["hasgx_type_1"] = 1; + $this->globaldata["graphicsextension"] = $this->dataPart($start, ($this->pointer - $start)); + } elseif ($type == 0) { + $this->orgvars["hasgx_type_0"] = 1; + $this->globaldata["graphicsextension_0"] = $this->dataPart($start, ($this->pointer - $start)); + } + } else { + $this->pointerRewind(2); + }//end if + } + + /** + * Get the full frame string block (old: get_image_block) + * + * @param integer $type + */ + private function getFrameString($type) + { + if ($this->checkByte(0x2c)) { + $start = $this->pointer; + $this->pointerForward(9); + + if ($this->readBits(($mybyte = $this->readByteInt()), 0, 1) == 1) { + $this->pointerForward(pow(2, ($this->readBits($mybyte, 5, 3) + 1)) * 3); + } + + $this->pointerForward(1); + $this->readDataStream($this->readByteInt()); + $this->frameSources[$this->frameNumber]["imagedata"] = $this->dataPart($start, ($this->pointer - $start)); + + if ($type == 0) { + $this->orgvars["hasgx_type_0"] = 0; + + if (isset($this->globaldata["graphicsextension_0"])) { + $this->frameSources[$this->frameNumber]["graphicsextension"] = $this->globaldata["graphicsextension_0"]; + } else { + $this->frameSources[$this->frameNumber]["graphicsextension"] = null; + } + + unset($this->globaldata["graphicsextension_0"]); + } elseif ($type == 1) { + if (isset($this->orgvars["hasgx_type_1"]) && $this->orgvars["hasgx_type_1"] == 1) { + $this->orgvars["hasgx_type_1"] = 0; + $this->frameSources[$this->frameNumber]["graphicsextension"] = $this->globaldata["graphicsextension"]; + unset($this->globaldata["graphicsextension"]); + } else { + $this->orgvars["hasgx_type_0"] = 0; + $this->frameSources[$this->frameNumber]["graphicsextension"] = $this->globaldata["graphicsextension_0"]; + unset($this->globaldata["graphicsextension_0"]); + } + }//end if + + $this->parseFrameData(); + $this->frameNumber++; + }//end if + } + + /** + * Parse frame data string into an array (old: parse_image_data) + */ + private function parseFrameData() + { + $this->frameSources[$this->frameNumber]["disposal_method"] = $this->getImageDataBit("ext", 3, 3, 3); + $this->frameSources[$this->frameNumber]["user_input_flag"] = $this->getImageDataBit("ext", 3, 6, 1); + $this->frameSources[$this->frameNumber]["transparent_color_flag"] = $this->getImageDataBit("ext", 3, 7, 1); + $this->frameSources[$this->frameNumber]["delay_time"] = $this->dualByteVal($this->getImageDataByte("ext", 4, 2)); + $this->totalDuration += (int) $this->frameSources[$this->frameNumber]["delay_time"]; + $this->frameSources[$this->frameNumber]["transparent_color_index"] = ord($this->getImageDataByte("ext", 6, 1)); + $this->frameSources[$this->frameNumber]["offset_left"] = $this->dualByteVal($this->getImageDataByte("dat", 1, 2)); + $this->frameSources[$this->frameNumber]["offset_top"] = $this->dualByteVal($this->getImageDataByte("dat", 3, 2)); + $this->frameSources[$this->frameNumber]["width"] = $this->dualByteVal($this->getImageDataByte("dat", 5, 2)); + $this->frameSources[$this->frameNumber]["height"] = $this->dualByteVal($this->getImageDataByte("dat", 7, 2)); + $this->frameSources[$this->frameNumber]["local_color_table_flag"] = $this->getImageDataBit("dat", 9, 0, 1); + $this->frameSources[$this->frameNumber]["interlace_flag"] = $this->getImageDataBit("dat", 9, 1, 1); + $this->frameSources[$this->frameNumber]["sort_flag"] = $this->getImageDataBit("dat", 9, 2, 1); + $this->frameSources[$this->frameNumber]["color_table_size"] = (pow(2, ($this->getImageDataBit("dat", 9, 5, 3) + 1)) * 3); + $this->frameSources[$this->frameNumber]["color_table"] = substr($this->frameSources[$this->frameNumber]["imagedata"], 10, $this->frameSources[$this->frameNumber]["color_table_size"]); + $this->frameSources[$this->frameNumber]["lzw_code_size"] = ord($this->getImageDataByte("dat", 10, 1)); + + $this->framePositions[$this->frameNumber] = [ + 'x' => $this->frameSources[$this->frameNumber]["offset_left"], + 'y' => $this->frameSources[$this->frameNumber]["offset_top"], + ]; + + $this->frameDimensions[$this->frameNumber] = [ + 'width' => $this->frameSources[$this->frameNumber]["width"], + 'height' => $this->frameSources[$this->frameNumber]["height"], + ]; + + // Decoding + $this->orgvars[$this->frameNumber]["transparent_color_flag"] = $this->frameSources[$this->frameNumber]["transparent_color_flag"]; + $this->orgvars[$this->frameNumber]["transparent_color_index"] = $this->frameSources[$this->frameNumber]["transparent_color_index"]; + $this->orgvars[$this->frameNumber]["delay_time"] = $this->frameSources[$this->frameNumber]["delay_time"]; + $this->orgvars[$this->frameNumber]["disposal_method"] = $this->frameSources[$this->frameNumber]["disposal_method"]; + $this->orgvars[$this->frameNumber]["offset_left"] = $this->frameSources[$this->frameNumber]["offset_left"]; + $this->orgvars[$this->frameNumber]["offset_top"] = $this->frameSources[$this->frameNumber]["offset_top"]; + + // Updating the max width + if ($this->gifMaxWidth < $this->frameSources[$this->frameNumber]["width"]) { + $this->gifMaxWidth = $this->frameSources[$this->frameNumber]["width"]; + } + + // Updating the max height + if ($this->gifMaxHeight < $this->frameSources[$this->frameNumber]["height"]) { + $this->gifMaxHeight = $this->frameSources[$this->frameNumber]["height"]; + } + } + + /** + * Get the image data byte (old: get_imagedata_byte) + * + * @param string $type + * @param integer $start + * @param integer $length + * + * @return string + */ + private function getImageDataByte($type, $start, $length) + { + if ($type == "ext") { + return substr($this->frameSources[$this->frameNumber]["graphicsextension"], $start, $length); + } + + // "dat" + return substr($this->frameSources[$this->frameNumber]["imagedata"], $start, $length); + } + + /** + * Get the image data bit (old: get_imagedata_bit) + * + * @param string $type + * @param integer $byteIndex + * @param integer $bitStart + * @param integer $bitLength + * + * @return number + */ + private function getImageDataBit($type, $byteIndex, $bitStart, $bitLength) + { + if ($type == "ext") { + return $this->readBits(ord(substr($this->frameSources[$this->frameNumber]["graphicsextension"], $byteIndex, 1)), $bitStart, $bitLength); + } + + // "dat" + return $this->readBits(ord(substr($this->frameSources[$this->frameNumber]["imagedata"], $byteIndex, 1)), $bitStart, $bitLength); + } + + /** + * Return the value of 2 ASCII chars (old: dualbyteval) + * + * @param string $s + * + * @return integer + */ + private function dualByteVal($s) + { + $i = (ord($s[1]) * 256 + ord($s[0])); + + return $i; + } + + /** + * Read the data stream (old: read_data_stream) + * + * @param integer $firstLength + */ + private function readDataStream($firstLength) + { + $this->pointerForward($firstLength); + $length = $this->readByteInt(); + + if ($length != 0) { + while ($length != 0) { + $this->pointerForward($length); + $length = $this->readByteInt(); + } + } + } + + /** + * Open the gif file (old: loadfile) + * + * @param string $filename + */ + private function openFile($filename) + { + $this->handle = fopen($filename, "rb"); + $this->pointer = 0; + + $imageSize = getimagesize($filename); + $this->gifWidth = $imageSize[0]; + $this->gifHeight = $imageSize[1]; + } + + /** + * Close the read gif file (old: closefile) + */ + private function closeFile() + { + fclose($this->handle); + $this->handle = 0; + } + + /** + * Read the file from the beginning to $byteCount in binary (old: readbyte) + * + * @param integer $byteCount + * + * @return string + */ + private function readByte($byteCount) + { + $data = fread($this->handle, $byteCount); + $this->pointer += $byteCount; + + return $data; + } + + /** + * Read a byte and return ASCII value (old: readbyte_int) + * + * @return integer + */ + private function readByteInt() + { + $data = fread($this->handle, 1); + $this->pointer++; + + return ord($data); + } + + /** + * Convert a $byte to decimal (old: readbits) + * + * @param string $byte + * @param integer $start + * @param integer $length + * + * @return number + */ + private function readBits($byte, $start, $length) + { + $bin = str_pad(decbin($byte), 8, "0", STR_PAD_LEFT); + $data = substr($bin, $start, $length); + + return bindec($data); + } + + /** + * Rewind the file pointer reader (old: p_rewind) + * + * @param integer $length + */ + private function pointerRewind($length) + { + $this->pointer -= $length; + fseek($this->handle, $this->pointer); + } + + /** + * Forward the file pointer reader (old: p_forward) + * + * @param integer $length + */ + private function pointerForward($length) + { + $this->pointer += $length; + fseek($this->handle, $this->pointer); + } + + /** + * Get a section of the data from $start to $start + $length (old: datapart) + * + * @param integer $start + * @param integer $length + * + * @return string + */ + private function dataPart($start, $length) + { + fseek($this->handle, $start); + $data = fread($this->handle, $length); + fseek($this->handle, $this->pointer); + + return $data; + } + + /** + * Check if a character if a byte (old: checkbyte) + * + * @param integer $byte + * + * @return boolean + */ + private function checkByte($byte) + { + if (fgetc($this->handle) == chr($byte)) { + fseek($this->handle, $this->pointer); + return true; + } + + fseek($this->handle, $this->pointer); + + return false; + } + + /** + * Check the end of the file (old: checkEOF) + * + * @return boolean + */ + private function checkEOF() + { + if (fgetc($this->handle) === false) { + return true; + } + + fseek($this->handle, $this->pointer); + + return false; + } + + /** + * Reset and clear this current object + */ + private function reset() + { + $this->gif = null; + $this->totalDuration = $this->gifMaxHeight = $this->gifMaxWidth = $this->handle = $this->pointer = $this->frameNumber = 0; + $this->frameDimensions = $this->framePositions = $this->frameImages = $this->frameDurations = $this->globaldata = $this->orgvars = $this->frames = $this->fileHeader = $this->frameSources = []; + } + + // Getter / Setter + // =================================================================================== + + + /** + * Get the total of all added frame duration + * + * @return integer + */ + public function getTotalDuration() + { + return $this->totalDuration; + } + + /** + * Get the number of extracted frames + * + * @return integer + */ + public function getFrameNumber() + { + return $this->frameNumber; + } + + /** + * Get the extracted frames (images and durations) + * + * @return array + */ + public function getFrames() + { + return $this->frames; + } + + /** + * Get the extracted frame positions + * + * @return array + */ + public function getFramePositions() + { + return $this->framePositions; + } + + /** + * Get the extracted frame dimensions + * + * @return array + */ + public function getFrameDimensions() + { + return $this->frameDimensions; + } + + /** + * Get the extracted frame images + * + * @return array + */ + public function getFrameImages() + { + return $this->frameImages; + } + + /** + * Get the extracted frame durations + * + * @return array + */ + public function getFrameDurations() + { + return $this->frameDurations; + } +} diff --git a/app/Services/ImageService.php b/app/Services/ImageService.php deleted file mode 100644 index be65efd..0000000 --- a/app/Services/ImageService.php +++ /dev/null @@ -1,9 +0,0 @@ -=6.0.0" } }, - "node_modules/@ctrl/tinycolor": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz", - "integrity": "sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@element-plus/icons-vue": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.0.10.tgz", - "integrity": "sha512-ygEZ1mwPjcPo/OulhzLE7mtDrQBWI8vZzEWSNB2W/RNCRjoQGwbaK4N8lV4rid7Ts4qvySU3njMN7YCiSlSaTQ==", - "peerDependencies": { - "vue": "^3.2.0" - } - }, "node_modules/@es-joy/jsdoccomment": { "version": "0.36.1", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz", @@ -439,85 +415,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@floating-ui/core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.1.tgz", - "integrity": "sha512-PL7g3dhA4dHgZfujkuD8Q+tfJJynEtnNQSPzmucCnxMvkxf4cLBJw/ZYqZUn4HCh33U3WHrAfv2R2tbi9UCSmw==" - }, - "node_modules/@floating-ui/dom": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz", - "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==", - "dependencies": { - "@floating-ui/core": "^1.1.0" - } - }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz", - "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz", - "integrity": "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.1.tgz", - "integrity": "sha512-L8l4MfdHPmZlJ72PvzdfwOwbwcCAL0vx48tJRnI6u1PJXh+j2f3yDoKyQgO3qjEsgD5Fr2tQV/cPP8F/k6aUig==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-regular-svg-icons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.2.1.tgz", - "integrity": "sha512-wiqcNDNom75x+pe88FclpKz7aOSqS2lOivZeicMV5KRwOAeypxEYWAK/0v+7r+LrEY30+qzh8r2XDaEHvoLsMA==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz", - "integrity": "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/vue-fontawesome": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz", - "integrity": "sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==", - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "vue": ">= 3.0.0 < 4" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -644,16 +541,6 @@ "node": ">= 8" } }, - "node_modules/@popperjs/core": { - "name": "@sxzz/popperjs-es", - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", - "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/@types/eslint": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", @@ -685,19 +572,6 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, - "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", - "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", - "dependencies": { - "@types/lodash": "*" - } - }, "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", @@ -710,11 +584,6 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.50.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", @@ -1037,39 +906,6 @@ "vue": ">=3.2.0" } }, - "node_modules/@vueuse/core": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.12.0.tgz", - "integrity": "sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg==", - "dependencies": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.12.0", - "@vueuse/shared": "9.12.0", - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/metadata": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.12.0.tgz", - "integrity": "sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.12.0.tgz", - "integrity": "sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ==", - "dependencies": { - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -1331,28 +1167,6 @@ "node": ">=8" } }, - "node_modules/async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/axios": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.1.tgz", - "integrity": "sha512-78pWJsQTceInlyaeBQeYZ/QgZeWS8hGeKiIJiDKQe3hEyBb7sEMq0K4gjx+Va6WHTYO4zI/RRl8qGRzn0YMadA==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1538,18 +1352,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1622,11 +1424,6 @@ "date-fns": ">=2.0.0" } }, - "node_modules/dayjs": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1650,15 +1447,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1702,31 +1490,6 @@ "integrity": "sha512-47o4PPgxfU1KMNejz+Dgaodf7YTcg48uOfV1oM6cs3adrl2+7R+dHkt3Jpxqo0LRCbGJEzTKMUt0RdvByb/leg==", "peer": true }, - "node_modules/element-plus": { - "version": "2.2.29", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.29.tgz", - "integrity": "sha512-g4dcrURrKkR5uUX8n5RVnnqGnimoki9HfqS4yHHG6XwCHBkZGozdq4x+478BzeWUe31h++BO+7dakSx4VnM8RQ==", - "dependencies": { - "@ctrl/tinycolor": "^3.4.1", - "@element-plus/icons-vue": "^2.0.6", - "@floating-ui/dom": "^1.0.1", - "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", - "@types/lodash": "^4.14.182", - "@types/lodash-es": "^4.17.6", - "@vueuse/core": "^9.1.0", - "async-validator": "^4.2.5", - "dayjs": "^1.11.3", - "escape-html": "^1.0.3", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "lodash-unified": "^1.0.2", - "memoize-one": "^6.0.0", - "normalize-wheel-es": "^1.2.0" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -1799,11 +1562,6 @@ "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2195,40 +1953,6 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2638,22 +2362,8 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash-unified": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", - "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", - "peerDependencies": { - "@types/lodash-es": "*", - "lodash": "*", - "lodash-es": "*" - } + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -2681,11 +2391,6 @@ "sourcemap-codec": "^1.4.8" } }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2718,6 +2423,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "peer": true, "engines": { "node": ">= 0.6" } @@ -2726,6 +2432,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -2794,11 +2501,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-wheel-es": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" - }, "node_modules/normalize.css": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", @@ -3034,12 +2736,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", diff --git a/package.json b/package.json index 19ba6f6..471be87 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.48.1", "@typescript-eslint/parser": "^5.48.1", - "axios": "^1.1.2", "eslint": "^8.31.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-jsdoc": "^39.6.4", @@ -22,16 +21,9 @@ "vite": "^4.0.0" }, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/free-brands-svg-icons": "^6.2.1", - "@fortawesome/free-regular-svg-icons": "^6.2.1", - "@fortawesome/free-solid-svg-icons": "^6.2.1", - "@fortawesome/vue-fontawesome": "^3.0.2", "@vitejs/plugin-vue": "^4.0.0", "@vuepic/vue-datepicker": "^3.6.4", - "date-fns": "^2.29.3", "dotenv": "^16.0.3", - "element-plus": "^2.2.27", "normalize.css": "^8.0.1", "pinia": "^2.0.28", "pinia-plugin-persistedstate": "^3.0.1", diff --git a/public/img/background.jpg b/public/img/background.jpg new file mode 100644 index 0000000..e243968 Binary files /dev/null and b/public/img/background.jpg differ diff --git a/resources/css/app.scss b/resources/css/app.scss index 6aebd87..689ae98 100644 --- a/resources/css/app.scss +++ b/resources/css/app.scss @@ -43,50 +43,31 @@ h1 { font-weight: 800; } -label { - display: block; - margin-bottom: map-get($spacer, 1); - - &.required:after { - content: " *"; - color: $danger-color; - } - - &.inline { - display: inline-block; - margin-right: map-get($spacer, 3); - - &:after { - content: ":"; - } - } -} - p { line-height: 1.5rem; margin-top: 0; } -input, -select, -textarea { - box-sizing: border-box; - display: block; - width: 100%; - border: 1px solid $border-color; - border-radius: 12px; - padding: map-get($spacer, 2) map-get($spacer, 3); - color: $font-color; - margin-bottom: map-get($spacer, 4); +// input, +// select, +// textarea { +// box-sizing: border-box; +// display: block; +// width: 100%; +// border: 1px solid $border-color; +// border-radius: 12px; +// padding: map-get($spacer, 2) map-get($spacer, 3); +// color: $font-color; +// margin-bottom: map-get($spacer, 4); - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} +// -webkit-appearance: none; +// -moz-appearance: none; +// appearance: none; +// } -textarea { - resize: none; -} +// textarea { +// resize: none; +// } select { padding-right: 2.5rem; @@ -178,39 +159,6 @@ code { } } -/* Loader */ -.loader-cover { - position: fixed; - display: flex; - justify-content: center; - align-items: center; - top: 0; - left: 0; - bottom: 0; - right: 0; - backdrop-filter: blur(14px); - -webkit-backdrop-filter: blur(4px); - background-color: rgba(255, 255, 255, 0.5); - - .loader { - display: flex; - flex-direction: column; - padding: map-get($spacer, 5) calc(map-get($spacer, 5) * 2); - - border: 1px solid transparent; - border-radius: 24px; - - svg { - font-size: calc(map-get($spacer, 5) * 1.5); - } - - span { - font-size: map-get($spacer, 4); - padding-top: map-get($spacer, 3); - } - } -} - /* Button */ button.button, a.button, @@ -301,53 +249,6 @@ label.button { } } -/* Form Group */ -.form-group { - margin-bottom: map-get($spacer, 3); - padding: 0 4px; - flex: 1; - - input, - textarea { - margin-bottom: map-get($spacer, 1); - } - - .form-group-info { - font-size: 85%; - margin-bottom: map-get($spacer, 1); - } - - .form-group-error { - // display: none; - font-size: 85%; - margin-bottom: map-get($spacer, 1); - color: $danger-color; - } - - .form-group-help { - font-size: 85%; - margin-bottom: map-get($spacer, 1); - color: $secondary-color; - - svg { - vertical-align: middle !important; - } - } - - &.has-error { - input, - textarea, - .input-file-group, - .input-media-group .input-media-display { - border: 2px solid $danger-color; - } - - .form-group-error { - display: block; - } - } -} - /* Page Errors */ .page-error { display: flex; diff --git a/resources/css/utils.scss b/resources/css/utils.scss index 7fd4104..2788096 100644 --- a/resources/css/utils.scss +++ b/resources/css/utils.scss @@ -125,33 +125,33 @@ /* Margin */ @each $index, $size in $spacer { .m-#{$index} { - margin: #{$size}; + margin: #{$size} !important; } .mt-#{$index} { - margin-top: #{$size}; + margin-top: #{$size} !important; } .mb-#{$index} { - margin-bottom: #{$size}; + margin-bottom: #{$size} !important; } .ml-#{$index} { - margin-left: #{$size}; + margin-left: #{$size} !important; } .mr-#{$index} { - margin-right: #{$size}; + margin-right: #{$size} !important; } .mx-#{$index} { - margin-left: #{$size}; - margin-right: #{$size}; + margin-left: #{$size} !important; + margin-right: #{$size} !important; } .my-#{$index} { - margin-top: #{$size}; - margin-bottom: #{$size}; + margin-top: #{$size} !important; + margin-bottom: #{$size} !important; } } diff --git a/resources/js/axios.js b/resources/js/axios.js.old similarity index 100% rename from resources/js/axios.js rename to resources/js/axios.js.old diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index 366c49d..05720dc 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -1,4 +1,4 @@ -import _ from 'lodash'; +import _ from "lodash"; window._ = _; /** @@ -7,10 +7,10 @@ window._ = _; * CSRF token as a header based on the value of the "XSRF" token cookie. */ -import axios from 'axios'; -window.axios = axios; +// import axios from 'axios'; +// window.axios = axios; -window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; +// window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; /** * Echo exposes an expressive API for subscribing to channels and listening diff --git a/resources/js/components/SMButton.vue b/resources/js/components/SMButton.vue index 0e3428e..5668325 100644 --- a/resources/js/components/SMButton.vue +++ b/resources/js/components/SMButton.vue @@ -11,7 +11,7 @@ ]" :type="buttonType"> {{ label }} - + {{ label }} - + @@ -83,5 +83,11 @@ const classType = props.type == "submit" ? "primary" : props.type; display: block; width: 100%; } + + ion-icon { + height: 1.2rem; + width: 1.2rem; + vertical-align: middle; + } } diff --git a/resources/js/components/SMCarousel.vue b/resources/js/components/SMCarousel.vue index c92f270..05b4e1d 100644 --- a/resources/js/components/SMCarousel.vue +++ b/resources/js/components/SMCarousel.vue @@ -7,22 +7,20 @@ @@ -184,12 +182,20 @@ const disconnectMutationObserver = () => { opacity: 0.75; transition: opacity 0.2s ease-in-out; - svg { + .carousel-slide-indicator-item { + height: map-get($spacer, 1); + width: map-get($spacer, 1); + border: 1px solid white; + border-radius: 50%; cursor: pointer; font-size: 80%; - padding: 0 0.25rem; + margin: 0 calc(#{map-get($spacer, 1)} / 3); color: #fff; filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 1)); + + &.highlighted { + background-color: white; + } } } } diff --git a/resources/js/components/SMCarouselSlide.vue b/resources/js/components/SMCarouselSlide.vue index 95521d6..6433c64 100644 --- a/resources/js/components/SMCarouselSlide.vue +++ b/resources/js/components/SMCarouselSlide.vue @@ -3,7 +3,7 @@ class="carousel-slide" :style="{ backgroundImage: `url('${imageUrl}')` }">