Noutați

Extend TMS WEB Core with JS Libraries with Andrew: introduction

  Welcome to the first post in a new series for the TMS Blog, “Extend TMS WEB Core with JS Libraries with Andrew “.  In this ongoing series we’ll look at how to quickly and easily incorporate third-party JavaScript libraries into TMS WEB Core projects.  Each week will typically focus on a particular JS library and the problem it is trying to solve.  A sample project will be included to showcase some of its key features and how they can be integrated into TMS WEB Core. And some additional commentary will offer insight as to what it is like to work with the particular JS library as most of those to be featured in this series are used regularly in my own projects. For those new to TMS WEB Core or new to JavaScript, we’ll spend the rest of this first post covering a lot of the basics of what this is all about.   So. Many. JS Libraries. It is quite possible to develop fantastic 100% pure JavaScript/HTML/CSS web applications using just TMS WEB Core and the included components, just as you would expect with any other popular web frameworks. When it comes to extending a project with additional functionality beyond the included components, you’ve got options. You can of course write code yourself. You can use components from vendors like TMS Software and others that are specifically designed for TMS WEB Core.  Or you can tap into the huge reservoir of both open source and commercial JavaScript libraries.  On GitHub for example there at least several thousand such JS libraries covering everything from the simplest little CSS tweaks to hugely complex and involved APIs for machine learning.  If you’ve run into a problem developing your web application and need a bit of functionality that just isn’t there, there’s a pretty good chance someone has come along and made a JS library to address it.  Here’s a bit of an idea about the categories of JS Libraries that are available. Helpers.  Provide developers with shortcuts for common tasks.  JQuery and Bootstrap fall in this category. Assets.  Icons, fonts, themes and so on that are likely to make a big impact on the look and feel of your web application.  FontAwesome is an example.   Bootstrap comes with icons as well. Controls.  Interactive UI elements that provide functionality roughly equivalent to what a Delphi component might offer.  There are countless date/time pickers, for example FlatPickr. Tools.  Similar to Helpers, these are used to extend or otherwise enhance the components core controls that you are already using.  Interact.js adds drag+resize functionality to any control, for example. Services.  These include libraries for connecting to external services or communications, and libraries that help with sending e-mail and SMS messages, that sort of thing. Devices.  Typically these are APIs that allow for interacting with local devices or other hardware. Anything to do with Raspberry Pi, for example, would fall into this category. In this series we’re going to start out by focusing on those JS libraries that can help us craft better looking and easier to use web applications, so typically the first four categories. While the last two categories, Services and Devices, are hugely popular and important, they’re also very specific in nature.  Coverage of these would likely be far less about JS and TMS […]

Read More

The Next Big Thing in Native Windows Development

What, precisely, do we mean by native app development? What is a native user experience or native developer experience? What are the pros of native app development? Why has Native Windows development come storming back on center stage and become such a hot topic? We want to briefly talk about native app development and explain why you should get in with the In Crowd. What is a native app? Native applications are not only defined by the look and feel or fonts. Yes, if you follow these UI guidelines, it looks great and smooth. But if your app is running on Windows, it should behave like other native Windows applications, and if it is another platform, for example Android, it should behave like Android apps. The app needs to look visually cultivated it also needs to keep up with the users’ expectations of how it should behave and contain certain core functionality. It is a problem if it does not behave like the other apps, doesn’t comply with widely established system behaviors, or does not give the performance they need. Native apps are not just about look and feel, they need to be an all-round, first-class good citizen of the operating system environment.  Native user interface controls achieve compliance and help meet the users’ expectations because they follow the system and behave as it should be, largely by allowing the operating system to enable their functionality with minimal additional code on top. For instance, in our case, standard Win32 UI controls, like how they react to clicks and animations and how the shadows and fonts behave when there is a window resizing. We need this because users have subconscious anticipations – “muscle memory” – from the application. If it resizes and animates differently, you risk losing a star in an online review or, perhaps worse, having your application uninstalled and your reputation permanently dented which in turns creates a barrier to the adoption and success of any future applications you might develop. What other benefits are there to using native components in our applications? Now let’s see another side of native applications. Except for these UI/UX, native applications also utilize system functions and hardware technologies present on the target system or device. Native applications can access this hardware directly, which gives much higher performance than apps which use layers of abstraction and support code to achieve similar but inferior functionality. To really create native applications for Windows, your selected development tool should allow you to utilize the system-defined UI controls and libraries. For instance, Delphi with the Visual Component Library (VCL) is the easiest and most stable platform with maximum native power for Windows desktop app development. What is native app development? Now you know the meaning and benefits of native applications. The development process of native applications starts with selecting the proper framework or library. More than two decades ago, there was not much abstraction, variety, or choice of code libraries because the standard operating system APIs were basic and easy to work with them directly. This is no longer the case. Currently, we have Visual Component Library, FireMonkey, Universal Windows Platform, Window Forms, and others. These frameworks and libraries are handy because they have implemented layers of abstraction but making the right choice means picking ones which have a light touch without […]

