@haroonwaves/blog-kit-react 1.3.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @haroonwaves/blog-kit-react
2
2
 
3
3
  React components and hooks for rendering markdown blogs. Includes blog renderer with syntax
4
- highlighting, blog cards, lists, and search functionality.
4
+ highlighting, blog cards, lists with built-in search, filtering, and customization.
5
5
 
6
6
  ## Installation
7
7
 
@@ -22,8 +22,8 @@ For complete documentation, API reference, and examples, please visit the
22
22
 
23
23
  ## Quick Links
24
24
 
25
- - [Quick Start](https://blog-kit.haroonwaves.com/docs/quick-start)
26
- - [React Package Usage](https://blog-kit.haroonwaves.com/docs/react-package)
25
+ - [Getting Started](https://blog-kit.haroonwaves.com/docs/getting-started)
26
+ - [Guides](https://blog-kit.haroonwaves.com/docs/guides)
27
27
  - [API Reference](https://blog-kit.haroonwaves.com/docs/api-reference)
28
28
 
29
29
  ## Related Packages
package/dist/index.cjs CHANGED
@@ -30,15 +30,18 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
- BlogCard: () => BlogCard,
34
- BlogList: () => BlogList,
35
- BlogPlaceholder: () => BlogPlaceholder,
36
- BlogRenderer: () => BlogRenderer,
37
- useBlogs: () => useBlogs
33
+ ContentCard: () => ContentCard,
34
+ ContentList: () => ContentList,
35
+ ContentPlaceholder: () => ContentPlaceholder,
36
+ ContentRenderer: () => ContentRenderer,
37
+ Filter: () => Filter,
38
+ filterContent: () => filterContent,
39
+ getAvailableCategories: () => getAvailableCategories,
40
+ useContent: () => useContent
38
41
  });
39
42
  module.exports = __toCommonJS(src_exports);
40
43
 
41
- // src/components/BlogRenderer.tsx
44
+ // src/components/ContentRenderer.tsx
42
45
  var import_react = require("react");
43
46
  var import_react_markdown = __toESM(require("react-markdown"), 1);
44
47
  var import_remark_gfm = __toESM(require("remark-gfm"), 1);
@@ -78,7 +81,7 @@ function Badge({ children, className }) {
78
81
  );
79
82
  }
80
83
 
81
- // src/components/BlogRenderer.tsx
84
+ // src/components/ContentRenderer.tsx
82
85
  var import_jsx_runtime2 = require("react/jsx-runtime");
83
86
  var defaultComponents = {
84
87
  h1: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
@@ -124,8 +127,20 @@ var defaultComponents = {
124
127
  }
125
128
  ),
126
129
  p: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "bk:mb-4 bk:leading-7 bk:text-gray-700 bk:dark:text-gray-300", ...props }),
127
- ul: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { className: "bk:mb-4 bk:ml-6 bk:list-disc bk:space-y-2 bk:text-gray-700 bk:dark:text-gray-300", ...props }),
128
- ol: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ol", { className: "bk:mb-4 bk:ml-6 bk:list-decimal bk:space-y-2 bk:text-gray-700 bk:dark:text-gray-300", ...props }),
130
+ ul: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
131
+ "ul",
132
+ {
133
+ className: "bk:mb-4 bk:ml-6 bk:list-disc bk:space-y-2 bk:text-gray-700 bk:dark:text-gray-300",
134
+ ...props
135
+ }
136
+ ),
137
+ ol: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
138
+ "ol",
139
+ {
140
+ className: "bk:mb-4 bk:ml-6 bk:list-decimal bk:space-y-2 bk:text-gray-700 bk:dark:text-gray-300",
141
+ ...props
142
+ }
143
+ ),
129
144
  li: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { ...props }),
130
145
  code: ({ className, children, ...props }) => {
131
146
  const isInline = !className;
@@ -175,15 +190,27 @@ var defaultComponents = {
175
190
  ...props
176
191
  }
177
192
  ) }),
178
- thead: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("thead", { className: "bk:bg-gray-50 bk:dark:bg-gray-800 bk:text-gray-700 bk:dark:text-gray-200", ...props }),
193
+ thead: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
194
+ "thead",
195
+ {
196
+ className: "bk:bg-gray-50 bk:dark:bg-gray-800 bk:text-gray-700 bk:dark:text-gray-200",
197
+ ...props
198
+ }
199
+ ),
179
200
  tbody: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("tbody", { ...props }),
180
- tr: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("tr", { className: "bk:border-b bk:last:border-b-0 bk:border-gray-200 bk:dark:border-gray-700", ...props }),
201
+ tr: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
202
+ "tr",
203
+ {
204
+ className: "bk:border-b bk:last:border-b-0 bk:border-gray-200 bk:dark:border-gray-700",
205
+ ...props
206
+ }
207
+ ),
181
208
  th: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("th", { className: "bk:px-4 bk:py-3 bk:text-left bk:font-semibold", ...props }),
182
209
  td: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { className: "bk:px-4 bk:py-3 bk:text-gray-700 bk:dark:text-gray-300", ...props }),
183
210
  input: (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("input", { type: "checkbox", disabled: true, className: "bk:mr-2 bk:accent-blue-600", ...props })
184
211
  };
185
- function BlogRenderer({
186
- content,
212
+ function ContentRenderer({
213
+ body,
187
214
  metadata,
188
215
  className = "",
189
216
  components,
@@ -211,16 +238,16 @@ function BlogRenderer({
211
238
  remarkPlugins: [import_remark_gfm.default],
212
239
  rehypePlugins: [import_rehype_raw.default, import_rehype_prism_plus.default, import_rehype_slug_custom_id.default],
213
240
  components: mergedComponents,
214
- children: content
241
+ children: body
215
242
  }
216
243
  ) })
217
244
  ] });
218
245
  }
219
246
 
220
- // src/components/BlogCard.tsx
247
+ // src/components/ContentCard.tsx
221
248
  var import_react2 = require("react");
222
249
  var import_jsx_runtime3 = require("react/jsx-runtime");
223
- function BlogCard({
250
+ function ContentCard({
224
251
  metadata,
225
252
  basePath = "/blog",
226
253
  renderLink,
@@ -263,56 +290,170 @@ function BlogCard({
263
290
  );
264
291
  }
265
292
 
266
- // src/components/BlogList.tsx
293
+ // src/components/ContentList.tsx
294
+ var import_react3 = require("react");
267
295
  var import_jsx_runtime4 = require("react/jsx-runtime");
268
- function BlogList({
296
+ function ContentList({
269
297
  metadata,
298
+ title,
299
+ description,
270
300
  basePath = "/blog",
271
301
  renderLink,
272
302
  className = "",
273
- emptyMessage = "No blog posts found.",
274
- cardProps
303
+ emptyMessage = "No content found.",
304
+ cardProps,
305
+ classNames = {}
275
306
  }) {
276
- if (metadata.length === 0) {
277
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: `bk:text-center bk:text-gray-500 bk:dark:text-gray-400 bk:py-12 ${className}`, children: emptyMessage });
278
- }
279
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: `bk:flex bk:flex-col bk:gap-6 ${className}`, children: metadata.map((meta) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
280
- BlogCard,
281
- {
282
- metadata: meta,
283
- basePath,
284
- renderLink,
285
- ...cardProps
286
- },
287
- meta.slug
288
- )) });
307
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "bk:w-full", children: [
308
+ title && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
309
+ "h1",
310
+ {
311
+ className: `bk:text-4xl bk:font-bold bk:mb-4 bk:mt-8 bk:text-gray-800 bk:dark:text-gray-100 ${classNames.title ?? ""}`,
312
+ children: title
313
+ }
314
+ ),
315
+ description && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
316
+ "p",
317
+ {
318
+ className: `bk:text-gray-600 bk:dark:text-gray-400 bk:mb-8 ${classNames.description ?? ""}`,
319
+ children: description
320
+ }
321
+ ),
322
+ metadata.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
323
+ "div",
324
+ {
325
+ className: `bk:text-center bk:text-gray-500 bk:dark:text-gray-400 bk:py-12 ${className}`,
326
+ children: emptyMessage
327
+ }
328
+ ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: `bk:flex bk:flex-col bk:gap-6 ${className}`, children: metadata.map((meta) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
329
+ ContentCard,
330
+ {
331
+ metadata: meta,
332
+ basePath,
333
+ renderLink,
334
+ ...cardProps
335
+ },
336
+ meta.slug
337
+ )) })
338
+ ] });
289
339
  }
290
340
 
291
- // src/components/BlogPlaceholder.tsx
341
+ // src/components/Filter.tsx
342
+ var import_react4 = require("react");
292
343
  var import_jsx_runtime5 = require("react/jsx-runtime");
