@vadimcomanescu/nadicode-design-system 2.0.9 → 4.0.1

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 (154) hide show
  1. package/.agents/skills/seed/SKILL.md +24 -14
  2. package/.agents/skills/seed/contract.md +19 -6
  3. package/.agents/skills/seed/recipes/agency-home.md +5 -5
  4. package/.agents/skills/seed/recipes/auth.md +3 -3
  5. package/.agents/skills/seed/recipes/blog-content.md +2 -2
  6. package/.agents/skills/seed/recipes/company-about.md +3 -3
  7. package/.agents/skills/seed/recipes/company-contact.md +3 -3
  8. package/.agents/skills/seed/recipes/digital-workers.md +3 -3
  9. package/.agents/skills/seed/recipes/marketing-landing.md +8 -8
  10. package/.agents/skills/seed/recipes/marketing-shell.md +4 -4
  11. package/.agents/skills/seed/recipes/navigation-shell.md +3 -2
  12. package/.agents/skills/seed/recipes/pricing.md +4 -4
  13. package/.agents/skills/seed/recipes/service-detail.md +3 -3
  14. package/.agents/skills/seed/references/blocks.md +5 -5
  15. package/.agents/skills/seed/references/components.md +2 -2
  16. package/.agents/skills/seed/references/nextjs.md +2 -2
  17. package/README.md +3 -3
  18. package/contracts/consumer-intent-map.json +1 -2
  19. package/contracts/release-governance-baseline.json +3 -37
  20. package/dist/catalog/catalog.d.ts +2220 -0
  21. package/dist/catalog/catalog.js +1913 -0
  22. package/dist/catalog/components.d.ts +201 -0
  23. package/dist/catalog/components.js +407 -0
  24. package/dist/catalog/types.d.ts +4 -0
  25. package/dist/catalog/types.js +1 -0
  26. package/dist/chunk-224KPIOG.js +60 -0
  27. package/dist/chunk-25BOZMXA.js +169 -0
  28. package/dist/chunk-32OLQ7FC.js +130 -0
  29. package/dist/chunk-3JJBJ4VR.js +47 -0
  30. package/dist/chunk-3U56FXYC.js +30 -0
  31. package/dist/chunk-4MWKE6F5.js +86 -0
  32. package/dist/chunk-6HGSU24S.js +94 -0
  33. package/dist/chunk-7IADIXDV.js +168 -0
  34. package/dist/chunk-7NS3VFD7.js +86 -0
  35. package/dist/chunk-ALA6OM7K.js +134 -0
  36. package/dist/chunk-AN5TW4AL.js +50 -0
  37. package/dist/chunk-AWZFQQGN.js +167 -0
  38. package/dist/chunk-BRCBJ3S4.js +42 -0
  39. package/dist/chunk-BRICSLHJ.js +30 -0
  40. package/dist/chunk-BYEHHZZN.js +115 -0
  41. package/dist/chunk-C33GUEDY.js +149 -0
  42. package/dist/chunk-CUDMDYKE.js +150 -0
  43. package/dist/chunk-CVTMWSNS.js +145 -0
  44. package/dist/chunk-DEZXWNYF.js +165 -0
  45. package/dist/chunk-DNJEVMDY.js +40 -0
  46. package/dist/chunk-DNJOBML6.js +66 -0
  47. package/dist/chunk-FTGFOK6T.js +69 -0
  48. package/dist/{chunk-7A2RXKGH.js → chunk-GJ557DGH.js} +1 -1
  49. package/dist/chunk-HFBJ6L6O.js +104 -0
  50. package/dist/chunk-HPTHS7SX.js +52 -0
  51. package/dist/chunk-K4U67BVG.js +175 -0
  52. package/dist/chunk-KNR3WB5C.js +147 -0
  53. package/dist/chunk-KQ7ZC6EM.js +66 -0
  54. package/dist/chunk-LGW7FVG5.js +83 -0
  55. package/dist/chunk-LK2L3C7D.js +72 -0
  56. package/dist/chunk-LP6ZZYOQ.js +36 -0
  57. package/dist/chunk-LV4P7WVM.js +54 -0
  58. package/dist/chunk-MGSGCARB.js +164 -0
  59. package/dist/chunk-N3YFYMNZ.js +73 -0
  60. package/dist/{chunk-DSMGCFMJ.js → chunk-POFFOUQW.js} +2 -5
  61. package/dist/chunk-Q5IYBNA7.js +56 -0
  62. package/dist/chunk-QJCE7NZF.js +85 -0
  63. package/dist/chunk-QW5II6YK.js +96 -0
  64. package/dist/chunk-RMGDDOCD.js +138 -0
  65. package/dist/chunk-RNCX4JIE.js +70 -0
  66. package/dist/chunk-RWCL5OPX.js +112 -0
  67. package/dist/chunk-S5OY2B63.js +28 -0
  68. package/dist/chunk-SIQNG72C.js +257 -0
  69. package/dist/chunk-SP7NIZFP.js +117 -0
  70. package/dist/chunk-SWRJWMGG.js +30 -0
  71. package/dist/chunk-TCQIJ3DO.js +85 -0
  72. package/dist/chunk-TPJ6JJ2F.js +290 -0
  73. package/dist/chunk-UR43ANYS.js +159 -0
  74. package/dist/chunk-VRGPG2YN.js +79 -0
  75. package/dist/chunk-WSBLCWY7.js +126 -0
  76. package/dist/chunk-XKKFSFYO.js +93 -0
  77. package/dist/chunk-XO7TBM47.js +32 -0
  78. package/dist/chunk-YDYDGG5K.js +132 -0
  79. package/dist/chunk-YMJOUYMT.js +171 -0
  80. package/dist/chunk-Z2WION42.js +32 -0
  81. package/dist/chunk-ZFKSVEYW.js +35 -0
  82. package/dist/components/blocks/AgentProfileGridBlock.js +8 -86
  83. package/dist/components/blocks/AgentRunOverviewBlock.js +8 -147
  84. package/dist/components/blocks/AgentWorkbenchBlock.js +15 -257
  85. package/dist/components/blocks/AudioVisualizerBlock.js +2 -50
  86. package/dist/components/blocks/AuthLayout.js +9 -73
  87. package/dist/components/blocks/BannerBlock.js +8 -66
  88. package/dist/components/blocks/BarChartBlock.js +5 -47
  89. package/dist/components/blocks/ChartBlock.js +7 -54
  90. package/dist/components/blocks/ChartCollectionBlock.js +11 -171
  91. package/dist/components/blocks/ChatLayout.js +12 -126
  92. package/dist/components/blocks/CreateBlock.js +9 -104
  93. package/dist/components/blocks/DataGridBlock.js +9 -117
  94. package/dist/components/blocks/DirectoryBlock.js +12 -85
  95. package/dist/components/blocks/FeatureGridBlock.js +6 -56
  96. package/dist/components/blocks/GalleryBlock.js +6 -69
  97. package/dist/components/blocks/HeroBlock.js +2 -2
  98. package/dist/components/blocks/HeroSectionBlock.js +10 -134
  99. package/dist/components/blocks/IntegrationsBlock.js +13 -94
  100. package/dist/components/blocks/InteractiveAreaChartBlock.js +5 -290
  101. package/dist/components/blocks/KanbanDemoBlock.js +8 -145
  102. package/dist/components/blocks/LogoCloud.js +4 -35
  103. package/dist/components/blocks/NavUser.js +5 -85
  104. package/dist/components/blocks/NotFoundBlock.js +8 -32
  105. package/dist/components/blocks/OnboardingBlock.js +7 -66
  106. package/dist/components/blocks/SettingsLayout.js +13 -86
  107. package/dist/components/blocks/SignUpBlock.js +8 -168
  108. package/dist/components/blocks/SolutionShowcaseBlock.js +11 -112
  109. package/dist/components/blocks/StatsBlock.js +6 -60
  110. package/dist/components/blocks/UsageDonutBlock.js +5 -79
  111. package/dist/components/blocks/WizardBlock.js +12 -93
  112. package/dist/components/blocks/user/InviteUserModal.js +10 -132
  113. package/dist/components/page-kits/AccountLockedPageKit.js +3 -40
  114. package/dist/components/page-kits/AgentsChatPageKit.js +11 -159
  115. package/dist/components/page-kits/AnalyticsPageKit.js +12 -150
  116. package/dist/components/page-kits/BlogContentPageKit.js +12 -167
  117. package/dist/components/page-kits/CheckoutPageKit.js +9 -83
  118. package/dist/components/page-kits/CompanySuitePageKit.js +9 -96
  119. package/dist/components/page-kits/DashboardPageKit.js +11 -149
  120. package/dist/components/page-kits/ErrorPageKit.js +5 -52
  121. package/dist/components/page-kits/KanbanBoardPageKit.js +7 -169
  122. package/dist/components/page-kits/LandingPageKit.js +12 -73
  123. package/dist/components/page-kits/LoginPageKit.js +3 -32
  124. package/dist/components/page-kits/OnboardingPageKit.js +6 -115
  125. package/dist/components/page-kits/PricingPageKit.js +12 -138
  126. package/dist/components/page-kits/ProfileSettingsPageKit.js +10 -164
  127. package/dist/components/page-kits/RecoveryPageKit.js +3 -42
  128. package/dist/components/page-kits/ResetPageKit.js +3 -36
  129. package/dist/components/page-kits/ServiceSuitePageKit.js +11 -176
  130. package/dist/components/page-kits/SignupPageKit.js +3 -30
  131. package/dist/components/page-kits/SuccessPageKit.js +4 -30
  132. package/dist/components/page-kits/TeamSettingsPageKit.js +9 -165
  133. package/dist/components/page-kits/TwoFactorPageKit.js +4 -28
  134. package/dist/components/page-kits/VerifyEmailPageKit.js +4 -30
  135. package/dist/components/page-kits/VoiceAgentsPageKit.js +13 -130
  136. package/dist/components/ui/AvatarUpload.js +1 -1
  137. package/dist/components/ui/CheckoutForm.js +5 -70
  138. package/dist/components/ui/MouseEffect.js +1 -1
  139. package/eslint-rules/nadicode/config.js +2 -0
  140. package/eslint-rules/nadicode/data/catalog-names.json +93 -0
  141. package/eslint-rules/nadicode/index.js +4 -0
  142. package/eslint-rules/nadicode/rules/__tests__/require-catalog-component.test.js +77 -0
  143. package/eslint-rules/nadicode/rules/__tests__/require-catalog-import.test.js +111 -0
  144. package/eslint-rules/nadicode/rules/require-catalog-component.js +79 -0
  145. package/eslint-rules/nadicode/rules/require-catalog-import.js +59 -0
  146. package/package.json +15 -358
  147. package/contracts/block-props-schemas.json +0 -2186
  148. package/contracts/component-props-schemas.json +0 -8322
  149. package/contracts/consumer-contract.json +0 -178
  150. package/contracts/page-kit-props-schemas.json +0 -1894
  151. package/contracts/public-surface-registry.json +0 -5822
  152. package/contracts/public-surface-registry.schema.json +0 -219
  153. package/contracts/spec-manifest.json +0 -46
  154. package/dist/catalog.json +0 -5221
