From b8ba782cf38679f1baa768ed3f259403200a41b4 Mon Sep 17 00:00:00 2001 From: Kailash Nadh Date: Thu, 11 Mar 2021 00:03:06 +0530 Subject: [PATCH] Refactor web frontend and remove unnecessary dependencies. - Eliminate frontend JS build step completely: (remove dep: NodeJS, npx, tailwind, postcss, autoprefixer) - Declutter and cleanup index.html (8.49 KB to 3.4 KB) = ~60% savings. - Replace tailwind with custom CSS (10.64 KB to 1.96 KB) = ~81% savings. - Remove Google font (~100 KB) as there is very little text on the page. - Refactor and cleanup main.js and remove tailwind styling logic. (2.82 KB to 1.12 KB) = ~60% savings. - Net static asset reduction = 21.95 KB to 6.48 KB = ~70% savings apart from the 100+ KB elimination of Google fonts. --- Makefile | 10 +- cmd/doggo/api/assets/main.js | 184 ++--- cmd/doggo/api/assets/style.css | 195 +++++ cmd/doggo/api/assets/tailwind.css | 1146 ----------------------------- cmd/doggo/api/index.html | 237 ++---- 5 files changed, 337 insertions(+), 1435 deletions(-) create mode 100644 cmd/doggo/api/assets/style.css delete mode 100644 cmd/doggo/api/assets/tailwind.css diff --git a/Makefile b/Makefile index aa425bb..024f600 100644 --- a/Makefile +++ b/Makefile @@ -9,18 +9,10 @@ VERSION := ${HASH} build-cli: go build -o ${CLI_BIN} -ldflags="-X 'main.buildVersion=${VERSION}' -X 'main.buildDate=${BUILD_DATE}'" ./cmd/doggo/cli/ -.PHONY: build-frontend -build-frontend: - cd cmd/doggo/api && NODE_ENV=production npx tailwindcss build -o ./assets/tailwind.css - .PHONY: build-api build-api: go build -o ${API_BIN} -ldflags="-X 'main.buildVersion=${VERSION}' -X 'main.buildDate=${BUILD_DATE}'" ./cmd/doggo/api/ -.PHONY: deps -deps: - cd cmd/doggo/api && npm install -D tailwindcss@latest postcss@latest autoprefixer@latest - .PHONY: build build: build-api build-cli @@ -29,7 +21,7 @@ run-cli: build-cli ## Build and Execute the CLI binary after the build step. ${CLI_BIN} .PHONY: run-api -run-api: build-frontend build-api ## Build and Execute the API binary after the build step. +run-api: build-api ## Build and Execute the API binary after the build step. ${API_BIN} --config config-api-sample.toml .PHONY: clean diff --git a/cmd/doggo/api/assets/main.js b/cmd/doggo/api/assets/main.js index af34f24..dc405a2 100644 --- a/cmd/doggo/api/assets/main.js +++ b/cmd/doggo/api/assets/main.js @@ -1,154 +1,90 @@ const $ = document.querySelector.bind(document); const $new = document.createElement.bind(document); -const apiURL = "/api/lookup/"; -const isMobile = window.matchMedia("only screen and (max-width: 760px)").matches; - -function handleNSChange() { - if ($('select[name=ns]').value == "custom") { - $('div[id=custom_ns]').classList.remove("hidden"); - $('div[id=ns]').classList.add("hidden"); - } else { - $('div[id=custom_ns]').classList.add("hidden"); - $('div[id=ns]').classList.remove("hidden"); - $('input[name=ns]').placeholder = $('select[name=ns]').value; - } -} - - -// Source: https://stackoverflow.com/a/1026087. -function capitalizeFirstLetter(string) { - return string.charAt(0).toUpperCase() + string.slice(1); -} - -window.addEventListener('DOMContentLoaded', (event) => { - handleNSChange(); -}); +const $show = (el) => { + el.classList.remove('hidden'); +}; +const $hide = (el) => { + el.classList.add('hidden'); +}; +const apiURL = '/api/lookup/'; (function () { - const fields = ['name', 'address', 'type', 'ttl', 'rtt', 'nameserver']; + const fields = ['name', 'address', 'type', 'ttl', 'rtt']; // createRow creates a table row with the given cell values. function createRow(item) { const tr = $new('tr'); fields.forEach((f) => { const td = $new('td'); - td.classList.add("px-6", "py-4", "whitespace-nowrap", "text-sm"); - if (f == "ttl" || f == "rtt" || f == "nameserver") { - td.classList.add("text-gray-500"); - } else { - td.classList.add("text-gray-900"); - } - if (f == "name") { - td.classList.add("font-semibold"); - } - if (f == "type") { - td.innerHTML = '' + item[f] + ''; - } else { - td.innerText = item[f]; - } + td.innerText = item[f]; + td.classList.add(f); tr.appendChild(td); }); return tr; } + const handleSubmit = async () => { + const tbody = $('#table tbody'), + tbl = $('#table'); + tbody.innerHTML = ''; + $hide(tbl); - // `createList` creates a table row with the given cell values. - function createList(item) { - const ul = $new('ul'); - ul.classList.add("m-4", "block", "bg-indigo-100"); - fields.forEach((f) => { - const li = $new('li'); - const span = $new('span'); - span.classList.add("p-2", "text-gray-500", "font-semibold"); - span.innerText = capitalizeFirstLetter(f) + ': ' + item[f] - li.appendChild(span); - ul.appendChild(li); - }); - return ul; - } + const q = $('input[name=q]').value.trim(), + typ = $('select[name=type]').value, + addr = $('input[name=address]').value.trim(); - function prepareNSAddr(ns) { - switch (ns) { - // If it's a custom nameserver, get the value from the user's input. - case "custom": - return $('input[name=custom_ns]').value.trim() - // Else get it from the select dropdown field. - default: - return $('select[name=ns]').value.trim() - } - } + // Post to the API. + const req = await fetch(apiURL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ query: [q,], type: [typ,], nameservers: [addr,] }) + }); - const postForm = body => { - return fetch(apiURL, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body - }); - }; + const res = await req.json(); - const handleSubmit = async (e) => { - e.preventDefault(); - - const tbl = $('table tbody'); - const list = $('div[id=mobile-answers-sec]'); - tbl.innerHTML = ''; - list.innerHTML = ''; - - $('p[id=empty-name-sec]').classList.add("hidden"); - const errSec = $('div[id=api-error-sec]'); - errSec.classList.add("hidden"); - - const q = $('input[name=q]').value.trim(), typ = $('select[name=type]').value; - const ns = $('select[name=ns]').value; - - if (!q) { - $('p[id=empty-name-sec]').classList.remove("hidden"); - throw ('Invalid query name.'); - } - - if (!q || !typ || !ns) { - throw ('Invalid or empty query params.'); - } - - const nsAddr = prepareNSAddr(ns); - const body = JSON.stringify({ query: [q,], type: [typ,], nameservers: [nsAddr,] }); - - const response = await postForm(body); - const res = await response.json(); - if (res.status != "success") { - // get error message from body or default to response statusText + if (res.status != 'success') { const error = (res && res.message) || response.statusText; - errSec.classList.remove("hidden"); - errSec.innerHTML = '

