@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.
Files changed (108) hide show
  1. package/dist/document-models/document-models.d.ts.map +1 -1
  2. package/dist/document-models/document-models.js +2 -0
  3. package/dist/document-models/resource-template/gen/document-model.js +25 -25
  4. package/dist/document-models/resource-template/gen/reducer.d.ts +1 -1
  5. package/dist/document-models/resource-template/gen/reducer.d.ts.map +1 -1
  6. package/dist/document-models/resource-template/hooks.d.ts +1 -1
  7. package/dist/document-models/resource-template/hooks.d.ts.map +1 -1
  8. package/dist/document-models/resource-template/module.d.ts +1 -1
  9. package/dist/document-models/resource-template/module.d.ts.map +1 -1
  10. package/dist/document-models/resource-template/reducers/audience-management.d.ts +3 -0
  11. package/dist/document-models/resource-template/reducers/audience-management.d.ts.map +1 -0
  12. package/dist/document-models/resource-template/reducers/audience-management.js +17 -0
  13. package/dist/document-models/resource-template/reducers/facet-preset-management.d.ts +59 -0
  14. package/dist/document-models/resource-template/reducers/facet-preset-management.d.ts.map +1 -0
  15. package/dist/document-models/resource-template/reducers/facet-preset-management.js +52 -0
  16. package/dist/document-models/resource-template/reducers/facet-targeting.d.ts +3 -0
  17. package/dist/document-models/resource-template/reducers/facet-targeting.d.ts.map +1 -0
  18. package/dist/document-models/resource-template/reducers/facet-targeting.js +47 -0
  19. package/dist/document-models/resource-template/reducers/option-group-management.d.ts +3 -0
  20. package/dist/document-models/resource-template/reducers/option-group-management.d.ts.map +1 -0
  21. package/dist/document-models/resource-template/reducers/option-group-management.js +44 -0
  22. package/dist/document-models/resource-template/reducers/service-category-management.d.ts +3 -0
  23. package/dist/document-models/resource-template/reducers/service-category-management.d.ts.map +1 -0
  24. package/dist/document-models/resource-template/reducers/service-category-management.js +10 -0
  25. package/dist/document-models/resource-template/reducers/service-management.d.ts +3 -0
  26. package/dist/document-models/resource-template/reducers/service-management.d.ts.map +1 -0
  27. package/dist/document-models/resource-template/reducers/service-management.js +71 -0
  28. package/dist/document-models/resource-template/reducers/template-management.d.ts +3 -0
  29. package/dist/document-models/resource-template/reducers/template-management.d.ts.map +1 -0
  30. package/dist/document-models/resource-template/reducers/template-management.js +32 -0
  31. package/dist/document-models/resource-template/src/reducers/audience-management.d.ts.map +1 -1
  32. package/dist/document-models/resource-template/src/reducers/audience-management.js +1 -1
  33. package/dist/document-models/resource-template/src/reducers/facet-targeting.d.ts.map +1 -1
  34. package/dist/document-models/resource-template/src/reducers/facet-targeting.js +1 -1
  35. package/dist/document-models/resource-template/src/reducers/option-group-management.d.ts.map +1 -1
  36. package/dist/document-models/resource-template/src/reducers/option-group-management.js +1 -1
  37. package/dist/document-models/resource-template/src/reducers/service-category-management.d.ts.map +1 -1
  38. package/dist/document-models/resource-template/src/reducers/service-category-management.js +1 -1
  39. package/dist/document-models/resource-template/src/reducers/service-management.d.ts.map +1 -1
  40. package/dist/document-models/resource-template/src/reducers/service-management.js +1 -1
  41. package/dist/document-models/resource-template/src/reducers/template-management.d.ts.map +1 -1
  42. package/dist/document-models/resource-template/src/reducers/template-management.js +1 -1
  43. package/dist/document-models/service-offering/gen/document-model.js +5 -5
  44. package/dist/document-models/service-offering/gen/document-schema.d.ts.map +1 -1
  45. package/dist/document-models/service-offering/gen/reducer.d.ts +1 -1
  46. package/dist/document-models/service-offering/gen/reducer.d.ts.map +1 -1
  47. package/dist/document-models/service-offering/gen/schema/types.d.ts +3 -0
  48. package/dist/document-models/service-offering/gen/schema/types.d.ts.map +1 -1
  49. package/dist/document-models/service-offering/gen/schema/zod.d.ts.map +1 -1
  50. package/dist/document-models/service-offering/gen/schema/zod.js +3 -0
  51. package/dist/document-models/service-offering/src/reducers/option-group-management.d.ts.map +1 -1
  52. package/dist/document-models/service-offering/src/reducers/option-group-management.js +11 -8
  53. package/dist/document-models/service-offering/src/reducers/service-management.d.ts.map +1 -1
  54. package/dist/document-models/service-offering/src/reducers/service-management.js +20 -12
  55. package/dist/document-models/service-offering/src/reducers/tier-management.d.ts.map +1 -1
  56. package/dist/document-models/service-offering/src/reducers/tier-management.js +21 -19
  57. package/dist/editors/resource-template-editor/components/FacetTargeting.d.ts +1 -1
  58. package/dist/editors/resource-template-editor/components/FacetTargeting.d.ts.map +1 -1
  59. package/dist/editors/resource-template-editor/components/FacetTargeting.js +526 -19
  60. package/dist/editors/resource-template-editor/components/TemplateInfo.d.ts +1 -1
  61. package/dist/editors/resource-template-editor/components/TemplateInfo.d.ts.map +1 -1
  62. package/dist/editors/resource-template-editor/components/TemplateInfo.js +302 -2
  63. package/dist/editors/resource-template-editor/editor.d.ts.map +1 -1
  64. package/dist/editors/service-offering-editor/components/EditName.js +1 -1
  65. package/dist/editors/service-offering-editor/components/OfferingInfo.d.ts +1 -1
  66. package/dist/editors/service-offering-editor/components/OfferingInfo.d.ts.map +1 -1
  67. package/dist/editors/service-offering-editor/components/OfferingProgress.d.ts +10 -0
  68. package/dist/editors/service-offering-editor/components/OfferingProgress.d.ts.map +1 -0
  69. package/dist/editors/service-offering-editor/components/OfferingProgress.js +240 -0
  70. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts +1 -1
  71. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts.map +1 -1
  72. package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.js +111 -4
  73. package/dist/editors/service-offering-editor/components/ScopeAndFacets.d.ts +1 -1
  74. package/dist/editors/service-offering-editor/components/ScopeAndFacets.d.ts.map +1 -1
  75. package/dist/editors/service-offering-editor/components/ServiceCatalog.d.ts +1 -1
  76. package/dist/editors/service-offering-editor/components/ServiceCatalog.d.ts.map +1 -1
  77. package/dist/editors/service-offering-editor/components/ServiceCatalog.js +318 -1
  78. package/dist/editors/service-offering-editor/components/ServicesList.d.ts +1 -1
  79. package/dist/editors/service-offering-editor/components/ServicesList.d.ts.map +1 -1
  80. package/dist/editors/service-offering-editor/components/ServicesList.js +1 -1
  81. package/dist/editors/service-offering-editor/components/TheMatrix.d.ts +1 -1
  82. package/dist/editors/service-offering-editor/components/TheMatrix.d.ts.map +1 -1
  83. package/dist/editors/service-offering-editor/components/TheMatrix.js +548 -13
  84. package/dist/editors/service-offering-editor/components/TierDefinition.d.ts +1 -1
  85. package/dist/editors/service-offering-editor/components/TierDefinition.d.ts.map +1 -1
  86. package/dist/editors/service-offering-editor/components/TierDefinition.js +406 -4
  87. package/dist/editors/service-offering-editor/components/TiersList.d.ts +1 -1
  88. package/dist/editors/service-offering-editor/components/TiersList.d.ts.map +1 -1
  89. package/dist/editors/service-offering-editor/editor.d.ts.map +1 -1
  90. package/dist/editors/service-offering-editor/editor.js +2 -2
  91. package/dist/powerhouse.manifest.json +18 -0
  92. package/dist/subgraphs/index.d.ts +1 -0
  93. package/dist/subgraphs/index.d.ts.map +1 -1
  94. package/dist/subgraphs/index.js +1 -0
  95. package/dist/subgraphs/resource-template/index.d.ts +11 -0
  96. package/dist/subgraphs/resource-template/index.d.ts.map +1 -0
  97. package/dist/subgraphs/resource-template/index.js +11 -0
  98. package/dist/subgraphs/resource-template/resolvers.d.ts +3 -0
  99. package/dist/subgraphs/resource-template/resolvers.d.ts.map +1 -0
  100. package/dist/subgraphs/resource-template/resolvers.js +312 -0
  101. package/dist/subgraphs/resource-template/schema.d.ts +3 -0
  102. package/dist/subgraphs/resource-template/schema.d.ts.map +1 -0
  103. package/dist/subgraphs/resource-template/schema.js +262 -0
  104. package/dist/subgraphs/service-offering/resolvers.d.ts.map +1 -1
  105. package/dist/subgraphs/service-offering/resolvers.js +24 -0
  106. package/dist/subgraphs/service-offering/schema.d.ts.map +1 -1
  107. package/dist/subgraphs/service-offering/schema.js +21 -0
  108. package/package.json +1 -1
