We Are
MA-NO WEB DESIGN AND DEVELOPMENT is an agency specialized in web design and web development in Palma de Mallorca, graphic design, application development and SEO optimization. We have a powerful multinational and multidisciplinary creative team, which offers a quality service, fast and at the height of your project.
Users who have visited our websites
Total earned by our customers
Web design and development agency in the Balearic Islands with 10 years of experience designing websites for large and small companies in Mallorca and throughout Spain, numerous success stories behind us. Advising our companies on the positioning of their websites.
MA-NO is an agency specialising in digital products that arouse emotions, have personality and drive results. We bring this experience to each project to offer a high level of service and excellence.
We are the web design company in Mallorca that offers the best design and digital strategy in the design of corporate websites and online shops. We offer comprehensive web project development services, locally, regionally, nationally and internationally, with measurable results.
Our servicesWe develop digital projects for important brands and it hasn't gone to our heads (although we are very good at it and we know it).
Ma-No listens, adapts and works with you to take your online presence from Meh to WOW. Need a full service? We can help with strategy, campaigns, advertising, branding, video, photography and more.
If you have a non-profit, start-up brand, family business or corporation, you're here because you recognize the impact a digital product like a website can have.
MA-NO is an agency specialized in digital products that arouse emotions, have personality and drive results.
We will share experiences, professionalism, some humor, we will work with you to solve your complex problems and achieve your goals.
· Our day is not boring and yours shouldn't be either ·
Opciones de Accesibilidad
Ajuste de contenido
Control saturación
Screen reader
Control volumen
We use our own and third-party cookies to improve our services, compile statistical information and analyze your browsing habits. This allows us to personalize the content we offer and to show you advertisements related to your preferences. By clicking "Accept all" you agree to the storage of cookies on your device to improve website navigation, analyse traffic and assist our marketing activities. You can also select "System Cookies Only" to accept only the cookies required for the website to function, or you can select the cookies you wish to activate by clicking on "settings".
Accept All Only sistem cookies ConfigurationThese cookies are necessary for the website to function and cannot be disabled on our systems. They are generally only set in response to your actions in requesting services, such as setting your privacy preferences, logging in or completing forms. You can set your browser to block or alert you to these cookies, but some areas of the site will not work. These cookies do not store any personally identifiable information
These cookies allow us to count visits and traffic sources so that we can assess the performance of our site and improve it. They help us know which pages are the most or least visited, and how visitors navigate the site. All information collected by these cookies is aggregated and therefore anonymous. If you do not allow these cookies to be used, we will not know when you visited our site and will not be able to assess whether it worked properly
These cookies allow the website to provide better functionality and customization. They may be set by our company or by external providers whose services we have added to our pages. If you do not allow these cookies to be used, some of these services may not function properly
These cookies may be set through our site by our advertising partners. They may be used by those companies to profile your interests and display relevant ads on other sites. They do not directly store personal information, but are based on the unique identification of your browser and Internet device. If you do not allow these cookies to be used, you will see less targeted advertising
Array ( [path] => Array ( [0] => en ) [path-first-chunk] => Array ( ) [path-last-chunk] => en [path-prelast-chunk] => Array ( [0] => en ) [file-name] => en [file-mime] => en [file-is-file] => 0 [file-get-values] => Array ( ) [path-middle-chunks] => [plugins] => Array ( [item-nav-path] => [nav-path] => /index.php [path-models] => /var/www/torpedobits.com/plugins//public/models/index.php [path-files] => /var/www/torpedobits.com/plugins//public/views/index.php [path-item-models] => /var/www/torpedobits.com/plugins//public/models//item.php [path-item-files] => /var/www/torpedobits.com/plugins//public/views//item.php ) [PARAMS] => Array ( [css_style] => .typewrite_container {font-size:24px;font-weight:bold;} .swiper-container .sldtext{ top:10% } .particle-network-animation { position: relative; float:left; display:block; height: 100vh; width:100%; /*background-color: #fff; background: rgb(0,154,145); background: radial-gradient(circle, rgba(0,154,145,1) 0%, rgba(9,121,116,1) 35%, rgba(0,20,18,1) 100%);*/ } .particle-network-animation::before { z-index: -2; content: ""; position: absolute; top: 0; right: 0; bottom: 0; left: 0; background-image: url(/cache/galleries/generica/photo-1450849608880-6f787542c88a.webp); background-position: center center; background-size: cover; opacity: 0.2; } .particle-network-animation .sldtext{z-index:1;} .particle-network-animation canvas { display: block; float: left; position: absolute; top: 0; left: 0; z-index: -1; } .glow { z-index: -1; position: fixed; top: 50%; left: 50%; background-image: radial-gradient(circle closest-side, rgba(255, 255, 255, 0.025), transparent); } .glow-1 { width: 150vw; height: 150vh; margin-top: -75vh; margin-left: -75vw; animation: glow-1-move 25s linear infinite both; } @keyframes glow-1-move { from { transform: translate(-100%, 100%); } to { transform: translate(100%, -100%); } } .glow-2 { width: 100vw; height: 100vh; margin-top: -50vh; margin-left: -50vw; animation: glow-2-move 25s linear 8.3333333333s infinite both; } @keyframes glow-2-move { from { transform: translate(-100%, 0%); } to { transform: translate(100%, 100%); } } .glow-3 { width: 120vw; height: 120vh; margin-top: -60vh; margin-left: -60vw; animation: glow-3-move 25s linear 16.6666666667s infinite both; } @keyframes glow-3-move { from { transform: translate(100%, 100%); } to { transform: translate(0%, -100%); } } .mySwiper { -webkit-box-shadow: none; box-shadow: none; height:300px; } .mySwiper .swiper-slide { text-align: center; font-size: 18px; width: 300px; height: 300px; /* Center slide text vertically */ display: -webkit-box; display: -ms-flexbox; display: -webkit-flex; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; -webkit-justify-content: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; -webkit-align-items: center; align-items: center; } [javascript] => const swipercat = new Swiper('.swiper-container-parked', { // Optional parameters // direction: 'vertical', loop: false, // If we need pagination pagination: { el: '.swiper-pagination', }, // Navigation arrows navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', }, // And if we need scrollbar scrollbar: { el: '.swiper-scrollbar', }, }); /** * Particle Network Animation * Inspiration: https://github.com/JulianLaval/canvas-particle-network */ (function() { var ParticleNetworkAnimation, PNA; ParticleNetworkAnimation = PNA = function() {}; PNA.prototype.init = function(element) { this.$el = $(element); this.container = element; this.canvas = document.createElement('canvas'); this.sizeCanvas(); this.container.appendChild(this.canvas); this.ctx = this.canvas.getContext('2d'); this.particleNetwork = new ParticleNetwork(this); //this.bindUiActions(); return this; }; PNA.prototype.bindUiActions = function() { $(window).on('resize', function() { // this.sizeContainer(); this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); this.sizeCanvas(); this.particleNetwork.createParticles(); }.bind(this)); }; PNA.prototype.sizeCanvas = function() { this.canvas.width = this.container.offsetWidth; this.canvas.height = this.container.offsetHeight; }; var Particle = function(parent, x, y) { this.network = parent; this.canvas = parent.canvas; this.ctx = parent.ctx; this.particleColor = returnRandomArrayitem(this.network.options.particleColors); this.radius = getLimitedRandom(1.5, 4.5); this.opacity = 1; this.x = x || Math.random() * this.canvas.width; this.y = y || Math.random() * this.canvas.height; this.velocity = { x: (Math.random() - 0.5) * parent.options.velocity, y: (Math.random() - 0.5) * parent.options.velocity }; }; Particle.prototype.update = function() { if (this.opacity < 1) { this.opacity += 0.1; } else { this.opacity = 1; } // Change dir if outside map if (this.x > this.canvas.width + 100 || this.x < -100) { this.velocity.x = -this.velocity.x; } if (this.y > this.canvas.height + 100 || this.y < -100) { this.velocity.y = -this.velocity.y; } // Update position this.x += this.velocity.x; this.y += this.velocity.y; }; Particle.prototype.draw = function() { // Draw particle this.ctx.beginPath(); this.ctx.fillStyle = this.particleColor; this.ctx.globalAlpha = this.opacity; this.ctx.arc(this.x, this.y, this.radius, 0, 2 * Math.PI); this.ctx.fill(); }; var ParticleNetwork = function(parent) { this.options = { velocity: 1, // the higher the faster density: 12000, // the lower the denser netLineDistance: 300, netLineColor: '#00a4ad', particleColors: ['#aaa'] // ['#6D4E5C', '#aaa', '#FFC458' ] }; this.canvas = parent.canvas; this.ctx = parent.ctx; this.init(); }; ParticleNetwork.prototype.init = function() { // Create particle objects this.createParticles(true); // Update canvas this.animationFrame = requestAnimationFrame(this.update.bind(this)); //this.bindUiActions(); }; ParticleNetwork.prototype.createParticles = function(isInitial) { // Initialise / reset particles var me = this; this.particles = []; var quantity = this.canvas.width * this.canvas.height / this.options.density; if (isInitial) { var counter = 0; clearInterval(this.createIntervalId); this.createIntervalId = setInterval(function() { if (counter < quantity - 1) { // Create particle object this.particles.push(new Particle(this)); } else { clearInterval(me.createIntervalId); } counter++; }.bind(this), 140); } else { // Create particle objects for (var i = 0; i < quantity; i++) { this.particles.push(new Particle(this)); } } }; ParticleNetwork.prototype.createInteractionParticle = function() { // Add interaction particle this.interactionParticle = new Particle(this); this.interactionParticle.velocity = { x: 0, y: 0 }; this.particles.push(this.interactionParticle); return this.interactionParticle; }; ParticleNetwork.prototype.removeInteractionParticle = function() { // Find it var index = this.particles.indexOf(this.interactionParticle); if (index > -1) { // Remove it this.interactionParticle = undefined; this.particles.splice(index, 1); } }; ParticleNetwork.prototype.update = function() { if (this.canvas) { this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); this.ctx.globalAlpha = 1; // Draw connections for (var i = 0; i < this.particles.length; i++) { for (var j = this.particles.length - 1; j > i; j--) { var distance, p1 = this.particles[i], p2 = this.particles[j]; // check very simply if the two points are even a candidate for further measurements distance = Math.min(Math.abs(p1.x - p2.x), Math.abs(p1.y - p2.y)); if (distance > this.options.netLineDistance) { continue; } // the two points seem close enough, now let's measure precisely distance = Math.sqrt( Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2) ); if (distance > this.options.netLineDistance) { continue; } this.ctx.beginPath(); this.ctx.strokeStyle = this.options.netLineColor; this.ctx.globalAlpha = (this.options.netLineDistance - distance) / this.options.netLineDistance * p1.opacity * p2.opacity; this.ctx.lineWidth = 0.7; this.ctx.moveTo(p1.x, p1.y); this.ctx.lineTo(p2.x, p2.y); this.ctx.stroke(); } } // Draw particles for (var i = 0; i < this.particles.length; i++) { this.particles[i].update(); this.particles[i].draw(); } if (this.options.velocity !== 0) { this.animationFrame = requestAnimationFrame(this.update.bind(this)); } } else { cancelAnimationFrame(this.animationFrame); } }; ParticleNetwork.prototype.bindUiActions = function() { // Mouse / touch event handling this.spawnQuantity = 3; this.mouseIsDown = false; this.touchIsMoving = false; this.onMouseMove = function(e) { if (!this.interactionParticle) { this.createInteractionParticle(); } this.interactionParticle.x = e.offsetX; this.interactionParticle.y = e.offsetY; }.bind(this); this.onTouchMove = function(e) { e.preventDefault(); this.touchIsMoving = true; if (!this.interactionParticle) { this.createInteractionParticle(); } this.interactionParticle.x = e.changedTouches[0].clientX; this.interactionParticle.y = e.changedTouches[0].clientY; }.bind(this); this.onMouseDown = function(e) { this.mouseIsDown = true; var counter = 0; var quantity = this.spawnQuantity; var intervalId = setInterval(function() { if (this.mouseIsDown) { if (counter === 1) { quantity = 1; } for (var i = 0; i < quantity; i++) { if (this.interactionParticle) { this.particles.push(new Particle(this, this.interactionParticle.x, this.interactionParticle.y)); } } } else { clearInterval(intervalId); } counter++; }.bind(this), 50); }.bind(this); this.onTouchStart = function(e) { e.preventDefault(); setTimeout(function() { if (!this.touchIsMoving) { for (var i = 0; i < this.spawnQuantity; i++) { this.particles.push(new Particle(this, e.changedTouches[0].clientX, e.changedTouches[0].clientY)); } } }.bind(this), 200); }.bind(this); this.onMouseUp = function(e) { this.mouseIsDown = false; }.bind(this); this.onMouseOut = function(e) { this.removeInteractionParticle(); }.bind(this); this.onTouchEnd = function(e) { e.preventDefault(); this.touchIsMoving = false; this.removeInteractionParticle(); }.bind(this); this.canvas.addEventListener('mousemove', this.onMouseMove); this.canvas.addEventListener('touchmove', this.onTouchMove); this.canvas.addEventListener('mousedown', this.onMouseDown); this.canvas.addEventListener('touchstart', this.onTouchStart); this.canvas.addEventListener('mouseup', this.onMouseUp); this.canvas.addEventListener('mouseout', this.onMouseOut); this.canvas.addEventListener('touchend', this.onTouchEnd); }; ParticleNetwork.prototype.unbindUiActions = function() { if (this.canvas) { this.canvas.removeEventListener('mousemove', this.onMouseMove); this.canvas.removeEventListener('touchmove', this.onTouchMove); this.canvas.removeEventListener('mousedown', this.onMouseDown); this.canvas.removeEventListener('touchstart', this.onTouchStart); this.canvas.removeEventListener('mouseup', this.onMouseUp); this.canvas.removeEventListener('mouseout', this.onMouseOut); this.canvas.removeEventListener('touchend', this.onTouchEnd); } }; var getLimitedRandom = function(min, max, roundToInteger) { var number = Math.random() * (max - min) + min; if (roundToInteger) { number = Math.round(number); } return number; }; var returnRandomArrayitem = function(array) { return array[Math.floor(Math.random()*array.length)]; }; pna = new ParticleNetworkAnimation(); pna.init($('.particle-network-animation')[0]); }()); var swiper = new Swiper(".mySwiper", { /* navigation: { nextEl: ".swiper-button-next", prevEl: ".swiper-button-prev", }, pagination: { el: ".swiper-pagination", clickable: true, },*/ slidesPerView: 4, spaceBetween: 40, breakpoints: { 320: { slidesPerView: 2, spaceBetween: 20 }, 480: { slidesPerView: 3, spaceBetween: 30 }, 640: { slidesPerView: 4, spaceBetween: 40 } }, loop: true, loopFillGroupWithBlank: true, autoplay: { delay: 2500, disableOnInteraction: false, }, }); [main_title] => Web Design, Web Development, SEO Optimization in Majorca [is_indexable] => [is_followable] => [gallery] => categories-2 ) )