@expcat/tigercat-core 0.3.70 → 0.4.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.
package/dist/index.js CHANGED
@@ -673,7 +673,8 @@ function mergeTigerLocale(base, override) {
673
673
  drawer: { ...base?.drawer, ...override?.drawer },
674
674
  upload: { ...base?.upload, ...override?.upload },
675
675
  pagination: { ...base?.pagination, ...override?.pagination },
676
- formWizard: { ...base?.formWizard, ...override?.formWizard }
676
+ formWizard: { ...base?.formWizard, ...override?.formWizard },
677
+ taskBoard: { ...base?.taskBoard, ...override?.taskBoard }
677
678
  };
678
679
  }
679
680
  var DEFAULT_PAGINATION_LABELS = {
@@ -728,6 +729,29 @@ function formatPaginationTotal(template, total, range) {
728
729
  function formatPageAriaLabel(template, page) {
729
730
  return template.replace("{page}", String(page));
730
731
  }
732
+ var DEFAULT_TASK_BOARD_LABELS = {
733
+ emptyColumnText: "No tasks",
734
+ addCardText: "Add task",
735
+ wipLimitText: "WIP limit: {limit}",
736
+ dragHintText: "Drag to move",
737
+ boardAriaLabel: "Task Board"
738
+ };
739
+ var ZH_CN_TASK_BOARD_LABELS = {
740
+ emptyColumnText: "\u6682\u65E0\u4EFB\u52A1",
741
+ addCardText: "\u6DFB\u52A0\u4EFB\u52A1",
742
+ wipLimitText: "WIP \u9650\u5236: {limit}",
743
+ dragHintText: "\u62D6\u62FD\u4EE5\u79FB\u52A8",
744
+ boardAriaLabel: "\u4EFB\u52A1\u770B\u677F"
745
+ };
746
+ function getTaskBoardLabels(locale) {
747
+ return {
748
+ emptyColumnText: locale?.taskBoard?.emptyColumnText ?? DEFAULT_TASK_BOARD_LABELS.emptyColumnText,
749
+ addCardText: locale?.taskBoard?.addCardText ?? DEFAULT_TASK_BOARD_LABELS.addCardText,
750
+ wipLimitText: locale?.taskBoard?.wipLimitText ?? DEFAULT_TASK_BOARD_LABELS.wipLimitText,
751
+ dragHintText: locale?.taskBoard?.dragHintText ?? DEFAULT_TASK_BOARD_LABELS.dragHintText,
752
+ boardAriaLabel: locale?.taskBoard?.boardAriaLabel ?? DEFAULT_TASK_BOARD_LABELS.boardAriaLabel
753
+ };
754
+ }
731
755
 
732
756
  // src/utils/datepicker-i18n.ts
733
757
  function getDatePickerLabels(locale, overrides) {
@@ -6466,6 +6490,164 @@ var formatCommentTime = (value) => {
6466
6490
  return value;
6467
6491
  };
6468
6492
 
6493
+ // src/utils/task-board-utils.ts
6494
+ var taskBoardBaseClasses = "tiger-task-board flex gap-4 overflow-x-auto p-4 min-h-[400px]";
6495
+ var taskBoardColumnClasses = "tiger-task-board-column flex flex-col shrink-0 w-72 rounded-lg border border-[var(--tiger-border,#e5e7eb)] bg-[var(--tiger-surface,#ffffff)] shadow-sm transition-shadow";
6496
+ var taskBoardColumnHeaderClasses = "flex items-center justify-between px-3 py-2 border-b border-[var(--tiger-border,#e5e7eb)] text-sm font-semibold text-[var(--tiger-text,#1f2937)] select-none";
6497
+ var taskBoardColumnBodyClasses = "flex-1 overflow-y-auto p-2 space-y-2 min-h-[80px]";
6498
+ var taskBoardCardClasses = "tiger-task-board-card rounded-md border border-[var(--tiger-border,#e5e7eb)] bg-[var(--tiger-surface,#ffffff)] p-3 shadow-sm cursor-grab select-none transition-opacity";
6499
+ var taskBoardCardDraggingClasses = "opacity-50 shadow-lg";
6500
+ var taskBoardDropIndicatorClasses = "h-1 rounded-full bg-[var(--tiger-primary,#2563eb)] my-1 transition-all";
6501
+ var taskBoardColumnDropTargetClasses = "ring-2 ring-[var(--tiger-primary,#2563eb)] ring-opacity-50";
6502
+ var taskBoardColumnDraggingClasses = "opacity-50";
6503
+ var taskBoardEmptyClasses = "flex items-center justify-center text-[var(--tiger-text-muted,#6b7280)] text-sm py-8";
6504
+ var taskBoardWipExceededClasses = "text-[var(--tiger-error,#ef4444)]";
6505
+ var taskBoardAddCardClasses = "flex items-center justify-center gap-1 w-full py-1.5 text-sm text-[var(--tiger-text-muted,#6b7280)] hover:text-[var(--tiger-primary,#2563eb)] hover:bg-[var(--tiger-surface-muted,#f9fafb)] rounded transition-colors cursor-pointer";
6506
+ var MIME = "text/plain";
6507
+ function createCardDragData(cardId, columnId, index) {
6508
+ const data = { type: "card", cardId, columnId, index };
6509
+ return JSON.stringify(data);
6510
+ }
6511
+ function createColumnDragData(columnId, index) {
6512
+ const data = { type: "column", columnId, index };
6513
+ return JSON.stringify(data);
6514
+ }
6515
+ function parseDragData(dataTransfer) {
6516
+ try {
6517
+ const raw = dataTransfer.getData(MIME);
6518
+ if (!raw) return null;
6519
+ const data = JSON.parse(raw);
6520
+ if (data.type === "card" || data.type === "column") return data;
6521
+ return null;
6522
+ } catch {
6523
+ return null;
6524
+ }
6525
+ }
6526
+ function setDragData(dataTransfer, json) {
6527
+ dataTransfer.setData(MIME, json);
6528
+ dataTransfer.effectAllowed = "move";
6529
+ }
6530
+ function moveCard(columns, cardId, fromColumnId, toColumnId, toIndex, options) {
6531
+ const srcColIdx = columns.findIndex((c) => c.id === fromColumnId);
6532
+ const dstColIdx = columns.findIndex((c) => c.id === toColumnId);
6533
+ if (srcColIdx === -1 || dstColIdx === -1) return null;
6534
+ const srcCol = columns[srcColIdx];
6535
+ const cardIdx = srcCol.cards.findIndex((c) => c.id === cardId);
6536
+ if (cardIdx === -1) return null;
6537
+ const card = srcCol.cards[cardIdx];
6538
+ const clampedTo = Math.max(
6539
+ 0,
6540
+ Math.min(
6541
+ toIndex,
6542
+ srcColIdx === dstColIdx ? srcCol.cards.length - 1 : columns[dstColIdx].cards.length
6543
+ )
6544
+ );
6545
+ if (srcColIdx === dstColIdx) {
6546
+ if (cardIdx === clampedTo) return null;
6547
+ const newCards = [...srcCol.cards];
6548
+ newCards.splice(cardIdx, 1);
6549
+ newCards.splice(clampedTo, 0, card);
6550
+ const newCols2 = columns.map((c, i) => i === srcColIdx ? { ...c, cards: newCards } : c);
6551
+ return {
6552
+ columns: newCols2,
6553
+ event: { cardId, fromColumnId, toColumnId, fromIndex: cardIdx, toIndex: clampedTo }
6554
+ };
6555
+ }
6556
+ const dstCol = columns[dstColIdx];
6557
+ if (options?.enforceWipLimit && dstCol.wipLimit != null && dstCol.wipLimit > 0 && dstCol.cards.length >= dstCol.wipLimit) {
6558
+ return null;
6559
+ }
6560
+ const newSrcCards = srcCol.cards.filter((c) => c.id !== cardId);
6561
+ const newDstCards = [...dstCol.cards];
6562
+ newDstCards.splice(clampedTo, 0, card);
6563
+ const newCols = columns.map((c, i) => {
6564
+ if (i === srcColIdx) return { ...c, cards: newSrcCards };
6565
+ if (i === dstColIdx) return { ...c, cards: newDstCards };
6566
+ return c;
6567
+ });
6568
+ return {
6569
+ columns: newCols,
6570
+ event: { cardId, fromColumnId, toColumnId, fromIndex: cardIdx, toIndex: clampedTo }
6571
+ };
6572
+ }
6573
+ function reorderColumns(columns, fromIndex, toIndex) {
6574
+ if (fromIndex === toIndex || fromIndex < 0 || fromIndex >= columns.length || toIndex < 0 || toIndex >= columns.length) {
6575
+ return null;
6576
+ }
6577
+ const col = columns[fromIndex];
6578
+ const next = [...columns];
6579
+ next.splice(fromIndex, 1);
6580
+ next.splice(toIndex, 0, col);
6581
+ return {
6582
+ columns: next,
6583
+ event: { columnId: col.id, fromIndex, toIndex }
6584
+ };
6585
+ }
6586
+ function isWipExceeded(column) {
6587
+ if (column.wipLimit == null || column.wipLimit <= 0) return false;
6588
+ return column.cards.length > column.wipLimit;
6589
+ }
6590
+ function getDropIndex(pointerY, cardRects) {
6591
+ for (let i = 0; i < cardRects.length; i++) {
6592
+ const mid = cardRects[i].top + cardRects[i].height / 2;
6593
+ if (pointerY < mid) return i;
6594
+ }
6595
+ return cardRects.length;
6596
+ }
6597
+ function getColumnDropIndex(pointerX, columnRects) {
6598
+ for (let i = 0; i < columnRects.length; i++) {
6599
+ const mid = columnRects[i].left + columnRects[i].width / 2;
6600
+ if (pointerX < mid) return i;
6601
+ }
6602
+ return columnRects.length;
6603
+ }
6604
+ function createTouchDragTracker() {
6605
+ let state = {
6606
+ startX: 0,
6607
+ startY: 0,
6608
+ currentX: 0,
6609
+ currentY: 0,
6610
+ active: false,
6611
+ sourceElement: null
6612
+ };
6613
+ return {
6614
+ onTouchStart(e, source) {
6615
+ const touch = e.touches[0];
6616
+ state = {
6617
+ startX: touch.clientX,
6618
+ startY: touch.clientY,
6619
+ currentX: touch.clientX,
6620
+ currentY: touch.clientY,
6621
+ active: true,
6622
+ sourceElement: source
6623
+ };
6624
+ },
6625
+ onTouchMove(e) {
6626
+ if (!state.active) return;
6627
+ const touch = e.touches[0];
6628
+ state.currentX = touch.clientX;
6629
+ state.currentY = touch.clientY;
6630
+ e.preventDefault();
6631
+ },
6632
+ onTouchEnd() {
6633
+ state = { ...state, active: false, sourceElement: null };
6634
+ return { ...state };
6635
+ },
6636
+ getState() {
6637
+ return state;
6638
+ },
6639
+ cancel() {
6640
+ state = { ...state, active: false, sourceElement: null };
6641
+ }
6642
+ };
6643
+ }
6644
+ function findColumnFromPoint(x, y, boardEl) {
6645
+ if (!boardEl) return null;
6646
+ const el = document.elementFromPoint(x, y);
6647
+ if (!el) return null;
6648
+ return el.closest("[data-tiger-taskboard-column]");
6649
+ }
6650
+
6469
6651
  // src/theme/checkbox.ts
6470
6652
  var checkboxSizeClasses = {
6471
6653
  sm: "w-4 h-4",
@@ -6659,6 +6841,7 @@ export {
6659
6841
  DEFAULT_CHART_COLORS,
6660
6842
  DEFAULT_FORM_WIZARD_LABELS,
6661
6843
  DEFAULT_PAGINATION_LABELS,
6844
+ DEFAULT_TASK_BOARD_LABELS,
6662
6845
  DONUT_BASE_SHADOW,
6663
6846
  DONUT_EMPHASIS_SHADOW,
6664
6847
  DROPDOWN_CHEVRON_PATH,
@@ -6692,6 +6875,7 @@ export {
6692
6875
  TimePickerCloseIconPath,
6693
6876
  ZH_CN_FORM_WIZARD_LABELS,
6694
6877
  ZH_CN_PAGINATION_LABELS,
6878
+ ZH_CN_TASK_BOARD_LABELS,
6695
6879
  activeOpacityClasses,
6696
6880
  activePressClasses,
6697
6881
  alertBaseClasses,
@@ -6840,13 +7024,16 @@ export {
6840
7024
  createAreaPath,
6841
7025
  createAriaId,
6842
7026
  createBandScale,
7027
+ createCardDragData,
6843
7028
  createChartInteractionHandlers,
7029
+ createColumnDragData,
6844
7030
  createFloatingIdFactory,
6845
7031
  createLinePath,
6846
7032
  createLinearScale,
6847
7033
  createPieArcPath,
6848
7034
  createPointScale,
6849
7035
  createPolygonPath,
7036
+ createTouchDragTracker,
6850
7037
  cropCanvas,
6851
7038
  cropUploadTriggerClasses,
6852
7039
  cropUploadTriggerDisabledClasses,
@@ -6903,6 +7090,7 @@ export {
6903
7090
  filterOptions,
6904
7091
  filterTreeNodes,
6905
7092
  findActiveAnchor,
7093
+ findColumnFromPoint,
6906
7094
  findNode,
6907
7095
  flattenSelectOptions,
6908
7096
  focusElement,
@@ -6977,6 +7165,7 @@ export {
6977
7165
  getCollapseIconClasses,
6978
7166
  getCollapsePanelClasses,
6979
7167
  getCollapsePanelHeaderClasses,
7168
+ getColumnDropIndex,
6980
7169
  getContainerClasses,
6981
7170
  getContainerHeight,
6982
7171
  getContainerScrollTop,
@@ -7005,6 +7194,7 @@ export {
7005
7194
  getDrawerMaskClasses,
7006
7195
  getDrawerPanelClasses,
7007
7196
  getDrawerTitleClasses,
7197
+ getDropIndex,
7008
7198
  getDropdownChevronClasses,
7009
7199
  getDropdownContainerClasses,
7010
7200
  getDropdownItemClasses,
@@ -7169,6 +7359,7 @@ export {
7169
7359
  getTableWrapperClasses,
7170
7360
  getTabsContainerClasses,
7171
7361
  getTagVariantClasses,
7362
+ getTaskBoardLabels,
7172
7363
  getTextClasses,
7173
7364
  getThemeColor,
7174
7365
  getTimePeriodLabels,
@@ -7260,6 +7451,7 @@ export {
7260
7451
  isTabKey,
7261
7452
  isTimeInRange,
7262
7453
  isToday,
7454
+ isWipExceeded,
7263
7455
  layoutContentClasses,
7264
7456
  layoutFooterClasses,
7265
7457
  layoutHeaderClasses,
@@ -7337,6 +7529,7 @@ export {
7337
7529
  modalSizeClasses,
7338
7530
  modalTitleClasses,
7339
7531
  modalWrapperClasses,
7532
+ moveCard,
7340
7533
  moveCropRect,
7341
7534
  moveFocusInMenu,
7342
7535
  nextIconPath,
@@ -7358,6 +7551,7 @@ export {
7358
7551
  notificationTitleClasses,
7359
7552
  paginateData,
7360
7553
  parseDate,
7554
+ parseDragData,
7361
7555
  parseInputValue,
7362
7556
  parseTime,
7363
7557
  parseWidthToPx,
@@ -7395,6 +7589,7 @@ export {
7395
7589
  radioRootBaseClasses,
7396
7590
  radioSizeClasses,
7397
7591
  radioVisualBaseClasses,
7592
+ reorderColumns,
7398
7593
  replaceKeys,
7399
7594
  resetAreaGradientCounter,
7400
7595
  resetBarGradientCounter,
@@ -7419,6 +7614,7 @@ export {
7419
7614
  selectOptionDisabledClasses,
7420
7615
  selectOptionSelectedClasses,
7421
7616
  selectSearchInputClasses,
7617
+ setDragData,
7422
7618
  setThemeColors,
7423
7619
  shouldHideBadge,
7424
7620
  skeletonAnimationClasses,
@@ -7492,6 +7688,18 @@ export {
7492
7688
  tagCloseButtonBaseClasses,
7493
7689
  tagCloseIconPath,
7494
7690
  tagSizeClasses,
7691
+ taskBoardAddCardClasses,
7692
+ taskBoardBaseClasses,
7693
+ taskBoardCardClasses,
7694
+ taskBoardCardDraggingClasses,
7695
+ taskBoardColumnBodyClasses,
7696
+ taskBoardColumnClasses,
7697
+ taskBoardColumnDraggingClasses,
7698
+ taskBoardColumnDropTargetClasses,
7699
+ taskBoardColumnHeaderClasses,
7700
+ taskBoardDropIndicatorClasses,
7701
+ taskBoardEmptyClasses,
7702
+ taskBoardWipExceededClasses,
7495
7703
  textAlignClasses,
7496
7704
  textColorClasses,
7497
7705
  textDecorationClasses,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expcat/tigercat-core",
3
- "version": "0.3.70",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Core utilities for Tigercat UI library",
6
6
  "license": "MIT",