hive-react-kit 0.5.0 → 0.5.3

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
@@ -65,6 +65,10 @@ import type { Video, Comment, Wallet as WalletType } from 'hive-react-kit/types'
65
65
  - **CommunityMembers** - Community members list
66
66
  - **CommunityTeam** - Community team members
67
67
 
68
+ ### Composer Components
69
+
70
+ - **PostComposer** - Rich markdown composer with live preview (@snapie/renderer), image/audio/video upload, paste & drag-drop, GIF search, emoji picker (500+, 9 categories), template picker, code blocks with copy, and @ mention. See [PostComposer docs](docs/PostComposer.md)
71
+
68
72
  ### Modal Components
69
73
 
70
74
  - **CommentsModal** - Comments display modal
@@ -86,11 +90,16 @@ import type { Video, Comment, Wallet as WalletType } from 'hive-react-kit/types'
86
90
  ```tsx
87
91
  import { UserDetailProfile } from 'hive-react-kit';
88
92
 
89
- // All tabs, default order
93
+ // All tabs, default order, with rich comment composer
90
94
  <UserDetailProfile
91
95
  username="sagarkothari88"
92
96
  currentUsername="myaccount"
93
97
  showBackButton
98
+ ecencyToken="your-ecency-token"
99
+ threeSpeakApiKey="your-3speak-api-key"
100
+ giphyApiKey="your-giphy-api-key"
101
+ templateToken="your-jwt-token"
102
+ templateApiBaseUrl="https://your-api.com/data/templates"
94
103
  onBack={() => navigate(-1)}
95
104
  onFollow={(user) => console.log("Follow:", user)}
96
105
  onUnfollow={(user) => console.log("Unfollow:", user)}
@@ -115,6 +124,11 @@ import { UserDetailProfile } from 'hive-react-kit';
115
124
  | `showBackButton` | `boolean` | `false` | Show back arrow in header |
116
125
  | `onBack` | `() => void` | - | Callback when back button is clicked |
117
126
  | `tabShown` | `TabType[]` | all tabs | Controls which tabs are visible and their order. Only listed tabs are shown. First tab is the default active tab. If omitted, all 12 tabs are shown in default order |
127
+ | `ecencyToken` | `string` | `undefined` | Ecency image hosting token. Enables image upload, video thumbnail upload, and paste/drag-drop image upload. Hidden when not provided |
128
+ | `threeSpeakApiKey` | `string` | `undefined` | 3Speak API key. Enables audio recording/upload and video upload (TUS protocol). Hidden when not provided |
129
+ | `giphyApiKey` | `string` | `undefined` | GIPHY API key. Enables GIF search. Hidden when not provided |
130
+ | `templateToken` | `string` | `undefined` | HReplier API JWT token. Enables template picker. Hidden when not provided |
131
+ | `templateApiBaseUrl` | `string` | `https://hreplier-api...` | Custom template API endpoint. Override when self-hosting |
118
132
 
119
133
  **Social Action Callbacks**
120
134
 
package/dist/build.css CHANGED
@@ -82,6 +82,7 @@
82
82
  --color-gray-700: oklch(37.3% 0.034 259.733);
83
83
  --color-gray-800: oklch(27.8% 0.033 256.848);
84
84
  --color-gray-900: oklch(21% 0.034 264.665);
85
+ --color-gray-950: oklch(13% 0.028 261.692);
85
86
  --color-black: #000;
86
87
  --color-white: #fff;
87
88
  --spacing: 0.25rem;
@@ -386,6 +387,9 @@
386
387
  .left-2 {
387
388
  left: calc(var(--spacing) * 2);
388
389
  }
390
+ .left-2\.5 {
391
+ left: calc(var(--spacing) * 2.5);
392
+ }
389
393
  .left-3 {
390
394
  left: calc(var(--spacing) * 3);
391
395
  }
@@ -449,6 +453,9 @@
449
453
  .m-2 {
450
454
  margin: calc(var(--spacing) * 2);
451
455
  }