293
- function BlogPlaceholder({ count = 3, className = "" }) {
294
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `${className}`, children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
344
+ function Filter({
345
+ searchTerm,
346
+ setSearchTerm,
347
+ selectedCategory,
348
+ setSelectedCategory,
349
+ categories,
350
+ contentCount,
351
+ className = "",
352
+ placeholder = "Search content...",
353
+ classNames = {}
354
+ }) {
355
+ const pillBase = `bk:px-2.5 bk:py-1 bk:cursor-pointer bk:rounded-md bk:text-xs bk:font-medium bk:transition-colors ${classNames.pill ?? ""}`;
356
+ const pillActive = `bk:bg-gray-700 bk:dark:bg-gray-200 bk:text-white bk:dark:text-gray-800 ${classNames.activePill ?? ""}`;
357
+ const pillInactive = `bk:bg-gray-100 bk:dark:bg-gray-700 bk:text-gray-500 bk:dark:text-gray-300 bk:hover:bg-gray-200 bk:dark:hover:bg-gray-600 ${classNames.inactivePill ?? ""}`;
358
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: `bk:flex bk:flex-col bk:gap-4 bk:mb-6 ${className}`, children: [
359
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "bk:flex bk:flex-col bk:sm:flex-row bk:gap-3", children: [
360
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "bk:relative bk:flex-1", children: [
361
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
362
+ "svg",
363
+ {
364
+ className: "bk:absolute bk:left-3 bk:top-1/2 bk:-translate-y-1/2 bk:w-3.5 bk:h-3.5 bk:text-gray-400 bk:pointer-events-none",
365
+ fill: "none",
366
+ stroke: "currentColor",
367
+ strokeWidth: 2,
368
+ viewBox: "0 0 24 24",
369
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
370
+ "path",
371
+ {
372
+ strokeLinecap: "round",
373
+ strokeLinejoin: "round",
374
+ d: "M21 21l-4.35-4.35M17 11A6 6 0 1 1 5 11a6 6 0 0 1 12 0z"
375
+ }
376
+ )
377
+ }
378
+ ),
379
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
380
+ "input",
381
+ {
382
+ id: "content-search",
383
+ type: "search",
384
+ value: searchTerm,
385
+ onChange: (e) => setSearchTerm(e.target.value),
386
+ placeholder,
387
+ className: `bk:w-full bk:pl-8 bk:pr-4 bk:py-2 bk:rounded-md bk:border bk:border-gray-200 bk:dark:border-gray-700 bk:bg-white bk:dark:bg-gray-800 bk:text-sm bk:text-gray-700 bk:dark:text-gray-200 bk:placeholder-gray-400 bk:focus:outline-none bk:focus:border-gray-400 bk:dark:focus:border-gray-500 bk:transition-colors ${classNames.input ?? ""}`
388
+ }
389
+ )
390
+ ] }),
391
+ categories.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
392
+ "div",
393
+ {
394
+ className: `bk:flex bk:flex-wrap bk:gap-2 bk:items-center ${classNames.categoryContainer ?? ""}`,
395
+ children: [
396
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
397
+ "button",
398
+ {
399
+ onClick: () => setSelectedCategory(null),
400
+ className: `${pillBase} ${selectedCategory === null ? pillActive : pillInactive}`,
401
+ children: "All"
402
+ }
403
+ ),
404
+ categories.slice(0, 3).map((cat) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
405
+ "button",
406
+ {
407
+ onClick: () => setSelectedCategory(cat),
408
+ className: `${pillBase} ${selectedCategory === cat ? pillActive : pillInactive}`,
409
+ children: cat
410
+ },
411
+ cat
412
+ ))
413
+ ]
414
+ }
415
+ )
416
+ ] }),
417
+ contentCount !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
418
+ "p",
419
+ {
420
+ className: `bk:text-[10px] bk:uppercase bk:tracking-wider bk:text-gray-400 bk:dark:text-gray-500 ${classNames.contentCount ?? ""}`,
421
+ children: [
422
+ contentCount,
423
+ " ",
424
+ contentCount === 1 ? "item" : "items",
425
+ " found"
426
+ ]
427
+ }
428
+ )
429
+ ] });
430
+ }
431
+
432
+ // src/components/ContentPlaceholder.tsx
433
+ var import_jsx_runtime6 = require("react/jsx-runtime");
434
+ function ContentPlaceholder({ count = 3, className = "" }) {
435
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: `${className}`, children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
295
436
  "div",
296
437
  {
297
438
  className: "bk:bg-white bk:dark:bg-gray-800 bk:rounded-lg bk:border bk:border-gray-200 bk:dark:border-gray-700 bk:p-6 bk:animate-pulse",
298
439
  children: [
299
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "bk:h-4 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:mb-3" }),
300
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "bk:h-6 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:mb-2" }),
301
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "bk:h-4 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:w-3/4" })
440
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "bk:h-4 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:mb-3" }),
441
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "bk:h-6 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:mb-2" }),
442
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "bk:h-4 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:w-3/4" })
302
443
  ]
303
444
  },
304
445
  i
305
446
  )) });
306
447
  }
307
448
 
308
- // src/hooks/useBlogs.ts
309
- var import_react4 = require("react");
449
+ // src/hooks/useContent.ts
450
+ var import_react6 = require("react");
310
451
 
311
452
  // src/hooks/useDebounce.ts
