{"id":12026,"date":"2026-10-11T12:07:50","date_gmt":"2026-10-11T03:07:50","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=12026"},"modified":"2026-10-11T13:57:35","modified_gmt":"2026-10-11T04:57:35","slug":"webui-tailwind-nextjs-dropdown-4","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/10\/11\/webui-tailwind-nextjs-dropdown-4\/","title":{"rendered":"[WebUI]Tailwind + nextjs(Drop down menu) \u2013 4"},"content":{"rendered":"\n<p>\ud83d\udc49\ud83c\udffb \uc544\ub798\ub294 Dropdown Menu \ubd80\ubd84\uc785\ub2c8\ub2e4.<br>The section below is the dropdown menu.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \ub808\uc774\uc544\uc6c3, \ud3f0\ud2b8\uc0ac\uc774\uc988\ub098 \ub300\ubd80\ubd84\uc758 css,tailwindcss \ub0b4\uc6a9\uc740 \uc774\uc804 \ud3ec\uc2a4\ud2b8\uc758 \ub0b4\uc6a9\uacfc \uac70\uc758 \uc720\uc0ac\ud569\ub2c8\ub2e4.<br>The layout, font size, and most of the CSS and Tailwind CSS details are nearly identical to those in the previous post.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \ucef4\ud3ec\ub10c\ud2b8 \ud615\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560\uc218 \uc788\ub3c4\ub85d ui\ub514\ub809\ud1a0\ub9ac\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<br>A <code>ui<\/code> directory has been added to enable usage in component form.<\/p>\n\n\n\n<p>\ud83d\udcc1 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870 \/ Project Structure<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tailwindcss-nextjs\/\n\u2514\u2500\u2500 app\/\n    \u251c\u2500\u2500 button-css\/\n    \u251c\u2500\u2500 button-tailwind\/\n    \u251c\u2500\u2500 card-css\/\n    \u251c\u2500\u2500 card-tailwind\/\n    \u251c\u2500\u2500 form-css\/\n    \u251c\u2500\u2500 form-tailwind\/\n    \u251c\u2500\u2500 <strong>dropdown-css\/<\/strong>\n    \u251c\u2500\u2500 <strong>dropdown-tailwind\/<\/strong>\n    \u2514\u2500\u2500 <strong>ui\/<\/strong>\n        \u251c\u2500\u2500 page.tsx\n        \u2514\u2500\u2500 _components\/\n            \u251c\u2500\u2500 button.tsx     \n            \u2514\u2500\u2500 dropdown.tsx   <\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 Dropdown Menu &#8211; Tailwind &amp; CSS<\/p>\n\n\n\n<p>\u2714\ufe0f Tailwind<\/p>\n\n\n\n<p>&#8212; \uc2a4\ud06c\ub9b0 \uc0f7 \/ Screen Shoot<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"390\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/tcss-jpg.jpg\" alt=\"\" class=\"wp-image-12053\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/tcss-jpg.jpg 500w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/tcss-jpg-300x234.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/tcss-jpg-400x312.jpg 400w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption class=\"wp-element-caption\">tailwindcss<\/figcaption><\/figure>\n\n\n\n<p>&#8212; http:\/\/localhost:3000\/dropdown-tailwind<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:14px\"><code>'use client'\nimport { useState } from 'react'\n\nconst OPTIONS = &#91;\n  { value: '9s', label: '9S' },\n  { value: '2b', label: '2B' },\n  { value: '4b', label: '4B' },\n]\n\nexport default function Page() {\n  const &#91;open, setOpen] = useState(false)\n  const &#91;value, setValue] = useState(OPTIONS&#91;0])\n\n  return (\n    &lt;main className=\"min-h-screen flex items-center justify-center bg-gray-50 p-4\"&gt;\n      &lt;div className=\"w-full max-w-sm bg-white rounded-2xl shadow-lg p-6\"&gt;\n        &lt;h2 className=\"text-base font-bold\"&gt;\ub4dc\ub86d\ub2e4\uc6b4\/Drop down(Tailwindcss)&lt;\/h2&gt;\n        &lt;p className=\"text-sm text-gray-400 mt-1\"&gt;freelifemakers&lt;\/p&gt;\n\n        &lt;div className=\"mt-6 flex flex-col gap-1.5\"&gt;\n          &lt;label className=\"text-sm font-bold text-gray-700\"&gt;\uc9c1\uc5c5 \/ Role&lt;\/label&gt;\n\n          {\/* Select *\/}\n          &lt;div className=\"relative\"&gt;\n            {\/* 1. \ubc84\ud2bc - \ud56d\uc0c1 \ubcf4\uc774\ub294 \ubd80\ubd84 \/ Button - Always visible part *\/}\n            &lt;button\n              onClick={() =&gt; setOpen(!open)}\n              className=\"w-full flex items-center justify-between px-4 py-3 bg-gray-50 border border-gray-200 rounded-xl text-sm text-left focus:outline-none focus:ring-2 focus:ring-blue-500 focus:bg-white transition-all\"\n            &gt;\n              &lt;span&gt;{value.label}&lt;\/span&gt;\n              &lt;span className={`transition-transform ${open? 'rotate-180' : ''}`}&gt;\u25bc&lt;\/span&gt;\n            &lt;\/button&gt;\n\n            {\/* 2. \ub9ac\uc2a4\ud2b8 - open\uc77c \ub54c\ub9cc \ubcf4\uc774\ub294 \ubd80\ubd84 \/ List \u2013 section visible only when open *\/}\n            {open &amp;&amp; (\n              &lt;div className=\"absolute z-10 mt-2 w-full bg-white border border-gray-200 rounded-xl shadow-lg overflow-hidden\"&gt;\n                {OPTIONS.map((opt) =&gt; (\n                  &lt;button\n                    key={opt.value}\n                    onClick={() =&gt; {\n                      setValue(opt)\n                      setOpen(false)\n                    }}\n                    className={`w-full text-left px-4 py-3 text-sm hover:bg-gray-50 transition-colors ${\n                      value.value === opt.value? 'bg-blue-50 text-blue-600 font-bold' : 'text-gray-700'\n                    }`}\n                  &gt;\n                    {opt.label}\n                  &lt;\/button&gt;\n                ))}\n              &lt;\/div&gt;\n            )}\n          &lt;\/div&gt;\n\n          &lt;p className=\"text-xs text-gray-400 mt-2\"&gt;\uc120\ud0dd\ub41c \uac12\/Selected Value : {value.value}&lt;\/p&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n    &lt;\/main&gt;\n  )\n}<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f CSS<\/p>\n\n\n\n<p>&#8212; \uc2a4\ud06c\ub9b0 \uc0f7 \/ ScreenShot<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"439\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/css-jpg.jpg\" alt=\"\" class=\"wp-image-12050\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/css-jpg.jpg 500w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/css-jpg-300x263.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/css-jpg-400x351.jpg 400w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption class=\"wp-element-caption\">css<\/figcaption><\/figure>\n\n\n\n<p>&#8212; http:\/\/localhost:3000\/dropdown-css<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:14px\"><code>'use client'\nimport { useState } from 'react'\n\nconst OPTIONS = &#91;\n  { value: '9s', label: '9S' },\n  { value: '2b', label: '2B' },\n  { value: '4b', label: '4B' },\n]\n\nexport default function Page() {\n  const &#91;open, setOpen] = useState(false)\n  const &#91;value, setValue] = useState(OPTIONS&#91;0])\n\n  return (\n    &lt;&gt;\n      &lt;main className=\"page\"&gt;\n        &lt;div className=\"card\"&gt;\n          &lt;h2 className=\"title\"&gt;\ub4dc\ub86d\ub2e4\uc6b4\/Drop down(CSS)&lt;\/h2&gt;\n          &lt;p className=\"subtitle\"&gt;freelifemakers&lt;\/p&gt;\n\n          &lt;div className=\"field-group\"&gt;\n            &lt;label className=\"label\"&gt;\uc9c1\uc5c5 \/ Role&lt;\/label&gt;\n\n            {\/* Select \ubcf8\uccb4 - relative \uae30\uc900\uc810 *\/}\n            &lt;div className=\"select-wrap\"&gt;\n              {\/* 1. \ubc84\ud2bc *\/}\n              &lt;button\n                onClick={() =&gt; setOpen(!open)}\n                className=\"select-btn\"\n              &gt;\n                &lt;span&gt;{value.label}&lt;\/span&gt;\n                &lt;span className={`arrow ${open? 'arrow-open' : ''}`}&gt;\u25bc&lt;\/span&gt;\n              &lt;\/button&gt;\n\n              {\/* 2. \ub9ac\uc2a4\ud2b8 *\/}\n              {open &amp;&amp; (\n                &lt;div className=\"select-list\"&gt;\n                  {OPTIONS.map((opt) =&gt; (\n                    &lt;button\n                      key={opt.value}\n                      onClick={() =&gt; {\n                        setValue(opt)\n                        setOpen(false)\n                      }}\n                      className={`select-option ${value.value === opt.value? 'selected' : ''}`}\n                    &gt;\n                      {opt.label}\n                    &lt;\/button&gt;\n                  ))}\n                &lt;\/div&gt;\n              )}\n            &lt;\/div&gt;\n\n            &lt;p className=\"hint\"&gt;\uc120\ud0dd\ub41c \uac12\/Selected Value : {value.value}&lt;\/p&gt;\n          &lt;\/div&gt;\n        &lt;\/div&gt;\n      &lt;\/main&gt;\n\n      &lt;style&gt;{`\n       .page {\n          min-height: 100vh;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          background: #f9fafb;\n          padding: 16px;\n        }\n       .card {\n          width: 100%;\n          max-width: 384px;\n          background: white;\n          border-radius: 16px;\n          box-shadow: 0 10px 15px rgba(0,0,0,0.1);\n          padding: 24px;\n        }\n       .title { font-size: 16px; font-weight: 700; }\n       .subtitle { font-size: 14px; color: #9ca3af; margin-top: 4px; }\n\n       .field-group {\n          margin-top: 24px;\n          display: flex;\n          flex-direction: column;\n          gap: 6px;\n        }\n       .label {\n          font-size: 14px;\n          font-weight: 700;\n          color: #374151;\n        }\n       .hint {\n          font-size: 12px;\n          color: #9ca3af;\n          margin-top: 8px;\n        }\n\n        \/* Dropdown \uae30\uc900\uc810 \/ benchmark - relative *\/\n       .select-wrap {\n          position: relative;\n        }\n\n        \/* 1. \ubc84\ud2bc \/ button- w-full flex justify-between *\/\n       .select-btn {\n          width: 100%;\n          display: flex;\n          align-items: center;\n          justify-content: space-between;\n          padding: 12px 16px;\n          background: #f9fafb;\n          border: 1px solid #e5e7eb;\n          border-radius: 12px;\n          font-size: 14px;\n          text-align: left;\n          cursor: pointer;\n          transition: all 0.15s;\n        }\n       .select-btn:focus {\n          outline: none;\n          background: white;\n          border-color: #3b82f6;\n          box-shadow: 0 0 0 2px rgba(59,130,246,0.3);\n        }\n\n        \/* \ud654\uc0b4\ud45c \ud68c\uc804 \/ Rotate arrow *\/\n       .arrow {\n          transition: transform 0.2s;\n          font-size: 12px;\n        }\n       .arrow-open {\n          transform: rotate(180deg);\n        }\n\n        \/* 2. \ub9ac\uc2a4\ud2b8 \/ List - absolute z-10 mt-2 *\/\n       .select-list {\n          position: absolute;\n          z-index: 10;\n          margin-top: 8px;\n          width: 100%;\n          background: white;\n          border: 1px solid #e5e7eb;\n          border-radius: 12px;\n          box-shadow: 0 10px 15px rgba(0,0,0,0.1);\n          overflow: hidden;\n        }\n\n        \/* \uc635\uc158 \ud558\ub098 \/ One option *\/\n       .select-option {\n          width: 100%;\n          text-align: left;\n          padding: 12px 16px;\n          font-size: 14px;\n          border: none;\n          background: white;\n          color: #374151;\n          cursor: pointer;\n          transition: background 0.15s;\n        }\n       .select-option:hover {\n          background: #f9fafb;\n        }\n       .select-option.selected {\n          background: #eff6ff;\n          color: #2563eb;\n          font-weight: 700;\n        }\n      `}&lt;\/style&gt;\n    &lt;\/&gt;\n  )\n}<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ucef4\ud3ec\ub10c\ud2b8 \ud615\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud558\uae30 \/ Using as a component<\/p>\n\n\n\n<p>&#8212; \uc2a4\ud06c\ub9b0 \uc0f7 \/ ScreenShot<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"341\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/ui-jpg.jpg\" alt=\"\" class=\"wp-image-12055\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/ui-jpg.jpg 500w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/ui-jpg-300x205.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/ui-jpg-400x273.jpg 400w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption class=\"wp-element-caption\">UI Library<\/figcaption><\/figure>\n\n\n\n<p>&#8212; http:\/\/localhost:3000\/ui<\/p>\n\n\n\n<p>\u2714\ufe0f \ud604\uc7ac \ubc84\ud2bc\uacfc \ub4dc\ub86d\ub2e4\uc6b4 \uba54\ub274\uac00 _compoents\uc5d0 \uc788\uc2b5\ub2c8\ub2e4.(button.tsx dropdown.tsx)<br>Currently, the button and dropdown menu are located in <code>_components<\/code> (<code>button.tsx<\/code>, <code>dropdown.tsx<\/code>).<\/p>\n\n\n\n<p>\u2714\ufe0f app\/ui\/page.tsx\uc5d0\uc11c \uc0ac\uc6a9\uc2dc \uc544\ub798\ucc98\ub7fc \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<br>When using it in <code>app\/ui\/page.tsx<\/code>, use it as shown below.<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:14px\"><code>\/\/ compoents\n<strong>import { Button }  from '.\/_components\/button'\nimport { Dropdown } from '.\/_components\/dropdown';<\/strong>\n\nexport default function UIPage() {\n  return (\n    &lt;main className=\"min-h-screen flex items-center justify-center bg-gray-50 p-4\"&gt;\n      &lt;div className=\"w-full max-w-sm bg-white rounded-2xl shadow-lg p-6 flex flex-col gap-6\"&gt;\n        &lt;h1 className=\"text-xl font-bold\"&gt;\ub0b4 UI \ub77c\uc774\ube0c\ub7ec\ub9ac \/ &lt;\/h1&gt;\n\n        <strong>&lt;Dropdown \/&gt;<\/strong>\n        <strong>&lt;Button&gt;\uc800\uc7a5\ud558\uae30\/Save&lt;\/Button&gt;<\/strong>\n      &lt;\/div&gt;\n    &lt;\/main&gt;\n  )\n}<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ub9c8\ud0dc\ubcf5\uc74c 21\uc7a5 22\uc808 \/ Matthew 21: 22<\/p>\n\n\n\n<p>&#8220;\ub108\ud76c\uac00 \uae30\ub3c4\ud560 \ub54c\uc5d0 \ubb34\uc5c7\uc774\ub4e0\uc9c0 \ubbff\uace0 \uad6c\ud558\ub294 \uac83\uc740 \ub2e4 \ubc1b\uc73c\ub9ac\ub77c \ud558\uc2dc\ub2c8\ub77c&#8221;<\/p>\n\n\n\n<p>&#8220;And everything you ask in prayer, believing, you will receive.&#8221;<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udc49\ud83c\udffb \uc544\ub798\ub294 Dropdown Menu \ubd80\ubd84\uc785\ub2c8\ub2e4.The section below is the dropdown menu. \ud83d\udc49\ud83c\udffb \ub808\uc774\uc544\uc6c3, \ud3f0\ud2b8\uc0ac\uc774\uc988\ub098 \ub300\ubd80\ubd84\uc758 css,tailwindcss \ub0b4\uc6a9\uc740 \uc774\uc804 \ud3ec\uc2a4\ud2b8\uc758 \ub0b4\uc6a9\uacfc \uac70\uc758 \uc720\uc0ac\ud569\ub2c8\ub2e4.The layout, font size, and most of the CSS and Tailwind CSS details are nearly identical to those in the previous post. \ud83d\udc49\ud83c\udffb \ucef4\ud3ec\ub10c\ud2b8 \ud615\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560\uc218 \uc788\ub3c4\ub85d ui\ub514\ub809\ud1a0\ub9ac\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.A ui directory has been added [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":12053,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,7,29],"tags":[],"class_list":["post-12026","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","category-website","category-webui","has-thumbnail"],"_links":{"self":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/12026","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=12026"}],"version-history":[{"count":25,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/12026\/revisions"}],"predecessor-version":[{"id":12056,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/12026\/revisions\/12056"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media\/12053"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=12026"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=12026"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=12026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}