@happyvertical/smrt-subscriptions 0.60.16 → 0.60.18

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.
@@ -2,7 +2,7 @@
2
2
  "version": "1.0.0",
3
3
  "timestamp": 0,
4
4
  "packageName": "@happyvertical/smrt-subscriptions",
5
- "packageVersion": "0.60.16",
5
+ "packageVersion": "0.60.18",
6
6
  "objects": {
7
7
  "@happyvertical/smrt-subscriptions:SubscriptionPlanCollection": {
8
8
  "name": "subscriptionplancollection",
@@ -3,12 +3,12 @@
3
3
  "sensitiveFieldsExcluded": true,
4
4
  "generatedAt": "1970-01-01T00:00:00.000Z",
5
5
  "packageName": "@happyvertical/smrt-subscriptions",
6
- "packageVersion": "0.60.16",
6
+ "packageVersion": "0.60.18",
7
7
  "sourceManifestPath": "dist/manifest.json",
8
8
  "agentDocPath": "AGENTS.md",
9
9
  "sourceHashes": {
10
- "manifest": "d0344a095641eda1066db194207f42badf47b28e0caf1fcc03afc73172b003eb",
11
- "packageJson": "223e5c265728c912465daa447faf2c245561cdd69ba46abceca53596ec82a694",
10
+ "manifest": "bd677428d6816389a5353be289957b0aa957f8fb911895d93b012108a89c42f1",
11
+ "packageJson": "956deeb9b7ee22dc1c6b5baf3016fce280d7d80a6862277cf89e0cae4605a266",
12
12
  "agents": "920c91705242b95baed544fa2b33223935353a247a9b9946c5776a315525e642"
13
13
  },
14
14
  "exports": [
@@ -41,11 +41,11 @@ function formatCharge(metric: CommercialMetricView): string {
41
41
  }
42
42
  </script>
43
43
 
44
- <section class="commercial-overview" aria-label={t(M['subscriptions.commercial.overview_label'])} data-smrt-component="CommercialOverview">
44
+ <section class="smrt-commercial-overview__root" aria-label={t(M['subscriptions.commercial.overview_label'])} data-smrt-component="CommercialOverview">
45
45
  {#each metrics as metric (metric.metricKey)}
46
- <article>
47
- <header><strong>{metric.metricKey}</strong><span class:blocked={metric.thresholdState === 'blocked'}>{metric.thresholdState ?? 'ok'}</span></header>
48
- <dl>
46
+ <article data-smrt-part="row">
47
+ <header data-smrt-part="header"><strong>{metric.metricKey}</strong><span class:smrt-commercial-overview__blocked={metric.thresholdState === 'blocked'} data-smrt-part="indicator">{metric.thresholdState ?? 'ok'}</span></header>
48
+ <dl data-smrt-part="body">
49
49
  <div><dt>Usage</dt><dd>{metric.usage}</dd></div>
50
50
  <div><dt>Allowance</dt><dd>{metric.allowance ?? '—'}</dd></div>
51
51
  <div><dt>Forecast</dt><dd>{metric.forecast ?? '—'}</dd></div>
@@ -57,13 +57,39 @@ function formatCharge(metric: CommercialMetricView): string {
57
57
 
58
58
  <style>
59
59
  @layer smrt.reset, smrt.structure, smrt.theme;
60
+ @layer smrt.structure {
61
+ .smrt-commercial-overview__root {
62
+ display:grid;
63
+ gap:.75rem;
64
+ }
65
+ article {
66
+ padding:1rem;
67
+ }
68
+ header, dl, dl div {
69
+ display:flex;
70
+ justify-content:space-between;
71
+ gap:1rem;
72
+ }
73
+ dl {
74
+ flex-wrap:wrap;
75
+ margin:.75rem 0 0;
76
+ }
77
+ dd {
78
+ margin:0;
79
+ }
80
+ }
81
+
60
82
  @layer smrt.theme {
61
- .commercial-overview { display:grid; gap:.75rem; }
62
- article { border:var(--smrt-hairline); border-radius:var(--smrt-radius-md); padding:1rem; }
63
- header, dl, dl div { display:flex; justify-content:space-between; gap:1rem; }
64
- dl { flex-wrap:wrap; margin:.75rem 0 0; }
65
- dt { color:var(--smrt-color-on-surface-variant); }
66
- dd { margin:0; }
67
- .blocked { color:var(--smrt-color-error); }
83
+ article {
84
+ border:var(--smrt-hairline);
85
+ border-radius:var(--smrt-radius-md);
86
+ }
87
+ dt {
88
+ color:var(--smrt-color-on-surface-variant);
89
+ }
90
+ .smrt-commercial-overview__blocked {
91
+ color:var(--smrt-color-error);
92
+ }
68
93
  }
94
+
69
95
  </style>
@@ -91,13 +91,13 @@ let {
91
91
  <!-- raw-primitive-allow: pressable selection card (aria-pressed toggle with multi-line plan summary), not a standard action button -->
92
92
  <button
93
93
  aria-pressed={plan.planKey === selectedPlanKey}
94
- class:selected={plan.planKey === selectedPlanKey}
94
+ class:smrt-plan-picker__selected={plan.planKey === selectedPlanKey}
95
95
  class="smrt-plan-picker__plan"
96
96
  type="button"
97
- onclick={() => onSelect?.(plan)}
97
+ onclick={() => onSelect?.(plan)} data-smrt-part="trigger"
98
98
  >
99
- <span class="smrt-plan-picker__name">{plan.name}</span>
100
- <span class="smrt-plan-picker__price">
99
+ <span class="smrt-plan-picker__name" data-smrt-part="title">{plan.name}</span>
100
+ <span class="smrt-plan-picker__price" data-smrt-part="value">
101
101
  {#if plan.pricingMode === 'free'}
102
102
  {t(M['subscriptions.picker.free'])}
103
103
  {:else if plan.pricingMode === 'pay_what_you_can'}
@@ -112,9 +112,9 @@ let {
112
112
  {/if}
113
113
  </span>
114
114
  {#if plan.description}
115
- <span class="smrt-plan-picker__description">{plan.description}</span>
115
+ <span class="smrt-plan-picker__description" data-smrt-part="description">{plan.description}</span>
116
116
  {/if}
117
- <span class="smrt-plan-picker__features">
117
+ <span class="smrt-plan-picker__features" data-smrt-part="group">
118
118
  {featureCount(plan)} features
119
119
  </span>
120
120
  </button>
@@ -123,40 +123,40 @@ let {
123
123
 
124
124
  <style>
125
125
  @layer smrt.reset, smrt.structure, smrt.theme;
126
- @layer smrt.theme {
126
+ @layer smrt.structure {
127
127
  .smrt-plan-picker {
128
128
  display: grid;
129
129
  gap: 0.75rem;
130
130
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
131
131
  }
132
-
133
132
  .smrt-plan-picker__plan {
134
133
  align-items: flex-start;
135
- background: var(--smrt-color-surface);
136
- border: var(--smrt-hairline);
137
- border-radius: var(--smrt-radius-md);
138
- color: inherit;
139
134
  cursor: pointer;
140
135
  display: grid;
141
136
  gap: 0.45rem;
142
137
  padding: 1rem;
143
- text-align: left;
144
138
  }
139
+ }
145
140
 
146
- .smrt-plan-picker__plan.selected {
141
+ @layer smrt.theme {
142
+ .smrt-plan-picker__plan {
143
+ background: var(--smrt-color-surface);
144
+ border: var(--smrt-hairline);
145
+ border-radius: var(--smrt-radius-md);
146
+ color: inherit;
147
+ text-align: left;
148
+ }
149
+ .smrt-plan-picker__plan.smrt-plan-picker__selected {
147
150
  border-color: var(--smrt-color-primary);
148
151
  box-shadow: 0 0 0 1px var(--smrt-color-primary);
149
152
  }
150
-
151
153
  .smrt-plan-picker__name {
152
154
  font-weight: var(--smrt-typography-weight-bold, 650);
153
155
  }
154
-
155
156
  .smrt-plan-picker__price {
156
157
  font-size: var(--smrt-typography-title-large-size, 1.25rem);
157
158
  font-weight: var(--smrt-typography-weight-bold, 700);
158
159
  }
159
-
160
160
  .smrt-plan-picker__price small,
161
161
  .smrt-plan-picker__description,
162
162
  .smrt-plan-picker__features {
@@ -164,4 +164,5 @@ let {
164
164
  font-size: var(--smrt-typography-body-medium-size, 0.875rem);
165
165
  }
166
166
  }
167
+
167
168
  </style>
@@ -48,7 +48,7 @@ const periodLabel = $derived(
48
48
 
49
49
  <section class="smrt-subscription-summary" data-smrt-component="SubscriptionSummary">
50
50
  <div>
51
- <p class="smrt-subscription-summary__label">{t(M['subscriptions.summary.current_plan'])}</p>
51
+ <p class="smrt-subscription-summary__label" data-smrt-part="label">{t(M['subscriptions.summary.current_plan'])}</p>
52
52
  <h2>{resolution?.planKey ?? t(M['subscriptions.summary.no_active_plan'])}</h2>
53
53
  </div>
54
54
  <dl>
@@ -75,34 +75,36 @@ const periodLabel = $derived(
75
75
 
76
76
  <style>
77
77
  @layer smrt.reset, smrt.structure, smrt.theme;
78
- @layer smrt.theme {
78
+ @layer smrt.structure {
79
79
  .smrt-subscription-summary {
80
80
  align-items: center;
81
81
  display: flex;
82
82
  gap: 1rem;
83
83
  justify-content: space-between;
84
84
  }
85
-
86
85
  .smrt-subscription-summary h2,
87
86
  .smrt-subscription-summary__label {
88
87
  margin: 0;
89
88
  }
90
-
91
- .smrt-subscription-summary__label,
92
- .smrt-subscription-summary dt {
93
- color: var(--smrt-color-on-surface-variant);
94
- font-size: var(--smrt-typography-label-medium-size, 0.8rem);
95
- }
96
-
97
89
  .smrt-subscription-summary dl {
98
90
  display: flex;
99
91
  gap: 1rem;
100
92
  margin: 0;
101
93
  }
94
+ .smrt-subscription-summary dd {
95
+ margin: 0;
96
+ }
97
+ }
102
98
 
99
+ @layer smrt.theme {
100
+ .smrt-subscription-summary__label,
101
+ .smrt-subscription-summary dt {
102
+ color: var(--smrt-color-on-surface-variant);
103
+ font-size: var(--smrt-typography-label-medium-size, 0.8rem);
104
+ }
103
105
  .smrt-subscription-summary dd {
104
106
  font-weight: var(--smrt-typography-weight-bold, 650);
105
- margin: 0;
106
107
  }
107
108
  }
109
+
108
110
  </style>
@@ -12,11 +12,12 @@ let {
12
12
  <div class="smrt-usage-thresholds" data-smrt-component="UsageThresholds">
13
13
  {#each evaluations as evaluation (`${evaluation.threshold.metricKey}:${evaluation.usage.windowStart.toISOString()}`)}
14
14
  <article
15
- class:warn={evaluation.state === 'warn'}
16
- class:blocked={evaluation.state === 'blocked'}
15
+ class:smrt-usage-thresholds__warn={evaluation.state === 'warn'}
16
+ class:smrt-usage-thresholds__blocked={evaluation.state === 'blocked'}
17
17
  class="smrt-usage-thresholds__row"
18
+ data-smrt-part="row"
18
19
  >
19
- <div class="smrt-usage-thresholds__header">
20
+ <div class="smrt-usage-thresholds__header" data-smrt-part="header">
20
21
  <strong>{evaluation.threshold.label ?? evaluation.threshold.metricKey}</strong>
21
22
  <span>{evaluation.usage.quantity} / {evaluation.threshold.limit}</span>
22
23
  </div>
@@ -34,38 +35,41 @@ let {
34
35
 
35
36
  <style>
36
37
  @layer smrt.reset, smrt.structure, smrt.theme;
37
- @layer smrt.theme {
38
+ @layer smrt.structure {
38
39
  .smrt-usage-thresholds {
39
40
  display: grid;
40
41
  gap: 0.75rem;
41
42
  }
42
-
43
43
  .smrt-usage-thresholds__row {
44
- border: var(--smrt-hairline);
45
- border-radius: var(--smrt-radius-md);
46
44
  display: grid;
47
45
  gap: 0.45rem;
48
46
  padding: 0.875rem;
49
47
  }
50
-
51
- .smrt-usage-thresholds__row.warn {
52
- border-color: var(--smrt-color-warning);
53
- }
54
-
55
- .smrt-usage-thresholds__row.blocked {
56
- border-color: var(--smrt-color-error);
57
- }
58
-
59
48
  .smrt-usage-thresholds__header {
60
49
  align-items: center;
61
50
  display: flex;
62
51
  justify-content: space-between;
63
52
  }
53
+ .smrt-usage-thresholds p {
54
+ margin: 0;
55
+ }
56
+ }
64
57
 
58
+ @layer smrt.theme {
59
+ .smrt-usage-thresholds__row {
60
+ border: var(--smrt-hairline);
61
+ border-radius: var(--smrt-radius-md);
62
+ }
63
+ .smrt-usage-thresholds__row.smrt-usage-thresholds__warn {
64
+ border-color: var(--smrt-color-warning);
65
+ }
66
+ .smrt-usage-thresholds__row.smrt-usage-thresholds__blocked {
67
+ border-color: var(--smrt-color-error);
68
+ }
65
69
  .smrt-usage-thresholds p {
66
70
  color: var(--smrt-color-on-surface-variant);
67
71
  font-size: var(--smrt-typography-body-medium-size, 0.875rem);
68
- margin: 0;
69
72
  }
70
73
  }
74
+
71
75
  </style>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-subscriptions",
3
- "version": "0.60.16",
3
+ "version": "0.60.18",
4
4
  "description": "Tenant subscriptions, entitlement resolution, usage thresholds, and subscription UI for SMRT",
5
5
  "type": "module",
6
6
  "smrtRawPrimitives": "strict",
@@ -26,11 +26,11 @@
26
26
  }
27
27
  },
28
28
  "dependencies": {
29
- "@happyvertical/smrt-core": "0.60.16",
30
- "@happyvertical/smrt-tenancy": "0.60.16",
31
- "@happyvertical/smrt-ui": "0.60.16",
32
- "@happyvertical/smrt-users": "0.60.16",
33
- "@happyvertical/sql": "^0.111.8"
29
+ "@happyvertical/smrt-core": "0.60.18",
30
+ "@happyvertical/smrt-tenancy": "0.60.18",
31
+ "@happyvertical/smrt-ui": "0.60.18",
32
+ "@happyvertical/smrt-users": "0.60.18",
33
+ "@happyvertical/sql": "^0.112.2"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "svelte": "^5.57.0"
@@ -41,9 +41,9 @@
41
41
  }
42
42
  },
43
43
  "devDependencies": {
44
- "@happyvertical/accounting": "^0.111.8",
45
- "@happyvertical/smrt-features": "0.60.16",
46
- "@happyvertical/smrt-vitest": "0.60.16",
44
+ "@happyvertical/accounting": "^0.112.2",
45
+ "@happyvertical/smrt-features": "0.60.18",
46
+ "@happyvertical/smrt-vitest": "0.60.18",
47
47
  "@sveltejs/package": "^2.5.8",
48
48
  "@types/node": "24.13.6",
49
49
  "svelte": "^5.57.1",