mirror of
https://github.com/tabler/tabler.git
synced 2026-10-12 05:06:55 +04:00
Link 20 more demo pages to their docs, and lint the paths (#2869)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
This commit is contained in:
1 parent
3f1ad9d80f
commit
863884e256
25 files changed
+192
No files matched your search
@@ -0,0 +1,120 @@
|
|||||||
|
---
|
||||||
|
name: demo-pages
|
||||||
|
description: >-
|
||||||
|
Build or update a Tabler demo page under `preview/pages/*.astro` — the pages
|
||||||
|
that show a component's variants side by side. Use whenever the user asks to
|
||||||
|
add, extend, or clean up a preview/demo page, and on your own after adding a
|
||||||
|
new `shared/ui` component that has no page showing it. Covers the page
|
||||||
|
skeleton, the header (title, description, docs link, actions), the card grid,
|
||||||
|
heading levels, and how to verify the result in the browser.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Write a Tabler demo page
|
||||||
|
|
||||||
|
Demo pages live in `preview/pages/*.astro` and are served at `/<name>` in dev, `/<name>.html` in the build. Each one shows the variants of a single component so a reader can compare them at a glance. They are not documentation — the prose is one line per card; the depth lives in `docs/content/**` (see the `write-docs` skill).
|
||||||
|
|
||||||
|
## 1. Page skeleton
|
||||||
|
|
||||||
|
```astro
|
||||||
|
---
|
||||||
|
import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
|
||||||
|
import Card from '@ui/Card.astro'
|
||||||
|
import CardBody from '@ui/CardBody.astro'
|
||||||
|
import CardTitle from '@ui/CardTitle.astro'
|
||||||
|
import CardSubtitle from '@ui/CardSubtitle.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
---
|
||||||
|
|
||||||
|
<DefaultLayout title="Badges" pageMenu="base.badges" description="Badges highlight a count, status, or short label attached to text, buttons, or menu items.">
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/badge" />
|
||||||
|
|
||||||
|
<div class="row row-cards">
|
||||||
|
<div class="col-md-6 col-lg-4">
|
||||||
|
<Card>
|
||||||
|
<CardBody>
|
||||||
|
<CardTitle>Basic</CardTitle>
|
||||||
|
<CardSubtitle>One sentence on what this variant is for.</CardSubtitle>
|
||||||
|
…
|
||||||
|
</CardBody>
|
||||||
|
</Card>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</DefaultLayout>
|
||||||
|
```
|
||||||
|
|
||||||
|
- `title` — browser title. It also becomes the page header, so **do not repeat it in a `pageHeader` prop**; `pageHeader` exists only for a header that differs from the browser title (`title="Dashboard" pageHeader="Boxed layout"`), or as `pageHeader={false}` for a page with no header at all.
|
||||||
|
- `description` — renders under the page title *and* fills `<meta name="description">`. One sentence, present tense, says what the component is for.
|
||||||
|
- `pageMenu` — the menu entry to highlight, e.g. `base.badges`. Match an existing key in `shared/data/menu.json`.
|
||||||
|
- Never hand-roll a title block inside the page body. The page header is the layout's job.
|
||||||
|
|
||||||
|
## 2. Page header extras
|
||||||
|
|
||||||
|
Anything to the right of the title goes in the `page-header-actions` slot, as a direct child of `<DefaultLayout>`:
|
||||||
|
|
||||||
|
```astro
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/badge" />
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Docs link:** `path` is the page's path under `docs/content/**` without the extension — `docs/content/ui/components/badge.mdx` → `/ui/components/badge`. Add one whenever a matching docs page exists.
|
||||||
|
- **Check the path with `pnpm run check-docs-links`.** It resolves every `<DocsLink path="…">` against `docs/content/**` and fails on a typo, so you do not need a browser for this.
|
||||||
|
- If you do open the link, use `docs-dev.tabler.io`, which serves `dev`. `docs.tabler.io` serves the last release and still has the pre-content-collection urls, so a valid page can 404 there. A 404 on production alone is never a reason to change a path.
|
||||||
|
- **Prebuilt action groups** (`HeaderActionsButtons`, `HeaderActionsPrint`, `HeaderActionsPhotos`, …) live in `shared/components/layout/` and go in the same slot: `<HeaderActionsButtons slot="page-header-actions" />`. There is no `actions="buttons"` prop any more.
|
||||||
|
|
||||||
|
## 3. Card grid
|
||||||
|
|
||||||
|
- One card per variant, in `<div class="row row-cards">` with `col-*` wrappers. Keep column widths consistent down the page.
|
||||||
|
- `CardTitle` names the variant in 1-3 words. `CardSubtitle` explains it in one sentence, naming the prop or class it demonstrates: "Add `showClose` to let users close the alert."
|
||||||
|
- Put the class or prop in `<code>` inside the subtitle. Readers scan for the token.
|
||||||
|
- Never write `<h3 class="card-title">` or `<div class="card-subtitle">` by hand — use the components, which also keep the heading level right.
|
||||||
|
|
||||||
|
## 4. Heading levels
|
||||||
|
|
||||||
|
`CardTitle` and `CardHeader` render `h2`, directly under the page `h1`. Pass `as="h3"` only for a card nested under its own `h2` section heading. Do not introduce raw `<h3>`/`<h4>` headings for card titles; that is what made pages mix levels before.
|
||||||
|
|
||||||
|
## 5. Spacing between inline elements
|
||||||
|
|
||||||
|
Use the list wrappers instead of margin utilities on each child:
|
||||||
|
|
||||||
|
| Wrapper | For |
|
||||||
|
| --- | --- |
|
||||||
|
| `<ButtonList>` | rows of buttons |
|
||||||
|
| `<BadgeList>` | rows of badges |
|
||||||
|
| `<TagList>` | rows of tags |
|
||||||
|
| `<AvatarList>` | rows or stacks of avatars |
|
||||||
|
|
||||||
|
The pluralised class names (`.badges-list`, `.tags-list`) are deprecated aliases of `.badge-list` / `.tag-list`. Do not add `me-2`/`mb-2` to individual items.
|
||||||
|
|
||||||
|
## 6. Data and repetition
|
||||||
|
|
||||||
|
- Loop over `shared/data/*.json` (`site.json` colors, `people.json`, `flags.json`) instead of pasting 20 near-identical blocks.
|
||||||
|
- Cast JSON entries to a named type in the frontmatter when you index into them; `astro check` is part of the quality gates.
|
||||||
|
|
||||||
|
## 7. Registering the page
|
||||||
|
|
||||||
|
- Add the page to `shared/data/menu.json` so it is reachable, and use the same key in `pageMenu`.
|
||||||
|
- A new `shared/ui` component usually needs both a demo page and a docs page. After finishing here, check `docs/content/**` and consult the `write-docs` skill if it is missing.
|
||||||
|
|
||||||
|
## 8. Verify in the browser
|
||||||
|
|
||||||
|
Never hand the page to the user unchecked.
|
||||||
|
|
||||||
|
1. `preview_start` with the `preview` config from `.claude/launch.json`, then open `/<page-name>`.
|
||||||
|
2. Screenshot it, and read the console for errors.
|
||||||
|
3. For a page built by looping over data, assert the rendered structure instead of eyeballing it:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
curl -s http://localhost:3000/badges | grep -o '<h[1-6]' | sort | uniq -c
|
||||||
|
```
|
||||||
|
|
||||||
|
A demo page should show exactly one `h1` and then `h2`s — no `h3` in the card grid.
|
||||||
|
|
||||||
|
## 9. Quality checklist
|
||||||
|
|
||||||
|
- [ ] `title` and `description` set; no `pageHeader` repeating the title
|
||||||
|
- [ ] `DocsLink` present when a docs page exists; `pnpm run check-docs-links` passes
|
||||||
|
- [ ] One card per variant; `CardTitle` + `CardSubtitle` on each
|
||||||
|
- [ ] No raw `card-title` / `card-subtitle` / `page-title` markup
|
||||||
|
- [ ] List wrappers instead of per-item margins
|
||||||
|
- [ ] `pnpm run format-prettier` and `pnpm run type-check` clean (repo root, not a tail-filtered subset)
|
||||||
|
- [ ] Page opened in the browser, console clean, heading order checked
|
||||||
|
- [ ] Changeset written with the `generate-changeset` skill
|
||||||
@@ -64,6 +64,8 @@ gh api repos/tabler/tabler/deployments/<id>/statuses --jq '.[0].environment_url'
|
|||||||
curl -s -o /dev/null -w '%{http_code}\n' <link>
|
curl -s -o /dev/null -w '%{http_code}\n' <link>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Links to the published docs** (not a Vercel preview) belong to a different pair of hosts: `docs.tabler.io` serves the last release, `docs-dev.tabler.io` serves `dev`. Check any `docs.tabler.io` link you mention against `docs-dev.tabler.io` — production still serves the pre-content-collection URLs, so a page that exists in `docs/content/**` can 404 there without being a broken link.
|
||||||
|
|
||||||
If the diff touches specific routes or pages, append that path. Path shape differs per project:
|
If the diff touches specific routes or pages, append that path. Path shape differs per project:
|
||||||
|
|
||||||
- **Preview pages use the `.html` extension**: `preview/pages/icons.astro` → `/icons.html`, not `/icons`.
|
- **Preview pages use the `.html` extension**: `preview/pages/icons.astro` → `/icons.html`, not `/icons`.
|
||||||
|
|||||||
@@ -114,6 +114,17 @@ Prose and example markup are only as accurate as their source. Before writing ex
|
|||||||
8. Ensure prose is in simple English.
|
8. Ensure prose is in simple English.
|
||||||
9. Verify heading hierarchy (`##` then `###`) and snippet validity.
|
9. Verify heading hierarchy (`##` then `###`) and snippet validity.
|
||||||
|
|
||||||
|
## 8a. Checking a page on the published site
|
||||||
|
|
||||||
|
Two hosts serve the docs, and they are not in sync:
|
||||||
|
|
||||||
|
| Host | Serves |
|
||||||
|
| --- | --- |
|
||||||
|
| `docs.tabler.io` | the last release — can be many commits behind `dev` |
|
||||||
|
| `docs-dev.tabler.io` | the `dev` branch |
|
||||||
|
|
||||||
|
Check a page's live url on `docs-dev.tabler.io`. Production still serves the pre-content-collection urls, so a page that exists in `docs/content/**` can return 404 there while being perfectly fine. A 404 on `docs.tabler.io` alone never justifies renaming a page or rewriting a link — confirm on `docs-dev.tabler.io` first.
|
||||||
|
|
||||||
## 9. Rules while updating existing docs
|
## 9. Rules while updating existing docs
|
||||||
|
|
||||||
- Preserve valid existing content that is still correct.
|
- Preserve valid existing content that is still correct.
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
// - menu/link urls in shared/data/docs.json
|
// - menu/link urls in shared/data/docs.json
|
||||||
// - redirect destinations in docs/astro.config.mjs
|
// - redirect destinations in docs/astro.config.mjs
|
||||||
// - href string literals in docs .astro components
|
// - href string literals in docs .astro components
|
||||||
|
// - docs paths linked from the demo site: <DocsLink path="…"> and getDocsUrl('…')
|
||||||
// Anchors are checked against heading slugs computed with github-slugger —
|
// Anchors are checked against heading slugs computed with github-slugger —
|
||||||
// the same library the markdown pipeline uses. Demo markup inside <Example>
|
// the same library the markdown pipeline uses. Demo markup inside <Example>
|
||||||
// blocks and code fences is ignored; its links are illustrative by design.
|
// blocks and code fences is ignored; its links are illustrative by design.
|
||||||
@@ -218,6 +219,19 @@ for (const file of sync(join(repoRoot, 'docs', '{components,layouts,pages}', '**
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 5. Docs paths used by the demo site — <DocsLink path="…"> and getDocsUrl('…').
|
||||||
|
// These render as absolute docs.tabler.io urls, so a typo only shows up in a browser.
|
||||||
|
for (const file of sync(join(repoRoot, '{preview,shared}', '**', '*.astro'), { ignore: '**/node_modules/**' })) {
|
||||||
|
const label = relative(repoRoot, file)
|
||||||
|
const source = readFileSync(file, 'utf8')
|
||||||
|
for (const match of source.matchAll(/<DocsLink\b[^>]*?\spath=["'](\/[^"']*)["']/g)) {
|
||||||
|
checkTarget(label, match[1] ?? '')
|
||||||
|
}
|
||||||
|
for (const match of source.matchAll(/getDocsUrl\(\s*["'](\/[^"']*)["']/g)) {
|
||||||
|
checkTarget(label, match[1] ?? '')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const uniqueErrors = [...new Set(errors)]
|
const uniqueErrors = [...new Set(errors)]
|
||||||
if (uniqueErrors.length > 0) {
|
if (uniqueErrors.length > 0) {
|
||||||
console.error(`Found ${uniqueErrors.length} dead link(s) (${checkedLinks} links checked):\n`)
|
console.error(`Found ${uniqueErrors.length} dead link(s) (${checkedLinks} links checked):\n`)
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@tabler/preview": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Added `DocsLink` to the header of 20 more demo pages, including Cards, Charts, Tables and Typography.
|
||||||
@@ -12,9 +12,11 @@ import ProfileContact from '@shared/components/cards/ProfileContact.astro'
|
|||||||
import SmallStats from '@shared/components/cards/SmallStats.astro'
|
import SmallStats from '@shared/components/cards/SmallStats.astro'
|
||||||
import people from '@data/people.json'
|
import people from '@data/people.json'
|
||||||
import { requireIndex } from '@shared/lib/array'
|
import { requireIndex } from '@shared/lib/array'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Card Gradients" pageMenu="base.cards.gradients" pageLibs={['apexcharts']}>
|
<DefaultLayout title="Card Gradients" pageMenu="base.cards.gradients" pageLibs={['apexcharts']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/card-gradient" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
|
|||||||
@@ -12,12 +12,14 @@ import CardBackgroundIcon from '@shared/components/cards/CardBackgroundIcon.astr
|
|||||||
import CreditCard from '@shared/components/cards/CreditCard.astro'
|
import CreditCard from '@shared/components/cards/CreditCard.astro'
|
||||||
import EmptyTeam from '@shared/components/cards/EmptyTeam.astro'
|
import EmptyTeam from '@shared/components/cards/EmptyTeam.astro'
|
||||||
import BodyPlaceholder from '@shared/components/cards/BodyPlaceholder.astro'
|
import BodyPlaceholder from '@shared/components/cards/BodyPlaceholder.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
|
||||||
const cardsStack = ['First', 'Second', 'Third']
|
const cardsStack = ['First', 'Second', 'Third']
|
||||||
const cardsStackColors = ['red', 'green', 'blue']
|
const cardsStackColors = ['red', 'green', 'blue']
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Cards" pageMenu="base.cards.base">
|
<DefaultLayout title="Cards" pageMenu="base.cards.base">
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/card" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
<div class="col-md-6 col-lg-3">
|
<div class="col-md-6 col-lg-3">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
|
|||||||
@@ -8,11 +8,13 @@ import CardHeader from '@ui/CardHeader.astro'
|
|||||||
import CardBody from '@ui/CardBody.astro'
|
import CardBody from '@ui/CardBody.astro'
|
||||||
import chartsData from '@data/charts.json'
|
import chartsData from '@data/charts.json'
|
||||||
import { capitalize } from '@shared/lib/string-format'
|
import { capitalize } from '@shared/lib/string-format'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
|
||||||
const demoCharts = Object.entries(chartsData as Record<string, { demo?: boolean; name?: string }>).filter(([, chart]) => chart && chart.demo)
|
const demoCharts = Object.entries(chartsData as Record<string, { demo?: boolean; name?: string }>).filter(([, chart]) => chart && chart.demo)
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Charts" pageMenu="plugins.charts" pageLibs={['apexcharts']}>
|
<DefaultLayout title="Charts" pageMenu="plugins.charts" pageLibs={['apexcharts']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/chart" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<Activity />
|
<Activity />
|
||||||
|
|||||||
@@ -5,11 +5,13 @@ import CardBody from '@ui/CardBody.astro'
|
|||||||
import CardTitle from '@ui/CardTitle.astro'
|
import CardTitle from '@ui/CardTitle.astro'
|
||||||
import Colorpicker from '@ui/Colorpicker.astro'
|
import Colorpicker from '@ui/Colorpicker.astro'
|
||||||
import site from '@data/site.json'
|
import site from '@data/site.json'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
|
||||||
const colors = Object.values(site.colors) as { hex: string; title: string }[]
|
const colors = Object.values(site.colors) as { hex: string; title: string }[]
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Color picker" pageMenu="plugins.colorpicker" pageLibs={['coloris.js']}>
|
<DefaultLayout title="Color picker" pageMenu="plugins.colorpicker" pageLibs={['coloris.js']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/forms/form-colorpicker" />
|
||||||
<Card>
|
<Card>
|
||||||
<CardBody>
|
<CardBody>
|
||||||
<CardTitle>Basic</CardTitle>
|
<CardTitle>Basic</CardTitle>
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ import Dropzone from '@ui/Dropzone.astro'
|
|||||||
import Card from '@ui/Card.astro'
|
import Card from '@ui/Card.astro'
|
||||||
import CardBody from '@ui/CardBody.astro'
|
import CardBody from '@ui/CardBody.astro'
|
||||||
import CardTitle from '@ui/CardTitle.astro'
|
import CardTitle from '@ui/CardTitle.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Dropzone" pageMenu="plugins.dropzone" pageLibs={['dropzone']}>
|
<DefaultLayout title="Dropzone" pageMenu="plugins.dropzone" pageLibs={['dropzone']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/dropzone" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<Card>
|
<Card>
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
---
|
---
|
||||||
import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
|
import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Empty page" pageMenu="extra.empty">
|
<DefaultLayout title="Empty page" pageMenu="extra.empty">
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/empty" />
|
||||||
<!-- Content here -->
|
<!-- Content here -->
|
||||||
</DefaultLayout>
|
</DefaultLayout>
|
||||||
@@ -5,12 +5,14 @@ import CardHeader from '@ui/CardHeader.astro'
|
|||||||
import CardBody from '@ui/CardBody.astro'
|
import CardBody from '@ui/CardBody.astro'
|
||||||
import flags from '@data/flags.json'
|
import flags from '@data/flags.json'
|
||||||
import CardTitle from '@ui/CardTitle.astro'
|
import CardTitle from '@ui/CardTitle.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
|
||||||
// 21 filler divs for flexbox layout.
|
// 21 filler divs for flexbox layout.
|
||||||
const fillers = Array.from({ length: 21 })
|
const fillers = Array.from({ length: 21 })
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Flags" pageMenu="addons.flags">
|
<DefaultLayout title="Flags" pageMenu="addons.flags">
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/plugins/flags" />
|
||||||
<Card>
|
<Card>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle>List of all flags</CardTitle>
|
<CardTitle>List of all flags</CardTitle>
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import CardTitle from '@ui/CardTitle.astro'
|
|||||||
import FormGroup from '@ui/FormGroup.astro'
|
import FormGroup from '@ui/FormGroup.astro'
|
||||||
import people from '@data/people.json'
|
import people from '@data/people.json'
|
||||||
import { requireIndex } from '@shared/lib/array'
|
import { requireIndex } from '@shared/lib/array'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
|
||||||
const httpMethods = ['GET', 'POST', 'PUT', 'HEAD', 'DELETE', 'PATCH']
|
const httpMethods = ['GET', 'POST', 'PUT', 'HEAD', 'DELETE', 'PATCH']
|
||||||
const comparisons = [
|
const comparisons = [
|
||||||
@@ -51,6 +52,7 @@ const rows = [
|
|||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Form elements" pageMenu="form.elements" pageLibs={['nouislider', 'autosize', 'tabler-flags', 'tabler-payments', 'litepicker', 'tom-select', 'imask']}>
|
<DefaultLayout title="Form elements" pageMenu="form.elements" pageLibs={['nouislider', 'autosize', 'tabler-flags', 'tabler-payments', 'litepicker', 'tom-select', 'imask']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/forms/form-elements" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<Card as="form" action="https://httpbin.org/post" method="post">
|
<Card as="form" action="https://httpbin.org/post" method="post">
|
||||||
|
|||||||
@@ -3,9 +3,11 @@ import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
|
|||||||
import Card from '@ui/Card.astro'
|
import Card from '@ui/Card.astro'
|
||||||
import CardBody from '@ui/CardBody.astro'
|
import CardBody from '@ui/CardBody.astro'
|
||||||
import Fullcalendar from '@ui/Fullcalendar.astro'
|
import Fullcalendar from '@ui/Fullcalendar.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Fullcalendar" pageMenu="plugins.fullcalendar" pageLibs={['fullcalendar']}>
|
<DefaultLayout title="Fullcalendar" pageMenu="plugins.fullcalendar" pageLibs={['fullcalendar']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/fullcalendar" />
|
||||||
<Card>
|
<Card>
|
||||||
<CardBody>
|
<CardBody>
|
||||||
<Fullcalendar sampleEvents />
|
<Fullcalendar sampleEvents />
|
||||||
|
|||||||
@@ -2,9 +2,11 @@
|
|||||||
import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
|
import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
|
||||||
import IconsBanner from '@shared/components/cards/IconsBanner.astro'
|
import IconsBanner from '@shared/components/cards/IconsBanner.astro'
|
||||||
import Icons from '@shared/components/cards/Icons.astro'
|
import Icons from '@shared/components/cards/Icons.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Icons" pageMenu="addons.icons">
|
<DefaultLayout title="Icons" pageMenu="addons.icons">
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/icon" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
<IconsBanner />
|
<IconsBanner />
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ import CardBody from '@ui/CardBody.astro'
|
|||||||
import CardTitle from '@ui/CardTitle.astro'
|
import CardTitle from '@ui/CardTitle.astro'
|
||||||
import InlinePlayer from '@ui/InlinePlayer.astro'
|
import InlinePlayer from '@ui/InlinePlayer.astro'
|
||||||
import players from '@data/inline-players.json'
|
import players from '@data/inline-players.json'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
|
||||||
type Provider = { 'title': string; 'type': string; 'id': string; 'embed-id': string | number }
|
type Provider = { 'title': string; 'type': string; 'id': string; 'embed-id': string | number }
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Inline Player" pageMenu="plugins.plyr" pageLibs={['plyr']}>
|
<DefaultLayout title="Inline Player" pageMenu="plugins.plyr" pageLibs={['plyr']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/inline-player" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
{
|
{
|
||||||
(players as Provider[]).map((provider) => (
|
(players as Provider[]).map((provider) => (
|
||||||
|
|||||||
@@ -3,11 +3,13 @@
|
|||||||
import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
|
import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
|
||||||
import Photo from '@ui/Photo.astro'
|
import Photo from '@ui/Photo.astro'
|
||||||
import photos from '@data/photos.json'
|
import photos from '@data/photos.json'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
|
||||||
const filteredPhotos = photos.filter((photo) => photo.horizontal)
|
const filteredPhotos = photos.filter((photo) => photo.horizontal)
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Lightbox" pageMenu="plugins.lightbox" pageLibs={['fslightbox']}>
|
<DefaultLayout title="Lightbox" pageMenu="plugins.lightbox" pageLibs={['fslightbox']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/lightbox" />
|
||||||
<div class="row row-cols-3 row-cols-md-4 row-cols-lg-6 g-3">
|
<div class="row row-cols-3 row-cols-md-4 row-cols-lg-6 g-3">
|
||||||
{
|
{
|
||||||
filteredPhotos.map((photo) => (
|
filteredPhotos.map((photo) => (
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ import MapVector from '@ui/MapVector.astro'
|
|||||||
import Card from '@ui/Card.astro'
|
import Card from '@ui/Card.astro'
|
||||||
import CardBody from '@ui/CardBody.astro'
|
import CardBody from '@ui/CardBody.astro'
|
||||||
import CardTitle from '@ui/CardTitle.astro'
|
import CardTitle from '@ui/CardTitle.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Vector Maps" pageMenu="plugins.maps-vector" pageLibs={['jsvectormap']}>
|
<DefaultLayout title="Vector Maps" pageMenu="plugins.maps-vector" pageLibs={['jsvectormap']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/vector-map" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<Card>
|
<Card>
|
||||||
|
|||||||
@@ -6,12 +6,14 @@ import Card from '@ui/Card.astro'
|
|||||||
import CardBody from '@ui/CardBody.astro'
|
import CardBody from '@ui/CardBody.astro'
|
||||||
import maps from '@data/maps.json'
|
import maps from '@data/maps.json'
|
||||||
import CardTitle from '@ui/CardTitle.astro'
|
import CardTitle from '@ui/CardTitle.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
|
||||||
type MapData = { title?: string; card?: boolean }
|
type MapData = { title?: string; card?: boolean }
|
||||||
const mapEntries = Object.entries(maps as Record<string, MapData>)
|
const mapEntries = Object.entries(maps as Record<string, MapData>)
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Maps" pageMenu="plugins.maps" pageLibs={['mapbox']}>
|
<DefaultLayout title="Maps" pageMenu="plugins.maps" pageLibs={['mapbox']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/map" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
{
|
{
|
||||||
mapEntries.map(([mapId, data]) =>
|
mapEntries.map(([mapId, data]) =>
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ import CardHeader from '@ui/CardHeader.astro'
|
|||||||
import CardBody from '@ui/CardBody.astro'
|
import CardBody from '@ui/CardBody.astro'
|
||||||
import payments from '@data/payments.json'
|
import payments from '@data/payments.json'
|
||||||
import CardTitle from '@ui/CardTitle.astro'
|
import CardTitle from '@ui/CardTitle.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
|
||||||
const providers = payments as { name: string; logo: string }[]
|
const providers = payments as { name: string; logo: string }[]
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Payment Providers" pageMenu="addons.payment-providers">
|
<DefaultLayout title="Payment Providers" pageMenu="addons.payment-providers">
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/plugins/payments" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<Card>
|
<Card>
|
||||||
|
|||||||
@@ -9,9 +9,11 @@ import Progress from '@ui/Progress.astro'
|
|||||||
import ProgressSteps from '@ui/ProgressSteps.astro'
|
import ProgressSteps from '@ui/ProgressSteps.astro'
|
||||||
import ProgressBg from '@ui/ProgressBg.astro'
|
import ProgressBg from '@ui/ProgressBg.astro'
|
||||||
import ProgressDescription from '@ui/ProgressDescription.astro'
|
import ProgressDescription from '@ui/ProgressDescription.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Progress" pageMenu="base.progress">
|
<DefaultLayout title="Progress" pageMenu="base.progress">
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/progress" />
|
||||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-3">
|
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-3">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<Card>
|
<Card>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import CardBody from '@ui/CardBody.astro'
|
|||||||
import CardTitle from '@ui/CardTitle.astro'
|
import CardTitle from '@ui/CardTitle.astro'
|
||||||
import FormGroup from '@ui/FormGroup.astro'
|
import FormGroup from '@ui/FormGroup.astro'
|
||||||
import CaptureModal from '@shared/components/CaptureModal.astro'
|
import CaptureModal from '@shared/components/CaptureModal.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
|
|
||||||
const simpleJs = `signaturePad.fromDataURL("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA1OTIgMjAwIj4KICA8ZyBjbGlwLXBhdGg9InVybCgjYSkiPgogICAgPHBhdGggZmlsbD0iIzAwMCIgZD0iTTEzMi4wOTIgNzkuMDY1YzAgLjMwNC0uMzU1IDEuNDAzLTEuMDYzIDMuMjk4LS42OTQgMS44OTQtMS4xNDIgMy4wMjItMS4zNDUgMy4zODQtMi4zNDIgMy44NDctNi43NiA3LjE4LTEzLjI1MiAxMC4wMDEtNS4zNjUgMi4yMjctMTMuNDU1IDUuNTktMjQuMjcgMTAuMDg4YTE0OC4xOSAxNDguMTkgMCAwIDAtMTAuMzQ3IDMuMTI0Yy0yLjY5Ljg4Mi02LjU4NiAyLjk1LTExLjY5IDYuMjA0YTE4Ny42NiAxODcuNjYgMCAwIDAtMS4wNjMgMTAuMTk2IDQwNy40OSA0MDcuNDkgMCAwIDEtMS40MzIgMTUuMzM4Yy0uODgyIDEuMTg2LTEuOTg4IDEuNzc5LTMuMzE4IDEuNzc5LjExNSAwIC4xNzMtLjAxNS4xNzMtLjA0NC0uMjAyLS4xMDEtLjg5Ni0uMjgyLTIuMDgyLS41NDJ2LTIuODg1YzAtMi43MDUuMjMxLTUuNDYuNjk0LTguMjY2IDAtLjA1Ny4yNTMtLjc3My43Ni0yLjE0Ny41MDUtMS4zMzEuNzU4LTIuMTQxLjc1OC0yLjQzIDAtMS42MDUtLjI5Ni0zLjI0LS44ODktNC45MDMtLjM5IDEuMTI4LTEuMTEzIDEuODU5LTIuMTY5IDIuMTkxLTEuMjQ0LS43MjMtMS44NjUtMS45ODgtMS44NjUtMy43OTYgMC0uMjAzIDEuMDQ4LTEuNzI5IDMuMTQ1LTQuNTc4IDIuMTQtMi45NjUgMy4zODMtNS4wMDQgMy43My02LjExNy4yNzUtLjgxLjc2Ny0zLjQ1IDEuNDc1LTcuOTE5IDEuMDQxLTYuNjEgMS45Ni0xMS40NCAyLjc1NS0xNC40OTEgMS42OTItNi42MzkgMy42OTQtMTAuODYyIDYuMDA4LTEyLjY3bDIuNDMgMS44MjN2MS44NjVjLTEuNTA1IDEuMTU3LTIuNTY3IDMuMjYyLTMuMTkgNi4zMTMtLjE4Ny45NC0uNjM2IDMuMzQxLTEuMzQ0IDcuMjAzLS4xNDUuNzA4LS43MjMgMi41NDUtMS43MzUgNS41MS0uOTExIDIuNjAzLTEuMzY3IDQuMTg3LTEuMzY3IDQuNzUxdjUuNDI0Yy4yNi4yNDUuNS4zNjguNzE2LjM2OCAxLjIxNSAwIDMuMTA5LS41MDYgNS42ODMtMS41MTggMy4wOC0xLjE1NyA1LjAxNy0xLjg1MSA1LjgxMy0yLjA4MyAxMy4wNzEtMy4zODQgMjMuMTUtNy4yMzggMzAuMjM1LTExLjU2MyA2LjIxOC0zLjc0NiA5Ljk5Mi02LjI5OCAxMS4zMjItNy42NTggMS41NzYtMS41NjIgMi4zNjQtMy42NjYgMi4zNjQtNi4zMTMgMC00LjY3MS0yLjEwNC04LjU2OS02LjMxMi0xMS42OTMtMy44Ni0yLjkwNy04LjE5MS00LjM2LTEyLjk5Mi00LjM2LTMuNzg4IDAtOC4yNzEuNDYyLTEzLjQ0NyAxLjM4OC02LjY2NiAxLjIxNS0xMi45MiAyLjkwNy0xOC43NjIgNS4wNzYtOC44NjQgMy4yODQtMTMuNzM2IDYuODM0LTE0LjYxOCAxMC42NTJsLTEuMDg1LjgwM0M1OC44MzkgNzguNDIyIDU4IDc3LjA2MiA1OCA3NS43OWMwLTEuODA4IDEuODgtNC4wMTQgNS42NC02LjYxNyAzLjA4LTIuMTQgNS44Mi0zLjU2NSA4LjIyLTQuMjc0IDE1Ljk0OS00LjkxNyAyNy44NjQtNy4zNzYgMzUuNzQ0LTcuMzc2IDcuNDYxIDAgMTMuNDEyIDEuOTUzIDE3Ljg1MSA1Ljg1NyA0LjQyNCAzLjg2MiA2LjYzNyA5LjA5IDYuNjM3IDE1LjY4NVptMzIuMjk1IDU1LjQwN3YxLjkwOWMtLjU5Mi44MjQtMS4yNDMgMS4yMzYtMS45NTIgMS4yMzYtLjQ0OCAwLTEuOTczLTEuMzU5LTQuNTc2LTQuMDc4LTIuNjAzLTIuNzMzLTQuMzM4LTQuMS01LjIwNi00LjEgMCAuMDU4LTMuMDggMS4yNDQtOS4yMzkgMy41NTgtNi4zMDUgMi4zNDMtMTAuMzE3IDMuNTE0LTEyLjAzOCAzLjUxNC0xLjQxNyAwLTIuOTg2LS42OTQtNC43MDctMi4wODMtMS43Mi0xLjM3NC0yLjU4MS0yLjY2OC0yLjU4MS0zLjg4MyAwLTMuMTM4IDMuNDM0LTYuNzk3IDEwLjMwMy0xMC45NzcgNi40MzQtMy45NjMgMTEuMzQzLTUuOTQ0IDE0LjcyNy01Ljk0NCAxLjQxNyAwIDIuNjkuODEgMy44MTcgMi40M3YxLjgyMmMtLjU2NC44MS0xLjIxNCAxLjIxNS0xLjk1MiAxLjIxNS0uMTMgMC0uNjE0LS4xODEtMS40NTMtLjU0My0uODM5LS4zNzYtMS4zMzctLjU2NC0xLjQ5Ni0uNTY0LTEuMTI4IDAtMy43MTcgMS4xNjUtNy43NjUgMy40OTMtMy44MzIgMi4xNjktNi4zOTkgMy43ODktNy43IDQuODYtMS4zMDIgMS4xMjgtMi4xMzMgMi40MTUtMi40OTQgMy44NjEuOTgzLjkyNiAyLjE1NCAxLjM4OCAzLjUxMyAxLjM4OC43MDkgMCA0LjEwNy0xLjE3MSAxMC4xOTQtMy41MTQgNi4wNzMtMi4zNzIgOS43NDYtMy41NTggMTEuMDE5LTMuNTU4IDEuODY1IDAgMy4yMS40NyA0LjAzNCAxLjQxLjE4OC4yMTcuOTA0IDEuNDkgMi4xNDcgMy44MThhMjEuOTAyIDIxLjkwMiAwIDAgMCAzLjQwNSA0LjczWm02OS44ODQtMTkuNzQydjEuOTUzYy0yLjk5MyAyLjQ1OC01Ljg5OSA1LjIxMy04LjcxOSA4LjI2NS04Ljc2MiA5LjQ1OS0xNC42NjIgMTQuMTg4LTE3LjY5OSAxNC4xODgtMi40NTggMC01LjE5OC0yLjIyLTguMjItNi42NmwtNi41MjgtOS42NTRjLTEuMjQ0LjIwMy0zLjQ5MiAyLjQ2Ni02Ljc0NiA2Ljc5LTMuMDUxIDQuMTIyLTUuODQyIDYuMTgzLTguMzcyIDYuMTgzbC0xLjE5My0uNjI5Yy0uODgyLTEuNjItMi41MzgtNS4xNy00Ljk2Ny0xMC42NTItMi42NDYtNS45MjktMy45NjktOS4zMDYtMy45NjktMTAuMTMxIDAtMS40MzIuODQ2LTIuNjE4IDIuNTM4LTMuNTU4IDEuNjkxIDIuMDQgMy4zNTQgNC44NjcgNC45ODggOC40ODMgMi40NTggNS4zMzYgMy44NzUgOC4zMyA0LjI1MSA4Ljk4MWgyLjA2MWMuNTY0LTEuMDQxIDEuODk0LTIuNjU0IDMuOTkxLTQuODM4LjczNy0xLjEyOCAxLjgyMi0yLjY5IDMuMjUzLTQuNjg2IDEuNjc3LTIuMzcyIDMuMDk1LTMuNTU3IDQuMjUxLTMuNTU3IDEuMDcgMCAxLjk3NC41OTIgMi43MTEgMS43NzggMS4wNzEgMS42OTMgMi45ODYgNC43MyA1Ljc0OCA5LjExMiAzLjA1MSA0Ljc0NCA1LjMgNy4xMTYgNi43NDYgNy4xMTYgMS4wNyAwIDUuMDgyLTMuMDgxIDEyLjAzNy05LjI0MiA2Ljk3LTYuMTYxIDEwLjc5NS05LjI0MiAxMS40NzQtOS4yNDJoMi4zNjRabTQ0LjU3MyAxOS41MjVjLTEuMDQyIDEuMjQ0LTIuNDAxIDEuODY2LTQuMDc4IDEuODY2aC0xNC45ODhjLTMuNDcgMC03LjMzOC0uNTIxLTExLjYwNC0xLjU2Mi01LjU5NS0xLjM2LTguNzYyLTMuMDY3LTkuNS01LjEyLS44MDktMi4zMTQtMS4yMTQtNC41MzQtMS4yMTQtNi42NiAwLTQuMjY3IDEuODM2LTcuNTQzIDUuNTA5LTkuODI4IDMuMDk0LTEuOTgxIDYuODc2LTIuOTcyIDExLjM0NC0yLjk3MiAzLjg0NiAwIDYuODk3LjgzMiA5LjE1MyAyLjQ5NSAyLjI1NSAxLjY0OSAzLjM4MyAzLjg5OCAzLjM4MyA2Ljc0NyAwIDEuNTkxLTIuNzExIDMuMzI2LTguMTMzIDUuMjA2LTQuNDgzIDEuNjItNy43NDQgMi40My05Ljc4MiAyLjQzYTQuNDkgNC40OSAwIDAgMS0uNjczLS4wNDNjMCAuMzktLjMxMS44NjgtLjkzMiAxLjQzMi4zMzIuNTY0IDEuOTgxIDEuMjE0IDQuOTQ1IDEuOTUyIDIuNjYuNjggNC41NTUgMS4wMiA1LjY4MiAxLjAyaDEzLjQ3YzAgLjAyOSAxLjY5OS4yODIgNS4wOTcuNzU5IDEuMDcuNjggMS44NDMgMS40MzkgMi4zMjEgMi4yNzhabS0xNy40NjEtMTYuOWMtMS41NzYtMS42MDUtNC4xMTMtMi40MDgtNy42MTMtMi40MDgtMi40NTggMC00LjczNS40NzctNi44MzIgMS40MzItMi43MDQgMS4yNDQtNC4wNTYgMi45MjktNC4wNTYgNS4wNTUgMCAuNzUyLjI1MyAxLjI4Ny43NTkgMS42MDVoMLine truncated
|
const simpleJs = `signaturePad.fromDataURL("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA1OTIgMjAwIj4KICA8ZyBjbGlwLXBhdGg9InVybCgjYSkiPgogICAgPHBhdGggZmlsbD0iIzAwMCIgZD0iTTEzMi4wOTIgNzkuMDY1YzAgLjMwNC0uMzU1IDEuNDAzLTEuMDYzIDMuMjk4LS42OTQgMS44OTQtMS4xNDIgMy4wMjItMS4zNDUgMy4zODQtMi4zNDIgMy44NDctNi43NiA3LjE4LTEzLjI1MiAxMC4wMDEtNS4zNjUgMi4yMjctMTMuNDU1IDUuNTktMjQuMjcgMTAuMDg4YTE0OC4xOSAxNDguMTkgMCAwIDAtMTAuMzQ3IDMuMTI0Yy0yLjY5Ljg4Mi02LjU4NiAyLjk1LTExLjY5IDYuMjA0YTE4Ny42NiAxODcuNjYgMCAwIDAtMS4wNjMgMTAuMTk2IDQwNy40OSA0MDcuNDkgMCAwIDEtMS40MzIgMTUuMzM4Yy0uODgyIDEuMTg2LTEuOTg4IDEuNzc5LTMuMzE4IDEuNzc5LjExNSAwIC4xNzMtLjAxNS4xNzMtLjA0NC0uMjAyLS4xMDEtLjg5Ni0uMjgyLTIuMDgyLS41NDJ2LTIuODg1YzAtMi43MDUuMjMxLTUuNDYuNjk0LTguMjY2IDAtLjA1Ny4yNTMtLjc3My43Ni0yLjE0Ny41MDUtMS4zMzEuNzU4LTIuMTQxLjc1OC0yLjQzIDAtMS42MDUtLjI5Ni0zLjI0LS44ODktNC45MDMtLjM5IDEuMTI4LTEuMTEzIDEuODU5LTIuMTY5IDIuMTkxLTEuMjQ0LS43MjMtMS44NjUtMS45ODgtMS44NjUtMy43OTYgMC0uMjAzIDEuMDQ4LTEuNzI5IDMuMTQ1LTQuNTc4IDIuMTQtMi45NjUgMy4zODMtNS4wMDQgMy43My02LjExNy4yNzUtLjgxLjc2Ny0zLjQ1IDEuNDc1LTcuOTE5IDEuMDQxLTYuNjEgMS45Ni0xMS40NCAyLjc1NS0xNC40OTEgMS42OTItNi42MzkgMy42OTQtMTAuODYyIDYuMDA4LTEyLjY3bDIuNDMgMS44MjN2MS44NjVjLTEuNTA1IDEuMTU3LTIuNTY3IDMuMjYyLTMuMTkgNi4zMTMtLjE4Ny45NC0uNjM2IDMuMzQxLTEuMzQ0IDcuMjAzLS4xNDUuNzA4LS43MjMgMi41NDUtMS43MzUgNS41MS0uOTExIDIuNjAzLTEuMzY3IDQuMTg3LTEuMzY3IDQuNzUxdjUuNDI0Yy4yNi4yNDUuNS4zNjguNzE2LjM2OCAxLjIxNSAwIDMuMTA5LS41MDYgNS42ODMtMS41MTggMy4wOC0xLjE1NyA1LjAxNy0xLjg1MSA1LjgxMy0yLjA4MyAxMy4wNzEtMy4zODQgMjMuMTUtNy4yMzggMzAuMjM1LTExLjU2MyA2LjIxOC0zLjc0NiA5Ljk5Mi02LjI5OCAxMS4zMjItNy42NTggMS41NzYtMS41NjIgMi4zNjQtMy42NjYgMi4zNjQtNi4zMTMgMC00LjY3MS0yLjEwNC04LjU2OS02LjMxMi0xMS42OTMtMy44Ni0yLjkwNy04LjE5MS00LjM2LTEyLjk5Mi00LjM2LTMuNzg4IDAtOC4yNzEuNDYyLTEzLjQ0NyAxLjM4OC02LjY2NiAxLjIxNS0xMi45MiAyLjkwNy0xOC43NjIgNS4wNzYtOC44NjQgMy4yODQtMTMuNzM2IDYuODM0LTE0LjYxOCAxMC42NTJsLTEuMDg1LjgwM0M1OC44MzkgNzguNDIyIDU4IDc3LjA2MiA1OCA3NS43OWMwLTEuODA4IDEuODgtNC4wMTQgNS42NC02LjYxNyAzLjA4LTIuMTQgNS44Mi0zLjU2NSA4LjIyLTQuMjc0IDE1Ljk0OS00LjkxNyAyNy44NjQtNy4zNzYgMzUuNzQ0LTcuMzc2IDcuNDYxIDAgMTMuNDEyIDEuOTUzIDE3Ljg1MSA1Ljg1NyA0LjQyNCAzLjg2MiA2LjYzNyA5LjA5IDYuNjM3IDE1LjY4NVptMzIuMjk1IDU1LjQwN3YxLjkwOWMtLjU5Mi44MjQtMS4yNDMgMS4yMzYtMS45NTIgMS4yMzYtLjQ0OCAwLTEuOTczLTEuMzU5LTQuNTc2LTQuMDc4LTIuNjAzLTIuNzMzLTQuMzM4LTQuMS01LjIwNi00LjEgMCAuMDU4LTMuMDggMS4yNDQtOS4yMzkgMy41NTgtNi4zMDUgMi4zNDMtMTAuMzE3IDMuNTE0LTEyLjAzOCAzLjUxNC0xLjQxNyAwLTIuOTg2LS42OTQtNC43MDctMi4wODMtMS43Mi0xLjM3NC0yLjU4MS0yLjY2OC0yLjU4MS0zLjg4MyAwLTMuMTM4IDMuNDM0LTYuNzk3IDEwLjMwMy0xMC45NzcgNi40MzQtMy45NjMgMTEuMzQzLTUuOTQ0IDE0LjcyNy01Ljk0NCAxLjQxNyAwIDIuNjkuODEgMy44MTcgMi40M3YxLjgyMmMtLjU2NC44MS0xLjIxNCAxLjIxNS0xLjk1MiAxLjIxNS0uMTMgMC0uNjE0LS4xODEtMS40NTMtLjU0My0uODM5LS4zNzYtMS4zMzctLjU2NC0xLjQ5Ni0uNTY0LTEuMTI4IDAtMy43MTcgMS4xNjUtNy43NjUgMy40OTMtMy44MzIgMi4xNjktNi4zOTkgMy43ODktNy43IDQuODYtMS4zMDIgMS4xMjgtMi4xMzMgMi40MTUtMi40OTQgMy44NjEuOTgzLjkyNiAyLjE1NCAxLjM4OCAzLjUxMyAxLjM4OC43MDkgMCA0LjEwNy0xLjE3MSAxMC4xOTQtMy41MTQgNi4wNzMtMi4zNzIgOS43NDYtMy41NTggMTEuMDE5LTMuNTU4IDEuODY1IDAgMy4yMS40NyA0LjAzNCAxLjQxLjE4OC4yMTcuOTA0IDEuNDkgMi4xNDcgMy44MThhMjEuOTAyIDIxLjkwMiAwIDAgMCAzLjQwNSA0LjczWm02OS44ODQtMTkuNzQydjEuOTUzYy0yLjk5MyAyLjQ1OC01Ljg5OSA1LjIxMy04LjcxOSA4LjI2NS04Ljc2MiA5LjQ1OS0xNC42NjIgMTQuMTg4LTE3LjY5OSAxNC4xODgtMi40NTggMC01LjE5OC0yLjIyLTguMjItNi42NmwtNi41MjgtOS42NTRjLTEuMjQ0LjIwMy0zLjQ5MiAyLjQ2Ni02Ljc0NiA2Ljc5LTMuMDUxIDQuMTIyLTUuODQyIDYuMTgzLTguMzcyIDYuMTgzbC0xLjE5My0uNjI5Yy0uODgyLTEuNjItMi41MzgtNS4xNy00Ljk2Ny0xMC42NTItMi42NDYtNS45MjktMy45NjktOS4zMDYtMy45NjktMTAuMTMxIDAtMS40MzIuODQ2LTIuNjE4IDIuNTM4LTMuNTU4IDEuNjkxIDIuMDQgMy4zNTQgNC44NjcgNC45ODggOC40ODMgMi40NTggNS4zMzYgMy44NzUgOC4zMyA0LjI1MSA4Ljk4MWgyLjA2MWMuNTY0LTEuMDQxIDEuODk0LTIuNjU0IDMuOTkxLTQuODM4LjczNy0xLjEyOCAxLjgyMi0yLjY5IDMuMjUzLTQuNjg2IDEuNjc3LTIuMzcyIDMuMDk1LTMuNTU3IDQuMjUxLTMuNTU3IDEuMDcgMCAxLjk3NC41OTIgMi43MTEgMS43NzggMS4wNzEgMS42OTMgMi45ODYgNC43MyA1Ljc0OCA5LjExMiAzLjA1MSA0Ljc0NCA1LjMgNy4xMTYgNi43NDYgNy4xMTYgMS4wNyAwIDUuMDgyLTMuMDgxIDEyLjAzNy05LjI0MiA2Ljk3LTYuMTYxIDEwLjc5NS05LjI0MiAxMS40NzQtOS4yNDJoMi4zNjRabTQ0LjU3MyAxOS41MjVjLTEuMDQyIDEuMjQ0LTIuNDAxIDEuODY2LTQuMDc4IDEuODY2aC0xNC45ODhjLTMuNDcgMC03LjMzOC0uNTIxLTExLjYwNC0xLjU2Mi01LjU5NS0xLjM2LTguNzYyLTMuMDY3LTkuNS01LjEyLS44MDktMi4zMTQtMS4yMTQtNC41MzQtMS4yMTQtNi42NiAwLTQuMjY3IDEuODM2LTcuNTQzIDUuNTA5LTkuODI4IDMuMDk0LTEuOTgxIDYuODc2LTIuOTcyIDExLjM0NC0yLjk3MiAzLjg0NiAwIDYuODk3LjgzMiA5LjE1MyAyLjQ5NSAyLjI1NSAxLjY0OSAzLjM4MyAzLjg5OCAzLjM4MyA2Ljc0NyAwIDEuNTkxLTIuNzExIDMuMzI2LTguMTMzIDUuMjA2LTQuNDgzIDEuNjItNy43NDQgMi40My05Ljc4MiAyLjQzYTQuNDkgNC40OSAwIDAgMS0uNjczLS4wNDNjMCAuMzktLjMxMS44NjgtLjkzMiAxLjQzMi4zMzIuNTY0IDEuOTgxIDEuMjE0IDQuOTQ1IDEuOTUyIDIuNjYuNjggNC41NTUgMS4wMiA1LjY4MiAxLjAyaDEzLjQ3YzAgLjAyOSAxLjY5OS4yODIgNS4wOTcuNzU5IDEuMDcuNjggMS44NDMgMS40MzkgMi4zMjEgMi4yNzhabS0xNy40NjEtMTYuOWMtMS41NzYtMS42MDUtNC4xMTMtMi40MDgtNy42MTMtMi40MDgtMi40NTggMC00LjczNS40NzctNi44MzIgMS40MzItMi43MDQgMS4yNDQtNC4wNTYgMi45MjktNC4wNTYgNS4wNTUgMCAuNzUyLjI1MyAxLjI4Ny43NTkgMS42MDVoMLine truncated
|
||||||
|
|
||||||
@@ -58,6 +59,7 @@ document.querySelector("#signature-advanced-png").addEventListener("click", func
|
|||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Signatures" pageMenu="extra.signatures" pageLibs={['signature_pad']}>
|
<DefaultLayout title="Signatures" pageMenu="extra.signatures" pageLibs={['signature_pad']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/signature" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
<div class="col-lg-6">
|
<div class="col-lg-6">
|
||||||
<Card>
|
<Card>
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ import Progressbg from '@shared/components/cards/tables/Progressbg.astro'
|
|||||||
import Invoices from '@shared/components/cards/Invoices.astro'
|
import Invoices from '@shared/components/cards/Invoices.astro'
|
||||||
import AdvancedTable from '@ui/AdvancedTable.astro'
|
import AdvancedTable from '@ui/AdvancedTable.astro'
|
||||||
import Card from '@ui/Card.astro'
|
import Card from '@ui/Card.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Tables" pageMenu="base.tables" pageLibs={['lists']}>
|
<DefaultLayout title="Tables" pageMenu="base.tables" pageLibs={['lists']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/table" />
|
||||||
<div class="row row-cards">
|
<div class="row row-cards">
|
||||||
<div class="col-lg-8">
|
<div class="col-lg-8">
|
||||||
<Card>
|
<Card>
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
---
|
---
|
||||||
import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
|
import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="Typography" pageMenu="base.typography">
|
<DefaultLayout title="Typography" pageMenu="base.typography">
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/base/typography" />
|
||||||
<div class="card card-lg">
|
<div class="card card-lg">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="row g-4">
|
<div class="row g-4">
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ import Card from '@ui/Card.astro'
|
|||||||
import CardBody from '@ui/CardBody.astro'
|
import CardBody from '@ui/CardBody.astro'
|
||||||
import Wysiwyg from '@ui/Wysiwyg.astro'
|
import Wysiwyg from '@ui/Wysiwyg.astro'
|
||||||
import FormGroup from '@ui/FormGroup.astro'
|
import FormGroup from '@ui/FormGroup.astro'
|
||||||
|
import DocsLink from '@ui/DocsLink.astro'
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="HugeRTE" pageMenu="plugins.wysiwyg" pageLibs={['hugerte']}>
|
<DefaultLayout title="HugeRTE" pageMenu="plugins.wysiwyg" pageLibs={['hugerte']}>
|
||||||
|
<DocsLink slot="page-header-actions" path="/ui/components/wysiwyg" />
|
||||||
<Card>
|
<Card>
|
||||||
<CardBody>
|
<CardBody>
|
||||||
<FormGroup label="Your name" for="wysiwyg-name">
|
<FormGroup label="Your name" for="wysiwyg-name">
|
||||||
|
|||||||
Reference in new issue
Block a user