456
+ .mx-1 {
457
+ margin-inline: calc(var(--spacing) * 1);
458
+ }
452
459
  .mx-2 {
453
460
  margin-inline: calc(var(--spacing) * 2);
454
461
  }
@@ -590,6 +597,9 @@
590
597
  .h-1 {
591
598
  height: calc(var(--spacing) * 1);
592
599
  }
600
+ .h-1\.5 {
601
+ height: calc(var(--spacing) * 1.5);
602
+ }
593
603
  .h-2 {
594
604
  height: calc(var(--spacing) * 2);
595
605
  }
@@ -641,6 +651,9 @@
641
651
  .h-32 {
642
652
  height: calc(var(--spacing) * 32);
643
653
  }
654
+ .h-36 {
655
+ height: calc(var(--spacing) * 36);
656
+ }
644
657
  .h-48 {
645
658
  height: calc(var(--spacing) * 48);
646
659
  }
@@ -650,6 +663,9 @@
650
663
  .h-\[90vh\] {
651
664
  height: 90vh;
652
665
  }
666
+ .h-\[400px\] {
667
+ height: 400px;
668
+ }
653
669
  .h-auto {
654
670
  height: auto;
655
671
  }
@@ -665,6 +681,9 @@
665
681
  .max-h-20 {
666
682
  max-height: calc(var(--spacing) * 20);
667
683
  }
684
+ .max-h-64 {
685
+ max-height: calc(var(--spacing) * 64);
686
+ }
668
687
  .max-h-96 {
669
688
  max-height: calc(var(--spacing) * 96);
670
689
  }
@@ -695,6 +714,9 @@
695
714
  .max-h-screen {
696
715
  max-height: 100vh;
697
716
  }
717
+ .min-h-0 {
718
+ min-height: calc(var(--spacing) * 0);
719
+ }
698
720
  .min-h-\[60px\] {
699
721
  min-height: 60px;
700
722
  }
@@ -779,6 +801,9 @@
779
801
  .w-32 {
780
802
  width: calc(var(--spacing) * 32);
781
803
  }
804
+ .w-36 {
805
+ width: calc(var(--spacing) * 36);
806
+ }
782
807
  .w-40 {
783
808
  width: calc(var(--spacing) * 40);
784
809
  }
@@ -797,6 +822,9 @@
797
822
  .w-full {
798
823
  width: 100%;
799
824
  }
825
+ .w-px {
826
+ width: 1px;
827
+ }
800
828
  .max-w-2xl {
801
829
  max-width: var(--container-2xl);
802
830
  }
@@ -905,8 +933,8 @@
905
933
  .resize {
906
934
  resize: both;
907
935
  }