Read More

An Introduction To A JavaScript Web Framework

JavaScript is a universal language that supports event-driven, functional, and imperative programming. Its versatility makes it useful on both the server and client-side of the application. As a result, it has a considerable market share, and it is often regarded as the language of the web. Developers initially used it only for client-side applications, but nowadays, it can be utilized on the server-side as well. Software frameworks are essentially an abstraction layer over the language to provide generic functionality while giving developers room to customize based on their requirements. Moreover, developers often prefer frameworks due to their adaptability. With the help of frameworks, developers can create responsive applications with minimal effort. The framework ensures uniform styling throughout the website. This article will expand on how Sencha can help you achieve more as a developer with JavaScript web framework and many other useful tools. What is Sencha? Sencha is a complete JavaScript-based ecosystem comprised of the JavaScript web framework and different tools that ease cross-platform web and mobile application development. The JavaScript framework contains over 140 high-quality and well-optimized components. As a result, Sencha helps you create high-performing, interactive, and visually appealing designs for your application. What Does Sencha Have to Offer? Here are some of the services and features Sencha provides: Does it have Lifecycle Management Tools? Sencha comes with Sencha cmd tools that provide lifecycle management libraries. You can use Sencha Cmd to optimize code and build applications. It provides scaffolding, code minification, production build generation, and other basic development functionality. Using modern web technologies, Sencha cmd tools allow you to create a near-native app experience. The package management system also comes with Sencha cmd. It helps you share the framework code and packages across multiple applications. The code generation can scaffold whole applications and broaden those applications with new MVC or MVVM parts. Sencha Cmd also provides a lightweight webserver to serve files from localhost if no hosting service is available. A powerful logging highlight also facilitates investigation. Can it Accelerate Application Development? Sencha Architect is a visual application builder that helps you create Ext JS applications in an intuitive environment. You can easily use each Ext JS part in your application. Sencha Architect also allows you to see what your clients will see as you build your application. It saves design time by eliminating the need to type most standard code. Boilerplate speeds up the development of both desktop and mobile applications. This is because adjusting Ext JS UI part properties and designs in a WYSIWYG window limits human errors common to manual coding. In addition, Sencha Architect comes with a wide range of customizable components such as D3, Calendar, Pivot Grids, and Exporter for modern and classic toolkits. Even if nothing fits your design, we still have you covered. That is because, with Sencha Architect, you can design custom components and even build your framework extensions. You can also choose from our massive library of extensions. Then there is Sencha Themer. Themer is the Sencha application theming tool. You can create and import themes from Themer into your application using Architect. You can also alter the themes you have imported inside the application to match your design theme. Who is using Sench Ext JS? One customer is Icube. They are an industrial digitization company in Switzerland, […]

Read More

The Ultimate Cheat Sheet On Windows 10 App Development

