<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JWP</title>
    <description>The latest articles on DEV Community by JWP (@jwp).</description>
    <link>https://dev.to/jwp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F203854%2F8ab5c636-e11e-4af3-9014-5acd5b6e76e8.png</url>
      <title>DEV Community: JWP</title>
      <link>https://dev.to/jwp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jwp"/>
    <language>en</language>
    <item>
      <title>Cielo Vista Software Update</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Tue, 29 Jul 2025 22:06:42 +0000</pubDate>
      <link>https://dev.to/jwp/cielo-vista-software-update-2pe7</link>
      <guid>https://dev.to/jwp/cielo-vista-software-update-2pe7</guid>
      <description>&lt;p&gt;&lt;strong&gt;How we built enterprise-grade, reusable components with zero build process and bulletproof error handling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;By John Peters, Lead Developer at Cielo Vista Software • Published July 29, 2025&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I'm excited to share a major milestone in our development journey at Cielo Vista Software. After months of intensive development, we've successfully completed Phase 1 of our advanced web component system—and the results are game-changing.&lt;/p&gt;

&lt;p&gt;This isn't just another component library. We've built something fundamentally different: a robust, production-ready system that requires absolutely no build process while delivering enterprise-level reliability and performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 What We Delivered
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Achievement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Components Shipped&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 Production-Ready Modules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zero-Build System&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standards Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100% Web Standards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise-Grade&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our component suite includes:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Team Member Cards&lt;/strong&gt; - Professional staff profiles with responsive image handling  &lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Service Cards&lt;/strong&gt; - Interactive service presentations with expandable details  &lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Testimonial Cards&lt;/strong&gt; - Client feedback display with rating systems  &lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Contact Information&lt;/strong&gt; - Smart-linking contact modules  &lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Core Infrastructure&lt;/strong&gt; - Advanced component registry with dependency management&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;The Game Changer&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;"The foundation is solid, components are production-ready, and the system is prepared for scalable expansion. No build process required."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🔧 Technical Excellence
&lt;/h2&gt;

&lt;p&gt;What makes this system special? It's all about the architecture decisions we made:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shadow DOM Encapsulation:&lt;/strong&gt; Every component is completely isolated, eliminating styling conflicts while maintaining optimal performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Progressive Enhancement:&lt;/strong&gt; Components gracefully degrade when JavaScript fails, ensuring your content is always accessible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-Discovery System:&lt;/strong&gt; Components automatically register themselves and handle dependencies—no manual configuration required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bulletproof Error Handling:&lt;/strong&gt; Comprehensive fallback mechanisms mean your site keeps working even when individual components fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Real-World Impact
&lt;/h2&gt;

&lt;p&gt;The results from our integration testing speak volumes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optimal rendering across all deployment environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WCAG 2.1 AA compliance achieved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graceful degradation in all failure scenarios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Developer Experience&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple attribute-based configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🎨 Why This Matters
&lt;/h2&gt;

&lt;p&gt;For too long, web components have been either overly complex or insufficiently robust for enterprise use. We've solved both problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Developers:&lt;/strong&gt; No build process, no compilation, no complex toolchains. Just drop components into your HTML and they work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Businesses:&lt;/strong&gt; Faster development cycles, reduced maintenance overhead, and bulletproof reliability for mission-critical applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Users:&lt;/strong&gt; Lightning-fast loading, perfect accessibility, and experiences that work everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What's Next?
&lt;/h2&gt;

&lt;p&gt;Phase 2 development is already underway with 5 additional components in the pipeline, plus analytics integration and A/B testing frameworks.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want to learn more about our component system? Visit Cielo Vista Software or connect with me to discuss how these solutions can transform your development workflow.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Best Way to Fly</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Sun, 16 Mar 2025 14:48:49 +0000</pubDate>
      <link>https://dev.to/jwp/best-way-to-fly-13jh</link>
      <guid>https://dev.to/jwp/best-way-to-fly-13jh</guid>
      <description>&lt;h2&gt;
  
  
  🚀 Best of the Web: Essential Development Tools &amp;amp; Platforms
&lt;/h2&gt;

&lt;p&gt;Developers, innovators, and tech enthusiasts—whether you're crafting elegant front-end designs, diving into AI, or building the next big mobile app, the right tools shape your success. Here’s a &lt;strong&gt;curated collection&lt;/strong&gt; of must-know platforms and resources to supercharge your development workflow. 👇  &lt;/p&gt;

&lt;p&gt;Javascript and Typescript are not mentioned because they won the programming language war years ago.&lt;/p&gt;