@@ -1,28 +1,29 @@
1
- import { NavigationShellPageKit } from '../../chunk-ZKLB5N3Q.js';
2
- import { ActivityFeedBlock } from '../../chunk-ZM2NODUK.js';
3
- import { Typography } from '../../chunk-N53OMWW2.js';
1
+ export { DashboardPageKit } from '../../chunk-C33GUEDY.js';
2
+ import '../../chunk-ZKLB5N3Q.js';
3
+ import '../../chunk-ZM2NODUK.js';
4
+ import '../../chunk-N53OMWW2.js';
4
5
  import '../../chunk-YQIABLDO.js';
5
6
  import '../../chunk-J2DCQDXO.js';
6
7
  import '../../chunk-C4SNHMYC.js';
7
8
  import '../../chunk-B5QL76GA.js';
8
9
  import '../../chunk-HOWTYZL5.js';
9
- import { MetricCard } from '../../chunk-BRXNGF5W.js';
10
+ import '../../chunk-BRXNGF5W.js';
10
11
  import '../../chunk-ULLTRLBD.js';
11
12
  import '../../chunk-RHEF3WH6.js';
12
13
  import '../../chunk-3R2VLZUR.js';
13
14
  import '../../chunk-4O6L5YWT.js';
14
- import { Heading } from '../../chunk-WI547C47.js';
15
- import { DataFreshness } from '../../chunk-WST5NLLC.js';
15
+ import '../../chunk-WI547C47.js';
16
+ import '../../chunk-WST5NLLC.js';
16
17
  import '../../chunk-CUZJIDU7.js';
