{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "server-management",
  "title": "Server management",
  "description": "Server management is a production-ready tables component from BJORK UI, packaged for shadcn registries.",
  "dependencies": [
    "framer-motion",
    "lucide-react",
    "next-themes"
  ],
  "files": [
    {
      "path": "components/bjork-ui/tables/server-management-table.tsx",
      "content": "\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { useTheme } from \"next-themes\";\nimport { X, Power, Pause, Play, RotateCcw } from \"lucide-react\";\nimport {\n  getBjorkSignalPalette,\n  getBjorkTablePalette,\n} from \"./table-theme\";\n\nexport interface Server {\n  id: string;\n  number: string;\n  serviceName: string;\n  osType: \"windows\" | \"linux\" | \"ubuntu\";\n  serviceLocation: string;\n  countryCode: \"de\" | \"us\" | \"fr\" | \"jp\";\n  ip: string;\n  dueDate: string;\n  cpuPercentage: number;\n  status: \"active\" | \"paused\" | \"inactive\";\n}\n\ninterface ServerManagementTableProps {\n  title?: string;\n  servers?: Server[];\n  onStatusChange?: (serverId: string, newStatus: Server[\"status\"]) => void;\n  className?: string;\n}\n\nconst defaultServers: Server[] = [\n  {\n    id: \"1\",\n    number: \"01\",\n    serviceName: \"VPS-2 (Windows)\",\n    osType: \"windows\",\n    serviceLocation: \"Frankfurt, Germany\",\n    countryCode: \"de\",\n    ip: \"198.51.100.211\",\n    dueDate: \"14 Oct 2027\",\n    cpuPercentage: 80,\n    status: \"active\"\n  },\n  {\n    id: \"2\", \n    number: \"02\",\n    serviceName: \"VPS-1 (Windows)\",\n    osType: \"windows\",\n    serviceLocation: \"Frankfurt, Germany\", \n    countryCode: \"de\",\n    ip: \"203.0.113.158\",\n    dueDate: \"14 Oct 2027\",\n    cpuPercentage: 90,\n    status: \"active\"\n  },\n  {\n    id: \"3\",\n    number: \"03\", \n    serviceName: \"VPS-1 (Ubuntu)\",\n    osType: \"ubuntu\",\n    serviceLocation: \"Paris, France\",\n    countryCode: \"fr\",\n    ip: \"192.0.2.37\",\n    dueDate: \"27 Jun 2027\",\n    cpuPercentage: 50,\n    status: \"paused\"\n  },\n  {\n    id: \"4\",\n    number: \"04\",\n    serviceName: \"Cloud Server (Ubuntu)\",\n    osType: \"ubuntu\",\n    serviceLocation: \"California, US West\",\n    countryCode: \"us\",\n    ip: \"198.51.100.23\",\n    dueDate: \"30 May 2030\",\n    cpuPercentage: 95,\n    status: \"active\"\n  },\n  {\n    id: \"5\",\n    number: \"05\",\n    serviceName: \"Dedicated Server (Windows)\",\n    osType: \"windows\",\n    serviceLocation: \"Virginia, US East\",\n    countryCode: \"us\",\n    ip: \"203.0.113.45\",\n    dueDate: \"15 Dec 2026\",\n    cpuPercentage: 25,\n    status: \"inactive\"\n  }\n];\n\nexport function ServerManagementTable({\n  title = \"Active Services\",\n  servers: initialServers = defaultServers,\n  onStatusChange,\n  className = \"\"\n}: ServerManagementTableProps = {}) {\n  const [servers, setServers] = useState<Server[]>(initialServers);\n  const [selectedServer, setSelectedServer] = useState<Server | null>(null);\n  const { resolvedTheme } = useTheme();\n  const isDark = resolvedTheme !== \"light\";\n  const palette = getBjorkTablePalette(isDark);\n\n  const handleStatusChange = (serverId: string, newStatus: Server[\"status\"]) => {\n    if (onStatusChange) {\n      onStatusChange(serverId, newStatus);\n    }\n\n    setServers(prev => prev.map(server => \n      server.id === serverId ? { ...server, status: newStatus } : server\n    ));\n  };\n\n  const openServerModal = (server: Server) => {\n    setSelectedServer(server);\n  };\n\n  const closeServerModal = () => {\n    setSelectedServer(null);\n  };\n\n  // Update selected server when servers change (for real-time updates)\n  useEffect(() => {\n    if (selectedServer) {\n      const updatedServer = servers.find(s => s.id === selectedServer.id);\n      if (updatedServer) {\n        setSelectedServer(updatedServer);\n      }\n    }\n  }, [servers, selectedServer]);\n\n  const getOSIcon = (osType: Server[\"osType\"]) => {\n    switch (osType) {\n      case \"windows\":\n        return (\n          <div className=\"w-8 h-8 rounded-full bg-gradient-to-br from-blue-500 to-blue-600 flex items-center justify-center p-1.5 border border-border/30\">\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 32 32\" fill=\"none\">\n              <path className=\"fill-white\" d=\"M30,15H17c-0.6,0-1-0.4-1-1V3.3c0-0.5,0.4-0.9,0.8-1l13-2.3c0.3,0,0.6,0,0.8,0.2C30.9,0.4,31,0.7,31,1v13 C31,14.6,30.6,15,30,15z\"/>\n              <path className=\"fill-white\" d=\"M13,15H1c-0.6,0-1-0.4-1-1V6c0-0.5,0.4-0.9,0.8-1l12-2c0.3,0,0.6,0,0.8,0.2C13.9,3.4,14,3.7,14,4v10 C14,14.6,13.6,15,13,15z\"/>\n              <path className=\"fill-white\" d=\"M30,32c-0.1,0-0.1,0-0.2,0l-13-2.3c-0.5-0.1-0.8-0.5-0.8-1V18c0-0.6,0.4-1,1-1h13c0.6,0,1,0.4,1,1v13 c0,0.3-0.1,0.6-0.4,0.8C30.5,31.9,30.2,32,30,32z\"/>\n              <path className=\"fill-white\" d=\"M13,29c-0.1,0-0.1,0-0.2,0l-12-2C0.4,26.9,0,26.5,0,26v-8c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v10 c0,0.3-0.1,0.6-0.4,0.8C13.5,28.9,13.2,29,13,29z\"/>\n            </svg>\n          </div>\n        );\n      case \"ubuntu\":\n        return (\n          <div className=\"w-8 h-8 rounded-full bg-gradient-to-br from-orange-500 to-orange-600 flex items-center justify-center p-1.5 border border-border/30\">\n            <svg width=\"16\" height=\"16\" viewBox=\"-5 0 32 32\" fill=\"white\">\n              <path d=\"M16.469 9.375c-1.063-0.594-1.406-1.938-0.813-3 0.406-0.719 1.156-1.094 1.906-1.094 0.375 0 0.75 0.094 1.094 0.281 1.063 0.625 1.406 1.969 0.813 3-0.406 0.719-1.156 1.094-1.906 1.094-0.375 0-0.75-0.094-1.094-0.281zM21.938 15.594h-3.625c-0.125-1.688-0.969-3.188-2.25-4.156-0.219-0.156-0.438-0.313-0.688-0.469-0.813-0.438-1.75-0.688-2.75-0.688-1.031 0-1.969 0.25-2.813 0.719l-2-3.031c1.406-0.844 3.031-1.313 4.813-1.313 0.688 0 1.375 0.063 2.063 0.219-0.25 1.219 0.281 2.5 1.406 3.156 0.438 0.25 0.938 0.375 1.469 0.375 0.719 0 1.406-0.25 1.938-0.719 1.438 1.563 2.344 3.625 2.438 5.906zM7.125 8.438l2 3.031c-1.25 0.969-2.094 2.438-2.188 4.125-0.031 0.125-0.031 0.25-0.031 0.406 0 0.125 0 0.281 0.031 0.406 0.125 1.781 1.063 3.313 2.438 4.281l-1.906 3.094c-1.813-1.188-3.188-3-3.813-5.125 0.875-0.5 1.5-1.469 1.5-2.563s-0.625-2.094-1.563-2.594c0.594-2.063 1.844-3.844 3.531-5.063zM2.188 13.906c1.219 0 2.219 0.969 2.219 2.188s-1 2.219-2.219 2.219-2.188-1-2.188-2.219 0.969-2.188 2.188-2.188zM8.188 24.219l1.906-3.125c0.75 0.375 1.625 0.594 2.531 0.594 1 0 1.938-0.25 2.781-0.719 0.25-0.125 0.469-0.281 0.688-0.469 1.25-0.938 2.094-2.406 2.219-4.094h3.625c-0.094 2.375-1.094 4.531-2.656 6.125-0.469-0.344-1.063-0.531-1.656-0.531-0.531 0-1.031 0.125-1.469 0.375-1 0.594-1.531 1.656-1.469 2.719-0.688 0.156-1.375 0.25-2.063 0.25-1.625 0-3.125-0.406-4.438-1.125zM17.625 22.75c0.75 0 1.5 0.375 1.906 1.094 0.594 1.063 0.219 2.438-0.813 3.031-0.344 0.188-0.719 0.281-1.094 0.281-0.781 0-1.5-0.375-1.906-1.094-0.625-1.063-0.25-2.406 0.813-3.031 0.344-0.188 0.719-0.281 1.094-0.281z\"/>\n            </svg>\n          </div>\n        );\n      case \"linux\":\n        return (\n          <div className=\"w-8 h-8 rounded-full bg-gradient-to-br from-gray-600 to-gray-800 flex items-center justify-center border border-border/30\">\n            <div className=\"text-white text-xs font-mono font-bold\">L</div>\n          </div>\n        );\n    }\n  };\n\n  const getCountryFlag = (countryCode: Server[\"countryCode\"]) => {\n    switch (countryCode) {\n      case \"de\":\n        return (\n          <svg width=\"32\" height=\"32\" viewBox=\"0 0 130 120\" fill=\"none\" className=\"scale-125\">\n            <rect fill=\"#1E1D1D\" width=\"130\" height=\"39\"/>\n            <rect y=\"39\" fill=\"#DC4437\" width=\"130\" height=\"42\"/>\n            <rect y=\"81\" fill=\"#FCBE1F\" width=\"130\" height=\"39\"/>\n          </svg>\n        );\n      case \"us\":\n        return (\n          <svg width=\"32\" height=\"32\" viewBox=\"0 0 130 120\" fill=\"none\" className=\"scale-125\">\n            <rect y=\"0\" fill=\"#DC4437\" width=\"130\" height=\"13.3\"/>\n            <rect y=\"26.7\" fill=\"#DC4437\" width=\"130\" height=\"13.3\"/>\n            <rect y=\"80\" fill=\"#DC4437\" width=\"130\" height=\"13.3\"/>\n            <rect y=\"106.7\" fill=\"#DC4437\" width=\"130\" height=\"13.3\"/>\n            <rect y=\"53.3\" fill=\"#DC4437\" width=\"130\" height=\"13.3\"/>\n            <rect y=\"13.3\" fill=\"#FFFFFF\" width=\"130\" height=\"13.3\"/>\n            <rect y=\"40\" fill=\"#FFFFFF\" width=\"130\" height=\"13.3\"/>\n            <rect y=\"93.3\" fill=\"#FFFFFF\" width=\"130\" height=\"13.3\"/>\n            <rect y=\"66.7\" fill=\"#FFFFFF\" width=\"130\" height=\"13.3\"/>\n            <rect y=\"0\" fill=\"#2A66B7\" width=\"70\" height=\"66.7\"/>\n            <polygon fill=\"#FFFFFF\" points=\"13.5,4 15.8,8.9 21,9.7 17.2,13.6 18.1,19 13.5,16.4 8.9,19 9.8,13.6 6,9.7 11.2,8.9\"/>\n            <polygon fill=\"#FFFFFF\" points=\"34,4 36.3,8.9 41.5,9.7 37.8,13.6 38.6,19 34,16.4 29.4,19 30.2,13.6 26.5,9.7 31.7,8.9\"/>\n            <polygon fill=\"#FFFFFF\" points=\"54.5,4 56.8,8.9 62,9.7 58.2,13.6 59.1,19 54.5,16.4 49.9,19 50.8,13.6 47,9.7 52.2,8.9\"/>\n            <polygon fill=\"#FFFFFF\" points=\"24,24 26.3,28.9 31.5,29.7 27.8,33.6 28.6,39 24,36.4 19.4,39 20.2,33.6 16.5,29.7 21.7,28.9\"/>\n            <polygon fill=\"#FFFFFF\" points=\"44.5,24 46.8,28.9 52,29.7 48.2,33.6 49.1,39 44.5,36.4 39.9,39 40.8,33.6 37,29.7 42.2,28.9\"/>\n            <polygon fill=\"#FFFFFF\" points=\"13.5,45.2 15.8,50.1 21,50.9 17.2,54.7 18.1,60.2 13.5,57.6 8.9,60.2 9.8,54.7 6,50.9 11.2,50.1\"/>\n            <polygon fill=\"#FFFFFF\" points=\"34,45.2 36.3,50.1 41.5,50.9 37.8,54.7 38.6,60.2 34,57.6 29.4,60.2 30.2,54.7 26.5,50.9 31.7,50.1\"/>\n            <polygon fill=\"#FFFFFF\" points=\"54.5,45.2 56.8,50.1 62,50.9 58.2,54.7 59.1,60.2 54.5,57.6 49.9,60.2 50.8,54.7 47,50.9 52.2,50.1\"/>\n          </svg>\n        );\n      case \"fr\":\n        return (\n          <svg width=\"32\" height=\"32\" viewBox=\"0 0 90 60\" fill=\"none\" className=\"scale-150\">\n            <rect width=\"30\" height=\"60\" fill=\"#0055A4\"/>\n            <rect x=\"30\" width=\"30\" height=\"60\" fill=\"#FFFFFF\"/>\n            <rect x=\"60\" width=\"30\" height=\"60\" fill=\"#EF4135\"/>\n          </svg>\n        );\n      case \"jp\":\n        return (\n          <svg width=\"32\" height=\"32\" viewBox=\"0 0 90 60\" fill=\"none\" className=\"scale-150\">\n            <rect width=\"90\" height=\"60\" fill=\"#FFFFFF\"/>\n            <circle cx=\"45\" cy=\"30\" r=\"18\" fill=\"#BC002D\"/>\n          </svg>\n        );\n    }\n  };\n\n  const getCPUBars = (percentage: number, status: Server[\"status\"]) => {\n    const filledBars = Math.round((percentage / 100) * 10);\n    \n    const getBarColor = (index: number) => {\n      if (index >= filledBars) {\n        return isDark ? \"border border-[#232323] bg-[#181818]\" : \"border border-[#d8d3c7] bg-[#ded7ca]\";\n      }\n      \n      switch (status) {\n        case \"active\":\n          return \"bg-[#d86a2c]\";\n        case \"paused\":\n          return isDark ? \"bg-[#ededed]/38\" : \"bg-[#171717]/34\";\n        case \"inactive\":\n          return isDark ? \"bg-[#ededed]/20\" : \"bg-[#171717]/18\";\n        default:\n          return \"bg-foreground/60\";\n      }\n    };\n    \n    return (\n      <div className=\"flex items-center gap-3\">\n        <div className=\"flex gap-1\">\n          {Array.from({ length: 10 }).map((_, index) => (\n            <div\n              key={index}\n              className={`w-1.5 h-5 rounded-full transition-all duration-500 ${getBarColor(index)}`}\n            />\n          ))}\n        </div>\n        <span className={`min-w-[3rem] font-mono text-sm font-medium ${palette.primaryText}`}>\n          {percentage}%\n        </span>\n      </div>\n    );\n  };\n\n  const getStatusBadge = (status: Server[\"status\"]) => {\n    const active = getBjorkSignalPalette(\"green\", isDark);\n    const paused = getBjorkSignalPalette(\"orange\", isDark);\n    const inactive = getBjorkSignalPalette(\"red\", isDark);\n\n    switch (status) {\n      case \"active\":\n        return (\n          <div className={`flex items-center justify-center rounded-lg border px-3 py-1.5 ${active.bgColor} ${active.borderColor}`}>\n            <span className={`text-sm font-medium ${active.textColor}`}>Active</span>\n          </div>\n        );\n      case \"paused\":\n        return (\n          <div className={`flex items-center justify-center rounded-lg border px-3 py-1.5 ${paused.bgColor} ${paused.borderColor}`}>\n            <span className={`text-sm font-medium ${paused.textColor}`}>Paused</span>\n          </div>\n        );\n      case \"inactive\":\n        return (\n          <div className={`flex items-center justify-center rounded-lg border px-3 py-1.5 ${inactive.bgColor} ${inactive.borderColor}`}>\n            <span className={`text-sm font-medium ${inactive.textColor}`}>Inactive</span>\n          </div>\n        );\n    }\n  };\n\n  const getStatusGradient = (status: Server[\"status\"]) => {\n    switch (status) {\n      case \"active\":\n        return \"from-[#77b58b]/10 to-transparent\";\n      case \"paused\": \n        return \"from-[#ec5c13]/12 to-transparent\";\n      case \"inactive\":\n        return \"from-[#cf7c72]/10 to-transparent\";\n    }\n  };\n\n  return (\n    <div className={`mx-auto w-full max-w-[1280px] ${className}`}>\n      <div className={`relative overflow-hidden rounded-[18px] border p-5 md:p-6 ${palette.container}`}>\n        {/* Header */}\n        <div className=\"mb-6 flex items-center justify-between\">\n          <div className=\"flex items-center gap-4\">\n            <div className=\"flex items-center gap-2\">\n              <div className=\"h-2 w-2 rounded-full bg-[#d86a2c]\" />\n              <h1 className={`text-[22px] font-medium tracking-[-0.03em] ${palette.primaryText}`}>{title}</h1>\n            </div>\n            <div className={`text-sm ${palette.secondaryText}`}>\n              {servers.filter(s => s.status === \"active\").length} active\n              <span className=\"mx-2\">•</span>\n              {servers.filter(s => s.status === \"paused\").length} paused\n              <span className=\"mx-2\">•</span>\n              {servers.filter(s => s.status === \"inactive\").length} inactive\n            </div>\n          </div>\n        </div>\n\n        {/* Table */}\n        <div className=\"overflow-x-auto\">\n        <motion.div\n          className=\"min-w-[1180px] space-y-2\"\n          variants={{\n            visible: {\n              transition: {\n                staggerChildren: 0.08,\n                delayChildren: 0.1,\n              }\n            }\n          }}\n          initial=\"hidden\"\n          animate=\"visible\"\n        >\n          {/* Headers */}\n          <div className={`grid grid-cols-12 gap-4 border-b px-4 pb-3 text-[11px] font-medium uppercase tracking-[0.16em] ${isDark ? \"border-[#232323] text-[#ededed]/34\" : \"border-[#d8d3c7] text-[#171717]/36\"}`}>\n            <div className=\"col-span-1\">No</div>\n            <div className=\"col-span-2\">Service Name</div>\n            <div className=\"col-span-2\">Service Location</div>\n            <div className=\"col-span-2\">IP</div>\n            <div className=\"col-span-2\">Due Date</div>\n            <div className=\"col-span-2\">CPU</div>\n            <div className=\"col-span-1\">Status</div>\n          </div>\n\n          {/* Server Rows */}\n          {servers.map((server) => (\n            <motion.div\n              key={server.id}\n              variants={{\n                hidden: { \n                  opacity: 0, \n                  x: -25,\n                  scale: 0.95,\n                  filter: \"blur(4px)\" \n                },\n                visible: {\n                  opacity: 1,\n                  x: 0,\n                  scale: 1,\n                  filter: \"blur(0px)\",\n                  transition: {\n                    type: \"spring\",\n                    stiffness: 400,\n                    damping: 28,\n                    mass: 0.6,\n                  },\n                },\n              }}\n              className=\"relative cursor-pointer\"\n              onClick={() => openServerModal(server)}\n            >\n              <motion.div\n                className={`relative overflow-hidden rounded-[16px] border p-4 ${palette.row}`}\n                whileHover={{\n                  y: -1,\n                  transition: { type: \"spring\", stiffness: 400, damping: 25 }\n                }}\n              >\n                {/* Status gradient overlay */}\n                <div \n                  className={`absolute inset-0 bg-gradient-to-l ${getStatusGradient(server.status)} pointer-events-none`}\n                  style={{ \n                    backgroundSize: \"30% 100%\", \n                    backgroundPosition: \"right\",\n                    backgroundRepeat: \"no-repeat\"\n                  }} \n                />\n                \n                {/* Grid Content */}\n                <div className=\"relative grid grid-cols-12 gap-4 items-center\">\n                  {/* Number */}\n                  <div className=\"col-span-1\">\n                    <span className={`text-2xl font-bold ${palette.secondaryText}`}>\n                      {server.number}\n                    </span>\n                  </div>\n\n                  {/* Service Name */}\n                  <div className=\"col-span-2 flex items-center gap-3\">\n                    {getOSIcon(server.osType)}\n                    <span className={`font-medium ${palette.primaryText}`}>\n                      {server.serviceName}\n                    </span>\n                  </div>\n\n                  {/* Service Location */}\n                  <div className=\"col-span-2 flex items-center gap-3\">\n                    <div className={`flex h-8 w-8 items-center justify-center overflow-hidden rounded-full border ${palette.divider}`}>\n                      <div className=\"w-full h-full\">\n                        {getCountryFlag(server.countryCode)}\n                      </div>\n                    </div>\n                    <span className={palette.primaryText}>\n                      {server.serviceLocation}\n                    </span>\n                  </div>\n\n                  {/* IP */}\n                  <div className=\"col-span-2\">\n                    <span className={`font-mono text-sm ${palette.primaryText}`}>\n                      {server.ip}\n                    </span>\n                  </div>\n\n                  {/* Due Date */}\n                  <div className=\"col-span-2\">\n                    <span className={palette.primaryText}>\n                      {server.dueDate}\n                    </span>\n                  </div>\n\n                  {/* CPU */}\n                  <div className=\"col-span-2\">\n                    {getCPUBars(server.cpuPercentage, server.status)}\n                  </div>\n\n                  {/* Status */}\n                  <div className=\"col-span-1\">\n                    {getStatusBadge(server.status)}\n                  </div>\n                </div>\n              </motion.div>\n            </motion.div>\n          ))}\n        </motion.div>\n        </div>\n\n        {/* Server Management Overlay - Inside Card */}\n        <AnimatePresence>\n          {selectedServer && (\n            <motion.div\n              initial={{ opacity: 0 }}\n              animate={{ opacity: 1 }}\n              exit={{ opacity: 0 }}\n              transition={{ duration: 0.2 }}\n              className={`absolute inset-0 z-10 flex flex-col overflow-hidden rounded-[18px] backdrop-blur-sm ${isDark ? \"bg-[#080808]/62\" : \"bg-[#f4f2ec]/64\"}`}\n            >\n              {/* Header with Actions */}\n              <div className={`relative flex items-center justify-between border-b bg-gradient-to-r p-4 ${palette.divider} ${isDark ? \"from-[#181818]\" : \"from-[#e7e1d5]\"} to-transparent`}>\n                <div className=\"flex items-center gap-4\">\n                  <div className={`text-2xl font-bold ${palette.secondaryText}`}>\n                    {selectedServer.number}\n                  </div>\n                  {getOSIcon(selectedServer.osType)}\n                  <div>\n                    <h3 className={`text-lg font-bold ${palette.primaryText}`}>\n                      {selectedServer.serviceName}\n                    </h3>\n                    <div className=\"flex items-center gap-2\">\n                      <div className={`flex h-5 w-5 items-center justify-center overflow-hidden rounded-full border ${palette.divider}`}>\n                        <div className=\"w-full h-full scale-75\">\n                          {getCountryFlag(selectedServer.countryCode)}\n                        </div>\n                      </div>\n                      <span className={`text-sm ${palette.secondaryText}`}>\n                        {selectedServer.serviceLocation}\n                      </span>\n                    </div>\n                  </div>\n                </div>\n\n                {/* Action Buttons in Header */}\n                <div className=\"flex items-center gap-2\">\n                  {/* Start/Stop */}\n                  {selectedServer.status === \"active\" ? (\n                    <motion.button\n                      className={`flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm transition-colors ${getBjorkSignalPalette(\"red\", isDark).bgColor} ${getBjorkSignalPalette(\"red\", isDark).borderColor} ${getBjorkSignalPalette(\"red\", isDark).textColor}`}\n                      onClick={() => handleStatusChange(selectedServer.id, \"inactive\")}\n                      whileHover={{ scale: 1.02 }}\n                      whileTap={{ scale: 0.98 }}\n                    >\n                      <Power className=\"w-3 h-3\" />\n                      Stop\n                    </motion.button>\n                  ) : (\n                    <motion.button\n                      className={`flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm transition-colors ${getBjorkSignalPalette(\"green\", isDark).bgColor} ${getBjorkSignalPalette(\"green\", isDark).borderColor} ${getBjorkSignalPalette(\"green\", isDark).textColor}`}\n                      onClick={() => handleStatusChange(selectedServer.id, \"active\")}\n                      whileHover={{ scale: 1.02 }}\n                      whileTap={{ scale: 0.98 }}\n                    >\n                      <Play className=\"w-3 h-3\" />\n                      Start\n                    </motion.button>\n                  )}\n\n                  {/* Pause/Resume */}\n                  {selectedServer.status === \"paused\" ? (\n                    <motion.button\n                      className={`flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm transition-colors ${getBjorkSignalPalette(\"green\", isDark).bgColor} ${getBjorkSignalPalette(\"green\", isDark).borderColor} ${getBjorkSignalPalette(\"green\", isDark).textColor}`}\n                      onClick={() => handleStatusChange(selectedServer.id, \"active\")}\n                      whileHover={{ scale: 1.02 }}\n                      whileTap={{ scale: 0.98 }}\n                    >\n                      <Play className=\"w-3 h-3\" />\n                      Resume\n                    </motion.button>\n                  ) : (\n                    <motion.button\n                      className={`flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm transition-colors ${getBjorkSignalPalette(\"orange\", isDark).bgColor} ${getBjorkSignalPalette(\"orange\", isDark).borderColor} ${getBjorkSignalPalette(\"orange\", isDark).textColor}`}\n                      onClick={() => handleStatusChange(selectedServer.id, \"paused\")}\n                      whileHover={{ scale: 1.02 }}\n                      whileTap={{ scale: 0.98 }}\n                    >\n                      <Pause className=\"w-3 h-3\" />\n                      Pause\n                    </motion.button>\n                  )}\n\n                  {/* Restart */}\n                  <motion.button\n                    className={`flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm transition-colors ${palette.accentBg} ${palette.accentBorder} ${palette.accent}`}\n                    onClick={() => {\n                      handleStatusChange(selectedServer.id, \"inactive\");\n                      setTimeout(() => handleStatusChange(selectedServer.id, \"active\"), 1000);\n                    }}\n                    whileHover={{ scale: 1.02 }}\n                    whileTap={{ scale: 0.98 }}\n                  >\n                    <RotateCcw className=\"w-3 h-3\" />\n                    Restart\n                  </motion.button>\n\n                  {/* Close Button */}\n                  <motion.button\n                    className={`ml-2 flex h-8 w-8 items-center justify-center rounded-full border transition-colors ${palette.control}`}\n                    onClick={closeServerModal}\n                    whileHover={{ scale: 1.05 }}\n                    whileTap={{ scale: 0.95 }}\n                  >\n                    <X className=\"w-4 h-4\" />\n                  </motion.button>\n                </div>\n              </div>\n\n              {/* Content */}\n              <div className=\"flex-1 p-4 space-y-4 overflow-y-auto\">\n                {/* Server Stats Grid */}\n                <div className=\"grid grid-cols-1 md:grid-cols-3 gap-3\">\n                  {/* IP Address */}\n                  <div className={`rounded-lg border p-3 ${palette.mutedSurface} ${palette.divider}`}>\n                    <label className={`text-xs font-medium uppercase tracking-wider ${palette.secondaryText}`}>\n                      IP Address\n                    </label>\n                    <div className={`mt-1 font-mono text-sm font-medium ${palette.primaryText}`}>\n                      {selectedServer.ip}\n                    </div>\n                  </div>\n\n                  {/* Due Date */}\n                  <div className={`rounded-lg border p-3 ${palette.mutedSurface} ${palette.divider}`}>\n                    <label className={`text-xs font-medium uppercase tracking-wider ${palette.secondaryText}`}>\n                      Due Date\n                    </label>\n                    <div className={`mt-1 text-sm font-medium ${palette.primaryText}`}>\n                      {selectedServer.dueDate}\n                    </div>\n                  </div>\n\n                  {/* Status */}\n                  <div className={`rounded-lg border p-3 ${palette.mutedSurface} ${palette.divider}`}>\n                    <label className={`text-xs font-medium uppercase tracking-wider ${palette.secondaryText}`}>\n                      Status\n                    </label>\n                    <div className=\"mt-1\">\n                      {getStatusBadge(selectedServer.status)}\n                    </div>\n                  </div>\n                </div>\n\n                {/* CPU Usage */}\n                <div className={`rounded-lg border p-3 ${palette.mutedSurface} ${palette.divider}`}>\n                  <label className={`mb-2 block text-xs font-medium uppercase tracking-wider ${palette.secondaryText}`}>\n                    CPU Usage\n                  </label>\n                  {getCPUBars(selectedServer.cpuPercentage, selectedServer.status)}\n                </div>\n\n                {/* Server Logs Preview */}\n                <div className={`rounded-lg border p-3 ${palette.mutedSurface} ${palette.divider}`}>\n                  <label className={`mb-2 block text-xs font-medium uppercase tracking-wider ${palette.secondaryText}`}>\n                    Recent Activity\n                  </label>\n                  <div className=\"font-mono text-xs space-y-1 max-h-24 overflow-y-auto\">\n                    <div className={getBjorkSignalPalette(\"green\", isDark).textColor}>[15:42:31] Server started successfully</div>\n                    <div className={palette.accent}>[15:42:25] System health check passed</div>\n                    <div className={getBjorkSignalPalette(\"orange\", isDark).textColor}>[15:41:18] CPU usage: {selectedServer.cpuPercentage}%</div>\n                    <div className={palette.secondaryText}>[15:40:05] Connection from {selectedServer.ip}</div>\n                  </div>\n                </div>\n              </div>\n            </motion.div>\n          )}\n        </AnimatePresence>\n      </div>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/bjork-ui/tables/server-management-table.tsx"
    },
    {
      "path": "components/bjork-ui/tables/table-theme.ts",
      "content": "export function getBjorkTablePalette(isDark: boolean) {\n  return {\n    container: isDark\n      ? \"border-[#232323] bg-[#111]\"\n      : \"border-[#ded7ca] bg-[#eee9df]\",\n    header: isDark\n      ? \"border-[#232323] bg-[#181818] text-[#ededed]/42\"\n      : \"border-[#ded7ca] bg-[#e5ded1] text-[#171717]/46\",\n    row: isDark\n      ? \"border-[#232323] hover:bg-[#181818]/70\"\n      : \"border-[#ded7ca] hover:bg-[#e7e1d5]/70\",\n    selectedRow: isDark\n      ? \"border-[#2a2a2a] bg-[#181818]\"\n      : \"border-[#d6cdbc] bg-[#e7e1d5]\",\n    control: isDark\n      ? \"border-[#232323] bg-[#181818] text-[#ededed]/70 hover:bg-[#202020]\"\n      : \"border-[#d8d3c7] bg-[#eee9df] text-[#171717]/68 hover:bg-[#e4ded3]\",\n    menu: isDark\n      ? \"border-[#232323] bg-[#181818] text-[#ededed]/76 shadow-[0_18px_60px_rgba(0,0,0,0.42)]\"\n      : \"border-[#d8d3c7] bg-[#eee9df] text-[#171717]/76 shadow-[0_18px_60px_rgba(62,52,38,0.14)]\",\n    menuItem: isDark ? \"hover:bg-[#232323]\" : \"hover:bg-[#e4ded3]\",\n    menuActive: isDark ? \"bg-[#232323]\" : \"bg-[#e4ded3]\",\n    divider: isDark ? \"border-[#232323]\" : \"border-[#d8d3c7]\",\n    primaryText: isDark ? \"text-[#ededed]/90\" : \"text-[#171717]/86\",\n    secondaryText: isDark ? \"text-[#ededed]/38\" : \"text-[#171717]/46\",\n    mutedSurface: isDark ? \"bg-[#181818]\" : \"bg-[#e7e1d5]\",\n    popover: isDark ? \"bg-[#111] text-[#ededed]\" : \"bg-[#eee9df] text-[#171717]\",\n    accent: isDark ? \"text-[#d86a2c]\" : \"text-[#bd4514]\",\n    accentBg: isDark ? \"bg-[#ec5c13]/12\" : \"bg-[#ec5c13]/14\",\n    accentBorder: isDark ? \"border-[#ec5c13]/24\" : \"border-[#bd4514]/22\",\n    checkboxAccent: isDark ? \"#d86a2c\" : \"#bd4514\",\n  };\n}\n\nexport function getBjorkSignalPalette(\n  tone: \"green\" | \"red\" | \"orange\" | \"neutral\",\n  isDark: boolean\n) {\n  const palettes = {\n    green: {\n      bgColor: isDark ? \"bg-[#3e6f52]/18\" : \"bg-[#dce8dc]\",\n      borderColor: isDark ? \"border-[#5f9f78]/28\" : \"border-[#bad0bd]\",\n      textColor: isDark ? \"text-[#77b58b]\" : \"text-[#47785c]\",\n      dotColor: isDark ? \"bg-[#77b58b]\" : \"bg-[#47785c]\",\n      color: isDark ? \"#77b58b\" : \"#47785c\",\n    },\n    red: {\n      bgColor: isDark ? \"bg-[#87463f]/18\" : \"bg-[#eadad5]\",\n      borderColor: isDark ? \"border-[#c46a61]/28\" : \"border-[#d7bcb4]\",\n      textColor: isDark ? \"text-[#cf7c72]\" : \"text-[#9d5149]\",\n      dotColor: isDark ? \"bg-[#cf7c72]\" : \"bg-[#9d5149]\",\n      color: isDark ? \"#cf7c72\" : \"#9d5149\",\n    },\n    orange: {\n      bgColor: isDark ? \"bg-[#ec5c13]/14\" : \"bg-[#ead9cb]\",\n      borderColor: isDark ? \"border-[#ec5c13]/28\" : \"border-[#d5b59f]\",\n      textColor: isDark ? \"text-[#d86a2c]\" : \"text-[#9f4317]\",\n      dotColor: isDark ? \"bg-[#d86a2c]\" : \"bg-[#9f4317]\",\n      color: isDark ? \"#d86a2c\" : \"#9f4317\",\n    },\n    neutral: {\n      bgColor: isDark ? \"bg-[#ededed]/8\" : \"bg-[#ded7ca]\",\n      borderColor: isDark ? \"border-[#ededed]/14\" : \"border-[#cfc6b7]\",\n      textColor: isDark ? \"text-[#ededed]/58\" : \"text-[#171717]/58\",\n      dotColor: isDark ? \"bg-[#ededed]/45\" : \"bg-[#171717]/42\",\n      color: isDark ? \"#a3a3a3\" : \"#706b62\",\n    },\n  } as const;\n\n  return palettes[tone];\n}\n",
      "type": "registry:component",
      "target": "@components/bjork-ui/tables/table-theme.ts"
    }
  ],
  "cssVars": {
    "light": {
      "bjork-bg": "#f7f3ea",
      "bjork-surface": "#fffcf6",
      "bjork-surface-muted": "rgba(250, 246, 237, 0.94)",
      "bjork-surface-hover": "#f5efe3",
      "bjork-surface-active": "#efe7d8",
      "bjork-panel": "#f8f2e7",
      "bjork-menu": "rgba(255, 252, 246, 0.98)",
      "bjork-field": "rgba(255, 252, 246, 0.96)",
      "bjork-field-muted": "rgba(248, 242, 231, 0.82)",
      "bjork-field-inset": "rgba(239, 231, 216, 0.72)",
      "bjork-error-bg": "#fff0e8",
      "bjork-text": "#171717",
      "bjork-text-strong": "rgba(23, 23, 23, 0.9)",
      "bjork-text-medium": "rgba(23, 23, 23, 0.72)",
      "bjork-text-muted": "rgba(23, 23, 23, 0.52)",
      "bjork-text-soft": "rgba(23, 23, 23, 0.36)",
      "bjork-text-faint": "rgba(23, 23, 23, 0.22)",
      "bjork-inverted-text": "#fff8f0",
      "bjork-border": "#eee6db",
      "bjork-border-muted": "#f5ede2",
      "bjork-border-strong": "#e1d7c8",
      "bjork-thumb": "#a49b8e",
      "bjork-track": "#ded6ca",
      "bjork-accent": "#ec7d43",
      "bjork-accent-hover": "#f0935f",
      "bjork-accent-soft": "rgba(236, 125, 67, 0.1)",
      "bjork-accent-muted": "rgba(236, 125, 67, 0.2)",
      "bjork-accent-badge": "rgba(236, 125, 67, 0.16)",
      "bjork-accent-badge-foreground": "#8d421d",
      "bjork-accent-foreground": "#3f2112",
      "bjork-shadow-surface": "inset 0 7px 14px rgba(88, 72, 49, 0.045), inset 0 0.5px 0.5px rgba(255, 255, 255, 0.92), inset 1px 0 0 rgba(88, 72, 49, 0.026), inset -1px 0 0 rgba(255, 255, 255, 0.68), 0 14px 22px -9px rgba(66, 52, 33, 0.11)",
      "bjork-shadow-soft": "inset 0 1px 0 rgba(88, 72, 49, 0.045), inset 0 0.5px 0.5px rgba(255, 255, 255, 0.86)",
      "bjork-shadow-panel": "inset 0 1px 0 rgba(88, 72, 49, 0.04), inset 1px 0 0 rgba(88, 72, 49, 0.024), inset -1px 0 0 rgba(255, 255, 255, 0.64), 0 18px 38px -30px rgba(66, 52, 33, 0.2)",
      "bjork-shadow-menu": "inset 0 1px 0 rgba(88, 72, 49, 0.04), inset 0 12px 24px rgba(88, 72, 49, 0.022), inset 1px 0 0 rgba(88, 72, 49, 0.024), inset -1px 0 0 rgba(255, 255, 255, 0.62), 0 22px 44px -26px rgba(66, 52, 33, 0.22)",
      "bjork-shadow-inset": "inset 0 1px 10px rgba(88, 72, 49, 0.12), inset 0 0.5px 0.5px rgba(255, 255, 255, 0.72)",
      "bjork-ring-offset": "#f7f3ea"
    },
    "dark": {
      "bjork-bg": "#111111",
      "bjork-surface": "#121212",
      "bjork-surface-muted": "rgba(22, 22, 22, 0.92)",
      "bjork-surface-hover": "#161616",
      "bjork-surface-active": "#202020",
      "bjork-panel": "#0d0d0d",
      "bjork-menu": "rgba(18, 18, 18, 0.98)",
      "bjork-field": "rgba(18, 18, 18, 0.95)",
      "bjork-field-muted": "rgba(18, 18, 18, 0.55)",
      "bjork-field-inset": "rgba(9, 9, 9, 0.75)",
      "bjork-error-bg": "#130d0a",
      "bjork-text": "#ededed",
      "bjork-text-strong": "rgba(237, 237, 237, 0.9)",
      "bjork-text-medium": "rgba(237, 237, 237, 0.72)",
      "bjork-text-muted": "rgba(237, 237, 237, 0.52)",
      "bjork-text-soft": "rgba(237, 237, 237, 0.36)",
      "bjork-text-faint": "rgba(237, 237, 237, 0.22)",
      "bjork-inverted-text": "#080808",
      "bjork-border": "#232323",
      "bjork-border-muted": "#1c1c1c",
      "bjork-border-strong": "#343434",
      "bjork-thumb": "#626262",
      "bjork-track": "#090909",
      "bjork-accent": "#ec5c13",
      "bjork-accent-hover": "#f07832",
      "bjork-accent-soft": "rgba(236, 92, 19, 0.12)",
      "bjork-accent-muted": "rgba(236, 92, 19, 0.24)",
      "bjork-accent-badge": "#ec5c13",
      "bjork-accent-badge-foreground": "#fff2ea",
      "bjork-accent-foreground": "#fff2ea",
      "bjork-shadow-surface": "inset 0 7px 14px rgba(255, 255, 255, 0.03), inset 0 0.5px 0.5px rgba(255, 255, 255, 0.06), 0 14px 20px -6px rgba(0, 0, 0, 0.45)",
      "bjork-shadow-soft": "inset 0 1px 0 rgba(255, 255, 255, 0.045)",
      "bjork-shadow-panel": "inset 0 1px 0 rgba(255, 255, 255, 0.035), 0 18px 36px -28px rgba(0, 0, 0, 0.9)",
      "bjork-shadow-menu": "inset 0 1px 0 rgba(255, 255, 255, 0.055), inset 0 12px 24px rgba(255, 255, 255, 0.018), inset 0 -18px 26px rgba(0, 0, 0, 0.24), 0 22px 42px -22px rgba(0, 0, 0, 0.9)",
      "bjork-shadow-inset": "inset 0 1px 10px rgba(0, 0, 0, 0.45)",
      "bjork-ring-offset": "#080808"
    }
  },
  "css": {
    ".bjork-range": {
      "box-shadow": "inset 0 1px 1px rgba(255, 255, 255, 0.04), 0 0 14px rgba(189, 69, 20, 0.06)"
    },
    ".bjork-range::-webkit-slider-thumb": {
      "appearance": "none",
      "width": "16px",
      "height": "8px",
      "border": "0",
      "border-radius": "999px",
      "background": "var(--bjork-thumb)",
      "box-shadow": "inset 0 1px 0 rgba(255, 255, 255, 0.18), 0 0 0 1px rgba(0, 0, 0, 0.42)"
    },
    ".bjork-range::-moz-range-thumb": {
      "width": "16px",
      "height": "8px",
      "border": "0",
      "border-radius": "999px",
      "background": "var(--bjork-thumb)",
      "box-shadow": "inset 0 1px 0 rgba(255, 255, 255, 0.18), 0 0 0 1px rgba(0, 0, 0, 0.42)"
    },
    ".bjork-layered-button-accent, .bjork-layered-button-raised": {
      "position": "relative",
      "isolation": "isolate",
      "appearance": "none",
      "overflow": "hidden",
      "border": "0",
      "border-radius": "13px",
      "box-shadow": "inset 0 1px 0 #ffffff38, 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a",
      "transition": "filter 150ms ease-out, box-shadow 150ms ease-out"
    },
    ".bjork-layered-button-accent::after, .bjork-layered-button-raised::after": {
      "position": "absolute",
      "inset": "0",
      "pointer-events": "none",
      "content": "\"\"",
      "border": "1.5px solid transparent",
      "border-radius": "inherit",
      "background": "linear-gradient(#ffffffb8, #0000003d 41% 75%, #ffffff47) border-box",
      "mix-blend-mode": "overlay",
      "-webkit-mask-image": "linear-gradient(#000, #000), linear-gradient(#000, #000)",
      "mask-image": "linear-gradient(#000, #000), linear-gradient(#000, #000)",
      "-webkit-mask-clip": "padding-box, border-box",
      "mask-clip": "padding-box, border-box",
      "-webkit-mask-origin": "padding-box, border-box",
      "mask-origin": "padding-box, border-box",
      "-webkit-mask-composite": "xor",
      "mask-composite": "exclude"
    },
    ".bjork-layered-button-accent": {
      "color": "oklch(100% 0 0)",
      "text-shadow": "0 -1px #00000040",
      "background": "radial-gradient(ellipse at -20px top, rgba(255, 255, 255, 0.14), transparent), linear-gradient(180deg, #ec5c13 0%, #ec5c13 62%, color-mix(in oklab, #ec5c13 84%, black 16%) 100%)"
    },
    ".bjork-layered-button-raised": {
      "color": "oklch(100% 0 0)",
      "text-shadow": "0 -1px #00000026",
      "background": "radial-gradient(ellipse at -20px top, #ffffff38, #fff0), linear-gradient(180deg, oklch(0.1881 0.006 265), oklch(0.5493 0.0081 265))"
    },
    ".dark .bjork-layered-button-raised": {
      "color": "oklch(0.2574 0.0056 265)",
      "text-shadow": "0 -1px #00000026",
      "background": "radial-gradient(ellipse at -20px top, #ffffff38, #fff0), linear-gradient(180deg, color-mix(in oklab, oklch(0.9674 0.0013 265) 80%, oklch(0.2574 0.0056 265) 20%), color-mix(in oklab, oklch(0.669 0.0107 265) 80%, oklch(0.2574 0.0056 265) 20%))"
    },
    "@media (hover: hover)": {
      ".bjork-layered-button-accent:hover": {
        "filter": "brightness(1.08) saturate(1.04)"
      },
      ".bjork-layered-button-raised:hover": {
        "filter": "brightness(1.08) contrast(0.9)"
      }
    }
  },
  "meta": {
    "collection": "Tables",
    "registryUrl": "https://ui.isaiahbjork.com/server-management.json",
    "installCommand": "npx shadcn@latest add https://ui.isaiahbjork.com/server-management.json"
  },
  "type": "registry:component"
}