# One-shot Custom Components with Claude 3.5 Sonnet

**URL:** <https://community.glideapps.com/t/one-shot-custom-components-with-claude-3-5-sonnet/74828>\
**Category:** Project Showcase\
**Tags:** tutorial, custom-code\
**Created:** [July 11, 2024, 3:49pm UTC](https://community.glideapps.com/t/one-shot-custom-components-with-claude-3-5-sonnet/74828 "2024-07-11T15:49:16Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![nixkulinax](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/nixkulinax/32/73708_2.png) [@nixkulinax](https://community.glideapps.com/u/nixkulinax)\
**Post date:** [July 11, 2024, 3:49pm UTC](https://community.glideapps.com/t/one-shot-custom-components-with-claude-3-5-sonnet/74828/1 "2024-07-11T15:49:16Z")

</div>

Hi! Just found custom components, and it’s amazing!

I asked Claude 3.5 Sonnet to generate calculator:

 ![Screenshot 2024-07-11 at 12.45.10 PM](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/d/b/db88a44761d3006c74925123fe92a634d7d221db.jpeg)

and used this html code within glide custom components:

 ![Screenshot 2024-07-11 at 12.42.45 PM](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/2/d/2df7fd6342af5227bcc24226f59b270531842bd2.jpeg)

What can be really fascinating is the option to include actions anywhere within the HTML code manually, making any buttons work with the actions!

Thanks Glide Team!

---

<div class="post-metadata">

**Author:** ![nixkulinax](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/nixkulinax/32/73708_2.png) [@nixkulinax](https://community.glideapps.com/u/nixkulinax)\
**Post date:** [July 11, 2024, 4:06pm UTC](https://community.glideapps.com/t/one-shot-custom-components-with-claude-3-5-sonnet/74828/2 "2024-07-11T16:06:26Z")

</div>

If you somewhy need calculator in glide:

```auto
{
  "kind": "ai-custom-component",
  "componentID": "c13",
  "visibilityFilters": [],
  "generator": {
    "kind": "enum",
    "value": "html-tailwind-alpine"
  },
  "prompt": {
    "kind": "string",
    "value": ""
  },
  "fields": {
    "kind": "array",
    "value": [
      {
        "value": {
          "kind": "column",
          "value": {
            "kind": "default-ctx",
            "name": "AjbWM"
          }
        },
        "name": {
          "kind": "string",
          "value": "{Name}"
        }
      }
    ]
  },
  "actions": {
    "kind": "array",
    "value": [
      {
        "title": {
          "kind": "string",
          "value": "Go!"
        },
        "action": {
          "kind": "action",
          "value": {
            "kind": "show-toast",
            "message": {
              "kind": "string",
              "value": ""
            },
            "icon": {
              "kind": "enum",
              "value": "success"
            }
          }
        }
      }
    ]
  },
  "builderDisplayName": "Code",
  "html": {
    "kind": "string",
    "value": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1.0\"\n />\n <title>Functional Beautiful Math Calculator</title>\n <style>\n body {\n font-family: Arial, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n margin: 0;\n background-color: #f5f5f5;\n }\n .calculator {\n background-color: #ededed;\n border-radius: 10px;\n box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);\n padding: 20px;\n width: 300px;\n }\n .display {\n background-color: #d4d4d4;\n border: 2px solid #ff9800;\n border-radius: 5px;\n font-size: 24px;\n height: 60px;\n margin-bottom: 20px;\n padding: 10px;\n text-align: right;\n overflow: hidden;\n }\n .buttons {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n }\n button {\n background-color: #ededed;\n border: 2px solid #ff9800;\n border-radius: 5px;\n color: #333;\n cursor: pointer;\n font-size: 18px;\n padding: 15px;\n transition: all 0.3s ease;\n }\n button:hover {\n background-color: #ff9800;\n color: white;\n }\n .operator {\n background-color: #d4d4d4;\n }\n .equals {\n background-color: #ff9800;\n color: white;\n }\n .equals:hover {\n background-color: #f57c00;\n }\n </style>\n </head>\n <body>\n <div class=\"calculator\">\n <div class=\"display\">0</div>\n <div class=\"buttons\">\n <button onclick=\"appendNumber('7')\">7</button>\n <button onclick=\"appendNumber('8')\">8</button>\n <button onclick=\"appendNumber('9')\">9</button>\n <button\n class=\"operator\"\n onclick=\"setOperation('/')\"\n >\n ÷\n </button>\n <button onclick=\"appendNumber('4')\">4</button>\n <button onclick=\"appendNumber('5')\">5</button>\n <button onclick=\"appendNumber('6')\">6</button>\n <button\n class=\"operator\"\n onclick=\"setOperation('*')\"\n >\n ×\n </button>\n <button onclick=\"appendNumber('1')\">1</button>\n <button onclick=\"appendNumber('2')\">2</button>\n <button onclick=\"appendNumber('3')\">3</button>\n <button\n class=\"operator\"\n onclick=\"setOperation('-')\"\n >\n -\n </button>\n <button onclick=\"appendNumber('0')\">0</button>\n <button onclick=\"appendDecimal()\">.</button>\n <button class=\"equals\" onclick=\"calculate()\">\n =\n </button>\n <button\n class=\"operator\"\n onclick=\"setOperation('+')\"\n >\n +\n </button>\n </div>\n </div>\n\n <script>\n let displayValue = \"0\";\n let firstOperand = null;\n let operator = null;\n let waitingForSecondOperand = false;\n\n const display = document.querySelector(\".display\");\n\n function updateDisplay() {\n display.textContent = displayValue;\n }\n\n function appendNumber(number) {\n if (waitingForSecondOperand) {\n displayValue = number;\n waitingForSecondOperand = false;\n } else {\n displayValue =\n displayValue === \"0\"\n ? number\n : displayValue + number;\n }\n updateDisplay();\n }\n\n function appendDecimal() {\n if (!displayValue.includes(\".\")) {\n displayValue += \".\";\n updateDisplay();\n }\n }\n\n function setOperation(op) {\n if (operator && waitingForSecondOperand) {\n operator = op;\n return;\n }\n\n if (firstOperand === null) {\n firstOperand = parseFloat(displayValue);\n } else if (operator) {\n const result = calculate();\n displayValue = `${parseFloat(result.toFixed(7))}`;\n firstOperand = result;\n }\n\n waitingForSecondOperand = true;\n operator = op;\n updateDisplay();\n }\n\n function calculate() {\n if (operator === null || waitingForSecondOperand) {\n return displayValue;\n }\n\n const secondOperand = parseFloat(displayValue);\n let result;\n\n switch (operator) {\n case \"+\":\n result = firstOperand + secondOperand;\n break;\n case \"-\":\n result = firstOperand - secondOperand;\n break;\n case \"*\":\n result = firstOperand * secondOperand;\n break;\n case \"/\":\n result = firstOperand / secondOperand;\n break;\n default:\n return;\n }\n\n displayValue = `${parseFloat(result.toFixed(7))}`;\n firstOperand = result;\n operator = null;\n waitingForSecondOperand = false;\n updateDisplay();\n return result;\n }\n\n updateDisplay();\n </script>\n </body>\n</html>\n"
  }
}

```

---

<div class="post-metadata">

**Author:** ![Jeff\_Hager](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/jeff_hager/32/43_2.png) [@Jeff\_Hager](https://community.glideapps.com/u/Jeff_Hager)\
**Post date:** [July 11, 2024, 4:23pm UTC](https://community.glideapps.com/t/one-shot-custom-components-with-claude-3-5-sonnet/74828/3 "2024-07-11T16:23:26Z")

</div>

> [@new Custom Component (AI Generated)](https://community.glideapps.com/t/custom-component-ai-generated/74533/53):
>
> The HTML mode uses [Alpine.js](https://alpinejs.dev/) – check it out for details. Use @click to connect a click to an action in Glide

> [@new Custom Component (AI Generated)](https://community.glideapps.com/t/custom-component-ai-generated/74533/61):
>
> @doslab the data names are exposed to Alpinejs. Try this: \<p x-text="Name"\>\</p\>