17
18
  import '../../chunk-AP3XXYAY.js';
18
19
  import '../../chunk-LIBXYD5Q.js';
19
- import { ChartCard } from '../../chunk-HJZRSPWB.js';
20
+ import '../../chunk-HJZRSPWB.js';
20
21
  import '../../chunk-RASEB2XI.js';
21
- import { Empty, EmptyTitle, EmptyDescription } from '../../chunk-55HD4L6G.js';
22
+ import '../../chunk-55HD4L6G.js';
22
23
  import '../../chunk-MJ4CB6ZL.js';
23
24
  import '../../chunk-I23DDSU7.js';
24
25
  import '../../chunk-35EX5FP5.js';
25
- import { Card, CardHeader, CardTitle, CardContent } from '../../chunk-AH6YSYYT.js';
26
+ import '../../chunk-AH6YSYYT.js';
26
27
  import '../../chunk-NAAU5IWU.js';
27
28
  import '../../chunk-7KIDDF3I.js';
28
29
  import '../../chunk-6FOHUNXR.js';
@@ -142,143 +143,4 @@ import '../../chunk-S4JAHKOP.js';
142
143
  import '../../chunk-TV4RSQH4.js';
143
144
  import '../../chunk-HJBXUXTD.js';
144
145
  import '../../chunk-ASKFAYYR.js';
