forked from shibao/cannery
		
	run phx.new and add phx.gen.auth
This commit is contained in:
		
							
								
								
									
										5
									
								
								assets/.babelrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								assets/.babelrc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
    "presets": [
 | 
			
		||||
        "@babel/preset-env"
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										93
									
								
								assets/css/app.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								assets/css/app.scss
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
@import "tailwindcss/base";
 | 
			
		||||
@import "tailwindcss/components";
 | 
			
		||||
@import "tailwindcss/utilities";
 | 
			
		||||
 | 
			
		||||
@import "components";
 | 
			
		||||
 | 
			
		||||
/* LiveView specific classes for your customizations */
 | 
			
		||||
.phx-no-feedback.invalid-feedback,
 | 
			
		||||
.phx-no-feedback .invalid-feedback {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.phx-click-loading {
 | 
			
		||||
  opacity: 0.5;
 | 
			
		||||
  transition: opacity 1s ease-out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.phx-disconnected{
 | 
			
		||||
  cursor: wait;
 | 
			
		||||
}
 | 
			
		||||
.phx-disconnected *{
 | 
			
		||||
  pointer-events: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.phx-modal {
 | 
			
		||||
  opacity: 1!important;
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  z-index: 1;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  overflow: auto;
 | 
			
		||||
  background-color: rgb(0,0,0);
 | 
			
		||||
  background-color: rgba(0,0,0,0.4);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.phx-modal-content {
 | 
			
		||||
  background-color: #fefefe;
 | 
			
		||||
  margin: 15% auto;
 | 
			
		||||
  padding: 20px;
 | 
			
		||||
  border: 1px solid #888;
 | 
			
		||||
  width: 80%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.phx-modal-close {
 | 
			
		||||
  color: #aaa;
 | 
			
		||||
  float: right;
 | 
			
		||||
  font-size: 28px;
 | 
			
		||||
  font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.phx-modal-close:hover,
 | 
			
		||||
.phx-modal-close:focus {
 | 
			
		||||
  color: black;
 | 
			
		||||
  text-decoration: none;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Alerts and form errors */
 | 
			
		||||
.alert {
 | 
			
		||||
  padding: 15px;
 | 
			
		||||
  margin-bottom: 20px;
 | 
			
		||||
  border: 1px solid transparent;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
}
 | 
			
		||||
.alert-info {
 | 
			
		||||
  color: #31708f;
 | 
			
		||||
  background-color: #d9edf7;
 | 
			
		||||
  border-color: #bce8f1;
 | 
			
		||||
}
 | 
			
		||||
.alert-warning {
 | 
			
		||||
  color: #8a6d3b;
 | 
			
		||||
  background-color: #fcf8e3;
 | 
			
		||||
  border-color: #faebcc;
 | 
			
		||||
}
 | 
			
		||||
.alert-danger {
 | 
			
		||||
  color: #a94442;
 | 
			
		||||
  background-color: #f2dede;
 | 
			
		||||
  border-color: #ebccd1;
 | 
			
		||||
}
 | 
			
		||||
.alert p {
 | 
			
		||||
  margin-bottom: 0;
 | 
			
		||||
}
 | 
			
		||||
.alert:empty {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
.invalid-feedback {
 | 
			
		||||
  color: #a94442;
 | 
			
		||||
  display: block;
 | 
			
		||||
  margin: -1rem 0 2rem;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								assets/css/components.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								assets/css/components.scss
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
@layer components {
 | 
			
		||||
  .input {
 | 
			
		||||
    @apply rounded-lg px-4 py-2;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										36
									
								
								assets/js/app.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								assets/js/app.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
// We need to import the CSS so that webpack will load it.
 | 
			
		||||
// The MiniCssExtractPlugin is used to separate it out into
 | 
			
		||||
// its own CSS file.
 | 
			
		||||
import "../css/app.scss"
 | 
			
		||||
 | 
			
		||||
// webpack automatically bundles all modules in your
 | 
			
		||||
// entry points. Those entry points can be configured
 | 
			
		||||
// in "webpack.config.js".
 | 
			
		||||
//
 | 
			
		||||
// Import deps with the dep name or local files with a relative path, for example:
 | 
			
		||||
//
 | 
			
		||||
//     import {Socket} from "phoenix"
 | 
			
		||||
//     import socket from "./socket"
 | 
			
		||||
//
 | 
			
		||||
import "phoenix_html"
 | 
			
		||||
import {Socket} from "phoenix"
 | 
			
		||||
import topbar from "topbar"
 | 
			
		||||
import {LiveSocket} from "phoenix_live_view"
 | 
			
		||||
 | 
			
		||||
let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
 | 
			
		||||
let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}})
 | 
			
		||||
 | 
			
		||||
// Show progress bar on live navigation and form submits
 | 
			
		||||
topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"})
 | 
			
		||||
window.addEventListener("phx:page-loading-start", info => topbar.show())
 | 
			
		||||
window.addEventListener("phx:page-loading-stop", info => topbar.hide())
 | 
			
		||||
 | 
			
		||||
// connect if there are any LiveViews on the page
 | 
			
		||||
liveSocket.connect()
 | 
			
		||||
 | 
			
		||||
// expose liveSocket on window for web console debug logs and latency simulation:
 | 
			
		||||
// >> liveSocket.enableDebug()
 | 
			
		||||
// >> liveSocket.enableLatencySim(1000)  // enabled for duration of browser session
 | 
			
		||||
// >> liveSocket.disableLatencySim()
 | 
			
		||||
window.liveSocket = liveSocket
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										63
									
								
								assets/js/socket.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								assets/js/socket.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
// NOTE: The contents of this file will only be executed if
 | 
			
		||||
// you uncomment its entry in "assets/js/app.js".
 | 
			
		||||
 | 
			
		||||
// To use Phoenix channels, the first step is to import Socket,
 | 
			
		||||
// and connect at the socket path in "lib/web/endpoint.ex".
 | 
			
		||||
//
 | 
			
		||||
// Pass the token on params as below. Or remove it
 | 
			
		||||
// from the params if you are not using authentication.
 | 
			
		||||
import {Socket} from "phoenix"
 | 
			
		||||
 | 
			
		||||
let socket = new Socket("/socket", {params: {token: window.userToken}})
 | 
			
		||||
 | 
			
		||||
// When you connect, you'll often need to authenticate the client.
 | 
			
		||||
// For example, imagine you have an authentication plug, `MyAuth`,
 | 
			
		||||
// which authenticates the session and assigns a `:current_user`.
 | 
			
		||||
// If the current user exists you can assign the user's token in
 | 
			
		||||
// the connection for use in the layout.
 | 
			
		||||
//
 | 
			
		||||
// In your "lib/web/router.ex":
 | 
			
		||||
//
 | 
			
		||||
//     pipeline :browser do
 | 
			
		||||
//       ...
 | 
			
		||||
//       plug MyAuth
 | 
			
		||||
//       plug :put_user_token
 | 
			
		||||
//     end
 | 
			
		||||
//
 | 
			
		||||
//     defp put_user_token(conn, _) do
 | 
			
		||||
//       if current_user = conn.assigns[:current_user] do
 | 
			
		||||
//         token = Phoenix.Token.sign(conn, "user socket", current_user.id)
 | 
			
		||||
//         assign(conn, :user_token, token)
 | 
			
		||||
//       else
 | 
			
		||||
//         conn
 | 
			
		||||
//       end
 | 
			
		||||
//     end
 | 
			
		||||
//
 | 
			
		||||
// Now you need to pass this token to JavaScript. You can do so
 | 
			
		||||
// inside a script tag in "lib/web/templates/layout/app.html.eex":
 | 
			
		||||
//
 | 
			
		||||
//     <script>window.userToken = "<%= assigns[:user_token] %>";</script>
 | 
			
		||||
//
 | 
			
		||||
// You will need to verify the user token in the "connect/3" function
 | 
			
		||||
// in "lib/web/channels/user_socket.ex":
 | 
			
		||||
//
 | 
			
		||||
//     def connect(%{"token" => token}, socket, _connect_info) do
 | 
			
		||||
//       # max_age: 1209600 is equivalent to two weeks in seconds
 | 
			
		||||
//       case Phoenix.Token.verify(socket, "user socket", token, max_age: 1209600) do
 | 
			
		||||
//         {:ok, user_id} ->
 | 
			
		||||
//           {:ok, assign(socket, :user, user_id)}
 | 
			
		||||
//         {:error, reason} ->
 | 
			
		||||
//           :error
 | 
			
		||||
//       end
 | 
			
		||||
//     end
 | 
			
		||||
//
 | 
			
		||||
// Finally, connect to the socket:
 | 
			
		||||
socket.connect()
 | 
			
		||||
 | 
			
		||||
// Now that you are connected, you can join channels with a topic:
 | 
			
		||||
let channel = socket.channel("topic:subtopic", {})
 | 
			
		||||
channel.join()
 | 
			
		||||
  .receive("ok", resp => { console.log("Joined successfully", resp) })
 | 
			
		||||
  .receive("error", resp => { console.log("Unable to join", resp) })
 | 
			
		||||
 | 
			
		||||
export default socket
 | 
			
		||||
							
								
								
									
										10140
									
								
								assets/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										10140
									
								
								assets/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										38
									
								
								assets/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								assets/package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
{
 | 
			
		||||
  "repository": {},
 | 
			
		||||
  "description": " ",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "deploy": "NODE_ENV=production webpack --mode production",
 | 
			
		||||
    "watch": "webpack --mode development --watch --watch-options-stdin"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "phoenix": "file:../deps/phoenix",
 | 
			
		||||
    "phoenix_html": "file:../deps/phoenix_html",
 | 
			
		||||
    "phoenix_live_view": "file:../deps/phoenix_live_view",
 | 
			
		||||
    "topbar": "^0.1.4"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@babel/core": "^7.15.0",
 | 
			
		||||
    "@babel/preset-env": "^7.15.0",
 | 
			
		||||
    "autoprefixer": "^10.2.6",
 | 
			
		||||
    "babel-loader": "^8.2.2",
 | 
			
		||||
    "copy-webpack-plugin": "^9.0.0",
 | 
			
		||||
    "css-loader": "^5.2.7",
 | 
			
		||||
    "css-minimizer-webpack-plugin": "^3.0.1",
 | 
			
		||||
    "hard-source-webpack-plugin": "^0.13.1",
 | 
			
		||||
    "mini-css-extract-plugin": "^1.6.0",
 | 
			
		||||
    "node-sass": "^6.0.0",
 | 
			
		||||
    "postcss": "^8.3.6",
 | 
			
		||||
    "postcss-import": "^14.0.2",
 | 
			
		||||
    "postcss-loader": "^6.1.1",
 | 
			
		||||
    "postcss-preset-env": "^6.7.0",
 | 
			
		||||
    "sass-loader": "^12.1.0",
 | 
			
		||||
    "style-loader": "^3.2.1",
 | 
			
		||||
    "tailwindcss": "^2.2.7",
 | 
			
		||||
    "terser-webpack-plugin": "^5.1.3",
 | 
			
		||||
    "webpack": "^5.50.0",
 | 
			
		||||
    "webpack-cli": "^4.8.0",
 | 
			
		||||
    "webpack-dev-server": "^3.11.2"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								assets/postcss.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								assets/postcss.config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
module.exports = {
 | 
			
		||||
	plugins: {
 | 
			
		||||
		"postcss-import": {},
 | 
			
		||||
		tailwindcss: {},
 | 
			
		||||
		autoprefixer: {},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								assets/static/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/static/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								assets/static/images/phoenix.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/static/images/phoenix.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 14 KiB  | 
							
								
								
									
										5
									
								
								assets/static/robots.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								assets/static/robots.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
 | 
			
		||||
#
 | 
			
		||||
# To ban all spiders from the entire site uncomment the next two lines:
 | 
			
		||||
# User-agent: *
 | 
			
		||||
# Disallow: /
 | 
			
		||||
							
								
								
									
										31
									
								
								assets/tailwind.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								assets/tailwind.config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
const colors = require('tailwindcss/colors')
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  purge: [
 | 
			
		||||
    '../lib/**/*.ex',
 | 
			
		||||
    '../lib/**/*.leex',
 | 
			
		||||
    '../lib/**/*.eex',
 | 
			
		||||
    './js/**/*.js'
 | 
			
		||||
  ],
 | 
			
		||||
  darkMode: "media",
 | 
			
		||||
  theme: {
 | 
			
		||||
    colors: {
 | 
			
		||||
      transparent: 'transparent',
 | 
			
		||||
      current: 'currentColor',
 | 
			
		||||
      
 | 
			
		||||
      primary: colors.indigo,
 | 
			
		||||
      
 | 
			
		||||
      black: colors.black,
 | 
			
		||||
      white: colors.white,
 | 
			
		||||
      gray: colors.trueGray,
 | 
			
		||||
      indigo: colors.indigo,
 | 
			
		||||
      red: colors.rose,
 | 
			
		||||
      yellow: colors.amber,
 | 
			
		||||
    },
 | 
			
		||||
    extend: {},
 | 
			
		||||
  },
 | 
			
		||||
  variants: {
 | 
			
		||||
    extend: {},
 | 
			
		||||
  },
 | 
			
		||||
  plugins: [],
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								assets/webpack.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								assets/webpack.config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
const path = require("path");
 | 
			
		||||
const glob = require("glob");
 | 
			
		||||
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
 | 
			
		||||
const TerserPlugin = require("terser-webpack-plugin");
 | 
			
		||||
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
 | 
			
		||||
const CopyWebpackPlugin = require("copy-webpack-plugin");
 | 
			
		||||
 | 
			
		||||
module.exports = (env, options) => {
 | 
			
		||||
  const devMode = options.mode !== "production";
 | 
			
		||||
 | 
			
		||||
  return {
 | 
			
		||||
    optimization: {
 | 
			
		||||
      minimizer: [
 | 
			
		||||
        new TerserPlugin({ parallel: true, extractComments: true }),
 | 
			
		||||
        new CssMinimizerPlugin({})
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    entry: {
 | 
			
		||||
      app: glob.sync("./vendor/**/*.js").concat(["./js/app.js"])
 | 
			
		||||
    },
 | 
			
		||||
    output: {
 | 
			
		||||
      filename: "[name].js",
 | 
			
		||||
      path: path.resolve(__dirname, "../priv/static/js"),
 | 
			
		||||
      publicPath: "/js/"
 | 
			
		||||
    },
 | 
			
		||||
    devtool: devMode ? "eval-cheap-module-source-map" : undefined,
 | 
			
		||||
    module: {
 | 
			
		||||
      rules: [
 | 
			
		||||
        {
 | 
			
		||||
          test: /\.js$/,
 | 
			
		||||
          exclude: /node_modules/,
 | 
			
		||||
          use: {
 | 
			
		||||
            loader: "babel-loader"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          test: /\.s?css$/,
 | 
			
		||||
          use: [
 | 
			
		||||
            MiniCssExtractPlugin.loader,
 | 
			
		||||
            "css-loader",
 | 
			
		||||
            "postcss-loader",
 | 
			
		||||
            "sass-loader",
 | 
			
		||||
          ],
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    plugins: [
 | 
			
		||||
      new MiniCssExtractPlugin({ filename: "../css/app.css" }),
 | 
			
		||||
      new CopyWebpackPlugin({
 | 
			
		||||
        patterns: [{ from: "static/", to: "../" }]
 | 
			
		||||
      })
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										4587
									
								
								assets/yarn.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4587
									
								
								assets/yarn.lock
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user