@@ -1,13 +1,88 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useState, useCallback } from "react";
2
+ import { useState, useCallback, useMemo } from "react";
3
3
  import { generateId } from "document-model/core";
4
4
  import { setFacetTarget, removeFacetTarget, addFacetOption, removeFacetOption, } from "../../../document-models/resource-template/gen/creators.js";
5
+ // Default presets (used as fallback if document state doesn't have presets)
6
+ const DEFAULT_FACET_PRESETS = [
7
+ {
8
+ id: "sno-function",
9
+ categoryKey: "sno-function",
10
+ categoryLabel: "SNO Function",
11
+ icon: "🎯",
12
+ description: "Sky Node Operator function type",
13
+ suggestedOptions: [
14
+ "Operational Hub for Open Source Builders",
15
+ "Commercial Operational Hub",
16
+ "IP SPV",
17
+ "Revenue Generating Hub",
18
+ "SNO Embryonic Hub",
19
+ "Self-Insurance Risk Management Hub",
20
+ ],
21
+ isRecommended: true,
22
+ },
23
+ {
24
+ id: "legal-entity",
25
+ categoryKey: "legal-entity",
26
+ categoryLabel: "Legal Entity",
27
+ icon: "🏛️",
28
+ description: "Type of legal structure for the resource",
29
+ suggestedOptions: ["Swiss Association", "BVI Entity"],
30
+ isRecommended: true,
31
+ },
32
+ {
33
+ id: "team",
34
+ categoryKey: "team",
35
+ categoryLabel: "Team",
36
+ icon: "👥",
37
+ description: "Team structure and work arrangement",
38
+ suggestedOptions: ["Remote", "Local", "Hybrid"],
39
+ isRecommended: true,
40
+ },
41
+ {
42
+ id: "anonymity",
43
+ categoryKey: "anonymity",
44
+ categoryLabel: "Anonymity",
45
+ icon: "🔒",
46
+ description: "Privacy and identity disclosure level",
47
+ suggestedOptions: ["High", "Highest"],
48
+ isRecommended: true,
49
+ },
50
+ ];
51
+ // Calculate completion status for Goal-Gradient Effect
52
+ function calculateProgress(facetTargets, presets) {
53
+ const recommendedKeys = new Set(presets.filter((p) => p.isRecommended).map((p) => p.categoryKey));
54
+ const configuredRecommended = facetTargets.filter((t) => recommendedKeys.has(t.categoryKey) && t.selectedOptions.length > 0).length;
55
+ const percentage = recommendedKeys.size > 0
56
+ ? Math.round((configuredRecommended / recommendedKeys.size) * 100)
57
+ : 0;
58
+ return {
59
+ configured: configuredRecommended,
60
+ recommended: recommendedKeys.size,
61
+ percentage,
62
+ isComplete: recommendedKeys.size > 0 && configuredRecommended >= recommendedKeys.size,
63
+ };
64
+ }
5
65
  export function FacetTargeting({ document, dispatch }) {
6
66
  const facetTargets = document.state.global.facetTargets;
67
+ // Use facetPresets from document state if available, otherwise use defaults
68
+ // Type assertion needed because generated types don't include facetPresets yet
69
+ const documentState = document.state.global;
70
+ const facetPresets = Array.isArray(documentState.facetPresets)
71
+ ? documentState.facetPresets
72
+ : DEFAULT_FACET_PRESETS;
7
73
  const [showAddCategory, setShowAddCategory] = useState(false);
8
74
  const [newCategoryLabel, setNewCategoryLabel] = useState("");
75
+ const [showPresets, setShowPresets] = useState(true);
9
76
  const [editingOptionFor, setEditingOptionFor] = useState(null);
10
77
  const [newOptionId, setNewOptionId] = useState("");
78
+ // Use Set for O(1) lookups - React Best Practice
79
+ const existingCategoryKeys = useMemo(() => new Set(facetTargets.map((t) => t.categoryKey)), [facetTargets]);
80
+ // Calculate progress for Goal-Gradient Effect
81
+ const progress = useMemo(() => calculateProgress(facetTargets, facetPresets), [facetTargets, facetPresets]);
82
+ // Get available presets (not yet added)
83
+ const availablePresets = useMemo(() => facetPresets.filter((p) => !existingCategoryKeys.has(p.categoryKey)), [facetPresets, existingCategoryKeys]);
84
+ const recommendedPresets = availablePresets.filter((p) => p.isRecommended);
85
+ const otherPresets = availablePresets.filter((p) => !p.isRecommended);
11
86
  const handleAddCategory = useCallback(() => {
12
87
  if (!newCategoryLabel.trim())
13
88
  return;
@@ -23,6 +98,29 @@ export function FacetTargeting({ document, dispatch }) {
23
98
  setNewCategoryLabel("");
24
99
  setShowAddCategory(false);
25
100
  }, [newCategoryLabel, dispatch]);
101
+ // Quick-add from preset - reduces activation energy
102
+ const handleAddFromPreset = useCallback((preset, withOptions = false) => {
103
+ dispatch(setFacetTarget({
104
+ id: generateId(),
105
+ categoryKey: preset.categoryKey,
106
+ categoryLabel: preset.categoryLabel,
107
+ selectedOptions: withOptions ? preset.suggestedOptions : [],
108
+ lastModified: new Date().toISOString(),
109
+ }));
110
+ }, [dispatch]);
111
+ // Add all recommended facets at once - Commitment & Consistency
112
+ const handleAddAllRecommended = useCallback(() => {
113
+ const now = new Date().toISOString();
114
+ recommendedPresets.forEach((preset) => {
115
+ dispatch(setFacetTarget({
116
+ id: generateId(),
117
+ categoryKey: preset.categoryKey,
118
+ categoryLabel: preset.categoryLabel,
119
+ selectedOptions: [],
120
+ lastModified: now,
121
+ }));
122
+ });
123
+ }, [recommendedPresets, dispatch]);
26
124
  const handleRemoveCategory = useCallback((categoryKey) => {
27
125
  if (window.confirm("Are you sure you want to remove this facet category and all its options?")) {
28
126
  dispatch(removeFacetTarget({
@@ -42,6 +140,14 @@ export function FacetTargeting({ document, dispatch }) {
42
140
  setNewOptionId("");
43
141
  setEditingOptionFor(null);
44
142
  }, [newOptionId, dispatch]);
143
+ // Quick-add suggested option
144
+ const handleAddSuggestedOption = useCallback((categoryKey, optionId) => {
145
+ dispatch(addFacetOption({
146
+ categoryKey,
147
+ optionId,
148
+ lastModified: new Date().toISOString(),
149
+ }));
150
+ }, [dispatch]);
45
151
  const handleRemoveOption = useCallback((categoryKey, optionId) => {
46
152
  dispatch(removeFacetOption({
47
153
  categoryKey,
@@ -49,7 +155,9 @@ export function FacetTargeting({ document, dispatch }) {
49
155
  lastModified: new Date().toISOString(),
50
156
  }));
51
157
  }, [dispatch]);
52
- return (_jsxs(_Fragment, { children: [_jsx("style", { children: styles }), _jsxs("section", { className: "facet-targeting", children: [_jsxs("div", { className: "facet-targeting__header", children: [_jsxs("div", { className: "facet-targeting__header-content", children: [_jsx("div", { className: "facet-targeting__icon", children: _jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: [_jsx("path", { d: "M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z" }), _jsx("path", { d: "M6 6h.008v.008H6V6z" })] }) }), _jsxs("div", { children: [_jsx("h3", { className: "facet-targeting__title", children: "Facet Targeting" }), _jsx("p", { className: "facet-targeting__subtitle", children: "Define configuration dimensions and their available options for this resource" })] })] }), _jsxs("button", { type: "button", className: "facet-targeting__add-btn", onClick: () => setShowAddCategory(true), children: [_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M12 5v14M5 12h14" }) }), "Add Category"] })] }), showAddCategory && (_jsx("div", { className: "facet-targeting__new-category", children: _jsxs("div", { className: "facet-targeting__new-category-form", children: [_jsxs("div", { className: "facet-targeting__form-group", children: [_jsx("label", { className: "facet-targeting__label", children: "Category Name" }), _jsx("input", { type: "text", value: newCategoryLabel, onChange: (e) => setNewCategoryLabel(e.target.value), placeholder: "e.g., Region, Environment, Storage Type", className: "facet-targeting__input", autoFocus: true, onKeyDown: (e) => {
158
+ // Get preset for a category to show suggested options
159
+ const getPresetForCategory = (categoryKey) => facetPresets.find((p) => p.categoryKey === categoryKey);
160
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: styles }), _jsxs("section", { className: "facet-targeting", children: [_jsxs("div", { className: "facet-targeting__progress", children: [_jsxs("div", { className: "facet-targeting__progress-header", children: [_jsxs("div", { className: "facet-targeting__progress-info", children: [_jsxs("span", { className: "facet-targeting__progress-percent", children: [progress.percentage, "%"] }), _jsxs("span", { className: "facet-targeting__progress-label", children: [progress.configured, "/", progress.recommended, " recommended facets configured"] })] }), progress.isComplete && (_jsxs("span", { className: "facet-targeting__complete-badge", children: [_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: _jsx("path", { d: "M5 12l5 5L20 7" }) }), "All set!"] }))] }), _jsx("div", { className: "facet-targeting__progress-bar", children: _jsx("div", { className: "facet-targeting__progress-fill", style: { width: `${progress.percentage}%` } }) })] }), _jsxs("div", { className: "facet-targeting__header", children: [_jsxs("div", { className: "facet-targeting__header-content", children: [_jsx("div", { className: "facet-targeting__icon", children: _jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: [_jsx("path", { d: "M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z" }), _jsx("path", { d: "M6 6h.008v.008H6V6z" })] }) }), _jsxs("div", { children: [_jsx("h3", { className: "facet-targeting__title", children: "Facet Targeting" }), _jsx("p", { className: "facet-targeting__subtitle", children: "Define configuration dimensions for this resource template" })] })] }), _jsxs("div", { className: "facet-targeting__header-actions", children: [_jsxs("button", { type: "button", className: `facet-targeting__toggle-btn ${showPresets ? "facet-targeting__toggle-btn--active" : ""}`, onClick: () => setShowPresets(!showPresets), children: [_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z" }) }), "Presets"] }), _jsxs("button", { type: "button", className: "facet-targeting__add-btn", onClick: () => setShowAddCategory(true), children: [_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M12 5v14M5 12h14" }) }), "Custom"] })] })] }), showPresets && availablePresets.length > 0 && (_jsxs("div", { className: "facet-targeting__presets", children: [_jsxs("div", { className: "facet-targeting__presets-header", children: [_jsx("h4", { className: "facet-targeting__presets-title", children: "Quick Add Facets" }), recommendedPresets.length > 1 && (_jsxs("button", { type: "button", className: "facet-targeting__add-all-btn", onClick: handleAddAllRecommended, children: ["Add all recommended (", recommendedPresets.length, ")"] }))] }), recommendedPresets.length > 0 && (_jsxs("div", { className: "facet-targeting__presets-section", children: [_jsxs("span", { className: "facet-targeting__presets-label", 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" }) }), "Recommended"] }), _jsx("div", { className: "facet-targeting__presets-grid", children: recommendedPresets.map((preset) => (_jsx(PresetCard, { preset: preset, onAdd: () => handleAddFromPreset(preset, false), onAddWithOptions: () => handleAddFromPreset(preset, true) }, preset.categoryKey))) })] })), otherPresets.length > 0 && (_jsxs("div", { className: "facet-targeting__presets-section", children: [_jsx("span", { className: "facet-targeting__presets-label", children: "Other Facets" }), _jsx("div", { className: "facet-targeting__presets-grid", children: otherPresets.map((preset) => (_jsx(PresetCard, { preset: preset, onAdd: () => handleAddFromPreset(preset, false), onAddWithOptions: () => handleAddFromPreset(preset, true) }, preset.categoryKey))) })] }))] })), showAddCategory && (_jsx("div", { className: "facet-targeting__new-category", children: _jsxs("div", { className: "facet-targeting__new-category-form", children: [_jsxs("div", { className: "facet-targeting__form-group", children: [_jsx("label", { className: "facet-targeting__label", children: "Custom Category Name" }), _jsx("input", { type: "text", value: newCategoryLabel, onChange: (e) => setNewCategoryLabel(e.target.value), placeholder: "e.g., Region, Environment, Storage Type", className: "facet-targeting__input", autoFocus: true, onKeyDown: (e) => {
53
161
  if (e.key === "Enter")
54
162
  handleAddCategory();
55
163
  if (e.key === "Escape")
@@ -57,16 +165,24 @@ export function FacetTargeting({ document, dispatch }) {
57
165
  } })] }), _jsxs("div", { className: "facet-targeting__form-actions", children: [_jsx("button", { type: "button", className: "facet-targeting__btn facet-targeting__btn--secondary", onClick: () => {
58
166
  setShowAddCategory(false);
59
167
  setNewCategoryLabel("");
60
- }, children: "Cancel" }), _jsx("button", { type: "button", className: "facet-targeting__btn facet-targeting__btn--primary", onClick: handleAddCategory, disabled: !newCategoryLabel.trim(), children: "Add Category" })] })] }) })), facetTargets.length === 0 && !showAddCategory ? (_jsxs("div", { className: "facet-targeting__empty", children: [_jsx("div", { className: "facet-targeting__empty-icon", children: _jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [_jsx("path", { d: "M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z" }), _jsx("path", { d: "M6 6h.008v.008H6V6z" })] }) }), _jsx("p", { className: "facet-targeting__empty-text", children: "No facet categories defined. Add categories like Region, Environment, or Storage Type to organize your resource options." }), _jsxs("button", { type: "button", className: "facet-targeting__btn facet-targeting__btn--primary", onClick: () => setShowAddCategory(true), children: [_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M12 5v14M5 12h14" }) }), "Add First Category"] })] })) : (_jsx("div", { className: "facet-targeting__categories", children: facetTargets.map((target) => (_jsxs("div", { className: "facet-category", children: [_jsxs("div", { className: "facet-category__header", children: [_jsxs("div", { className: "facet-category__info", children: [_jsx("span", { className: "facet-category__label", children: target.categoryLabel }), _jsx("span", { className: "facet-category__key", children: target.categoryKey })] }), _jsxs("div", { className: "facet-category__actions", children: [_jsx("button", { type: "button", className: "facet-category__btn", onClick: () => setEditingOptionFor(editingOptionFor === target.categoryKey
61
- ? null
62
- : target.categoryKey), title: "Add option", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M12 5v14M5 12h14" }) }) }), _jsx("button", { type: "button", className: "facet-category__btn facet-category__btn--danger", onClick: () => handleRemoveCategory(target.categoryKey), title: "Remove category", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" }) }) })] })] }), editingOptionFor === target.categoryKey && (_jsxs("div", { className: "facet-category__add-option", children: [_jsx("input", { type: "text", value: newOptionId, onChange: (e) => setNewOptionId(e.target.value), placeholder: "Enter option value...", className: "facet-targeting__input facet-targeting__input--sm", autoFocus: true, onKeyDown: (e) => {
63
- if (e.key === "Enter")
64
- handleAddOption(target.categoryKey);
65
- if (e.key === "Escape") {
66
- setEditingOptionFor(null);
67
- setNewOptionId("");
68
- }
69
- } }), _jsx("button", { type: "button", className: "facet-targeting__btn facet-targeting__btn--primary facet-targeting__btn--sm", onClick: () => handleAddOption(target.categoryKey), disabled: !newOptionId.trim(), children: "Add" })] })), _jsx("div", { className: "facet-category__options", children: target.selectedOptions.length === 0 ? (_jsx("p", { className: "facet-category__no-options", children: "No options added yet" })) : (target.selectedOptions.map((optionId) => (_jsxs("div", { className: "facet-option", children: [_jsx("span", { className: "facet-option__label", children: optionId }), _jsx("button", { type: "button", className: "facet-option__remove", onClick: () => handleRemoveOption(target.categoryKey, optionId), title: "Remove option", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M18 6L6 18M6 6l12 12", strokeWidth: "2" }) }) })] }, optionId)))) })] }, target.categoryKey))) }))] })] }));
168
+ }, children: "Cancel" }), _jsx("button", { type: "button", className: "facet-targeting__btn facet-targeting__btn--primary", onClick: handleAddCategory, disabled: !newCategoryLabel.trim(), children: "Add Category" })] })] }) })), facetTargets.length === 0 && !showAddCategory && !showPresets ? (_jsxs("div", { className: "facet-targeting__empty", children: [_jsx("div", { className: "facet-targeting__empty-icon", children: _jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [_jsx("path", { d: "M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z" }), _jsx("path", { d: "M6 6h.008v.008H6V6z" })] }) }), _jsx("p", { className: "facet-targeting__empty-text", children: "No facet categories defined. Use the presets above or add custom categories." }), _jsx("button", { type: "button", className: "facet-targeting__btn facet-targeting__btn--primary", onClick: () => setShowPresets(true), children: "Show Presets" })] })) : (facetTargets.length > 0 && (_jsx("div", { className: "facet-targeting__categories", children: facetTargets.map((target) => {
169
+ const preset = getPresetForCategory(target.categoryKey);
170
+ const existingOptionsSet = new Set(target.selectedOptions);
171
+ const suggestedOptions = preset?.suggestedOptions.filter((opt) => !existingOptionsSet.has(opt));
172
+ return (_jsxs("div", { className: "facet-category", children: [_jsxs("div", { className: "facet-category__header", children: [_jsxs("div", { className: "facet-category__info", children: [preset && (_jsx("span", { className: "facet-category__icon", children: preset.icon })), _jsx("span", { className: "facet-category__label", children: target.categoryLabel }), _jsx("span", { className: "facet-category__key", children: target.categoryKey }), preset?.isRecommended && (_jsx("span", { className: "facet-category__recommended", children: "Recommended" }))] }), _jsxs("div", { className: "facet-category__actions", children: [_jsx("button", { type: "button", className: "facet-category__btn", onClick: () => setEditingOptionFor(editingOptionFor === target.categoryKey
173
+ ? null
174
+ : target.categoryKey), title: "Add option", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M12 5v14M5 12h14" }) }) }), _jsx("button", { type: "button", className: "facet-category__btn facet-category__btn--danger", onClick: () => handleRemoveCategory(target.categoryKey), title: "Remove category", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" }) }) })] })] }), editingOptionFor === target.categoryKey && (_jsxs("div", { className: "facet-category__add-option", children: [_jsx("input", { type: "text", value: newOptionId, onChange: (e) => setNewOptionId(e.target.value), placeholder: "Enter option value...", className: "facet-targeting__input facet-targeting__input--sm", autoFocus: true, onKeyDown: (e) => {
175
+ if (e.key === "Enter")
176
+ handleAddOption(target.categoryKey);
177
+ if (e.key === "Escape") {
178
+ setEditingOptionFor(null);
179
+ setNewOptionId("");
180
+ }
181
+ } }), _jsx("button", { type: "button", className: "facet-targeting__btn facet-targeting__btn--primary facet-targeting__btn--sm", onClick: () => handleAddOption(target.categoryKey), disabled: !newOptionId.trim(), children: "Add" })] })), suggestedOptions && suggestedOptions.length > 0 && (_jsxs("div", { className: "facet-category__suggestions", children: [_jsx("span", { className: "facet-category__suggestions-label", children: "Quick add:" }), suggestedOptions.slice(0, 5).map((opt) => (_jsx("button", { type: "button", className: "facet-category__suggestion-btn", onClick: () => handleAddSuggestedOption(target.categoryKey, opt), children: opt }, opt))), suggestedOptions.length > 5 && (_jsxs("span", { className: "facet-category__more", children: ["+", suggestedOptions.length - 5, " more"] }))] })), _jsx("div", { className: "facet-category__options", children: target.selectedOptions.length === 0 ? (_jsx("p", { className: "facet-category__no-options", children: "No options added yet - use quick add above or add custom options" })) : (target.selectedOptions.map((optionId) => (_jsxs("div", { className: "facet-option", children: [_jsx("span", { className: "facet-option__label", children: optionId }), _jsx("button", { type: "button", className: "facet-option__remove", onClick: () => handleRemoveOption(target.categoryKey, optionId), title: "Remove option", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M18 6L6 18M6 6l12 12", strokeWidth: "2" }) }) })] }, optionId)))) }), target.selectedOptions.length > 0 && (_jsxs("div", { className: "facet-category__status", children: [_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M5 12l5 5L20 7" }) }), target.selectedOptions.length, " option", target.selectedOptions.length !== 1 ? "s" : "", " ", "configured"] }))] }, target.categoryKey));
182
+ }) })))] })] }));
183
+ }
184
+ function PresetCard({ preset, onAdd, onAddWithOptions }) {
185
+ return (_jsxs("div", { className: `preset-card ${preset.isRecommended ? "preset-card--recommended" : ""}`, children: [_jsxs("div", { className: "preset-card__header", children: [_jsx("span", { className: "preset-card__icon", children: preset.icon }), _jsxs("div", { className: "preset-card__info", children: [_jsx("span", { className: "preset-card__name", children: preset.categoryLabel }), _jsx("span", { className: "preset-card__desc", children: preset.description })] })] }), _jsxs("div", { className: "preset-card__options-preview", children: [preset.suggestedOptions.slice(0, 3).map((opt) => (_jsx("span", { className: "preset-card__option-tag", children: opt }, opt))), preset.suggestedOptions.length > 3 && (_jsxs("span", { className: "preset-card__option-more", children: ["+", preset.suggestedOptions.length - 3] }))] }), _jsxs("div", { className: "preset-card__actions", children: [_jsx("button", { type: "button", className: "preset-card__btn", onClick: onAdd, children: "Add Empty" }), _jsx("button", { type: "button", className: "preset-card__btn preset-card__btn--primary", onClick: onAddWithOptions, children: "Add with Options" })] })] }));
70
186
  }