&lt;p&gt;What about the Desktop? &lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1️⃣ Code &amp;amp; Development Tools&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;💻 &lt;strong&gt;&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;&lt;/strong&gt; – The ultimate lightweight yet powerful code editor.&lt;br&gt;&lt;br&gt;
🐍 &lt;strong&gt;&lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;/strong&gt; – A must-have for automation, data science, AI, and back-end development.&lt;br&gt;&lt;br&gt;
🤖 &lt;strong&gt;&lt;a href="https://openai.com/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;&lt;/strong&gt; – AI-powered creativity and automation at your fingertips.&lt;br&gt;&lt;br&gt;
📦 &lt;strong&gt;&lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/strong&gt; – The home of JavaScript packages for modular development.&lt;br&gt;&lt;br&gt;
🐙 &lt;strong&gt;&lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; – Version control, collaboration, and open-source projects all in one place.  &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2️⃣ Frameworks &amp;amp; Ecosystem&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;📱 &lt;strong&gt;&lt;a href="https://www.bing.com/search?filters=ufn%3a%22Ionic+(mobile+app+framework)%22+sid%3a%2236558dd1-b1bc-4cb4-9469-9096d795c8c6%22&amp;amp;qs=MB&amp;amp;pq=ionic&amp;amp;sc=22-5&amp;amp;q=ionic&amp;amp;cvid=2e0790c1d692423cbd82e76e37447b53&amp;amp;gs_lcrp=EgRlZGdlKgYIARAuGEAyBggAEEUYOTIGCAEQLhhAMgYIAhAAGEAyBggDEAAYQDIGCAQQABhAMgYIBRAAGEAyBggGEAAYQDIGCAcQABhAMgYICBAAGEDSAQg3NTIyajBqMagCCLACAQ&amp;amp;FORM=ANNTA1&amp;amp;PC=EDGEDSE" rel="noopener noreferrer"&gt;Ionic&lt;/a&gt;&lt;/strong&gt; – Build cross-platform mobile apps with a single codebase.&lt;br&gt;&lt;br&gt;
⚛️ &lt;strong&gt;&lt;a href="https://www.bing.com/search?filters=ufn%3a%22React+(software)%22+sid%3a%224c01defb-cfcf-55f4-5422-4759807a8352%22&amp;amp;qs=MB&amp;amp;pq=react&amp;amp;sc=25-5&amp;amp;pglt=425&amp;amp;q=react&amp;amp;cvid=707576e3b20643e18a775c5f693856ca&amp;amp;gs_lcrp=EgRlZGdlKgYIARAuGEAyBggAEEUYOTIGCAEQLhhAMgYIAhAAGEAyBggDEAAYQDIGCAQQLhhAMgYIBRAAGEAyBggGEC4YQDIGCAcQABhAMgYICBAAGEDSAQg0ODE2ajBqMagCALACAA&amp;amp;FORM=ANNTA1&amp;amp;PC=EDGEDSE" rel="noopener noreferrer"&gt;React&lt;/a&gt;&lt;/strong&gt; – The front-end powerhouse for modern web development.&lt;br&gt;&lt;br&gt;
⚙️ &lt;strong&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_components" rel="noopener noreferrer"&gt;Web Components&lt;/a&gt;&lt;/strong&gt; – The future of reusable UI building blocks.  &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3️⃣ DevOps, Security &amp;amp; Documentation&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;🔄 &lt;strong&gt;GitHub Actions&lt;/strong&gt; – Automate workflows with CI/CD pipelines.&lt;br&gt;&lt;br&gt;
🛡 &lt;strong&gt;&lt;a href="https://owasp.org/" rel="noopener noreferrer"&gt;OWASP&lt;/a&gt;&lt;/strong&gt; – Security best practices for web &amp;amp; software development.&lt;br&gt;&lt;br&gt;
📖 &lt;strong&gt;&lt;a href="https://developer.mozilla.org/" rel="noopener noreferrer"&gt;MDN Web Docs&lt;/a&gt;&lt;/strong&gt; – A must-have resource for web developers.&lt;br&gt;&lt;br&gt;
🔍 &lt;strong&gt;&lt;a href="https://www.bing.com/" rel="noopener noreferrer"&gt;Bing Developer Search&lt;/a&gt;&lt;/strong&gt; – Stay ahead with the latest trends.  &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4️⃣ Industry Insights &amp;amp; Learning&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;📰 &lt;strong&gt;&lt;a href="https://dev.to/jwp/the-platform-explosion-a-fragmented-tech-landscape-117g"&gt;The Platform Explosion: A Fragmented Tech Landscape&lt;/a&gt;&lt;/strong&gt; – Exploring the ever-evolving tech stack landscape.&lt;br&gt;&lt;br&gt;
🎨 &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/CSS" rel="noopener noreferrer"&gt;CSS&lt;/a&gt;&lt;/strong&gt; – The backbone of beautiful, responsive web design.&lt;br&gt;&lt;br&gt;
🧠 &lt;strong&gt;AI &amp;amp; ML Development&lt;/strong&gt; – Explore &lt;strong&gt;TensorFlow&lt;/strong&gt;, &lt;strong&gt;Hugging Face&lt;/strong&gt;, and more.  &lt;/p&gt;




&lt;p&gt;💡 &lt;strong&gt;Tech is evolving FAST—what tools or platforms are your must-haves?&lt;/strong&gt; Drop them in the comments! 👇  &lt;/p&gt;

&lt;h1&gt;
  
  
  Python #Developers #WebDevelopment #AI #VisualStudioCode #React #Ionic #WebComponents #GitHub #OpenAI #DevTools #CloudComputing #TechTrends
&lt;/h1&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Today the desktop, while not dead is Cobol like, it will live forever but not in new applications. The tools listed above are the reason why. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Great Article on CSS selectors</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Fri, 28 Feb 2025 16:45:11 +0000</pubDate>
      <link>https://dev.to/jwp/great-article-on-css-selectors-182k</link>
      <guid>https://dev.to/jwp/great-article-on-css-selectors-182k</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/web_dev-usman/all-css-selectors-in-one-place-learn-to-target-any-element-fho?bb=213694"&gt;CSS Selectors&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>webcomponents</category>
    </item>
    <item>
      <title>30 Python Libraries</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Fri, 28 Feb 2025 15:58:01 +0000</pubDate>
      <link>https://dev.to/jwp/30-python-libraries-23gi</link>
      <guid>https://dev.to/jwp/30-python-libraries-23gi</guid>
      <description>&lt;p&gt;&lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7301038303548493824?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAAXrTosBf98Lsc7MHtfz8tx5EocqgYsTWBc" rel="noopener noreferrer"&gt;30 Python Libraries&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>libraries</category>
    </item>
    <item>
      <title>The Platform Explosion: A Fragmented Tech Landscape</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Tue, 25 Feb 2025 16:27:01 +0000</pubDate>
      <link>https://dev.to/jwp/the-platform-explosion-a-fragmented-tech-landscape-117g</link>
      <guid>https://dev.to/jwp/the-platform-explosion-a-fragmented-tech-landscape-117g</guid>
      <description>&lt;p&gt;In the past few years, we've witnessed an &lt;strong&gt;explosion of platforms&lt;/strong&gt; across multiple domains: &lt;strong&gt;AI chatbots, code generation tools, operating systems, and even terminal environments&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;With each innovation, developers find themselves navigating an &lt;strong&gt;increasingly complex and fragmented ecosystem&lt;/strong&gt;. Whether you're leveraging &lt;strong&gt;AI-powered assistants like ChatGPT, Claude, or DeepSeek&lt;/strong&gt;, or choosing between &lt;strong&gt;Windows, Linux, or macOS&lt;/strong&gt; for development, the choices seem endless.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore &lt;strong&gt;this rapid expansion, its impact on developers, and strategies to stay productive&lt;/strong&gt; amid the fragmentation.&lt;/p&gt;




