@xcelsior/ui-spreadsheets 1.2.2 → 1.3.1

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 +27 -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 +189 -0
  5. package/.omc/state/subagent-tracking.json +125 -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 +2134 -1157
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +2024 -1049
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/styles/globals.css +156 -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 -17
  25. package/src/components/SelectionSummaryBar.tsx +103 -0
  26. package/src/components/Spreadsheet.stories.tsx +254 -0
  27. package/src/components/Spreadsheet.tsx +235 -190
  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);
@@ -1020,6 +1087,9 @@
1020
1087
  .text-indigo-900 {
1021
1088
  color: var(--color-indigo-900);
1022
1089
  }
1090
+ .text-purple-600 {
1091
+ color: var(--color-purple-600);
1092
+ }
1023
1093
  .text-purple-700 {
1024
1094
  color: var(--color-purple-700);
1025
1095
  }
@@ -1101,6 +1171,10 @@
1101
1171
  .ring-blue-500 {
1102
1172
  --tw-ring-color: var(--color-blue-500);
1103
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
+ }
1104
1178
  .filter {
1105
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,);
1106
1180
  }
@@ -1164,6 +1238,13 @@
1164
1238
  }
1165
1239
  }
1166
1240
  }
1241
+ .hover\:border-gray-400 {
1242
+ &:hover {
1243
+ @media (hover: hover) {
1244
+ border-color: var(--color-gray-400);
1245
+ }
1246
+ }
1247
+ }
1167
1248
  .hover\:bg-amber-100 {
1168
1249
  &:hover {
1169
1250
  @media (hover: hover) {
@@ -1192,6 +1273,20 @@
1192
1273
  }
1193
1274
  }
1194
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
+ }
1195
1290
  .hover\:bg-blue-700 {
1196
1291
  &:hover {
1197
1292
  @media (hover: hover) {
@@ -1315,6 +1410,11 @@
1315
1410
  --tw-ring-color: var(--color-blue-500);
1316
1411
  }
1317
1412
  }
1413
+ .focus\:ring-red-500 {
1414
+ &:focus {
1415
+ --tw-ring-color: var(--color-red-500);
1416
+ }
1417
+ }
1318
1418
  .focus\:outline-none {
1319
1419
  &:focus {
1320
1420
  --tw-outline-style: none;
@@ -1356,6 +1456,44 @@
1356
1456
  }
1357
1457
  }
1358
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
+ }
1359
1497
  @property --tw-border-spacing-x { syntax: "<length>"; inherits: false; initial-value: 0; }
1360
1498
  @property --tw-border-spacing-y { syntax: "<length>"; inherits: false; initial-value: 0; }
1361
1499
  @property --tw-rotate-x { syntax: "*"; inherits: false; }
@@ -1365,6 +1503,7 @@
1365
1503
  @property --tw-skew-y { syntax: "*"; inherits: false; }
1366
1504
  @property --tw-space-y-reverse { syntax: "*"; inherits: false; initial-value: 0; }
1367
1505
  @property --tw-border-style { syntax: "*"; inherits: false; initial-value: solid; }
1506
+ @property --tw-leading { syntax: "*"; inherits: false; }
1368
1507
  @property --tw-font-weight { syntax: "*"; inherits: false; }
1369
1508
  @property --tw-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }
1370
1509
  @property --tw-shadow-color { syntax: "*"; inherits: false; }
@@ -1421,6 +1560,7 @@
1421
1560
  --tw-skew-y: initial;
1422
1561
  --tw-space-y-reverse: 0;
1423
1562
  --tw-border-style: solid;
1563
+ --tw-leading: initial;
1424
1564
  --tw-font-weight: initial;
1425
1565
  --tw-shadow: 0 0 #0000;
1426
1566
  --tw-shadow-color: initial;