@xcelsior/ui-spreadsheets 1.2.1 → 1.3.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 (99) hide show
  1. package/.omc/state/agent-replay-0cead415-b3bd-40fd-b199-47371946c4db.jsonl +25 -0
  2. package/.omc/state/idle-notif-cooldown.json +3 -0
  3. package/.omc/state/last-tool-error.json +7 -0
  4. package/.omc/state/mission-state.json +179 -0
  5. package/.omc/state/subagent-tracking.json +116 -0
  6. package/.turbo/turbo-build.log +28 -28
  7. package/.turbo/turbo-lint.log +140 -0
  8. package/dist/index.d.mts +94 -4
  9. package/dist/index.d.ts +94 -4
  10. package/dist/index.js +2133 -1155
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +2023 -1047
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/styles/globals.css +159 -16
  15. package/dist/styles/globals.css.map +1 -1
  16. package/package.json +1 -1
  17. package/plans/20260330-1230-spreadsheet-features/phase-01-types-and-duplicates-hook.md +73 -0
  18. package/plans/20260330-1230-spreadsheet-features/phase-02-filter-dropdown-portal.md +90 -0
  19. package/plans/20260330-1230-spreadsheet-features/phase-03-header-overflow-menu.md +101 -0
  20. package/plans/20260330-1230-spreadsheet-features/phase-04-integration.md +193 -0
  21. package/plans/20260330-1230-spreadsheet-features/plan.md +59 -0
  22. package/src/components/ColorPickerPopover.tsx +77 -32
  23. package/src/components/ColumnHeaderActions.tsx +241 -1
  24. package/src/components/RowIndexColumnHeader.tsx +13 -16
  25. package/src/components/SelectionSummaryBar.tsx +103 -0
  26. package/src/components/Spreadsheet.stories.tsx +396 -0
  27. package/src/components/Spreadsheet.tsx +233 -187
  28. package/src/components/SpreadsheetCell.tsx +280 -42
  29. package/src/components/SpreadsheetFilterDropdown.tsx +178 -13
  30. package/src/components/SpreadsheetHeader.tsx +79 -24
  31. package/src/components/SpreadsheetSettingsModal.tsx +4 -0
  32. package/src/hooks/useSpreadsheetColumnResize.ts +143 -0
  33. package/src/hooks/useSpreadsheetDuplicates.ts +149 -0
  34. package/src/hooks/useSpreadsheetFiltering.ts +18 -1
  35. package/src/hooks/useSpreadsheetHighlighting.ts +23 -3
  36. package/src/hooks/useSpreadsheetKeyboardShortcuts.ts +16 -0
  37. package/src/hooks/useSpreadsheetPinning.ts +148 -134
  38. package/src/hooks/useSpreadsheetSelection.ts +10 -22
  39. package/src/hooks/useSpreadsheetSummary.ts +68 -0
  40. package/src/index.ts +4 -1
  41. package/src/styles/globals.css +51 -0
  42. package/src/types.ts +50 -2
  43. package/storybook-static/assets/Color-YHDXOIA2-CtQurLnT.js +1 -0
  44. package/storybook-static/assets/DocsRenderer-CFRXHY34-oxrW8Hvo.js +575 -0
  45. package/storybook-static/assets/Spreadsheet.stories-DvhhzuK4.js +1357 -0
  46. package/storybook-static/assets/chunk-XP5HYGXS-BpfKkqn7.js +1 -0
  47. package/storybook-static/assets/entry-preview-CkBGHCAN.js +2 -0
  48. package/storybook-static/assets/entry-preview-docs-ugJb6pa8.js +46 -0
  49. package/storybook-static/assets/iframe-CPp2u3vg.js +211 -0
  50. package/storybook-static/assets/index-BB9bPxRC.js +24 -0
  51. package/storybook-static/assets/index-BQFlzFLk.js +9 -0
  52. package/storybook-static/assets/index-CtvPRVHf.js +9 -0
  53. package/storybook-static/assets/index-DgH-xKnr.js +11 -0
  54. package/storybook-static/assets/index-DrFu-skq.js +6 -0
  55. package/storybook-static/assets/index-DrdPSA1J.js +240 -0
  56. package/storybook-static/assets/index-DzFBShOR.js +20 -0
  57. package/storybook-static/assets/index-v-1boR4t.js +1 -0
  58. package/storybook-static/assets/preview-B8lJiyuQ.js +34 -0
  59. package/storybook-static/assets/preview-BBWR9nbA.js +1 -0
  60. package/storybook-static/assets/preview-BWzBA1C2.js +396 -0
  61. package/storybook-static/assets/preview-Bm0S-uxO.css +1 -0
  62. package/storybook-static/assets/preview-CvbIS5ZJ.js +1 -0
  63. package/storybook-static/assets/preview-DD_OYowb.js +1 -0
  64. package/storybook-static/assets/preview-DGUiP6tS.js +7 -0
  65. package/storybook-static/assets/preview-DHQbi4pV.js +1 -0
  66. package/storybook-static/assets/preview-DwI0w3cI.js +1 -0
  67. package/storybook-static/assets/preview-DyR7iiFG.js +1 -0
  68. package/storybook-static/assets/preview-zxZ6Be2V.js +2 -0
  69. package/storybook-static/assets/react-18-Pj8skaX9.js +1 -0
  70. package/storybook-static/assets/test-utils-quxJ1Z79.js +9 -0
  71. package/storybook-static/favicon.svg +1 -0
  72. package/storybook-static/iframe.html +666 -0
  73. package/storybook-static/index.html +177 -0
  74. package/storybook-static/index.json +1 -0
  75. package/storybook-static/nunito-sans-bold-italic.woff2 +0 -0
  76. package/storybook-static/nunito-sans-bold.woff2 +0 -0
  77. package/storybook-static/nunito-sans-italic.woff2 +0 -0
  78. package/storybook-static/nunito-sans-regular.woff2 +0 -0
  79. package/storybook-static/project.json +1 -0
  80. package/storybook-static/sb-addons/essentials-actions-3/manager-bundle.js +3 -0
  81. package/storybook-static/sb-addons/essentials-backgrounds-5/manager-bundle.js +12 -0
  82. package/storybook-static/sb-addons/essentials-controls-2/manager-bundle.js +405 -0
  83. package/storybook-static/sb-addons/essentials-docs-4/manager-bundle.js +245 -0
  84. package/storybook-static/sb-addons/essentials-measure-8/manager-bundle.js +3 -0
  85. package/storybook-static/sb-addons/essentials-outline-9/manager-bundle.js +3 -0
  86. package/storybook-static/sb-addons/essentials-toolbars-7/manager-bundle.js +3 -0
  87. package/storybook-static/sb-addons/essentials-viewport-6/manager-bundle.js +3 -0
  88. package/storybook-static/sb-addons/interactions-10/manager-bundle.js +222 -0
  89. package/storybook-static/sb-addons/links-1/manager-bundle.js +3 -0
  90. package/storybook-static/sb-addons/storybook-core-core-server-presets-0/common-manager-bundle.js +3 -0
  91. package/storybook-static/sb-common-assets/favicon.svg +1 -0
  92. package/storybook-static/sb-common-assets/nunito-sans-bold-italic.woff2 +0 -0
  93. package/storybook-static/sb-common-assets/nunito-sans-bold.woff2 +0 -0
  94. package/storybook-static/sb-common-assets/nunito-sans-italic.woff2 +0 -0
  95. package/storybook-static/sb-common-assets/nunito-sans-regular.woff2 +0 -0
  96. package/storybook-static/sb-manager/globals-module-info.js +1052 -0
  97. package/storybook-static/sb-manager/globals-runtime.js +42127 -0
  98. package/storybook-static/sb-manager/globals.js +48 -0
  99. package/storybook-static/sb-manager/runtime.js +12048 -0