Today is an exciting and dynamic time to be a developer. Technology advances seem to have accelerated and, with this, our software projects seem to paradoxically expand and shrink simultaneously. They expand because more devices and environments are becoming available to them. They shrink because we tend to use the same tools for developing all variants of our work. Past developers could have a single-minded focus on a particular environment or toolset. In contrast, today’s developers have to consider so many things before starting their Windows 10 App Development journey. So, let us discuss some of the crucial points along that voyage of development. What is the history of your IDE/Framework? Knowing about history is important because historical mistakes, missteps, and abject failures might repeat themselves. As a developer, we invest a lot of resources, both physical and emotional, in a project. If fundamental tools like programming language, IDE, or frameworks drastically change overnight, we must rebuild, almost from scratch, wasting almost all our investment. This repeated rebuilding can – and mostly likely will – increase costs for our clients too, and they won’t be happy either. Delphi has a great history in this regard. Upgrading older projects to newer ones is so straightforward that we can do it in no time. In less than a week, in my work, we recently upgraded a 2003 Windows (VCL) version project to 2022 multiplatform (FMX) project. Our customer was happy and surprised too. Unfortunately, most other tools do not follow the same policy, resulting a tragic graveyard of abandoned projects. If this is growth, then what is a disaster? It is wise to search for the backward compatibility history of a tool before devoting yourself to it. What sort of longevity does the tool provide? What stability does it give when moving from one version of the tool to another in terms of compatibility? It’s important to ask these questions, because if a company abandoned backward compatibility in the past, it would also happen with you in the future, and then it will be too late. Also, if your IDE has no history, ask yourself, is it wise to invest in it heavily? Nobody wants to be the pathfinder, the early adopter who is sacrificed to ensure those who come along later benefit from their trials and tribulations. Why does compilation speed matter? A finished software project is a compilation of hundreds or thousands of iterations of build, test, debug cycles. Pascal, in general, and Delphi, in particular, are famous for high-speed compilation. The specific structure of a Pascal program and multilevel optimizations applied by Delphi gives RAD studio an extreme edge in compilation speed and executable production process. For example, in one typical test, Delphi compiled one million lines of code in under 5 seconds. This super-fast compilation speed can be your friend in hard times of late-night iterative debugging and the seemingly common deadline congestions of a product release date. How to distinguish between Low-Code hype and the real thing? Like all new jargon, many companies misuse NoCode/LowCode words in the software industry. Fortunately, it is easy to distinguish between real and over-hyped tools. Every tool geared toward novice users and non-programmers is a lousy option. Ultimately, you have to write code to push things to their limits or customize […]

Read More

Everything You Need To Use AWS SES Natively In Your Apps

Email seems so old now when considering all the messaging options available. It is old, 50+ years old! It’s been the lifeblood of many business processes and is still as important today as it ever was. AWS has a plethora of great services, but they can be a little challenging for Windows app development. With that in mind, the next release of Appercept AWS SDK for Delphi 11.0 includes support for Amazon Simple Email Service (SES). Amazon SES is a reliable, scalable, and cost-effective email service and can be used for marketing campaigns, notifying users, or transactional emails. Let’s see how we can send a simple email… program SendEmail; {$APPTYPE CONSOLE} implementation uses AWS.SESV2; var Client: ISESV2Client; Destination: ISESV2Destination; EmailMessage: ISESV2Message; Request: ISESV2SendEmailRequest; Response: ISESV2SendEmailResponse; begin Destination := TSESV2Destination.Create; Destination.AddToAddress(‘world@example.com’); EmailMessage := TSESV2Message.Create(‘Announcing…’); EmailMessage.Body.Text := ‘Hello, World!’; Request := TSESV2SendEmailRequest.Create; Request.FromEmailAddress := ‘sender@example.com’; Request.Destination := Destination; Request.Content.Simple := EmailMessage; Client := TSESV2Client.Create; Client.SendEmail(Request); end. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 program SendEmail;   {$APPTYPE CONSOLE}   implementation   uses   AWS.SESV2;   var   Client: ISESV2Client;   Destination: ISESV2Destination;   EmailMessage: ISESV2Message;   Request: ISESV2SendEmailRequest;   Response: ISESV2SendEmailResponse;   begin   Destination := TSESV2Destination.Create;     EmailMessage := TSESV2Message.Create(‘Announcing…’);   EmailMessage.Body.Text := ‘Hello, World!’;     Request := TSESV2SendEmailRequest.Create;   Request.Destination := Destination;   Request.Content.Simple := EmailMessage;     Client := TSESV2Client.Create;   Client.SendEmail(Request); end. This is just the start. Why not start your next email marketing campaign with Amazon SES with tools written in Delphi? Or, seamlessly integrate email into your existing business applications built in Delphi? Appercept AWS SDK for Delphi is available exclusively with active Enterprise or Architect subscriptions for Embarcadero Delphi or RAD Studio. You can install the SDK through the GetIt Package Manager within Delphi or RAD Studio if you have an active subscription.

Read More

