├── tailstart ├── js │ └── tailstart.js └── css │ └── tailstart.css ├── css.png ├── index.png ├── resources ├── css │ ├── base │ │ ├── typography.css │ │ ├── style.css │ │ ├── typography │ │ │ ├── paragraph.css │ │ │ ├── headings.css │ │ │ └── lists.css │ │ ├── style │ │ │ ├── preformated.css │ │ │ ├── basic.css │ │ │ └── annotation.css │ │ └── form.css │ ├── basic.css │ ├── base.css │ ├── javascript │ │ ├── collapse.css │ │ ├── dismiss.css │ │ ├── dropdown.css │ │ ├── modal.css │ │ ├── tab.css │ │ ├── offcanvas.css │ │ ├── multimedia.css │ │ ├── tooltip.css │ │ ├── accordion.css │ │ └── popover.css │ ├── utilities.css │ ├── basic │ │ ├── figure.css │ │ ├── leading.css │ │ ├── image.css │ │ ├── details.css │ │ ├── button.css │ │ ├── switches.css │ │ └── input.css │ ├── javascript.css │ ├── components.css │ ├── components │ │ ├── navigation.css │ │ ├── table.css │ │ ├── pagination.css │ │ ├── card.css │ │ ├── breadcrumb.css │ │ ├── badge.css │ │ ├── group.css │ │ ├── header.css │ │ ├── alert.css │ │ ├── progress.css │ │ └── list.css │ ├── font.css │ └── app.css └── js │ ├── app.js │ └── utilities │ └── dark.js ├── .gitignore ├── postcss.config.js ├── tailwind.config.js ├── .github └── workflows │ └── publish.yml ├── LICENSE ├── package.json ├── webpack.mix.js ├── public ├── details.html ├── breadcrumb.html ├── leading.html ├── collapse.html ├── dark.html ├── tooltips.html ├── navigation.html ├── dismiss.html ├── popover.html ├── tab.html ├── alert.html ├── badge.html ├── modal.html ├── accordion.html ├── image.html ├── figure.html ├── dropdown.html ├── progress.html ├── card.html ├── button.html ├── offcanvas.html ├── header.html ├── pagination.html ├── typography.html ├── multimedia.html ├── styles.html └── list.html └── README.md /tailstart/js/tailstart.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /css.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/Tailstart/master/css.png -------------------------------------------------------------------------------- /index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarkGhostHunter/Tailstart/master/index.png -------------------------------------------------------------------------------- /resources/css/base/typography.css: -------------------------------------------------------------------------------- 1 | @import "typography/headings.css"; 2 | @import "typography/paragraph.css"; 3 | @import "typography/lists.css"; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | *.local 4 | yarn.lock 5 | yarn.error 6 | package.lock 7 | .idea 8 | public/css 9 | public/js 10 | public/tailstart 11 | mix-manifest.json -------------------------------------------------------------------------------- /resources/css/base/style.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Here you can find the base blocks for text styling, from italics and 3 | * bold weight, to quotes and code. 4 | */ 5 | @import "style/basic.css"; 6 | @import "style/annotation.css"; 7 | @import "style/preformated.css"; -------------------------------------------------------------------------------- /resources/css/base/typography/paragraph.css: -------------------------------------------------------------------------------- 1 | @layer base { 2 | /** 3 | * The paragraph element. 4 | * 5 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/p 6 | */ 7 | p { 8 | @apply leading-relaxed mb-4; 9 | } 10 | } -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require("postcss-import"), 4 | require("tailwindcss")("./tailwind.config.js"), 5 | require("postcss-nesting"), 6 | require("postcss-input-range"), 7 | require("autoprefixer") 8 | ], 9 | } -------------------------------------------------------------------------------- /resources/css/basic.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Here you can edit your components. 3 | * 4 | * These components are added to the "components" layer of Tailwind. 5 | */ 6 | @import "basic/button.css"; 7 | @import "basic/leading.css"; 8 | @import "basic/input.css"; 9 | @import "basic/switches.css"; 10 | @import "basic/image.css"; 11 | @import "basic/figure.css"; 12 | @import "basic/details.css"; 13 | -------------------------------------------------------------------------------- /resources/css/base.css: -------------------------------------------------------------------------------- 1 | @import "base/typography.css"; 2 | @import "base/style.css"; 3 | 4 | /** 5 | * This is just a simple non-invasive form reset. 6 | * 7 | * While this should suffice for most projects, you may want to use Tailwind CSS 8 | * form reset for more complex scenarios. 9 | * 10 | * @see https://github.com/tailwindlabs/tailwindcss-forms 11 | */ 12 | @import "base/form.css"; -------------------------------------------------------------------------------- /resources/css/javascript/collapse.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .collapse { 3 | @apply h-0; 4 | 5 | &:not(.show) { 6 | @apply hidden; 7 | } 8 | 9 | &.show { 10 | @apply block h-auto; 11 | } 12 | } 13 | 14 | /* purgecss ignore */ 15 | .collapsing { 16 | @apply transition-all h-0 overflow-hidden duration-300 ease-out; 17 | } 18 | } -------------------------------------------------------------------------------- /resources/css/javascript/dismiss.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | /** 3 | * We will make alerts dismissible if these contain a "dismissible" class and a close button. 4 | */ 5 | .alert.alert-dismissible { 6 | &:not(.show) { 7 | @apply transition-all opacity-0; 8 | } 9 | 10 | & .btn-close { 11 | @apply absolute top-2 right-2; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | mode: 'jit', 3 | darkMode: 'class', 4 | purge: { 5 | mode: 'all', 6 | content: [ 7 | './public/**/*.html', 8 | './resources/js/**/*.js' 9 | ], 10 | }, 11 | theme: { 12 | extend: { 13 | /* */ 14 | }, 15 | }, 16 | variants: { 17 | /* */ 18 | }, 19 | plugins: [ 20 | ] 21 | }; -------------------------------------------------------------------------------- /resources/css/utilities.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This is a good place to add your own Tailwind-style utilities. 3 | * 4 | * Just for show, here we made one so you can build upon. 5 | */ 6 | @layer utilities { 7 | @variants responsive { 8 | .scroll-snap-none { 9 | scroll-snap-type: none; 10 | } 11 | .scroll-snap-x { 12 | scroll-snap-type: x; 13 | } 14 | .scroll-snap-y { 15 | scroll-snap-type: y; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /resources/css/basic/figure.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | /** 3 | * Self-contained descriptive content. 4 | * 5 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/figure 6 | */ 7 | .fig { 8 | @apply border rounded p-2 mb-2; 9 | 10 | & > .fig-body { 11 | @apply block mb-2 border-0; 12 | } 13 | 14 | & > figcaption { 15 | @apply text-sm text-gray-500 font-serif; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to NPM 2 | on: 3 | release: 4 | types: [created] 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | # Setup .npmrc file to publish to npm 11 | - uses: actions/setup-node@v2 12 | with: 13 | node-version: '12.x' 14 | registry-url: 'https://registry.npmjs.org' 15 | - run: npm install 16 | - run: npm publish 17 | env: 18 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} -------------------------------------------------------------------------------- /resources/css/basic/leading.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | /** 3 | * These leading is basically a header with a subtitle. The first element is 4 | * expected to be a heading, while the second can be anything, like a para- 5 | * graph, that will be less-black than the typography. 6 | */ 7 | .leading { 8 | @apply mb-2; 9 | 10 | & *:first-child { 11 | @apply mb-1; 12 | } 13 | 14 | & *:last-child { 15 | @apply mb-0 font-light text-gray-500; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /resources/css/javascript.css: -------------------------------------------------------------------------------- 1 | /** 2 | * These components require Javascript to properly function. 3 | * 4 | * There is a convenient `/src/js/app.js` file you can use to add interactivity to them. 5 | */ 6 | @import "javascript/accordion.css"; 7 | @import "javascript/collapse.css"; 8 | @import "javascript/dropdown.css"; 9 | @import "javascript/dismiss.css"; 10 | @import "javascript/modal.css"; 11 | @import "javascript/tooltip.css"; 12 | @import "javascript/popover.css"; 13 | @import "javascript/offcanvas.css"; 14 | @import "javascript/tab.css"; 15 | @import "javascript/multimedia.css"; 16 | -------------------------------------------------------------------------------- /resources/css/components.css: -------------------------------------------------------------------------------- 1 | /** 2 | * These are more advanced components crated on top of base tags. 3 | * 4 | * Feel free to edit them, since these work after you add a distinctive class to them. 5 | */ 6 | @import "components/alert.css"; 7 | @import "components/badge.css"; 8 | @import "components/breadcrumb.css"; 9 | @import "components/card.css"; 10 | @import "components/group.css"; 11 | @import "components/header.css"; 12 | @import "components/list.css"; 13 | @import "components/navigation.css"; 14 | @import "components/pagination.css"; 15 | @import "components/progress.css"; 16 | @import "components/table.css"; 17 | -------------------------------------------------------------------------------- /resources/css/components/navigation.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .nav { 3 | @apply inline-block border rounded; 4 | 5 | &.nav-portrait > ul { 6 | @apply flex-col divide-x-0 divide-y; 7 | } 8 | 9 | & > ul { 10 | @apply flex flex-col md:flex-row divide-y md:divide-x md:divide-y-0; 11 | 12 | & > li > a { 13 | @apply block px-3 py-2; 14 | 15 | &.active { 16 | @apply text-blue-500; 17 | } 18 | 19 | &.disabled { 20 | @apply text-gray-500 cursor-not-allowed; 21 | } 22 | } 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /resources/css/basic/image.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | /** 3 | * For images, we can just round them. 4 | */ 5 | .img, picture > .img { 6 | @apply rounded; 7 | 8 | /** 9 | * Responsive images will adjust their height automatically. 10 | */ 11 | &.responsive { 12 | @apply w-full h-auto; 13 | } 14 | 15 | /** 16 | * Thumbnails images that float into text. 17 | */ 18 | &.thumbnail { 19 | @apply inline-block border p-2 mb-2; 20 | 21 | &.float-left { 22 | @apply mr-2; 23 | } 24 | 25 | &.float-right { 26 | @apply ml-2; 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /resources/css/font.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This is a place to test different font families without editing all the 3 | * HTML files. In production, you may want to use and preload the 4 | * fonts, instead of letting the browser wait to fetch it from the CSS. 5 | * 6 | * After you add your fonts to your project, set the `theme.fontFamily` keys 7 | * in your `tailwind.config.js` to point the correct fonts. Alternatively, 8 | * you can use SnapFont to preview fonts without having to import them. 9 | * 10 | * @see https://getsnapfont.com/ 11 | * @see https://tailwindcss.com/docs/font-family#customizing 12 | */ 13 | 14 | /* 15 | @import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,300;0,400;0,900;1,300;1,400;1,900&display=swap'); 16 | */ -------------------------------------------------------------------------------- /resources/css/components/table.css: -------------------------------------------------------------------------------- 1 | @layer base { 2 | .table { 3 | @apply border-collapse border rounded table-auto w-full mb-2; 4 | 5 | & > caption { 6 | @apply text-gray-500 mt-2 text-sm; 7 | caption-side: bottom; 8 | } 9 | 10 | & > thead { 11 | @apply border-b-2; 12 | } 13 | 14 | & > thead, & > tbody, & > tfoot { 15 | @apply divide-y; 16 | 17 | & > tr { 18 | @apply divide-x; 19 | 20 | & > th, & > td { 21 | @apply px-3 py-2; 22 | } 23 | } 24 | } 25 | 26 | & > tfoot { 27 | @apply border-t-2; 28 | } 29 | } 30 | 31 | .table-responsive { 32 | @apply overflow-x-auto md:overflow-x-visible; 33 | } 34 | } -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is the entry point for your application. 3 | * 4 | * You shouldn't need to edit this file, but its children and linked CSS. 5 | */ 6 | 7 | /** 8 | * Font-families 9 | * 10 | * Here is a great place to add your font-families on development. 11 | */ 12 | @import "font.css"; 13 | 14 | /** 15 | * Base 16 | * 17 | * Resets browser typography style and tags behaviour. 18 | */ 19 | @import "tailwindcss/base"; 20 | @import "base.css"; 21 | 22 | /** 23 | * Components 24 | * 25 | * Classes that handle multiple Tailwind utilities and behavior. 26 | */ 27 | @import "tailwindcss/components"; 28 | @import "basic.css"; 29 | @import "components.css"; 30 | @import "javascript.css"; 31 | 32 | 33 | /** 34 | * Utilities 35 | * 36 | * Simple classes that simplify CSS properties. 37 | */ 38 | @import "tailwindcss/utilities"; 39 | @import "utilities.css"; -------------------------------------------------------------------------------- /resources/css/javascript/dropdown.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .dropdown-menu { 3 | @apply hidden absolute bg-white rounded border py-2; 4 | 5 | &.show { 6 | @apply block; 7 | } 8 | 9 | & .dropdown-item, & .dropdown-item-text, & .dropdown-header { 10 | @apply block w-full px-4 py-2 text-left; 11 | } 12 | 13 | & .dropdown-header { 14 | @apply cursor-default; 15 | } 16 | 17 | 18 | & .dropdown-item { 19 | &:hover, &:focus { 20 | @apply bg-gray-100; 21 | } 22 | 23 | &:active { 24 | @apply bg-gray-200; 25 | } 26 | } 27 | 28 | & .dropdown-header { 29 | @apply text-gray-500 text-sm my-0; 30 | } 31 | 32 | & .dropdown-divider { 33 | @apply my-2; 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /resources/css/components/pagination.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .pagination { 3 | @apply inline-block border rounded; 4 | 5 | & > ul { 6 | @apply flex flex-row divide-x; 7 | 8 | & > li { 9 | 10 | & > a, & > span { 11 | @apply flex flex-row items-center gap-x-2 px-3 py-2 h-full; 12 | 13 | &.current, &.remain { 14 | @apply text-gray-300 cursor-default; 15 | } 16 | 17 | & > span { 18 | /** This will allow the typography to disappear and make room for the buttons */ 19 | @apply hidden md:inline-block; 20 | } 21 | 22 | & > * { 23 | @apply inline-block; 24 | } 25 | } 26 | } 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /resources/css/components/card.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .card { 3 | @apply flex flex-col border rounded divide-y; 4 | 5 | & .card-body, & .card-header, & .card-footer { 6 | @apply px-3 py-2; 7 | } 8 | 9 | & .card-header, & .card-title { 10 | @apply text-xl; 11 | } 12 | 13 | & .card-header { 14 | @apply mb-0; 15 | } 16 | 17 | & .card-header { 18 | @apply px-3 py-2; 19 | 20 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 21 | @apply mb-0; 22 | } 23 | } 24 | 25 | & > .card-picture { 26 | @apply w-full h-auto mb-0; 27 | } 28 | 29 | &.card-landscape { 30 | @apply md:flex-row md:divide-y-0 md:divide-x; 31 | & < * { 32 | @apply w-full md:w-auto ; 33 | } 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /resources/css/base/typography/headings.css: -------------------------------------------------------------------------------- 1 | @layer base { 2 | /** 3 | * Tailwind CSS strips headings from any size, so we will add them 4 | * back along with a margin at the bottom to separate it from the 5 | * next paragraphs or leading. H3 and below use the same margin. 6 | */ 7 | h1 { 8 | @apply text-3xl md:text-4xl lg:text-6xl; 9 | @apply mb-6 md:mb-10; 10 | } 11 | 12 | h2 { 13 | @apply text-2xl md:text-3xl lg:text-5xl; 14 | @apply mb-4 md:mb-8; 15 | } 16 | 17 | h3 { 18 | @apply text-xl md:text-2xl lg:text-4xl; 19 | @apply mb-2 md:mb-4; 20 | } 21 | 22 | h4 { 23 | @apply text-lg md:text-xl lg:text-2xl; 24 | @apply mb-2 md:mb-4; 25 | } 26 | 27 | h5 { 28 | @apply text-base md:text-lg lg:text-xl; 29 | @apply mb-2 md:mb-4; 30 | } 31 | 32 | h6 { 33 | @apply text-base; 34 | @apply mb-2 md:mb-4; 35 | } 36 | } -------------------------------------------------------------------------------- /resources/css/base/typography/lists.css: -------------------------------------------------------------------------------- 1 | @layer base { 2 | /** 3 | * Here you have two options: 4 | * 5 | * 1. Revert back the style to the lists, and use a "list-unstyled" to strip them down. 6 | * 2. Keep the lists unstyled, and use a class container to add their style back. 7 | * 8 | * Because it's saner for the option 2, we will use the `text-content` class for that. 9 | * 10 | *
11 | * 14 | *
15 | */ 16 | .text-content { 17 | & ul, & ol { 18 | @apply ml-4; 19 | 20 | list-style: revert; 21 | 22 | & li { 23 | @apply ml-4 mb-2; 24 | } 25 | } 26 | 27 | & dl { 28 | @apply grid grid-cols-2 overflow-y-auto; 29 | grid-template-columns: auto max-content; 30 | 31 | & > dt { 32 | @apply font-bold mb-2; 33 | } 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /resources/css/components/breadcrumb.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .breadcrumb { 3 | @apply inline-block; 4 | 5 | & > ol { 6 | @apply border rounded flex flex-row gap-x-2; 7 | 8 | & > li { 9 | @apply relative; 10 | 11 | /* Magic arrow */ 12 | &:after { 13 | @apply absolute block right-0 top-3 border h-2 w-2 transform origin-center rotate-[135deg]; 14 | @apply translate-x-1.5; 15 | content: ''; 16 | border-right: none; 17 | border-bottom: none; 18 | } 19 | 20 | &:last-child { 21 | &:after { 22 | @apply hidden; 23 | } 24 | } 25 | 26 | & > * { 27 | @apply inline-block px-2 py-1; 28 | 29 | &.current { 30 | @apply text-gray-400; 31 | } 32 | } 33 | } 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /resources/css/components/badge.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .badge { 3 | @apply inline-block px-[0.25em] border border-gray-500 rounded text-[0.75em] font-bold text-opacity-90; 4 | 5 | &.badge-gray { 6 | @apply bg-gray-500 border-gray-500 text-white; 7 | } 8 | 9 | &.badge-red { 10 | @apply bg-red-500 border-red-500 text-white; 11 | } 12 | 13 | &.badge-yellow { 14 | @apply bg-yellow-500 border-yellow-500 text-white; 15 | } 16 | 17 | &.badge-green { 18 | @apply bg-green-500 border-green-500 text-white; 19 | } 20 | 21 | &.badge-blue { 22 | @apply bg-blue-500 border-blue-500 text-white; 23 | } 24 | 25 | &.badge-indigo { 26 | @apply bg-indigo-500 border-indigo-500 text-white; 27 | } 28 | 29 | &.badge-purple { 30 | @apply bg-purple-500 border-purple-500 text-white; 31 | } 32 | 33 | &.badge-pink { 34 | @apply bg-pink-500 border-pink-500 text-white; 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Italo Israel Baeza Cabrera 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /resources/css/components/group.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .input-group { 3 | @apply relative flex items-stretch; 4 | 5 | & > *, & > input { 6 | @apply bg-white; 7 | @apply -ml-px; 8 | @apply block flex items-center px-3; 9 | @apply rounded-r-none rounded-l-none !important; 10 | @apply border; 11 | 12 | &:first-child { 13 | @apply border; 14 | @apply rounded-l rounded-r-none !important; 15 | } 16 | 17 | &:last-child { 18 | @apply relative; 19 | @apply border; 20 | @apply rounded-r rounded-l-none !important; 21 | } 22 | 23 | &:hover, &:active { 24 | @apply z-10; 25 | } 26 | 27 | &:focus { 28 | @apply z-[11]; 29 | } 30 | } 31 | 32 | & > input[type="file"] { 33 | @apply px-0 overflow-hidden; 34 | } 35 | 36 | & > label { 37 | @apply flex-row gap-x-2; 38 | } 39 | 40 | &.disabled { 41 | @apply text-gray-400; 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tailstart", 3 | "description": "Components ready to style with Tailwind CSS", 4 | "version": "1.0.0", 5 | "license": "MIT", 6 | "repository": "https://github.com/darkghosthunter/tailstart.git", 7 | "bugs": "https://github.com/darkghosthunter/tailstart/issues", 8 | "homepage": "https://github.com/darkghosthunter/tailstart", 9 | "author": { 10 | "email": "darkghosthunter@gmail.com", 11 | "name": "Italo Israel Baeza Cabrera" 12 | }, 13 | "scripts": { 14 | "dev": "npm run development", 15 | "development": "mix", 16 | "watch": "mix watch", 17 | "watch-poll": "mix watch -- --watch-options-poll=1000", 18 | "hot": "mix watch --hot", 19 | "prod": "npm run production", 20 | "production": "mix --production" 21 | }, 22 | "devDependencies": { 23 | "@popperjs/core": "^2.9.2", 24 | "autoprefixer": "^10.2.6", 25 | "bootstrap": "^5.0.1", 26 | "browser-sync": "^2.26.14", 27 | "browser-sync-webpack-plugin": "2.3.0", 28 | "laravel-mix": "^6.0", 29 | "postcss": "^8.3.0", 30 | "postcss-import": "^14.0.2", 31 | "postcss-nesting": "^8.0.1", 32 | "tailwindcss": "^2.1.4", 33 | "postcss-input-range": "^4.0.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /webpack.mix.js: -------------------------------------------------------------------------------- 1 | const mix = require('laravel-mix'); 2 | 3 | // If we're not on production, don't process the Tailstart CSS and JS. 4 | if (process.env.NODE_ENV !== "production") { 5 | // 6 | // Tailstart files for internal styling. 7 | // 8 | mix.js('tailstart/js/tailstart.js', 'public/tailstart/js') 9 | .postCss('tailstart/css/tailstart.css', 'public/tailstart/css'); 10 | } 11 | 12 | // 13 | // Your application files 14 | // 15 | mix.js('resources/js/app.js', 'public/js') 16 | .postCss('resources/css/app.css', 'public/css'); 17 | 18 | // 19 | // Use the utilities for your app and require them as needed, or bundle them. 20 | // 21 | mix.copy('resources/js/utilities', 'public/js/util'); 22 | // mix.js('resources/js/utilities/**/*.*js', 'public/js/util.js') 23 | 24 | // 25 | // Simple config that tells BrowserSync to serve static files and watch for changes. 26 | // 27 | // BrowserSync will automatically inject the changes styles into your browser. 28 | // 29 | mix.browserSync({ 30 | watch: true, 31 | server: { 32 | baseDir: 'public', 33 | }, 34 | files: ['resources/**/*.css', 'resources/**/*.js', 'public/**/*.html'] 35 | }); 36 | 37 | // 38 | // Since you will do a lot of styling, this won't overwhelm your OS with notifications. 39 | // 40 | mix.disableNotifications(); -------------------------------------------------------------------------------- /resources/css/base/style/preformated.css: -------------------------------------------------------------------------------- 1 | @layer base { 2 | /** 3 | * Short fragment computer code. 4 | * 5 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/code 6 | */ 7 | code { 8 | @apply px-1 rounded; 9 | @apply bg-gray-100; 10 | @apply text-gray-600; 11 | } 12 | 13 | /** 14 | * Preformatted text, like HTML or JSON. 15 | * 16 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/pre 17 | */ 18 | pre { 19 | @apply border border-gray-200 rounded; 20 | @apply overflow-y-auto; 21 | @apply px-3 py-2 mb-3; 22 | @apply text-gray-600; 23 | } 24 | 25 | /** 26 | * Output from a computer program. 27 | * 28 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/pre 29 | */ 30 | samp { 31 | @apply px-2; 32 | @apply border border-gray-100; 33 | @apply inline-block rounded; 34 | @apply text-gray-600; 35 | @apply bg-gray-50; 36 | } 37 | 38 | /** 39 | * Variable in a mathematical expression. 40 | * 41 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/var 42 | */ 43 | var { 44 | @apply inline-block border rounded-full; 45 | @apply px-2; 46 | @apply text-gray-600; 47 | } 48 | } -------------------------------------------------------------------------------- /resources/css/javascript/modal.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .modal { 3 | @apply flex-col place-items-center; 4 | @apply fixed inset-0 z-30 overflow-x-hidden overflow-y-auto outline-none; 5 | @apply hidden; 6 | 7 | & .modal-dialog { 8 | @apply transition duration-500 transform-gpu opacity-0 -translate-y-6; 9 | @apply w-auto sm:max-w-[70%] md:max-w-[50%] lg:max-w-[500px] mx-2 sm:mx-auto mt-2 md:mt-8; 10 | @apply border bg-white rounded; 11 | 12 | & .modal-header, & .modal-body, & .modal-footer { 13 | @apply mb-0 py-2 px-3; 14 | } 15 | 16 | & .modal-header, & .modal-body { 17 | @apply border-b; 18 | } 19 | 20 | & .modal-header { 21 | @apply flex flex-row items-stretch justify-between text-lg pr-2; 22 | 23 | & h1, & h2, & h3, & h4, & h5, & h6 { 24 | @apply mb-0; 25 | } 26 | } 27 | } 28 | 29 | &.fade { 30 | @apply transition-all; 31 | } 32 | 33 | &.show .modal-dialog { 34 | @apply block opacity-100 translate-y-0; 35 | } 36 | } 37 | 38 | .modal-backdrop { 39 | @apply fixed transition-all bg-black z-20 inset-0 w-screen h-screen opacity-0; 40 | 41 | &.show { 42 | @apply opacity-50; 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /resources/css/basic/details.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | /** 3 | * We can override the details block. 4 | */ 5 | .details { 6 | @apply block border rounded px-3; 7 | 8 | appearance: none; 9 | 10 | /** 11 | * The summary should have `.btn` so we don't reinvent the wheel. 12 | */ 13 | & summary.btn { 14 | /** We will apply "transition" to avoid animating the padding accidentally */ 15 | @apply relative border-0 block -ml-3 -mr-3 py-2 transition; 16 | 17 | /** 18 | * Here we will add the caret down. 19 | */ 20 | &:after { 21 | content: ''; 22 | @apply absolute right-0 top-0 h-full w-10 transition-all transform-gpu; 23 | @apply bg-center bg-no-repeat; 24 | background-size: 1rem 1rem; 25 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7' /%3E%3C/svg%3E"); 26 | } 27 | } 28 | 29 | /** 30 | * We can detect when the details box is open, and style accordingly. 31 | */ 32 | &[open] { 33 | @apply border-b; 34 | 35 | & summary { 36 | @apply border-b rounded-b-none mb-3; 37 | 38 | &:after { 39 | @apply rotate-180; 40 | } 41 | } 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /resources/css/components/header.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | /** 3 | * App Logo 4 | * 5 | * This is just the first block where you usually show your application logo. 6 | */ 7 | #app-logo { 8 | @apply block; 9 | 10 | & svg { 11 | @apply w-auto h-6 m-4 fill-current; 12 | } 13 | } 14 | 15 | /** 16 | * App Header 17 | * 18 | * This is the only app header. It's usually a bar that hides everything except the logo 19 | * to avoid wrapping the elements, and showing a button that would show a menu with the 20 | * hidden navigation. 21 | */ 22 | #app-header { 23 | @apply border rounded container mx-auto flex flex-row justify-between items-center; 24 | 25 | & > nav { 26 | @apply hidden lg:flex flex-row content-center gap-x-4; 27 | 28 | & > form { 29 | @apply flex flex-row content-center; 30 | 31 | & > input { 32 | @apply mr-2; 33 | } 34 | } 35 | 36 | & > ul { 37 | @apply flex flex-row content-center divide-x; 38 | & > li { 39 | @apply px-3 py-2; 40 | } 41 | } 42 | } 43 | } 44 | 45 | /** 46 | * App Header Collapse 47 | * 48 | * This button is meant to show only on small screens. Since the navigation is hidden 49 | * on small screens, this button can show it using Javascript. 50 | */ 51 | #app-header-toggle { 52 | @apply block lg:hidden p-4; 53 | } 54 | } -------------------------------------------------------------------------------- /resources/css/javascript/tab.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .nav-tabs { 3 | /** Adding overflow auto will allow to scroll the tabs when these doesn't fit */ 4 | @apply flex flex-row rounded-none border-0 overflow-y-auto; 5 | 6 | & .nav-link { 7 | @apply outline-none; 8 | @apply inline-block rounded-t text-gray-500 text-sm px-2 py-1; 9 | @apply md:text-base md:px-3 md:py-2; 10 | /** Allow more space on bigger screens */ 11 | @apply border border-transparent; 12 | 13 | border-bottom-color: theme('colors.gray.200'); 14 | 15 | &:hover, &:focus, &:active { 16 | @apply outline-none; 17 | } 18 | 19 | &:hover, &:focus { 20 | @apply text-blue-500; 21 | } 22 | 23 | &.active { 24 | @apply text-gray-900 relative border-gray-200; 25 | 26 | &:after { 27 | @apply absolute w-full left-0 -bottom-px border-b border-white; 28 | content: ''; 29 | } 30 | } 31 | } 32 | } 33 | 34 | .tab-content { 35 | & > .tab-pane { 36 | @apply hidden; 37 | 38 | &.active { 39 | @apply block; 40 | } 41 | 42 | &.show { 43 | @apply opacity-100; 44 | } 45 | 46 | &.fade { 47 | @apply transition-opacity; 48 | 49 | &:not(.show) { 50 | @apply opacity-0; 51 | } 52 | } 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /public/details.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Styles 10 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | Go Back 20 | 21 |
22 |
23 | 24 |
25 | 26 |
Details
27 | 28 | 29 | 30 |
31 |
32 | This is the summary of the detail description 33 |
34 |

Several species of salamander inhabit the temperate rainforest of the Pacific Northwest.

35 |

Most salamanders are nocturnal, and hunt for insects, worms, and other small creatures.

36 |
37 |
38 |
39 | 40 | 41 |
42 |
43 | 44 | 45 | -------------------------------------------------------------------------------- /resources/css/base/form.css: -------------------------------------------------------------------------------- 1 | @layer base { 2 | /** 3 | * This is the main block to allow use to easily style all inputs that are 4 | * not a form buttons, as these will have their own style through a class. 5 | */ 6 | input:not([type="button"], [type="reset"], [type="submit"], [type="checkbox"], [type="radio"]), 7 | select, 8 | textarea 9 | { 10 | @apply block border py-1 px-2 bg-white; 11 | 12 | &::placeholder { 13 | @apply text-gray-400; 14 | } 15 | 16 | /** 17 | * With this we forcefully remove the outline. You will have to add your 18 | * own using components, meaning, with the ".btn" or ".form-control" classes. 19 | */ 20 | &:focus, &:hover, &:active { 21 | @apply outline-none; 22 | } 23 | 24 | /** 25 | * This is a fix to have the cursor become a pointer if not focused. 26 | */ 27 | &:not(:focus) { 28 | @apply cursor-pointer; 29 | } 30 | } 31 | 32 | /** 33 | * Selects, Checkboxes, Radios, and file uploads should have a pointer cursor. 34 | */ 35 | select, input[type="checkbox"], input[type="radio"], input[type="file"] { 36 | &:not(.disabled, :disabled), &:focus { 37 | @apply cursor-pointer; 38 | } 39 | } 40 | 41 | /** 42 | * We will hide the datalist as it serves as internal HTML reference only. 43 | */ 44 | datalist { 45 | @apply hidden; 46 | } 47 | 48 | /** 49 | * If we find a label, we will add cursor-pointer. 50 | */ 51 | label { 52 | @apply cursor-pointer; 53 | } 54 | } -------------------------------------------------------------------------------- /resources/css/javascript/offcanvas.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .offcanvas { 3 | @apply fixed bottom-0 bg-gray-50 px-3 py-2 bg-clip-padding outline-none transform-gpu transition-transform; 4 | @apply flex flex-col invisible; 5 | @apply z-40; 6 | 7 | /** 8 | * If it's showing, we will set reset to zero any transform. 9 | */ 10 | &.show { 11 | @apply transform-none; 12 | } 13 | 14 | /** 15 | * For the width, we will set the width to around 300px to allow an edge on small devices. 16 | */ 17 | &.offcanvas-start, &.offcanvas-end { 18 | @apply w-[19em]; 19 | } 20 | 21 | /** 22 | * Vertical off-canvas will grow based on their content. 23 | */ 24 | &.offcanvas-top, &.offcanvas-bottom { 25 | @apply h-auto; 26 | } 27 | 28 | &.offcanvas-start { 29 | @apply top-0 left-0; 30 | @apply -translate-x-full; 31 | } 32 | 33 | &.offcanvas-end { 34 | @apply top-0 right-0; 35 | @apply translate-x-full; 36 | } 37 | 38 | &.offcanvas-top { 39 | @apply top-0 right-0 left-0 bottom-auto; 40 | @apply -translate-y-full 41 | } 42 | 43 | &.offcanvas-bottom { 44 | @apply right-0 left-0; 45 | @apply translate-y-full; 46 | } 47 | 48 | & .offcanvas-header { 49 | @apply flex flex-row items-center justify-between; 50 | 51 | & .offcanvas-title { 52 | @apply my-4 text-gray-500 text-lg; 53 | } 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /public/breadcrumb.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Breadcrumb 10 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 19 | 20 | Go Back 21 | 22 |
23 |
24 | 25 |
26 | 27 |
Breadcrumb
28 | 29 | 30 | 31 |
32 | 51 |
52 | 53 |
54 |
55 | 56 | -------------------------------------------------------------------------------- /public/leading.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Leading 10 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | Go Back 20 | 21 |
22 |
23 | 24 |
25 | 26 |
Leading
27 | 28 | 29 | 30 |
31 |

Header 2: The quick brown fox jumps over the lazy dog

32 |

Leading: The quick brown fox jumps over the lazy dog

33 |
34 | 35 |
36 |

Header 3: The quick brown fox jumps over the lazy dog

37 |

Leading: The quick brown fox jumps over the lazy dog

38 |
39 | 40 |
41 |

Header 4: The quick brown fox jumps over the lazy dog

42 |

Leading: The quick brown fox jumps over the lazy dog

43 |
44 | 45 |
46 |
Header 5: The quick brown fox jumps over the lazy dog
47 |

Leading: The quick brown fox jumps over the lazy dog

48 |
49 | 50 |
51 |
Header 6: The quick brown fox jumps over the lazy dog
52 |

Leading: The quick brown fox jumps over the lazy dog

53 |
54 | 55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /public/collapse.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Tailstrap - Dark Mode 12 | 13 | 14 | 15 |
16 |
17 | 18 | 19 | 21 | 22 | Go Back 23 | 24 |
25 |
26 | 27 |
28 | 29 |
Collapsible
30 | 31 | 32 | 33 |
34 |

35 | 38 | 41 |

42 |
43 |
44 | Some placeholder content for the collapse component. This panel is hidden by default but revealed when the user activates the relevant trigger. 45 |
46 |
47 |
48 | 49 | 50 |
51 | 52 | 53 | 54 |
55 | 56 | -------------------------------------------------------------------------------- /resources/css/base/style/basic.css: -------------------------------------------------------------------------------- 1 | @layer base { 2 | /** 3 | * Text emphasis, usually italics. 4 | * 5 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/em 6 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/i 7 | */ 8 | em, i { 9 | @apply text-gray-700; 10 | } 11 | 12 | /** 13 | * Text importance, usually bold. 14 | * 15 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/strong 16 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/s 17 | */ 18 | strong, s { 19 | @apply text-gray-700; 20 | } 21 | 22 | /** 23 | * This is mostly used for an underline. 24 | * 25 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/u 26 | */ 27 | u { 28 | text-decoration-color: theme('colors.gray.400') 29 | } 30 | 31 | /** 32 | * This is a strike-through style. is used for contextual deletion, while is just the style. 33 | * 34 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/del 35 | */ 36 | del { 37 | @apply bg-red-500 bg-opacity-50; 38 | } 39 | 40 | /** 41 | * This is the contextual addition of text. 42 | * 43 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/inst 44 | */ 45 | ins { 46 | @apply bg-green-500 bg-opacity-50 no-underline; 47 | } 48 | 49 | /** 50 | * This is a strike-through style. is used for contextual deletion, while is just the style. 51 | * 52 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/s 53 | */ 54 | s { 55 | @apply text-gray-500; 56 | } 57 | 58 | /** 59 | * Subscript for solely typographical reasons, like displaying molecules. 60 | * 61 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/sub 62 | */ 63 | sub { 64 | 65 | } 66 | 67 | /** 68 | * Superscript for solely typographical reasons, like on equations. 69 | * 70 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/sup 71 | */ 72 | sup { 73 | 74 | } 75 | 76 | /** 77 | * Side-text with lesser importance. 78 | * 79 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/small 80 | */ 81 | small { 82 | 83 | } 84 | } -------------------------------------------------------------------------------- /resources/css/components/alert.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .alert { 3 | @apply relative px-3 py-2 mb-2 border rounded; 4 | 5 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 6 | @apply pb-3 text-xl border-b; 7 | } 8 | 9 | &.alert-gray { 10 | @apply border-gray-200 text-gray-900 bg-gray-50; 11 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 12 | @apply text-gray-800 border-gray-200; 13 | } 14 | } 15 | 16 | &.alert-red { 17 | @apply border-red-200 text-red-900 bg-red-50; 18 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 19 | @apply text-red-800 border-red-200; 20 | } 21 | } 22 | 23 | &.alert-yellow { 24 | @apply border-yellow-200 text-yellow-900 bg-yellow-50; 25 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 26 | @apply text-yellow-800 border-yellow-200; 27 | } 28 | } 29 | 30 | &.alert-yellow { 31 | @apply border-yellow-200 text-yellow-900 bg-yellow-50; 32 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 33 | @apply text-yellow-800 border-yellow-200; 34 | } 35 | } 36 | 37 | &.alert-green { 38 | @apply border-green-200 text-green-900 bg-green-50; 39 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 40 | @apply text-green-800 border-green-200; 41 | } 42 | } 43 | 44 | &.alert-blue { 45 | @apply border-blue-200 text-blue-900 bg-blue-50; 46 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 47 | @apply text-blue-800 border-blue-200; 48 | } 49 | } 50 | 51 | &.alert-indigo { 52 | @apply border-indigo-200 text-indigo-900 bg-indigo-50; 53 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 54 | @apply text-indigo-800 border-indigo-200; 55 | } 56 | } 57 | 58 | &.alert-purple { 59 | @apply border-purple-200 text-purple-900 bg-purple-50; 60 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 61 | @apply text-purple-800 border-purple-200; 62 | } 63 | } 64 | 65 | &.alert-pink { 66 | @apply border-pink-200 text-pink-900 bg-pink-50; 67 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 68 | @apply text-pink-800 border-pink-200; 69 | } 70 | } 71 | 72 | } 73 | } -------------------------------------------------------------------------------- /resources/css/javascript/multimedia.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | /** 3 | * If you add a multimedia player through an iframe, we will style it. 4 | */ 5 | .iframe, .mm-player { 6 | @apply h-auto w-full border rounded; 7 | } 8 | 9 | /** 10 | * For the iframe, we will allow it to expand and hide its overflowing contents. 11 | */ 12 | .iframe { 13 | @apply overflow-hidden; 14 | 15 | & > iframe { 16 | @apply w-full; 17 | } 18 | } 19 | 20 | /** 21 | * This is main class to style the video and audio player. 22 | */ 23 | .mm-player { 24 | & .mm-title { 25 | @apply px-3 py-2 bg-gray-50 rounded-t mb-0 text-base; 26 | } 27 | 28 | /** 29 | * If there is an audio tag, we will hide it and let Javascript control it. 30 | */ 31 | & > audio { 32 | @apply hidden; 33 | } 34 | 35 | & > video { 36 | @apply w-full h-auto rounded-b; 37 | } 38 | 39 | & > .mm-controls { 40 | @apply flex flex-col place-items-center gap-x-2 gap-y-2 px-3 py-2; 41 | 42 | & > .mm-buttons { 43 | @apply w-full flex flex-row justify-between items-center; 44 | } 45 | 46 | & .mm-time { 47 | @apply text-gray-500 text-xs; 48 | } 49 | 50 | & .mm-progress { 51 | @apply flex flex-row flex-wrap justify-between w-full; 52 | } 53 | 54 | & .mm-play:not([hidden]), 55 | & .mm-pause:not([hidden]), 56 | & .mm-mute:not([hidden]), 57 | & .mm-unmute:not([hidden]) { 58 | @apply inline-block text-gray-500; 59 | 60 | &:hover, &:focus { 61 | @apply text-blue-400 stroke-current; 62 | } 63 | 64 | & > svg { 65 | @apply stroke-1; 66 | } 67 | } 68 | 69 | & .mm-volume > button:not([hidden]) { 70 | @apply block; 71 | } 72 | } 73 | 74 | &.video { 75 | @apply relative; 76 | 77 | & > video { 78 | @apply rounded; 79 | } 80 | 81 | & > .mm-title { 82 | @apply absolute top-0 w-full border-0 bg-opacity-90 bg-white text-gray-500; 83 | } 84 | 85 | & > .mm-controls { 86 | @apply absolute bottom-0 w-full border-0 bg-opacity-90 bg-white rounded-b; 87 | } 88 | } 89 | } 90 | } -------------------------------------------------------------------------------- /resources/css/javascript/tooltip.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .tooltip { 3 | @apply absolute block z-40 text-sm break-words opacity-0; 4 | 5 | /** 6 | * We need to add this class style so 7 | */ 8 | &.fade { 9 | @apply transition-opacity; 10 | } 11 | 12 | &.show { 13 | @apply opacity-90; 14 | } 15 | 16 | & .tooltip-arrow { 17 | @apply absolute block; 18 | @apply w-2 h-2; 19 | 20 | &:before { 21 | @apply absolute border border-solid border-transparent; 22 | 23 | content: ''; 24 | border-width: theme('spacing.2'); 25 | } 26 | } 27 | 28 | & .tooltip-inner { 29 | @apply px-3 py-2 bg-gray-900 text-center text-gray-50 rounded; 30 | } 31 | 32 | /* From here we will add the Bootstrap styles needed for different popover directions */ 33 | 34 | &.bs-tooltip-top { 35 | @apply pb-2; 36 | 37 | & .tooltip-arrow { 38 | @apply bottom-0 w-4; 39 | 40 | &:before { 41 | @apply -top-px border-opacity-90; 42 | @apply border-b-0; 43 | 44 | border-top-color: theme('colors.gray.900'); 45 | } 46 | } 47 | } 48 | 49 | &.bs-tooltip-end { 50 | @apply pl-2; 51 | 52 | & .tooltip-arrow { 53 | @apply left-0 h-4; 54 | 55 | &:before { 56 | @apply -right-px border-opacity-90; 57 | @apply border-l-0; 58 | 59 | border-right-color: theme('colors.gray.900'); 60 | } 61 | } 62 | } 63 | 64 | &.bs-tooltip-bottom { 65 | @apply pt-2; 66 | 67 | & .tooltip-arrow { 68 | @apply top-0 w-4; 69 | 70 | &:before { 71 | @apply -bottom-px border-opacity-90; 72 | @apply border-t-0; 73 | 74 | border-bottom-color: theme('colors.gray.900'); 75 | } 76 | } 77 | } 78 | 79 | &.bs-tooltip-start { 80 | @apply pr-2; 81 | 82 | & .tooltip-arrow { 83 | @apply right-0 h-4; 84 | 85 | &:before { 86 | @apply -left-px border-opacity-90; 87 | @apply border-r-0; 88 | 89 | border-left-color: theme('colors.gray.900'); 90 | } 91 | } 92 | } 93 | } 94 | } -------------------------------------------------------------------------------- /resources/css/components/progress.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .progress { 3 | @apply relative h-6 w-full mb-2 rounded border overflow-hidden; 4 | 5 | & .progress-bar { 6 | @apply h-full mb-2 bg-gray-400; 7 | @apply transition-all; 8 | 9 | &[data-indeterminate] { 10 | @apply max-w-full !important; 11 | animation: 1s ease-in-out infinite progress-bar-animation; 12 | background-image: linear-gradient( 13 | 45deg, 14 | rgba(255, 255, 255, .2) 25%, 15 | transparent 25%, 16 | transparent 50%, 17 | rgba(255, 255, 255, .2) 50%, 18 | rgba(255, 255, 255, .2) 75%, 19 | transparent 75%, 20 | transparent 21 | ); 22 | background-size: 2rem 2rem; 23 | } 24 | } 25 | 26 | &.progress-gray { 27 | @apply border-gray-500; 28 | & > .progress-bar { 29 | @apply bg-gray-500; 30 | } 31 | } 32 | 33 | &.progress-red { 34 | @apply border-red-500; 35 | & > .progress-bar { 36 | @apply bg-red-500; 37 | } 38 | } 39 | 40 | &.progress-yellow { 41 | @apply border-yellow-500; 42 | & > .progress-bar { 43 | @apply bg-yellow-500; 44 | } 45 | } 46 | 47 | &.progress-green { 48 | @apply border-green-500; 49 | & > .progress-bar { 50 | @apply bg-green-500; 51 | } 52 | } 53 | 54 | &.progress-blue { 55 | @apply border-blue-500; 56 | & > .progress-bar { 57 | @apply bg-blue-500; 58 | } 59 | } 60 | 61 | &.progress-indigo { 62 | @apply border-indigo-500; 63 | & > .progress-bar { 64 | @apply bg-indigo-500; 65 | } 66 | } 67 | 68 | &.progress-purple { 69 | @apply border-purple-500; 70 | & > .progress-bar { 71 | @apply bg-purple-500; 72 | } 73 | } 74 | 75 | &.progress-pink { 76 | @apply border-pink-500; 77 | & > .progress-bar { 78 | @apply bg-pink-500; 79 | } 80 | } 81 | 82 | & > progress { 83 | @apply hidden; 84 | } 85 | } 86 | } 87 | 88 | @keyframes progress-bar-animation { 89 | 0% { 90 | background-position-x: 2rem; 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /public/dark.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Tailstrap - Dark Mode 11 | 12 | 13 | 14 | 25 | 26 |
27 | 28 |
Switch
29 | 30 |
31 | 37 | 38 | 44 | 45 | 51 |
52 | 53 |
54 |
55 | 56 | -------------------------------------------------------------------------------- /resources/css/javascript/accordion.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .accordion { 3 | @apply flex flex-col; 4 | 5 | & .accordion-item { 6 | @apply border-l border-r; 7 | 8 | &:first-child { 9 | @apply rounded-t border-t; 10 | 11 | & .accordion-header .accordion-button { 12 | @apply rounded-t; 13 | } 14 | } 15 | 16 | &:last-child { 17 | @apply rounded-b border-b; 18 | 19 | & .accordion-header { 20 | @apply border-b-0; 21 | 22 | & .accordion-button.collapsed { 23 | @apply rounded-b; 24 | } 25 | } 26 | 27 | & .accordion-body { 28 | @apply border-b-0 border-t; 29 | } 30 | } 31 | 32 | & .accordion-header { 33 | @apply relative; 34 | 35 | & .accordion-button { 36 | @apply relative w-full text-left px-3 py-2 outline-none ring-0 ring-gray-200 transition-all; 37 | @apply bg-white; 38 | 39 | &:hover, &:focus, &:active { 40 | @apply z-[11]; 41 | } 42 | 43 | &:hover, &:focus { 44 | @apply ring-4; 45 | } 46 | 47 | &:active { 48 | @apply ring-2; 49 | } 50 | 51 | &:after { 52 | content: ''; 53 | @apply absolute right-0 top-0 h-full w-10 transition-all transform-gpu rotate-180; 54 | @apply bg-center bg-no-repeat; 55 | background-size: 1rem 1rem; 56 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7' /%3E%3C/svg%3E"); 57 | } 58 | 59 | &:not(.collapsed) { 60 | @apply z-10 bg-blue-50 text-blue-500 ring-blue-200; 61 | 62 | &:after { 63 | @apply rotate-0; 64 | } 65 | } 66 | } 67 | } 68 | 69 | & .accordion-body { 70 | @apply px-3 py-2; 71 | } 72 | 73 | & .accordion-body { 74 | @apply border-b; 75 | } 76 | 77 | & .accordion-header { 78 | @apply text-xl border-b mb-0; 79 | } 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | import DarkMode from "./utilities/dark" 2 | import Collapse from "bootstrap/js/src/collapse" 3 | import Alert from "bootstrap/js/src/alert" 4 | import Dropdown from "bootstrap/js/src/dropdown" 5 | import Modal from "bootstrap/js/src/modal" 6 | import Tooltip from "bootstrap/js/src/tooltip" 7 | import Popover from "bootstrap/js/src/popover" 8 | import Offcanvas from "bootstrap/js/src/offcanvas" 9 | import Tab from "bootstrap/js/src/tab" 10 | 11 | // 12 | // Enable Dark Mode. 13 | // 14 | window.DarkMode = DarkMode.detect(); // Detect dark mode and save it as global variable. 15 | 16 | // 17 | // Activate all collapsable. 18 | // 19 | Array.from(document.getElementsByClassName('collapse')) 20 | .map(element => new Collapse(element, { 21 | toggle: false // Don't toggle the Collapsing elements automatically. 22 | })) 23 | 24 | // 25 | // Activate all alerts. 26 | // 27 | Array.from(document.getElementsByClassName('alert')) 28 | .map(element => new Alert(element)) 29 | 30 | // 31 | // Activate all dropdowns. 32 | // 33 | Array.from(document.getElementsByClassName('dropdown-toggle')) 34 | .map(element => new Dropdown(element)) 35 | 36 | // 37 | // Activate all modals. 38 | // 39 | Array.from(document.getElementsByClassName('modal')) 40 | .filter(element => element.id) // Filter those who have an ID. 41 | .map(element => new Modal(element)) 42 | 43 | // 44 | // Activate all tooltips. 45 | // 46 | Array.from(document.querySelectorAll('[data-bs-toggle="tooltip"]')) 47 | .map(element => { 48 | let tooltip = new Tooltip(element) 49 | 50 | if (element.hasAttribute('data-bs-show')) { 51 | tooltip.show() 52 | } 53 | 54 | return tooltip 55 | }) 56 | 57 | // 58 | // Activate all popovers. 59 | // 60 | Array.from(document.querySelectorAll('[data-bs-toggle="popover"]')) 61 | .map(element => { 62 | let popover = new Popover(element) 63 | 64 | if (element.hasAttribute('data-bs-show')) { 65 | popover.show() 66 | } 67 | 68 | return popover 69 | }) 70 | 71 | // 72 | // Activate all off-canvas toggles. 73 | // 74 | Array.from(document.getElementsByClassName('offcanvas')) 75 | .map(element => { 76 | let canvas = new Offcanvas(element) 77 | 78 | if (element.hasAttribute('data-bs-show')) { 79 | canvas.show() 80 | } 81 | 82 | return canvas 83 | }) 84 | 85 | // 86 | // Activate all the tabs. 87 | // 88 | Array.from(document.querySelectorAll('[data-bs-toggle="tab"]')) 89 | .map(element => { 90 | let tab = new Tab(element) 91 | 92 | element.addEventListener('click', event => { 93 | event.preventDefault() 94 | tab.show() 95 | }) 96 | 97 | return tab 98 | }) -------------------------------------------------------------------------------- /public/tooltips.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Tailstrap - Tooltip 11 | 12 | 13 | 14 | 25 | 26 |
27 | 28 |
Tooltip
29 | 30 | 31 | 32 | 35 | 38 | 41 | 44 | 45 | 46 |
Tooltip Styling
47 | 48 | 52 | 56 | 60 | 64 | 65 |
66 | 67 |
68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /public/navigation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Navigation 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
Landscape navigation
28 | 29 | 30 | 31 |
32 | 56 |
57 | 58 |
Portrait navigation
59 | 60 | 61 | 62 |
63 | 87 |
88 | 89 |
90 |
91 | 92 | -------------------------------------------------------------------------------- /public/dismiss.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Tailstrap - Alerts 11 | 12 | 13 | 14 | 25 | 26 |
27 | 28 |
Base dismiss
29 | 30 | 31 | 32 |
33 | 42 |
43 | 44 |
Simple dismiss
45 | 46 | 47 | 48 |
49 | 59 |
60 | 61 |
62 | 63 |
64 | 65 | -------------------------------------------------------------------------------- /resources/css/base/style/annotation.css: -------------------------------------------------------------------------------- 1 | @layer base { 2 | /** 3 | * Location block with contact details. 4 | * 5 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/address 6 | */ 7 | address { 8 | @apply text-gray-700 font-serif; 9 | } 10 | 11 | /** 12 | * Short inline quotation. 13 | * 14 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/q 15 | */ 16 | q { 17 | @apply font-serif italic text-gray-700; 18 | } 19 | 20 | /** 21 | * Large-block quotation. 22 | * 23 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/blockquote 24 | */ 25 | blockquote { 26 | @apply px-3 py-2 border-l-8 mb-3 font-serif; 27 | } 28 | 29 | /** 30 | * If we're using a figure to wrap a blockquote with a caption, we will 31 | * style the caption accordingly. 32 | */ 33 | figure > blockquote + figcaption { 34 | @apply text-sm border-l-8 text-gray-500 text-right; 35 | } 36 | 37 | /** 38 | * Highlighted text for notation. 39 | * 40 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/mark 41 | */ 42 | mark { 43 | @apply bg-yellow-300 bg-opacity-80; 44 | } 45 | 46 | /** 47 | * Abbreviation or acronym. 48 | * 49 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/abbr 50 | */ 51 | abbr { 52 | @apply italic; 53 | } 54 | 55 | /** 56 | * Term definition. 57 | * 58 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/dfn 59 | */ 60 | dfn { 61 | @apply italic; 62 | } 63 | 64 | /* 65 | * We will style only those with the "title" property. 66 | */ 67 | abbr[title], dfn[title] { 68 | @apply cursor-help underline; 69 | text-decoration-style: dotted; 70 | text-decoration-color: theme('colors.gray.400'); 71 | text-decoration-thickness: 1px; 72 | } 73 | 74 | /** 75 | * Text details and summary. 76 | * 77 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/details 78 | */ 79 | details { 80 | /** 81 | * From here we will use some tricks to keep the summary consistent. 82 | * 83 | * @see https://css-tricks.com/two-issues-styling-the-details-element-and-how-to-solve-them/ 84 | */ 85 | & summary { 86 | @apply cursor-pointer break-words; 87 | 88 | & > * { 89 | display: inline; 90 | } 91 | } 92 | } 93 | 94 | /** 95 | * Keyboard inputs. 96 | * 97 | * @see https://developer.mozilla.org/docs/Web/HTML/Element/kbd 98 | */ 99 | kbd { 100 | &:after { 101 | content: ""; 102 | @apply absolute inset-0; 103 | @apply border border-white rounded; 104 | } 105 | 106 | @apply relative cursor-default inline-block px-2 rounded border border-gray-300 bg-gray-50; 107 | @apply text-gray-600 bg-gradient-to-b from-gray-100 to-white; 108 | @apply shadow-sm; 109 | } 110 | } -------------------------------------------------------------------------------- /public/popover.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Tailstrap - Popover 11 | 12 | 13 | 14 | 25 | 26 |
27 | 28 |
Popover
29 | 30 | 31 | 32 | 36 | 40 | 44 | 48 | 49 |
Popover with title
50 | 51 | 52 | 53 | 57 | 61 | 65 | 69 | 70 |
71 | 72 |
73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /public/tab.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Tailstrap - Tab 11 | 12 | 13 | 14 | 25 | 26 |
27 | 28 |
Tab
29 | 30 | 31 | 32 |
33 | 40 | 51 |
52 | 53 |
54 | 55 |
56 | 57 | 58 | -------------------------------------------------------------------------------- /resources/css/components/list.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .list-group { 3 | @apply relative flex-row border rounded divide-y; 4 | 5 | & > * { 6 | @apply block px-3 py-2; 7 | 8 | &:last-child { 9 | @apply rounded-b; 10 | } 11 | 12 | &:first-child { 13 | @apply rounded-t; 14 | } 15 | } 16 | 17 | & > a { 18 | @apply relative z-0; 19 | 20 | &:hover, &:focus { 21 | @apply ring ring-gray-200 z-10; 22 | } 23 | } 24 | 25 | & > .list-item-light { 26 | @apply bg-gray-50 border-gray-200 text-gray-900; 27 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 28 | @apply text-gray-800; 29 | } 30 | &:hover, &:focus { 31 | @apply ring-gray-100; 32 | } 33 | } 34 | 35 | & > .list-item-dark { 36 | @apply bg-gray-800 border-gray-800 text-gray-200; 37 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 38 | @apply text-gray-300; 39 | } 40 | &:hover, &:focus { 41 | @apply ring-gray-400; 42 | } 43 | } 44 | 45 | & > .list-item-red { 46 | @apply bg-red-50 border-red-200 text-red-900; 47 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 48 | @apply text-red-800; 49 | } 50 | &:hover, &:focus { 51 | @apply ring-red-100; 52 | } 53 | } 54 | 55 | & > .list-item-pink { 56 | @apply bg-pink-50 border-pink-200 text-pink-900; 57 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 58 | @apply text-pink-800; 59 | } 60 | &:hover, &:focus { 61 | @apply ring-pink-100; 62 | } 63 | } 64 | 65 | & > .list-item-yellow { 66 | @apply bg-yellow-50 border-yellow-200 text-yellow-900; 67 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 68 | @apply text-yellow-800; 69 | } 70 | &:hover, &:focus { 71 | @apply ring-yellow-100; 72 | } 73 | } 74 | 75 | & > .list-item-green { 76 | @apply bg-green-50 border-green-200 text-green-900; 77 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 78 | @apply text-green-800; 79 | } 80 | &:hover, &:focus { 81 | @apply ring-green-100; 82 | } 83 | } 84 | 85 | & > .list-item-blue { 86 | @apply bg-blue-50 border-blue-200 text-blue-900; 87 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 88 | @apply text-blue-800; 89 | } 90 | &:hover, &:focus { 91 | @apply ring-blue-100; 92 | } 93 | } 94 | 95 | & > .list-item-indigo { 96 | @apply bg-indigo-50 border-indigo-200 text-indigo-900; 97 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 98 | @apply text-indigo-800; 99 | } 100 | &:hover, &:focus { 101 | @apply ring-indigo-100; 102 | } 103 | } 104 | 105 | & > .list-item-purple { 106 | @apply bg-purple-50 border-purple-200 text-purple-900; 107 | & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 { 108 | @apply text-purple-800; 109 | } 110 | &:hover, &:focus { 111 | @apply ring-purple-100; 112 | } 113 | } 114 | } 115 | } -------------------------------------------------------------------------------- /public/alert.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Alerts 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
Base alert
28 | 29 | 30 | 31 |
32 | 36 |
37 | 38 |
Colored alerts
39 | 40 | 41 | 42 |
43 | 47 |
48 | 49 |
50 | 54 |
55 | 56 | 57 |
58 | 62 |
63 | 64 |
65 | 69 |
70 | 71 |
72 | 76 |
77 | 78 |
79 | 83 |
84 | 85 |
86 | 90 |
91 | 92 |
93 | 97 |
98 | 99 |
100 |
101 | 102 | -------------------------------------------------------------------------------- /resources/css/basic/button.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | 3 | /** 4 | * To make a button, use the `btn` class on links or buttons. 5 | */ 6 | .btn { 7 | @apply border rounded inline-block border px-3 py-1 outline-none transition-all ring-gray-200; 8 | 9 | /* These are just added styles if somebody uses an input[type="submit"] */ 10 | @apply bg-white cursor-pointer; 11 | 12 | /** 13 | * When the button is disabled via attribute or class, we can create a different style. 14 | */ 15 | &.disabled, &:disabled { 16 | @apply relative bg-opacity-50 text-black text-opacity-50 border-opacity-50 pointer-events-none !important; 17 | } 18 | 19 | /** 20 | * We will not add any effect when the button is focused or hovered, but not active. 21 | * 22 | * When is active, we can change the ring size, but can go wild here. 23 | */ 24 | &:not(:disabled,.disabled,:active):focus { 25 | @apply outline-none ring-4; 26 | } 27 | 28 | &:active { 29 | @apply outline-none ring-2; 30 | } 31 | 32 | /** 33 | * These are just some utilities to handle the size of the buttons. 34 | * 35 | * Since this is Tailwind CSS, you can adjust the size of the buttons 36 | * on media queries, like making the buttons smaller on small screens. 37 | */ 38 | &.btn-sm { 39 | @apply text-sm px-2 py-0; 40 | } 41 | 42 | &.btn-lg { 43 | @apply text-lg px-4 py-3; 44 | } 45 | 46 | &.btn-xl { 47 | @apply text-xl px-5 py-4; 48 | } 49 | 50 | &.btn-2xl { 51 | @apply text-2xl px-6 py-5; 52 | } 53 | 54 | /** 55 | * Here are different colors for each button. 56 | */ 57 | &.btn-light { 58 | @apply text-gray-700 bg-gray-200 border-gray-200 ring-gray-100; 59 | } 60 | 61 | &.btn-dark { 62 | @apply text-white bg-gray-700 border-gray-700 ring-gray-400; 63 | } 64 | 65 | &.btn-red { 66 | @apply text-white bg-red-600 border-red-600 ring-red-200; 67 | } 68 | 69 | &.btn-pink { 70 | @apply text-white bg-pink-600 border-pink-600 ring-pink-200; 71 | } 72 | 73 | &.btn-yellow { 74 | @apply text-white bg-yellow-600 border-yellow-600 ring-yellow-200; 75 | } 76 | 77 | &.btn-green { 78 | @apply text-white bg-green-600 border-green-600 ring-green-200; 79 | } 80 | 81 | &.btn-blue { 82 | @apply text-white bg-blue-600 border-blue-600 ring-blue-200; 83 | } 84 | 85 | &.btn-indigo { 86 | @apply text-white bg-indigo-600 border-indigo-600 ring-indigo-200; 87 | } 88 | 89 | &.btn-purple { 90 | @apply text-white bg-purple-600 border-purple-600 ring-purple-200; 91 | } 92 | } 93 | 94 | .btn-close { 95 | @apply inline-block text-gray-500 px-2 py-2 rounded text-base stroke-1 outline-none; 96 | 97 | &:hover, &:focus, &:active { 98 | @apply bg-red-500 text-white outline-none; 99 | } 100 | } 101 | 102 | .btn-group { 103 | @apply relative flex flex-row; 104 | 105 | & > .btn { 106 | @apply rounded-none -ml-px; 107 | 108 | &:first-child { 109 | @apply ml-0 rounded-l; 110 | } 111 | 112 | &:last-child { 113 | @apply rounded-r; 114 | } 115 | 116 | &:hover { 117 | @apply z-10; 118 | } 119 | 120 | &:focus, &:active { 121 | @apply z-[11]; 122 | } 123 | } 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /public/badge.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Badges 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
Base badge
28 | 29 | 30 | 31 |
32 |

This is a title Base

33 |

And this is a smaller lead Base

34 |

Everything can be good if you build it.

35 |
36 | 37 |
Colored badges
38 | 39 | 40 | 41 |
42 |

This is a title Gray

43 |

And this is a smaller lead Gray

44 |

Everything can be good if you build it.

45 |
46 | 47 |
48 |

This is a title Red

49 |

And this is a smaller lead Red

50 |

Everything can be good if you build it.

51 |
52 | 53 |
54 |

This is a title Yellow

55 |

And this is a smaller lead Yellow

56 |

Everything can be good if you build it.

57 |
58 | 59 |
60 |

This is a title Green

61 |

And this is a smaller lead Green

62 |

Everything can be good if you build it.

63 |
64 | 65 |
66 |

This is a title Blue

67 |

And this is a smaller lead Blue

68 |

Everything can be good if you build it.

69 |
70 | 71 |
72 |

This is a title Indigo

73 |

And this is a smaller lead Indigo

74 |

Everything can be good if you build it.

75 |
76 | 77 |
78 |

This is a title Purple

79 |

And this is a smaller lead Purple

80 |

Everything can be good if you build it.

81 |
82 | 83 |
84 |

This is a title Pink

85 |

And this is a smaller lead Pink

86 |

Everything can be good if you build it.

87 |
88 | 89 |
90 |
91 | 92 | -------------------------------------------------------------------------------- /resources/js/utilities/dark.js: -------------------------------------------------------------------------------- 1 | export default class 2 | { 3 | /** 4 | * Checks if the dark mode has been already listenerAdded or not. 5 | * 6 | * @type {boolean} 7 | */ 8 | static #listenerAdded = false; 9 | 10 | /** 11 | * If the current color scheme is dark or not. 12 | * 13 | * @type boolean 14 | */ 15 | static #isDark = false; 16 | 17 | /** 18 | * Checks if the current color scheme is dark. 19 | * 20 | * @return {boolean} 21 | */ 22 | static isDark() { 23 | return this.#isDark 24 | } 25 | 26 | /** 27 | * Checks if the current color scheme is light. 28 | * 29 | * @return {boolean} 30 | */ 31 | static isLight() { 32 | return !this.isDark() 33 | } 34 | 35 | /** 36 | * Prepares the document to detect the current dark mode configuration. 37 | * 38 | * This is idempotent thanks to the "listenerAdded" variable. 39 | * 40 | * @return this 41 | */ 42 | static detect() { 43 | 44 | let preference = window.localStorage.getItem('colorScheme'); 45 | 46 | // If there is no local preference, proceed to the the browser preference. 47 | if (preference) { 48 | this.#isDark = preference === 'dark' 49 | } else { 50 | this.#setSchemeFromBrowser(); 51 | } 52 | 53 | // Detect changes to this mode by the browser and update it. 54 | if (! this.#listenerAdded) { 55 | this.#getMedia().addEventListener('change', e => { 56 | this.#isDark = e.matches 57 | this.#applyScheme(); 58 | }) 59 | 60 | this.#listenerAdded = true; 61 | } 62 | 63 | this.#applyScheme(); 64 | 65 | return this; 66 | } 67 | 68 | /** 69 | * Returns the Media Query for color scheme. 70 | * 71 | * @return {MediaQueryList} 72 | */ 73 | static #getMedia() { 74 | return window.matchMedia('(prefers-color-scheme: dark)'); 75 | } 76 | 77 | /** 78 | * Sets the scheme from the browser. 79 | * 80 | * @return void 81 | */ 82 | static #setSchemeFromBrowser() { 83 | this.#isDark = this.#getMedia().matches 84 | } 85 | 86 | /** 87 | * Toggles and overrides the color scheme preference. 88 | * 89 | * @return void 90 | */ 91 | static toggle() { 92 | if (this.isLight()) { 93 | this.dark() 94 | } else { 95 | this.light() 96 | } 97 | } 98 | 99 | /** 100 | * Sets the scheme to dark. 101 | * 102 | * @return void 103 | */ 104 | static dark() { 105 | window.localStorage.setItem('colorScheme', 'dark') 106 | this.#isDark = true; 107 | this.#applyScheme(); 108 | } 109 | 110 | /** 111 | * Sets the scheme to light. 112 | * 113 | * @return void 114 | */ 115 | static light() { 116 | window.localStorage.setItem('colorScheme', 'light') 117 | this.#isDark = false; 118 | this.#applyScheme(); 119 | } 120 | 121 | /** 122 | * Resets the scheme preference back to the browser. 123 | * 124 | * @return void 125 | */ 126 | static original() { 127 | window.localStorage.removeItem('colorScheme') 128 | this.#setSchemeFromBrowser() 129 | this.#applyScheme() 130 | } 131 | 132 | /** 133 | * Applies dark mode to the document. 134 | * 135 | * @return void 136 | */ 137 | static #applyScheme() { 138 | // Once done, we will the add or remove the "dark" class to the document. 139 | if (this.isDark()) { 140 | window.document.documentElement.classList.add('dark') 141 | } else { 142 | window.document.documentElement.classList.remove('dark') 143 | } 144 | } 145 | } -------------------------------------------------------------------------------- /public/modal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Tailstrap - Modal 11 | 12 | 13 | 14 | 25 | 26 |
27 | 28 |
Modal
29 | 30 | 31 | 32 | 35 | 36 | 59 | 60 |
Modal styling
61 | 62 |
63 | 64 |
65 | 88 |
89 | 90 |
91 | 92 | 95 | 96 |
97 |
98 | 99 | 100 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /resources/css/javascript/popover.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | .popover { 3 | @apply absolute block z-40 text-sm break-words opacity-0; 4 | 5 | @apply min-w-[12em] bg-clip-padding border rounded break-words; 6 | 7 | &.fade { 8 | @apply transition-opacity; 9 | } 10 | 11 | &.show { 12 | @apply opacity-100; 13 | } 14 | 15 | & .popover-arrow { 16 | @apply absolute block; 17 | @apply w-2 h-2; 18 | 19 | &::before, 20 | &::after { 21 | @apply absolute border border-solid border-transparent; 22 | 23 | content: ''; 24 | border-width: theme('spacing.2'); 25 | } 26 | } 27 | 28 | & .popover-header, & .popover-body { 29 | @apply p-3 m-0 rounded-t text-sm; 30 | } 31 | 32 | & .popover-header { 33 | @apply py-1 font-normal text-gray-600 bg-gray-100 border-b; 34 | 35 | &:empty { 36 | @apply hidden; 37 | } 38 | } 39 | 40 | & .popover-body { 41 | @apply bg-white rounded-b; 42 | } 43 | 44 | /* From here we will add the Bootstrap styles needed for different popover directions */ 45 | 46 | &.bs-popover-top { 47 | & > .popover-arrow { 48 | @apply -bottom-2 w-4; 49 | 50 | &:after { 51 | @apply bottom-0; 52 | border-width: theme('spacing.2') theme('spacing.2') 0; 53 | border-top-color: theme('colors.white'); 54 | } 55 | 56 | &:before { 57 | @apply -bottom-px; 58 | border-width: theme('spacing.2') theme('spacing.2') 0; 59 | border-top-color: theme('colors.gray.200'); 60 | } 61 | } 62 | } 63 | 64 | &.bs-popover-end { 65 | & > .popover-arrow { 66 | @apply -left-2 h-4; 67 | 68 | &:after { 69 | @apply left-0; 70 | border-width: theme('spacing.2') theme('spacing.2') theme('spacing.2') 0; 71 | border-right-color: theme('colors.white'); 72 | } 73 | 74 | &:before { 75 | @apply -left-px; 76 | border-width: theme('spacing.2') theme('spacing.2') theme('spacing.2') 0; 77 | border-right-color: theme('colors.gray.200'); 78 | } 79 | } 80 | } 81 | 82 | &.bs-popover-bottom { 83 | & > .popover-arrow { 84 | @apply -top-2 w-4; 85 | 86 | &:after { 87 | @apply top-0; 88 | border-width: 0 theme('spacing.2') theme('spacing.2'); 89 | border-bottom-color: theme('colors.white'); 90 | } 91 | 92 | &:before { 93 | @apply -top-px; 94 | border-width: 0 theme('spacing.2') theme('spacing.2'); 95 | border-bottom-color: theme('colors.gray.200'); 96 | } 97 | } 98 | 99 | /** 100 | * If there is a header, we will paint the arrow with the header background color. 101 | */ 102 | & .popover-header::before { 103 | @apply absolute -top-2 border block w-4 h-2 border-transparent; 104 | content: ''; 105 | left: calc(50% - theme('spacing.2')); 106 | border-width: 0 theme('spacing.2') theme('spacing.2'); 107 | border-bottom-color: theme('colors.gray.100'); 108 | } 109 | } 110 | 111 | &.bs-popover-start { 112 | & > .popover-arrow { 113 | @apply -right-2 h-4; 114 | 115 | &:after { 116 | @apply right-0; 117 | border-width: theme('spacing.2') 0 theme('spacing.2') theme('spacing.2'); 118 | border-left-color: theme('colors.white'); 119 | } 120 | 121 | &:before { 122 | @apply -right-px; 123 | border-width: theme('spacing.2') 0 theme('spacing.2') theme('spacing.2'); 124 | border-left-color: theme('colors.gray.200'); 125 | } 126 | } 127 | } 128 | } 129 | } -------------------------------------------------------------------------------- /public/accordion.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Tailstrap - Dark Mode 12 | 13 | 14 | 15 | 26 | 27 |
28 | 29 |
Accordion
30 | 31 |
32 |
33 |

34 | 37 |

38 |
39 |
40 | This is the first item's accordion body. It is shown by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the .accordion-body, though the transition does limit overflow. 41 |
42 |
43 |
44 |
45 |

46 | 49 |

50 |
51 |
52 | This is the second item's accordion body. It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the .accordion-body, though the transition does limit overflow. 53 |
54 |
55 |
56 |
57 |

58 | 61 |

62 |
63 |
64 | This is the third item's accordion body. It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the .accordion-body, though the transition does limit overflow. 65 |
66 |
67 |
68 |
69 | 70 |
71 |
72 | 73 | -------------------------------------------------------------------------------- /public/image.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Images 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
Image
28 | 29 | 30 | 31 |
32 | Sample image 33 |
34 | 35 |
Responsive
36 | 37 | 38 | 39 |
40 | Sample image 41 |
42 | 43 |
Thumbnails
44 | 45 | 46 | 47 |
48 | Sample image 49 | Sample image 50 | Sample image 51 |
52 | 53 |
Picture
54 | 55 | 56 | 57 |
58 | 59 | 60 | 61 | 62 | Sample image 63 | 64 |
65 | 66 |
In text
67 | 68 | 69 | 70 |
71 |

Integer lacinia turpis diam, quis auctor justo tempor ut. Suspendisse potenti. Integer tempus lobortis convallis. Proin viverra nibh id viverra ultricies. Donec cursus lacus faucibus, tempor elit id, facilisis dolor. Cras neque orci, pulvinar sed faucibus id, fermentum viverra nisl. Pellentesque quis dolor a erat semper condimentum. Nam et faucibus ante, aliquet iaculis diam. Etiam luctus, nunc sed faucibus imperdiet, turpis tellus blandit leo, et tincidunt ex massa a eros.

72 | Sample image 73 |

Nullam et tortor metus. Vivamus ullamcorper augue cursus, scelerisque ipsum eu, ornare magna. Sed malesuada sapien sit amet vulputate ultrices. Aenean hendrerit nisi a nibh vulputate dapibus. Etiam at hendrerit est. Aliquam in vestibulum nibh, sit amet porttitor dolor. Aenean feugiat consequat eleifend. Vivamus quis commodo lectus. Donec mollis luctus nisi nec mollis. Fusce sollicitudin risus nec magna gravida sagittis. Phasellus imperdiet velit nunc, sit amet efficitur metus facilisis nec.

74 | Sample image 75 |

Nullam et tortor metus. Vivamus ullamcorper augue cursus, scelerisque ipsum eu, ornare magna. Sed malesuada sapien sit amet vulputate ultrices. Aenean hendrerit nisi a nibh vulputate dapibus. Etiam at hendrerit est. Aliquam in vestibulum nibh, sit amet porttitor dolor. Aenean feugiat consequat eleifend. Vivamus quis commodo lectus. Donec mollis luctus nisi nec mollis. Fusce sollicitudin risus nec magna gravida sagittis. Phasellus imperdiet velit nunc, sit amet efficitur metus facilisis nec.

76 | Sample image 77 |

Nullam et tortor metus. Vivamus ullamcorper augue cursus, scelerisque ipsum eu, ornare magna. Sed malesuada sapien sit amet vulputate ultrices. Aenean hendrerit nisi a nibh vulputate dapibus. Etiam at hendrerit est. Aliquam in vestibulum nibh, sit amet porttitor dolor. Aenean feugiat consequat eleifend. Vivamus quis commodo lectus. Donec mollis luctus nisi nec mollis. Fusce sollicitudin risus nec magna gravida sagittis. Phasellus imperdiet velit nunc, sit amet efficitur metus facilisis nec.

78 |
79 | 80 |
81 |
82 | 83 | -------------------------------------------------------------------------------- /public/figure.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Audio 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
Content Figure
28 | 29 | 30 | 31 |
32 |
33 |
This is just a simple text.
34 |
Example caption for the image.
35 |
36 |
37 | 38 |
Image Figure
39 | 40 | 41 | 42 |
43 |
44 |
45 | Sample image 46 |
47 |
Example caption for the image.
48 |
49 |
50 | 51 |
Picture Figure
52 | 53 | 54 | 55 |
56 |
57 | 58 | 59 | 60 | 61 | Sample image 62 | 63 |
Example caption for the picture.
64 |
65 |
66 | 67 |
Video Figure
68 | 69 | 70 | 71 |
72 |
73 | 82 |
Example caption for the video.
83 |
84 |
85 | 86 |
Audio Figure
87 | 88 | 89 | 90 |
91 |
92 | 97 |
Example caption for the audio.
98 |
99 |
100 | 101 | 102 |
iframe Figure
103 | 104 | 105 | 106 |
107 |
108 |
109 | 110 |
111 |
Example caption for the audio.
112 |
113 |
114 | 115 |
116 |
117 | 118 | -------------------------------------------------------------------------------- /public/dropdown.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Tailstrap - Alerts 11 | 12 | 13 | 14 | 25 | 26 |
27 | 28 |
Dropdown
29 | 30 | 31 | 32 | 42 | 43 |
Directional Dropdowns
44 | 45 | 46 | 47 |
48 |
49 | 52 | 57 |
58 | 59 |
60 | 63 | 68 |
69 | 70 |
71 | 74 | 79 |
80 |
81 | 82 |
Dropdown menu
83 | 84 | 85 | 86 |
87 |
88 | 91 | 103 |
104 |
105 | 106 |
107 | 108 |
109 | 110 | -------------------------------------------------------------------------------- /resources/css/basic/switches.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | /** 3 | * Here you can add custom styles for checkboxes, radios and checkbox-switches. 4 | * 5 | * Tailstart comes with some included guidelines to create your own. 6 | */ 7 | input[type="checkbox"].form-control, 8 | input[type="radio"].form-control { 9 | /** 10 | * This disables any browser styling on the input. 11 | */ 12 | appearance: none; 13 | 14 | /** 15 | * Here we will lay some common ground for both checkboxes and radios. 16 | */ 17 | @apply inline-block relative h-5 w-5; 18 | @apply outline-none cursor-pointer bg-transparent border border ring-0 ring-gray-200; 19 | @apply transition-all; 20 | 21 | /** 22 | * If there is a label next to this box, inline and center it. 23 | */ 24 | & + label { 25 | @apply inline-block cursor-pointer ml-1 align-top; 26 | } 27 | 28 | /** 29 | * This is a "surface" we will create to add a check or circle. 30 | */ 31 | &:after { 32 | content: ''; 33 | @apply block absolute left-0 top-0 transition-all; 34 | } 35 | 36 | /** 37 | * If it's checked, we can change the color of some elements. 38 | */ 39 | &:checked { 40 | @apply bg-blue-500 border-blue-500 ring-blue-200; 41 | } 42 | 43 | /** 44 | * When disabled, add the "disabled" colors. 45 | */ 46 | &:disabled, &.disabled { 47 | @apply pointer-events-none bg-gray-200 border-gray-200; 48 | 49 | &:checked { 50 | @apply bg-gray-200 border-gray-200; 51 | } 52 | 53 | & + label { 54 | @apply pointer-events-none; 55 | } 56 | } 57 | 58 | /** 59 | * The common active state (clicking) needs to be specific when checked or won't 60 | * override the ring size. 61 | */ 62 | &:checked:active, &:not(:checked):active { 63 | @apply ring-2; 64 | } 65 | 66 | /** 67 | * Add style on hover and focus. When disabled, no focus/hover/active can be made.. 68 | */ 69 | &:focus, &:hover { 70 | @apply ring-4; 71 | } 72 | 73 | /** 74 | * If it's not a custom switch, we will play with the opacity of the "after" box. 75 | */ 76 | &:not(.switch) { 77 | &:after { 78 | @apply opacity-0; 79 | } 80 | 81 | &:checked:after { 82 | @apply opacity-100; 83 | } 84 | } 85 | } 86 | 87 | /** 88 | * Styling the radio is rather simple: round the boxes and you're set. 89 | */ 90 | input[type='radio'] { 91 | @apply rounded-full; 92 | 93 | &:after { 94 | @apply w-full h-full rounded-full bg-white transform scale-50; 95 | } 96 | 97 | &:disabled:checked:after, &.disabled:checked:after { 98 | @apply bg-gray-400; 99 | } 100 | } 101 | 102 | /** 103 | * These are styles only for the checkbox. 104 | * 105 | * Basically, we will create the "checkmark" by rotating a rectangle and centering it. 106 | */ 107 | input[type="checkbox"].form-control:not(.switch) { 108 | @apply rounded; 109 | 110 | &:after { 111 | @apply w-1/3 h-1/2 left-1/3 top-[20%]; 112 | @apply border-r-2 border-b-2 border-blue-50; 113 | @apply transform rotate-45; 114 | } 115 | 116 | &:disabled:checked:after, &.disabled:checked:after { 117 | @apply border-gray-400; 118 | } 119 | 120 | /** 121 | * For indeterminate checkboxes, we just need to make a simple line and put it in the middle. 122 | */ 123 | &:is([indeterminate]):after { 124 | @apply rotate-0 border-r-0 w-1/2 h-0 left-1/4 top-1/2; 125 | } 126 | } 127 | 128 | /** 129 | * Here is the style of the "switch". These can be checkboxes, or even radio buttons. 130 | */ 131 | input.form-control.switch { 132 | /** 133 | * We will use "box-content" to take into account the border on sizing its height. 134 | * That will allow our circle to be centered using "em" rather than pixels. 135 | */ 136 | @apply w-8 h-5 rounded-full box-content; 137 | 138 | /** 139 | * Here we will use "transition-transform" only since enabling it for the background color 140 | * makes the ":after" dissapar until the animation completes. This may be a rendering bug. 141 | */ 142 | &:after { 143 | @apply w-3 h-3 left-1 top-1 bg-gray-300 rounded-full transform-gpu transition-transform translate-x-0; 144 | } 145 | 146 | &:checked:after { 147 | @apply bg-white translate-x-full; 148 | } 149 | 150 | &:disabled, &.disabled { 151 | &:not(:checked):after { 152 | @apply bg-white; 153 | } 154 | 155 | &:checked:after { 156 | @apply bg-gray-400; 157 | } 158 | } 159 | } 160 | } -------------------------------------------------------------------------------- /tailstart/css/tailstart.css: -------------------------------------------------------------------------------- 1 | .tailstart-quickstart { 2 | @apply mb-12; 3 | @apply text-indigo-900; 4 | 5 | & details { 6 | @apply bg-indigo-50 rounded; 7 | 8 | &[open] { 9 | @apply ring ring-offset-2 ring-offset-indigo-50 ring-indigo-300 rounded-t; 10 | } 11 | 12 | & summary { 13 | @apply px-3 py-2; 14 | @apply cursor-pointer; 15 | @apply text-indigo-400 bg-indigo-100 rounded; 16 | @apply transition-all; 17 | @apply hover:bg-indigo-200 hover:text-indigo-600; 18 | } 19 | 20 | &[open] summary { 21 | @apply bg-indigo-200 text-indigo-600; 22 | } 23 | 24 | & div { 25 | @apply px-3 py-2; 26 | 27 | & p { 28 | @apply pb-3; 29 | } 30 | 31 | & code { 32 | @apply bg-indigo-100 border border-indigo-200 rounded px-1; 33 | @apply text-indigo-800; 34 | } 35 | } 36 | } 37 | } 38 | 39 | .tailstart-container { 40 | @apply container px-2 py-4 mx-auto; 41 | 42 | & .tailstart-separator { 43 | @apply cursor-default; 44 | @apply my-12 md:my-24 py-5 px-4 border-b-4 border-gray-300 border-dashed; 45 | @apply text-sm text-gray-500 text-right; 46 | } 47 | } 48 | 49 | .tailstart-app, .tailstart-html-header { 50 | @apply bg-indigo-50; 51 | 52 | & .tailstart-container { 53 | 54 | & section { 55 | @apply mb-20; 56 | 57 | & .tailstart-section-header { 58 | @apply text-4xl pt-4 pb-4 mb-4; 59 | @apply text-indigo-300; 60 | } 61 | 62 | & .tailstart-section-description { 63 | @apply px-3 py-2 mb-3 rounded text-center; 64 | @apply text-blue-500; 65 | @apply bg-white; 66 | 67 | &.tailstart-section-description-warning { 68 | @apply text-yellow-500; 69 | } 70 | } 71 | 72 | } 73 | 74 | & ul { 75 | @apply grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4; 76 | 77 | & li { 78 | @apply block; 79 | } 80 | } 81 | 82 | & ul li a { 83 | @apply block px-3 py-2 h-full; 84 | @apply bg-white rounded-md mb-3; 85 | @apply transform-gpu transition duration-200; 86 | @apply text-indigo-800; 87 | @apply shadow; 88 | 89 | & h3 { 90 | @apply pb-3; 91 | @apply text-2xl; 92 | 93 | & svg { 94 | @apply inline-block align-middle w-12 h-12; 95 | } 96 | } 97 | 98 | &:hover, &:focus { 99 | @apply scale-100 md:scale-105 text-indigo-500; 100 | @apply shadow-md; 101 | } 102 | 103 | &:active { 104 | @apply text-indigo-700 shadow-sm translate-y-1; 105 | } 106 | } 107 | 108 | & .tailstart-add-component { 109 | @apply block px-3 py-2 h-full; 110 | @apply rounded-md mb-3; 111 | @apply border-4 border-dashed border-indigo-200; 112 | @apply text-indigo-300 cursor-default; 113 | 114 | & h3 { 115 | @apply pb-3; 116 | @apply text-2xl; 117 | 118 | & svg { 119 | @apply inline-block align-middle w-12 h-12; 120 | } 121 | } 122 | } 123 | } 124 | 125 | & footer { 126 | @apply bg-indigo-800 py-20 px-5; 127 | @apply transition-all hover:bg-indigo-700; 128 | 129 | & > div { 130 | @apply container mx-auto; 131 | @apply text-right; 132 | 133 | & > a { 134 | @apply inline-block; 135 | @apply transform-gpu transition duration-200; 136 | 137 | & svg { 138 | @apply inline-block; 139 | } 140 | 141 | & span { 142 | @apply pr-4; 143 | @apply text-blue-50; 144 | } 145 | 146 | &:hover, &:focus { 147 | @apply scale-105; 148 | } 149 | } 150 | } 151 | } 152 | 153 | } 154 | 155 | .tailstart-html-header { 156 | @apply mb-5; 157 | 158 | & > .tailstart-container { 159 | & > a { 160 | @apply inline-block transform-gpu transition duration-200 px-3 py-2 h-full; 161 | @apply bg-white rounded-md mb-3; 162 | @apply transform-gpu transition duration-200; 163 | @apply text-indigo-800; 164 | @apply shadow; 165 | 166 | &:hover, &:focus { 167 | @apply scale-100 md:scale-105 text-indigo-500; 168 | @apply shadow-md; 169 | } 170 | 171 | &:active { 172 | @apply text-indigo-700 shadow-sm translate-y-1; 173 | } 174 | 175 | & svg { 176 | @apply w-6 h-6 inline-block; 177 | } 178 | } 179 | } 180 | } 181 | 182 | .tailstart-modal-example { 183 | @apply relative; 184 | 185 | & .modal { 186 | @apply py-6 w-screen; 187 | } 188 | 189 | & .modal, & .modal-dialog { 190 | @apply block relative; 191 | } 192 | } -------------------------------------------------------------------------------- /public/progress.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Progress bar 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
Basic progress bar
28 | 29 | 30 | 31 |
32 |
33 | 70% 34 |
35 |
36 |
37 | 38 |
39 |
40 | Indeterminate 41 |
42 |
43 |
44 | 45 |
Colored progress bars
46 | 47 | 48 | 49 |
50 |
51 | 70% 52 |
53 |
54 |
55 | 56 |
57 |
58 | Indeterminate 59 |
60 |
61 |
62 | 63 |
64 |
65 | 70% 66 |
67 |
68 |
69 | 70 |
71 |
72 | Indeterminate 73 |
74 |
75 |
76 | 77 |
78 |
79 | 70% 80 |
81 |
82 |
83 | 84 |
85 |
86 | Indeterminate 87 |
88 |
89 |
90 | 91 |
92 |
93 | 70% 94 |
95 |
96 |
97 | 98 |
99 |
100 | Indeterminate 101 |
102 |
103 |
104 | 105 |
106 |
107 | 70% 108 |
109 |
110 |
111 | 112 |
113 |
114 | Indeterminate 115 |
116 |
117 |
118 | 119 |
120 |
121 | 70% 122 |
123 |
124 |
125 | 126 |
127 |
128 | Indeterminate 129 |
130 |
131 |
132 | 133 |
134 |
135 | 70% 136 |
137 |
138 |
139 | 140 |
141 |
142 | Indeterminate 143 |
144 |
145 |
146 | 147 |
148 |
149 | 70% 150 |
151 |
152 |
153 | 154 |
155 |
156 | Indeterminate 157 |
158 |
159 |
160 | 161 | 162 |
163 |
164 | 165 | -------------------------------------------------------------------------------- /public/card.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Cards 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
Portrait Card
28 | 29 | 30 | 31 |
32 | 33 |
34 | Sample image 35 |
36 |