&lt;h3&gt;
  
  
  AI Assistants &amp;amp; Code Generation: The Wild West of AI
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Learning to effectively use AI tools can take anywhere from a few days to weeks, depending on familiarity with AI-assisted development and the complexity of the projects undertaken.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI revolution has brought an &lt;strong&gt;influx of tools&lt;/strong&gt; designed to assist developers, each with its own strengths and weaknesses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://openai.com/chatgpt" rel="noopener noreferrer"&gt;ChatGPT (OpenAI)&lt;/a&gt;&lt;/strong&gt;: One of the most widely used AI models, offering a mix of natural language assistance, coding help, and creative brainstorming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.anthropic.com/" rel="noopener noreferrer"&gt;Claude (Anthropic)&lt;/a&gt;&lt;/strong&gt;: Focused on safety and thoughtful AI responses, Claude provides a different approach to AI-powered interaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://deepmind.google/" rel="noopener noreferrer"&gt;Sonnet (Google DeepMind)&lt;/a&gt;&lt;/strong&gt;: Part of Google’s Gemini AI ecosystem, Sonnet is an alternative to OpenAI’s models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://deepseek.com/" rel="noopener noreferrer"&gt;DeepSeek (Open-source)&lt;/a&gt;&lt;/strong&gt;: An emerging model with a focus on transparency and accessibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt; &amp;amp; &lt;a href="https://codeium.com/" rel="noopener noreferrer"&gt;Codeium&lt;/a&gt;&lt;/strong&gt;: AI-assisted coding companions that provide real-time suggestions, helping developers write better code faster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With so many AI assistants, developers must &lt;strong&gt;choose tools that align with their workflows&lt;/strong&gt;. Some prefer OpenAI’s GPT for its large context window, while others favor Claude for its nuanced reasoning. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The challenge?&lt;/strong&gt; Balancing AI assistance with actual coding skills to avoid over-reliance on these tools.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  The Never-Ending OS Battle: Windows, Linux, macOS, Android, iPhone
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mastering an operating system environment for development can take months to years, as it involves understanding system internals, security, and optimization techniques.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For decades, developers have debated the &lt;strong&gt;merits of various operating systems&lt;/strong&gt;. Today, the battle rages on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.microsoft.com/en-us/windows/" rel="noopener noreferrer"&gt;Windows&lt;/a&gt;&lt;/strong&gt;: Dominates in enterprise environments, with strong compatibility for .NET development and gaming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.linux.org/" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;&lt;/strong&gt;: The go-to choice for backend developers, server administrators, and those who prefer an open-source ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.apple.com/macos/" rel="noopener noreferrer"&gt;macOS&lt;/a&gt;&lt;/strong&gt;: The preferred OS for many mobile and web developers due to its Unix-based environment and seamless Apple ecosystem integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.android.com/" rel="noopener noreferrer"&gt;Android&lt;/a&gt;&lt;/strong&gt;: The dominant mobile OS worldwide, widely used for app development with Kotlin and Java.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.apple.com/ios/" rel="noopener noreferrer"&gt;iPhone (iOS)&lt;/a&gt;&lt;/strong&gt;: Apple's mobile operating system, essential for Swift and Objective-C development.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rise of &lt;strong&gt;containerization (Docker, Kubernetes)&lt;/strong&gt; and cross-platform development tools (&lt;strong&gt;WSL, macOS virtualization, Windows Subsystem for Linux&lt;/strong&gt;) helps bridge the gap, but &lt;strong&gt;OS choice still matters&lt;/strong&gt; when it comes to compatibility and performance.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Terminal Landscape: Bash, Zsh, PowerShell, Oh My!
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Becoming proficient in terminal usage can take weeks to months, with advanced scripting skills requiring even more time to master.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even something as fundamental as the &lt;strong&gt;terminal experience&lt;/strong&gt; is no longer a one-size-fits-all decision. Developers now juggle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.gnu.org/software/bash/" rel="noopener noreferrer"&gt;Bash&lt;/a&gt;&lt;/strong&gt;: The standard for Linux and macOS users, deeply integrated into the Unix philosophy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.zsh.org/" rel="noopener noreferrer"&gt;Zsh&lt;/a&gt;&lt;/strong&gt;: A more user-friendly and customizable alternative, often paired with Oh My Zsh.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/" rel="noopener noreferrer"&gt;PowerShell&lt;/a&gt;&lt;/strong&gt;: The go-to shell for Windows users, offering deep integration with the Microsoft ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.warp.dev/" rel="noopener noreferrer"&gt;Warp&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/alacritty/alacritty" rel="noopener noreferrer"&gt;Alacritty&lt;/a&gt;&lt;/strong&gt;: New terminal experiences focused on modern developer workflows.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;GitHub Codespaces: The Future of Cloud Development&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;GitHub Codespaces is &lt;strong&gt;transforming&lt;/strong&gt; the way developers work by providing a &lt;strong&gt;fully-configured cloud-based development environment&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Developers can &lt;strong&gt;write, build, test, and deploy applications from anywhere&lt;/strong&gt;, streamlining collaboration and reducing onboarding time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Learning GitHub Codespaces can take a few days for basic workflows, but mastering its full potential—custom dev containers, pre-built configurations, and automation—can take weeks to months.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  The Cloud: A Career in Itself
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cloud expertise is often a multi-year journey, requiring certification, hands-on experience, and ongoing learning as cloud technologies continuously evolve.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cloud computing has become the &lt;strong&gt;backbone of modern software development&lt;/strong&gt;. Each major cloud provider offers its own &lt;strong&gt;ecosystem&lt;/strong&gt;, requiring specialized knowledge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;Amazon Web Services (AWS)&lt;/a&gt;&lt;/strong&gt;: The market leader in cloud computing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://azure.microsoft.com/" rel="noopener noreferrer"&gt;Microsoft Azure&lt;/a&gt;&lt;/strong&gt;: Preferred by enterprises using Microsoft technologies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://cloud.google.com/" rel="noopener noreferrer"&gt;Google Cloud Platform (GCP)&lt;/a&gt;&lt;/strong&gt;: Known for AI and data analytics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.ibm.com/cloud" rel="noopener noreferrer"&gt;IBM Cloud&lt;/a&gt; &amp;amp; &lt;a href="https://www.oracle.com/cloud/" rel="noopener noreferrer"&gt;Oracle Cloud&lt;/a&gt;&lt;/strong&gt;: Targeted at industries with high regulatory requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid &amp;amp; Multi-Cloud&lt;/strong&gt;: Many businesses now mix cloud providers, leading to new roles for cloud architects.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Navigating the Fragmentation: Strategies for Developers
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Developers are increasingly becoming tool engineers who must make disparate systems communicate.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here’s how to stay productive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool Engineering&lt;/strong&gt;: Mastering &lt;strong&gt;integration&lt;/strong&gt; between platforms, APIs, and cloud services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standardize Your Toolset&lt;/strong&gt;: Avoid unnecessary complexity by sticking to a core set of tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage Cross-Platform Technologies&lt;/strong&gt;: Use &lt;strong&gt;Docker, WSL, or cloud environments&lt;/strong&gt; to reduce dependency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stay Flexible &amp;amp; Open to New Technologies&lt;/strong&gt;: The tech landscape evolves rapidly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use AI as an Assistant, Not a Crutch&lt;/strong&gt;: AI should &lt;strong&gt;enhance productivity&lt;/strong&gt;, not replace critical thinking.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Summary: How Long to Become an SME?
&lt;/h3&gt;

