web/quotes: add tailwind

This commit is contained in:
Luke Granger-Brown 2021-01-20 02:04:30 +00:00
parent 1fe4e04464
commit ca27848285
16 changed files with 3047 additions and 7 deletions

View file

@ -12,3 +12,4 @@ syntax: glob
*.orig *.orig
*~ *~
db.sqlite3 db.sqlite3
node_modules/

View file

@ -20,5 +20,6 @@
unifiHacked = import ./unifi-hack args; unifiHacked = import ./unifi-hack args;
tiny-remapper = import ./tiny-remapper.nix args; tiny-remapper = import ./tiny-remapper.nix args;
django-allauth = pkgs.python3Packages.callPackage ./django-allauth.nix {}; django-allauth = pkgs.python3Packages.callPackage ./django-allauth.nix {};
django-tailwind = pkgs.python3Packages.callPackage ./django-tailwind.nix {};
} // (import ./heptapod-runner.nix args) } // (import ./heptapod-runner.nix args)
// (import ./lightspeed args) // (import ./lightspeed args)

View file

@ -0,0 +1,21 @@
{ stdenv, buildPythonPackage, fetchPypi, django }:
buildPythonPackage rec {
pname = "django-tailwind";
version = "1.1.0";
src = fetchPypi {
inherit pname version;
sha256 = "sha256:12kxqsspkd0rdsb9rw46hvwfsd8af6qjjrpi1wprbmkf516ri9c4";
};
propagatedBuildInputs = [ django ];
doCheck = false;
meta = with stdenv.lib; {
description = "Integration of Tailwind CSS with Django";
homepage = "https://github.com/timonweb/django-tailwind";
license = licenses.mit;
};
}

View file

