#background:
Explore tagged Tumblr posts
jcmarchi · 7 months ago
Text
How to Create Multi-Step Forms With Vanilla JavaScript and CSS
New Post has been published on https://thedigitalinsider.com/how-to-create-multi-step-forms-with-vanilla-javascript-and-css/
How to Create Multi-Step Forms With Vanilla JavaScript and CSS
Multi-step forms are a good choice when your form is large and has many controls. No one wants to scroll through a super-long form on a mobile device. By grouping controls on a screen-by-screen basis, we can improve the experience of filling out long, complex forms.
But when was the last time you developed a multi-step form? Does that even sound fun to you? There’s so much to think about and so many moving pieces that need to be managed that I wouldn’t blame you for resorting to a form library or even some type of form widget that handles it all for you.
But doing it by hand can be a good exercise and a great way to polish the basics. I’ll show you how I built my first multi-step form, and I hope you’ll not only see how approachable it can be but maybe even spot areas to make my work even better.
We’ll walk through the structure together. We’ll build a job application, which I think many of us can relate to these recent days. I’ll scaffold the baseline HTML, CSS, and JavaScript first, and then we’ll look at considerations for accessibility and validation.
I’ve created a GitHub repo for the final code if you want to refer to it along the way.
The structure of a multi-step form
Our job application form has four sections, the last of which is a summary view, where we show the user all their answers before they submit them. To achieve this, we divide the HTML into four sections, each identified with an ID, and add navigation at the bottom of the page. I’ll give you that baseline HTML in the next section.
Navigating the user to move through sections means we’ll also include a visual indicator for what step they are at and how many steps are left. This indicator can be a simple dynamic text that updates according to the active step or a fancier progress bar type of indicator. We’ll do the former to keep things simple and focused on the multi-step nature of the form.,
The structure and basic styles
We’ll focus more on the logic, but I will provide the code snippets and a link to the complete code at the end.
Let’s start by creating a folder to hold our pages. Then, create an index.html file and paste the following into it:
Open HTML
<form id="myForm"> <section class="group-one" id="one"> <div class="form-group"> <div class="form-control"> <label for="name">Name <span style="color: red;">*</span></label> <input type="text" id="name" name="name" placeholder="Enter your name"> </div> <div class="form-control"> <label for="idNum">ID number <span style="color: red;">*</span></label> <input type="number" id="idNum" name="idNum" placeholder="Enter your ID number"> </div> </div> <div class="form-group"> <div class="form-control"> <label for="email">Email <span style="color: red;">*</span></label> <input type="email" id="email" name="email" placeholder="Enter your email"> </div> <div class="form-control"> <label for="birthdate">Date of Birth <span style="color: red;">*</span></label> <input type="date" id="birthdate" name="birthdate" max="2006-10-01" min="1924-01-01"> </div> </div> </section> <section class="group-two" id="two"> <div class="form-control"> <label for="document">Upload CV <span style="color: red;">*</span></label> <input type="file" name="document" id="document"> </div> <div class="form-control"> <label for="department">Department <span style="color: red;">*</span></label> <select id="department" name="department"> <option value="">Select a department</option> <option value="hr">Human Resources</option> <option value="it">Information Technology</option> <option value="finance">Finance</option> </select> </div> </section> <section class="group-three" id="three"> <div class="form-control"> <label for="skills">Skills (Optional)</label> <textarea id="skills" name="skills" rows="4" placeholder="Enter your skills"></textarea> </div> <div class="form-control"> <input type="checkbox" name="terms" id="terms"> <label for="terms">I agree to the terms and conditions <span style="color: red;">*</span></label> </div> <button id="btn" type="submit">Confirm and Submit</button> </section> <div class="arrows"> <button type="button" id="navLeft">Previous</button> <span id="stepInfo"></span> <button type="button" id="navRight">Next</button> </div> </form> <script src="script.js"></script>
Looking at the code, you can see three sections and the navigation group. The sections contain form inputs and no native form validation. This is to give us better control of displaying the error messages because native form validation is only triggered when you click the submit button.
Next, create a styles.css file and paste this into it:
Open base styles
:root --primary-color: #8c852a; --secondary-color: #858034; body font-family: sans-serif; line-height: 1.4; margin: 0 auto; padding: 20px; background-color: #f4f4f4; max-width: 600px; h1 text-align: center; form background: #fff; padding: 40px; border-radius: 5px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); display: flex; flex-direction: column; .form-group display: flex; gap: 7%; .form-group > div width: 100%; input:not([type="checkbox"]), select, textarea width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; .form-control margin-bottom: 15px; button display: block; width: 100%; padding: 10px; color: white; background-color: var(--primary-color); border: none; border-radius: 4px; cursor: pointer; font-size: 16px; button:hover background-color: var(--secondary-color); .group-two, .group-three display: none; .arrows display: flex; justify-content: space-between align-items: center; margin-top: 10px; #navLeft, #navRight width: fit-content; @media screen and (max-width: 600px) .form-group flex-direction: column;
Open up the HTML file in the browser, and you should get something like the two-column layout in the following screenshot, complete with the current page indicator and navigation.
Adding functionality with vanilla JavaScript
Now, create a script.js file in the same directory as the HTML and CSS files and paste the following JavaScript into it:
Open base scripts
const stepInfo = document.getElementById("stepInfo"); const navLeft = document.getElementById("navLeft"); const navRight = document.getElementById("navRight"); const form = document.getElementById("myForm"); const formSteps = ["one", "two", "three"]; let currentStep = 0; function updateStepVisibility() formSteps.forEach((step) => document.getElementById(step).style.display = "none"; ); document.getElementById(formSteps[currentStep]).style.display = "block"; stepInfo.textContent = `Step $currentStep + 1 of $formSteps.length`; navLeft.style.display = currentStep === 0 ? "none" : "block"; navRight.style.display = currentStep === formSteps.length - 1 ? "none" : "block"; document.addEventListener("DOMContentLoaded", () => navLeft.style.display = "none"; updateStepVisibility(); navRight.addEventListener("click", () => if (currentStep < formSteps.length - 1) currentStep++; updateStepVisibility(); ); navLeft.addEventListener("click", () => if (currentStep > 0) currentStep--; updateStepVisibility(); ); );
This script defines a method that shows and hides the section depending on the formStep values that correspond to the IDs of the form sections. It updates stepInfo with the current active section of the form. This dynamic text acts as a progress indicator to the user.
It then adds logic that waits for the page to load and click events to the navigation buttons to enable cycling through the different form sections. If you refresh your page, you will see that the multi-step form works as expected.
Multi-step form navigation
Let’s dive deeper into what the Javascript code above is doing. In the updateStepVisibility() function, we first hide all the sections to have a clean slate:
formSteps.forEach((step) => document.getElementById(step).style.display = "none"; );
Then, we show the currently active section:
document.getElementById(formSteps[currentStep]).style.display = "block";`
Next, we update the text that indicators progress through the form:
stepInfo.textContent = `Step $currentStep + 1 of $formSteps.length`;
Finally, we hide the Previous button if we are at the first step and hide the Next button if we are at the last section:
navLeft.style.display = currentStep === 0 ? "none" : "block"; navRight.style.display = currentStep === formSteps.length - 1 ? "none" : "block";
Let’s look at what happens when the page loads. We first hide the Previous button as the form loads on the first section:
document.addEventListener("DOMContentLoaded", () => navLeft.style.display = "none"; updateStepVisibility();
Then we grab the Next button and add a click event that conditionally increments the current step count and then calls the updateStepVisibility() function, which then updates the new section to be displayed:
navRight.addEventListener("click", () => if (currentStep < formSteps.length - 1) currentStep++; updateStepVisibility(); );
Finally, we grab the Previous button and do the same thing but in reverse. Here, we are conditionally decrementing the step count and calling the updateStepVisibility():
navLeft.addEventListener("click", () => if (currentStep > 0) currentStep--; updateStepVisibility(); );
Handling errors
Have you ever spent a good 10+ minutes filling out a form only to submit it and get vague errors telling you to correct this and that? I prefer it when a form tells me right away that something’s amiss so that I can correct it before I ever get to the Submit button. That’s what we’ll do in our form.
Our principle is to clearly indicate which controls have errors and give meaningful error messages. Clear errors as the user takes necessary actions. Let’s add some validation to our form. First, let’s grab the necessary input elements and add this to the existing ones:
const nameInput = document.getElementById("name"); const idNumInput = document.getElementById("idNum"); const emailInput = document.getElementById("email"); const birthdateInput = document.getElementById("birthdate") const documentInput = document.getElementById("document"); const departmentInput = document.getElementById("department"); const termsCheckbox = document.getElementById("terms"); const skillsInput = document.getElementById("skills");
Then, add a function to validate the steps:
Open validation script
function validateStep(step)
Here, we check if each required input has some value and if the email input has a valid input. Then, we set the isValid boolean accordingly. We also call a showError() function, which we haven’t defined yet.
Paste this code above the validateStep() function:
function showError(input, message) const formControl = input.parentElement; const errorSpan = formControl.querySelector(".error-message"); input.classList.add("error"); errorSpan.textContent = message;
Now, add the following styles to the stylesheet:
Open validation styles
input:focus, select:focus, textarea:focus outline: .5px solid var(--primary-color); input.error, select.error, textarea.error outline: .5px solid red; .error-message font-size: x-small; color: red; display: block; margin-top: 2px; .arrows color: var(--primary-color); font-size: 18px; font-weight: 900; #navLeft, #navRight display: flex; align-items: center; gap: 10px; #stepInfo color: var(--primary-color);
If you refresh the form, you will see that the buttons do not take you to the next section till the inputs are considered valid:
Finally, we want to add real-time error handling so that the errors go away when the user starts inputting the correct information. Add this function below the validateStep() function:
Open real-time validation script
function setupRealtimeValidation() nameInput.addEventListener("input", () => if (nameInput.value.trim() !== "") clearError(nameInput); ); idNumInput.addEventListener("input", () => if (idNumInput.value.trim() !== "") clearError(idNumInput); ); emailInput.addEventListener("input", () => if (emailInput.validity.valid) clearError(emailInput); ); birthdateInput.addEventListener("change", () => if (birthdateInput.value !== "") clearError(birthdateInput); ); documentInput.addEventListener("change", () => if (documentInput.files[0]) clearError(documentInput); ); departmentInput.addEventListener("change", () => if (departmentInput.value !== "") clearError(departmentInput); ); termsCheckbox.addEventListener("change", () => if (termsCheckbox.checked) clearError(termsCheckbox); );
This function clears the errors if the input is no longer invalid by listening to input and change events then calling a function to clear the errors. Paste the clearError() function below the showError() one:
function clearError(input) const formControl = input.parentElement; const errorSpan = formControl.querySelector(".error-message"); input.classList.remove("error"); errorSpan.textContent = "";
And now the errors clear when the user types in the correct value:
The multi-step form now handles errors gracefully. If you do decide to keep the errors till the end of the form, then at the very least, jump the user back to the erroring form control and show some indication of how many errors they need to fix.
Handling form submission
In a multi-step form, it is valuable to show the user a summary of all their answers at the end before they submit and to offer them an option to edit their answers if necessary. The person can’t see the previous steps without navigating backward, so showing a summary at the last step gives assurance and a chance to correct any mistakes.
Let’s add a fourth section to the markup to hold this summary view and move the submit button within it. Paste this just below the third section in index.html:
Open HTML
<section class="group-four" id="four"> <div class="summary-section"> <p>Name: </p> <p id="name-val"></p> <button type="button" class="edit-btn" id="name-edit"> <span>✎</span> <span>Edit</span> </button> </div> <div class="summary-section"> <p>ID Number: </p> <p id="id-val"></p> <button type="button" class="edit-btn" id="id-edit"> <span>✎</span> <span>Edit</span> </button> </div> <div class="summary-section"> <p>Email: </p> <p id="email-val"></p> <button type="button" class="edit-btn" id="email-edit"> <span>✎</span> <span>Edit</span> </button> </div> <div class="summary-section"> <p>Date of Birth: </p> <p id="bd-val"></p> <button type="button" class="edit-btn" id="bd-edit"> <span>✎</span> <span>Edit</span> </button> </div> <div class="summary-section"> <p>CV/Resume: </p> <p id="cv-val"></p> <button type="button" class="edit-btn" id="cv-edit"> <span>✎</span> <span>Edit</span> </button> </div> <div class="summary-section"> <p>Department: </p> <p id="dept-val"></p> <button type="button" class="edit-btn" id="dept-edit"> <span>✎</span> <span>Edit</span> </button> </div> <div class="summary-section"> <p>Skills: </p> <p id="skills-val"></p> <button type="button" class="edit-btn" id="skills-edit"> <span>✎</span> <span>Edit</span> </button> </div> <button id="btn" type="submit">Confirm and Submit</button> </section>
Then update the formStep in your Javascript to read:
const formSteps = ["one", "two", "three", "four"];
Finally, add the following classes to styles.css:
.summary-section display: flex; align-items: center; gap: 10px; .summary-section p:first-child width: 30%; flex-shrink: 0; border-right: 1px solid var(--secondary-color); .summary-section p:nth-child(2) width: 45%; flex-shrink: 0; padding-left: 10px; .edit-btn width: 25%; margin-left: auto; background-color: transparent; color: var(--primary-color); border: .7px solid var(--primary-color); border-radius: 5px; padding: 5px; .edit-btn:hover border: 2px solid var(--primary-color); font-weight: bolder; background-color: transparent;
Now, add the following to the top of the script.js file where the other consts are:
const nameVal = document.getElementById("name-val"); const idVal = document.getElementById("id-val"); const emailVal = document.getElementById("email-val"); const bdVal = document.getElementById("bd-val") const cvVal = document.getElementById("cv-val"); const deptVal = document.getElementById("dept-val"); const skillsVal = document.getElementById("skills-val"); const editButtons = "name-edit": 0, "id-edit": 0, "email-edit": 0, "bd-edit": 0, "cv-edit": 1, "dept-edit": 1, "skills-edit": 2 ;
Then add this function in scripts.js:
function updateSummaryValues() nameVal.textContent = nameInput.value; idVal.textContent = idNumInput.value; emailVal.textContent = emailInput.value; bdVal.textContent = birthdateInput.value; const fileName = documentInput.files[0]?.name; if (fileName) const extension = fileName.split(".").pop(); const baseName = fileName.split(".")[0]; const truncatedName = baseName.length > 10 ? baseName.substring(0, 10) + "..." : baseName; cvVal.textContent = `$truncatedName.$extension`; else cvVal.textContent = "No file selected"; deptVal.textContent = departmentInput.value; skillsVal.textContent = skillsInput.value || "No skills submitted"; }
This dynamically inserts the input values into the summary section of the form, truncates the file names, and offers a fallback text for the input that was not required.
Then update the updateStepVisibility() function to call the new function:
function updateStepVisibility() formSteps.forEach((step) => document.getElementById(step).style.display = "none"; ); document.getElementById(formSteps[currentStep]).style.display = "block"; stepInfo.textContent = `Step $currentStep + 1 of $formSteps.length`; if (currentStep === 3) updateSummaryValues(); navLeft.style.display = currentStep === 0 ? "none" : "block"; navRight.style.display = currentStep === formSteps.length - 1 ? "none" : "block";
Finally, add this to the DOMContentLoaded event listener:
Object.keys(editButtons).forEach((buttonId) => const button = document.getElementById(buttonId); button.addEventListener("click", (e) => currentStep = editButtons[buttonId]; updateStepVisibility(); ); );
Running the form, you should see that the summary section shows all the inputted values and allows the user to edit any before submitting the information:
And now, we can submit our form:
form.addEventListener("submit", (e) => e.preventDefault(); if (validateStep(2)) alert("Form submitted successfully!"); form.reset(); currentFormStep = 0; updateStepVisibility(); );
Our multi-step form now allows the user to edit and see all the information they provide before submitting it.
Accessibility tips
Making multi-step forms accessible starts with the basics: using semantic HTML. This is half the battle. It is closely followed by using appropriate form labels.
Other ways to make forms more accessible include giving enough room to elements that must be clicked on small screens and giving meaningful descriptions to the form navigation and progress indicators.
Offering feedback to the user is an important part of it; it’s not great to auto-dismiss user feedback after a certain amount of time but to allow the user to dismiss it themselves. Paying attention to contrast and font choice is important, too, as they both affect how readable your form is.
Let’s make the following adjustments to the markup for more technical accessibility:
Add aria-required="true" to all inputs except the skills one. This lets screen readers know the fields are required without relying on native validation.
Add role="alert" to the error spans. This helps screen readers know to give it importance when the input is in an error state.
Add role="status" aria-live="polite" to the .stepInfo. This will help screen readers understand that the step info keeps tabs on a state, and the aria-live being set to polite indicates that should the value change, it does not need to immediately announce it.
In the script file, replace the showError() and clearError() functions with the following:
function showError(input, message) const formControl = input.parentElement; const errorSpan = formControl.querySelector(".error-message"); input.classList.add("error"); input.setAttribute("aria-invalid", "true"); input.setAttribute("aria-describedby", errorSpan.id); errorSpan.textContent = message; function clearError(input) const formControl = input.parentElement; const errorSpan = formControl.querySelector(".error-message"); input.classList.remove("error"); input.removeAttribute("aria-invalid"); input.removeAttribute("aria-describedby"); errorSpan.textContent = "";
Here, we programmatically add and remove attributes that explicitly tie the input with its error span and show that it is in an invalid state.
Finally, let’s add focus on the first input of every section; add the following code to the end of the updateStepVisibility() function:
const currentStepElement = document.getElementById(formSteps[currentStep]); const firstInput = currentStepElement.querySelector( "input, select, textarea" ); if (firstInput) firstInput.focus();
And with that, the multi-step form is much more accessible.
Conclusion
There we go, a four-part multi-step form for a job application! As I said at the top of this article, there’s a lot to juggle — so much so that I wouldn’t fault you for looking for an out-of-the-box solution.
But if you have to hand-roll a multi-step form, hopefully now you see it’s not a death sentence. There’s a happy path that gets you there, complete with navigation and validation, without turning away from good, accessible practices.
And this is just how I approached it! Again, I took this on as a personal challenge to see how far I could get, and I’m pretty happy with it. But I’d love to know if you see additional opportunities to make this even more mindful of the user experience and considerate of accessibility.
References
Here are some relevant links I referred to when writing this article:
How to Structure a Web Form (MDN)
Multi-page Forms (W3C.org)
Create accessible forms (A11y Project)
3 notes · View notes
Video
youtube
Resident Evil 2 (2019) – Game World Ambience – Greenhouse
Deep within the Umbrella NEST facility and the rainforest like Greenhouse that houses the now overgrown and out of control Plant 43, one of the many experimental bioweapons developed in the NEST 
For other game world ambience videos check out this playlist https://www.youtube.com/playlist?list=PLFJOZYl1h1CFo5LyAEvdIcP4syymQaI50
youtube
0 notes
mahashankh · 1 year ago
Text
Beautiful Surface Design Patterns 1000+
Tumblr media
Surface design patterns encompass a broad spectrum of visual motifs, textures, and compositions that adorn various surfaces, ranging from textiles and wallpapers to digital interfaces and architectural facades. These patterns serve as the aesthetic foundation of products, environments, and experiences, imbuing them with personality, style, and visual interest. Surface design patterns can be categorized into several types, each with its own unique characteristics and applications: Beautiful Surface Design Patterns Mahashankh Design: A Blend of Artistry, Sophistication, and Cultural Heritage Unlocking Creativity: Exploring Surface Design Patterns Understanding Surface Design Patterns Mahashankh Design: Empowering Creativity and InnovationThe Journey The Visionaries1. OM Prakash Chaudhary (Founder & CEO) 2. VISHAL KUMAR (Co-Founder & COO – MAHASHANKH DESIGN) Mahashankh Dedicated Design and Shared Design: Empowering Creativity Introduction Mahashankh Dedicated Design Mahashankh Shared Design Mahashankh Digital Design: Elevating Creativity in the Modern Market - Geometric Patterns: Geometric patterns are characterized by the use of simple shapes such as lines, circles, squares, and triangles to create repetitive, symmetrical designs. These patterns often evoke a sense of order, harmony, and balance, making them popular choices for architectural facades, interior decor, and graphic design elements. - Organic Patterns: Organic patterns are inspired by natural forms such as plants, animals, and landscapes. These patterns often feature fluid lines, curves, and irregular shapes, reflecting the beauty and complexity of the natural world. Organic patterns can be found in textiles, wallpaper, and surface treatments, bringing a sense of warmth and vitality to any space. - Floral Patterns: Floral patterns are characterized by the use of flowers, leaves, and other botanical elements to create decorative motifs. These patterns can range from realistic depictions of plants to stylized, abstract interpretations, offering endless possibilities for creative expression. Floral patterns are commonly used in fashion, home decor, and textile design, adding a touch of elegance and charm to any design scheme. - Abstract Patterns: Abstract patterns are non-representational designs that explore shape, color, and composition in innovative ways. These patterns often feature bold, dynamic forms, textures, and gradients, creating visually engaging experiences. Abstract patterns can be found in digital art, product design, and interior decor, adding a modern, avant-garde flair to any environment. - Traditional Patterns: Traditional patterns are rooted in cultural heritage and craftsmanship, drawing inspiration from historical motifs and techniques. These patterns often carry symbolic meanings and cultural significance, serving as a visual language that reflects the values, beliefs, and traditions of a particular community or region. Traditional patterns can be found in textiles, ceramics, and architectural ornamentation, preserving cultural identity and fostering a sense of connection to the past. - Textile Patterns: Textile patterns are specifically designed for fabrics and materials used in fashion, upholstery, and home decor. These patterns encompass a wide range of styles, from intricate weaves and embroideries to bold prints and jacquards. Textile patterns can be inspired by any theme or concept, offering designers endless opportunities for creativity and innovation. - Digital Patterns: Digital patterns are created using computer software and algorithms, allowing designers to generate complex, intricate designs with precision and efficiency. These patterns can range from pixel art and vector graphics to generative algorithms and parametric designs, offering a new frontier of creative possibilities. Digital patterns are commonly used in web design, digital art, and product development, blurring the boundaries between art and technology. In conclusion, surface design patterns are an integral part of our visual culture, shaping the way we perceive and interact with the world around us. Whether inspired by nature, culture, or technology, these patterns offer endless opportunities for creative expression, innovation, and storytelling. From traditional crafts to cutting-edge digital techniques, surface design patterns continue to evolve and inspire, enriching our lives with beauty, meaning, and inspiration.
Beautiful Surface Design Patterns
Mahashankh Design: A Blend of Artistry, Sophistication, and Cultural Heritage
Tumblr media
Mahashankh Design: A Blend of Artistry, Sophistication, and Cultural Heritage Mahashankh Design is a company that creates and sells digital surface pattern designs. Their designs are a unique blend of artistry, sophistication, and cultural heritage. They offer a wide variety of designs that can be used for a variety of purposes, including interior design, fashion, and DIY projects. The Mahashankh Design website allows customers to browse their designs, filter by preference, and preview patterns before they buy. This makes it easy for customers to find the perfect design for their needs. The website also offers custom design services, so customers can get a design that is exactly what they are looking for. A Fusion of Tradition and Modernity Mahashankh Design's strength lies in its ability to bridge the gap between traditional Indian design and modern applications. They draw inspiration from timeless Indian design motifs, textiles, and art forms, and then give them a modern twist. This unique approach allows them to create designs that are both beautiful and relevant to today's trends. Catering to Diverse Needs Mahashankh Design offers a variety of services to cater to the diverse needs of their customers. They offer a library of pre-designed patterns that customers can purchase and download. These patterns are available in a variety of styles and colors, so customers can find something to suit their taste. Mahashankh Design also offers custom design services. This is a great option for customers who need a design that is unique and specific to their brand or project. A Resource for Creatives Mahashankh Design is a valuable resource for creatives of all levels. Their website is a great place to browse for inspiration and to find high-quality surface pattern designs. The company also offers custom design services, so creatives can get a design that is exactly what they need. Overall, Mahashankh Design is a company that is committed to creating beautiful and innovative surface pattern designs. Their unique blend of artistry, sophistication, and cultural heritage makes them a valuable resource for creatives of all levels.
Unlocking Creativity: Exploring Surface Design Patterns
Introduction Dive into the captivating world of surface design patterns! These artistic elements, adorning everything from fabrics to furniture, hold immense power to transform ordinary surfaces into vibrant expressions. This exploration will unveil the significance of surface design patterns, tracing their fascinating journey from traditional practices to modern applications. Setting the Stage: Importance of Surface Design Patterns Surface design patterns are more than just visual embellishments. They play a crucial role in: - Elevating Aesthetics: Eye-catching patterns add personality and depth to a surface, influencing the overall mood and atmosphere. - Storytelling: Patterns can be imbued with symbolism and cultural references, weaving narratives into the design. - Functionality: Strategic use of patterns can create a sense of scale or movement, even influencing how light interacts with a space. - Branding and Identity: Signature patterns can become instantly recognizable, defining a brand or product aesthetic. By understanding these diverse functionalities, we can appreciate the profound impact surface design patterns have on the world around us. Evolution of Surface Design: From Traditional to Modern Surface design boasts a rich history, with traditions passed down through generations. Let's embark on a journey through time, exploring the evolution of these patterns: - Traditional Techniques: - From intricate hand-woven textiles and block-printed fabrics to meticulously crafted ceramics, traditional methods showcase the artistry and cultural significance of patterns. - The Industrial Revolution: - The rise of machinery in the 18th and 19th centuries led to mass production of patterned goods, making them more accessible to the public. - The Digital Age: - Today, technology empowers designers with an abundance of tools and resources. Digital design software allows for intricate pattern creation, while digital printing enables limitless reproduction possibilities. As we delve deeper, we'll discover how surface design patterns continue to adapt and evolve, reflecting the ever-changing world of design.
Understanding Surface Design Patterns
Now that we've established the significance and historical context of surface design patterns, let's delve deeper into their core characteristics and applications. Defining Surface Design Patterns: What Are They? Surface design patterns are repeated decorative motifs applied to a two-dimensional surface. These patterns can be formed from various elements such as: - Geometric shapes: Stripes, circles, squares, and more can be arranged in intricate or simple compositions. - Organic elements: Natural forms like leaves, flowers, and animals can be incorporated into the design. - Figurative elements: Representations of objects, people, or symbols can add a narrative layer to the pattern. Types of Surface Design Patterns: A Comprehensive Overview The world of surface design offers a vast array of pattern types. Here's a glimpse into some popular categories: - Repeatable Patterns: These seamlessly tile across a surface, creating a continuous design. This is commonly used in fabrics, wallpapers, and wrapping paper. - Motif-based Patterns: A single motif or element is repeated throughout the design, often with variations in size or color. Think of polka dots or a scattered floral pattern. - Textured Patterns: Patterns can create a sense of texture through visual effects, mimicking the look of natural materials like wood grain or animal fur. - Paisley: This distinctive teardrop-shaped motif with intricate details has its origins in Persia and remains a popular design element. - Damask: Characterized by elaborate floral or geometric designs often woven into fabrics, damask patterns exude an air of elegance. This is just a starting point – the possibilities for surface design patterns are truly endless! Applications Across Industries: Where Surface Design Patterns Shine Surface design patterns extend far beyond traditional textiles and wallpapers. Here are just a few industries where they play a vital role: - Fashion: Clothing and accessories come alive with vibrant prints, adding personality and style to any outfit. - Interior Design: From statement walls to patterned furniture, surface design elevates the aesthetics of a space. - Product Design: Everything from phone cases to homeware can be adorned with eye-catching patterns, making them stand out. - Graphic Design: Patterns can be incorporated into logos, branding materials, and even website design to create a cohesive visual identity. By understanding the various types and applications of surface design patterns, we gain a deeper appreciation for their versatility and influence in shaping the world around us.
Mahashankh Design: Empowering Creativity and Innovation
Mahashankh Design, a dynamic digital pattern and surface design company, has been making waves in the industry since its inception in 2019. Founded by Om Prakash Chaudhary and Vishal Kumar, this Bihar-based design studio has carved a niche for itself by delivering cutting-edge solutions to clients worldwide. In this article, we’ll explore the journey, services, and unique features of Mahashankh Design. The Journey Mahashankh Design embarked on its journey on August 8th, 2019. With relentless dedication and hard work, the company achieved a significant milestone when it received its GST No. on February 26th, 2022. This marked the foundation for expanding its business and providing top-notch design solutions.
The Visionaries
1. OM Prakash Chaudhary (Founder & CEO) Driven by a passion for “New Design for New Generation,” OM Prakash Chaudhary has been the driving force behind Mahashankh Design. His vision was to create the world’s most advanced and beautiful designs, and he continues to lead the company toward excellence. 2. VISHAL KUMAR (Co-Founder & COO – MAHASHANKH DESIGN) Vishal Kumar, as the Co-Founder and Chief Operating Officer of Mahashankh Design, brings expertise and creativity to the forefront. Together with OM Prakash Chaudhary, they ensure a seamless experience for clients. Services Offered Mahashankh Design offers a wide range of services, including: - Digital Pattern Design: - For textiles, homeware, and other products. - Convertible designs (B2DD) that can be used as backgrounds, wallpapers, and more. - Multi-pattern, multi-color convertible designs. - All designs are in square size for easy combination. - Borderless designs for a seamless look. - Graphic Design and Fashion Design: - Shared and dedicated design services. - High-quality designs spanning traditional to modern styles. - Versatility for textiles, homeware, and interiors. - Affordable pricing options. Mahashankh Design’s Digital Expertise Recently, Mahashankh Design expanded into the realm of digital design, offering unparalleled creativity and sophistication. Their digital design services cover various domains, ensuring that clients’ visions are transformed into masterpieces. Mahashankh Design’s commitment to excellence, creativity, and innovation sets it apart in the design industry. Whether you’re seeking shared design services or a dedicated design experience, Mahashankh Design empowers your creativity and elevates your design journey. Explore the heights of elegance with Mahashankh Design! 🎨🌟 For more information, visit the official Mahashankh Design website: Mahashankh Design
Mahashankh Dedicated Design and Shared Design: Empowering Creativity
Introduction
Mahashankh Design, a trailblazing digital pattern and surface design company, offers two distinct services that cater to diverse creative needs. In this article, we’ll delve into the world of Mahashankh Dedicated Design and Mahashankh Shared Design, exploring their features, benefits, and impact on the design industry.
Mahashankh Dedicated Design
What is Mahashankh Dedicated Design?
Tumblr media
Mahashankh Dedicated Design Mahashankh Dedicated Design is a premium service that allows clients to collaborate directly with a team of skilled designers. With a specific focus on custom patterns and surface designs, this service ensures that clients’ unique visions are transformed into reality. Whether it’s textile design, wallpaper creation, or interior aesthetics, Mahashankh Dedicated Design provides tailored solutions. Key Features of Mahashankh Dedicated Design: - Customization: Clients work closely with designers to create personalized designs aligned with their project requirements. - Unique Copyright: While clients benefit from the design, the copyright remains with Mahashankh Design, ensuring exclusivity. - Quality Assurance: Mahashankh’s skilled designers guarantee high-quality, original creations. Benefits of Mahashankh Dedicated Design: - Vision Realization: Clients’ specific visions come to life through collaborative efforts. - Exclusivity: Each design is unique and tailored, reflecting the client’s brand or project. - Professional Expertise: Mahashankh’s team ensures professional-grade designs.
Mahashankh Shared Design
Tumblr media
Mahashankh Shared Design What is Mahashankh Shared Design? Mahashankh Shared Design offers an affordable and creative platform for textile designs. Here, multiple customers can purchase the same design, making it cost-effective. While the copyright remains with Mahashankh Design, clients are free to use the design for their purposes. Key Features of Mahashankh Shared Design: - Affordability: High-quality designs at budget-friendly prices. - Convenience: Easy access to a wide variety of designs. - Versatility: From simple patterns to intricate illustrations, Mahashankh Shared Design caters to diverse tastes. Benefits of Mahashankh Shared Design: - Cost-Effective: Businesses and individuals can access quality designs without breaking the bank. - Convenience: Quick and hassle-free design acquisition. - Variety: A rich collection of designs to choose from. Mahashankh Design’s commitment to excellence, creativity, and innovation shines through both its dedicated and shared design services. Read the full article
0 notes
meowlicious-food · 2 months ago
Photo
Tumblr media
Read Full recipe here 👉⋆🦋 {{Hawaiian Roll French Toast}}🦋⋆
456 notes · View notes
389 · 1 year ago
Photo
Tumblr media
PORTO ROCHA
1K notes · View notes
skynoctis · 27 days ago
Photo
Tumblr media
Legendary Boulder ~ WrestlerCheetah
Next sketch for cheetahgirlmuscles‬ Another entry on the Mia cosplaying as Guilty Gear characters book~ I hope you like it
85 notes · View notes
bartleby-company · 4 months ago
Photo
Tumblr media
(vía Another America 50 by Phillip Toledano)
79 notes · View notes
giftofgabber · 2 months ago
Text
don’t call me whiny baby if you didn’t care about my whiny baby feelings already, which you didn’t care about!!! shocker!!!
54 notes · View notes
taizooo · 10 months ago
Quote
もともとは10年ほど前にTumblrにすごくハマっていて。いろんな人をフォローしたらかっこいい写真や色が洪水のように出てきて、もう自分で絵を描かなくて良いじゃん、ってなったんです。それで何年も画像を集めていって、そこで集まった色のイメージやモチーフ、レンズの距離感など画面構成を抽象化して、いまの感覚にアウトプットしています。画像の持つ情報量というものが作品の影響になっていますね。
映画『きみの色』山田尚子監督×はくいきしろい対談。嫉妬し合うふたりが語る、色と光の表現|Tokyo Art Beat
155 notes · View notes
jcmarchi · 6 months ago
Text
Revisiting CSS Multi-Column Layout
New Post has been published on https://thedigitalinsider.com/revisiting-css-multi-column-layout/
Revisiting CSS Multi-Column Layout
Honestly, it’s difficult for me to come to terms with, but almost 20 years have passed since I wrote my first book, Transcending CSS. In it, I explained how and why to use what was the then-emerging Multi-Column Layout module.
Hint: I published an updated version, Transcending CSS Revisited, which is free to read online.
Perhaps because, before the web, I’d worked in print, I was over-excited at the prospect of dividing content into columns without needing extra markup purely there for presentation. I’ve used Multi-Column Layout regularly ever since. Yet, CSS Columns remains one of the most underused CSS layout tools. I wonder why that is?
Holes in the specification
For a long time, there were, and still are, plenty of holes in Multi-Column Layout. As Rachel Andrew — now a specification editor — noted in her article five years ago:
“The column boxes created when you use one of the column properties can’t be targeted. You can’t address them with JavaScript, nor can you style an individual box to give it a background colour or adjust the padding and margins. All of the column boxes will be the same size. The only thing you can do is add a rule between columns.”
She’s right. And that’s still true. You can’t style columns, for example, by alternating background colours using some sort of :nth-column() pseudo-class selector. You can add a column-rule between columns using border-style values like dashed, dotted, and solid, and who can forget those evergreen groove and ridge styles? But you can’t apply border-image values to a column-rule, which seems odd as they were introduced at roughly the same time. The Multi-Column Layout is imperfect, and there’s plenty I wish it could do in the future, but that doesn’t explain why most people ignore what it can do today.
Patchy browser implementation for a long time
Legacy browsers simply ignored the column properties they couldn’t process. But, when Multi-Column Layout was first launched, most designers and developers had yet to accept that websites needn’t look the same in every browser.
Early on, support for Multi-Column Layout was patchy. However, browsers caught up over time, and although there are still discrepancies — especially in controlling content breaks — Multi-Column Layout has now been implemented widely. Yet, for some reason, many designers and developers I speak to feel that CSS Columns remain broken. Yes, there’s plenty that browser makers should do to improve their implementations, but that shouldn’t prevent people from using the solid parts today.
Readability and usability with scrolling
Maybe the main reason designers and developers haven’t embraced Multi-Column Layout as they have CSS Grid and Flexbox isn’t in the specification or its implementation but in its usability. Rachel pointed this out in her article:
“One reason we don’t see multicol used much on the web is that it would be very easy to end up with a reading experience which made the reader scroll in the block dimension. That would mean scrolling up and down vertically for those of us using English or another vertical writing mode. This is not a good reading experience!”
That’s true. No one would enjoy repeatedly scrolling up and down to read a long passage of content set in columns. She went on:
“Neither of these things is ideal, and using multicol on the web is something we need to think about very carefully in terms of the amount of content we might be aiming to flow into our columns.”
But, let’s face it, thinking very carefully is what designers and developers should always be doing.
Sure, if you’re dumb enough to dump a large amount of content into columns without thinking about its design, you’ll end up serving readers a poor experience. But why would you do that when headlines, images, and quotes can span columns and reset the column flow, instantly improving readability? Add to that container queries and newer unit values for text sizing, and there really isn’t a reason to avoid using Multi-Column Layout any longer.
A brief refresher on properties and values
Let’s run through a refresher. There are two ways to flow content into multiple columns; first, by defining the number of columns you need using the column-count property:
Second, and often best, is specifying the column width, leaving a browser to decide how many columns will fit along the inline axis. For example, I’m using column-width to specify that my columns are over 18rem. A browser creates as many 18rem columns as possible to fit and then shares any remaining space between them.
Then, there is the gutter (or column-gap) between columns, which you can specify using any length unit. I prefer using rem units to maintain the gutters’ relationship to the text size, but if your gutters need to be 1em, you can leave this out, as that’s a browser’s default gap.
The final column property is that divider (or column-rule) to the gutters, which adds visual separation between columns. Again, you can set a thickness and use border-style values like dashed, dotted, and solid.
These examples will be seen whenever you encounter a Multi-Column Layout tutorial, including CSS-Tricks’ own Almanac. The Multi-Column Layout syntax is one of the simplest in the suite of CSS layout tools, which is another reason why there are few reasons not to use it.
Multi-Column Layout is even more relevant today
When I wrote Transcending CSS and first explained the emerging Multi-Column Layout, there were no rem or viewport units, no :has() or other advanced selectors, no container queries, and no routine use of media queries because responsive design hadn’t been invented.
We didn’t have calc() or clamp() for adjusting text sizes, and there was no CSS Grid or Flexible Box Layout for precise control over a layout. Now we do, and all these properties help to make Multi-Column Layout even more relevant today.
Now, you can use rem or viewport units combined with calc() and clamp() to adapt the text size inside CSS Columns. You can use :has() to specify when columns are created, depending on the type of content they contain. Or you might use container queries to implement several columns only when a container is large enough to display them. Of course, you can also combine a Multi-Column Layout with CSS Grid or Flexible Box Layout for even more imaginative layout designs.
Using Multi-Column Layout today
Patty Meltt is an up-and-coming country music sensation. She’s not real, but the challenges of designing and developing websites like hers are.
My challenge was to implement a flexible article layout without media queries which adapts not only to screen size but also whether or not a <figure> is present. To improve the readability of running text in what would potentially be too-long lines, it should be set in columns to narrow the measure. And, as a final touch, the text size should adapt to the width of the container, not the viewport.
Article with no <figure> element. What would potentially be too-long lines of text are set in columns to improve readability by narrowing the measure.
Article containing a <figure> element. No column text is needed for this narrower measure.
The HTML for this layout is rudimentary. One <section>, one <main>, and one <figure> (or not:)
<section> <main> <h1>About Patty</h1> <p>…</p> </main> <figure> <img> </figure> </section>
I started by adding Multi-Column Layout styles to the <main> element using the column-width property to set the width of each column to 40ch (characters). The max-width and automatic inline margins reduce the content width and center it in the viewport:
main margin-inline: auto; max-width: 100ch; column-width: 40ch; column-gap: 3rem; column-rule: .5px solid #98838F;
Next, I applied a flexible box layout to the <section> only if it :has() a direct descendant which is a <figure>:
section:has(> figure) display: flex; flex-wrap: wrap; gap: 0 3rem;
This next min-width: min(100%, 30rem) — applied to both the <main> and <figure> — is a combination of the min-width property and the min() CSS function. The min() function allows you to specify two or more values, and a browser will choose the smallest value from them. This is incredibly useful for responsive layouts where you want to control the size of an element based on different conditions:
section:has(> figure) main flex: 1; margin-inline: 0; min-width: min(100%, 30rem); section:has(> figure) figure flex: 4; min-width: min(100%, 30rem);
What’s efficient about this implementation is that Multi-Column Layout styles are applied throughout, with no need for media queries to switch them on or off.
Adjusting text size in relation to column width helps improve readability. This has only recently become easy to implement with the introduction of container queries, their associated values including cqi, cqw, cqmin, and cqmax. And the clamp() function. Fortunately, you don’t have to work out these text sizes manually as ClearLeft’s Utopia will do the job for you.
My headlines and paragraph sizes are clamped to their minimum and maximum rem sizes and between them text is fluid depending on their container’s inline size:
h1 font-size: clamp(5.6526rem, 5.4068rem + 1.2288cqi, 6.3592rem); h2 font-size: clamp(1.9994rem, 1.9125rem + 0.4347cqi, 2.2493rem); p font-size: clamp(1rem, 0.9565rem + 0.2174cqi, 1.125rem);
So, to specify the <main> as the container on which those text sizes are based, I applied a container query for its inline size:
main container-type: inline-size;
Open the final result in a desktop browser, when you’re in front of one. It’s a flexible article layout without media queries which adapts to screen size and the presence of a <figure>. Multi-Column Layout sets text in columns to narrow the measure and the text size adapts to the width of its container, not the viewport.
Modern CSS is solving many prior problems
Structure content with spanning elements which will restart the flow of columns and prevent people from scrolling long distances.
Prevent figures from dividing their images and captions between columns.
Almost every article I’ve ever read about Multi-Column Layout focuses on its flaws, especially usability. CSS-Tricks’ own Geoff Graham even mentioned the scrolling up and down issue when he asked, “When Do You Use CSS Columns?”
“But an entire long-form article split into columns? I love it in newspapers but am hesitant to scroll down a webpage to read one column, only to scroll back up to do it again.”
Fortunately, the column-span property — which enables headlines, images, and quotes to span columns, resets the column flow, and instantly improves readability — now has solid support in browsers:
h1, h2, blockquote column-span: all;
But the solution to the scrolling up and down issue isn’t purely technical. It also requires content design. This means that content creators and designers must think carefully about the frequency and type of spanning elements, dividing a Multi-Column Layout into shallower sections, reducing the need to scroll and improving someone’s reading experience.
Another prior problem was preventing headlines from becoming detached from their content and figures, dividing their images and captions between columns. Thankfully, the break-after property now also has widespread support, so orphaned images and captions are now a thing of the past:
figure break-after: column;
Open this final example in a desktop browser:
You should take a fresh look at Multi-Column Layout
Multi-Column Layout isn’t a shiny new tool. In fact, it remains one of the most underused layout tools in CSS. It’s had, and still has, plenty of problems, but they haven’t reduced its usefulness or its ability to add an extra level of refinement to a product or website’s design. Whether you haven’t used Multi-Column Layout in a while or maybe have never tried it, now’s the time to take a fresh look at Multi-Column Layout.
2 notes · View notes
nevver · 8 months ago
Photo
Tumblr media Tumblr media Tumblr media
No one wants to be here and no one wants to leave, Dave Smith (because)
111 notes · View notes
mellowlike · 8 months ago
Photo
Tumblr media
齋藤飛鳥
63 notes · View notes
389 · 1 year ago
Photo
Tumblr media
PORTO ROCHA
776 notes · View notes
theroyalweekly · 1 month ago
Photo
Tumblr media
--
60 notes · View notes
goodvibesandmemes · 1 year ago
Text
GENERAL MEMES: Vampire/Immortal Themed 🩸🦇🌹
↳ Please feel free to tweak them.
Themes: violence, death, blood, murder, depression/negative thoughts
SYMBOLS: ↳ Use “↪”to reverse the characters where applicable!
🦇 - To catch my muse transforming into a bat 🌞 - To warn my muse about/see my muse in the sunlight. 🩸 - To witness my muse drinking blood from a bag. 🐇 - To witness To catch my muse drinking blood from an animal. 🧔🏽 - To witness To catch my muse drinking blood from a human. 🦌 - For our muses hunt together for the first time. 🏃🏿‍♀️ - To see my muse using super speed. 🏋🏼‍♂️ - To see my muse using their super strength. 🧛🏻‍♂️ - To confront my muse about being a vampire. 🌕 - For my muse to lament missing the sun. ⏰ - For my muse to tell yours about a story from their long, immortal life. 🤛🏽 - To offer my muse your wrist to drink from. 👩🏿 - For my muse to reminisce about a long lost love. 👩🏽‍🤝‍👩🏽 - For your muse to look exactly like my muse's lost love. 👄 - For my muse to bite yours. 👀 - For my muse to glamour/compel yours. 🧄 - To try and sneakily feed my muse garlic to test if they're a vampire. 🔗 - To try and apprehend my muse with silver chains. 🔪 - To try and attack my muse with a wooden stake. 👤 - To notice that my muse doesn't have a reflection. 🌹 - For my muse to turn yours into a vampire. 🌚 - For my muse and yours to spend time together during the night. 🧛🏼‍♀️ - For my muse to tell yours about their maker/sire.
SENTENCES:
"I've been alive for a long time [ name ], I can handle myself." "I'm over a thousand years old, you can't stop me!" "Lots of windows in this place, not exactly the greatest place for a vampire." "Do you really drink human blood? Don't you feel guilty?" "Vampires are predators, [ name ] hunting is just part of our nature, you can't change that." "You just killed that person! You're a monster!" "Tomorrow at dawn, you'll meet the sun [ name ]." "Can you make me like you?" "Do you really want to live forever?" "You say you want to live forever, [ name ], but forever is a long time, longer than you can imagine." "What was it like to live through [ historic event / time period ]?" "Did people really dress like that when you were young?" "What were you like when you were human?" "We’re vampires, [ name ], we have no soul to save, and I don’t care." "How many people have you killed? You can tell me, I can handle it." "Did you meet [ historic figure ]?" "Everyone dies in the end, what does it matter if I... speed it along." "Every time we feed that person is someone's mother, brother, sister, husband. You better start getting used to that if you want to survive this life." "[ she is / he is / they are ] the strongest vampire anyone has heard of, no one knows how to stop them, and if you try you're going to get yourselves killed." "Vampire hunters are everywhere in this city, you need to watch your back." "Humans will never understand the bond a vampire has with [ his / her / their ] maker, it's a bond like no other." "Here, have this ring, it will protect you from the sunlight." "I get you're an immortal creature of the night and all that, but do you have to be such a downer about it?" "In my [ centuries / decades / millennia ] of living, do you really think no one has tried to kill me before?" "Vampires aren't weakened by garlic, that's a myth." "I used to be a lot worse than I was now, [ name ], I've had time to mellow, to become used to what I am. I'm ashamed of the monster I was." "The worst part of living forever is watching everyone you love die, while you stay frozen, still, constant." "I've lived so long I don't feel anything any more." "Are there more people like you? How many?" "Life has never been fair, [ name ], why would start being fair now you're immortal?" "You want to be young forever? Knock yourself out, I just hope you understand what you're giving up." "You never told me who turned you into a vampire. Who were they? Why did they do it?" "I could spend an eternity with you and never get bored." "Do you really sleep in coffins?" "There are worse things for a vampire than death, of that I can assure you [ name ]." "You need to feed, it's been days. You can drink from me, I can tell you're hungry." "The process of becoming a vampire is risky, [ name ], you could die, and I don't know if I could forgive myself for killing you." "I'm a vampire, I can hold a grudge for a long time, so believe me when I say I will never forgive this. Never." "You were human once! How can you have no empathy?" "You don't have to kill to be a vampire, but what would be the fun in that." "You can spend your first years of immortality doing whatever you want to whoever you want, but when you come back to your senses, it'll hit you harder than anything you've felt before." "One day, [ name ], everything you've done is going to catch up to you, and you're never going to forgive yourself." "Stop kidding yourself, [ name ], you're a vampire, a killer, a predator. You might as well embrace it now because you can't keep this up forever." "You can't [ compel / glamour ] me, I have something to protect me." "When you've lived as long as me, there's not much more in life you can do." "You want me to turn you? You don't know what you're asking me to do." "You really have to stop hissing like that, it's getting on my nerves." "I'm going to drive this stake through your heart, [ name ], and I'm going to enjoy it."
181 notes · View notes