908
- .resize-none {
909
- resize: none;
936
+ .resize-y {
937
+ resize: vertical;
910
938
  }
911
939
  .appearance-none {
912
940
  appearance: none;
@@ -926,6 +954,9 @@
926
954
  .grid-cols-5 {
927
955
  grid-template-columns: repeat(5, minmax(0, 1fr));
928
956
  }
957
+ .grid-cols-8 {
958
+ grid-template-columns: repeat(8, minmax(0, 1fr));
959
+ }
929
960
  .flex-col {
930
961
  flex-direction: column;
931
962
  }
@@ -1119,6 +1150,10 @@
1119
1150
  border-style: var(--tw-border-style);
1120
1151
  border-width: 1px;
1121
1152
  }
1153
+ .border-0 {
1154
+ border-style: var(--tw-border-style);
1155
+ border-width: 0px;
1156
+ }
1122
1157
  .border-2 {
1123
1158
  border-style: var(--tw-border-style);
1124
1159
  border-width: 2px;
@@ -1151,6 +1186,10 @@
1151
1186
  border-left-style: var(--tw-border-style);
1152
1187
  border-left-width: 4px;
1153
1188
  }
1189
+ .border-dashed {
1190
+ --tw-border-style: dashed;
1191
+ border-style: dashed;
1192
+ }
1154
1193
  .border-amber-700\/40 {
1155
1194
  border-color: color-mix(in srgb, oklch(55.5% 0.163 48.998) 40%, transparent);
1156
1195
  @supports (color: color-mix(in lab, red, red)) {
@@ -1289,6 +1328,12 @@
1289
1328
  background-color: color-mix(in oklab, var(--color-black) 80%, transparent);
1290
1329
  }
1291
1330
  }
1331
+ .bg-black\/90 {
1332
+ background-color: color-mix(in srgb, #000 90%, transparent);
1333
+ @supports (color: color-mix(in lab, red, red)) {
1334
+ background-color: color-mix(in oklab, var(--color-black) 90%, transparent);
1335
+ }
1336
+ }
1292
1337
  .bg-blue-100 {
1293
1338
  background-color: var(--color-blue-100);
1294
1339
  }
@@ -1307,15 +1352,33 @@
1307
1352
  .bg-blue-600 {
1308
1353
  background-color: var(--color-blue-600);
1309
1354
  }
1355
+ .bg-blue-600\/20 {
1356
+ background-color: color-mix(in srgb, oklch(54.6% 0.245 262.881) 20%, transparent);
1357
+ @supports (color: color-mix(in lab, red, red)) {
1358
+ background-color: color-mix(in oklab, var(--color-blue-600) 20%, transparent);
1359
+ }
1360
+ }
1310
1361
  .bg-blue-900 {
1311
1362
  background-color: var(--color-blue-900);
1312
1363
  }
1364
+ .bg-blue-900\/10 {
1365
+ background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 10%, transparent);
1366
+ @supports (color: color-mix(in lab, red, red)) {
1367
+ background-color: color-mix(in oklab, var(--color-blue-900) 10%, transparent);
1368
+ }
1369
+ }
1313
1370
  .bg-blue-900\/20 {
1314
1371
  background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 20%, transparent);
1315
1372
  @supports (color: color-mix(in lab, red, red)) {
1316
1373
  background-color: color-mix(in oklab, var(--color-blue-900) 20%, transparent);
1317
1374
  }
1318
1375
  }
1376
+ .bg-blue-900\/30 {
1377
+ background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 30%, transparent);
1378
+ @supports (color: color-mix(in lab, red, red)) {
1379
+ background-color: color-mix(in oklab, var(--color-blue-900) 30%, transparent);
1380
+ }
1381
+ }
1319
1382
  .bg-blue-900\/40 {
1320
1383
  background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 40%, transparent);