@@ -52,6 +52,7 @@
52
52
  --color-blue-100: oklch(93.2% 0.032 255.585);
53
53
  --color-blue-200: oklch(88.2% 0.059 254.128);
54
54
  --color-blue-300: oklch(80.9% 0.105 251.813);
55
+ --color-blue-400: oklch(70.7% 0.165 254.624);
55
56
  --color-blue-500: oklch(62.3% 0.214 259.815);
56
57
  --color-blue-600: oklch(54.6% 0.245 262.881);
57
58
  --color-blue-700: oklch(48.8% 0.243 264.376);
@@ -64,6 +65,7 @@
64
65
  --color-indigo-900: oklch(35.9% 0.144 278.697);
65
66
  --color-purple-50: oklch(97.7% 0.014 308.299);
66
67
  --color-purple-200: oklch(90.2% 0.063 306.703);
68
+ --color-purple-600: oklch(55.8% 0.288 302.321);
67
69
  --color-purple-700: oklch(49.6% 0.265 301.924);
68
70
  --color-purple-800: oklch(43.8% 0.218 303.724);
69
71
  --color-purple-900: oklch(38.1% 0.176 304.987);
@@ -93,6 +95,7 @@
93
95
  --font-weight-semibold: 600;
94
96
  --font-weight-bold: 700;