&lt;p&gt;With so many technologies discussed, becoming a &lt;strong&gt;subject matter expert (SME)&lt;/strong&gt; in each one varies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Assistants (ChatGPT, Claude, Sonnet, DeepSeek, Copilot, Codeium)&lt;/strong&gt; → &lt;em&gt;Weeks to months&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operating Systems (Windows, Linux, macOS, Android, iOS)&lt;/strong&gt; → &lt;em&gt;Months to years&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminals &amp;amp; Shells (Bash, Zsh, PowerShell, Warp, Alacritty)&lt;/strong&gt; → &lt;em&gt;Weeks to months&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Platforms (AWS, Azure, GCP, IBM Cloud, Oracle Cloud, Multi-Cloud)&lt;/strong&gt; → &lt;em&gt;Multi-year journey&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Development Tools (GitHub Codespaces)&lt;/strong&gt; → &lt;em&gt;Days to months&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;How long will it take to master them all? &lt;strong&gt;The ever-evolving tech landscape means learning never stops!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🚀 &lt;strong&gt;How are you navigating this evolving tech landscape? Share your thoughts in the comments below!&lt;/strong&gt; 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>developers</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Navigating the Pressure of Delivery: A Software Developer's Perspective</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Sun, 23 Feb 2025 20:52:06 +0000</pubDate>
      <link>https://dev.to/jwp/navigating-the-pressure-of-delivery-a-software-developers-perspective-22dg</link>
      <guid>https://dev.to/jwp/navigating-the-pressure-of-delivery-a-software-developers-perspective-22dg</guid>
      <description>&lt;p&gt;The world of software development is fast-paced and dynamic, and the pressure to deliver high-quality code under tight deadlines is a constant challenge. While many of the strategies to manage this pressure—such as agile methodologies, automation, and sprint planning—are owned by product managers, scrum teams, and managers, individual developers still play a critical role in execution. At the same time, it's essential that those leading the process—particularly scrum leaders—champion practices that safeguard the team's well-being.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understanding the Developer's Dilemma
Developers often find themselves caught between high expectations and processes that are set by others:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;High Expectations, Tight Deadlines:&lt;br&gt;
Stakeholders demand robust, bug-free code, yet the sprint goals and timelines are defined by the broader team.&lt;/p&gt;

&lt;p&gt;Continuous Learning vs. Immediate Delivery: While technology evolves at breakneck speed, developers must integrate new tools and practices without compromising on delivery.&lt;/p&gt;

&lt;p&gt;Quality vs. Quantity:&lt;br&gt;
Even as you focus on writing excellent code, overall productivity is measured by sprint progress and organizational goals.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recognizing Shared Ownership
It’s important to acknowledge that many of the practices meant to manage delivery pressure are determined by others:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A. Agile Processes and Sprint Goals:&lt;br&gt;
Agile teams rely on iterative sprint planning and backlog grooming rather than traditional milestones. These strategies are shaped by product managers and scrum teams.&lt;/p&gt;

&lt;p&gt;B. Automation and DevOps Practices:&lt;br&gt;
Although developers contribute technically, decisions about CI/CD pipelines and automated testing tools are typically made at the management level.&lt;/p&gt;

