@powerhousedao/contributor-billing 0.1.41 → 0.1.42
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/document-models/document-models.d.ts.map +1 -1
- package/dist/document-models/document-models.js +2 -0
- package/dist/document-models/resource-template/gen/document-model.js +25 -25
- package/dist/document-models/resource-template/gen/reducer.d.ts +1 -1
- package/dist/document-models/resource-template/gen/reducer.d.ts.map +1 -1
- package/dist/document-models/resource-template/hooks.d.ts +1 -1
- package/dist/document-models/resource-template/hooks.d.ts.map +1 -1
- package/dist/document-models/resource-template/module.d.ts +1 -1
- package/dist/document-models/resource-template/module.d.ts.map +1 -1
- package/dist/document-models/resource-template/reducers/audience-management.d.ts +3 -0
- package/dist/document-models/resource-template/reducers/audience-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/reducers/audience-management.js +17 -0
- package/dist/document-models/resource-template/reducers/facet-preset-management.d.ts +59 -0
- package/dist/document-models/resource-template/reducers/facet-preset-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/reducers/facet-preset-management.js +52 -0
- package/dist/document-models/resource-template/reducers/facet-targeting.d.ts +3 -0
- package/dist/document-models/resource-template/reducers/facet-targeting.d.ts.map +1 -0
- package/dist/document-models/resource-template/reducers/facet-targeting.js +47 -0
- package/dist/document-models/resource-template/reducers/option-group-management.d.ts +3 -0
- package/dist/document-models/resource-template/reducers/option-group-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/reducers/option-group-management.js +44 -0
- package/dist/document-models/resource-template/reducers/service-category-management.d.ts +3 -0
- package/dist/document-models/resource-template/reducers/service-category-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/reducers/service-category-management.js +10 -0
- package/dist/document-models/resource-template/reducers/service-management.d.ts +3 -0
- package/dist/document-models/resource-template/reducers/service-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/reducers/service-management.js +71 -0
- package/dist/document-models/resource-template/reducers/template-management.d.ts +3 -0
- package/dist/document-models/resource-template/reducers/template-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/reducers/template-management.js +32 -0
- package/dist/document-models/resource-template/src/reducers/audience-management.d.ts.map +1 -1
- package/dist/document-models/resource-template/src/reducers/audience-management.js +1 -1
- package/dist/document-models/resource-template/src/reducers/facet-targeting.d.ts.map +1 -1
- package/dist/document-models/resource-template/src/reducers/facet-targeting.js +1 -1
- package/dist/document-models/resource-template/src/reducers/option-group-management.d.ts.map +1 -1
- package/dist/document-models/resource-template/src/reducers/option-group-management.js +1 -1
- package/dist/document-models/resource-template/src/reducers/service-category-management.d.ts.map +1 -1
- package/dist/document-models/resource-template/src/reducers/service-category-management.js +1 -1
- package/dist/document-models/resource-template/src/reducers/service-management.d.ts.map +1 -1
- package/dist/document-models/resource-template/src/reducers/service-management.js +1 -1
- package/dist/document-models/resource-template/src/reducers/template-management.d.ts.map +1 -1
- package/dist/document-models/resource-template/src/reducers/template-management.js +1 -1
- package/dist/document-models/service-offering/gen/document-model.js +5 -5
- package/dist/document-models/service-offering/gen/document-schema.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/reducer.d.ts +1 -1
- package/dist/document-models/service-offering/gen/reducer.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/schema/types.d.ts +3 -0
- package/dist/document-models/service-offering/gen/schema/types.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/schema/zod.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/schema/zod.js +3 -0
- package/dist/document-models/service-offering/src/reducers/option-group-management.d.ts.map +1 -1
- package/dist/document-models/service-offering/src/reducers/option-group-management.js +11 -8
- package/dist/document-models/service-offering/src/reducers/service-management.d.ts.map +1 -1
- package/dist/document-models/service-offering/src/reducers/service-management.js +20 -12
- package/dist/document-models/service-offering/src/reducers/tier-management.d.ts.map +1 -1
- package/dist/document-models/service-offering/src/reducers/tier-management.js +21 -19
- package/dist/editors/resource-template-editor/components/FacetTargeting.d.ts +1 -1
- package/dist/editors/resource-template-editor/components/FacetTargeting.d.ts.map +1 -1
- package/dist/editors/resource-template-editor/components/FacetTargeting.js +526 -19
- package/dist/editors/resource-template-editor/components/TemplateInfo.d.ts +1 -1
- package/dist/editors/resource-template-editor/components/TemplateInfo.d.ts.map +1 -1
- package/dist/editors/resource-template-editor/components/TemplateInfo.js +302 -2
- package/dist/editors/resource-template-editor/editor.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/EditName.js +1 -1
- package/dist/editors/service-offering-editor/components/OfferingInfo.d.ts +1 -1
- package/dist/editors/service-offering-editor/components/OfferingInfo.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/OfferingProgress.d.ts +10 -0
- package/dist/editors/service-offering-editor/components/OfferingProgress.d.ts.map +1 -0
- package/dist/editors/service-offering-editor/components/OfferingProgress.js +240 -0
- package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts +1 -1
- package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.js +111 -4
- package/dist/editors/service-offering-editor/components/ScopeAndFacets.d.ts +1 -1
- package/dist/editors/service-offering-editor/components/ScopeAndFacets.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/ServiceCatalog.d.ts +1 -1
- package/dist/editors/service-offering-editor/components/ServiceCatalog.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/ServiceCatalog.js +318 -1
- package/dist/editors/service-offering-editor/components/ServicesList.d.ts +1 -1
- package/dist/editors/service-offering-editor/components/ServicesList.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/ServicesList.js +1 -1
- package/dist/editors/service-offering-editor/components/TheMatrix.d.ts +1 -1
- package/dist/editors/service-offering-editor/components/TheMatrix.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/TheMatrix.js +548 -13
- package/dist/editors/service-offering-editor/components/TierDefinition.d.ts +1 -1
- package/dist/editors/service-offering-editor/components/TierDefinition.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/TierDefinition.js +406 -4
- package/dist/editors/service-offering-editor/components/TiersList.d.ts +1 -1
- package/dist/editors/service-offering-editor/components/TiersList.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/editor.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/editor.js +2 -2
- package/dist/powerhouse.manifest.json +18 -0
- package/dist/subgraphs/index.d.ts +1 -0
- package/dist/subgraphs/index.d.ts.map +1 -1
- package/dist/subgraphs/index.js +1 -0
- package/dist/subgraphs/resource-template/index.d.ts +11 -0
- package/dist/subgraphs/resource-template/index.d.ts.map +1 -0
- package/dist/subgraphs/resource-template/index.js +11 -0
- package/dist/subgraphs/resource-template/resolvers.d.ts +3 -0
- package/dist/subgraphs/resource-template/resolvers.d.ts.map +1 -0
- package/dist/subgraphs/resource-template/resolvers.js +312 -0
- package/dist/subgraphs/resource-template/schema.d.ts +3 -0
- package/dist/subgraphs/resource-template/schema.d.ts.map +1 -0
- package/dist/subgraphs/resource-template/schema.js +262 -0
- package/dist/subgraphs/service-offering/resolvers.d.ts.map +1 -1
- package/dist/subgraphs/service-offering/resolvers.js +24 -0
- package/dist/subgraphs/service-offering/schema.d.ts.map +1 -1
- package/dist/subgraphs/service-offering/schema.js +21 -0
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DocumentDispatch } from "@powerhousedao/reactor-browser";
|
|
2
|
-
import type { ServiceOfferingDocument, ServiceOfferingAction } from "
|
|
2
|
+
import type { ServiceOfferingDocument, ServiceOfferingAction } from "@powerhousedao/contributor-billing/document-models/service-offering";
|
|
3
3
|
interface TierDefinitionProps {
|
|
4
4
|
document: ServiceOfferingDocument;
|
|
5
5
|
dispatch: DocumentDispatch<ServiceOfferingAction>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TierDefinition.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TierDefinition.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAGtB,MAAM,
|
|
1
|
+
{"version":3,"file":"TierDefinition.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TierDefinition.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAGtB,MAAM,qEAAqE,CAAC;AAQ7E,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;CACnD;AAi7BD,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CA+RzE"}
|
|
@@ -2,6 +2,57 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
import { generateId } from "document-model/core";
|
|
4
4
|
import { addTier, updateTier, updateTierPricing, deleteTier, } from "../../../document-models/service-offering/gen/creators.js";
|
|
5
|
+
// Calculate price per day for mental accounting display
|
|
6
|
+
const BILLING_CYCLE_DAYS = {
|
|
7
|
+
MONTHLY: 30,
|
|
8
|
+
QUARTERLY: 90,
|
|
9
|
+
SEMI_ANNUAL: 180,
|
|
10
|
+
ANNUAL: 365,
|
|
11
|
+
ONE_TIME: 1,
|
|
12
|
+
};
|
|
13
|
+
function getPricePerDay(amount, billingCycle) {
|
|
14
|
+
if (billingCycle === "ONE_TIME")
|
|
15
|
+
return "";
|
|
16
|
+
const perDay = amount / BILLING_CYCLE_DAYS[billingCycle];
|
|
17
|
+
return perDay.toFixed(2);
|
|
18
|
+
}
|
|
19
|
+
// Determine which tier should show "Most Popular" badge
|
|
20
|
+
// Uses middle-tier heuristic (Good-Better-Best psychology)
|
|
21
|
+
function getRecommendedTierIndex(tiers) {
|
|
22
|
+
if (tiers.length < 2)
|
|
23
|
+
return -1;
|
|
24
|
+
if (tiers.length === 2)
|
|
25
|
+
return 1; // Second tier for 2-tier setup
|
|
26
|
+
// For 3+ tiers, recommend the middle tier (or middle-right for even counts)
|
|
27
|
+
return Math.floor(tiers.length / 2);
|
|
28
|
+
}
|
|
29
|
+
// Charm Pricing - Left-digit bias pricing suggestions
|
|
30
|
+
// Convert any price to nearest charm prices (ending in .99 or .97)
|
|
31
|
+
function getCharmPriceSuggestions(currentPrice) {
|
|
32
|
+
if (currentPrice <= 0)
|
|
33
|
+
return [9.99, 19.99, 29.99];
|
|
34
|
+
const suggestions = [];
|
|
35
|
+
const roundedDown = Math.floor(currentPrice);
|
|
36
|
+
const roundedUp = Math.ceil(currentPrice);
|
|
37
|
+
// Lower charm price (X9.99 below current)
|
|
38
|
+
const lowerCharm = Math.max(0, roundedDown - (roundedDown % 10) - 1) + 9.99;
|
|
39
|
+
if (lowerCharm > 0 && lowerCharm !== currentPrice) {
|
|
40
|
+
suggestions.push(lowerCharm);
|
|
41
|
+
}
|
|
42
|
+
// Nearest .99 at current level
|
|
43
|
+
const nearestCharm = roundedUp - 0.01;
|
|
44
|
+
if (nearestCharm > 0 &&
|
|
45
|
+
nearestCharm !== currentPrice &&
|
|
46
|
+
!suggestions.includes(nearestCharm)) {
|
|
47
|
+
suggestions.push(nearestCharm);
|
|
48
|
+
}
|
|
49
|
+
// Higher charm price (X9.99 above current)
|
|
50
|
+
const higherCharm = roundedUp + (10 - (roundedUp % 10)) - 0.01;
|
|
51
|
+
if (higherCharm !== currentPrice && !suggestions.includes(higherCharm)) {
|
|
52
|
+
suggestions.push(higherCharm);
|
|
53
|
+
}
|
|
54
|
+
return suggestions.slice(0, 3).sort((a, b) => a - b);
|
|
55
|
+
}
|
|
5
56
|
const BILLING_CYCLES = [
|
|
6
57
|
{ value: "MONTHLY", label: "Month" },
|
|
7
58
|
{ value: "QUARTERLY", label: "Quarter" },
|
|
@@ -20,6 +71,102 @@ const TIER_ACCENTS = [
|
|
|
20
71
|
{ color: "var(--so-sky-500)", bg: "var(--so-sky-50)", name: "sky" },
|
|
21
72
|
{ color: "var(--so-rose-500)", bg: "var(--so-rose-50)", name: "rose" },
|
|
22
73
|
];
|
|
74
|
+
const TIER_PRESETS = [
|
|
75
|
+
{
|
|
76
|
+
name: "Standard 3-Tier",
|
|
77
|
+
description: "Basic → Professional → Enterprise",
|
|
78
|
+
icon: "📊",
|
|
79
|
+
tiers: [
|
|
80
|
+
{
|
|
81
|
+
name: "Basic",
|
|
82
|
+
amount: 99,
|
|
83
|
+
billingCycle: "MONTHLY",
|
|
84
|
+
isCustomPricing: false,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "Professional",
|
|
88
|
+
amount: 299,
|
|
89
|
+
billingCycle: "MONTHLY",
|
|
90
|
+
isCustomPricing: false,
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "Enterprise",
|
|
94
|
+
amount: null,
|
|
95
|
+
billingCycle: "MONTHLY",
|
|
96
|
+
isCustomPricing: true,
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: "Freemium Model",
|
|
102
|
+
description: "Free → Pro → Business",
|
|
103
|
+
icon: "🚀",
|
|
104
|
+
tiers: [
|
|
105
|
+
{
|
|
106
|
+
name: "Free",
|
|
107
|
+
amount: 0,
|
|
108
|
+
billingCycle: "MONTHLY",
|
|
109
|
+
isCustomPricing: false,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: "Pro",
|
|
113
|
+
amount: 49,
|
|
114
|
+
billingCycle: "MONTHLY",
|
|
115
|
+
isCustomPricing: false,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: "Business",
|
|
119
|
+
amount: 149,
|
|
120
|
+
billingCycle: "MONTHLY",
|
|
121
|
+
isCustomPricing: false,
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: "Simple 2-Tier",
|
|
127
|
+
description: "Starter → Growth",
|
|
128
|
+
icon: "⚡",
|
|
129
|
+
tiers: [
|
|
130
|
+
{
|
|
131
|
+
name: "Starter",
|
|
132
|
+
amount: 79,
|
|
133
|
+
billingCycle: "MONTHLY",
|
|
134
|
+
isCustomPricing: false,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: "Growth",
|
|
138
|
+
amount: 199,
|
|
139
|
+
billingCycle: "MONTHLY",
|
|
140
|
+
isCustomPricing: false,
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: "Annual Focus",
|
|
146
|
+
description: "Annual pricing with discounts",
|
|
147
|
+
icon: "📅",
|
|
148
|
+
tiers: [
|
|
149
|
+
{
|
|
150
|
+
name: "Essential",
|
|
151
|
+
amount: 990,
|
|
152
|
+
billingCycle: "ANNUAL",
|
|
153
|
+
isCustomPricing: false,
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: "Professional",
|
|
157
|
+
amount: 2990,
|
|
158
|
+
billingCycle: "ANNUAL",
|
|
159
|
+
isCustomPricing: false,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
name: "Enterprise",
|
|
163
|
+
amount: null,
|
|
164
|
+
billingCycle: "ANNUAL",
|
|
165
|
+
isCustomPricing: true,
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
];
|
|
23
170
|
const tierStyles = `
|
|
24
171
|
.tier-def {
|
|
25
172
|
display: flex;
|
|
@@ -42,6 +189,7 @@ const tierStyles = `
|
|
|
42
189
|
overflow: hidden;
|
|
43
190
|
transition: var(--so-transition-base);
|
|
44
191
|
animation: tier-slide-up 0.3s ease-out;
|
|
192
|
+
position: relative;
|
|
45
193
|
}
|
|
46
194
|
|
|
47
195
|
.tier-card:hover {
|
|
@@ -49,6 +197,42 @@ const tierStyles = `
|
|
|
49
197
|
transform: translateY(-2px);
|
|
50
198
|
}
|
|
51
199
|
|
|
200
|
+
/* Popular/Recommended Tier - Social Proof */
|
|
201
|
+
.tier-card--popular {
|
|
202
|
+
border: 2px solid var(--so-violet-300);
|
|
203
|
+
transform: scale(1.02);
|
|
204
|
+
z-index: 1;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.tier-card--popular:hover {
|
|
208
|
+
transform: scale(1.02) translateY(-2px);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.tier-card__popular-banner {
|
|
212
|
+
position: absolute;
|
|
213
|
+
top: -1px;
|
|
214
|
+
left: 50%;
|
|
215
|
+
transform: translateX(-50%);
|
|
216
|
+
display: flex;
|
|
217
|
+
align-items: center;
|
|
218
|
+
gap: 0.25rem;
|
|
219
|
+
padding: 0.25rem 0.875rem;
|
|
220
|
+
background: linear-gradient(135deg, var(--so-violet-600) 0%, var(--so-violet-700) 100%);
|
|
221
|
+
color: white;
|
|
222
|
+
font-size: 0.6875rem;
|
|
223
|
+
font-weight: 600;
|
|
224
|
+
text-transform: uppercase;
|
|
225
|
+
letter-spacing: 0.05em;
|
|
226
|
+
border-radius: 0 0 8px 8px;
|
|
227
|
+
box-shadow: 0 2px 8px rgba(124, 58, 237, 0.3);
|
|
228
|
+
z-index: 2;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.tier-card__popular-banner svg {
|
|
232
|
+
width: 0.875rem;
|
|
233
|
+
height: 0.875rem;
|
|
234
|
+
}
|
|
235
|
+
|
|
52
236
|
@keyframes tier-slide-up {
|
|
53
237
|
from {
|
|
54
238
|
opacity: 0;
|
|
@@ -221,6 +405,97 @@ const tierStyles = `
|
|
|
221
405
|
background-size: 1rem;
|
|
222
406
|
}
|
|
223
407
|
|
|
408
|
+
/* Price Per Day Breakdown - Mental Accounting */
|
|
409
|
+
.tier-card__price-breakdown {
|
|
410
|
+
margin-top: 0.625rem;
|
|
411
|
+
padding-top: 0.625rem;
|
|
412
|
+
border-top: 1px dashed var(--so-slate-200);
|
|
413
|
+
display: flex;
|
|
414
|
+
align-items: center;
|
|
415
|
+
justify-content: space-between;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
.tier-card__per-day {
|
|
419
|
+
display: flex;
|
|
420
|
+
align-items: baseline;
|
|
421
|
+
gap: 0.25rem;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.tier-card__per-day-amount {
|
|
425
|
+
font-family: var(--so-font-mono);
|
|
426
|
+
font-size: 0.875rem;
|
|
427
|
+
font-weight: 600;
|
|
428
|
+
color: var(--so-emerald-600);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
.tier-card__per-day-label {
|
|
432
|
+
font-size: 0.6875rem;
|
|
433
|
+
color: var(--so-slate-500);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
.tier-card__comparison {
|
|
437
|
+
font-size: 0.625rem;
|
|
438
|
+
color: var(--so-slate-400);
|
|
439
|
+
font-style: italic;
|
|
440
|
+
display: flex;
|
|
441
|
+
align-items: center;
|
|
442
|
+
gap: 0.25rem;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/* Charm Pricing Suggestions */
|
|
446
|
+
.tier-card__charm-pricing {
|
|
447
|
+
margin-top: 0.625rem;
|
|
448
|
+
padding-top: 0.625rem;
|
|
449
|
+
border-top: 1px dashed var(--so-slate-200);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
.tier-card__charm-label {
|
|
453
|
+
display: flex;
|
|
454
|
+
align-items: center;
|
|
455
|
+
gap: 0.375rem;
|
|
456
|
+
font-size: 0.625rem;
|
|
457
|
+
font-weight: 500;
|
|
458
|
+
color: var(--so-violet-600);
|
|
459
|
+
margin-bottom: 0.5rem;
|
|
460
|
+
text-transform: uppercase;
|
|
461
|
+
letter-spacing: 0.04em;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
.tier-card__charm-label svg {
|
|
465
|
+
width: 0.75rem;
|
|
466
|
+
height: 0.75rem;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
.tier-card__charm-options {
|
|
470
|
+
display: flex;
|
|
471
|
+
gap: 0.375rem;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.tier-card__charm-btn {
|
|
475
|
+
padding: 0.25rem 0.625rem;
|
|
476
|
+
font-family: var(--so-font-mono);
|
|
477
|
+
font-size: 0.75rem;
|
|
478
|
+
font-weight: 500;
|
|
479
|
+
color: var(--so-slate-600);
|
|
480
|
+
background: var(--so-slate-100);
|
|
481
|
+
border: 1px solid var(--so-slate-200);
|
|
482
|
+
border-radius: var(--so-radius-sm);
|
|
483
|
+
cursor: pointer;
|
|
484
|
+
transition: all var(--so-transition-fast);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
.tier-card__charm-btn:hover {
|
|
488
|
+
background: var(--so-violet-50);
|
|
489
|
+
border-color: var(--so-violet-300);
|
|
490
|
+
color: var(--so-violet-700);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
.tier-card__charm-btn--active {
|
|
494
|
+
background: var(--so-violet-100);
|
|
495
|
+
border-color: var(--so-violet-400);
|
|
496
|
+
color: var(--so-violet-700);
|
|
497
|
+
}
|
|
498
|
+
|
|
224
499
|
/* Description */
|
|
225
500
|
.tier-card__description {
|
|
226
501
|
margin-top: 1rem;
|
|
@@ -506,6 +781,109 @@ const tierStyles = `
|
|
|
506
781
|
background: var(--so-slate-200);
|
|
507
782
|
}
|
|
508
783
|
|
|
784
|
+
/* Tier Presets - Quick Start Templates */
|
|
785
|
+
.tier-presets {
|
|
786
|
+
background: linear-gradient(135deg, var(--so-violet-50) 0%, var(--so-sky-50) 100%);
|
|
787
|
+
border-radius: var(--so-radius-lg);
|
|
788
|
+
padding: 1.5rem;
|
|
789
|
+
margin-bottom: 1.5rem;
|
|
790
|
+
border: 1px solid var(--so-violet-100);
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
.tier-presets__header {
|
|
794
|
+
margin-bottom: 1.25rem;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
.tier-presets__title {
|
|
798
|
+
font-family: var(--so-font-sans);
|
|
799
|
+
font-size: 1.125rem;
|
|
800
|
+
font-weight: 700;
|
|
801
|
+
color: var(--so-slate-800);
|
|
802
|
+
margin: 0 0 0.375rem;
|
|
803
|
+
display: flex;
|
|
804
|
+
align-items: center;
|
|
805
|
+
gap: 0.5rem;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
.tier-presets__title::before {
|
|
809
|
+
content: '⚡';
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
.tier-presets__subtitle {
|
|
813
|
+
font-size: 0.875rem;
|
|
814
|
+
color: var(--so-slate-600);
|
|
815
|
+
margin: 0;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
.tier-presets__grid {
|
|
819
|
+
display: grid;
|
|
820
|
+
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
|
821
|
+
gap: 1rem;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
.tier-preset-card {
|
|
825
|
+
display: flex;
|
|
826
|
+
flex-direction: column;
|
|
827
|
+
gap: 0.75rem;
|
|
828
|
+
padding: 1.25rem;
|
|
829
|
+
background: white;
|
|
830
|
+
border: 2px solid var(--so-slate-200);
|
|
831
|
+
border-radius: var(--so-radius-md);
|
|
832
|
+
cursor: pointer;
|
|
833
|
+
transition: all 0.15s ease;
|
|
834
|
+
text-align: left;
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
.tier-preset-card:hover {
|
|
838
|
+
border-color: var(--so-violet-400);
|
|
839
|
+
box-shadow: 0 4px 12px rgba(124, 58, 237, 0.15);
|
|
840
|
+
transform: translateY(-2px);
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
.tier-preset-card__icon {
|
|
844
|
+
font-size: 1.5rem;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
.tier-preset-card__content {
|
|
848
|
+
flex: 1;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
.tier-preset-card__name {
|
|
852
|
+
font-family: var(--so-font-sans);
|
|
853
|
+
font-size: 1rem;
|
|
854
|
+
font-weight: 600;
|
|
855
|
+
color: var(--so-slate-800);
|
|
856
|
+
margin: 0 0 0.25rem;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
.tier-preset-card__desc {
|
|
860
|
+
font-size: 0.8125rem;
|
|
861
|
+
color: var(--so-slate-500);
|
|
862
|
+
margin: 0;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
.tier-preset-card__preview {
|
|
866
|
+
display: flex;
|
|
867
|
+
flex-wrap: wrap;
|
|
868
|
+
gap: 0.5rem;
|
|
869
|
+
padding-top: 0.75rem;
|
|
870
|
+
border-top: 1px solid var(--so-slate-100);
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
.tier-preset-card__tier {
|
|
874
|
+
font-family: var(--so-font-mono);
|
|
875
|
+
font-size: 0.6875rem;
|
|
876
|
+
padding: 0.25rem 0.5rem;
|
|
877
|
+
background: var(--so-slate-100);
|
|
878
|
+
color: var(--so-slate-600);
|
|
879
|
+
border-radius: var(--so-radius-sm);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
.tier-preset-card:hover .tier-preset-card__tier {
|
|
883
|
+
background: var(--so-violet-100);
|
|
884
|
+
color: var(--so-violet-700);
|
|
885
|
+
}
|
|
886
|
+
|
|
509
887
|
/* Info Notice */
|
|
510
888
|
.tier-notice {
|
|
511
889
|
display: flex;
|
|
@@ -585,8 +963,26 @@ export function TierDefinition({ document, dispatch }) {
|
|
|
585
963
|
lastModified: new Date().toISOString(),
|
|
586
964
|
}));
|
|
587
965
|
};
|
|
966
|
+
// Apply a preset tier configuration - Default Effect
|
|
967
|
+
const handleApplyPreset = (preset) => {
|
|
968
|
+
const now = new Date().toISOString();
|
|
969
|
+
preset.tiers.forEach((tierConfig) => {
|
|
970
|
+
dispatch(addTier({
|
|
971
|
+
id: generateId(),
|
|
972
|
+
name: tierConfig.name,
|
|
973
|
+
amount: tierConfig.isCustomPricing
|
|
974
|
+
? undefined
|
|
975
|
+
: (tierConfig.amount ?? undefined),
|
|
976
|
+
currency: "USD",
|
|
977
|
+
billingCycle: tierConfig.billingCycle,
|
|
978
|
+
isCustomPricing: tierConfig.isCustomPricing,
|
|
979
|
+
lastModified: now,
|
|
980
|
+
}));
|
|
981
|
+
});
|
|
982
|
+
};
|
|
588
983
|
const getTierAccent = (index) => TIER_ACCENTS[index % TIER_ACCENTS.length];
|
|
589
|
-
|
|
984
|
+
const recommendedTierIndex = getRecommendedTierIndex(tiers);
|
|
985
|
+
return (_jsxs(_Fragment, { children: [_jsx("style", { children: tierStyles }), _jsxs("div", { className: "tier-def", children: [tiers.length === 0 && (_jsxs("div", { className: "tier-presets", children: [_jsxs("div", { className: "tier-presets__header", children: [_jsx("h3", { className: "tier-presets__title", children: "Quick Start with a Template" }), _jsx("p", { className: "tier-presets__subtitle", children: "Choose a pricing structure to get started quickly, or create custom tiers below" })] }), _jsx("div", { className: "tier-presets__grid", children: TIER_PRESETS.map((preset) => (_jsxs("button", { onClick: () => handleApplyPreset(preset), className: "tier-preset-card", children: [_jsx("span", { className: "tier-preset-card__icon", children: preset.icon }), _jsxs("div", { className: "tier-preset-card__content", children: [_jsx("h4", { className: "tier-preset-card__name", children: preset.name }), _jsx("p", { className: "tier-preset-card__desc", children: preset.description })] }), _jsx("div", { className: "tier-preset-card__preview", children: preset.tiers.map((t, i) => (_jsxs("span", { className: "tier-preset-card__tier", children: [t.name, t.isCustomPricing ? "" : ` $${t.amount}`] }, i))) })] }, preset.name))) })] })), _jsxs("div", { className: "tier-def__grid", children: [tiers.map((tier, index) => (_jsx(TierCard, { tier: tier, accent: getTierAccent(index), dispatch: dispatch, onDelete: () => handleDeleteTier(tier.id), isRecommended: index === recommendedTierIndex }, tier.id))), isAddingTier ? (_jsxs("div", { className: "tier-form-card", children: [_jsx("h3", { className: "tier-form-card__title", children: "New Subscription Tier" }), _jsxs("div", { className: "tier-form-card__field", children: [_jsx("label", { className: "tier-form-card__label", children: "Tier Name" }), _jsx("input", { type: "text", value: newTier.name, onChange: (e) => setNewTier({ ...newTier, name: e.target.value }), placeholder: "e.g., Basic, Professional", className: "tier-form-card__input", autoFocus: true })] }), _jsxs("label", { className: "tier-form-card__toggle", children: [_jsx("input", { type: "checkbox", checked: newTier.isCustomPricing, onChange: (e) => setNewTier({
|
|
590
986
|
...newTier,
|
|
591
987
|
isCustomPricing: e.target.checked,
|
|
592
988
|
amount: "",
|
|
@@ -605,7 +1001,7 @@ export function TierDefinition({ document, dispatch }) {
|
|
|
605
1001
|
});
|
|
606
1002
|
}, className: "tier-form-card__btn tier-form-card__btn--secondary", children: "Cancel" })] })] })) : (_jsxs("button", { onClick: () => setIsAddingTier(true), className: "tier-add-card", children: [_jsx("div", { className: "tier-add-card__icon-wrap", children: _jsx("svg", { className: "tier-add-card__icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 4v16m8-8H4" }) }) }), _jsx("span", { className: "tier-add-card__text", children: "Add Subscription Tier" })] }))] }), _jsxs("div", { className: "tier-notice", children: [_jsx("svg", { className: "tier-notice__icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }), _jsxs("div", { className: "tier-notice__content", children: [_jsx("p", { className: "tier-notice__title", children: "Setup fees are managed at the service group level" }), _jsx("p", { className: "tier-notice__text", children: "Configure setup fees for \"Setup & Formation\" service groups in the Service Catalog. The setup fee applies to all tiers when those services are included." })] })] })] })] }));
|
|
607
1003
|
}
|
|
608
|
-
function TierCard({ tier, accent, dispatch, onDelete }) {
|
|
1004
|
+
function TierCard({ tier, accent, dispatch, onDelete, isRecommended, }) {
|
|
609
1005
|
const [localName, setLocalName] = useState(tier.name);
|
|
610
1006
|
const [localAmount, setLocalAmount] = useState(tier.pricing.amount?.toString() || "");
|
|
611
1007
|
const [localBillingCycle, setLocalBillingCycle] = useState(tier.pricing.billingCycle);
|
|
@@ -645,9 +1041,15 @@ function TierCard({ tier, accent, dispatch, onDelete }) {
|
|
|
645
1041
|
lastModified: new Date().toISOString(),
|
|
646
1042
|
}));
|
|
647
1043
|
};
|
|
648
|
-
return (_jsxs("div", { className: "tier-card", children: [_jsx("div", { className: "tier-card__accent", style: { background: accent.color } }), _jsxs("div", { className: "tier-card__body", children: [_jsxs("div", { className: "tier-card__header", children: [_jsxs("div", { className: "tier-card__name-group", children: [_jsx("span", { className: "tier-card__label", children: "Tier Name" }), _jsx("input", { type: "text", value: localName, onChange: (e) => setLocalName(e.target.value), onBlur: handleNameBlur, className: "tier-card__name-input" })] }), _jsx("button", { onClick: onDelete, className: "tier-card__delete-btn", children: _jsx("svg", { width: "20", height: "20", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }), isCustomPricing && (_jsxs("div", { className: "tier-card__custom-badge", children: [_jsx("svg", { className: "tier-card__custom-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }), _jsxs("div", { className: "tier-card__custom-text", children: [_jsx("span", { className: "tier-card__custom-title", children: "Custom Pricing" }), _jsx("span", { className: "tier-card__custom-desc", children: "Price varies per client" })] })] })), !isCustomPricing && (_jsxs("div", { className: "tier-card__pricing", children: [_jsx("span", { className: "tier-card__label", children: "Recurring Price" }), _jsxs("div", { className: "tier-card__pricing-box", children: [_jsx("span", { className: "tier-card__currency", children: "$" }), _jsx("input", { type: "number", value: localAmount, onChange: (e) => setLocalAmount(e.target.value), onBlur: () => handlePricingChange(localAmount), className: "tier-card__amount-input", step: "0.01" }), _jsx("span", { className: "tier-card__divider", children: "/" }), _jsx("select", { value: localBillingCycle, onChange: (e) => {
|
|
1044
|
+
return (_jsxs("div", { className: `tier-card ${isRecommended ? "tier-card--popular" : ""}`, children: [isRecommended && (_jsxs("div", { className: "tier-card__popular-banner", children: [_jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" }) }), "Most Popular"] })), _jsx("div", { className: "tier-card__accent", style: { background: accent.color } }), _jsxs("div", { className: "tier-card__body", children: [_jsxs("div", { className: "tier-card__header", children: [_jsxs("div", { className: "tier-card__name-group", children: [_jsx("span", { className: "tier-card__label", children: "Tier Name" }), _jsx("input", { type: "text", value: localName, onChange: (e) => setLocalName(e.target.value), onBlur: handleNameBlur, className: "tier-card__name-input" })] }), _jsx("button", { onClick: onDelete, className: "tier-card__delete-btn", children: _jsx("svg", { width: "20", height: "20", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }), isCustomPricing && (_jsxs("div", { className: "tier-card__custom-badge", children: [_jsx("svg", { className: "tier-card__custom-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }), _jsxs("div", { className: "tier-card__custom-text", children: [_jsx("span", { className: "tier-card__custom-title", children: "Custom Pricing" }), _jsx("span", { className: "tier-card__custom-desc", children: "Price varies per client" })] })] })), !isCustomPricing && (_jsxs("div", { className: "tier-card__pricing", children: [_jsx("span", { className: "tier-card__label", children: "Recurring Price" }), _jsxs("div", { className: "tier-card__pricing-box", children: [_jsx("span", { className: "tier-card__currency", children: "$" }), _jsx("input", { type: "number", value: localAmount, onChange: (e) => setLocalAmount(e.target.value), onBlur: () => handlePricingChange(localAmount), className: "tier-card__amount-input", step: "0.01" }), _jsx("span", { className: "tier-card__divider", children: "/" }), _jsx("select", { value: localBillingCycle, onChange: (e) => {
|
|
649
1045
|
const newCycle = e.target.value;
|
|
650
1046
|
setLocalBillingCycle(newCycle);
|
|
651
1047
|
handlePricingChange(undefined, newCycle);
|
|
652
|
-
}, className: "tier-card__cycle-select", children: BILLING_CYCLES.map((cycle) => (_jsx("option", { value: cycle.value, children: cycle.label }, cycle.value))) })] })
|
|
1048
|
+
}, className: "tier-card__cycle-select", children: BILLING_CYCLES.map((cycle) => (_jsx("option", { value: cycle.value, children: cycle.label }, cycle.value))) })] }), localAmount &&
|
|
1049
|
+
parseFloat(localAmount) > 0 &&
|
|
1050
|
+
localBillingCycle !== "ONE_TIME" && (_jsxs("div", { className: "tier-card__price-breakdown", children: [_jsxs("div", { className: "tier-card__per-day", children: [_jsxs("span", { className: "tier-card__per-day-amount", children: ["$", getPricePerDay(parseFloat(localAmount), localBillingCycle)] }), _jsx("span", { className: "tier-card__per-day-label", children: "/day" })] }), parseFloat(localAmount) > 0 &&
|
|
1051
|
+
parseFloat(getPricePerDay(parseFloat(localAmount), localBillingCycle)) < 10 && (_jsx("span", { className: "tier-card__comparison", children: "Less than a coffee" }))] })), localAmount && parseFloat(localAmount) > 0 && (_jsxs("div", { className: "tier-card__charm-pricing", children: [_jsxs("span", { className: "tier-card__charm-label", children: [_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M13 10V3L4 14h7v7l9-11h-7z" }) }), "Charm prices:"] }), _jsx("div", { className: "tier-card__charm-options", children: getCharmPriceSuggestions(parseFloat(localAmount)).map((price) => (_jsxs("button", { type: "button", onClick: () => {
|
|
1052
|
+
setLocalAmount(price.toFixed(2));
|
|
1053
|
+
handlePricingChange(price.toFixed(2));
|
|
1054
|
+
}, className: `tier-card__charm-btn ${parseFloat(localAmount) === price ? "tier-card__charm-btn--active" : ""}`, children: ["$", price.toFixed(2).replace(/\.00$/, "")] }, price))) })] }))] })), _jsxs("div", { className: "tier-card__description", children: [_jsx("span", { className: "tier-card__label", children: "Description" }), _jsx("textarea", { value: localDescription, onChange: (e) => setLocalDescription(e.target.value), onBlur: handleDescriptionBlur, placeholder: "Add a description...", rows: 2, className: "tier-card__desc-textarea" })] })] }), _jsxs("div", { className: "tier-card__footer", children: [_jsx("svg", { className: "tier-card__footer-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }), _jsx("span", { className: "tier-card__footer-text", children: "Configure service levels in the Matrix view" })] })] }));
|
|
653
1055
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DocumentDispatch } from "@powerhousedao/reactor-browser";
|
|
2
|
-
import type { ServiceOfferingDocument, ServiceOfferingAction } from "
|
|
2
|
+
import type { ServiceOfferingDocument, ServiceOfferingAction } from "@powerhousedao/contributor-billing/document-models/service-offering";
|
|
3
3
|
interface TiersListProps {
|
|
4
4
|
document: ServiceOfferingDocument;
|
|
5
5
|
dispatch: DocumentDispatch<ServiceOfferingAction>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TiersList.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TiersList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAKtB,MAAM,
|
|
1
|
+
{"version":3,"file":"TiersList.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TiersList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAKtB,MAAM,qEAAqE,CAAC;AAc7E,UAAU,cAAc;IACtB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;CACnD;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAue/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../editors/service-offering-editor/editor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../editors/service-offering-editor/editor.tsx"],"names":[],"mappings":"AAaA,MAAM,CAAC,OAAO,UAAU,qBAAqB,4CA6F5C"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
import { DocumentToolbar } from "@powerhousedao/design-system/connect";
|
|
4
4
|
import { useSelectedServiceOfferingDocument } from "../../document-models/service-offering/hooks.js";
|
|
5
|
-
import {
|
|
5
|
+
import { OfferingProgress } from "./components/OfferingProgress.js";
|
|
6
6
|
import { ResourceTemplateSelector } from "./components/ResourceTemplateSelector.js";
|
|
7
7
|
import { ServiceCatalog, } from "./components/ServiceCatalog.js";
|
|
8
8
|
import { TierDefinition } from "./components/TierDefinition.js";
|
|
@@ -36,7 +36,7 @@ export default function ServiceOfferingEditor() {
|
|
|
36
36
|
return null;
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
|
-
return (_jsxs("div", { className: "so-editor", children: [_jsx("style", { children: editorStyles }), _jsx(DocumentToolbar, {}), _jsxs("div", { className: "so-editor__container", children: [_jsx(
|
|
39
|
+
return (_jsxs("div", { className: "so-editor", children: [_jsx("style", { children: editorStyles }), _jsx(DocumentToolbar, {}), _jsxs("div", { className: "so-editor__container", children: [_jsx(OfferingProgress, { document: document, activeTab: activeTab, onTabChange: setActiveTab }), _jsx("div", { className: "so-editor__content", children: renderTabContent() })] })] }));
|
|
40
40
|
}
|
|
41
41
|
const editorStyles = `
|
|
42
42
|
@import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=DM+Mono:wght@400;500&display=swap');
|
|
@@ -38,6 +38,10 @@
|
|
|
38
38
|
{
|
|
39
39
|
"id": "powerhouse/service-offering",
|
|
40
40
|
"name": "ServiceOffering"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "powerhouse/resource-template",
|
|
44
|
+
"name": "ResourceTemplate"
|
|
41
45
|
}
|
|
42
46
|
],
|
|
43
47
|
"editors": [
|
|
@@ -82,6 +86,20 @@
|
|
|
82
86
|
"documentTypes": [
|
|
83
87
|
"powerhouse/snapshot-report"
|
|
84
88
|
]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "powerhouse-service-offering-editor",
|
|
92
|
+
"name": "Service Offering",
|
|
93
|
+
"documentTypes": [
|
|
94
|
+
"powerhouse/service-offering"
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"id": "powerhouse-resource-template-editor",
|
|
99
|
+
"name": "Resource Template",
|
|
100
|
+
"documentTypes": [
|
|
101
|
+
"powerhouse/resource-template"
|
|
102
|
+
]
|
|
85
103
|
}
|
|
86
104
|
],
|
|
87
105
|
"apps": [
|
|
@@ -9,4 +9,5 @@ export * as AccTxsAddonSubgraph from "./acc-txs-addon/index.js";
|
|
|
9
9
|
export * as ServiceSubscriptionsSubgraph from "./service-subscriptions/index.js";
|
|
10
10
|
export * as ServiceOfferingSubgraph from "./service-offering/index.js";
|
|
11
11
|
export * as BudgetStatementsSubgraph from "./budget-statements/index.js";
|
|
12
|
+
export * as ResourceTemplateSubgraph from "./resource-template/index.js";
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../subgraphs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,2BAA2B,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,oBAAoB,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,wBAAwB,MAAM,8BAA8B,CAAC;AACzE,OAAO,KAAK,qBAAqB,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,sBAAsB,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,mBAAmB,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,4BAA4B,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,uBAAuB,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,wBAAwB,MAAM,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../subgraphs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,2BAA2B,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,oBAAoB,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,wBAAwB,MAAM,8BAA8B,CAAC;AACzE,OAAO,KAAK,qBAAqB,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,sBAAsB,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,mBAAmB,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,4BAA4B,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,uBAAuB,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,wBAAwB,MAAM,8BAA8B,CAAC;AACzE,OAAO,KAAK,wBAAwB,MAAM,8BAA8B,CAAC"}
|
package/dist/subgraphs/index.js
CHANGED
|
@@ -9,3 +9,4 @@ export * as AccTxsAddonSubgraph from "./acc-txs-addon/index.js";
|
|
|
9
9
|
export * as ServiceSubscriptionsSubgraph from "./service-subscriptions/index.js";
|
|
10
10
|
export * as ServiceOfferingSubgraph from "./service-offering/index.js";
|
|
11
11
|
export * as BudgetStatementsSubgraph from "./budget-statements/index.js";
|
|
12
|
+
export * as ResourceTemplateSubgraph from "./resource-template/index.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseSubgraph } from "@powerhousedao/reactor-api";
|
|
2
|
+
import type { DocumentNode } from "graphql";
|
|
3
|
+
export declare class ResourceTemplateSubgraph extends BaseSubgraph {
|
|
4
|
+
name: string;
|
|
5
|
+
typeDefs: DocumentNode;
|
|
6
|
+
resolvers: Record<string, unknown>;
|
|
7
|
+
additionalContextFields: {};
|
|
8
|
+
onSetup(): Promise<void>;
|
|
9
|
+
onDisconnect(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../subgraphs/resource-template/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,qBAAa,wBAAyB,SAAQ,YAAY;IACxD,IAAI,SAAuB;IAC3B,QAAQ,EAAE,YAAY,CAAU;IAChC,SAAS,0BAAsB;IAC/B,uBAAuB,KAAM;IACvB,OAAO;IACP,YAAY;CACnB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseSubgraph } from "@powerhousedao/reactor-api";
|
|
2
|
+
import { schema } from "./schema.js";
|
|
3
|
+
import { getResolvers } from "./resolvers.js";
|
|
4
|
+
export class ResourceTemplateSubgraph extends BaseSubgraph {
|
|
5
|
+
name = "resource-template";
|
|
6
|
+
typeDefs = schema;
|
|
7
|
+
resolvers = getResolvers(this);
|
|
8
|
+
additionalContextFields = {};
|
|
9
|
+
async onSetup() { }
|
|
10
|
+
async onDisconnect() { }
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../../subgraphs/resource-template/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAgC/D,eAAO,MAAM,YAAY,GACvB,UAAU,YAAY,KACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CA0iBxB,CAAC"}
|