1321
1384
  @supports (color: color-mix(in lab, red, red)) {
@@ -1364,6 +1427,12 @@
1364
1427
  .bg-gray-800 {
1365
1428
  background-color: var(--color-gray-800);
1366
1429
  }
1430
+ .bg-gray-800\/50 {
1431
+ background-color: color-mix(in srgb, oklch(27.8% 0.033 256.848) 50%, transparent);
1432
+ @supports (color: color-mix(in lab, red, red)) {
1433
+ background-color: color-mix(in oklab, var(--color-gray-800) 50%, transparent);
1434
+ }
1435
+ }
1367
1436
  .bg-gray-800\/95 {
1368
1437
  background-color: color-mix(in srgb, oklch(27.8% 0.033 256.848) 95%, transparent);
1369
1438
  @supports (color: color-mix(in lab, red, red)) {
@@ -1385,6 +1454,9 @@
1385
1454
  background-color: color-mix(in oklab, var(--color-gray-900) 80%, transparent);
1386
1455
  }
1387
1456
  }
1457
+ .bg-gray-950 {
1458
+ background-color: var(--color-gray-950);
1459
+ }
1388
1460
  .bg-green-100 {
1389
1461
  background-color: var(--color-green-100);
1390
1462
  }
@@ -1436,6 +1508,9 @@
1436
1508
  .bg-red-100 {
1437
1509
  background-color: var(--color-red-100);
1438
1510
  }
1511
+ .bg-red-500 {
1512
+ background-color: var(--color-red-500);
1513
+ }
1439
1514
  .bg-red-500\/10 {
1440
1515
  background-color: color-mix(in srgb, oklch(63.7% 0.237 25.331) 10%, transparent);
1441
1516
  @supports (color: color-mix(in lab, red, red)) {
@@ -1687,6 +1762,12 @@
1687
1762
  .pr-10 {
1688
1763
  padding-right: calc(var(--spacing) * 10);
1689
1764
  }
1765
+ .pb-1 {
1766
+ padding-bottom: calc(var(--spacing) * 1);
1767
+ }
1768
+ .pb-2 {
1769
+ padding-bottom: calc(var(--spacing) * 2);
1770
+ }
1690
1771
  .pb-3 {
1691
1772
  padding-bottom: calc(var(--spacing) * 3);
1692
1773
  }
@@ -1708,6 +1789,9 @@
1708
1789
  .pl-6 {
1709
1790
  padding-left: calc(var(--spacing) * 6);
1710
1791
  }
1792
+ .pl-8 {
1793
+ padding-left: calc(var(--spacing) * 8);
1794
+ }
1711
1795
  .pl-10 {
1712
1796
  padding-left: calc(var(--spacing) * 10);
1713
1797
  }
@@ -1968,6 +2052,9 @@
1968
2052
  .capitalize {
1969
2053
  text-transform: capitalize;
1970
2054
  }
2055
+ .normal-case {
2056
+ text-transform: none;
2057
+ }
1971
2058
  .uppercase {
1972
2059
  text-transform: uppercase;
1973
2060
  }
@@ -2023,6 +2110,10 @@
2023
2110
  --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
2024
2111
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2025
2112
  }
2113
+ .ring-1 {
2114
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
2115
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2116
+ }
2026
2117
  .ring-2 {
2027
2118
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
2028
2119
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -2033,6 +2124,9 @@
2033
2124
  --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-blue-500) 10%, transparent) var(--tw-shadow-alpha), transparent);
2034
2125
  }
2035
2126
  }
2127
+ .ring-blue-500 {
2128
+ --tw-ring-color: var(--color-blue-500);
2129
+ }
2036
2130
  .ring-gray-200 {
2037
2131
  --tw-ring-color: var(--color-gray-200);
2038
2132
  }
@@ -2091,6 +2185,10 @@
2091
2185
  --tw-duration: 300ms;
2092
2186
  transition-duration: 300ms;
2093
2187
  }
2188
+ .duration-1000 {
2189
+ --tw-duration: 1000ms;
2190
+ transition-duration: 1000ms;
2191
+ }
2094
2192
  .ease-in-out {
2095
2193
  --tw-ease: var(--ease-in-out);
2096
2194
  transition-timing-function: var(--ease-in-out);
@@ -2129,6 +2227,13 @@
2129
2227
  }
2130
2228
  }
2131
2229
  }
2230
+ .group-hover\:text-blue-400 {
2231
+ &:is(:where(.group):hover *) {
2232
+ @media (hover: hover) {
2233
+ color: var(--color-blue-400);
2234
+ }
2235
+ }
2236
+ }
2132
2237
  .group-hover\:opacity-30 {
2133
2238
  &:is(:where(.group):hover *) {
2134
2239
  @media (hover: hover) {
@@ -2202,6 +2307,16 @@
2202
2307
  }
2203
2308
  }
2204
2309
  }
2310
+ .hover\:border-blue-500\/40 {
2311
+ &:hover {
2312
+ @media (hover: hover) {
2313
+ border-color: color-mix(in srgb, oklch(62.3% 0.214 259.815) 40%, transparent);
2314
+ @supports (color: color-mix(in lab, red, red)) {
2315
+ border-color: color-mix(in oklab, var(--color-blue-500) 40%, transparent);
2316
+ }
2317
+ }
2318
+ }
2319
+ }
2205
2320
  .hover\:border-gray-600 {
2206
2321
  &:hover {
2207
2322
  @media (hover: hover) {
@@ -2306,6 +2421,16 @@
2306
2421
  }
2307
2422
  }
2308
2423
  }