312
- var import_react3 = require("react");
453
+ var import_react5 = require("react");
313
454
  function useDebounce(value, delay) {
314
- const [debouncedValue, setDebouncedValue] = (0, import_react3.useState)(value);
315
- (0, import_react3.useEffect)(() => {
455
+ const [debouncedValue, setDebouncedValue] = (0, import_react5.useState)(value);
456
+ (0, import_react5.useEffect)(() => {
316
457
  const timer = setTimeout(() => {
317
458
  setDebouncedValue(value);
318
459
  }, delay);
@@ -323,33 +464,40 @@ function useDebounce(value, delay) {
323
464
  return debouncedValue;
324
465
  }
325
466
 
326
- // src/hooks/useBlogs.ts
327
- function useBlogs(blogsMeta) {
328
- const [filteredBlogs, setFilteredBlogs] = (0, import_react4.useState)(blogsMeta);
329
- const [searchTerm, setSearchTerm] = (0, import_react4.useState)("");
330
- const [selectedCategory, setSelectedCategory] = (0, import_react4.useState)(null);
467
+ // src/utils/filter-utils.ts
468
+ function filterContent(items, searchTerm = "", selectedCategory = null) {
469
+ let filtered = items;
470
+ if (searchTerm) {
471
+ const lowerSearch = searchTerm.toLowerCase();
472
+ filtered = filtered.filter(
473
+ (item) => (item.title?.toLowerCase() || "").includes(lowerSearch) || (item.description?.toLowerCase() || "").includes(lowerSearch)
474
+ );
475
+ }
476
+ if (selectedCategory) {
477
+ filtered = filtered.filter((item) => {
478
+ const categories = item.categories ?? [];
479
+ return categories.includes(selectedCategory);
480
+ });
481
+ }
482
+ return filtered;
483
+ }
484
+ function getAvailableCategories(items) {
485
+ return Array.from(new Set(items.flatMap((item) => item.categories ?? [])));
486
+ }
487
+
488
+ // src/hooks/useContent.ts
489
+ function useContent(allContentMeta) {
490
+ const [searchTerm, setSearchTerm] = (0, import_react6.useState)("");
491
+ const [selectedCategory, setSelectedCategory] = (0, import_react6.useState)(null);
331
492
  const debouncedSearchTerm = useDebounce(searchTerm, 500);
332
- const getBlogCategories = (blog) => {
333
- return blog.categories ?? [];
334
- };
335
- (0, import_react4.useEffect)(() => {
336
- let filtered = blogsMeta;
337
- if (debouncedSearchTerm) {
338
- filtered = filtered.filter(
339
- (blog) => blog.title.toLowerCase().includes(debouncedSearchTerm.toLowerCase()) || blog.description.toLowerCase().includes(debouncedSearchTerm.toLowerCase())
340
- );
341
- }
342
- if (selectedCategory) {
343
- filtered = filtered.filter((blog) => {
344
- const blogCategories = getBlogCategories(blog);
345
- return blogCategories.includes(selectedCategory);
346
- });
347
- }
348
- setFilteredBlogs(filtered);
349
- }, [blogsMeta, debouncedSearchTerm, selectedCategory]);
350
- const categories = Array.from(new Set(blogsMeta.flatMap((blog) => getBlogCategories(blog))));
493
+ const metadata = (0, import_react6.useMemo)(() => {
494
+ return filterContent(allContentMeta, debouncedSearchTerm, selectedCategory);
495
+ }, [allContentMeta, debouncedSearchTerm, selectedCategory]);
496
+ const categories = (0, import_react6.useMemo)(() => {
497
+ return getAvailableCategories(allContentMeta);
498
+ }, [allContentMeta]);
351
499
  return {
352
- metadata: filteredBlogs,
500
+ metadata,
353
501
  searchTerm,
354
502
  setSearchTerm,
355
503
  selectedCategory,
@@ -359,9 +507,12 @@ function useBlogs(blogsMeta) {
359
507
  }
360
508
  // Annotate the CommonJS export names for ESM import in node:
361
509
  0 && (module.exports = {
362
- BlogCard,
363
- BlogList,
364
- BlogPlaceholder,
365
- BlogRenderer,
366
- useBlogs
510
+ ContentCard,
511
+ ContentList,
512
+ ContentPlaceholder,
513
+ ContentRenderer,
514
+ Filter,
515
+ filterContent,
516
+ getAvailableCategories,
517
+ useContent
367
518
  });
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import react__default from 'react';
4
4
 
5
- interface BlogMeta {
5
+ interface ContentMeta {
6
6
  title: string;
7
7
  description: string;
8
8
  date: string;
@@ -10,28 +10,28 @@ interface BlogMeta {
10
10
  slug: string;
11
11
  readingTime: string;
12
12
  }
13
- interface Blog {
14
- metadata: BlogMeta;
15
- content: string;
13
+ interface Content {
14
+ metadata: ContentMeta;
15
+ body: string;
16
16
  }
17
- interface BlogConfig {
17
+ interface ContentConfig {
18
18
  contentDirectory: string;
19
- blogSubdirectory?: string;
19
+ contentSubdirectory?: string;
20
20
  }
21
21
 
22
- interface BlogRendererProps {
23
- content: string;
24
- metadata: BlogMeta;
22
+ interface ContentRendererProps {
23
+ body: string;
24
+ metadata: ContentMeta;
25
25
  className?: string;
26
26
  components?: Record<string, react__default.ComponentType<any>>;
27
27
  showCategory?: boolean;
28
28
  showReadingTime?: boolean;
29
29
  showDate?: boolean;
30
30
  }
31
- declare function BlogRenderer({ content, metadata, className, components, showCategory, showReadingTime, showDate, }: BlogRendererProps): react_jsx_runtime.JSX.Element;
31
+ declare function ContentRenderer({ body, metadata, className, components, showCategory, showReadingTime, showDate, }: ContentRendererProps): react_jsx_runtime.JSX.Element;
32
32
 
33
- interface BlogCardProps {
34
- metadata: BlogMeta;
33
+ interface ContentCardProps {
34
+ metadata: ContentMeta;
35
35
  basePath?: string;
36
36
  renderLink?: (href: string, children: react__default.ReactNode) => react__default.ReactNode;
37
37
  className?: string;
@@ -39,26 +39,56 @@ interface BlogCardProps {
39
39
  showReadingTime?: boolean;
40
40
  showDate?: boolean;
41
41
  }
42
- declare function BlogCard({ metadata, basePath, renderLink, className, showCategory, showReadingTime, showDate, }: BlogCardProps): react_jsx_runtime.JSX.Element;
42
+ declare function ContentCard({ metadata, basePath, renderLink, className, showCategory, showReadingTime, showDate, }: ContentCardProps): react_jsx_runtime.JSX.Element;
43
43
 
44
- interface BlogListProps {
45
- metadata: BlogMeta[];
44
+ interface ContentListProps {
45
+ metadata: ContentMeta[];
46
+ title?: string;
47
+ description?: string;
46
48
  basePath?: string;
47
- renderLink?: BlogCardProps['renderLink'];
49
+ renderLink?: ContentCardProps['renderLink'];
48
50
  className?: string;
49
51
  emptyMessage?: string;
50
- cardProps?: Omit<BlogCardProps, 'metadata' | 'basePath' | 'renderLink'>;
52
+ cardProps?: Omit<ContentCardProps, 'metadata' | 'basePath' | 'renderLink'>;
53
+ classNames?: {
54
+ title?: string;
55
+ description?: string;
56
+ };
51
57
  }
52
- declare function BlogList({ metadata, basePath, renderLink, className, emptyMessage, cardProps, }: BlogListProps): react_jsx_runtime.JSX.Element;
58
+ /**
59
+ * A pure, stateless ContentList component that renders a list of content cards.
60
+ * Accepts metadata and renders it exactly as provided.
61
+ */
62
+ declare function ContentList({ metadata, title, description, basePath, renderLink, className, emptyMessage, cardProps, classNames, }: ContentListProps): react_jsx_runtime.JSX.Element;
53
63
 
54
- interface BlogPlaceholderProps {
64
+ interface FilterProps {
65
+ searchTerm: string;
66
+ setSearchTerm: (searchTerm: string) => void;
67
+ selectedCategory: string | null;
68
+ setSelectedCategory: (selectedCategory: string | null) => void;
69
+ categories: string[];
70
+ contentCount?: number;
71
+ className?: string;
72
+ placeholder?: string;
73
+ classNames?: {
74
+ input?: string;
75
+ categoryContainer?: string;
76
+ pill?: string;
77
+ activePill?: string;
78
+ inactivePill?: string;
79
+ contentCount?: string;
80
+ };
81
+ }
82
+ declare function Filter({ searchTerm, setSearchTerm, selectedCategory, setSelectedCategory, categories, contentCount, className, placeholder, classNames, }: FilterProps): react_jsx_runtime.JSX.Element;
83
+
84
+ interface ContentPlaceholderProps {
55
85
  count?: number;
56
86
  className?: string;
57
87
  }
58
- declare function BlogPlaceholder({ count, className }: BlogPlaceholderProps): react_jsx_runtime.JSX.Element;
88
+ declare function ContentPlaceholder({ count, className }: ContentPlaceholderProps): react_jsx_runtime.JSX.Element;
59
89
 
60
- declare function useBlogs(blogsMeta: BlogMeta[]): {
61
- metadata: BlogMeta[];
90
+ declare function useContent(allContentMeta: ContentMeta[]): {
91
+ metadata: ContentMeta[];
62
92
  searchTerm: string;
63
93
  setSearchTerm: react.Dispatch<react.SetStateAction<string>>;
64
94
  selectedCategory: string | null;
@@ -66,4 +96,7 @@ declare function useBlogs(blogsMeta: BlogMeta[]): {
66
96
  categories: string[];
67
97
  };
68
98
 
69
- export { type Blog, BlogCard, type BlogCardProps, type BlogConfig, BlogList, type BlogListProps, type BlogMeta, BlogPlaceholder, type BlogPlaceholderProps, BlogRenderer, type BlogRendererProps, useBlogs };
99
+ declare function filterContent(items: ContentMeta[], searchTerm?: string, selectedCategory?: string | null): ContentMeta[];
100
+ declare function getAvailableCategories(items: ContentMeta[]): string[];
101
+
102
+ export { type Content, ContentCard, type ContentCardProps, type ContentConfig, ContentList, type ContentListProps, type ContentMeta, ContentPlaceholder, type ContentPlaceholderProps, ContentRenderer, type ContentRendererProps, Filter, type FilterProps, filterContent, getAvailableCategories, useContent };
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import react__default from 'react';
4
4
 
5
- interface BlogMeta {
5
+ interface ContentMeta {
6
6
  title: string;
7
7
  description: string;
8
8
  date: string;
@@ -10,28 +10,28 @@ interface BlogMeta {
10
10
  slug: string;
11
11
  readingTime: string;
12
12
  }
13
- interface Blog {
14
- metadata: BlogMeta;
15
- content: string;
13
+ interface Content {
14
+ metadata: ContentMeta;
15
+ body: string;
16
16
  }
17
- interface BlogConfig {
17
+ interface ContentConfig {
18
18
  contentDirectory: string;
19
- blogSubdirectory?: string;
19
+ contentSubdirectory?: string;
20
20
  }
21
21
 
22
- interface BlogRendererProps {
23
- content: string;
24
- metadata: BlogMeta;
22
+ interface ContentRendererProps {
23
+ body: string;
24
+ metadata: ContentMeta;
25
25
  className?: string;
26
26
  components?: Record<string, react__default.ComponentType<any>>;
27
27
  showCategory?: boolean;
28
28
  showReadingTime?: boolean;
29
29
  showDate?: boolean;
30
30
  }
31
- declare function BlogRenderer({ content, metadata, className, components, showCategory, showReadingTime, showDate, }: BlogRendererProps): react_jsx_runtime.JSX.Element;
31
+ declare function ContentRenderer({ body, metadata, className, components, showCategory, showReadingTime, showDate, }: ContentRendererProps): react_jsx_runtime.JSX.Element;
32
32
 
33
- interface BlogCardProps {
34
- metadata: BlogMeta;
33
+ interface ContentCardProps {
34
+ metadata: ContentMeta;
35
35
  basePath?: string;
36
36
  renderLink?: (href: string, children: react__default.ReactNode) => react__default.ReactNode;
37
37
  className?: string;
@@ -39,26 +39,56 @@ interface BlogCardProps {
39
39
  showReadingTime?: boolean;
40
40
  showDate?: boolean;
41
41
  }
42
- declare function BlogCard({ metadata, basePath, renderLink, className, showCategory, showReadingTime, showDate, }: BlogCardProps): react_jsx_runtime.JSX.Element;
42
+ declare function ContentCard({ metadata, basePath, renderLink, className, showCategory, showReadingTime, showDate, }: ContentCardProps): react_jsx_runtime.JSX.Element;
43
43
 
44
- interface BlogListProps {
45
- metadata: BlogMeta[];
44
+ interface ContentListProps {
45
+ metadata: ContentMeta[];
46
+ title?: string;
47
+ description?: string;
46
48
  basePath?: string;
47
- renderLink?: BlogCardProps['renderLink'];
49
+ renderLink?: ContentCardProps['renderLink'];
48
50
  className?: string;
49
51
  emptyMessage?: string;
50
- cardProps?: Omit<BlogCardProps, 'metadata' | 'basePath' | 'renderLink'>;
52
+ cardProps?: Omit<ContentCardProps, 'metadata' | 'basePath' | 'renderLink'>;
53
+ classNames?: {
54
+ title?: string;
55
+ description?: string;
56
+ };
51
57
  }
52
- declare function BlogList({ metadata, basePath, renderLink, className, emptyMessage, cardProps, }: BlogListProps): react_jsx_runtime.JSX.Element;
58
+ /**
59
+ * A pure, stateless ContentList component that renders a list of content cards.
60
+ * Accepts metadata and renders it exactly as provided.
61
+ */
62
+ declare function ContentList({ metadata, title, description, basePath, renderLink, className, emptyMessage, cardProps, classNames, }: ContentListProps): react_jsx_runtime.JSX.Element;
53
63
 
54
- interface BlogPlaceholderProps {
64
+ interface FilterProps {
65
+ searchTerm: string;
66
+ setSearchTerm: (searchTerm: string) => void;
67
+ selectedCategory: string | null;
68
+ setSelectedCategory: (selectedCategory: string | null) => void;
69
+ categories: string[];
70
+ contentCount?: number;
71
+ className?: string;
72
+ placeholder?: string;
73
+ classNames?: {
74
+ input?: string;
75
+ categoryContainer?: string;
76
+ pill?: string;
77
+ activePill?: string;
78
+ inactivePill?: string;
79
+ contentCount?: string;
80
+ };
81
+ }
82
+ declare function Filter({ searchTerm, setSearchTerm, selectedCategory, setSelectedCategory, categories, contentCount, className, placeholder, classNames, }: FilterProps): react_jsx_runtime.JSX.Element;
83
+
84
+ interface ContentPlaceholderProps {
55
85
  count?: number;
56
86
  className?: string;
57
87
  }
58
- declare function BlogPlaceholder({ count, className }: BlogPlaceholderProps): react_jsx_runtime.JSX.Element;
88
+ declare function ContentPlaceholder({ count, className }: ContentPlaceholderProps): react_jsx_runtime.JSX.Element;
59
89
 
60
- declare function useBlogs(blogsMeta: BlogMeta[]): {
61
- metadata: BlogMeta[];
90
+ declare function useContent(allContentMeta: ContentMeta[]): {
91
+ metadata: ContentMeta[];
62
92
  searchTerm: string;
63
93
  setSearchTerm: react.Dispatch<react.SetStateAction<string>>;
64
94
  selectedCategory: string | null;
@@ -66,4 +96,7 @@ declare function useBlogs(blogsMeta: BlogMeta[]): {
66
96
  categories: string[];
67
97
  };
68
98
 
69
- export { type Blog, BlogCard, type BlogCardProps, type BlogConfig, BlogList, type BlogListProps, type BlogMeta, BlogPlaceholder, type BlogPlaceholderProps, BlogRenderer, type BlogRendererProps, useBlogs };
99
+ declare function filterContent(items: ContentMeta[], searchTerm?: string, selectedCategory?: string | null): ContentMeta[];
100
+ declare function getAvailableCategories(items: ContentMeta[]): string[];
101
+
102
+ export { type Content, ContentCard, type ContentCardProps, type ContentConfig, ContentList, type ContentListProps, type ContentMeta, ContentPlaceholder, type ContentPlaceholderProps, ContentRenderer, type ContentRendererProps, Filter, type FilterProps, filterContent, getAvailableCategories, useContent };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // src/components/BlogRenderer.tsx
1
+ // src/components/ContentRenderer.tsx
2
2
  import "react";
3
3
  import ReactMarkdown from "react-markdown";
4
4
  import remarkGfm from "remark-gfm";
@@ -38,7 +38,7 @@ function Badge({ children, className }) {
38
38
  );
39
39
  }
40
40
 
41
- // src/components/BlogRenderer.tsx
41
+ // src/components/ContentRenderer.tsx
42
42
  import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
43
43
  var defaultComponents = {
44
44
  h1: (props) => /* @__PURE__ */ jsx2(
@@ -84,8 +84,20 @@ var defaultComponents = {
84
84
  }
85
85
  ),
86
86
  p: (props) => /* @__PURE__ */ jsx2("p", { className: "bk:mb-4 bk:leading-7 bk:text-gray-700 bk:dark:text-gray-300", ...props }),
87
- ul: (props) => /* @__PURE__ */ jsx2("ul", { className: "bk:mb-4 bk:ml-6 bk:list-disc bk:space-y-2 bk:text-gray-700 bk:dark:text-gray-300", ...props }),
88
- ol: (props) => /* @__PURE__ */ jsx2("ol", { className: "bk:mb-4 bk:ml-6 bk:list-decimal bk:space-y-2 bk:text-gray-700 bk:dark:text-gray-300", ...props }),
87
+ ul: (props) => /* @__PURE__ */ jsx2(
88
+ "ul",
89
+ {
90
+ className: "bk:mb-4 bk:ml-6 bk:list-disc bk:space-y-2 bk:text-gray-700 bk:dark:text-gray-300",
91
+ ...props
92
+ }
93
+ ),
94
+ ol: (props) => /* @__PURE__ */ jsx2(
95
+ "ol",
96
+ {
97
+ className: "bk:mb-4 bk:ml-6 bk:list-decimal bk:space-y-2 bk:text-gray-700 bk:dark:text-gray-300",
98
+ ...props
99
+ }
100
+ ),
89
101
  li: (props) => /* @__PURE__ */ jsx2("li", { ...props }),
90
102
  code: ({ className, children, ...props }) => {
91
103
  const isInline = !className;
@@ -135,15 +147,27 @@ var defaultComponents = {
135
147
  ...props
136
148
  }
137
149
  ) }),
138
- thead: (props) => /* @__PURE__ */ jsx2("thead", { className: "bk:bg-gray-50 bk:dark:bg-gray-800 bk:text-gray-700 bk:dark:text-gray-200", ...props }),
150
+ thead: (props) => /* @__PURE__ */ jsx2(
151
+ "thead",
152
+ {
153
+ className: "bk:bg-gray-50 bk:dark:bg-gray-800 bk:text-gray-700 bk:dark:text-gray-200",
154
+ ...props
155
+ }
156
+ ),
139
157
  tbody: (props) => /* @__PURE__ */ jsx2("tbody", { ...props }),
140
- tr: (props) => /* @__PURE__ */ jsx2("tr", { className: "bk:border-b bk:last:border-b-0 bk:border-gray-200 bk:dark:border-gray-700", ...props }),
158
+ tr: (props) => /* @__PURE__ */ jsx2(
159
+ "tr",
160
+ {
161
+ className: "bk:border-b bk:last:border-b-0 bk:border-gray-200 bk:dark:border-gray-700",
162
+ ...props
163
+ }
164
+ ),
141
165
  th: (props) => /* @__PURE__ */ jsx2("th", { className: "bk:px-4 bk:py-3 bk:text-left bk:font-semibold", ...props }),
142
166
  td: (props) => /* @__PURE__ */ jsx2("td", { className: "bk:px-4 bk:py-3 bk:text-gray-700 bk:dark:text-gray-300", ...props }),
143
167
  input: (props) => /* @__PURE__ */ jsx2("input", { type: "checkbox", disabled: true, className: "bk:mr-2 bk:accent-blue-600", ...props })
144
168
  };
145
- function BlogRenderer({
146
- content,
169
+ function ContentRenderer({
170
+ body,
147
171
  metadata,
148
172
  className = "",
149
173
  components,
@@ -171,16 +195,16 @@ function BlogRenderer({
171
195
  remarkPlugins: [remarkGfm],
172
196
  rehypePlugins: [rehypeRaw, rehypePrismPlus, rehypeSlugCustomId],
173
197
  components: mergedComponents,
174
- children: content
198
+ children: body
175
199
  }
176
200
  ) })
177
201
  ] });
178
202
  }
179
203
 
180
- // src/components/BlogCard.tsx
204
+ // src/components/ContentCard.tsx
181
205
  import "react";
182
206
  import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
183
- function BlogCard({
207
+ function ContentCard({
184
208
  metadata,
185
209
  basePath = "/blog",
186
210
  renderLink,
@@ -223,50 +247,164 @@ function BlogCard({
223
247
  );
224
248
  }
225
249
 
226
- // src/components/BlogList.tsx
227
- import { jsx as jsx4 } from "react/jsx-runtime";
228
- function BlogList({
250
+ // src/components/ContentList.tsx
251
+ import "react";
252
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
253
+ function ContentList({
229
254
  metadata,
255
+ title,
256
+ description,
230
257
  basePath = "/blog",
231
258
  renderLink,
232
259
  className = "",
233
- emptyMessage = "No blog posts found.",
234
- cardProps
260
+ emptyMessage = "No content found.",
261
+ cardProps,
262
+ classNames = {}
235
263
  }) {
236
- if (metadata.length === 0) {
237
- return /* @__PURE__ */ jsx4("div", { className: `bk:text-center bk:text-gray-500 bk:dark:text-gray-400 bk:py-12 ${className}`, children: emptyMessage });
238
- }
239
- return /* @__PURE__ */ jsx4("div", { className: `bk:flex bk:flex-col bk:gap-6 ${className}`, children: metadata.map((meta) => /* @__PURE__ */ jsx4(
240
- BlogCard,
241
- {
242
- metadata: meta,
243
- basePath,
244
- renderLink,
245
- ...cardProps
246
- },
247
- meta.slug
248
- )) });
264
+ return /* @__PURE__ */ jsxs3("div", { className: "bk:w-full", children: [
265
+ title && /* @__PURE__ */ jsx4(
266
+ "h1",
267
+ {
268
+ className: `bk:text-4xl bk:font-bold bk:mb-4 bk:mt-8 bk:text-gray-800 bk:dark:text-gray-100 ${classNames.title ?? ""}`,
269
+ children: title
270
+ }
271
+ ),
272
+ description && /* @__PURE__ */ jsx4(
273
+ "p",
274
+ {
275
+ className: `bk:text-gray-600 bk:dark:text-gray-400 bk:mb-8 ${classNames.description ?? ""}`,
276
+ children: description
277
+ }
278
+ ),
279
+ metadata.length === 0 ? /* @__PURE__ */ jsx4(
280
+ "div",
281
+ {
282
+ className: `bk:text-center bk:text-gray-500 bk:dark:text-gray-400 bk:py-12 ${className}`,
283
+ children: emptyMessage
284
+ }
285
+ ) : /* @__PURE__ */ jsx4("div", { className: `bk:flex bk:flex-col bk:gap-6 ${className}`, children: metadata.map((meta) => /* @__PURE__ */ jsx4(
286
+ ContentCard,
287
+ {
288
+ metadata: meta,
289
+ basePath,
290
+ renderLink,
291
+ ...cardProps
292
+ },
293
+ meta.slug
294
+ )) })
295
+ ] });
296
+ }
297
+
298
+ // src/components/Filter.tsx
299
+ import "react";
300
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
301
+ function Filter({
302
+ searchTerm,
303
+ setSearchTerm,
304
+ selectedCategory,
305
+ setSelectedCategory,
306
+ categories,
307
+ contentCount,
308
+ className = "",
309
+ placeholder = "Search content...",
310
+ classNames = {}
311
+ }) {
312
+ const pillBase = `bk:px-2.5 bk:py-1 bk:cursor-pointer bk:rounded-md bk:text-xs bk:font-medium bk:transition-colors ${classNames.pill ?? ""}`;
313
+ const pillActive = `bk:bg-gray-700 bk:dark:bg-gray-200 bk:text-white bk:dark:text-gray-800 ${classNames.activePill ?? ""}`;
314
+ const pillInactive = `bk:bg-gray-100 bk:dark:bg-gray-700 bk:text-gray-500 bk:dark:text-gray-300 bk:hover:bg-gray-200 bk:dark:hover:bg-gray-600 ${classNames.inactivePill ?? ""}`;
315
+ return /* @__PURE__ */ jsxs4("div", { className: `bk:flex bk:flex-col bk:gap-4 bk:mb-6 ${className}`, children: [
316
+ /* @__PURE__ */ jsxs4("div", { className: "bk:flex bk:flex-col bk:sm:flex-row bk:gap-3", children: [
317
+ /* @__PURE__ */ jsxs4("div", { className: "bk:relative bk:flex-1", children: [
318
+ /* @__PURE__ */ jsx5(
319
+ "svg",
320
+ {
321
+ className: "bk:absolute bk:left-3 bk:top-1/2 bk:-translate-y-1/2 bk:w-3.5 bk:h-3.5 bk:text-gray-400 bk:pointer-events-none",
322
+ fill: "none",
323
+ stroke: "currentColor",
324
+ strokeWidth: 2,
325
+ viewBox: "0 0 24 24",
326
+ children: /* @__PURE__ */ jsx5(
327
+ "path",
328
+ {
329
+ strokeLinecap: "round",
330
+ strokeLinejoin: "round",
331
+ d: "M21 21l-4.35-4.35M17 11A6 6 0 1 1 5 11a6 6 0 0 1 12 0z"
332
+ }
333
+ )
334
+ }
335
+ ),
336
+ /* @__PURE__ */ jsx5(
337
+ "input",
338
+ {
339
+ id: "content-search",
340
+ type: "search",
341
+ value: searchTerm,
342
+ onChange: (e) => setSearchTerm(e.target.value),
343
+ placeholder,
344
+ className: `bk:w-full bk:pl-8 bk:pr-4 bk:py-2 bk:rounded-md bk:border bk:border-gray-200 bk:dark:border-gray-700 bk:bg-white bk:dark:bg-gray-800 bk:text-sm bk:text-gray-700 bk:dark:text-gray-200 bk:placeholder-gray-400 bk:focus:outline-none bk:focus:border-gray-400 bk:dark:focus:border-gray-500 bk:transition-colors ${classNames.input ?? ""}`
345
+ }
346
+ )
347
+ ] }),
348
+ categories.length > 0 && /* @__PURE__ */ jsxs4(
349
+ "div",
350
+ {
351
+ className: `bk:flex bk:flex-wrap bk:gap-2 bk:items-center ${classNames.categoryContainer ?? ""}`,
352
+ children: [
353
+ /* @__PURE__ */ jsx5(
354
+ "button",
355
+ {
356
+ onClick: () => setSelectedCategory(null),
357
+ className: `${pillBase} ${selectedCategory === null ? pillActive : pillInactive}`,
358
+ children: "All"
359
+ }
360
+ ),
361
+ categories.slice(0, 3).map((cat) => /* @__PURE__ */ jsx5(
362
+ "button",
363
+ {
364
+ onClick: () => setSelectedCategory(cat),
365
+ className: `${pillBase} ${selectedCategory === cat ? pillActive : pillInactive}`,
366
+ children: cat
367
+ },
368
+ cat
369
+ ))
370
+ ]
371
+ }
372
+ )
373
+ ] }),
374
+ contentCount !== void 0 && /* @__PURE__ */ jsxs4(
375
+ "p",
376
+ {
377
+ className: `bk:text-[10px] bk:uppercase bk:tracking-wider bk:text-gray-400 bk:dark:text-gray-500 ${classNames.contentCount ?? ""}`,
378
+ children: [
379
+ contentCount,
380
+ " ",
381
+ contentCount === 1 ? "item" : "items",
382
+ " found"
383
+ ]
384
+ }
385
+ )
386
+ ] });
249
387
  }
250
388
 
251
- // src/components/BlogPlaceholder.tsx
252
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
253
- function BlogPlaceholder({ count = 3, className = "" }) {
254
- return /* @__PURE__ */ jsx5("div", { className: `${className}`, children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsxs3(
389
+ // src/components/ContentPlaceholder.tsx
390
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
391
+ function ContentPlaceholder({ count = 3, className = "" }) {
392
+ return /* @__PURE__ */ jsx6("div", { className: `${className}`, children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsxs5(
255
393
  "div",
256
394
  {
257
395
  className: "bk:bg-white bk:dark:bg-gray-800 bk:rounded-lg bk:border bk:border-gray-200 bk:dark:border-gray-700 bk:p-6 bk:animate-pulse",
258
396
  children: [
259
- /* @__PURE__ */ jsx5("div", { className: "bk:h-4 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:mb-3" }),
260
- /* @__PURE__ */ jsx5("div", { className: "bk:h-6 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:mb-2" }),
261
- /* @__PURE__ */ jsx5("div", { className: "bk:h-4 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:w-3/4" })
397
+ /* @__PURE__ */ jsx6("div", { className: "bk:h-4 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:mb-3" }),
398
+ /* @__PURE__ */ jsx6("div", { className: "bk:h-6 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:mb-2" }),
399
+ /* @__PURE__ */ jsx6("div", { className: "bk:h-4 bk:bg-gray-200 bk:dark:bg-gray-700 bk:rounded bk:w-3/4" })
262
400
  ]
263
401
  },
264
402
  i
265
403
  )) });
266
404
  }
267
405
 
268
- // src/hooks/useBlogs.ts
269
- import { useState as useState2, useEffect as useEffect2 } from "react";
406
+ // src/hooks/useContent.ts
407
+ import { useState as useState2, useMemo } from "react";
270
408
 
271
409
  // src/hooks/useDebounce.ts
272
410
  import { useEffect, useState } from "react";
@@ -283,33 +421,40 @@ function useDebounce(value, delay) {
283
421
  return debouncedValue;
284
422
  }
285
423
 
286
- // src/hooks/useBlogs.ts
287
- function useBlogs(blogsMeta) {
288
- const [filteredBlogs, setFilteredBlogs] = useState2(blogsMeta);
424
+ // src/utils/filter-utils.ts
425
+ function filterContent(items, searchTerm = "", selectedCategory = null) {
426
+ let filtered = items;
427
+ if (searchTerm) {
428
+ const lowerSearch = searchTerm.toLowerCase();
429
+ filtered = filtered.filter(
430
+ (item) => (item.title?.toLowerCase() || "").includes(lowerSearch) || (item.description?.toLowerCase() || "").includes(lowerSearch)
431
+ );
432
+ }
433
+ if (selectedCategory) {
434
+ filtered = filtered.filter((item) => {
435
+ const categories = item.categories ?? [];
436
+ return categories.includes(selectedCategory);
437
+ });
438
+ }
439
+ return filtered;
440
+ }
441
+ function getAvailableCategories(items) {
442
+ return Array.from(new Set(items.flatMap((item) => item.categories ?? [])));
443
+ }
444
+
445
+ // src/hooks/useContent.ts
446
+ function useContent(allContentMeta) {
289
447
  const [searchTerm, setSearchTerm] = useState2("");
290
448
  const [selectedCategory, setSelectedCategory] = useState2(null);
291
449
  const debouncedSearchTerm = useDebounce(searchTerm, 500);
292
- const getBlogCategories = (blog) => {
293
- return blog.categories ?? [];
294
- };
295
- useEffect2(() => {
296
- let filtered = blogsMeta;
297
- if (debouncedSearchTerm) {
298
- filtered = filtered.filter(
299
- (blog) => blog.title.toLowerCase().includes(debouncedSearchTerm.toLowerCase()) || blog.description.toLowerCase().includes(debouncedSearchTerm.toLowerCase())
300
- );
301
- }
302
- if (selectedCategory) {
303
- filtered = filtered.filter((blog) => {
304
- const blogCategories = getBlogCategories(blog);
305
- return blogCategories.includes(selectedCategory);
306
- });
307
- }
308
- setFilteredBlogs(filtered);
309
- }, [blogsMeta, debouncedSearchTerm, selectedCategory]);
310
- const categories = Array.from(new Set(blogsMeta.flatMap((blog) => getBlogCategories(blog))));
450
+ const metadata = useMemo(() => {
451
+ return filterContent(allContentMeta, debouncedSearchTerm, selectedCategory);
452
+ }, [allContentMeta, debouncedSearchTerm, selectedCategory]);
453
+ const categories = useMemo(() => {
454
+ return getAvailableCategories(allContentMeta);
455
+ }, [allContentMeta]);
311
456
  return {
312
- metadata: filteredBlogs,
457
+ metadata,
313
458
  searchTerm,
314
459
  setSearchTerm,
315
460
  selectedCategory,
@@ -318,9 +463,12 @@ function useBlogs(blogsMeta) {
318
463
  };
319
464
  }
320
465
  export {
321
- BlogCard,
322
- BlogList,
323
- BlogPlaceholder,
324
- BlogRenderer,
325
- useBlogs
466
+ ContentCard,
467
+ ContentList,
468
+ ContentPlaceholder,
469
+ ContentRenderer,
470
+ Filter,
471
+ filterContent,
472
+ getAvailableCategories,
473
+ useContent
326
474
  };
package/dist/style.css CHANGED
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial}}}@layer theme{:root,:host{--bk-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bk-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bk-color-orange-100:oklch(95.4% .038 75.164);--bk-color-orange-300:oklch(83.7% .128 66.29);--bk-color-orange-500:oklch(70.5% .213 47.604);--bk-color-orange-900:oklch(40.8% .123 38.172);--bk-color-amber-100:oklch(96.2% .059 95.617);--bk-color-amber-300:oklch(87.9% .169 91.605);--bk-color-amber-500:oklch(76.9% .188 70.08);--bk-color-amber-900:oklch(41.4% .112 45.904);--bk-color-emerald-100:oklch(95% .052 163.051);--bk-color-emerald-300:oklch(84.5% .143 164.978);--bk-color-emerald-500:oklch(69.6% .17 162.48);--bk-color-emerald-900:oklch(37.8% .077 168.94);--bk-color-teal-100:oklch(95.3% .051 180.801);--bk-color-teal-300:oklch(85.5% .138 181.071);--bk-color-teal-500:oklch(70.4% .14 182.503);--bk-color-teal-900:oklch(38.6% .063 188.416);--bk-color-cyan-100:oklch(95.6% .045 203.388);--bk-color-cyan-300:oklch(86.5% .127 207.078);--bk-color-cyan-500:oklch(71.5% .143 215.221);--bk-color-cyan-900:oklch(39.8% .07 227.392);--bk-color-blue-100:oklch(93.2% .032 255.585);--bk-color-blue-300:oklch(80.9% .105 251.813);--bk-color-blue-400:oklch(70.7% .165 254.624);--bk-color-blue-500:oklch(62.3% .214 259.815);--bk-color-blue-600:oklch(54.6% .245 262.881);--bk-color-blue-700:oklch(48.8% .243 264.376);--bk-color-blue-800:oklch(42.4% .199 265.638);--bk-color-blue-900:oklch(37.9% .146 265.522);--bk-color-violet-100:oklch(94.3% .029 294.588);--bk-color-violet-300:oklch(81.1% .111 293.571);--bk-color-violet-500:oklch(60.6% .25 292.717);--bk-color-violet-900:oklch(38% .189 293.745);--bk-color-fuchsia-100:oklch(95.2% .037 318.852);--bk-color-fuchsia-300:oklch(83.3% .145 321.434);--bk-color-fuchsia-500:oklch(66.7% .295 322.15);--bk-color-fuchsia-900:oklch(40.1% .17 325.612);--bk-color-rose-100:oklch(94.1% .03 12.58);--bk-color-rose-300:oklch(81% .117 11.638);--bk-color-rose-400:oklch(71.2% .194 13.428);--bk-color-rose-500:oklch(64.5% .246 16.439);--bk-color-rose-600:oklch(58.6% .253 17.585);--bk-color-rose-900:oklch(41% .159 10.272);--bk-color-gray-50:oklch(98.5% .002 247.839);--bk-color-gray-100:oklch(96.7% .003 264.542);--bk-color-gray-200:oklch(92.8% .006 264.531);--bk-color-gray-300:oklch(87.2% .01 258.338);--bk-color-gray-400:oklch(70.7% .022 261.325);--bk-color-gray-500:oklch(55.1% .027 264.364);--bk-color-gray-600:oklch(44.6% .03 256.802);--bk-color-gray-700:oklch(37.3% .034 259.733);--bk-color-gray-800:oklch(27.8% .033 256.848);--bk-color-neutral-900:oklch(20.5% 0 0);--bk-color-white:#fff;--bk-spacing:.25rem;--bk-text-xs:.75rem;--bk-text-xs--line-height:calc(1/.75);--bk-text-sm:.875rem;--bk-text-sm--line-height:calc(1.25/.875);--bk-text-base:1rem;--bk-text-base--line-height:calc(1.5/1);--bk-text-lg:1.125rem;--bk-text-lg--line-height:calc(1.75/1.125);--bk-text-xl:1.25rem;--bk-text-xl--line-height:calc(1.75/1.25);--bk-text-2xl:1.5rem;--bk-text-2xl--line-height:calc(2/1.5);--bk-text-3xl:1.875rem;--bk-text-3xl--line-height:calc(2.25/1.875);--bk-text-4xl:2.25rem;--bk-text-4xl--line-height:calc(2.5/2.25);--bk-font-weight-medium:500;--bk-font-weight-semibold:600;--bk-tracking-tight:-.025em;--bk-tracking-wide:.025em;--bk-radius-lg:.5rem;--bk-radius-xl:.75rem;--bk-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--bk-default-font-family:var(--bk-font-sans);--bk-default-mono-font-family:var(--bk-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--bk-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--bk-default-font-feature-settings,normal);font-variation-settings:var(--bk-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--bk-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--bk-default-mono-font-feature-settings,normal);font-variation-settings:var(--bk-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.bk\:my-6{margin-block:calc(var(--bk-spacing)*6)}.bk\:my-9{margin-block:calc(var(--bk-spacing)*9)}.bk\:mt-4{margin-top:calc(var(--bk-spacing)*4)}.bk\:mt-5{margin-top:calc(var(--bk-spacing)*5)}.bk\:mt-6{margin-top:calc(var(--bk-spacing)*6)}.bk\:mt-8{margin-top:calc(var(--bk-spacing)*8)}.bk\:mt-10{margin-top:calc(var(--bk-spacing)*10)}.bk\:mt-auto{margin-top:auto}.bk\:mr-2{margin-right:calc(var(--bk-spacing)*2)}.bk\:mb-2{margin-bottom:calc(var(--bk-spacing)*2)}.bk\:mb-3{margin-bottom:calc(var(--bk-spacing)*3)}.bk\:mb-4{margin-bottom:calc(var(--bk-spacing)*4)}.bk\:mb-5{margin-bottom:calc(var(--bk-spacing)*5)}.bk\:ml-6{margin-left:calc(var(--bk-spacing)*6)}.bk\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.bk\:flex{display:flex}.bk\:inline-flex{display:inline-flex}.bk\:h-4{height:calc(var(--bk-spacing)*4)}.bk\:h-6{height:calc(var(--bk-spacing)*6)}.bk\:h-auto{height:auto}.bk\:min-h-\[200px\]{min-height:200px}.bk\:w-3\/4{width:75%}.bk\:w-full{width:100%}.bk\:max-w-full{max-width:100%}.bk\:max-w-none{max-width:none}.bk\:shrink-0{flex-shrink:0}.bk\:animate-pulse{animation:var(--bk-animate-pulse)}.bk\:list-decimal{list-style-type:decimal}.bk\:list-disc{list-style-type:disc}.bk\:flex-col{flex-direction:column}.bk\:flex-nowrap{flex-wrap:nowrap}.bk\:flex-wrap{flex-wrap:wrap}.bk\:items-center{align-items:center}.bk\:justify-between{justify-content:space-between}.bk\:gap-1\.5{gap:calc(var(--bk-spacing)*1.5)}.bk\:gap-2{gap:calc(var(--bk-spacing)*2)}.bk\:gap-3{gap:calc(var(--bk-spacing)*3)}.bk\:gap-6{gap:calc(var(--bk-spacing)*6)}:where(.bk\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--bk-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--bk-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}.bk\:overflow-hidden{overflow:hidden}.bk\:overflow-x-auto{overflow-x:auto}.bk\:rounded{border-radius:.25rem}.bk\:rounded-full{border-radius:3.40282e38px}.bk\:rounded-lg{border-radius:var(--bk-radius-lg)}.bk\:rounded-xl{border-radius:var(--bk-radius-xl)}.bk\:border{border-style:var(--tw-border-style);border-width:1px}.bk\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.bk\:border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.bk\:border-blue-500{border-color:var(--bk-color-blue-500)}.bk\:border-gray-200{border-color:var(--bk-color-gray-200)}.bk\:border-transparent{border-color:#0000}.bk\:bg-amber-100{background-color:var(--bk-color-amber-100)}.bk\:bg-blue-100{background-color:var(--bk-color-blue-100)}.bk\:bg-cyan-100{background-color:var(--bk-color-cyan-100)}.bk\:bg-emerald-100{background-color:var(--bk-color-emerald-100)}.bk\:bg-fuchsia-100{background-color:var(--bk-color-fuchsia-100)}.bk\:bg-gray-50{background-color:var(--bk-color-gray-50)}.bk\:bg-gray-100{background-color:var(--bk-color-gray-100)}.bk\:bg-gray-200{background-color:var(--bk-color-gray-200)}.bk\:bg-orange-100{background-color:var(--bk-color-orange-100)}.bk\:bg-rose-100{background-color:var(--bk-color-rose-100)}.bk\:bg-teal-100{background-color:var(--bk-color-teal-100)}.bk\:bg-violet-100{background-color:var(--bk-color-violet-100)}.bk\:bg-white{background-color:var(--bk-color-white)}.bk\:p-6{padding:calc(var(--bk-spacing)*6)}.bk\:px-1\.5{padding-inline:calc(var(--bk-spacing)*1.5)}.bk\:px-2\.5{padding-inline:calc(var(--bk-spacing)*2.5)}.bk\:px-4{padding-inline:calc(var(--bk-spacing)*4)}.bk\:py-0\.5{padding-block:calc(var(--bk-spacing)*.5)}.bk\:py-3{padding-block:calc(var(--bk-spacing)*3)}.bk\:py-12{padding-block:calc(var(--bk-spacing)*12)}.bk\:pl-4{padding-left:calc(var(--bk-spacing)*4)}.bk\:text-center{text-align:center}.bk\:text-left{text-align:left}.bk\:font-mono{font-family:var(--bk-font-mono)}.bk\:text-2xl{font-size:var(--bk-text-2xl);line-height:var(--tw-leading,var(--bk-text-2xl--line-height))}.bk\:text-3xl{font-size:var(--bk-text-3xl);line-height:var(--tw-leading,var(--bk-text-3xl--line-height))}.bk\:text-base{font-size:var(--bk-text-base);line-height:var(--tw-leading,var(--bk-text-base--line-height))}.bk\:text-lg{font-size:var(--bk-text-lg);line-height:var(--tw-leading,var(--bk-text-lg--line-height))}.bk\:text-sm{font-size:var(--bk-text-sm);line-height:var(--tw-leading,var(--bk-text-sm--line-height))}.bk\:text-xl{font-size:var(--bk-text-xl);line-height:var(--tw-leading,var(--bk-text-xl--line-height))}.bk\:text-xs{font-size:var(--bk-text-xs);line-height:var(--tw-leading,var(--bk-text-xs--line-height))}.bk\:leading-6{--tw-leading:calc(var(--bk-spacing)*6);line-height:calc(var(--bk-spacing)*6)}.bk\:leading-7{--tw-leading:calc(var(--bk-spacing)*7);line-height:calc(var(--bk-spacing)*7)}.bk\:font-medium{--tw-font-weight:var(--bk-font-weight-medium);font-weight:var(--bk-font-weight-medium)}.bk\:font-semibold{--tw-font-weight:var(--bk-font-weight-semibold);font-weight:var(--bk-font-weight-semibold)}.bk\:tracking-tight{--tw-tracking:var(--bk-tracking-tight);letter-spacing:var(--bk-tracking-tight)}.bk\:tracking-wide{--tw-tracking:var(--bk-tracking-wide);letter-spacing:var(--bk-tracking-wide)}.bk\:whitespace-nowrap{white-space:nowrap}.bk\:text-amber-500{color:var(--bk-color-amber-500)}.bk\:text-blue-500{color:var(--bk-color-blue-500)}.bk\:text-blue-600{color:var(--bk-color-blue-600)}.bk\:text-cyan-500{color:var(--bk-color-cyan-500)}.bk\:text-emerald-500{color:var(--bk-color-emerald-500)}.bk\:text-fuchsia-500{color:var(--bk-color-fuchsia-500)}.bk\:text-gray-500{color:var(--bk-color-gray-500)}.bk\:text-gray-600{color:var(--bk-color-gray-600)}.bk\:text-gray-700{color:var(--bk-color-gray-700)}.bk\:text-gray-800{color:var(--bk-color-gray-800)}.bk\:text-orange-500{color:var(--bk-color-orange-500)}.bk\:text-rose-500{color:var(--bk-color-rose-500)}.bk\:text-rose-600{color:var(--bk-color-rose-600)}.bk\:text-teal-500{color:var(--bk-color-teal-500)}.bk\:text-violet-500{color:var(--bk-color-violet-500)}.bk\:uppercase{text-transform:uppercase}.bk\:italic{font-style:italic}.bk\:underline{text-decoration-line:underline}.bk\:underline-offset-4{text-underline-offset:4px}.bk\:accent-blue-600{accent-color:var(--bk-color-blue-600)}.bk\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.bk\:first\:mt-0:first-child{margin-top:calc(var(--bk-spacing)*0)}.bk\:last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.bk\:hover\:border-gray-300:hover{border-color:var(--bk-color-gray-300)}.bk\:hover\:text-blue-700:hover{color:var(--bk-color-blue-700)}.bk\:hover\:text-blue-800:hover{color:var(--bk-color-blue-800)}.bk\:hover\:underline:hover{text-decoration-line:underline}}@media (min-width:48rem){.bk\:md\:text-2xl{font-size:var(--bk-text-2xl);line-height:var(--tw-leading,var(--bk-text-2xl--line-height))}.bk\:md\:text-3xl{font-size:var(--bk-text-3xl);line-height:var(--tw-leading,var(--bk-text-3xl--line-height))}.bk\:md\:text-4xl{font-size:var(--bk-text-4xl);line-height:var(--tw-leading,var(--bk-text-4xl--line-height))}}.bk\:dark\:border-gray-700:is(html.dark *){border-color:var(--bk-color-gray-700)}.bk\:dark\:border-neutral-900:is(html.dark *){border-color:var(--bk-color-neutral-900)}.bk\:dark\:bg-amber-900\/30:is(html.dark *){background-color:var(--bk-color-amber-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-amber-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-amber-900)30%,transparent)}}.bk\:dark\:bg-blue-900\/30:is(html.dark *){background-color:var(--bk-color-blue-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-blue-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-blue-900)30%,transparent)}}.bk\:dark\:bg-cyan-900\/30:is(html.dark *){background-color:var(--bk-color-cyan-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-cyan-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-cyan-900)30%,transparent)}}.bk\:dark\:bg-emerald-900\/30:is(html.dark *){background-color:var(--bk-color-emerald-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-emerald-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-emerald-900)30%,transparent)}}.bk\:dark\:bg-fuchsia-900\/30:is(html.dark *){background-color:var(--bk-color-fuchsia-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-fuchsia-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-fuchsia-900)30%,transparent)}}.bk\:dark\:bg-gray-700:is(html.dark *){background-color:var(--bk-color-gray-700)}.bk\:dark\:bg-gray-800:is(html.dark *){background-color:var(--bk-color-gray-800)}.bk\:dark\:bg-orange-900\/30:is(html.dark *){background-color:var(--bk-color-orange-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-orange-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-orange-900)30%,transparent)}}.bk\:dark\:bg-rose-900\/30:is(html.dark *){background-color:var(--bk-color-rose-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-rose-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-rose-900)30%,transparent)}}.bk\:dark\:bg-teal-900\/30:is(html.dark *){background-color:var(--bk-color-teal-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-teal-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-teal-900)30%,transparent)}}.bk\:dark\:bg-violet-900\/30:is(html.dark *){background-color:var(--bk-color-violet-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-violet-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-violet-900)30%,transparent)}}.bk\:dark\:text-amber-300:is(html.dark *){color:var(--bk-color-amber-300)}.bk\:dark\:text-blue-300:is(html.dark *){color:var(--bk-color-blue-300)}.bk\:dark\:text-blue-400:is(html.dark *){color:var(--bk-color-blue-400)}.bk\:dark\:text-cyan-300:is(html.dark *){color:var(--bk-color-cyan-300)}.bk\:dark\:text-emerald-300:is(html.dark *){color:var(--bk-color-emerald-300)}.bk\:dark\:text-fuchsia-300:is(html.dark *){color:var(--bk-color-fuchsia-300)}.bk\:dark\:text-gray-100:is(html.dark *){color:var(--bk-color-gray-100)}.bk\:dark\:text-gray-200:is(html.dark *){color:var(--bk-color-gray-200)}.bk\:dark\:text-gray-300:is(html.dark *){color:var(--bk-color-gray-300)}.bk\:dark\:text-gray-400:is(html.dark *){color:var(--bk-color-gray-400)}.bk\:dark\:text-orange-300:is(html.dark *){color:var(--bk-color-orange-300)}.bk\:dark\:text-rose-300:is(html.dark *){color:var(--bk-color-rose-300)}.bk\:dark\:text-rose-400:is(html.dark *){color:var(--bk-color-rose-400)}.bk\:dark\:text-teal-300:is(html.dark *){color:var(--bk-color-teal-300)}.bk\:dark\:text-violet-300:is(html.dark *){color:var(--bk-color-violet-300)}@media (hover:hover){.bk\:dark\:hover\:border-gray-600:is(html.dark *):hover{border-color:var(--bk-color-gray-600)}.bk\:dark\:hover\:text-blue-300:is(html.dark *):hover{color:var(--bk-color-blue-300)}}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial}}}@layer theme{:root,:host{--bk-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bk-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bk-color-orange-100:oklch(95.4% .038 75.164);--bk-color-orange-300:oklch(83.7% .128 66.29);--bk-color-orange-500:oklch(70.5% .213 47.604);--bk-color-orange-900:oklch(40.8% .123 38.172);--bk-color-amber-100:oklch(96.2% .059 95.617);--bk-color-amber-300:oklch(87.9% .169 91.605);--bk-color-amber-500:oklch(76.9% .188 70.08);--bk-color-amber-900:oklch(41.4% .112 45.904);--bk-color-emerald-100:oklch(95% .052 163.051);--bk-color-emerald-300:oklch(84.5% .143 164.978);--bk-color-emerald-500:oklch(69.6% .17 162.48);--bk-color-emerald-900:oklch(37.8% .077 168.94);--bk-color-teal-100:oklch(95.3% .051 180.801);--bk-color-teal-300:oklch(85.5% .138 181.071);--bk-color-teal-500:oklch(70.4% .14 182.503);--bk-color-teal-900:oklch(38.6% .063 188.416);--bk-color-cyan-100:oklch(95.6% .045 203.388);--bk-color-cyan-300:oklch(86.5% .127 207.078);--bk-color-cyan-500:oklch(71.5% .143 215.221);--bk-color-cyan-900:oklch(39.8% .07 227.392);--bk-color-blue-100:oklch(93.2% .032 255.585);--bk-color-blue-300:oklch(80.9% .105 251.813);--bk-color-blue-400:oklch(70.7% .165 254.624);--bk-color-blue-500:oklch(62.3% .214 259.815);--bk-color-blue-600:oklch(54.6% .245 262.881);--bk-color-blue-700:oklch(48.8% .243 264.376);--bk-color-blue-800:oklch(42.4% .199 265.638);--bk-color-blue-900:oklch(37.9% .146 265.522);--bk-color-violet-100:oklch(94.3% .029 294.588);--bk-color-violet-300:oklch(81.1% .111 293.571);--bk-color-violet-500:oklch(60.6% .25 292.717);--bk-color-violet-900:oklch(38% .189 293.745);--bk-color-fuchsia-100:oklch(95.2% .037 318.852);--bk-color-fuchsia-300:oklch(83.3% .145 321.434);--bk-color-fuchsia-500:oklch(66.7% .295 322.15);--bk-color-fuchsia-900:oklch(40.1% .17 325.612);--bk-color-rose-100:oklch(94.1% .03 12.58);--bk-color-rose-300:oklch(81% .117 11.638);--bk-color-rose-400:oklch(71.2% .194 13.428);--bk-color-rose-500:oklch(64.5% .246 16.439);--bk-color-rose-600:oklch(58.6% .253 17.585);--bk-color-rose-900:oklch(41% .159 10.272);--bk-color-gray-50:oklch(98.5% .002 247.839);--bk-color-gray-100:oklch(96.7% .003 264.542);--bk-color-gray-200:oklch(92.8% .006 264.531);--bk-color-gray-300:oklch(87.2% .01 258.338);--bk-color-gray-400:oklch(70.7% .022 261.325);--bk-color-gray-500:oklch(55.1% .027 264.364);--bk-color-gray-600:oklch(44.6% .03 256.802);--bk-color-gray-700:oklch(37.3% .034 259.733);--bk-color-gray-800:oklch(27.8% .033 256.848);--bk-color-neutral-900:oklch(20.5% 0 0);--bk-color-white:#fff;--bk-spacing:.25rem;--bk-text-xs:.75rem;--bk-text-xs--line-height:calc(1/.75);--bk-text-sm:.875rem;--bk-text-sm--line-height:calc(1.25/.875);--bk-text-base:1rem;--bk-text-base--line-height:calc(1.5/1);--bk-text-lg:1.125rem;--bk-text-lg--line-height:calc(1.75/1.125);--bk-text-xl:1.25rem;--bk-text-xl--line-height:calc(1.75/1.25);--bk-text-2xl:1.5rem;--bk-text-2xl--line-height:calc(2/1.5);--bk-text-3xl:1.875rem;--bk-text-3xl--line-height:calc(2.25/1.875);--bk-text-4xl:2.25rem;--bk-text-4xl--line-height:calc(2.5/2.25);--bk-font-weight-medium:500;--bk-font-weight-semibold:600;--bk-font-weight-bold:700;--bk-tracking-tight:-.025em;--bk-tracking-wide:.025em;--bk-tracking-wider:.05em;--bk-radius-md:.375rem;--bk-radius-lg:.5rem;--bk-radius-xl:.75rem;--bk-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--bk-default-font-family:var(--bk-font-sans);--bk-default-mono-font-family:var(--bk-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--bk-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--bk-default-font-feature-settings,normal);font-variation-settings:var(--bk-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--bk-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--bk-default-mono-font-feature-settings,normal);font-variation-settings:var(--bk-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.bk\:pointer-events-none{pointer-events:none}.bk\:absolute{position:absolute}.bk\:relative{position:relative}.bk\:top-1\/2{top:50%}.bk\:left-3{left:calc(var(--bk-spacing)*3)}.bk\:my-6{margin-block:calc(var(--bk-spacing)*6)}.bk\:my-9{margin-block:calc(var(--bk-spacing)*9)}.bk\:mt-4{margin-top:calc(var(--bk-spacing)*4)}.bk\:mt-5{margin-top:calc(var(--bk-spacing)*5)}.bk\:mt-6{margin-top:calc(var(--bk-spacing)*6)}.bk\:mt-8{margin-top:calc(var(--bk-spacing)*8)}.bk\:mt-10{margin-top:calc(var(--bk-spacing)*10)}.bk\:mt-auto{margin-top:auto}.bk\:mr-2{margin-right:calc(var(--bk-spacing)*2)}.bk\:mb-2{margin-bottom:calc(var(--bk-spacing)*2)}.bk\:mb-3{margin-bottom:calc(var(--bk-spacing)*3)}.bk\:mb-4{margin-bottom:calc(var(--bk-spacing)*4)}.bk\:mb-5{margin-bottom:calc(var(--bk-spacing)*5)}.bk\:mb-6{margin-bottom:calc(var(--bk-spacing)*6)}.bk\:mb-8{margin-bottom:calc(var(--bk-spacing)*8)}.bk\:ml-6{margin-left:calc(var(--bk-spacing)*6)}.bk\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.bk\:flex{display:flex}.bk\:inline-flex{display:inline-flex}.bk\:h-3\.5{height:calc(var(--bk-spacing)*3.5)}.bk\:h-4{height:calc(var(--bk-spacing)*4)}.bk\:h-6{height:calc(var(--bk-spacing)*6)}.bk\:h-auto{height:auto}.bk\:min-h-\[200px\]{min-height:200px}.bk\:w-3\.5{width:calc(var(--bk-spacing)*3.5)}.bk\:w-3\/4{width:75%}.bk\:w-full{width:100%}.bk\:max-w-full{max-width:100%}.bk\:max-w-none{max-width:none}.bk\:flex-1{flex:1}.bk\:shrink-0{flex-shrink:0}.bk\:-translate-y-1\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.bk\:animate-pulse{animation:var(--bk-animate-pulse)}.bk\:cursor-pointer{cursor:pointer}.bk\:list-decimal{list-style-type:decimal}.bk\:list-disc{list-style-type:disc}.bk\:flex-col{flex-direction:column}.bk\:flex-nowrap{flex-wrap:nowrap}.bk\:flex-wrap{flex-wrap:wrap}.bk\:items-center{align-items:center}.bk\:justify-between{justify-content:space-between}.bk\:gap-1\.5{gap:calc(var(--bk-spacing)*1.5)}.bk\:gap-2{gap:calc(var(--bk-spacing)*2)}.bk\:gap-3{gap:calc(var(--bk-spacing)*3)}.bk\:gap-4{gap:calc(var(--bk-spacing)*4)}.bk\:gap-6{gap:calc(var(--bk-spacing)*6)}:where(.bk\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--bk-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--bk-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}.bk\:overflow-hidden{overflow:hidden}.bk\:overflow-x-auto{overflow-x:auto}.bk\:rounded{border-radius:.25rem}.bk\:rounded-full{border-radius:3.40282e38px}.bk\:rounded-lg{border-radius:var(--bk-radius-lg)}.bk\:rounded-md{border-radius:var(--bk-radius-md)}.bk\:rounded-xl{border-radius:var(--bk-radius-xl)}.bk\:border{border-style:var(--tw-border-style);border-width:1px}.bk\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.bk\:border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.bk\:border-blue-500{border-color:var(--bk-color-blue-500)}.bk\:border-gray-200{border-color:var(--bk-color-gray-200)}.bk\:border-transparent{border-color:#0000}.bk\:bg-amber-100{background-color:var(--bk-color-amber-100)}.bk\:bg-blue-100{background-color:var(--bk-color-blue-100)}.bk\:bg-cyan-100{background-color:var(--bk-color-cyan-100)}.bk\:bg-emerald-100{background-color:var(--bk-color-emerald-100)}.bk\:bg-fuchsia-100{background-color:var(--bk-color-fuchsia-100)}.bk\:bg-gray-50{background-color:var(--bk-color-gray-50)}.bk\:bg-gray-100{background-color:var(--bk-color-gray-100)}.bk\:bg-gray-200{background-color:var(--bk-color-gray-200)}.bk\:bg-gray-700{background-color:var(--bk-color-gray-700)}.bk\:bg-orange-100{background-color:var(--bk-color-orange-100)}.bk\:bg-rose-100{background-color:var(--bk-color-rose-100)}.bk\:bg-teal-100{background-color:var(--bk-color-teal-100)}.bk\:bg-violet-100{background-color:var(--bk-color-violet-100)}.bk\:bg-white{background-color:var(--bk-color-white)}.bk\:p-6{padding:calc(var(--bk-spacing)*6)}.bk\:px-1\.5{padding-inline:calc(var(--bk-spacing)*1.5)}.bk\:px-2\.5{padding-inline:calc(var(--bk-spacing)*2.5)}.bk\:px-4{padding-inline:calc(var(--bk-spacing)*4)}.bk\:py-0\.5{padding-block:calc(var(--bk-spacing)*.5)}.bk\:py-1{padding-block:calc(var(--bk-spacing)*1)}.bk\:py-2{padding-block:calc(var(--bk-spacing)*2)}.bk\:py-3{padding-block:calc(var(--bk-spacing)*3)}.bk\:py-12{padding-block:calc(var(--bk-spacing)*12)}.bk\:pr-4{padding-right:calc(var(--bk-spacing)*4)}.bk\:pl-4{padding-left:calc(var(--bk-spacing)*4)}.bk\:pl-8{padding-left:calc(var(--bk-spacing)*8)}.bk\:text-center{text-align:center}.bk\:text-left{text-align:left}.bk\:font-mono{font-family:var(--bk-font-mono)}.bk\:text-2xl{font-size:var(--bk-text-2xl);line-height:var(--tw-leading,var(--bk-text-2xl--line-height))}.bk\:text-3xl{font-size:var(--bk-text-3xl);line-height:var(--tw-leading,var(--bk-text-3xl--line-height))}.bk\:text-4xl{font-size:var(--bk-text-4xl);line-height:var(--tw-leading,var(--bk-text-4xl--line-height))}.bk\:text-base{font-size:var(--bk-text-base);line-height:var(--tw-leading,var(--bk-text-base--line-height))}.bk\:text-lg{font-size:var(--bk-text-lg);line-height:var(--tw-leading,var(--bk-text-lg--line-height))}.bk\:text-sm{font-size:var(--bk-text-sm);line-height:var(--tw-leading,var(--bk-text-sm--line-height))}.bk\:text-xl{font-size:var(--bk-text-xl);line-height:var(--tw-leading,var(--bk-text-xl--line-height))}.bk\:text-xs{font-size:var(--bk-text-xs);line-height:var(--tw-leading,var(--bk-text-xs--line-height))}.bk\:text-\[10px\]{font-size:10px}.bk\:leading-6{--tw-leading:calc(var(--bk-spacing)*6);line-height:calc(var(--bk-spacing)*6)}.bk\:leading-7{--tw-leading:calc(var(--bk-spacing)*7);line-height:calc(var(--bk-spacing)*7)}.bk\:font-bold{--tw-font-weight:var(--bk-font-weight-bold);font-weight:var(--bk-font-weight-bold)}.bk\:font-medium{--tw-font-weight:var(--bk-font-weight-medium);font-weight:var(--bk-font-weight-medium)}.bk\:font-semibold{--tw-font-weight:var(--bk-font-weight-semibold);font-weight:var(--bk-font-weight-semibold)}.bk\:tracking-tight{--tw-tracking:var(--bk-tracking-tight);letter-spacing:var(--bk-tracking-tight)}.bk\:tracking-wide{--tw-tracking:var(--bk-tracking-wide);letter-spacing:var(--bk-tracking-wide)}.bk\:tracking-wider{--tw-tracking:var(--bk-tracking-wider);letter-spacing:var(--bk-tracking-wider)}.bk\:whitespace-nowrap{white-space:nowrap}.bk\:text-amber-500{color:var(--bk-color-amber-500)}.bk\:text-blue-500{color:var(--bk-color-blue-500)}.bk\:text-blue-600{color:var(--bk-color-blue-600)}.bk\:text-cyan-500{color:var(--bk-color-cyan-500)}.bk\:text-emerald-500{color:var(--bk-color-emerald-500)}.bk\:text-fuchsia-500{color:var(--bk-color-fuchsia-500)}.bk\:text-gray-400{color:var(--bk-color-gray-400)}.bk\:text-gray-500{color:var(--bk-color-gray-500)}.bk\:text-gray-600{color:var(--bk-color-gray-600)}.bk\:text-gray-700{color:var(--bk-color-gray-700)}.bk\:text-gray-800{color:var(--bk-color-gray-800)}.bk\:text-orange-500{color:var(--bk-color-orange-500)}.bk\:text-rose-500{color:var(--bk-color-rose-500)}.bk\:text-rose-600{color:var(--bk-color-rose-600)}.bk\:text-teal-500{color:var(--bk-color-teal-500)}.bk\:text-violet-500{color:var(--bk-color-violet-500)}.bk\:text-white{color:var(--bk-color-white)}.bk\:uppercase{text-transform:uppercase}.bk\:italic{font-style:italic}.bk\:underline{text-decoration-line:underline}.bk\:underline-offset-4{text-underline-offset:4px}.bk\:placeholder-gray-400::placeholder{color:var(--bk-color-gray-400)}.bk\:accent-blue-600{accent-color:var(--bk-color-blue-600)}.bk\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.bk\:first\:mt-0:first-child{margin-top:calc(var(--bk-spacing)*0)}.bk\:last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.bk\:hover\:border-gray-300:hover{border-color:var(--bk-color-gray-300)}.bk\:hover\:bg-gray-200:hover{background-color:var(--bk-color-gray-200)}.bk\:hover\:text-blue-700:hover{color:var(--bk-color-blue-700)}.bk\:hover\:text-blue-800:hover{color:var(--bk-color-blue-800)}.bk\:hover\:underline:hover{text-decoration-line:underline}}.bk\:focus\:border-gray-400:focus{border-color:var(--bk-color-gray-400)}.bk\:focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}@media (min-width:40rem){.bk\:sm\:flex-row{flex-direction:row}}@media (min-width:48rem){.bk\:md\:text-2xl{font-size:var(--bk-text-2xl);line-height:var(--tw-leading,var(--bk-text-2xl--line-height))}.bk\:md\:text-3xl{font-size:var(--bk-text-3xl);line-height:var(--tw-leading,var(--bk-text-3xl--line-height))}.bk\:md\:text-4xl{font-size:var(--bk-text-4xl);line-height:var(--tw-leading,var(--bk-text-4xl--line-height))}}.bk\:dark\:border-gray-700:is(html.dark *){border-color:var(--bk-color-gray-700)}.bk\:dark\:border-neutral-900:is(html.dark *){border-color:var(--bk-color-neutral-900)}.bk\:dark\:bg-amber-900\/30:is(html.dark *){background-color:var(--bk-color-amber-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-amber-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-amber-900)30%,transparent)}}.bk\:dark\:bg-blue-900\/30:is(html.dark *){background-color:var(--bk-color-blue-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-blue-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-blue-900)30%,transparent)}}.bk\:dark\:bg-cyan-900\/30:is(html.dark *){background-color:var(--bk-color-cyan-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-cyan-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-cyan-900)30%,transparent)}}.bk\:dark\:bg-emerald-900\/30:is(html.dark *){background-color:var(--bk-color-emerald-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-emerald-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-emerald-900)30%,transparent)}}.bk\:dark\:bg-fuchsia-900\/30:is(html.dark *){background-color:var(--bk-color-fuchsia-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-fuchsia-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-fuchsia-900)30%,transparent)}}.bk\:dark\:bg-gray-200:is(html.dark *){background-color:var(--bk-color-gray-200)}.bk\:dark\:bg-gray-700:is(html.dark *){background-color:var(--bk-color-gray-700)}.bk\:dark\:bg-gray-800:is(html.dark *){background-color:var(--bk-color-gray-800)}.bk\:dark\:bg-orange-900\/30:is(html.dark *){background-color:var(--bk-color-orange-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-orange-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-orange-900)30%,transparent)}}.bk\:dark\:bg-rose-900\/30:is(html.dark *){background-color:var(--bk-color-rose-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-rose-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-rose-900)30%,transparent)}}.bk\:dark\:bg-teal-900\/30:is(html.dark *){background-color:var(--bk-color-teal-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-teal-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-teal-900)30%,transparent)}}.bk\:dark\:bg-violet-900\/30:is(html.dark *){background-color:var(--bk-color-violet-900)}@supports (color:color-mix(in lab, red, red)){.bk\:dark\:bg-violet-900\/30:is(html.dark *){background-color:color-mix(in oklab,var(--bk-color-violet-900)30%,transparent)}}.bk\:dark\:text-amber-300:is(html.dark *){color:var(--bk-color-amber-300)}.bk\:dark\:text-blue-300:is(html.dark *){color:var(--bk-color-blue-300)}.bk\:dark\:text-blue-400:is(html.dark *){color:var(--bk-color-blue-400)}.bk\:dark\:text-cyan-300:is(html.dark *){color:var(--bk-color-cyan-300)}.bk\:dark\:text-emerald-300:is(html.dark *){color:var(--bk-color-emerald-300)}.bk\:dark\:text-fuchsia-300:is(html.dark *){color:var(--bk-color-fuchsia-300)}.bk\:dark\:text-gray-100:is(html.dark *){color:var(--bk-color-gray-100)}.bk\:dark\:text-gray-200:is(html.dark *){color:var(--bk-color-gray-200)}.bk\:dark\:text-gray-300:is(html.dark *){color:var(--bk-color-gray-300)}.bk\:dark\:text-gray-400:is(html.dark *){color:var(--bk-color-gray-400)}.bk\:dark\:text-gray-500:is(html.dark *){color:var(--bk-color-gray-500)}.bk\:dark\:text-gray-800:is(html.dark *){color:var(--bk-color-gray-800)}.bk\:dark\:text-orange-300:is(html.dark *){color:var(--bk-color-orange-300)}.bk\:dark\:text-rose-300:is(html.dark *){color:var(--bk-color-rose-300)}.bk\:dark\:text-rose-400:is(html.dark *){color:var(--bk-color-rose-400)}.bk\:dark\:text-teal-300:is(html.dark *){color:var(--bk-color-teal-300)}.bk\:dark\:text-violet-300:is(html.dark *){color:var(--bk-color-violet-300)}@media (hover:hover){.bk\:dark\:hover\:border-gray-600:is(html.dark *):hover{border-color:var(--bk-color-gray-600)}.bk\:dark\:hover\:bg-gray-600:is(html.dark *):hover{background-color:var(--bk-color-gray-600)}.bk\:dark\:hover\:text-blue-300:is(html.dark *):hover{color:var(--bk-color-blue-300)}}.bk\:dark\:focus\:border-gray-500:is(html.dark *):focus{border-color:var(--bk-color-gray-500)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haroonwaves/blog-kit-react",
3
- "version": "1.3.1",
3
+ "version": "2.0.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",