145
- import { cn } from '../../chunk-QYZT24TS.js';
146
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
147
-
148
- var EMPTY_KPIS = [];
149
- var EMPTY_CHART_REGIONS = [];
150
- var EMPTY_ACTIVITY_ITEMS = [];
151
- function deriveRegionState(state, data) {
152
- if (state) {
153
- return state;
154
- }
155
- if (!data || data.length === 0) {
156
- return "empty";
157
- }
158
- return "has-data";
159
- }
160
- function renderChartRegion(region) {
161
- const state = deriveRegionState(region.state, region.data);
162
- const isPartialDataState = state === "partial-data";
163
- if (state === "error") {
164
- return /* @__PURE__ */ jsxs(Card, { className: region.className, children: [
165
- /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: region.title }) }),
166
- /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(
167
- "div",
168
- {
169
- role: "alert",
170
- className: "rounded-md border border-destructive/40 bg-destructive/10 px-4 py-3 text-sm text-destructive",
171
- children: region.errorMessage ?? "Chart region is unavailable."
172
- }
173
- ) })
174
- ] }, region.id);
175
- }
176
- return /* @__PURE__ */ jsxs("div", { className: cn("space-y-2", region.className), children: [
177
- isPartialDataState ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: "Some chart points are still loading, available data remains visible." }) : null,
178
- /* @__PURE__ */ jsx(
179
- ChartCard,
180
- {
181
- title: region.title,
182
- description: region.description,
183
- chart: region.chart,
184
- data: state === "empty" ? [] : region.data,
185
- loading: state === "loading",
186
- emptyTitle: region.emptyTitle ?? "No chart data",
187
- emptyDescription: region.emptyDescription ?? "This chart will populate once data is available."
188
- }
189
- )
190
- ] }, region.id);
191
- }
192
- function DashboardPageKit({
193
- shell,
194
- title = "Dashboard overview",
195
- description = "Track KPI performance, chart health, and recent activity from one route-level contract.",
196
- kpis = EMPTY_KPIS,
197
- kpiState,
198
- chartRegions = EMPTY_CHART_REGIONS,
199
- activityRegion,
200
- lastUpdated,
201
- className
202
- }) {
203
- const freshnessTimestamp = lastUpdated ?? /* @__PURE__ */ new Date();
204
- const resolvedKpiState = deriveRegionState(kpiState, kpis);
205
- const resolvedActivityState = deriveRegionState(activityRegion?.state, activityRegion?.items ?? EMPTY_ACTIVITY_ITEMS);
206
- const hasLoadingCharts = chartRegions.some((region) => deriveRegionState(region.state, region.data) === "loading");
207
- const loadingKpis = Array.from({ length: Math.max(kpis.length, 4) }, (_, index) => /* @__PURE__ */ jsx(
208
- MetricCard,
209
- {
210
- label: `Loading metric ${index + 1}`,
211
- value: 0,
212
- loading: true
213
- },
214
- `loading-kpi-${index}`
215
- ));
216
- return /* @__PURE__ */ jsx(NavigationShellPageKit, { ...shell, children: /* @__PURE__ */ jsxs("section", { className: cn("space-y-6", className), children: [
217
- /* @__PURE__ */ jsxs("header", { className: "flex flex-wrap items-center gap-3", children: [
218
- /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [
219
- /* @__PURE__ */ jsx(Heading, { level: 3, children: title }),
220
- /* @__PURE__ */ jsx(Typography, { variant: "muted", children: description })
221
- ] }),
222
- /* @__PURE__ */ jsx(DataFreshness, { lastUpdated: freshnessTimestamp, isLive: true })
223
- ] }),
224
- /* @__PURE__ */ jsxs("section", { "aria-label": "Dashboard KPI region", className: "space-y-3", children: [
225
- resolvedKpiState === "loading" ? /* @__PURE__ */ jsxs(Fragment, { children: [
226
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: "Loading KPI metrics" }),
227
- /* @__PURE__ */ jsx("div", { className: "grid gap-4 md:grid-cols-2 xl:grid-cols-4", children: loadingKpis })
228
- ] }) : null,
229
- resolvedKpiState === "error" ? /* @__PURE__ */ jsx(
230
- "div",
231
- {
232
- role: "alert",
233
- className: "rounded-md border border-destructive/40 bg-destructive/10 px-4 py-3 text-sm text-destructive",
234
- children: "KPI metrics are currently unavailable."
235
- }
236
- ) : null,
237
- resolvedKpiState === "empty" ? /* @__PURE__ */ jsxs(Empty, { children: [
238
- /* @__PURE__ */ jsx(EmptyTitle, { children: "No KPI data" }),
239
- /* @__PURE__ */ jsx(EmptyDescription, { children: "Connect your data source to populate KPI cards." })
240
- ] }) : null,
241
- resolvedKpiState === "partial-data" ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: "Some KPI metrics are temporarily unavailable." }) : null,
242
- resolvedKpiState === "has-data" || resolvedKpiState === "partial-data" ? /* @__PURE__ */ jsx("div", { className: "grid gap-4 md:grid-cols-2 xl:grid-cols-4", children: kpis.map((kpi) => /* @__PURE__ */ jsx(
243
- MetricCard,
244
- {
245
- ...kpi
246
- },
247
- `${kpi.label}-${String(kpi.value)}`
248
- )) }) : null
249
- ] }),
250
- /* @__PURE__ */ jsxs("section", { "aria-label": "Dashboard chart regions", className: "grid gap-4 xl:grid-cols-2", children: [
251
- hasLoadingCharts ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary xl:col-span-2", children: "Loading chart data" }) : null,
252
- chartRegions.map((region) => renderChartRegion(region))
253
- ] }),
254
- /* @__PURE__ */ jsxs("section", { "aria-label": "Dashboard activity region", children: [
255
- resolvedActivityState === "loading" ? /* @__PURE__ */ jsxs(Card, { children: [
256
- /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: activityRegion?.title ?? "Recent activity" }) }),
257
- /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: "Loading activity feed" }) })
258
- ] }) : null,
259
- resolvedActivityState === "error" ? /* @__PURE__ */ jsx(
260
- "div",
261
- {
262
- role: "alert",
263
- className: "rounded-md border border-destructive/40 bg-destructive/10 px-4 py-3 text-sm text-destructive",
264
- children: activityRegion?.errorMessage ?? "Activity feed is unavailable."
265
- }
266
- ) : null,
267
- resolvedActivityState === "empty" ? /* @__PURE__ */ jsxs(Empty, { children: [
268
- /* @__PURE__ */ jsx(EmptyTitle, { children: activityRegion?.emptyTitle ?? "No activity yet" }),
269
- /* @__PURE__ */ jsx(EmptyDescription, { children: activityRegion?.emptyDescription ?? "Recent updates will appear once your team starts making changes." })
270
- ] }) : null,
271
- resolvedActivityState === "partial-data" ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: "Recent activity is partially available while remaining events sync." }) : null,
272
- resolvedActivityState === "has-data" || resolvedActivityState === "partial-data" ? /* @__PURE__ */ jsx(
273
- ActivityFeedBlock,
274
- {
275
- title: activityRegion?.title ?? "Recent activity",
276
- activities: activityRegion?.items,
277
- className: "py-4 md:py-6"
278
- }
279
- ) : null
280
- ] })
281
- ] }) });
282
- }
283
-
284
- export { DashboardPageKit };
146
+ import '../../chunk-QYZT24TS.js';
@@ -1,55 +1,8 @@
1
- import { Typography } from '../../chunk-N53OMWW2.js';
2
- import { Card, CardHeader, CardTitle, CardContent } from '../../chunk-AH6YSYYT.js';
3
- import { Button } from '../../chunk-7KIDDF3I.js';
1
+ export { ErrorPageKit } from '../../chunk-HPTHS7SX.js';
2
+ import '../../chunk-N53OMWW2.js';
3
+ import '../../chunk-AH6YSYYT.js';
4
+ import '../../chunk-7KIDDF3I.js';
4
5
  import '../../chunk-PD2YEH3H.js';
