@app-studio/web 0.9.36 → 0.9.37

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.
@@ -5,6 +5,8 @@ export interface CalendarEvent {
5
5
  id: string;
6
6
  /** Event title/label */
7
7
  title: string;
8
+ /** Event description */
9
+ description?: string;
8
10
  /** Start date in ISO format (YYYY-MM-DD) or datetime (YYYY-MM-DDTHH:MM) */
9
11
  start: string;
10
12
  /** End date in ISO format (YYYY-MM-DD) or datetime (YYYY-MM-DDTHH:MM) */
@@ -63,6 +65,12 @@ export interface CalendarProps {
63
65
  onViewChange?: (view: CalendarView) => void;
64
66
  /** Callback when double-clicking to add new event */
65
67
  onEventAdd?: (start: string, end: string) => void;
68
+ /** Callback when an event's title changes */
69
+ onEventTitleChange?: (event: CalendarEvent, newTitle: string) => void;
70
+ /** Callback when an event's description changes */
71
+ onEventDescriptionChange?: (event: CalendarEvent, newDescription: string) => void;
72
+ /** Callback when an event is deleted */
73
+ onEventDelete?: (event: CalendarEvent) => void;
66
74
  /** Style overrides for various parts of the component */
67
75
  views?: CalendarViews;
68
76
  /** Width of the calendar (default: '100%') */
@@ -19,6 +19,11 @@ export interface KanbanBoardColumn {
19
19
  export interface KanbanBoardProps {
20
20
  columns: KanbanBoardColumn[];
21
21
  onChange?: (columns: KanbanBoardColumn[]) => void;
22
+ onCardMove?: (card: KanbanBoardCard, fromColumn: KanbanBoardColumn, toColumn: KanbanBoardColumn) => void;
23
+ onCardCreate?: (card: KanbanBoardCard, column: KanbanBoardColumn) => void;
24
+ onCardDelete?: (card: KanbanBoardCard, column: KanbanBoardColumn) => void;
25
+ onCardTitleChange?: (card: KanbanBoardCard, column: KanbanBoardColumn, newTitle: string) => void;
26
+ onCardDescriptionChange?: (card: KanbanBoardCard, column: KanbanBoardColumn, newDescription: string) => void;
22
27
  renderCard?: (card: KanbanBoardCard, column: KanbanBoardColumn) => React.ReactNode;
23
28
  renderColumnHeader?: (column: KanbanBoardColumn) => React.ReactNode;
24
29
  renderEmptyState?: (column: KanbanBoardColumn) => React.ReactNode;
@@ -1,7 +1,7 @@
1
1
  import type React from 'react';
2
- import { KanbanBoardProps } from './KanbanBoard.props';
3
- export declare const useKanbanBoardState: ({ columns: initialColumns, onChange, }: KanbanBoardProps) => {
4
- columns: import("./KanbanBoard.props").KanbanBoardColumn[];
2
+ import { KanbanBoardCard, KanbanBoardColumn, KanbanBoardProps } from './KanbanBoard.props';
3
+ export declare const useKanbanBoardState: ({ columns: initialColumns, onChange, onCardMove, onCardCreate: onCardCreateProp, onCardDelete: onCardDeleteProp, onCardTitleChange: onCardTitleChangeProp, onCardDescriptionChange: onCardDescriptionChangeProp, }: KanbanBoardProps) => {
4
+ columns: KanbanBoardColumn[];
5
5
  draggedCardId: string | null;
6
6
  hoveredColumnId: string | null;
7
7
  onCardDragStart: (columnId: string, cardId: string, event: React.DragEvent<HTMLDivElement>) => void;
@@ -10,4 +10,8 @@ export declare const useKanbanBoardState: ({ columns: initialColumns, onChange,
10
10
  onCardDragOver: (columnId: string, cardId: string | null, event: React.DragEvent<HTMLDivElement>) => void;
11
11
  onColumnDrop: (columnId: string, event: React.DragEvent<HTMLDivElement>) => void;
12
12
  onCardDrop: (columnId: string, cardId: string | null, event: React.DragEvent<HTMLDivElement>) => void;
13
+ onCardCreate: (card: KanbanBoardCard, column: KanbanBoardColumn) => void;
14
+ onCardDelete: (card: KanbanBoardCard, column: KanbanBoardColumn) => void;
15
+ onCardTitleChange: (card: KanbanBoardCard, column: KanbanBoardColumn, newTitle: string) => void;
16
+ onCardDescriptionChange: (card: KanbanBoardCard, column: KanbanBoardColumn, newDescription: string) => void;
13
17
  };
@@ -7611,7 +7611,12 @@ var cloneColumns = inputColumns => inputColumns.map(column => Object.assign({},
7611
7611
  var useKanbanBoardState = _ref => {
7612
7612
  var {
7613
7613
  columns: initialColumns,
7614
- onChange
7614
+ onChange,
7615
+ onCardMove,
7616
+ onCardCreate: onCardCreateProp,
7617
+ onCardDelete: onCardDeleteProp,
7618
+ onCardTitleChange: onCardTitleChangeProp,
7619
+ onCardDescriptionChange: onCardDescriptionChangeProp
7615
7620
  } = _ref;
7616
7621
  var [columns, setColumns] = React.useState(initialColumns);
7617
7622
  var [draggedCardId, setDraggedCardId] = React.useState(null);
@@ -7688,11 +7693,16 @@ var useKanbanBoardState = _ref => {
7688
7693
  cardId
7689
7694
  };
7690
7695
  if (options != null && options.shouldCommit) {
7696
+ var originalSourceColumn = prevColumns.find(c => c.id === sourceColumnId);
7697
+ var originalTargetColumn = prevColumns.find(c => c.id === targetColumnId);
7698
+ if (card && originalSourceColumn && originalTargetColumn) {
7699
+ onCardMove == null || onCardMove(card, originalSourceColumn, originalTargetColumn);
7700
+ }
7691
7701
  onChange == null || onChange(updatedColumns);
7692
7702
  }
7693
7703
  return updatedColumns;
7694
7704
  });
7695
- }, [onChange]);
7705
+ }, [onChange, onCardMove]);
7696
7706
  var handleCardDragStart = React.useCallback((columnId, cardId, event) => {
7697
7707
  dragStateRef.current = {
7698
7708
  columnId,
@@ -7751,6 +7761,62 @@ var useKanbanBoardState = _ref => {
7751
7761
  shouldCommit: true
7752
7762
  });
7753
7763
  }, [applyMove, getRelativeDropPosition]);
7764
+ var handleCardCreate = React.useCallback((card, column) => {
7765
+ if (onCardCreateProp) {
7766
+ onCardCreateProp(card, column);
7767
+ return;
7768
+ }
7769
+ setColumns(prevColumns => {
7770
+ var updatedColumns = prevColumns.map(col => col.id === column.id ? Object.assign({}, col, {
7771
+ cards: [...col.cards, card]
7772
+ }) : col);
7773
+ onChange == null || onChange(updatedColumns);
7774
+ return updatedColumns;
7775
+ });
7776
+ }, [onChange, onCardCreateProp]);
7777
+ var handleCardDelete = React.useCallback((card, column) => {
7778
+ if (onCardDeleteProp) {
7779
+ onCardDeleteProp(card, column);
7780
+ return;
7781
+ }
7782
+ setColumns(prevColumns => {
7783
+ var updatedColumns = prevColumns.map(col => col.id === column.id ? Object.assign({}, col, {
7784
+ cards: col.cards.filter(c => c.id !== card.id)
7785
+ }) : col);
7786
+ onChange == null || onChange(updatedColumns);
7787
+ return updatedColumns;
7788
+ });
7789
+ }, [onChange, onCardDeleteProp]);
7790
+ var handleCardTitleChange = React.useCallback((card, column, newTitle) => {
7791
+ if (onCardTitleChangeProp) {
7792
+ onCardTitleChangeProp(card, column, newTitle);
7793
+ return;
7794
+ }
7795
+ setColumns(prevColumns => {
7796
+ var updatedColumns = prevColumns.map(col => col.id === column.id ? Object.assign({}, col, {
7797
+ cards: col.cards.map(c => c.id === card.id ? Object.assign({}, c, {
7798
+ title: newTitle
7799
+ }) : c)
7800
+ }) : col);
7801
+ onChange == null || onChange(updatedColumns);
7802
+ return updatedColumns;
7803
+ });
7804
+ }, [onChange, onCardTitleChangeProp]);
7805
+ var handleCardDescriptionChange = React.useCallback((card, column, newDescription) => {
7806
+ if (onCardDescriptionChangeProp) {
7807
+ onCardDescriptionChangeProp(card, column, newDescription);
7808
+ return;
7809
+ }
7810
+ setColumns(prevColumns => {
7811
+ var updatedColumns = prevColumns.map(col => col.id === column.id ? Object.assign({}, col, {
7812
+ cards: col.cards.map(c => c.id === card.id ? Object.assign({}, c, {
7813
+ description: newDescription
7814
+ }) : c)
7815
+ }) : col);
7816
+ onChange == null || onChange(updatedColumns);
7817
+ return updatedColumns;
7818
+ });
7819
+ }, [onChange, onCardDescriptionChangeProp]);
7754
7820
  return {
7755
7821
  columns,
7756
7822
  draggedCardId,
@@ -7760,7 +7826,11 @@ var useKanbanBoardState = _ref => {
7760
7826
  onColumnDragOver: handleColumnDragOver,
7761
7827
  onCardDragOver: handleCardDragOver,
7762
7828
  onColumnDrop: handleColumnDrop,
7763
- onCardDrop: handleCardDrop
7829
+ onCardDrop: handleCardDrop,
7830
+ onCardCreate: handleCardCreate,
7831
+ onCardDelete: handleCardDelete,
7832
+ onCardTitleChange: handleCardTitleChange,
7833
+ onCardDescriptionChange: handleCardDescriptionChange
7764
7834
  };
7765
7835
  };
7766
7836
 
@@ -7778,18 +7848,94 @@ var KanbanBoardView = _ref => {
7778
7848
  onColumnDragOver,
7779
7849
  onCardDragOver,
7780
7850
  onColumnDrop,
7781
- onCardDrop
7851
+ onCardDrop,
7852
+ onCardCreate,
7853
+ onCardDelete,
7854
+ onCardTitleChange,
7855
+ onCardDescriptionChange
7782
7856
  } = _ref;
7783
- var renderDefaultCard = React__default.useCallback(card => (/*#__PURE__*/React__default.createElement(appStudio.Vertical, Object.assign({
7857
+ var [editingCardId, setEditingCardId] = React__default.useState(null);
7858
+ var [editingDescriptionCardId, setEditingDescriptionCardId] = React__default.useState(null);
7859
+ var [editedTitle, setEditedTitle] = React__default.useState('');
7860
+ var [editedDescription, setEditedDescription] = React__default.useState('');
7861
+ var handleTitleClick = React__default.useCallback(card => {
7862
+ setEditingCardId(card.id);
7863
+ setEditedTitle(card.title);
7864
+ }, []);
7865
+ var handleDescriptionClick = React__default.useCallback(card => {
7866
+ setEditingDescriptionCardId(card.id);
7867
+ setEditedDescription(card.description || '');
7868
+ }, []);
7869
+ var handleTitleChange = React__default.useCallback(event => {
7870
+ setEditedTitle(event.target.value);
7871
+ }, []);
7872
+ var handleDescriptionChange = React__default.useCallback(event => {
7873
+ setEditedDescription(event.target.value);
7874
+ }, []);
7875
+ var handleTitleBlur = React__default.useCallback((card, column) => {
7876
+ if (editingCardId === card.id) {
7877
+ onCardTitleChange == null || onCardTitleChange(card, column, editedTitle);
7878
+ setEditingCardId(null);
7879
+ }
7880
+ }, [editingCardId, editedTitle, onCardTitleChange]);
7881
+ var handleDescriptionBlur = React__default.useCallback((card, column) => {
7882
+ if (editingDescriptionCardId === card.id) {
7883
+ onCardDescriptionChange == null || onCardDescriptionChange(card, column, editedDescription);
7884
+ setEditingDescriptionCardId(null);
7885
+ }
7886
+ }, [editingDescriptionCardId, editedDescription, onCardDescriptionChange]);
7887
+ var handleTitleKeyDown = React__default.useCallback((event, card, column) => {
7888
+ if (event.key === 'Enter') {
7889
+ handleTitleBlur(card, column);
7890
+ }
7891
+ }, [handleTitleBlur]);
7892
+ var handleDescriptionKeyDown = React__default.useCallback((event, card, column) => {
7893
+ if (event.key === 'Enter' && !event.shiftKey) {
7894
+ event.preventDefault();
7895
+ handleDescriptionBlur(card, column);
7896
+ }
7897
+ }, [handleDescriptionBlur]);
7898
+ var renderDefaultCard = React__default.useCallback((card, column) => (/*#__PURE__*/React__default.createElement(appStudio.Vertical, Object.assign({
7784
7899
  gap: 4,
7785
7900
  alignItems: "flex-start"
7786
- }, views == null ? void 0 : views.cardContent), /*#__PURE__*/React__default.createElement(Text, {
7901
+ }, views == null ? void 0 : views.cardContent), editingCardId === card.id ? (/*#__PURE__*/React__default.createElement("input", {
7902
+ type: "text",
7903
+ value: editedTitle,
7904
+ onChange: handleTitleChange,
7905
+ onBlur: () => handleTitleBlur(card, column),
7906
+ onKeyDown: event => handleTitleKeyDown(event, card, column),
7907
+ autoFocus: true,
7908
+ style: {
7909
+ border: '1px solid #d0d5dd',
7910
+ borderRadius: '4px',
7911
+ padding: '4px 8px',
7912
+ fontSize: '14px',
7913
+ fontWeight: '600',
7914
+ width: '100%'
7915
+ }
7916
+ })) : (/*#__PURE__*/React__default.createElement(Text, {
7787
7917
  weight: "semiBold",
7788
- size: "sm"
7789
- }, card.title), card.description && (/*#__PURE__*/React__default.createElement(Text, {
7790
7918
  size: "sm",
7791
- color: "#475467"
7792
- }, card.description)))), [views == null ? void 0 : views.cardContent]);
7919
+ onClick: () => handleTitleClick(card)
7920
+ }, card.title)), card.description && (editingDescriptionCardId === card.id ? (/*#__PURE__*/React__default.createElement("textarea", {
7921
+ value: editedDescription,
7922
+ onChange: handleDescriptionChange,
7923
+ onBlur: () => handleDescriptionBlur(card, column),
7924
+ onKeyDown: event => handleDescriptionKeyDown(event, card, column),
7925
+ autoFocus: true,
7926
+ style: {
7927
+ border: '1px solid #d0d5dd',
7928
+ borderRadius: '4px',
7929
+ padding: '4px 8px',
7930
+ fontSize: '14px',
7931
+ width: '100%',
7932
+ minHeight: '60px'
7933
+ }
7934
+ })) : (/*#__PURE__*/React__default.createElement(Text, {
7935
+ size: "sm",
7936
+ color: "#475467",
7937
+ onClick: () => handleDescriptionClick(card)
7938
+ }, card.description))))), [views == null ? void 0 : views.cardContent, editingCardId, editedTitle, editingDescriptionCardId, editedDescription, handleTitleBlur, handleTitleChange, handleTitleClick, handleTitleKeyDown, handleDescriptionBlur, handleDescriptionChange, handleDescriptionClick, handleDescriptionKeyDown]);
7793
7939
  return /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
7794
7940
  display: "flex",
7795
7941
  alignItems: "flex-start",
@@ -7813,27 +7959,21 @@ var KanbanBoardView = _ref => {
7813
7959
  }, views == null ? void 0 : views.columnHeader), renderColumnHeader ? renderColumnHeader(column) : (/*#__PURE__*/React__default.createElement(Text, Object.assign({
7814
7960
  weight: "semiBold",
7815
7961
  size: "md"
7816
- }, views == null ? void 0 : views.columnTitle), column.title))), /*#__PURE__*/React__default.createElement(appStudio.Vertical, Object.assign({
7962
+ }, views == null ? void 0 : views.columnTitle), column.title)), /*#__PURE__*/React__default.createElement(appStudio.View, {
7963
+ onClick: () => onCardCreate == null ? void 0 : onCardCreate({
7964
+ id: "new-card-" + Date.now(),
7965
+ title: 'Nouvelle carte'
7966
+ }, column)
7967
+ }, /*#__PURE__*/React__default.createElement(PlusIcon, {
7968
+ widthHeight: 16
7969
+ }))), /*#__PURE__*/React__default.createElement(appStudio.Vertical, Object.assign({
7817
7970
  gap: 12,
7818
7971
  minHeight: 40,
7819
7972
  onDragOver: event => onColumnDragOver(column.id, event),
7820
7973
  onDrop: event => onColumnDrop(column.id, event),
7821
7974
  opacity: draggedCardId && hoveredColumnId === column.id ? 0.9 : undefined,
7822
7975
  transition: "all 0.15s ease-in-out"
7823
- }, views == null ? void 0 : views.columnBody), column.cards.length === 0 && (/*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
7824
- padding: 12,
7825
- borderWidth: "1px",
7826
- borderStyle: "dashed",
7827
- borderColor: "#d0d5dd",
7828
- borderRadius: 8,
7829
- backgroundColor: "rgba(255, 255, 255, 0.6)",
7830
- textAlign: "center",
7831
- color: "#667085",
7832
- fontSize: "14px"
7833
- }, views == null ? void 0 : views.emptyState), renderEmptyState ? renderEmptyState(column) : (/*#__PURE__*/React__default.createElement(Text, {
7834
- size: "sm",
7835
- color: "#667085"
7836
- }, "Drop cards here")))), column.cards.map(card => (/*#__PURE__*/React__default.createElement(appStudio.View, {
7976
+ }, views == null ? void 0 : views.columnBody), column.cards.map(card => (/*#__PURE__*/React__default.createElement(appStudio.View, {
7837
7977
  key: card.id,
7838
7978
  position: "relative"
7839
7979
  }, /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
@@ -7853,7 +7993,35 @@ var KanbanBoardView = _ref => {
7853
7993
  event.stopPropagation();
7854
7994
  onCardDrop(column.id, card.id, event);
7855
7995
  }
7856
- }, views == null ? void 0 : views.card), renderCard ? renderCard(card, column) : renderDefaultCard(card)))))), column.footer && (/*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({}, views == null ? void 0 : views.columnFooter), column.footer))))));
7996
+ }, views == null ? void 0 : views.card), /*#__PURE__*/React__default.createElement(appStudio.View, {
7997
+ display: "flex",
7998
+ justifyContent: "space-between",
7999
+ alignItems: "flex-start"
8000
+ }, /*#__PURE__*/React__default.createElement(appStudio.View, {
8001
+ flexGrow: 1
8002
+ }, renderCard ? renderCard(card, column) : renderDefaultCard(card, column)), /*#__PURE__*/React__default.createElement(appStudio.View, {
8003
+ onClick: () => onCardDelete == null ? void 0 : onCardDelete(card, column)
8004
+ }, /*#__PURE__*/React__default.createElement(TrashIcon, {
8005
+ widthHeight: 16
8006
+ }))))))), /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
8007
+ padding: 12,
8008
+ borderWidth: "1px",
8009
+ borderStyle: "dashed",
8010
+ borderColor: "#d0d5dd",
8011
+ borderRadius: 8,
8012
+ backgroundColor: "rgba(255, 255, 255, 0.6)",
8013
+ textAlign: "center",
8014
+ color: "#667085",
8015
+ fontSize: "14px"
8016
+ }, views == null ? void 0 : views.emptyState, {
8017
+ onClick: () => onCardCreate == null ? void 0 : onCardCreate({
8018
+ id: "new-card-" + Date.now(),
8019
+ title: 'Nouvelle carte'
8020
+ }, column)
8021
+ }), renderEmptyState ? renderEmptyState(column) : (/*#__PURE__*/React__default.createElement(Text, {
8022
+ size: "sm",
8023
+ color: "#667085"
8024
+ }, "Create a new card")))), column.footer && (/*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({}, views == null ? void 0 : views.columnFooter), column.footer))))));
7857
8025
  };
7858
8026
 
7859
8027
  var KanbanBoardComponent = props => {
@@ -8280,11 +8448,111 @@ var iconButtonStyles = {
8280
8448
  border: 'none'
8281
8449
  };
8282
8450
 
8283
- var ResizeHandle = _ref => {
8451
+ var EventContent = _ref => {
8452
+ var {
8453
+ event,
8454
+ onTitleChange,
8455
+ onDescriptionChange,
8456
+ onEventDelete
8457
+ } = _ref;
8458
+ var [isEditingTitle, setIsEditingTitle] = React.useState(false);
8459
+ var [editedTitle, setEditedTitle] = React.useState(event.title);
8460
+ var [isEditingDescription, setIsEditingDescription] = React.useState(false);
8461
+ var [editedDescription, setEditedDescription] = React.useState(event.description || '');
8462
+ var handleTitleClick = React.useCallback(() => {
8463
+ setIsEditingTitle(true);
8464
+ setEditedTitle(event.title);
8465
+ }, [event.title]);
8466
+ var handleDescriptionClick = React.useCallback(() => {
8467
+ setIsEditingDescription(true);
8468
+ setEditedDescription(event.description || '');
8469
+ }, [event.description]);
8470
+ var handleTitleChange = React.useCallback(e => {
8471
+ setEditedTitle(e.target.value);
8472
+ }, []);
8473
+ var handleDescriptionChange = React.useCallback(e => {
8474
+ setEditedDescription(e.target.value);
8475
+ }, []);
8476
+ var handleTitleBlur = React.useCallback(() => {
8477
+ if (isEditingTitle) {
8478
+ onTitleChange(event, editedTitle);
8479
+ setIsEditingTitle(false);
8480
+ }
8481
+ }, [isEditingTitle, onTitleChange, event, editedTitle]);
8482
+ var handleDescriptionBlur = React.useCallback(() => {
8483
+ if (isEditingDescription) {
8484
+ onDescriptionChange(event, editedDescription);
8485
+ setIsEditingDescription(false);
8486
+ }
8487
+ }, [isEditingDescription, onDescriptionChange, event, editedDescription]);
8488
+ var handleTitleKeyDown = React.useCallback(e => {
8489
+ if (e.key === 'Enter') {
8490
+ handleTitleBlur();
8491
+ }
8492
+ }, [handleTitleBlur]);
8493
+ var handleDescriptionKeyDown = React.useCallback(e => {
8494
+ if (e.key === 'Enter' && !e.shiftKey) {
8495
+ e.preventDefault();
8496
+ handleDescriptionBlur();
8497
+ }
8498
+ }, [handleDescriptionBlur]);
8499
+ return /*#__PURE__*/React__default.createElement(appStudio.Horizontal, {
8500
+ overflow: "hidden",
8501
+ textOverflow: "ellipsis",
8502
+ whiteSpace: "nowrap",
8503
+ width: "100%",
8504
+ justifyContent: "space-between"
8505
+ }, isEditingTitle ? (/*#__PURE__*/React__default.createElement("input", {
8506
+ type: "text",
8507
+ value: editedTitle,
8508
+ onChange: handleTitleChange,
8509
+ onBlur: handleTitleBlur,
8510
+ onKeyDown: handleTitleKeyDown,
8511
+ autoFocus: true,
8512
+ style: {
8513
+ border: '1px solid #d0d5dd',
8514
+ borderRadius: '4px',
8515
+ padding: '2px 4px',
8516
+ fontSize: '11px',
8517
+ fontWeight: '500',
8518
+ width: '100%'
8519
+ }
8520
+ })) : (/*#__PURE__*/React__default.createElement(appStudio.Text, {
8521
+ fontSize: 11,
8522
+ fontWeight: 500,
8523
+ onClick: handleTitleClick
8524
+ }, event.title)), event.description && (isEditingDescription ? (/*#__PURE__*/React__default.createElement("textarea", {
8525
+ value: editedDescription,
8526
+ onChange: handleDescriptionChange,
8527
+ onBlur: handleDescriptionBlur,
8528
+ onKeyDown: handleDescriptionKeyDown,
8529
+ autoFocus: true,
8530
+ style: {
8531
+ border: '1px solid #d0d5dd',
8532
+ borderRadius: '4px',
8533
+ padding: '2px 4px',
8534
+ fontSize: '11px',
8535
+ width: '100%',
8536
+ minHeight: '40px',
8537
+ marginTop: '4px'
8538
+ }
8539
+ })) : (/*#__PURE__*/React__default.createElement(appStudio.Text, {
8540
+ fontSize: 11,
8541
+ color: "color.gray.600",
8542
+ onClick: handleDescriptionClick
8543
+ }, event.description))), /*#__PURE__*/React__default.createElement(appStudio.Center, {
8544
+ onClick: () => onEventDelete(event),
8545
+ cursor: "pointer",
8546
+ marginLeft: 4
8547
+ }, /*#__PURE__*/React__default.createElement(TrashIcon, {
8548
+ widthHeight: 12
8549
+ })));
8550
+ };
8551
+ var ResizeHandle = _ref2 => {
8284
8552
  var {
8285
8553
  direction,
8286
8554
  onMouseDown
8287
- } = _ref;
8555
+ } = _ref2;
8288
8556
  var [isHovered, setIsHovered] = React.useState(false);
