@datatechsolutions/ui 2.11.93 → 3.2.0

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 (138) hide show
  1. package/dist/astrlabe/contracts.d.mts +3 -3
  2. package/dist/astrlabe/contracts.d.ts +3 -3
  3. package/dist/astrlabe/index.js +108 -108
  4. package/dist/astrlabe/index.mjs +4 -4
  5. package/dist/astrlabe/workflow-canvas.js +4 -4
  6. package/dist/astrlabe/workflow-canvas.mjs +3 -3
  7. package/dist/brand/index.d.mts +1 -15
  8. package/dist/brand/index.d.ts +1 -15
  9. package/dist/brand/index.js +0 -14
  10. package/dist/brand/index.js.map +1 -1
  11. package/dist/brand/index.mjs +0 -14
  12. package/dist/brand/index.mjs.map +1 -1
  13. package/dist/{chunk-24QKSC74.js → chunk-3JJWPOK6.js} +6 -6
  14. package/dist/{chunk-24QKSC74.js.map → chunk-3JJWPOK6.js.map} +1 -1
  15. package/dist/{chunk-HGN5W56D.mjs → chunk-3ZUMJTDT.mjs} +3 -3
  16. package/dist/{chunk-HGN5W56D.mjs.map → chunk-3ZUMJTDT.mjs.map} +1 -1
  17. package/dist/{chunk-LKJZGFM4.mjs → chunk-5GDKCFM5.mjs} +3 -3
  18. package/dist/{chunk-LKJZGFM4.mjs.map → chunk-5GDKCFM5.mjs.map} +1 -1
  19. package/dist/{chunk-ZHUPYX4Q.mjs → chunk-5RM6NGZ6.mjs} +3 -3
  20. package/dist/{chunk-ZHUPYX4Q.mjs.map → chunk-5RM6NGZ6.mjs.map} +1 -1
  21. package/dist/{chunk-DB64YDV2.js → chunk-AOUUZ52N.js} +55 -55
  22. package/dist/{chunk-DB64YDV2.js.map → chunk-AOUUZ52N.js.map} +1 -1
  23. package/dist/{chunk-VGSWSQQU.mjs → chunk-B67DP7MI.mjs} +4 -4
  24. package/dist/{chunk-VGSWSQQU.mjs.map → chunk-B67DP7MI.mjs.map} +1 -1
  25. package/dist/{chunk-NYQAEPC7.js → chunk-EFOXN3LC.js} +159 -168
  26. package/dist/chunk-EFOXN3LC.js.map +1 -0
  27. package/dist/{chunk-ARVLVWUC.js → chunk-F54Q2YJY.js} +97 -15
  28. package/dist/chunk-F54Q2YJY.js.map +1 -0
  29. package/dist/{chunk-GMZ3PTNK.mjs → chunk-H2D2CRTD.mjs} +7 -7
  30. package/dist/{chunk-GMZ3PTNK.mjs.map → chunk-H2D2CRTD.mjs.map} +1 -1
  31. package/dist/{chunk-PTGPQJZJ.js → chunk-HDCUWUNH.js} +15 -15
  32. package/dist/{chunk-PTGPQJZJ.js.map → chunk-HDCUWUNH.js.map} +1 -1
  33. package/dist/{chunk-ZKUYNCAG.js → chunk-I2NZGVBG.js} +1595 -2140
  34. package/dist/chunk-I2NZGVBG.js.map +1 -0
  35. package/dist/{chunk-MLAXYDEU.mjs → chunk-IRPS5UCS.mjs} +3 -3
  36. package/dist/{chunk-MLAXYDEU.mjs.map → chunk-IRPS5UCS.mjs.map} +1 -1
  37. package/dist/{chunk-TEQYIK2B.mjs → chunk-IRT4T3CU.mjs} +92 -101
  38. package/dist/chunk-IRT4T3CU.mjs.map +1 -0
  39. package/dist/{chunk-A3BFURJB.mjs → chunk-JN6IL6OH.mjs} +1595 -2138
  40. package/dist/chunk-JN6IL6OH.mjs.map +1 -0
  41. package/dist/{chunk-NA57KK4O.js → chunk-JSNRCYSO.js} +4 -4
  42. package/dist/{chunk-NA57KK4O.js.map → chunk-JSNRCYSO.js.map} +1 -1
  43. package/dist/{chunk-XSBZNPUO.js → chunk-KR2X2WHJ.js} +53 -53
  44. package/dist/{chunk-XSBZNPUO.js.map → chunk-KR2X2WHJ.js.map} +1 -1
  45. package/dist/{chunk-YEWXDCCI.mjs → chunk-LEKZUS6N.mjs} +4 -4
  46. package/dist/{chunk-YEWXDCCI.mjs.map → chunk-LEKZUS6N.mjs.map} +1 -1
  47. package/dist/{chunk-6NAZVG2O.mjs → chunk-MVBIAXVN.mjs} +4 -4
  48. package/dist/{chunk-6NAZVG2O.mjs.map → chunk-MVBIAXVN.mjs.map} +1 -1
  49. package/dist/{chunk-4TY55HGO.mjs → chunk-OL73LBX5.mjs} +3 -3
  50. package/dist/{chunk-4TY55HGO.mjs.map → chunk-OL73LBX5.mjs.map} +1 -1
  51. package/dist/{chunk-HUGHELRM.mjs → chunk-QYA53LUF.mjs} +6 -6
  52. package/dist/chunk-QYA53LUF.mjs.map +1 -0
  53. package/dist/{chunk-DWFLIXES.mjs → chunk-R4TQWXNG.mjs} +3 -3
  54. package/dist/{chunk-DWFLIXES.mjs.map → chunk-R4TQWXNG.mjs.map} +1 -1
  55. package/dist/{chunk-SMKN4ZVB.js → chunk-RGI74SQH.js} +4 -4
  56. package/dist/{chunk-SMKN4ZVB.js.map → chunk-RGI74SQH.js.map} +1 -1
  57. package/dist/{chunk-FZTOP6EE.js → chunk-RL35XATZ.js} +141 -141
  58. package/dist/chunk-RL35XATZ.js.map +1 -0
  59. package/dist/{chunk-BUI7BCUN.js → chunk-RXZNACMI.js} +33 -33
  60. package/dist/{chunk-BUI7BCUN.js.map → chunk-RXZNACMI.js.map} +1 -1
  61. package/dist/{chunk-ST3GH5OM.js → chunk-SU3YPWFW.js} +26 -26
  62. package/dist/{chunk-ST3GH5OM.js.map → chunk-SU3YPWFW.js.map} +1 -1
  63. package/dist/{chunk-DIMLLLZR.js → chunk-TIJJHW2Z.js} +36 -36
  64. package/dist/{chunk-DIMLLLZR.js.map → chunk-TIJJHW2Z.js.map} +1 -1
  65. package/dist/{chunk-2RDGJXYZ.js → chunk-TVMLV675.js} +67 -67
  66. package/dist/{chunk-2RDGJXYZ.js.map → chunk-TVMLV675.js.map} +1 -1
  67. package/dist/{chunk-Y3WJAYOY.mjs → chunk-UDDZTTLO.mjs} +6 -6
  68. package/dist/chunk-UDDZTTLO.mjs.map +1 -0
  69. package/dist/{chunk-43GCSCQA.js → chunk-W5OEBO6E.js} +12 -12
  70. package/dist/chunk-W5OEBO6E.js.map +1 -0
  71. package/dist/{chunk-3Z366CVM.js → chunk-Y6AEE56Q.js} +67 -67
  72. package/dist/{chunk-3Z366CVM.js.map → chunk-Y6AEE56Q.js.map} +1 -1
  73. package/dist/{chunk-RXFAQFE7.mjs → chunk-YIB2YAM5.mjs} +3 -3
  74. package/dist/{chunk-RXFAQFE7.mjs.map → chunk-YIB2YAM5.mjs.map} +1 -1
  75. package/dist/{chunk-OLXOBT42.mjs → chunk-YV72JM4B.mjs} +4 -4
  76. package/dist/{chunk-OLXOBT42.mjs.map → chunk-YV72JM4B.mjs.map} +1 -1
  77. package/dist/{chunk-MEEFOZC4.js → chunk-ZM5MVWIT.js} +4 -4
  78. package/dist/{chunk-MEEFOZC4.js.map → chunk-ZM5MVWIT.js.map} +1 -1
  79. package/dist/{chunk-PU2KTO4O.mjs → chunk-ZV5EZXXO.mjs} +97 -15
  80. package/dist/chunk-ZV5EZXXO.mjs.map +1 -0
  81. package/dist/index.d.mts +8 -41
  82. package/dist/index.d.ts +8 -41
  83. package/dist/index.js +745 -753
  84. package/dist/index.mjs +2 -2
  85. package/dist/platform/admin/index.js +11 -11
  86. package/dist/platform/admin/index.mjs +5 -5
  87. package/dist/platform/agents-workspace.js +7 -7
  88. package/dist/platform/agents-workspace.mjs +6 -6
  89. package/dist/platform/app-shell.js +4 -4
  90. package/dist/platform/app-shell.mjs +3 -3
  91. package/dist/platform/auth/index.js +28 -28
  92. package/dist/platform/auth/index.mjs +5 -5
  93. package/dist/platform/billing/index.js +4 -4
  94. package/dist/platform/billing/index.mjs +3 -3
  95. package/dist/platform/impersonation/index.js +4 -4
  96. package/dist/platform/impersonation/index.mjs +3 -3
  97. package/dist/platform/index.d.mts +1 -1
  98. package/dist/platform/index.d.ts +1 -1
  99. package/dist/platform/index.js +99 -99
  100. package/dist/platform/index.js.map +1 -1
  101. package/dist/platform/index.mjs +19 -19
  102. package/dist/platform/index.mjs.map +1 -1
  103. package/dist/platform/pages/index.d.mts +4 -5
  104. package/dist/platform/pages/index.d.ts +4 -5
  105. package/dist/platform/pages/index.js +197 -197
  106. package/dist/platform/pages/index.js.map +1 -1
  107. package/dist/platform/pages/index.mjs +9 -9
  108. package/dist/platform/pages/index.mjs.map +1 -1
  109. package/dist/platform/settings/index.js +8 -8
  110. package/dist/platform/settings/index.mjs +7 -7
  111. package/dist/platform/telemetry/index.d.mts +51 -0
  112. package/dist/platform/telemetry/index.d.ts +51 -0
  113. package/dist/platform/telemetry/index.js +96 -0
  114. package/dist/platform/telemetry/index.js.map +1 -0
  115. package/dist/platform/telemetry/index.mjs +89 -0
  116. package/dist/platform/telemetry/index.mjs.map +1 -0
  117. package/dist/platform/workflow-api-client.d.mts +1 -1
  118. package/dist/platform/workflow-api-client.d.ts +1 -1
  119. package/dist/platform/workflow-api-client.js +61 -61
  120. package/dist/platform/workflow-api-client.mjs +1 -1
  121. package/dist/platform/workflow-canvas-shell.js +5 -5
  122. package/dist/platform/workflow-canvas-shell.mjs +4 -4
  123. package/dist/{workflow-api-client-DVLhcpUj.d.ts → workflow-api-client-BKD8OfP_.d.ts} +61 -30
  124. package/dist/{workflow-api-client-DpBxHTHr.d.mts → workflow-api-client-DoYj7nHz.d.mts} +61 -30
  125. package/package.json +7 -1
  126. package/dist/chunk-43GCSCQA.js.map +0 -1
  127. package/dist/chunk-A3BFURJB.mjs.map +0 -1
  128. package/dist/chunk-ARVLVWUC.js.map +0 -1
  129. package/dist/chunk-FZTOP6EE.js.map +0 -1
  130. package/dist/chunk-HUGHELRM.mjs.map +0 -1
  131. package/dist/chunk-NYQAEPC7.js.map +0 -1
  132. package/dist/chunk-PU2KTO4O.mjs.map +0 -1
  133. package/dist/chunk-TEQYIK2B.mjs.map +0 -1
  134. package/dist/chunk-Y3WJAYOY.mjs.map +0 -1
  135. package/dist/chunk-ZKUYNCAG.js.map +0 -1
  136. package/src/brand/logos/fuel-icon.svg +0 -32
  137. package/src/brand/logos/fuel-logo-dark.svg +0 -43
  138. package/src/brand/logos/fuel-logo.svg +0 -43
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datatechsolutions/ui",
3
- "version": "2.11.93",
3
+ "version": "3.2.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
@@ -125,6 +125,11 @@
125
125
  "import": "./dist/platform/settings/index.mjs",