2424
+ .hover\:bg-gray-800\/80 {
2425
+ &:hover {
2426
+ @media (hover: hover) {
2427
+ background-color: color-mix(in srgb, oklch(27.8% 0.033 256.848) 80%, transparent);
2428
+ @supports (color: color-mix(in lab, red, red)) {
2429
+ background-color: color-mix(in oklab, var(--color-gray-800) 80%, transparent);
2430
+ }
2431
+ }
2432
+ }
2433
+ }
2309
2434
  .hover\:bg-green-700 {
2310
2435
  &:hover {
2311
2436
  @media (hover: hover) {
@@ -2453,13 +2578,6 @@
2453
2578
  }
2454
2579
  }
2455
2580
  }
2456
- .hover\:text-gray-800 {
2457
- &:hover {
2458
- @media (hover: hover) {
2459
- color: var(--color-gray-800);
2460
- }
2461
- }
2462
- }
2463
2581
  .hover\:text-gray-900 {
2464
2582
  &:hover {
2465
2583
  @media (hover: hover) {
@@ -2481,6 +2599,13 @@
2481
2599
  }
2482
2600
  }
2483
2601
  }
2602
+ .hover\:text-red-400 {
2603
+ &:hover {
2604
+ @media (hover: hover) {
2605
+ color: var(--color-red-400);
2606
+ }
2607
+ }
2608
+ }
2484
2609
  .hover\:text-red-600 {
2485
2610
  &:hover {
2486
2611
  @media (hover: hover) {
@@ -2525,11 +2650,32 @@
2525
2650
  }
2526
2651
  }
2527
2652
  }
2653
+ .hover\:ring-2 {
2654
+ &:hover {
2655
+ @media (hover: hover) {
2656
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
2657
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2658
+ }
2659
+ }
2660
+ }
2661
+ .hover\:ring-blue-500 {
2662
+ &:hover {
2663
+ @media (hover: hover) {
2664
+ --tw-ring-color: var(--color-blue-500);
2665
+ }
2666
+ }
2667
+ }
2528
2668
  .focus\:border-blue-500 {
2529
2669
  &:focus {
2530
2670
  border-color: var(--color-blue-500);
2531
2671
  }
2532
2672
  }
2673
+ .focus\:ring-1 {
2674
+ &:focus {
2675
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
2676
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2677
+ }
2678
+ }
2533
2679
  .focus\:ring-2 {
2534
2680
  &:focus {
2535
2681
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
@@ -2555,14 +2701,17 @@
2555
2701
  outline-style: none;
2556
2702
  }
2557
2703
  }