Data analytics & chart visualization in Delphi

Google Analytics helps to identify user browsing behavior. It is a powerful tool to analyze & monitor data and eventually adapt the content on your website to make sure users have a better experience. The purpose of this blog post is to capture realtime page visits on your website, analyze which browser is used and visualize it in a pie chart. The component capable of doing this is the TTMSFNCChart. At the end of this blog post, a sample is provided which allows you to see the code to retrieve the data from Google Analytics and how to configure the chart to display the results. Note that this sample also makes use of the component TTMSFNCCloudGoogleAnalytics which is part of the TMS FNC Cloud Pack. Retrieving the data After setting up Google Analytics, and setting up a connection via the TTMSFNCCloudGoogleAnalytics component, we call RetrieveData which asynchronously retrieves the data we are looking for. The code to properly setup the required data fields depends on a series of request parameters which are shown in the code snippet below. procedure TGoogleAnalyticsForm.GetReportData; begin … TMSFNCCloudGoogleAnalytics1.RequestData.UserMetrics := UM; TMSFNCCloudGoogleAnalytics1.RequestData.PageMetrics:= PM; TMSFNCCloudGoogleAnalytics1.RequestData.PlatformOrDeviceDimension := DM; TMSFNCCloudGoogleAnalytics1.RequestData.SystemDimension := SM; TMSFNCCloudGoogleAnalytics1.RequestData.PageDimension := PGM; TMSFNCCloudGoogleAnalytics1.RequestData.TimeDimension := TM; TMSFNCCloudGoogleAnalytics1.RetrieveData(StartDate, EndDate, MaxResults); end; Executing this request will display results in a VCL TStringGrid. Note that we can see the amount of time the user spends on each page and which browser and resolution is used. This is realtime data! Visualizing browser usage Whilst the grid shows the data after retrieval, it doesn’t give an easy visual interpretation. You need to look carefully which browser is used, which page is visited, etc .. whilst scrolling through the grid. This is where TMS FNC Chart comes into play. Dropping an instance of TTMSFNCChart on the form immediately gives an idea of its capabilities. For this particular sample, we will configure a pie chart, which is ideal for displaying percentage numbers. We start by analyzing the browser column inside the grid, and count the duplicate entries. d := TDictionary.Create; … for I := 1 to sgReport.RowCount – 1 do begin b := sgReport.Cells[6, I]; if d.ContainsKey(b) then d[b] := d[b] + 1 else d.Add(b, 1); end; … Then, once we collected the data inside the dictionary, we can start configuring the TTMSFNCChart instance. Step 1 is to clear the default series, add a new series and set the correct type. var p: TTMSFNCChartSerie; … TMSFNCChart1.BeginUpdate; TMSFNCChart1.Clear; p := TMSFNCChart1.Series.Add; p.ChartType := ctPie; TMSFNCChart1.EndUpdate; … Step 2 is to add points to the pie series. This is done by looping through the dictionary keys, which actually represent the browser, and retrieve the total value. Adding points in the chart is done with one of the multiple overloads, depending on the chosen type. For a pie chart, we use one of the AddPoint overloads, specifically to pass a value, color and a legend text. for k in d.Keys do begin if d.TryGetValue(k, v) then begin c := gcRed; if ci < Length(ca) then c := ca[ci]; p.AddPoint(v, c, Format(k + ' %.1f %%', [v / t * 100])); Inc(ci); end; end; The default look and feel of the pie chart is sufficient for displaying the results, but we also want to visualize the actual values in a separate legend. In TMS FNC Chart each visual element is fully customizable, via […]

Read More

View From The Tap – Bulgarian Firm Supports Country’s Market Leaders With Delphi And InterBase (Case Study)

Using InterBase and Delphi, Bulgarian software company Bonev Soft (BSoft) has made financial management and tax payments painless for the country’s industry leaders for over 20 years. BSoft’s flagship software, AJUR®, is an integrated management system for Windows very popular with government and non-government organizations in Bulgaria and around the world, across a number of vertical industries – from manufacturing and financial services through to power generation. More than 5,000 BSoft customers use AJUR to provide financial reports to tax authorities and various other stakeholders, and closely manage their supply chains. Among them are many of Bulgaria’s industry leaders. The View From The Tap Case Study explores how BSoft solved its scaling and efficiency challenges using a highly effective combination of Delphi and InterBase. Read The Case Study

