@papernote/ui 1.7.7 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/components/Badge.d.ts +3 -1
  2. package/dist/components/Badge.d.ts.map +1 -1
  3. package/dist/components/BottomSheet.d.ts +72 -8
  4. package/dist/components/BottomSheet.d.ts.map +1 -1
  5. package/dist/components/CompactStat.d.ts +52 -0
  6. package/dist/components/CompactStat.d.ts.map +1 -0
  7. package/dist/components/HorizontalScroll.d.ts +43 -0
  8. package/dist/components/HorizontalScroll.d.ts.map +1 -0
  9. package/dist/components/NotificationBanner.d.ts +53 -0
  10. package/dist/components/NotificationBanner.d.ts.map +1 -0
  11. package/dist/components/Progress.d.ts +2 -2
  12. package/dist/components/Progress.d.ts.map +1 -1
  13. package/dist/components/PullToRefresh.d.ts +23 -71
  14. package/dist/components/PullToRefresh.d.ts.map +1 -1
  15. package/dist/components/Stack.d.ts +2 -1
  16. package/dist/components/Stack.d.ts.map +1 -1
  17. package/dist/components/SwipeableCard.d.ts +65 -0
  18. package/dist/components/SwipeableCard.d.ts.map +1 -0
  19. package/dist/components/Text.d.ts +9 -2
  20. package/dist/components/Text.d.ts.map +1 -1
  21. package/dist/components/index.d.ts +11 -3
  22. package/dist/components/index.d.ts.map +1 -1
  23. package/dist/index.d.ts +317 -86
  24. package/dist/index.esm.js +932 -253
  25. package/dist/index.esm.js.map +1 -1
  26. package/dist/index.js +937 -252
  27. package/dist/index.js.map +1 -1
  28. package/dist/styles.css +178 -8
  29. package/package.json +1 -1
  30. package/src/components/Badge.tsx +13 -2
  31. package/src/components/BottomSheet.tsx +227 -98
  32. package/src/components/Card.tsx +1 -1
  33. package/src/components/CompactStat.tsx +150 -0
  34. package/src/components/HorizontalScroll.tsx +275 -0
  35. package/src/components/NotificationBanner.tsx +238 -0
  36. package/src/components/Progress.tsx +6 -3
  37. package/src/components/PullToRefresh.tsx +158 -196
  38. package/src/components/Stack.tsx +4 -1
  39. package/src/components/SwipeableCard.tsx +347 -0
  40. package/src/components/Text.tsx +45 -3
  41. package/src/components/index.ts +16 -3
  42. package/src/styles/index.css +32 -0
package/dist/styles.css CHANGED
@@ -2304,11 +2304,6 @@ input:checked + .slider:before{
2304
2304
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
2305
2305
  }
2306
2306
 