8289
8557
  return /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
8290
8558
  position: "absolute",
@@ -8309,7 +8577,7 @@ var ResizeHandle = _ref => {
8309
8577
  var MONTH_EVENT_ROW_HEIGHT = 22;
8310
8578
  var MONTH_EVENT_ROW_GAP = 4;
8311
8579
  var MONTH_EVENT_TOP_OFFSET = 32;
8312
- var Calendar = _ref2 => {
8580
+ var Calendar = _ref3 => {
8313
8581
  var {
8314
8582
  initialDate = new Date(),
8315
8583
  initialView = 'month',
@@ -8321,11 +8589,14 @@ var Calendar = _ref2 => {
8321
8589
  onDateChange,
8322
8590
  onViewChange,
8323
8591
  onEventAdd,
8592
+ onEventTitleChange,
8593
+ onEventDescriptionChange,
8594
+ onEventDelete,
8324
8595
  views = {},
8325
8596
  width = '100%',
8326
8597
  maxWidth = 1200,
8327
8598
  weekStartsOn = 0
8328
- } = _ref2;
8599
+ } = _ref3;
8329
8600
  var {
8330
8601
  getColor
8331
8602
  } = appStudio.useTheme();
@@ -8352,6 +8623,31 @@ var Calendar = _ref2 => {
8352
8623
  React__default.useEffect(() => {
8353
8624
  setLocalEvents(events);
8354
8625
  }, [events]);
8626
+ var handleEventTitleChange = React.useCallback((event, newTitle) => {
8627
+ if (onEventTitleChange) {
8628
+ onEventTitleChange(event, newTitle);
8629
+ return;
8630
+ }
8631
+ setLocalEvents(prevEvents => prevEvents.map(ev => ev.id === event.id ? Object.assign({}, ev, {
8632
+ title: newTitle
8633
+ }) : ev));
8634
+ }, [onEventTitleChange]);
8635
+ var handleEventDescriptionChange = React.useCallback((event, newDescription) => {
8636
+ if (onEventDescriptionChange) {
8637
+ onEventDescriptionChange(event, newDescription);
8638
+ return;
8639
+ }
8640
+ setLocalEvents(prevEvents => prevEvents.map(ev => ev.id === event.id ? Object.assign({}, ev, {
8641
+ description: newDescription
8642
+ }) : ev));
8643
+ }, [onEventDescriptionChange]);
8644
+ var handleEventDelete = React.useCallback(event => {
8645
+ if (onEventDelete) {
8646
+ onEventDelete(event);
8647
+ return;
8648
+ }
8649
+ setLocalEvents(prevEvents => prevEvents.filter(ev => ev.id !== event.id));
8650
+ }, [onEventDelete]);
8355
8651
  // Get the month start for current date
8356
8652
  var currentMonth = React.useMemo(() => getFirstDayOfMonth(currentDate), [currentDate]);
8357
8653
  // Generate calendar dates based on view
@@ -8712,12 +9008,12 @@ var Calendar = _ref2 => {
8712
9008
  top: event.segmentRow * (MONTH_EVENT_ROW_HEIGHT + MONTH_EVENT_ROW_GAP) + "px",
8713
9009
  onMouseDown: e => handleEventMouseDown(e, event),
8714
9010
  title: event.title
8715
- }, views.event), /*#__PURE__*/React__default.createElement(appStudio.View, {
8716
- overflow: "hidden",
8717
- textOverflow: "ellipsis",
8718
- whiteSpace: "nowrap",
8719
- width: "100%"
8720
- }, event.title), showLeftHandle && (/*#__PURE__*/React__default.createElement(ResizeHandle, {
9011
+ }, views.event), /*#__PURE__*/React__default.createElement(EventContent, {
9012
+ event: event,
9013
+ onTitleChange: handleEventTitleChange,
9014
+ onDescriptionChange: handleEventDescriptionChange,
9015
+ onEventDelete: handleEventDelete
9016
+ }), showLeftHandle && (/*#__PURE__*/React__default.createElement(ResizeHandle, {
8721
9017
  direction: "left",
8722
9018
  onMouseDown: e => handleResizeStart(e, event, 'left')
8723
9019
  })), showRightHandle && (/*#__PURE__*/React__default.createElement(ResizeHandle, {
@@ -8778,12 +9074,12 @@ var Calendar = _ref2 => {
8778
9074
  userSelect: "none",
8779
9075
  onMouseDown: e => handleEventMouseDown(e, event),
8780
9076
  title: event.title
8781
- }, views.event), /*#__PURE__*/React__default.createElement(appStudio.View, {
8782
- overflow: "hidden",
8783
- textOverflow: "ellipsis",
8784
- whiteSpace: "nowrap",
8785
- width: "100%"
8786
- }, event.title), /*#__PURE__*/React__default.createElement(ResizeHandle, {
9077
+ }, views.event), /*#__PURE__*/React__default.createElement(EventContent, {
9078
+ event: event,
9079
+ onTitleChange: handleEventTitleChange,
9080
+ onDescriptionChange: handleEventDescriptionChange,
9081
+ onEventDelete: handleEventDelete
9082
+ }), /*#__PURE__*/React__default.createElement(ResizeHandle, {
8787
9083
  direction: "left",
8788
9084
  onMouseDown: e => handleResizeStart(e, event, 'left')
8789
9085
  }), /*#__PURE__*/React__default.createElement(ResizeHandle, {
@@ -8830,7 +9126,7 @@ var Calendar = _ref2 => {
8830
9126
  }, views.timeSlot), dayEvents.filter(event => {
8831
9127
  // Simple check if event starts in this hour
8832
9128
  if (event.start.includes('T')) {
8833
- var eventHour = parseInt(event.start.split('T')[1].split(':')[0]);
9129
+ var eventHour = parseInt(event.start.split('T').split(':'));
8834
9130
  return eventHour === hour;
8835
9131
  }
8836
9132
  return false;
@@ -8843,7 +9139,12 @@ var Calendar = _ref2 => {
8843
9139
  borderLeftColor: colorConfig.border,
8844
9140
  color: colorConfig.text,
8845
9141
  marginBottom: 4
8846
- }, views.event), event.title);
9142
+ }, views.event), /*#__PURE__*/React__default.createElement(EventContent, {
9143
+ event: event,
9144
+ onTitleChange: handleEventTitleChange,
9145
+ onDescriptionChange: handleEventDescriptionChange,
9146
+ onEventDelete: handleEventDelete
9147
+ }));
8847
9148
  })));
8848
9149
  }));
8849
9150
  };