&lt;p&gt;C. Sprint Planning and Backlog Prioritization:&lt;br&gt;
Priorities are set through collective decision-making, allowing developers to concentrate on execution rather than planning.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What Developers Can Do
Even when key processes are outside your direct control, you still have significant influence over your work. Here are some steps you can take:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A. Communicate Openly &lt;br&gt;
Share your insights and challenges with managers and scrum teams.&lt;br&gt;
Provide constructive feedback if sprint goals seem unrealistic or processes inefficient.&lt;/p&gt;

&lt;p&gt;B. Focus on What You Can Control&lt;/p&gt;

&lt;p&gt;Code Quality: Maintain high standards through code reviews, pair programming, and automated testing.&lt;br&gt;
Efficient Workflows: Streamline your development process and advocate for tools that reduce repetitive tasks.&lt;br&gt;
Self-Care: Prioritize work-life balance to maintain productivity and avoid burnout.&lt;/p&gt;

&lt;p&gt;C. Participate in Continuous Improvement&lt;/p&gt;

&lt;p&gt;Offer feedback during retrospectives to help shape more sustainable workflows.&lt;br&gt;
Use your hands-on experience to suggest process adjustments.&lt;/p&gt;

&lt;p&gt;D. Cultivate a Collaborative Culture&lt;br&gt;
Recognize that successful delivery is a team effort.&lt;/p&gt;

&lt;p&gt;Foster open communication and collaboration to ensure that everyone's perspective is considered.&lt;/p&gt;

&lt;p&gt;What Scrum Leaders Must Do&lt;/p&gt;

&lt;p&gt;Scrum leaders play a pivotal role in bridging the gap between strategic planning and execution. They should:&lt;/p&gt;

&lt;p&gt;Remove Impediments:&lt;/p&gt;

&lt;p&gt;Actively identify and eliminate obstacles that hinder the team’s progress, ensuring developers can focus on coding.&lt;br&gt;
Advocate for Realistic Goals:&lt;br&gt;
Collaborate with product managers and stakeholders to set achievable sprint goals that consider the team’s capacity and technical challenges.&lt;br&gt;
Foster Open Communication:&lt;br&gt;
Create an environment where concerns can be voiced without fear, ensuring that feedback from developers is integrated into planning and retrospectives.&lt;/p&gt;

&lt;p&gt;Champion Team Well-Being:&lt;br&gt;
Recognize early signs of burnout and promote a balanced work-life approach to maintain long-term productivity.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Turning Pressure into a Collective Strength
The pressure to deliver in software development is inevitable, but when managed collectively, it can drive innovation and efficiency rather than leading to burnout. By focusing on what you can control, communicating effectively, and ensuring that leadership takes its share of responsibility, teams can transform delivery pressure into a catalyst for success.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Conclusion&lt;br&gt;
Software developers face immense pressure to deliver exceptional work under challenging conditions. While many processes—like agile sprint planning—are managed by product managers and scrum teams, developers have a vital role in executing quality code and offering constructive feedback. Moreover, scrum leaders must actively remove impediments, set realistic goals, and foster an environment that values both performance and well-being.&lt;/p&gt;

&lt;p&gt;In summary:&lt;br&gt;
Failure to implement the crucial first step in what scrum leaders must do—removing impediments (E.1)—can set developers up for inevitable failure. If these obstacles remain unaddressed, developers will continually be hindered in their ability to deliver, eventually leading to missed deadlines, compromised code quality, and, ultimately, the risk of being fired.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hallucination Engineer</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Thu, 20 Feb 2025 21:59:35 +0000</pubDate>
      <link>https://dev.to/jwp/hallucination-engineer-2gf3</link>
      <guid>https://dev.to/jwp/hallucination-engineer-2gf3</guid>
      <description>&lt;p&gt;In the realm of software development, the coveted title of Senior Software Engineer once symbolized expertise forged through tech migrations, legacy code revamps, and battles against imposter syndrome. However, in today's AI-driven landscape, a new persona emerges: the Senior Hallucination Engineer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diving into the Modern Tech World&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🤓 Senior Software Engineer&lt;/p&gt;

&lt;p&gt;✅ Writes, tests, and deploys code&lt;br&gt;
✅ Resolves real-world bugs 🐞&lt;br&gt;
✅ Applies algorithms to problem-solving&lt;br&gt;
✅ Seeks assistance on Stack Overflow&lt;br&gt;
✅ Assesses pull requests&lt;br&gt;
✅ Enhances performance&lt;br&gt;
✅ Addresses runtime errors&lt;/p&gt;

&lt;p&gt;🤯 Senior Hallucination Engineer&lt;/p&gt;

&lt;p&gt;✅ Writes, debugs, and interprets AI-generated illusions&lt;br&gt;
✅ Rectifies AI-conjured hallucinations 👻&lt;br&gt;
✅ Utilizes logic to unravel AI "creativity"&lt;br&gt;
✅ Consults ChatGPT, then validates all content&lt;br&gt;
✅ Reviews AI-spun narratives camouflaged as code&lt;br&gt;
✅ Optimizes prompts to prevent AI from crafting new programming languages&lt;br&gt;
✅ Tackles AI hallucinations pre-production&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crucial Duties of a Senior Hallucination Engineer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Crafting Effective Prompts – Tailoring prompts for practical AI responses, not poetic C++ creations.&lt;br&gt;
✅ Detecting Illusions – Distinguishing genuine AI outputs from "100% confidence" fabrications.&lt;br&gt;
✅ Combatting GPT Fabrications – Addressing instances where AI asserts 2 + 2 = 5 with 80% confidence.&lt;br&gt;
✅ Unraveling AI Logic – Deciphering why AI deemed an infinite loop a viable choice.&lt;br&gt;
✅ Managing Expectations – Clarifying to management that AI complements, not replaces, developers, albeit adding to our workload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Future of Software Engineering?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As AI assumes a larger development role, engineers transition from coding to curation. Rather than meticulously crafting every code line, we now guide AI-generated concepts towards functionality, all while guarding against its vivid imagination.&lt;/p&gt;