37 | This is the card title, not a header 38 |

39 |

I’ve written a few thousand words on why traditional “semantic class names” are the reason CSS is hard to maintain, but the truth is you’re never going to believe me until you actually try it.

40 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

41 |
42 | 45 |
46 | 47 |
48 |

49 | This is the card header 50 |

51 |
52 |

I’ve written a few thousand words on why traditional “semantic class names” are the reason CSS is hard to maintain, but the truth is you’re never going to believe me until you actually try it.

53 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

54 |
55 | 58 |
59 | 60 |
61 |
62 |

I’ve written a few thousand words on why traditional “semantic class names” are the reason CSS is hard to maintain, but the truth is you’re never going to believe me until you actually try it.

63 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

64 |
65 |
66 |
67 | 68 |
Landscape Card
69 | 70 | 71 | 72 |
73 | 74 |
75 | Sample image 76 |
77 |

78 | This is the card title, not a header 79 |

80 |

I’ve written a few thousand words on why traditional “semantic class names” are the reason CSS is hard to maintain, but the truth is you’re never going to believe me until you actually try it.

81 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

82 |
83 | 86 |
87 | 88 |
89 |

90 | This is the card header 91 |

92 |
93 |

I’ve written a few thousand words on why traditional “semantic class names” are the reason CSS is hard to maintain, but the truth is you’re never going to believe me until you actually try it.

