On July 30th, 2020 at 7.50am EDT (4.50am PDT), NASA intends to embark on its Mars 2020 mission with Perseverance, its fifth Mars rover, via the Atlas V rocket to look for evidence of ancient life.
To keep up with where Perseverance is at this very moment, you can check out Nasa’s website with live information.
And along with this new experience, comes a new visual identity and logo.
And who was considered worthy enough to create this once in a lifetime chance to design the logo?
The extraordinary task was assigned to none other than the multidisciplinary designer Tobias van Schneider’s studio House of van Schneider.
According to The House of Van Schneider, NASA emphasized that the new logo needed to encompass “the energy and legacy of space travel”, while simultaneously being able to bring immense amounts of honor to the engineers who worked day and night to make this historical moment possible.
Here’s what the team had to say about this momentous opportunity.
From the moment we first set eyes on our sparkling sky, there was no going back.
“We had to know what lay beyond our planet and when we found out, we had to know more.
Our curiosity and perseverance have put us into space, on the moon and now: to Mars.
For the 2020 launch of the Mars Rover, NASA asked House of van Schneider to design a symbol capturing the energy and legacy of space travel, while celebrating the engineers who worked tirelessly on this mission.
At once an abstract representation of the iconic rover and blocks reaching up to the sky, the logomark works as beautifully on the rover as it does on a 191-foot tall rocket ship.”
This new, abstract symbol is amazingly intricate, yet simple.
The 2D design symbolizes the iconic rover, whose structure is recognizable from any distance, that is going towards the Red Planet. You can even see planet earth in the distance of this design.
There’s nothing quite like this logo.
It perfectly encompasses what humanity once saw as only a dream, now made a reality.
This truly must’ve been a bucket-list moment, just like Van Schneider said.
I can’t imagine having the immense honor of creating something so historical for Nasa.
A very fun jaunt through the early days of front-end web development. They are open to pull requests, so submit one if you’re into this kind of fun chronicling of our weird history!
In April of last year, Facebook revealed its big new redesign. An ambitious project, it was a rebuild of a large site with a massive amount of users. To accomplish this, they used several technologies they have created and open-sourced, such as React, GraphQL, Relay, and a new CSS-in-JS library called stylex.
This new library is internal to Facebook, but they have shared enough information about it to make an open-source implementation, style9, possible.
Why another CIJ library?
There are already plenty of CSS-in-JS (CIJ) libraries, so it might not be obvious why another one is needed. style9 has the same benefits as all other CIJ solutions, as articulated by Christopher Chedeau, including scoped selectors, dead code elimination, deterministic resolution, and the ability to share values between CSS and JavaScript.
There are, however, a couple of things that make style9 unique.
Minimal runtime
Although the styles are defined in JavaScript, they are extracted by the compiler into a regular CSS file. That means that no styles are shipped in your final JavaScript file. The only things that remain are the final class names, which the minimal runtime will conditionally apply, just like you would normally do. This results in smaller code bundles, a reduction in memory usage, and faster rendering.
Since the values are extracted at compile time, truly dynamic values can’t be used. These are thankfully not very common and since they are unique, don’t suffer from being defined inline. What’s more common is conditionally applying styles, which of course is supported. So are local constants and mathematical expressions, thanks to babel’s path.evaluate.
Atomic output
Because of how style9 works, every property declaration can be made into its own class with a single property. So, for example, if we use opacity: 0 in several places in our code, it will only exist in the generated CSS once. The benefit of this is that the CSS file grows with the number of unique declarations, not with the total amount of declarations. Since most properties are used many times, this can lead to dramatically smaller CSS files. For example, Facebook’s old homepage used 413 KB of gzipped CSS. The redesign uses 74 KB for all pages. Again, smaller file size leads to better performance.
Some may complain about this, that the generated class names are not semantic, that they are opaque and are ignoring the cascade. This is true. We are treating CSS as a compilation target. But for good reason. By questioning previously assumed best practices, we can improve both the user and developer experience.
In addition, style9 has many other great features, including: typed styles using TypeScript, unused style elimination, the ability to use JavaScript variables, and support for media queries, pseudo-selectors and keyframes.
Here’s how to use it
First, install it like usual:
npm install style9
style9 has plugins for Rollup, Webpack, Gatsby, and Next.js, which are all based on a Babel plugin. Instructions on how to use them are available in the repository. Here, we’ll use the webpack plugin.
const Style9Plugin = require('style9/webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
module: {
rules: [
// This will transform the style9 calls
{
test: /.(tsx|ts|js|mjs|jsx)$/,
use: Style9Plugin.loader
},
// This is part of the normal Webpack CSS extraction
{
test: /.css$/i,
use: [MiniCssExtractPlugin.loader, 'css-loader']
}
]
},
plugins: [
// This will sort and remove duplicate declarations in the final CSS file
new Style9Plugin(),
// This is part of the normal Webpack CSS extraction
new MiniCssExtractPlugin()
]
};
Defining styles
The syntax for creating styles closely resembles other libraries. We start by calling style9.create with objects of styles:
Because all declarations will result in atomic classes, shorthands such as flex: 1 and background: blue won’t work, as they set multiple properties. Properties that can be can be expanded, such as padding, margin, overflow, etc. will be automatically converted to their longhand variants. If you use TypeScript, you will get an error when using unsupported properties.
Resolving styles
To generate a class name, we can now call the function returned by style9.create. It accepts as arguments the keys of the styles we want to use:
const className = styles('button');
The function works in such a way that styles on the right take precedence and will be merged with the styles on the left, like Object.assign. The following would result in an element with a padding of 12px and with rebeccapurple text.
const className = styles('button', 'padding');
We can conditionally apply styles using any of the following formats:
These function calls will be removed during compilation and replaced with direct string concatenation. The first line in the code above will be replaced with something like 'c1r9f2e5 ' + hasPadding ? 'cu2kwdz ' : ''. No runtime is left behind.
Combining styles
We can extend a style object by accessing it with a property name and passing it to style9.
const styles = style9.create({ blue: { color: 'blue; } });
const otherStyles = style9.create({ red: { color: 'red; } });
// will be red
const className = style9(styles.blue, otherStyles.red);
Just like with the function call, the styles on the right take precedence. In this case, however, the class name can’t be statically resolved. Instead the property values will be replaced by classes and will be joined at runtime. The properties gets added to the CSS file just like before.
Summary
The benefits of CSS-in-JS are very much real. That said, we are imposing a performance cost when embedding styles in our code. By extracting the values during build-time we can have the best of both worlds. We benefit from co-locating our styles with our markup and the ability to use existing JavaScript infrastructure, while also being able to generate optimal stylesheets.
If style9 sounds interesting to you, have a look a the repo and try it out. And if you have any questions, feel free to open an issue or get in touch.
Acknowledgements
Thanks to Giuseppe Gurgone for his work on style-sheet and dss, Nicolas Gallagher for react-native-web, Satyajit Sahoo and everyone at Callstack for linaria, Christopher Chedeau, Sebastian McKenzie, Frank Yan, Ashley Watkins, Naman Goel, and everyone else who worked on stylex at Facebook for being kind enough to share their lessons publicly. And anyone else I have missed.
Video marketing is the practice of using video content that will help you to reach your audience faster. Video marketing allows you to promote your brand, your services, and your products – but you must know that video marketing is about more than sales.
Video in digital marketing encourages more visitors to your website, joins your email list, and engages better on social media. On top of all of that, video marketing can help you to improve your customer service and make your brand stand out more.
Humans are visual creatures, and we love the way we feel when we watch videos. Facebook and YouTube have made videos popular, with over 110 million videos being watched on Facebook and over 1 billion hours on YouTube every day.
Those figures alone should tell you that it’s an essential marketing tool for your business. Currently, over 81% of companies use video marketing as part of their strategy. While people still ask whether it’s worth it as part of a business’s digital marketing strategy, and it is.
It’s not just because your competition is doing it, but because it’s known to be one of the most fluid marketing tools in the list – it’s basically an essential part of SEO.
How Video Marketing Is Used
From videos that educate your audience about what you do, to onboarding new users into your business, video marketing has a broad scope. Educational videos can really hit home and send a clear message on an important matter in a way that is interesting and entertaining. Onboarding videos allow newbies to your company to learn all they need to know in easy-to-digest clips. This makes learning far more manageable.
Why Branded Videos Are A Good Addition To Your Campaign Strategy
Video works perfectly as a way to engage your audience and help them to consume new content. When you choose to use branded video and execute it correctly, it can be an asset that you can repeatedly use across a range of channels. It’s not the same thing as advertising, as advertising isn’t as good at delivering your message to your audience.
Branded videos are highly recommended, as they can get to the heart of your audience without mentioning too much about the brand in the first place. It’s also a good idea to have your logo prominently displayed, but not so that it overshadows everything else.
Types of Videos
There is a range of videos that can be used for different reasons in video marketing, and some of these include:
Demo videos
If you are looking to showcase a product to your current audience and potential customers, a demo video is the way to go. They walk a new person through how the product works and gives them all the information they need to make the best buying decision. Google brought a new feature to its Translate app called Tap-To-Translate, and the video demonstrated how it worked and connected well with their users at the same time. The video was popular for a good reason!
Interviews
Businesses often choose testimonials when they want to showcase their customers’ appreciation, but interview videos are always a better option. Your customers can hear the happiness in the interviewee’s voice, and it offers assurance that the product is worth it. If influencers are testing your product and you video an interview with them – it’s a great way to reach your audience.
Brand videos
Brand videos are an inspirational way to showcase your product or company vision. Coca-Cola created a fantastic brand video for its Share A Coke campaign, reaching audiences with nostalgia and emotional moments that transport the audience back to childhood. This built great awareness about what Coca-Cola could offer, and it really stood out.
Explainer Videos
Many brands start their video marketing campaigns with explainer videos. Usually, this is about an individual product or service on offer. It helps your brand to establish authority in your field – if you know what you’re talking about, people will trust you!
Animation
For an exciting touch, animated videos are the perfect way to showcase the creativity your brand has. Animations are fun, light, and the ideal way to get a message across in a musical, colourful way!
Everyone learns differently, with some learning through auditory aids and others through physical learning aids. Educational videos are a great visual aid to help people learn new concepts and teach them how to use your product. It makes learning fun, and you will find your audience more receptive to videos.
How to go about making a video for your business:
Videos can help your business explain your products better, offer reassuring reviews, and capture new customers’ attention. It’s easy to assume that crafting a professional video is going to take too much time and cost too much money, but it’s not as hard as you think! Here are some steps to explain it better.
Planning a video
Videos can help your business explain your products better, offer reassuring reviews, and capture new customers’ attention. It’s easy to assume that crafting a professional video is going to take too much time and cost too much money, but it’s not as hard as you think! Here are some steps to explain it better.
Script
Sometimes, videos are great unscripted and in the moment, but when it comes to a business video, you need a clear script. This will help you to cut down the editing process and save you from losing your audience. This article dictates how brands are using live videos successfully, but you can bet many of them are still scripted to remain professional.
Video/Audio equipment
Whether you only have an iPhone or professional camera equipment, learning to shoot a video is essential. According to Blue Corona, 54% of all mobile brand experiences are image or video-based, and many of these are shot with smartphones to social media.
Set-up
Are you looking to promote your product with a video shot in a professional studio, or are you hoping for a more flexible shoot on the move? How you set-up your video depends on how professional you want this to be. If you’re shooting in a studio, you need a tripod to keep the camera steady. It would help if you also had the right lighting, the right microphone for sound, and the right place to shoot without interruption.
Prepare your talent
Hiring in actors may be the best choice that you make for your company videos. Having the right talent in front of the camera can make the difference between your message coming across or not. If you are hiring an actor or two to do your video, make sure that they are well prepared before the video shooting!
Shoot
This video can tell you how to “shoot for the edit.” This means that you should remember that your footage can and will be edited later, but that you should try not to draw out the shooting.
Edit
Once the video is done, it’s time for the editing period. This will help you cut back too much fluff and sharpen the music in the background (if any). Video editing should also give you the chance to look back over the video to see whether you got your message across.
Record a voiceover (if necessary)
Whether you choose music or you need to record a voiceover, you should consider what will work best for your brand video. A voiceover is a powerful tool for your video, and it should match the mood and the tone of the video you’ve spent time on. It’ll be vital in keeping your audience’s attention.
Using videos in your email campaigns/social media:
Before you film your brand videos and implement them into your email marketing strategy, you need to decide where you will host your videos. There are plenty of excellent options out there, including:
MailChimp has a video merge tag that allows you to create video screenshots for your campaign. Usually, these screenshots are linked to a YouTube or Vimeo video. You can then embed the video in an email, allowing your customers to click through to the link.
You can have videos hosted and sent for you with BombBomb, which helps you massively when it comes to avoiding technical difficulties. Video isn’t easy for everyone, but BombBomb makes it simpler!
You can have your videos uploaded, encoded, and embedded to be sent immediately with TailoredMail. You can even see the analytics of your viewers, such as their behaviour and click rate.
Why Videos?
Currently, a video has way more support with email than it ever has, but it still won’t play instantly. 48% of consumers want videos that they are interested in, and if they have signed up for your business email list, they’re already engaged!
Companies using videos for their onboarding are making smart decisions. They are used to get new users familiar with a product or service. Incidentally, over 90% of people have watched a video to understand how to use a product better.
Onboarding videos will help your business to gain a bigger audience and appeal to new customers. It’s far easier to watch a video than read an article about how to fix or use a physical product, and onboarding videos will put your business in a positive light, too.
Across social media platforms, video is the preferred method to get a message across to an audience. Instagram Stories and Facebook Stories have proven their popularity, with over 500 million Instagram story users every single day. Company videos shared on social media can be shared across all social media platforms, and it’s an excellent way to improve how a company reaches its audience.
How can you make sure your video marketing strategy is working
If you have got to the stage of knowing where you want to host your video and what you want to create, you also need to know your video’s goals. You should know what you are trying to achieve with it and the metrics to watch out for. If you identify the best metrics for determining whether you’ve reached your goals, you can get it right the first time.
Your goal can include anything from increasing brand awareness to enhancing your engagements with your audience. You should consider the target audience when you are thinking of your goals for your videos, and you should review their interests and what could tip their purchasing decisions in your favour.
All of these considerations can help to guide you to the type of video you should make and where you should upload it (email or social media, or both?)
Watch out for the metrics!
The view count of your videos is an important metric to consider, and if you are trying to increase brand awareness, this is important. Each platform measures views differently, which is something to consider before choosing the platform you want to use.
If you’re going to determine the relevance of your video and how it appeals to the audience you are reaching, you need to look for the video’s play rate. There is no point in 1,000 people seeing your video if your engagement is low, and this can help you to choose how to optimize your content.
Another metric to consider in regards to relevance is social sharing and comments. Those who are sharing your content can tell you that your videos are great! Social shares are a must; the more it’s shared, the more views you get. It’s a simple and yet useful metric.
You took the time to plan and shoot a video, which will help you learn the video completion rate. You want people to watch the video to the end, and the completion rate is the rate of those who completed the video divided by those who just pressed play.
Each of these metrics can help you learn whether your videos are compelling and reach the correct audience. If any of these are not showing you the results you want, you can make improvements.
Pay attention to the data that these metrics pull, but don’t panic if they aren’t what you think they should be. For example, you need to ensure that the customers you gain are a good business fit and not those that click through and don’t go anywhere.
Conclusion:
Video marketing is essential for exposure, engagement, and upping your relevance as a business. It’s more affordable today than ever, and the advances in technology allow videos to spread across the world, enhancing your reach and giving you millions of views!
You can use video in your marketing strategy to advertise a product, explain how your product works, and give customers insight into how your company works! With video marketing, you can ensure that your company steps into the spotlight, remaining popular to your audience for good.
After six months of uncertainty 2020 is finally beginning to find a style of its own. There are nods to Brutalism, a delightful blending of 80s pastels with 90s primaries, and the font style of choice is anything but geometric sans-serif.
In this month’s collection of the freshest sites from the past four weeks you’ll find tons of new portfolios, from big agencies to freelancers, and some amazing primal scream therapy. Enjoy!
Looks Like You Need Iceland
Looks Like You Need Iceland is an incredible site that asks you to record a scream, that they’ll broadcast for you into the wide open spaces of Iceland as therapy. And then perhaps you’ll visit Iceland for real. It’s brilliant marketing for the Iceland tourist board.
Riverlane
The abstract 3D animation on Riverlane’s site is a stunning introduction to a topic that’s hard to visualize. The rest of the site is equally well done, with great typography, slick brand assets, and a professional engaging tone.
Monokai
Wimer Hazenberg’s site features a simple pixelated text column. But scroll down the page and keep an eye on the awesome text dissolve effect, it transforms this simple design.
I Weigh Community
The I Weigh Community is a non-profit community activism initiative helmed by Jameela Jamil. It’s devoted to radical inclusivity, and it promotes its message on its site with striking graphics and bold, expressive typography.
WAKA WAKA
Waka Waka is a design studio specializing in wooden furniture. The noise effect and the mid-century typography evoke the radical design of 60 years ago. The random rotations on the thumbnail hovers are delightfully disruptive.
Dataveyes
Dataveyes is an information design studio that works with large datasets to give meaning to complex information. Its site features beautiful, full-screen animations that illustrate the type of information it specializes in.
Year & Day
Year & Day is an ecommerce site that sells ceramics, glassware, and other choice pieces of tableware. It’s a colorful collection that perfectly complements your food and the stunning site takes its cues from the collection.
Dunderville
Dunderville is a motion design studio with an impressive portfolio of animation and live action films. Its site features a tactile paper fold detail, and as you would expect, some superb text, and vector animations.
André Venâncio
It’s been months since we last saw a creative developer’s site with a liquid effect. André Venâncio revisits the idea with a cool oil bubble effect, hover over the thumbnails to see it.
Thomas Prior
It’s not all 60s revivalism, pastels, and cute animations. There will always be room for minimalism, and nothing suits this style as well as portfolios for photographers; Thomas Prior’s site is a prime example.
Serra
Serra’s site features a really beautiful high-contrast typeface that sits apart from the usual sans-serif. The product page is all colored product photography. It exudes luxury and distinction in a saturated marketplace.
VYBES
VYBES is a CBD drink made in LA. Its site evokes the Californian spirit with baby pink brand colors and sun-bleached photography. It’s a cool, and ever so slightly Brutalist look for what is essentially a health drink.
Karina Sirqueira
We love the simplicity of Karina Sirqueira’s portfolio. The desaturated rainbow leads to a simple slideshow of projects, and it’s refreshing to see a minimal site that uses bold serif-based typography. The content feels fresh and honest too.
Smalls
Smalls produces healthy food for cats. The site, is packed with adorable pictures of kitties, which if you’re a cat person, is guaranteed to draw you in. There’s a definite Brutalist style to the site, and lots of color too.
Wildist
There’s a clear aesthetic beginning to emerge in 2020, with pastels creating a soft background for desaturated primaries, and Wildist gets it exactly right with this youthful, site that features just enough animation to bring it to life.
Kristen Kwong
We’ve seen a lot of OS-style sites recently, but Kristen Kwong’s is one of the slickest. It manages to take a simple metaphor for interaction and transform it with a vintage color scheme.
Stojo
Continuing the Miami-meets-Brutalism trend this month is the site for Stojo, a collapsable cup and bottle. The pastel shades block out a disrupted grid, but for our money it works better on mobile. The vintage typeface is a nice touch.
Hoang Nguyen
Hoang Nguyen’s site features a surreal 3D scene with mountains, a spinning planet, floating islands, a waterfall, and a floating dragon-boy. Click around the site and the scene transforms.
SMTH / Sam Smith
Sam Smith’s portfolio has a cool magazine style to it, with a nice blocky background on the text and a personality packed animated avatar taking centre stage.
Then I Met You
Then I met You is a site promoting a range of skincare products. In this case, the usual pastel colors are replaced with an 80s-style gradient. Watch the products as you scroll, the lighting changes creating an awesome, subtle 3D effect.
According to State of JavaScript 2019, 38.7% of developers would like to use GraphQL, while 50.8% of developers would like to learn GraphQL.
Being a query language, GraphQL simplifies the workflow of building a client application. It removes the complexity of managing API endpoints in client-side apps because it exposes a single HTTP endpoint to fetch the required data. Hence, it eliminates overfetching and underfetching of data, as in the case of REST.
But GraphQL is just a query language. In order to use it easily, we need a platform that does the heavy lifting for us. One such platform is Apollo.
The Apollo platform is an implementation of GraphQL that transfers data between the cloud (the server) to the UI of your app. When you use Apollo Client, all of the logic for retrieving data, tracking, loading, and updating the UI is encapsulated by the useQuery hook (as in the case of React). Hence, data fetching is declarative. It also has zero-configuration caching. Just by setting up Apollo Client in your app, you get an intelligent cache out of the box, with no additional configuration required.
Apollo Client is also interoperable with other frameworks, such as Angular, Vue.js, and React.
Note: This tutorial will benefit those who have worked with RESTful or other forms of APIs in the past on the client-side and want to see whether GraphQL is worth taking a shot at. This means you should have worked with an API before; only then will you be able to understand how beneficial GraphQL could be to you. While we will be covering a few basics of GraphQL and Apollo Client, a good knowledge of JavaScript and React Hooks will come in handy.
GraphQL Basics
This article isn’t a complete introduction to GraphQL, but we will define a few conventions before continuing.
What Is GraphQL?
GraphQL is a specification that describes a declarative query language that your clients can use to ask an API for the exact data they want. This is achieved by creating a strong type schema for your API, with ultimate flexibility. It also ensures that the API resolves data and that client queries are validated against a schema. This definition means that GraphQL contains some specifications that make it a declarative query language, with an API that is statically typed (built around Typescript) and making it possible for the client to leverage those type systems to ask the API for the exact data it wants.
So, if we created some types with some fields in them, then, from the client-side, we could say, “Give us this data with these exact fields”. Then the API will respond with that exact shape, just as if we were using a type system in a strongly typed language. You can learn more in my Typescript article.
Let’s look at some conventions of GraphQl that will help us as we continue.
The Basics
Operations
In GraphQL, every action performed is called an operation. There are a few operations, namely:
Query
This operation is concerned with fetching data from the server. You could also call it a read-only fetch.
Mutation
This operation involves creating, updating, and deleting data from a server. It is popularly called a CUD (create, update, and delete) operation.
Subscriptions
This operation in GraphQL involves sending data from a server to its clients when specific events take place. They are usually implemented with WebSockets.
In this article, we will be dealing only with query and mutation operations.
Operationnames
There are uniquenames for your client-side query and mutation operations.
Variablesand arguments
Operations can define arguments, very much like a function in most programming languages. Those variables can then be passed to query or mutation calls inside the operation as arguments. Variables are expected to be given at runtime during the execution of an operation from your client.
Aliasing
This is a convention in client-side GraphQL that involves renaming verbose or vague field names with simple and readable field names for the UI. Aliasing is necessary in use cases where you don’t want to have conflicting field names.
What Is Client-Side GraphQL?
When a front-end engineer builds UI components using any framework, like Vue.js or (in our case) React, those components are modeled and designed from a certain pattern on the client to suit the data that will be fetched from the server.
One of the most common problems with RESTful APIs is overfetching and underfetching. This happens because the only way for a client to download data is by hitting endpoints that return fixed data structures. Overfetching in this context means that a client downloads more information than is required by the app.
In GraphQL, on the other hand, you’d simply send a single query to the GraphQL server that includes the required data. The server would then respond with a JSON object of the exact data you’ve requested — hence, no overfetching. Sebastian Eschweiler explains the differences between RESTful APIs and GraphQL.
Client-side GraphQL is a client-side infrastructure that interfaces with data from a GraphQL server to perform the following functions:
It manages data by sending queries and mutating data without you having to construct HTTP requests all by yourself. You can spend less time plumbing data and more time building the actual application.
It manages the complexity of a cache for you. So, you can store and retrieve the data fetched from the server, without any third-party interference, and easily avoid refetching duplicate resources. Thus, it identifies when two resources are the same, which is great for a complex app.
It keeps your UI consistent with Optimistic UI, a convention that simulates the results of a mutation (i.e. the created data) and updates the UI even before receiving a response from the server. Once the response is received from the server, the optimistic result is thrown away and replaced with the actual result.
For further information about client-side GraphQL, spare an hour with the cocreator of GraphQL and other cool folks on GraphQL Radio.
What Is Apollo Client?
Apollo Client is an interoperable, ultra-flexible, community-driven GraphQL client for JavaScript and native platforms. Its impressive features include a robust state-management tool (Apollo Link), a zero-config caching system, a declarative approach to fetching data, easy-to-implement pagination, and the Optimistic UI for your client-side application.
Apollo Client stores not only the state from the data fetched from the server, but also the state that it has created locally on your client; hence, it manages state for both API data and local data.
It’s also important to note that you can use Apollo Client alongside other state-management tools, like Redux, without conflict. Plus, it’s possible to migrate your state management from, say, Redux to Apollo Client (which is beyond the scope of this article). Ultimately, the main purpose of Apollo Client is to enable engineers to query data in an API seamlessly.
Features of Apollo Client
Apollo Client has won over so many engineers and companies because of its extremely helpful features that make building modern robust applications a breeze. The following features come baked in:
Caching
Apollo Client supports caching on the fly.
Optimistic UI
Apollo Client has cool support for the Optimistic UI. It involves temporarily displaying the final state of an operation (mutation) while the operation is in progress. Once the operation is complete, the real data replaces the optimistic data.
Pagination
Apollo Client has built-in functionality that makes it quite easy to implement pagination in your application. It takes care of most of the technical headaches of fetching a list of data, either in patches or at once, using the fetchMore function, which comes with the useQuery hook.
In this article, we will look at a selection of these features.
Enough of the theory. Tighten your seat belt and grab a cup of coffee to go with your pancakes, as we get our hands dirty.
Building Our Web App
This project is inspired by Scott Moss.
We will be building a simple pet shop web app, whose features include:
fetching our pets from the server-side;
creating a pet (which involves creating the name, type of pet, and image);
using the Optimistic UI;
using pagination to segment our data.
To begin, clone the repository, ensuring that the starter branch is what you’ve cloned.
Using the command-line interface (CLI), navigate to the directory of the cloned repository, and run the command to get all dependencies: npm install.
Run the command npm run app to start the app.
While still in the root folder, run the command npm run server. This will start our back-end server for us, which we’ll use as we proceed.
The app should open up in a configured port. Mine is http://localhost:1234/; yours is probably something else.
If everything worked well, your app should look like this:
You’ll notice that we’ve got no pets to display. That’s because we haven’t created such functionality yet.
If you’ve installed Apollo Client Developer Tools correctly, open up the developer tools and click on the tray icon. You’ll see “Apollo” and something like this:
Like the Redux and React developer tools, we will be using Apollo Client Developer Tools to write and test our queries and mutations. The extension comes with the GraphQL Playground.
Fetching Pets
Let’s add the functionality that fetches pets. Move over to client/src/client.js. We’ll be writing Apollo Client, linking it to an API, exporting it as a default client, and writing a new query.
Copy the following code and paste it in client.js:
import { ApolloClient } from 'apollo-client'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { HttpLink } from 'apollo-link-http'
const link = new HttpLink({ uri: 'https://localhost:4000/' })
const cache = new InMemoryCache()
const client = new ApolloClient({
link,
cache
})
export default client
Here’s an explanation of what is happening above:
ApolloClient
This will be the function that wraps our app and, thus, interfaces with the HTTP, caches the data, and updates the UI.
InMemoryCache
This is the normalized data store in Apollo Client that helps with manipulating the cache in our application.
HttpLink
This is a standard network interface for modifying the control flow of GraphQL requests and fetching GraphQL results. It acts as middleware, fetching results from the GraphQL server each time the link is fired. Plus, it’s a good substitute for other options, like Axios and window.fetch.
We declare a link variable that is assigned to an instance of HttpLink. It takes a uri property and a value to our server, which is https://localhost:4000/.
Next is a cache variable that holds the new instance of InMemoryCache.
The client variable also takes an instance of ApolloClient and wraps the link and cache.
Lastly, we export the client so that we can use it across the application.
Before we get to see this in action, we’ve got to make sure that our entire app is exposed to Apollo and that our app can receive data fetched from the server and that it can mutate that data.
To achieve this, let’s head over to client/src/index.js:
import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter } from 'react-router-dom'
import { ApolloProvider } from '@apollo/react-hooks'
import App from './components/App'
import client from './client'
import './index.css'
const Root = () => (
<BrowserRouter> <ApolloProvider client={client}>
<App />
</ApolloProvider> </BrowserRouter>
);
ReactDOM.render(<Root />, document.getElementById('app'))
if (module.hot) {
module.hot.accept()
}
As you’ll notice in the highlighted code, we’ve wrapped the App component in ApolloProvider and passed the client as a prop to the client. ApolloProvider is similar to React’s Context.Provider. It wraps your React app and places the client in context, which allows you to access it from anywhere in your component tree.
To fetch our pets from the server, we need to write queries that request the exact fields that we want. Head over to client/src/pages/Pets.js, and copy and paste the following code into it:
import React, {useState} from 'react'
import gql from 'graphql-tag'
import { useQuery, useMutation } from '@apollo/react-hooks'
import PetsList from '../components/PetsList'
import NewPetModal from '../components/NewPetModal'
import Loader from '../components/Loader'const GET_PETS = gql`
query getPets {
pets {
id
name
type
img
}
}
`;export default function Pets () {
const [modal, setModal] = useState(false) const { loading, error, data } = useQuery(GET_PETS);
if (loading) return <Loader />;
if (error) return <p>An error occured!</p>; const onSubmit = input => {
setModal(false)
}
if (modal) {
return <NewPetModal onSubmit={onSubmit} onCancel={() => setModal(false)} />
}
return (
<div className="page pets-page">
<section>
<div className="row betwee-xs middle-xs">
<div className="col-xs-10">
<h1>Pets</h1>
</div>
<div className="col-xs-2">
<button onClick={() => setModal(true)}>new pet</button>
</div>
</div>
</section>
<section> <PetsList pets={data.pets}/> </section>
</div>
)
}
With a few bits of code, we are able to fetch the pets from the server.
What Is gql?
It’s important to note that operations in GraphQL are generally JSON objects written with graphql-tag and with backticks.
Query operations
In order to fetch our pets from the server, we need to perform a query operation.
Because we’re making a query operation, we needed to specify the type of operation before naming it.
The name of our query is GET_PETS. It’s a naming convention of GraphQL to use camelCase for field names.
The name of our fields is pets. Hence, we specify the exact fields that we need from the server (id, name, type, img).
useQuery is a React hook that is the basis for executing queries in an Apollo application. To perform a query operation in our React component, we call the useQuery hook, which was initially imported from @apollo/react-hooks. Next, we pass it a GraphQL query string, which is GET_PETS in our case.
When our component renders, useQuery returns an object response from Apollo Client that contains loading, error, and data properties. Thus, they are destructured, so that we can use them to render the UI.
useQuery is awesome. We don’t have to include async-await. It’s already taken care of in the background. Pretty cool, isn’t it?
loading
This property helps us handle the loading state of the application. In our case, we return a Loader component while our application loads. By default, loading is false.
error
Just in case, we use this property to handle any error that might occur.
data
This contains our actual data from the server.
Lastly, in our PetsList component, we pass the pets props, with data.pets as an object value.
At this point, we have successfully queried our server.
To start our application, let’s run the following command:
Start the client app. Run the command npm run app in your CLI.
Start the server. Run the command npm run server in another CLI.
If all went well, you should see this:
Mutating Data
Mutating data or creating data in Apollo Client is almost the same as querying data, with very slight changes.
Still in client/src/pages/Pets.js, let’s copy and paste the highlighted code:
To create a mutation, we would take the following steps.
1. mutation
To create, update, or delete, we need to perform the mutation operation. The mutation operation has a CreateAPet name, with one argument. This argument has a $newPet variable, with a type of NewPetInput. The ! means that the operation is required; thus, GraphQL won’t execute the operation unless we pass a newPet variable whose type is NewPetInput.
2. addPet
The addPet function, which is inside the mutation operation, takes an argument of input and is set to our $newPet variable. The field sets specified in our addPet function must be equal to the field sets in our query. The field sets in our operation are:
id
name
type
img
3. useMutation
The useMutationReact hook is the primary API for executing mutations in an Apollo application. When we need to mutate data, we call useMutation in a React component and pass it a GraphQL string (in our case, NEW_PETS).
When our component renders useMutation, it returns a tuple (that is, an ordered set of data constituting a record) in an array that includes:
a mutate function that we can call at any time to execute the mutation;
an object with fields that represent the current status of the mutation’s execution.
The useMutation hook is passed a GraphQL mutation string (which is NEW_PETS in our case). We destructured the tuple, which is the function (createPet) that will mutate the data and the object field (newPets).
4. createPet
In our onSubmit function, shortly after the setModal state, we defined our createPet. This function takes a variable with an object property of a value set to { newPet: input }. The input represents the various input fields in our form (such as name, type, etc.).
With that done, the outcome should look like this:
If you observe the GIF closely, you’ll notice that our created pet doesn’t show up instantly, only when the page is refreshed. However, it has been updated on the server.
The big question is, why doesn’t our pet update instantly? Let’s find out in the next section.
Caching In Apollo Client
The reason our app doesn’t update automatically is that our newly created data doesn’t match the cache data in Apollo Client. So, there is a conflict as to what exactly it needs to be updated from the cache.
Simply put, if we perform a mutation that updates or deletes multiple entries (a node), then we are responsible for updating any queries referencing that node, so that it modifies our cached data to match the modifications that a mutation makes to our back-end data.
Keeping Cache In Sync
There are a few ways to keep our cache in sync each time we perform a mutation operation.
The first is by refetching matching queries after a mutation, using the refetchQueries object property (the simplest way).
Note:If we were to use this method, it would take an object property in our createPet function called refetchQueries, and it would contain an array of objects with a value of the query: refetchQueries: [{ query: GET_PETS }].
Because our focus in this section isn’t just to update our created pets in the UI, but to manipulate the cache, we won’t be using this method.
The second approach is to use the update function. In Apollo Client, there’s an update helper function that helps modify the cache data, so that it syncs with the modifications that a mutation makes to our back-end data. Using this function, we can read and write to the cache.
Updating The Cache
Copy the following highlighted code, and paste it in client/src/pages/Pets.js:
The first argument is the cache from Apollo Client.
The second is the exact mutation response from the server. We destructure the data property and set it to our mutation (addPet).
Next, to update the function, we need to check for what query needs to be updated (in our case, the GET_PETS query) and read the cache.
Secondly, we need to write to the query that was read, so that it knows we’re about to update it. We do so by passing an object that contains a query object property, with the value set to our query operation (GET_PETS), and a data property whose value is a pet object and that has an array of the addPet mutation and a copy of the pet’s data.
If you followed these steps carefully, you should see your pets update automatically as you create them. Let’s take a look at the changes:
Optimistic UI
A lot of people are big fans of loaders and spinners. There’s nothing wrong with using a loader; there are perfect use cases where a loader is the best option. I’ve written about loaders versus spinners and their best use cases.
Loaders and spinners indeed play an important role in UI and UX design, but the arrival of Optimistic UI has stolen the spotlight.
What Is Optimistic UI?
Optimistic UI is a convention that simulates the results of a mutation (created data) and updates the UI before receiving a response from the server. Once the response is received from the server, the optimistic result is thrown away and replaced with the actual result.
In the end, an optimistic UI is nothing more than a way to manage perceived performance and avoid loading states.
Apollo Client has a very interesting way of integrating the Optimistic UI. It gives us a simple hook that allows us to write to the local cache after mutation. Let’s see how it works!
Step 1
Head over to client/src/client.js, and add only the highlighted code.
import { ApolloClient } from 'apollo-client'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { HttpLink } from 'apollo-link-http'import { setContext } from 'apollo-link-context'
import { ApolloLink } from 'apollo-link'
const http = new HttpLink({ uri: "http://localhost:4000/" });
const delay = setContext(
request =>
new Promise((success, fail) => {
setTimeout(() => {
success()
}, 800)
})
)
const link = ApolloLink.from([
delay,
http
])const cache = new InMemoryCache()
const client = new ApolloClient({
link,
cache
})
export default client
The first step involves the following:
We import setContext from apollo-link-context. The setContext function takes a callback function and returns a promise whose setTimeout is set to 800ms, in order to create a delay when a mutation operation is performed.
The ApolloLink.from method ensures that the network activity that represents the link (our API) from HTTP is delayed.
Step 2
The next step is using the Optimistic UI hook. Slide back to client/src/pages/Pets.js, and add only the highlighted code below.
The optimisticResponse object is used if we want the UI to update immediately when we create a pet, instead of waiting for the server response.
The code snippets above include the following:
__typename is injected by Apollo into the query to fetch the type of the queried entities. Those types are used by Apollo Client to build the id property (which is a symbol) for caching purposes in apollo-cache. So, __typename is a valid property of the query response.
The mutation is set as the __typename of optimisticResponse.
Just as earlier defined, our mutation’s name is addPet, and the __typename is Pet.
Next are the fields of our mutation that we want the optimistic response to update:
id
Because we don’t know what the ID from the server will be, we made one up using Math.floor.
name
This value is set to input.name.
type
The type’s value is input.type.
img
Now, because our server generates images for us, we used a placeholder to mimic our image from the server.
This was indeed a long ride. If you got to the end, don’t hesitate to take a break from your chair with your cup of coffee.
Let’s take a look at our outcome. The supporting repository for this project is on GitHub. Clone and experiment with it.
Conclusion
The amazing features of Apollo Client, such as the Optimistic UI and pagination, make building client-side apps a reality.
While Apollo Client works very well with other frameworks, such as Vue.js and Angular, React developers have Apollo Client Hooks, and so they can’t help but enjoy building a great app.
In this article, we’ve only scratched the surface. Mastering Apollo Client demands constant practice. So, go ahead and clone the repository, add pagination, and play around with the other features it offers.
Please do share your feedback and experience in the comments section below. We can also discuss your progress on Twitter. Cheers!
As time passes, more and more businesses are turning towards technology to grow into successful companies. This has become an essential move in this modern technology-driven world.
This is the characteristic that helps a business to grow and sustain itself in the future. However, you must always remember that growing via technology is an immensely difficult and complicated task.
As per the Best Jobs in America report of 2018, by Glassdoor, being a DevOps engineer is the second-best technology-related job in the United States. Taking into consideration the demand for such a job and the skill-set required for it, this report is hardly surprising.
Top class enterprises like Amazon, Facebook, Walmart and Netflix are making use of DevOps so that they can ensure its users a consistent and rapid delivery of security updates. Along with all these large-scale businesses, even startup and medium-sized businesses are starting to make use of DevOps as well.
Businesses today have two main ways, in which they can make use of DevOps. One is spending money on in-house DevOps developers. The other option is to invest money in DevOps service providers. Each of these two methods has pros and cons of its own.
Before delving further into DevOps, let’s just get to know about what DevOps actually means.
What is DevOps?
In this extremely competitive age, DevOps plays the part of providing a particular company with an edge over all its other competitors. For instance, if you own an e-commerce company, You are clearly a part of the retail industry. However, just by adding technology into the mix, you can take your retail business to unprecedented levels.
According to a report by DZone, “The intention of DevOps is to create better-quality software more quickly and with more reliability while inviting greater communication and collaboration between teams.”
Role Recognition
According to Antao and other experts, there is no such thing as a DevOps team, but only an approach. In addition to that, there exists even lesser clarity around the topic of DevOps roles. It is therefore not surprising when DevOps is defined as “a thing that everybody wants but nobody wants to do.” – a comment made by the director of product marketing for source code management, Mark Warren.
According to the managing director of Accenture, Martin Croker, ‘figuring out the right DevOps roles is a journey, not a destination and a long journey at that.”
A client of PwC, which is a software company, has shifted its format of doing business, from delivering an on-premise product, to a drastically different one involving serving customers in the cloud. This very move has drastically affected almost every aspect of the company, starting from sales and marketing, all the way to HR and R&D. The biggest shift, however, took place in the technology department, which suddenly is required to deliver new features on a daily and weekly basis, rather than annually. To embrace this drastic change in operations, it welcomed DevOps.
According to Antao, “The business model changed drastically, and they suddenly had a great need for speed.” It needed to develop new skills both in the IT department and the operation teams to achieve immense velocity. Antao also says, “There were no answers readily available in year one. It’s a lot of trial and error to figure out what works and what doesn’t.”
All this information might be giving birth to a lot of questions in your head, the most significant of them being, what type of DevOps can actually prove to be helpful. There actually is an availability of a variety of tools, which you can choose from when the synergy of development and operations come into play.
For you to understand clearly about the functioning of DevOps, it is crucial that you are informed about a few DevOps must-dos for the success of development projects.
Crucial DevOps Must-Dos
Make technology Accessible Across all Departments
If you have an expert DevOps team at the core, you will automatically have the ability to implement the most advanced technology. On the flip side, if all the departments of your company do not have access to an equal level of technology, then there is a chance that your projects will not see success. This shows how crucial accessibility is.
Provided the fact that all the departments have access to technology, the projects turn out to be drastically efficient. This allows you to boost your productivity.
Tech development, however, is not just an external affair. It is also used to streamline internal business processes.
Track the Technology You Have Employed
Not all the technology that you have introduced into your business is going to function in the same manner. Unless every technology is in its place and you are able to track it, you will never get to know if one is working. Tracking the progress of a particular tech is an absolute must-do, as far as DevOps operations go.
For example, you can set up key metrics to assess the validity of a particular technology, introduced for a particular business function. If you see that the metrics are not on par with your project goals, then you can choose to modify or completely eliminate that particular technology from the process.
Make sure that Technology and DevOps is Part of Your Business Equation
Having a particular technology as being more prevalent in your business is a challenge of some kind, as many of your team members will not understand its value right away. There are a huge number of businesses, which fail due to a reason like this.
You must always strive to present technology in front of everybody, as a successful strategy that benefits everybody. You need to convince everybody that the employment of DevOps processes will prove beneficial for your business in the long run.
Scalable Development Tools Are Essential
This is extremely crucial for operating at an optimal level in a business. No matter how qualified members you have in your team, without a proper set of tools, they will not be able to operate.
DevOps Experts who actually understand the value of the correct set of tools can add immense amounts of value to various development processes like coding, portability, analysis and project management as well.
Conclusion
It is inherently challenging to find effective ways of remaining competitive in your industry. So the use of technology, to receive the edge that you need. The above blog about DevOps must-dos will enable you to successfully achieve this goal.
Do you dream of reaching millions of people around the world with your valuable compositions that you create combining musical notes or playing with a camera?
A WordPress podcast theme will pave your way if you want to entertain others with your offerings. A podcast is the most convenient and cost-effective option to create an audience base virtually anywhere in the world. It is not just useful for artists or trainers but also for business organizations.
A podcast makes a website more lively and catches users’ attention. If the podcast is able to hit a sensitive touchpoint, users’ attention gets arrested and it increases the chances of conversion. In this article, we will give you a list of the 10 most popular WordPress podcast themes of the year. Go through the list. Hope you will find at least one theme suitable for your needs.
The Podcast is a responsive multimedia WordPress theme. It helps you to build your own podcast, podcasting network, or radio station. It supports native audio and video players as well as oEmbed. With this, you can host your audio content on popular platforms like SoundCloud, PopBean, Spotify, etc. The theme is responsive and retina ready.
WP Cast is a fast-loading Audio podcast theme for WordPress. It has 16+ Shortcodes and 4+ archive designs. There are featured players, series manager, series card and page builder. The theme works well with Libsyn, Anchor.fm and Blubrry. It is Mailchimp ready. It is a page builder included theme. It is ideal for professional use.
Podcaster is a WordPress multimedia podcast theme. It is flexible and responsive. There are dark and light theme options, sticky header and colour palettes. You can easily upload your own logo and display galleries, slide show, or grid. The theme has a parallax scrolling feature for custom header images. It comes with many easy to customize theme options. It is user friendly and well documented.
Fastcast is a modern podcast theme for WordPress. It comes with minimal design and a responsive custom player. There are white and dark modes and fast and easy navigation. The theme supports Android, Itunes, Apple Podcast, Spotify Podcast RSS and XML. It is user friendly yet professional. It is fit for most of the recent WordPress plugins.
Soundbyte is a feature-rich WordPress theme for a podcast. It comes with drag & drop page builder, premium sliders, sticky header, mega menus and Photoshop files. It is a boosted element addon included theme. The theme has unlimited colour and font adjusting options. There are advanced contact forms. It is responsive, retina ready and well documented.
Megabyte is a responsive podcast theme for WordPress. It has an advanced drag & drop page builder, sticky header and mega menus. There are unlimited colours and font adjusting options. The theme has advanced contact forms, top-notch support and premium sport. It is a photoshop file included theme. It is user friendly. No technical skills required to use this.
Castpod is a responsive and retina ready WordPress theme for the podcast. It has an HTML5 audio player, transcripts and statistics. There are simple and clean codes. The theme is compatible with WP forms and MailChimp. There is an advanced and easy to use WordPress customizer. With this theme, you may import external podcasts and redo your website. It is speed optimized and well documented.
Castilo is a professional WordPress Audio Podcast theme. It comes with a one-click demo importer, theme customizer and social icon menu. There are custom colour and custom logo options. The theme has footer and sidebar widgets support. You can import external feed and generate RSS2 feed. Castilo is WooCommerce ready and speed optimized. It is compatible with Contact Form 7 and Mailchimp. It is a developer-friendly theme.
Rekord is a modern and multipurpose WordPress theme. It is most suitable for events and podcasts. It offers you readymade widgets, multiple skins and RTL support. The playlists are powered by wave surfers. Rekord is based on Bootstrap 4. It is a completely Ajaxily theme. It works well with most of the latest WordPress plugins. It is easily customizable and well documented.
Audonic is a flexible WordPress theme for the podcast and music. It supports native audio and video players and oEmbed. There are unlimited audio playlists, custom category header, hero slider and header site search. You can upload your logo, edit footer text, and choose between dark and light themes. You can also decide how many entries to display with a featured slider. The theme is ready to use and easy to customize.
Features:
Responsive layout
Easy customization
Music & podcast archive
Mobile friendly
Social media support
Price: $56
Conclusion
When you have a user-friendly podcast theme at your hand which is ideal for your purpose, reaching any corner of the world is a matter of only a few clicks. All the above-mentioned themes will let you realise your dreams within minutes after installation. You will be able to reach out to your audiences with your valuable offerings easily. Pick up the one best for you and proceed forward. People are waiting for you.
If you liked the article, please share it on Facebook and Twitter. Leave your feedback on the comment section. We would love to hear from you. If there is any query, please feel free to share it with us. We will try to get back to you as soon as possible.
like you would in Bulma, you would use a custom element, like .
The new Shoelace library uses the sl namespace for their components. It’s a whole pattern library entirely in Web Components. So the tabs there are elements.
Why is that good? Well, for one thing, it brings a component model to the party. That means, if you’re working on a component, it has a template and a stylesheet that are co-located. Peeking under the hood of Shoelace, you can see this is all based on Stencil.
Another reason it’s good is that it means components can (and they do) use the Shadow DOM. This offers a form of isolation that comes right from the web platform. For CSS folks like us, that means the styling for a tab in the tab component is done with a .tab class (hey, wow, cool) but it is isolated in that component. Even with that generic of a name, I can’t accidentally mess with some other component on the page that uses that generic class, nor is some other outside CSS going to mess with the guts here. The Shadow DOM is a sort of wall of safety that prevents styles from leaking out or seeping in.
I just saw the FAST framework¹ too, which is also a set of components. It has tabs that are defined as . That reminds me of another thing I like about the Web Components as a pattern library approach: if feels like it’s API-driven, even starting with the name of the component itself, which is literally what you use in the HTML. The attributes on that element can be entirely made up. It seems the emerging standard is that you don’t even have to data-* prefix the attributes that you also make up to control the component. So, if I were to make a tabs component, it might be .
Perhaps the biggest player using Web Components for a pattern library is Ionic. Their tabs are , and you can use them without involving any other framework (although they do support Angular, React, and Vue in addition to their own Stencil). Ionic has made lots of strides with this Web Components stuff, most recently supporting Shadow Parts. Here’s Brandy Carney explaining the encapsulation again:
Shadow DOM is useful for preventing styles from leaking out of components and unintentionally applying to other elements. For example, we assign a .button class to our ion-button component. If an Ionic Framework user were to set the class .button on one of their own elements, it would inherit the Ionic button styles in past versions of the framework. Since ion-button is now a Shadow Web Component, this is no longer a problem.
However, due to this encapsulation, styles aren’t able to bleed into inner elements of a Shadow component either. This means that if a Shadow component renders elements inside of its shadow tree, a user isn’t able to target the inner element with their CSS.
The encapsulation is a good thing, but indeed it does make styling “harder” (on purpose). There is an important CSS concept to know: CSS custom properties penetrate the Shadow DOM. However, it was decided — and I think rightly so — that “variablizing” every single thing in a design system is not a smart way forward. Instead, they give each bit of HTML inside the Shadow DOM a part, like
, which then gives gives the ability to “reach in from the outside” with CSS, like custom-component::part(icon) { }.
I think part-based styling hooks are mostly fine, and a smart way forward for pattern libraries like this, but I admit some part of it bugs me. The selectors don’t work how you’d expect. For example, you can’t conditionally select things. You also can’t select children or use the cascade. In other words, it’s just one-off, or like you’re reaching straight through a membrane with your hand. You can reach forward and either grab the thing or not, but you can’t do anything else at all.
Speaking of things that bug people, Andrea Giammarchi has a good point about the recent state of Web Components:
Every single library getting started, including mine, suggest we should import the library in order to define what [sic] supposed to be a “portable Custom Element”.
Google always suggests LitElement. Microsoft wants you to use FASTElement. Stencil has their own Component. hyperHTML has their own Component. Nobody is just using “raw” Web Components. It’s weird! What strikes me as the worst part about that is that Web Components are supposed to be this “native platform” thing meaning that we shouldn’t need to buy into some particular technology in order to use them. When we do, we’re just as locked to that as we would be if we just used React or whatever.
Andrea has some ideas in that article, including the use of some new and smaller library. I think what I’d like to see is a pattern library that just doesn’t use any library at all.
FAST calls itself a “interface system,” then a “UI framework” in consecutive sentences on the homepage. Shoelaces calls itself a “library” but I’m calling it a “pattern library.” I find “design system” to be the most commonly used term to describe the concept, but often used more broadly than a specific technology. FAST uses that term in the code itself for the wrapper element that controls the theme. I’d say the terminology around all this stuff is far from settled.
Tired of implementing growth hacking strategies? In this post, I will share a strategy that will help you reach out to important prospects and stakeholders of companies you want to target.
Let’s say your company has built a product (or provides services) for large enterprises and corporations. You want to get in touch with the decision-makers or key stakeholders of the prospects.
To your surprise, you found that they are not active on Linkedin and still haven’t accepted your connection request. You found their email address and sent them an email. Your email still lies unopened in their inbox (or spam folder) alongside thousands of emails.
Even account-based marketing is not working for you because you need to reach out to key stakeholders or decision-makers.
You really really want to get in touch with them at any cost.
What will you do? The answer is simple. You will leverage the power of contact marketing.
What is Contact Marketing?
It is a shadow-form of marketing that delivers promising results compared to account-based marketing and has been generating results most marketers dream of. It is one of the thoughtful lead generation strategies of 2020. The strategy helps sales teams connect with VIP prospects, key stakeholders, and decision-makers to build the right kinds of relationships with them.
VIP prospects don’t hang out on LinkedIn or other social media platforms, and their inbox is probably managed by their assistants, you cannot directly call them on their cell phone. But, you want to get your message across! You want to sell to large organizations and corporations. You think you at least deserve a chance to speak to the decision-makers after having built something useful for them.
In short, contact marketing is the act of launching micro-focused campaigns with an aim to get in touch with specific people of strategic importance (against all odds) for a sale, partnership, or just to build a relationship. All digital means to get in touch with your VIP prospects are blocked. But there’s one way – the offline channel. No, you don’t have to go to their office.
Contact Marketing Strategy
There are no hard-and-fast rules when it comes to creating and executing strategies for contact marketing. All you need to do is send a parcel (which could be in the form of a letter or a big box) to your prospect and figure out a way so that the parcel reaches them.
The gatekeepers or the front desk workers do not share across all parcels with the concerned – that’s where you need to think creatively. Your first goal is to get past the gatekeepers. To do so, before sending your parcel, call them up, and ask them to verify the address. Tell them they can expect a parcel from you soon. Another strategy could be to write “CONFIDENTIAL” or “ONLY FOR PROSPECT’S NAME” on the parcel.
Sending the parcel and making sure it gets delivered to your prospect is just half the job done. You need to have a strategy in place for the rest of your plan – what will be the contents of the parcel, what will be the call to action, and more. Most importantly, you need to communicate effectively.
Examples of Contact Marketing
There are countless examples of contact marketing. You must figure out the one which is good for your business. Here are a few examples of contact marketing:
Magnifying Glass Strategy
This strategy is effective if you’re a digital marketing agency or an SEO agency that wants to reach out to mid-sized and large companies. In your package, send them a magnifying glass and a short letter mentioning something like: “Even if they use a magnifying glass, they still won’t be able to find you on the first page of Google”. End the note by requesting them to connect with you or your firm.
Research Strategy
Go through the website and blog articles of your prospect or one of their recently published interviews. Take a print out of the article or the web page and highlight important points. Send them a letter along with the printout mentioning how you or your firm can help regarding the highlighted points. To keep a track of news regarding your prospect companies, use Google Alerts.
Video Strategy
Record a video focusing on how you can help your prospect. Publish your video on YouTube and make sure the video can only be seen by those who have the link. Shorten the URL using bit.ly or other link shortening services. Now, send them a letter mentioning that you have made a video for them. Include a screenshot of the video with your face in it. Mention the shortened link in your letter and patiently wait for your prospect to contact you.
Resource Strategy
Send your prospect a book or a print of a whitepaper or an article that will be useful for your prospect. Attach a letter mentioning the usefulness of the resource and how you can help in solving their problems taking reference to the resource you sent. Make sure to use storytelling elements that work.
Sherlock Holmes Strategy
This is one of my favorite techniques. Create a Q.R. code online and encrypt your message in it. Take a print of the code, put it in an envelope along with a note mentioning that the Q.R. code needs to be scanned. Send them the envelope. Make them feel like Sherlock Holmes for a while.
When to use this approach?
Use this approach anytime you want. It is not an alternative to the digital approach. However, better use this approach when:
Your prospects aren’t tech-savvy or digital-savvy
Your prospects are hard to reach (VIP’s, CXO’s, etc)
You want to target a handful of people who can change the scale of business
You are in a market/industry which is inundated with digital marketing
Conclusion
When digital channels fail in connecting with important prospects and stakeholders, employ contact marketing. Be creative and patiently wait for them to contact you. Build your own strategy or simply use one of the above-mentioned strategies. Contact marketing is a powerful tool that you can use to engage with people that are hard to reach. Try it out – it works like a charm!