5
6
  import '../../chunk-CRY67BIF.js';
6
7
  import '../../chunk-HJC6U46F.js';
7
- import { cn } from '../../chunk-QYZT24TS.js';
8
- import { jsx, jsxs } from 'react/jsx-runtime';
9
-
10
- function variantLabel(variant) {
11
- switch (variant) {
12
- case "not-found":
13
- return "Not found";
14
- case "server-error":
15
- return "Server error";
16
- case "generic-fallback":
17
- return "Fallback";
18
- }
19
- }
20
- function ErrorPageKit({
21
- variant,
22
- title,
23
- description,
24
- metadata,
25
- primaryAction,
26
- secondaryAction,
27
- supportContent,
28
- className
29
- }) {
30
- const metadataEntries = [
31
- ...metadata?.statusCode ? [["Status", metadata.statusCode]] : [],
32
- ...metadata?.errorCode ? [["Error code", metadata.errorCode]] : [],
33
- ...metadata?.incidentId ? [["Incident", metadata.incidentId]] : []
34
- ];
35
- return /* @__PURE__ */ jsx("section", { className: cn("min-h-[70dvh] bg-background px-6 py-12 text-text-primary", className), children: /* @__PURE__ */ jsx("div", { className: "mx-auto flex w-full max-w-2xl flex-col items-center justify-center", children: /* @__PURE__ */ jsxs(Card, { className: "w-full", children: [
36
- /* @__PURE__ */ jsxs(CardHeader, { className: "space-y-3", children: [
37
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "uppercase tracking-[0.18em] text-text-tertiary", children: variantLabel(variant) }),
38
- /* @__PURE__ */ jsx(CardTitle, { children: title }),
39
- /* @__PURE__ */ jsx(Typography, { variant: "muted", children: description })
40
- ] }),
41
- /* @__PURE__ */ jsxs(CardContent, { className: "space-y-5", children: [
42
- metadataEntries.length > 0 ? /* @__PURE__ */ jsx("div", { className: "grid gap-2 rounded-md border border-border/70 bg-surface/40 p-3 text-sm", children: metadataEntries.map(([label, value]) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
43
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: label }),
44
- /* @__PURE__ */ jsx("span", { className: "font-medium text-text-primary", children: value })
45
- ] }, label)) }) : null,
46
- supportContent ? /* @__PURE__ */ jsx("div", { className: "rounded-md border border-border/60 bg-surface/30 px-3 py-2 text-sm text-text-secondary", children: supportContent }) : null,
47
- primaryAction || secondaryAction ? /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
48
- primaryAction ? /* @__PURE__ */ jsx(Button, { type: "button", onClick: primaryAction.onAction, children: primaryAction.label }) : null,
49
- secondaryAction ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: secondaryAction.onAction, children: secondaryAction.label }) : null
50
- ] }) : null
51
- ] })
52
- ] }) }) });
53
- }
54
-
55
- export { ErrorPageKit };
8
+ import '../../chunk-QYZT24TS.js';
@@ -1,13 +1,14 @@
1
- import { CrudListDetailPageKit } from '../../chunk-OJ7OO3QB.js';
1
+ export { KanbanBoardPageKit } from '../../chunk-25BOZMXA.js';
2
+ import '../../chunk-OJ7OO3QB.js';
2
3
  import '../../chunk-ZKLB5N3Q.js';
3
- import { Typography } from '../../chunk-N53OMWW2.js';
4
+ import '../../chunk-N53OMWW2.js';
4
5
  import '../../chunk-J2DCQDXO.js';
5
6
  import '../../chunk-C4SNHMYC.js';
6
7
  import '../../chunk-B5QL76GA.js';
7
8
  import '../../chunk-HOWTYZL5.js';
8
9
  import '../../chunk-2BADJLMV.js';
9
10
  import '../../chunk-WI547C47.js';
10
- import { KanbanBoard, KanbanColumn, KanbanColumnHeader, KanbanItem, KanbanHandle } from '../../chunk-TYP2MR3Q.js';
11
+ import '../../chunk-TYP2MR3Q.js';
11
12
  import '../../chunk-VTAOHSPW.js';
12
13
  import '../../chunk-B3BYBSF2.js';
13
14
  import '../../chunk-FOFGPWFS.js';
@@ -20,7 +21,7 @@ import '../../chunk-55HD4L6G.js';
20
21
  import '../../chunk-MJ4CB6ZL.js';