Read More

Are You Getting The Most Out Of Your Windows App Development?

Windows 11 marks a visual evolution of the Windows operating system. As Windows moves forward, customers set a higher bar for desktop applications and massive demand for Windows app development. These customer expectations can be: Good performance on the low-cost app Native app user experience Complete matching with the latest design principles Support for modern window features like window snaps Support for shell integration or other native features support Easy to distribute on Microsoft Store Easy access to Windows App SDK or any other native libraries Great applications always meet these requirements.  Embarcadero Delphi Are you taking the right steps to build visually appealing modern Windows 11 Apps? While there are dozens of different technologies to build Windows applications, only a few of them offers all these capabilities built-in. For instance, Microsoft offers tools to make modern Windows apps with all the recent updates and features. But there is one more leading technology that has been thriving in Windows desktop development for more than 27 years now by providing the latest and freshest features and a unique graphical user interface development platform. It is Embarcadero Delphi! Since the beginning of Delphi with its Visual Component Library, it has been thriving in the Windows desktop app development industry. It offers hundreds of visual and non-visual components to build apps 5x or 10x faster than other GUI development tools. Delphi Cross-Platform Native App Development Are you using the latest Common Controls for Windows app development? Windows 11 brings beautiful UI innovations. By using new standard controls, you get the benefits of compatibility and accessibility for free. With Delphi and Visual Component Library, you can efficiently utilize modern controls. There are dozens of styles to quickly turn your futuristic UI to Windows 11 UI or even something unique. 2D & 3D Game Development with Delphi Why should you select Delphi for Windows app development? Delphi and its RAD Studio IDE profoundly improve developer productivity and product time-to-market. Not only that, developing one codebase to reach every desktop and mobile platform streamlines successive escapes and product maintenance. Delphi with Visual Component Library and FireMonkey framework gives you the best environment to quickly build any application, not only for Windows app development but also for cross-platform to Macs, iPhones, iPads, Linux computers and more.  WPF with the .NET framework offers small teams native entry to Windows applications and solid IDE but struggles to match Delphi’s productivity, IP security, and performance. Also, when you compare Electron, it gives a free alternative to Delphi and WPF and cross-platform capability like Delphi. Still, when it comes to productivity and security, it misses Delphi. Find out which is the best technology for Desktop Platform Moreover, according to that research paper, Delphi’s build time is better than Electron and WPF .NET for database connectivity. Besides, there is a clear indication that Delphi’s FireDAC database engine and network tools abstract layers of operations better than NodeJS, reducing developer effort and opportunities for error. Figure 2 – Delphi, WPF, and Electron comparison Are you using the best UI framework for Windows 11 Development? Compared to Microsoft’s technology stack, like C# WPF, or UWP, going with Delphi FireMonkey is one of the most reliable ones. It is not that they are unreliable, but they have a different approach to building the blocks and […]

Read More

Upcoming free webinar: Getting started with TMS FNC Maps