71
187
  const styles = `
72
188
  .facet-targeting {
@@ -76,6 +192,78 @@ const styles = `
76
192
  box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);
77
193
  }
78
194
 
195
+ /* Progress Section - Goal-Gradient Effect */
196
+ .facet-targeting__progress {
197
+ background: linear-gradient(135deg, #f5f3ff 0%, #ecfdf5 100%);
198
+ border-radius: 12px;
199
+ padding: 16px;
200
+ margin-bottom: 20px;
201
+ }
202
+
203
+ .facet-targeting__progress-header {
204
+ display: flex;
205
+ align-items: center;
206
+ justify-content: space-between;
207
+ margin-bottom: 10px;
208
+ }
209
+
210
+ .facet-targeting__progress-info {
211
+ display: flex;
212
+ align-items: baseline;
213
+ gap: 8px;
214
+ }
215
+
216
+ .facet-targeting__progress-percent {
217
+ font-size: 1.5rem;
218
+ font-weight: 700;
219
+ color: #7c5cff;
220
+ font-family: 'DM Mono', monospace;
221
+ }
222
+
223
+ .facet-targeting__progress-label {
224
+ font-size: 0.75rem;
225
+ color: #64748b;
226
+ text-transform: uppercase;
227
+ letter-spacing: 0.05em;
228
+ }
229
+
230
+ .facet-targeting__complete-badge {
231
+ display: flex;
232
+ align-items: center;
233
+ gap: 4px;
234
+ padding: 4px 10px;
235
+ background: #10b981;
236
+ color: white;
237
+ font-size: 0.6875rem;
238
+ font-weight: 600;
239
+ border-radius: 100px;
240
+ animation: badge-pop 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
241
+ }
242
+
243
+ .facet-targeting__complete-badge svg {
244
+ width: 12px;
245
+ height: 12px;
246
+ }
247
+
248
+ @keyframes badge-pop {
249
+ from { transform: scale(0.8); opacity: 0; }
250
+ to { transform: scale(1); opacity: 1; }
251
+ }
252
+
253
+ .facet-targeting__progress-bar {
254
+ height: 8px;
255
+ background: rgba(124, 92, 255, 0.15);
256
+ border-radius: 100px;
257
+ overflow: hidden;
258
+ }
259
+
260
+ .facet-targeting__progress-fill {
261
+ height: 100%;
262
+ background: linear-gradient(90deg, #7c5cff, #10b981);
263
+ border-radius: 100px;
264
+ transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);
265
+ }
266
+
79
267
  .facet-targeting__header {
80
268
  display: flex;
81
269
  align-items: flex-start;
@@ -89,6 +277,11 @@ const styles = `
89
277
  gap: 14px;
90
278
  }
91
279
 
280
+ .facet-targeting__header-actions {
281
+ display: flex;
282
+ gap: 8px;
283
+ }
284
+
92
285
  .facet-targeting__icon {
93
286
  width: 40px;
94
287
  height: 40px;
@@ -119,6 +312,36 @@ const styles = `
119
312
  margin: 0;
120
313
  }
121
314
 
315
+ .facet-targeting__toggle-btn {
316
+ display: inline-flex;
317
+ align-items: center;
318
+ gap: 6px;
319
+ padding: 8px 14px;
320
+ font-family: inherit;
321
+ font-size: 0.8125rem;
322
+ font-weight: 500;
323
+ color: #7c5cff;
324
+ background: #f5f3ff;
325
+ border: 1.5px solid transparent;
326
+ border-radius: 8px;
327
+ cursor: pointer;
328
+ transition: all 0.15s ease;
329
+ }
330
+
331
+ .facet-targeting__toggle-btn:hover {
332
+ border-color: #7c5cff;
333
+ }
334
+
335
+ .facet-targeting__toggle-btn--active {
336
+ background: #7c5cff;
337
+ color: white;
338
+ }
339
+
340
+ .facet-targeting__toggle-btn svg {
341
+ width: 16px;
342
+ height: 16px;
343
+ }
344
+
122
345
  .facet-targeting__add-btn {
123
346
  display: inline-flex;
124
347
  align-items: center;
@@ -144,6 +367,207 @@ const styles = `
144
367
  height: 16px;
145
368
  }
146
369
 
370
+ /* Presets Panel */
371
+ .facet-targeting__presets {
372
+ background: linear-gradient(135deg, #f5f3ff 0%, #faf5ff 100%);
373
+ border: 1px solid rgba(124, 92, 255, 0.2);
374
+ border-radius: 12px;
375
+ padding: 20px;
376
+ margin-bottom: 20px;
377
+ animation: presets-slide 0.2s ease-out;
378
+ }
379
+
380
+ @keyframes presets-slide {
381
+ from { opacity: 0; transform: translateY(-8px); }
382
+ to { opacity: 1; transform: translateY(0); }
383
+ }
384
+
385
+ .facet-targeting__presets-header {
386
+ display: flex;
387
+ align-items: center;
388
+ justify-content: space-between;
389
+ margin-bottom: 16px;
390
+ }
391
+
392
+ .facet-targeting__presets-title {
393
+ font-size: 1rem;
394
+ font-weight: 600;
395
+ color: #1a1f36;
396
+ margin: 0;
397
+ display: flex;
398
+ align-items: center;
399
+ gap: 8px;
400
+ }
401
+
402
+ .facet-targeting__presets-title::before {
403
+ content: "⚡";
404
+ }
405
+
406
+ .facet-targeting__add-all-btn {
407
+ padding: 6px 12px;
408
+ font-family: inherit;
409
+ font-size: 0.75rem;
410
+ font-weight: 600;
411
+ color: #7c5cff;
412
+ background: white;
413
+ border: 1px solid rgba(124, 92, 255, 0.3);
414
+ border-radius: 6px;
415
+ cursor: pointer;
416
+ transition: all 0.15s ease;
417
+ }
418
+
419
+ .facet-targeting__add-all-btn:hover {
420
+ background: #7c5cff;
421
+ color: white;
422
+ border-color: #7c5cff;
423
+ }
424
+
425
+ .facet-targeting__presets-section {
426
+ margin-bottom: 16px;
427
+ }
428
+
429
+ .facet-targeting__presets-section:last-child {
430
+ margin-bottom: 0;
431
+ }
432
+
433
+ .facet-targeting__presets-label {
434
+ display: flex;
435
+ align-items: center;
436
+ gap: 6px;
437
+ font-size: 0.6875rem;
438
+ font-weight: 700;
439
+ text-transform: uppercase;
440
+ letter-spacing: 0.05em;
441
+ color: #64748b;
442
+ margin-bottom: 10px;
443
+ }
444
+
445
+ .facet-targeting__presets-label svg {
446
+ width: 12px;
447
+ height: 12px;
448
+ color: #f59e0b;
449
+ }
450
+
451
+ .facet-targeting__presets-grid {
452
+ display: grid;
453
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
454
+ gap: 12px;
455
+ }
456
+
457
+ /* Preset Card */
458
+ .preset-card {
459
+ background: white;
460
+ border: 1.5px solid #e4e8f0;
461
+ border-radius: 10px;
462
+ padding: 14px;
463
+ transition: all 0.15s ease;
464
+ }
465
+
466
+ .preset-card:hover {
467
+ border-color: #7c5cff;
468
+ box-shadow: 0 4px 12px rgba(124, 92, 255, 0.1);
469
+ }
470
+
471
+ .preset-card--recommended {
472
+ border-color: rgba(245, 158, 11, 0.4);
473
+ background: linear-gradient(135deg, white 0%, #fffbeb 100%);
474
+ }
475
+
476
+ .preset-card--recommended:hover {
477
+ border-color: #f59e0b;
478
+ box-shadow: 0 4px 12px rgba(245, 158, 11, 0.15);
479
+ }
480
+
481
+ .preset-card__header {
482
+ display: flex;
483
+ align-items: flex-start;
484
+ gap: 10px;
485
+ margin-bottom: 10px;
486
+ }
487
+
488
+ .preset-card__icon {
489
+ font-size: 1.25rem;
490
+ flex-shrink: 0;
491
+ }
492
+
493
+ .preset-card__info {
494
+ flex: 1;
495
+ min-width: 0;
496
+ }
497
+
498
+ .preset-card__name {
499
+ display: block;
500
+ font-size: 0.875rem;
501
+ font-weight: 600;
502
+ color: #1a1f36;
503
+ }
504
+
505
+ .preset-card__desc {
506
+ display: block;
507
+ font-size: 0.75rem;
508
+ color: #64748b;
509
+ white-space: nowrap;
510
+ overflow: hidden;
511
+ text-overflow: ellipsis;
512
+ }
513
+
514
+ .preset-card__options-preview {
515
+ display: flex;
516
+ flex-wrap: wrap;
517
+ gap: 4px;
518
+ margin-bottom: 12px;
519
+ }
520
+
521
+ .preset-card__option-tag {
522
+ padding: 2px 8px;
523
+ font-size: 0.6875rem;
524
+ font-weight: 500;
525
+ color: #64748b;
526
+ background: #f1f5f9;
527
+ border-radius: 4px;
528
+ }
529
+
530
+ .preset-card__option-more {
531
+ padding: 2px 8px;
532
+ font-size: 0.6875rem;
533
+ font-weight: 500;
534
+ color: #94a3b8;
535
+ font-style: italic;
536
+ }
537
+
538
+ .preset-card__actions {
539
+ display: flex;
540
+ gap: 6px;
541
+ }
542
+
543
+ .preset-card__btn {
544
+ flex: 1;
545
+ padding: 6px 10px;
546
+ font-family: inherit;
547
+ font-size: 0.75rem;
548
+ font-weight: 500;
549
+ color: #64748b;
550
+ background: #f1f5f9;
551
+ border: none;
552
+ border-radius: 6px;
553
+ cursor: pointer;
554
+ transition: all 0.15s ease;
555
+ }
556
+
557
+ .preset-card__btn:hover {
558
+ background: #e2e8f0;
559
+ color: #475569;
560
+ }
561
+
562
+ .preset-card__btn--primary {
563
+ background: #7c5cff;
564
+ color: white;
565
+ }
566
+
567
+ .preset-card__btn--primary:hover {
568
+ background: #6d4aeb;
569
+ }
570
+
147
571
  .facet-targeting__new-category {
148
572
  background: var(--te-surface-raised, #fafbfc);
149
573
  border: 1.5px solid var(--te-border, #e4e8f0);
@@ -158,12 +582,6 @@ const styles = `
158
582
  gap: 12px;
159
583
  }
160
584
 
161
- .facet-targeting__form-row {
162
- display: grid;
163
- grid-template-columns: 1fr 1fr;
164
- gap: 12px;
165
- }
166
-
167
585
  .facet-targeting__form-group {
168
586
  display: flex;
169
587
  flex-direction: column;
@@ -317,6 +735,10 @@ const styles = `
317
735
  gap: 10px;
318
736
  }
319
737
 
738
+ .facet-category__icon {
739
+ font-size: 1.125rem;
740
+ }
741
+
320
742
  .facet-category__label {
321
743
  font-size: 0.9375rem;
322
744
  font-weight: 600;
@@ -332,6 +754,17 @@ const styles = `
332
754
  border-radius: 4px;
333
755
  }
334
756
 
757
+ .facet-category__recommended {
758
+ font-size: 0.625rem;
759
+ font-weight: 700;
760
+ text-transform: uppercase;
761
+ letter-spacing: 0.04em;
762
+ color: #f59e0b;
763
+ background: #fef3c7;
764
+ padding: 2px 8px;
765
+ border-radius: 4px;
766
+ }
767
+
335
768
  .facet-category__actions {
336
769
  display: flex;
337
770
  gap: 4px;
@@ -377,6 +810,52 @@ const styles = `
377
810
  flex: 1;
378
811
  }
379
812
 
813
+ /* Suggestions - Paradox of Choice */
814
+ .facet-category__suggestions {
815
+ display: flex;
816
+ flex-wrap: wrap;
817
+ align-items: center;
818
+ gap: 6px;
819
+ margin-bottom: 12px;
820
+ padding: 10px 12px;
821
+ background: linear-gradient(135deg, #f5f3ff 0%, #faf5ff 100%);
822
+ border-radius: 8px;
823
+ }
824
+
825
+ .facet-category__suggestions-label {
826
+ font-size: 0.6875rem;
827
+ font-weight: 600;
828
+ color: #64748b;
829
+ text-transform: uppercase;
830
+ letter-spacing: 0.04em;
831
+ }
832
+
833
+ .facet-category__suggestion-btn {
834
+ padding: 4px 10px;
835
+ font-family: inherit;
836
+ font-size: 0.75rem;
837
+ font-weight: 500;
838
+ color: #7c5cff;
839
+ background: white;
840
+ border: 1px solid rgba(124, 92, 255, 0.3);
841
+ border-radius: 6px;
842
+ cursor: pointer;
843
+ transition: all 0.15s ease;
844
+ }
845
+
846
+ .facet-category__suggestion-btn:hover {
847
+ background: #7c5cff;
848
+ color: white;
849
+ border-color: #7c5cff;
850
+ transform: translateY(-1px);
851
+ }
852
+
853
+ .facet-category__more {
854
+ font-size: 0.6875rem;
855
+ color: #94a3b8;
856
+ font-style: italic;
857
+ }
858
+
380
859
  .facet-category__options {
381
860
  display: flex;
382
861
  flex-wrap: wrap;
@@ -390,6 +869,24 @@ const styles = `
390
869
  font-style: italic;
391
870
  }
392
871
 
872
+ /* Micro-commitment feedback */
873
+ .facet-category__status {
874
+ display: flex;
875
+ align-items: center;
876
+ gap: 6px;
877
+ margin-top: 12px;
878
+ padding-top: 12px;
879
+ border-top: 1px dashed #e4e8f0;
880
+ font-size: 0.75rem;
881
+ font-weight: 500;
882
+ color: #10b981;
883
+ }
884
+
885
+ .facet-category__status svg {
886
+ width: 14px;
887
+ height: 14px;
888
+ }
889
+
393
890
  .facet-option {
394
891
  display: inline-flex;
395
892
  align-items: center;
@@ -444,7 +941,17 @@ const styles = `
444
941
  gap: 16px;
445
942
  }
446
943
 
447
- .facet-targeting__form-row {
944
+ .facet-targeting__header-actions {
945
+ width: 100%;
946
+ }
947
+
948
+ .facet-targeting__toggle-btn,
949
+ .facet-targeting__add-btn {
950
+ flex: 1;
951
+ justify-content: center;
952
+ }
953
+
954
+ .facet-targeting__presets-grid {
448
955
  grid-template-columns: 1fr;
449
956
  }
450
957
  }
@@ -1,5 +1,5 @@
1
1
  import type { DocumentDispatch } from "@powerhousedao/reactor-browser";
2
- import type { ResourceTemplateDocument, ResourceTemplateAction } from "../../../document-models/resource-template/gen/types.js";
2
+ import type { ResourceTemplateDocument, ResourceTemplateAction } from "@powerhousedao/contributor-billing/document-models/resource-template";
3
3
  interface TemplateInfoProps {
4
4
  document: ResourceTemplateDocument;
5
5
  dispatch: DocumentDispatch<ResourceTemplateAction>;