2307
- .translate-y-full{
2308
- --tw-translate-y: 100%;
2309
- transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
2310
- }
2311
-
2312
2307
  .-rotate-90{
2313
2308
  --tw-rotate: -90deg;
2314
2309
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
@@ -2347,9 +2342,9 @@ input:checked + .slider:before{
2347
2342
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
2348
2343
  }
2349
2344
 
2350
- .scale-75{
2351
- --tw-scale-x: .75;
2352
- --tw-scale-y: .75;
2345
+ .scale-125{
2346
+ --tw-scale-x: 1.25;
2347
+ --tw-scale-y: 1.25;
2353
2348
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
2354
2349
  }
2355
2350
 
@@ -2620,6 +2615,10 @@ input:checked + .slider:before{
2620
2615
  cursor: pointer;
2621
2616
  }
2622
2617
 
2618
+ .touch-none{
2619
+ touch-action: none;
2620
+ }
2621
+
2623
2622
  .select-none{
2624
2623
  -webkit-user-select: none;
2625
2624
  -moz-user-select: none;
@@ -2642,6 +2641,18 @@ input:checked + .slider:before{
2642
2641
  resize: both;
2643
2642
  }
2644
2643
 
2644
+ .snap-x{
2645
+ scroll-snap-type: x var(--tw-scroll-snap-strictness);
2646
+ }
2647
+
2648
+ .snap-mandatory{
2649
+ --tw-scroll-snap-strictness: mandatory;
2650
+ }
2651
+
2652
+ .snap-start{
2653
+ scroll-snap-align: start;
2654
+ }
2655
+
2645
2656
  .list-inside{
2646
2657
  list-style-position: inside;
2647
2658
  }
@@ -3460,6 +3471,11 @@ input:checked + .slider:before{
3460
3471
  background-color: rgb(214 211 209 / var(--tw-bg-opacity, 1));
3461
3472
  }
3462
3473
 
3474
+ .bg-paper-400{
3475
+ --tw-bg-opacity: 1;
3476
+ background-color: rgb(168 162 158 / var(--tw-bg-opacity, 1));
3477
+ }
3478
+
3463
3479
  .bg-paper-50{
3464
3480
  --tw-bg-opacity: 1;
3465
3481
  background-color: rgb(250 250 249 / var(--tw-bg-opacity, 1));
@@ -3856,6 +3872,10 @@ input:checked + .slider:before{
3856
3872
  padding-bottom: 4rem;
3857
3873
  }
3858
3874
 
3875
+ .pb-2{
3876
+ padding-bottom: 0.5rem;
3877
+ }
3878
+
3859
3879
  .pb-20{
3860
3880
  padding-bottom: 5rem;
3861
3881
  }
@@ -4409,6 +4429,10 @@ input:checked + .slider:before{
4409
4429
  opacity: 0.75;
4410
4430
  }
4411
4431
 
4432
+ .opacity-80{
4433
+ opacity: 0.8;
4434
+ }
4435
+
4412
4436
  .opacity-90{
4413
4437
  opacity: 0.9;
4414
4438
  }
@@ -4490,6 +4514,12 @@ input:checked + .slider:before{
4490
4514
  outline-style: solid;
4491
4515
  }
4492
4516
 
4517
+ .ring{
4518
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
4519
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
4520
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
4521
+ }
4522
+
4493
4523
  .ring-1{
4494
4524
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
4495
4525
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
@@ -4602,6 +4632,10 @@ input:checked + .slider:before{
4602
4632
  transition-duration: 150ms;
4603
4633
  }
4604
4634
 
4635
+ .transition-none{
4636
+ transition-property: none;
4637
+ }
4638
+
4605
4639
  .transition-opacity{
4606
4640
  transition-property: opacity;
4607
4641
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
@@ -4665,6 +4699,15 @@ input:checked + .slider:before{
4665
4699
  -webkit-line-clamp: 3;
4666
4700
  }
4667
4701
 
4702
+ .scrollbar-hide {
4703
+ -ms-overflow-style: none;
4704
+ scrollbar-width: none;
4705
+ }
4706
+
4707
+ .scrollbar-hide::-webkit-scrollbar {
4708
+ display: none;
4709
+ }
4710
+
4668
4711
  /* Custom scrollbar - Subtle paper aesthetic */
4669
4712
 
4670
4713
  ::-webkit-scrollbar {
@@ -4932,6 +4975,39 @@ input:checked + .slider:before{
4932
4975
  animation: slideInBottom 0.3s ease-out;
4933
4976
  }
4934
4977
 
4978
+ /* Touch-friendly sizing for coarse pointer devices (touch screens) */
4979
+
4980
+ @media (pointer: coarse) {
4981
+ /* Ensure buttons meet 48px minimum touch target on touch devices */
4982
+ .btn,
4983
+ button.touch-friendly,
4984
+ .touch-target {
4985
+ min-height: 48px;
4986
+ min-width: 48px;
4987
+ }
4988
+
4989
+ /* Larger tap targets for inputs on touch devices */
4990
+ .input,
4991
+ input[type="text"],
4992
+ input[type="email"],
4993
+ input[type="password"],
4994
+ input[type="number"],
4995
+ input[type="tel"],
4996
+ input[type="url"],
4997
+ input[type="search"],
4998
+ select,
4999
+ textarea {
5000
+ min-height: 48px;
5001
+ }
5002
+
5003
+ /* Larger checkbox/radio hit areas */
5004
+ input[type="checkbox"],
5005
+ input[type="radio"] {
5006
+ min-width: 24px;
5007
+ min-height: 24px;
5008
+ }
5009
+ }
5010
+
4935
5011
  .first\:rounded-t-lg:first-child{
4936
5012
  border-top-left-radius: 0.5rem;
4937
5013
  border-top-right-radius: 0.5rem;
@@ -5064,6 +5140,10 @@ input:checked + .slider:before{
5064
5140
  background-color: rgb(86 85 72 / var(--tw-bg-opacity, 1));
5065
5141
  }
5066
5142
 
5143
+ .hover\:bg-black\/10:hover{
5144
+ background-color: rgb(0 0 0 / 0.1);
5145
+ }
5146
+
5067
5147
  .hover\:bg-blue-50:hover{
5068
5148
  --tw-bg-opacity: 1;
5069
5149
  background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));
@@ -5134,6 +5214,11 @@ input:checked + .slider:before{
5134
5214
  background-color: rgb(231 229 228 / var(--tw-bg-opacity, 1));
5135
5215
  }
5136
5216
 
5217
+ .hover\:bg-paper-400:hover{
5218
+ --tw-bg-opacity: 1;
5219
+ background-color: rgb(168 162 158 / var(--tw-bg-opacity, 1));
5220
+ }
5221
+
5137
5222
  .hover\:bg-paper-50:hover{
5138
5223
  --tw-bg-opacity: 1;
5139
5224
  background-color: rgb(250 250 249 / var(--tw-bg-opacity, 1));
@@ -5655,10 +5740,35 @@ input:checked + .slider:before{
5655
5740
  padding-right: 2rem;
5656
5741
  }
5657
5742
 
5743
+ .sm\:text-2xl{
5744
+ font-size: 1.5rem;
5745
+ line-height: 2.25rem;
5746
+ }
5747
+
5748
+ .sm\:text-base{
5749
+ font-size: 1rem;
5750
+ line-height: 1.625rem;
5751
+ }
5752
+
5753
+ .sm\:text-lg{
5754
+ font-size: 1.125rem;
5755
+ line-height: 1.875rem;
5756
+ }
5757
+
5658
5758
  .sm\:text-sm{
5659
5759
  font-size: 0.875rem;
5660
5760
  line-height: 1.375rem;
5661
5761
  }
5762
+
5763
+ .sm\:text-xl{
5764
+ font-size: 1.25rem;
5765
+ line-height: 2rem;
5766
+ }
5767
+
5768
+ .sm\:text-xs{
5769
+ font-size: 0.75rem;
5770
+ line-height: 1.125rem;
5771
+ }
5662
5772
  }
5663
5773
 
5664
5774
  @media (min-width: 768px){
@@ -5730,6 +5840,36 @@ input:checked + .slider:before{
5730
5840
  .md\:pr-8{
5731
5841
  padding-right: 2rem;
5732
5842
  }
5843
+
5844
+ .md\:text-2xl{
5845
+ font-size: 1.5rem;
5846
+ line-height: 2.25rem;
5847
+ }
5848
+
5849
+ .md\:text-base{
5850
+ font-size: 1rem;
5851
+ line-height: 1.625rem;
5852
+ }
5853
+
5854
+ .md\:text-lg{
5855
+ font-size: 1.125rem;
5856
+ line-height: 1.875rem;
5857
+ }
5858
+
5859
+ .md\:text-sm{
5860
+ font-size: 0.875rem;
5861
+ line-height: 1.375rem;
5862
+ }
5863
+
5864
+ .md\:text-xl{
5865
+ font-size: 1.25rem;
5866
+ line-height: 2rem;
5867
+ }
5868
+
5869
+ .md\:text-xs{
5870
+ font-size: 0.75rem;
5871
+ line-height: 1.125rem;
5872
+ }
5733
5873
  }
5734
5874
 
5735
5875
  @media (min-width: 1024px){
@@ -5789,6 +5929,36 @@ input:checked + .slider:before{
5789
5929
  .lg\:pr-20{
5790
5930
  padding-right: 5rem;
5791
5931
  }
5932
+
5933
+ .lg\:text-2xl{
5934
+ font-size: 1.5rem;
5935
+ line-height: 2.25rem;
5936
+ }
5937
+
5938
+ .lg\:text-base{
5939
+ font-size: 1rem;
5940
+ line-height: 1.625rem;
5941
+ }
5942
+
5943
+ .lg\:text-lg{
5944
+ font-size: 1.125rem;
5945
+ line-height: 1.875rem;
5946
+ }
5947
+
5948
+ .lg\:text-sm{
5949
+ font-size: 0.875rem;
5950
+ line-height: 1.375rem;
5951
+ }
5952
+
5953
+ .lg\:text-xl{
5954
+ font-size: 1.25rem;
5955
+ line-height: 2rem;
5956
+ }
5957
+
5958
+ .lg\:text-xs{
5959
+ font-size: 0.75rem;
5960
+ line-height: 1.125rem;
5961
+ }
5792
5962
  }
5793
5963
 
5794
5964
  @media (min-width: 1280px){
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@papernote/ui",
3
- "version": "1.7.7",
3
+ "version": "1.8.0",
4
4
  "type": "module",
5
5
  "description": "A modern React component library with a paper notebook aesthetic - minimal, professional, and expressive",
6
6
  "main": "dist/index.js",
@@ -10,6 +10,8 @@ export interface BadgeProps {
10
10
  className?: string;
11
11
  /** Show as dot indicator (no text, just a colored dot) */
12
12
  dot?: boolean;
13
+ /** Use pill shape (more rounded, compact padding) for inline use */
14
+ pill?: boolean;
13
15
  }
14
16
 
15
17
  export default function Badge({
@@ -20,6 +22,7 @@ export default function Badge({
20
22
  onRemove,
21
23
  className = '',
22
24
  dot = false,
25
+ pill = false,
23
26
  }: BadgeProps) {
24
27
  const variantStyles = {
25
28
  success: 'bg-success-50 text-success-700 border-success-200',
@@ -43,6 +46,13 @@ export default function Badge({
43
46
  lg: 'px-3 py-1.5 text-sm gap-2',
44
47
  };
45
48
 
49
+ // Pill variant has tighter horizontal padding and fully rounded ends
50
+ const pillSizeStyles = {
51
+ sm: 'px-1.5 py-0.5 text-xs gap-1',
52
+ md: 'px-2 py-0.5 text-xs gap-1',
53
+ lg: 'px-2.5 py-1 text-sm gap-1.5',
54
+ };
55
+
46
56
  const dotSizeStyles = {
47
57
  sm: 'h-1.5 w-1.5',
48
58
  md: 'h-2 w-2',
@@ -74,9 +84,10 @@ export default function Badge({
74
84
  return (
75
85
  <span
76
86
  className={`
77
- inline-flex items-center rounded-full border font-medium
87
+ inline-flex items-center border font-medium
88
+ ${pill ? 'rounded-full' : 'rounded-full'}
78
89
  ${variantStyles[variant]}
79
- ${sizeStyles[size]}
90
+ ${pill ? pillSizeStyles[size] : sizeStyles[size]}
80
91
  ${className}
81
92
  `}
82
93
  >