21
22
  import '../../chunk-35EX5FP5.js';
22
23
  import '../../chunk-AH6YSYYT.js';
23
- import { Avatar, AvatarFallback } from '../../chunk-NAAU5IWU.js';
24
+ import '../../chunk-NAAU5IWU.js';
24
25
  import '../../chunk-7KIDDF3I.js';
25
26
  import '../../chunk-6FOHUNXR.js';
26
27
  import '../../chunk-PD2YEH3H.js';
@@ -135,171 +136,8 @@ import '../../chunk-UHXGBV5N.js';
135
136
  import '../../chunk-UIUMTURU.js';
136
137
  import '../../chunk-PRUXIDBD.js';
137
138
  import '../../chunk-NURPUVUV.js';
138
- import { Badge } from '../../chunk-S4JAHKOP.js';
139
+ import '../../chunk-S4JAHKOP.js';
139
140
  import '../../chunk-TV4RSQH4.js';
140
141
  import '../../chunk-HJBXUXTD.js';
141
142
  import '../../chunk-ASKFAYYR.js';
142
- import { cn } from '../../chunk-QYZT24TS.js';
143
- import { useState, useMemo } from 'react';
144
- import { jsx, jsxs } from 'react/jsx-runtime';
145
-
146
- function mapState(state) {
147
- switch (state) {
148
- case "loading":
149
- return "loading";
150
- case "empty":
151
- return "empty";
152
- default:
153
- return "has-data";
154
- }
155
- }
156
- function KanbanBoardPageKit({
157
- shell,
158
- state,
159
- columns,
160
- getItemId,
161
- onMove,
162
- readOnly = false,
163
- title = "Kanban board",
164
- description = "Track work through draggable board columns with explicit move and failure contracts.",
165
- moveErrorMessage,
166
- activityRegion,
167
- className
168
- }) {
169
- const [selectedItemId, setSelectedItemId] = useState(null);
170
- const boardColumns = useMemo(
171
- () => columns.map((column) => ({ id: column.id, items: column.items })),
172
- [columns]
173
- );
174
- const flattenedRows = useMemo(
175
- () => columns.flatMap((column) => column.items.map((item) => ({
176
- id: String(getItemId(item)),
177
- summaryLabel: item.title,
178
- cells: {
179
- title: item.title,
180
- column: column.title
181
- }
182
- }))),
183
- [columns, getItemId]
184
- );
185
- const selectedItem = useMemo(() => {
186
- if (!selectedItemId) {
187
- return null;
188
- }
189
- for (const column of columns) {
190
- const match = column.items.find((item) => String(getItemId(item)) === selectedItemId);
191
- if (match) {
192
- return match;
193
- }
194
- }
195
- return null;
196
- }, [columns, getItemId, selectedItemId]);
197
- return /* @__PURE__ */ jsx(
198
- CrudListDetailPageKit,
199
- {
200
- shell,
201
- title,
202
- description,
203
- state: mapState(state),
204
- columns: [
205
- { id: "title", header: "Title" },
206
- { id: "column", header: "Column" }
207
- ],
208
- rows: flattenedRows,
209
- selectedRowId: selectedItemId,
210
- onRowSelect: setSelectedItemId,
211
- detailPanel: {
212
- title: "Task detail",
213
- description: "Review the selected work item without leaving the board context.",
214
- mode: "inline",
215
- renderDetail: () => {
216
- if (!selectedItem) {
217
- return /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: "Select a task to inspect details." });
218
- }
219
- return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
220
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "font-medium text-text-primary", children: selectedItem.title }),
221
- selectedItem.description ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: selectedItem.description }) : null,
222
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
223
- selectedItem.badgeLabel ? /* @__PURE__ */ jsx(Badge, { variant: "outline", children: selectedItem.badgeLabel }) : null,
224
- selectedItem.assigneeLabel ? /* @__PURE__ */ jsx(Avatar, { className: "h-6 w-6 text-[11px]", children: /* @__PURE__ */ jsx(AvatarFallback, { children: selectedItem.assigneeLabel }) }) : null
225
- ] })
226
- ] });
227
- }
228
- },
229
- emptyState: {
230
- title: "No board columns available",
231
- description: "Provide at least one column to render the kanban board."
232
- },
233
- pagination: {
234
- page: 1,
235
- totalPages: 1,
236
- onPageChange: () => {
237
- }
238
- },
239
- renderCollection: () => /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
240
- state === "move-failed" ? /* @__PURE__ */ jsx(
241
- "div",
242
- {
243
- role: "alert",
244
- className: "rounded-md border border-destructive/40 bg-destructive/10 px-4 py-3 text-sm text-destructive",
245
- children: moveErrorMessage ?? "A move failed. Keep board state and retry once the backend recovers."
246
- }
247
- ) : null,
248
- /* @__PURE__ */ jsx(
249
- KanbanBoard,
250
- {
251
- value: boardColumns,
252
- getItemId,
253
- getItemLabel: (item) => item.title,
254
- canMove: readOnly ? () => false : void 0,
255
- onValueChange: onMove,
256
- className: cn("pb-2", className),
257
- children: columns.map((column) => /* @__PURE__ */ jsxs(
258
- KanbanColumn,
259
- {
260
- id: column.id,
261
- items: column.items,
262
- disabled: readOnly || column.disabled,
263
- "aria-label": `${column.title} column`,
264
- children: [
265
- /* @__PURE__ */ jsxs(KanbanColumnHeader, { children: [
266
- /* @__PURE__ */ jsx("span", { children: column.title }),
267
- /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "tabular-nums text-xs", children: column.items.length })
268
- ] }),
269
- /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: column.items.map((item) => {
270
- const itemId = String(getItemId(item));
271
- return /* @__PURE__ */ jsx(
272
- KanbanItem,
273
- {
274
- value: item,
275
- disabled: readOnly,
276
- onClick: () => setSelectedItemId(itemId),
277
- children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2", children: [
278
- !readOnly ? /* @__PURE__ */ jsx(KanbanHandle, { "aria-label": `Move ${item.title}` }) : null,
279
- /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [
280
- /* @__PURE__ */ jsx(Typography, { variant: "small", className: "font-medium text-text-primary", children: item.title }),
281
- item.description ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "line-clamp-2 text-text-secondary", children: item.description }) : null,
282
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
283
- item.badgeLabel ? /* @__PURE__ */ jsx(Badge, { variant: "outline", children: item.badgeLabel }) : null,
284
- item.assigneeLabel ? /* @__PURE__ */ jsx(Avatar, { className: "h-5 w-5 text-[10px]", children: /* @__PURE__ */ jsx(AvatarFallback, { children: item.assigneeLabel }) }) : null
285
- ] })
286
- ] })
287
- ] })
288
- },
289
- itemId
290
- );
291
- }) })
292
- ]
293
- },
294
- column.id
295
- ))
296
- }
297
- ),
298
- activityRegion ? /* @__PURE__ */ jsx("div", { children: activityRegion }) : null
299
- ] }),
300
- className
301
- }
302
- );
303
- }
304
-
305
- export { KanbanBoardPageKit };
143
+ import '../../chunk-QYZT24TS.js';
@@ -1,16 +1,17 @@
1
- import { MarketingShellPageKit } from '../../chunk-Z233ZQZE.js';
2
- import { SocialProofBlock } from '../../chunk-C7WHMSF3.js';
3
- import { StatsMarketingBlock } from '../../chunk-QIHA7S3A.js';
4
- import { NewsletterBlock } from '../../chunk-K7NQ6ZAW.js';
5
- import { PricingBlock } from '../../chunk-VNNAL4A6.js';
1
+ export { LandingPageKit } from '../../chunk-LK2L3C7D.js';
2
+ import '../../chunk-Z233ZQZE.js';
3
+ import '../../chunk-C7WHMSF3.js';
4
+ import '../../chunk-QIHA7S3A.js';
5
+ import '../../chunk-K7NQ6ZAW.js';
6
+ import '../../chunk-VNNAL4A6.js';
6
7
  import '../../chunk-DARC2ACH.js';