94 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

95 |
96 | 99 |
100 | 101 |
102 |
103 |

I’ve written a few thousand words on why traditional “semantic class names” are the reason CSS is hard to maintain, but the truth is you’re never going to believe me until you actually try it.

104 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

105 |
106 |
107 |
108 | 109 |
110 |
111 | 112 | -------------------------------------------------------------------------------- /public/button.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Buttons 10 | 11 | 12 | 13 | 23 | 24 |
25 | 26 |
Link button
27 | 28 | 29 | 30 |
31 |

Be sure to press this button...

32 | Call to action 33 |
34 | 35 |
Button
36 | 37 | 38 | 39 |
40 |

Be sure to press this button

41 | 42 |
43 | 44 |
Sizeable buttons
45 | 46 | 47 | 48 |
49 | 50 |
51 | 52 |
53 | 54 |
55 | 56 |
57 | 58 |
59 | 60 |
61 | 62 |
63 | 64 |
65 | 66 |
67 | 68 |
Disabled buttons
69 | 70 | 71 | 72 |
73 |

Don't press this button...

74 | Call to action 75 |
76 | 77 |
78 |

...or this button.

79 | 80 |
81 | 82 |
Colored buttons
83 | 84 | 85 | 86 |
87 |
88 | 89 | 90 |
91 |
92 | 93 | 94 |
95 |
96 | 97 | 98 |
99 |
100 | 101 | 102 |
103 |
104 | 105 | 106 |
107 |
108 | 109 | 110 |
111 |
112 | 113 | 114 |
115 |
116 | 117 | 118 |
119 |
120 | 121 | 122 |
123 |
124 | 125 |
Details summary button
126 | 127 | 128 | 129 |
130 |
131 | This is the summary of the detail description 132 |
133 |