2558
- .disabled\:pointer-events-none {
2559
- &:disabled {
2560
- pointer-events: none;
2704
+ .active\:scale-95 {
2705
+ &:active {
2706
+ --tw-scale-x: 95%;
2707
+ --tw-scale-y: 95%;
2708
+ --tw-scale-z: 95%;
2709
+ scale: var(--tw-scale-x) var(--tw-scale-y);
2561
2710
  }
2562
2711
  }
2563
- .disabled\:transform-none {
2712
+ .disabled\:pointer-events-none {
2564
2713
  &:disabled {
2565
- transform: none;
2714
+ pointer-events: none;
2566
2715
  }
2567
2716
  }
2568
2717
  .disabled\:cursor-not-allowed {
@@ -2575,9 +2724,9 @@
2575
2724
  background-color: var(--color-blue-400);
2576
2725
  }
2577
2726
  }
2578
- .disabled\:bg-gray-300 {
2727
+ .disabled\:bg-gray-700 {
2579
2728
  &:disabled {
2580
- background-color: var(--color-gray-300);
2729
+ background-color: var(--color-gray-700);
2581
2730
  }
2582
2731
  }
2583
2732
  .disabled\:opacity-50 {
@@ -2668,6 +2817,11 @@
2668
2817
  height: calc(var(--spacing) * 32);
2669
2818
  }
2670
2819
  }
2820
+ .sm\:h-44 {
2821
+ @media (width >= 40rem) {
2822
+ height: calc(var(--spacing) * 44);
2823
+ }
2824
+ }
2671
2825
  .sm\:w-4 {
2672
2826
  @media (width >= 40rem) {
2673
2827
  width: calc(var(--spacing) * 4);
@@ -2948,6 +3102,11 @@
2948
3102
  padding: calc(var(--spacing) * 6);
2949
3103
  }
2950
3104
  }
3105
+ .md\:p-8 {
3106
+ @media (width >= 48rem) {
3107
+ padding: calc(var(--spacing) * 8);
3108
+ }
3109
+ }
2951
3110
  .md\:px-6 {
2952
3111
  @media (width >= 48rem) {
2953
3112
  padding-inline: calc(var(--spacing) * 6);
@@ -3119,11 +3278,6 @@
3119
3278
  }
3120
3279
  }
3121
3280
  }
3122
- .dark\:bg-gray-600 {
3123
- @media (prefers-color-scheme: dark) {
3124
- background-color: var(--color-gray-600);
3125
- }
3126
- }
3127
3281
  .dark\:bg-gray-700 {
3128
3282
  @media (prefers-color-scheme: dark) {
3129
3283
  background-color: var(--color-gray-700);
@@ -3362,15 +3516,6 @@
3362
3516
  }
3363
3517
  }
3364
3518
  }
3365
- .dark\:hover\:text-gray-200 {
3366
- @media (prefers-color-scheme: dark) {
3367
- &:hover {
3368
- @media (hover: hover) {
3369
- color: var(--color-gray-200);
3370
- }
3371
- }
3372
- }
3373
- }
3374
3519
  .dark\:hover\:text-gray-300 {
3375
3520
  @media (prefers-color-scheme: dark) {
3376
3521
  &:hover {
@@ -3416,13 +3561,6 @@
3416
3561
  }
3417
3562
  }
3418
3563
  }
