@contractspec/example.crm-pipeline 3.7.5 → 3.7.7

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 (106) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/AGENTS.md +51 -33
  3. package/CHANGELOG.md +16 -0
  4. package/README.md +66 -148
  5. package/dist/browser/events/contact.event.js +1 -1
  6. package/dist/browser/events/deal.event.js +1 -1
  7. package/dist/browser/events/index.js +3 -3
  8. package/dist/browser/events/task.event.js +1 -1
  9. package/dist/browser/index.js +293 -293
  10. package/dist/browser/ui/CrmDashboard.js +221 -221
  11. package/dist/browser/ui/CrmDealCard.js +5 -5
  12. package/dist/browser/ui/CrmPipelineBoard.js +13 -13
  13. package/dist/browser/ui/hooks/index.js +2 -2
  14. package/dist/browser/ui/hooks/useDealList.js +1 -1
  15. package/dist/browser/ui/hooks/useDealMutations.js +1 -1
  16. package/dist/browser/ui/index.js +290 -290
  17. package/dist/browser/ui/modals/CreateDealModal.js +12 -12
  18. package/dist/browser/ui/modals/DealActionsModal.js +21 -21
  19. package/dist/browser/ui/modals/index.js +33 -33
  20. package/dist/browser/ui/renderers/index.js +116 -116
  21. package/dist/browser/ui/renderers/pipeline.renderer.js +97 -97
  22. package/dist/deal/index.d.ts +2 -2
  23. package/dist/events/contact.event.js +1 -1
  24. package/dist/events/deal.event.js +1 -1
  25. package/dist/events/index.js +3 -3
  26. package/dist/events/task.event.js +1 -1
  27. package/dist/handlers/index.d.ts +2 -2
  28. package/dist/index.d.ts +3 -3
  29. package/dist/index.js +293 -293
  30. package/dist/node/events/contact.event.js +1 -1
  31. package/dist/node/events/deal.event.js +1 -1
  32. package/dist/node/events/index.js +3 -3
  33. package/dist/node/events/task.event.js +1 -1
  34. package/dist/node/index.js +293 -293
  35. package/dist/node/ui/CrmDashboard.js +221 -221
  36. package/dist/node/ui/CrmDealCard.js +5 -5
  37. package/dist/node/ui/CrmPipelineBoard.js +13 -13
  38. package/dist/node/ui/hooks/index.js +2 -2
  39. package/dist/node/ui/hooks/useDealList.js +1 -1
  40. package/dist/node/ui/hooks/useDealMutations.js +1 -1
  41. package/dist/node/ui/index.js +290 -290
  42. package/dist/node/ui/modals/CreateDealModal.js +12 -12
  43. package/dist/node/ui/modals/DealActionsModal.js +21 -21
  44. package/dist/node/ui/modals/index.js +33 -33
  45. package/dist/node/ui/renderers/index.js +116 -116
  46. package/dist/node/ui/renderers/pipeline.renderer.js +97 -97
  47. package/dist/operations/index.d.ts +1 -1
  48. package/dist/ui/CrmDashboard.js +221 -221
  49. package/dist/ui/CrmDealCard.js +5 -5
  50. package/dist/ui/CrmPipelineBoard.js +13 -13
  51. package/dist/ui/hooks/index.d.ts +2 -2
  52. package/dist/ui/hooks/index.js +2 -2
  53. package/dist/ui/hooks/useDealList.js +1 -1
  54. package/dist/ui/hooks/useDealMutations.d.ts +9 -0
  55. package/dist/ui/hooks/useDealMutations.js +1 -1
  56. package/dist/ui/index.d.ts +3 -3
  57. package/dist/ui/index.js +290 -290
  58. package/dist/ui/modals/CreateDealModal.js +12 -12
  59. package/dist/ui/modals/DealActionsModal.js +21 -21
  60. package/dist/ui/modals/index.js +33 -33
  61. package/dist/ui/renderers/index.d.ts +1 -1
  62. package/dist/ui/renderers/index.js +116 -116
  63. package/dist/ui/renderers/pipeline.renderer.d.ts +1 -1
  64. package/dist/ui/renderers/pipeline.renderer.js +97 -97
  65. package/package.json +14 -14
  66. package/src/crm-pipeline.feature.ts +86 -86
  67. package/src/deal/deal.enum.ts +8 -8
  68. package/src/deal/deal.operation.ts +255 -255
  69. package/src/deal/deal.schema.ts +92 -92
  70. package/src/deal/deal.test-spec.ts +48 -48
  71. package/src/deal/index.ts +17 -19
  72. package/src/docs/crm-pipeline.docblock.ts +43 -43
  73. package/src/entities/company.entity.ts +52 -52
  74. package/src/entities/contact.entity.ts +67 -67
  75. package/src/entities/deal.entity.ts +134 -134
  76. package/src/entities/index.ts +27 -27
  77. package/src/entities/task.entity.ts +105 -105
  78. package/src/events/contact.event.ts +22 -22
  79. package/src/events/deal.event.ts +77 -77
  80. package/src/events/task.event.ts +19 -19
  81. package/src/example.ts +32 -32
  82. package/src/handlers/crm.handlers.ts +358 -357
  83. package/src/handlers/deal.handlers.ts +179 -179
  84. package/src/handlers/index.ts +18 -19
  85. package/src/handlers/mock-data.ts +167 -167
  86. package/src/index.ts +11 -11
  87. package/src/operations/index.ts +16 -16
  88. package/src/presentations/dashboard.presentation.ts +45 -45
  89. package/src/presentations/pipeline.presentation.ts +90 -90
  90. package/src/seeders/index.ts +26 -26
  91. package/src/shared/overlay-types.ts +23 -23
  92. package/src/ui/CrmDashboard.tsx +256 -256
  93. package/src/ui/CrmDealCard.tsx +64 -64
  94. package/src/ui/CrmPipelineBoard.tsx +105 -105
  95. package/src/ui/hooks/index.ts +3 -3
  96. package/src/ui/hooks/useDealList.ts +85 -85
  97. package/src/ui/hooks/useDealMutations.ts +151 -150
  98. package/src/ui/index.ts +5 -10
  99. package/src/ui/modals/CreateDealModal.tsx +217 -217
  100. package/src/ui/modals/DealActionsModal.tsx +390 -390
  101. package/src/ui/overlays/demo-overlays.ts +43 -43
  102. package/src/ui/renderers/index.ts +4 -3
  103. package/src/ui/renderers/pipeline.markdown.ts +165 -165
  104. package/src/ui/renderers/pipeline.renderer.tsx +17 -16
  105. package/tsconfig.json +7 -8
  106. package/tsdown.config.js +7 -3