Several species of salamander inhabit the temperate rainforest of the Pacific Northwest.

134 |

Most salamanders are nocturnal, and hunt for insects, worms, and other small creatures.

135 |
136 |
137 |
138 | 139 |
Button group
140 | 141 | 142 | 143 |
144 |
145 | 146 | 147 | 148 |
149 |
150 | 151 |
152 |
153 | 154 | 155 | -------------------------------------------------------------------------------- /public/offcanvas.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Tailstrap - Offcanvas 11 | 12 | 13 | 14 | 25 | 26 |
27 | 28 |
Offcanvas
29 | 30 | 31 | 32 | 35 | 36 |
37 |
38 |
Offcanvas
39 | 44 |
45 |
46 |
47 | Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc. 48 |
49 | 59 |
60 |
61 | 62 |
Offcanvas directions
63 | 64 | 65 | 66 | 67 | 68 |
69 |
70 |
Offcanvas
71 | 76 |
77 |
78 | ... 79 |
80 |
81 | 82 | 83 | 84 |
85 |
86 |
Offcanvas
87 | 92 |
93 |
94 | ... 95 |
96 |
97 | 98 | 99 | 100 |
101 |
102 |
Offcanvas
103 | 108 |
109 |
110 | ... 111 |
112 |
113 | 114 |
115 | 116 |
117 | 118 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /public/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Header 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
Header
28 | 29 | 30 | 31 |
32 |
33 | 43 | 72 | 77 |
78 |
79 | 80 |
81 |
82 | 83 | -------------------------------------------------------------------------------- /public/pagination.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Pagination 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
Length-aware pagination
28 | 29 | 30 | 31 |
32 | 103 |
104 | 105 |
Cursor pagination
106 | 107 | 108 | 109 |
110 | 151 |
152 | 153 |
154 |
155 | 156 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Jason Leung - Unsplash #cwhtQIssH9k](https://images.unsplash.com/photo-1530153872981-9a7666670466?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=1280&h=400&q=80) 2 | 3 | # Tailstart 4 | 5 | HTML Components ready to style with Tailwind CSS 6 | 7 | ## What is this for? 8 | 9 | If you need to create a visual style for your site, you can start with the basics elements and components as an "HTML skeleton". It incorporates a lot of examples, from simple paragraphs and code blocks, to common componentes like cards, table and pagination. 10 | 11 | This is useful when you need a visual guidelines to implement from the very base, while leaving space to extend with new components. 12 | 13 | ## Installation 14 | 15 | Simple clone this repository with `git`, and call your Node.js package manager of choice, like `npm`. 16 | 17 | git clone https://github.com/DarkGhostHunter/Tailstart.git my-new-project 18 | rm my-new-project/.git 19 | cd my-new-project 20 | npm install 21 | 22 | If you don't have Node.js, [this is a good opportunity to install it](https://nodejs.org/). 23 | 24 | > If you're using Windows, install [Git](https://gitforwindows.org/) or [Github Desktop](https://desktop.github.com/). 25 | 26 | ## Usage 27 | 28 | Tailstart is basically a [Laravel Mix](https://github.com/JeffreyWay/laravel-mix)-powered server that serves static HTML files, parses PostCSS and, as you are guessing now, includes the Tailwind CSS framework. It's meant to be used with [Component Extraction](https://tailwindcss.com/docs/extracting-components). 29 | 30 | To start developing, just call `npm mix watch`: 31 | 32 | $> npm mix watch 33 | 34 | Laravel Mix v6.0 35 | ┌─────────────────────────────────────┬───────────┐ 36 | │ File │ Size │ 37 | ├─────────────────────────────────────┼───────────┤ 38 | │ public/js/app.js │ 188 bytes │ 39 | │ public/tailstart/js/tailstart.js │ 6.92 KiB │ 40 | │ public/css/app.css │ 64.7 KiB │ 41 | │ public/tailstart/css/tailstart.css │ 16.9 KiB │ 42 | └─────────────────────────────────────┴───────────┘ 43 | 44 | This will run a [local BrowserSync server](http://localhost:3000/), with all the HTML pieces to style and their 45 | description. You can even check and sync the result across multiple devices! 46 | 47 | ![img.png](index.png) 48 | 49 | Simply head to the `resources/css` directory and start editing each file. Almost all stylesheets have some minor 50 | guidelines you can follow along. 51 | 52 | ![img_1.png](css.png) 53 | 54 | > To further configure Laravel Mix, [refer to the official documentation](https://laravel-mix.com/). 55 | 56 | ## Component Extraction vs HTML CSS Classes 57 | 58 | > TL;DR: If you need the smallest CSS output for production, Component Extraction won't be your friend. 59 | 60 | The advantage of using vanilla Tailwind CSS over HTML is a very small CSS final build, as it will purge unused CSS from 61 | the framework itself by reading files like PHP, HTML or JS. With the JIT engine, wasting hours configuring the variants 62 | needed (like `hover:focus:md` and so on) it's unnecessary. 63 | 64 | That being said, if you're creating a Javascript app around components, Component Extraction won't be as useful. 65 | 66 | | Component Extraction | HTML CSS Classes 67 | |---|---| 68 | | `
` | `
` | 69 | | Requires Bundler | Works with Bundler or from a CDN | 70 | | Simplifies multiple classes into one | Requires repeating the classes, over and over again | 71 | | Final output takes may take a dozen of KB | PurgeCSS and CSSnano outputs generate very small builds | 72 | | Good for Server-Side rendering | Good for Client-Side rendering (Javascript) 73 | 74 | Tailstart compiles a 80Kb stylesheet. As a comparison, **Bootstrap 5 generates a minified 150~ KB stylesheet**. 75 | 76 | ## Out-of-the-box experience 77 | 78 | This package includes: 79 | 80 | - Autoprefixing 81 | - PostCSS Preset Environment 82 | - PostCSS Nesting 83 | - PostCSS Imports 84 | - Live updates on styles. 85 | 86 | This will allow you to do things like this, and see changes automatically in the browser. 87 | 88 | ```postcss 89 | @import "custom/style.css"; 90 | 91 | @layer components { 92 | .profile { 93 | @apply border-2 w-full text-yellow-800; 94 | 95 | & > .img { 96 | @apply rounded-t; 97 | } 98 | } 99 | } 100 | ``` 101 | 102 | If you need more PostCSS plugins, just head out to this [PostCSS section](https://www.postcss.parts/). 103 | 104 | ## Javascript components 105 | 106 | Instead of reinventing the wheel, Tailstart uses [Bootstrap 5's ESM-enabled Javascript](https://getbootstrap.com/docs/5.0/getting-started/javascript/#using-bootstrap-as-a-module): 107 | 108 | - You get all Bootstrap 5 well-thought behaviour. 109 | - It makes your frontend compatible if you're switching from Bootstrap. 110 | - It's compatible with Vue, React, Angular and what else. 111 | 112 | You can check how Tailstart enables everything at once in the [`app.js`](resources/js/app.js) file. All of these components are styled in [`resources/css/javascript/`](resources/css/javascript). 113 | 114 | In the meantime, see this example of using a modal with Bootstrap with Vue 3: 115 | 116 | ```vue 117 | 125 | 126 | 138 | ``` 139 | 140 | ## Building 141 | 142 | Call `mix production`, and you should see the final output in your `public/css` and `public/js` folders. 143 | 144 | If you're developing a [Laravel application](https://laravel.com/), you may want to just copy-paste the `resources/` 145 | directory into your project, and install the [dev-dependencies](package.json) of this package. 146 | 147 | ## Using another bundler 148 | 149 | You can use another bundler, but nothing has been performant and easy to use than Laravel Mix: 150 | 151 | - [Snowpack doesn't work with PostCSS Import](https://github.com/snowpackjs/snowpack/discussions/1693) 152 | - Vite works but on frontend frameworks. 153 | - Rollup should theoretically work. 154 | - Parcel should theoretically work. 155 | 156 | ## License 157 | 158 | This package is open-sourced software licensed under the [MIT license](LICENSE). -------------------------------------------------------------------------------- /resources/css/basic/input.css: -------------------------------------------------------------------------------- 1 | @layer components { 2 | /** 3 | * This styles all the form input with `form-control`, except the checkbox and 4 | * radio, as these are not input boxes per-se. 5 | */ 6 | .form-control:not([type="checkbox"], [type="radio"], [type="range"]) { 7 | /* Let's add a background to avoid transparency */ 8 | @apply bg-white; 9 | 10 | /** 11 | * This removes any style, like the default inner shadow of inputs. 12 | */ 13 | appearance: none; 14 | 15 | /** 16 | * Colors pickers are usually a single block, so we will inline-block them. 17 | */ 18 | &:is([type="color"]) { 19 | @apply p-0 inline-block; 20 | } 21 | 22 | /** 23 | * We add a common set of styles to all inputs set as "form-control". 24 | */ 25 | @apply outline-none rounded transition-all ring-0 ring-gray-200 shadow-none; 26 | 27 | /** 28 | * If is form for date or time, we will add some sensitive sizing for iOS. 29 | */ 30 | &::-webkit-date-and-time-value { 31 | @apply min-h-[1.5em] cursor-pointer; 32 | } 33 | 34 | /* 35 | * Here we will prepare the calendar and clock icon background. 36 | */ 37 | &:is([type="date"], [type="time"]) { 38 | /* This minimum width allows to have the same width across Webkit and Mozilla */ 39 | @apply min-w-[12em]; 40 | /* Here we prepare the background positioning of the icon */ 41 | background-repeat: no-repeat; 42 | background-position: right 0.75rem center; 43 | background-size: 1rem 1rem; 44 | } 45 | 46 | &:is([type="date"]) { 47 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z' /%3E%3C/svg%3E") 48 | } 49 | 50 | &:is([type="time"]) { 51 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z' /%3E%3C/svg%3E") 52 | } 53 | 54 | /* 55 | * This hides (but doesn't disables) the calendar icon from the webkit on date/time inputs. 56 | */ 57 | &::-webkit-calendar-picker-indicator { 58 | @apply cursor-pointer bg-none; 59 | } 60 | 61 | 62 | /** 63 | * If it's not disabled or read-only, we will apply styles on hover, focus and active states. 64 | */ 65 | &:not(.disabled, :disabled) { 66 | &:hover, &:focus { 67 | @apply ring-4; 68 | } 69 | 70 | &:focus, &:active { 71 | @apply border-blue-400 ring-blue-200; 72 | } 73 | 74 | /* 75 | * We will shrink the ring when pressing it. 76 | */ 77 | &:active { 78 | @apply ring-2; 79 | 80 | /* 81 | * Don't change the background on selects. 82 | */ 83 | &:not(select) { 84 | @apply bg-blue-50; 85 | } 86 | } 87 | } 88 | 89 | /** 90 | * If it's disabled, we will disable the button and add some "disabled" style. 91 | */ 92 | &.disabled, &:disabled { 93 | @apply pointer-events-none cursor-default bg-gray-200 text-gray-400; 94 | 95 | &::placeholder { 96 | @apply text-gray-300; 97 | } 98 | } 99 | } 100 | 101 | /** 102 | * Custom styling for select list that are not multiple. 103 | */ 104 | select:not([multiple]).form-control { 105 | @apply bg-no-repeat bg-right pr-6; 106 | appearance: none; 107 | background-repeat: no-repeat; 108 | background-position: right 0.5rem center; 109 | background-size: 1rem 1rem; 110 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7' /%3E%3C/svg%3E") 111 | } 112 | 113 | /** 114 | * This corrects the list arrow down 115 | */ 116 | input[list].form-control::-webkit-search-decoration, 117 | input[list].form-control::-webkit-calendar-picker-indicator { 118 | @apply -mt-2; 119 | } 120 | 121 | /** 122 | * Finally, we will style the file upload button. 123 | */ 124 | input[type="file"].form-control { 125 | @apply w-full p-0 min-h-[2em] truncate; 126 | 127 | /** 128 | * This styles the button. 129 | */ 130 | &::file-selector-button { 131 | @apply pointer-events-none; 132 | @apply min-h-[2em] h-full pl-8 pr-2 py-1 m-0 mr-2; 133 | @apply border-0 rounded-l rounded-r-none; 134 | @apply bg-gray-100; 135 | border-inline-end-width: 1px; 136 | border-inline-end-style: solid; 137 | border-inline-end-color: theme('colors.gray.200'); 138 | 139 | /* Here we can add a icon just for show */ 140 | background-repeat: no-repeat; 141 | background-position: left 0.5rem center; 142 | background-size: 1rem 1rem; 143 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12' /%3E%3C/svg%3E"); 144 | } 145 | 146 | &:hover:not(:disabled):not([readonly])::file-selector-button { 147 | @apply bg-gray-200; 148 | } 149 | } 150 | 151 | /** 152 | * For the range input, we will need to use the prefix for each browser. 153 | * Since that's is cumbersome, we will use postcss-input-range. 154 | * 155 | * For some reason, styling the track using ::range-track is very unreliable. 156 | * 157 | * @see https://github.com/csstools/postcss-input-range 158 | */ 159 | input[type="range"].form-control { 160 | appearance: none; 161 | 162 | @apply block w-full p-0 h-2 my-2; 163 | @apply border bg-gray-50 outline-none rounded-full cursor-pointer; 164 | 165 | &::range-thumb { 166 | appearance: none; 167 | @apply bg-blue-500 rounded-full w-4 h-4 ring-0 ring-blue-200 transition-all border-0; 168 | 169 | &:hover, &:focus { 170 | @apply ring-4; 171 | } 172 | 173 | &:active { 174 | @apply ring-2; 175 | } 176 | } 177 | 178 | &.disabled, &:disabled { 179 | @apply pointer-events-none bg-white; 180 | 181 | &::range-thumb { 182 | @apply bg-gray-400; 183 | } 184 | } 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /public/typography.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Typography 10 | 11 | 12 | 13 | 23 | 24 |
25 | 26 | 27 | 28 |
Headers
29 | 30 | 31 |

Header 1: The quick brown fox jumps over the lazy dog

32 |

Header 2: The quick brown fox jumps over the lazy dog

33 |

Header 3: The quick brown fox jumps over the lazy dog

34 |

Header 4: The quick brown fox jumps over the lazy dog

35 |
Header 5: The quick brown fox jumps over the lazy dog
36 |
Header 6: The quick brown fox jumps over the lazy dog
37 | 38 |
Paragraphs
39 | 40 | 41 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sapien justo, fringilla non lectus ac, auctor sagittis eros. Sed bibendum egestas lacinia. Cras accumsan mi in mi rhoncus, sed tempus nunc imperdiet. Nulla vitae eros id leo ullamcorper consectetur. Curabitur id iaculis sapien. Nulla augue arcu, efficitur non sapien id, convallis blandit lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vestibulum ut bibendum libero. Duis eget dignissim dolor. Morbi sed felis in ligula sodales sollicitudin. Donec vehicula neque rhoncus ultrices iaculis. Sed aliquet fringilla varius. Phasellus elementum magna ac ante hendrerit, nec imperdiet velit sodales. Ut pharetra quam sem, in sollicitudin ipsum cursus et.

42 |

Curabitur ac enim leo. Vivamus elementum, enim at malesuada lobortis, mi augue dapibus erat, et vehicula elit dui sit amet lacus. Duis placerat tellus dignissim commodo pharetra. Cras pulvinar ultrices ante, sed ullamcorper risus. Pellentesque tempor sit amet tellus at tempus. Proin malesuada lorem et lobortis finibus. Pellentesque lectus metus, congue sed arcu vitae, porttitor bibendum tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Maecenas non mollis nisl. Suspendisse potenti. Praesent eget justo eu orci fermentum tempor et ac metus. Nullam semper ex at porta vehicula.

43 |

Nam accumsan mollis lacinia. Etiam efficitur leo vitae augue faucibus, in iaculis velit pulvinar. Pellentesque rhoncus sem nec imperdiet vulputate. Vivamus at magna velit. In a tincidunt metus. Vivamus volutpat, neque ac accumsan lacinia, augue ante aliquet nisl, nec malesuada neque orci in massa. Nam mauris tortor, iaculis nec congue quis, vestibulum quis libero. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis a volutpat elit. Mauris faucibus efficitur tellus at viverra. Vestibulum auctor diam eu nisl laoreet, vitae rhoncus lacus pulvinar.

44 | 45 |
Unordered Lists
46 | 47 | 48 |
49 |
    50 |
  • Vivamus sapien justo.
  • 51 |
  • Vivamus elementum.
  • 52 |
  • Etiam efficitur leo vitae augue faucibus.
  • 53 |
  • 54 |
      55 |
    • Vivamus sapien justo.
    • 56 |
    • Vivamus elementum.
    • 57 |
    • Etiam efficitur leo vitae augue faucibus.
    • 58 |
    • 59 |
        60 |
      • Vivamus sapien justo.
      • 61 |
      • Vivamus elementum.
      • 62 |
      • Etiam efficitur leo vitae augue faucibus.
      • 63 |
      • Pellentesque rhoncus sem nec imperdiet vulputate.
      • 64 |
      65 |
    • 66 |
    • Pellentesque rhoncus sem nec imperdiet vulputate.
    • 67 |
    68 |
  • 69 |
  • Pellentesque rhoncus sem nec imperdiet vulputate.
  • 70 |
71 |
72 | 73 |
Ordered Lists
74 | 75 | 76 |
77 |
    78 |
  1. Vivamus sapien justo.
  2. 79 |
  3. Vivamus elementum.
  4. 80 |
  5. Etiam efficitur leo vitae augue faucibus.
  6. 81 |
  7. 82 |
      83 |
    1. Vivamus sapien justo.
    2. 84 |
    3. Vivamus elementum.
    4. 85 |
    5. Etiam efficitur leo vitae augue faucibus.
    6. 86 |
    7. 87 |
        88 |
      1. Vivamus sapien justo.
      2. 89 |
      3. Vivamus elementum.
      4. 90 |
      5. Etiam efficitur leo vitae augue faucibus.
      6. 91 |
      7. Pellentesque rhoncus sem nec imperdiet vulputate.
      8. 92 |
      93 |
    8. 94 |
    9. Pellentesque rhoncus sem nec imperdiet vulputate.
    10. 95 |
    96 |
  8. 97 |
  9. Pellentesque rhoncus sem nec imperdiet vulputate.
  10. 98 |
99 |
100 | 101 |
Definition Lists
102 | 103 | 104 |
105 |
106 |
Vivamus sapien justo.
107 |
Vivamus elementum.
108 |
Etiam efficitur leo vitae augue faucibus.
109 |
110 |
111 |
Vivamus sapien justo.
112 |
Vivamus elementum.
113 |
Etiam efficitur leo vitae augue faucibus.
114 |
115 |
116 |
Vivamus sapien justo.
117 |
Vivamus elementum.
118 |
Etiam efficitur leo vitae augue faucibus.
119 |
Pellentesque rhoncus sem nec imperdiet vulputate.
120 |
121 |
122 |
Pellentesque rhoncus sem nec imperdiet vulputate.
123 |
124 |
125 |
Pellentesque rhoncus sem nec imperdiet vulputate.
126 |
127 |
128 | 129 |
130 |
131 | 132 | 133 | -------------------------------------------------------------------------------- /public/multimedia.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Video 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
Video
28 | 29 | 30 | 31 | 32 |
33 |

34 | Sintel - Trailer 35 |

36 | 37 | 43 | 44 |
45 |
46 | 47 |
48 |
49 |
50 | 56 |
57 | 88:88:88 / 88:88:88 58 |
59 |
60 |
61 | 67 | 72 |
73 |
74 |
75 |
76 | 77 |
Audio
78 | 79 | 80 | 81 |
82 |

83 | Bunny - 04. Death Becomes Fur (mp3) 84 |

85 | 86 | 91 | 92 |
93 |
94 | 95 |
96 |
97 |
98 | 104 |
105 | 88:88:88 / 88:88:88 106 |
107 |
108 |
109 | 115 | 120 |
121 |
122 |
123 |
124 | 125 |
Embedded iframe
126 | 127 | 128 | 129 |
Embedded iframe
130 | 131 | 132 | 133 |
134 | 135 |
136 | 137 |
138 |
139 | 140 | -------------------------------------------------------------------------------- /public/styles.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - Styles 10 | 11 | 12 | 13 | 23 | 24 |
25 | 26 |
Styling and decoration
27 | 28 | 29 |
30 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sapien justo, fringilla non lectus ac, auctor sagittis eros.

31 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sapien justo, fringilla non lectus ac, auctor sagittis eros.

32 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

33 |

Vivamus sapien justo, fringilla non lectus ac, auctor sagittis eros.

34 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sapien justo, fringilla non lectus ac, auctor sagittis eros.

35 |

This text contains subscript text.

36 |

This text contains superscript text.

37 |

This text contains small text that should be used with care.

38 |
39 | 40 |
Code and variables
41 | 42 | 43 |
44 |
{
 45 |   "article": {
 46 |     "title": "This is awesome",
 47 |     "body": "File",
 48 |     "popup": {
 49 |       "menuitem": [
 50 |         {"value": "New", "onclick": "CreateNewDoc()"},
 51 |         {"value": "Open", "onclick": "OpenDoc()"},
 52 |         {"value": "Close", "onclick": "CloseDoc()"}
 53 |       ],
 54 |       "large-line": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sapien justo, fringilla non lectus ac, auctor sagittis eros. Sed bibendum egestas lacinia. Cras accumsan mi in mi rhoncus, sed tempus nunc imperdiet. Nulla vitae eros id leo ullamcorper consectetur. Curabitur id iaculis sapien. Nulla augue arcu, efficitur non sapien id, convallis blandit lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vestibulum ut bibendum libero. Duis eget dignissim dolor. Morbi sed felis in ligula sodales sollicitudin. Donec vehicula neque rhoncus ultrices iaculis. Sed aliquet fringilla varius. Phasellus elementum magna ac ante hendrerit, nec imperdiet velit sodales. Ut pharetra quam sem, in sollicitudin ipsum cursus et."
 55 |     }
 56 |   }
 57 | }
58 |
59 | 60 |
61 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sapien justo, fringilla non lectus ac, auctor sagittis eros.

62 |
63 |
64 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit: Ctrl + + R.

65 |
66 |
67 |

And the computer said: Keyboard not found
Press F1 to continue
.

68 |
69 |
70 |

The volume of a box is l × w × h, where l represents the length, w the width and h the height of the box.

71 |
72 | 73 |
Quotes
74 | 75 | 76 | 77 |
78 |

This quote is from the IETF, about avian carriers:

79 |
80 |

Avian carriers can provide high delay, low throughput, and low altitude service. The connection topology is limited to a single point-to-point path for each carrier, used with standard carriers, but many carriers can be used without significant interference with each other, outside of early spring. This is because of the 3D ether space available to the carriers, in contrast to the 1D ether used by IEEE802.3. The carriers have an intrinsic collision avoidance system, which increases availability.

81 |
82 |
83 | 84 |
85 |

This quote is from the IETF, about avian carriers: 86 | Avian carriers can provide high delay, low throughput, and low altitude service. The connection topology is limited to a single point-to-point path for each carrier, used with standard carriers, but many carriers can be used without significant interference with each other, outside of early spring. This is because of the 3D ether space available to the carriers, in contrast to the 1D ether used by IEEE802.3. The carriers have an intrinsic collision avoidance system, which increases availability. 87 |

88 |
89 | 90 |
91 |
92 |
93 |

Words can be like X-rays, if you use them properly—they’ll go through anything. You read and you’re pierced.

94 |
95 |
—Aldous Huxley, Brave New World
96 |
97 |
98 | 99 |
Addresses
100 | 101 | 102 |
103 |

Contact the author of this page:

104 | 105 |
106 | Italo Israel Baeza Cabrera
107 | italo@baeza.com
108 | (555) 8765-4321 109 |
110 |
111 | 112 |
Definition
113 | 114 | 115 |
116 |

117 | The HST 118 | is among the most productive scientific instruments ever constructed. 119 | It has been in orbit for over 20 years, scanning the sky and 120 | returning data and photographs of unprecedented quality and 121 | detail. 122 |

123 |
124 |
125 | BIOS 126 |

127 | Firmware used to perform hardware initialization during the booting process (power-on startup), and to provide runtime services for operating systems and programs. 128 |

129 |
130 |
131 |

132 | The HTML tag <dfn> is usually present on text that includes the term to define but doesn't want to get into definition details. 133 |

134 |
135 | 136 |
137 |

Several species of salamander inhabit the temperate rainforest of the Pacific Northwest.

138 |

Most salamanders are nocturnal, and hunt for insects, worms, and other small creatures.

139 |
140 | 141 |
142 |
143 | 144 | 145 | -------------------------------------------------------------------------------- /public/list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tailstrap - List 10 | 11 | 12 | 13 | 24 | 25 |
26 | 27 |
List
28 | 29 | 30 | 31 |
32 |
    33 |
  • 34 |
    35 |

    This is a title

    36 |

    If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

    37 |
    38 |
  • 39 |
  • 40 |
    41 |

    This is a title

    42 |

    If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

    43 |
    44 |
  • 45 |
  • 46 |
    47 |

    This is a title

    48 |

    If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

    49 |
    50 |
  • 51 |
  • 52 |
    53 |

    This is a title

    54 |

    If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

    55 |
    56 |
  • 57 |
58 |
59 | 60 |
Action list
61 | 62 | 63 | 64 | 92 | 93 |
Colored list
94 | 95 | 96 | 97 |
98 |
99 | 100 |
101 |

This is a title

102 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

103 |
104 |
105 | 106 |
107 |

This is a title

108 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

109 |
110 |
111 | 112 |
113 |

This is a title

114 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

115 |
116 |
117 | 118 |
119 |

This is a title

120 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

121 |
122 |
123 | 124 |
125 |

This is a title

126 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

127 |
128 |
129 | 130 |
131 |

This is a title

132 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

133 |
134 |
135 | 136 |
137 |

This is a title

138 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

139 |
140 |
141 | 142 |
143 |

This is a title

144 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

145 |
146 |
147 | 148 |
149 |

This is a title

150 |

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

151 |
152 |
153 |
154 |
155 | 156 |
Checkbox list
157 | 158 | 159 | 160 |
161 |
162 | 166 | 170 | 174 | 178 |
179 |
180 | 181 |
Radio list
182 | 183 | 184 | 185 |
186 |
187 | 191 | 195 | 199 | 203 |
204 |
205 | 206 |
207 |
208 | 209 | --------------------------------------------------------------------------------