Skip to content

Commit ef82de1

Browse files
committed
fix: Self-closing HTML tags
1 parent 60ccd53 commit ef82de1

10 files changed

+136
-58
lines changed

.changeset/tough-readers-grin.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'flowbite-svelte-blocks': patch
3+
---
4+
5+
fix: Self-closing tag

src/lib/Section.svelte

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,5 +120,5 @@
120120
[Go to docs](https://flowbite-svelte-blocks.codewithshin.com/)
121121
## Props
122122
@prop export let sectionClass: string = 'relative py-6 sm:py-10';
123-
@prop export let name: 'advancedTable'|'blog' | 'comment' |'cta' | 'ctawithimg' | 'contact' | 'content' | 'contentwithimg' | 'crudcreatedrawer' | 'crudcreateform' | 'crudreadsection' | 'default' | 'faq' | 'feature' | 'forgotpassword' | 'headingwithctabutton' | 'heroDefault' | 'heroVisual' | 'login' | 'logos' | 'maintenance' | 'newsletter' | 'none' | 'page500' | 'page404' | 'portfolio' | 'pricing' | 'register' | 'reset' | 'schedule' | 'social' | 'tableheader' | 'team' | 'testimonial' = 'default';
123+
@prop export let name: 'advancedTable' | 'blog' | 'comment' | 'cta' | 'ctawithimg' | 'contact' | 'content' | 'contentwithimg' | 'crudcreatedrawer' | 'crudcreateform' | 'crudreadsection' | 'default' | 'faq' | 'feature' | 'forgotpassword' | 'headingwithctabutton' | 'heroDefault' | 'heroVisual' | 'login' | 'logos' | 'maintenance' | 'newsletter' | 'none' | 'page500' | 'page404' | 'portfolio' | 'pricing' | 'register' | 'reset' | 'schedule' | 'social' | 'tableheader' | 'team' | 'testimonial' = 'default';
124124
-->

src/lib/types.ts

+7
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,10 @@ export type Comment = {
99
content: string;
1010
replies?: Comment[];
1111
};
12+
13+
export interface LinkType {
14+
name: string;
15+
href?: string;
16+
rel?: string;
17+
active?: boolean;
18+
}

src/routes/+layout.svelte

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
<Runatics {analyticsId} />
3838
<div class="flex flex-col min-h-screen bg-white dark:bg-gray-900">
3939
<header class="sticky top-0 z-40 flex-none w-full mx-auto bg-white border-b border-gray-200 dark:border-gray-600 dark:bg-gray-800">
40-
<Navbar color="default" fluid navClass="flex items-center justify-between w-full mx-auto py-1.5 px-4" let:hidden let:toggle>
40+
<Navbar color="default" fluid class="flex items-center justify-between w-full mx-auto py-1.5 px-4" let:hidden let:toggle>
4141
<NavBrand href="/">
4242
<img src="/images/logo.svg" class="h-8 mr-3" alt="Flowbite Logo" />
4343
<span class="self-center text-2xl font-semibold whitespace-nowrap dark:text-white"> Flowbite Svelte Blocks </span>
+87-48
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,52 @@
11
<script lang="ts">
2+
import { Tabs, TabItem } from 'flowbite-svelte';
23
import TableProp from './TableProp.svelte';
34
import TableDefaultRow from './TableDefaultRow.svelte';
4-
5+
import { GridSolid, AdjustmentsVerticalSolid, ClipboardSolid } from 'flowbite-svelte-icons';
56
import { onMount } from 'svelte';
7+
import { getFilteredFileNames } from './helpers';
68
7-
8-
export let components;
9-
let compoData = [];
9+
type TCompoData = {
10+
data: {
11+
default: {
12+
name: string;
13+
props: string[][];
14+
events: string[][];
15+
slots: string[][];
16+
};
17+
};
18+
};
19+
20+
export let dirName: string = '';
21+
export let components: string;
1022
11-
// Split the components into an array
12-
const componentArray = components.split(', ');
23+
let compoData: TCompoData[] = [];
24+
// default is find fileName using dirName
25+
const fileNames = getFilteredFileNames(dirName);
1326
27+
// if components are given (e.g. checkbox, etc in forms, typography, utils)
28+
// use the components string
29+
let componentArray = components ? components.split(', ') : [];
30+
31+
if (components) {
32+
// Split the components into an array
33+
const componentArray = components.split(', ');
34+
}
35+
36+
let importPromises: Promise<any>[] = [];
37+
1438
async function processComponents() {
15-
const importPromises = componentArray.map(async (component) => {
16-
const module = await import(`../component-data/${component}.json`);
17-
return { data: module };
18-
});
39+
if (componentArray.length > 0) {
40+
importPromises = componentArray.map(async (component) => {
41+
const module = await import(`../component-data/${component}.json`);
42+
return { data: module };
43+
});
44+
} else {
45+
importPromises = fileNames.map(async (component) => {
46+
const module = await import(`../component-data/${component}.json`);
47+
return { data: module };
48+
});
49+
}
1950
2051
try {
2152
compoData = await Promise.all(importPromises);
@@ -25,54 +56,62 @@
2556
}
2657
}
2758
59+
2860
onMount(() => {
2961
processComponents()
3062
.catch(error => {
3163
console.error('Error outside of processComponents:', error);
3264
});
3365
});
34-
3566
</script>
3667

3768
{#if compoData}
38-
<h2>Component data</h2>
39-
{#each compoData as compo}
40-
41-
<h3>{compo.data.default.name}</h3>
42-
43-
{#if compo.data.default.props.length > 0}
44-
<h4>Props</h4>
45-
<ul class="w-full">
46-
<TableProp>
47-
<TableDefaultRow items={compo.data.default.props} rowState='hover' />
48-
</TableProp>
49-
</ul>
50-
{/if}
69+
<div id="compoData">
70+
{#each compoData as compo}
71+
<h4 class="text-lg">{compo.data.default.name}</h4>
72+
<Tabs style="underline" class="list-none">
73+
{#if compo.data.default.props.length > 0}
74+
<TabItem open>
75+
<div slot="title" class="flex items-center gap-2">
76+
<ClipboardSolid size="sm" />
77+
Props
78+
</div>
79+
<ul class="w-full">
80+
<TableProp>
81+
<TableDefaultRow items={compo.data.default.props} rowState='hover' />
82+
</TableProp>
83+
</ul>
84+
</TabItem>
85+
{/if}
5186

52-
<div class="grid grid-cols-1 md:grid-cols-2 gap-2">
53-
54-
{#if compo.data.default.events.length > 0}
55-
<div>
56-
<h4 class="mt-8 mb-4 text-lg font-bold text-gray-900 dark:text-white">Events</h4>
57-
<ul>
58-
<TableProp category="slots">
59-
<TableDefaultRow items={compo.data.default.events} rowState='hover' />
60-
</TableProp>
61-
</ul>
62-
</div>
63-
{/if}
64-
65-
{#if compo.data.default.slots.length > 0}
66-
<div>
67-
<h4 class="mt-8 mb-4 text-lg font-bold text-gray-900 dark:text-white">Slots</h4>
68-
<ul class="w-full">
69-
<TableProp category="slots">
70-
<TableDefaultRow items={compo.data.default.slots} rowState='hover' />
71-
</TableProp>
72-
</ul>
73-
</div>
74-
{/if}
87+
{#if compo.data.default.events.length > 0}
88+
<TabItem>
89+
<div slot="title" class="flex items-center gap-2">
90+
<AdjustmentsVerticalSolid size="sm" />
91+
Events
92+
</div>
93+
<ul class="w-full list-none">
94+
<TableProp category="slots">
95+
<TableDefaultRow items={compo.data.default.events} rowState='hover' />
96+
</TableProp>
97+
</ul>
98+
</TabItem>
99+
{/if}
75100

101+
{#if compo.data.default.slots.length > 0}
102+
<TabItem>
103+
<div slot="title" class="flex items-center gap-2">
104+
<GridSolid size="sm" />
105+
Slots
106+
</div>
107+
<ul class="w-full list-none">
108+
<TableProp category="slots">
109+
<TableDefaultRow items={compo.data.default.slots} rowState='hover' />
110+
</TableProp>
111+
</ul>
112+
</TabItem>
113+
{/if}
114+
</Tabs>
115+
{/each}
76116
</div>
77-
{/each}
78117
{/if}

src/routes/utils/Paging.svelte

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<script lang="ts">
22
import { page } from '$app/stores';
33
import { PaginationItem } from 'flowbite-svelte';
4-
import { identity } from 'svelte/internal';
54
import ArrowLeft from './icons/ArrowLeft.svelte';
65
import ArrowRight from './icons/ArrowRight.svelte';
76
@@ -27,8 +26,8 @@
2726
// console.log('data.dir: ',data.dir)
2827
// console.log('data: ',data)
2928
30-
const components = Object.values(data.posts)
31-
.flatMap(identity)
29+
const components = Object.values(data.posts as Post[])
30+
.flat()
3231
// .filter((x) => x.meta.dir === data.dir)
3332
.filter((x) => x.meta && x.meta.dir === data.dir)
3433
.map(({ path, meta }) => ({ path, name: meta.breadcrumb_title }));

src/routes/utils/Sectioncompo.svelte

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
export let section;
2323
2424
const sectionPosts = section !== undefined ? data.posts[section] : Object.values(data.posts).flat();
25-
console.log('section.posts: ', sectionPosts);
25+
// console.log('section.posts: ', sectionPosts);
2626
let searchTerm = '';
2727
// const flattened_posts = Object.values(data.posts).flat()
2828
let components: SvelteComponent;

src/routes/utils/Toc.svelte

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
Inspired by 'svelte-toc'
44
Simplified version of Table of Contents.
55
*/
6+
67
import type { LinkType } from '$lib/types';
78
8-
const aClass = "inline-block border-l border-white duration-200 hover:text-gray-900 transition-none dark:hover:text-white hover:border-gray-300 after:content-['#'] after:text-primary-700 dark:after:text-primary-700 dark:border-gray-900 dark:hover:border-gray-700 after:ml-2 after:opacity-0 hover:after:opacity-100 after:transition-opacity after:duration-100";
9+
const aClass = "inline-block border-s border-white duration-200 hover:text-gray-900 transition-none dark:hover:text-white hover:border-gray-300 after:content-['#'] after:text-primary-700 dark:after:text-primary-700 dark:border-gray-900 dark:hover:border-gray-700 after:ms-2 after:opacity-0 hover:after:opacity-100 after:transition-opacity after:duration-100";
910
1011
export let extract: (x: HTMLElement) => LinkType = (x: HTMLElement) => ({ name: x.textContent ?? '' });
1112
@@ -25,7 +26,7 @@
2526
}
2627
2728
function indent(name: string | undefined) {
28-
return name === 'H2' ? 'pl-2.5' : 'pl-6';
29+
return name === 'H2' ? 'ps-2.5' : 'ps-6';
2930
}
3031
3132
function toc() {
@@ -35,11 +36,11 @@
3536
}
3637
</script>
3738

38-
<div class="flex-none hidden w-64 pl-8 xl:text-sm xl:block right-0" use:init>
39+
<div class="flex-none hidden w-64 ps-8 xl:text-sm xl:block end-0" use:init>
3940
{#if headings.length}
4041
<div class="flex overflow-y-auto sticky top-20 flex-col justify-between pb-6 h-[calc(100vh-5rem)]">
4142
<div class="mb-8">
42-
<h4 class="pl-2.5 my-4 text-sm font-semibold tracking-wide text-gray-900 uppercase dark:text-white">On this page</h4>
43+
<h4 class="ps-2.5 my-4 text-sm font-semibold tracking-wide text-gray-900 uppercase dark:text-white">On this page</h4>
4344
<nav>
4445
<ul class="overflow-x-hidden font-medium text-gray-500 dark:text-gray-400 space-y-2.5">
4546
{#each headings as { rel, href, name }}

src/routes/utils/helpers.ts

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
export function getFilteredFileNames(dirName: string) {
2+
const modules = import.meta.glob('$lib/**/*.svelte');
3+
const pathsArray = Object.keys(modules);
4+
const filteredPaths = pathsArray.filter((path) => path.includes(dirName));
5+
const fileNames = filteredPaths.map((path) => {
6+
const parts = path.split('/');
7+
const fileNameWithExtension = parts[parts.length - 1];
8+
const fileNameWithoutExtension = fileNameWithExtension.substring(0, fileNameWithExtension.lastIndexOf('.'));
9+
10+
return fileNameWithoutExtension;
11+
});
12+
13+
return fileNames;
14+
}
15+
16+
export function toKebabCase(inputString: string) {
17+
return inputString.toLowerCase().replace(/\s+/g, '-');
18+
}

src/routes/utils/mdsvex.d.ts

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
declare module '*.md' {
2+
import type { SvelteComponentDev } from 'svelte/internal';
3+
4+
export default class Comp extends SvelteComponentDev {
5+
$$prop_def: {};
6+
metadata: Record<string, any>;
7+
}
8+
export const metadata: Record<string, any>;
9+
}

0 commit comments

Comments
 (0)