&lt;p&gt;So, the next time you see a Senior Software Engineer job posting, don’t be surprised if it includes “Experience in identifying and debugging AI hallucinations.” Welcome to the future of software development! 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Create a Question/Answer Chatbot in Python</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Wed, 11 Sep 2024 18:40:29 +0000</pubDate>
      <link>https://dev.to/jwp/create-a-questionanswer-chatbot-in-python-5f3n</link>
      <guid>https://dev.to/jwp/create-a-questionanswer-chatbot-in-python-5f3n</guid>
      <description>&lt;h3&gt;
  
  
  Using the &lt;a href="https://www.nltk.org/" rel="noopener noreferrer"&gt;NTLK&lt;/a&gt; Natural Language Toolkit
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1: Install Required Libraries
&lt;/h4&gt;



&lt;p&gt;&lt;code&gt;pip install nltk&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2: Import Libraries and Prepare Data
&lt;/h4&gt;

&lt;p&gt;In this example, we’ll use NLTK for tokenization and some basic text processing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nltk&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nltk.chat.util&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Chat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reflections&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Download the NLTK tokenizer
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;punkt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3: Define Chatbot Responses
&lt;/h4&gt;

&lt;p&gt;You'll create a list of patterns and corresponding responses. The chatbot will match user input against the patterns and provide the appropriate response.&lt;/p&gt;

&lt;h4&gt;
  
  
  Define the patterns and responses
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pairs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my name is (.*)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello %1, how can I help you today?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,]&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hi|hey|hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello! How can I assist you?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,]&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;what is your name?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I am a chatbot created to assist you.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,]&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;how are you?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m just a program, but thanks for asking!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,]&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sorry (.*)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No problem!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,]&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bye|goodbye&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Goodbye! Have a nice day!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,]&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(.*) your (.*) favorite color?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t have preferences, but what&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s yours?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,]&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(.*)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m sorry, I don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t understand that. Can you ask something else?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,]&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Initialize reflections and chatbot
&lt;/h4&gt;



&lt;p&gt;&lt;code&gt;python chatbot = Chat(pairs, reflections)&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4: Run the Chatbot
&lt;/h4&gt;

&lt;p&gt;Finally, create a loop that allows users to interact with the chatbot.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chatbot_conversation&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Welcome to the Python Chatbot! Type &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bye&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; to exit.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;user_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bye&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Chatbot: Goodbye!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chatbot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Chatbot: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#start
&lt;/span&gt;&lt;span class="nf"&gt;chatbot_conversation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 5: Test Your Chatbot
&lt;/h4&gt;

&lt;p&gt;Run the script, and you should be able to interact with your basic Python chatbot. The chatbot will respond based on the predefined patterns and responses.&lt;/p&gt;

&lt;p&gt;Expanding the Chatbot&lt;br&gt;
You can expand this chatbot by adding more complex patterns, integrating machine learning models for better understanding, or even using APIs like OpenAI's GPT for more advanced interactions.&lt;/p&gt;

&lt;p&gt;Let me know if you need further help with this or any other enhancements!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Free online Maui discussion 09/12/24 10:00am CST</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Tue, 10 Sep 2024 19:20:00 +0000</pubDate>
      <link>https://dev.to/jwp/free-online-maui-discussion-091224-1000am-cst-4fnd</link>
      <guid>https://dev.to/jwp/free-online-maui-discussion-091224-1000am-cst-4fnd</guid>
      <description>&lt;p&gt;&lt;a href="https://www.linkedin.com/events/freemauiintroduction7238972144041312256/" rel="noopener noreferrer"&gt;https://www.linkedin.com/events/freemauiintroduction7238972144041312256/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;30 Minute demo. Open for questions afterward.&lt;/p&gt;

</description>
      <category>maui</category>
      <category>dotnet</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Separation of Concerns</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Sat, 31 Dec 2022 18:26:26 +0000</pubDate>
      <link>https://dev.to/jwp/separation-of-concerns-4m0n</link>
      <guid>https://dev.to/jwp/separation-of-concerns-4m0n</guid>
      <description>&lt;p&gt;One of the best things I've learned in my career is the &lt;a href="https://en.wikipedia.org/wiki/Separation_of_concerns" rel="noopener noreferrer"&gt;Separation of Concerns Principal&lt;/a&gt; which guides us in setting up some rules for our web component (WC) library.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rules
&lt;/h3&gt;

&lt;p&gt;Here's the first three rules we will follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use convention over configuration&lt;/li&gt;
&lt;li&gt;All functions or methods to have only one concern.&lt;/li&gt;
&lt;li&gt;Function or Method names must be carefully determined. This communicates what it does. It's a huge clue to developers down the road.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Convention over Configuration
&lt;/h3&gt;

