@pablo2410/shared-ui 0.19.0 → 0.20.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.
- package/dist/{chunk-5RY3AJKI.js → chunk-57T6QK3M.js} +40 -4
- package/dist/chunk-57T6QK3M.js.map +1 -0
- package/dist/{chunk-NLQ45OYS.js → chunk-LR5TUYFD.js} +73 -11
- package/dist/{chunk-NLQ45OYS.js.map → chunk-LR5TUYFD.js.map} +1 -1
- package/dist/layout/index.js +1 -1
- package/dist/services/index.d.ts +25 -1
- package/dist/services/index.js +4 -2
- package/dist/shell/index.js +2 -2
- package/dist/shell/oplytics-shell.css +1 -1
- package/dist/tour/index.d.ts +102 -0
- package/dist/tour/index.js +282 -0
- package/dist/tour/index.js.map +1 -0
- package/package.json +5 -1
- package/dist/chunk-5RY3AJKI.js.map +0 -1
|
@@ -17,7 +17,17 @@ var SERVICE_CATALOG = [
|
|
|
17
17
|
accentColor: "#F59E0B",
|
|
18
18
|
status: "live",
|
|
19
19
|
category: "core",
|
|
20
|
-
subdomainLabel: "policy"
|
|
20
|
+
subdomainLabel: "policy",
|
|
21
|
+
onboarding: {
|
|
22
|
+
hook: "This is where your strategy becomes a plan everyone can see. Long-term goals break into this year's objectives, objectives break into projects, and projects carry the metrics that prove it's working.",
|
|
23
|
+
highlights: [
|
|
24
|
+
"X-Matrix \u2014 the rollup view: goals, objectives, and projects, with dots showing which project moves which goal.",
|
|
25
|
+
"Catchball \u2014 where the plan actually gets built: negotiate objectives and projects up and down the org, add a metric to a project.",
|
|
26
|
+
"Actions \u2014 every task that comes out of the plan, tracked to closure."
|
|
27
|
+
],
|
|
28
|
+
firstAction: { label: "Open X-Matrix", path: "/xmatrix" },
|
|
29
|
+
emptyStateHint: `No plan yet for this enterprise \u2014 say so plainly and point at Catchball's "Create your first plan" instead of X-Matrix's empty state.`
|
|
30
|
+
}
|
|
21
31
|
},
|
|
22
32
|
{
|
|
23
33
|
slug: "sqdcp",
|
|
@@ -28,7 +38,18 @@ var SERVICE_CATALOG = [
|
|
|
28
38
|
accentColor: "#1DB8CE",
|
|
29
39
|
status: "live",
|
|
30
40
|
category: "core",
|
|
31
|
-
subdomainLabel: "sqdcp"
|
|
41
|
+
subdomainLabel: "sqdcp",
|
|
42
|
+
onboarding: {
|
|
43
|
+
hook: "This is your daily board \u2014 Safety, Quality, Delivery, Cost, People, live. Every team has a room; the huddle happens here, and the numbers you log in Data Entry are what turn the board green or red.",
|
|
44
|
+
highlights: [
|
|
45
|
+
"Rooms \u2014 one per team, tiered (Team Huddle \u2192 Area/Plant Review \u2192 Monthly Review), each feeding the one above.",
|
|
46
|
+
"Data Entry \u2014 where actuals get logged against each pillar's metrics.",
|
|
47
|
+
"Safety Manager / Quality Manager tabs \u2014 the deeper pillar-specific views inside SQDCP.",
|
|
48
|
+
"If AI Facilitator is on, Opi runs the huddle itself \u2014 drafts the line for each red pillar, opens the action review by name."
|
|
49
|
+
],
|
|
50
|
+
firstAction: { label: "Open Rooms", path: "/" },
|
|
51
|
+
emptyStateHint: "No rooms configured yet \u2014 this needs an admin to set up rooms first; point at Admin rather than Rooms."
|
|
52
|
+
}
|
|
32
53
|
},
|
|
33
54
|
{
|
|
34
55
|
slug: "oee-manager",
|
|
@@ -40,6 +61,7 @@ var SERVICE_CATALOG = [
|
|
|
40
61
|
status: "live",
|
|
41
62
|
category: "core",
|
|
42
63
|
subdomainLabel: "oeemanager"
|
|
64
|
+
// No `onboarding` block yet — held back for a later cohort (2026-09-11 decision).
|
|
43
65
|
},
|
|
44
66
|
{
|
|
45
67
|
slug: "action-manager",
|
|
@@ -50,7 +72,17 @@ var SERVICE_CATALOG = [
|
|
|
50
72
|
accentColor: "#22C55E",
|
|
51
73
|
status: "live",
|
|
52
74
|
category: "core",
|
|
53
|
-
subdomainLabel: "actionmanager"
|
|
75
|
+
subdomainLabel: "actionmanager",
|
|
76
|
+
onboarding: {
|
|
77
|
+
hook: "Every action from every service lands here \u2014 SQDCP huddles, Policy Deployment projects, safety reports, all in one place, tracked until someone closes it out.",
|
|
78
|
+
highlights: [
|
|
79
|
+
"Board \u2014 kanban view, the default way most people work actions day to day.",
|
|
80
|
+
"List and Calendar \u2014 the same actions, sorted or scheduled instead.",
|
|
81
|
+
"Improvement (A3) \u2014 structured 7-box root-cause work for the actions that need more than a quick fix."
|
|
82
|
+
],
|
|
83
|
+
firstAction: { label: "Open Board", path: "/board" },
|
|
84
|
+
emptyStateHint: "Zero actions yet \u2014 say this is normal on day one, actions will start showing up as SQDCP and Policy Deployment generate them, rather than describing an empty board as broken."
|
|
85
|
+
}
|
|
54
86
|
},
|
|
55
87
|
{
|
|
56
88
|
slug: "connect",
|
|
@@ -107,6 +139,9 @@ var inDevServices = SERVICE_CATALOG.filter(
|
|
|
107
139
|
var comingSoonServices = SERVICE_CATALOG.filter(
|
|
108
140
|
(s) => s.status === "coming-soon"
|
|
109
141
|
);
|
|
142
|
+
var onboardingTourServices = SERVICE_CATALOG.filter(
|
|
143
|
+
(s) => s.onboarding !== void 0
|
|
144
|
+
);
|
|
110
145
|
function getServiceBySlug(slug) {
|
|
111
146
|
return SERVICE_CATALOG.find((s) => s.slug === slug);
|
|
112
147
|
}
|
|
@@ -151,6 +186,7 @@ export {
|
|
|
151
186
|
liveServices,
|
|
152
187
|
inDevServices,
|
|
153
188
|
comingSoonServices,
|
|
189
|
+
onboardingTourServices,
|
|
154
190
|
getServiceBySlug,
|
|
155
191
|
getServiceUrl,
|
|
156
192
|
ADMIN_SEE_ALL_ROLES,
|
|
@@ -158,4 +194,4 @@ export {
|
|
|
158
194
|
normalizeServiceSlug,
|
|
159
195
|
buildCrossServiceLinks
|
|
160
196
|
};
|
|
161
|
-
//# sourceMappingURL=chunk-
|
|
197
|
+
//# sourceMappingURL=chunk-57T6QK3M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/catalog.ts","../src/services/crossNav.ts"],"sourcesContent":["/**\n * Shared Service Catalog — Single source of truth for all Oplytics.digital services.\n *\n * Consumed by:\n * - oplytics-subdomains (ServiceHub.tsx) — service cards, access gating\n * - oplytics-marketing-site (services.ts) — marketing pages, hero sections\n *\n * Each consumer extends with context-specific fields locally:\n * - Platform adds: route, external URL, React icon component\n * - Marketing adds: heroImage, demoImage, problem, howItWorks, results, aiFeatures\n */\n\nimport { platformUrl } from \"./platformDomain\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ServiceStatus = \"live\" | \"in-development\" | \"coming-soon\";\nexport type ServiceCategory = \"core\" | \"hub\";\n\nexport interface ServiceDefinition {\n /** Unique identifier used for DB lookups, URL slugs, and cross-referencing */\n slug: string;\n /** Display name shown in cards, headers, and navigation */\n name: string;\n /** Short one-line value proposition */\n tagline: string;\n /** Longer description (1-2 sentences) for cards and summaries */\n description: string;\n /** Lucide icon name (string) — consumers resolve to component locally */\n icon: string;\n /** Hex accent color for cards, badges, and theming */\n accentColor: string;\n /** Current availability status */\n status: ServiceStatus;\n /** Core = standalone product, Hub = extension/add-on module */\n category: ServiceCategory;\n /**\n * Subdomain label on the platform domain (e.g. \"sqdcp\") — null if hosted\n * on portal. Full URLs are built via getServiceUrl(), which resolves the\n * platform domain at runtime (see ./platformDomain).\n */\n subdomainLabel: string | null;\n /**\n * Scripted content for the Opi onboarding tour (see @pablo2410/shared-ui/tour).\n * Optional and deliberately sparse — only services with a real, verified\n * first-run path should have this filled in. A service with no `onboarding`\n * block is skipped by the tour entirely rather than shown with placeholder\n * copy. Marketing/other consumers ignore this field.\n */\n onboarding?: ServiceOnboardingContent;\n}\n\nexport interface ServiceOnboardingContent {\n /** Opi's scripted opening line for this step — the always-available fallback if the live LLM narration call fails or AI is gated off. */\n hook: string;\n /** 2-4 short bullets: what's actually here, in plain language. */\n highlights: string[];\n /** The one thing the step ends on. */\n firstAction: {\n label: string;\n /** Path relative to the service's own root (e.g. \"/xmatrix\"). */\n path: string;\n };\n /** What Opi should say instead when the service has no data yet for this enterprise (empty-state framing), rather than pointing at the normal firstAction. */\n emptyStateHint?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Catalog\n// ---------------------------------------------------------------------------\n\nexport const SERVICE_CATALOG: ServiceDefinition[] = [\n // ─── CORE SERVICES ───\n {\n slug: \"policy-deployment\",\n name: \"Policy Deployment\",\n tagline: \"Align strategy to execution\",\n description:\n \"Hoshin Kanri and X-matrix planning. Cascade strategic objectives through every level of your organisation with live tracking and bowling charts.\",\n icon: \"Target\",\n accentColor: \"#F59E0B\",\n status: \"live\",\n category: \"core\",\n subdomainLabel: \"policy\",\n onboarding: {\n hook: \"This is where your strategy becomes a plan everyone can see. Long-term goals break into this year's objectives, objectives break into projects, and projects carry the metrics that prove it's working.\",\n highlights: [\n \"X-Matrix — the rollup view: goals, objectives, and projects, with dots showing which project moves which goal.\",\n \"Catchball — where the plan actually gets built: negotiate objectives and projects up and down the org, add a metric to a project.\",\n \"Actions — every task that comes out of the plan, tracked to closure.\",\n ],\n firstAction: { label: \"Open X-Matrix\", path: \"/xmatrix\" },\n emptyStateHint:\n \"No plan yet for this enterprise — say so plainly and point at Catchball's \\\"Create your first plan\\\" instead of X-Matrix's empty state.\",\n },\n },\n {\n slug: \"sqdcp\",\n name: \"SQDCP Dashboard\",\n tagline: \"Daily management boards, digitised\",\n description:\n \"Digital SQDCP boards that drive daily accountability. Safety, Quality, Delivery, Cost, and People metrics at a glance for every team.\",\n icon: \"LayoutGrid\",\n accentColor: \"#1DB8CE\",\n status: \"live\",\n category: \"core\",\n subdomainLabel: \"sqdcp\",\n onboarding: {\n hook: \"This is your daily board — Safety, Quality, Delivery, Cost, People, live. Every team has a room; the huddle happens here, and the numbers you log in Data Entry are what turn the board green or red.\",\n highlights: [\n \"Rooms — one per team, tiered (Team Huddle → Area/Plant Review → Monthly Review), each feeding the one above.\",\n \"Data Entry — where actuals get logged against each pillar's metrics.\",\n \"Safety Manager / Quality Manager tabs — the deeper pillar-specific views inside SQDCP.\",\n \"If AI Facilitator is on, Opi runs the huddle itself — drafts the line for each red pillar, opens the action review by name.\",\n ],\n firstAction: { label: \"Open Rooms\", path: \"/\" },\n emptyStateHint:\n \"No rooms configured yet — this needs an admin to set up rooms first; point at Admin rather than Rooms.\",\n },\n },\n {\n slug: \"oee-manager\",\n name: \"OEE Manager\",\n tagline: \"Real-time equipment effectiveness tracking\",\n description:\n \"Monitor Overall Equipment Effectiveness in real-time. Track availability, performance, and quality metrics across your entire production line.\",\n icon: \"Gauge\",\n accentColor: \"#8C34E9\",\n status: \"live\",\n category: \"core\",\n subdomainLabel: \"oeemanager\",\n // No `onboarding` block yet — held back for a later cohort (2026-09-11 decision).\n },\n {\n slug: \"action-manager\",\n name: \"Action Manager\",\n tagline: \"Track every action to closure\",\n description:\n \"Capture, assign, and track corrective and preventive actions from any source. Ensure nothing falls through the cracks.\",\n icon: \"ClipboardCheck\",\n accentColor: \"#22C55E\",\n status: \"live\",\n category: \"core\",\n subdomainLabel: \"actionmanager\",\n onboarding: {\n hook: \"Every action from every service lands here — SQDCP huddles, Policy Deployment projects, safety reports, all in one place, tracked until someone closes it out.\",\n highlights: [\n \"Board — kanban view, the default way most people work actions day to day.\",\n \"List and Calendar — the same actions, sorted or scheduled instead.\",\n \"Improvement (A3) — structured 7-box root-cause work for the actions that need more than a quick fix.\",\n ],\n firstAction: { label: \"Open Board\", path: \"/board\" },\n emptyStateHint:\n \"Zero actions yet — say this is normal on day one, actions will start showing up as SQDCP and Policy Deployment generate them, rather than describing an empty board as broken.\",\n },\n },\n {\n slug: \"connect\",\n name: \"OplyticsConnect\",\n tagline: \"Integrate machines, sensors, and systems\",\n description:\n \"Industrial IoT connectivity layer. Connect PLCs, sensors, and legacy systems to the Oplytics platform with zero-code configuration.\",\n icon: \"Plug\",\n accentColor: \"#1DB8CE\",\n status: \"in-development\",\n category: \"core\",\n subdomainLabel: \"connect\",\n },\n\n // ─── HUB SERVICES ───\n {\n slug: \"safety-manager\",\n name: \"Safety Manager\",\n tagline: \"Proactive safety culture, powered by data\",\n description:\n \"Incident reporting, hazard tracking, safety observations, and compliance management in one unified platform.\",\n icon: \"Shield\",\n accentColor: \"#EF4444\",\n status: \"coming-soon\",\n category: \"hub\",\n subdomainLabel: \"safetymanager\",\n },\n {\n slug: \"quality-manager\",\n name: \"Quality Manager\",\n tagline: \"End-to-end quality assurance\",\n description:\n \"Non-conformance tracking, CAPA management, audit scheduling, and quality metrics dashboards.\",\n icon: \"CheckCircle\",\n accentColor: \"#22C55E\",\n status: \"coming-soon\",\n category: \"hub\",\n subdomainLabel: null,\n },\n {\n slug: \"certification-manager\",\n name: \"Certification Manager\",\n tagline: \"Stay audit-ready, always\",\n description:\n \"Manage ISO, IATF, and other certification requirements. Document control, audit trails, and compliance tracking.\",\n icon: \"Award\",\n accentColor: \"#F97316\",\n status: \"coming-soon\",\n category: \"hub\",\n subdomainLabel: null,\n },\n];\n\n// ---------------------------------------------------------------------------\n// Derived helpers\n// ---------------------------------------------------------------------------\n\nexport const coreServices = SERVICE_CATALOG.filter(s => s.category === \"core\");\nexport const hubServices = SERVICE_CATALOG.filter(s => s.category === \"hub\");\nexport const liveServices = SERVICE_CATALOG.filter(s => s.status === \"live\");\nexport const inDevServices = SERVICE_CATALOG.filter(\n s => s.status === \"in-development\"\n);\nexport const comingSoonServices = SERVICE_CATALOG.filter(\n s => s.status === \"coming-soon\"\n);\n/** Services with a scripted onboarding tour step, in catalog order. */\nexport const onboardingTourServices = SERVICE_CATALOG.filter(\n s => s.onboarding !== undefined\n);\n\nexport function getServiceBySlug(slug: string): ServiceDefinition | undefined {\n return SERVICE_CATALOG.find(s => s.slug === slug);\n}\n\nexport function getServiceUrl(service: ServiceDefinition): string | null {\n if (service.subdomainLabel) {\n return platformUrl(service.subdomainLabel);\n }\n return null;\n}\n","/**\n * crossNav — build the sidebar cross-service links (service → service jump\n * without going through the Portal Service Hub).\n *\n * Visibility mirrors the Portal ServiceHub rule: platform_admin and\n * enterprise_admin see every live service; everyone else only sees the\n * services granted in the portal `user_services` table. The current service\n * never links to itself. Each link URL carries the caller's current\n * org-hierarchy selection (?oh=…) so the breadcrumb arrives pre-aligned.\n */\nimport type { OrgHierarchySelection } from \"../hierarchy/orgHierarchy\";\nimport { appendSelectionParam } from \"../hierarchy/selectionParams\";\nimport { SERVICE_CATALOG, getServiceUrl } from \"./catalog\";\n\n/** Roles that see every live service regardless of individual grants. */\nexport const ADMIN_SEE_ALL_ROLES = [\n \"platform_admin\",\n \"enterprise_admin\",\n] as const;\n\n/**\n * Legacy grant slugs → canonical catalog slugs. Auto-provisioned accounts\n * were granted \"sqdcp-logic\" while the catalog slug is \"sqdcp\".\n */\nexport const SLUG_ALIASES: Record<string, string> = {\n \"sqdcp-logic\": \"sqdcp\",\n};\n\nexport function normalizeServiceSlug(slug: string): string {\n return SLUG_ALIASES[slug] ?? slug;\n}\n\n/** Display-ready cross-service link entry. */\nexport interface CrossServiceLink {\n slug: string;\n name: string;\n /** Lucide icon name from the service catalog (consumers resolve locally). */\n icon: string;\n accentColor: string;\n /** Absolute URL including the ?oh= hierarchy selection param. */\n url: string;\n}\n\nexport interface BuildCrossServiceLinksOptions {\n /** Catalog slug of the service doing the rendering (excluded from links). */\n currentSlug: string;\n /** Grant slugs from the portal (raw — aliases are normalized here). */\n grantedSlugs: string[];\n /** Portal role of the current user (drives the admin see-all rule). */\n role?: string | null;\n /** Current org-hierarchy selection to carry across (may be empty/null). */\n selection?: OrgHierarchySelection | null;\n}\n\nexport function buildCrossServiceLinks(\n options: BuildCrossServiceLinksOptions\n): CrossServiceLink[] {\n const { currentSlug, grantedSlugs, role, selection } = options;\n\n const isAdmin =\n !!role && (ADMIN_SEE_ALL_ROLES as readonly string[]).includes(role);\n const granted = new Set(grantedSlugs.map(normalizeServiceSlug));\n const current = normalizeServiceSlug(currentSlug);\n\n return SERVICE_CATALOG.filter(\n svc =>\n svc.status === \"live\" &&\n svc.subdomainLabel !== null &&\n svc.slug !== current &&\n (isAdmin || granted.has(svc.slug))\n ).map(svc => ({\n slug: svc.slug,\n name: svc.name,\n icon: svc.icon,\n accentColor: svc.accentColor,\n url: appendSelectionParam(getServiceUrl(svc)!, selection),\n }));\n}\n"],"mappings":"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","names":[]}
|
|
@@ -754,12 +754,43 @@ function SharedFooter({
|
|
|
754
754
|
/* @__PURE__ */ jsxs7("div", { className: "grid grid-cols-1 md:grid-cols-4 gap-8 mb-8", children: [
|
|
755
755
|
/* @__PURE__ */ jsxs7("div", { className: "md:col-span-1", children: [
|
|
756
756
|
/* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
757
|
-
/* @__PURE__ */
|
|
758
|
-
"
|
|
757
|
+
/* @__PURE__ */ jsxs7(
|
|
758
|
+
"svg",
|
|
759
759
|
{
|
|
760
|
-
className: "w-7 h-7
|
|
761
|
-
|
|
762
|
-
|
|
760
|
+
className: "w-7 h-7 shrink-0",
|
|
761
|
+
viewBox: "0 0 120 120",
|
|
762
|
+
role: "img",
|
|
763
|
+
"aria-label": "Oplytics",
|
|
764
|
+
children: [
|
|
765
|
+
/* @__PURE__ */ jsx7("defs", { children: /* @__PURE__ */ jsxs7(
|
|
766
|
+
"linearGradient",
|
|
767
|
+
{
|
|
768
|
+
id: "oplytics-footer-mark",
|
|
769
|
+
x1: "0",
|
|
770
|
+
y1: "0",
|
|
771
|
+
x2: "1",
|
|
772
|
+
y2: "1",
|
|
773
|
+
children: [
|
|
774
|
+
/* @__PURE__ */ jsx7("stop", { offset: "0", stopColor: "#8C34E9" }),
|
|
775
|
+
/* @__PURE__ */ jsx7("stop", { offset: "1", stopColor: "#5B1FA6" })
|
|
776
|
+
]
|
|
777
|
+
}
|
|
778
|
+
) }),
|
|
779
|
+
/* @__PURE__ */ jsx7(
|
|
780
|
+
"circle",
|
|
781
|
+
{
|
|
782
|
+
cx: "60",
|
|
783
|
+
cy: "60",
|
|
784
|
+
r: "58",
|
|
785
|
+
fill: "url(#oplytics-footer-mark)"
|
|
786
|
+
}
|
|
787
|
+
),
|
|
788
|
+
/* @__PURE__ */ jsxs7("g", { fill: "none", stroke: "#0A0E1A", strokeWidth: "8", children: [
|
|
789
|
+
/* @__PURE__ */ jsx7("circle", { cx: "60", cy: "60", r: "34" }),
|
|
790
|
+
/* @__PURE__ */ jsx7("circle", { cx: "60", cy: "60", r: "17" })
|
|
791
|
+
] }),
|
|
792
|
+
/* @__PURE__ */ jsx7("circle", { cx: "77", cy: "43", r: "9", fill: "#1DB8CE" })
|
|
793
|
+
]
|
|
763
794
|
}
|
|
764
795
|
),
|
|
765
796
|
/* @__PURE__ */ jsx7("span", { className: "text-[#E2E8F0] font-semibold text-sm font-[Montserrat,sans-serif]", children: "Oplytics.digital" })
|
|
@@ -906,12 +937,43 @@ function ServiceFooter({
|
|
|
906
937
|
),
|
|
907
938
|
children: [
|
|
908
939
|
/* @__PURE__ */ jsxs8("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
909
|
-
/* @__PURE__ */
|
|
910
|
-
"
|
|
940
|
+
/* @__PURE__ */ jsxs8(
|
|
941
|
+
"svg",
|
|
911
942
|
{
|
|
912
|
-
className: "w-5 h-5
|
|
913
|
-
|
|
914
|
-
|
|
943
|
+
className: "w-5 h-5 shrink-0",
|
|
944
|
+
viewBox: "0 0 120 120",
|
|
945
|
+
role: "img",
|
|
946
|
+
"aria-label": "Oplytics",
|
|
947
|
+
children: [
|
|
948
|
+
/* @__PURE__ */ jsx8("defs", { children: /* @__PURE__ */ jsxs8(
|
|
949
|
+
"linearGradient",
|
|
950
|
+
{
|
|
951
|
+
id: "oplytics-service-footer-mark",
|
|
952
|
+
x1: "0",
|
|
953
|
+
y1: "0",
|
|
954
|
+
x2: "1",
|
|
955
|
+
y2: "1",
|
|
956
|
+
children: [
|
|
957
|
+
/* @__PURE__ */ jsx8("stop", { offset: "0", stopColor: "#8C34E9" }),
|
|
958
|
+
/* @__PURE__ */ jsx8("stop", { offset: "1", stopColor: "#5B1FA6" })
|
|
959
|
+
]
|
|
960
|
+
}
|
|
961
|
+
) }),
|
|
962
|
+
/* @__PURE__ */ jsx8(
|
|
963
|
+
"circle",
|
|
964
|
+
{
|
|
965
|
+
cx: "60",
|
|
966
|
+
cy: "60",
|
|
967
|
+
r: "58",
|
|
968
|
+
fill: "url(#oplytics-service-footer-mark)"
|
|
969
|
+
}
|
|
970
|
+
),
|
|
971
|
+
/* @__PURE__ */ jsxs8("g", { fill: "none", stroke: "#0A0E1A", strokeWidth: "9", children: [
|
|
972
|
+
/* @__PURE__ */ jsx8("circle", { cx: "60", cy: "60", r: "33" }),
|
|
973
|
+
/* @__PURE__ */ jsx8("circle", { cx: "60", cy: "60", r: "14" })
|
|
974
|
+
] }),
|
|
975
|
+
/* @__PURE__ */ jsx8("circle", { cx: "79", cy: "41", r: "11", fill: "#1DB8CE" })
|
|
976
|
+
]
|
|
915
977
|
}
|
|
916
978
|
),
|
|
917
979
|
/* @__PURE__ */ jsx8("span", { className: "text-[10px] text-[#596475] whitespace-nowrap shell-hidden shell-sm:inline", children: "Operational Excellence. One Digital Platform." })
|
|
@@ -1191,4 +1253,4 @@ export {
|
|
|
1191
1253
|
policyDeploymentConfig,
|
|
1192
1254
|
SERVICE_CONFIGS
|
|
1193
1255
|
};
|
|
1194
|
-
//# sourceMappingURL=chunk-
|
|
1256
|
+
//# sourceMappingURL=chunk-LR5TUYFD.js.map
|