diff --git a/dist/jquery.lcnCircleRangeSelect.css b/dist/jquery.lcnCircleRangeSelect.css new file mode 100644 index 0000000..51de481 --- /dev/null +++ b/dist/jquery.lcnCircleRangeSelect.css @@ -0,0 +1,56 @@ +input.circle-range-select { + display: none; +} + +.circle-range-select-wrapper { + position: relative; + max-width: 100%; + width: 10em; + height: 10em; + margin:1.4rem 0.65em 0.65em 0.65em; + padding: 0.65em !important; + border-radius: 50%; + border: 0.4em solid rgba(204, 204, 204, 0.326); + cursor: default; +} + +.circle-range-select-wrapper .handle { + position: absolute; + z-index: 2; + width: 0; + height: 0; + border: 0; + padding: 0; + cursor: pointer; +} + +.circle-range-select-wrapper .handle:before { + content: ''; + position: absolute; + z-index: 3; + top: -0.65em; + left: -0.65em; + height: 1.3em; + width: 1.3em; + border-radius: 50%; + background: rgba(218, 217, 217, 0.751) +} + +.circle-range-select-wrapper .selected-range { + position: absolute; + z-index: 1; + color: #dbdbdb94; +} + +.circle-range-select-wrapper .values { + color: rgba(255, 255, 255, 0.733); + pointer-events: none; + position: absolute; + z-index: 2; + top: 50%; + left: 0; + right: 0; + margin-top: -0.5em; + font-size: 1.1rem; + text-align: center; +} \ No newline at end of file diff --git a/dist/jquery.lcnCircleRangeSelect.js b/dist/jquery.lcnCircleRangeSelect.js new file mode 100644 index 0000000..4291452 --- /dev/null +++ b/dist/jquery.lcnCircleRangeSelect.js @@ -0,0 +1,273 @@ +(function (root, factory) { + 'use strict'; + + var $ = root.jQuery; + + if (typeof define === 'function' && define.amd) { + // AMD + if ($) { + define([], factory.bind(null, $)); + } else { + define(['jquery'], factory); + } + } else if (typeof exports === 'object') { + // Node, CommonJS-like + if ($) { + module.exports = factory($); + } else { + module.exports = factory(require('jquery')); + } + } else { + // Browser globals (root is window) + if ($) { + factory($); // no global needed as we store it as a jQuery plugin on jQuery.fn + } else { + throw 'Missing required jQuery dependency'; + } + } +}(this, function ($) { + var isDragging = false; + var $currentHandle = null; + + function drawCircle($container, degreeStart, degreeEnd) { + var + $canvas = $container.find('canvas'), + canvas = $canvas[0]; + + var outerWidth = $container.outerWidth(); + var innerWidth = $container.innerWidth(); + var borderWidth = outerWidth - innerWidth; + $canvas.css('left', borderWidth * -1); + $canvas.css('top', borderWidth * -1); + + + var radius = (outerWidth - borderWidth / 2) / 2; + canvas.width = outerWidth + borderWidth; + canvas.height = canvas.width; + var context = canvas.getContext('2d'); + context.clearRect(0, 0, canvas.width, canvas.height); + context.beginPath(); + + + + context.arc(canvas.width / 2, canvas.width / 2, radius, degreesToRadians(degreeStart) - Math.PI / 2, degreesToRadians(degreeEnd) - Math.PI / 2, false); + context.lineWidth = borderWidth / 2; + context.strokeStyle = $canvas.css('color'); + context.stroke(); + } + + function degreesToRadians(degrees) { + return degrees * (Math.PI / 180); + } + + function updateWidget($container) { + var $input = $container.find('input'); + var isSingleValue = _isSingleValue($input); + var $handles = $container.find('.handle'); + var $handle1 = $container.find('.handle1'); + if (!isSingleValue) { + var $handle2 = $container.find('.handle2'); + } + + var outerWidth = $container.outerWidth(); + var innerWidth = $container.innerWidth(); + var borderWidth = (outerWidth - innerWidth) / 2; + + var radius = (outerWidth - borderWidth) / 2; + + + var minValue = parseFloat($input.attr('data-min')) || 0; + var maxValue = parseFloat($input.attr('data-max')) || 360; + var unit = $input.attr('data-unit') === undefined ? '°' : $input.attr('data-unit'); + var steps = maxValue - minValue; + var stepSizeInDegrees = 360 / steps; + + $handles.each(function (idx, handle) { + var $handle = $(handle); + var value = parseFloat($handle.attr('data-value')); + var deg = (value - minValue) * stepSizeInDegrees; + + var X = Math.round(radius + radius * Math.sin(deg * Math.PI / 180)); + var Y = Math.round(radius + radius * -Math.cos(deg * Math.PI / 180)); + $handle.css({ + left: X, + top: Y + }); + $container.find($handle.attr('data-value-target')).html($handle.attr('data-value') + unit); + }); + + var extraChangeEventParameters = [{ + source: 'lcnCircleRangeSelect' + }]; + + var value1 = $handle1.attr('data-value'); + if (isSingleValue) { + $input.val(value1).trigger('change', extraChangeEventParameters); + } else { + var value2 = $handle2.attr('data-value'); + drawCircle($container, (value1 - minValue) * stepSizeInDegrees, (value2 - minValue) * stepSizeInDegrees); + $input.val(value1 + ';' + value2).trigger('change', extraChangeEventParameters); + } + } + + function init($input) { + var isSingleValue = _isSingleValue($input); + if (isSingleValue) { + var value1 = parseFloat($input.val() || 0); + } else { + var values = $input.val() || '0;0'; + values = values.split(';'); + var value1 = parseFloat(values[0]); + var value2 = parseFloat(values[1]); + } + + + var $container = $('
'); + + var backgroundImage = $input.attr('data-bg-image'); + if (backgroundImage) { + $container.css({ + 'background-image': 'url("' + backgroundImage + '")', + 'background-size': 'contain' + }); + } + + $input.wrap($container); + $container = $input.parent(); + + $container.append('
'); + if (isSingleValue) { + $container.append('
'); + } else { + $container.append('
'); + $container.append('
-
'); + $container.append(''); + } + + + updateWidget($container); + + $container.on('mousedown touchstart', '.handle', function (e) { + isDragging = true; + e.preventDefault(); + $currentHandle = $(e.target); + $(document).one('mouseup touchend', function () { + isDragging = false; + $currentHandle = null; + }); + }); + + $input.on('change', function (e, options) { + if (options && typeof options === 'object' && options.source === 'lcnCircleRangeSelect') { + return; + } + + var $input = $container.find('input'); + var isSingleValue = _isSingleValue($input); + var $handle1 = $container.find('.handle1'); + + if (isSingleValue) { + $handle1.attr('data-value', parseFloat($input.val() || 0)); + } else { + var $handle2 = $container.find('.handle2'); + var values = $input.val() || '0;0'; + values = values.split(';'); + $handle1.attr('data-value', parseFloat(values[0])); + $handle2.attr('data-value', parseFloat(values[1])); + } + + updateWidget($container); + }); + + $(window).on('resize', updateWidget.bind(null, $container)); + } + + + function _isSingleValue($input) { + return $input.attr('data-single-value') !== undefined && $input.attr('data-single-value') !== 'false'; + } + + $(document).on('mousemove touchmove', function (e) { + if (isDragging) { + + var $draggingTarget = $(e.target); + + $draggingWrapper = $draggingTarget.closest('.circle-range-select-wrapper'); + if ($draggingWrapper.length === 0) { + return; + } + + if ($currentHandle.hasClass('handle1')) { + $draggingHandle = $draggingWrapper.find('.handle1'); + } else if ($currentHandle.hasClass('handle2')) { + $draggingHandle = $draggingWrapper.find('.handle2'); + } + + if ($draggingHandle[0] !== $currentHandle[0]) { + return; + } + + + var $container = $currentHandle.closest('.circle-range-select-wrapper'); + var radius = $container.width() / 2; + + if (!e.offsetX && e.originalEvent.touches) { + // touch events + var targetOffset = $draggingTarget.offset(); + e.offsetX = e.originalEvent.touches[0].pageX - targetOffset.left; + e.offsetY = e.originalEvent.touches[0].pageY - targetOffset.top; + } else if (typeof e.offsetX === "undefined" || typeof e.offsetY === "undefined") { + // firefox compatibility + var targetOffset = $draggingTarget.offset(); + e.offsetX = e.pageX - targetOffset.left; + e.offsetY = e.pageY - targetOffset.top; + } + + if ($draggingTarget.hasClass('handle')) { + var mPos = { + x: e.target.offsetLeft + e.offsetX, + y: e.target.offsetTop + e.offsetY + }; + } else { + var mPos = { + x: e.offsetX, + y: e.offsetY + }; + } + + var atan = Math.atan2(mPos.x - radius, mPos.y - radius); + var deg = -atan / (Math.PI / 180) + 180; // final (0-360 positive) degrees from mouse position + + var $input = $container.find('input'); + var minValue = parseFloat($input.attr('data-min')) || 0; + var maxValue = parseFloat($input.attr('data-max')) || 360; + var steps = maxValue - minValue; + var stepSize = 360 / steps; + + var value = minValue + Math.round(deg / stepSize); + //if (value == maxValue) { + // value = minValue; + //} + + + $currentHandle.attr('data-value', value); + + updateWidget($container); + } + }); + + + $.fn.lcnCircleRangeSelect = function () { + return this.each(function () { + init($(this)); + }); + + }; + + $(function () { + $('input.circle-range-select[data-auto-init]').lcnCircleRangeSelect(); + }); + + return $.fn.lcnCircleRangeSelect; + +})); \ No newline at end of file diff --git a/index.html b/index.html index 68dda27..e80ce8d 100644 --- a/index.html +++ b/index.html @@ -13,6 +13,10 @@ 🌈Monogradients🎉 + + + + @@ -20,28 +24,52 @@ + +
+
+ + +
+
+ + + +
+ +
+ +
+
+
+
+ color copied!
-

Explore a constantly updated library of gradients,

+

Beautiful hand-crafted gradients,

curated by the community.

-

Join 46 others and be notified when Pomegradient goes live! - No spam - promise!

@@ -58,6 +86,9 @@ + + + diff --git a/main.js b/main.js index e776da6..987f737 100644 --- a/main.js +++ b/main.js @@ -19,4 +19,64 @@ clipboard.on('error', function (e) { console.info('Action:', e.action); console.info('Text:', e.text); console.info('Trigger:', e.trigger); -}); \ No newline at end of file +}); + + +// code for making own gradient color + +let generateGradient = () => { + let gradientCardEdit = document.getElementById('gradient_card_edit'); + let colorPosition = document.getElementById('rangeSlider').value; + // console.log(colorDeg); + let AllColorArray = []; + + let color = document.querySelectorAll('.colorinput'); + color.forEach(element => { + AllColorArray.push(element.value); + }) + + let gradientColor = `linear-gradient(${colorPosition}deg,${AllColorArray.toString()})`; + + + gradientCardEdit.style.background = gradientColor; + let copyToClipboard = document.getElementById('color_maker_copy_btn'); + copyToClipboard.setAttribute("data-clipboard-text", `background:${gradientColor};`) +} + +generateGradient(); + + +// code for add more input type="color" + +let addInputColor = document.getElementById('add_input_btn'); +let c = 3; +let addColorInputer = () => { + + if (c <= 5) { + let colorInputs = document.getElementById('color_inputs'); + let colorPicker = document.createElement('input'); + colorPicker.classList.add("color", "colorinput"); + colorPicker.setAttribute("type", "color"); + colorPicker.setAttribute("value", "#1f1f1f"); + colorPicker.setAttribute("oninput", "generateGradient()"); + colorInputs.append(colorPicker); + generateGradient(); + c++; + } else { + alert("only 5 colors allowed!") + } +} + +// code for open and close the gradient maker div + +let openBtn = document.getElementById('make_gradient_btn'); +let closeBtn = document.getElementById('close'); +let colorMakerDropDown = document.querySelector('.color_maker'); + +openBtn.onclick = () => { + colorMakerDropDown.classList.remove("color_maker_close"); +} + +closeBtn.onclick= () => { + colorMakerDropDown.classList.add("color_maker_close"); +} \ No newline at end of file diff --git a/style.css b/style.css index a0639c4..6f9de6a 100644 --- a/style.css +++ b/style.css @@ -6,31 +6,28 @@ text-decoration: none; } -::-webkit-scrollbar -{ +::-webkit-scrollbar { width: 10px; } -::-webkit-scrollbar-track -{ +::-webkit-scrollbar-track { background: #f1f1f1; } -::-webkit-scrollbar-thumb -{ +::-webkit-scrollbar-thumb { background: linear-gradient(to top, #6c28d9, #db2778); } -span#notify_toast -{ +/* code for toast msg */ +span#notify_toast { position: fixed; top: 90%; - right:5%; + right: 5%; background: rgba(0, 0, 0, .8); backdrop-filter: blur(110px); padding: 10px 20px; border-radius: 5px; - color:#fff; + color: #fff; font-family: sans-serif; font-weight: 700; font-size: 1.1rem; @@ -38,16 +35,94 @@ span#notify_toast transition: all .5s ease; } -.hide_toast -{ +.hide_toast { opacity: 0; } -.show_toast -{ +.show_toast { opacity: 1; } +/* code for create gradient dropdoan */ +.color_maker { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 1; + transition: all .5s; +} + +.color_maker_close { + top: -50%; +} + +#gradient_card_edit { + display: flex; + align-items: flex-start; + justify-content: center; +} + +#gradient_card_edit input[type="text"] { + color: whitesmoke; + margin-top: 3em; +} + +#gradient_card_edit #close { + position: absolute; + top: 5%; + right: 5%; + display: flex; + align-items: center; + justify-content: center; + background: transparent; + color: #fff; + font-size: 20px; + transition: all .5s; +} + +#gradient_card_edit #close:hover { + scale: 1.5; + background: rgba(255, 255, 255, .1); +} + + +#color_inputs button { + font-size: 1.4rem; + color: #000; + cursor: pointer; + background: #fff; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + padding: 5px; +} + +#color_inputs button ion-icon { + --ionicon-stroke-width: 26px; +} + +/* make color maker div responsive */ +@media screen and (max-width:380px) { + .color_maker { + width: 100%; + min-height:100vh; + } + + .color_maker .gradient_card + { + width: 100%; + min-height:100vh; + box-shadow: none; + } + + .color_maker .gradient_card::before + { + display: none; + } +} + .container { font-family: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; background: linear-gradient(to right, #6d28d9, #db2777); @@ -59,7 +134,7 @@ h1.logo_text { padding-block: 1.5rem; font-size: 20px; line-height: 32px; - color: #ffffffa4; + color: #ffffffd6; border-bottom: 1px solid #ffffff4e; } @@ -111,7 +186,7 @@ main.hero_section { outline: 3px solid rgba(255, 255, 255, .4); } -.form button.notify_btn { +.form a.btn { padding: 12px 24px; display: inline-flex; align-items: center; @@ -126,34 +201,19 @@ main.hero_section { border-radius: 5px; transition: all .3s ease-in-out; border: 1px solid rgba(255, 255, 255, .2); + cursor: pointer; } -.form button.notify_btn ion-icon { +.form a.btn ion-icon { scale: 1.4; --ionicon-stroke-width: 46px; } -.form button.notify_btn:hover { +.form a.btn:hover { background: rgba(255, 255, 255, .4); margin-top: -10px; } -.hero_section p.message { - margin-top: 1rem; - color: #d1d5db; - font-size: 16px; - line-height: 20px; - font-weight: 400; -} - -.hero_section p.message span { - display: block; - color: #d1d5db; - font-size: 16px; - line-height: 20px; - font-weight: 400; -} - /* make hero section fully responsive */ @media screen and (max-width:640px) { @@ -173,7 +233,7 @@ main.hero_section { width: 100%; } - .form button { + .form a { width: 100%; } @@ -223,8 +283,7 @@ main.hero_section { border-bottom-right-radius: 5px; } -.colors -{ +.colors { background: rgba(255, 255, 255, .8); -webkit-backdrop-filter: blur(25px); backdrop-filter: blur(25px); @@ -232,19 +291,34 @@ main.hero_section { display: flex; align-items: center; justify-content: flex-start; - gap:1rem; + gap: 1rem; } + + input[type="color"] { - -webkit-appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; width: 20px; - height: 20px; + height: 20px; + background-color: transparent; + border: none; + cursor: pointer; } + input[type="color"]::-webkit-color-swatch-wrapper { - padding: 0; + padding: 0; } + input[type="color"]::-webkit-color-swatch { - border: none; + border-radius: 5px; + border: none; +} + +input[type="color"]::-moz-color-swatch { + border-radius: 5px; + border: none; } .title_with_copy_btn { @@ -278,18 +352,15 @@ input[type="color"]::-webkit-color-swatch { background: #fff; padding-inline: 15px; padding-bottom: 8px; + padding-top: 6px; color: #adb1b5; - font-size: 1.1rem; - line-height: 20px; + font-size: 1rem; + line-height: 24px; font-weight: 600; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; } -span.copy_text -{ - visibility:hidden; -} @media screen and (max-width:640px) { .gradient_container { @@ -301,8 +372,7 @@ span.copy_text line-height: 20px; } - .gradient_info p - { + .gradient_info p { font-size: .9rem; } } \ No newline at end of file