@ -8,26 +8,57 @@ let
(depot.pkgs.django-allauth.override { (depot.pkgs.django-allauth.override {
django = django_3; django = django_3;
}) })
(depot.pkgs.django-tailwind.override {
django = django_3;
})
]); ]);
filterSourcePred = (path: type: type != "directory" || (
baseNameOf path != "__pycache__" &&
baseNameOf path != "node_modules" &&
true));
in in
pkgs.stdenvNoCC.mkDerivation rec { pkgs.stdenvNoCC.mkDerivation rec {
name = "quotes"; name = "quotes";
src = ./.; src = builtins.filterSource filterSourcePred ./.;
buildInputs = [ pkgs.makeWrapper ]; buildInputs = with pkgs; [ makeWrapper nodejs ];
propagatedBuildInputs = [ python ]; propagatedBuildInputs = [ python ];
buildPhase = "true"; nodeModules = pkgs.stdenvNoCC.mkDerivation rec {
name = "quotes-node_modules";
src = builtins.filterSource filterSourcePred ./theme/static_src;
outputHash = "sha256:07w8fzy7i7vikfmazx9kbrhf503qabsbhibmyasvpqjwb2r9gm0a";
outputHashMode = "recursive";
buildInputs = with pkgs; [ nodejs ];
buildPhase = ''
mkdir $NIX_BUILD_TOP/tmp
export HOME=$NIX_BUILD_TOP/tmp
npm i
'';
installPhase = ''
cp -R node_modules $out
'';
};
buildPhase = ''
cp -R $nodeModules theme/static_src/node_modules
'';
installPhase = '' installPhase = ''
sitepkgdir="$out/lib/${python.libPrefix}/site-packages" sitepkgdir="$out/lib/${python.libPrefix}/site-packages"
pkgdir="$sitepkgdir/quotes" pkgdir="$sitepkgdir/quotes"
mkdir -p $pkgdir mkdir -p $pkgdir
cp -R \ cp -R \
$src/quotesapp \ quotesapp \
$src/quotedb \ quotedb \
$src/templates \ templates \
$src/static \ static \
discordguild \
theme \
$pkgdir $pkgdir
mkdir "$out/bin" mkdir "$out/bin"
@ -42,7 +73,11 @@ pkgs.stdenvNoCC.mkDerivation rec {
export STATIC_ROOT="$out/share/static" export STATIC_ROOT="$out/share/static"
export DJANGO_SETTINGS_MODULE=quotes.quotesapp.settings export DJANGO_SETTINGS_MODULE=quotes.quotesapp.settings
export PYTHONPATH=$PYTHONPATH''${PYTHONPATH:+':'}"$sitepkgdir" export PYTHONPATH=$PYTHONPATH''${PYTHONPATH:+':'}"$sitepkgdir"
django-admin tailwind build
django-admin collectstatic --no-input django-admin collectstatic --no-input
chmod -R +w $pkgdir/theme/static $pkgdir/theme/static_src
rm -rf $pkgdir/theme/static $pkgdir/theme/static_src
''; '';
passthru.pythonEnv = python; passthru.pythonEnv = python;

View file

@ -41,13 +41,17 @@ INSTALLED_APPS = [
"django.contrib.messages", "django.contrib.messages",
"django.contrib.staticfiles", "django.contrib.staticfiles",
"django.contrib.sites", "django.contrib.sites",
"tailwind",
"allauth", "allauth",
"allauth.account", "allauth.account",
"allauth.socialaccount", "allauth.socialaccount",
"quotes.quotedb", "quotes.quotedb",
"quotes.discordguild", "quotes.discordguild",
"quotes.theme",
] ]
TAILWIND_APP_NAME = "quotes.theme"
MIDDLEWARE = [ MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware", "django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware", "django.contrib.sessions.middleware.SessionMiddleware",

View file

@ -6,6 +6,7 @@ let
in pkgs.mkShell { in pkgs.mkShell {
buildInputs = with pkgs; [ buildInputs = with pkgs; [
quotes.pythonEnv quotes.pythonEnv
nodejs
black black
]; ];

View file

@ -0,0 +1,2 @@
<!DOCTYPE html>

View file

5
web/quotes/theme/apps.py Normal file
View file

@ -0,0 +1,5 @@
from django.apps import AppConfig
class ThemeConfig(AppConfig):
name = 'theme'

View file

@ -0,0 +1 @@
/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */*,::after,::before{box-sizing:border-box}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}body{font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji'}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}button{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}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}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";line-height:1.5}body{font-family:inherit;line-height:inherit}*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9ca3af}input::placeholder,textarea::placeholder{color:#9ca3af}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.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}}.flex{display:flex}.table{display:table}.items-center{align-items:center}.justify-center{justify-content:center}.font-serif{font-family:ui-serif,Georgia,Cambria,"Times New Roman",Times,serif}.h-screen{height:100vh}.text-5xl{font-size:3rem;line-height:1}.leading-normal{line-height:1.5}.mx-auto{margin-left:auto;margin-right:auto}.static{position:static}*{--tw-shadow:0 0 #0000}*{--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}.tracking-normal{letter-spacing:0}@-webkit-keyframes spin{to{transform:rotate(360deg)}}@keyframes spin{to{transform:rotate(360deg)}}@-webkit-keyframes ping{100%,75%{transform:scale(2);opacity:0}}@keyframes ping{100%,75%{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(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,100%{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,29 @@
{
"name": "django_tailwind",
"description": "",
"scripts": {
"start": "npm run dev",
"build": "npm run build:clean && npm run build:sass && npm run build:postcss && npm run build:cleancss",
"build:clean": "rimraf ../static/css",
"build:sass": "node-sass --output-style compressed src/styles.scss ../static/css/styles.css",
"build:postcss": "NODE_ENV=production postcss --config . --map false --output ../static/css/styles.css ../static/css/styles.css",
"build:cleancss": "cleancss -o ../static/css/styles.css ../static/css/styles.css",
"dev": "watch \"npm run dev:sass && npm run dev:postcss\" ./src",
"dev:sass": "node-sass --output-style expanded --source-map true src/styles.scss ../static/css/styles.css",
"dev:postcss": "postcss --config . --map true --output ../static/css/styles.css ../static/css/styles.css"
},
"keywords": [],
"author": "",
"license": "MIT",
"devDependencies": {
"autoprefixer": "^10.0.2",
"clean-css-cli": "^4.3.0",
"node-sass": "^5.0.0",
"postcss": "^8.1.9",
"postcss-cli": "^8.3.0",
"postcss-scss": "^3.0.4",
"rimraf": "^3.0.2",
"tailwindcss": "^2.0.1",
"watch": "^1.0.2"
}
}

View file

@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

View file

@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View file

@ -0,0 +1,20 @@
// This is a minimal config.
// If you need the full config, get it from here:
// https://unpkg.com/browse/tailwindcss@latest/stubs/defaultConfig.stub.js
module.exports = {
purge: [
// Templates within theme app (e.g. base.html)
'../templates/**/*.html',
// Templates in other apps. Uncomment the following line if it matches
// your project structure or change it to match.
// '../../templates/**/*.html',
],
darkMode: false, // or 'media' or 'class'
theme: {
extend: {},
},
variants: {
extend: {},
},
plugins: [],
}

View file

@ -0,0 +1,29 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Tailwind CSS Skeleton</title>
<meta name="description" content="">
<meta name="keywords" content="">
<meta name="author" content="">
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
</head>
<body class="bg-grey-lightest font-serif leading-normal tracking-normal">
<div class="container mx-auto">
<section class="flex items-center justify-center h-screen">
<h1 class="text-5xl">Django + Tailwind = ❤️</h1>
</section>
</div>
</body>
</html>