126
126
  "require": "./dist/platform/settings/index.js"
127
127
  },
128
+ "./platform/telemetry": {
129
+ "types": "./dist/platform/telemetry/index.d.ts",
130
+ "import": "./dist/platform/telemetry/index.mjs",
131
+ "require": "./dist/platform/telemetry/index.js"
132
+ },
128
133
  "./styles": "./src/styles/liquid-glass.css",
129
134
  "./styles/*": "./src/styles/*"
130
135
  },
@@ -149,6 +154,7 @@
149
154
  "@radix-ui/react-progress": "^1.1.8",
150
155
  "@radix-ui/react-tabs": "^1.1.13",
151
156
  "next-intl": "4.8.3",
157
+ "posthog-js": "^1.207.0",
152
158
  "typescript": "^5.3.0"
153
159
  },
154
160
  "peerDependencies": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/platform/settings/platform-settings.tsx"],"names":["useTranslations","useAuth","useMemo","useState","useEffect","jsx","InlineSpinner","jsxs","SegmentedControl","UserProfile","AdminOrganizationDetail","BillingPanel"],"mappings":"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","file":"chunk-43GCSCQA.js","sourcesContent":["// =============================================================================\n// @datatechsolutions/windsock/ui — PlatformSettings\n// Unified settings shell consumed by every product (astrlabe, fuel, kori).\n// Composes existing building blocks:\n// - `<UserProfile>` — Profile / Security / Sessions / Linked accounts\n// - `<AdminOrganizationDetail>` — Members / Invitations / Domains\n// - `<BillingPanel>` — Current subscription + plan catalogue\n// Apps mount this at their `/settings` route; feature toggles hide sections\n// that a given user's role cannot access.\n// =============================================================================\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { SegmentedControl, InlineSpinner } from '@ui/index'\nimport type { AdminClient, AuthOrganization } from '@datatechsolutions/shared-domain'\n\nimport { useAuth } from '@datatechsolutions/windsock/client'\nimport { UserProfile } from '../auth/user-profile'\nimport { AdminOrganizationDetail } from '../admin/admin-organization-detail'\nimport { BillingPanel, type BillingPanelProps } from '../billing/billing-panel'\n\nexport type PlatformSettingsSection = 'account' | 'organization' | 'billing'\n\nexport interface PlatformSettingsProps {\n /**\n * Sections to surface to the current user. The host app is responsible for\n * picking the right set based on RBAC — e.g. hide `organization` for users\n * without `org:manage` and hide `billing` for users without `billing:read`.\n * Defaults to all three.\n */\n sections?: PlatformSettingsSection[]\n /** Starting section. Defaults to the first item in `sections`. */\n defaultSection?: PlatformSettingsSection\n /**\n * Windsock admin API client. Required when `organization` is in `sections`.\n * Create it once with `createAdminClient({ issuer, authClient })` and reuse.\n */\n adminClient?: AdminClient\n /**\n * Current organization id (usually `ctx.organizationId` from the JWT).\n * Required when `organization` is in `sections`.\n */\n organizationId?: string\n /** Forwarded to `<BillingPanel>` — e.g. redirect handler, billing interval. */\n billing?: BillingPanelProps\n}\n\nconst DEFAULT_SECTIONS: PlatformSettingsSection[] = ['account', 'organization', 'billing']\n\nexport function PlatformSettings({\n sections = DEFAULT_SECTIONS,\n defaultSection,\n adminClient,\n organizationId,\n billing,\n}: PlatformSettingsProps) {\n const t = useTranslations('windsock')\n const { status } = useAuth()\n\n const visibleSections = useMemo(() => {\n // Drop `organization` if the caller didn't pass an admin client + org id.\n return sections.filter((section) => {\n if (section === 'organization') {\n return Boolean(adminClient && organizationId)\n }\n return true\n })\n }, [sections, adminClient, organizationId])\n\n const initialSection: PlatformSettingsSection = (\n defaultSection && visibleSections.includes(defaultSection)\n ? defaultSection\n : visibleSections[0] ?? 'account'\n )\n\n const [activeSection, setActiveSection] = useState<PlatformSettingsSection>(initialSection)\n const [organization, setOrganization] = useState<AuthOrganization | null>(null)\n const [orgLoadError, setOrgLoadError] = useState<string | null>(null)\n\n // Resolve the org detail record (AdminOrganizationDetail needs the full\n // AuthOrganization, not just the id). Fires once the organization tab is\n // first selected so the listOrganizations round-trip is lazy.\n useEffect(() => {\n if (activeSection !== 'organization') return\n if (!adminClient || !organizationId) return\n if (organization?.id === organizationId) return\n\n let cancelled = false\n setOrgLoadError(null)\n void adminClient.listOrganizations()\n .then((orgs) => {\n if (cancelled) return\n const match = orgs.find((org) => org.id === organizationId)\n if (match) {\n setOrganization(match)\n } else {\n setOrgLoadError('Organization not found')\n }\n })\n .catch((loadError: unknown) => {\n if (cancelled) return\n setOrgLoadError(loadError instanceof Error ? loadError.message : String(loadError))\n })\n return () => {\n cancelled = true\n }\n }, [activeSection, adminClient, organizationId, organization?.id])\n\n if (status === 'loading') {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n if (status !== 'authenticated') {\n return null\n }\n\n if (visibleSections.length === 0) {\n return null\n }\n\n const segments = visibleSections.map((section) => ({\n value: section,\n label: t(`platformSettings.sections.${section}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {visibleSections.length > 1 && (\n <SegmentedControl\n segments={segments}\n value={activeSection}\n onChange={(value: string) => setActiveSection(value as PlatformSettingsSection)}\n fullWidth\n />\n )}\n\n {activeSection === 'account' && <UserProfile />}\n\n {activeSection === 'organization' && adminClient && organizationId && (\n organization ? (\n <AdminOrganizationDetail\n client={adminClient}\n organization={organization}\n />\n ) : orgLoadError ? (\n <div\n role=\"alert\"\n className=\"rounded-xl border border-red-300/40 bg-red-50/80 px-4 py-3 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300\"\n >\n {orgLoadError}\n </div>\n ) : (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n )}\n\n {activeSection === 'billing' && <BillingPanel {...billing} />}\n </div>\n )\n}\n"]}