7
- import { HeroBlock } from '../../chunk-7A2RXKGH.js';
8
+ import '../../chunk-GJ557DGH.js';
8
9
  import '../../chunk-QQOWC53X.js';
9
10
  import '../../chunk-WOYBVPXK.js';
10
- import { FAQBlock } from '../../chunk-NEHCPO53.js';
11
- import { FeatureBlock } from '../../chunk-HJ3A2YNO.js';
11
+ import '../../chunk-NEHCPO53.js';
12
+ import '../../chunk-HJ3A2YNO.js';
12
13
  import '../../chunk-AYWL4IYM.js';
13
- import { CallToActionBlock } from '../../chunk-GJPTPLCQ.js';
14
+ import '../../chunk-GJPTPLCQ.js';
14
15
  import '../../chunk-G5EO22OR.js';
15
16
  import '../../chunk-OHX2LFAH.js';
16
17
  import '../../chunk-SGI25ZJ6.js';
@@ -37,7 +38,7 @@ import '../../chunk-LIBXYD5Q.js';
37
38
  import '../../chunk-I23DDSU7.js';
38
39
  import '../../chunk-AH6YSYYT.js';
39
40
  import '../../chunk-NAAU5IWU.js';
40
- import '../../chunk-DSMGCFMJ.js';
41
+ import '../../chunk-POFFOUQW.js';
41
42
  import '../../chunk-7KIDDF3I.js';
42
43
  import '../../chunk-6FOHUNXR.js';
43
44
  import '../../chunk-PD2YEH3H.js';
@@ -157,66 +158,4 @@ import '../../chunk-S4JAHKOP.js';
157
158
  import '../../chunk-TV4RSQH4.js';
158
159
  import '../../chunk-HJBXUXTD.js';
159
160
  import '../../chunk-ASKFAYYR.js';