3419
- .dark\:disabled\:bg-gray-600 {
3420
- @media (prefers-color-scheme: dark) {
3421
- &:disabled {
3422
- background-color: var(--color-gray-600);
3423
- }
3424
- }
3425
- }
3426
3564
  .\[\&\:\:-moz-range-progress\]\:rounded-lg {
3427
3565
  &::-moz-range-progress {
3428
3566
  border-radius: var(--radius-lg);
@@ -30,6 +30,16 @@ export interface PostActionButtonProps {
30
30
  onReport?: () => void;
31
31
  /** Called when user confirms comment upvote with (author, permlink, percent). Frontend handles signing. Voted comments show icon in blue. */
32
32
  onClickCommentUpvote?: (author: string, permlink: string, percent: number) => void | Promise<void>;
33
+ /** Ecency image hosting token — enables image upload in comment composer */
34
+ ecencyToken?: string;
35
+ /** 3Speak API key — enables audio/video upload in comment composer */
36
+ threeSpeakApiKey?: string;
37
+ /** GIPHY API key — enables GIF search in comment composer */
38
+ giphyApiKey?: string;
39
+ /** HReplier API token — enables template picker in comment composer */
40
+ templateToken?: string;
41
+ /** Custom template API endpoint */
42
+ templateApiBaseUrl?: string;
33
43
  }
34
- export declare function PostActionButton({ author, permlink, currentUser: currentUserProp, hiveValue, hiveIconUrl, payoutTooltip, initialVotes, initialCommentsCount, onUpvote, onSubmitComment, onComments, onReblog, onShare, onTip, onReport, onClickCommentUpvote, }: PostActionButtonProps): import("react/jsx-runtime").JSX.Element;
44
+ export declare function PostActionButton({ author, permlink, currentUser: currentUserProp, hiveValue, hiveIconUrl, payoutTooltip, initialVotes, initialCommentsCount, onUpvote, onSubmitComment, onComments, onReblog, onShare, onTip, onReport, onClickCommentUpvote, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, }: PostActionButtonProps): import("react/jsx-runtime").JSX.Element;
35
45
  export default PostActionButton;
@@ -1,10 +1,46 @@
1
- interface AddCommentInputProps {
1
+ export interface PostComposerProps {
2
2
  onSubmit: (body: string) => void;
3
- onCancel: () => void;
3
+ onCancel?: () => void;
4
4
  currentUser?: string;
5
5
  placeholder?: string;
6
6
  parentAuthor?: string;
7
7
  parentPermlink?: string;
8
+ /** Ecency image hosting token — enables image/video thumbnail upload and paste/drag upload */
9
+ ecencyToken?: string;
10
+ /** 3Speak API key — enables audio and video upload */
11
+ threeSpeakApiKey?: string;
12
+ /** GIPHY API key — enables GIF search */
13
+ giphyApiKey?: string;
14
+ /** HReplier API token — enables template picker */
15
+ templateToken?: string;
16
+ /** Custom template API endpoint (defaults to https://hreplier-api.sagarkothari88.one/data/templates) */
17
+ templateApiBaseUrl?: string;
18
+ /** Hide individual toolbar features */
19
+ hideBold?: boolean;
20
+ hideItalic?: boolean;
21
+ hideLink?: boolean;
22
+ hideImage?: boolean;
23
+ hideAudio?: boolean;
24
+ hideVideo?: boolean;
25
+ hideEmoji?: boolean;
26
+ hideGif?: boolean;
27
+ hideCode?: boolean;
28
+ hideMention?: boolean;
29
+ hideTemplate?: boolean;
30
+ hidePreview?: boolean;
31
+ /** Show cancel button (default true) */
32
+ showCancel?: boolean;
33
+ /** Submit button label (default "Post") */
34
+ submitLabel?: string;
35
+ /** Title text above composer (optional) */
36
+ title?: string;
37
+ /** Enable preview by default (default false) */
38
+ defaultPreviewOn?: boolean;
8
39
  }
9
- declare const AddCommentInput: ({ onSubmit, onCancel, currentUser, placeholder, parentAuthor, parentPermlink }: AddCommentInputProps) => import("react/jsx-runtime").JSX.Element;
40
+ /** @deprecated Use PostComposerProps instead */
41
+ export type AddCommentInputProps = PostComposerProps;
42
+ declare const PostComposer: ({ onSubmit, onCancel, currentUser, placeholder, parentAuthor, parentPermlink, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, hideBold, hideItalic, hideLink, hideImage, hideAudio, hideVideo, hideEmoji, hideGif, hideCode, hideMention, hideTemplate, hidePreview, showCancel, submitLabel, title, defaultPreviewOn, }: PostComposerProps) => import("react/jsx-runtime").JSX.Element;
43
+ /** @deprecated Use PostComposer instead */
44
+ declare const AddCommentInput: ({ onSubmit, onCancel, currentUser, placeholder, parentAuthor, parentPermlink, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, hideBold, hideItalic, hideLink, hideImage, hideAudio, hideVideo, hideEmoji, hideGif, hideCode, hideMention, hideTemplate, hidePreview, showCancel, submitLabel, title, defaultPreviewOn, }: PostComposerProps) => import("react/jsx-runtime").JSX.Element;
45
+ export { PostComposer };
10
46
  export default AddCommentInput;
@@ -11,6 +11,16 @@ interface CommentsModalProps {
11
11
  onClickUpvoteButton?: (currentUser?: string, token?: string) => void;
12
12
  /** When provided, used instead of apiService.handleComment (e.g. for aioha wallet) */
13
13
  onSubmitComment?: (parentAuthor: string, parentPermlink: string, body: string) => Promise<void>;
14
+ /** Ecency image hosting token — enables image upload in comment composer */
15
+ ecencyToken?: string;
16
+ /** 3Speak API key — enables audio/video upload in comment composer */
17
+ threeSpeakApiKey?: string;
18
+ /** GIPHY API key — enables GIF search in comment composer */
19
+ giphyApiKey?: string;
20
+ /** HReplier API token — enables template picker in comment composer */
21
+ templateToken?: string;
22
+ /** Custom template API endpoint */
23
+ templateApiBaseUrl?: string;
14
24
  }
15
- declare const CommentsModal: ({ author, permlink, onClose, currentUser, token, onClickCommentUpvote, onClickCommentReply, onClickUpvoteButton, onSubmitComment }: CommentsModalProps) => import("react/jsx-runtime").JSX.Element;
25
+ declare const CommentsModal: ({ author, permlink, onClose, currentUser, token, onClickCommentUpvote, onClickCommentReply, onClickUpvoteButton, onSubmitComment, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl }: CommentsModalProps) => import("react/jsx-runtime").JSX.Element;
16
26
  export default CommentsModal;
@@ -4,6 +4,11 @@ interface ReplyModalProps {
4
4
  onClose: () => void;
5
5
  onCommentSubmitted: (parentAuthor: string, parentPermlink: string, body: string) => Promise<void>;
6
6
  currentUser?: string;
7
+ ecencyToken?: string;
8
+ threeSpeakApiKey?: string;
9
+ giphyApiKey?: string;
10
+ templateToken?: string;
11
+ templateApiBaseUrl?: string;
7
12
  }
8
- declare const ReplyModal: ({ parentAuthor, parentPermlink, onClose, onCommentSubmitted, currentUser }: ReplyModalProps) => import("react/jsx-runtime").JSX.Element;
13
+ declare const ReplyModal: ({ parentAuthor, parentPermlink, onClose, onCommentSubmitted, currentUser, ecencyToken, threeSpeakApiKey, giphyApiKey, templateToken, templateApiBaseUrl, }: ReplyModalProps) => import("react/jsx-runtime").JSX.Element;
9
14
  export default ReplyModal;
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ export interface AudioUploaderProps {
3
+ /** Called with the audio embed URL and duration in seconds */
4
+ onAudioUploaded: (audioUrl: string, durationSeconds: number) => void;
5
+ /** Hive username for the upload */
6
+ username?: string;
7
+ /** 3Speak API key. Falls back to demo key if not provided. */
8
+ threeSpeakApiKey?: string;
9
+ disabled?: boolean;
10
+ }
11
+ declare const AudioUploader: React.FC<AudioUploaderProps>;
12
+ export default AudioUploader;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export interface EmojiPickerProps {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ onSelectEmoji: (emoji: string) => void;
6
+ }
7
+ declare const EmojiPicker: React.FC<EmojiPickerProps>;
8
+ export default EmojiPicker;
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export interface GiphyPickerProps {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ onSelectGif: (gifUrl: string) => void;
6
+ /** GIPHY API key. Required for search functionality. */
7
+ giphyApiKey?: string;
8
+ }
9
+ declare const GiphyPicker: React.FC<GiphyPickerProps>;
10
+ export default GiphyPicker;
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ export interface ImageUploaderProps {
3
+ /** Called with the uploaded image URL */
4
+ onImageUploaded: (imageUrl: string) => void;
5
+ /** Ecency image hosting token for upload authentication */
6
+ ecencyToken?: string;
7
+ disabled?: boolean;
8
+ }
9
+ declare const ImageUploader: React.FC<ImageUploaderProps>;
10
+ export default ImageUploader;
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { TemplateModel } from '../../services/templateService';
3
+ export interface TemplatePickerProps {
4
+ isOpen: boolean;
5
+ onClose: () => void;
6
+ onSelectTemplate: (template: string) => void;
7
+ templates: TemplateModel[];
8
+ /** If provided, {{author}} in templates is replaced with this value */
9
+ authorFromUrl?: string;
10
+ }
11
+ declare const TemplatePicker: React.FC<TemplatePickerProps>;
12
+ export default TemplatePicker;