Did you know that on April 22, we celebrate the 2nd birthday of TMS FNC Maps? In full first COVID19 lockdown, we successfully launched TMS FNC Maps v1.0 after many man-months of development work. It is since its launch, a product that is unmatched in flexibility and features. TMS FNC Maps works fine for your VCL Windows applications, your FireMonkey Windows, macOS, iOS, Android and Linux applications, your TMS WEB Core web client applications, your Lazarus applications… You can use TMS FNC Maps from 4 IDEs: Delphi, C++Builder, Lazarus and Visual Studio Code. And with a single property switch, you select between Google Maps, Bing Maps, Here Maps, OpenLayers, Azure Maps, MapBox, Apple MapKit, TomTom maps.   In the past 2 years, we released non-stop a wave of new versions offering new features, improved performance and more flexibility.  Free webinar If you haven’t discovered our powerful TMS FNC Maps product yet, here is your chance to participate in our upcoming free webinar “Getting started with TMS FNC Maps“. On the agenda of this upcoming webinar on Apr 13 at 3PM UTC (17h00 CEST) we have: Why TMS FNC Maps: why did we create this product Introduction to included components, services, supported frameworks and IDEs and architecture Basic mapping techniques: location, bounds, pan, zoom, controls, views Working with markers: add markers, marker properties and custom markers Graphics on maps: circles, rectangles, polylines, polygons, HTML elements on maps + helper functions Geolocation & reverse geolocation: services, sync and async handling Directions: get directions with optional waypoints Overview of other advanced features Register for our free live interactive webinar on TMS Web Academy now! Read more Meanwhile, you can already prepare for the webinar and read all about TMS FNC Maps: TMS FNC Maps Hands-on video v1.0 TMS FNC Maps book availability Release v1.1 : Directions, Google Maps marker clusters Release v1.2 : Elevation, GPX import/expert, custom tile servers in OpenLayers Tile Layers support, Plus Codes, GPX export Release v1.3 : Google streetview support, toll roads settings  Release v1.4 : Apple MapKit support, integrated directions, map rotation Release v1.5 : static map image, toll cost calculation, timezone information Helper functions: distance calculation and working with Plus Codes Google heat maps Release v2.0 : route calculator & route editing, geodesic polylines Release v2.1 : Using overlay views Free geocoding & reverse geocoding with OpenStreetMap Nomatim Free route directions with OpenRouteService Release v2.4 : Google Places, address autocompletion & polyline symbols Directions and geocoding with GeoApify Add custom controls to your map with TMS FNC Maps for Delphi Calculate square meters of an area Detect if a point is in a coordinate based polygon in Delphi  Register now & participate We look forward to meet you online in our live webinar “Getting started with TMS FNC Maps” on April 13 at 3PM UTC (17h00 CEST). Learn about TMS FNC Maps and have all your questions answered during the webinar! Register here

Read More

Angular Material Components: They’re Not As Difficult As You Think

Today, many people use Angular to develop their web applications. This is because Angular is a prominent JavaScript framework that takes a component-based web application design and development approach. Angular material components offer an interactive user interface creation experience. But Angular has one downside. It has no pre-built components — developers either build them from scratch or get them from the community.  There are, however, several Angular Material component libraries to solve this problem. For example, Sencha ExtAngular provides 140+ pre-built UI components to help developers build high-performing web applications. It also offers several tools that make a programmer’s life easier. So, if you want to build high-performing web and mobile UIs using Ext Js Angular material components, then it is not as difficult as you think. Keep reading to find out why it is not complicated. What Angular Material Components Can You Use?  ExtAngular provides more than 140 pre-built UI components. You can use Grid components to load millions of data points, perform data manipulation like sorting and grouping, and include robust analytics in your application. There are also Layout components that you can use to configure the sizing and positioning of all your components. Finally, you can use charts to add visual representations to your data. How do You Use ExtAngular Generator to Create New Angular Material Components?  To make getting started easy, Ext Js includes the ExtAngular Generator to kick start new ExtAngular projects. To use it, you need to have Node and NPM installed. Once you have done that, access the Sencha NPM repository and install App Generator ‘ext-angular-gen’ command. Then, the ‘ext-angular-gen’ command creates an ExtAngular application form. From there you can start developing. Since the generated application uses the webpack-dev-server to auto-reload the changes, the changes you make to your source code are immediately visible in the browser. There are many benefits to using the ExtAngular generator.  It will make your life easier with best practices and tools that make you more productive. How Do You Package and Optimize Your Application?  After you have completed your development tasks, optimizing and packaging the application is easy if you have the right packaging module. A webpack module is a way to bundle static modules for Angular applications. They enable developers to bundle their dynamic applications into a package of static files you can deploy to the server. ExtJs offers the ExtAngular Webpack Plugin to bundle and optimize the ExtAngular material components of an Angular web application. To be most efficient, use Webpack 4+ to build your ExtAngular application. To make it even easier, the plugin works with Sencha Cmd.  How does ExtAngular TypeScript Definitions Help Your Development? Automatic code completion will help you reduce development time and be more productive. ExtAngular TypeScript definitions provide code completion functionality in several code editors, including Visual Studio Code. Using typescript definitions, developers can also avoid the usual code errors. From these definitions, developers can quickly identify imports and exports, variable and function types, create tests for the code, and much more. How Do You Easily Add Themes to Your Components? No web application with Angular material components is complete without themes. With ExtAngular, you can always use the existing default themes. However, you can also develop your own themes or add a standardized theme to maintain consistency across your company’s […]

Read More