@bbki.ng/components 1.5.7 → 1.5.10

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/dist/index.d.ts CHANGED
@@ -1,13 +1,14 @@
1
- import React, { EventHandler, ReactElement, CSSProperties, Ref, ReactNode, FunctionComponent } from 'react';
1
+ import React, { FunctionComponent, EventHandler, ReactElement, CSSProperties, Ref, ReactNode } from 'react';
2
2
  import { LinkProps as LinkProps$1 } from 'react-router-dom';
3
3
 
4
4
  declare type ArticleProps = {
5
- title: string;
5
+ title: any;
6
6
  className?: string;
7
7
  content?: any;
8
8
  children: any;
9
+ description?: any;
9
10
  };
10
- declare const Article: (props: ArticleProps) => JSX.Element;
11
+ declare const Article: FunctionComponent<ArticleProps>;
11
12
 
12
13
  declare enum ButtonType {
13
14
  DANGER = "danger",
@@ -55,8 +56,9 @@ interface LinkProps extends LinkProps$1 {
55
56
  color?: LinkColor;
56
57
  className?: string;
57
58
  external?: boolean;
59
+ name?: any;
60
+ children?: any;
58
61
  to: string;
59
- children: any;
60
62
  }
61
63
  declare const Link: (props: LinkProps) => JSX.Element;
62
64
 
@@ -114,14 +116,25 @@ declare const Table: {
114
116
  declare enum SkeletonColor {
115
117
  BLUE = "blue",
116
118
  RED = "red",
117
- GRAY = "gray"
119
+ GRAY = "gray",
120
+ BLACK = "black"
118
121
  }
119
- declare type SkeletonProps = {
122
+ interface SkeletonProps {
120
123
  width?: number;
121
124
  height?: number;
122
125
  bgColor?: SkeletonColor;
123
- };
124
- declare const Skeleton: (props: SkeletonProps) => JSX.Element;
126
+ }
127
+ interface ArticleSkeletonProps extends SkeletonProps {
128
+ titleLength: number;
129
+ descriptionLength?: number;
130
+ children?: any;
131
+ }
132
+ interface LinkListSkeletonProps extends ArticleSkeletonProps {
133
+ linksLength: number[];
134
+ }
135
+ declare const Skeleton: (props: SkeletonProps) => JSX.Element;
136
+ declare const ArticleSkeleton: (props: ArticleSkeletonProps) => JSX.Element;
137
+ declare const LinkListSkeleton: (props: LinkListSkeletonProps) => JSX.Element;
125
138
 
126
139
  interface ImagePreviewerProps {
127
140
  className?: string;
@@ -153,4 +166,31 @@ declare type BLinkDotProps = {
153
166
  };
154
167
  declare const BlinkDot: (props: BLinkDotProps) => JSX.Element;
155
168
 
156
- export { Article, ArticleProps, BLinkDotProps, BlinkDot, Breadcrumb, BreadcrumbProps, Button, ButtonProps, ButtonType, DropImage, ImageDropProps, ImagePreviewerProps, Link, LinkColor, LinkProps, Logo, LogoProps, Nav, NavProps, Page, Panel, PanelProps, PathObj, PopConfirm, PopConfirmProps, Skeleton, SkeletonColor, SkeletonProps, Table, TableProps, Tag, TagProps, Tags };
169
+ declare type threeColLayoutProps = {
170
+ leftRenderer?: () => ReactElement | null;
171
+ rightRenderer?: () => ReactElement | null;
172
+ middleRenderer?: () => ReactElement | null;
173
+ };
174
+ declare const ThreeColLayout: (props: threeColLayoutProps) => JSX.Element;
175
+
176
+ interface listProps {
177
+ className?: string;
178
+ compact?: boolean;
179
+ items: any[];
180
+ itemRenderer: (itemProps: any, index: number) => ReactElement;
181
+ horizontal?: boolean;
182
+ }
183
+ declare const List: FunctionComponent<listProps>;
184
+ interface TitledListProps extends listProps {
185
+ title?: any;
186
+ description?: any;
187
+ }
188
+ declare const TitledList: FunctionComponent<TitledListProps>;
189
+ interface LinkListProps extends Omit<listProps, "itemRenderer" | "items"> {
190
+ title?: string;
191
+ description?: any;
192
+ links: LinkProps[];
193
+ }
194
+ declare const LinkList: (props: LinkListProps) => JSX.Element;
195
+
196
+ export { Article, ArticleProps, ArticleSkeleton, ArticleSkeletonProps, BLinkDotProps, BlinkDot, Breadcrumb, BreadcrumbProps, Button, ButtonProps, ButtonType, DropImage, ImageDropProps, ImagePreviewerProps, Link, LinkColor, LinkList, LinkListProps, LinkListSkeleton, LinkListSkeletonProps, LinkProps, List, Logo, LogoProps, Nav, NavProps, Page, Panel, PanelProps, PathObj, PopConfirm, PopConfirmProps, Skeleton, SkeletonColor, SkeletonProps, Table, TableProps, Tag, TagProps, Tags, ThreeColLayout, TitledList, TitledListProps, listProps, threeColLayoutProps };
package/dist/index.js CHANGED
@@ -59,6 +59,7 @@ var __toCommonJS = /* @__PURE__ */ ((cache) => {
59
59
  var src_exports = {};
60
60
  __export(src_exports, {
61
61
  Article: () => Article,
62
+ ArticleSkeleton: () => ArticleSkeleton,
62
63
  BlinkDot: () => BlinkDot,
63
64
  Breadcrumb: () => Breadcrumb,
64
65
  Button: () => Button,
@@ -66,6 +67,9 @@ __export(src_exports, {
66
67
  DropImage: () => DropImage,
67
68
  Link: () => Link,
68
69
  LinkColor: () => LinkColor,
70
+ LinkList: () => LinkList,
71
+ LinkListSkeleton: () => LinkListSkeleton,
72
+ List: () => List,
69
73
  Logo: () => Logo,
70
74
  Nav: () => Nav,
71
75
  Page: () => Page,
@@ -75,21 +79,25 @@ __export(src_exports, {
75
79
  SkeletonColor: () => SkeletonColor,
76
80
  Table: () => Table,
77
81
  Tag: () => Tag,
78
- Tags: () => Tags
82
+ Tags: () => Tags,
83
+ ThreeColLayout: () => ThreeColLayout,
84
+ TitledList: () => TitledList
79
85
  });
80
86
 
81
87
  // src/article/Article.tsx
82
88
  var import_classnames = __toESM(require("classnames"));
83
89
  var import_react = __toESM(require("react"));
84
90
  var Article = (props) => {
85
- const { title, content, children, className } = props;
91
+ const { title, content, children, className, description } = props;
86
92
  return /* @__PURE__ */ import_react.default.createElement("div", {
87
93
  className: (0, import_classnames.default)("article", className)
88
94
  }, /* @__PURE__ */ import_react.default.createElement("div", {
89
95
  className: "text-[2.25rem] leading-none"
90
96
  }, title), /* @__PURE__ */ import_react.default.createElement("hr", {
91
97
  className: "my-64 border-gray-200"
92
- }), /* @__PURE__ */ import_react.default.createElement("div", {
98
+ }), description && /* @__PURE__ */ import_react.default.createElement("div", {
99
+ className: "mb-128"
100
+ }, description), /* @__PURE__ */ import_react.default.createElement("div", {
93
101
  className: "text-gray-700"
94
102
  }, children || content));
95
103
  };
@@ -330,31 +338,105 @@ Table.HCell = (props) => /* @__PURE__ */ import_react10.default.createElement("t
330
338
  Table.Cell = (props) => /* @__PURE__ */ import_react10.default.createElement("td", __spreadValues({}, props), props.children);
331
339
 
332
340
  // src/skeleton/Seleton.tsx
341
+ var import_classnames6 = __toESM(require("classnames"));
342
+ var import_react12 = __toESM(require("react"));
343
+
344
+ // src/list/list.tsx
333
345
  var import_classnames5 = __toESM(require("classnames"));
334
346
  var import_react11 = __toESM(require("react"));
347
+ var List = (props) => {
348
+ const { items, itemRenderer, className, horizontal, compact } = props;
349
+ const spaceCls = compact ? "" : horizontal ? "mr-3" : "mb-4";
350
+ return /* @__PURE__ */ import_react11.default.createElement("ul", {
351
+ className: (0, import_classnames5.default)(className, "list-style-none", {
352
+ flex: horizontal,
353
+ "align-center": horizontal
354
+ })
355
+ }, items.map((item, index) => {
356
+ return /* @__PURE__ */ import_react11.default.createElement("li", {
357
+ key: item.id || index,
358
+ className: (0, import_classnames5.default)(spaceCls, "flex-shrink-0")
359
+ }, itemRenderer(item, index));
360
+ }));
361
+ };
362
+ var TitledList = (props) => {
363
+ const _a = props, { title, description } = _a, rest = __objRest(_a, ["title", "description"]);
364
+ if (!title) {
365
+ return /* @__PURE__ */ import_react11.default.createElement(List, __spreadValues({}, rest));
366
+ }
367
+ return /* @__PURE__ */ import_react11.default.createElement(Article, {
368
+ title,
369
+ description
370
+ }, /* @__PURE__ */ import_react11.default.createElement(List, __spreadValues({}, rest)));
371
+ };
372
+ var LinkList = (props) => {
373
+ const _a = props, { title, description, links } = _a, rest = __objRest(_a, ["title", "description", "links"]);
374
+ const renderLink = ({ name, to }) => {
375
+ return /* @__PURE__ */ import_react11.default.createElement(Link, {
376
+ to,
377
+ key: name
378
+ }, name);
379
+ };
380
+ return /* @__PURE__ */ import_react11.default.createElement(TitledList, __spreadValues({
381
+ title,
382
+ description,
383
+ items: links,
384
+ itemRenderer: renderLink
385
+ }, rest));
386
+ };
387
+
388
+ // src/skeleton/Seleton.tsx
335
389
  var SkeletonColor = /* @__PURE__ */ ((SkeletonColor2) => {
336
390
  SkeletonColor2["BLUE"] = "blue";
337
391
  SkeletonColor2["RED"] = "red";
338
392
  SkeletonColor2["GRAY"] = "gray";
393
+ SkeletonColor2["BLACK"] = "black";
339
394
  return SkeletonColor2;
340
395
  })(SkeletonColor || {});
341
396
  var COLOR_MAPPING2 = {
342
397
  ["blue" /* BLUE */]: "bg-blue-100",
343
398
  ["red" /* RED */]: "bg-red-100",
344
- ["gray" /* GRAY */]: "bg-gray-100"
399
+ ["gray" /* GRAY */]: "bg-gray-100",
400
+ ["black" /* BLACK */]: "bg-gray-200"
345
401
  };
346
402
  var Skeleton = (props) => {
347
403
  const { bgColor = "gray" /* GRAY */, width = 26, height = 24 } = props;
348
- return /* @__PURE__ */ import_react11.default.createElement("div", {
349
- className: (0, import_classnames5.default)(COLOR_MAPPING2[bgColor], "animate-pulse", "rounded"),
404
+ return /* @__PURE__ */ import_react12.default.createElement("div", {
405
+ className: (0, import_classnames6.default)(COLOR_MAPPING2[bgColor], "animate-pulse", "rounded"),
350
406
  style: { width, height }
351
407
  });
352
408
  };
409
+ var ArticleSkeleton = (props) => {
410
+ const { children, titleLength, descriptionLength } = props;
411
+ return /* @__PURE__ */ import_react12.default.createElement(Article, {
412
+ title: /* @__PURE__ */ import_react12.default.createElement(Skeleton, {
413
+ width: 36 * titleLength,
414
+ height: 36,
415
+ bgColor: "black" /* BLACK */
416
+ }),
417
+ description: descriptionLength && /* @__PURE__ */ import_react12.default.createElement(Skeleton, {
418
+ width: 16 * descriptionLength
419
+ })
420
+ }, children);
421
+ };
422
+ var LinkListSkeleton = (props) => {
423
+ const _a = props, { linksLength } = _a, rest = __objRest(_a, ["linksLength"]);
424
+ const renderSkeleton = (length) => {
425
+ return /* @__PURE__ */ import_react12.default.createElement(Skeleton, {
426
+ width: length * 16,
427
+ bgColor: "blue" /* BLUE */
428
+ });
429
+ };
430
+ return /* @__PURE__ */ import_react12.default.createElement(ArticleSkeleton, __spreadValues({}, rest), /* @__PURE__ */ import_react12.default.createElement(List, {
431
+ items: linksLength,
432
+ itemRenderer: renderSkeleton
433
+ }));
434
+ };
353
435
 
354
436
  // src/drop-image/DropImage.tsx
355
- var import_classnames6 = __toESM(require("classnames"));
356
- var import_react13 = __toESM(require("react"));
357
- var import_react14 = require("react");
437
+ var import_classnames7 = __toESM(require("classnames"));
438
+ var import_react14 = __toESM(require("react"));
439
+ var import_react15 = require("react");
358
440
 
359
441
  // src/drop-image/utils.ts
360
442
  var wait = (d) => new Promise((r) => setTimeout(r, d));
@@ -362,12 +444,12 @@ var noop = () => {
362
444
  };
363
445
 
364
446
  // src/drop-image/useDropImage.ts
365
- var import_react12 = require("react");
447
+ var import_react13 = require("react");
366
448
  var useDropImage = (params) => {
367
- const [isDragOver, setIsDragOver] = (0, import_react12.useState)(false);
368
- const [imageSrc, setImageSrc] = (0, import_react12.useState)("");
369
- const [imageSize, setImageSize] = (0, import_react12.useState)({ width: 0, height: 0 });
370
- const imageFile = (0, import_react12.useRef)(null);
449
+ const [isDragOver, setIsDragOver] = (0, import_react13.useState)(false);
450
+ const [imageSrc, setImageSrc] = (0, import_react13.useState)("");
451
+ const [imageSize, setImageSize] = (0, import_react13.useState)({ width: 0, height: 0 });
452
+ const imageFile = (0, import_react13.useRef)(null);
371
453
  const {
372
454
  portraitImageWidth = 384,
373
455
  landscapeImageWidth = 500,
@@ -399,15 +481,15 @@ var useDropImage = (params) => {
399
481
  setImageSrc("");
400
482
  }
401
483
  };
402
- const handleDragOver = (0, import_react12.useCallback)((ev) => {
484
+ const handleDragOver = (0, import_react13.useCallback)((ev) => {
403
485
  ev.preventDefault();
404
486
  setIsDragOver(true);
405
487
  ev.dataTransfer.dropEffect = "move";
406
488
  }, []);
407
- const handleDragLeave = (0, import_react12.useCallback)(() => {
489
+ const handleDragLeave = (0, import_react13.useCallback)(() => {
408
490
  setIsDragOver(false);
409
491
  }, []);
410
- const handleDrop = (0, import_react12.useCallback)((ev) => {
492
+ const handleDrop = (0, import_react13.useCallback)((ev) => {
411
493
  ev.preventDefault();
412
494
  setIsDragOver(false);
413
495
  const file = ev.dataTransfer.files[0];
@@ -437,7 +519,7 @@ var useDropImage = (params) => {
437
519
  }
438
520
  img.onload = updateFunc;
439
521
  };
440
- const imageRef = (0, import_react12.useCallback)((input) => {
522
+ const imageRef = (0, import_react13.useCallback)((input) => {
441
523
  if (!input) {
442
524
  return;
443
525
  }
@@ -464,8 +546,8 @@ var ImagePreviewer = (props) => {
464
546
  imageSrc,
465
547
  className
466
548
  } = props;
467
- return /* @__PURE__ */ import_react13.default.createElement("img", {
468
- className: (0, import_classnames6.default)(className, "max-w-[100%]", "h-[auto]", "duration-300", "transition-opacity", "opacity-100", {
549
+ return /* @__PURE__ */ import_react14.default.createElement("img", {
550
+ className: (0, import_classnames7.default)(className, "max-w-[100%]", "h-[auto]", "duration-300", "transition-opacity", "opacity-100", {
469
551
  "opacity-0": !showImagePreviewer,
470
552
  "!m-0": !showImagePreviewer,
471
553
  "!p-0": !showImagePreviewer
@@ -486,9 +568,9 @@ var GhostDropImage = (props) => {
486
568
  children,
487
569
  placeholder
488
570
  } = props;
489
- const [coverVisible, setCoverVisible] = (0, import_react14.useState)(false);
490
- const [imageVisible, setImageVisible] = (0, import_react14.useState)(false);
491
- const handleDocDragEnter = (0, import_react13.useCallback)(() => {
571
+ const [coverVisible, setCoverVisible] = (0, import_react15.useState)(false);
572
+ const [imageVisible, setImageVisible] = (0, import_react15.useState)(false);
573
+ const handleDocDragEnter = (0, import_react14.useCallback)(() => {
492
574
  setCoverVisible(true);
493
575
  }, []);
494
576
  const {
@@ -513,19 +595,19 @@ var GhostDropImage = (props) => {
513
595
  reset();
514
596
  }
515
597
  });
516
- (0, import_react13.useEffect)(() => {
598
+ (0, import_react14.useEffect)(() => {
517
599
  document.addEventListener("dragenter", handleDocDragEnter);
518
600
  return () => {
519
601
  document.removeEventListener("dragenter", handleDocDragEnter);
520
602
  };
521
603
  }, []);
522
- const coverCls = (0, import_classnames6.default)("fixed", "top-0", "left-0", "h-full", "w-full", {
604
+ const coverCls = (0, import_classnames7.default)("fixed", "top-0", "left-0", "h-full", "w-full", {
523
605
  "lqip-blur": coverVisible,
524
606
  "z-[999]": coverVisible,
525
607
  block: coverVisible,
526
608
  hidden: !coverVisible
527
609
  });
528
- return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, null, /* @__PURE__ */ import_react13.default.createElement("div", {
610
+ return /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement("div", {
529
611
  className: coverCls,
530
612
  onDragLeave: () => {
531
613
  handleDragLeave();
@@ -538,7 +620,7 @@ var GhostDropImage = (props) => {
538
620
  imageRef,
539
621
  imageSize,
540
622
  imageSrc
541
- }) : /* @__PURE__ */ import_react13.default.createElement(ImagePreviewer, {
623
+ }) : /* @__PURE__ */ import_react14.default.createElement(ImagePreviewer, {
542
624
  className,
543
625
  visible: imageVisible,
544
626
  imageRef,
@@ -564,9 +646,9 @@ var DropImage = (props) => {
564
646
  }
565
647
  } = props;
566
648
  if (ghost) {
567
- return /* @__PURE__ */ import_react13.default.createElement(GhostDropImage, __spreadValues({}, props));
649
+ return /* @__PURE__ */ import_react14.default.createElement(GhostDropImage, __spreadValues({}, props));
568
650
  }
569
- const [showImagePreviewer, setShowImagePreviewer] = (0, import_react14.useState)(false);
651
+ const [showImagePreviewer, setShowImagePreviewer] = (0, import_react15.useState)(false);
570
652
  const {
571
653
  handleDragLeave,
572
654
  handleDragOver,
@@ -595,8 +677,8 @@ var DropImage = (props) => {
595
677
  height: imageSize.height || dropAreaStyle.height
596
678
  });
597
679
  };
598
- return /* @__PURE__ */ import_react13.default.createElement("div", {
599
- className: (0, import_classnames6.default)(className, "transition-all items-center justify-center flex duration-200 ease-in-out", {
680
+ return /* @__PURE__ */ import_react14.default.createElement("div", {
681
+ className: (0, import_classnames7.default)(className, "transition-all items-center justify-center flex duration-200 ease-in-out", {
600
682
  "shadow-input": !imageSrc,
601
683
  "shadow-empty": imageSrc
602
684
  }),
@@ -609,7 +691,7 @@ var DropImage = (props) => {
609
691
  imageRef,
610
692
  imageSize,
611
693
  imageSrc
612
- }) : /* @__PURE__ */ import_react13.default.createElement(ImagePreviewer, {
694
+ }) : /* @__PURE__ */ import_react14.default.createElement(ImagePreviewer, {
613
695
  visible: showImagePreviewer,
614
696
  imageRef,
615
697
  imageSrc,
@@ -618,20 +700,40 @@ var DropImage = (props) => {
618
700
  };
619
701
 
620
702
  // src/blink-dot/BlinkDot.tsx
621
- var import_classnames7 = __toESM(require("classnames"));
622
- var import_react15 = __toESM(require("react"));
703
+ var import_classnames8 = __toESM(require("classnames"));
704
+ var import_react16 = __toESM(require("react"));
623
705
  var BlinkDot = (props) => {
624
706
  const { className } = props;
625
- return /* @__PURE__ */ import_react15.default.createElement("span", {
626
- className: (0, import_classnames7.default)("inline-flex h-1 w-1 justify-center items-center relative", className)
627
- }, /* @__PURE__ */ import_react15.default.createElement("span", {
707
+ return /* @__PURE__ */ import_react16.default.createElement("span", {
708
+ className: (0, import_classnames8.default)("inline-flex h-1 w-1 justify-center items-center relative", className)
709
+ }, /* @__PURE__ */ import_react16.default.createElement("span", {
628
710
  className: "animate-ping-fast absolute inline-flex h-full w-full rounded-full bg-red-600"
629
711
  }));
630
712
  };
713
+
714
+ // src/layout/layout.tsx
715
+ var import_classnames9 = __toESM(require("classnames"));
716
+ var import_react17 = __toESM(require("react"));
717
+ var ThreeColLayout = (props) => {
718
+ const { leftRenderer, middleRenderer, rightRenderer } = props;
719
+ const colCls = (0, import_classnames9.default)("max-h-full overflow-auto md:block py-64");
720
+ return /* @__PURE__ */ import_react17.default.createElement("div", {
721
+ className: "grid grid-cols-1 xl:grid-cols-3 gap-4 h-full w-full"
722
+ }, /* @__PURE__ */ import_react17.default.createElement("div", {
723
+ className: (0, import_classnames9.default)("hidden", colCls)
724
+ }, leftRenderer && leftRenderer()), /* @__PURE__ */ import_react17.default.createElement("div", {
725
+ className: (0, import_classnames9.default)(colCls, "sm:px-128 xl:px-0 no-scrollbar", "relative", {
726
+ hidden: !middleRenderer
727
+ })
728
+ }, middleRenderer && middleRenderer()), /* @__PURE__ */ import_react17.default.createElement("div", {
729
+ className: (0, import_classnames9.default)("hidden", colCls)
730
+ }, rightRenderer && rightRenderer()));
731
+ };
631
732
  module.exports = __toCommonJS(src_exports);
632
733
  // Annotate the CommonJS export names for ESM import in node:
633
734
  0 && (module.exports = {
634
735
  Article,
736
+ ArticleSkeleton,
635
737
  BlinkDot,
636
738
  Breadcrumb,
637
739
  Button,
@@ -639,6 +741,9 @@ module.exports = __toCommonJS(src_exports);
639
741
  DropImage,
640
742
  Link,
641
743
  LinkColor,
744
+ LinkList,
745
+ LinkListSkeleton,
746
+ List,
642
747
  Logo,
643
748
  Nav,
644
749
  Page,
@@ -648,5 +753,7 @@ module.exports = __toCommonJS(src_exports);
648
753
  SkeletonColor,
649
754
  Table,
650
755
  Tag,
651
- Tags
756
+ Tags,
757
+ ThreeColLayout,
758
+ TitledList
652
759
  });
package/dist/index.mjs CHANGED
@@ -34,14 +34,16 @@ var __objRest = (source, exclude) => {
34
34
  import classNames from "classnames";
35
35
  import React from "react";
36
36
  var Article = (props) => {
37
- const { title, content, children, className } = props;
37
+ const { title, content, children, className, description } = props;
38
38
  return /* @__PURE__ */ React.createElement("div", {
39
39
  className: classNames("article", className)
40
40
  }, /* @__PURE__ */ React.createElement("div", {
41
41
  className: "text-[2.25rem] leading-none"
42
42
  }, title), /* @__PURE__ */ React.createElement("hr", {
43
43
  className: "my-64 border-gray-200"
44
- }), /* @__PURE__ */ React.createElement("div", {
44
+ }), description && /* @__PURE__ */ React.createElement("div", {
45
+ className: "mb-128"
46
+ }, description), /* @__PURE__ */ React.createElement("div", {
45
47
  className: "text-gray-700"
46
48
  }, children || content));
47
49
  };
@@ -283,29 +285,103 @@ Table.Cell = (props) => /* @__PURE__ */ React11.createElement("td", __spreadValu
283
285
 
284
286
  // src/skeleton/Seleton.tsx
285
287
  import classNames5 from "classnames";
288
+ import React13 from "react";
289
+
290
+ // src/list/list.tsx
291
+ import cls from "classnames";
286
292
  import React12 from "react";
293
+ var List = (props) => {
294
+ const { items, itemRenderer, className, horizontal, compact } = props;
295
+ const spaceCls = compact ? "" : horizontal ? "mr-3" : "mb-4";
296
+ return /* @__PURE__ */ React12.createElement("ul", {
297
+ className: cls(className, "list-style-none", {
298
+ flex: horizontal,
299
+ "align-center": horizontal
300
+ })
301
+ }, items.map((item, index) => {
302
+ return /* @__PURE__ */ React12.createElement("li", {
303
+ key: item.id || index,
304
+ className: cls(spaceCls, "flex-shrink-0")
305
+ }, itemRenderer(item, index));
306
+ }));
307
+ };
308
+ var TitledList = (props) => {
309
+ const _a = props, { title, description } = _a, rest = __objRest(_a, ["title", "description"]);
310
+ if (!title) {
311
+ return /* @__PURE__ */ React12.createElement(List, __spreadValues({}, rest));
312
+ }
313
+ return /* @__PURE__ */ React12.createElement(Article, {
314
+ title,
315
+ description
316
+ }, /* @__PURE__ */ React12.createElement(List, __spreadValues({}, rest)));
317
+ };
318
+ var LinkList = (props) => {
319
+ const _a = props, { title, description, links } = _a, rest = __objRest(_a, ["title", "description", "links"]);
320
+ const renderLink = ({ name, to }) => {
321
+ return /* @__PURE__ */ React12.createElement(Link, {
322
+ to,
323
+ key: name
324
+ }, name);
325
+ };
326
+ return /* @__PURE__ */ React12.createElement(TitledList, __spreadValues({
327
+ title,
328
+ description,
329
+ items: links,
330
+ itemRenderer: renderLink
331
+ }, rest));
332
+ };
333
+
334
+ // src/skeleton/Seleton.tsx
287
335
  var SkeletonColor = /* @__PURE__ */ ((SkeletonColor2) => {
288
336
  SkeletonColor2["BLUE"] = "blue";
289
337
  SkeletonColor2["RED"] = "red";
290
338
  SkeletonColor2["GRAY"] = "gray";
339
+ SkeletonColor2["BLACK"] = "black";
291
340
  return SkeletonColor2;
292
341
  })(SkeletonColor || {});
293
342
  var COLOR_MAPPING2 = {
294
343
  ["blue" /* BLUE */]: "bg-blue-100",
295
344
  ["red" /* RED */]: "bg-red-100",
296
- ["gray" /* GRAY */]: "bg-gray-100"
345
+ ["gray" /* GRAY */]: "bg-gray-100",
346
+ ["black" /* BLACK */]: "bg-gray-200"
297
347
  };
298
348
  var Skeleton = (props) => {
299
349
  const { bgColor = "gray" /* GRAY */, width = 26, height = 24 } = props;
300
- return /* @__PURE__ */ React12.createElement("div", {
350
+ return /* @__PURE__ */ React13.createElement("div", {
301
351
  className: classNames5(COLOR_MAPPING2[bgColor], "animate-pulse", "rounded"),
302
352
  style: { width, height }
303
353
  });
304
354
  };
355
+ var ArticleSkeleton = (props) => {
356
+ const { children, titleLength, descriptionLength } = props;
357
+ return /* @__PURE__ */ React13.createElement(Article, {
358
+ title: /* @__PURE__ */ React13.createElement(Skeleton, {
359
+ width: 36 * titleLength,
360
+ height: 36,
361
+ bgColor: "black" /* BLACK */
362
+ }),
363
+ description: descriptionLength && /* @__PURE__ */ React13.createElement(Skeleton, {
364
+ width: 16 * descriptionLength
365
+ })
366
+ }, children);
367
+ };
368
+ var LinkListSkeleton = (props) => {
369
+ const _a = props, { linksLength } = _a, rest = __objRest(_a, ["linksLength"]);
370
+ const renderSkeleton = (length) => {
371
+ return /* @__PURE__ */ React13.createElement(Skeleton, {
372
+ width: length * 16,
373
+ bgColor: "blue" /* BLUE */
374
+ });
375
+ };
376
+ return /* @__PURE__ */ React13.createElement(ArticleSkeleton, __spreadValues({}, rest), /* @__PURE__ */ React13.createElement(List, {
377
+ items: linksLength,
378
+ itemRenderer: renderSkeleton
379
+ }));
380
+ };
305
381
 
306
382
  // src/drop-image/DropImage.tsx
307
- import cls from "classnames";
308
- import React13, {
383
+ import cls2 from "classnames";
384
+ import React14, {
309
385
  useEffect as useEffect2,
310
386
  useCallback as useCallback2
311
387
  } from "react";
@@ -419,8 +495,8 @@ var ImagePreviewer = (props) => {
419
495
  imageSrc,
420
496
  className
421
497
  } = props;
422
- return /* @__PURE__ */ React13.createElement("img", {
423
- className: cls(className, "max-w-[100%]", "h-[auto]", "duration-300", "transition-opacity", "opacity-100", {
498
+ return /* @__PURE__ */ React14.createElement("img", {
499
+ className: cls2(className, "max-w-[100%]", "h-[auto]", "duration-300", "transition-opacity", "opacity-100", {
424
500
  "opacity-0": !showImagePreviewer,
425
501
  "!m-0": !showImagePreviewer,
426
502
  "!p-0": !showImagePreviewer
@@ -474,13 +550,13 @@ var GhostDropImage = (props) => {
474
550
  document.removeEventListener("dragenter", handleDocDragEnter);
475
551
  };
476
552
  }, []);
477
- const coverCls = cls("fixed", "top-0", "left-0", "h-full", "w-full", {
553
+ const coverCls = cls2("fixed", "top-0", "left-0", "h-full", "w-full", {
478
554
  "lqip-blur": coverVisible,
479
555
  "z-[999]": coverVisible,
480
556
  block: coverVisible,
481
557
  hidden: !coverVisible
482
558
  });
483
- return /* @__PURE__ */ React13.createElement(React13.Fragment, null, /* @__PURE__ */ React13.createElement("div", {
559
+ return /* @__PURE__ */ React14.createElement(React14.Fragment, null, /* @__PURE__ */ React14.createElement("div", {
484
560
  className: coverCls,
485
561
  onDragLeave: () => {
486
562
  handleDragLeave();
@@ -493,7 +569,7 @@ var GhostDropImage = (props) => {
493
569
  imageRef,
494
570
  imageSize,
495
571
  imageSrc
496
- }) : /* @__PURE__ */ React13.createElement(ImagePreviewer, {
572
+ }) : /* @__PURE__ */ React14.createElement(ImagePreviewer, {
497
573
  className,
498
574
  visible: imageVisible,
499
575
  imageRef,
@@ -519,7 +595,7 @@ var DropImage = (props) => {
519
595
  }
520
596
  } = props;
521
597
  if (ghost) {
522
- return /* @__PURE__ */ React13.createElement(GhostDropImage, __spreadValues({}, props));
598
+ return /* @__PURE__ */ React14.createElement(GhostDropImage, __spreadValues({}, props));
523
599
  }
524
600
  const [showImagePreviewer, setShowImagePreviewer] = useState3(false);
525
601
  const {
@@ -550,8 +626,8 @@ var DropImage = (props) => {
550
626
  height: imageSize.height || dropAreaStyle.height
551
627
  });
552
628
  };
553
- return /* @__PURE__ */ React13.createElement("div", {
554
- className: cls(className, "transition-all items-center justify-center flex duration-200 ease-in-out", {
629
+ return /* @__PURE__ */ React14.createElement("div", {
630
+ className: cls2(className, "transition-all items-center justify-center flex duration-200 ease-in-out", {
555
631
  "shadow-input": !imageSrc,
556
632
  "shadow-empty": imageSrc
557
633
  }),
@@ -564,7 +640,7 @@ var DropImage = (props) => {
564
640
  imageRef,
565
641
  imageSize,
566
642
  imageSrc
567
- }) : /* @__PURE__ */ React13.createElement(ImagePreviewer, {
643
+ }) : /* @__PURE__ */ React14.createElement(ImagePreviewer, {
568
644
  visible: showImagePreviewer,
569
645
  imageRef,
570
646
  imageSrc,
@@ -574,17 +650,37 @@ var DropImage = (props) => {
574
650
 
575
651
  // src/blink-dot/BlinkDot.tsx
576
652
  import classNames6 from "classnames";
577
- import React14 from "react";
653
+ import React15 from "react";
578
654
  var BlinkDot = (props) => {
579
655
  const { className } = props;
580
- return /* @__PURE__ */ React14.createElement("span", {
656
+ return /* @__PURE__ */ React15.createElement("span", {
581
657
  className: classNames6("inline-flex h-1 w-1 justify-center items-center relative", className)
582
- }, /* @__PURE__ */ React14.createElement("span", {
658
+ }, /* @__PURE__ */ React15.createElement("span", {
583
659
  className: "animate-ping-fast absolute inline-flex h-full w-full rounded-full bg-red-600"
584
660
  }));
585
661
  };
662
+
663
+ // src/layout/layout.tsx
664
+ import cls3 from "classnames";
665
+ import React16 from "react";
666
+ var ThreeColLayout = (props) => {
667
+ const { leftRenderer, middleRenderer, rightRenderer } = props;
668
+ const colCls = cls3("max-h-full overflow-auto md:block py-64");
669
+ return /* @__PURE__ */ React16.createElement("div", {
670
+ className: "grid grid-cols-1 xl:grid-cols-3 gap-4 h-full w-full"
671
+ }, /* @__PURE__ */ React16.createElement("div", {
672
+ className: cls3("hidden", colCls)
673
+ }, leftRenderer && leftRenderer()), /* @__PURE__ */ React16.createElement("div", {
674
+ className: cls3(colCls, "sm:px-128 xl:px-0 no-scrollbar", "relative", {
675
+ hidden: !middleRenderer
676
+ })
677
+ }, middleRenderer && middleRenderer()), /* @__PURE__ */ React16.createElement("div", {
678
+ className: cls3("hidden", colCls)
679
+ }, rightRenderer && rightRenderer()));
680
+ };
586
681
  export {
587
682
  Article,
683
+ ArticleSkeleton,
588
684
  BlinkDot,
589
685
  Breadcrumb,
590
686
  Button,
@@ -592,6 +688,9 @@ export {
592
688
  DropImage,
593
689
  Link,
594
690
  LinkColor,
691
+ LinkList,
692
+ LinkListSkeleton,
693
+ List,
595
694
  Logo,
596
695
  Nav,
597
696
  Page,
@@ -601,5 +700,7 @@ export {
601
700
  SkeletonColor,
602
701
  Table,
603
702
  Tag,
604
- Tags
703
+ Tags,
704
+ ThreeColLayout,
705
+ TitledList
605
706
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bbki.ng/components",
3
- "version": "1.5.7",
3
+ "version": "1.5.10",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
package/dist/index.css DELETED
@@ -1,226 +0,0 @@
1
- /* src/main.css */
2
- *,
3
- ::before,
4
- ::after {
5
- box-sizing: border-box;
6
- border-width: 0;
7
- border-style: solid;
8
- border-color: currentColor;
9
- }
10
- ::before,
11
- ::after {
12
- --tw-content: "";
13
- }
14
- html {
15
- line-height: 1.5;
16
- -webkit-text-size-adjust: 100%;
17
- -moz-tab-size: 4;
18
- -o-tab-size: 4;
19
- tab-size: 4;
20
- font-family:
21
- pt-sans,
22
- ui-sans-serif,
23
- system-ui,
24
- -apple-system,
25
- BlinkMacSystemFont,
26
- Segoe UI,
27
- Roboto,
28
- Helvetica Neue,
29
- Arial,
30
- Noto Sans,
31
- sans-serif,
32
- Apple Color Emoji,
33
- Segoe UI Emoji,
34
- Segoe UI Symbol,
35
- Noto Color Emoji;
36
- }
37
- body {
38
- margin: 0;
39
- line-height: inherit;
40
- }
41
- hr {
42
- height: 0;
43
- color: inherit;
44
- border-top-width: 1px;
45
- }
46
- abbr[title] {
47
- -webkit-text-decoration: underline dotted;
48
- text-decoration: underline dotted;
49
- }
50
- h1,
51
- h2,
52
- h3,
53
- h4,
54
- h5,
55
- h6 {
56
- font-size: inherit;
57
- font-weight: inherit;
58
- }
59
- a {
60
- color: inherit;
61
- text-decoration: inherit;
62
- }
63
- b,
64
- strong {
65
- font-weight: bolder;
66
- }
67
- code,
68
- kbd,
69
- samp,
70
- pre {
71
- font-family:
72
- ui-monospace,
73
- SFMono-Regular,
74
- Menlo,
75
- Monaco,
76
- Consolas,
77
- Liberation Mono,
78
- Courier New,
79
- monospace;
80
- font-size: 1em;
81
- }
82
- small {
83
- font-size: 80%;
84
- }
85
- sub,
86
- sup {
87
- font-size: 75%;
88
- line-height: 0;
89
- position: relative;
90
- vertical-align: baseline;
91
- }
92
- sub {
93
- bottom: -0.25em;
94
- }
95
- sup {
96
- top: -0.5em;
97
- }
98
- table {
99
- text-indent: 0;
100
- border-color: inherit;
101
- border-collapse: collapse;
102
- }
103
- button,
104
- input,
105
- optgroup,
106
- select,
107
- textarea {
108
- font-family: inherit;
109
- font-size: 100%;
110
- line-height: inherit;
111
- color: inherit;
112
- margin: 0;
113
- padding: 0;
114
- }
115
- button,
116
- select {
117
- text-transform: none;
118
- }
119
- button,
120
- [type=button],
121
- [type=reset],
122
- [type=submit] {
123
- -webkit-appearance: button;
124
- background-color: transparent;
125
- background-image: none;
126
- }
127
- :-moz-focusring {
128
- outline: auto;
129
- }
130
- :-moz-ui-invalid {
131
- box-shadow: none;
132
- }
133
- progress {
134
- vertical-align: baseline;
135
- }
136
- ::-webkit-inner-spin-button,
137
- ::-webkit-outer-spin-button {
138
- height: auto;
139
- }
140
- [type=search] {
141
- -webkit-appearance: textfield;
142
- outline-offset: -2px;
143
- }
144
- ::-webkit-search-decoration {
145
- -webkit-appearance: none;
146
- }
147
- ::-webkit-file-upload-button {
148
- -webkit-appearance: button;
149
- font: inherit;
150
- }
151
- summary {
152
- display: list-item;
153
- }
154
- blockquote,
155
- dl,
156
- dd,
157
- h1,
158
- h2,
159
- h3,
160
- h4,
161
- h5,
162
- h6,
163
- hr,
164
- figure,
165
- p,
166
- pre {
167
- margin: 0;
168
- }
169
- fieldset {
170
- margin: 0;
171
- padding: 0;
172
- }
173
- legend {
174
- padding: 0;
175
- }
176
- ol,
177
- ul,
178
- menu {
179
- list-style: none;
180
- margin: 0;
181
- padding: 0;
182
- }
183
- textarea {
184
- resize: vertical;
185
- }
186
- input::-moz-placeholder,
187
- textarea::-moz-placeholder {
188
- opacity: 1;
189
- color: #9CA3AF;
190
- }
191
- input:-ms-input-placeholder,
192
- textarea:-ms-input-placeholder {
193
- opacity: 1;
194
- color: #9CA3AF;
195
- }
196
- input::placeholder,
197
- textarea::placeholder {
198
- opacity: 1;
199
- color: #9CA3AF;
200
- }
201
- button,
202
- [role=button] {
203
- cursor: pointer;
204
- }
205
- :disabled {
206
- cursor: default;
207
- }
208
- img,
209
- svg,
210
- video,
211
- canvas,
212
- audio,
213
- iframe,
214
- embed,
215
- object {
216
- display: block;
217
- vertical-align: middle;
218
- }
219
- img,
220
- video {
221
- max-width: 100%;
222
- height: auto;
223
- }
224
- [hidden] {
225
- display: none;
226
- }