' + error + '

' - throw (error); + throw(error); + return; } if (res.data[0].answers == null) { - const errSec = $('div[id=api-error-sec]'); - errSec.classList.remove("hidden"); - errSec.innerHTML = '

' + 'No records found!' + '

' - return null; + throw('No records found.'); + return; } - $('div[id=answer_sec]').classList.remove("hidden"); - - if (isMobile === true) { - list.classList.remove("hidden"); - res.data[0].answers.forEach((item) => { - console.log("appending", item) - list.appendChild(createList(item)); - }); - - } else { - res.data[0].answers.forEach((item) => { - tbl.appendChild(createRow(item)); - }); - } + res.data[0].answers.forEach((item) => { + tbody.appendChild(createRow(item)); + }); + $show(tbl); }; - document.querySelector('form').addEventListener('submit', handleSubmit); + // Capture the form submit. + $('#form').onsubmit = async (e) => { + e.preventDefault(); + + const msg = $('#message'); + $hide(msg); + + try { + await handleSubmit(); + } catch(e) { + msg.innerText = e.toString(); + $show(msg); + throw e; + } + }; + + // Change the address on ns change. + const ns = $("#ns"), addr = $("#address"); + addr.value = ns.value; + + ns.onchange = (e) => { + addr.value = e.target.value; + if(addr.value === "") { + addr.focus(); + } + }; })(); \ No newline at end of file diff --git a/cmd/doggo/api/assets/style.css b/cmd/doggo/api/assets/style.css new file mode 100644 index 0000000..8e00f33 --- /dev/null +++ b/cmd/doggo/api/assets/style.css @@ -0,0 +1,195 @@ +:root { + --primary: #4338ca; + --secondary: #333; +} + +* { + box-sizing: border-box; +} + +:focus { + outline: 0; +} + +body { + font-family: "Segoe UI", "Helvetica Neue", Inter, sans-serif; + font-size: 16px; + line-height: 24px; + color: #111; +} + +a { + color: var(--primary); +} + a:hover { + color: #111; + text-decoration: none; + } + +input, select, button { + border-radius: 5px; + border: 1px solid #ddd; + font-size: 1.3rem; + padding: 10px 15px; + width: 100%; +} + input:focus, select:focus { + border-color: var(--primary); + } + button { + border-color: var(--primary); + background: var(--primary); + color: #fff; + cursor: pointer; + width: auto; + padding: 10px 30px; + } + button:focus, + button:hover { + border-color: var(--secondary); + background: var(--secondary); + } + +label { + display: block; +} + +.box { + box-shadow: 1px 1px 4px #eee; + border: 1px solid #eee; + padding: 30px; + border-radius: 3px; +} + +.hidden { + display: none !important; +} + +.main { + margin: 60px auto 30px auto; + max-width: 900px; +} + +header { + text-align: center; + font-size: 1.5em; + margin-bottom: 60px; +} + .logo span { + color: var(--primary); + font-weight: 900; + } + +form { + margin-bottom: 45px; +} + + .row { + display: flex; + margin-bottom: 15px; + } + .row .field { + flex: 50%; + } + .row .field:last-child { + margin-left: 30px; + } + + .submit { + text-align: right; + } + .help { + color: #666; + font-size: 0.875em; + } + +#message { + color: #ff3300; +} + +table.box { + width: 100%; + max-width: 100%; + padding: 0; +} + table th { + background: #f9fafb; + color: #666; + font-size: 0.875em; + border-bottom: 1px solid #ddd; + } + table th, tbody td { + padding: 10px 15px; + text-align: left; + } + td.name { + font-weight: bold; + } + th.type, td.type { + text-align: center; + } + td.type { + background: #d1fae5; + color: #065f46; + font-weight: bold; + } + +footer { + margin: 60px 0 0 0; + text-align: center; +} + footer a { + text-decoration: none; + } + + +@media (max-width: 650px) { + .main { + margin: 60px 30px 30px 30px; + } + .box { + box-shadow: none; + border: 0; + padding: 0; + } + + .row { + display: block; + } + .field { + margin: 0 0 20px 0; + } + .row .field:last-child { + margin: 0; + } + .submit button { + width: 100%; + } + + table { + table-layout: fixed; + } + table th { + width: 100%; + } + table tr { + border-bottom: 0; + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin-bottom: 30px; + } + table td { + border: 1px solid #eee; + margin: 0 -1px -1px 0; + position: relative; + width: 100%; + word-wrap:break-word; + } + table th.type, table td.type { + text-align: left; + } + table td span { + display: block; + } +} \ No newline at end of file diff --git a/cmd/doggo/api/assets/tailwind.css b/cmd/doggo/api/assets/tailwind.css deleted file mode 100644 index 7335e04..0000000 --- a/cmd/doggo/api/assets/tailwind.css +++ /dev/null @@ -1,1146 +0,0 @@ -/*! tailwindcss v2.0.3 | MIT License | https://tailwindcss.com */ - -/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */ - -/* -Document -======== -*/ - -/** -Use a better box model (opinionated). -*/ - -*, -*::before, -*::after { - box-sizing: border-box; -} - -/** -Use a more readable tab size (opinionated). -*/ - -:root { - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; -} - -/** -1. Correct the line height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -*/ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* -Sections -======== -*/ - -/** -Remove the margin in all browsers. -*/ - -body { - margin: 0; -} - -/** -Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) -*/ - -body { - font-family: - system-ui, - -apple-system, /* Firefox supports this but not yet `system-ui` */ - 'Segoe UI', - Roboto, - Helvetica, - Arial, - sans-serif, - 'Apple Color Emoji', - 'Segoe UI Emoji'; -} - -/* -Grouping content -================ -*/ - -/** -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -*/ - -hr { - height: 0; /* 1 */ - color: inherit; /* 2 */ -} - -/* -Text-level semantics -==================== -*/ - -/** -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr[title] { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/** -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/** -1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) -2. Correct the odd 'em' font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: - ui-monospace, - SFMono-Regular, - Consolas, - 'Liberation Mono', - Menlo, - monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/** -Prevent 'sub' and 'sup' elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -Tabular data -============ -*/ - -/** -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -*/ - -table { - text-indent: 0; /* 1 */ - border-color: inherit; /* 2 */ -} - -/* -Forms -===== -*/ - -/** -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** -Remove the inheritance of text transform in Edge and Firefox. -1. Remove the inheritance of text transform in Firefox. -*/ - -button, -select { /* 1 */ - text-transform: none; -} - -/** -Correct the inability to style clickable types in iOS and Safari. -*/ - -button, -[type='button'], -[type='submit'] { - -webkit-appearance: button; -} - -/** -Remove the inner border and padding in Firefox. -*/ - -/** -Restore the focus styles unset by the previous rule. -*/ - -/** -Remove the additional ':invalid' styles in Firefox. -See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737 -*/ - -/** -Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers. -*/ - -legend { - padding: 0; -} - -/** -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/** -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -/** -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -/** -Remove the inner padding in Chrome and Safari on macOS. -*/ - -/** -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to 'inherit' in Safari. -*/ - -/* -Interactive -=========== -*/ - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/** - * Manually forked from SUIT CSS Base: https://github.com/suitcss/base - * A thin layer on top of normalize.css that provides a starting point more - * suitable for web applications. - */ - -/** - * Removes the default spacing and border for appropriate elements. - */ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -button { - background-color: transparent; - background-image: none; -} - -/** - * Work around a Firefox/IE bug where the transparent `button` background - * results in a loss of the default `button` focus styles. - */ - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -fieldset { - margin: 0; - padding: 0; -} - -ol, -ul { - list-style: none; - margin: 0; - padding: 0; -} - -/** - * Tailwind custom reset styles - */ - -/** - * 1. Use the user's configured `sans` font-family (with Tailwind's default - * sans-serif font stack as a fallback) as a sane default. - * 2. Use Tailwind's default "normal" line-height so the user isn't forced - * to override it to ensure consistency even when using the default theme. - */ - -html { - font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 1 */ - line-height: 1.5; /* 2 */ -} - -/** - * Inherit font-family and line-height from `html` so users can set them as - * a class directly on the `html` element. - */ - -body { - font-family: inherit; - line-height: inherit; -} - -/** - * 1. Prevent padding and border from affecting element width. - * - * We used to set this in the html element and inherit from - * the parent element for everything else. This caused issues - * in shadow-dom-enhanced elements like
where the content - * is wrapped by a div with box-sizing set to `content-box`. - * - * https://github.com/mozdevs/cssremedy/issues/4 - * - * - * 2. Allow adding a border to an element by just adding a border-width. - * - * By default, the way the browser specifies that an element should have no - * border is by setting it's border-style to `none` in the user-agent - * stylesheet. - * - * In order to easily add borders to elements by just setting the `border-width` - * property, we change the default border-style for all elements to `solid`, and - * use border-width to hide them instead. This way our `border` utilities only - * need to set the `border-width` property instead of the entire `border` - * shorthand, making our border utilities much more straightforward to compose. - * - * https://github.com/tailwindcss/tailwindcss/pull/116 - */ - -*, -::before, -::after { - box-sizing: border-box; /* 1 */ - border-width: 0; /* 2 */ - border-style: solid; /* 2 */ - border-color: #e5e7eb; /* 2 */ -} - -/* - * Ensure horizontal rules are visible by default - */ - -hr { - border-top-width: 1px; -} - -/** - * Undo the `border-style: none` reset that Normalize applies to images so that - * our `border-{width}` utilities have the expected effect. - * - * The Normalize reset is unnecessary for us since we default the border-width - * to 0 on all elements. - * - * https://github.com/tailwindcss/tailwindcss/issues/362 - */ - -img { - border-style: solid; -} - -textarea { - resize: vertical; -} - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - color: #9ca3af; -} - -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - color: #9ca3af; -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - color: #9ca3af; -} - -button { - cursor: pointer; -} - -table { - border-collapse: collapse; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/** - * Reset links to optimize for opt-in styling instead of - * opt-out. - */ - -a { - color: inherit; - text-decoration: inherit; -} - -/** - * Reset form element properties that are easy to forget to - * style explicitly so you don't inadvertently introduce - * styles that deviate from your design system. These styles - * supplement a partial reset that is already applied by - * normalize.css. - */ - -button, -input, -optgroup, -select, -textarea { - padding: 0; - line-height: inherit; - color: inherit; -} - -/** - * Use the configured 'mono' font family for elements that - * are expected to be rendered with a monospace font, falling - * back to the system monospace stack if there is no configured - * 'mono' font family. - */ - -pre, -code, -kbd, -samp { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -/** - * Make replaced elements `display: block` by default as that's - * the behavior you want almost all of the time. Inspired by - * CSS Remedy, with `svg` added as well. - * - * https://github.com/mozdevs/cssremedy/issues/14 - */ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - vertical-align: middle; -} - -/** - * Constrain images and videos to the parent width and preserve - * their instrinsic aspect ratio. - * - * https://github.com/mozdevs/cssremedy/issues/14 - */ - -img, -video { - max-width: 100%; - height: auto; -} - - - [type='text'], - [type='time'], - textarea, - select - { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background-color: #fff; - border-color: #6b7280; - border-width: 1px; - border-radius: 0px; - padding-top: 0.5rem; - padding-right: 0.75rem; - padding-bottom: 0.5rem; - padding-left: 0.75rem; - font-size: 1rem; - line-height: 1.5rem; -} - -[type='text']:focus, [type='time']:focus, textarea:focus, select:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); - border-color: #2563eb; -} - -input::-moz-placeholder, textarea::-moz-placeholder { - color: #6b7280; - opacity: 1; -} - -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - color: #6b7280; - opacity: 1; -} - -input::placeholder, textarea::placeholder { - color: #6b7280; - opacity: 1; -} - -select { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); - background-position: right 0.5rem center; - background-repeat: no-repeat; - background-size: 1.5em 1.5em; - padding-right: 2.5rem; - -webkit-print-color-adjust: exact; - color-adjust: exact; -} - -.container { - width: 100%; -} - -@media (min-width: 640px) { - .container { - max-width: 640px; - } -} - -@media (min-width: 768px) { - .container { - max-width: 768px; - } -} - -@media (min-width: 1024px) { - .container { - max-width: 1024px; - } -} - -@media (min-width: 1280px) { - .container { - max-width: 1280px; - } -} - -@media (min-width: 1536px) { - .container { - max-width: 1536px; - } -} - -.divide-y > :not([hidden]) ~ :not([hidden]) { - --tw-divide-y-reverse: 0; - border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); - border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); -} - -.divide-gray-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgba(229, 231, 235, var(--tw-divide-opacity)); -} - -.bg-white { - --tw-bg-opacity: 1; - background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); -} - -.bg-gray-50 { - --tw-bg-opacity: 1; - background-color: rgba(249, 250, 251, var(--tw-bg-opacity)); -} - -.bg-green-100 { - --tw-bg-opacity: 1; - background-color: rgba(209, 250, 229, var(--tw-bg-opacity)); -} - -.bg-indigo-100 { - --tw-bg-opacity: 1; - background-color: rgba(224, 231, 255, var(--tw-bg-opacity)); -} - -.bg-indigo-700 { - --tw-bg-opacity: 1; - background-color: rgba(67, 56, 202, var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-500:hover { - --tw-bg-opacity: 1; - background-color: rgba(99, 102, 241, var(--tw-bg-opacity)); -} - -.border-transparent { - border-color: transparent; -} - -.border-gray-200 { - --tw-border-opacity: 1; - border-color: rgba(229, 231, 235, var(--tw-border-opacity)); -} - -.border-gray-300 { - --tw-border-opacity: 1; - border-color: rgba(209, 213, 219, var(--tw-border-opacity)); -} - -.focus\:border-indigo-500:focus { - --tw-border-opacity: 1; - border-color: rgba(99, 102, 241, var(--tw-border-opacity)); -} - -.rounded { - border-radius: 0.25rem; -} - -.rounded-lg { - border-radius: 0.5rem; -} - -.rounded-full { - border-radius: 9999px; -} - -.border { - border-width: 1px; -} - -.border-b { - border-bottom-width: 1px; -} - -.block { - display: block; -} - -.inline-block { - display: inline-block; -} - -.flex { - display: flex; -} - -.inline-flex { - display: inline-flex; -} - -.table { - display: table; -} - -.hidden { - display: none; -} - -.flex-col { - flex-direction: column; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.flex-none { - flex: none; -} - -.flex-grow { - flex-grow: 1; -} - -.font-semibold { - font-weight: 600; -} - -.font-bold { - font-weight: 700; -} - -.font-black { - font-weight: 900; -} - -.text-xs { - font-size: 0.75rem; - line-height: 1rem; -} - -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - -.text-xl { - font-size: 1.25rem; - line-height: 1.75rem; -} - -.text-5xl { - font-size: 3rem; - line-height: 1; -} - -.leading-5 { - line-height: 1.25rem; -} - -.leading-6 { - line-height: 1.5rem; -} - -.m-4 { - margin: 1rem; -} - -.m-auto { - margin: auto; -} - -.my-2 { - margin-top: 0.5rem; - margin-bottom: 0.5rem; -} - -.mx-auto { - margin-left: auto; - margin-right: auto; -} - -.-my-2 { - margin-top: -0.5rem; - margin-bottom: -0.5rem; -} - -.-mx-3 { - margin-left: -0.75rem; - margin-right: -0.75rem; -} - -.mt-2 { - margin-top: 0.5rem; -} - -.mb-4 { - margin-bottom: 1rem; -} - -.mb-6 { - margin-bottom: 1.5rem; -} - -.mt-8 { - margin-top: 2rem; -} - -.mt-10 { - margin-top: 2.5rem; -} - -.mt-12 { - margin-top: 3rem; -} - -.max-w-screen-lg { - max-width: 1024px; -} - -.min-h-screen { - min-height: 100vh; -} - -.min-w-full { - min-width: 100%; -} - -.focus\:outline-none:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.overflow-hidden { - overflow: hidden; -} - -.overflow-x-auto { - overflow-x: auto; -} - -.p-2 { - padding: 0.5rem; -} - -.p-10 { - padding: 2.5rem; -} - -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.py-3 { - padding-top: 0.75rem; - padding-bottom: 0.75rem; -} - -.px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - -.px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; -} - -.px-8 { - padding-left: 2rem; - padding-right: 2rem; -} - -.pt-6 { - padding-top: 1.5rem; -} - -.pb-8 { - padding-bottom: 2rem; -} - -* { - --tw-shadow: 0 0 #0000; -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-md { - --tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -* { - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgba(59, 130, 246, 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; -} - -.focus\:ring-2:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.focus\:ring-offset-white:focus { - --tw-ring-offset-color: #fff; -} - -.focus\:ring-offset-2:focus { - --tw-ring-offset-width: 2px; -} - -.focus\:ring-indigo-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgba(99, 102, 241, var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgba(67, 56, 202, var(--tw-ring-opacity)); -} - -.text-left { - text-align: left; -} - -.text-center { - text-align: center; -} - -.text-right { - text-align: right; -} - -.text-white { - --tw-text-opacity: 1; - color: rgba(255, 255, 255, var(--tw-text-opacity)); -} - -.text-gray-500 { - --tw-text-opacity: 1; - color: rgba(107, 114, 128, var(--tw-text-opacity)); -} - -.text-gray-900 { - --tw-text-opacity: 1; - color: rgba(17, 24, 39, var(--tw-text-opacity)); -} - -.text-red-500 { - --tw-text-opacity: 1; - color: rgba(239, 68, 68, var(--tw-text-opacity)); -} - -.text-green-800 { - --tw-text-opacity: 1; - color: rgba(6, 95, 70, var(--tw-text-opacity)); -} - -.text-indigo-700 { - --tw-text-opacity: 1; - color: rgba(67, 56, 202, var(--tw-text-opacity)); -} - -.uppercase { - text-transform: uppercase; -} - -.tracking-wider { - letter-spacing: 0.05em; -} - -.align-middle { - vertical-align: middle; -} - -.whitespace-nowrap { - white-space: nowrap; -} - -.w-full { - width: 100%; -} - -.transition-colors { - transition-property: background-color, border-color, color, fill, stroke; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -@-webkit-keyframes spin { - to { - transform: rotate(360deg); - } -} - -@keyframes spin { - to { - transform: rotate(360deg); - } -} - -@-webkit-keyframes ping { - 75%, 100% { - transform: scale(2); - opacity: 0; - } -} - -@keyframes ping { - 75%, 100% { - transform: scale(2); - opacity: 0; - } -} - -@-webkit-keyframes pulse { - 50% { - opacity: .5; - } -} - -@keyframes pulse { - 50% { - opacity: .5; - } -} - -@-webkit-keyframes bounce { - 0%, 100% { - transform: translateY(-25%); - -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1); - animation-timing-function: cubic-bezier(0.8,0,1,1); - } - - 50% { - transform: none; - -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1); - animation-timing-function: cubic-bezier(0,0,0.2,1); - } -} - -@keyframes bounce { - 0%, 100% { - transform: translateY(-25%); - -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1); - animation-timing-function: cubic-bezier(0.8,0,1,1); - } - - 50% { - transform: none; - -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1); - animation-timing-function: cubic-bezier(0,0,0.2,1); - } -} - -@media (min-width: 640px) { - .sm\:rounded-lg { - border-radius: 0.5rem; - } - - .sm\:block { - display: block; - } - - .sm\:-mx-6 { - margin-left: -1.5rem; - margin-right: -1.5rem; - } - - .sm\:px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; - } - - .sm\:w-auto { - width: auto; - } -} - -@media (min-width: 768px) { - .md\:flex { - display: flex; - } - - .md\:mb-0 { - margin-bottom: 0px; - } - - .md\:w-1\/2 { - width: 50%; - } -} - -@media (min-width: 1024px) { - .lg\:-mx-8 { - margin-left: -2rem; - margin-right: -2rem; - } - - .lg\:px-8 { - padding-left: 2rem; - padding-right: 2rem; - } -} - -@media (min-width: 1280px) { -} - -@media (min-width: 1536px) { -} - \ No newline at end of file diff --git a/cmd/doggo/api/index.html b/cmd/doggo/api/index.html index 967fdc0..a0e6ed3 100644 --- a/cmd/doggo/api/index.html +++ b/cmd/doggo/api/index.html @@ -1,175 +1,100 @@ - Doggo DNS - - - - - - - + - - - - -
-

Doggo DNS

+ +
+
+

Doggo DNS

-
-
-
-
-
- - - -
-
- - -
-
-
-
- - -
-
- - -
- -
-
-
-
- -
-
-
- -
+ + + + + + + + + + + + + -