1
0
mirror of https://github.com/tabler/tabler.git synced 2026-08-07 20:02:23 +04:00

Migrate preview and docs packages from Eleventy to Astro (#2694)

Co-authored-by: Bartek <xbartoszdobija@gmail.com>
This commit is contained in:
Paweł Kuna
2026-07-28 00:09:02 +02:00
committed by GitHub
parent 9820d110f6
commit d8956a06d6
1150 changed files with 52147 additions and 32804 deletions
@@ -0,0 +1,87 @@
---
import SingleLayout from '@shared/layouts/SingleLayout.astro';
import Button from '@shared/components/Button.astro';
import { addPageScript } from '@shared/lib/page-scripts';
addPageScript(`<script>
document.addEventListener("DOMContentLoaded", function() {
var inputs = document.querySelectorAll('[data-code-input]');
// Attach an event listener to each input element
for(let i = 0; i < inputs.length; i++) {
inputs[i].addEventListener('input', function(e) {
// If the input field has a character, and there is a next input field, focus it
if(e.target.value.length === e.target.maxLength && i + 1 < inputs.length) {
inputs[i + 1].focus();
}
});
inputs[i].addEventListener('keydown', function(e) {
// If the input field is empty and the keyCode for Backspace (8) is detected, and there is a previous input field, focus it
if(e.target.value.length === 0 && e.keyCode === 8 && i > 0) {
inputs[i - 1].focus();
}
});
}
});
</script>`);
---
<SingleLayout title="2-Step Verification">
<form class="card card-md" action="./" method="get" autocomplete="off" novalidate>
<div class="card-body">
<h2 class="card-title card-title-lg text-center mb-4">Authenticate Your Account</h2>
<p class="my-4 text-center">
Please confirm your account by entering the authorization code sent to <strong
>+1 856-672-8552</strong
>.
</p>
<div class="my-5">
<div class="row g-4">
{
Array.from({ length: 2 }).map(() => (
<div class="col">
<div class="row g-2">
{Array.from({ length: 3 }).map(() => (
<div class="col">
<input
type="text"
class="form-control form-control-lg text-center px-3 py-3"
maxlength="1"
inputmode="numeric"
pattern="[0-9]*"
data-code-input
/>
</div>
))}
</div>
</div>
))
}
</div>
</div>
<div class="my-4">
<label class="form-check">
<input type="checkbox" class="form-check-input" />
Dont't ask for codes again on this device
</label>
</div>
<div class="form-footer">
<div class="btn-list flex-nowrap">
<Button text="Cancel" block href="2-step-verification.html" />
<Button text="Verify" block color="primary" />
</div>
</div>
</div>
</form>
<div class="text-center text-secondary mt-3">
It may take a minute to receive your code. Haven't received it? <a href="./"
>Resend a new code.</a
>
</div>
</SingleLayout>
@@ -1,79 +0,0 @@
---
title: "2-Step Verification"
layout: single
permalink: 2-step-verification-code.html
---
<form
class="card card-md"
action="{{ page | relative }}/"
method="get"
autocomplete="off"
novalidate
>
<div class="card-body">
<h2 class="card-title card-title-lg text-center mb-4">Authenticate Your Account</h2>
<p class="my-4 text-center">Please confirm your account by entering the authorization code sent to <strong>+1 856-672-8552</strong>.</p>
<div class="my-5">
<div class="row g-4">
{% for i in (1..2) %}
<div class="col">
<div class="row g-2">
{% for i in (1..3) %}
<div class="col">
<input type="text" class="form-control form-control-lg text-center px-3 py-3" maxlength="1" inputmode="numeric" pattern="[0-9]*" data-code-input />
</div>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</div>
<div class="my-4">
<label class="form-check">
<input type="checkbox" class="form-check-input" />
Dont't ask for codes again on this device
</label>
</div>
<div class="form-footer">
<div class="btn-list flex-nowrap">
{% include "ui/button.html" text="Cancel" block=true href="2-step-verification.html" %}
{% include "ui/button.html" text="Verify" block=true color="primary" %}
</div>
</div>
</div>
</form>
<div class="text-center text-secondary mt-3">
It may take a minute to receive your code. Haven't received it? <a href="{{ page | relative }}/">Resend a new code.</a>
</div>
{% capture_script %}
<script>
document.addEventListener("DOMContentLoaded", function() {
var inputs = document.querySelectorAll('[data-code-input]');
// Attach an event listener to each input element
for(let i = 0; i < inputs.length; i++) {
inputs[i].addEventListener('input', function(e) {
// If the input field has a character, and there is a next input field, focus it
if(e.target.value.length === e.target.maxLength && i + 1 < inputs.length) {
inputs[i + 1].focus();
}
});
inputs[i].addEventListener('keydown', function(e) {
// If the input field is empty and the keyCode for Backspace (8) is detected, and there is a previous input field, focus it
if(e.target.value.length === 0 && e.keyCode === 8 && i > 0) {
inputs[i - 1].focus();
}
});
}
});
</script>
{% endcapture_script %}
+47
View File
@@ -0,0 +1,47 @@
---
import SingleLayout from '@shared/layouts/SingleLayout.astro';
import Button from '@shared/components/Button.astro';
import flags from '@data/flags.json';
// Liquid: {% if country.code == 'US' %} selected{% endif %} — flags.json entries
// have no `code` property, so the reference renders value="" and never `selected`.
// We mirror that output exactly.
---
<SingleLayout title="2-Step Verification">
<form
class="card card-md"
action="./2-step-verification-code.html"
method="get"
autocomplete="off"
novalidate
>
<div class="card-body">
<h2 class="card-title text-center mb-4">2-Step Verification</h2>
<div class="mb-3">
<label class="form-label">Country</label>
<select class="form-select">
{flags.map((country) => <option value="">{country.name}</option>)}
</select>
</div>
<div class="mb-4">
<label class="form-label">Your Phone Number</label>
<div class="input-group">
<span class="input-group-text">+1</span>
<input type="text" class="form-control" placeholder="Enter phone number" />
</div>
</div>
<div class="text-secondary">
Security is critical in Tabler. to help keep your account safe, we'll
text you a verification code when you sign in on a new device
</div>
<div class="form-footer">
<Button element="button" type="submit" text="Send code" block color="primary" />
</div>
</div>
</form>
</SingleLayout>
-43
View File
@@ -1,43 +0,0 @@
---
title: 2-Step Verification
layout: single
permalink: 2-step-verification.html
---
<form
class="card card-md"
action="{{ page | relative }}/2-step-verification-code.html"
method="get"
autocomplete="off"
novalidate
>
<div class="card-body">
<h2 class="card-title text-center mb-4">2-Step Verification</h2>
<div class="mb-3">
<label class="form-label">Country</label>
<select class="form-select">
{% for country in flags %}
<option value="{{ country.code }}"{% if country.code == 'US' %} selected{% endif %}>{{ country.name }}</option>
{% endfor %}
</select>
</div>
<div class="mb-4">
<label class="form-label">Your Phone Number</label>
<div class="input-group">
<span class="input-group-text">+1</span>
<input type="text" class="form-control" placeholder="Enter phone number" />
</div>
</div>
<div class="text-secondary">
Security is critical in Tabler. to help keep your account safe, we'll
text you a verification code when you sign in on a new device
</div>
<div class="form-footer">
{% include "ui/button.html" element="button" type="submit" text="Send code" block=true color="primary" %}
</div>
</div>
</form>
+50
View File
@@ -0,0 +1,50 @@
---
// Port of preview/pages/accordion.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Accordion from '@shared/components/ui/Accordion.astro';
---
<DefaultLayout title="Accordion" pageHeader="Accordion" pageMenu="base.accordion">
<div class="row row-cards">
<div class="col-md-6">
<div class="card">
<div class="card-body">
<Accordion />
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<Accordion type="flush" id="flush" />
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<Accordion type="tabs" id="tabs" />
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<Accordion type="inverted" id="inverted" />
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<Accordion id="inverted-plus" type="inverted,plus" toggleIcon="plus" />
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<Accordion id="icons" showIcon />
</div>
</div>
</div>
</div>
</DefaultLayout>
-50
View File
@@ -1,50 +0,0 @@
---
title: Accordion
page-header: Accordion
page-menu: base.accordion
layout: default
permalink: accordion.html
---
<div class="row row-cards">
<div class="col-md-6">
<div class="card">
<div class="card-body">
{% include "ui/accordion.html" %}
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
{% include "ui/accordion.html" type="flush" id="flush" %}
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
{% include "ui/accordion.html" type="tabs" id="tabs" %}
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
{% include "ui/accordion.html" type="inverted" id="inverted" %}
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
{% include "ui/accordion.html" id="inverted-plus" type="inverted,plus" toggle-icon="plus" %}
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
{% include "ui/accordion.html" id="icons" show-icon %}
</div>
</div>
</div>
</div>
+17
View File
@@ -0,0 +1,17 @@
---
// Port of preview/pages/activity.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import ActivityPart from '@shared/components/ui/ActivityPart.astro';
---
<DefaultLayout title="Activity" pageHeader="Activity" pageMenu="extra.activity">
<div class="row">
<div class="col-8">
<div class="card">
<div class="card-body">
<ActivityPart />
</div>
</div>
</div>
</div>
</DefaultLayout>
-17
View File
@@ -1,17 +0,0 @@
---
title: Activity
page-header: Activity
page-menu: extra.activity
layout: default
permalink: activity.html
---
<div class="row">
<div class="col-8">
<div class="card">
<div class="card-body">
{% include "parts/activity.html" %}
</div>
</div>
</div>
</div>
+108
View File
@@ -0,0 +1,108 @@
---
// Port of preview/pages/alerts.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Alert from '@shared/components/Alert.astro';
---
<DefaultLayout title="Alerts" pageHeader="Alerts" pageMenu="base.alerts">
<div class="row row-cards">
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Basic alerts</h2>
<Alert type="danger" title="An error occurred!" />
<Alert type="warning" title="Some information is missing!" />
<Alert type="success" title="Completed successfully!" />
<Alert type="info" title="Just a quick note!" />
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Alerts with action</h2>
<Alert showClose action="Link" type="danger" title="An error occurred!" />
<Alert showClose action="Link" type="warning" title="Some information is missing!" />
<Alert showClose action="Link" type="success" title="Completed successfully!" />
<Alert showClose action="Link" type="info" title="Just a quick note!" />
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Dismissible alerts</h2>
<Alert showClose type="danger" title="An error occurred!" />
<Alert showClose type="warning" title="Some information is missing!" />
<Alert showClose type="success" title="Completed successfully!" />
<Alert showClose type="info" title="Just a quick note!" />
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Alert with a description</h2>
<Alert
showClose
type="danger"
title="Password does not meet requirements:"
list="Minimum 8 characters,Include a special character"
/>
<Alert
showClose
type="warning"
title="Some information is missing!"
description="This is a custom alert box with a description."
/>
<Alert
showClose
type="success"
title="Completed successfully!"
description="This is a custom alert box with a description."
/>
<Alert
showClose
type="info"
title="Just a quick note!"
description="This is a custom alert box with a description."
/>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Important alerts</h2>
<Alert
showClose
important
type="danger"
title="Password does not meet requirements:"
list="Minimum 8 characters,Include a special character"
/>
<Alert showClose important type="success" description="This is a custom alert box with a description." />
<Alert showClose important type="warning" description="This is a custom alert box with a description." />
<Alert showClose important type="info" description="This is a custom alert box with a description." />
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Minor alerts</h2>
<Alert
showClose
minor
type="danger"
title="Password does not meet requirements:"
list="Minimum 8 characters,Include a special character"
/>
<Alert showClose minor type="success" description="This is a custom alert box with a description." />
<Alert showClose minor type="warning" description="This is a custom alert box with a description." />
<Alert showClose minor type="info" description="This is a custom alert box with a description." />
</div>
</div>
</div>
</div>
</DefaultLayout>
-76
View File
@@ -1,76 +0,0 @@
---
title: Alerts
page-menu: base.alerts
page-header: Alerts
layout: default
permalink: alerts.html
---
<div class="row row-cards">
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Basic alerts</h2>
{% include "ui/alert.html" type="danger" title="An error occurred!" %}
{% include "ui/alert.html" type="warning" title="Some information is missing!" %}
{% include "ui/alert.html" type="success" title="Completed successfully!" %}
{% include "ui/alert.html" type="info" title="Just a quick note!" %}
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Alerts with action</h2>
{% include "ui/alert.html" show-close action="Link" type="danger" title="An error occurred!" %}
{% include "ui/alert.html" show-close action="Link" type="warning" title="Some information is missing!" %}
{% include "ui/alert.html" show-close action="Link" type="success" title="Completed successfully!" %}
{% include "ui/alert.html" show-close action="Link" type="info" title="Just a quick note!" %}
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Dismissible alerts</h2>
{% include "ui/alert.html" show-close type="danger" title="An error occurred!" %}
{% include "ui/alert.html" show-close type="warning" title="Some information is missing!" %}
{% include "ui/alert.html" show-close type="success" title="Completed successfully!" %}
{% include "ui/alert.html" show-close type="info" title="Just a quick note!" %}
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Alert with a description</h2>
{% include "ui/alert.html" show-close type="danger" title="Password does not meet requirements:" list="Minimum 8 characters,Include a special character" %}
{% include "ui/alert.html" show-close type="warning" title="Some information is missing!" description="This is a custom alert box with a description." %}
{% include "ui/alert.html" show-close type="success" title="Completed successfully!" description="This is a custom alert box with a description." %}
{% include "ui/alert.html" show-close type="info" title="Just a quick note!" description="This is a custom alert box with a description." %}
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Important alerts</h2>
{% include "ui/alert.html" show-close important=true type="danger" title="Password does not meet requirements:" list="Minimum 8 characters,Include a special character" %}
{% include "ui/alert.html" show-close important=true type="success" description="This is a custom alert box with a description." %}
{% include "ui/alert.html" show-close important=true type="warning" description="This is a custom alert box with a description." %}
{% include "ui/alert.html" show-close important=true type="info" description="This is a custom alert box with a description." %}
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Minor alerts</h2>
{% include "ui/alert.html" show-close minor=true type="danger" title="Password does not meet requirements:" list="Minimum 8 characters,Include a special character" %}
{% include "ui/alert.html" show-close minor=true type="success" description="This is a custom alert box with a description." %}
{% include "ui/alert.html" show-close minor=true type="warning" description="This is a custom alert box with a description." %}
{% include "ui/alert.html" show-close minor=true type="info" description="This is a custom alert box with a description." %}
</div>
</div>
</div>
</div>
+925
View File
@@ -0,0 +1,925 @@
---
// Port of preview/pages/all-elements.html — a kitchen-sink of every component.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Button from '@shared/components/Button.astro';
import Alert from '@shared/components/Alert.astro';
import Badge from '@shared/components/ui/Badge.astro';
import Progress from '@shared/components/ui/Progress.astro';
import Select from '@shared/components/ui/Select.astro';
import Check from '@shared/components/ui/form/Check.astro';
import Nav from '@shared/components/ui/Nav.astro';
import Breadcrumb from '@shared/components/ui/Breadcrumb.astro';
import Pagination from '@shared/components/ui/Pagination.astro';
import Avatar from '@shared/components/ui/Avatar.astro';
import Icon from '@shared/components/Icon.astro';
import Dropdown from '@shared/components/ui/Dropdown.astro';
import Accordion from '@shared/components/ui/Accordion.astro';
import Spinner from '@shared/components/ui/Spinner.astro';
import Rating from '@shared/components/ui/Rating.astro';
import Steps from '@shared/components/ui/Steps.astro';
import StatusDot from '@shared/components/ui/StatusDot.astro';
import Toast from '@shared/components/ui/Toast.astro';
import InputIcon from '@shared/components/ui/form/InputIcon.astro';
import InputGroup from '@shared/components/InputGroup.astro';
import Range from '@shared/components/ui/Range.astro';
import Tag from '@shared/components/ui/Tag.astro';
import Ribbon from '@shared/components/ui/Ribbon.astro';
import Flag from '@shared/components/ui/Flag.astro';
import Payment from '@shared/components/ui/Payment.astro';
import Timeline from '@shared/components/ui/Timeline.astro';
import Empty from '@shared/components/ui/Empty.astro';
import NavSegmented from '@shared/components/ui/NavSegmented.astro';
// Code-block content lives in the frontmatter so Astro does not try to evaluate
// its `${name}` / `{ }` as expressions; injected verbatim via set:html.
const codeExample = `// JavaScript example
function greetUser(name) {
console.log(\`Hello, \${name}!\`);
return true;
}`;
---
<DefaultLayout
title="All Elements - Kitchen Sink"
pageHeader="All Elements"
pageMenu="base.all-elements"
pageLibs={['nouislider', 'star-rating.js', 'tabler-flags', 'tabler-payments', 'tom-select']}
>
<div class="row row-cards">
<!-- Typography Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Typography</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<h4>Heading 4</h4>
<h5>Heading 5</h5>
<h6>Heading 6</h6>
</div>
<div class="col-md-6">
<p class="lead">This is a lead paragraph with larger text.</p>
<p>This is a regular paragraph with <strong>bold text</strong>, <em>italic text</em>, and
<u>underlined text</u>.</p>
<p><small class="text-muted">This is small muted text.</small></p>
<p class="text-primary">Primary text color</p>
<p class="text-success">Success text color</p>
<p class="text-danger">Danger text color</p>
</div>
</div>
</div>
</div>
</div>
<!-- Buttons Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Buttons</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Standard Buttons</h4>
<div class="btn-list mb-3">
<Button text="Default" />
<Button text="Primary" color="primary" icon="star" />
<Button text="Secondary" color="secondary" />
<Button text="Success" color="success" icon="check" />
<Button text="Warning" color="warning" />
<Button text="Danger" color="danger" icon="x" />
<Button text="Info" color="info" />
</div>
</div>
<div class="col-md-6">
<h4>Button Sizes</h4>
<div class="btn-list mb-3 align-items-start">
<Button text="Small" size="sm" />
<Button text="Default" />
<Button text="Large" size="lg" />
</div>
<h4>Icon Buttons</h4>
<div class="btn-list mb-3 align-items-start">
<Button icon="heart" iconOnly />
<Button icon="star" iconOnly />
<Button icon="check" iconOnly />
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Cards Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Simple Card</h3>
</div>
<div class="card-body">
<p>This is a simple card with header and body content.</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card with Footer</h3>
</div>
<div class="card-body">
<p>This card includes a footer section.</p>
</div>
<div class="card-footer">
<div class="d-flex">
<a class="btn btn-link">Cancel</a>
<a class="btn btn-primary ms-auto">Save</a>
</div>
</div>
</div>
</div>
<!-- Alerts Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Alerts</h3>
</div>
<div class="card-body">
<Alert type="info" title="This is a primary alert with an icon." />
<Alert type="success" title="This is a success alert message." />
<Alert type="warning" title="This is a warning alert message." />
<Alert type="danger" title="This is a danger alert message." />
</div>
</div>
</div>
<!-- Badges Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Badges</h3>
</div>
<div class="card-body">
<div class="space-y">
<div>
<Badge text="Default" />
<Badge text="Primary" color="primary" />
<Badge text="Secondary" color="secondary" />
<Badge text="Success" color="success" />
<Badge text="Warning" color="warning" />
<Badge text="Danger" color="danger" />
</div>
<div>
<Badge text="With Icon" color="primary" icon="star" />
<Badge text="Light Badge" color="primary" light />
</div>
</div>
</div>
</div>
</div>
<!-- Progress Bars Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Progress Bars</h3>
</div>
<div class="card-body">
<div class="space-y">
<div>
<Progress value="25" />
</div>
<div>
<Progress value="50" color="success" />
</div>
<div>
<Progress value="75" color="warning" />
</div>
<div>
<Progress value="90" color="danger" showValue />
</div>
</div>
</div>
</div>
</div>
<!-- Form Elements Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Form Elements</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label class="form-label">Text Input</label>
<input type="text" class="form-control" placeholder="Enter text">
</div>
<div class="mb-3">
<label class="form-label">Email Input</label>
<input type="email" class="form-control" placeholder="Enter email">
</div>
<div class="mb-3">
<label class="form-label">Password Input</label>
<input type="password" class="form-control" placeholder="Enter password">
</div>
<div class="mb-3">
<label class="form-label">Select Dropdown</label>
<Select id="demo-select" values="Option 1,Option 2,Option 3" />
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label class="form-label">Textarea</label>
<textarea class="form-control" rows="3" placeholder="Enter message"></textarea>
</div>
<div class="mb-3">
<label class="form-label">Checkboxes</label>
<Check title="Option 1" type="checkbox" />
<Check title="Option 2" type="checkbox" checked />
</div>
<div class="mb-3">
<label class="form-label">Radio Buttons</label>
<Check title="Option 1" type="radio" name="radio-demo" />
<Check title="Option 2" type="radio" name="radio-demo" checked />
</div>
<div class="mb-3">
<label class="form-label">Switch</label>
<Check title="Enable notifications" switch />
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Navigation Elements -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Navigation Elements</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Tabs</h4>
<div class="mb-3">
<Nav tabs class="mb-4" />
</div>
<h4>Pills Navigation</h4>
<div class="mb-3">
<Nav pills class="mb-4" />
</div>
<h4>Breadcrumb</h4>
<Breadcrumb pages="Home,Library,Data" homeIcon />
</div>
<div class="col-md-6">
<h4>Pagination</h4>
{/* active-item="2" is a STRING in Liquid; `i == "2"` never matches the
integer index, so no page renders active — reproduced by passing a string. */}
<Pagination count={5} activeItem="2" class="mb-4" />
<h4>Pagination with Text</h4>
<Pagination count={3} text />
</div>
</div>
</div>
</div>
</div>
<!-- Lists Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Lists</h3>
</div>
<div class="card-body">
<h4>Unordered List</h4>
<ul>
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
</ul>
<h4>Ordered List</h4>
<ol>
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
</ol>
</div>
</div>
</div>
<!-- Table Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Table</h3>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-vcenter">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>John Doe</td>
<td>john@example.com</td>
<td><Badge text="Active" color="success" /></td>
</tr>
<tr>
<td>Jane Smith</td>
<td>jane@example.com</td>
<td><Badge text="Pending" color="warning" /></td>
</tr>
<tr>
<td>Bob Johnson</td>
<td>bob@example.com</td>
<td><Badge text="Inactive" color="danger" /></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Avatars Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Avatars</h3>
</div>
<div class="card-body">
<div class="space-y">
<div>
<Avatar placeholder="JD" size="sm" />
<Avatar placeholder="JS" />
<Avatar placeholder="BJ" size="lg" />
<Avatar placeholder="AB" size="xl" />
</div>
<div>
<Avatar placeholder="RD" shape="avatar-rounded" />
<Avatar placeholder="PR" color="primary" shape="avatar-rounded" />
<Avatar placeholder="SC" color="success" shape="avatar-rounded" />
</div>
<div>
<Avatar icon="user" />
<Avatar icon="star" color="warning" />
<Avatar placeholder="ST" status="success" />
</div>
</div>
</div>
</div>
</div>
<!-- Icons Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Icons</h3>
</div>
<div class="card-body">
<div class="space-y">
<div>
<Icon name="home" />
<Icon name="user" />
<Icon name="settings" />
<Icon name="heart" />
<Icon name="star" />
<Icon name="bell" />
<Icon name="mail" />
<Icon name="phone" />
<Icon name="calendar" />
<Icon name="clock" />
<Icon name="map-pin" />
<Icon name="camera" />
<Icon name="plus" />
<Icon name="minus" />
<Icon name="edit" />
<Icon name="trash" />
<Icon name="download" />
<Icon name="upload" />
<Icon name="search" />
<Icon name="filter" />
<Icon name="refresh" />
<Icon name="share" />
<Icon name="copy" />
<Icon name="external-link" />
</div>
<div>
<span class="text-primary"><Icon name="check" /></span>
<span class="text-success"><Icon name="circle-check" /></span>
<span class="text-warning"><Icon name="alert-triangle" /></span>
<span class="text-danger"><Icon name="alert-circle" /></span>
</div>
</div>
</div>
</div>
</div>
<!-- Dropdowns Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Dropdowns</h3>
</div>
<div class="card-body">
<div class="btn-list">
<Dropdown mainBtn="Primary Dropdown" options="Action, Another action, Something else here" />
<Dropdown mainBtn="Secondary Dropdown" options="Edit, Copy, Delete" />
</div>
</div>
</div>
</div>
<!-- Interactive Elements Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Interactive Elements</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Accordion</h4>
<div class="mb-4">
<Accordion count={3} id="demo-accordion" />
</div>
</div>
<div class="col-md-6">
<h4>Spinners</h4>
<div class="mb-3">
<div class="d-flex flex-wrap gap-2">
<Spinner type="border" color="primary" />
<Spinner type="border" color="success" size="sm" />
<Spinner type="grow" color="warning" />
<Spinner type="grow" color="danger" size="sm" />
</div>
</div>
<h4>Rating</h4>
<div class="mb-3">
<Rating id="demo-rating" value="4" />
</div>
<h4>Steps</h4>
<div class="mb-3">
<Steps count={4} active="2" />
</div>
<div class="mb-3">
<Steps count={4} active="3" numbers />
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Status & Feedback Elements -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Status Elements</h3>
</div>
<div class="card-body">
<h4>Status Dots</h4>
<div class="mb-3">
<StatusDot color="success" />
<StatusDot color="warning" />
<StatusDot color="danger" />
<StatusDot color="info" animated />
</div>
<h4>Toast Notifications</h4>
<div class="mb-3">
<Toast toastId="demo-toast" show text="This is a sample toast message!" />
</div>
</div>
</div>
</div>
<!-- Enhanced Form Elements -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Enhanced Forms</h3>
</div>
<div class="card-body">
<h4>Input with Icons</h4>
<div class="mb-3">
<InputIcon placeholder="Search..." icon="search" />
</div>
<div class="mb-3">
<InputIcon placeholder="Loading..." loader />
</div>
<h4>Input Groups</h4>
<div class="mb-3">
<InputGroup prepend="@" placeholder="Username" />
</div>
<div class="mb-3">
<InputGroup append=".00" prepend="$" placeholder="Price" />
</div>
<h4>Range Slider</h4>
<div class="mb-3">
<Range id="demo-range" min={0} max={100} value="50" />
</div>
</div>
</div>
</div>
<!-- Tags & Labels -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Tags & Labels</h3>
</div>
<div class="card-body">
<h4>Tags</h4>
<div class="mb-3">
<Tag text="Primary Tag" icon="star" />
<Tag text="Success Tag" status="success" />
<Tag text="Warning Tag" status="warning" />
</div>
<h4>Ribbons</h4>
<div class="position-relative mb-4" style="height: 100px; background: #f8f9fa; border-radius: 8px;">
<Ribbon text="New" color="success" />
</div>
<div class="position-relative mb-3" style="height: 100px; background: #f8f9fa; border-radius: 8px;">
<Ribbon text="Sale" color="danger" top />
</div>
</div>
</div>
</div>
<!-- Media Elements -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Media Elements</h3>
</div>
<div class="card-body">
<h4>Flags</h4>
<div class="mb-3">
<div class="d-flex flex-wrap gap-2">
<Flag flag="us" />
<Flag flag="gb" />
<Flag flag="de" />
<Flag flag="fr" />
<Flag flag="pl" />
<Flag flag="es" />
<Flag flag="it" />
<Flag flag="nl" />
<Flag flag="ca" />
<Flag flag="au" />
</div>
</div>
<h4>Payment Icons</h4>
<div class="mb-3">
<div class="d-flex flex-wrap gap-2">
<Payment payment="visa" />
<Payment payment="mastercard" />
<Payment payment="paypal" />
<Payment payment="americanexpress" />
<Payment payment="applepay" />
<Payment payment="google-pay" />
<Payment payment="stripe" />
<Payment payment="discover" />
<Payment payment="jcb" />
<Payment payment="maestro" />
<Payment payment="dinersclub" />
<Payment payment="bitcoin" />
<Payment payment="ethereum" />
<Payment payment="klarna" />
<Payment payment="venmo" />
<Payment payment="square" />
</div>
</div>
</div>
</div>
</div>
<!-- Timeline Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Timeline</h3>
</div>
<div class="card-body">
<Timeline />
</div>
</div>
</div>
<!-- Empty State Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Empty State</h3>
</div>
<div class="card-body">
<Empty
title="No data found"
subtitle="Try adjusting your search or filter to find what you're looking for."
illustration="boy-girl.svg"
buttonText="Add new item"
buttonIcon="plus"
/>
</div>
</div>
</div>
<!-- Modal Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Modals</h3>
</div>
<div class="card-body">
<div class="btn-list">
<button class="btn" data-bs-toggle="modal" data-bs-target="#modal-demo">
Open Modal
</button>
<button class="btn" data-bs-toggle="modal" data-bs-target="#modal-success">
Success Modal
</button>
</div>
<!-- Demo Modal -->
<div class="modal modal-blur fade" id="modal-demo" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal Title</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>This is a sample modal dialog. You can put any content here.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn" data-bs-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
<!-- Success Modal -->
<div class="modal modal-blur fade" id="modal-success" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-sm modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-body text-center py-4">
<Icon name="circle-check" color="success" size="xl" class="mb-2" />
<h3>Success!</h3>
<div class="text-secondary">Your action was completed successfully.</div>
</div>
<div class="modal-footer">
<div class="w-100">
<div class="row">
<div class="col">
<button class="btn w-100" data-bs-dismiss="modal">Cancel</button>
</div>
<div class="col">
<button class="btn btn-success w-100" data-bs-dismiss="modal">OK</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Button Groups Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Button Groups</h3>
</div>
<div class="card-body">
<h4>Basic Button Group</h4>
<div class="btn-group mb-3" role="group">
<button type="button" class="btn">Left</button>
<button type="button" class="btn">Middle</button>
<button type="button" class="btn">Right</button>
</div>
<h4>Button Toolbar</h4>
<div class="btn-toolbar mb-3" role="toolbar">
<div class="btn-group me-2" role="group">
<button type="button" class="btn">1</button>
<button type="button" class="btn">2</button>
<button type="button" class="btn">3</button>
</div>
<div class="btn-group" role="group">
<button type="button" class="btn">4</button>
<button type="button" class="btn">5</button>
</div>
</div>
<h4>Vertical Button Group</h4>
<div class="btn-group-vertical" role="group">
<button type="button" class="btn">Top</button>
<button type="button" class="btn">Middle</button>
<button type="button" class="btn">Bottom</button>
</div>
</div>
</div>
</div>
<!-- Segmented Navigation Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Segmented Navigation</h3>
</div>
<div class="card-body">
<h4>Basic Segmented</h4>
<div class="mb-3">
<NavSegmented items="Home,Profile,Settings" />
</div>
<h4>With Icons</h4>
<div class="mb-3">
<NavSegmented icons="home,user,settings" />
</div>
<h4>With Emojis</h4>
<div class="mb-3">
<NavSegmented items="👦,👦🏿,👦🏾,👦🏽,👦🏼,👦🏻" />
</div>
<h4>With Icons and Text</h4>
<div class="mb-3">
<NavSegmented items="Home,Profile,Settings" icons="home,user,settings" />
</div>
</div>
</div>
</div>
<!-- Collapse Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Collapse</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Basic Collapse</h4>
<button class="btn" type="button" data-bs-toggle="collapse" data-bs-target="#collapseExample">
Toggle Collapse
</button>
<div class="collapse" id="collapseExample">
<div class="card card-body">
This is collapsed content that can be toggled. It's hidden by default and shown when the button is clicked.
</div>
</div>
</div>
<div class="col-md-6">
<h4>Multiple Targets</h4>
<div class="btn-list">
<button class="btn" type="button" data-bs-toggle="collapse" data-bs-target="#multiCollapseExample1">
Toggle First
</button>
<button class="btn" type="button" data-bs-toggle="collapse" data-bs-target="#multiCollapseExample2">
Toggle Second
</button>
</div>
<div class="collapse" id="multiCollapseExample1">
<div class="card card-body mb-2">
First collapsible content.
</div>
</div>
<div class="collapse" id="multiCollapseExample2">
<div class="card card-body">
Second collapsible content.
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Tooltips & Popovers Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Tooltips & Popovers</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Tooltips</h4>
<div class="btn-list">
<button class="btn" data-bs-toggle="tooltip" data-bs-placement="top" title="Tooltip on top">
Top
</button>
<button class="btn" data-bs-toggle="tooltip" data-bs-placement="right" title="Tooltip on right">
Right
</button>
<button class="btn" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Tooltip on bottom">
Bottom
</button>
<button class="btn" data-bs-toggle="tooltip" data-bs-placement="left" title="Tooltip on left">
Left
</button>
</div>
</div>
<div class="col-md-6">
<h4>Popovers</h4>
<div class="btn-list">
<button class="btn" data-bs-toggle="popover" data-bs-placement="top" title="Popover Title" data-bs-content="This is popover content on top">
Top Popover
</button>
<button class="btn" data-bs-toggle="popover" data-bs-placement="right" title="Popover Title" data-bs-content="This is popover content on right">
Right Popover
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- List Groups Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">List Groups</h3>
</div>
<div class="card-body p-0">
<div class="list-group list-group-flush">
<div class="list-group-item">
<Icon name="home" class="me-2" />
Home
</div>
<div class="list-group-item active">
<Icon name="star" class="me-2" />
Active item
</div>
<div class="list-group-item">
<Icon name="settings" class="me-2" />
Settings
</div>
<div class="list-group-item">
<Icon name="user" class="me-2" />
Profile
</div>
<div class="list-group-item disabled">
<Icon name="lock" class="me-2" />
Disabled item
</div>
</div>
</div>
</div>
</div>
<!-- Content Elements Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Content Elements</h3>
</div>
<div class="card-body">
<h4>Blockquote</h4>
<blockquote class="blockquote mb-4">
<p>This is a blockquote example with some sample text to demonstrate the styling.</p>
<footer class="blockquote-footer">
Someone famous in <cite title="Source Title">Source Title</cite>
</footer>
</blockquote>
<h4>Code Block</h4>
<pre class="mb-3"><code set:html={codeExample}></code></pre>
<h4>Inline Elements</h4>
<p>This paragraph contains <code>inline code</code>, <kbd>Ctrl + S</kbd> keyboard shortcut, and <mark>highlighted text</mark>.</p>
</div>
</div>
</div>
</div>
</DefaultLayout>
-884
View File
@@ -1,884 +0,0 @@
---
title: All Elements - Kitchen Sink
page-header: All Elements
page-menu: base.all-elements
page-libs: [nouislider, star-rating.js, tabler-flags, tabler-payments, tom-select]
layout: default
permalink: all-elements.html
---
<div class="row row-cards">
<!-- Typography Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Typography</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<h4>Heading 4</h4>
<h5>Heading 5</h5>
<h6>Heading 6</h6>
</div>
<div class="col-md-6">
<p class="lead">This is a lead paragraph with larger text.</p>
<p>This is a regular paragraph with <strong>bold text</strong>, <em>italic text</em>, and
<u>underlined text</u>.</p>
<p><small class="text-muted">This is small muted text.</small></p>
<p class="text-primary">Primary text color</p>
<p class="text-success">Success text color</p>
<p class="text-danger">Danger text color</p>
</div>
</div>
</div>
</div>
</div>
<!-- Buttons Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Buttons</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Standard Buttons</h4>
<div class="btn-list mb-3">
{% include "ui/button.html" text="Default" %}
{% include "ui/button.html" text="Primary" color="primary" icon="star" %}
{% include "ui/button.html" text="Secondary" color="secondary" %}
{% include "ui/button.html" text="Success" color="success" icon="check" %}
{% include "ui/button.html" text="Warning" color="warning" %}
{% include "ui/button.html" text="Danger" color="danger" icon="x" %}
{% include "ui/button.html" text="Info" color="info" %}
</div>
</div>
<div class="col-md-6">
<h4>Button Sizes</h4>
<div class="btn-list mb-3 align-items-start">
{% include "ui/button.html" text="Small" size="sm" %}
{% include "ui/button.html" text="Default"%}
{% include "ui/button.html" text="Large" size="lg" %}
</div>
<h4>Icon Buttons</h4>
<div class="btn-list mb-3 align-items-start">
{% include "ui/button.html" icon="heart" icon-only=true %}
{% include "ui/button.html" icon="star" icon-only=true %}
{% include "ui/button.html" icon="check" icon-only=true %}
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Cards Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Simple Card</h3>
</div>
<div class="card-body">
<p>This is a simple card with header and body content.</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card with Footer</h3>
</div>
<div class="card-body">
<p>This card includes a footer section.</p>
</div>
<div class="card-footer">
<div class="d-flex">
<a class="btn btn-link">Cancel</a>
<a class="btn btn-primary ms-auto">Save</a>
</div>
</div>
</div>
</div>
<!-- Alerts Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Alerts</h3>
</div>
<div class="card-body">
{% include "ui/alert.html" type="info" title="This is a primary alert with an icon." %}
{% include "ui/alert.html" type="success" title="This is a success alert message." %}
{% include "ui/alert.html" type="warning" title="This is a warning alert message." %}
{% include "ui/alert.html" type="danger" title="This is a danger alert message." %}
</div>
</div>
</div>
<!-- Badges Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Badges</h3>
</div>
<div class="card-body">
<div class="space-y">
<div>
{% include "ui/badge.html" text="Default" %}
{% include "ui/badge.html" text="Primary" color="primary" %}
{% include "ui/badge.html" text="Secondary" color="secondary" %}
{% include "ui/badge.html" text="Success" color="success" %}
{% include "ui/badge.html" text="Warning" color="warning" %}
{% include "ui/badge.html" text="Danger" color="danger" %}
</div>
<div>
{% include "ui/badge.html" text="With Icon" color="primary" icon="star" %}
{% include "ui/badge.html" text="Light Badge" color="primary" light=true %}
</div>
</div>
</div>
</div>
</div>
<!-- Progress Bars Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Progress Bars</h3>
</div>
<div class="card-body">
<div class="space-y">
<div>
{% include "ui/progress.html" value="25" %}
</div>
<div>
{% include "ui/progress.html" value="50" color="success" %}
</div>
<div>
{% include "ui/progress.html" value="75" color="warning" %}
</div>
<div>
{% include "ui/progress.html" value="90" color="danger" show-value=true %}
</div>
</div>
</div>
</div>
</div>
<!-- Form Elements Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Form Elements</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label class="form-label">Text Input</label>
<input type="text" class="form-control" placeholder="Enter text">
</div>
<div class="mb-3">
<label class="form-label">Email Input</label>
<input type="email" class="form-control" placeholder="Enter email">
</div>
<div class="mb-3">
<label class="form-label">Password Input</label>
<input type="password" class="form-control" placeholder="Enter password">
</div>
<div class="mb-3">
<label class="form-label">Select Dropdown</label>
{% include "ui/select.html" id="demo-select" values="Option 1,Option 2,Option 3" %}
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label class="form-label">Textarea</label>
<textarea class="form-control" rows="3" placeholder="Enter message"></textarea>
</div>
<div class="mb-3">
<label class="form-label">Checkboxes</label>
{% include "ui/form/check.html" title="Option 1" type="checkbox" %}
{% include "ui/form/check.html" title="Option 2" type="checkbox" checked=true %}
</div>
<div class="mb-3">
<label class="form-label">Radio Buttons</label>
{% include "ui/form/check.html" title="Option 1" type="radio" name="radio-demo" %}
{% include "ui/form/check.html" title="Option 2" type="radio" name="radio-demo" checked=true %}
</div>
<div class="mb-3">
<label class="form-label">Switch</label>
{% include "ui/form/check.html" title="Enable notifications" switch=true %}
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Navigation Elements -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Navigation Elements</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Tabs</h4>
<div class="mb-3">
{% include "ui/nav.html" tabs=true class="mb-4" %}
</div>
<h4>Pills Navigation</h4>
<div class="mb-3">
{% include "ui/nav.html" pills=true class="mb-4" %}
</div>
<h4>Breadcrumb</h4>
{% include "ui/breadcrumb.html" pages="Home,Library,Data" home-icon=true %}
</div>
<div class="col-md-6">
<h4>Pagination</h4>
{% include "ui/pagination.html" count="5" active-item="2" class="mb-4" %}
<h4>Pagination with Text</h4>
{% include "ui/pagination.html" count="3" text=true %}
</div>
</div>
</div>
</div>
</div>
<!-- Lists Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Lists</h3>
</div>
<div class="card-body">
<h4>Unordered List</h4>
<ul>
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
</ul>
<h4>Ordered List</h4>
<ol>
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
</ol>
</div>
</div>
</div>
<!-- Table Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Table</h3>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-vcenter">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>John Doe</td>
<td>john@example.com</td>
<td>{% include "ui/badge.html" text="Active" color="success" %}</td>
</tr>
<tr>
<td>Jane Smith</td>
<td>jane@example.com</td>
<td>{% include "ui/badge.html" text="Pending" color="warning" %}</td>
</tr>
<tr>
<td>Bob Johnson</td>
<td>bob@example.com</td>
<td>{% include "ui/badge.html" text="Inactive" color="danger" %}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Avatars Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Avatars</h3>
</div>
<div class="card-body">
<div class="space-y">
<div>
{% include "ui/avatar.html" placeholder="JD" size="sm" %}
{% include "ui/avatar.html" placeholder="JS" %}
{% include "ui/avatar.html" placeholder="BJ" size="lg" %}
{% include "ui/avatar.html" placeholder="AB" size="xl" %}
</div>
<div>
{% include "ui/avatar.html" placeholder="RD" shape="avatar-rounded" %}
{% include "ui/avatar.html" placeholder="PR" color="primary" shape="avatar-rounded" %}
{% include "ui/avatar.html" placeholder="SC" color="success" shape="avatar-rounded" %}
</div>
<div>
{% include "ui/avatar.html" icon="user" %}
{% include "ui/avatar.html" icon="star" color="warning" %}
{% include "ui/avatar.html" placeholder="ST" status="success" %}
</div>
</div>
</div>
</div>
</div>
<!-- Icons Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Icons</h3>
</div>
<div class="card-body">
<div class="space-y">
<div>
{% include "ui/icon.html" icon="home" %}
{% include "ui/icon.html" icon="user" %}
{% include "ui/icon.html" icon="settings" %}
{% include "ui/icon.html" icon="heart" %}
{% include "ui/icon.html" icon="star" %}
{% include "ui/icon.html" icon="bell" %}
{% include "ui/icon.html" icon="mail" %}
{% include "ui/icon.html" icon="phone" %}
{% include "ui/icon.html" icon="calendar" %}
{% include "ui/icon.html" icon="clock" %}
{% include "ui/icon.html" icon="map-pin" %}
{% include "ui/icon.html" icon="camera" %}
{% include "ui/icon.html" icon="plus" %}
{% include "ui/icon.html" icon="minus" %}
{% include "ui/icon.html" icon="edit" %}
{% include "ui/icon.html" icon="trash" %}
{% include "ui/icon.html" icon="download" %}
{% include "ui/icon.html" icon="upload" %}
{% include "ui/icon.html" icon="search" %}
{% include "ui/icon.html" icon="filter" %}
{% include "ui/icon.html" icon="refresh" %}
{% include "ui/icon.html" icon="share" %}
{% include "ui/icon.html" icon="copy" %}
{% include "ui/icon.html" icon="external-link" %}
</div>
<div>
<span class="text-primary">{% include "ui/icon.html" icon="check" %}</span>
<span class="text-success">{% include "ui/icon.html" icon="circle-check" %}</span>
<span class="text-warning">{% include "ui/icon.html" icon="alert-triangle" %}</span>
<span class="text-danger">{% include "ui/icon.html" icon="alert-circle" %}</span>
</div>
</div>
</div>
</div>
</div>
<!-- Dropdowns Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Dropdowns</h3>
</div>
<div class="card-body">
<div class="btn-list">
{% include "ui/dropdown.html" main-btn="Primary Dropdown" options="Action, Another action, Something else
here" %}
{% include "ui/dropdown.html" main-btn="Secondary Dropdown" options="Edit, Copy, Delete" %}
</div>
</div>
</div>
</div>
<!-- Interactive Elements Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Interactive Elements</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Accordion</h4>
<div class="mb-4">
{% include "ui/accordion.html" count="3" id="demo-accordion" %}
</div>
</div>
<div class="col-md-6">
<h4>Spinners</h4>
<div class="mb-3">
<div class="d-flex flex-wrap gap-2">
{% include "ui/spinner.html" type="border" color="primary" %}
{% include "ui/spinner.html" type="border" color="success" size="sm" %}
{% include "ui/spinner.html" type="grow" color="warning" %}
{% include "ui/spinner.html" type="grow" color="danger" size="sm" %}
</div>
</div>
<h4>Rating</h4>
<div class="mb-3">
{% include "ui/rating.html" id="demo-rating" value="4" %}
</div>
<h4>Steps</h4>
<div class="mb-3">
{% include "ui/steps.html" count="4" active="2" %}
</div>
<div class="mb-3">
{% include "ui/steps.html" count="4" active="3" numbers=true %}
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Status & Feedback Elements -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Status Elements</h3>
</div>
<div class="card-body">
<h4>Status Dots</h4>
<div class="mb-3">
{% include "ui/status-dot.html" color="success" %}
{% include "ui/status-dot.html" color="warning" %}
{% include "ui/status-dot.html" color="danger" %}
{% include "ui/status-dot.html" color="info" animated=true %}
</div>
<h4>Toast Notifications</h4>
<div class="mb-3">
{% include "ui/toast.html" toast-id="demo-toast" show=true text="This is a sample toast message!" %}
</div>
</div>
</div>
</div>
<!-- Enhanced Form Elements -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Enhanced Forms</h3>
</div>
<div class="card-body">
<h4>Input with Icons</h4>
<div class="mb-3">
{% include "ui/form/input-icon.html" placeholder="Search..." icon="search" %}
</div>
<div class="mb-3">
{% include "ui/form/input-icon.html" placeholder="Loading..." loader=true %}
</div>
<h4>Input Groups</h4>
<div class="mb-3">
{% include "ui/form/input-group.html" prepend="@" placeholder="Username" %}
</div>
<div class="mb-3">
{% include "ui/form/input-group.html" append=".00" prepend="$" placeholder="Price" %}
</div>
<h4>Range Slider</h4>
<div class="mb-3">
{% include "ui/range.html" id="demo-range" min="0" max="100" value="50" %}
</div>
</div>
</div>
</div>
<!-- Tags & Labels -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Tags & Labels</h3>
</div>
<div class="card-body">
<h4>Tags</h4>
<div class="mb-3">
{% include "ui/tag.html" text="Primary Tag" icon="star" %}
{% include "ui/tag.html" text="Success Tag" status="success" %}
{% include "ui/tag.html" text="Warning Tag" status="warning" %}
</div>
<h4>Ribbons</h4>
<div class="position-relative mb-4" style="height: 100px; background: #f8f9fa; border-radius: 8px;">
{% include "ui/ribbon.html" text="New" color="success" %}
</div>
<div class="position-relative mb-3" style="height: 100px; background: #f8f9fa; border-radius: 8px;">
{% include "ui/ribbon.html" text="Sale" color="danger" top=true %}
</div>
</div>
</div>
</div>
<!-- Media Elements -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Media Elements</h3>
</div>
<div class="card-body">
<h4>Flags</h4>
<div class="mb-3">
<div class="d-flex flex-wrap gap-2">
{% include "ui/flag.html" flag="us" %}
{% include "ui/flag.html" flag="gb" %}
{% include "ui/flag.html" flag="de" %}
{% include "ui/flag.html" flag="fr" %}
{% include "ui/flag.html" flag="pl" %}
{% include "ui/flag.html" flag="es" %}
{% include "ui/flag.html" flag="it" %}
{% include "ui/flag.html" flag="nl" %}
{% include "ui/flag.html" flag="ca" %}
{% include "ui/flag.html" flag="au" %}
</div>
</div>
<h4>Payment Icons</h4>
<div class="mb-3">
<div class="d-flex flex-wrap gap-2">
{% include "ui/payment.html" payment="visa" %}
{% include "ui/payment.html" payment="mastercard" %}
{% include "ui/payment.html" payment="paypal" %}
{% include "ui/payment.html" payment="americanexpress" %}
{% include "ui/payment.html" payment="applepay" %}
{% include "ui/payment.html" payment="google-pay" %}
{% include "ui/payment.html" payment="stripe" %}
{% include "ui/payment.html" payment="discover" %}
{% include "ui/payment.html" payment="jcb" %}
{% include "ui/payment.html" payment="maestro" %}
{% include "ui/payment.html" payment="dinersclub" %}
{% include "ui/payment.html" payment="bitcoin" %}
{% include "ui/payment.html" payment="ethereum" %}
{% include "ui/payment.html" payment="klarna" %}
{% include "ui/payment.html" payment="venmo" %}
{% include "ui/payment.html" payment="square" %}
</div>
</div>
</div>
</div>
</div>
<!-- Timeline Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Timeline</h3>
</div>
<div class="card-body">
{% include "ui/timeline.html" %}
</div>
</div>
</div>
<!-- Empty State Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Empty State</h3>
</div>
<div class="card-body">
{% include "ui/empty.html" title="No data found" subtitle="Try adjusting your search or filter to find what
you're looking for." illustration="boy-girl.svg" button-text="Add new item" button-icon="plus" %}
</div>
</div>
</div>
<!-- Modal Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Modals</h3>
</div>
<div class="card-body">
<div class="btn-list">
<button class="btn" data-bs-toggle="modal" data-bs-target="#modal-demo">
Open Modal
</button>
<button class="btn" data-bs-toggle="modal" data-bs-target="#modal-success">
Success Modal
</button>
</div>
<!-- Demo Modal -->
<div class="modal modal-blur fade" id="modal-demo" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal Title</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>This is a sample modal dialog. You can put any content here.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn" data-bs-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
<!-- Success Modal -->
<div class="modal modal-blur fade" id="modal-success" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-sm modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-body text-center py-4">
{% include "ui/icon.html" icon="circle-check" color="success" size="xl" class="mb-2" %}
<h3>Success!</h3>
<div class="text-secondary">Your action was completed successfully.</div>
</div>
<div class="modal-footer">
<div class="w-100">
<div class="row">
<div class="col">
<button class="btn w-100" data-bs-dismiss="modal">Cancel</button>
</div>
<div class="col">
<button class="btn btn-success w-100" data-bs-dismiss="modal">OK</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Button Groups Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Button Groups</h3>
</div>
<div class="card-body">
<h4>Basic Button Group</h4>
<div class="btn-group mb-3" role="group">
<button type="button" class="btn">Left</button>
<button type="button" class="btn">Middle</button>
<button type="button" class="btn">Right</button>
</div>
<h4>Button Toolbar</h4>
<div class="btn-toolbar mb-3" role="toolbar">
<div class="btn-group me-2" role="group">
<button type="button" class="btn">1</button>
<button type="button" class="btn">2</button>
<button type="button" class="btn">3</button>
</div>
<div class="btn-group" role="group">
<button type="button" class="btn">4</button>
<button type="button" class="btn">5</button>
</div>
</div>
<h4>Vertical Button Group</h4>
<div class="btn-group-vertical" role="group">
<button type="button" class="btn">Top</button>
<button type="button" class="btn">Middle</button>
<button type="button" class="btn">Bottom</button>
</div>
</div>
</div>
</div>
<!-- Segmented Navigation Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Segmented Navigation</h3>
</div>
<div class="card-body">
<h4>Basic Segmented</h4>
<div class="mb-3">
{% include "ui/nav-segmented.html" items="Home,Profile,Settings" %}
</div>
<h4>With Icons</h4>
<div class="mb-3">
{% include "ui/nav-segmented.html" icons="home,user,settings" %}
</div>
<h4>With Emojis</h4>
<div class="mb-3">
{% include "ui/nav-segmented.html" items="👦,👦🏿,👦🏾,👦🏽,👦🏼,👦🏻" %}
</div>
<h4>With Icons and Text</h4>
<div class="mb-3">
{% include "ui/nav-segmented.html" items="Home,Profile,Settings" icons="home,user,settings" %}
</div>
</div>
</div>
</div>
<!-- Collapse Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Collapse</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Basic Collapse</h4>
<button class="btn" type="button" data-bs-toggle="collapse" data-bs-target="#collapseExample">
Toggle Collapse
</button>
<div class="collapse" id="collapseExample">
<div class="card card-body">
This is collapsed content that can be toggled. It's hidden by default and shown when the button is clicked.
</div>
</div>
</div>
<div class="col-md-6">
<h4>Multiple Targets</h4>
<div class="btn-list">
<button class="btn" type="button" data-bs-toggle="collapse" data-bs-target="#multiCollapseExample1">
Toggle First
</button>
<button class="btn" type="button" data-bs-toggle="collapse" data-bs-target="#multiCollapseExample2">
Toggle Second
</button>
</div>
<div class="collapse" id="multiCollapseExample1">
<div class="card card-body mb-2">
First collapsible content.
</div>
</div>
<div class="collapse" id="multiCollapseExample2">
<div class="card card-body">
Second collapsible content.
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Tooltips & Popovers Section -->
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Tooltips & Popovers</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Tooltips</h4>
<div class="btn-list">
<button class="btn" data-bs-toggle="tooltip" data-bs-placement="top" title="Tooltip on top">
Top
</button>
<button class="btn" data-bs-toggle="tooltip" data-bs-placement="right" title="Tooltip on right">
Right
</button>
<button class="btn" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Tooltip on bottom">
Bottom
</button>
<button class="btn" data-bs-toggle="tooltip" data-bs-placement="left" title="Tooltip on left">
Left
</button>
</div>
</div>
<div class="col-md-6">
<h4>Popovers</h4>
<div class="btn-list">
<button class="btn" data-bs-toggle="popover" data-bs-placement="top" title="Popover Title" data-bs-content="This is popover content on top">
Top Popover
</button>
<button class="btn" data-bs-toggle="popover" data-bs-placement="right" title="Popover Title" data-bs-content="This is popover content on right">
Right Popover
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- List Groups Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">List Groups</h3>
</div>
<div class="card-body p-0">
<div class="list-group list-group-flush">
<div class="list-group-item">
{% include "ui/icon.html" icon="home" class="me-2" %}
Home
</div>
<div class="list-group-item active">
{% include "ui/icon.html" icon="star" class="me-2" %}
Active item
</div>
<div class="list-group-item">
{% include "ui/icon.html" icon="settings" class="me-2" %}
Settings
</div>
<div class="list-group-item">
{% include "ui/icon.html" icon="user" class="me-2" %}
Profile
</div>
<div class="list-group-item disabled">
{% include "ui/icon.html" icon="lock" class="me-2" %}
Disabled item
</div>
</div>
</div>
</div>
</div>
<!-- Content Elements Section -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Content Elements</h3>
</div>
<div class="card-body">
<h4>Blockquote</h4>
<blockquote class="blockquote mb-4">
<p>This is a blockquote example with some sample text to demonstrate the styling.</p>
<footer class="blockquote-footer">
Someone famous in <cite title="Source Title">Source Title</cite>
</footer>
</blockquote>
<h4>Code Block</h4>
<pre class="mb-3"><code>// JavaScript example
function greetUser(name) {
console.log(`Hello, ${name}!`);
return true;
}</code></pre>
<h4>Inline Elements</h4>
<p>This paragraph contains <code>inline code</code>, <kbd>Ctrl + S</kbd> keyboard shortcut, and <mark>highlighted text</mark>.</p>
</div>
</div>
</div>
</div>
+10
View File
@@ -0,0 +1,10 @@
---
// Port of preview/pages/auth-lock.html (layout: single; the front matter
// title really is "Forgot password" in the Liquid source)
import SingleLayout from '@shared/layouts/SingleLayout.astro';
import AuthLockCard from '@shared/components/cards/AuthLockCard.astro';
---
<SingleLayout title="Forgot password">
<AuthLockCard />
</SingleLayout>
-8
View File
@@ -1,8 +0,0 @@
---
title: Forgot password
layout: single
page-menu: base.authentication.auth-lock
permalink: auth-lock.html
---
{% include "cards/auth-lock.html" show-header="1" %}
+168
View File
@@ -0,0 +1,168 @@
---
// Port of preview/pages/avatars.html (layout: default)
// Note: the `description` front matter key is inert in the dev build (no
// <meta name="description"> in the reference output), so it is not ported.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Avatar from '@shared/components/ui/Avatar.astro';
import AvatarUpload from '@shared/components/ui/AvatarUpload.astro';
import people from '@data/people.json';
import { site } from '@shared/lib/site';
const iconIcons = ['user', 'settings', 'car', 'balloon', 'users', 'users-group', 'apps', 'ghost'];
// Liquid: {% for color in site.colors %} — the iterated keys match site.themeColors
// (blue..cyan), confirmed against the reference output.
const colors = site.themeColors;
// equivalent of the first_letters filter
const firstLetters = (s: string) => s.split(' ').map((w) => w.charAt(0)).join('');
const people8 = people.slice(0, 8);
const people5 = people.slice(0, 5);
const sizes = ['xxs', 'xs', 'sm', 'md', 'lg', 'xl'];
const listSizes = ['xxs', 'xs', 'sm', 'md', 'lg'];
const uploadSizes = ['xxs', 'xs', 'sm', 'md', 'lg', 'xl', '2xl'];
const statusColors = ['red', 'green', 'blue', 'yellow', 'secondary'];
const brands = ['netflix', 'amazon', 'messenger', 'figma', 'twitch'];
---
<DefaultLayout title="Avatars" pageMenu="base.avatars" pageHeader="Avatars">
<div class="row row-cards">
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Default avatar</h2>
<Avatar />
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar with icon</h2>
<div class="avatar-list">
{iconIcons.map((icon) => <Avatar icon={icon} />)}
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar with icon</h2>
<div class="avatar-list">
{colors.map((color) => <Avatar icon="user" color={color} />)}
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Simple avatar</h2>
<div class="avatar-list">
{people8.map((person) => <Avatar person={person} />)}
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar placeholder</h2>
<div class="avatar-list">
{people8.map((person) => <Avatar placeholder={firstLetters(person.full_name)} />)}
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar shapes</h2>
<div class="avatar-list">
<Avatar />
<Avatar class="rounded-circle" />
<Avatar class="rounded-0" />
</div>
</div>
</div>
</div>
<div class="col-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar sizes</h2>
<div class="row">
<div class="col-6">
<div class="avatar-list">
{sizes.map((size) => <Avatar size={size} />)}
</div>
</div>
<div class="col-6">
<div class="avatar-list">
{sizes.map((size) => <Avatar placeholder="PK" size={size} />)}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar lists</h2>
<div class="row g-3">
{
listSizes.map((size) => (
<>
<div class="col-6">
<div class={`avatar-list avatar-list-stacked avatar-list-${size}`}>
{people5.map((person) => (
<Avatar person={person} />
))}
<Avatar icon="plus" link />
</div>
</div>
<div class="col-6">
<div class={`avatar-list avatar-list-stacked avatar-list-${size}`}>
{people5.map((person) => (
<Avatar person={person} class="rounded-circle" />
))}
<Avatar icon="plus" link class="rounded-circle" />
</div>
</div>
</>
))
}
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar placeholder</h2>
{uploadSizes.map((size) => <AvatarUpload size={size} />)}
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar statuses</h2>
{statusColors.map((color, i) => <Avatar personId={i + 1} class="rounded-circle" status={color} />)}
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar brands</h2>
{brands.map((brand, i) => <Avatar personId={i + 1} brand={brand} />)}
</div>
</div>
</div>
</div>
</DefaultLayout>
-173
View File
@@ -1,173 +0,0 @@
---
title: Avatars
layout: default
description: A page showcasing different avatar styles and examples.
permalink: /avatars.html
page-menu: base.avatars
page-header: Avatars
---
<div class="row row-cards">
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Default avatar</h2>
{% include "ui/avatar.html" %}
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar with icon</h2>
{% assign icon-icons = "user,settings,car,balloon,users,users-group,apps,ghost" | split: "," %}
<div class="avatar-list">
{% for icon in icon-icons %}
{% include "ui/avatar.html" icon=icon %}
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar with icon</h2>
<div class="avatar-list">
{% for color in site.colors %}
{% include "ui/avatar.html" icon="user" color=color[0] %}
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Simple avatar</h2>
<div class="avatar-list">
{% for person in people limit: 8 -%}
{% include "ui/avatar.html" person=person %}
{%- endfor %}
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar placeholder</h2>
<div class="avatar-list">
{% for person in people limit: 8 %}
{% assign placeholder = person.full_name | first_letters %}
{% include "ui/avatar.html" placeholder=placeholder %}
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar shapes</h2>
<div class="avatar-list">
{% include "ui/avatar.html" %}
{% include "ui/avatar.html" class="rounded-circle" %}
{% include "ui/avatar.html" class="rounded-0" %}
</div>
</div>
</div>
</div>
<div class="col-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar sizes</h2>
<div class="row">
<div class="col-6">
<div class="avatar-list">
{% include "ui/avatar.html" size="xxs" %}
{% include "ui/avatar.html" size="xs" %}
{% include "ui/avatar.html" size="sm" %}
{% include "ui/avatar.html" size="md" %}
{% include "ui/avatar.html" size="lg" %}
{% include "ui/avatar.html" size="xl" %}
</div>
</div>
<div class="col-6">
<div class="avatar-list">
{% include "ui/avatar.html" placeholder="PK" size="xxs" %}
{% include "ui/avatar.html" placeholder="PK" size="xs" %}
{% include "ui/avatar.html" placeholder="PK" size="sm" %}
{% include "ui/avatar.html" placeholder="PK" size="md" %}
{% include "ui/avatar.html" placeholder="PK" size="lg" %}
{% include "ui/avatar.html" placeholder="PK" size="xl" %}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar lists</h2>
<div class="row g-3">
{% assign sizes = "xxs,xs,sm,md,lg" | split: "," %}
{% for size in sizes %}
<div class="col-6">
<div class="avatar-list avatar-list-stacked avatar-list-{{ size }}">
{% for person in people limit: 5 %}
{% include "ui/avatar.html" person=person %}
{% endfor %}
{% include "ui/avatar.html" icon="plus" link %}
</div>
</div>
<div class="col-6">
<div class="avatar-list avatar-list-stacked avatar-list-{{ size }}">
{% for person in people limit: 5 %}
{% include "ui/avatar.html" person=person class="rounded-circle" %}
{% endfor %}
{% include "ui/avatar.html" icon="plus" link class="rounded-circle" %}
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar placeholder</h2>
{% assign sizes = "xxs,xs,sm,md,lg,xl,2xl" | split: "," %}
{% for size in sizes %}
{% include "ui/avatar-upload.html" size=size %}
{% endfor %}
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar statuses</h2>
{% assign colors = "red,green,blue,yellow,secondary" | split: "," %}
{% for color in colors %}
{% include "ui/avatar.html" person-id=forloop.index class="rounded-circle" status=color %}
{% endfor %}
</div>
</div>
</div>
<div class="col-4">
<div class="card">
<div class="card-body">
<h2 class="card-title">Avatar brands</h2>
{% assign brands = "netflix,amazon,messenger,figma,twitch" | split: "," %}
{% for brand in brands %}
{% include "ui/avatar.html" person-id=forloop.index brand=brand %}
{% endfor %}
</div>
</div>
</div>
</div>
+202
View File
@@ -0,0 +1,202 @@
---
// Port of preview/pages/badges.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Icon from '@shared/components/Icon.astro';
import DropdownMenu from '@shared/components/ui/DropdownMenu.astro';
import site from '@data/site.json';
// Liquid: colors = ['default'] + site.colors keys + ['dark', 'light']
const colors = ['default', ...Object.keys(site.colors), 'dark', 'light'];
const sizes = ['sm', 'md', 'lg'];
// Liquid uc_first filter
const ucFirst = (value: string) => value.charAt(0).toUpperCase() + value.slice(1);
---
<DefaultLayout title="Badges" pageHeader="Badges" pageMenu="base.badges">
<div class="row row-cards">
<div class="col-4">
<div class="row row-cards">
<div class="col-12">
<div class="card">
<div class="card-body">
<h1>Example heading <span class="badge">New</span></h1>
<h2>Example heading <span class="badge">New</span></h2>
<h3>Example heading <span class="badge">New</span></h3>
<h4>Example heading <span class="badge">New</span></h4>
<h5>Example heading <span class="badge">New</span></h5>
<h6>Example heading <span class="badge">New</span></h6>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Badge sizes</h3>
<div class="space-y">
{
sizes.map((size) => (
<div class="badges-list">
<span class={`badge${size !== 'md' ? ` badge-${size}` : ''}`}>Default</span>
<span class={`badge${size !== 'md' ? ` badge-${size}` : ''}`}>
<Icon name="check" /> Left icon
</span>
<span class={`badge${size !== 'md' ? ` badge-${size}` : ''}`}>
Right icon<Icon name="arrow-right" />
</span>
<span class={`badge badge-icononly${size !== 'md' ? ` badge-${size}` : ''}`}>
<Icon name="star" type="filled" />
</span>
</div>
))
}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Positioned badges</h3>
<div class="btn-list">
<button type="button" class="btn">Notifications <span class="badge text-bg-secondary ms-2">4</span></button>
<button type="button" class="btn">
Inbox
<span class="badge bg-red badge-notification text-red-fg">
9+
<span class="visually-hidden">unread messages</span>
</span>
</button>
<button type="button" class="btn">
Profile
<span class="badge badge-dot bg-red badge-notification"></span>
</button>
<button type="button" class="btn">
Settings
<span class="badge badge-dot bg-red badge-notification badge-blink"></span>
</button>
<button type="button" class="btn btn-icon">
<Icon name="bell" />
<span class="badge badge-dot bg-red badge-notification badge-blink"></span>
</button>
<button type="button" class="btn btn-icon btn-action">
<Icon name="bell" />
<span class="badge badge-dot bg-red badge-notification"></span>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-8">
<div class="row row-cards">
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Basic badges</h3>
<div class="badges-list">
{colors.map((color) => <span class={`badge bg-${color} text-${color}-fg`}>{ucFirst(color)}</span>)}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Light badges</h3>
<div class="badges-list">
{colors.map((color) => <span class={`badge bg-${color}-lt`}>{ucFirst(color)}</span>)}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Outline badges</h3>
<div class="badges-list">
{colors.map((color) => <span class={`badge badge-outline text-${color}`}>{ucFirst(color)}</span>)}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Badges with icons</h3>
<div class="badges-list">
{
colors.map((color) => (
<span class={`badge bg-${color} text-${color}-fg`}>
{' '}
<Icon name="star" type="filled" /> {ucFirst(color)}{' '}
</span>
))
}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-6 col-lg-3"><DropdownMenu show badge arrow /></div>
<div class="col-sm-6 col-lg-9">
<div class="row row-cards">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="btn-list">
{
colors.map((color, index) => (
<button class="btn">
{ucFirst(color)} badge <span class={`badge bg-${color} text-${color}-fg ms-2`}>{index + 1}</span>
</button>
))
}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="btn-list">
{
colors.map((color, index) => (
<button class="btn position-relative">
{ucFirst(color)} badge{' '}
<span class={`badge bg-${color} text-${color}-fg badge-notification badge-pill`}>{index + 1}</span>
</button>
))
}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="btn-list">
{
colors.map((color) => (
<button class="btn position-relative">
{ucFirst(color)} badge <span class={`badge bg-${color} badge-notification badge-blink`} />
</button>
))
}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</DefaultLayout>
-191
View File
@@ -1,191 +0,0 @@
---
title: Badges
page-header: Badges
page-menu: base.badges
layout: default
permalink: badges.html
---
{% assign colors = "" | split: "," %} {% assign colors = colors | push: "default" %} {% for color in site.colors %} {%
assign colors = colors | push: color[0]
%} {% endfor %} {% assign colors = colors | push: "dark" | push: "light" %}
<div class="row row-cards">
<div class="col-4">
<div class="row row-cards">
<div class="col-12">
<div class="card">
<div class="card-body">
<h1>Example heading <span class="badge">New</span></h1>
<h2>Example heading <span class="badge">New</span></h2>
<h3>Example heading <span class="badge">New</span></h3>
<h4>Example heading <span class="badge">New</span></h4>
<h5>Example heading <span class="badge">New</span></h5>
<h6>Example heading <span class="badge">New</span></h6>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Badge sizes</h3>
<div class="space-y">
{% assign sizes = "sm,md,lg" | split: "," %} {% for size in sizes %}
<div class="badges-list">
<span class="badge{% if size != 'md' %} badge-{{ size }}{% endif %}">Default</span>
<span class="badge{% if size != 'md' %} badge-{{ size }}{% endif %}">{% include "ui/icon.html"
icon="check" %} Left icon
</span>
<span class="badge{% if size != 'md' %} badge-{{ size }}{% endif %}">Right icon{% include "ui/icon.html"
icon="arrow-right" %}
</span>
<span class="badge badge-icononly{% if size != 'md' %} badge-{{ size }}{% endif %}">{% include
"ui/icon.html" icon="star" type="filled" %}
</span>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Positioned badges</h3>
<div class="btn-list">
<button type="button" class="btn">Notifications <span
class="badge text-bg-secondary ms-2">4</span></button>
<button type="button" class="btn">
Inbox
<span class="badge bg-red badge-notification text-red-fg">
9+
<span class="visually-hidden">unread messages</span>
</span>
</button>
<button type="button" class="btn">
Profile
<span class="badge badge-dot bg-red badge-notification"></span>
</button>
<button type="button" class="btn">
Settings
<span class="badge badge-dot bg-red badge-notification badge-blink"></span>
</button>
<button type="button" class="btn btn-icon">
{% include "ui/icon.html" icon="bell" %}
<span class="badge badge-dot bg-red badge-notification badge-blink"></span>
</button>
<button type="button" class="btn btn-icon btn-action">
{% include "ui/icon.html" icon="bell" %}
<span class="badge badge-dot bg-red badge-notification"></span>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-8">
<div class="row row-cards">
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Basic badges</h3>
<div class="badges-list">
{% for color in colors %}
<span class="badge bg-{{ color }} text-{{ color }}-fg">{{ color | uc_first }}</span>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Light badges</h3>
<div class="badges-list">
{% for color in colors %}
<span class="badge bg-{{ color }}-lt">{{ color | uc_first }}</span>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Outline badges</h3>
<div class="badges-list">
{% for color in colors %}
<span class="badge badge-outline text-{{ color }}">{{ color | uc_first }}</span>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<h3 class="card-title">Badges with icons</h3>
<div class="badges-list">
{% for color in colors %}
<span class="badge bg-{{ color }} text-{{ color }}-fg"> {% include "ui/icon.html" icon="star"
type="filled" %} {{ color | uc_first }} </span>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-6 col-lg-3">{% include "ui/dropdown-menu.html" show=true badge=true arrow=true %}</div>
<div class="col-sm-6 col-lg-9">
<div class="row row-cards">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="btn-list">
{% for color in colors %}
<button class="btn">{{ color | uc_first }} badge <span
class="badge bg-{{ color }} text-{{ color }}-fg ms-2">{{ forloop.index }}</span></button>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="btn-list">
{% for color in colors %}
<button class="btn position-relative">
{{ color | uc_first }} badge <span
class="badge bg-{{ color }} text-{{ color }}-fg badge-notification badge-pill">{{ forloop.index }}</span>
</button>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="btn-list">
{% for color in colors %}
<button class="btn position-relative">
{{ color | uc_first }} badge <span class="badge bg-{{ color }} badge-notification badge-blink"></span>
</button>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
+11
View File
@@ -0,0 +1,11 @@
---
// Port of preview/pages/blank.html (layout: default). The `blank: true`
// front matter is inert in the Liquid templates (never referenced) — the
// empty page header comes from the missing `page-header` key.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Empty from '@shared/components/ui/Empty.astro';
---
<DefaultLayout title="Blank page" pageMenu="base.blank" containerCentered>
<Empty buttonText="Add your first client" buttonIcon="plus" illustration="computer-fix.svg" />
</DefaultLayout>
-10
View File
@@ -1,10 +0,0 @@
---
title: Blank page
blank: true
page-menu: base.blank
page-container-centered: true
layout: default
permalink: blank.html
---
{% include "ui/empty.html" button-text="Add your first client" button-icon="plus" illustration="computer-fix.svg" %}
+210
View File
@@ -0,0 +1,210 @@
---
// Port of preview/pages/buttons.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Icon from '@shared/components/Icon.astro';
import Button from '@shared/components/Button.astro';
import site from '@data/site.json';
type ColorEntry = [string, { title: string; icon?: string }];
// Liquid iterates the site.json objects as [key, value] pairs.
// themeColors/colors entries have no icon — ui/icon.html renders nothing there.
const themeColors = Object.entries(site.themeColors) as ColorEntry[];
const colors = Object.entries(site.colors) as ColorEntry[];
const socialColors = Object.entries(site.socialColors) as ColorEntry[];
const actions = ['edit', 'copy', 'settings', 'clipboard', 'x'];
const sizes = ['sm', 'md', 'lg', 'xl'];
---
<DefaultLayout title="Buttons" pageHeader="Buttons" pageMenu="base.buttons">
<div class="row row-cards">
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Standard Buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{
themeColors.map(([name, color]) => (
<a class={`btn btn-${name}`}>{color.icon && <Icon name={color.icon} />} {color.title}</a>
))
}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Outline Buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{
themeColors.map(([name, color]) => (
<a class={`btn btn-outline btn-${name}`}>{color.icon && <Icon name={color.icon} />} {color.title}</a>
))
}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Ghost Buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{
themeColors.map(([name, color]) => (
<a class={`btn btn-ghost btn-${name}`}>{color.icon && <Icon name={color.icon} />} {color.title}</a>
))
}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Square Buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{
themeColors.map(([name, color]) => (
<a class={`btn btn-square btn-${name}`}>{color.icon && <Icon name={color.icon} />} {color.title}</a>
))
}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Pill Buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{
themeColors.map(([name, color]) => (
<a class={`btn btn-pill btn-${name}`}>{color.icon && <Icon name={color.icon} />} {color.title}</a>
))
}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Extra colors</h3>
</div>
<div class="card-body">
<div class="btn-list">
{
colors.map(([name, color]) => (
<a class={`btn btn-${name}`}>{color.icon && <Icon name={color.icon} />} {color.title}</a>
))
}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Icon buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{
socialColors.map(([name, app]) => (
<a class={`btn btn-icon btn-${name}`}>{app.icon && <Icon name={app.icon} />}</a>
))
}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Social colors</h3>
</div>
<div class="card-body">
<div class="btn-list">
{
socialColors.map(([name, app]) => (
<a class={`btn btn-${name}`}>{app.icon && <Icon name={app.icon} />} {app.title}</a>
))
}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Action buttons</h3>
</div>
<div class="card-body">
<div class="btn-actions">
{
actions.map((action) => (
<a class="btn btn-action">
<Icon name={action} />
</a>
))
}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Buttons with icon</h3>
</div>
<div class="card-body">
<div class="btn-list">
<a class="btn btn-animate-icon">Save <Icon name="arrow-right" class="icon-end" /></a>
<a class="btn btn-animate-icon btn-animate-icon-rotate"><Icon name="plus" /> Add</a>
<a class="btn btn-animate-icon btn-animate-icon-shake"><Icon name="bell" /> Notifications</a>
<a class="btn btn-animate-icon btn-animate-icon-rotate"><Icon name="settings" /> Settings</a>
<a class="btn btn-animate-icon btn-animate-icon-pulse"><Icon name="heart" /> Love</a>
<a class="btn btn-animate-icon btn-animate-icon-rotate"><Icon name="x" /> Close</a>
<a class="btn btn-animate-icon btn-animate-icon-tada"><Icon name="check" /> Confirm</a>
<a class="btn btn-animate-icon">Next <Icon name="chevron-right" class="icon-end" /></a>
<a class="btn btn-animate-icon btn-animate-icon-move-start"><Icon name="chevron-left" /> Previous</a>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Buttons size</h3>
</div>
<div class="card-body">
<div class="space-y">
{
sizes.map((size) => (
<div class="btn-list">
<Button size={size} text="Button" />
<Button size={size} icon="star" iconOnly />
<Button size={size} icon="star" text="Button" />
<Button size={size} iconEnd="star" text="Button" />
</div>
))
}
</div>
</div>
</div>
</div>
</div>
</DefaultLayout>
-184
View File
@@ -1,184 +0,0 @@
---
title: Buttons
page-header: Buttons
page-menu: base.buttons
layout: default
permalink: buttons.html
---
<div class="row row-cards">
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Standard Buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{% for color in site.themeColors %}
<a class="btn btn-{{ color[0] }}">{% include "ui/icon.html" icon=color[1].icon %} {{ color[1].title }}</a>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Outline Buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{% for color in site.themeColors %}
<a class="btn btn-outline btn-{{ color[0] }}">{% include "ui/icon.html"
icon=color[1].icon %} {{ color[1].title }}</a>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Ghost Buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{% for color in site.themeColors %}
<a class="btn btn-ghost btn-{{ color[0] }}">{% include "ui/icon.html"
icon=color[1].icon %} {{ color[1].title }}</a>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Square Buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{% for color in site.themeColors %}
<a class="btn btn-square btn-{{ color[0] }}">
{% include "ui/icon.html" icon=color[1].icon %} {{ color[1].title }}
</a>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Pill Buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{% for color in site.themeColors %}
<a class="btn btn-pill btn-{{ color[0] }}">
{% include "ui/icon.html" icon=color[1].icon %} {{ color[1].title }}
</a>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Extra colors</h3>
</div>
<div class="card-body">
<div class="btn-list">
{% for color in site.colors %}
<a class="btn btn-{{ color[0] }}">{% include "ui/icon.html"
icon=color[1].icon %} {{ color[1].title }}</a>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Icon buttons</h3>
</div>
<div class="card-body">
<div class="btn-list">
{% for app in site.socialColors %}
<a class="btn btn-icon btn-{{ app[0] }}">{% include "ui/icon.html" icon=app[1].icon %}</a>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Social colors</h3>
</div>
<div class="card-body">
<div class="btn-list">
{% for app in site.socialColors %}
<a class="btn btn-{{ app[0] }}">{% include "ui/icon.html" icon=app[1].icon %} {{ app[1].title }}</a>
{% endfor %}
</div>
</div>
</div>
</div>
{% assign actions = 'edit,copy,settings,clipboard,x' | split: ',' %}
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Action buttons</h3>
</div>
<div class="card-body">
<div class="btn-actions">
{% for action in actions %}
<a class="btn btn-action">{% include "ui/icon.html" icon=action %}</a>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Buttons with icon</h3>
</div>
<div class="card-body">
<div class="btn-list">
<a class="btn btn-animate-icon">Save {% include "ui/icon.html" icon="arrow-right" class="icon-end" %}</a>
<a class="btn btn-animate-icon btn-animate-icon-rotate">{% include "ui/icon.html" icon="plus" %} Add</a>
<a class="btn btn-animate-icon btn-animate-icon-shake">{% include "ui/icon.html" icon="bell" %} Notifications</a>
<a class="btn btn-animate-icon btn-animate-icon-rotate">{% include "ui/icon.html" icon="settings" %} Settings</a>
<a class="btn btn-animate-icon btn-animate-icon-pulse">{% include "ui/icon.html" icon="heart" %} Love</a>
<a class="btn btn-animate-icon btn-animate-icon-rotate">{% include "ui/icon.html" icon="x" %} Close</a>
<a class="btn btn-animate-icon btn-animate-icon-tada">{% include "ui/icon.html" icon="check" %} Confirm</a>
<a class="btn btn-animate-icon">Next {% include "ui/icon.html" icon="chevron-right" class="icon-end" %}</a>
<a class="btn btn-animate-icon btn-animate-icon-move-start">{% include "ui/icon.html" icon="chevron-left" %} Previous</a>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Buttons size</h3>
</div>
<div class="card-body">
<div class="space-y">
{% assign sizes = 'sm,md,lg,xl' | split: ',' %}
{% for size in sizes %}
<div class="btn-list">
{% include "ui/button.html" size=size text="Button" %}
{% include "ui/button.html" size=size icon="star" icon-only %}
{% include "ui/button.html" size=size icon="star" text="Button" %}
{% include "ui/button.html" size=size icon-end="star" text="Button" %}
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
+152
View File
@@ -0,0 +1,152 @@
---
// Port of preview/pages/card-actions.html.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import BodyPlaceholder from '@shared/components/cards/BodyPlaceholder.astro';
import Button from '@shared/components/Button.astro';
import Avatar from '@shared/components/ui/Avatar.astro';
import Icon from '@shared/components/Icon.astro';
import people from '@data/people.json';
const person0 = people[0];
const person3 = people[3];
---
<DefaultLayout title="Card actions" pageHeader="Card actions" pageMenu="base.cards.actions">
<div class="row row-cards">
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Sample card</h3>
</div>
<BodyPlaceholder />
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card with action</h3>
<div class="card-actions">
<Button color="primary" icon="plus" text="Add new" />
</div>
</div>
<BodyPlaceholder />
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Cart title</h3>
<div class="card-actions">
<Button icon="phone" text="Phone" />
<Button icon="mail" text="Email" />
</div>
</div>
<BodyPlaceholder />
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<div>
<div class="row align-items-center">
<div class="col-auto">
<Avatar person={person0} />
</div>
<div class="col">
<div class="card-title">{person0.full_name}</div>
<div class="card-subtitle">{person0.job_title}</div>
</div>
</div>
</div>
<div class="card-actions">
<Button icon="phone" text="Phone" />
<Button icon="mail" text="Email" />
</div>
</div>
<BodyPlaceholder />
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<div>
<h3 class="card-title">
With description
</h3>
<p class="card-subtitle">
Lorem ipsum dolor sit amet consectetur adipisicing.
</p>
</div>
</div>
<BodyPlaceholder />
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<div>
<h3 class="card-title">
With description and action
</h3>
<p class="card-subtitle">
Lorem ipsum dolor sit amet consectetur adipisicing.
</p>
</div>
<div class="card-actions">
<Button color="primary" text="Create new job" />
</div>
</div>
<BodyPlaceholder />
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<div>
<div class="row align-items-center">
<div class="col-auto">
<Avatar person={person3} />
</div>
<div class="col">
<div class="card-title">{person3.full_name}</div>
<div class="card-subtitle">{person3.job_title}</div>
</div>
</div>
</div>
<div class="card-actions">
<div class="dropdown">
<a href="#" class="btn-action dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><Icon name="dots-vertical" /></a>
<div class="dropdown-menu dropdown-menu-end">
<a class="dropdown-item" href="#">Edit user</a>
<a class="dropdown-item" href="#">Change permissions</a>
<a class="dropdown-item text-danger" href="#">Delete user</a>
</div>
</div>
</div>
</div>
<BodyPlaceholder />
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card actions</h3>
<div class="card-actions btn-actions">
<a href="#" class="btn-action"><Icon name="refresh" /></a>
<a href="#" class="btn-action"><Icon name="chevron-up" /></a>
<a href="#" class="btn-action"><Icon name="dots-vertical" /></a>
<a href="#" class="btn-action"><Icon name="x" /></a>
</div>
</div>
<BodyPlaceholder />
</div>
</div>
</div>
</DefaultLayout>
-147
View File
@@ -1,147 +0,0 @@
---
title: Card actions
page-header: Card actions
page-menu: base.cards.actions
layout: default
permalink: card-actions.html
---
<div class="row row-cards">
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Sample card</h3>
</div>
{% include "cards/body-placeholder.html" %}
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card with action</h3>
<div class="card-actions">
{% include "ui/button.html" color="primary" icon="plus" text="Add new" %}
</div>
</div>
{% include "cards/body-placeholder.html" %}
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Cart title</h3>
<div class="card-actions">
{% include "ui/button.html" icon="phone" text="Phone" %}
{% include "ui/button.html" icon="mail" text="Email" %}
</div>
</div>
{% include "cards/body-placeholder.html" %}
</div>
</div>
{% assign person = people[0] %}
<div class="col-md-6">
<div class="card">
<div class="card-header">
<div>
<div class="row align-items-center">
<div class="col-auto">
{% include "ui/avatar.html" person=person %}
</div>
<div class="col">
<div class="card-title">{{ person.full_name }}</div>
<div class="card-subtitle">{{ person.job_title }}</div>
</div>
</div>
</div>
<div class="card-actions">
{% include "ui/button.html" icon="phone" text="Phone" %}
{% include "ui/button.html" icon="mail" text="Email" %}
</div>
</div>
{% include "cards/body-placeholder.html" %}
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<div>
<h3 class="card-title">
With description
</h3>
<p class="card-subtitle">
Lorem ipsum dolor sit amet consectetur adipisicing.
</p>
</div>
</div>
{% include "cards/body-placeholder.html" %}
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<div>
<h3 class="card-title">
With description and action
</h3>
<p class="card-subtitle">
Lorem ipsum dolor sit amet consectetur adipisicing.
</p>
</div>
<div class="card-actions">
{% include "ui/button.html" color="primary" text="Create new job" %}
</div>
</div>
{% include "cards/body-placeholder.html" %}
</div>
</div>
{% assign person = people[3] %}
<div class="col-md-6">
<div class="card">
<div class="card-header">
<div>
<div class="row align-items-center">
<div class="col-auto">
{% include "ui/avatar.html" person=person %}
</div>
<div class="col">
<div class="card-title">{{ person.full_name }}</div>
<div class="card-subtitle">{{ person.job_title }}</div>
</div>
</div>
</div>
<div class="card-actions">
<div class="dropdown">
<a href="#" class="btn-action dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{% include "ui/icon.html" icon="dots-vertical" %}</a>
<div class="dropdown-menu dropdown-menu-end">
<a class="dropdown-item" href="#">Edit user</a>
<a class="dropdown-item" href="#">Change permissions</a>
<a class="dropdown-item text-danger" href="#">Delete user</a>
</div>
</div>
</div>
</div>
{% include "cards/body-placeholder.html" %}
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card actions</h3>
<div class="card-actions btn-actions">
<a href="#" class="btn-action" >{% include "ui/icon.html" icon="refresh" %}</a>
<a href="#" class="btn-action" >{% include "ui/icon.html" icon="chevron-up" %}</a>
<a href="#" class="btn-action" >{% include "ui/icon.html" icon="dots-vertical" %}</a>
<a href="#" class="btn-action" >{% include "ui/icon.html" icon="x" %}</a>
</div>
</div>
{% include "cards/body-placeholder.html" %}
</div>
</div>
</div>
+92
View File
@@ -0,0 +1,92 @@
---
// Port of preview/pages/card-gradients.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Welcome from '@shared/components/cards/Welcome.astro';
import DeleteConfirm from '@shared/components/cards/DeleteConfirm.astro';
import SuccessMessage from '@shared/components/cards/SuccessMessage.astro';
import PricingPlan from '@shared/components/cards/PricingPlan.astro';
import StatGradient from '@shared/components/cards/StatGradient.astro';
import HappyBirthday from '@shared/components/cards/HappyBirthday.astro';
import YouWin from '@shared/components/cards/YouWin.astro';
import Weather from '@shared/components/cards/Weather.astro';
import ProfileContact from '@shared/components/cards/ProfileContact.astro';
import SmallStats from '@shared/components/cards/SmallStats.astro';
import people from '@data/people.json';
---
<DefaultLayout title="Card Gradients" pageHeader="Card Gradients" pageMenu="base.cards.gradients" pageLibs={['apexcharts']}>
<div class="row row-cards">
<div class="col-md-6">
<div class="row row-cards">
<div class="col-12">
<Welcome />
</div>
<div class="col-12">
<div class="row">
<div class="col-6">
<div class="row row-cards">
<div class="col-12">
<DeleteConfirm />
</div>
<div class="col-12">
<SuccessMessage />
</div>
</div>
</div>
<div class="col-6">
<div class="row row-cards">
<div class="col-12">
<PricingPlan />
</div>
<div class="col-12">
<StatGradient title="Earned" value="$2,847" icon="credit-card" color="success" progress={75} />
</div>
<div class="col-12">
<StatGradient title="Pending Orders" value="47" icon="clock" color="yellow" progress={38} />
</div>
<div class="col-12">
<StatGradient title="Cancelled Orders" value="12" icon="shopping-cart-x" color="red" progress={8} />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-3">
<div class="row row-cards">
<div class="col-12">
<HappyBirthday />
</div>
<div class="col-12">
<YouWin />
</div>
</div>
</div>
<div class="col-3">
<div class="row row-cards">
<div class="col-12">
<Weather city="Warsaw, PL" temperature={3} color="rain" icon="cloud-rain" description="Cloudy morning" />
</div>
<div class="col-12">
<Weather city="Oslo, NO" temperature="-5" color="snow" icon="cloud" description="Snowy day" />
</div>
<div class="col-12">
<Weather city="Dubai, AE" temperature="32" color="sun" icon="sun" description="Sunny day" />
</div>
<div class="col-12">
<ProfileContact person={people[6]} />
</div>
<div class="col-12">
<SmallStats chartType="line" chartData="11,16,13,20,17,24,19,23,16,20,13,17,11,19" color="primary" id="chart1" class="card-gradient card-gradient-end card-gradient-primary" />
</div>
<div class="col-12">
<SmallStats id="sales" icon="arrow-up" color="green" title="$5,256.99" description="Revenue last 30 days" descriptionValue="+4%" class="card-gradient card-gradient-end card-gradient-green" />
</div>
<div class="col-12">
<SmallStats id="orders" icon="arrow-down" color="red" title="342" description="Sales last 30 days" descriptionValue="-4.3%" descriptionValueColor="red" class="card-gradient card-gradient-end card-gradient-red" />
</div>
</div>
</div>
</div>
</DefaultLayout>
-97
View File
@@ -1,97 +0,0 @@
---
title: Card Gradients
page-header: Card Gradients
page-menu: base.cards.gradients
layout: default
permalink: card-gradients.html
page-libs: [apexcharts]
---
{% assign gradients = 'sunset,rainbow,ocean,mellow,disco,psychedelic' | split: ',' %}
<div class="row row-cards">
<div class="col-md-6">
<div class="row row-cards">
<div class="col-12">
{% include "cards/welcome.html" %}
</div>
<div class="col-12">
<div class="row">
<div class="col-6">
<div class="row row-cards">
<div class="col-12">
{% include "cards/delete-confirm.html" %}
</div>
<div class="col-12">
{% include "cards/success-message.html" %}
</div>
</div>
</div>
<div class="col-6">
<div class="row row-cards">
<div class="col-12">
{% include "cards/pricing-plan.html" %}
</div>
<div class="col-12">
{% include "cards/stat-gradient.html" title="Earned" value="$2,847" icon="credit-card" color="success"
progress=75 %}
</div>
<div class="col-12">
{% include "cards/stat-gradient.html" title="Pending Orders" value="47" icon="clock" color="yellow"
progress=38 %}
</div>
<div class="col-12">
{% include "cards/stat-gradient.html" title="Cancelled Orders" value="12" icon="shopping-cart-x" color="red"
progress=8 %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-3">
<div class="row row-cards">
<div class="col-12">
{% include "cards/happy-birthday.html" %}
</div>
<div class="col-12">
{% include "cards/you-win.html" %}
</div>
</div>
</div>
<div class="col-3">
<div class="row row-cards">
<div class="col-12">
{% include "cards/weather.html" city="Warsaw, PL" temperature=3 color="rain" icon="cloud-rain"
description="Cloudy morning" %}
</div>
<div class="col-12">
{% include "cards/weather.html" city="Oslo, NO" temperature="-5" color="snow" icon="cloud"
description="Snowy day" %}
</div>
<div class="col-12">
{% include "cards/weather.html" city="Dubai, AE" temperature="32" color="sun" icon="sun" description="Sunny
day" %}
</div>
<div class="col-12">
{% include "cards/profile-contact.html" person=people[6] %}
</div>
<div class="col-12">
{% include "cards/small-stats.html" chart-type="line" chart-data="11,16,13,20,17,24,19,23,16,20,13,17,11,19"
color="primary" id="chart1" class="card-gradient card-gradient-end card-gradient-primary" %}
</div>
<div class="col-12">
{% include "cards/small-stats.html" id="sales" icon="arrow-up" color="green" title="$5,256.99"
description="Revenue last 30 days" description-value="+4%" class="card-gradient card-gradient-end
card-gradient-green" %}
</div>
<div class="col-12">
{% include "cards/small-stats.html" id="orders" icon="arrow-down" color="red" title="342" description="Sales
last 30 days" description-value="-4.3%" description-value-color="red" class="card-gradient card-gradient-end
card-gradient-red" %}
</div>
</div>
</div>
</div>
+29
View File
@@ -0,0 +1,29 @@
---
// Port of preview/pages/cards-masonry.html.
// The masonry library is loaded via page-libs=[masonry] (BaseLayout emits the
// CDN <script> from core/libs.json); auto-init is triggered by the
// data-masonry attribute, so there is no page-level init script.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import BodyPlaceholder from '@shared/components/cards/BodyPlaceholder.astro';
const heights = [200, 150, 400, 300, 350, 600, 700, 200, 150, 250, 50, 400, 300, 200];
---
<DefaultLayout
title="Cards Masonry"
pageHeader="Cards Masonry"
pageMenu="base.cards.masonry"
pageLibs={['masonry']}
>
<div class="row row-cards" data-masonry={'{"percentPosition": true }'}>
{
heights.map((height) => (
<div class="col-sm-6 col-lg-4">
<div class="card">
<BodyPlaceholder height={height} />
</div>
</div>
))
}
</div>
</DefaultLayout>
-21
View File
@@ -1,21 +0,0 @@
---
title: Cards Masonry
page-header: Cards Masonry
page-menu: base.cards.masonry
page-libs: [masonry]
layout: default
permalink: cards-masonry.html
---
{% assign heights = '200,150,400,300,350,600,700,200,150,250,50,400,300,200' | split: ',' %}
<div class="row row-cards" data-masonry='{"percentPosition": true }'>
{% for height in heights %}
<div class="col-sm-6 col-lg-4">
<div class="card">
{% include "cards/body-placeholder.html" height=height %}
</div>
</div>
{% endfor %}
</div>
+280
View File
@@ -0,0 +1,280 @@
---
// Port of preview/pages/cards.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Icon from '@shared/components/Icon.astro';
import Card from '@shared/components/cards/Card.astro';
import CardImage from '@shared/components/cards/CardImage.astro';
import CardTabs from '@shared/components/cards/CardTabs.astro';
import CardRibbonText from '@shared/components/cards/CardRibbonText.astro';
import CardRibbonTop from '@shared/components/cards/CardRibbonTop.astro';
import CardBackgroundIcon from '@shared/components/cards/CardBackgroundIcon.astro';
import CreditCard from '@shared/components/cards/CreditCard.astro';
import EmptyTeam from '@shared/components/cards/EmptyTeam.astro';
import BodyPlaceholder from '@shared/components/cards/BodyPlaceholder.astro';
const cardsStack = ['First', 'Second', 'Third'];
const cardsStackColors = ['red', 'green', 'blue'];
---
<DefaultLayout title="Cards" pageHeader="Cards" pageMenu="base.cards.base">
<div class="row row-cards">
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card title</h3>
</div>
<div class="card-body">Simple card</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-header card-header-light">
<h3 class="card-title">Card title</h3>
</div>
<div class="card-body">Card with header background</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card card-borderless">
<div class="card-body">
<h3 class="card-title">Card title</h3>
<div>Card without border</div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card title <span class="card-subtitle">Subtitle</span></h3>
</div>
<div class="card-body">Card with title and subtitle</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<a href="#" class="card card-link">
<div class="card-body">Default hover effect</div>
</a>
</div>
<div class="col-md-6 col-lg-3">
<a href="#" class="card card-link card-link-rotate">
<div class="card-body">Rotate hover effect</div>
</a>
</div>
<div class="col-md-6 col-lg-3">
<a href="#" class="card card-link card-link-pop">
<div class="card-body">Pop hover effect</div>
</a>
</div>
<div class="col-md-6 col-lg-3"></div>
<div class="col-md-6 col-lg-3">
<div class="card card-rotate-end">
<div class="card-body">Card rotate end</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card card-rotate-start">
<div class="card-body">Card rotate start</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card card-active">
<div class="card-body">
<p>This is a card with active state.</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card card-inactive">
<div class="card-body">
<p>This is some text inactive state.</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-stamp">
<div class="card-stamp-icon bg-yellow">
<Icon name="bell" />
</div>
</div>
<div class="card-body">
<h3 class="card-title">Card with icon bg</h3>
<p class="text-secondary">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto at consectetur culpa ducimus eum fuga
fugiat, ipsa iusto, modi nostrum recusandae reiciendis saepe.
</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card bg-primary-lt">
<div class="card-body">
<h3 class="card-title">Card with primary light background</h3>
<p class="text-secondary">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto at consectetur culpa ducimus eum fuga
fugiat, ipsa iusto, modi nostrum recusandae reiciendis saepe.
</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<CardBackgroundIcon />
</div>
<div class="col-md-6 col-lg-3">
<Card statusTop="danger" title="Card with top status" />
</div>
<div class="col-md-6 col-lg-3">
<Card statusBottom="success" title="Card with bottom status" />
</div>
<div class="col-md-6 col-lg-3">
<Card statusStart="primary" title="Card with side status" />
</div>
<div class="col-md-6 col-lg-3">
<CardRibbonTop />
</div>
<div class="col-md-6 col-lg-3">
<CardRibbonText />
</div>
<div class="col-md-6 col-lg-3">
<Card progress title="Card with progress bar" />
</div>
<div class="col-md-6 col-lg-3">
<Card class="card-stacked" title="Stacked card" />
</div>
<div class="col-lg-6">
<CardImage title="Card with left side image" />
</div>
<div class="col-lg-6">
<CardImage title="Card with right side image" right imgId={3} />
</div>
<div class="col-md-6 col-lg-3">
<Card imgTop title="Card with top image" />
</div>
<div class="col-md-6 col-lg-3">
<Card imgBottom title="Card with bottom image" />
</div>
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-body">
<h3 class="card-title">Card with footer</h3>
<p class="text-secondary">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam deleniti fugit incidunt, iste, itaque
minima neque pariatur perferendis sed suscipit velit vitae voluptatem.
</p>
</div>
<div class="card-footer">This is standard card footer</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-body">
<h3 class="card-title">Card with transparent footer</h3>
<p class="text-secondary">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam deleniti fugit incidunt, iste, itaque
minima neque pariatur perferendis sed suscipit velit vitae voluptatem.
</p>
</div>
<div class="card-footer card-footer-transparent">This is transparent card footer</div>
</div>
</div>
<div class="col-md-6 col-lg-3"><Card title="Card with footer button" footerButton /></div>
<div class="col-md-6 col-lg-3"><Card title="Card with footer buttons" footerButtons /></div>
<div class="col-md-6 col-lg-3"><Card footerElements="more,>switch" /></div>
<div class="col-md-6 col-lg-3"><Card footerElements=">avatars" /></div>
<div class="col-md-6 col-lg-4"><Card headerTabs /></div>
<div class="col-md-6 col-lg-4"><Card headerPills /></div>
<div class="col-md-6 col-lg-4"><CardTabs /></div>
<div class="col-md-6 col-lg-4"><CardTabs bottom id="bottom" /></div>
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Cards inside card</h3>
</div>
<div class="card-body">
<div class="row row-cards">
{
cardsStack.map((name, i) => (
<div class="col-md">
<div class="card">
<div class={`card-status-top bg-${cardsStackColors[i]}`} />
<div class="card-header">
<h3 class="card-title">{name} card</h3>
</div>
<BodyPlaceholder />
</div>
</div>
))
}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card-group">
{
cardsStack.map((name) => (
<div class="card">
<div class="card-header">
<h3 class="card-title">{name} card</h3>
</div>
<BodyPlaceholder />
</div>
))
}
</div>
</div>
<div class="col-12">
<div class="row row-cards row-deck">
<div class="col">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card title</h3>
</div>
<div class="card-body">
This is a wider card with supporting text below as a natural lead-in to additional content. This content
is a little bit longer.
</div>
<div class="card-footer">Last updated 3 mins ago</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card title</h3>
</div>
<div class="card-body">
This card has supporting text below as a natural lead-in to additional content.
</div>
<div class="card-footer">Last updated 3 mins ago</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card with very long content</h3>
</div>
<div class="card-body">
This is a wider card with supporting text below as a natural lead-in to additional content. This card has
even longer content than the first to show that equal height action.
</div>
<div class="card-footer">Last updated 3 mins ago</div>
</div>
</div>
</div>
</div>
<div class="col-lg-4"><Card empty /></div>
<div class="col-lg-4"><EmptyTeam /></div>
<div class="col-lg-4"><CreditCard /></div>
</div>
</DefaultLayout>
-261
View File
@@ -1,261 +0,0 @@
---
title: Cards
page-header: Cards
page-menu: base.cards.base
layout: default
permalink: cards.html
---
{% assign cards-stack = 'First,Second,Third' | split: ',' %}
{% assign cards-stack-colors = 'red,green,blue' | split: ',' %}
<div class="row row-cards">
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card title</h3>
</div>
<div class="card-body">Simple card</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-header card-header-light">
<h3 class="card-title">Card title</h3>
</div>
<div class="card-body">Card with header background</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card card-borderless">
<div class="card-body">
<h3 class="card-title">Card title</h3>
<div>Card without border</div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card title <span class="card-subtitle">Subtitle</span></h3>
</div>
<div class="card-body">Card with title and subtitle</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<a href="#" class="card card-link">
<div class="card-body">Default hover effect</div>
</a>
</div>
<div class="col-md-6 col-lg-3">
<a href="#" class="card card-link card-link-rotate">
<div class="card-body">Rotate hover effect</div>
</a>
</div>
<div class="col-md-6 col-lg-3">
<a href="#" class="card card-link card-link-pop">
<div class="card-body">Pop hover effect</div>
</a>
</div>
<div class="col-md-6 col-lg-3">
</div>
<div class="col-md-6 col-lg-3">
<div class="card card-rotate-end">
<div class="card-body">Card rotate end</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card card-rotate-start">
<div class="card-body">Card rotate start</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card card-active">
<div class="card-body">
<p>This is a card with active state.</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card card-inactive">
<div class="card-body">
<p>This is some text inactive state.</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-stamp">
<div class="card-stamp-icon bg-yellow">
{% include "ui/icon.html" icon="bell" %}
</div>
</div>
<div class="card-body">
<h3 class="card-title">Card with icon bg</h3>
<p class="text-secondary">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto at consectetur culpa ducimus eum fuga fugiat, ipsa iusto, modi nostrum recusandae reiciendis saepe.</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card bg-primary-lt">
<div class="card-body">
<h3 class="card-title">Card with primary light background</h3>
<p class="text-secondary">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto at consectetur culpa ducimus eum fuga fugiat, ipsa iusto, modi nostrum recusandae reiciendis saepe.</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
{% include "cards/card-background-icon.html" %}
</div>
<div class="col-md-6 col-lg-3">
{% include "cards/card.html" status-top="danger" title="Card with top status" %}
</div>
<div class="col-md-6 col-lg-3">
{% include "cards/card.html" status-bottom="success" title="Card with bottom status" %}
</div>
<div class="col-md-6 col-lg-3">
{% include "cards/card.html" status-start="primary" title="Card with side status" %}
</div>
<div class="col-md-6 col-lg-3">
{% include "cards/card-ribbon-top.html" %}
</div>
<div class="col-md-6 col-lg-3">
{% include "cards/card-ribbon-text.html" %}
</div>
<div class="col-md-6 col-lg-3">
{% include "cards/card.html" progress=true title="Card with progress bar" %}
</div>
<div class="col-md-6 col-lg-3">
{% include "cards/card.html" class="card-stacked" title="Stacked card" %}
</div>
<div class="col-lg-6">
{% include "cards/card-image.html" title="Card with left side image" %}
</div>
<div class="col-lg-6">
{% include "cards/card-image.html" title="Card with right side image" right=true img-id=3 %}
</div>
<div class="col-md-6 col-lg-3">
{% include "cards/card.html" img-top=true title="Card with top image" %}
</div>
<div class="col-md-6 col-lg-3">
{% include "cards/card.html" img-bottom=true title="Card with bottom image" %}
</div>
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-body">
<h3 class="card-title">Card with footer</h3>
<p class="text-secondary">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam deleniti fugit incidunt, iste, itaque minima
neque pariatur perferendis sed suscipit velit vitae voluptatem.</p>
</div>
<div class="card-footer">
This is standard card footer
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="card">
<div class="card-body">
<h3 class="card-title">Card with transparent footer</h3>
<p class="text-secondary">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam deleniti fugit incidunt, iste, itaque minima
neque pariatur perferendis sed suscipit velit vitae voluptatem.</p>
</div>
<div class="card-footer card-footer-transparent">
This is transparent card footer
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">{% include "cards/card.html" title="Card with footer button" footer-button=true %}</div>
<div class="col-md-6 col-lg-3">{% include "cards/card.html" title="Card with footer buttons" footer-buttons=true %}</div>
<div class="col-md-6 col-lg-3">{% include "cards/card.html" footer-elements="more,>switch" %}</div>
<div class="col-md-6 col-lg-3">{% include "cards/card.html" footer-elements=">avatars" %}</div>
<div class="col-md-6 col-lg-4">{% include "cards/card.html" header-tabs=true %}</div>
<div class="col-md-6 col-lg-4">{% include "cards/card.html" header-pills=true %}</div>
<div class="col-md-6 col-lg-4">{% include "cards/card-tabs.html" %}</div>
<div class="col-md-6 col-lg-4">{% include "cards/card-tabs.html" bottom=true id="bottom" %}</div>
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Cards inside card</h3>
</div>
<div class="card-body">
<div class="row row-cards">
{% for i in cards-stack %}
<div class="col-md">
<div class="card">
<div class="card-status-top bg-{{ cards-stack-colors[forloop.index0] }}"></div>
<div class="card-header">
<h3 class="card-title">{{ i }} card</h3>
</div>
{% include "cards/body-placeholder.html" %}
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card-group">
{% for i in cards-stack %}
<div class="card">
<div class="card-header">
<h3 class="card-title">{{ i }} card</h3>
</div>
{% include "cards/body-placeholder.html" %}
</div>
{% endfor %}
</div>
</div>
<div class="col-12">
<div class="row row-cards row-deck">
<div class="col">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card title</h3>
</div>
<div class="card-body">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</div>
<div class="card-footer">
Last updated 3 mins ago
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card title</h3>
</div>
<div class="card-body">This card has supporting text below as a natural lead-in to additional content.</div>
<div class="card-footer">
Last updated 3 mins ago
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="card-header">
<h3 class="card-title">Card with very long content</h3>
</div>
<div class="card-body">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</div>
<div class="card-footer">
Last updated 3 mins ago
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-4">{% include "cards/card.html" empty=true %}</div>
<div class="col-lg-4">{% include "cards/empty-team.html" %}</div>
<div class="col-lg-4">{% include "cards/credit-card.html" %}</div>
</div>
+58
View File
@@ -0,0 +1,58 @@
---
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import CarouselCard from '@shared/components/cards/CarouselCard.astro';
---
<DefaultLayout title="Carousel" pageHeader="Carousel" pageMenu="base.carousel">
<div class="row row-cards">
<div class="col-md-6">
<CarouselCard id="default" />
</div>
<div class="col-md-6">
<CarouselCard id="indicators" title="Carousel with indicators" indicators offset={5} />
</div>
<div class="col-md-6">
<CarouselCard id="controls" title="Carousel with controls" controls offset={10} />
</div>
<div class="col-md-6">
<CarouselCard id="captions" title="Carousel with captions" captions controls offset={15} />
</div>
<div class="col-md-6">
<CarouselCard id="indicators-dot" title="Carousel with dot indicators" indicators indicatorsDot offset={20} fade />
</div>
<div class="col-md-6">
<CarouselCard
id="indicators-thumb"
title="Carousel with thumbnail indicators"
indicators
indicatorsThumb
indicatorsThumbRatio
offset={25}
fade
/>
</div>
<div class="col-md-6">
<CarouselCard
id="indicators-dot-vertical"
title="Carousel with vertical dot indicators"
indicators
indicatorsVertical
indicatorsDot
offset={30}
fade
/>
</div>
<div class="col-md-6">
<CarouselCard
id="indicators-thumb-vertical"
title="Carousel with vertical thumbnail indicators"
indicators
indicatorsVertical
indicatorsThumb
indicatorsThumbRatio
offset={22}
fade
/>
</div>
</div>
</DefaultLayout>
-34
View File
@@ -1,34 +0,0 @@
---
title: Carousel
page-header: Carousel
page-menu: base.carousel
layout: default
permalink: carousel.html
---
<div class="row row-cards">
<div class="col-md-6">
{% include "cards/carousel.html" id="default" %}
</div>
<div class="col-md-6">
{% include "cards/carousel.html" id="indicators" title="Carousel with indicators" indicators=true offset=5 %}
</div>
<div class="col-md-6">
{% include "cards/carousel.html" id="controls" title="Carousel with controls" controls=true offset=10 %}
</div>
<div class="col-md-6">
{% include "cards/carousel.html" id="captions" title="Carousel with captions" captions=true controls=true offset=15 %}
</div>
<div class="col-md-6">
{% include "cards/carousel.html" id="indicators-dot" title="Carousel with dot indicators" indicators=true indicators-dot=true offset=20 fade=true %}
</div>
<div class="col-md-6">
{% include "cards/carousel.html" id="indicators-thumb" title="Carousel with thumbnail indicators" indicators=true indicators-thumb=true indicators-thumb-ratio=true offset=25 fade=true %}
</div>
<div class="col-md-6">
{% include "cards/carousel.html" id="indicators-dot-vertical" title="Carousel with vertical dot indicators" indicators=true indicators-vertical=true indicators-dot=true offset=30 fade=true %}
</div>
<div class="col-md-6">
{% include "cards/carousel.html" id="indicators-thumb-vertical" title="Carousel with vertical thumbnail indicators" indicators=true indicators-vertical=true indicators-thumb=true indicators-thumb-ratio=true offset=22 fade=true %}
</div>
</div>
+18
View File
@@ -0,0 +1,18 @@
---
import ProseLayout from '@shared/layouts/ProseLayout.astro';
import { renderMarkdown } from '@shared/lib/render-markdown';
// Liquid: {{ changelog | renderContent: "md" }} — `changelog` is the raw
// content of core/CHANGELOG.md (shared/e11ty/data.mjs), rendered by
// Eleventy's markdown-it. renderMarkdown() mirrors that engine exactly
// (markdown-it 14.3.0, { html: true }, indented code blocks disabled) —
// output verified byte-identical to the reference build. Injected via
// set:html: the fragment contains entities and a literal `{$prefix}` token
// that must not be re-escaped or parsed as JSX.
import changelog from '../../core/CHANGELOG.md?raw';
const changelogHtml = renderMarkdown(changelog);
---
<ProseLayout title="Changelog" pageMenu="changelog">
<Fragment set:html={changelogHtml} />
</ProseLayout>
-8
View File
@@ -1,8 +0,0 @@
---
title: Changelog
page-menu: changelog
layout: prose
permalink: changelog.html
---
{{ changelog | renderContent: "md" }}
+54
View File
@@ -0,0 +1,54 @@
---
// Port of preview/pages/charts.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Activity from '@shared/components/parts/charts/Activity.astro';
import SocialReferrals from '@shared/components/cards/charts/SocialReferrals.astro';
import Chart from '@shared/components/Chart.astro';
import chartsData from '@data/charts.json';
const demoCharts = Object.entries(
chartsData as Record<string, { demo?: boolean; name?: string }>,
).filter(([, chart]) => chart && chart.demo);
---
<DefaultLayout
title="Charts"
pageHeader="Charts"
pageMenu="plugins.charts"
pageLibs={['apexcharts']}
>
<div class="row row-cards">
<div class="col-lg-12">
<Activity />
</div>
<div class="col-12">
<SocialReferrals />
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<Chart chartId="tasks-overview" height={20} />
</div>
</div>
</div>
{
demoCharts.map(([chartId, chart]) => (
<div class="col-lg-6 col-xl-4">
<div class="card">
{chart.name && (
<div class="card-header">
<h3 class="card-title">{chart.name}</h3>
</div>
)}
<div class="card-body">
<Chart chartId={chartId} height={15} />
</div>
</div>
</div>
))
}
</div>
</DefaultLayout>
-44
View File
@@ -1,44 +0,0 @@
---
title: Charts
page-header: Charts
page-menu: plugins.charts
page-libs: [apexcharts]
layout: default
permalink: charts.html
---
<div class="row row-cards">
<div class="col-lg-12">
{% include "parts/charts/activity.html" %}
</div>
<div class="col-12">
{% include "cards/charts/social-referrals.html" %}
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
{% include "ui/chart.html" chart-id="tasks-overview" height=20 %}
</div>
</div>
</div>
{% for chart in charts %}
{% if chart[1].demo %}
{% assign chart-id = chart[0] %}
<div class="col-lg-6 col-xl-4">
<div class="card">
{% if chart[1].name %}
<div class="card-header">
<h3 class="card-title">{{ chart[1].name }}</h3>
</div>
{% endif %}
<div class="card-body">
{% include "ui/chart.html" chart-id=chart-id height=15 %}
</div>
</div>
</div>
{% endif %}
{% endfor %}
</div>
+88
View File
@@ -0,0 +1,88 @@
---
// Port of preview/pages/chat.html (layout: default)
// Front matter page-container-class: "flex-fill d-flex flex-column" → containerClass prop.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Icon from '@shared/components/Icon.astro';
import Avatar from '@shared/components/ui/Avatar.astro';
import Chat from '@shared/components/ui/Chat.astro';
import people from '@data/people.json';
import chats from '@data/chats.json';
interface Person {
full_name?: string;
photo?: string;
[key: string]: unknown;
}
interface Message {
message?: string;
[key: string]: unknown;
}
const sidebarPeople = (people as Person[]).slice(0, 10);
const messages = chats as Message[];
---
<DefaultLayout
title="Chat"
pageHeader="Chat"
pageMenu="extra.chat"
containerClass="flex-fill d-flex flex-column"
>
<div class="card flex-fill">
<div class="row g-0 flex-fill">
<div class="col-12 col-lg-5 col-xl-3 border-end d-flex flex-column">
<div class="card-header d-none d-md-block">
<div class="input-icon">
<span class="input-icon-addon"> <Icon name="search" /> </span>
<input type="text" value="" class="form-control" placeholder="Search…" aria-label="Search" />
</div>
</div>
<div class="card-body p-0 scrollable flex-fill">
<div class="nav flex-column nav-pills" role="tablist">
{
sidebarPeople.map((person, i) => {
const index = i + 1;
return (
<a
href="#chat-1"
class:list={['nav-link text-start mw-100 p-3', index === 1 && 'active']}
id="chat-1-tab"
data-bs-toggle="pill"
role="tab"
aria-selected="true"
>
<div class="row align-items-center flex-fill">
<div class="col-auto">
<Avatar person={person} />
</div>
<div class="col text-body">
<div>{person.full_name}</div>
<div class="text-secondary text-truncate w-100" set:html={messages[index]?.message} />
</div>
{index === 7 && <div class="col-auto">🌴</div>}
</div>
</a>
);
})
}
</div>
</div>
</div>
<div class="col-12 col-lg-7 col-xl-9 d-flex flex-column">
<div class="card-body scrollable"><Chat wide /></div>
<div class="card-footer">
<div class="input-group input-group-flat">
<input type="text" class="form-control" autocomplete="off" placeholder="Type message" />
<span class="input-group-text">
<a href="#" class="link-secondary" data-bs-toggle="tooltip" aria-label="Clear search" title="Clear search"> <Icon name="mood-smile" /> </a>
<a href="#" class="link-secondary ms-2" data-bs-toggle="tooltip" aria-label="Add notification" title="Add notification"> <Icon name="paperclip" /> </a>
</span>
</div>
</div>
</div>
</div>
</div>
</DefaultLayout>
-55
View File
@@ -1,55 +0,0 @@
---
title: Chat
page-header: Chat
page-menu: extra.chat
layout: default
permalink: chat.html
page-container-class: flex-fill d-flex flex-column
---
{% assign person = people[4] %}
<div class="card flex-fill">
<div class="row g-0 flex-fill">
<div class="col-12 col-lg-5 col-xl-3 border-end d-flex flex-column">
<div class="card-header d-none d-md-block">
<div class="input-icon">
<span class="input-icon-addon"> {% include "ui/icon.html" icon="search" %} </span>
<input type="text" value="" class="form-control" placeholder="Search…" aria-label="Search" />
</div>
</div>
<div class="card-body p-0 scrollable flex-fill">
<div class="nav flex-column nav-pills" role="tablist">
{% for person in people limit: 10 %}
<a href="#chat-1" class="nav-link text-start mw-100 p-3{% if forloop.index == 1 %} active{% endif %}" id="chat-1-tab" data-bs-toggle="pill" role="tab" aria-selected="true">
<div class="row align-items-center flex-fill">
<div class="col-auto">{% include "ui/avatar.html" person=person %}</div>
<div class="col text-body">
<div>{{ person.full_name }}</div>
<div class="text-secondary text-truncate w-100">{{ chats[forloop.index].message }}</div>
</div>
{% if forloop.index == 7 %}
<div class="col-auto">🌴</div>
{% endif %}
</div>
</a>
{% endfor %}
</div>
</div>
</div>
<div class="col-12 col-lg-7 col-xl-9 d-flex flex-column">
<div class="card-body scrollable">{% include "ui/chat.html" wide=true %}</div>
<div class="card-footer">
<div class="input-group input-group-flat">
<input type="text" class="form-control" autocomplete="off" placeholder="Type message" />
<span class="input-group-text">
<a href="#" class="link-secondary" data-bs-toggle="tooltip" aria-label="Clear search" title="Clear search"> {% include "ui/icon.html" icon="mood-smile" %} </a>
<a href="#" class="link-secondary ms-2" data-bs-toggle="tooltip" aria-label="Add notification" title="Add notification"> {% include "ui/icon.html" icon="paperclip" %} </a>
</span>
</div>
</div>
</div>
</div>
</div>
+34
View File
@@ -0,0 +1,34 @@
---
// Port of preview/pages/colorpicker.html (layout: default).
// Liquid: {% for color in site.colors %} — forloop.index (1-based) → id,
// color[1].hex → value.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Colorpicker from '@shared/components/ui/Colorpicker.astro';
import site from '@data/site.json';
const colors = Object.values(site.colors) as { hex: string }[];
---
<DefaultLayout
title="Color picker"
pageHeader="Color picker"
pageMenu="plugins.colorpicker"
pageLibs={['coloris.js']}
>
<div class="card">
<div class="card-body">
<h3 class="card-title">Basic</h3>
<div class="row g-3">
{
colors.map((color, index) => (
<div class="col-2">
<div>
<Colorpicker value={color.hex} id={index + 1} format="hex" />
</div>
</div>
))
}
</div>
</div>
</div>
</DefaultLayout>
-21
View File
@@ -1,21 +0,0 @@
---
title: Color picker
page-header: Color picker
page-menu: plugins.colorpicker
page-libs: [coloris.js]
layout: default
permalink: colorpicker.html
---
<div class="card">
<div class="card-body">
<h3 class="card-title">Basic</h3>
<div class="row g-3">
{% for color in site.colors %}
<div class="col-2">
<div>{% include "ui/colorpicker.html" value=color[1].hex id=forloop.index format="hex" %}</div>
</div>
{% endfor %}
</div>
</div>
</div>
+247
View File
@@ -0,0 +1,247 @@
---
// Port of preview/pages/colors.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Icon from '@shared/components/Icon.astro';
import site from '@data/site.json';
type ColorEntry = [string, { title: string; hex: string; abbr?: string; icon?: string }];
// Liquid iterates the site.json objects as [key, value] pairs.
const colors = Object.entries(site.colors) as ColorEntry[];
const lightColors = Object.entries(site.lightColors) as ColorEntry[];
const grayColors = Object.entries(site.grayColors) as ColorEntry[];
const socialColors = Object.entries(site.socialColors) as ColorEntry[];
// Liquid: colors keys + inverted, white, transparent (pushed before the gradient loops).
const gradientColors = [...Object.keys(site.colors), 'inverted', 'white', 'transparent'];
---
<DefaultLayout title="Colors" pageHeader="Colors" pageMenu="base.colors">
<div class="row row-cards">
<div class="col-3">
<div class="card">
<div class="card-body">
<div class="row g-3">
{
colors.map(([name, color]) => (
<div class="col-12">
<div class="row align-items-center">
<div class="col-auto">
<div class={`avatar bg-${name} text-${name}-fg avatar-square`}>{color.abbr}</div>
</div>
<div class="col">
{color.title}
<br />
<code>{color.hex}</code>
</div>
</div>
</div>
))
}
</div>
</div>
</div>
</div>
<div class="col-3">
<div class="card">
<div class="card-body">
<div class="row g-3">
{
lightColors.map(([name, color]) => (
<div class="col-12">
<div class="row align-items-center">
<div class="col-auto">
<div class={`avatar bg-${name}-lt text-${name}-lt-fg avatar-square`}>{color.abbr}</div>
</div>
<div class="col">
{color.title}
<br />
<code>{color.hex}</code>
</div>
</div>
</div>
))
}
</div>
</div>
</div>
</div>
<div class="col-3">
<div class="card">
<div class="card-body">
<div class="row g-3">
{
grayColors.map(([name, color]) => (
<div class="col-12">
<div class="row align-items-center">
<div class="col-auto">
<div class={`avatar bg-${name} text-${name}-fg avatar-square`}>{color.abbr}</div>
</div>
<div class="col">
{color.title}
<br />
<code>{color.hex}</code>
</div>
</div>
</div>
))
}
</div>
</div>
</div>
</div>
<div class="col-3">
<div class="card">
<div class="card-body">
<div class="row g-3">
{
socialColors.map(([name, color]) => (
<div class="col-12">
<div class="row align-items-center">
<div class="col-auto">
<div class={`avatar bg-${name} text-${name}-fg avatar-square`}>
{color.icon && <Icon name={color.icon} />}
</div>
</div>
<div class="col">
{color.title}
<br />
<code>{color.hex}</code>
</div>
</div>
</div>
))
}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="row">
<div class="col-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">Gradient</h3>
<form action="">
<div class="row g-4">
<div class="col">
<div>
<label class="form-label">From</label>
<select class="form-select" name="color-from">
{gradientColors.map((color) => <option value={color}>{color}</option>)}
</select>
</div>
<div class="mt-3">
<label class="form-label">To</label>
<select class="form-select" name="color-to">
{
gradientColors.map((color) => (
<option value={color} selected={color === 'transparent'}>
{color}
</option>
))
}
</select>
</div>
</div>
<div class="col">
<div>
<label class="form-label">Via</label>
<select class="form-select" name="color-via">
<option></option>
{gradientColors.map((color) => <option value={color}>{color}</option>)}
</select>
</div>
<div class="mt-3">
<label class="form-label">Direction</label>
<select class="form-select" name="color-direction">
<option value="to-t">to top</option>
<option value="to-te">to top right</option>
<option value="to-r" selected>to right</option>
<option value="to-be">to bottom right</option>
<option value="to-b">to bottom</option>
<option value="to-bs">to bottom left</option>
<option value="to-s">to left</option>
<option value="to-ts">to top left</option>
</select>
</div>
</div>
<div class="col-12">
<div class="border rounded bg-pattern-transparent overflow-hidden">
<div
id="gradient-preview"
class="border rounded bg-gradient bg-gradient-from-primary bg-gradient-to-transparent"
>
<div class=" px-4 py-5"></div>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="col-6">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col">
<div class="space-y">
{
gradientColors.map((color) => (
<div class={`border rounded bg-gradient bg-gradient-from-${color} bg-gradient-to-transparent px-4 py-2`} />
))
}
</div>
</div>
<div class="col">
<div class="space-y">
{
gradientColors.map((color) => (
<div class={`border rounded bg-gradient bg-gradient-to-${color} bg-gradient-from-transparent px-4 py-2`} />
))
}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script is:inline>
document.addEventListener('DOMContentLoaded', function () {
var gradientPreview = document.getElementById('gradient-preview');
var colorFrom = document.querySelector('[name="color-from"]');
var colorTo = document.querySelector('[name="color-to"]');
var colorVia = document.querySelector('[name="color-via"]');
var colorDirection = document.querySelector('[name="color-direction"]');
function updateGradient() {
var from = colorFrom.value;
var to = colorTo.value;
var via = colorVia.value;
var direction = colorDirection.value;
var gradient = 'bg-gradient bg-gradient-from-' + from + ' bg-gradient-to-' + to;
if (via) {
gradient += ' bg-gradient-via-' + via;
}
gradient += ' bg-gradient-' + direction;
gradientPreview.className = gradient;
}
colorFrom.addEventListener('change', updateGradient);
colorTo.addEventListener('change', updateGradient);
colorVia.addEventListener('change', updateGradient);
colorDirection.addEventListener('change', updateGradient);
updateGradient();
});
</script>
</DefaultLayout>
-240
View File
@@ -1,240 +0,0 @@
---
title: Colors
page-header: Colors
page-menu: base.colors
layout: default
permalink: colors.html
---
{% assign colors = '' | split: '' %}
{% for color in site.colors %}
{% assign colors = colors | push: color[0] %}
{% endfor %}
<div class="row row-cards">
<div class="col-3">
<div class="card">
<div class="card-body">
<div class="row g-3">
{% for color in site.colors %}
<div class="col-12">
<div class="row align-items-center">
<div class="col-auto">
<div class="avatar bg-{{ color[0] }} text-{{ color[0] }}-fg avatar-square">
{{ color[1].abbr }}
</div>
</div>
<div class="col">
{{ color[1].title }}<br />
<code>{{ color[1].hex }}</code>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-3">
<div class="card">
<div class="card-body">
<div class="row g-3">
{% for color in site.lightColors %}
<div class="col-12">
<div class="row align-items-center">
<div class="col-auto">
<div class="avatar bg-{{ color[0] }}-lt text-{{ color[0] }}-lt-fg avatar-square">
{{ color[1].abbr }}
</div>
</div>
<div class="col">
{{ color[1].title }}<br />
<code>{{ color[1].hex }}</code>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-3">
<div class="card">
<div class="card-body">
<div class="row g-3">
{% for color in site.grayColors %}
<div class="col-12">
<div class="row align-items-center">
<div class="col-auto">
<div class="avatar bg-{{ color[0] }} text-{{ color[0] }}-fg avatar-square">
{{ color[1].abbr }}
</div>
</div>
<div class="col">
{{ color[1].title }}<br />
<code>{{ color[1].hex }}</code>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-3">
<div class="card">
<div class="card-body">
<div class="row g-3">
{% for color in site.socialColors %}
<div class="col-12">
<div class="row align-items-center">
<div class="col-auto">
<div class="avatar bg-{{ color[0] }} text-{{ color[0] }}-fg avatar-square">
{% include "ui/icon.html" icon=color[1].icon %}
</div>
</div>
<div class="col">
{{ color[1].title }}<br />
<code>{{ color[1].hex }}</code>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-12">
{% assign colors = colors | push: 'inverted' %}
{% assign colors = colors | push: 'white' %}
{% assign colors = colors | push: 'transparent' %}
<div class="row">
<div class="col-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">
Gradient
</h3>
<form action="">
<div class="row g-4">
<div class="col">
<div>
<label class="form-label">From</label>
<select class="form-select" name="color-from">
{% for color in colors %}
<option value="{{ color }}">{{ color }}</option>
{% endfor %}
</select>
</div>
<div class="mt-3">
<label class="form-label">To</label>
<select class="form-select" name="color-to">
{% for color in colors %}
<option value="{{ color }}" {% if color=='transparent' %} selected{% endif %}>
{{ color }}
</option>
{% endfor %}
</select>
</div>
</div>
<div class="col">
<div>
<label class="form-label">Via</label>
<select class="form-select" name="color-via">
<option></option>
{% for color in colors %}
<option value="{{ color }}">{{ color }}</option>
{% endfor %}
</select>
</div>
<div class="mt-3">
<label class="form-label">Direction</label>
<select class="form-select" name="color-direction">
<option value="to-t">to top</option>
<option value="to-te">to top right</option>
<option value="to-r" selected>to right</option>
<option value="to-be">to bottom right</option>
<option value="to-b">to bottom</option>
<option value="to-bs">to bottom left</option>
<option value="to-s">to left</option>
<option value="to-ts">to top left</option>
</select>
</div>
</div>
<div class="col-12">
<div class="border rounded bg-pattern-transparent overflow-hidden">
<div id="gradient-preview"
class="border rounded bg-gradient bg-gradient-from-primary bg-gradient-to-transparent">
<div class=" px-4 py-5"></div>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="col-6">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col">
<div class="space-y">
{% for color in colors %}
<div
class="border rounded bg-gradient bg-gradient-from-{{ color }} bg-gradient-to-transparent px-4 py-2">
</div>
{% endfor %}
</div>
</div>
<div class="col">
<div class="space-y">
{% for color in colors %}
<div
class="border rounded bg-gradient bg-gradient-to-{{ color }} bg-gradient-from-transparent px-4 py-2">
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
var gradientPreview = document.getElementById('gradient-preview');
var colorFrom = document.querySelector('[name="color-from"]');
var colorTo = document.querySelector('[name="color-to"]');
var colorVia = document.querySelector('[name="color-via"]');
var colorDirection = document.querySelector('[name="color-direction"]');
function updateGradient() {
var from = colorFrom.value;
var to = colorTo.value;
var via = colorVia.value;
var direction = colorDirection.value;
var gradient = 'bg-gradient bg-gradient-from-' + from + ' bg-gradient-to-' + to;
if (via) {
gradient += ' bg-gradient-via-' + via;
}
gradient += ' bg-gradient-' + direction;
gradientPreview.className = gradient;
}
colorFrom.addEventListener('change', updateGradient);
colorTo.addEventListener('change', updateGradient);
colorVia.addEventListener('change', updateGradient);
colorDirection.addEventListener('change', updateGradient);
updateGradient();
});
</script>
+35
View File
@@ -0,0 +1,35 @@
---
// Port of preview/pages/cookie-banner.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
---
<DefaultLayout title="Cookie banner" pageHeader="Cookie banner" pageMenu="extra.cookie-banner">
<div
class="offcanvas offcanvas-bottom h-auto show"
tabindex="-1"
id="offcanvasBottom"
aria-modal="true"
role="dialog"
>
<div class="offcanvas-body">
<div class="container">
<div class="row align-items-center">
<div class="col">
<strong>Do you like cookies?</strong> 🍪 We use cookies to ensure you get the best experience on our website.
<a href="./terms-of-service.html" target="_blank">Learn more</a>
</div>
<div class="col-auto">
<button type="button" class="btn btn-primary" data-bs-dismiss="offcanvas">
Essential Cookies Only
</button>
</div>
<div class="col-auto">
<button type="button" class="btn btn-primary" data-bs-dismiss="offcanvas">
Allow All Cookies
</button>
</div>
</div>
</div>
</div>
</div>
</DefaultLayout>
-29
View File
@@ -1,29 +0,0 @@
---
page-header: Cookie banner
title: Cookie banner
page-menu: extra.cookie-banner
layout: default
permalink: cookie-banner.html
---
<div class="offcanvas offcanvas-bottom h-auto show" tabindex="-1" id="offcanvasBottom" aria-modal="true" role="dialog">
<div class="offcanvas-body">
<div class="container">
<div class="row align-items-center">
<div class="col">
<strong>Do you like cookies?</strong> 🍪 We use cookies to ensure you get the best experience on our website. <a href="{{ page | relative }}/terms-of-service.html" target="_blank">Learn more</a>
</div>
<div class="col-auto">
<button type="button" class="btn btn-primary" data-bs-dismiss="offcanvas">
Essential Cookies Only
</button>
</div>
<div class="col-auto">
<button type="button" class="btn btn-primary" data-bs-dismiss="offcanvas">
Allow All Cookies
</button>
</div>
</div>
</div>
</div>
</div>
+84
View File
@@ -0,0 +1,84 @@
---
// Port of preview/pages/dashboard-crm.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import CrmStats from '@shared/components/cards/CrmStats.astro';
import MrrOverview from '@shared/components/cards/charts/MrrOverview.astro';
import PipelineFunnel from '@shared/components/cards/charts/PipelineFunnel.astro';
import TopDeals from '@shared/components/cards/TopDeals.astro';
import RecentActivity from '@shared/components/cards/RecentActivity.astro';
import TasksDue from '@shared/components/cards/TasksDue.astro';
import TeamLeaderboard from '@shared/components/cards/TeamLeaderboard.astro';
import ChurnRisk from '@shared/components/cards/ChurnRisk.astro';
---
<DefaultLayout
title="CRM Dashboard"
pageHeader="CRM Dashboard"
description="Welcome back — here's your CRM overview for today."
pageMenu="dashboards.crm"
pageLibs={['apexcharts']}
>
<div>
<div class="col-12">
<div class="row row-cards">
<div class="col-sm-6 col-lg-3">
<CrmStats color="primary" icon="currency-dollar" lt title="MRR" description="$92.4K" changeValue="+9.5" />
</div>
<div class="col-sm-6 col-lg-3">
<CrmStats color="azure" icon="filter" lt title="Pipeline" description="$2.4M" changeValue="+14" />
</div>
<div class="col-sm-6 col-lg-3">
<CrmStats color="green" icon="circle-check" lt title="Deals won" description="74" changeValue="+8" />
</div>
<div class="col-sm-6 col-lg-3">
<CrmStats color="purple" icon="percentage" lt title="Conversion" description="5.97%" changeValue="+0.4" />
</div>
<div class="col-sm-6 col-lg-3">
<CrmStats color="yellow" icon="activity" lt title="Activities" description="318" changeValue="+22" />
</div>
<div class="col-sm-6 col-lg-3">
<CrmStats color="red" icon="clock" lt title="Tasks due" description="12" changeValue="-3" changeValueUnit=" urgent" />
</div>
<div class="col-sm-6 col-lg-3">
<CrmStats color="cyan" icon="user-plus" lt title="Leads added" description="148" changeValue="+31" />
</div>
<div class="col-sm-6 col-lg-3">
<CrmStats color="green" icon="trending-up" lt title="Churn rate" description="1.8%" changeValue="-0.3" />
</div>
<div class="col-lg-6">
<div class="row row-cards">
<div class="col-12">
<MrrOverview />
</div>
<div class="col-12">
<TopDeals />
</div>
</div>
</div>
<div class="col-lg-6">
<div class="row row-cards">
<div class="col-12">
<PipelineFunnel />
</div>
<div class="col-12">
<RecentActivity />
</div>
</div>
</div>
<div class="col-lg-4">
<TasksDue />
</div>
<div class="col-lg-4">
<TeamLeaderboard />
</div>
<div class="col-lg-4">
<ChurnRisk />
</div>
</div>
</div>
</div>
</DefaultLayout>
-81
View File
@@ -1,81 +0,0 @@
---
title: CRM Dashboard
page-header: CRM Dashboard
page-header-description: Welcome back — here's your CRM overview for today.
page-menu: dashboards.crm
page-libs: [apexcharts]
layout: default
permalink: dashboard-crm.html
---
<div>
<div class="col-12">
<div class="row row-cards">
<div class="col-sm-6 col-lg-3">
{% include "cards/crm-stats.html" color="primary" icon="currency-dollar" lt=true
title="MRR" description="$92.4K" change-value="+9.5" %}
</div>
<div class="col-sm-6 col-lg-3">
{% include "cards/crm-stats.html" color="azure" icon="filter" lt=true
title="Pipeline" description="$2.4M" change-value="+14" %}
</div>
<div class="col-sm-6 col-lg-3">
{% include "cards/crm-stats.html" color="green" icon="circle-check" lt=true
title="Deals won" description="74" change-value="+8" %}
</div>
<div class="col-sm-6 col-lg-3">
{% include "cards/crm-stats.html" color="purple" icon="percentage" lt=true
title="Conversion" description="5.97%" change-value="+0.4" %}
</div>
<div class="col-sm-6 col-lg-3">
{% include "cards/crm-stats.html" color="yellow" icon="activity" lt=true
title="Activities" description="318" change-value="+22" %}
</div>
<div class="col-sm-6 col-lg-3">
{% include "cards/crm-stats.html" color="red" icon="clock" lt=true
title="Tasks due" description="12" change-value="-3" change-value-unit=" urgent" %}
</div>
<div class="col-sm-6 col-lg-3">
{% include "cards/crm-stats.html" color="cyan" icon="user-plus" lt=true
title="Leads added" description="148" change-value="+31" %}
</div>
<div class="col-sm-6 col-lg-3">
{% include "cards/crm-stats.html" color="green" icon="trending-up" lt=true
title="Churn rate" description="1.8%" change-value="-0.3" %}
</div>
<div class="col-lg-6">
<div class="row row-cards">
<div class="col-12">
{% include "cards/charts/mrr-overview.html" %}
</div>
<div class="col-12">
{% include "cards/top-deals.html" %}
</div>
</div>
</div>
<div class="col-lg-6">
<div class="row row-cards">
<div class="col-12">
{% include "cards/charts/pipeline-funnel.html" %}
</div>
<div class="col-12">
{% include "cards/recent-activity.html" %}
</div>
</div>
</div>
<div class="col-lg-4">
{% include "cards/tasks-due.html" %}
</div>
<div class="col-lg-4">
{% include "cards/team-leaderboard.html" %}
</div>
<div class="col-lg-4">
{% include "cards/churn-risk.html" %}
</div>
</div>
</div>
</div>
+334
View File
@@ -0,0 +1,334 @@
---
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Avatar from '@shared/components/ui/Avatar.astro';
import Trending from '@shared/components/ui/Trending.astro';
import CardDropdown from '@shared/components/ui/CardDropdown.astro';
import NavSegmented from '@shared/components/ui/NavSegmented.astro';
import Chart from '@shared/components/Chart.astro';
import SwitchIcon from '@shared/components/ui/SwitchIcon.astro';
import cryptoCurrencies from '@data/crypto-currencies.json';
import cryptoMarkets from '@data/crypto-markets.json';
import cryptoOrders from '@data/crypto-orders.json';
interface Currency {
symbol: string;
price: string;
p24h: number;
'volume-24h': string;
}
const currencies = cryptoCurrencies as Currency[];
const find = (symbol: string) => currencies.find((c) => c.symbol === symbol)!;
const btc = find('BTC');
const ltc = find('LTC');
const eth = find('ETH');
const xmr = find('XMR');
const btcBalance = 2.3;
const num = (s: string) => parseFloat(s.replace(/[$,]/g, ''));
const btcPriceNum = num(btc.price);
const totalUsd = Math.round(btcPriceNum * btcBalance).toLocaleString('en-US');
// Liquid `divided_by` then `round: 8` (trailing zeros dropped by number output)
const r8 = (x: number) => parseFloat(x.toFixed(8));
const ltcBtc = r8(num(ltc.price) / btcPriceNum);
const ethBtc = r8(num(eth.price) / btcPriceNum);
const xmrBtc = r8(num(xmr.price) / btcPriceNum);
const markets = (cryptoMarkets as { coin: string; price: string; volume: string; change: string }[]).slice(0, 10);
const orders = cryptoOrders as { sell_orders: { price: string; btc: string; sum: string }[]; buy_orders: { price: string; btc: string; sum: string }[] };
const operationCurrencies = currencies.slice(0, 20);
---
<DefaultLayout
title="Crypto Dashboard"
pageHeader="Crypto Dashboard"
pageMenu="dashboards.crypto"
pageLibs={['apexcharts']}
>
<div class="row row-cards">
<div class="col-12">
<div class="row row-cards">
<div class="col-12 col-md-6 col-xxl">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col mt-0">
<h5 class="card-title">Total balance</h5>
</div>
<div class="col-auto">
<Avatar icon="currency-dollar" />
</div>
</div>
<div class="mb-1">
<span class="h3">${totalUsd}</span>
<span class="text-muted">{btcBalance} {btc.symbol}</span>
</div>
<div class="mb-0">
<Trending value={btc.p24h} />
<span class="text-muted">Since last week</span>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-xxl">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col mt-0">
<h5 class="card-title">USD/BTC</h5>
</div>
<div class="col-auto">
<Avatar icon="currency-bitcoin" />
</div>
</div>
<div class="mb-1">
<span class="h3">{btc.price}</span>
<span class="text-muted">{btc.price}</span>
</div>
<div class="mb-0">
<span class="text-muted">Volume: {btc['volume-24h']}</span>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-xxl">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col mt-0">
<h5 class="card-title">LTC/BTC</h5>
</div>
<div class="col-auto">
<Avatar icon="currency-litecoin" />
</div>
</div>
<div class="mb-1">
<span class="h3">{ltcBtc}</span>
<span class="text-muted">{ltc.price}</span>
</div>
<div class="mb-0">
<span class="text-muted">Volume: {ltc['volume-24h'].replace('$', '')}</span>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-xxl">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col mt-0">
<h5 class="card-title">ETH/BTC</h5>
</div>
<div class="col-auto">
<Avatar icon="currency-ethereum" />
</div>
</div>
<div class="mb-1">
<span class="h3">{ethBtc}</span>
<span class="text-muted">{eth.price}</span>
</div>
<div class="mb-0">
<span class="text-muted">Volume: {eth['volume-24h'].replace('$', '')}</span>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-xxl">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col mt-0">
<h5 class="card-title">XMR/BTC</h5>
</div>
<div class="col-auto">
<Avatar icon="currency-monero" />
</div>
</div>
<div class="mb-1">
<span class="h3">{xmrBtc}</span>
<span class="text-muted">{xmr.price}</span>
</div>
<div class="mb-0">
<span class="text-muted">Volume: {xmr['volume-24h'].replace('$', '')}</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="row row-cards">
<div class="col-12 col-lg-5">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">Markets</h5>
<div class="card-actions">
<CardDropdown />
</div>
</div>
<table class="table card-table table-striped">
<thead>
<tr>
<th>
<SwitchIcon icon="star" iconBColor="yellow" variant="slide-up" />
</th>
<th>Coin</th>
<th>Price</th>
<th class="d-none d-xl-table-cell">Volume</th>
<th class="d-none d-xl-table-cell text-end">Change</th>
</tr>
</thead>
<tbody>
{
markets.map((market) => (
<tr>
<td>
<SwitchIcon icon="star" iconBColor="yellow" variant="slide-up" />
</td>
<td>{market.coin}</td>
<td class="">{market.price}</td>
<td class="d-none d-xl-table-cell">{market.volume}</td>
<td class="d-none d-xl-table-cell text-end">
<Trending value={market.change as unknown as number} />
</td>
</tr>
))
}
</tbody>
</table>
</div>
</div>
<div class="col-12 col-lg-7">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">LTC/BTC</h5>
<div class="card-actions">
<NavSegmented items="1m,5m,30m,1h,1d" name="timeframe" size="sm" default={2} />
</div>
</div>
<div class="card-body">
<Chart chartId="dashboard-crypto-candlestick" height={28} />
</div>
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="row row-cards">
<div class="col-12 col-lg-12 col-xxl-3">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">Operations</h5>
<div class="card-actions">
<NavSegmented items="Buy,Sell,Send" name="operations" size="sm" />
</div>
</div>
<div class="card-body">
<p>Place new order:</p>
<div class="input-group mb-3">
<label class="input-group-text">Amount</label>
<select class="form-select">
{
operationCurrencies.map((currency, i) => (
<option value={currency.symbol} selected={i === 0}>
{currency.symbol}
</option>
))
}
</select>
<input type="text" class="form-control" value="0.25" />
</div>
<div class="input-group mb-3">
<label class="input-group-text">Price</label>
<input type="text" class="form-control" readonly="" value="23,077.05" />
<label class="input-group-text">$</label>
</div>
<div class="input-group mb-3">
<label class="input-group-text">Total</label>
<input type="text" class="form-control" readonly="" value="5,769.27" />
<label class="input-group-text">$</label>
</div>
<div class="d-grid">
<button type="button" class="btn btn-primary mb-3">Process to wallet</button>
</div>
<p class="text-muted mb-0 small">The final amount could change depending on current market conditions.</p>
</div>
</div>
</div>
<div class="col-12 col-lg-6 col-xxl">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">Sell Orders</h5>
<div class="card-actions">
<button class="btn btn-sm">View all</button>
</div>
</div>
<table class="table card-table table-striped">
<thead>
<tr>
<th>Price</th>
<th class="d-none d-xl-table-cell">BTC</th>
<th>Sum(BTC)</th>
</tr>
</thead>
<tbody>
{
orders.sell_orders.map((order) => (
<tr>
<td>{order.price}</td>
<td class="d-none d-xl-table-cell">{order.btc}</td>
<td>{order.sum}</td>
</tr>
))
}
</tbody>
</table>
</div>
</div>
<div class="col-12 col-lg-6 col-xxl">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">Buy Orders</h5>
<div class="card-actions">
<button class="btn btn-sm">View all</button>
</div>
</div>
<table class="table card-table table-striped">
<thead>
<tr>
<th>Price</th>
<th class="d-none d-xl-table-cell">BTC</th>
<th>Sum(BTC)</th>
</tr>
</thead>
<tbody>
{
orders.buy_orders.map((order) => (
<tr>
<td>{order.price}</td>
<td class="d-none d-xl-table-cell">{order.btc}</td>
<td>{order.sum}</td>
</tr>
))
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</DefaultLayout>
-301
View File
@@ -1,301 +0,0 @@
---
title: Crypto Dashboard
page-header: Crypto Dashboard
page-menu: dashboards.crypto
page-libs: [apexcharts]
layout: default
permalink: dashboard-crypto.html
---
{% assign btc = crypto-currencies | where: "symbol", "BTC" | first %}
{% assign ltc = crypto-currencies | where: "symbol", "LTC" | first %}
{% assign eth = crypto-currencies | where: "symbol", "ETH" | first %}
{% assign xmr = crypto-currencies | where: "symbol", "XMR" | first %}
{% assign btc_balance = 2.30 %}
{% assign btc_price_num = btc.price | remove: "$" | remove: "," | plus: 0 %}
{% assign total_usd_raw = btc_price_num | times: btc_balance %}
{% assign ltc_price_num = ltc.price | remove: "$" | remove: "," | plus: 0 %}
{% assign eth_price_num = eth.price | remove: "$" | remove: "," | plus: 0 %}
{% assign xmr_price_num = xmr.price | remove: "$" | remove: "," | plus: 0 %}
{% assign ltc_btc = ltc_price_num | divided_by: btc_price_num %}
{% assign eth_btc = eth_price_num | divided_by: btc_price_num %}
{% assign xmr_btc = xmr_price_num | divided_by: btc_price_num %}
<div class="row row-cards">
<div class="col-12">
<div class="row row-cards">
<div class="col-12 col-md-6 col-xxl">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col mt-0">
<h5 class="card-title">Total balance</h5>
</div>
<div class="col-auto">
{% include "ui/avatar.html" icon="currency-dollar" %}
</div>
</div>
<div class="mb-1">
<span class="h3">${{ total_usd_raw | round | format_number }}</span>
<span class="text-muted">{{ btc_balance }} {{ btc.symbol }}</span>
</div>
<div class="mb-0">
{% include "ui/trending.html" value=btc.p24h %}
<span class="text-muted">Since last week</span>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-xxl">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col mt-0">
<h5 class="card-title">USD/BTC</h5>
</div>
<div class="col-auto">
{% include "ui/avatar.html" icon="currency-bitcoin" %}
</div>
</div>
<div class="mb-1">
<span class="h3">{{ btc.price }}</span>
<span class="text-muted">{{ btc.price}}</span>
</div>
<div class="mb-0">
<span class="text-muted">Volume: {{ btc.volume-24h }}</span>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-xxl">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col mt-0">
<h5 class="card-title">LTC/BTC</h5>
</div>
<div class="col-auto">
{% include "ui/avatar.html" icon="currency-litecoin" %}
</div>
</div>
<div class="mb-1">
<span class="h3">{{ ltc_btc | round: 8 }}</span>
<span class="text-muted">{{ ltc.price }}</span>
</div>
<div class="mb-0">
<span class="text-muted">Volume: {{ ltc.volume-24h | remove: "$" }}</span>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-xxl">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col mt-0">
<h5 class="card-title">ETH/BTC</h5>
</div>
<div class="col-auto">
{% include "ui/avatar.html" icon="currency-ethereum" %}
</div>
</div>
<div class="mb-1">
<span class="h3">{{ eth_btc | round: 8 }}</span>
<span class="text-muted">{{ eth.price }}</span>
</div>
<div class="mb-0">
<span class="text-muted">Volume: {{ eth.volume-24h | remove: "$" }}</span>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-xxl">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col mt-0">
<h5 class="card-title">XMR/BTC</h5>
</div>
<div class="col-auto">
{% include "ui/avatar.html" icon="currency-monero" %}
</div>
</div>
<div class="mb-1">
<span class="h3">{{ xmr_btc | round: 8 }}</span>
<span class="text-muted">{{ xmr.price }}</span>
</div>
<div class="mb-0">
<span class="text-muted">Volume: {{ xmr.volume-24h | remove: "$" }}</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="row row-cards">
<div class="col-12 col-lg-5">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">Markets</h5>
<div class="card-actions">
{% include "ui/card-dropdown.html" %}
</div>
</div>
<table class="table card-table table-striped">
<thead>
<tr>
<th>
{% include "ui/switch-icon.html" icon="star" icon-b-color="yellow" variant="slide-up" %}
</th>
<th>Coin</th>
<th>Price</th>
<th class="d-none d-xl-table-cell">Volume</th>
<th class="d-none d-xl-table-cell text-end">Change</th>
</tr>
</thead>
<tbody>
{% for market in crypto-markets limit: 10 %}
<tr>
<td>
{% include "ui/switch-icon.html" icon="star" icon-b-color="yellow" variant="slide-up" %}
</td>
<td>{{ market.coin }}</td>
<td class="">{{ market.price }}</td>
<td class="d-none d-xl-table-cell">{{ market.volume }}</td>
<td class="d-none d-xl-table-cell text-end">
{% include "ui/trending.html" value=market.change %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="col-12 col-lg-7">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">LTC/BTC</h5>
<div class="card-actions">
{% include "ui/nav-segmented.html" items="1m,5m,30m,1h,1d" name="timeframe" size="sm" default=2 %}
</div>
</div>
<div class="card-body">
{% include "ui/chart.html" chart-id="dashboard-crypto-candlestick" height=28 %}
</div>
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="row row-cards">
<div class="col-12 col-lg-12 col-xxl-3">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">Operations</h5>
<div class="card-actions">
{% include "ui/nav-segmented.html" items="Buy,Sell,Send" name="operations" size="sm" %}
</div>
</div>
<div class="card-body">
<p>Place new order:</p>
<div class="input-group mb-3">
<label class="input-group-text">Amount</label>
<select class="form-select">
{% for currency in crypto-currencies limit: 20 %}
<option value="{{ currency.symbol }}"{% if forloop.first %} selected{% endif %}>{{ currency.symbol }}</option>
{% endfor %}
</select>
<input type="text" class="form-control" value="0.25">
</div>
<div class="input-group mb-3">
<label class="input-group-text">Price</label>
<input type="text" class="form-control" readonly="" value="23,077.05">
<label class="input-group-text">$</label>
</div>
<div class="input-group mb-3">
<label class="input-group-text">Total</label>
<input type="text" class="form-control" readonly="" value="5,769.27">
<label class="input-group-text">$</label>
</div>
<div class="d-grid">
<button type="button" class="btn btn-primary mb-3">Process to wallet</button>
</div>
<p class="text-muted mb-0 small">The final amount could change depending on current market conditions.</p>
</div>
</div>
</div>
<div class="col-12 col-lg-6 col-xxl">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">Sell Orders</h5>
<div class="card-actions">
<button class="btn btn-sm">View all</button>
</div>
</div>
<table class="table card-table table-striped">
<thead>
<tr>
<th>Price</th>
<th class="d-none d-xl-table-cell">BTC</th>
<th>Sum(BTC)</th>
</tr>
</thead>
<tbody>
{% for order in crypto-orders.sell_orders %}
<tr>
<td>{{ order.price }}</td>
<td class="d-none d-xl-table-cell">{{ order.btc }}</td>
<td>{{ order.sum }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="col-12 col-lg-6 col-xxl">
<div class="card">
<div class="card-header">
<h5 class="card-title mb-0">Buy Orders</h5>
<div class="card-actions">
<button class="btn btn-sm">View all</button>
</div>
</div>
<table class="table card-table table-striped">
<thead>
<tr>
<th>Price</th>
<th class="d-none d-xl-table-cell">BTC</th>
<th>Sum(BTC)</th>
</tr>
</thead>
<tbody>
{% for order in crypto-orders.buy_orders %}
<tr>
<td>{{ order.price }}</td>
<td class="d-none d-xl-table-cell">{{ order.btc }}</td>
<td>{{ order.sum }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
+16
View File
@@ -0,0 +1,16 @@
---
// Port of preview/pages/datagrid.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Datagrid from '@shared/components/parts/Datagrid.astro';
---
<DefaultLayout title="Data grid" pageHeader="Data grid" pageMenu="base.datagrid">
<div class="card">
<div class="card-header">
<h3 class="card-title">Base info</h3>
</div>
<div class="card-body">
<Datagrid />
</div>
</div>
</DefaultLayout>
-16
View File
@@ -1,16 +0,0 @@
---
title: Data grid
page-header: Data grid
page-menu: base.datagrid
layout: default
permalink: datagrid.html
---
<div class="card">
<div class="card-header">
<h3 class="card-title">Base info</h3>
</div>
<div class="card-body">
{% include "parts/datagrid.html" %}
</div>
</div>
+84
View File
@@ -0,0 +1,84 @@
---
// Port of preview/pages/datatables.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import { liquidUnixSeconds, liquidLongDate } from '@shared/lib/liquid-date';
import Progress from '@shared/components/ui/Progress.astro';
import TablerList from '@shared/components/js/TablerList.astro';
import rollercoasters from '@data/rollercoasters.json';
const id = 'default';
// Equivalent of the random_number / random_date filters from shared/e11ty/filters.mjs.
function randomNumber(x: number, min = 0, max = 100): number {
let value =
((x * x * Math.PI * Math.E * (max + 1) * (Math.sin(x) / Math.cos(x * x))) % (max + 1 - min)) + min;
value = value > max ? max : value;
value = value < min ? min : value;
return Math.floor(value);
}
function randomDate(x: number): Date {
const start = new Date('2024-01-01').getTime() / 1000;
const end = new Date('2024-12-30').getTime() / 1000;
return new Date(randomNumber(x, start, end) * 1000);
}
const rows = (rollercoasters as Record<string, any>[]).map((rc, i) => {
const index = i + 1;
const progress = randomNumber(index, 0, 100);
const date = randomDate(index);
return {
rc,
progress,
quantity: randomNumber(index, 1, 200),
dateSeconds: liquidUnixSeconds(date),
dateLabel: liquidLongDate(date),
};
});
const parameters =
"[ 'sort-name', 'sort-type', 'sort-city', 'sort-score', { attr: 'data-date', name: 'sort-date' }, { attr: 'data-progress', name: 'sort-progress' }, 'sort-quantity' ]";
---
<DefaultLayout title="Datatables" pageHeader="Datatables" pageMenu="plugins.datatables" pageLibs={['lists']}>
<div class="card">
<div class="card-body p-0">
<div id={`table-${id}`} class="table-responsive">
<table class="table">
<thead>
<tr>
<th><button class="table-sort" data-sort="sort-name">Name</button></th>
<th><button class="table-sort" data-sort="sort-city">City</button></th>
<th><button class="table-sort" data-sort="sort-type">Type</button></th>
<th><button class="table-sort" data-sort="sort-score">Score</button></th>
<th><button class="table-sort" data-sort="sort-date">Date</button></th>
<th><button class="table-sort" data-sort="sort-quantity">Quantity</button></th>
<th><button class="table-sort" data-sort="sort-progress">Progress</button></th>
</tr>
</thead>
<tbody class="table-tbody">
{rows.map(({ rc, progress, quantity, dateSeconds, dateLabel }) => (
<tr>
<td class="sort-name">{rc.name}</td>
<td class="sort-city">{rc.city}</td>
<td class="sort-type">{rc.type}</td>
<td class="sort-score">{rc.score}</td>
<td class="sort-date" data-date={dateSeconds}>{dateLabel}</td>
<td class="sort-quantity">{quantity}</td>
<td class="sort-progress" data-progress={progress}>
<div class="row align-items-center">
<div class="col-12 col-lg-auto">{progress}%</div>
<div class="col"><Progress value={progress} width="5rem" /></div>
</div>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
</div>
<TablerList id={id} parameters={parameters} />
</DefaultLayout>
-52
View File
@@ -1,52 +0,0 @@
---
title: Datatables
page-header: Datatables
page-libs: [lists]
page-menu: plugins.datatables
layout: default
permalink: datatables.html
---
{% assign id = include.map-id | default: 'default' %}
<div class="card">
<div class="card-body p-0">
{% assign products = 'Tabler,Tabler Icons,Tabler Emails,Tabler Components,Tabler Illustrations,Bootstrap' | split: ',' %}
{% assign techs = 'brand-apple,brand-windows,brand-debian,brand-android' | split: ',' %}
<div id="table-{{ id }}" class="table-responsive">
<table class="table">
<thead>
<tr>
<th><button class="table-sort" data-sort="sort-name">Name</button></th>
<th><button class="table-sort" data-sort="sort-city">City</button></th>
<th><button class="table-sort" data-sort="sort-type">Type</button></th>
<th><button class="table-sort" data-sort="sort-score">Score</button></th>
<th><button class="table-sort" data-sort="sort-date">Date</button></th>
<th><button class="table-sort" data-sort="sort-quantity">Quantity</button></th>
<th><button class="table-sort" data-sort="sort-progress">Progress</button></th>
</tr>
</thead>
<tbody class="table-tbody">
{% for rc in rollercoasters %}
{% assign progress = forloop.index | random_number %}
<tr>
<td class="sort-name">{{ rc.name }}</td>
<td class="sort-city">{{ rc.city }}</td>
<td class="sort-type">{{ rc.type }}</td>
<td class="sort-score">{{ rc.score }}</td>
<td class="sort-date" data-date="{{ forloop.index | random_date | date: '%s' }}">{{ forloop.index | random_date | date: '%B %d, %Y' }}</td>
<td class="sort-quantity">{{ forloop.index | random_number: 1, 200 }}</td>
<td class="sort-progress" data-progress="{{ progress }}">
<div class="row align-items-center">
<div class="col-12 col-lg-auto">{{ progress }}%</div>
<div class="col">{% include "ui/progress.html" value=progress width="5rem" %}</div>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% include "js/tabler-list.html", parameters="[ 'sort-name', 'sort-type', 'sort-city', 'sort-score', { attr: 'data-date', name: 'sort-date' }, { attr: 'data-progress', name: 'sort-progress' }, 'sort-quantity' ]" %}
-6
View File
@@ -1,6 +0,0 @@
---
layout: redirect
redirect:
to: https://tabler.io/docs
permalink: docs/index.html
---
+42
View File
@@ -0,0 +1,42 @@
---
// Port of preview/pages/dropdowns.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import DropdownMenu from '@shared/components/ui/DropdownMenu.astro';
import DropdownMenuAll from '@shared/components/ui/DropdownMenuAll.astro';
---
<DefaultLayout title="Dropdowns" pageHeader="Dropdowns" pageMenu="base.dropdowns">
<div class="row">
<div class="col-sm-6 col-lg-3">
<DropdownMenuAll show />
</div>
<div class="col-sm-6 col-lg-3">
<DropdownMenu show />
<DropdownMenu show separated />
<DropdownMenu show active />
<DropdownMenu show disabled />
<DropdownMenu show header />
<DropdownMenu show icons header />
<DropdownMenu show arrow />
</div>
<div class="col-sm-6 col-lg-3">
<DropdownMenu show />
<DropdownMenu show separated />
<DropdownMenu show active />
<DropdownMenu show disabled />
<DropdownMenu show header />
<DropdownMenu show icons />
<DropdownMenu show badge />
</div>
<div class="col-sm-6 col-lg-3">
<DropdownMenu show dark />
<DropdownMenu show dark separated />
<DropdownMenu show arrow right dark />
<DropdownMenu show arrow right dark icons />
<DropdownMenu show check />
<DropdownMenu show radio />
<DropdownMenu show people />
<DropdownMenu show flag />
</div>
</div>
</DefaultLayout>
-44
View File
@@ -1,44 +0,0 @@
---
title: Dropdowns
page-header: Dropdowns
page-menu: base.dropdowns
layout: default
permalink: dropdowns.html
---
<div class="row">
<div class="col-sm-6 col-lg-3">
{% include "ui/dropdown-menu-all.html" show=true %}
</div>
<div class="col-sm-6 col-lg-3">
{% include "ui/dropdown-menu.html" show=true %}
{% include "ui/dropdown-menu.html" show=true separated=true %}
{% include "ui/dropdown-menu.html" show=true active=true %}
{% include "ui/dropdown-menu.html" show=true disabled=true %}
{% include "ui/dropdown-menu.html" show=true header=true %}
{% include "ui/dropdown-menu.html" show=true icons=true header=true %}
{% include "ui/dropdown-menu.html" show=true arrow=true %}
</div>
<div class="col-sm-6 col-lg-3">
{% include "ui/dropdown-menu.html" show=true %}
{% include "ui/dropdown-menu.html" show=true separated=true %}
{% include "ui/dropdown-menu.html" show=true active=true %}
{% include "ui/dropdown-menu.html" show=true disabled=true %}
{% include "ui/dropdown-menu.html" show=true header=true %}
{% include "ui/dropdown-menu.html" show=true icons=true %}
{% include "ui/dropdown-menu.html" show=true badge=true %}
</div>
<div class="col-sm-6 col-lg-3">
{% include "ui/dropdown-menu.html" show=true dark=true %}
{% include "ui/dropdown-menu.html" show=true dark=true separated=true %}
{% include "ui/dropdown-menu.html" show=true arrow=true right=true dark=true %}
{% include "ui/dropdown-menu.html" show=true arrow=true right=true dark=true icons=true %}
{% include "ui/dropdown-menu.html" show=true check=true %}
{% include "ui/dropdown-menu.html" show=true radio=true %}
{% include "ui/dropdown-menu.html" show=true people=true %}
{% include "ui/dropdown-menu.html" show=true flag=true %}
</div>
</div>
+44
View File
@@ -0,0 +1,44 @@
---
// Port of preview/pages/dropzone.html (layout: default).
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Dropzone from '@shared/components/ui/Dropzone.astro';
---
<DefaultLayout
title="Dropzone"
pageHeader="Dropzone"
pageMenu="plugins.dropzone"
pageLibs={['dropzone']}
>
<div class="row row-cards">
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">Basic Usage</h3>
<Dropzone id="default" />
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">Multiple File Upload</h3>
<Dropzone id="multiple" multiple={true} />
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">Custom Dropzone</h3>
<Dropzone
id="custom"
custom={true}
text="Your text here"
description="Your custom description here"
/>
</div>
</div>
</div>
</div>
</DefaultLayout>
-35
View File
@@ -1,35 +0,0 @@
---
title: Dropzone
page-header: Dropzone
page-menu: plugins.dropzone
page-libs: [dropzone]
layout: default
permalink: dropzone.html
---
<div class="row row-cards">
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">Basic Usage</h3>
{% include "ui/dropzone.html" id="default" %}
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">Multiple File Upload</h3>
{% include "ui/dropzone.html" id="multiple" multiple=true %}
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">Custom Dropzone</h3>
{% include "ui/dropzone.html" id="custom" custom=true text="Your text here" description="Your custom description here" %}
</div>
</div>
</div>
</div>
+201
View File
@@ -0,0 +1,201 @@
---
// Port of preview/pages/email-inbox.html.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Button from '@shared/components/Button.astro';
import Icon from '@shared/components/Icon.astro';
import Progress from '@shared/components/ui/Progress.astro';
import Modal from '@shared/components/modals/Modal.astro';
import NewEmailModalContent from '@shared/components/modals/NewEmailModalContent.astro';
import mails from '@data/mails.json';
---
<DefaultLayout
title="Email inbox"
pageHeader="Inbox"
pageMenu="extra.email-inbox"
pageLibs={['hugerte']}
>
<div class="card">
<div class="row g-0">
<div class="col-xxl-3 email-border border-end">
<div class="offcanvas-xxl offcanvas-start h-100 file-offcanvas" tabindex="-1" id="emailSidebaroffcanvas">
<div class="card-body h-100">
<div>
<Button icon="pencil" text="Compose" color="primary" class="d-none d-sm-block" modalId="new-email" />
</div>
<div class="mt-3 nav nav-vertical">
<a href="#" class="nav-link text-danger fw-bold">
<Icon name="inbox" class="me-2" />
Inbox<span class="badge badge-danger ms-auto">{mails.length}</span>
</a>
<a href="#" class="nav-link"><Icon name="star" class="me-2" />Starred</a>
<a href="#" class="nav-link"><Icon name="clock" class="me-2" />Snoozed</a>
<a href="#" class="nav-link "><Icon name="file" class="me-2" />Draft<span class="badge badge-info ms-auto">32</span></a>
<a href="#" class="nav-link"><Icon name="mail-up" class="me-2" />Sent Mail</a>
<a href="#" class="nav-link"><Icon name="trash" class="me-2" />Trash</a>
<a href="#" class="nav-link"><Icon name="tag" class="me-2" />Important</a>
<a href="#" class="nav-link"><Icon name="alert-octagon" class="me-2" />Spam</a>
</div>
<div class="mt-4">
<h6 class="subheader">Labels</h6>
<div class="mt-2 nav nav-vertical">
<a href="#" class="nav-link">
<div class="badge bg-info me-2"></div> Updates
</a>
<a href="#" class="nav-link">
<div class="badge bg-warning me-2"></div> Friends
</a>
<a href="#" class="nav-link">
<div class="badge bg-success me-2"></div> Family
</a>
<a href="#" class="nav-link">
<div class="badge bg-primary me-2"></div> Social
</a>
<a href="#" class="nav-link">
<div class="badge bg-danger me-2"></div> Important
</a>
<a href="#" class="nav-link">
<div class="badge bg-purple me-2"></div> Promotions
</a>
</div>
</div>
<div class="mt-5">
<h6 class="subheader">Storage</h6>
<Progress value={46} class="my-2" />
<p class="text-muted font-13 mb-0">7.02 GB (46%) of 15 GB used</p>
</div>
</div>
</div>
</div>
<div class="col-xxl-9">
<div class="card-body">
<div class="d-flex flex-wrap align-items-center gap-2">
<div class="d-xxl-none d-inline-flex">
<button class="btn btn-icon" type="button" data-bs-toggle="offcanvas"
data-bs-target="#emailSidebaroffcanvas" aria-controls="emailSidebaroffcanvas">
<Icon name="menu-2" />
</button>
</div>
<div class="btn-group">
<Button icon="archive" iconOnly />
<Button icon="alert-octagon" iconOnly />
<Button icon="trash" iconOnly />
</div>
<div class="btn-group">
<button type="button" class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
<Icon name="folder" />
</button>
<div class="dropdown-menu">
<span class="dropdown-header">Move to</span>
<a class="dropdown-item" href="#">Social</a>
<a class="dropdown-item" href="#">Promotions</a>
<a class="dropdown-item" href="#">Updates</a>
<a class="dropdown-item" href="#">Forums</a>
</div>
</div>
<div class="btn-group">
<button type="button" class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
<Icon name="tag" />
</button>
<div class="dropdown-menu">
<span class="dropdown-header">Label as:</span>
<a class="dropdown-item" href="#">Updates</a>
<a class="dropdown-item" href="#">Social</a>
<a class="dropdown-item" href="#">Promotions</a>
<a class="dropdown-item" href="#">Forums</a>
</div>
</div>
<div class="btn-group">
<button type="button" class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
<Icon name="dots" /> More
</button>
<div class="dropdown-menu">
<span class="dropdown-header">More Options :</span>
<a class="dropdown-item" href="#">Mark as Unread</a>
<a class="dropdown-item" href="#">Add to Tasks</a>
<a class="dropdown-item" href="#">Add Star</a>
<a class="dropdown-item" href="#">Mute</a>
</div>
</div>
</div>
<div class="mt-3">
<ul class="email-list">
{mails && mails.length > 0 ? (
mails.map((mail) => (
<li>
<div class="email-sender-info">
<div class="checkbox-wrapper-mail">
<div class="form-check">
<input type="checkbox" class="form-check-input" id={`mail-${mail.id}`} />
<label class="form-check-label" for={`mail-${mail.id}`}></label>
</div>
</div>
<span class="star-toggle"><Icon name="star" /></span>
<a href="#" class="email-title">{mail.sender}</a>
</div>
<div class="email-content">
<a href="#" class="email-subject">{mail.subject} &nbsp;&nbsp;
<span>{mail.preview}</span>
</a>
<div class="email-date">{mail.date}</div>
</div>
<div class="email-action-icons">
<ul class="list-inline">
<li class="list-inline-item">
<a href="#"><Icon name="archive" /></a>
</li>
<li class="list-inline-item">
<a href="#"><Icon name="trash" /></a>
</li>
<li class="list-inline-item">
<a href="#">
<Icon name="mail-opened" class="email-action-icons-item" />
</a>
</li>
<li class="list-inline-item">
<a href="#"><Icon name="clock" /></a>
</li>
</ul>
</div>
</li>
))
) : (
<li class="text-muted">No emails</li>
)}
</ul>
</div>
<div class="row">
<div class="col-7 mt-1">
Showing 1 - {mails.length} of {mails.length}
</div> <!-- end col-->
<div class="col-5">
<div class="btn-group float-end">
<button type="button" class="btn btn-icon"><Icon name="chevron-left" /></button>
<button type="button" class="btn btn-icon"><Icon name="chevron-right" /></button>
</div>
</div> <!-- end col-->
</div> <!-- end row-->
</div>
</div>
</div>
</div>
<Modal modalId="new-email">
<NewEmailModalContent />
</Modal>
</DefaultLayout>
-193
View File
@@ -1,193 +0,0 @@
---
title: Email inbox
page-header: Inbox
page-menu: extra.email-inbox
layout: default
permalink: email-inbox.html
page-libs: [ hugerte]
---
<div class="card">
<div class="row g-0">
<div class="col-xxl-3 email-border border-end">
<div class="offcanvas-xxl offcanvas-start h-100 file-offcanvas" tabindex="-1" id="emailSidebaroffcanvas">
<div class="card-body h-100">
<div>
{% include "ui/button.html" icon="pencil" text="Compose" color="primary" class="d-none d-sm-block"
modal-id="new-email" %}
</div>
<div class="mt-3 nav nav-vertical">
<a href="#" class="nav-link text-danger fw-bold">
{% include "ui/icon.html" icon="inbox" class="me-2" %}
Inbox<span class="badge badge-danger ms-auto">{{ mails | size }}</span>
</a>
<a href="#" class="nav-link">{% include "ui/icon.html" icon="star" class="me-2" %}Starred</a>
<a href="#" class="nav-link">{% include "ui/icon.html" icon="clock" class="me-2" %}Snoozed</a>
<a href="#" class="nav-link ">{% include "ui/icon.html" icon="file" class="me-2" %}Draft<span class="badge badge-info ms-auto">32</span></a>
<a href="#" class="nav-link">{% include "ui/icon.html" icon="mail-up" class="me-2" %}Sent Mail</a>
<a href="#" class="nav-link">{% include "ui/icon.html" icon="trash" class="me-2" %}Trash</a>
<a href="#" class="nav-link">{% include "ui/icon.html" icon="tag" class="me-2" %}Important</a>
<a href="#" class="nav-link">{% include "ui/icon.html" icon="alert-octagon" class="me-2" %}Spam</a>
</div>
<div class="mt-4">
<h6 class="subheader">Labels</h6>
<div class="mt-2 nav nav-vertical">
<a href="#" class="nav-link">
<div class="badge bg-info me-2"></div> Updates
</a>
<a href="#" class="nav-link">
<div class="badge bg-warning me-2"></div> Friends
</a>
<a href="#" class="nav-link">
<div class="badge bg-success me-2"></div> Family
</a>
<a href="#" class="nav-link">
<div class="badge bg-primary me-2"></div> Social
</a>
<a href="#" class="nav-link">
<div class="badge bg-danger me-2"></div> Important
</a>
<a href="#" class="nav-link">
<div class="badge bg-purple me-2"></div> Promotions
</a>
</div>
</div>
<div class="mt-5">
<h6 class="subheader">Storage</h6>
{% include "ui/progress.html" value=46 max=100 class="my-2" %}
<p class="text-muted font-13 mb-0">7.02 GB (46%) of 15 GB used</p>
</div>
</div>
</div>
</div>
<div class="col-xxl-9">
<div class="card-body">
<div class="d-flex flex-wrap align-items-center gap-2">
<div class="d-xxl-none d-inline-flex">
<button class="btn btn-icon" type="button" data-bs-toggle="offcanvas"
data-bs-target="#emailSidebaroffcanvas" aria-controls="emailSidebaroffcanvas">
{% include "ui/icon.html" icon="menu-2" %}
</button>
</div>
<div class="btn-group">
{% include "ui/button.html" icon="archive" icon-only=true %}
{% include "ui/button.html" icon="alert-octagon" icon-only=true %}
{% include "ui/button.html" icon="trash" icon-only=true %}
</div>
<div class="btn-group">
<button type="button" class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
{% include "ui/icon.html" icon="folder" %}
</button>
<div class="dropdown-menu">
<span class="dropdown-header">Move to</span>
<a class="dropdown-item" href="#">Social</a>
<a class="dropdown-item" href="#">Promotions</a>
<a class="dropdown-item" href="#">Updates</a>
<a class="dropdown-item" href="#">Forums</a>
</div>
</div>
<div class="btn-group">
<button type="button" class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
{% include "ui/icon.html" icon="tag" %}
</button>
<div class="dropdown-menu">
<span class="dropdown-header">Label as:</span>
<a class="dropdown-item" href="#">Updates</a>
<a class="dropdown-item" href="#">Social</a>
<a class="dropdown-item" href="#">Promotions</a>
<a class="dropdown-item" href="#">Forums</a>
</div>
</div>
<div class="btn-group">
<button type="button" class="btn dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
{% include "ui/icon.html" icon="dots" %} More
</button>
<div class="dropdown-menu">
<span class="dropdown-header">More Options :</span>
<a class="dropdown-item" href="#">Mark as Unread</a>
<a class="dropdown-item" href="#">Add to Tasks</a>
<a class="dropdown-item" href="#">Add Star</a>
<a class="dropdown-item" href="#">Mute</a>
</div>
</div>
</div>
<div class="mt-3">
<ul class="email-list">
{% if mails and mails.size > 0 %}
{% for mail in mails %}
<li>
<div class="email-sender-info">
<div class="checkbox-wrapper-mail">
<div class="form-check">
<input type="checkbox" class="form-check-input" id="mail-{{ mail.id }}">
<label class="form-check-label" for="mail-{{ mail.id }}"></label>
</div>
</div>
<span class="star-toggle">{% include "ui/icon.html" icon="star" %}</span>
<a href="#" class="email-title">{{ mail.sender }}</a>
</div>
<div class="email-content">
<a href="#" class="email-subject">{{ mail.subject }} &nbsp;&nbsp;
<span>{{ mail.preview }}</span>
</a>
<div class="email-date">{{ mail.date }}</div>
</div>
<div class="email-action-icons">
<ul class="list-inline">
<li class="list-inline-item">
<a href="#">{% include "ui/icon.html" icon="archive" %}</a>
</li>
<li class="list-inline-item">
<a href="#">{% include "ui/icon.html" icon="trash" %}</a>
</li>
<li class="list-inline-item">
<a href="#">
{% include "ui/icon.html" icon="mail-opened" class="email-action-icons-item" %}
</a>
</li>
<li class="list-inline-item">
<a href="#">{% include "ui/icon.html" icon="clock" %}</a>
</li>
</ul>
</div>
</li>
{% endfor %}
{% else %}
<li class="text-muted">No emails</li>
{% endif %}
</ul>
</div>
<div class="row">
<div class="col-7 mt-1">
Showing 1 - {{ mails | size }} of {{ mails | size }}
</div> <!-- end col-->
<div class="col-5">
<div class="btn-group float-end">
<button type="button" class="btn btn-icon">{% include "ui/icon.html" icon="chevron-left"
%}</button>
<button type="button" class="btn btn-icon">{% include "ui/icon.html" icon="chevron-right"
%}</button>
</div>
</div> <!-- end col-->
</div> <!-- end row-->
</div>
</div>
</div>
</div>
{% include "ui/modal.html" modal-id="new-email" %}
+111
View File
@@ -0,0 +1,111 @@
---
// Port of preview/pages/emails.html.
// Masonry auto-inits from the data-masonry attribute (page-lib, no init script,
// like cards-masonry.astro); fslightbox is a pure page-lib (no init script).
// The show.bs.modal handler is captured via {% capture_script %} → addPageScript.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Icon from '@shared/components/Icon.astro';
import { site } from '@shared/lib/site';
import { addPageScript } from '@shared/lib/page-scripts';
import emails from '@data/emails.json';
const emailEntries = Object.entries(emails);
addPageScript(`<script>
const emailModal = document.getElementById("email-modal")
if (emailModal) {
emailModal.addEventListener("show.bs.modal", function (e) {
const button = e.relatedTarget
const image = button.getAttribute("data-bs-image"),
title = button.getAttribute("data-bs-title"),
description = button.getAttribute("data-bs-description")
emailModal.querySelector("[data-email-title]").textContent = title
emailModal.querySelector("[data-email-description]").textContent = description
emailModal.querySelector("[data-email-image]").src = image
modalTitle.textContent = \`New message to \${recipient}\`
modalBodyInput.value = recipient
})
}
</script>`);
---
<DefaultLayout
pageHeader="Email templates"
pageMenu="addons.emails"
pageLibs={['masonry', 'fslightbox']}
>
<div class="row row-cards">
<div class="col-12">
<div class="card card-md">
<div class="card-stamp card-stamp-lg">
<div class="card-stamp-icon bg-primary">
<Icon name="mail" />
</div>
</div>
<div class="card-body">
<div class="row align-items-center">
<div class="col-10">
<h3 class="h1">Tabler Emails</h3>
<div class="prose text-secondary fs-3">
{emailEntries.length} eye-catching, customizable and responsive email templates to improve your email communication. No coding skills needed.
</div>
<div class="mt-3">
<a href={site.emails.buy_link} class="btn btn-primary" target="_blank">Buy all emails for {site.emails.price}</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="row row-cards" data-masonry={'{"percentPosition": true }'}>
{emailEntries.map(([key, email]) => (
<div class="col-4">
<a
href={`./static/emails/${key}.jpg`}
data-bs-toggle="modal"
data-bs-target="#email-modal"
data-bs-title={email.descriptionShort}
data-bs-description={email.descriptionLong}
data-bs-image={`./static/emails/${key}.jpg`}
>
<img src={`./static/emails/${key}.jpg`} class="img-fluid rounded" alt={email.descriptionShort} width={email.width} height={email.height} />
</a>
</div>
))}
</div>
</div>
</div>
<div class="modal fade" id="email-modal" aria-hidden="true" aria-labelledby="email-modal-label" tabindex="-1">
<div class="modal-dialog modal-xl modal-dialog-centered">
<div class="modal-content">
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<div class="modal-body p-0">
<div class="row g-0">
<div class="col-6">
<div class="p-6 bg-surface-secondary rounded-start">
<img src="" class="img-fluid rounded-start" data-email-image />
</div>
</div>
<div class="col-6">
<div class="p-7">
<div class="prose">
<h3 data-email-title></h3>
<p data-email-description></p>
</div>
<div class="mt-6">
<a href={site.emails.buy_link} class="btn btn-primary w-100" target="_blank">Buy {site.emails.count} emails for {site.emails.price}</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</DefaultLayout>
-101
View File
@@ -1,101 +0,0 @@
---
page-header: Email templates
page-menu: addons.emails
page-libs: [masonry, fslightbox]
layout: default
permalink: emails.html
---
<div class="row row-cards">
<div class="col-12">
<div class="card card-md">
<div class="card-stamp card-stamp-lg">
<div class="card-stamp-icon bg-primary">
{% include "ui/icon.html" icon="mail" %}
</div>
</div>
<div class="card-body">
<div class="row align-items-center">
<div class="col-10">
<h3 class="h1">Tabler Emails</h3>
<div class="prose text-secondary fs-3">
{{ emails | size }} eye-catching, customizable and responsive email templates to improve your email communication. No coding skills needed.
</div>
<div class="mt-3">
<a href="{{ site.emails.buy_link }}" class="btn btn-primary" target="_blank">Buy all emails for {{ site.emails.price }}</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="row row-cards" data-masonry='{"percentPosition": true }'>
{% for email in emails %}
<div class="col-4">
<a
href="{{ page | relative }}/static/emails/{{ email[0] }}.jpg"
data-bs-toggle="modal"
data-bs-target="#email-modal"
data-bs-title="{{ email[1].descriptionShort | escape }}"
data-bs-description="{{ email[1].descriptionLong | escape }}"
data-bs-image="{{ page | relative }}/static/emails/{{ email[0] }}.jpg"
>
<img src="{{ page | relative }}/static/emails/{{ email[0] }}.jpg" class="img-fluid rounded" alt="{{ email[1].descriptionShort }}" width="{{ email[1].width }}" height="{{ email[1].height }}" />
</a>
</div>
{% endfor %}
</div>
</div>
</div>
<div class="modal fade" id="email-modal" aria-hidden="true" aria-labelledby="email-modal-label" tabindex="-1">
<div class="modal-dialog modal-xl modal-dialog-centered">
<div class="modal-content">
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<div class="modal-body p-0">
<div class="row g-0">
<div class="col-6">
<div class="p-6 bg-surface-secondary rounded-start">
<img src="" class="img-fluid rounded-start" data-email-image />
</div>
</div>
<div class="col-6">
<div class="p-7">
<div class="prose">
<h3 data-email-title></h3>
<p data-email-description></p>
</div>
<div class="mt-6">
<a href="{{ site.emails.buy_link }}" class="btn btn-primary w-100" target="_blank">Buy {{ site.emails.count }} emails for {{ site.emails.price }}</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% capture_script %}
<script>
const emailModal = document.getElementById("email-modal")
if (emailModal) {
emailModal.addEventListener("show.bs.modal", function (e) {
const button = e.relatedTarget
const image = button.getAttribute("data-bs-image"),
title = button.getAttribute("data-bs-title"),
description = button.getAttribute("data-bs-description")
emailModal.querySelector("[data-email-title]").textContent = title
emailModal.querySelector("[data-email-description]").textContent = description
emailModal.querySelector("[data-email-image]").src = image
modalTitle.textContent = `New message to ${recipient}`
modalBodyInput.value = recipient
})
}
</script>
{% endcapture_script %}
+8
View File
@@ -0,0 +1,8 @@
---
// Port of preview/pages/empty.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
---
<DefaultLayout title="Empty page" pageHeader="Empty page" pageMenu="extra.empty">
<!-- Content here -->
</DefaultLayout>
-9
View File
@@ -1,9 +0,0 @@
---
title: Empty page
page-menu: extra.empty
page-header: Empty page
layout: default
permalink: empty.html
---
<!-- Content here -->
+5
View File
@@ -0,0 +1,5 @@
---
import ErrorLayout from '@shared/layouts/ErrorLayout.astro';
---
<ErrorLayout title="Page 404" pageError="404" />
-7
View File
@@ -1,7 +0,0 @@
---
title: Page 404
layout: error
page-error: 404
page-menu: base.error.404
permalink: error-404.html
---
+5
View File
@@ -0,0 +1,5 @@
---
import ErrorLayout from '@shared/layouts/ErrorLayout.astro';
---
<ErrorLayout title="Page 500" pageError="500" />
-7
View File
@@ -1,7 +0,0 @@
---
title: Page 500
layout: error
page-error: 500
page-menu: base.error.500
permalink: error-500.html
---
+5
View File
@@ -0,0 +1,5 @@
---
import ErrorLayout from '@shared/layouts/ErrorLayout.astro';
---
<ErrorLayout title="Maintenance mode" pageError="maintenance" />
-7
View File
@@ -1,7 +0,0 @@
---
title: Maintenance mode
layout: error
page-error: maintenance
page-menu: base.error.maintenance
permalink: error-maintenance.html
---
+73
View File
@@ -0,0 +1,73 @@
---
// Port of preview/pages/faq.html.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Icon from '@shared/components/Icon.astro';
import faq from '@data/faq.json';
const categories = faq as { name: string; questions: { question: string }[] }[];
---
<DefaultLayout pageHeader="Frequently Asked Questions" actions="breadcrumb" pageMenu="extra.faq">
<div class="card card-lg">
<div class="card-body">
<div class="space-y-4">
{
categories.map((category, ci) => (
<div>
<h2 class="mb-3">
{ci + 1}. {category.name}
</h2>
<div
id={`faq-${ci + 1}`}
class="accordion accordion-tabs"
role="tablist"
aria-multiselectable="true"
>
{category.questions.map((question, qi) => (
<div class="accordion-item">
<div class="accordion-header">
<button
class={`accordion-button${qi === 0 ? '' : ' collapsed'}`}
data-bs-toggle="collapse"
data-bs-target={`#faq-${ci + 1}-${qi + 1}`}
role="tab"
>
{question.question}
<div class="accordion-button-toggle">
<Icon name="chevron-down" />
</div>
</button>
</div>
<div
id={`faq-${ci + 1}-${qi + 1}`}
class={`accordion-collapse collapse${qi === 0 ? ' show' : ''}`}
role="tabpanel"
data-bs-parent={`#faq-${ci + 1}`}
>
<div class="accordion-body pt-0">
<div>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Accusantium alias dignissimos dolorum ea est eveniet, excepturi
illum in iste iure maiores nemo recusandae rerum saepe sed, sunt
totam! Explicabo, ipsa?
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Accusantium alias dignissimos dolorum ea est eveniet, excepturi
illum in iste iure maiores nemo recusandae rerum saepe sed, sunt
totam! Explicabo, ipsa?
</p>
</div>
</div>
</div>
</div>
))}
</div>
</div>
))
}
</div>
</div>
</div>
</DefaultLayout>
-43
View File
@@ -1,43 +0,0 @@
---
page-header: Frequently Asked Questions
page-header-actions: breadcrumb
page-menu: extra.faq
layout: default
permalink: faq.html
---
<div class="card card-lg">
<div class="card-body">
<div class="space-y-4">
{% for category in faq %}
{% assign categories-loop = forloop %}
<div>
<h2 class="mb-3">{{ categories-loop.index }}. {{ category.name }}</h2>
<div id="faq-{{ categories-loop.index }}" class="accordion accordion-tabs" role="tablist" aria-multiselectable="true">
{% for question in category.questions %}
{% assign questions-loop = forloop %}
<div class="accordion-item">
<div class="accordion-header">
<button class="accordion-button{% unless questions-loop.index == 1 %} collapsed{% endunless %}" data-bs-toggle="collapse" data-bs-target="#faq-{{ categories-loop.index }}-{{ questions-loop.index }}" role="tab">
{{ question.question }}
<div class="accordion-button-toggle">
{% include "ui/icon.html" icon="chevron-down" %}
</div>
</button>
</div>
<div id="faq-{{ categories-loop.index }}-{{ questions-loop.index }}" class="accordion-collapse collapse{% if questions-loop.index == 1 %} show{% endif %}" role="tabpanel" data-bs-parent="#faq-{{ categories-loop.index }}">
<div class="accordion-body pt-0">
<div>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium alias dignissimos dolorum ea est eveniet, excepturi illum in iste iure maiores nemo recusandae rerum saepe sed, sunt totam! Explicabo, ipsa?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium alias dignissimos dolorum ea est eveniet, excepturi illum in iste iure maiores nemo recusandae rerum saepe sed, sunt totam! Explicabo, ipsa?</p>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</div>
</div>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

+35
View File
@@ -0,0 +1,35 @@
---
// Port of preview/pages/flags.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import flags from '@data/flags.json';
// Liquid: {% for icon in (0..20) %}<div></div>{% endfor %} — 21 filler divs
const fillers = Array.from({ length: 21 });
---
<DefaultLayout title="Flags" pageHeader="Flags" pageMenu="addons.flags">
<div class="card">
<div class="card-header">
<div class="card-title">List of all flags</div>
</div>
<div class="card-body p-0">
<div class="demo-icons-list-wrap">
<div class="demo-icons-list">
{
flags.map((country) => (
<span
class="demo-icons-list-item"
title={country.name}
data-bs-toggle="tooltip"
data-bs-placement="top"
>
<span class={`flag flag-country-${country.flag.toLowerCase()}`} />
</span>
))
}
{fillers.map(() => <div></div>)}
</div>
</div>
</div>
</div>
</DefaultLayout>
-27
View File
@@ -1,27 +0,0 @@
---
title: Flags
page-header: Flags
page-menu: addons.flags
layout: default
permalink: flags.html
---
<div class="card">
<div class="card-header">
<div class="card-title">List of all flags</div>
</div>
<div class="card-body p-0">
<div class="demo-icons-list-wrap">
<div class="demo-icons-list">
{% for country in flags %}
<span class="demo-icons-list-item" title="{{ country.name }}" data-bs-toggle="tooltip" data-bs-placement="top">
<span class="flag flag-country-{{ country.flag | downcase }}"></span>
</span>
{% endfor %}
{% for icon in (0..20) %}
<div></div>
{% endfor %}
</div>
</div>
</div>
</div>
+9
View File
@@ -0,0 +1,9 @@
---
// Port of preview/pages/forgot-password.html (layout: single)
import SingleLayout from '@shared/layouts/SingleLayout.astro';
import ForgotPasswordCard from '@shared/components/cards/ForgotPasswordCard.astro';
---
<SingleLayout title="Forgot password">
<ForgotPasswordCard />
</SingleLayout>
-7
View File
@@ -1,7 +0,0 @@
---
title: Forgot password
layout: single
permalink: forgot-password.html
---
{% include "cards/forgot-password.html" show-header="1" %}
+246
View File
@@ -0,0 +1,246 @@
---
// Port of preview/pages/form-elements.html
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import FormElements1 from '@shared/components/forms/FormElements1.astro';
import FormElements2 from '@shared/components/forms/FormElements2.astro';
import FormElements3 from '@shared/components/forms/FormElements3.astro';
import FormElements4 from '@shared/components/forms/FormElements4.astro';
import FormElements5 from '@shared/components/forms/FormElements5.astro';
import FormElements6 from '@shared/components/forms/FormElements6.astro';
import Layout from '@shared/components/cards/form/Layout.astro';
import InputIcon from '@shared/components/ui/form/InputIcon.astro';
import InputMask from '@shared/components/ui/form/InputMask.astro';
import Button from '@shared/components/Button.astro';
import Avatar from '@shared/components/ui/Avatar.astro';
import people from '@data/people.json';
const httpMethods = ['GET', 'POST', 'PUT', 'HEAD', 'DELETE', 'PATCH'];
const comparisons = [
['EQUALS', 'Equals'], ['NOT_EQUALS', 'Not equals'], ['HAS_KEY', 'Has key'],
['NOT_HAS_KEY', 'Not has key'], ['HAS_VALUE', 'Has value'], ['NOT_HAS_VALUE', 'Not has value'],
['IS_EMPTY', 'Is empty'], ['NOT_EMPTY', 'Is not empty'], ['GREATER_THAN', 'Greater than'],
['LESS_THAN', 'Less than'],
];
const sources = [
['STATUS_CODE', 'Status code'], ['JSON_BODY', 'JSON body'], ['HEADERS', 'Headers'],
['TEXT_BODY', 'Text body'], ['RESPONSE_TIME', 'Response time'],
];
// assertion rows: [sourceSel, targetVal, comparisonSel]
const rows = [
{ source: 'STATUS_CODE', comparison: 'EQUALS', target: '200', prop: '' },
{ source: 'JSON_BODY', comparison: 'HAS_VALUE', target: 'string', prop: 'parameters.alt.type' },
{ source: 'RESPONSE_TIME', comparison: 'LESS_THAN', target: '500', prop: '' },
{ source: 'HEADERS', comparison: 'EQUALS', target: 'application/json; charset=UTF-8', prop: 'content-type' },
];
---
<DefaultLayout
title="Form elements"
pageHeader="Form elements"
pageMenu="form.elements"
pageLibs={['nouislider', 'autosize', 'tabler-flags', 'tabler-payments', 'litepicker', 'tom-select', 'imask']}
>
<div class="row row-cards">
<div class="col-12">
<form action="https://httpbin.org/post" method="post" class="card">
<div class="card-header">
<h4 class="card-title">Form elements</h4>
</div>
<div class="card-body">
<div class="row g-5">
<div class="col-xl-4">
<div class="row">
<div class="col-md-6 col-xl-12"><FormElements1 /></div>
<div class="col-md-6 col-xl-12"><FormElements2 /></div>
</div>
</div>
<div class="col-xl-4">
<div class="row">
<div class="col-md-6 col-xl-12"><FormElements3 /></div>
<div class="col-md-6 col-xl-12"><FormElements4 /></div>
</div>
</div>
<div class="col-xl-4">
<div class="row">
<div class="col-md-6 col-xl-12"><FormElements5 /></div>
<div class="col-md-6 col-xl-12"><FormElements6 /></div>
</div>
</div>
</div>
</div>
<div class="card-footer text-end">
<div class="d-flex">
<a href="#" class="btn btn-link">Cancel</a>
<button type="submit" class="btn btn-primary ms-auto">Send data</button>
</div>
</div>
</form>
</div>
<div class="col-md-6">
<div class="card h-100">
<div class="card-body">
<h3 class="card-title">Project ID</h3>
<p class="card-subtitle">Used when interacting with the API.</p>
<InputIcon icon="files" value="prj_5ae74426fe935327a8fa178b07d84ad9" readonly />
</div>
<div class="card-footer">
<div class="row align-items-center">
<div class="col">Learn more about <a href="#">Project ID</a></div>
<div class="col-auto"><Button text="Save" color="primary" /></div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">Node.js Version</h3>
<p class="card-subtitle">
The version of Node.js that is used in the Build Step and for Serverless Functions. A new Deployment is required for your changes to take effect.
</p>
<select class="form-select">
<option>14.x</option>
<option>12.x</option>
</select>
</div>
<div class="card-footer">Learn more about <a href="#">Node.js Version</a></div>
</div>
</div>
<div class="col-12 col-lg-4"><Layout /></div>
<div class="col-lg-8">
<div class="row row-cards">
<div class="col-12 col-lg-6">
<div class="card">
<div class="card-header"><h3 class="card-title">Input mask</h3></div>
<div class="card-body">
<div class="mb-3"><label class="form-label">Date</label><InputMask mask="00/00/0000" visible /></div>
<div class="mb-3"><label class="form-label">Hour</label><InputMask mask="00:00:00" visible /></div>
<div class="mb-3"><label class="form-label">Date &amp; Hour</label><InputMask mask="00/00/0000 00:00:00" visible /></div>
<div class="mb-3"><label class="form-label">ZIP Code</label><InputMask mask="00000-000" visible /></div>
<div class="mb-3"><label class="form-label">Money</label><InputMask mask="000.000.000.000.000,00" visible reverse /></div>
<div class="mb-3"><label class="form-label">Telephone</label><InputMask mask="0000-0000" visible /></div>
<div class="mb-3"><label class="form-label">Telephone with Code Area</label><InputMask mask="(00) 0000-0000" visible /></div>
<div class="mb-3"><label class="form-label">IP Address</label><InputMask mask="099.099.099.099" placeholder="000.000.000.000" visible /></div>
</div>
</div>
</div>
<div class="col-12 col-lg-6">
<form class="card h-100">
<div class="card-header"><h3 class="card-title">My Profile</h3></div>
<div class="card-body">
<div class="mb-3">
<div class="row">
<div class="col-auto"><Avatar person={people[2]} size="md" /></div>
<div class="col">
<div class="mb-3">
<label class="form-label">Email-Address</label>
<input class="form-control" placeholder="your-email@domain.com" />
</div>
</div>
</div>
</div>
<div class="mb-3">
<label class="form-label">Bio</label>
<textarea class="form-control" rows="5">Big belly rude boy, million dollar hustler. Unemployed.</textarea>
</div>
<div class="mb-3">
<label class="form-label">Email-Address</label>
<input class="form-control" placeholder="your-email@domain.com" />
</div>
<div class="mb-3">
<label class="form-label">Password</label>
<input type="password" class="form-control" value="password" />
</div>
</div>
<div class="card-footer text-end"><Button text="Save" color="primary" /></div>
</form>
</div>
</div>
</div>
<div class="col-lg-12">
<div class="row row-cards">
<div class="col-12 col-lg-6">
<form class="card">
<div class="card-body">
<h3 class="card-title">Edit Profile</h3>
<div class="row row-cards">
<div class="col-md-5"><div class="mb-3"><label class="form-label">Company</label><input type="text" class="form-control" disabled="" placeholder="Company" value="Creative Code Inc." /></div></div>
<div class="col-sm-6 col-md-3"><div class="mb-3"><label class="form-label">Username</label><input type="text" class="form-control" placeholder="Username" value="michael23" /></div></div>
<div class="col-sm-6 col-md-4"><div class="mb-3"><label class="form-label">Email address</label><input type="email" class="form-control" placeholder="Email" /></div></div>
<div class="col-sm-6 col-md-6"><div class="mb-3"><label class="form-label">First Name</label><input type="text" class="form-control" placeholder="Company" value="Chet" /></div></div>
<div class="col-sm-6 col-md-6"><div class="mb-3"><label class="form-label">Last Name</label><input type="text" class="form-control" placeholder="Last Name" value="Faker" /></div></div>
<div class="col-md-12"><div class="mb-3"><label class="form-label">Address</label><input type="text" class="form-control" placeholder="Home Address" value="Melbourne, Australia" /></div></div>
<div class="col-sm-6 col-md-4"><div class="mb-3"><label class="form-label">City</label><input type="text" class="form-control" placeholder="City" value="Melbourne" /></div></div>
<div class="col-sm-6 col-md-3"><div class="mb-3"><label class="form-label">Postal Code</label><input type="test" class="form-control" placeholder="ZIP Code" /></div></div>
<div class="col-md-5"><div class="mb-3"><label class="form-label">Country</label><select class="form-control form-select"><option value="">Germany</option></select></div></div>
<div class="col-md-12">
<div class="mb-3 mb-0">
<label class="form-label">About Me</label>
<textarea rows="5" class="form-control" placeholder="Here can be your description" value="Mike">Oh so, your weak rhyme
You doubt I'll bother, reading into it
I'll probably won't, left to my own devices
But that's the difference in our opinions.</textarea>
</div>
</div>
</div>
</div>
<div class="card-footer text-end"><button type="submit" class="btn btn-primary">Update Profile</button></div>
</form>
</div>
<div class="col-12 col-lg-6">
<div class="card h-100">
<div class="card-header"><h3 class="card-title">HTTP Request</h3></div>
<div class="card-body">
<div class="row row-cards">
<div class="mb-3 col-sm-4 col-md-2">
<label class="form-label required">Method</label>
<select class="form-select">
{httpMethods.map((m) => <option value={m}>{m}</option>)}
</select>
</div>
<div class="mb-3 col-sm-8 col-md-10">
<label class="form-label required">URL</label>
<input name="url" type="text" class="form-control" value="https://content.googleapis.com/discovery/v1/apis/surveys/v2/rest" />
</div>
</div>
<div class="form-label">Assertions</div>
<div class="table-responsive">
<table class="table mb-0">
<thead>
<tr><th>Source</th><th>Property</th><th>Comparison</th><th>Target</th></tr>
</thead>
<tbody>
{
rows.map((row) => (
<tr>
<td>
<select class="form-select">
{sources.map(([v, l]) => <option value={v} selected={v === row.source || undefined}>{l}</option>)}
</select>
</td>
<td><input type="text" class="form-control" value={row.prop || undefined} /></td>
<td>
<select class="form-select">
{comparisons.map(([v, l]) => <option value={v} selected={v === row.comparison || undefined}>{l}</option>)}
</select>
</td>
<td><input type="text" class="form-control" value={row.target} /></td>
</tr>
))
}
</tbody>
</table>
</div>
</div>
<div class="card-footer text-end"><button type="submit" class="btn btn-primary">Make request</button></div>
</div>
</div>
</div>
</div>
</div>
</DefaultLayout>
-422
View File
@@ -1,422 +0,0 @@
---
title: Form elements
page-header: Form elements
page-menu: form.elements
page-libs: [nouislider, autosize, tabler-flags, tabler-payments, litepicker, tom-select, imask]
layout: default
permalink: form-elements.html
---
<div class="row row-cards">
<div class="col-12">
<form action="https://httpbin.org/post" method="post" class="card">
<div class="card-header">
<h4 class="card-title">Form elements</h4>
</div>
<div class="card-body">
<div class="row g-5">
<div class="col-xl-4">
<div class="row">
<div class="col-md-6 col-xl-12">{% include "forms/form-elements-1.html" %}</div>
<div class="col-md-6 col-xl-12">{% include "forms/form-elements-2.html" %}</div>
</div>
</div>
<div class="col-xl-4">
<div class="row">
<div class="col-md-6 col-xl-12">{% include "forms/form-elements-3.html" %}</div>
<div class="col-md-6 col-xl-12">{% include "forms/form-elements-4.html" %}</div>
</div>
</div>
<div class="col-xl-4">
<div class="row">
<div class="col-md-6 col-xl-12">{% include "forms/form-elements-5.html" %}</div>
<div class="col-md-6 col-xl-12">{% include "forms/form-elements-6.html" %}</div>
</div>
</div>
</div>
</div>
<div class="card-footer text-end">
<div class="d-flex">
<a href="#" class="btn btn-link">Cancel</a>
<button type="submit" class="btn btn-primary ms-auto">Send data</button>
</div>
</div>
</form>
</div>
<div class="col-md-6">
<div class="card h-100">
<div class="card-body">
<h3 class="card-title">Project ID</h3>
<p class="card-subtitle">Used when interacting with the API.</p>
{% include "ui/form/input-icon.html" icon="files" value="prj_5ae74426fe935327a8fa178b07d84ad9" readonly=true
%}
</div>
<div class="card-footer">
<div class="row align-items-center">
<div class="col">Learn more about <a href="#">Project ID</a></div>
<div class="col-auto">
{% include "ui/button.html" text="Save" color="primary" %}
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">Node.js Version</h3>
<p class="card-subtitle">The version of Node.js that is used in the Build Step and for Serverless Functions.
A new Deployment is required for your changes to take effect.</p>
<select class="form-select">
<option>14.x</option>
<option>12.x</option>
</select>
</div>
<div class="card-footer">
Learn more about <a href="#">Node.js Version</a>
</div>
</div>
</div>
<div class="col-12 col-lg-4">
{% include "cards/form/layout.html" %}
</div>
<div class="col-lg-8">
<div class="row row-cards">
<div class="col-12 col-lg-6">
<div class="card">
<div class="card-header">
<h3 class="card-title">Input mask</h3>
</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">Date</label>
{% include "ui/form/input-mask.html" mask="00/00/0000" visible=true %}
</div>
<div class="mb-3">
<label class="form-label">Hour</label>
{% include "ui/form/input-mask.html" mask="00:00:00" visible=true %}
</div>
<div class="mb-3">
<label class="form-label">Date &amp; Hour</label>
{% include "ui/form/input-mask.html" mask="00/00/0000 00:00:00" visible=true %}
</div>
<div class="mb-3">
<label class="form-label">ZIP Code</label>
{% include "ui/form/input-mask.html" mask="00000-000" visible=true %}
</div>
<div class="mb-3">
<label class="form-label">Money</label>
{% include "ui/form/input-mask.html" mask="000.000.000.000.000,00" visible=true reverse=true %}
</div>
<div class="mb-3">
<label class="form-label">Telephone</label>
{% include "ui/form/input-mask.html" mask="0000-0000" visible=true %}
</div>
<div class="mb-3">
<label class="form-label">Telephone with Code Area</label>
{% include "ui/form/input-mask.html" mask="(00) 0000-0000" visible=true %}
</div>
<div class="mb-3">
<label class="form-label">IP Address</label>
{% include "ui/form/input-mask.html" mask="099.099.099.099" placeholder="000.000.000.000" visible=true %}
</div>
</div>
</div>
</div>
<div class="col-12 col-lg-6">
<form class="card h-100">
<div class="card-header">
<h3 class="card-title">My Profile</h3>
</div>
<div class="card-body">
<div class="mb-3">
<div class="row">
<div class="col-auto">
{% include "ui/avatar.html" person-id=3 size="md" %}
</div>
<div class="col">
<div class="mb-3">
<label class="form-label">Email-Address</label>
<input class="form-control" placeholder="your-email@domain.com">
</div>
</div>
</div>
</div>
<div class="mb-3">
<label class="form-label">Bio</label>
<textarea class="form-control"
rows="5">Big belly rude boy, million dollar hustler. Unemployed.</textarea>
</div>
<div class="mb-3">
<label class="form-label">Email-Address</label>
<input class="form-control" placeholder="your-email@domain.com">
</div>
<div class="mb-3">
<label class="form-label">Password</label>
<input type="password" class="form-control" value="password">
</div>
</div>
<div class="card-footer text-end">
{% include "ui/button.html" text="Save" color="primary" %}
</div>
</form>
</div>
</div>
</div>
<div class="col-lg-12">
<div class="row row-cards">
<div class="col-12 col-lg-6">
<form class="card">
<div class="card-body">
<h3 class="card-title">Edit Profile</h3>
<div class="row row-cards">
<div class="col-md-5">
<div class="mb-3">
<label class="form-label">Company</label>
<input type="text" class="form-control" disabled="" placeholder="Company"
value="Creative Code Inc.">
</div>
</div>
<div class="col-sm-6 col-md-3">
<div class="mb-3">
<label class="form-label">Username</label>
<input type="text" class="form-control" placeholder="Username" value="michael23">
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="mb-3">
<label class="form-label">Email address</label>
<input type="email" class="form-control" placeholder="Email">
</div>
</div>
<div class="col-sm-6 col-md-6">
<div class="mb-3">
<label class="form-label">First Name</label>
<input type="text" class="form-control" placeholder="Company" value="Chet">
</div>
</div>
<div class="col-sm-6 col-md-6">
<div class="mb-3">
<label class="form-label">Last Name</label>
<input type="text" class="form-control" placeholder="Last Name" value="Faker">
</div>
</div>
<div class="col-md-12">
<div class="mb-3">
<label class="form-label">Address</label>
<input type="text" class="form-control" placeholder="Home Address"
value="Melbourne, Australia">
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="mb-3">
<label class="form-label">City</label>
<input type="text" class="form-control" placeholder="City" value="Melbourne">
</div>
</div>
<div class="col-sm-6 col-md-3">
<div class="mb-3">
<label class="form-label">Postal Code</label>
<input type="test" class="form-control" placeholder="ZIP Code">
</div>
</div>
<div class="col-md-5">
<div class="mb-3">
<label class="form-label">Country</label>
<select class="form-control form-select">
<option value="">Germany</option>
</select>
</div>
</div>
<div class="col-md-12">
<div class="mb-3 mb-0">
<label class="form-label">About Me</label>
<textarea rows="5" class="form-control" placeholder="Here can be your description"
value="Mike">Oh so, your weak rhyme
You doubt I'll bother, reading into it
I'll probably won't, left to my own devices
But that's the difference in our opinions.</textarea>
</div>
</div>
</div>
</div>
<div class="card-footer text-end">
<button type="submit" class="btn btn-primary">Update Profile</button>
</div>
</form>
</div>
<div class="col-12 col-lg-6">
<div class="card h-100">
<div class="card-header">
<h3 class="card-title">HTTP Request</h3>
</div>
<div class="card-body">
<div class="row row-cards">
<div class="mb-3 col-sm-4 col-md-2">
<label class="form-label required">Method</label>
<select class="form-select">
<option value="GET">GET</option>
<option value="POST">POST</option>
<option value="PUT">PUT</option>
<option value="HEAD">HEAD</option>
<option value="DELETE">DELETE</option>
<option value="PATCH">PATCH</option>
</select>
</div>
<div class="mb-3 col-sm-8 col-md-10">
<label class="form-label required">URL</label>
<input name="url" type="text" class="form-control"
value="https://content.googleapis.com/discovery/v1/apis/surveys/v2/rest">
</div>
</div>
<div class="form-label">Assertions</div>
<div class="table-responsive">
<table class="table mb-0">
<thead>
<tr>
<th>Source</th>
<th>Property</th>
<th>Comparison</th>
<th>Target</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<select class="form-select">
<option value="STATUS_CODE" selected="">Status code</option>
<option value="JSON_BODY">JSON body</option>
<option value="HEADERS">Headers</option>
<option value="TEXT_BODY">Text body</option>
<option value="RESPONSE_TIME">Response time</option>
</select>
</td>
<td>
<input type="text" class="form-control"></td>
<td>
<select class="form-select">
<option value="EQUALS" selected="">Equals</option>
<option value="NOT_EQUALS">Not equals</option>
<option value="HAS_KEY">Has key</option>
<option value="NOT_HAS_KEY">Not has key</option>
<option value="HAS_VALUE">Has value</option>
<option value="NOT_HAS_VALUE">Not has value</option>
<option value="IS_EMPTY">Is empty</option>
<option value="NOT_EMPTY">Is not empty</option>
<option value="GREATER_THAN">Greater than</option>
<option value="LESS_THAN">Less than</option>
</select>
</td>
<td>
<input type="text" class="form-control" value="200">
</td>
</tr>
<tr>
<td>
<select class="form-select">
<option value="STATUS_CODE">Status code</option>
<option value="JSON_BODY" selected="">JSON body</option>
<option value="HEADERS">Headers</option>
<option value="TEXT_BODY">Text body</option>
<option value="RESPONSE_TIME">Response time</option>
</select>
</td>
<td>
<input type="text" class="form-control" value="parameters.alt.type">
</td>
<td>
<select class="form-select">
<option value="EQUALS">Equals</option>
<option value="NOT_EQUALS">Not equals</option>
<option value="HAS_KEY">Has key</option>
<option value="NOT_HAS_KEY">Not has key</option>
<option value="HAS_VALUE" selected="">Has value</option>
<option value="NOT_HAS_VALUE">Not has value</option>
<option value="IS_EMPTY">Is empty</option>
<option value="NOT_EMPTY">Is not empty</option>
<option value="GREATER_THAN">Greater than</option>
<option value="LESS_THAN">Less than</option>
</select>
</td>
<td>
<input type="text" class="form-control" value="string">
</td>
</tr>
<tr>
<td>
<select class="form-select">
<option value="STATUS_CODE">Status code</option>
<option value="JSON_BODY">JSON body</option>
<option value="HEADERS">Headers</option>
<option value="TEXT_BODY">Text body</option>
<option value="RESPONSE_TIME" selected="">Response time</option>
</select>
</td>
<td>
<input type="text" class="form-control"></td>
<td>
<select class="form-select">
<option value="EQUALS">Equals</option>
<option value="NOT_EQUALS">Not equals</option>
<option value="HAS_KEY">Has key</option>
<option value="NOT_HAS_KEY">Not has key</option>
<option value="HAS_VALUE">Has value</option>
<option value="NOT_HAS_VALUE">Not has value</option>
<option value="IS_EMPTY">Is empty</option>
<option value="NOT_EMPTY">Is not empty</option>
<option value="GREATER_THAN">Greater than</option>
<option value="LESS_THAN" selected="">Less than</option>
</select>
</td>
<td>
<input type="text" class="form-control" value="500">
</td>
</tr>
<tr>
<td>
<select class="form-select">
<option value="STATUS_CODE">Status code</option>
<option value="JSON_BODY">JSON body</option>
<option value="HEADERS" selected="">Headers</option>
<option value="TEXT_BODY">Text body</option>
<option value="RESPONSE_TIME">Response time</option>
</select>
</td>
<td>
<input type="text" class="form-control" value="content-type">
</td>
<td>
<select class="form-select">
<option value="EQUALS" selected="">Equals</option>
<option value="NOT_EQUALS">Not equals</option>
<option value="HAS_KEY">Has key</option>
<option value="NOT_HAS_KEY">Not has key</option>
<option value="HAS_VALUE">Has value</option>
<option value="NOT_HAS_VALUE">Not has value</option>
<option value="IS_EMPTY">Is empty</option>
<option value="NOT_EMPTY">Is not empty</option>
<option value="GREATER_THAN">Greater than</option>
<option value="LESS_THAN">Less than</option>
</select>
</td>
<td>
<input type="text" class="form-control" value="application/json; charset=UTF-8">
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="card-footer text-end">
<button type="submit" class="btn btn-primary">Make request</button>
</div>
</div>
</div>
</div>
</div>
</div>
+204
View File
@@ -0,0 +1,204 @@
---
// Port of preview/pages/form-layout.html
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Button from '@shared/components/Button.astro';
import InputIcon from '@shared/components/ui/form/InputIcon.astro';
import Check from '@shared/components/ui/form/Check.astro';
import Icon from '@shared/components/Icon.astro';
import Datepicker from '@shared/components/ui/Datepicker.astro';
import Layout from '@shared/components/cards/form/Layout.astro';
import Payment from '@shared/components/cards/form/Payment.astro';
import flags from '@data/flags.json';
const countries = flags as { name: string }[];
---
<DefaultLayout title="Form layout" pageHeader="Form Layout" pageMenu="form.layout" pageLibs={['litepicker']}>
<div class="row row-cards row-cols-1 row-cols-md-3">
<div class="col">
<div class="row row-cards">
<div class="col-12">
<div class="card">
<div class="card-header"><h3 class="card-title">Basic Form</h3></div>
<div class="card-body">
<form class="space-y">
<div class="row">
<div class="col-6">
<label class="form-label visually-hidden" for="basic-name">Name</label>
<input type="text" placeholder="Name" class="form-control" id="basic-name" name="name" />
</div>
<div class="col-6">
<label class="form-label visually-hidden" for="basic-email">Email address</label>
<input type="email" placeholder="Email address" class="form-control" id="basic-email" name="email" />
</div>
</div>
<div>
<label class="form-label visually-hidden" for="basic-password">Password</label>
<input type="password" placeholder="Password" class="form-control" id="basic-password" name="password" />
</div>
<div>
<label class="form-label visually-hidden" for="basic-password-confirm">Confirm Password</label>
<input type="password" placeholder="Confirm Password" class="form-control" id="basic-password-confirm" name="password_confirm" />
</div>
<div><Button color="primary" block text="Submit" /></div>
</form>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-header"><h3 class="card-title">Example Form</h3></div>
<div class="card-body">
<form>
<div class="space-y">
<div>
<label class="form-label" for="example-first-name">First Name</label>
<input type="text" placeholder="Enter first name" class="form-control" id="example-first-name" name="first_name" />
</div>
<div>
<label class="form-label" for="example-last-name">Last Name</label>
<input type="text" placeholder="Enter last name" class="form-control" id="example-last-name" name="last_name" />
</div>
<div>
<label class="form-label" for="example-email">Email</label>
<input type="email" placeholder="Enter email address" class="form-control" id="example-email" name="email" />
</div>
<div>
<label class="form-label" for="example-subject">Select Subject</label>
<select class="form-select" id="example-subject" name="subject">
<option>Option 1</option><option>Option 2</option><option>Option 3</option><option>Option 4</option>
</select>
</div>
<div>
<label class="form-label" for="example-message">Message</label>
<textarea placeholder="Enter your message" rows="6" class="form-control" id="example-message" name="message"></textarea>
</div>
<div><Button color="primary" block text="Send Message" iconEnd="arrow-right" /></div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="col">
<div class="row row-cards">
<div class="col-12">
<div class="card">
<div class="card-header"><h3 class="card-title">Example Form with Icons</h3></div>
<div class="card-body">
<form class="space-y">
<div><InputIcon icon="user" placeholder="Username" prepend /></div>
<div><InputIcon icon="mail" placeholder="Email address" prepend type="mail" /></div>
<div><InputIcon icon="lock" placeholder="Password" prepend type="password" /></div>
<div><InputIcon icon="lock" placeholder="Confirm Password" prepend type="password" /></div>
<div>
<div class="row align-items-center">
<div class="col"><Check title="Remember me" class="m-0" /></div>
<div class="col-auto"><Button color="primary" text="Create Account" iconEnd="arrow-right" /></div>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-header"><h3 class="card-title">Form with Icons and Validation</h3></div>
<div class="card-body">
<form class="space-y">
<div>
<div class="input-icon">
<span class="input-icon-addon"><Icon name="user" /></span>
<input type="text" value="" class="form-control is-invalid" placeholder="Username" />
<div class="invalid-feedback">This throws the icon out of bounds when input element contains `is-invalid` class.</div>
</div>
</div>
<div>
<div class="input-icon">
<span class="input-icon-addon"><Icon name="mail" /></span>
<input type="email" value="" class="form-control is-valid" placeholder="Email" />
<div class="valid-feedback">This email looks good!</div>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="col-12"><Layout horizontal title="Horizontal form" /></div>
<div class="col-12">
<div class="card">
<div class="card-header"><h3 class="card-title">Example Form</h3></div>
<div class="card-body">
<form>
<div class="space-y">
<div><h4>Personal Info</h4></div>
<div class="row row-cols-2 g-4">
<div>
<label class="form-label">First Name</label>
<input type="text" placeholder="Enter first name" class="form-control" />
</div>
<div>
<label class="form-label">Last Name</label>
<input type="text" placeholder="Enter last name" class="form-control" />
</div>
<div>
<label class="form-label">Gender</label>
<div><select class="form-select"><option>Male</option><option>Female</option><option>Others</option></select></div>
</div>
<div>
<label class="form-label">Date of Birth</label>
<div><Datepicker layout="icon" id="birth-date" /></div>
</div>
</div>
<div>
<label class="form-label">Category</label>
<div><select class="form-select"><option>Category 1</option><option>Category 2</option><option>Category 3</option></select></div>
</div>
<div><h4>Address</h4></div>
<div>
<label class="form-label">Street</label>
<input type="text" class="form-control" />
</div>
<div class="row row-cols-2 g-4">
<div><label class="form-label">City</label><input type="text" class="form-control" /></div>
<div><label class="form-label">State</label><input type="text" class="form-control" /></div>
<div><label class="form-label">Post Code</label><input type="text" class="form-control" /></div>
<div>
<label class="form-label">Country</label>
<div>
<select class="form-select">
<option>--Select Country--</option>
{countries.map((country) => <option>{country.name}</option>)}
</select>
</div>
</div>
</div>
<div>
<div>
<label class="form-label">Membership</label>
<div class="d-flex flex-row gap-4">
<Check title="Free" type="radio" name="membership" checked />
<Check title="Paid" type="radio" name="membership" />
</div>
</div>
</div>
<div class="text-end">
<Button text="Cancel" />
<Button color="primary" text="Save Changes" />
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="col"><Payment /></div>
</div>
</DefaultLayout>
-367
View File
@@ -1,367 +0,0 @@
---
title: Form layout
page-header: Form Layout
page-menu: form.layout
layout: default
permalink: form-layout.html
page-libs: [litepicker]
---
<div class="row row-cards row-cols-1 row-cols-md-3">
<div class="col">
<div class="row row-cards">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">
Basic Form
</h3>
</div>
<div class="card-body">
<form class="space-y">
<div class="row">
<div class="col-6">
<label class="form-label visually-hidden" for="basic-name">Name</label>
<input type="text" placeholder="Name" class="form-control" id="basic-name" name="name" />
</div>
<div class="col-6">
<label class="form-label visually-hidden" for="basic-email">Email address</label>
<input type="email" placeholder="Email address" class="form-control" id="basic-email" name="email" />
</div>
</div>
<div>
<label class="form-label visually-hidden" for="basic-password">Password</label>
<input type="password" placeholder="Password" class="form-control" id="basic-password" name="password" />
</div>
<div>
<label class="form-label visually-hidden" for="basic-password-confirm">Confirm Password</label>
<input type="password" placeholder="Confirm Password" class="form-control" id="basic-password-confirm" name="password_confirm" />
</div>
<div>
{% include "ui/button.html" color="primary" block text="Submit" %}
</div>
</form>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">
Example Form
</h3>
</div>
<div class="card-body">
<form>
<div class="space-y">
<div>
<label class="form-label" for="example-first-name">
First Name
</label>
<input type="text" placeholder="Enter first name" class="form-control" id="example-first-name" name="first_name">
</div>
<div>
<label class="form-label" for="example-last-name">
Last Name
</label>
<input type="text" placeholder="Enter last name" class="form-control" id="example-last-name" name="last_name">
</div>
<div>
<label class="form-label" for="example-email">
Email
</label>
<input type="email" placeholder="Enter email address" class="form-control" id="example-email" name="email">
</div>
<div>
<label class="form-label" for="example-subject">
Select Subject
</label>
<select class="form-select" id="example-subject" name="subject">
<option>
Option 1
</option>
<option>
Option 2
</option>
<option>
Option 3
</option>
<option>
Option 4
</option>
</select>
</div>
<div>
<label class="form-label" for="example-message">
Message
</label>
<textarea placeholder="Enter your message" rows="6" class="form-control" id="example-message" name="message"></textarea>
</div>
<div>
{% include "ui/button.html" color="primary" block text="Send Message" icon-end="arrow-right" %}
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="col">
<div class="row row-cards">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">
Example Form with Icons
</h3>
</div>
<div class="card-body">
<form class="space-y">
<div>
{% include "ui/form/input-icon.html" icon="user" placeholder="Username" prepend %}
</div>
<div>
{% include "ui/form/input-icon.html" icon="mail" placeholder="Email address" prepend type="mail" %}
</div>
<div>
{% include "ui/form/input-icon.html" icon="lock" placeholder="Password" prepend type="password" %}
</div>
<div>
{% include "ui/form/input-icon.html" icon="lock" placeholder="Confirm Password" prepend type="password" %}
</div>
<div>
<div class="row align-items-center">
<div class="col">
{% include "ui/form/check.html" title="Remember me" class="m-0" %}
</div>
<div class="col-auto">
{% include "ui/button.html" color="primary" text="Create Account" icon-end="arrow-right" %}
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">
Form with Icons and Validation
</h3>
</div>
<div class="card-body">
<form class="space-y">
<div>
<div class="input-icon">
<span class="input-icon-addon">
{% include "ui/icon.html" icon="user" %}
</span>
<input type="text" value="" class="form-control is-invalid" placeholder="Username">
<div class="invalid-feedback">
This throws the icon out of bounds when input element contains `is-invalid` class.
</div>
</div>
</div>
<div>
<div class="input-icon">
<span class="input-icon-addon">
{% include "ui/icon.html" icon="mail" %}
</span>
<input type="email" value="" class="form-control is-valid" placeholder="Email">
<div class="valid-feedback">
This email looks good!
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="col-12">
{% include "cards/form/layout.html" horizontal=true title="Horizontal form" %}
</div>
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">
Example Form
</h3>
</div>
<div class="card-body">
<form>
<div class="space-y">
<div>
<h4>
Personal Info
</h4>
</div>
<div class="row row-cols-2 g-4">
<div>
<label class="form-label">
First Name
</label>
<input type="text" placeholder="Enter first name" class="form-control">
</div>
<div>
<label class="form-label">
Last Name
</label>
<input type="text" placeholder="Enter last name" class="form-control">
</div>
<div>
<label class="form-label">
Gender
</label>
<div>
<select class="form-select">
<option>
Male
</option>
<option>
Female
</option>
<option>
Others
</option>
</select>
</div>
</div>
<div>
<label class="form-label">
Date of Birth
</label>
<div>
{% include "ui/datepicker.html" layout="icon" id="birth-date" %}
</div>
</div>
</div>
<div>
<label class="form-label">
Category
</label>
<div>
<select class="form-select">
<option>
Category 1
</option>
<option>
Category 2
</option>
<option>
Category 3
</option>
</select>
</div>
</div>
<div>
<h4>
Address
</h4>
</div>
<div>
<label class="form-label">
Street
</label>
<input type="text" class="form-control">
</div>
<div class="row row-cols-2 g-4">
<div>
<label class="form-label">
City
</label>
<input type="text" class="form-control">
</div>
<div>
<label class="form-label">
State
</label>
<input type="text" class="form-control">
</div>
<div>
<label class="form-label">
Post Code
</label>
<input type="text" class="form-control">
</div>
<div>
<label class="form-label">
Country
</label>
<div>
<select class="form-select">
<option>
--Select Country--
</option>
{% for country in flags %}
<option>
{{ country.name }}
</option>
{% endfor %}
</select>
</div>
</div>
</div>
<div>
<div>
<label class="form-label">
Membership
</label>
<div class="d-flex flex-row gap-4">
{% include "ui/form/check.html" title="Free" type="radio" name="membership" checked=true %}
{% include "ui/form/check.html" title="Paid" type="radio" name="membership" %}
</div>
</div>
</div>
<div class="text-end">
{% include "ui/button.html" text="Cancel" %}
{% include "ui/button.html" color="primary" text="Save Changes" %}
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="col">
{% include "cards/form/payment.html" %}
</div>
</div>
+18
View File
@@ -0,0 +1,18 @@
---
// Port of preview/pages/fullcalendar.html (layout: default).
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Fullcalendar from '@shared/components/ui/Fullcalendar.astro';
---
<DefaultLayout
title="Fullcalendar"
pageHeader="Fullcalendar"
pageMenu="plugins.fullcalendar"
pageLibs={['fullcalendar']}
>
<div class="card">
<div class="card-body">
<Fullcalendar sampleEvents />
</div>
</div>
</DefaultLayout>
-14
View File
@@ -1,14 +0,0 @@
---
title: Fullcalendar
page-header: Fullcalendar
page-menu: plugins.fullcalendar
layout: default
permalink: fullcalendar.html
page-libs: [fullcalendar]
---
<div class="card">
<div class="card-body">
{% include "ui/fullcalendar.html" sample-events %}
</div>
</div>
+33
View File
@@ -0,0 +1,33 @@
---
// Port of preview/pages/gallery.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import GalleryPhoto from '@shared/components/cards/GalleryPhoto.astro';
import Pagination from '@shared/components/ui/Pagination.astro';
import photos from '@data/photos.json';
import people from '@data/people.json';
// Liquid: photos | where: "horizontal", true — limit: 15; person = people[forloop.index0]
const galleryPhotos = photos.filter((photo) => photo.horizontal).slice(0, 15);
---
<DefaultLayout
title="Gallery"
pageHeader="Gallery"
description="1-15 of 241 photos"
actions="photos"
pageMenu="extra.gallery"
>
<div class="row row-cards">
{
galleryPhotos.map((photo, index) => (
<div class="col-sm-6 col-lg-4">
<GalleryPhoto photo={photo} person={people[index]} index={index + 1} />
</div>
))
}
</div>
<div class="d-flex mt-5">
<Pagination class="ms-auto" />
</div>
</DefaultLayout>
-24
View File
@@ -1,24 +0,0 @@
---
title: Gallery
page-header: Gallery
page-header-description: 1-15 of 241 photos
page-header-actions: photos
page-menu: extra.gallery
layout: default
permalink: gallery.html
---
{% assign filtered-photos = photos | where: "horizontal", true %}
<div class="row row-cards">
{% for photo in filtered-photos limit: 15 %}
{% assign person = people[forloop.index0] %}
<div class="col-sm-6 col-lg-4">
{% include "cards/gallery-photo.html" person=person %}
</div>
{% endfor %}
</div>
<div class="d-flex mt-5">
{% include "ui/pagination.html" class="ms-auto" %}
</div>
+24
View File
@@ -0,0 +1,24 @@
---
// Port of preview/pages/icons.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import IconsBanner from '@shared/components/cards/IconsBanner.astro';
import Icons from '@shared/components/cards/Icons.astro';
---
<DefaultLayout title="Icons" pageHeader="Icons" pageMenu="addons.icons">
<div class="row row-cards">
<div class="col-lg-4">
<IconsBanner />
</div>
<div class="col">
<div class="row row-cards">
<div class="col-12">
<Icons title="Interface icons" type="outline" />
</div>
<div class="col-12">
<Icons title="Filled icons" type="filled" />
</div>
</div>
</div>
</div>
</DefaultLayout>
-23
View File
@@ -1,23 +0,0 @@
---
title: Icons
page-header: Icons
page-menu: addons.icons
layout: default
permalink: icons.html
---
<div class="row row-cards">
<div class="col-lg-4">
{% include "cards/icons-banner.html" %}
</div>
<div class="col">
<div class="row row-cards">
<div class="col-12">
{% include "cards/icons.html" title="Interface icons" type="outline" %}
</div>
<div class="col-12">
{% include "cards/icons.html" title="Filled icons" type="filled" %}
</div>
</div>
</div>
</div>
+217
View File
@@ -0,0 +1,217 @@
---
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Icon from '@shared/components/Icon.astro';
import freeIllustrations from '@data/free-illustrations.json';
import illustrationsList from '@data/illustrations.json';
import siteData from '@data/site.json';
import { addPageScript } from '@shared/lib/page-scripts';
const autodark = (freeIllustrations as { autodark: Record<string, string> }).autodark;
const autodarkEntries = Object.entries(autodark);
// first-illustration: the Liquid loop overwrites each pass → last value wins.
const firstIllustration = autodarkEntries.length
? autodarkEntries[autodarkEntries.length - 1][1]
: '';
// Page-local transform: replace: '<svg ' , '<svg class="w-100 h-auto" '
const withClass = (svg: string) => svg.replaceAll('<svg ', '<svg class="w-100 h-auto" ');
const colors = siteData.colors as Record<string, { hex: string; class: string; prop: string }>;
const skinColors = siteData.skinColors as Record<string, { hex: string; class: string }>;
const colorEntries = Object.values(colors);
const skinEntries = Object.values(skinColors);
// skinColor = site.skinColors | first → the first value object (Rose).
const skinFirst = skinEntries[0];
const buyLink = (siteData.illustrations as { buy_link: string }).buy_link;
// {{ illustrations | size | minus: 4 }}
const moreCount = illustrationsList.length - 4;
// {% capture_script %} — build the illustrations JS map from the same data.
// skin_color / color[1].prop resolve to empty in Liquid → literal "var()".
const illustrationsJs = autodarkEntries
.map(([key, svg]) => ` "${key}": {\n svg: '${withClass(svg)}',\n },`)
.join('\n \n');
addPageScript(`<script>
let skinColor = "var()",
primaryColor = "var()";
const illustrations = {
${illustrationsJs}
}
const selectIllustrations = document.querySelectorAll(".js-select-illustration"),
currentIllustration = document.getElementById("current-illustration"),
currentIllustrationCode = document.getElementById("current-illustration-code");
document.querySelectorAll(".js-select-illustration").forEach((elem) => {
elem.addEventListener("change", (e) => {
const selectedId = e.target.value,
selectedIllustration = illustrations[selectedId]
currentIllustration.innerHTML = selectedIllustration.svg
})
})
document.querySelectorAll(".js-select-color").forEach((elem) => {
elem.addEventListener("change", (e) => {
primaryColor = e.target.value
document.getElementById("current-illustration-style").style.setProperty("--tblr-illustrations-primary", primaryColor)
})
})
document.querySelectorAll(".js-select-skin-color").forEach((elem) => {
elem.addEventListener("change", (e) => {
skinColor = e.target.value
document.getElementById("current-illustration-style").style.setProperty("--tblr-illustrations-skin", skinColor)
})
})
</script>`);
---
<DefaultLayout
title="SVG Illustrations"
pageHeader="SVG Illustrations"
pageMenu="addons.illustrations"
>
<div
class="mb-7"
style={`--tblr-illustrations-primary: var(--tblr-color-primary); --tblr-illustrations-skin: ${skinFirst.hex};`}
id="current-illustration-style"
>
<div class="row row-cards">
<div class="col-12">
<div class="row row-cards row-deck g-4">
<div class="col-md-7">
<div class="card">
<div class="card-body d-flex align-items-center">
<div id="current-illustration" set:html={withClass(firstIllustration)} />
</div>
</div>
</div>
<div class="col-md-5">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-body">
<div>
<div class="form-label">Primary color</div>
<div class="row g-2">
<div class="col-auto">
<label class="form-colorinput">
<input name="color" type="radio" value="var(--tblr-color-primary)" class="form-colorinput-input js-select-color" checked />
<span class="form-colorinput-color bg-primary"></span>
</label>
</div>
<div class="col-auto">
<label class="form-colorinput">
<input name="color" type="radio" value="var(--tblr-bg-surface-inverted)" class="form-colorinput-input js-select-color" />
<span class="form-colorinput-color bg-inverted"></span>
</label>
</div>
{
colorEntries.map((color) => (
<div class="col-auto">
<label class="form-colorinput">
<input name="color" type="radio" value={color.hex} class="form-colorinput-input js-select-color" />
<span class={`form-colorinput-color bg-${color.class}`} />
</label>
</div>
))
}
</div>
<div class="form-label mt-4">Skin color</div>
<div class="row g-2">
{
skinEntries.map((color, i) => (
<div class="col-auto">
<label class="form-colorinput">
<input name="skin-color" type="radio" value={color.hex} class="form-colorinput-input js-select-skin-color" checked={i === 0} />
<span class="form-colorinput-color" style={`background-color: ${color.hex}`} />
</label>
</div>
))
}
</div>
<div class="form-label mt-4">Select SVG illustration</div>
<div class="row">
{
autodarkEntries.map(([key, svg], i) => (
<div class="col-3">
<label class="form-imagecheck mb-2">
<input name="form-imagecheck" type="radio" value={key} class="form-imagecheck-input js-select-illustration" checked={i === autodarkEntries.length - 1} />
<span class="form-imagecheck-figure" set:html={withClass(svg)} />
</label>
</div>
))
}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h2 class="page-title my-5">
{moreCount} more SVG Illustrations
</h2>
<div class="row row-cards">
<div class="col-lg-4">
<div class="card card-md sticky-top">
<div class="card-stamp card-stamp-lg">
<div class="card-stamp-icon bg-primary">
<Icon name="brand-figma" />
</div>
</div>
<div class="card-body">
<div class="row align-items-center">
<div class="col-10">
<h3 class="h1">Tabler Illustrations</h3>
<div class="prose text-secondary">
Access a wide range of SVG illustrations for various projects. Effortlessly customize any illustration to align perfectly with your chosen color scheme!
</div>
<div class="mt-3">
<a href={buyLink} class="btn btn-primary" target="_blank" rel="noopener">
<Icon name="download" />
Get lifetime access
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-8">
<div class="row row-cards">
{
illustrationsList.map((illustration) => (
<div class="col-6 col-md-3">
<div class="card">
<div class="card-body">
<a href={buyLink} target="_blank">
<img src={`./static/illustrations/light/${illustration}.png`} alt={illustration} class="img-light" />
<img src={`./static/illustrations/dark/${illustration}.png`} alt={illustration} class="img-dark" />
</a>
</div>
</div>
</div>
))
}
</div>
</div>
</div>
</DefaultLayout>
-184
View File
@@ -1,184 +0,0 @@
---
title: SVG Illustrations
page-header: SVG Illustrations
page-menu: addons.illustrations
layout: default
permalink: illustrations.html
---
{% assign first-illustration = '' %}
{% for illustration in free-illustrations.autodark %}
{% assign first-illustration = illustration[1] %}
{% endfor %}
{% assign skinColor = site.skinColors | first %}
{% assign color = site.colors | first %}
<div class="mb-7" style="--tblr-illustrations-primary: var(--tblr-color-primary); --tblr-illustrations-skin: {{ skinColor.hex }};" id="current-illustration-style">
<div class="row row-cards">
<div class="col-12">
<div class="row row-cards row-deck g-4">
<div class="col-md-7">
<div class="card">
<div class="card-body d-flex align-items-center">
<div id="current-illustration">{{ first-illustration | replace: '<svg ', '<svg class="w-100 h-auto" ' }}</div>
</div>
</div>
</div>
<div class="col-md-5">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-body">
<div>
<div class="form-label">Primary color</div>
<div class="row g-2">
<div class="col-auto">
<label class="form-colorinput">
<input name="color" type="radio" value="var(--tblr-color-primary)" class="form-colorinput-input js-select-color" checked />
<span class="form-colorinput-color bg-primary"></span>
</label>
</div>
<div class="col-auto">
<label class="form-colorinput">
<input name="color" type="radio" value="var(--tblr-bg-surface-inverted)" class="form-colorinput-input js-select-color" />
<span class="form-colorinput-color bg-inverted"></span>
</label>
</div>
{% for color in site.colors %}
<div class="col-auto">
<label class="form-colorinput">
<input name="color" type="radio" value="{{ color[1].hex }}" class="form-colorinput-input js-select-color" />
<span class="form-colorinput-color bg-{{ color[1].class }}"></span>
</label>
</div>
{% endfor %}
</div>
<div class="form-label mt-4">Skin color</div>
<div class="row g-2">
{% for color in site.skinColors %}
<div class="col-auto">
<label class="form-colorinput">
<input name="skin-color" type="radio" value="{{ color[1].hex }}" class="form-colorinput-input js-select-skin-color" {% if forloop.first %} checked{% endif %} />
<span class="form-colorinput-color" style="background-color: {{ color[1].hex }}"></span>
</label>
</div>
{% endfor %}
</div>
<div class="form-label mt-4">Select SVG illustration</div>
<div class="row">
{% for illustration in free-illustrations.autodark %}
<div class="col-3">
<label class="form-imagecheck mb-2">
<input name="form-imagecheck" type="radio" value="{{ illustration[0] }}" class="form-imagecheck-input js-select-illustration" {% if forloop.last %} checked{% endif %}>
<span class="form-imagecheck-figure">
{{ illustration[1] | replace: '<svg ', '<svg class="w-100 h-auto" ' }}
</span>
</label>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<h2 class="page-title my-5">
{{ illustrations | size | minus: 4 }} more SVG Illustrations
</h2>
<div class="row row-cards">
<div class="col-lg-4">
<div class="card card-md sticky-top">
<div class="card-stamp card-stamp-lg">
<div class="card-stamp-icon bg-primary">
{% include "ui/icon.html" icon="brand-figma" %}
</div>
</div>
<div class="card-body">
<div class="row align-items-center">
<div class="col-10">
<h3 class="h1">Tabler Illustrations</h3>
<div class="prose text-secondary">
Access a wide range of SVG illustrations for various projects. Effortlessly customize any illustration to align perfectly with your chosen color scheme!
</div>
<div class="mt-3">
<a href="{{ site.illustrations.buy_link }}" class="btn btn-primary" target="_blank" rel="noopener">
{% include "ui/icon.html" icon="download" %}
Get lifetime access
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-8">
<div class="row row-cards">
{% for illustration in illustrations %}
<div class="col-6 col-md-3">
<div class="card">
<div class="card-body">
<a href="{{ site.illustrations.buy_link }}" target="_blank">
<img src="{{ page | relative }}/static/illustrations/light/{{ illustration }}.png" alt="{{ illustration }}" class="img-light" />
<img src="{{ page | relative }}/static/illustrations/dark/{{ illustration }}.png" alt="{{ illustration }}" class="img-dark" />
</a>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% capture_script %}
<script>
let skinColor = "var({{ skin_color[1].prop }})",
primaryColor = "var({{ color[1].prop }})";
const illustrations = {
{% for illustration in free-illustrations.autodark %}
"{{ illustration[0] }}": {
svg: '{{ illustration[1] | replace: '<svg ', '<svg class="w-100 h-auto" ' | replace_regex: "\n", "\n" }}',
},
{% endfor %}
}
const selectIllustrations = document.querySelectorAll(".js-select-illustration"),
currentIllustration = document.getElementById("current-illustration"),
currentIllustrationCode = document.getElementById("current-illustration-code");
document.querySelectorAll(".js-select-illustration").forEach((elem) => {
elem.addEventListener("change", (e) => {
const selectedId = e.target.value,
selectedIllustration = illustrations[selectedId]
currentIllustration.innerHTML = selectedIllustration.svg
})
})
document.querySelectorAll(".js-select-color").forEach((elem) => {
elem.addEventListener("change", (e) => {
primaryColor = e.target.value
document.getElementById("current-illustration-style").style.setProperty("--tblr-illustrations-primary", primaryColor)
})
})
document.querySelectorAll(".js-select-skin-color").forEach((elem) => {
elem.addEventListener("change", (e) => {
skinColor = e.target.value
document.getElementById("current-illustration-style").style.setProperty("--tblr-illustrations-skin", skinColor)
})
})
</script>
{% endcapture_script %}
+16
View File
@@ -0,0 +1,16 @@
---
// Port preview/pages/index.html (layout: homepage)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import HomepageContent from '@shared/components/HomepageContent.astro';
---
<DefaultLayout
title="Dashboard"
pageHeader="Dashboard"
pretitle="Overview"
actions="buttons"
pageMenu="dashboards.default"
pageLibs={['apexcharts', 'jsvectormap']}
>
<HomepageContent />
</DefaultLayout>
-6
View File
@@ -1,6 +0,0 @@
---
page-menu: dashboards.default
layout: homepage
permalink: index.html
---
+32
View File
@@ -0,0 +1,32 @@
---
// Port of preview/pages/inline-player.html (layout: default).
// Liquid: {% for provider in inline-players %} → one card per provider.
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import InlinePlayer from '@shared/components/ui/InlinePlayer.astro';
import players from '@data/inline-players.json';
type Provider = { title: string; type: string; id: string; 'embed-id': string | number };
---
<DefaultLayout
title="Inline Player"
pageHeader="Inline Player"
pageMenu="plugins.plyr"
pageLibs={['plyr']}
>
<div class="row row-cards">
{
(players as Provider[]).map((provider) => (
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">{provider.title}</h3>
<InlinePlayer id={provider.id} type={provider.type} embedId={provider['embed-id']} />
</div>
</div>
</div>
))
}
</div>
</DefaultLayout>
-23
View File
@@ -1,23 +0,0 @@
---
title: Inline Player
page-header: Inline Player
page-menu: plugins.plyr
page-libs: [plyr]
layout: default
permalink: inline-player.html
---
<div class="row row-cards">
{% for provider in inline-players %}
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<h3 class="card-title">{{ provider.title }}</h3>
{% include "ui/inline-player.html" id=provider.id type=provider.type embed-id=provider.embed-id %}
</div>
</div>
</div>
{% endfor %}
</div>
+9
View File
@@ -0,0 +1,9 @@
---
// Port of preview/pages/invoice.html (layout: default)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import InvoiceCard from '@shared/components/cards/InvoiceCard.astro';
---
<DefaultLayout title="Invoice" pageHeader="Invoice" pageMenu="extra.invoice" actions="print">
<InvoiceCard />
</DefaultLayout>
-10
View File
@@ -1,10 +0,0 @@
---
title: Invoice
layout: default
page-menu: extra.invoice
page-header: Invoice
page-header-actions: print
permalink: invoice.html
---
{% include "cards/invoice.html" %}
+153
View File
@@ -0,0 +1,153 @@
---
// Port of preview/pages/job-listing.html (layout: default)
// NOTE: page-header-actions "add-job" requires PageHeader.astro to dispatch it
// to HeaderActionsAddJob — see the migration report (PageHeader.astro is a
// shared component and was not modified here).
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import Icon from '@shared/components/Icon.astro';
import Check from '@shared/components/ui/form/Check.astro';
import jobsData from '@data/jobs.json';
interface Job {
company: string;
location: string;
title: string;
type: string;
image: string;
salary?: string;
tags: string[];
}
const jobs = jobsData as Job[];
const types = ['Programming', 'Design', 'Management / Finance', 'Customer Support', 'Sales / Marketing'];
const salaries = ['$20K - $50K', '$50K - $100K', '> $100K', 'Drawing / Painting'];
---
<DefaultLayout title="Search for Jobs" pageHeader="Search for Jobs" actions="add-job" pageMenu="extra.job-listing">
<div class="row g-4">
<div class="col-md-3">
<form action="./" method="get" autocomplete="off" novalidate class="sticky-top">
<div class="form-label">Job Types</div>
<div class="mb-4">
{
types.map((type, i) => (
<label class="form-check">
<input type="checkbox" class="form-check-input" name="form-type[]" value={i + 1} checked={i + 1 <= 2} />
<span class="form-check-label">{type}</span>
</label>
))
}
</div>
<div class="form-label">Remote</div>
<div class="mb-4">
<Check switch={true} titleOn="On" titleOff="Off" />
</div>
<div class="form-label">Salary Range</div>
<div class="mb-4">
{
salaries.map((salary, i) => (
<label class="form-check">
<input type="radio" class="form-check-input" name="form-salary" value={i + 1} checked={i + 1 <= 2} />
<span class="form-check-label">{salary}</span>
</label>
))
}
</div>
<div class="form-label">Immigration</div>
<div class="mb-4">
<Check switch={true} titleOn="On" titleOff="Off" />
<div class="small text-secondary">Only show companies that can sponsor a visa</div>
</div>
<label class="form-label" for="job-location">Location</label>
<div class="mb-4">
<select class="form-select" id="job-location" name="location">
<option>Anywhere</option>
<option>London</option>
<option>San Francisco</option>
<option>New York</option>
<option>Berlin</option>
</select>
</div>
<div class="mt-5">
<button class="btn btn-primary w-100">
Confirm changes
</button>
<a href="#" class="btn btn-link w-100">
Reset to defaults
</a>
</div>
</form>
</div>
<div class="col-md-9">
<div class="row row-cards">
<div class="space-y">
{
jobs.map((job) => (
<div class="card">
<div class="row g-0">
<div class="col-auto">
<div class="card-body">
<div class="avatar avatar-md" style={`background-image: url(./static/jobs/${job.image})`} />
</div>
</div>
<div class="col">
<div class="card-body ps-0">
<div class="row">
<div class="col">
<h3 class="mb-0">
<a href="#">{job.title}</a>
</h3>
</div>
{job.salary && <div class="col-auto fs-3 text-green">{job.salary}</div>}
</div>
<div class="row">
<div class="col-md">
<div class="mt-3 list-inline list-inline-dots mb-0 text-secondary d-sm-block d-none">
<div class="list-inline-item">
<Icon name="building-community" class="icon-inline" /> {job.company}
</div>
<div class="list-inline-item">
<Icon name="license" class="icon-inline" /> {job.type}
</div>
<div class="list-inline-item">
<Icon name="map-pin" class="icon-inline" /> {job.location}
</div>
</div>
<div class="mt-3 list mb-0 text-secondary d-block d-sm-none">
<div class="list-item">
<Icon name="building-community" class="icon-inline" /> {job.company}
</div>
<div class="list-item">
<Icon name="license" class="icon-inline" /> {job.type}
</div>
<div class="list-item">
<Icon name="map-pin" class="icon-inline" /> {job.location}
</div>
</div>
</div>
<div class="col-md-auto">
<div class="mt-3 badges">
{job.tags.map((tag) => (
<a href="#" class="badge badge-outline text-secondary fw-normal badge-pill">{tag}</a>
))}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
))
}
</div>
</div>
</div>
</div>
</DefaultLayout>
-117
View File
@@ -1,117 +0,0 @@
---
title: Search for Jobs
page-header: Search for Jobs
page-header-actions: add-job
page-menu: extra.job-listing
layout: default
permalink: job-listing.html
---
{% assign types = 'Programming,Design,Management / Finance,Customer Support,Sales / Marketing' | split: ',' %}
{% assign salaries = '$20K - $50K,$50K - $100K,> $100K,Drawing / Painting' | split: ',' %}
<div class="row g-4">
<div class="col-md-3">
<form action="./" method="get" autocomplete="off" novalidate class="sticky-top">
<div class="form-label">Job Types</div>
<div class="mb-4">
{% for type in types %}
<label class="form-check">
<input type="checkbox" class="form-check-input" name="form-type[]" value="{{ forloop.index }}"{% if forloop.index <= 2 %} checked{% endif %}>
<span class="form-check-label">{{ type }}</span>
</label>
{% endfor %}
</div>
<div class="form-label">Remote</div>
<div class="mb-4">
{% include "ui/form/check.html" switch=true title-on="On" title-off="Off" %}
</div>
<div class="form-label">Salary Range</div>
<div class="mb-4">
{% for salary in salaries %}
<label class="form-check">
<input type="radio" class="form-check-input" name="form-salary" value="{{ forloop.index }}"{% if forloop.index <= 2 %} checked{% endif %}>
<span class="form-check-label">{{ salary }}</span>
</label>
{% endfor %}
</div>
<div class="form-label">Immigration</div>
<div class="mb-4">
{% include "ui/form/check.html" switch=true title-on="On" title-off="Off" %}
<div class="small text-secondary">Only show companies that can sponsor a visa</div>
</div>
<label class="form-label" for="job-location">Location</label>
<div class="mb-4">
<select class="form-select" id="job-location" name="location">
<option>Anywhere</option>
<option>London</option>
<option>San Francisco</option>
<option>New York</option>
<option>Berlin</option>
</select>
</div>
<div class="mt-5">
<button class="btn btn-primary w-100">
Confirm changes
</button>
<a href="#" class="btn btn-link w-100">
Reset to defaults
</a>
</div>
</form>
</div>
<div class="col-md-9">
<div class="row row-cards">
<div class="space-y">
{% for job in jobs %}
<div class="card">
<div class="row g-0">
<div class="col-auto">
<div class="card-body">
<div class="avatar avatar-md" style="background-image: url({{ page | relative }}/static/jobs/{{ job.image }})"></div>
</div>
</div>
<div class="col">
<div class="card-body ps-0">
<div class="row">
<div class="col"><h3 class="mb-0"><a href="#">{{ job.title }}</a></h3></div>
{% if job.salary %}<div class="col-auto fs-3 text-green">{{ job.salary }}</div>{% endif %}
</div>
<div class="row">
<div class="col-md">
<div class="mt-3 list-inline list-inline-dots mb-0 text-secondary d-sm-block d-none">
<div class="list-inline-item">{% include "ui/icon.html" icon="building-community" class="icon-inline" %} {{ job.company }}</div>
<div class="list-inline-item">{% include "ui/icon.html" icon="license" class="icon-inline" %} {{ job.type }}</div>
<div class="list-inline-item">{% include "ui/icon.html" icon="map-pin" class="icon-inline" %} {{ job.location }}</div>
</div>
<div class="mt-3 list mb-0 text-secondary d-block d-sm-none">
<div class="list-item">{% include "ui/icon.html" icon="building-community" class="icon-inline" %} {{ job.company }}</div>
<div class="list-item">{% include "ui/icon.html" icon="license" class="icon-inline" %} {{ job.type }}</div>
<div class="list-item">{% include "ui/icon.html" icon="map-pin" class="icon-inline" %} {{ job.location }}</div>
</div>
</div>
<div class="col-md-auto">
<div class="mt-3 badges">
{% for tag in job.tags %}
<a href="#" class="badge badge-outline text-secondary fw-normal badge-pill">{{ tag }}</a>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
+17
View File
@@ -0,0 +1,17 @@
---
// Port of preview/pages/layout-boxed.html (layout: homepage)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import HomepageContent from '@shared/components/HomepageContent.astro';
---
<DefaultLayout
title="Dashboard"
pageHeader="Boxed layout"
pretitle="Overview"
actions="buttons"
pageMenu="layout.boxed"
pageLibs={['apexcharts', 'jsvectormap']}
bodyClass="layout-boxed"
>
<HomepageContent />
</DefaultLayout>
-7
View File
@@ -1,7 +0,0 @@
---
page-header: Boxed layout
page-menu: layout.boxed
body-class: layout-boxed
layout: homepage
permalink: layout-boxed.html
---
+21
View File
@@ -0,0 +1,21 @@
---
// Port of preview/pages/layout-combo.html (layout: homepage)
import DefaultLayout from '@shared/layouts/DefaultLayout.astro';
import HomepageContent from '@shared/components/HomepageContent.astro';
---
<DefaultLayout
title="Dashboard"
pageHeader="Combo layout"
pretitle="Overview"
actions="buttons"
pageMenu="layout.combo"
pageLibs={['apexcharts', 'jsvectormap']}
sidebar
sidebarDark
navbarHideBrand
navbarClass="d-none d-lg-flex"
navbarCondensed
>
<HomepageContent />
</DefaultLayout>

Some files were not shown because too many files have changed in this diff Show More