@@ -13,7 +13,7 @@ function CrmDealCard({ deal, onClick }) {
13
13
  const daysUntilClose = deal.expectedCloseDate ? Math.ceil((deal.expectedCloseDate.getTime() - Date.now()) / (1000 * 60 * 60 * 24)) : null;
14
14
  return /* @__PURE__ */ jsxDEV("div", {
15
15
  onClick,
16
- className: "border-border bg-card cursor-pointer rounded-lg border p-3 shadow-sm transition-shadow hover:shadow-md",
16
+ className: "cursor-pointer rounded-lg border border-border bg-card p-3 shadow-sm transition-shadow hover:shadow-md",
17
17
  role: "button",
18
18
  tabIndex: 0,
19
19
  onKeyDown: (e) => {
@@ -22,22 +22,22 @@ function CrmDealCard({ deal, onClick }) {
22
22
  },
23
23
  children: [
24
24
  /* @__PURE__ */ jsxDEV("h4", {
25
- className: "leading-snug font-medium",
25
+ className: "font-medium leading-snug",
26
26
  children: deal.name
27
27
  }, undefined, false, undefined, this),
28
28
  /* @__PURE__ */ jsxDEV("div", {
29
- className: "text-primary mt-2 text-lg font-semibold",
29
+ className: "mt-2 font-semibold text-lg text-primary",
30
30
  children: formatCurrency(deal.value, deal.currency)
31
31
  }, undefined, false, undefined, this),
32
32
  /* @__PURE__ */ jsxDEV("div", {
33
- className: "text-muted-foreground mt-3 flex items-center justify-between text-xs",
33
+ className: "mt-3 flex items-center justify-between text-muted-foreground text-xs",
34
34
  children: [
35
35
  daysUntilClose !== null && /* @__PURE__ */ jsxDEV("span", {
36
36
  className: daysUntilClose < 0 ? "text-red-500" : daysUntilClose <= 7 ? "text-yellow-600 dark:text-yellow-500" : "",
37
37
  children: daysUntilClose < 0 ? `${Math.abs(daysUntilClose)}d overdue` : daysUntilClose === 0 ? "Due today" : `${daysUntilClose}d left`
38
38
  }, undefined, false, undefined, this),
39
39
  /* @__PURE__ */ jsxDEV("span", {
40
- className: `rounded px-1.5 py-0.5 text-xs font-medium ${deal.status === "WON" ? "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400" : deal.status === "LOST" ? "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400" : "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"}`,
40
+ className: `rounded px-1.5 py-0.5 font-medium text-xs ${deal.status === "WON" ? "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400" : deal.status === "LOST" ? "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400" : "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"}`,
41
41
  children: deal.status
42
42
  }, undefined, false, undefined, this)
43
43
  ]
@@ -13,7 +13,7 @@ function CrmDealCard({ deal, onClick }) {
13
13
  const daysUntilClose = deal.expectedCloseDate ? Math.ceil((deal.expectedCloseDate.getTime() - Date.now()) / (1000 * 60 * 60 * 24)) : null;
14
14
  return /* @__PURE__ */ jsxDEV("div", {
15
15
  onClick,
16
- className: "border-border bg-card cursor-pointer rounded-lg border p-3 shadow-sm transition-shadow hover:shadow-md",
16
+ className: "cursor-pointer rounded-lg border border-border bg-card p-3 shadow-sm transition-shadow hover:shadow-md",
17
17
  role: "button",
18
18
  tabIndex: 0,
19
19
  onKeyDown: (e) => {
@@ -22,22 +22,22 @@ function CrmDealCard({ deal, onClick }) {
22
22
  },
23
23
  children: [
24
24
  /* @__PURE__ */ jsxDEV("h4", {
25
- className: "leading-snug font-medium",
25
+ className: "font-medium leading-snug",
26
26
  children: deal.name
27
27
  }, undefined, false, undefined, this),
28
28
  /* @__PURE__ */ jsxDEV("div", {
29
- className: "text-primary mt-2 text-lg font-semibold",
29
+ className: "mt-2 font-semibold text-lg text-primary",
30
30
  children: formatCurrency(deal.value, deal.currency)
31
31
  }, undefined, false, undefined, this),
32
32
  /* @__PURE__ */ jsxDEV("div", {
33
- className: "text-muted-foreground mt-3 flex items-center justify-between text-xs",
33
+ className: "mt-3 flex items-center justify-between text-muted-foreground text-xs",
34
34
  children: [
35
35
  daysUntilClose !== null && /* @__PURE__ */ jsxDEV("span", {
36
36
  className: daysUntilClose < 0 ? "text-red-500" : daysUntilClose <= 7 ? "text-yellow-600 dark:text-yellow-500" : "",
37
37
  children: daysUntilClose < 0 ? `${Math.abs(daysUntilClose)}d overdue` : daysUntilClose === 0 ? "Due today" : `${daysUntilClose}d left`
38
38
  }, undefined, false, undefined, this),
39
39
  /* @__PURE__ */ jsxDEV("span", {
40
- className: `rounded px-1.5 py-0.5 text-xs font-medium ${deal.status === "WON" ? "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400" : deal.status === "LOST" ? "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400" : "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"}`,
40
+ className: `rounded px-1.5 py-0.5 font-medium text-xs ${deal.status === "WON" ? "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400" : deal.status === "LOST" ? "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400" : "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"}`,
41
41
  children: deal.status
42
42
  }, undefined, false, undefined, this)
43
43
  ]
@@ -75,10 +75,10 @@ function CrmPipelineBoard({
75
75
  const deals = dealsByStage[stage.id] ?? [];
76
76
  const stageValue = deals.reduce((sum, d) => sum + d.value, 0);
77
77
  return /* @__PURE__ */ jsxDEV2("div", {
78
- className: "bg-muted/30 flex w-72 flex-shrink-0 flex-col rounded-lg",
78
+ className: "flex w-72 flex-shrink-0 flex-col rounded-lg bg-muted/30",
79
79
  children: [
80
80
  /* @__PURE__ */ jsxDEV2("div", {
81
- className: "border-border flex items-center justify-between border-b px-3 py-2",
81
+ className: "flex items-center justify-between border-border border-b px-3 py-2",
82
82
  children: [
83
83
  /* @__PURE__ */ jsxDEV2("div", {
84
84
  children: [
@@ -97,7 +97,7 @@ function CrmPipelineBoard({
97
97
  ]
98
98
  }, undefined, true, undefined, this),
99
99
  /* @__PURE__ */ jsxDEV2("span", {
100
- className: "bg-muted flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium",
100
+ className: "flex h-6 w-6 items-center justify-center rounded-full bg-muted font-medium text-xs",
101
101
  children: deals.length
102
102
  }, undefined, false, undefined, this)
103
103
  ]
@@ -105,7 +105,7 @@ function CrmPipelineBoard({
105
105
  /* @__PURE__ */ jsxDEV2("div", {
106
106
  className: "flex flex-1 flex-col gap-2 p-2",
107
107
  children: deals.length === 0 ? /* @__PURE__ */ jsxDEV2("div", {
108
- className: "border-muted-foreground/20 text-muted-foreground flex h-24 items-center justify-center rounded-md border-2 border-dashed text-xs",
108
+ className: "flex h-24 items-center justify-center rounded-md border-2 border-muted-foreground/20 border-dashed text-muted-foreground text-xs",
109
109
  children: "No deals"
110
110
  }, undefined, false, undefined, this) : deals.map((deal) => /* @__PURE__ */ jsxDEV2("div", {
111
111
  className: "group relative",
@@ -123,15 +123,15 @@ function CrmPipelineBoard({
123
123
  e.stopPropagation();
124
124
  setQuickMoveOpen(quickMoveOpen === deal.id ? null : deal.id);
125
125
  },
126
- className: "bg-background border-border hover:bg-muted flex h-6 w-6 items-center justify-center rounded border text-xs shadow-sm",
126
+ className: "flex h-6 w-6 items-center justify-center rounded border border-border bg-background text-xs shadow-sm hover:bg-muted",
127
127
  title: "Quick move",
128
128
  children: "➡️"
129
129
  }, undefined, false, undefined, this),
130
130
  quickMoveOpen === deal.id && /* @__PURE__ */ jsxDEV2("div", {
131
- className: "bg-card border-border absolute top-7 right-0 z-20 min-w-[140px] rounded-lg border py-1 shadow-lg",
131
+ className: "absolute top-7 right-0 z-20 min-w-[140px] rounded-lg border border-border bg-card py-1 shadow-lg",
132
132
  children: [
133
133
  /* @__PURE__ */ jsxDEV2("p", {
134
- className: "text-muted-foreground px-3 py-1 text-xs font-medium",
134
+ className: "px-3 py-1 font-medium text-muted-foreground text-xs",
135
135
  children: "Move to:"
136
136
  }, undefined, false, undefined, this),
137
137
  sortedStages.filter((s) => s.id !== deal.stageId).map((s) => /* @__PURE__ */ jsxDEV2("button", {
@@ -140,7 +140,7 @@ function CrmPipelineBoard({
140
140
  e.stopPropagation();
141
141
  handleQuickMove(deal.id, s.id);
142
142
  },
143
- className: "hover:bg-muted w-full px-3 py-1.5 text-left text-sm",
143
+ className: "w-full px-3 py-1.5 text-left text-sm hover:bg-muted",
144
144
  children: s.name
145
145
  }, s.id, false, undefined, this))
146
146
  ]
@@ -1,6 +1,6 @@
1
1
  // src/ui/hooks/useDealList.ts
2
- import { useCallback, useEffect, useMemo, useState } from "react";
3
2
  import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
3
+ import { useCallback, useEffect, useMemo, useState } from "react";
4
4
  "use client";
5
5
  function useDealList(options = {}) {
6
6
  const { handlers, projectId } = useTemplateRuntime();
@@ -81,8 +81,8 @@ function useDealList(options = {}) {
81
81
  }
82
82
 
83
83
  // src/ui/hooks/useDealMutations.ts
84
- import { useCallback as useCallback2, useState as useState2 } from "react";
85
84
  import { useTemplateRuntime as useTemplateRuntime2 } from "@contractspec/lib.example-shared-ui";
85
+ import { useCallback as useCallback2, useState as useState2 } from "react";
86
86
  function useDealMutations(options = {}) {
87
87
  const { handlers, projectId } = useTemplateRuntime2();
88
88
  const { crm } = handlers;
@@ -1,6 +1,6 @@
1
1
  // src/ui/hooks/useDealList.ts
2
- import { useCallback, useEffect, useMemo, useState } from "react";
3
2
  import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
3
+ import { useCallback, useEffect, useMemo, useState } from "react";
4
4
  "use client";
5
5
  function useDealList(options = {}) {
6
6
  const { handlers, projectId } = useTemplateRuntime();
@@ -1,6 +1,6 @@
1
1
  // src/ui/hooks/useDealMutations.ts
2
- import { useCallback, useState } from "react";
3
2
  import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
3
+ import { useCallback, useState } from "react";
4
4
  function useDealMutations(options = {}) {
5
5
  const { handlers, projectId } = useTemplateRuntime();
6
6
  const { crm } = handlers;