@bbki.ng/components 1.5.8 → 1.5.11

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;
@@ -167,6 +180,17 @@ interface listProps {
167
180
  itemRenderer: (itemProps: any, index: number) => ReactElement;
168
181
  horizontal?: boolean;
169
182
  }
170
- declare const List: FunctionComponent<listProps>;
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;
171
195
 
172
- export { Article, ArticleProps, BLinkDotProps, BlinkDot, Breadcrumb, BreadcrumbProps, Button, ButtonProps, ButtonType, DropImage, ImageDropProps, ImagePreviewerProps, Link, LinkColor, LinkProps, List, Logo, LogoProps, Nav, NavProps, Page, Panel, PanelProps, PathObj, PopConfirm, PopConfirmProps, Skeleton, SkeletonColor, SkeletonProps, Table, TableProps, Tag, TagProps, Tags, ThreeColLayout, listProps, threeColLayoutProps };
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,8 @@ __export(src_exports, {
66
67
  DropImage: () => DropImage,
67
68
  Link: () => Link,
68
69
  LinkColor: () => LinkColor,
70
+ LinkList: () => LinkList,
71
+ LinkListSkeleton: () => LinkListSkeleton,
69
72
  List: () => List,
70
73
  Logo: () => Logo,
71
74
  Nav: () => Nav,
@@ -77,21 +80,24 @@ __export(src_exports, {
77
80
  Table: () => Table,
78
81
  Tag: () => Tag,
79
82
  Tags: () => Tags,
80
- ThreeColLayout: () => ThreeColLayout
83
+ ThreeColLayout: () => ThreeColLayout,
84
+ TitledList: () => TitledList
81
85
  });
82
86
 
83
87
  // src/article/Article.tsx
84
88
  var import_classnames = __toESM(require("classnames"));
85
89
  var import_react = __toESM(require("react"));
86
90
  var Article = (props) => {
87
- const { title, content, children, className } = props;
91
+ const { title, content, children, className, description } = props;
88
92
  return /* @__PURE__ */ import_react.default.createElement("div", {
89
93
  className: (0, import_classnames.default)("article", className)
90
94
  }, /* @__PURE__ */ import_react.default.createElement("div", {
91
95
  className: "text-[2.25rem] leading-none"
92
96
  }, title), /* @__PURE__ */ import_react.default.createElement("hr", {
93
97
  className: "my-64 border-gray-200"
94
- }), /* @__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", {
95
101
  className: "text-gray-700"
96
102
  }, children || content));
97
103
  };
@@ -332,31 +338,105 @@ Table.HCell = (props) => /* @__PURE__ */ import_react10.default.createElement("t
332
338
  Table.Cell = (props) => /* @__PURE__ */ import_react10.default.createElement("td", __spreadValues({}, props), props.children);
333
339
 
334
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
335
345
  var import_classnames5 = __toESM(require("classnames"));
336
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
337
389
  var SkeletonColor = /* @__PURE__ */ ((SkeletonColor2) => {
338
390
  SkeletonColor2["BLUE"] = "blue";
339
391
  SkeletonColor2["RED"] = "red";
340
392
  SkeletonColor2["GRAY"] = "gray";
393
+ SkeletonColor2["BLACK"] = "black";
341
394
  return SkeletonColor2;
342
395
  })(SkeletonColor || {});
343
396
  var COLOR_MAPPING2 = {
344
397
  ["blue" /* BLUE */]: "bg-blue-100",
345
398
  ["red" /* RED */]: "bg-red-100",
346
- ["gray" /* GRAY */]: "bg-gray-100"
399
+ ["gray" /* GRAY */]: "bg-gray-100",
400
+ ["black" /* BLACK */]: "bg-gray-200"
347
401
  };
348
402
  var Skeleton = (props) => {
349
403
  const { bgColor = "gray" /* GRAY */, width = 26, height = 24 } = props;
350
- return /* @__PURE__ */ import_react11.default.createElement("div", {
351
- 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"),
352
406
  style: { width, height }
353
407
  });
354
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
+ };
355
435
 
356
436
  // src/drop-image/DropImage.tsx
357
- var import_classnames6 = __toESM(require("classnames"));
358
- var import_react13 = __toESM(require("react"));
359
- 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");
360
440
 
361
441
  // src/drop-image/utils.ts
362
442
  var wait = (d) => new Promise((r) => setTimeout(r, d));
@@ -364,12 +444,12 @@ var noop = () => {
364
444
  };
365
445
 
366
446
  // src/drop-image/useDropImage.ts
367
- var import_react12 = require("react");
447
+ var import_react13 = require("react");
368
448
  var useDropImage = (params) => {
369
- const [isDragOver, setIsDragOver] = (0, import_react12.useState)(false);
370
- const [imageSrc, setImageSrc] = (0, import_react12.useState)("");
371
- const [imageSize, setImageSize] = (0, import_react12.useState)({ width: 0, height: 0 });
372
- 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);
373
453
  const {
374
454
  portraitImageWidth = 384,
375
455
  landscapeImageWidth = 500,
@@ -401,18 +481,21 @@ var useDropImage = (params) => {
401
481
  setImageSrc("");
402
482
  }
403
483
  };
404
- const handleDragOver = (0, import_react12.useCallback)((ev) => {
484
+ const handleDragOver = (0, import_react13.useCallback)((ev) => {
405
485
  ev.preventDefault();
406
486
  setIsDragOver(true);
407
487
  ev.dataTransfer.dropEffect = "move";
408
488
  }, []);
409
- const handleDragLeave = (0, import_react12.useCallback)(() => {
489
+ const handleDragLeave = (0, import_react13.useCallback)(() => {
410
490
  setIsDragOver(false);
411
491
  }, []);
412
- const handleDrop = (0, import_react12.useCallback)((ev) => {
492
+ const handleDrop = (0, import_react13.useCallback)((ev) => {
413
493
  ev.preventDefault();
414
494
  setIsDragOver(false);
415
495
  const file = ev.dataTransfer.files[0];
496
+ if (!file || !file.type.startsWith("image")) {
497
+ return;
498
+ }
416
499
  imageFile.current = file;
417
500
  setPreviewImageSrcByFile(file);
418
501
  onDrop(ev, file);
@@ -439,7 +522,7 @@ var useDropImage = (params) => {
439
522
  }
440
523
  img.onload = updateFunc;
441
524
  };
442
- const imageRef = (0, import_react12.useCallback)((input) => {
525
+ const imageRef = (0, import_react13.useCallback)((input) => {
443
526
  if (!input) {
444
527
  return;
445
528
  }
@@ -466,8 +549,8 @@ var ImagePreviewer = (props) => {
466
549
  imageSrc,
467
550
  className
468
551
  } = props;
469
- return /* @__PURE__ */ import_react13.default.createElement("img", {
470
- className: (0, import_classnames6.default)(className, "max-w-[100%]", "h-[auto]", "duration-300", "transition-opacity", "opacity-100", {
552
+ return /* @__PURE__ */ import_react14.default.createElement("img", {
553
+ className: (0, import_classnames7.default)(className, "max-w-[100%]", "h-[auto]", "duration-300", "transition-opacity", "opacity-100", {
471
554
  "opacity-0": !showImagePreviewer,
472
555
  "!m-0": !showImagePreviewer,
473
556
  "!p-0": !showImagePreviewer
@@ -488,9 +571,9 @@ var GhostDropImage = (props) => {
488
571
  children,
489
572
  placeholder
490
573
  } = props;
491
- const [coverVisible, setCoverVisible] = (0, import_react14.useState)(false);
492
- const [imageVisible, setImageVisible] = (0, import_react14.useState)(false);
493
- const handleDocDragEnter = (0, import_react13.useCallback)(() => {
574
+ const [coverVisible, setCoverVisible] = (0, import_react15.useState)(false);
575
+ const [imageVisible, setImageVisible] = (0, import_react15.useState)(false);
576
+ const handleDocDragEnter = (0, import_react14.useCallback)(() => {
494
577
  setCoverVisible(true);
495
578
  }, []);
496
579
  const {
@@ -515,19 +598,19 @@ var GhostDropImage = (props) => {
515
598
  reset();
516
599
  }
517
600
  });
518
- (0, import_react13.useEffect)(() => {
601
+ (0, import_react14.useEffect)(() => {
519
602
  document.addEventListener("dragenter", handleDocDragEnter);
520
603
  return () => {
521
604
  document.removeEventListener("dragenter", handleDocDragEnter);
522
605
  };
523
606
  }, []);
524
- const coverCls = (0, import_classnames6.default)("fixed", "top-0", "left-0", "h-full", "w-full", {
607
+ const coverCls = (0, import_classnames7.default)("fixed", "top-0", "left-0", "h-full", "w-full", {
525
608
  "lqip-blur": coverVisible,
526
609
  "z-[999]": coverVisible,
527
610
  block: coverVisible,
528
611
  hidden: !coverVisible
529
612
  });
530
- return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, null, /* @__PURE__ */ import_react13.default.createElement("div", {
613
+ return /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement("div", {
531
614
  className: coverCls,
532
615
  onDragLeave: () => {
533
616
  handleDragLeave();
@@ -540,7 +623,7 @@ var GhostDropImage = (props) => {
540
623
  imageRef,
541
624
  imageSize,
542
625
  imageSrc
543
- }) : /* @__PURE__ */ import_react13.default.createElement(ImagePreviewer, {
626
+ }) : /* @__PURE__ */ import_react14.default.createElement(ImagePreviewer, {
544
627
  className,
545
628
  visible: imageVisible,
546
629
  imageRef,
@@ -566,9 +649,9 @@ var DropImage = (props) => {
566
649
  }
567
650
  } = props;
568
651
  if (ghost) {
569
- return /* @__PURE__ */ import_react13.default.createElement(GhostDropImage, __spreadValues({}, props));
652
+ return /* @__PURE__ */ import_react14.default.createElement(GhostDropImage, __spreadValues({}, props));
570
653
  }
571
- const [showImagePreviewer, setShowImagePreviewer] = (0, import_react14.useState)(false);
654
+ const [showImagePreviewer, setShowImagePreviewer] = (0, import_react15.useState)(false);
572
655
  const {
573
656
  handleDragLeave,
574
657
  handleDragOver,
@@ -597,8 +680,8 @@ var DropImage = (props) => {
597
680
  height: imageSize.height || dropAreaStyle.height
598
681
  });
599
682
  };
600
- return /* @__PURE__ */ import_react13.default.createElement("div", {
601
- className: (0, import_classnames6.default)(className, "transition-all items-center justify-center flex duration-200 ease-in-out", {
683
+ return /* @__PURE__ */ import_react14.default.createElement("div", {
684
+ className: (0, import_classnames7.default)(className, "transition-all items-center justify-center flex duration-200 ease-in-out", {
602
685
  "shadow-input": !imageSrc,
603
686
  "shadow-empty": imageSrc
604
687
  }),
@@ -611,7 +694,7 @@ var DropImage = (props) => {
611
694
  imageRef,
612
695
  imageSize,
613
696
  imageSrc
614
- }) : /* @__PURE__ */ import_react13.default.createElement(ImagePreviewer, {
697
+ }) : /* @__PURE__ */ import_react14.default.createElement(ImagePreviewer, {
615
698
  visible: showImagePreviewer,
616
699
  imageRef,
617
700
  imageSrc,
@@ -620,58 +703,40 @@ var DropImage = (props) => {
620
703
  };
621
704
 
622
705
  // src/blink-dot/BlinkDot.tsx
623
- var import_classnames7 = __toESM(require("classnames"));
624
- var import_react15 = __toESM(require("react"));
706
+ var import_classnames8 = __toESM(require("classnames"));
707
+ var import_react16 = __toESM(require("react"));
625
708
  var BlinkDot = (props) => {
626
709
  const { className } = props;
627
- return /* @__PURE__ */ import_react15.default.createElement("span", {
628
- className: (0, import_classnames7.default)("inline-flex h-1 w-1 justify-center items-center relative", className)
629
- }, /* @__PURE__ */ import_react15.default.createElement("span", {
710
+ return /* @__PURE__ */ import_react16.default.createElement("span", {
711
+ className: (0, import_classnames8.default)("inline-flex h-1 w-1 justify-center items-center relative", className)
712
+ }, /* @__PURE__ */ import_react16.default.createElement("span", {
630
713
  className: "animate-ping-fast absolute inline-flex h-full w-full rounded-full bg-red-600"
631
714
  }));
632
715
  };
633
716
 
634
717
  // src/layout/layout.tsx
635
- var import_classnames8 = __toESM(require("classnames"));
636
- var import_react16 = __toESM(require("react"));
718
+ var import_classnames9 = __toESM(require("classnames"));
719
+ var import_react17 = __toESM(require("react"));
637
720
  var ThreeColLayout = (props) => {
638
721
  const { leftRenderer, middleRenderer, rightRenderer } = props;
639
- const colCls = (0, import_classnames8.default)("max-h-full overflow-auto md:block py-64");
640
- return /* @__PURE__ */ import_react16.default.createElement("div", {
722
+ const colCls = (0, import_classnames9.default)("max-h-full overflow-auto md:block py-64");
723
+ return /* @__PURE__ */ import_react17.default.createElement("div", {
641
724
  className: "grid grid-cols-1 xl:grid-cols-3 gap-4 h-full w-full"
642
- }, /* @__PURE__ */ import_react16.default.createElement("div", {
643
- className: (0, import_classnames8.default)("hidden", colCls)
644
- }, leftRenderer && leftRenderer()), /* @__PURE__ */ import_react16.default.createElement("div", {
645
- className: (0, import_classnames8.default)(colCls, "sm:px-128 xl:px-0 no-scrollbar", "relative", {
725
+ }, /* @__PURE__ */ import_react17.default.createElement("div", {
726
+ className: (0, import_classnames9.default)("hidden", colCls)
727
+ }, leftRenderer && leftRenderer()), /* @__PURE__ */ import_react17.default.createElement("div", {
728
+ className: (0, import_classnames9.default)(colCls, "sm:px-128 xl:px-0 no-scrollbar", "relative", {
646
729
  hidden: !middleRenderer
647
730
  })
648
- }, middleRenderer && middleRenderer()), /* @__PURE__ */ import_react16.default.createElement("div", {
649
- className: (0, import_classnames8.default)("hidden", colCls)
731
+ }, middleRenderer && middleRenderer()), /* @__PURE__ */ import_react17.default.createElement("div", {
732
+ className: (0, import_classnames9.default)("hidden", colCls)
650
733
  }, rightRenderer && rightRenderer()));
651
734
  };
652
-
653
- // src/list/list.tsx
654
- var import_classnames9 = __toESM(require("classnames"));
655
- var import_react17 = __toESM(require("react"));
656
- var List = (props) => {
657
- const { items, itemRenderer, className, horizontal, compact } = props;
658
- const spaceCls = compact ? "" : horizontal ? "mr-3" : "mb-4";
659
- return /* @__PURE__ */ import_react17.default.createElement("ul", {
660
- className: (0, import_classnames9.default)(className, "list-style-none", {
661
- flex: horizontal,
662
- "align-center": horizontal
663
- })
664
- }, items.map((item, index) => {
665
- return /* @__PURE__ */ import_react17.default.createElement("li", {
666
- key: item.id || index,
667
- className: (0, import_classnames9.default)(spaceCls, "flex-shrink-0")
668
- }, itemRenderer(item, index));
669
- }));
670
- };
671
735
  module.exports = __toCommonJS(src_exports);
672
736
  // Annotate the CommonJS export names for ESM import in node:
673
737
  0 && (module.exports = {
674
738
  Article,
739
+ ArticleSkeleton,
675
740
  BlinkDot,
676
741
  Breadcrumb,
677
742
  Button,
@@ -679,6 +744,8 @@ module.exports = __toCommonJS(src_exports);
679
744
  DropImage,
680
745
  Link,
681
746
  LinkColor,
747
+ LinkList,
748
+ LinkListSkeleton,
682
749
  List,
683
750
  Logo,
684
751
  Nav,
@@ -690,5 +757,6 @@ module.exports = __toCommonJS(src_exports);
690
757
  Table,
691
758
  Tag,
692
759
  Tags,
693
- ThreeColLayout
760
+ ThreeColLayout,
761
+ TitledList
694
762
  });
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";
@@ -366,6 +442,9 @@ var useDropImage = (params) => {
366
442
  ev.preventDefault();
367
443
  setIsDragOver(false);
368
444
  const file = ev.dataTransfer.files[0];
445
+ if (!file || !file.type.startsWith("image")) {
446
+ return;
447
+ }
369
448
  imageFile.current = file;
370
449
  setPreviewImageSrcByFile(file);
371
450
  onDrop(ev, file);
@@ -419,8 +498,8 @@ var ImagePreviewer = (props) => {
419
498
  imageSrc,
420
499
  className
421
500
  } = props;
422
- return /* @__PURE__ */ React13.createElement("img", {
423
- className: cls(className, "max-w-[100%]", "h-[auto]", "duration-300", "transition-opacity", "opacity-100", {
501
+ return /* @__PURE__ */ React14.createElement("img", {
502
+ className: cls2(className, "max-w-[100%]", "h-[auto]", "duration-300", "transition-opacity", "opacity-100", {
424
503
  "opacity-0": !showImagePreviewer,
425
504
  "!m-0": !showImagePreviewer,
426
505
  "!p-0": !showImagePreviewer
@@ -474,13 +553,13 @@ var GhostDropImage = (props) => {
474
553
  document.removeEventListener("dragenter", handleDocDragEnter);
475
554
  };
476
555
  }, []);
477
- const coverCls = cls("fixed", "top-0", "left-0", "h-full", "w-full", {
556
+ const coverCls = cls2("fixed", "top-0", "left-0", "h-full", "w-full", {
478
557
  "lqip-blur": coverVisible,
479
558
  "z-[999]": coverVisible,
480
559
  block: coverVisible,
481
560
  hidden: !coverVisible
482
561
  });
483
- return /* @__PURE__ */ React13.createElement(React13.Fragment, null, /* @__PURE__ */ React13.createElement("div", {
562
+ return /* @__PURE__ */ React14.createElement(React14.Fragment, null, /* @__PURE__ */ React14.createElement("div", {
484
563
  className: coverCls,
485
564
  onDragLeave: () => {
486
565
  handleDragLeave();
@@ -493,7 +572,7 @@ var GhostDropImage = (props) => {
493
572
  imageRef,
494
573
  imageSize,
495
574
  imageSrc
496
- }) : /* @__PURE__ */ React13.createElement(ImagePreviewer, {
575
+ }) : /* @__PURE__ */ React14.createElement(ImagePreviewer, {
497
576
  className,
498
577
  visible: imageVisible,
499
578
  imageRef,
@@ -519,7 +598,7 @@ var DropImage = (props) => {
519
598
  }
520
599
  } = props;
521
600
  if (ghost) {
522
- return /* @__PURE__ */ React13.createElement(GhostDropImage, __spreadValues({}, props));
601
+ return /* @__PURE__ */ React14.createElement(GhostDropImage, __spreadValues({}, props));
523
602
  }
524
603
  const [showImagePreviewer, setShowImagePreviewer] = useState3(false);
525
604
  const {
@@ -550,8 +629,8 @@ var DropImage = (props) => {
550
629
  height: imageSize.height || dropAreaStyle.height
551
630
  });
552
631
  };
553
- return /* @__PURE__ */ React13.createElement("div", {
554
- className: cls(className, "transition-all items-center justify-center flex duration-200 ease-in-out", {
632
+ return /* @__PURE__ */ React14.createElement("div", {
633
+ className: cls2(className, "transition-all items-center justify-center flex duration-200 ease-in-out", {
555
634
  "shadow-input": !imageSrc,
556
635
  "shadow-empty": imageSrc
557
636
  }),
@@ -564,7 +643,7 @@ var DropImage = (props) => {
564
643
  imageRef,
565
644
  imageSize,
566
645
  imageSrc
567
- }) : /* @__PURE__ */ React13.createElement(ImagePreviewer, {
646
+ }) : /* @__PURE__ */ React14.createElement(ImagePreviewer, {
568
647
  visible: showImagePreviewer,
569
648
  imageRef,
570
649
  imageSrc,
@@ -574,55 +653,37 @@ var DropImage = (props) => {
574
653
 
575
654
  // src/blink-dot/BlinkDot.tsx
576
655
  import classNames6 from "classnames";
577
- import React14 from "react";
656
+ import React15 from "react";
578
657
  var BlinkDot = (props) => {
579
658
  const { className } = props;
580
- return /* @__PURE__ */ React14.createElement("span", {
659
+ return /* @__PURE__ */ React15.createElement("span", {
581
660
  className: classNames6("inline-flex h-1 w-1 justify-center items-center relative", className)
582
- }, /* @__PURE__ */ React14.createElement("span", {
661
+ }, /* @__PURE__ */ React15.createElement("span", {
583
662
  className: "animate-ping-fast absolute inline-flex h-full w-full rounded-full bg-red-600"
584
663
  }));
585
664
  };
586
665
 
587
666
  // src/layout/layout.tsx
588
- import cls2 from "classnames";
589
- import React15 from "react";
667
+ import cls3 from "classnames";
668
+ import React16 from "react";
590
669
  var ThreeColLayout = (props) => {
591
670
  const { leftRenderer, middleRenderer, rightRenderer } = props;
592
- const colCls = cls2("max-h-full overflow-auto md:block py-64");
593
- return /* @__PURE__ */ React15.createElement("div", {
671
+ const colCls = cls3("max-h-full overflow-auto md:block py-64");
672
+ return /* @__PURE__ */ React16.createElement("div", {
594
673
  className: "grid grid-cols-1 xl:grid-cols-3 gap-4 h-full w-full"
595
- }, /* @__PURE__ */ React15.createElement("div", {
596
- className: cls2("hidden", colCls)
597
- }, leftRenderer && leftRenderer()), /* @__PURE__ */ React15.createElement("div", {
598
- className: cls2(colCls, "sm:px-128 xl:px-0 no-scrollbar", "relative", {
674
+ }, /* @__PURE__ */ React16.createElement("div", {
675
+ className: cls3("hidden", colCls)
676
+ }, leftRenderer && leftRenderer()), /* @__PURE__ */ React16.createElement("div", {
677
+ className: cls3(colCls, "sm:px-128 xl:px-0 no-scrollbar", "relative", {
599
678
  hidden: !middleRenderer
600
679
  })
601
- }, middleRenderer && middleRenderer()), /* @__PURE__ */ React15.createElement("div", {
602
- className: cls2("hidden", colCls)
680
+ }, middleRenderer && middleRenderer()), /* @__PURE__ */ React16.createElement("div", {
681
+ className: cls3("hidden", colCls)
603
682
  }, rightRenderer && rightRenderer()));
604
683
  };
605
-
606
- // src/list/list.tsx
607
- import cls3 from "classnames";
608
- import React16 from "react";
609
- var List = (props) => {
610
- const { items, itemRenderer, className, horizontal, compact } = props;
611
- const spaceCls = compact ? "" : horizontal ? "mr-3" : "mb-4";
612
- return /* @__PURE__ */ React16.createElement("ul", {
613
- className: cls3(className, "list-style-none", {
614
- flex: horizontal,
615
- "align-center": horizontal
616
- })
617
- }, items.map((item, index) => {
618
- return /* @__PURE__ */ React16.createElement("li", {
619
- key: item.id || index,
620
- className: cls3(spaceCls, "flex-shrink-0")
621
- }, itemRenderer(item, index));
622
- }));
623
- };
624
684
  export {
625
685
  Article,
686
+ ArticleSkeleton,
626
687
  BlinkDot,
627
688
  Breadcrumb,
628
689
  Button,
@@ -630,6 +691,8 @@ export {
630
691
  DropImage,
631
692
  Link,
632
693
  LinkColor,
694
+ LinkList,
695
+ LinkListSkeleton,
633
696
  List,
634
697
  Logo,
635
698
  Nav,
@@ -641,5 +704,6 @@ export {
641
704
  Table,
642
705
  Tag,
643
706
  Tags,
644
- ThreeColLayout
707
+ ThreeColLayout,
708
+ TitledList
645
709
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bbki.ng/components",
3
- "version": "1.5.8",
3
+ "version": "1.5.11",
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
- }