95
97
  --radius-sm: 0.25rem;
98
+ --radius-md: 0.375rem;
96
99
  --radius-lg: 0.5rem;
97
100
  --animate-spin: spin 1s linear infinite;
98
101
  --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
@@ -292,6 +295,9 @@
292
295
  }
293
296
  }
294
297
  @layer utilities {
298
+ .pointer-events-none {
299
+ pointer-events: none;
300
+ }
295
301
  .collapse {
296
302
  visibility: collapse;
297
303
  }
@@ -316,6 +322,12 @@
316
322
  .inset-0 {
317
323
  inset: calc(var(--spacing) * 0);
318
324
  }
325
+ .inset-y-0 {
326
+ inset-block: calc(var(--spacing) * 0);
327
+ }
328
+ .top-0 {
329
+ top: calc(var(--spacing) * 0);
330
+ }
319
331
  .top-full {
320
332
  top: 100%;
321
333
  }
@@ -334,15 +346,15 @@
334
346
  .z-20 {
335
347
  z-index: 20;
336
348
  }
337
- .z-30 {
338
- z-index: 30;
339
- }
340
349
  .z-50 {
341
350
  z-index: 50;
342
351
  }
343
352
  .z-\[100\] {
344
353
  z-index: 100;
345
354
  }
355
+ .z-\[9999\] {
356
+ z-index: 9999;
357
+ }
346
358
  .container {
347
359
  width: 100%;
348
360
  @media (width >= 40rem) {
@@ -391,6 +403,9 @@
391
403
  .mb-1 {
392
404
  margin-bottom: calc(var(--spacing) * 1);
393
405
  }
406
+ .mb-1\.5 {
407
+ margin-bottom: calc(var(--spacing) * 1.5);
408
+ }
394
409
  .mb-2 {
395
410
  margin-bottom: calc(var(--spacing) * 2);
396
411
  }
@@ -409,6 +424,9 @@
409
424
  .ml-4 {
410
425
  margin-left: calc(var(--spacing) * 4);
411
426
  }
427
+ .ml-auto {
428
+ margin-left: auto;
429
+ }
412
430
  .block {
413
431
  display: block;
414
432
  }
@@ -427,6 +445,12 @@
427
445
  .inline-flex {
428
446
  display: inline-flex;
429
447
  }
448
+ .table {
449
+ display: table;
450
+ }
451
+ .h-1\.5 {
452
+ height: calc(var(--spacing) * 1.5);
453
+ }
430
454
  .h-2 {
431
455
  height: calc(var(--spacing) * 2);
432
456
  }
@@ -448,15 +472,24 @@
448
472
  .h-6 {
449
473
  height: calc(var(--spacing) * 6);
450
474
  }
475
+ .h-7 {
476
+ height: calc(var(--spacing) * 7);
477
+ }
451
478
  .h-8 {
452
479
  height: calc(var(--spacing) * 8);
453
480
  }
481
+ .h-10 {
482
+ height: calc(var(--spacing) * 10);
483
+ }
454
484
  .h-24 {
455
485
  height: calc(var(--spacing) * 24);
456
486
  }
457
487
  .h-full {
458
488
  height: 100%;
459
489
  }
490
+ .h-screen {
491
+ height: 100vh;
492
+ }
460
493
  .max-h-20 {
461
494
  max-height: calc(var(--spacing) * 20);
462
495
  }
@@ -466,12 +499,24 @@
466
499
  .max-h-32 {
467
500
  max-height: calc(var(--spacing) * 32);
468
501
  }
502
+ .max-h-48 {
503
+ max-height: calc(var(--spacing) * 48);
504
+ }
469
505
  .max-h-\[80vh\] {
470
506
  max-height: 80vh;
471
507
  }
472
508
  .max-h-\[90vh\] {
473
509
  max-height: 90vh;
474
510
  }
511
+ .min-h-0 {
512
+ min-height: calc(var(--spacing) * 0);
513
+ }
514
+ .w-1 {
515
+ width: calc(var(--spacing) * 1);
516
+ }
517
+ .w-1\.5 {
518
+ width: calc(var(--spacing) * 1.5);
519
+ }
475
520
  .w-2\.5 {
476
521
  width: calc(var(--spacing) * 2.5);
477
522
  }
@@ -490,12 +535,21 @@
490
535
  .w-6 {
491
536
  width: calc(var(--spacing) * 6);
492
537
  }
493
- .w-8 {
494
- width: calc(var(--spacing) * 8);
538
+ .w-7 {
539
+ width: calc(var(--spacing) * 7);
540
+ }
541
+ .w-10 {
542
+ width: calc(var(--spacing) * 10);
543
+ }
544
+ .w-44 {
545
+ width: calc(var(--spacing) * 44);
495
546
  }
496
547
  .w-64 {
497
548
  width: calc(var(--spacing) * 64);
498
549
  }
550
+ .w-72 {
551
+ width: calc(var(--spacing) * 72);
552
+ }
499
553
  .w-96 {
500
554
  width: calc(var(--spacing) * 96);
501
555
  }
@@ -564,6 +618,9 @@
564
618
  .cursor-text {
565
619
  cursor: text;
566
620
  }
621
+ .resize {
622
+ resize: both;
623
+ }
567
624
  .resize-none {
568
625
  resize: none;
569
626
  }
@@ -576,9 +633,6 @@
576
633
  .grid-cols-2 {
577
634
  grid-template-columns: repeat(2, minmax(0, 1fr));
578
635
  }
579
- .grid-cols-5 {
580
- grid-template-columns: repeat(5, minmax(0, 1fr));
581
- }
582
636
  .flex-col {
583
637
  flex-direction: column;
584
638
  }
@@ -683,6 +737,9 @@
683
737
  .rounded-lg {
684
738
  border-radius: var(--radius-lg);
685
739
  }
740
+ .rounded-md {
741
+ border-radius: var(--radius-md);
742
+ }
686
743
  .rounded-sm {
687
744
  border-radius: var(--radius-sm);
688
745
  }
@@ -722,6 +779,9 @@
722
779
  .border-blue-300 {
723
780
  border-color: var(--color-blue-300);
724
781
  }
782
+ .border-blue-500 {
783
+ border-color: var(--color-blue-500);
784
+ }
725
785
  .border-blue-600 {
726
786
  border-color: var(--color-blue-600);
727
787
  }
@@ -776,12 +836,6 @@
776
836
  .bg-blue-50 {
777
837
  background-color: var(--color-blue-50);
778
838
  }
779
- .bg-blue-50\/50 {
780
- background-color: color-mix(in srgb, oklch(97% 0.014 254.604) 50%, transparent);
781
- @supports (color: color-mix(in lab, red, red)) {
782
- background-color: color-mix(in oklab, var(--color-blue-50) 50%, transparent);
783
- }
784
- }
785
839
  .bg-blue-100 {
786
840
  background-color: var(--color-blue-100);
787
841
  }
@@ -899,8 +953,8 @@
899
953
  .py-8 {
900
954
  padding-block: calc(var(--spacing) * 8);
901
955
  }
902
- .py-px {
903
- padding-block: 1px;
956
+ .pt-2 {
957
+ padding-top: calc(var(--spacing) * 2);
904
958
  }
905
959
  .pt-3 {
906
960
  padding-top: calc(var(--spacing) * 3);
@@ -908,6 +962,15 @@
908
962
  .pt-4 {
909
963
  padding-top: calc(var(--spacing) * 4);
910
964
  }
965
+ .pr-0\.5 {
966
+ padding-right: calc(var(--spacing) * 0.5);
967
+ }
968
+ .pb-2 {
969
+ padding-bottom: calc(var(--spacing) * 2);
970
+ }
971
+ .pl-1 {
972
+ padding-left: calc(var(--spacing) * 1);
973
+ }
911
974
  .text-center {
912
975
  text-align: center;
913
976
  }
@@ -939,6 +1002,10 @@
939
1002
  .text-\[10px\] {
940
1003
  font-size: 10px;
941
1004
  }
1005
+ .leading-none {
1006
+ --tw-leading: 1;
1007
+ line-height: 1;
1008
+ }
942
1009
  .font-bold {
943
1010
  --tw-font-weight: var(--font-weight-bold);
944
1011
  font-weight: var(--font-weight-bold);
@@ -963,6 +1030,9 @@
963
1030
  .text-amber-700 {
964
1031
  color: var(--color-amber-700);
965
1032
  }
1033
+ .text-amber-900 {
1034
+ color: var(--color-amber-900);
1035
+ }
966
1036
  .text-blue-600 {
967
1037
  color: var(--color-blue-600);
968
1038
  }
@@ -1017,6 +1087,9 @@
1017
1087
  .text-indigo-900 {
1018
1088
  color: var(--color-indigo-900);
1019
1089
  }
1090
+ .text-purple-600 {
1091
+ color: var(--color-purple-600);
1092
+ }
1020
1093
  .text-purple-700 {
1021
1094
  color: var(--color-purple-700);
1022
1095
  }
@@ -1098,6 +1171,10 @@
1098
1171
  .ring-blue-500 {
1099
1172
  --tw-ring-color: var(--color-blue-500);
1100
1173
  }
1174
+ .blur {
1175
+ --tw-blur: blur(8px);
1176
+ filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
1177
+ }
1101
1178
  .filter {
1102
1179
  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
1103
1180
  }
@@ -1161,6 +1238,13 @@
1161
1238
  }
1162
1239
  }
1163
1240
  }
1241
+ .hover\:border-gray-400 {
1242
+ &:hover {
1243
+ @media (hover: hover) {
1244
+ border-color: var(--color-gray-400);
1245
+ }
1246
+ }
1247
+ }
1164
1248
  .hover\:bg-amber-100 {
1165
1249
  &:hover {
1166
1250
  @media (hover: hover) {
@@ -1189,6 +1273,20 @@
1189
1273
  }
1190
1274
  }
1191
1275
  }
1276
+ .hover\:bg-blue-50 {
1277
+ &:hover {
1278
+ @media (hover: hover) {
1279
+ background-color: var(--color-blue-50);
1280
+ }
1281
+ }
1282
+ }
1283
+ .hover\:bg-blue-400 {
1284
+ &:hover {
1285
+ @media (hover: hover) {
1286
+ background-color: var(--color-blue-400);
1287
+ }
1288
+ }
1289
+ }
1192
1290
  .hover\:bg-blue-700 {
1193
1291
  &:hover {
1194
1292
  @media (hover: hover) {
@@ -1312,6 +1410,11 @@
1312
1410
  --tw-ring-color: var(--color-blue-500);
1313
1411
  }
1314
1412
  }
1413
+ .focus\:ring-red-500 {
1414
+ &:focus {
1415
+ --tw-ring-color: var(--color-red-500);
1416
+ }
1417
+ }
1315
1418
  .focus\:outline-none {
1316
1419
  &:focus {
1317
1420
  --tw-outline-style: none;
@@ -1353,6 +1456,44 @@
1353
1456
  }
1354
1457
  }
1355
1458
  }
1459
+ .spreadsheet-scroll-container {
1460
+ scrollbar-width: thin;
1461
+ scrollbar-color: rgb(156 163 175) transparent;
1462
+ }
1463
+ .spreadsheet-scroll-container::-webkit-scrollbar {
1464
+ width: 6px;
1465
+ height: 6px;
1466
+ }
1467
+ .spreadsheet-scroll-container::-webkit-scrollbar-track {
1468
+ background: transparent;
1469
+ }
1470
+ .spreadsheet-scroll-container::-webkit-scrollbar-thumb {
1471
+ background-color: rgb(209 213 219);
1472
+ border-radius: 3px;
1473
+ }
1474
+ .spreadsheet-scroll-container::-webkit-scrollbar-thumb:hover {
1475
+ background-color: rgb(156 163 175);
1476
+ }
1477
+ .spreadsheet-scroll-container::-webkit-scrollbar-corner {
1478
+ background: transparent;
1479
+ }
1480
+ .spreadsheet-scroll-container tbody tr:hover > td {
1481
+ background-color: rgb(249 250 251) !important;
1482
+ }
1483
+ .spreadsheet-scroll-container tbody tr:hover > td[style*=dbeafe],
1484
+ .spreadsheet-scroll-container tbody tr:hover > td[style*="239 246 255"] {
1485
+ background-color: rgb(219 234 254) !important;
1486
+ }
1487
+ .spreadsheet-processing-overlay {
1488
+ position: absolute;
1489
+ inset: 0;
1490
+ background: rgba(255, 255, 255, 0.6);
1491
+ display: flex;
1492
+ align-items: center;
1493
+ justify-content: center;
1494
+ z-index: 60;
1495
+ pointer-events: none;
1496
+ }
1356
1497
  @property --tw-border-spacing-x { syntax: "<length>"; inherits: false; initial-value: 0; }
1357
1498
  @property --tw-border-spacing-y { syntax: "<length>"; inherits: false; initial-value: 0; }
1358
1499
  @property --tw-rotate-x { syntax: "*"; inherits: false; }
@@ -1362,6 +1503,7 @@
1362
1503
  @property --tw-skew-y { syntax: "*"; inherits: false; }
1363
1504
  @property --tw-space-y-reverse { syntax: "*"; inherits: false; initial-value: 0; }
1364
1505
  @property --tw-border-style { syntax: "*"; inherits: false; initial-value: solid; }
1506
+ @property --tw-leading { syntax: "*"; inherits: false; }
1365
1507
  @property --tw-font-weight { syntax: "*"; inherits: false; }
1366
1508
  @property --tw-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }
1367
1509
  @property --tw-shadow-color { syntax: "*"; inherits: false; }
@@ -1418,6 +1560,7 @@
1418
1560
  --tw-skew-y: initial;
1419
1561
  --tw-space-y-reverse: 0;
1420
1562
  --tw-border-style: solid;
1563
+ --tw-leading: initial;
1421
1564
  --tw-font-weight: initial;
1422
1565
  --tw-shadow: 0 0 #0000;
1423
1566
  --tw-shadow-color: initial;