&lt;p&gt;Our convention, in order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declare a custom Element: &lt;code&gt;customElements.define(&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define the tag name such as &lt;code&gt;bing-search&lt;/code&gt; and remember it must have a hyphen. The tag name should always describe its sole function.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Declare a class and extend from HtmlElement as shown:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;customElements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bing-search&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;HTMLElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initializeElements&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventHandlers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add a constructor with the first line being this: &lt;code&gt;super();&lt;/code&gt; This is a requirement of WC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create generic method names that will be used in all other WCs where needed. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Functions Have One Responsibility
&lt;/h3&gt;

&lt;p&gt;Don't write &lt;a href="https://www.bing.com/search?q=the+problem+with+monolithic+code&amp;amp;cvid=309c6698340a4726820872372a61f9d1&amp;amp;aqs=edge..69i57j0l8.8035j0j1&amp;amp;pglt=297&amp;amp;FORM=ANNTA1&amp;amp;PC=EDGEDSE" rel="noopener noreferrer"&gt;monolithic code&lt;/a&gt; unless you want a &lt;a href="https://www.glassdoor.com/blog/things-to-do-if-you-get-fired/" rel="noopener noreferrer"&gt;new job&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We can avoid this by using the &lt;a href="https://en.wikipedia.org/wiki/Single-responsibility_principle" rel="noopener noreferrer"&gt;Single Responsibility Principle&lt;/a&gt;;  which works at both the ECMA module layer as well as the class and function layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  The initializeElements Function
&lt;/h3&gt;

&lt;p&gt;Notice this method initializes components by creating them and then adding them to the WC.&lt;/p&gt;

&lt;p&gt;It does not do anything else!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="nf"&gt;initializeElements&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bingsearch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bingsearch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bingsearch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bingsearch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;searchstring&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bingsearchsubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bingSearchSubmit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bingsearchsubmit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The addEventHandlers Function
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;addEventHandlers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;change&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bingsearch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OpenSearch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bingsearchsubmit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OpenSearch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both of these methods are different ways of doing the same thing, that's why we have a function named OpenSearch.&lt;/p&gt;

&lt;h3&gt;
  
  
  The OpenSearch Function
&lt;/h3&gt;

&lt;p&gt;This function has a single responsibility, but was called in two different ways; therefore, it must be able to service both callers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;//searchPattern = "https://www.bing.com/search?q=";&lt;/span&gt;
    &lt;span class="nc"&gt;OpenSearch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;searchtext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;replaced&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchtext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchPattern&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;replaced&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;win&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The GUI
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbkuh3a2ug5454u7k2kq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbkuh3a2ug5454u7k2kq.png" alt="Bing Search GUI" width="410" height="145"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F369m2j4df1a3mt15skpz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F369m2j4df1a3mt15skpz.png" alt="Bing Search Result" width="766" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Reuse this WC
&lt;/h3&gt;

&lt;p&gt;In your HTML just import the bingsearch.js script, and make a reference to &amp;lt;bing-search&amp;gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"IE=edge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"bingsearch.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Display Grid&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Bing Search&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;bing-search&lt;/span&gt; &lt;span class="na"&gt;searchstring=&lt;/span&gt;&lt;span class="s"&gt;"single responsibility"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/bing-search&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Element View
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiisjxyhpemk4zk7trnst.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiisjxyhpemk4zk7trnst.png" alt="Image description" width="800" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice anything missing? Well yes we should always include ids and or names and titles on our custom elements. &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Styling</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Sat, 31 Dec 2022 00:36:22 +0000</pubDate>
      <link>https://dev.to/jwp/web-components-styling-9gk</link>
      <guid>https://dev.to/jwp/web-components-styling-9gk</guid>
      <description>&lt;p&gt;In the previous article we introduced the &lt;a href="https://dev.to/jwp/web-components-display-grid-53f5"&gt;Display-Grid&lt;/a&gt; Web Component which supports markup like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;display-grid&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;grid-col&amp;gt;&lt;/span&gt;Column A
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Lorem ipsum...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"SomeURL"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Go Here&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/grid-col&amp;gt;&lt;/span&gt;     
    &lt;span class="nt"&gt;&amp;lt;grid-col&amp;gt;&lt;/span&gt;Column B
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Lorem ipsum...&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/grid-col&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;grid-col&amp;gt;&lt;/span&gt;Column C
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Lorem ipsum...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Lorem ipsum ...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/grid-col&amp;gt;&lt;/span&gt;     
&lt;span class="nt"&gt;&amp;lt;/display-grid&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Automatic Styling
&lt;/h3&gt;

&lt;p&gt;The idea is to allow for automatic CSS Grid markup; which looks like this, for three columns. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsis39zq3450njkss4671.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsis39zq3450njkss4671.png" alt="CSS for a grid with 3 columns" width="500" height="65"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The number of columns are based on the number of &lt;code&gt;&amp;lt;grid-col&amp;gt;&lt;/code&gt; subelements.&lt;/p&gt;

&lt;p&gt;In the original article there was a bug related to the shadow root.&lt;/p&gt;

&lt;h3&gt;
  
  
  We Found a Bug
&lt;/h3&gt;

&lt;p&gt;Not having a full understanding of &lt;br&gt;
&lt;code&gt;const shadowRoot = this.attachShadow({mode:"open"});&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
We created the shadowRoot the parent (display-grid) and one for each sub-element (grid-col).&lt;/p&gt;

&lt;p&gt;The impact of this was indeterminate view rendering; which, was highly dependent on element and child element placement!&lt;/p&gt;

&lt;p&gt;The fix was to not open up any shadowRoots!&lt;/p&gt;
&lt;h3&gt;
  
  
  The Fix
&lt;/h3&gt;

&lt;p&gt;We wanted the parent (display-grid) to set all styling for itself and all it's (grid-col) children.&lt;/p&gt;

&lt;p&gt;In the master (display-grid) element, we removed the shadowRoot code like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;customElements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;display-grid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;HTMLElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="c1"&gt;//const shadowRoot = this.attachShadow({mode: 'open'});&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SetStyleByColumns&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SetStyleByColumns
&lt;/h3&gt;

&lt;p&gt;Then we altered this styling for this (parent) element and all the (grid-col) elements.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**Based on the number of grid-col elements set up the grid column count to match */&lt;/span&gt;
&lt;span class="nc"&gt;SetStyleByColumns&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;//grid-col is a custom element&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;cols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grid-col&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// numberOfColumns returns something like "auto auto auto" for 3 columns&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getStyleByCols&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;style&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;style&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;padding:2rem;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;getStyleByCols&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;numberOfColumns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GetNumberOfGridColumnsToAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`background-color:#444;
    color:white;
    display:grid; 
    grid-template-columns:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;numberOfColumns&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;
  `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;GetNumberOfGridColumnsToAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;AutoCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AutoCount&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;AutoCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auto &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;AutoCount&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auto &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;AutoCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result of the code above for the Display-Grid element:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fow1z8ibfhlus3mybpvwp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fow1z8ibfhlus3mybpvwp.png" alt="Image description" width="744" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And for each (grid-col) element:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9oq38e4at6tqnezgfnl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9oq38e4at6tqnezgfnl.png" alt="grid-col css" width="440" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The HTML Result
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9uho50o5ecupvhzu9fx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9uho50o5ecupvhzu9fx.png" alt="The HTML Result" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Rendering
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwactxalxu113t4vndu1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwactxalxu113t4vndu1g.png" alt="The Rendering of the Three Column Grid" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This taught us that we don't have a good understanding of how the shadowroot works. For now we don't need it and will study it later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Other Information
&lt;/h3&gt;

&lt;p&gt;This design is ok but not great. Due to specificity rules; by placing the styling at the element layer, there is nothing the user can do to override this except perhaps using the (forbidden?) !important keyword. &lt;/p&gt;

&lt;p&gt;We could add a class style and test in lab to see if this opens a path for better user control.&lt;/p&gt;

&lt;h3&gt;
  
  
  No Binding
&lt;/h3&gt;

&lt;p&gt;Another unforeseen issue in this design, is that it does not separate the data from the GUI, this means that something simple like sorting data (not needed for this example) is impossible. This current design re-renders all of the markup each time this page is reloaded. &lt;/p&gt;

&lt;p&gt;In order for these components to be reusable, there must be considerations for easily styling this component for any situation.  After all, Web Components are meant to be reused. &lt;/p&gt;

</description>
      <category>webcomponents</category>
    </item>
    <item>
      <title>Display-Grid</title>
      <dc:creator>JWP</dc:creator>
      <pubDate>Thu, 29 Dec 2022 23:41:58 +0000</pubDate>
      <link>https://dev.to/jwp/web-components-display-grid-53f5</link>
      <guid>https://dev.to/jwp/web-components-display-grid-53f5</guid>
      <description>&lt;p&gt;Is there a way we can automatically utilize the &lt;a href="https://css-tricks.com/snippets/css/complete-guide-grid/" rel="noopener noreferrer"&gt;grid&lt;/a&gt; css component but do it using only HTML?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;display-grid&amp;gt;&lt;/span&gt;  
        &lt;span class="nt"&gt;&amp;lt;grid-col&amp;gt;&lt;/span&gt;Column a
          &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Lorem ipsum dolor sit amet consectetur adipisicing elit. Eum inventore earum illo ipsam perferendis, totam, fugiat consectetur fugit consequatur id dolore alias autem expedita aliquid unde ea? Illo, facere animi!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Using Grid Layout&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/grid-col&amp;gt;&lt;/span&gt;     
        &lt;span class="nt"&gt;&amp;lt;grid-col&amp;gt;&lt;/span&gt;Column b
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Lorem ipsum dolor sit amet consectetur, adipisicing elit. Nisi quia explicabo earum delectus sequi ex, facilis, incidunt harum quas impedit repellendus in error ullam illo deleniti ab enim, temporibus vero?&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/grid-col&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;grid-col&amp;gt;&lt;/span&gt;Column c
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Lorem ipsum dolor sit amet consectetur adipisicing elit. Sit reiciendis laudantium ullam nam cumque laborum consectetur provident deleniti adipisci praesentium officiis quod sint commodi repudiandae sapiente, aperiam tenetur velit. Qui!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Lorem ipsum dolor sit amet consectetur, adipisicing elit. Cumque tempore, id corporis nisi mollitia saepe distinctio eius quia adipisci quas porro est nobis, vero molestias. Itaque mollitia at nulla incidunt.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/grid-col&amp;gt;&lt;/span&gt;     
    &lt;span class="nt"&gt;&amp;lt;/display-grid&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The HTML above is saying "Display a Grid" and these are the grid columns.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxesm6it449cg1eoghpw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxesm6it449cg1eoghpw.png" alt="Grid Example" width="800" height="697"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The CSS is dynamically generated which makes thing seem to work well. &lt;/p&gt;

&lt;h3&gt;
  
  
  Defining the Web Component
&lt;/h3&gt;

&lt;p&gt;customElements definition and the class with constructor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;customElements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;display-grid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;HTMLElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shadowRoot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attachShadow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SetStyleByColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shadowRoot&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dynamically Setting the Style
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="cm"&gt;/**Based on the number of grid-col elements set up the grid column count to match */&lt;/span&gt;
    &lt;span class="nc"&gt;SetStyleByColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shadowRoot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;cols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grid-col&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;numberOfColumns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GetNumberOfGridColumnsToAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
       display:grid; grid-template-columns:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;numberOfColumns&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;
     `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;style&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="nx"&gt;shadowRoot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get the proper number of Auto strings to add...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="nc"&gt;GetNumberOfGridColumnsToAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;AutoCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AutoCount&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;AutoCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auto &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;AutoCount&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auto &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;AutoCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3m04vxmb9q40h4q56u0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3m04vxmb9q40h4q56u0.png" alt="Generated HTML" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What's grid-col?
&lt;/h3&gt;

&lt;p&gt;A simple definition of a new Web Element name.  Nothing else.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;customElements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grid-col&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;HTMLElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How do I constrain the layout
&lt;/h3&gt;

&lt;p&gt;Simply wrap display-grid with a div styled the way you want.&lt;code&gt;&lt;br&gt;
&amp;lt;div id="container"&amp;gt;&lt;br&gt;
&amp;lt;display-grid&amp;gt; &lt;br&gt;
&amp;lt;/div&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

</description>
      <category>webcomponents</category>
    </item>
  </channel>
</rss>