160
- import { cn } from '../../chunk-QYZT24TS.js';
161
- import React from 'react';
162
- import { jsx, jsxs } from 'react/jsx-runtime';
163
-
164
- var DEFAULT_SECTION_ORDER = [
165
- "hero",
166
- "features",
167
- "proof",
168
- "pricing-teaser",
169
- "faq",
170
- "cta",
171
- "newsletter"
172
- ];
173
- var DEFAULT_FEATURES = {};
174
- var DEFAULT_PROOF = {};
175
- var DEFAULT_PRICING_TEASER = {};
176
- var DEFAULT_FAQ = {};
177
- var DEFAULT_CTA = {};
178
- var DEFAULT_NEWSLETTER = {};
179
- function normalizeSectionOrder(sectionOrder) {
180
- if (!sectionOrder || sectionOrder.length === 0) {
181
- return DEFAULT_SECTION_ORDER;
182
- }
183
- const seen = /* @__PURE__ */ new Set();
184
- return sectionOrder.filter((section) => {
185
- if (seen.has(section)) {
186
- return false;
187
- }
188
- seen.add(section);
189
- return true;
190
- });
191
- }
192
- function LandingPageKit({
193
- shell,
194
- sectionOrder,
195
- hero,
196
- features = DEFAULT_FEATURES,
197
- proof = DEFAULT_PROOF,
198
- pricingTeaser = DEFAULT_PRICING_TEASER,
199
- faq = DEFAULT_FAQ,
200
- cta = DEFAULT_CTA,
201
- newsletter = DEFAULT_NEWSLETTER,
202
- className
203
- }) {
204
- const orderedSections = normalizeSectionOrder(sectionOrder);
205
- const hasProof = proof !== null && (proof.logos !== null || proof.testimonials !== null || proof.stats !== null);
206
- const sectionById = {
207
- hero: hero === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "landing-section-hero", className: "mx-auto w-full max-w-6xl px-6 pt-4", children: /* @__PURE__ */ jsx(HeroBlock, { ...hero }) }),
208
- features: features === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "landing-section-features", className: "mx-auto w-full max-w-6xl px-6", children: /* @__PURE__ */ jsx(FeatureBlock, { ...features }) }),
209
- proof: !hasProof ? null : /* @__PURE__ */ jsxs("section", { "data-testid": "landing-section-proof", className: "mx-auto grid w-full max-w-6xl gap-6 px-6 lg:grid-cols-2", children: [
210
- proof.logos !== null ? /* @__PURE__ */ jsx(SocialProofBlock, { variant: "logo-cloud", ...proof.logos }) : null,
211
- proof.stats !== null ? /* @__PURE__ */ jsx(StatsMarketingBlock, { ...proof.stats }) : null,
212
- proof.testimonials !== null ? /* @__PURE__ */ jsx("div", { className: "lg:col-span-2", children: /* @__PURE__ */ jsx(SocialProofBlock, { variant: "testimonials", ...proof.testimonials }) }) : null
213
- ] }),
214
- "pricing-teaser": pricingTeaser === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "landing-section-pricing-teaser", className: "mx-auto w-full max-w-6xl px-6", children: /* @__PURE__ */ jsx(PricingBlock, { showBillingToggle: false, ...pricingTeaser }) }),
215
- faq: faq === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "landing-section-faq", className: "mx-auto w-full max-w-6xl px-6", children: /* @__PURE__ */ jsx(FAQBlock, { ...faq }) }),
216
- cta: cta === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "landing-section-cta", className: "mx-auto w-full max-w-6xl px-6", children: /* @__PURE__ */ jsx(CallToActionBlock, { ...cta }) }),
217
- newsletter: newsletter === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "landing-section-newsletter", className: "mx-auto w-full max-w-6xl px-6 pb-16", children: /* @__PURE__ */ jsx(NewsletterBlock, { ...newsletter }) })
218
- };
219
- return /* @__PURE__ */ jsx(MarketingShellPageKit, { ...shell, children: /* @__PURE__ */ jsx("div", { className: cn("space-y-10 pb-10", className), children: orderedSections.map((sectionId) => /* @__PURE__ */ jsx(React.Fragment, { children: sectionById[sectionId] }, sectionId)) }) });
220
- }
221
-
222
- export { LandingPageKit };
161
+ import '../../chunk-QYZT24TS.js';
@@ -1,4 +1,5 @@
1
- import { LoginBlock } from '../../chunk-RGE5OQMZ.js';
1
+ export { LoginPageKit } from '../../chunk-Z2WION42.js';
2
+ import '../../chunk-RGE5OQMZ.js';
2
3
  import '../../chunk-DQPK2XRL.js';
3
4
  import '../../chunk-WI547C47.js';
4
5
  import '../../chunk-RX5EUODB.js';
@@ -10,34 +11,4 @@ import '../../chunk-7KIDDF3I.js';
10
11
  import '../../chunk-PD2YEH3H.js';
11
12
  import '../../chunk-CRY67BIF.js';
12
13
  import '../../chunk-HJC6U46F.js';
13
- import { cn } from '../../chunk-QYZT24TS.js';
14
- import { jsx } from 'react/jsx-runtime';
15
-
16
- function LoginPageKit({
17
- action,
18
- googleAction,
19
- error,
20
- showSocial = true,
21
- labels,
22
- forgotPasswordHref,
23
- signUpHref,
24
- className,
25
- cardClassName
26
- }) {
27
- return /* @__PURE__ */ jsx("section", { className: cn("min-h-dvh w-full bg-background px-4 py-12 md:px-8 md:py-20", className), children: /* @__PURE__ */ jsx("div", { className: "mx-auto flex w-full max-w-5xl items-center justify-center", children: /* @__PURE__ */ jsx(
28
- LoginBlock,
29
- {
30
- className: cn("w-full", cardClassName),
31
- type: "login",
32
- action,
33
- googleAction,
34
- error,
35
- showSocial,
36
- labels,
37
- forgotPasswordHref,
38
- signUpHref
39
- }
40
- ) }) });
41
- }
42
-
43
- export { LoginPageKit };
14
+ import '../../chunk-QYZT24TS.js';