@hotmeshio/long-tail 0.7.1 → 0.7.3
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/build/api/escalations/create.js +30 -9
- package/build/api/roles.d.ts +32 -0
- package/build/api/roles.js +73 -0
- package/build/bin/ltc.js +23 -0
- package/build/lib/cli/commands/roles.d.ts +17 -0
- package/build/lib/cli/commands/roles.js +102 -0
- package/build/lib/db/schemas/017_role_schema_versions.sql +40 -0
- package/build/lib/db/schemas/018_role_upstreams.sql +21 -0
- package/build/routes/roles.js +20 -0
- package/build/scripts/ortho-populate.d.ts +80 -8
- package/build/scripts/ortho-populate.js +204 -52
- package/build/sdk/index.d.ts +2 -0
- package/build/sdk/index.js +2 -0
- package/build/services/orchestrator/condition.d.ts +25 -1
- package/build/services/orchestrator/condition.js +29 -1
- package/build/services/role/index.d.ts +15 -1
- package/build/services/role/index.js +45 -1
- package/build/services/role/sql.d.ts +23 -2
- package/build/services/role/sql.js +93 -16
- package/build/services/role/types.d.ts +41 -0
- package/build/system/mcp-servers/admin/index.js +3 -3
- package/build/system/mcp-servers/admin/schemas.d.ts +25 -2
- package/build/system/mcp-servers/admin/schemas.js +11 -2
- package/build/system/mcp-servers/admin/users.js +42 -0
- package/build/system/mcp-servers/human-queue-schemas.d.ts +6 -0
- package/build/system/mcp-servers/human-queue-schemas.js +4 -0
- package/build/system/mcp-servers/human-queue.js +10 -2
- package/build/system/seed/tool-manifests-admin.d.ts +371 -0
- package/build/system/seed/tool-manifests-admin.js +3 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/escalation.d.ts +16 -0
- package/build/types/escalation.js +17 -0
- package/dashboard/dist/assets/{AdminDashboard-Bg1HgukI.js → AdminDashboard-C9eE1VEp.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Bg1HgukI.js.map → AdminDashboard-C9eE1VEp.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-HBe_YDU_.js → AgentConfigPage-Ba8QfXM2.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-HBe_YDU_.js.map → AgentConfigPage-Ba8QfXM2.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-BsaiYbwL.js → AgentDetailPage-DVmec0CP.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-BsaiYbwL.js.map → AgentDetailPage-DVmec0CP.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-DhN2lIBh.js → AgentsPage-DNiCYMh3.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-DhN2lIBh.js.map → AgentsPage-DNiCYMh3.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-_xcWvlIz.js → AvailableEscalationsPage-gDIF8ocC.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-_xcWvlIz.js.map → AvailableEscalationsPage-gDIF8ocC.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DY6iUVC9.js → BotPicker-3wBcBavT.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DY6iUVC9.js.map → BotPicker-3wBcBavT.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-w1owqsmN.js → CapabilitiesPage-WoPkND2y.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-w1owqsmN.js.map → CapabilitiesPage-WoPkND2y.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-DIMGjlJ-.js → CollapsibleSection-Cx99mqNN.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-DIMGjlJ-.js.map → CollapsibleSection-Cx99mqNN.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-D1OmMHux.js → CredentialsPage-DbNaoPbF.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-D1OmMHux.js.map → CredentialsPage-DbNaoPbF.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CQy3DrUQ.js → CronLabel-DLW4_Zg4.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CQy3DrUQ.js.map → CronLabel-DLW4_Zg4.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-BoBkl9tw.js → CustomDurationPicker-BRUFjkiu.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-BoBkl9tw.js.map → CustomDurationPicker-BRUFjkiu.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-QXbiuU0b.js → DropZone-DEX0BBqt.js} +2 -2
- package/dashboard/dist/assets/{DropZone-QXbiuU0b.js.map → DropZone-DEX0BBqt.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-Donjm9gT.js → ElapsedCell-BtmDQaym.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-Donjm9gT.js.map → ElapsedCell-BtmDQaym.js.map} +1 -1
- package/dashboard/dist/assets/EscalationSchemaPage-Bm4yBEGN.js +9 -0
- package/dashboard/dist/assets/EscalationSchemaPage-Bm4yBEGN.js.map +1 -0
- package/dashboard/dist/assets/{EscalationsOverview-CvHIJ_GG.js → EscalationsOverview-B3xZwTQA.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CvHIJ_GG.js.map → EscalationsOverview-B3xZwTQA.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-DpAXMmT3.js → EventTable-Bh9FKXLI.js} +2 -2
- package/dashboard/dist/assets/{EventTable-DpAXMmT3.js.map → EventTable-Bh9FKXLI.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-De1XVx5d.js → GraphInvokePage-ov_ANlaE.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-De1XVx5d.js.map → GraphInvokePage-ov_ANlaE.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-BYR5VXXw.js → HomePage-D0DV6izb.js} +2 -2
- package/dashboard/dist/assets/{HomePage-BYR5VXXw.js.map → HomePage-D0DV6izb.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Bx7jGzPA.js → ListToolbar-FpcvqNkN.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Bx7jGzPA.js.map → ListToolbar-FpcvqNkN.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-DXRKcJN0.js → McpOverview-DcuRiAff.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-DXRKcJN0.js.map → McpOverview-DcuRiAff.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CmW15w5e.js → McpQueryDetailPage-BcYl67KP.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CmW15w5e.js.map → McpQueryDetailPage-BcYl67KP.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-BE6I011z.js → McpQueryPage-C3GDzqZM.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-BE6I011z.js.map → McpQueryPage-C3GDzqZM.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-Dsa3G3XQ.js → McpRunDetailPage-SzOyhDBW.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-Dsa3G3XQ.js.map → McpRunDetailPage-SzOyhDBW.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-uTbym66Y.js → McpRunsPage-BwgB6mRV.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-uTbym66Y.js.map → McpRunsPage-BwgB6mRV.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-BGf0jHwE.js → NamespacePill-CwKdoyRM.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-BGf0jHwE.js.map → NamespacePill-CwKdoyRM.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-BCr21p8I.js +2 -0
- package/dashboard/dist/assets/OperationsPage-BCr21p8I.js.map +1 -0
- package/dashboard/dist/assets/{OperatorDashboard-i8cxaDlk.js → OperatorDashboard-DSXh-yYw.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-i8cxaDlk.js.map → OperatorDashboard-DSXh-yYw.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BZJsEVOC.js → PageHeader-BhaWTWcM.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BZJsEVOC.js.map → PageHeader-BhaWTWcM.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-BWuD7s9c.js → PageHeaderWithStats-yex5WmHB.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BWuD7s9c.js.map → PageHeaderWithStats-yex5WmHB.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-CP7GZhgs.js → ProcessDetailPage-iIB1rwEt.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-CP7GZhgs.js.map → ProcessDetailPage-iIB1rwEt.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-btsU6hBR.js → ProcessesListPage-BrqWR2zr.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-btsU6hBR.js.map → ProcessesListPage-BrqWR2zr.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-DS37tJhq.js +11 -0
- package/dashboard/dist/assets/RoleDetailPage-DS37tJhq.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-Pb9TKSQN.js → RolePill-Cl71eDUA.js} +2 -2
- package/dashboard/dist/assets/{RolePill-Pb9TKSQN.js.map → RolePill-Cl71eDUA.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-1DBoEMsb.js → RolesPage-Bzp9FhAl.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-1DBoEMsb.js.map → RolesPage-Bzp9FhAl.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-Cp6j3FEY.js → RunAsSelector-DXbHRxQs.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-Cp6j3FEY.js.map → RunAsSelector-DXbHRxQs.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-Pr8kawv8.js → StickyPagination-D8XuMSWD.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-Pr8kawv8.js.map → StickyPagination-D8XuMSWD.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-BqmQ-N3y.js → StreamMessageDetail-D5v95pmz.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-BqmQ-N3y.js.map → StreamMessageDetail-D5v95pmz.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-y1YmXrsj.js → SwimlaneTimeline-CUEf2R5R.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-y1YmXrsj.js.map → SwimlaneTimeline-CUEf2R5R.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-Df4myuYF.js → TagInput-B_WQiuer.js} +2 -2
- package/dashboard/dist/assets/{TagInput-Df4myuYF.js.map → TagInput-B_WQiuer.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-CT5rXHK5.js → TaskDetailPage-BJvKNwEe.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CT5rXHK5.js.map → TaskDetailPage-BJvKNwEe.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-YalYdCNo.js → TaskQueuePill-Lgn2obNU.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-YalYdCNo.js.map → TaskQueuePill-Lgn2obNU.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-DOy6JlKS.js → TasksListPage-CM7BWh_h.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DOy6JlKS.js.map → TasksListPage-CM7BWh_h.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BAQwZSpq.js → TimeAgo-D1K7xKq5.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BAQwZSpq.js.map → TimeAgo-D1K7xKq5.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BK_jufns.js → TimestampCell-7G0echgP.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BK_jufns.js.map → TimestampCell-7G0echgP.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-VGpT6Quy.js → ToolPill-uVqcbHPE.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-VGpT6Quy.js.map → ToolPill-uVqcbHPE.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-5PMQyUCe.js → ToolTestPanel-LxuJvURK.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-5PMQyUCe.js.map → ToolTestPanel-LxuJvURK.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-Cn1ShfR8.js → TopicDetailPage-JvAX6rrR.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-Cn1ShfR8.js.map → TopicDetailPage-JvAX6rrR.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-D67tjS8L.js → TopicsPage-tFT2AcTz.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-D67tjS8L.js.map → TopicsPage-tFT2AcTz.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-Dsu1Jk4N.js → UserName-Djz0nmaZ.js} +2 -2
- package/dashboard/dist/assets/{UserName-Dsu1Jk4N.js.map → UserName-Djz0nmaZ.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-BwQoOmUE.js → WorkflowExecutionPage-f53hilbI.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-BwQoOmUE.js.map → WorkflowExecutionPage-f53hilbI.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-pPUqmx6Q.js → WorkflowPill-IDjTRfQ8.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-pPUqmx6Q.js.map → WorkflowPill-IDjTRfQ8.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-D3z7COgH.js → WorkflowsDashboard-DM9Xe665.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-D3z7COgH.js.map → WorkflowsDashboard-DM9Xe665.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-C15JcxyY.js → WorkflowsOverview-CUGSrx9N.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-C15JcxyY.js.map → WorkflowsOverview-CUGSrx9N.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BYq3t7E-.js → YamlWorkflowDetailPage-B1_yqxAw.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BYq3t7E-.js.map → YamlWorkflowDetailPage-B1_yqxAw.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-B44WgwE_.js → YamlWorkflowsPage-NtGvqiu7.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-B44WgwE_.js.map → YamlWorkflowsPage-NtGvqiu7.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BRmmK6Y9.js → agents-tML6AjDj.js} +2 -2
- package/dashboard/dist/assets/{agents-BRmmK6Y9.js.map → agents-tML6AjDj.js.map} +1 -1
- package/dashboard/dist/assets/{bots-BD75mzGG.js → bots-Cb0WTwhY.js} +2 -2
- package/dashboard/dist/assets/{bots-BD75mzGG.js.map → bots-Cb0WTwhY.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DDgC_Kds.js → capabilities-BGZogsi_.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DDgC_Kds.js.map → capabilities-BGZogsi_.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BJh12lMv.js → controlplane-B7VJTlZD.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BJh12lMv.js.map → controlplane-B7VJTlZD.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-DIJt2sgn.js → escalation-Bl-SQV_u.js} +2 -2
- package/dashboard/dist/assets/{escalation-DIJt2sgn.js.map → escalation-Bl-SQV_u.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-zl6E94Up.js → escalation-columns-BlJOswRx.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-zl6E94Up.js.map → escalation-columns-BlJOswRx.js.map} +1 -1
- package/dashboard/dist/assets/{index-BhznDv-4.js → index--WeZDfeN.js} +2 -2
- package/dashboard/dist/assets/{index-BhznDv-4.js.map → index--WeZDfeN.js.map} +1 -1
- package/dashboard/dist/assets/{index-DU7YumVJ.js → index-0o71lRuY.js} +2 -2
- package/dashboard/dist/assets/{index-DU7YumVJ.js.map → index-0o71lRuY.js.map} +1 -1
- package/dashboard/dist/assets/{index-CV4lEd4I.js → index-3A_5CL81.js} +2 -2
- package/dashboard/dist/assets/{index-CV4lEd4I.js.map → index-3A_5CL81.js.map} +1 -1
- package/dashboard/dist/assets/{index-DVVIeBBk.js → index-BorpZbZA.js} +2 -2
- package/dashboard/dist/assets/{index-DVVIeBBk.js.map → index-BorpZbZA.js.map} +1 -1
- package/dashboard/dist/assets/{index-CknKy4RA.js → index-CBv3UxF2.js} +2 -2
- package/dashboard/dist/assets/{index-CknKy4RA.js.map → index-CBv3UxF2.js.map} +1 -1
- package/dashboard/dist/assets/{index-BUbzfEA9.js → index-D0-8byNu.js} +2 -2
- package/dashboard/dist/assets/{index-BUbzfEA9.js.map → index-D0-8byNu.js.map} +1 -1
- package/dashboard/dist/assets/{index-j-C7g_Ej.js → index-DcbEIXit.js} +2 -2
- package/dashboard/dist/assets/{index-j-C7g_Ej.js.map → index-DcbEIXit.js.map} +1 -1
- package/dashboard/dist/assets/{index-DrUkTcn-.js → index-DfDfJivY.js} +2 -2
- package/dashboard/dist/assets/{index-DrUkTcn-.js.map → index-DfDfJivY.js.map} +1 -1
- package/dashboard/dist/assets/{index-CtDf8vvQ.js → index-Dgw1KKpq.js} +9 -9
- package/dashboard/dist/assets/index-Dgw1KKpq.js.map +1 -0
- package/dashboard/dist/assets/index-Il_g7kw5.js +6 -0
- package/dashboard/dist/assets/{index-DccCwyZl.js.map → index-Il_g7kw5.js.map} +1 -1
- package/dashboard/dist/assets/{index-B0kmiSmt.js → index-SCrD3l-K.js} +2 -2
- package/dashboard/dist/assets/{index-B0kmiSmt.js.map → index-SCrD3l-K.js.map} +1 -1
- package/dashboard/dist/assets/{index-CDPBXB4e.js → index-TiKh2Ctj.js} +2 -2
- package/dashboard/dist/assets/{index-CDPBXB4e.js.map → index-TiKh2Ctj.js.map} +1 -1
- package/dashboard/dist/assets/index-Wny0bRgq.css +1 -0
- package/dashboard/dist/assets/{index-CpgV4Kkp.js → index-e97M6GoI.js} +2 -2
- package/dashboard/dist/assets/{index-CpgV4Kkp.js.map → index-e97M6GoI.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-pNDWACXB.js → knowledge-CDzw4E6q.js} +2 -2
- package/dashboard/dist/assets/{knowledge-pNDWACXB.js.map → knowledge-CDzw4E6q.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-xddLBwUW.js → mcp-D_-NQtnG.js} +2 -2
- package/dashboard/dist/assets/{mcp-xddLBwUW.js.map → mcp-D_-NQtnG.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CmNjvxTG.js → mcp-query-BqZXdf9A.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CmNjvxTG.js.map → mcp-query-BqZXdf9A.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-B05sd2nB.js → pipelines-CNLhgj8b.js} +2 -2
- package/dashboard/dist/assets/{pipelines-B05sd2nB.js.map → pipelines-CNLhgj8b.js.map} +1 -1
- package/dashboard/dist/assets/roles-CFD2eYap.js +2 -0
- package/dashboard/dist/assets/roles-CFD2eYap.js.map +1 -0
- package/dashboard/dist/assets/{tasks-Bm1OKrJA.js → tasks-DcSvF636.js} +2 -2
- package/dashboard/dist/assets/{tasks-Bm1OKrJA.js.map → tasks-DcSvF636.js.map} +1 -1
- package/dashboard/dist/assets/{topics-BVIqtmd4.js → topics-DI8TFSZv.js} +2 -2
- package/dashboard/dist/assets/{topics-BVIqtmd4.js.map → topics-DI8TFSZv.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-_qCzU74s.js → useEventHooks-DcIgMDh3.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-_qCzU74s.js.map → useEventHooks-DcIgMDh3.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CDnCSFpG.js → useNamespace-C88ZxGoX.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CDnCSFpG.js.map → useNamespace-C88ZxGoX.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-zrHMhaFM.js → useYamlActivityEvents-D2-yVjJ7.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-zrHMhaFM.js.map → useYamlActivityEvents-D2-yVjJ7.js.map} +1 -1
- package/dashboard/dist/assets/{users-BPBMZg27.js → users-C0WV36X8.js} +2 -2
- package/dashboard/dist/assets/{users-BPBMZg27.js.map → users-C0WV36X8.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-C1zVP_dv.js → vendor-icons-CEWCGPeJ.js} +76 -76
- package/dashboard/dist/assets/vendor-icons-CEWCGPeJ.js.map +1 -0
- package/dashboard/dist/assets/{workflows-CT6nTL1I.js → workflows-CkPv7xk-.js} +2 -2
- package/dashboard/dist/assets/{workflows-CT6nTL1I.js.map → workflows-CkPv7xk-.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-CdfjkOKU.js → yaml-workflows-BjrMQLTK.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-CdfjkOKU.js.map → yaml-workflows-BjrMQLTK.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/roles.md +62 -0
- package/docs/api/mcp/admin.md +32 -1
- package/docs/api/mcp/human-queue.md +2 -0
- package/docs/api/sdk/roles.md +39 -0
- package/docs/cli.md +13 -0
- package/docs/dashboard.md +66 -17
- package/docs/data.md +34 -0
- package/docs/hitl-guide.md +25 -3
- package/package.json +2 -2
- package/dashboard/dist/assets/OperationsPage-CAmiFHI6.js +0 -2
- package/dashboard/dist/assets/OperationsPage-CAmiFHI6.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-BB_e330f.js +0 -16
- package/dashboard/dist/assets/RoleDetailPage-BB_e330f.js.map +0 -1
- package/dashboard/dist/assets/index-BRtKQtQZ.css +0 -1
- package/dashboard/dist/assets/index-CtDf8vvQ.js.map +0 -1
- package/dashboard/dist/assets/index-DccCwyZl.js +0 -6
- package/dashboard/dist/assets/roles-bRgaMcdy.js +0 -2
- package/dashboard/dist/assets/roles-bRgaMcdy.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-C1zVP_dv.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OperationsPage-CAmiFHI6.js","sources":["../../src/pages/operations/PaceChart.tsx","../../src/pages/operations/StationDetailPanel.tsx","../../src/pages/operations/OperationsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { StationMetric } from '../../api/escalations';\n\nexport interface ChartStation {\n role: string;\n title: string | null;\n target_per_hour: number | null;\n parent_role: string | null;\n metric: StationMetric | undefined;\n}\n\ninterface PaceChartProps {\n stations: ChartStation[];\n selectedRole: string | null;\n onSelect: (role: string) => void;\n /** Selected window length in hours — target count = target_per_hour × this. */\n periodHours: number;\n}\n\n// ── SVG layout ────────────────────────────────────────────────────────────────\n\nconst W = 800;\nconst H = 270;\nconst ML = 40;\nconst MR = 76;\nconst MT = 24;\nconst MB = 72;\n\nconst chartW = W - ML - MR;\nconst chartH = H - MT - MB;\nconst bottom = MT + chartH;\nconst right = ML + chartW;\n\n// Smooth transition applied when the window changes and values re-scale.\nconst EASE = '0.5s cubic-bezier(0.4, 0, 0.2, 1)';\n\n// ── Path builders ─────────────────────────────────────────────────────────────\n\n/** Straight polyline — the target line is a discrete count per station. */\nfunction linePath(pts: { x: number; y: number }[]): string {\n if (pts.length === 0) return '';\n return pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x.toFixed(1)} ${p.y.toFixed(1)}`).join(' ');\n}\n\n/** Catmull-Rom → cubic bezier — smooth curves for the actual and active lines. */\nfunction catmullPath(pts: { x: number; y: number }[]): string {\n if (pts.length === 0) return '';\n if (pts.length === 1) return `M ${pts[0].x} ${pts[0].y}`;\n const segs: string[] = [];\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[Math.max(0, i - 1)];\n const p1 = pts[i];\n const p2 = pts[i + 1];\n const p3 = pts[Math.min(pts.length - 1, i + 2)];\n const cp1x = (p1.x + (p2.x - p0.x) / 6).toFixed(1);\n const cp1y = (p1.y + (p2.y - p0.y) / 6).toFixed(1);\n const cp2x = (p2.x - (p3.x - p1.x) / 6).toFixed(1);\n const cp2y = (p2.y - (p3.y - p1.y) / 6).toFixed(1);\n if (i === 0) segs.push(`M ${p1.x.toFixed(1)} ${p1.y.toFixed(1)}`);\n segs.push(`C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x.toFixed(1)} ${p2.y.toFixed(1)}`);\n }\n return segs.join(' ');\n}\n\nfunction compact(n: number): string {\n return n >= 10000 ? `${Math.round(n / 1000)}k` : n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n\nfunction last<T>(a: T[]): T | undefined {\n return a.length > 0 ? a[a.length - 1] : undefined;\n}\n\n// ── Colors ────────────────────────────────────────────────────────────────────\n\n/** Circle color from actual vs the window target. Meeting or beating the target\n * is good (green); short is the concern (amber → red). */\nfunction paceColor(ratio: number | null): { stroke: string; fill: string } {\n if (ratio == null) return { stroke: '#cbd5e1', fill: '#f8fafc' };\n if (ratio >= 1.0) return { stroke: '#10b981', fill: '#ecfdf5' }; // met/beat target\n if (ratio >= 0.6) return { stroke: '#f59e0b', fill: '#fffbeb' }; // behind\n return { stroke: '#ef4444', fill: '#fef2f2' }; // well behind\n}\n\nconst ACTIVE_COLOR = '#6366f1'; // active/in-queue — indigo, secondary\n\n// ── End-label stacking — spread close labels so text doesn't collide ────────────\n\nconst MIN_GAP = 13;\nfunction spreadLabels<T extends { y: number }>(labels: T[]): (T & { labelY: number })[] {\n const sorted = [...labels].sort((a, b) => a.y - b.y);\n let prev = -Infinity;\n return sorted.map((l) => {\n const labelY = Math.max(l.y + 3, prev + MIN_GAP);\n prev = labelY;\n return { ...l, labelY };\n });\n}\n\n// ── Chart ─────────────────────────────────────────────────────────────────────\n\nexport function PaceChart({ stations, selectedRole, onSelect, periodHours }: PaceChartProps) {\n const [hoveredIdx, setHoveredIdx] = useState<number | null>(null);\n\n const n = stations.length;\n if (n === 0) return null;\n\n const xOf = (i: number) => (n === 1 ? ML + chartW / 2 : ML + (i / (n - 1)) * chartW);\n const xMap = new Map(stations.map((s, i) => [s.role, xOf(i)]));\n\n // Per-station counts for the selected window:\n // - target : expected units = target_per_hour × periodHours (e.g. 22/h · 15m ≈ 5).\n // - actual : units resolved in the window (\"the number we see\").\n // - active : units in the queue being worked right now (claimed).\n const rows = stations.map((s, i) => {\n const target = s.target_per_hour ?? null;\n const expected = target != null ? target * periodHours : null;\n return {\n idx: i,\n x: xOf(i),\n expected,\n actual: s.metric?.resolved ?? 0,\n active: s.metric?.claimed ?? 0,\n pending: s.metric?.pending ?? 0,\n inArrears: s.metric?.in_arrears ?? 0,\n };\n });\n\n const hasTargets = rows.some((r) => r.expected != null);\n\n const dataMax = Math.max(\n 1,\n ...rows.map((r) => r.expected ?? 0),\n ...rows.map((r) => r.actual),\n ...rows.map((r) => (r.expected != null ? r.active : 0)),\n );\n const maxVal = dataMax * 1.15;\n const yScale = (v: number) => MT + chartH * (1 - Math.max(0, Math.min(v, maxVal)) / maxVal);\n\n const withTarget = rows.filter((r) => r.expected != null);\n const targetPts = withTarget.map((r) => ({ ...r, y: yScale(r.expected as number) }));\n const actualPts = withTarget.map((r) => ({ ...r, y: yScale(r.actual) }));\n const activePts = withTarget.map((r) => ({ ...r, y: yScale(r.active) }));\n\n const targetLinePath = linePath(targetPts);\n const actualSplinePath = catmullPath(actualPts);\n const activeSplinePath = catmullPath(activePts);\n\n const lastActual = last(actualPts);\n const lastTarget = last(targetPts);\n const lastActive = last(activePts);\n\n const areaPath =\n actualPts.length >= 2 && lastActual\n ? `${actualSplinePath} L ${lastActual.x.toFixed(1)} ${bottom} L ${actualPts[0].x.toFixed(1)} ${bottom} Z`\n : '';\n\n const endLabels = spreadLabels(\n [\n lastTarget ? { key: 'target', text: 'target', color: '#ef4444', y: lastTarget.y } : null,\n lastActual ? { key: 'actual', text: 'actual', color: '#475569', y: lastActual.y } : null,\n lastActive ? { key: 'active', text: 'active', color: ACTIVE_COLOR, y: lastActive.y } : null,\n ].filter(Boolean) as { key: string; text: string; color: string; y: number }[],\n );\n\n return (\n <svg viewBox={`0 0 ${W} ${H}`} className=\"w-full h-full\" preserveAspectRatio=\"xMidYMid meet\" style={{ display: 'block' }}>\n {/* Dependency connector lines (parent → child), drawn at chart floor */}\n {stations.map((s) => {\n if (!s.parent_role) return null;\n const px = xMap.get(s.parent_role);\n if (px == null) return null;\n const cx = xOf(stations.findIndex((r) => r.role === s.role));\n return <line key={`dep-${s.role}`} x1={px} y1={bottom} x2={cx} y2={bottom} stroke=\"#e2e8f0\" strokeWidth={0.75} />;\n })}\n\n {/* Area under the actual curve */}\n {areaPath && <path d={areaPath} fill=\"rgb(71 85 105 / 0.05)\" style={{ transition: `d ${EASE}` }} />}\n\n {/* Target — thin red solid reference at the window's expected count */}\n {targetLinePath && (\n <path d={targetLinePath} fill=\"none\" stroke=\"#ef4444\" strokeWidth={0.5} strokeLinejoin=\"round\" opacity={0.9} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Per-role target for the window (target_per_hour × duration), just above the red line */}\n {targetPts.map((tp) => (\n <text\n key={`tval-${tp.idx}`}\n x={tp.x}\n y={tp.y - 3.5}\n textAnchor=\"middle\"\n fontSize={6.5}\n fill=\"#ef4444\"\n fontFamily=\"ui-monospace, monospace\"\n fontWeight=\"500\"\n opacity={0.7}\n style={{ transition: `y ${EASE}` }}\n >\n {Math.round(tp.expected as number)}\n </text>\n ))}\n\n {/* Active — thin dotted, how many are in the queue right now */}\n {activeSplinePath && (\n <path d={activeSplinePath} fill=\"none\" stroke={ACTIVE_COLOR} strokeWidth={0.75} strokeDasharray=\"2 3\" strokeLinecap=\"round\" opacity={0.5} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Actual — thin solid, primary line */}\n {actualSplinePath && (\n <path d={actualSplinePath} fill=\"none\" stroke=\"#475569\" strokeWidth={1} strokeLinejoin=\"round\" strokeLinecap=\"round\" opacity={0.7} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Active markers — small dots on the active line.\n Above the dot: pending (the total in the queue, available + claimed).\n Below the dot: active (claimed, being worked right now). */}\n {activePts.map((ap) => {\n if (ap.pending <= 0 && ap.active <= 0) return null;\n const ar = Math.max(2.5, Math.min(5, 2.5 + ap.active / 10));\n return (\n <g key={`active-${ap.idx}`} transform={`translate(${ap.x} ${ap.y})`} style={{ transition: `transform ${EASE}` }}>\n <circle r={ar} fill={ACTIVE_COLOR} opacity={0.85} />\n {ap.pending > 0 && (\n <text y={-ar - 4} textAnchor=\"middle\" fontSize={7.5} fill=\"#64748b\" fontFamily=\"ui-monospace, monospace\" fontWeight=\"600\">\n {ap.pending}\n </text>\n )}\n {ap.active > 0 && (\n <text y={ar + 9} textAnchor=\"middle\" fontSize={7.5} fill={ACTIVE_COLOR} fontFamily=\"ui-monospace, monospace\" fontWeight=\"600\">\n {ap.active}\n </text>\n )}\n </g>\n );\n })}\n\n {/* Station nodes — actual (resolved) as a dot on the actual line, styled like\n the active dot but a bit larger (actual is the most important number).\n The count sits below the dot so it stays legible as numbers grow. */}\n {rows.map((row) => {\n const s = stations[row.idx];\n const x = row.x;\n const cy = row.expected != null ? yScale(row.actual) : bottom;\n const ratio = row.expected && row.expected > 0 ? row.actual / row.expected : null;\n const { stroke } = paceColor(row.expected != null ? ratio : null);\n // Same small scale as the active dot — a hair larger.\n const r = Math.max(3, Math.min(5.5, 3 + row.actual / 120));\n const isSelected = s.role === selectedRole;\n const isHovered = hoveredIdx === row.idx;\n\n const tooltip =\n row.expected == null\n ? 'idle · set a target rate to plot pace'\n : `${row.actual} done · target ${Math.round(row.expected)}`\n + (row.pending > 0 ? ` · ${row.pending} in queue` : '')\n + (row.active > 0 ? ` · ${row.active} active` : '');\n const tipW = tooltip.length * 5.5 + 20;\n const tipX = Math.max(ML + tipW / 2 + 4, Math.min(right - tipW / 2 - 4, x));\n const tipY = cy - r - 10;\n\n return (\n <g\n key={s.role}\n onClick={() => onSelect(s.role)}\n onMouseEnter={() => setHoveredIdx(row.idx)}\n onMouseLeave={() => setHoveredIdx(null)}\n style={{ cursor: 'pointer' }}\n >\n {/* Animated marker group — slides vertically as the window rescales */}\n <g transform={`translate(${x} ${cy})`} style={{ transition: `transform ${EASE}` }}>\n <circle r={22} fill=\"transparent\" />\n {row.inArrears > 0 && (\n <circle r={r + 4} fill=\"none\" stroke=\"#ef4444\" strokeWidth={1} strokeDasharray=\"3 2\" opacity={0.6} />\n )}\n <circle r={r} fill={stroke} opacity={0.9} style={{ transition: `r ${EASE}` }} />\n {row.expected != null && (\n <text y={-r - 5} textAnchor=\"middle\" fontSize={9.5} fill=\"#334155\" fontFamily=\"ui-monospace, monospace\" fontWeight=\"500\">\n {compact(row.actual)}\n </text>\n )}\n {isHovered && !isSelected && <circle r={r + 3} fill=\"none\" stroke={stroke} strokeWidth={1} opacity={0.4} />}\n {isSelected && <circle r={r + 4} fill=\"none\" stroke=\"#6366f1\" strokeWidth={2} />}\n </g>\n\n {/* Station labels (fixed at the floor) */}\n <text x={x} y={bottom + 14} textAnchor=\"middle\" fontSize={9.5} fill=\"#475569\" fontFamily=\"ui-sans-serif, sans-serif\" fontWeight=\"500\">\n {s.title ?? s.role}\n </text>\n <text x={x} y={bottom + 26} textAnchor=\"middle\" fontSize={8} fill=\"#94a3b8\" fontFamily=\"ui-monospace, monospace\">\n {s.role}\n </text>\n\n {/* Tooltip */}\n {isHovered && (\n <g>\n <rect x={tipX - tipW / 2} y={tipY - 16} width={tipW} height={19} rx={3} fill=\"#0f172a\" opacity={0.88} />\n <text x={tipX} y={tipY - 3} textAnchor=\"middle\" fontSize={8.5} fill=\"white\" fontFamily=\"ui-monospace, monospace\">\n {tooltip}\n </text>\n </g>\n )}\n </g>\n );\n })}\n\n {/* No-target hint */}\n {!hasTargets && (\n <text x={ML + chartW / 2} y={bottom + 48} textAnchor=\"middle\" fontSize={8.5} fill=\"#94a3b8\" fontFamily=\"ui-sans-serif, sans-serif\">\n Set target_per_hour on each role in Admin → Roles to enable the pace chart\n </text>\n )}\n\n {/* End labels — text + count, rendered last so they sit above everything */}\n {endLabels.map((l) => (\n <text\n key={l.key}\n x={right + 6}\n y={l.labelY}\n fontSize={8}\n fill={l.color}\n fontFamily=\"ui-sans-serif, sans-serif\"\n fontWeight={l.key === 'actual' ? 700 : 500}\n opacity={l.key === 'active' ? 0.85 : 1}\n style={{ transition: `y ${EASE}` }}\n >\n {l.text}\n </text>\n ))}\n </svg>\n );\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, ExternalLink } from 'lucide-react';\nimport { useStationMetrics } from '../../api/escalations';\nimport type { StationMetric } from '../../api/escalations';\nimport type { RoleDetail } from '../../api/roles';\n\ninterface StationDetailPanelProps {\n role: RoleDetail | null;\n allMetrics: StationMetric[];\n orderedRoles: RoleDetail[];\n globalPeriod: string;\n onClose: () => void;\n}\n\n// Mirrors OperationsPage's selector — the panel reports the same windows the\n// chart can show, and opens on whichever one the chart has selected.\nconst PERIODS = ['15m', '1h', '24h', '7d', '30d'] as const;\ntype Period = (typeof PERIODS)[number];\n\nconst isPeriod = (p: string): p is Period => (PERIODS as readonly string[]).includes(p);\n\nfunction fmt(min: number | null): string {\n if (min == null) return '—';\n if (min < 1) {\n const s = Math.round(min * 60);\n return s <= 0 ? '< 1s' : `${s}s`;\n }\n if (min < 60) return `${min.toFixed(0)}m`;\n return `${(min / 60).toFixed(1)}h`;\n}\n\nfunction MetricRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between py-1\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider\">{label}</span>\n <span className=\"text-xs font-mono font-medium text-text-primary tabular-nums\">{value}</span>\n </div>\n );\n}\n\nfunction PeriodSelector({ period, onChange }: { period: Period; onChange: (p: Period) => void }) {\n return (\n <div className=\"flex items-center gap-1 mb-4\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => onChange(p)}\n className={`px-2 py-0.5 text-[10px] font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n );\n}\n\nfunction RoleView({ role, globalPeriod, onClose }: { role: RoleDetail; globalPeriod: string; onClose: () => void }) {\n // Open on the chart's selected window so the panel's numbers agree with the\n // chart beside it; the local selector still lets the viewer drill around.\n const [period, setPeriod] = useState<Period>(isPeriod(globalPeriod) ? globalPeriod : '24h');\n const { data } = useStationMetrics(period);\n const metric = data?.stations.find((s) => s.role === role.role);\n const slaMinutes = role.sla_minutes ?? undefined;\n const targetPerHour = role.target_per_hour ?? undefined;\n const workerCount = role.worker_count ?? undefined;\n\n return (\n <>\n {/* Header */}\n <div className=\"flex items-start justify-between mb-1\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline gap-1.5 flex-wrap\">\n <span className=\"text-sm font-mono font-bold text-text-primary\">{role.role}</span>\n {role.title && (\n <span className=\"text-[10px] text-text-secondary\">{role.title}</span>\n )}\n </div>\n {role.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 line-clamp-2 leading-relaxed\">\n {role.description}\n </p>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"text-text-quaternary hover:text-text-secondary transition-colors mt-0.5 shrink-0 ml-2\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n <Link\n to={`/admin/roles/${encodeURIComponent(role.role)}`}\n className=\"flex items-center gap-1 text-[10px] text-accent hover:underline mb-4\"\n >\n <ExternalLink className=\"w-2.5 h-2.5\" />\n Edit in Roles\n </Link>\n\n <PeriodSelector period={period} onChange={setPeriod} />\n\n {/* Capacity settings */}\n {(targetPerHour || slaMinutes || workerCount) && (\n <div className=\"flex items-center gap-4 mb-4 text-[10px]\">\n {targetPerHour && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{targetPerHour}/h</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">target</div>\n </div>\n )}\n {slaMinutes && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{slaMinutes}m</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">SLA</div>\n </div>\n )}\n {workerCount && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{workerCount}</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">workers</div>\n </div>\n )}\n </div>\n )}\n\n {/* Two-column wait / work grid */}\n <div className=\"grid grid-cols-2 gap-x-3\">\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-1.5\">Wait (queue)</p>\n <MetricRow label=\"P99\" value={fmt(metric?.wait.p99 ?? null)} />\n <MetricRow label=\"avg\" value={fmt(metric?.wait.avg ?? null)} />\n </div>\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-1.5\">Work (proc.)</p>\n <MetricRow label=\"P99\" value={fmt(metric?.work.p99 ?? null)} />\n <MetricRow label=\"avg\" value={fmt(metric?.work.avg ?? null)} />\n </div>\n </div>\n\n {/* SLA + arrears */}\n <div className=\"border-t border-surface-border/40 pt-2 mt-3 space-y-1.5\">\n {slaMinutes && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-text-tertiary\">SLA target</span>\n <span className=\"text-xs font-mono text-text-secondary\">{slaMinutes}m</span>\n </div>\n )}\n {metric && metric.in_arrears > 0 && (\n <Link\n to={`/escalations/available?roles=${encodeURIComponent(JSON.stringify([metric.role]))}&sort_by=created_at&order=asc`}\n className=\"flex items-center justify-between group\"\n >\n <span className=\"text-[10px] text-red-500\">{metric.in_arrears} past SLA</span>\n <ExternalLink className=\"w-3 h-3 text-red-400 group-hover:text-red-500 transition-colors\" />\n </Link>\n )}\n </div>\n\n {/* View queue — the facet URL parser reads `roles` as a JSON array; a\n bare `role=` param is ignored and would show every role's queue. */}\n <div className=\"mt-4 border-t border-surface-border/40 pt-3\">\n <Link\n to={`/escalations/available?roles=${encodeURIComponent(JSON.stringify([role.role]))}`}\n className=\"flex items-center gap-1.5 text-[10px] text-accent hover:underline\"\n >\n View full queue\n <ExternalLink className=\"w-2.5 h-2.5\" />\n </Link>\n </div>\n </>\n );\n}\n\nfunction OverviewPanel({\n allMetrics,\n orderedRoles,\n period,\n}: {\n allMetrics: StationMetric[];\n orderedRoles: RoleDetail[];\n period: string;\n}) {\n const totalPending = allMetrics.reduce((s, m) => s + m.pending, 0);\n const totalResolved = allMetrics.reduce((s, m) => s + m.resolved, 0);\n const totalArrears = allMetrics.reduce((s, m) => s + m.in_arrears, 0);\n\n const metricByRole = new Map(allMetrics.map((m) => [m.role, m]));\n const stationsAtRisk = allMetrics.filter((m) => m.in_arrears > 0).length;\n const stationsWithLoad = allMetrics.filter((m) => m.pending > 0).length;\n\n return (\n <>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-3\">\n Pipeline · {period}\n </p>\n\n {/* Health headline */}\n <div className=\"mb-4\">\n {stationsAtRisk > 0 ? (\n <p className=\"text-[11px] text-red-400\">\n {stationsAtRisk} station{stationsAtRisk > 1 ? 's' : ''} past SLA\n </p>\n ) : stationsWithLoad > 0 ? (\n <p className=\"text-[11px] text-amber-400\">\n {stationsWithLoad} station{stationsWithLoad > 1 ? 's' : ''} with backlog\n </p>\n ) : totalResolved > 0 ? (\n <p className=\"text-[11px] text-emerald-500\">Flowing — queue clear</p>\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">Quiet — awaiting work</p>\n )}\n </div>\n\n {/* Key counters */}\n <div className=\"space-y-1.5 mb-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Pending</span>\n <span className={`text-xs font-mono tabular-nums ${totalPending > 0 ? 'text-text-primary font-semibold' : 'text-text-quaternary'}`}>\n {totalPending}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Resolved · {period}</span>\n <span className=\"text-xs font-mono tabular-nums text-text-secondary\">{totalResolved}</span>\n </div>\n {totalArrears > 0 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Past SLA</span>\n <span className=\"text-xs font-mono tabular-nums text-red-500 font-semibold\">{totalArrears}</span>\n </div>\n )}\n </div>\n\n {/* Divider + column headers */}\n <div className=\"border-t border-surface-border/40 pt-2 mb-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider flex-1\">Station</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">pend</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">actv</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">res</span>\n </div>\n </div>\n\n {/* Station list in pipeline order */}\n <div className=\"space-y-0.5\">\n {orderedRoles.map((r) => {\n const m = metricByRole.get(r.role);\n const pending = m?.pending ?? 0;\n const claimed = m?.claimed ?? 0;\n const resolved = m?.resolved ?? 0;\n const inArrears = m?.in_arrears ?? 0;\n const label = r.title || r.role;\n const hasAlert = inArrears > 0;\n const hasLoad = pending > 0;\n\n return (\n <div key={r.role} className=\"flex items-center gap-2 py-0.5\">\n <span\n className={`text-[10px] font-mono flex-1 truncate ${\n hasAlert ? 'text-red-400' : hasLoad ? 'text-text-primary' : 'text-text-quaternary'\n }`}\n >\n {label}\n {hasAlert && (\n <span className=\"ml-1 text-[8px] text-red-400 font-semibold\">SLA</span>\n )}\n </span>\n <span\n className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${\n hasAlert ? 'text-red-400' : hasLoad ? 'text-text-primary font-semibold' : 'text-text-quaternary'\n }`}\n >\n {pending > 0 ? pending : '—'}\n </span>\n <span className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${claimed > 0 ? 'text-accent' : 'text-text-quaternary'}`}>\n {claimed > 0 ? claimed : '—'}\n </span>\n <span className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${resolved > 0 ? 'text-text-secondary' : 'text-text-quaternary'}`}>\n {resolved > 0 ? resolved : '—'}\n </span>\n </div>\n );\n })}\n </div>\n\n <p className=\"text-[9px] text-text-quaternary mt-5\">\n Select a station for queue detail.\n </p>\n </>\n );\n}\n\nexport function StationDetailPanel({\n role,\n allMetrics,\n orderedRoles,\n globalPeriod,\n onClose,\n}: StationDetailPanelProps) {\n return (\n <div className=\"w-[280px] shrink-0 px-6 py-8 flex flex-col overflow-y-auto min-h-0\">\n {role ? (\n <RoleView role={role} globalPeriod={globalPeriod} onClose={onClose} />\n ) : (\n <OverviewPanel allMetrics={allMetrics} orderedRoles={orderedRoles} period={globalPeriod} />\n )}\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Link } from 'react-router-dom';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\nimport { useRoleDetails, type RoleDetail } from '../../api/roles';\nimport { useStationMetrics } from '../../api/escalations';\nimport type { StationMetric } from '../../api/escalations';\nimport { useStationMetricsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { PaceChart, type ChartStation } from './PaceChart';\nimport { StationDetailPanel } from './StationDetailPanel';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nconst PERIODS = ['15m', '1h', '24h', '7d', '30d'] as const;\ntype Period = (typeof PERIODS)[number];\n\n// Window length in hours — used to express the target as a count for the\n// selected window (target_per_hour × hours), e.g. 22/h over 15m ≈ 5 expected.\nconst PERIOD_HOURS: Record<Period, number> = {\n '15m': 0.25,\n '1h': 1,\n '24h': 24,\n '7d': 168,\n '30d': 720,\n};\n\ninterface OrderedStation {\n role: RoleDetail;\n depth: number;\n}\n\n// ── Topological sort — BFS, tracking actual depth ─────────────────────────────\n\nfunction topoSort(roles: RoleDetail[]): OrderedStation[] {\n const opsRoles = roles.filter((r) => r.ops_visible);\n const roleMap = new Map(opsRoles.map((r) => [r.role, r]));\n const result: OrderedStation[] = [];\n const visited = new Set<string>();\n\n // Roots: no parent, or parent not in ops set\n const queue: OrderedStation[] = opsRoles\n .filter((r) => !r.parent_role || !roleMap.has(r.parent_role))\n .map((r) => ({ role: r, depth: 0 }));\n\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (visited.has(item.role.role)) continue;\n visited.add(item.role.role);\n result.push(item);\n // Children get depth + 1\n opsRoles\n .filter((c) => c.parent_role === item.role.role && !visited.has(c.role))\n .forEach((c) => queue.push({ role: c, depth: item.depth + 1 }));\n }\n\n // Any unreachable (cycles / dangling)\n opsRoles\n .filter((r) => !visited.has(r.role))\n .forEach((r) => result.push({ role: r, depth: 0 }));\n\n return result;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction fmtMin(v: number | null): string {\n if (v == null) return '—';\n if (v < 1) {\n const s = Math.round(v * 60);\n return s <= 0 ? '< 1s' : `${s}s`;\n }\n if (v < 60) return `${v.toFixed(0)}m`;\n return `${(v / 60).toFixed(1)}h`;\n}\n\nfunction loadBar(\n pending: number,\n target: number | null,\n throughputPct: number | null,\n resolved: number,\n) {\n if (!target) return { pct: null, color: 'bg-surface-border', historical: false };\n\n if (pending > 0) {\n const ratio = pending / target;\n const pct = Math.round(ratio * 100);\n // Amber: backlog. Orange: some work but well under pace. Green: healthy.\n const color = ratio > 1.0 ? 'bg-amber-400' : ratio < 0.2 ? 'bg-orange-400' : 'bg-emerald-400';\n return { pct, color, historical: false };\n }\n\n // Idle: use period throughput efficiency rather than the live backlog ratio.\n // resolved=0 means nothing happened in this window → no data, not failing.\n if (resolved === 0 || throughputPct == null) {\n return { pct: null, color: 'bg-surface-border', historical: true };\n }\n const ratio = throughputPct / 100;\n const pct = Math.round(throughputPct);\n // Amber: above baseline (produced more than target). Neutral otherwise —\n // below-target throughput isn't a positive green signal, just normal data.\n const color = ratio > 1.0 ? 'bg-amber-400' : 'bg-surface-border';\n return { pct, color, historical: true };\n}\n\n// ── Station table row ─────────────────────────────────────────────────────────\n\nfunction StationRow({\n role,\n metric,\n selected,\n onClick,\n}: {\n role: RoleDetail;\n metric: StationMetric | undefined;\n selected: boolean;\n onClick: () => void;\n}) {\n const pending = metric?.pending ?? 0;\n const claimed = metric?.claimed ?? 0;\n const resolved = metric?.resolved ?? 0;\n const inArrears = metric?.in_arrears ?? 0;\n const target = role.target_per_hour ?? null;\n const { pct, color, historical } = loadBar(pending, target, metric?.throughput_pct ?? null, resolved);\n const barWidth = pct != null ? Math.min(100, pct) : 0;\n\n return (\n <>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => { if (e.key === 'Enter') onClick(); }}\n className={`grid items-center gap-4 py-3.5 cursor-pointer transition-colors ${\n selected ? 'border-l-2 border-accent' : 'pl-0.5'\n }`}\n style={{ gridTemplateColumns: '1fr 64px 56px 56px 60px 72px 72px 104px' }}\n >\n {/* Role name */}\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span\n className=\"font-mono font-bold text-text-primary truncate text-[11px]\"\n >\n {role.role}\n </span>\n {role.title && (\n <span className=\"text-[10px] text-text-tertiary truncate\">{role.title}</span>\n )}\n </div>\n\n {/* Target / hour */}\n <span\n className={`text-xs font-mono tabular-nums text-right ${\n target != null ? 'text-text-secondary' : 'text-text-quaternary'\n }`}\n >\n {target != null ? target : '—'}\n </span>\n\n {/* Pending */}\n <span\n className={`text-xs font-mono tabular-nums text-right ${\n pending > 0 ? 'text-text-primary font-semibold' : 'text-text-quaternary'\n }`}\n >\n {pending}\n </span>\n\n {/* Active */}\n <span\n className={`text-xs font-mono tabular-nums text-right ${\n claimed > 0 ? 'text-accent font-semibold' : 'text-text-quaternary'\n }`}\n >\n {claimed}\n </span>\n\n {/* Resolved */}\n <span className=\"text-xs font-mono tabular-nums text-right text-text-quaternary\">\n {resolved}\n </span>\n\n {/* P99 wait */}\n <span className=\"text-xs font-mono tabular-nums text-right text-text-secondary\">\n {fmtMin(metric?.wait.p99 ?? null)}\n </span>\n\n {/* P99 work */}\n <span className=\"text-xs font-mono tabular-nums text-right text-text-secondary\">\n {fmtMin(metric?.work.p99 ?? null)}\n </span>\n\n {/* Load mini-bar */}\n <div className=\"flex items-center gap-2\">\n <div className=\"w-12 h-1.5 bg-surface-sunken rounded-full overflow-hidden shrink-0\">\n <div className={`h-full rounded-full ${color}`} style={{ width: `${barWidth}%` }} />\n </div>\n <span\n className={`text-[10px] font-mono tabular-nums ${\n pct != null && pct > 100\n ? 'text-amber-500 font-semibold'\n : 'text-text-quaternary'\n }`}\n title={historical ? 'Throughput efficiency for the selected period' : undefined}\n >\n {pct != null ? `${pct}%${historical ? '↩' : ''}` : '—'}\n </span>\n </div>\n </div>\n\n {/* In-arrears sub-row */}\n {inArrears > 0 && (\n <div className=\"flex items-center gap-1.5 pb-2 pl-1\">\n <AlertTriangle className=\"w-3 h-3 text-red-400 shrink-0\" />\n <Link\n to={`/escalations/available?roles=${encodeURIComponent(JSON.stringify([role.role]))}&sort_by=created_at&order=asc`}\n className=\"text-[10px] text-red-400 hover:text-red-500 hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {inArrears} past SLA — view oldest first →\n </Link>\n </div>\n )}\n </>\n );\n}\n\n// ── Table header ──────────────────────────────────────────────────────────────\n\nfunction TableHead() {\n const cols = ['ROLE', 'TARGET/H', 'PENDING', 'ACTIVE', 'RESOLVED', 'P99 WAIT', 'P99 WORK', 'TREND'];\n return (\n <div\n className=\"grid items-center gap-4 py-1.5 border-b border-surface-border mb-0.5\"\n style={{ gridTemplateColumns: '1fr 64px 56px 56px 60px 72px 72px 104px' }}\n >\n {cols.map((col, i) => (\n <span\n key={col}\n className={`text-[9px] font-semibold uppercase tracking-wider text-text-quaternary ${\n i > 0 && i < 7 ? 'text-right' : ''\n }`}\n >\n {col}\n </span>\n ))}\n </div>\n );\n}\n\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function OperationsPage() {\n const [period, setPeriod] = useState<Period>('24h');\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n\n // Push-driven refresh: every escalation event invalidates ['stationMetrics']\n // through the central event system (debounced, transport-agnostic). The\n // header's refresh button covers user-initiated reloads.\n useStationMetricsEvents();\n\n const { data: roleData, isLoading: rolesLoading, refetch: refetchRoles } = useRoleDetails();\n const {\n data: metricsData,\n isLoading: metricsLoading,\n refetch: refetchMetrics,\n } = useStationMetrics(period);\n\n const roles = roleData?.roles ?? [];\n const metrics = metricsData?.stations ?? [];\n\n // BFS-ordered stations with exact depth tracked\n const ordered = useMemo((): OrderedStation[] => topoSort(roles), [roles]);\n\n const chartStations = useMemo(\n (): ChartStation[] =>\n ordered.map(({ role: r }) => ({\n role: r.role,\n title: r.title,\n parent_role: r.parent_role,\n target_per_hour: r.target_per_hour ?? null,\n metric: metrics.find((m) => m.role === r.role),\n })),\n [ordered, metrics],\n );\n\n const selectedRoleDetail =\n ordered.find(({ role }) => role.role === selectedRole)?.role ?? null;\n\n const isLoading = rolesLoading || metricsLoading;\n\n const handleRefresh = async () => {\n setRefreshing(true);\n await Promise.all([refetchRoles(), refetchMetrics()]);\n setRefreshing(false);\n };\n\n const handleSelect = (role: string) =>\n setSelectedRole((prev) => (prev === role ? null : role));\n\n const periodSelector = (\n <div className=\"flex items-center gap-0.5\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => setPeriod(p)}\n className={`px-2.5 py-1 text-[10px] font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n );\n\n return (\n <div className=\"flex flex-col flex-1 min-h-0\">\n <PageHeader\n title=\"Operations\"\n docsHash=\"#docs:dashboard.md:operations\"\n center={periodSelector}\n actions={\n <div className=\"flex items-center gap-3\">\n <button\n onClick={handleRefresh}\n disabled={refreshing}\n className=\"text-text-quaternary hover:text-text-secondary transition-colors disabled:opacity-40\"\n >\n <RefreshCw className={`w-3.5 h-3.5 ${refreshing ? 'animate-spin' : ''}`} />\n </button>\n <Link to=\"/admin/roles\" className=\"btn-secondary text-xs\">\n Configure\n </Link>\n </div>\n }\n />\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-6 mt-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-64 bg-surface-sunken rounded w-full\" />\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-8 bg-surface-sunken rounded w-full\" />\n ))}\n </div>\n </div>\n ) : ordered.length === 0 ? (\n <div className=\"mt-8\">\n <p className=\"text-sm text-text-secondary mb-2\">Stations appear here once roles are marked visible in Operations.</p>\n <p className=\"text-xs text-text-tertiary\">\n Go to{' '}\n <Link to=\"/admin/roles\" className=\"text-accent hover:underline\">\n Roles\n </Link>{' '}\n and enable <strong>Visible in Operations</strong> on roles that represent pipeline\n stations.\n </p>\n </div>\n ) : (\n /* Console layout: fixed header (above) → flexible middle → fixed table (30vh) */\n <div className=\"flex flex-col flex-1 min-h-0\">\n\n {/* Middle row: flexible height — SVG fills left, sidebar fixed-width right */}\n <div className=\"flex-1 min-h-0 flex items-stretch overflow-hidden\">\n {/* SVG chart — scales to fill available space */}\n <div className=\"flex-1 min-w-0 min-h-0 flex flex-col justify-center overflow-hidden p-4\">\n <PaceChart\n stations={chartStations}\n selectedRole={selectedRole}\n onSelect={handleSelect}\n periodHours={PERIOD_HOURS[period]}\n />\n </div>\n {/* Vertical divider */}\n <div className=\"w-px bg-surface-border shrink-0 self-stretch\" />\n {/* Right sidebar — fixed width, scrolls its own content */}\n <StationDetailPanel\n role={selectedRoleDetail}\n allMetrics={metrics}\n orderedRoles={ordered.map((o) => o.role)}\n globalPeriod={period}\n onClose={() => setSelectedRole(null)}\n />\n </div>\n\n {/* Bottom row: fixed 30vh — table header sticky, rows scroll */}\n <div className=\"h-[30vh] flex-none flex flex-col border-t border-surface-border overflow-hidden\">\n <TableHead />\n <div className=\"flex-1 min-h-0 overflow-y-auto divide-y divide-surface-border/30\">\n {ordered.map(({ role }) => (\n <StationRow\n key={role.role}\n role={role}\n metric={metrics.find((m) => m.role === role.role)}\n selected={selectedRole === role.role}\n onClick={() => handleSelect(role.role)}\n />\n ))}\n </div>\n </div>\n\n </div>\n )}\n </div>\n );\n}\n"],"names":["W","H","ML","MR","MT","MB","chartW","chartH","bottom","right","EASE","linePath","pts","p","i","catmullPath","segs","p0","p1","p2","p3","cp1x","cp1y","cp2x","cp2y","compact","n","last","a","paceColor","ratio","ACTIVE_COLOR","MIN_GAP","spreadLabels","labels","sorted","b","prev","l","labelY","PaceChart","stations","selectedRole","onSelect","periodHours","hoveredIdx","setHoveredIdx","useState","xOf","xMap","rows","target","expected","_a","_b","_c","_d","hasTargets","r","maxVal","yScale","v","withTarget","targetPts","actualPts","activePts","targetLinePath","actualSplinePath","activeSplinePath","lastActual","lastTarget","lastActive","areaPath","endLabels","px","cx","jsx","tp","ap","ar","row","s","x","cy","stroke","isSelected","isHovered","tooltip","tipW","tipX","tipY","jsxs","PERIODS","isPeriod","fmt","min","MetricRow","label","value","PeriodSelector","period","onChange","RoleView","role","globalPeriod","onClose","setPeriod","data","useStationMetrics","metric","slaMinutes","targetPerHour","workerCount","Fragment","X","Link","ExternalLink","OverviewPanel","allMetrics","orderedRoles","totalPending","m","totalResolved","totalArrears","metricByRole","stationsAtRisk","stationsWithLoad","pending","claimed","resolved","inArrears","hasAlert","hasLoad","StationDetailPanel","PERIOD_HOURS","topoSort","roles","opsRoles","roleMap","result","visited","queue","item","fmtMin","loadBar","throughputPct","pct","color","StationRow","selected","onClick","historical","barWidth","e","AlertTriangle","TableHead","cols","col","OperationsPage","setSelectedRole","refreshing","setRefreshing","useStationMetricsEvents","roleData","rolesLoading","refetchRoles","useRoleDetails","metricsData","metricsLoading","refetchMetrics","metrics","ordered","useMemo","chartStations","selectedRoleDetail","isLoading","handleRefresh","handleSelect","periodSelector","PageHeader","RefreshCw","o"],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import{a as c,j as e}from"./vendor-query-B2UbickB.js";import{b as X,e as Y,f as Z,d as ee,g as te,h as se}from"./roles-bRgaMcdy.js";import{J as T}from"./index-CtDf8vvQ.js";import{C as ae}from"./ConfirmDeleteModal-D9_1b4MW.js";import{T as q,ah as re,v as L,V as ne,p as le,k as oe,g as $,as as ie,N as ce}from"./vendor-icons-C1zVP_dv.js";import{e as de,c as me}from"./vendor-react-CXumBFUA.js";import"./Modal-CSrxpXeM.js";function I(a){return a==null?"":JSON.stringify(a,null,2)}function _(a){const d=a.trim();if(!d)return{ok:!0,value:void 0};try{const o=JSON.parse(d);return typeof o!="object"||Array.isArray(o)||o===null?{ok:!1}:{ok:!0,value:o}}catch{return{ok:!1}}}function h({icon:a,color:d,label:o,aside:f}){return e.jsxs("div",{className:"flex items-center justify-between mb-3 pb-2 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(a,{className:`w-4 h-4 ${d}`,strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:o})]}),f]})}function xe({role:a,allRoles:d}){const{data:o}=ee(),f=te(),j=se(),[x,p]=c.useState(""),t=(o==null?void 0:o.chains)??[],r=c.useMemo(()=>t.filter(l=>l.source_role===a.role).map(l=>l.target_role),[t,a.role]),N=c.useMemo(()=>d.map(l=>l.role).filter(l=>l!==a.role&&l!=="superadmin"&&!r.includes(l)),[d,a.role,r]);return a.role==="superadmin"?e.jsx("p",{className:"text-[11px] text-text-tertiary",children:"Superadmins can escalate to any role implicitly."}):e.jsxs("div",{className:"space-y-3",children:[r.length===0?e.jsx("p",{className:"text-[11px] text-text-tertiary",children:"Add a target role to route hand-offs."}):e.jsx("div",{className:"flex flex-wrap gap-1.5",children:r.map(l=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] bg-surface-sunken rounded font-mono text-text-secondary",children:[l,e.jsx("button",{onClick:()=>j.mutate({source_role:a.role,target_role:l}),className:"text-text-quaternary hover:text-red-400 transition-colors leading-none ml-0.5",children:"×"})]},l))}),N.length>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:x,onChange:l=>p(l.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Add target…"}),N.map(l=>e.jsx("option",{value:l,children:l},l))]}),e.jsx("button",{onClick:()=>{x&&f.mutate({source_role:a.role,target_role:x},{onSuccess:()=>p("")})},disabled:!x||f.isPending,className:"px-2.5 py-1 text-xs rounded bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0",children:f.isPending?"…":"Add"})]})]})}function pe(a){return{title:a.title??"",description:a.description??"",ops_visible:a.ops_visible,parent_role:a.parent_role??"",form_schema:I(a.form_schema),metadata_schema:I(a.metadata_schema),properties:I(a.properties)||"{}",sla_minutes:a.sla_minutes!=null?String(a.sla_minutes):"",target_per_hour:a.target_per_hour!=null?String(a.target_per_hour):"",worker_count:a.worker_count!=null?String(a.worker_count):""}}function Ne(){const{role:a}=de(),d=me(),{data:o,isLoading:f}=X(),j=Y(),x=Z(),p=(o==null?void 0:o.roles)??[],t=p.find(s=>s.role===a),[r,N]=c.useState({title:"",description:"",ops_visible:!1,parent_role:"",form_schema:"",metadata_schema:"",properties:"{}",sla_minutes:"",target_per_hour:"",worker_count:""}),[l,E]=c.useState(!1),[V,k]=c.useState(!1),[v,b]=c.useState({}),[W,M]=c.useState(!1),[g,J]=c.useState(new Set),R=s=>J(n=>new Set([...n,s]));c.useEffect(()=>{t&&(N(pe(t)),E(!1),k(!1),b({}),J(new Set))},[a,t==null?void 0:t.role]);const u=s=>{N(n=>({...n,...s})),E(!0),k(!1)},B=c.useMemo(()=>p.filter(s=>{if(!t||s.role===t.role)return!1;let n=s;const i=new Set;for(;n!=null&&n.parent_role;){if(n.parent_role===t.role)return!1;if(i.has(n.parent_role))break;i.add(n.parent_role),n=p.find(m=>m.role===n.parent_role)}return!0}),[p,t]),U=()=>{const s=_(r.form_schema),n=_(r.metadata_schema),i=_(r.properties),m={};if(s.ok||(m.form_schema="Invalid JSON"),n.ok||(m.metadata_schema="Invalid JSON"),i.ok||(m.properties="Invalid JSON"),b(m),Object.keys(m).length||!t)return;const w=A=>{const y=parseFloat(A);return isNaN(y)?null:y},Q=A=>{const y=w(A);return y==null?null:Math.round(y)};j.mutate({role:t.role,title:r.title.trim()||null,description:r.description.trim()||null,ops_visible:r.ops_visible,parent_role:r.parent_role||null,form_schema:s.value??null,metadata_schema:n.value??null,properties:i.value??{},sla_minutes:w(r.sla_minutes),target_per_hour:w(r.target_per_hour),worker_count:Q(r.worker_count)},{onSuccess:()=>{E(!1),k(!0),J(new Set),window.setTimeout(()=>k(!1),2500)}})},H=()=>{t&&x.mutate(t.role,{onSuccess:()=>d("/admin/roles")})};if(f)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-64 bg-surface-sunken rounded"})]});if(!t)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 text-center",children:[e.jsx(q,{className:"w-12 h-12 text-text-quaternary mb-4",strokeWidth:1}),e.jsx("h2",{className:"text-lg font-medium text-text-primary mb-2",children:"Role not found"})]});const K=t.user_count>0||t.chain_count>0||t.workflow_count>0,G=l&&!Object.values(v).some(Boolean),S=parseFloat(r.sla_minutes),C=parseFloat(r.target_per_hour),O=parseFloat(r.worker_count),P=!isNaN(S)&&S>0,D=!isNaN(C)&&C>0,F=!isNaN(O)&&O>0,z=P&&F&&!D?`→ target ≈ ${(O/(S/60)).toFixed(1)}/h`:P&&D&&!F?`→ workers ≈ ${(C*(S/60)).toFixed(1)}`:D&&F&&!P?`→ SLA ≈ ${(O/C*60).toFixed(0)}m`:null;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-start justify-between mb-10",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3 mb-1",children:[e.jsx(q,{className:"w-5 h-5 text-accent",strokeWidth:1.5}),e.jsx("h1",{className:"text-lg font-mono font-medium text-text-primary",children:t.role}),t.ops_visible&&e.jsxs("span",{className:"inline-flex items-center gap-0.5 text-[9px] font-bold uppercase tracking-wider text-accent",children:[e.jsx(re,{className:"w-2.5 h-2.5"})," ops"]}),t.parent_role&&e.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-text-quaternary font-mono",children:[e.jsx(L,{className:"w-3 h-3"})," ",t.parent_role]})]}),t.title&&e.jsx("p",{className:"text-sm text-text-secondary pl-8",children:t.title})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[V&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-status-success animate-page-enter",children:[e.jsx(ne,{className:"w-3 h-3"})," Saved"]}),j.error&&e.jsx("span",{className:"text-xs text-status-error max-w-[180px] truncate",children:j.error.message}),e.jsx("button",{onClick:U,disabled:!G||j.isPending,className:"px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed",children:j.isPending?"Saving…":"Save Role"}),!K&&e.jsxs("button",{onClick:()=>M(!0),className:"px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors flex items-center gap-1",children:[e.jsx(le,{className:"w-3 h-3"})," Delete"]})]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-16 items-start",children:[e.jsxs("div",{className:"space-y-14",children:[e.jsxs("div",{className:"space-y-8",children:[e.jsx(h,{icon:q,color:"text-accent",label:"Identity"}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Display Name"}),e.jsx("input",{type:"text",value:r.title,onChange:s=>u({title:s.target.value}),placeholder:`e.g., ${t.role.charAt(0).toUpperCase()+t.role.slice(1)}`,className:"input text-sm w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Description"}),e.jsx("textarea",{value:r.description,onChange:s=>u({description:s.target.value}),placeholder:"A short description shown on role cards and in the operations view.",rows:4,className:"input text-sm w-full resize-none"})]})]}),e.jsxs("div",{className:"space-y-5",children:[e.jsx(h,{icon:L,color:"text-text-tertiary",label:"Prior Step"}),e.jsxs("select",{value:r.parent_role,onChange:s=>u({parent_role:s.target.value}),className:"select text-sm w-full font-mono",children:[e.jsx("option",{value:"",children:"None — root process"}),B.map(s=>e.jsx("option",{value:s.role,children:s.title?`${s.role} — ${s.title}`:s.role},s.role))]})]}),e.jsxs("div",{children:[e.jsx(h,{icon:oe,color:"text-text-tertiary",label:"Ops View"}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("p",{className:"text-[10px] text-text-tertiary",children:"Show as station on /operations"}),e.jsx("button",{onClick:()=>u({ops_visible:!r.ops_visible}),className:`w-9 h-5 rounded-full transition-colors relative shrink-0 ${r.ops_visible?"bg-accent":"bg-surface-border"}`,children:e.jsx("span",{className:`absolute top-[3px] left-0 w-3.5 h-3.5 rounded-full bg-white transition-transform shadow ${r.ops_visible?"translate-x-[18px]":"translate-x-[3px]"}`})})]})]}),e.jsxs("div",{children:[e.jsx(h,{icon:$,color:"text-text-quaternary",label:"Properties",aside:!g.has("properties")&&t.properties&&Object.keys(t.properties).length>0?e.jsx("button",{onClick:()=>R("properties"),className:"text-[9px] text-accent hover:underline",children:"Edit"}):e.jsx("span",{className:"text-[9px] font-normal normal-case text-text-quaternary",children:"custom JSON"})}),!g.has("properties")&&t.properties&&Object.keys(t.properties).length>0?e.jsx(T,{data:t.properties,defaultCollapsed:!0}):e.jsxs(e.Fragment,{children:[e.jsx("textarea",{value:r.properties,onChange:s=>{const n=s.target.value;u({properties:n}),b(i=>({...i,properties:_(n).ok?void 0:"Invalid JSON"}))},rows:5,spellCheck:!1,className:"input text-xs font-mono w-full resize-none",placeholder:`{
|
|
2
|
-
"icon": "wrench",
|
|
3
|
-
"color": "#6366f1"
|
|
4
|
-
}`}),v.properties&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:v.properties})]})]})]}),e.jsxs("div",{className:"space-y-14",children:[e.jsx(h,{icon:ie,color:"text-amber-400",label:"Capacity",aside:e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-quaternary",children:"throughput = workers / (sla / 60)"})}),e.jsx("div",{className:"grid grid-cols-3 gap-3",children:[{key:"sla_minutes",label:"SLA",unit:"min",placeholder:"30"},{key:"target_per_hour",label:"Target",unit:"/h",placeholder:"20"},{key:"worker_count",label:"Workers",unit:"",placeholder:"4"}].map(({key:s,label:n,unit:i,placeholder:m})=>e.jsxs("div",{children:[e.jsxs("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:[n,i&&e.jsx("span",{className:"normal-case font-normal ml-1 text-text-quaternary",children:i})]}),e.jsx("input",{type:"number",min:"0",step:"any",value:r[s],onChange:w=>u({[s]:w.target.value}),placeholder:m,className:"input text-sm w-full font-mono"})]},s))}),z&&e.jsx("p",{className:"text-[10px] text-accent font-mono",children:z}),e.jsxs("div",{className:"pt-3 pb-4 border-t border-surface-border/40",children:[e.jsx(h,{icon:ce,color:"text-text-quaternary",label:"Escalation Targets",aside:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-emerald-500"}),e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-widest text-emerald-600",children:"Live"})]})}),e.jsx(xe,{role:t,allRoles:p})]})]}),e.jsxs("div",{className:"space-y-14",children:[e.jsxs("div",{children:[e.jsx(h,{icon:$,color:"text-cyan-400",label:"Form Schema",aside:!g.has("form_schema")&&t.form_schema?e.jsx("button",{onClick:()=>R("form_schema"),className:"text-[9px] text-accent hover:underline",children:"Edit"}):void 0}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mb-3 leading-relaxed",children:["Resolver form JSON Schema. Overrideable per workflow via ",e.jsx("code",{className:"font-mono",children:"resolver_schema"}),"."]}),!g.has("form_schema")&&t.form_schema?e.jsx(T,{data:t.form_schema}):e.jsxs(e.Fragment,{children:[e.jsx("textarea",{value:r.form_schema,onChange:s=>{const n=s.target.value;u({form_schema:n}),b(i=>({...i,form_schema:_(n).ok?void 0:"Invalid JSON"}))},rows:10,spellCheck:!1,className:"input text-xs font-mono w-full resize-y",placeholder:`{
|
|
5
|
-
"type": "object",
|
|
6
|
-
"properties": {
|
|
7
|
-
"notes": { "type": "string" }
|
|
8
|
-
}
|
|
9
|
-
}`}),v.form_schema&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:v.form_schema})]})]}),e.jsxs("div",{children:[e.jsx(h,{icon:$,color:"text-violet-400",label:"Metadata Schema",aside:!g.has("metadata_schema")&&t.metadata_schema?e.jsx("button",{onClick:()=>R("metadata_schema"),className:"text-[9px] text-accent hover:underline",children:"Edit"}):void 0}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mb-3 leading-relaxed",children:["Validates ",e.jsx("code",{className:"font-mono",children:"metadata"})," at creation time. Keys appear in faceted search autocomplete."]}),!g.has("metadata_schema")&&t.metadata_schema?e.jsx(T,{data:t.metadata_schema}):e.jsxs(e.Fragment,{children:[e.jsx("textarea",{value:r.metadata_schema,onChange:s=>{const n=s.target.value;u({metadata_schema:n}),b(i=>({...i,metadata_schema:_(n).ok?void 0:"Invalid JSON"}))},rows:10,spellCheck:!1,className:"input text-xs font-mono w-full resize-y",placeholder:`{
|
|
10
|
-
"type": "object",
|
|
11
|
-
"properties": {
|
|
12
|
-
"order_id": { "type": "string" }
|
|
13
|
-
},
|
|
14
|
-
"required": ["order_id"]
|
|
15
|
-
}`}),v.metadata_schema&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:v.metadata_schema})]})]})]})]}),e.jsx(ae,{open:W,onClose:()=>M(!1),onConfirm:H,title:"Delete Role",description:e.jsxs(e.Fragment,{children:["Delete role ",e.jsx("span",{className:"font-medium font-mono text-text-primary",children:t.role}),"? This cannot be undone."]}),isPending:x.isPending,error:x.error})]})}export{Ne as RoleDetailPage};
|
|
16
|
-
//# sourceMappingURL=RoleDetailPage-BB_e330f.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RoleDetailPage-BB_e330f.js","sources":["../../src/pages/admin/roles/RoleDetailPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n Tag, GitBranch, Eye, Network, Trash2, Check, Braces, Triangle, Settings2,\n} from 'lucide-react';\nimport {\n useRoleDetails,\n useUpdateRole,\n useDeleteRole,\n useEscalationChains,\n useAddEscalationChain,\n useRemoveEscalationChain,\n type RoleDetail,\n} from '../../../api/roles';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction safePrettyPrint(value: unknown): string {\n if (value == null) return '';\n return JSON.stringify(value, null, 2);\n}\n\nfunction safeParseJson(text: string): { ok: boolean; value?: Record<string, unknown> } {\n const trimmed = text.trim();\n if (!trimmed) return { ok: true, value: undefined };\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed !== 'object' || Array.isArray(parsed) || parsed === null) return { ok: false };\n return { ok: true, value: parsed };\n } catch {\n return { ok: false };\n }\n}\n\n// ── Section header ────────────────────────────────────────────────────────────\n\nfunction SectionHead({\n icon: Icon,\n color,\n label,\n aside,\n}: {\n icon: React.ElementType;\n color: string;\n label: string;\n aside?: React.ReactNode;\n}) {\n return (\n <div className=\"flex items-center justify-between mb-3 pb-2 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <Icon className={`w-4 h-4 ${color}`} strokeWidth={1.5} />\n <h2 className=\"section-h2\">{label}</h2>\n </div>\n {aside}\n </div>\n );\n}\n\n// ── Escalation section (live-save) ────────────────────────────────────────────\n\nfunction EscalationSection({ role, allRoles }: { role: RoleDetail; allRoles: RoleDetail[] }) {\n const { data: chainsData } = useEscalationChains();\n const addChain = useAddEscalationChain();\n const removeChain = useRemoveEscalationChain();\n const [newTarget, setNewTarget] = useState('');\n\n const chains = chainsData?.chains ?? [];\n const targets = useMemo(\n () => chains.filter((c) => c.source_role === role.role).map((c) => c.target_role),\n [chains, role.role],\n );\n const available = useMemo(\n () => allRoles\n .map((r) => r.role)\n .filter((r) => r !== role.role && r !== 'superadmin' && !targets.includes(r)),\n [allRoles, role.role, targets],\n );\n\n if (role.role === 'superadmin') {\n return <p className=\"text-[11px] text-text-tertiary\">Superadmins can escalate to any role implicitly.</p>;\n }\n\n return (\n <div className=\"space-y-3\">\n {targets.length === 0 ? (\n <p className=\"text-[11px] text-text-tertiary\">Add a target role to route hand-offs.</p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {targets.map((t) => (\n <span\n key={t}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] bg-surface-sunken rounded font-mono text-text-secondary\"\n >\n {t}\n <button\n onClick={() => removeChain.mutate({ source_role: role.role, target_role: t })}\n className=\"text-text-quaternary hover:text-red-400 transition-colors leading-none ml-0.5\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newTarget}\n onChange={(e) => setNewTarget(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Add target…</option>\n {available.map((r) => <option key={r} value={r}>{r}</option>)}\n </select>\n <button\n onClick={() => {\n if (!newTarget) return;\n addChain.mutate({ source_role: role.role, target_role: newTarget }, { onSuccess: () => setNewTarget('') });\n }}\n disabled={!newTarget || addChain.isPending}\n className=\"px-2.5 py-1 text-xs rounded bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0\"\n >\n {addChain.isPending ? '…' : 'Add'}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Draft state ───────────────────────────────────────────────────────────────\n\ninterface Draft {\n title: string;\n description: string;\n ops_visible: boolean;\n parent_role: string;\n form_schema: string;\n metadata_schema: string;\n properties: string;\n sla_minutes: string;\n target_per_hour: string;\n worker_count: string;\n}\n\nfunction draftFrom(role: RoleDetail): Draft {\n return {\n title: role.title ?? '',\n description: role.description ?? '',\n ops_visible: role.ops_visible,\n parent_role: role.parent_role ?? '',\n form_schema: safePrettyPrint(role.form_schema),\n metadata_schema: safePrettyPrint(role.metadata_schema),\n properties: safePrettyPrint(role.properties) || '{}',\n sla_minutes: role.sla_minutes != null ? String(role.sla_minutes) : '',\n target_per_hour: role.target_per_hour != null ? String(role.target_per_hour) : '',\n worker_count: role.worker_count != null ? String(role.worker_count) : '',\n };\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function RoleDetailPage() {\n const { role: roleKey } = useParams<{ role: string }>();\n const navigate = useNavigate();\n const { data, isLoading } = useRoleDetails();\n const updateRole = useUpdateRole();\n const deleteRole = useDeleteRole();\n\n const roles = data?.roles ?? [];\n const role = roles.find((r) => r.role === roleKey);\n\n const [draft, setDraft] = useState<Draft>({\n title: '', description: '', ops_visible: false, parent_role: '',\n form_schema: '', metadata_schema: '', properties: '{}',\n sla_minutes: '', target_per_hour: '', worker_count: '',\n });\n const [dirty, setDirty] = useState(false);\n const [savedOk, setSavedOk] = useState(false);\n const [errors, setErrors] = useState<{ form_schema?: string; metadata_schema?: string; properties?: string }>({});\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [editingJson, setEditingJson] = useState(new Set<string>());\n\n const startEditingJson = (field: string) => setEditingJson((prev) => new Set([...prev, field]));\n\n useEffect(() => {\n if (!role) return;\n setDraft(draftFrom(role));\n setDirty(false);\n setSavedOk(false);\n setErrors({});\n setEditingJson(new Set());\n }, [roleKey, role?.role]);\n\n const update = (changes: Partial<Draft>) => {\n setDraft((d) => ({ ...d, ...changes }));\n setDirty(true);\n setSavedOk(false);\n };\n\n const availableParents = useMemo(\n () => roles.filter((r) => {\n if (!role || r.role === role.role) return false;\n let cur: RoleDetail | undefined = r;\n const seen = new Set<string>();\n while (cur?.parent_role) {\n if (cur.parent_role === role.role) return false;\n if (seen.has(cur.parent_role)) break;\n seen.add(cur.parent_role);\n cur = roles.find((x) => x.role === cur!.parent_role);\n }\n return true;\n }),\n [roles, role],\n );\n\n const handleSave = () => {\n const formResult = safeParseJson(draft.form_schema);\n const metaResult = safeParseJson(draft.metadata_schema);\n const propsResult = safeParseJson(draft.properties);\n const newErrors: typeof errors = {};\n if (!formResult.ok) newErrors.form_schema = 'Invalid JSON';\n if (!metaResult.ok) newErrors.metadata_schema = 'Invalid JSON';\n if (!propsResult.ok) newErrors.properties = 'Invalid JSON';\n setErrors(newErrors);\n if (Object.keys(newErrors).length || !role) return;\n\n const parseNum = (s: string) => { const v = parseFloat(s); return isNaN(v) ? null : v; };\n // Staff counts are whole people/machines — round rather than persist 2.5 workers.\n const parseCount = (s: string) => { const v = parseNum(s); return v == null ? null : Math.round(v); };\n\n updateRole.mutate(\n {\n role: role.role,\n title: draft.title.trim() || null,\n description: draft.description.trim() || null,\n ops_visible: draft.ops_visible,\n parent_role: draft.parent_role || null,\n form_schema: formResult.value ?? null,\n metadata_schema: metaResult.value ?? null,\n properties: propsResult.value ?? {},\n sla_minutes: parseNum(draft.sla_minutes),\n target_per_hour: parseNum(draft.target_per_hour),\n worker_count: parseCount(draft.worker_count),\n },\n {\n onSuccess: () => {\n setDirty(false);\n setSavedOk(true);\n setEditingJson(new Set());\n window.setTimeout(() => setSavedOk(false), 2500);\n },\n },\n );\n };\n\n const handleDelete = () => {\n if (!role) return;\n deleteRole.mutate(role.role, { onSuccess: () => navigate('/admin/roles') });\n };\n\n // ── Loading / not found ───────────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-4 bg-surface-sunken rounded w-64\" />\n <div className=\"h-64 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!role) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <Tag className=\"w-12 h-12 text-text-quaternary mb-4\" strokeWidth={1} />\n <h2 className=\"text-lg font-medium text-text-primary mb-2\">Role not found</h2>\n </div>\n );\n }\n\n const inUse = role.user_count > 0 || role.chain_count > 0 || role.workflow_count > 0;\n const canSave = dirty && !Object.values(errors).some(Boolean);\n\n // Any two capacity settings derive the third — hint the missing one.\n const sla = parseFloat(draft.sla_minutes);\n const tph = parseFloat(draft.target_per_hour);\n const wc = parseFloat(draft.worker_count);\n const slaOk = !isNaN(sla) && sla > 0;\n const tphOk = !isNaN(tph) && tph > 0;\n const wcOk = !isNaN(wc) && wc > 0;\n const derivedCapacityHint =\n slaOk && wcOk && !tphOk ? `→ target ≈ ${(wc / (sla / 60)).toFixed(1)}/h` :\n slaOk && tphOk && !wcOk ? `→ workers ≈ ${(tph * (sla / 60)).toFixed(1)}` :\n tphOk && wcOk && !slaOk ? `→ SLA ≈ ${(wc / tph * 60).toFixed(0)}m` : null;\n\n return (\n <div>\n {/* ── Header ── */}\n <div className=\"flex items-start justify-between mb-10\">\n <div>\n <div className=\"flex items-center gap-3 mb-1\">\n <Tag className=\"w-5 h-5 text-accent\" strokeWidth={1.5} />\n <h1 className=\"text-lg font-mono font-medium text-text-primary\">{role.role}</h1>\n {role.ops_visible && (\n <span className=\"inline-flex items-center gap-0.5 text-[9px] font-bold uppercase tracking-wider text-accent\">\n <Eye className=\"w-2.5 h-2.5\" /> ops\n </span>\n )}\n {role.parent_role && (\n <span className=\"flex items-center gap-1 text-[10px] text-text-quaternary font-mono\">\n <GitBranch className=\"w-3 h-3\" /> {role.parent_role}\n </span>\n )}\n </div>\n {role.title && <p className=\"text-sm text-text-secondary pl-8\">{role.title}</p>}\n </div>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n {savedOk && (\n <span className=\"flex items-center gap-1 text-xs text-status-success animate-page-enter\">\n <Check className=\"w-3 h-3\" /> Saved\n </span>\n )}\n {updateRole.error && (\n <span className=\"text-xs text-status-error max-w-[180px] truncate\">\n {(updateRole.error as Error).message}\n </span>\n )}\n <button\n onClick={handleSave}\n disabled={!canSave || updateRole.isPending}\n className=\"px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n {updateRole.isPending ? 'Saving…' : 'Save Role'}\n </button>\n {!inUse && (\n <button\n onClick={() => setConfirmDelete(true)}\n className=\"px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors flex items-center gap-1\"\n >\n <Trash2 className=\"w-3 h-3\" /> Delete\n </button>\n )}\n </div>\n </div>\n\n {/* ── Three-column body ── */}\n <div className=\"grid grid-cols-3 gap-16 items-start\">\n\n {/* ── Col 1: Identity ── */}\n <div className=\"space-y-14\">\n\n {/* Identity */}\n <div className=\"space-y-8\">\n <SectionHead icon={Tag} color=\"text-accent\" label=\"Identity\" />\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={draft.title}\n onChange={(e) => update({ title: e.target.value })}\n placeholder={`e.g., ${role.role.charAt(0).toUpperCase() + role.role.slice(1)}`}\n className=\"input text-sm w-full\"\n />\n </div>\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">\n Description\n </label>\n <textarea\n value={draft.description}\n onChange={(e) => update({ description: e.target.value })}\n placeholder=\"A short description shown on role cards and in the operations view.\"\n rows={4}\n className=\"input text-sm w-full resize-none\"\n />\n </div>\n </div>\n\n {/* Prior Step */}\n <div className=\"space-y-5\">\n <SectionHead icon={GitBranch} color=\"text-text-tertiary\" label=\"Prior Step\" />\n <select\n value={draft.parent_role}\n onChange={(e) => update({ parent_role: e.target.value })}\n className=\"select text-sm w-full font-mono\"\n >\n <option value=\"\">None — root process</option>\n {availableParents.map((r) => (\n <option key={r.role} value={r.role}>\n {r.title ? `${r.role} — ${r.title}` : r.role}\n </option>\n ))}\n </select>\n </div>\n\n {/* Ops View */}\n <div>\n <SectionHead icon={Settings2} color=\"text-text-tertiary\" label=\"Ops View\" />\n <div className=\"flex items-center justify-between\">\n <p className=\"text-[10px] text-text-tertiary\">Show as station on /operations</p>\n <button\n onClick={() => update({ ops_visible: !draft.ops_visible })}\n className={`w-9 h-5 rounded-full transition-colors relative shrink-0 ${\n draft.ops_visible ? 'bg-accent' : 'bg-surface-border'\n }`}\n >\n <span\n className={`absolute top-[3px] left-0 w-3.5 h-3.5 rounded-full bg-white transition-transform shadow ${\n draft.ops_visible ? 'translate-x-[18px]' : 'translate-x-[3px]'\n }`}\n />\n </button>\n </div>\n </div>\n\n {/* Properties (free bag) */}\n <div>\n <SectionHead\n icon={Braces}\n color=\"text-text-quaternary\"\n label=\"Properties\"\n aside={\n !editingJson.has('properties') && role.properties && Object.keys(role.properties).length > 0 ? (\n <button onClick={() => startEditingJson('properties')} className=\"text-[9px] text-accent hover:underline\">Edit</button>\n ) : (\n <span className=\"text-[9px] font-normal normal-case text-text-quaternary\">custom JSON</span>\n )\n }\n />\n {!editingJson.has('properties') && role.properties && Object.keys(role.properties).length > 0 ? (\n <JsonViewer data={role.properties} defaultCollapsed />\n ) : (\n <>\n <textarea\n value={draft.properties}\n onChange={(e) => {\n const val = e.target.value;\n update({ properties: val });\n setErrors((prev) => ({ ...prev, properties: safeParseJson(val).ok ? undefined : 'Invalid JSON' }));\n }}\n rows={5}\n spellCheck={false}\n className=\"input text-xs font-mono w-full resize-none\"\n placeholder={'{\\n \"icon\": \"wrench\",\\n \"color\": \"#6366f1\"\\n}'}\n />\n {errors.properties && <p className=\"text-[10px] text-status-error mt-1\">{errors.properties}</p>}\n </>\n )}\n </div>\n </div>\n\n {/* ── Col 2: Operations Config ── */}\n <div className=\"space-y-14\">\n <SectionHead\n icon={Triangle}\n color=\"text-amber-400\"\n label=\"Capacity\"\n aside={\n <span className=\"text-[9px] font-semibold uppercase tracking-widest text-text-quaternary\">\n throughput = workers / (sla / 60)\n </span>\n }\n />\n\n <div className=\"grid grid-cols-3 gap-3\">\n {[\n { key: 'sla_minutes' as const, label: 'SLA', unit: 'min', placeholder: '30' },\n { key: 'target_per_hour' as const, label: 'Target', unit: '/h', placeholder: '20' },\n { key: 'worker_count' as const, label: 'Workers', unit: '', placeholder: '4' },\n ].map(({ key, label, unit, placeholder }) => (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">\n {label}\n {unit && <span className=\"normal-case font-normal ml-1 text-text-quaternary\">{unit}</span>}\n </label>\n <input\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={draft[key]}\n onChange={(e) => update({ [key]: e.target.value })}\n placeholder={placeholder}\n className=\"input text-sm w-full font-mono\"\n />\n </div>\n ))}\n </div>\n {derivedCapacityHint && (\n <p className=\"text-[10px] text-accent font-mono\">{derivedCapacityHint}</p>\n )}\n\n {/* Escalation targets — live */}\n <div className=\"pt-3 pb-4 border-t border-surface-border/40\">\n <SectionHead\n icon={Network}\n color=\"text-text-quaternary\"\n label=\"Escalation Targets\"\n aside={\n <div className=\"flex items-center gap-1\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-500\" />\n <span className=\"text-[9px] font-semibold uppercase tracking-widest text-emerald-600\">Live</span>\n </div>\n }\n />\n <EscalationSection role={role} allRoles={roles} />\n </div>\n </div>\n\n {/* ── Col 3: Schemas ── */}\n <div className=\"space-y-14\">\n {/* Form Schema */}\n <div>\n <SectionHead\n icon={Braces}\n color=\"text-cyan-400\"\n label=\"Form Schema\"\n aside={\n !editingJson.has('form_schema') && role.form_schema ? (\n <button onClick={() => startEditingJson('form_schema')} className=\"text-[9px] text-accent hover:underline\">Edit</button>\n ) : undefined\n }\n />\n <p className=\"text-[10px] text-text-tertiary mb-3 leading-relaxed\">\n Resolver form JSON Schema. Overrideable per workflow via <code className=\"font-mono\">resolver_schema</code>.\n </p>\n {!editingJson.has('form_schema') && role.form_schema ? (\n <JsonViewer data={role.form_schema} />\n ) : (\n <>\n <textarea\n value={draft.form_schema}\n onChange={(e) => {\n const val = e.target.value;\n update({ form_schema: val });\n setErrors((prev) => ({ ...prev, form_schema: safeParseJson(val).ok ? undefined : 'Invalid JSON' }));\n }}\n rows={10}\n spellCheck={false}\n className=\"input text-xs font-mono w-full resize-y\"\n placeholder={'{\\n \"type\": \"object\",\\n \"properties\": {\\n \"notes\": { \"type\": \"string\" }\\n }\\n}'}\n />\n {errors.form_schema && <p className=\"text-[10px] text-status-error mt-1\">{errors.form_schema}</p>}\n </>\n )}\n </div>\n\n {/* Metadata Schema */}\n <div>\n <SectionHead\n icon={Braces}\n color=\"text-violet-400\"\n label=\"Metadata Schema\"\n aside={\n !editingJson.has('metadata_schema') && role.metadata_schema ? (\n <button onClick={() => startEditingJson('metadata_schema')} className=\"text-[9px] text-accent hover:underline\">Edit</button>\n ) : undefined\n }\n />\n <p className=\"text-[10px] text-text-tertiary mb-3 leading-relaxed\">\n Validates <code className=\"font-mono\">metadata</code> at creation time. Keys appear in faceted search autocomplete.\n </p>\n {!editingJson.has('metadata_schema') && role.metadata_schema ? (\n <JsonViewer data={role.metadata_schema} />\n ) : (\n <>\n <textarea\n value={draft.metadata_schema}\n onChange={(e) => {\n const val = e.target.value;\n update({ metadata_schema: val });\n setErrors((prev) => ({ ...prev, metadata_schema: safeParseJson(val).ok ? undefined : 'Invalid JSON' }));\n }}\n rows={10}\n spellCheck={false}\n className=\"input text-xs font-mono w-full resize-y\"\n placeholder={'{\\n \"type\": \"object\",\\n \"properties\": {\\n \"order_id\": { \"type\": \"string\" }\\n },\\n \"required\": [\"order_id\"]\\n}'}\n />\n {errors.metadata_schema && <p className=\"text-[10px] text-status-error mt-1\">{errors.metadata_schema}</p>}\n </>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Delete confirmation ── */}\n <ConfirmDeleteModal\n open={confirmDelete}\n onClose={() => setConfirmDelete(false)}\n onConfirm={handleDelete}\n title=\"Delete Role\"\n description={\n <>\n Delete role <span className=\"font-medium font-mono text-text-primary\">{role.role}</span>? This cannot be undone.\n </>\n }\n isPending={deleteRole.isPending}\n error={deleteRole.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["safePrettyPrint","value","safeParseJson","text","trimmed","parsed","SectionHead","Icon","color","label","aside","jsxs","jsx","EscalationSection","role","allRoles","chainsData","useEscalationChains","addChain","useAddEscalationChain","removeChain","useRemoveEscalationChain","newTarget","setNewTarget","useState","chains","targets","useMemo","c","available","r","t","e","draftFrom","RoleDetailPage","roleKey","useParams","navigate","useNavigate","data","isLoading","useRoleDetails","updateRole","useUpdateRole","deleteRole","useDeleteRole","roles","draft","setDraft","dirty","setDirty","savedOk","setSavedOk","errors","setErrors","confirmDelete","setConfirmDelete","editingJson","setEditingJson","startEditingJson","field","prev","useEffect","update","changes","d","availableParents","cur","seen","x","handleSave","formResult","metaResult","propsResult","newErrors","parseNum","s","v","parseCount","handleDelete","Tag","inUse","canSave","sla","tph","wc","slaOk","tphOk","wcOk","derivedCapacityHint","Eye","GitBranch","Check","Trash2","Settings2","Braces","JsonViewer","Fragment","val","Triangle","key","unit","placeholder","Network","ConfirmDeleteModal"],"mappings":"qaAmBA,SAASA,EAAgBC,EAAwB,CAC/C,OAAIA,GAAS,KAAa,GACnB,KAAK,UAAUA,EAAO,KAAM,CAAC,CACtC,CAEA,SAASC,EAAcC,EAAgE,CACrF,MAAMC,EAAUD,EAAK,KAAA,EACrB,GAAI,CAACC,EAAS,MAAO,CAAE,GAAI,GAAM,MAAO,MAAA,EACxC,GAAI,CACF,MAAMC,EAAS,KAAK,MAAMD,CAAO,EACjC,OAAI,OAAOC,GAAW,UAAY,MAAM,QAAQA,CAAM,GAAKA,IAAW,KAAa,CAAE,GAAI,EAAA,EAClF,CAAE,GAAI,GAAM,MAAOA,CAAA,CAC5B,MAAQ,CACN,MAAO,CAAE,GAAI,EAAA,CACf,CACF,CAIA,SAASC,EAAY,CACnB,KAAMC,EACN,MAAAC,EACA,MAAAC,EACA,MAAAC,CACF,EAKG,CACD,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,6EACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,MAACL,GAAK,UAAW,WAAWC,CAAK,GAAI,YAAa,IAAK,EACvDI,EAAAA,IAAC,KAAA,CAAG,UAAU,aAAc,SAAAH,CAAA,CAAM,CAAA,EACpC,EACCC,CAAA,EACH,CAEJ,CAIA,SAASG,GAAkB,CAAE,KAAAC,EAAM,SAAAC,GAA0D,CAC3F,KAAM,CAAE,KAAMC,CAAA,EAAeC,GAAA,EACvBC,EAAWC,GAAA,EACXC,EAAcC,GAAA,EACd,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,EAAE,EAEvCC,GAAST,GAAA,YAAAA,EAAY,SAAU,CAAA,EAC/BU,EAAUC,EAAAA,QACd,IAAMF,EAAO,OAAQG,GAAMA,EAAE,cAAgBd,EAAK,IAAI,EAAE,IAAKc,GAAMA,EAAE,WAAW,EAChF,CAACH,EAAQX,EAAK,IAAI,CAAA,EAEde,EAAYF,EAAAA,QAChB,IAAMZ,EACH,IAAKe,GAAMA,EAAE,IAAI,EACjB,OAAQA,GAAMA,IAAMhB,EAAK,MAAQgB,IAAM,cAAgB,CAACJ,EAAQ,SAASI,CAAC,CAAC,EAC9E,CAACf,EAAUD,EAAK,KAAMY,CAAO,CAAA,EAG/B,OAAIZ,EAAK,OAAS,aACTF,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAiC,SAAA,mDAAgD,EAIrGD,EAAAA,KAAC,MAAA,CAAI,UAAU,YACZ,SAAA,CAAAe,EAAQ,SAAW,EAClBd,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAiC,SAAA,uCAAA,CAAqC,EAEnFA,MAAC,OAAI,UAAU,yBACZ,SAAAc,EAAQ,IAAKK,GACZpB,EAAAA,KAAC,OAAA,CAEC,UAAU,iHAET,SAAA,CAAAoB,EACDnB,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMQ,EAAY,OAAO,CAAE,YAAaN,EAAK,KAAM,YAAaiB,EAAG,EAC5E,UAAU,gFACX,SAAA,GAAA,CAAA,CAED,CAAA,EATKA,CAAA,CAWR,EACH,EAEDF,EAAU,OAAS,GAClBlB,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,MAAOW,EACP,SAAWU,GAAMT,EAAaS,EAAE,OAAO,KAAK,EAC5C,UAAU,kCAEV,SAAA,CAAApB,EAAAA,IAAC,SAAA,CAAO,MAAM,GAAG,SAAA,cAAW,EAC3BiB,EAAU,IAAKC,GAAMlB,EAAAA,IAAC,UAAe,MAAOkB,EAAI,SAAAA,CAAA,EAAdA,CAAgB,CAAS,CAAA,CAAA,CAAA,EAE9DlB,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CACRU,GACLJ,EAAS,OAAO,CAAE,YAAaJ,EAAK,KAAM,YAAaQ,CAAA,EAAa,CAAE,UAAW,IAAMC,EAAa,EAAE,EAAG,CAC3G,EACA,SAAU,CAACD,GAAaJ,EAAS,UACjC,UAAU,2JAET,SAAAA,EAAS,UAAY,IAAM,KAAA,CAAA,CAC9B,CAAA,CACF,CAAA,EAEJ,CAEJ,CAiBA,SAASe,GAAUnB,EAAyB,CAC1C,MAAO,CACL,MAAOA,EAAK,OAAS,GACrB,YAAaA,EAAK,aAAe,GACjC,YAAaA,EAAK,YAClB,YAAaA,EAAK,aAAe,GACjC,YAAad,EAAgBc,EAAK,WAAW,EAC7C,gBAAiBd,EAAgBc,EAAK,eAAe,EACrD,WAAYd,EAAgBc,EAAK,UAAU,GAAK,KAChD,YAAaA,EAAK,aAAe,KAAO,OAAOA,EAAK,WAAW,EAAI,GACnE,gBAAiBA,EAAK,iBAAmB,KAAO,OAAOA,EAAK,eAAe,EAAI,GAC/E,aAAcA,EAAK,cAAgB,KAAO,OAAOA,EAAK,YAAY,EAAI,EAAA,CAE1E,CAIO,SAASoB,IAAiB,CAC/B,KAAM,CAAE,KAAMC,CAAA,EAAYC,GAAA,EACpBC,EAAWC,GAAA,EACX,CAAE,KAAAC,EAAM,UAAAC,CAAA,EAAcC,EAAA,EACtBC,EAAaC,EAAA,EACbC,EAAaC,EAAA,EAEbC,GAAQP,GAAA,YAAAA,EAAM,QAAS,CAAA,EACvBzB,EAAOgC,EAAM,KAAMhB,GAAMA,EAAE,OAASK,CAAO,EAE3C,CAACY,EAAOC,CAAQ,EAAIxB,WAAgB,CACxC,MAAO,GAAI,YAAa,GAAI,YAAa,GAAO,YAAa,GAC7D,YAAa,GAAI,gBAAiB,GAAI,WAAY,KAClD,YAAa,GAAI,gBAAiB,GAAI,aAAc,EAAA,CACrD,EACK,CAACyB,EAAOC,CAAQ,EAAI1B,EAAAA,SAAS,EAAK,EAClC,CAAC2B,EAASC,CAAU,EAAI5B,EAAAA,SAAS,EAAK,EACtC,CAAC6B,EAAQC,CAAS,EAAI9B,EAAAA,SAAkF,CAAA,CAAE,EAC1G,CAAC+B,EAAeC,CAAgB,EAAIhC,EAAAA,SAAS,EAAK,EAClD,CAACiC,EAAaC,CAAc,EAAIlC,EAAAA,SAAS,IAAI,GAAa,EAE1DmC,EAAoBC,GAAkBF,EAAgBG,GAAS,IAAI,IAAI,CAAC,GAAGA,EAAMD,CAAK,CAAC,CAAC,EAE9FE,EAAAA,UAAU,IAAM,CACThD,IACLkC,EAASf,GAAUnB,CAAI,CAAC,EACxBoC,EAAS,EAAK,EACdE,EAAW,EAAK,EAChBE,EAAU,CAAA,CAAE,EACZI,EAAe,IAAI,GAAK,EAC1B,EAAG,CAACvB,EAASrB,GAAA,YAAAA,EAAM,IAAI,CAAC,EAExB,MAAMiD,EAAUC,GAA4B,CAC1ChB,EAAUiB,IAAO,CAAE,GAAGA,EAAG,GAAGD,GAAU,EACtCd,EAAS,EAAI,EACbE,EAAW,EAAK,CAClB,EAEMc,EAAmBvC,EAAAA,QACvB,IAAMmB,EAAM,OAAQhB,GAAM,CACxB,GAAI,CAAChB,GAAQgB,EAAE,OAAShB,EAAK,KAAM,MAAO,GAC1C,IAAIqD,EAA8BrC,EAClC,MAAMsC,MAAW,IACjB,KAAOD,GAAA,MAAAA,EAAK,aAAa,CACvB,GAAIA,EAAI,cAAgBrD,EAAK,KAAM,MAAO,GAC1C,GAAIsD,EAAK,IAAID,EAAI,WAAW,EAAG,MAC/BC,EAAK,IAAID,EAAI,WAAW,EACxBA,EAAMrB,EAAM,KAAMuB,GAAMA,EAAE,OAASF,EAAK,WAAW,CACrD,CACA,MAAO,EACT,CAAC,EACD,CAACrB,EAAOhC,CAAI,CAAA,EAGRwD,EAAa,IAAM,CACvB,MAAMC,EAAarE,EAAc6C,EAAM,WAAW,EAC5CyB,EAAatE,EAAc6C,EAAM,eAAe,EAChD0B,EAAcvE,EAAc6C,EAAM,UAAU,EAC5C2B,EAA2B,CAAA,EAKjC,GAJKH,EAAW,KAAIG,EAAU,YAAc,gBACvCF,EAAW,KAAIE,EAAU,gBAAkB,gBAC3CD,EAAY,KAAIC,EAAU,WAAa,gBAC5CpB,EAAUoB,CAAS,EACf,OAAO,KAAKA,CAAS,EAAE,QAAU,CAAC5D,EAAM,OAE5C,MAAM6D,EAAYC,GAAc,CAAE,MAAMC,EAAI,WAAWD,CAAC,EAAG,OAAO,MAAMC,CAAC,EAAI,KAAOA,CAAG,EAEjFC,EAAcF,GAAc,CAAE,MAAMC,EAAIF,EAASC,CAAC,EAAG,OAAOC,GAAK,KAAO,KAAO,KAAK,MAAMA,CAAC,CAAG,EAEpGnC,EAAW,OACT,CACE,KAAM5B,EAAK,KACX,MAAOiC,EAAM,MAAM,KAAA,GAAU,KAC7B,YAAaA,EAAM,YAAY,KAAA,GAAU,KACzC,YAAaA,EAAM,YACnB,YAAaA,EAAM,aAAe,KAClC,YAAawB,EAAW,OAAS,KACjC,gBAAiBC,EAAW,OAAS,KACrC,WAAYC,EAAY,OAAS,CAAA,EACjC,YAAaE,EAAS5B,EAAM,WAAW,EACvC,gBAAiB4B,EAAS5B,EAAM,eAAe,EAC/C,aAAc+B,EAAW/B,EAAM,YAAY,CAAA,EAE7C,CACE,UAAW,IAAM,CACfG,EAAS,EAAK,EACdE,EAAW,EAAI,EACfM,EAAe,IAAI,GAAK,EACxB,OAAO,WAAW,IAAMN,EAAW,EAAK,EAAG,IAAI,CACjD,CAAA,CACF,CAEJ,EAEM2B,EAAe,IAAM,CACpBjE,GACL8B,EAAW,OAAO9B,EAAK,KAAM,CAAE,UAAW,IAAMuB,EAAS,cAAc,EAAG,CAC5E,EAIA,GAAIG,EACF,OACE7B,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAA,CAAqC,EACpDA,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAA,CAAqC,EACpDA,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAA,CAAiC,CAAA,EAClD,EAIJ,GAAI,CAACE,EACH,OACEH,EAAAA,KAAC,MAAA,CAAI,UAAU,8DACb,SAAA,CAAAC,EAAAA,IAACoE,EAAA,CAAI,UAAU,sCAAsC,YAAa,EAAG,EACrEpE,EAAAA,IAAC,KAAA,CAAG,UAAU,6CAA6C,SAAA,gBAAA,CAAc,CAAA,EAC3E,EAIJ,MAAMqE,EAAQnE,EAAK,WAAa,GAAKA,EAAK,YAAc,GAAKA,EAAK,eAAiB,EAC7EoE,EAAUjC,GAAS,CAAC,OAAO,OAAOI,CAAM,EAAE,KAAK,OAAO,EAGtD8B,EAAM,WAAWpC,EAAM,WAAW,EAClCqC,EAAM,WAAWrC,EAAM,eAAe,EACtCsC,EAAK,WAAWtC,EAAM,YAAY,EAClCuC,EAAQ,CAAC,MAAMH,CAAG,GAAKA,EAAM,EAC7BI,EAAQ,CAAC,MAAMH,CAAG,GAAKA,EAAM,EAC7BI,EAAO,CAAC,MAAMH,CAAE,GAAKA,EAAK,EAC1BI,EACJH,GAASE,GAAQ,CAACD,EAAQ,eAAeF,GAAMF,EAAM,KAAK,QAAQ,CAAC,CAAC,KACpEG,GAASC,GAAS,CAACC,EAAO,gBAAgBJ,GAAOD,EAAM,KAAK,QAAQ,CAAC,CAAC,GACtEI,GAASC,GAAQ,CAACF,EAAQ,YAAYD,EAAKD,EAAM,IAAI,QAAQ,CAAC,CAAC,IAAM,KAEvE,cACG,MAAA,CAEC,SAAA,CAAAzE,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAC,EAAAA,IAACoE,EAAA,CAAI,UAAU,sBAAsB,YAAa,IAAK,EACvDpE,EAAAA,IAAC,KAAA,CAAG,UAAU,kDAAmD,WAAK,KAAK,EAC1EE,EAAK,aACJH,OAAC,OAAA,CAAK,UAAU,6FACd,SAAA,CAAAC,EAAAA,IAAC8E,GAAA,CAAI,UAAU,aAAA,CAAc,EAAE,MAAA,EACjC,EAED5E,EAAK,aACJH,OAAC,OAAA,CAAK,UAAU,qEACd,SAAA,CAAAC,EAAAA,IAAC+E,EAAA,CAAU,UAAU,SAAA,CAAU,EAAE,IAAE7E,EAAK,WAAA,CAAA,CAC1C,CAAA,EAEJ,EACCA,EAAK,OAASF,EAAAA,IAAC,KAAE,UAAU,mCAAoC,WAAK,KAAA,CAAM,CAAA,EAC7E,EAEAD,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACZ,SAAA,CAAAwC,GACCxC,EAAAA,KAAC,OAAA,CAAK,UAAU,yEACd,SAAA,CAAAC,EAAAA,IAACgF,GAAA,CAAM,UAAU,SAAA,CAAU,EAAE,QAAA,EAC/B,EAEDlD,EAAW,OACV9B,MAAC,OAAA,CAAK,UAAU,mDACZ,SAAA8B,EAAW,MAAgB,OAAA,CAC/B,EAEF9B,EAAAA,IAAC,SAAA,CACC,QAAS0D,EACT,SAAU,CAACY,GAAWxC,EAAW,UACjC,UAAU,qJAET,SAAAA,EAAW,UAAY,UAAY,WAAA,CAAA,EAErC,CAACuC,GACAtE,EAAAA,KAAC,SAAA,CACC,QAAS,IAAM6C,EAAiB,EAAI,EACpC,UAAU,kIAEV,SAAA,CAAA5C,EAAAA,IAACiF,GAAA,CAAO,UAAU,SAAA,CAAU,EAAE,SAAA,CAAA,CAAA,CAChC,CAAA,CAEJ,CAAA,EACF,EAGAlF,EAAAA,KAAC,MAAA,CAAI,UAAU,sCAGb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,aAGb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAC,MAACN,GAAY,KAAM0E,EAAK,MAAM,cAAc,MAAM,WAAW,SAE5D,MAAA,CACC,SAAA,CAAApE,EAAAA,IAAC,QAAA,CAAM,UAAU,sFAAsF,SAAA,eAEvG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOmC,EAAM,MACb,SAAWf,GAAM+B,EAAO,CAAE,MAAO/B,EAAE,OAAO,MAAO,EACjD,YAAa,SAASlB,EAAK,KAAK,OAAO,CAAC,EAAE,YAAA,EAAgBA,EAAK,KAAK,MAAM,CAAC,CAAC,GAC5E,UAAU,sBAAA,CAAA,CACZ,EACF,SAEC,MAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,sFAAsF,SAAA,cAEvG,EACAA,EAAAA,IAAC,WAAA,CACC,MAAOmC,EAAM,YACb,SAAWf,GAAM+B,EAAO,CAAE,YAAa/B,EAAE,OAAO,MAAO,EACvD,YAAY,sEACZ,KAAM,EACN,UAAU,kCAAA,CAAA,CACZ,CAAA,CACF,CAAA,EACF,EAGArB,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAC,MAACN,GAAY,KAAMqF,EAAW,MAAM,qBAAqB,MAAM,aAAa,EAC5EhF,EAAAA,KAAC,SAAA,CACC,MAAOoC,EAAM,YACb,SAAWf,GAAM+B,EAAO,CAAE,YAAa/B,EAAE,OAAO,MAAO,EACvD,UAAU,kCAEV,SAAA,CAAApB,EAAAA,IAAC,SAAA,CAAO,MAAM,GAAG,SAAA,sBAAmB,EACnCsD,EAAiB,IAAKpC,SACpB,SAAA,CAAoB,MAAOA,EAAE,KAC3B,SAAAA,EAAE,MAAQ,GAAGA,EAAE,IAAI,MAAMA,EAAE,KAAK,GAAKA,EAAE,MAD7BA,EAAE,IAEf,CACD,CAAA,CAAA,CAAA,CACH,EACF,SAGC,MAAA,CACC,SAAA,CAAAlB,MAACN,GAAY,KAAMwF,GAAW,MAAM,qBAAqB,MAAM,WAAW,EAC1EnF,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAiC,SAAA,iCAA8B,EAC5EA,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMmD,EAAO,CAAE,YAAa,CAAChB,EAAM,YAAa,EACzD,UAAW,4DACTA,EAAM,YAAc,YAAc,mBACpC,GAEA,SAAAnC,EAAAA,IAAC,OAAA,CACC,UAAW,2FACTmC,EAAM,YAAc,qBAAuB,mBAC7C,EAAA,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAAA,EACF,SAGC,MAAA,CACC,SAAA,CAAAnC,EAAAA,IAACN,EAAA,CACC,KAAMyF,EACN,MAAM,uBACN,MAAM,aACN,MACE,CAACtC,EAAY,IAAI,YAAY,GAAK3C,EAAK,YAAc,OAAO,KAAKA,EAAK,UAAU,EAAE,OAAS,EACzFF,EAAAA,IAAC,SAAA,CAAO,QAAS,IAAM+C,EAAiB,YAAY,EAAG,UAAU,yCAAyC,SAAA,MAAA,CAAI,EAE9G/C,EAAAA,IAAC,OAAA,CAAK,UAAU,0DAA0D,SAAA,aAAA,CAAW,CAAA,CAAA,EAI1F,CAAC6C,EAAY,IAAI,YAAY,GAAK3C,EAAK,YAAc,OAAO,KAAKA,EAAK,UAAU,EAAE,OAAS,QACzFkF,EAAA,CAAW,KAAMlF,EAAK,WAAY,iBAAgB,EAAA,CAAC,EAEpDH,EAAAA,KAAAsF,EAAAA,SAAA,CACE,SAAA,CAAArF,EAAAA,IAAC,WAAA,CACC,MAAOmC,EAAM,WACb,SAAWf,GAAM,CACf,MAAMkE,EAAMlE,EAAE,OAAO,MACrB+B,EAAO,CAAE,WAAYmC,EAAK,EAC1B5C,EAAWO,IAAU,CAAE,GAAGA,EAAM,WAAY3D,EAAcgG,CAAG,EAAE,GAAK,OAAY,cAAA,EAAiB,CACnG,EACA,KAAM,EACN,WAAY,GACZ,UAAU,6CACV,YAAa;AAAA;AAAA;AAAA,EAAA,CAAA,EAEd7C,EAAO,YAAczC,EAAAA,IAAC,KAAE,UAAU,qCAAsC,WAAO,UAAA,CAAW,CAAA,CAAA,CAC7F,CAAA,CAAA,CAEJ,CAAA,EACF,EAGAD,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAC,EAAAA,IAACN,EAAA,CACC,KAAM6F,GACN,MAAM,iBACN,MAAM,WACN,MACEvF,EAAAA,IAAC,OAAA,CAAK,UAAU,0EAA0E,SAAA,mCAAA,CAE1F,CAAA,CAAA,EAIJA,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACZ,SAAA,CACC,CAAE,IAAK,cAA2B,MAAO,MAAU,KAAM,MAAO,YAAa,IAAA,EAC7E,CAAE,IAAK,kBAA4B,MAAO,SAAU,KAAM,KAAO,YAAa,IAAA,EAC9E,CAAE,IAAK,eAA4B,MAAO,UAAW,KAAM,GAAM,YAAa,GAAA,CAAI,EAClF,IAAI,CAAC,CAAE,IAAAwF,EAAK,MAAA3F,EAAO,KAAA4F,EAAM,YAAAC,CAAA,IACzB3F,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,QAAA,CAAM,UAAU,sFACd,SAAA,CAAAF,EACA4F,GAAQzF,EAAAA,IAAC,OAAA,CAAK,UAAU,oDAAqD,SAAAyF,CAAA,CAAK,CAAA,EACrF,EACAzF,EAAAA,IAAC,QAAA,CACC,KAAK,SACL,IAAI,IACJ,KAAK,MACL,MAAOmC,EAAMqD,CAAG,EAChB,SAAWpE,GAAM+B,EAAO,CAAE,CAACqC,CAAG,EAAGpE,EAAE,OAAO,MAAO,EACjD,YAAAsE,EACA,UAAU,gCAAA,CAAA,CACZ,GAbQF,CAcV,CACD,EACH,EACCX,GACC7E,EAAAA,IAAC,IAAA,CAAE,UAAU,oCAAqC,SAAA6E,EAAoB,EAIxE9E,EAAAA,KAAC,MAAA,CAAI,UAAU,8CACb,SAAA,CAAAC,EAAAA,IAACN,EAAA,CACC,KAAMiG,GACN,MAAM,uBACN,MAAM,qBACN,MACE5F,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,yCAAA,CAA0C,EAC1DA,EAAAA,IAAC,OAAA,CAAK,UAAU,sEAAsE,SAAA,MAAA,CAAI,CAAA,CAAA,CAC5F,CAAA,CAAA,EAGJA,EAAAA,IAACC,GAAA,CAAkB,KAAAC,EAAY,SAAUgC,CAAA,CAAO,CAAA,CAAA,CAClD,CAAA,EACF,EAGAnC,EAAAA,KAAC,MAAA,CAAI,UAAU,aAEb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAC,EAAAA,IAACN,EAAA,CACC,KAAMyF,EACN,MAAM,gBACN,MAAM,cACN,MACE,CAACtC,EAAY,IAAI,aAAa,GAAK3C,EAAK,YACtCF,EAAAA,IAAC,SAAA,CAAO,QAAS,IAAM+C,EAAiB,aAAa,EAAG,UAAU,yCAAyC,gBAAI,EAC7G,MAAA,CAAA,EAGRhD,EAAAA,KAAC,IAAA,CAAE,UAAU,sDAAsD,SAAA,CAAA,4DACRC,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAY,SAAA,kBAAe,EAAO,GAAA,EAC7G,EACC,CAAC6C,EAAY,IAAI,aAAa,GAAK3C,EAAK,YACvCF,MAACoF,EAAA,CAAW,KAAMlF,EAAK,WAAA,CAAa,EAEpCH,EAAAA,KAAAsF,EAAAA,SAAA,CACE,SAAA,CAAArF,EAAAA,IAAC,WAAA,CACC,MAAOmC,EAAM,YACb,SAAWf,GAAM,CACf,MAAMkE,EAAMlE,EAAE,OAAO,MACrB+B,EAAO,CAAE,YAAamC,EAAK,EAC3B5C,EAAWO,IAAU,CAAE,GAAGA,EAAM,YAAa3D,EAAcgG,CAAG,EAAE,GAAK,OAAY,cAAA,EAAiB,CACpG,EACA,KAAM,GACN,WAAY,GACZ,UAAU,0CACV,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,EAEd7C,EAAO,aAAezC,EAAAA,IAAC,KAAE,UAAU,qCAAsC,WAAO,WAAA,CAAY,CAAA,CAAA,CAC/F,CAAA,EAEJ,SAGC,MAAA,CACC,SAAA,CAAAA,EAAAA,IAACN,EAAA,CACC,KAAMyF,EACN,MAAM,kBACN,MAAM,kBACN,MACE,CAACtC,EAAY,IAAI,iBAAiB,GAAK3C,EAAK,gBAC1CF,EAAAA,IAAC,SAAA,CAAO,QAAS,IAAM+C,EAAiB,iBAAiB,EAAG,UAAU,yCAAyC,gBAAI,EACjH,MAAA,CAAA,EAGRhD,EAAAA,KAAC,IAAA,CAAE,UAAU,sDAAsD,SAAA,CAAA,aACvDC,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAY,SAAA,WAAQ,EAAO,gEAAA,EACvD,EACC,CAAC6C,EAAY,IAAI,iBAAiB,GAAK3C,EAAK,gBAC3CF,MAACoF,EAAA,CAAW,KAAMlF,EAAK,eAAA,CAAiB,EAExCH,EAAAA,KAAAsF,EAAAA,SAAA,CACE,SAAA,CAAArF,EAAAA,IAAC,WAAA,CACC,MAAOmC,EAAM,gBACb,SAAWf,GAAM,CACf,MAAMkE,EAAMlE,EAAE,OAAO,MACrB+B,EAAO,CAAE,gBAAiBmC,EAAK,EAC/B5C,EAAWO,IAAU,CAAE,GAAGA,EAAM,gBAAiB3D,EAAcgG,CAAG,EAAE,GAAK,OAAY,cAAA,EAAiB,CACxG,EACA,KAAM,GACN,WAAY,GACZ,UAAU,0CACV,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,EAEd7C,EAAO,iBAAmBzC,EAAAA,IAAC,KAAE,UAAU,qCAAsC,WAAO,eAAA,CAAgB,CAAA,CAAA,CACvG,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,EACF,EAGAA,EAAAA,IAAC4F,GAAA,CACC,KAAMjD,EACN,QAAS,IAAMC,EAAiB,EAAK,EACrC,UAAWuB,EACX,MAAM,cACN,YACEpE,EAAAA,KAAAsF,WAAA,CAAE,SAAA,CAAA,eACYrF,EAAAA,IAAC,OAAA,CAAK,UAAU,0CAA2C,WAAK,KAAK,EAAO,0BAAA,EAC1F,EAEF,UAAWgC,EAAW,UACtB,MAAOA,EAAW,KAAA,CAAA,CACpB,EACF,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.btn-primary{border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(108 71 255 / var(--tw-bg-opacity, 1));padding:.625rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(88 53 219 / var(--tw-bg-opacity, 1))}.btn-secondary{border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.625rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-secondary:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.btn-ghost{border-radius:.375rem;padding:.625rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.row-hover{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s}.\!input{width:100%;border-bottom-width:1px;border-color:#e0daf099;background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\!input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.\!input::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.\!input:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.input{width:100%;border-bottom-width:1px;border-color:#e0daf099;background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.input-json{width:100%;resize:vertical;border-radius:.375rem;border-width:1px;border-color:#e0daf066;background-color:transparent;padding:.5rem .75rem;font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-size:11px;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);line-height:1.625;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input-json::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input-json::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input-json:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-bottom-width:1px;border-color:#e0daf099;background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.select:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.label{margin-bottom:.125rem;display:block;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.hint{margin-top:.25rem;font-size:9px;line-height:1.375;color:#918aabb3}.section-header{margin-bottom:.75rem;display:block;border-bottom-width:1px;border-color:#e0daf04d;padding-bottom:.375rem;font-size:1.05rem;font-weight:300;font-variant-caps:small-caps;letter-spacing:.03em;color:#5c2069}.section-h2{font-size:1.05rem;font-weight:300;font-variant-caps:small-caps;letter-spacing:.03em;color:#5c2069}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.inset-y-0{top:0;bottom:0}.-left-\[3px\]{left:-3px}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-3{bottom:.75rem}.left-0{left:0}.left-2\.5{left:.625rem}.left-56{left:14rem}.left-\[7px\]{left:7px}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-6{right:1.5rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-16{top:4rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-6{top:1.5rem}.top-\[2\.75rem\]{top:2.75rem}.top-\[3px\]{top:3px}.top-\[60px\]{top:60px}.top-\[78px\]{top:78px}.top-full{top:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[45\]{z-index:45}.z-\[5\]{z-index:5}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2 / span 2}.float-right{float:right}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-ml-1{margin-left:-.25rem}.-ml-1\.5{margin-left:-.375rem}.-ml-10{margin-left:-2.5rem}.-ml-2{margin-left:-.5rem}.-ml-8{margin-left:-2rem}.-ml-\[12\.5rem\]{margin-left:-12.5rem}.-ml-\[9\.75rem\]{margin-left:-9.75rem}.-mr-3{margin-right:-.75rem}.-mt-1{margin-top:-.25rem}.-mt-2{margin-top:-.5rem}.-mt-6{margin-top:-1.5rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-7{margin-left:1.75rem}.ml-8{margin-left:2rem}.ml-9{margin-left:2.25rem}.ml-\[19px\]{margin-left:19px}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mr-16{margin-right:4rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-14{margin-top:3.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-\[3em\]{margin-top:3em}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[12\.5rem\]{height:12.5rem}.h-\[14px\]{height:14px}.h-\[15px\]{height:15px}.h-\[16rem\]{height:16rem}.h-\[18px\]{height:18px}.h-\[30vh\]{height:30vh}.h-\[7px\]{height:7px}.h-\[80px\]{height:80px}.h-\[9px\]{height:9px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-40{max-height:10rem}.max-h-44{max-height:11rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-\[200px\]{max-height:200px}.max-h-\[280px\]{max-height:280px}.max-h-\[300px\]{max-height:300px}.max-h-\[30vh\]{max-height:30vh}.max-h-\[400px\]{max-height:400px}.max-h-\[40vh\]{max-height:40vh}.max-h-\[50vh\]{max-height:50vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[calc\(100vh-220px\)\]{max-height:calc(100vh - 220px)}.max-h-\[calc\(100vh-8rem\)\]{max-height:calc(100vh - 8rem)}.max-h-none{max-height:none}.max-h-screen{max-height:100vh}.min-h-0{min-height:0px}.min-h-\[100px\]{min-height:100px}.min-h-\[120px\]{min-height:120px}.min-h-\[160px\]{min-height:160px}.min-h-\[200px\]{min-height:200px}.min-h-\[28px\]{min-height:28px}.min-h-\[300px\]{min-height:300px}.min-h-\[34px\]{min-height:34px}.min-h-\[35vh\]{min-height:35vh}.min-h-\[360px\]{min-height:360px}.min-h-\[48px\]{min-height:48px}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.min-h-\[calc\(100vh-12rem\)\]{min-height:calc(100vh - 12rem)}.min-h-\[calc\(100vh-80px\)\]{min-height:calc(100vh - 80px)}.min-h-\[calc\(100vh-9rem\)\]{min-height:calc(100vh - 9rem)}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[12\.5rem\]{width:12.5rem}.w-\[120px\]{width:120px}.w-\[14px\]{width:14px}.w-\[150px\]{width:150px}.w-\[15px\]{width:15px}.w-\[16rem\]{width:16rem}.w-\[18px\]{width:18px}.w-\[200px\]{width:200px}.w-\[22rem\]{width:22rem}.w-\[25\%\]{width:25%}.w-\[280px\]{width:280px}.w-\[28rem\]{width:28rem}.w-\[30\%\]{width:30%}.w-\[36rem\]{width:36rem}.w-\[380px\]{width:380px}.w-\[400px\]{width:400px}.w-\[40vw\]{width:40vw}.w-\[420px\]{width:420px}.w-\[48rem\]{width:48rem}.w-\[7px\]{width:7px}.w-\[9px\]{width:9px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-4{min-width:1rem}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[14px\]{min-width:14px}.min-w-\[180px\]{min-width:180px}.min-w-\[18px\]{min-width:18px}.min-w-\[800px\]{min-width:800px}.min-w-\[80px\]{min-width:80px}.max-w-0{max-width:0px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[19rem\]{max-width:19rem}.max-w-\[200px\]{max-width:200px}.max-w-\[240px\]{max-width:240px}.max-w-\[60\%\]{max-width:60%}.max-w-\[65\%\]{max-width:65%}.max-w-\[85\%\]{max-width:85%}.max-w-\[90vw\]{max-width:90vw}.max-w-dashboard{max-width:1440px}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:center}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-\[60vh\]{--tw-translate-y: -60vh;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[120vw\]{--tw-translate-x: 120vw;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[18px\]{--tw-translate-x: 18px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[3px\]{--tw-translate-x: 3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-1{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-\[120deg\]{--tw-rotate: -120deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-0{--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[3\]{--tw-scale-x: 3;--tw-scale-y: 3;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[field-error-in_0\.3s_ease-out\]{animation:field-error-in .3s ease-out}.animate-\[field-shake_0\.4s_ease-in-out\]{animation:field-shake .4s ease-in-out}.animate-\[triage-glow_6s_ease-in-out_infinite\]{animation:triage-glow 6s ease-in-out infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}.grid-cols-\[3fr_1fr\]{grid-template-columns:3fr 1fr}.grid-cols-\[minmax\(0\,1fr\)_7rem_13rem_4\.5rem\]{grid-template-columns:minmax(0,1fr) 7rem 13rem 4.5rem}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-12{gap:3rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-10{row-gap:2.5rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.gap-y-6{row-gap:1.5rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem * var(--tw-space-y-reverse))}.space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-surface-border>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(224 218 240 / var(--tw-divide-opacity, 1))}.divide-surface-border\/30>:not([hidden])~:not([hidden]){border-color:#e0daf04d}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-x-clip{overflow-x:clip}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-accent{--tw-border-opacity: 1;border-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.border-accent-faint{--tw-border-opacity: 1;border-color:rgb(232 226 248 / var(--tw-border-opacity, 1))}.border-accent-muted{--tw-border-opacity: 1;border-color:rgb(200 190 240 / var(--tw-border-opacity, 1))}.border-accent-muted\/40{border-color:#c8bef066}.border-accent\/10{border-color:#6c47ff1a}.border-accent\/20{border-color:#6c47ff33}.border-accent\/30{border-color:#6c47ff4d}.border-accent\/40{border-color:#6c47ff66}.border-amber-400\/40{border-color:#fbbf2466}.border-amber-600{--tw-border-opacity: 1;border-color:rgb(217 119 6 / var(--tw-border-opacity, 1))}.border-blue-400\/40{border-color:#60a5fa66}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-emerald-400\/30{border-color:#34d3994d}.border-emerald-400\/40{border-color:#34d39966}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-purple-500\/20{border-color:#a855f733}.border-status-draft{--tw-border-opacity: 1;border-color:rgb(249 115 22 / var(--tw-border-opacity, 1))}.border-status-error{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.border-status-error\/20{border-color:#dc262633}.border-status-error\/30{border-color:#dc26264d}.border-status-error\/50{border-color:#dc262680}.border-status-pending\/30{border-color:#f59e0b4d}.border-status-success{--tw-border-opacity: 1;border-color:rgb(22 163 74 / var(--tw-border-opacity, 1))}.border-status-success\/20{border-color:#16a34a33}.border-status-success\/30{border-color:#16a34a4d}.border-status-warning{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-status-warning\/20{border-color:#f59e0b33}.border-status-warning\/30{border-color:#f59e0b4d}.border-surface-border{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.border-surface-border\/15{border-color:#e0daf026}.border-surface-border\/30{border-color:#e0daf04d}.border-surface-border\/40{border-color:#e0daf066}.border-surface-border\/50{border-color:#e0daf080}.border-surface-border\/60{border-color:#e0daf099}.border-text-tertiary{--tw-border-opacity: 1;border-color:rgb(145 138 171 / var(--tw-border-opacity, 1))}.border-violet-400\/40{border-color:#a78bfa66}.border-violet-500{--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.border-white\/70{border-color:#ffffffb3}.border-l-accent{--tw-border-opacity: 1;border-left-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.border-l-transparent{border-left-color:transparent}.border-r-surface-border{--tw-border-opacity: 1;border-right-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.border-r-transparent{border-right-color:transparent}.\!bg-status-error{--tw-bg-opacity: 1 !important;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))!important}.bg-\[\#6C47FF\]{--tw-bg-opacity: 1;background-color:rgb(108 71 255 / var(--tw-bg-opacity, 1))}.bg-\[\#F7F7F7\]{--tw-bg-opacity: 1;background-color:rgb(247 247 247 / var(--tw-bg-opacity, 1))}.bg-\[a-z\]{background-color:a-z}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(108 71 255 / var(--tw-bg-opacity, 1))}.bg-accent-faint{--tw-bg-opacity: 1;background-color:rgb(232 226 248 / var(--tw-bg-opacity, 1))}.bg-accent-faint\/50{background-color:#e8e2f880}.bg-accent-muted{--tw-bg-opacity: 1;background-color:rgb(200 190 240 / var(--tw-bg-opacity, 1))}.bg-accent-muted\/20{background-color:#c8bef033}.bg-accent\/10{background-color:#6c47ff1a}.bg-accent\/15{background-color:#6c47ff26}.bg-accent\/20{background-color:#6c47ff33}.bg-accent\/5{background-color:#6c47ff0d}.bg-accent\/60{background-color:#6c47ff99}.bg-accent\/\[0\.06\]{background-color:#6c47ff0f}.bg-accent\/\[0\.08\]{background-color:#6c47ff14}.bg-amber-200\/\[0\.12\]{background-color:#fde68a1f}.bg-amber-300\/\[0\.08\]{background-color:#fcd34d14}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-400\/15{background-color:#fbbf2426}.bg-amber-400\/\[0\.08\]{background-color:#fbbf2414}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-blue-400\/15{background-color:#60a5fa26}.bg-blue-400\/\[0\.08\]{background-color:#60a5fa14}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/60{background-color:#3b82f699}.bg-blue-500\/70{background-color:#3b82f6b3}.bg-cyan-400\/15{background-color:#22d3ee26}.bg-cyan-400\/\[0\.08\]{background-color:#22d3ee14}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-400\/15{background-color:#34d39926}.bg-emerald-400\/\[0\.08\]{background-color:#34d39914}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-fuchsia-400\/\[0\.08\]{background-color:#e879f914}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-green-400\/\[0\.08\]{background-color:#4ade8014}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-indigo-400\/\[0\.08\]{background-color:#818cf814}.bg-lime-400\/\[0\.08\]{background-color:#a3e63514}.bg-orange-400{--tw-bg-opacity: 1;background-color:rgb(251 146 60 / var(--tw-bg-opacity, 1))}.bg-orange-400\/15{background-color:#fb923c26}.bg-orange-400\/\[0\.08\]{background-color:#fb923c14}.bg-pink-300\/\[0\.08\]{background-color:#f9a8d414}.bg-pink-400\/\[0\.08\]{background-color:#f472b614}.bg-purple-400\/\[0\.08\]{background-color:#c084fc14}.bg-purple-500\/10{background-color:#a855f71a}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-400\/\[0\.08\]{background-color:#f8717114}.bg-rose-300\/\[0\.08\]{background-color:#fda4af14}.bg-rose-400\/15{background-color:#fb718526}.bg-rose-400\/\[0\.08\]{background-color:#fb718514}.bg-sky-300\/\[0\.08\]{background-color:#7dd3fc14}.bg-sky-400\/\[0\.08\]{background-color:#38bdf814}.bg-status-active{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-status-draft{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-status-draft\/30{background-color:#f973164d}.bg-status-error{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-status-error\/10{background-color:#dc26261a}.bg-status-error\/5{background-color:#dc26260d}.bg-status-error\/70{background-color:#dc2626b3}.bg-status-error\/\[0\.04\]{background-color:#dc26260a}.bg-status-pending{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-status-pending\/10{background-color:#f59e0b1a}.bg-status-success{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-status-success\/10{background-color:#16a34a1a}.bg-status-success\/20{background-color:#16a34a33}.bg-status-success\/30{background-color:#16a34a4d}.bg-status-success\/5{background-color:#16a34a0d}.bg-status-warning{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-status-warning\/10{background-color:#f59e0b1a}.bg-status-warning\/15{background-color:#f59e0b26}.bg-status-warning\/5{background-color:#f59e0b0d}.bg-stone-400\/\[0\.08\]{background-color:#a8a29e14}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-surface-border{--tw-bg-opacity: 1;background-color:rgb(224 218 240 / var(--tw-bg-opacity, 1))}.bg-surface-border\/60{background-color:#e0daf099}.bg-surface-hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.bg-surface-hover\/30{background-color:#f7f4ff4d}.bg-surface-raised{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-surface-raised\/50{background-color:#ffffff80}.bg-surface-raised\/\[0\.03\]{background-color:#ffffff08}.bg-surface-sunken{--tw-bg-opacity: 1;background-color:rgb(245 245 247 / var(--tw-bg-opacity, 1))}.bg-surface-sunken\/15{background-color:#f5f5f726}.bg-surface-sunken\/20{background-color:#f5f5f733}.bg-surface-sunken\/30{background-color:#f5f5f74d}.bg-surface-sunken\/40{background-color:#f5f5f766}.bg-surface-sunken\/50{background-color:#f5f5f780}.bg-surface-sunken\/60{background-color:#f5f5f799}.bg-surface-sunken\/80{background-color:#f5f5f7cc}.bg-surface-sunken\/90{background-color:#f5f5f7e6}.bg-surface\/90{background-color:#ffffffe6}.bg-surface\/95{background-color:#fffffff2}.bg-teal-300\/\[0\.08\]{background-color:#5eead414}.bg-teal-400\/\[0\.08\]{background-color:#2dd4bf14}.bg-text-primary\/30{background-color:#1e15354d}.bg-text-secondary{--tw-bg-opacity: 1;background-color:rgb(91 81 115 / var(--tw-bg-opacity, 1))}.bg-text-tertiary{--tw-bg-opacity: 1;background-color:rgb(145 138 171 / var(--tw-bg-opacity, 1))}.bg-text-tertiary\/30{background-color:#918aab4d}.bg-transparent{background-color:transparent}.bg-violet-300\/\[0\.08\]{background-color:#c4b5fd14}.bg-violet-400\/15{background-color:#a78bfa26}.bg-violet-400\/\[0\.08\]{background-color:#a78bfa14}.bg-violet-500{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-400\/\[0\.08\]{background-color:#facc1514}.bg-zinc-400\/15{background-color:#a1a1aa26}.bg-zinc-500{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.bg-zinc-600{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.from-accent\/\[0\.04\]{--tw-gradient-from: rgb(108 71 255 / .04) var(--tw-gradient-from-position);--tw-gradient-to: rgb(108 71 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.fill-status-active{fill:#2563eb}.fill-status-error{fill:#dc2626}.fill-status-success{fill:#16a34a}.fill-status-warning{fill:#f59e0b}.fill-text-tertiary{fill:#918aab}.stroke-current{stroke:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.\!px-2{padding-left:.5rem!important;padding-right:.5rem!important}.\!px-2\.5{padding-left:.625rem!important;padding-right:.625rem!important}.\!py-0\.5{padding-top:.125rem!important;padding-bottom:.125rem!important}.\!py-1\.5{padding-top:.375rem!important;padding-bottom:.375rem!important}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-px{padding-top:1px;padding-bottom:1px}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-0{padding-left:0}.pl-0\.5{padding-left:.125rem}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-11{padding-left:2.75rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-3{padding-left:.75rem}.pl-3\.5{padding-left:.875rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-52{padding-left:13rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pr-1\.5{padding-right:.375rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-28{padding-right:7rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pr-7{padding-right:1.75rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-24{padding-top:6rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-\[36px\]{padding-top:36px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace}.font-sans{font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif}.\!text-\[9px\]{font-size:9px!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[0\.5em\]{font-size:.5em}.text-\[1\.5rem\]{font-size:1.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[36px\]{font-size:36px}.text-\[44px\]{font-size:44px}.text-\[8\.5px\]{font-size:8.5px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extralight{font-weight:200}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.ordinal{--tw-ordinal: ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.15em\]{letter-spacing:.15em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[a-z\]{color:a-z}.text-accent{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.text-accent-muted{--tw-text-opacity: 1;color:rgb(200 190 240 / var(--tw-text-opacity, 1))}.text-accent\/40{color:#6c47ff66}.text-accent\/50{color:#6c47ff80}.text-accent\/60{color:#6c47ff99}.text-accent\/70{color:#6c47ffb3}.text-accent\/75{color:#6c47ffbf}.text-accent\/80{color:#6c47ffcc}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-500\/70{color:#f59e0bb3}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-500\/70{color:#3b82f6b3}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-fuchsia-400{--tw-text-opacity: 1;color:rgb(232 121 249 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.text-inherit{color:inherit}.text-lime-400{--tw-text-opacity: 1;color:rgb(163 230 53 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-pink-300{--tw-text-opacity: 1;color:rgb(249 168 212 / var(--tw-text-opacity, 1))}.text-pink-400{--tw-text-opacity: 1;color:rgb(244 114 182 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-400\/60{color:#f8717199}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-rose-300{--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-sky-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-status-active{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-status-error{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-status-error\/50{color:#dc262680}.text-status-error\/70{color:#dc2626b3}.text-status-error\/80{color:#dc2626cc}.text-status-pending{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-status-success{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-status-success\/70{color:#16a34ab3}.text-status-success\/80{color:#16a34acc}.text-status-warning{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-stone-400{--tw-text-opacity: 1;color:rgb(168 162 158 / var(--tw-text-opacity, 1))}.text-surface-border{--tw-text-opacity: 1;color:rgb(224 218 240 / var(--tw-text-opacity, 1))}.text-teal-300{--tw-text-opacity: 1;color:rgb(94 234 212 / var(--tw-text-opacity, 1))}.text-teal-400{--tw-text-opacity: 1;color:rgb(45 212 191 / var(--tw-text-opacity, 1))}.text-text-inverse{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-text-primary{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.text-text-secondary{--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1))}.text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.text-text-tertiary\/30{color:#918aab4d}.text-text-tertiary\/40{color:#918aab66}.text-text-tertiary\/50{color:#918aab80}.text-text-tertiary\/60{color:#918aab99}.text-text-tertiary\/70{color:#918aabb3}.text-violet-300{--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-zinc-400{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.decoration-text-tertiary\/30{text-decoration-color:#918aab4d}.accent-accent{accent-color:#6C47FF}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/5{--tw-shadow-color: rgb(0 0 0 / .05);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-accent{--tw-ring-opacity: 1;--tw-ring-color: rgb(108 71 255 / var(--tw-ring-opacity, 1))}.ring-accent\/40{--tw-ring-color: rgb(108 71 255 / .4)}.ring-offset-1{--tw-ring-offset-width: 1px}.ring-offset-surface{--tw-ring-offset-color: #FFFFFF}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.brightness-150{--tw-brightness: brightness(1.5);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\[2px\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-\[1500ms\]{transition-duration:1.5s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[animation-delay\:150ms\]{animation-delay:.15s}.\[animation-delay\:300ms\]{animation-delay:.3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes triage-glow{0%{box-shadow:0 0 3px #6c47ff26}8.3%{box-shadow:0 0 10px 2px #6c47ff66}16.7%,to{box-shadow:0 0 3px #6c47ff26}}.animate-page-enter{animation:fadeIn .15s ease-out both}@keyframes pageFade{0%{opacity:0}to{opacity:1}}.animate-page-in{animation:pageFade .2s ease-out both}@keyframes field-shake{0%,to{transform:translate(0)}15%{transform:translate(-4px)}30%{transform:translate(3px)}45%{transform:translate(-2px)}60%{transform:translate(1px)}75%{transform:translate(0)}}@keyframes field-error-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.bg-stripes{background-image:repeating-linear-gradient(-45deg,transparent,transparent 3px,rgba(255,255,255,.15) 3px,rgba(255,255,255,.15) 6px);background-color:var(--color-status-warning, #f59e0b)}.placeholder\:italic::-moz-placeholder{font-style:italic}.placeholder\:italic::placeholder{font-style:italic}.placeholder\:text-text-tertiary::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary\/40::-moz-placeholder{color:#918aab66}.placeholder\:text-text-tertiary\/40::placeholder{color:#918aab66}.placeholder\:text-text-tertiary\/50::-moz-placeholder{color:#918aab80}.placeholder\:text-text-tertiary\/50::placeholder{color:#918aab80}.first\:mt-0:first-child{margin-top:0}.first\:border-t-0:first-child{border-top-width:0px}.first\:pt-1:first-child{padding-top:.25rem}.last\:border-b-0:last-child{border-bottom-width:0px}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-accent\/40:hover{border-color:#6c47ff66}.hover\:border-accent\/50:hover{border-color:#6c47ff80}.hover\:border-status-error:hover{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.hover\:border-text-tertiary:hover{--tw-border-opacity: 1;border-color:rgb(145 138 171 / var(--tw-border-opacity, 1))}.hover\:\!bg-status-error\/90:hover{background-color:#dc2626e6!important}.hover\:bg-accent-hover:hover{--tw-bg-opacity: 1;background-color:rgb(88 53 219 / var(--tw-bg-opacity, 1))}.hover\:bg-accent-muted:hover{--tw-bg-opacity: 1;background-color:rgb(200 190 240 / var(--tw-bg-opacity, 1))}.hover\:bg-accent\/10:hover{background-color:#6c47ff1a}.hover\:bg-accent\/15:hover{background-color:#6c47ff26}.hover\:bg-accent\/20:hover{background-color:#6c47ff33}.hover\:bg-accent\/25:hover{background-color:#6c47ff40}.hover\:bg-accent\/30:hover{background-color:#6c47ff4d}.hover\:bg-accent\/90:hover{background-color:#6c47ffe6}.hover\:bg-accent\/\[0\.04\]:hover{background-color:#6c47ff0a}.hover\:bg-emerald-600\/10:hover{background-color:#0596691a}.hover\:bg-red-600\/10:hover,.hover\:bg-status-error\/10:hover{background-color:#dc26261a}.hover\:bg-status-error\/20:hover{background-color:#dc262633}.hover\:bg-status-error\/5:hover{background-color:#dc26260d}.hover\:bg-status-error\/80:hover{background-color:#dc2626cc}.hover\:bg-status-error\/90:hover{background-color:#dc2626e6}.hover\:bg-status-success\/10:hover{background-color:#16a34a1a}.hover\:bg-status-success\/20:hover{background-color:#16a34a33}.hover\:bg-surface-border\/40:hover{background-color:#e0daf066}.hover\:bg-surface-hover:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-hover\/30:hover{background-color:#f7f4ff4d}.hover\:bg-surface-hover\/40:hover{background-color:#f7f4ff66}.hover\:bg-surface-hover\/50:hover{background-color:#f7f4ff80}.hover\:bg-surface-raised:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-raised\/30:hover{background-color:#ffffff4d}.hover\:bg-surface-raised\/60:hover{background-color:#fff9}.hover\:bg-surface-sunken:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 247 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-sunken\/40:hover{background-color:#f5f5f766}.hover\:text-accent:hover{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.hover\:text-accent-hover:hover{--tw-text-opacity: 1;color:rgb(88 53 219 / var(--tw-text-opacity, 1))}.hover\:text-accent\/80:hover{color:#6c47ffcc}.hover\:text-amber-300:hover{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.hover\:text-blue-300:hover{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.hover\:text-blue-500:hover{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.hover\:text-emerald-300:hover{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:text-status-error:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-status-error\/80:hover{color:#dc2626cc}.hover\:text-status-success:hover{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.hover\:text-status-success\/80:hover{color:#16a34acc}.hover\:text-status-warning:hover{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.hover\:text-status-warning\/80:hover{color:#f59e0bcc}.hover\:text-text-primary:hover{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.hover\:text-text-secondary:hover{--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:border-accent:focus{--tw-border-opacity: 1;border-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.focus\:border-accent\/50:focus{border-color:#6c47ff80}.focus\:border-status-error:focus{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset: inset}.focus\:ring-accent:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(108 71 255 / var(--tw-ring-opacity, 1))}.focus\:ring-accent\/30:focus{--tw-ring-color: rgb(108 71 255 / .3)}.focus\:ring-accent\/40:focus{--tw-ring-color: rgb(108 71 255 / .4)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:no-underline:disabled{text-decoration-line:none}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:hover\:border-surface-border:hover:disabled{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.group\/srv:hover .group-hover\/srv\:visible{visibility:visible}.group:hover .group-hover\:block{display:block}.group\/row:hover .group-hover\/row\:text-text-primary{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.group\/row:hover .group-hover\/row\:text-text-secondary{--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1))}.group\/section:hover .group-hover\/section\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.group\/srv:hover .group-hover\/srv\:text-accent,.group:hover .group-hover\:text-accent{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-accent-hover{--tw-text-opacity: 1;color:rgb(88 53 219 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-primary{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-secondary{--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group\/key:hover .group-hover\/key\:opacity-100,.group\/row:hover .group-hover\/row\:opacity-100,.group\/sched:hover .group-hover\/sched\:opacity-100{opacity:1}.group\/sorthead:hover .group-hover\/sorthead\:opacity-40{opacity:.4}.group\/sub:hover .group-hover\/sub\:opacity-100,.group\/trace:hover .group-hover\/trace\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:w-72{width:18rem}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.lg\:grid-cols-\[1fr_320px\]{grid-template-columns:1fr 320px}.lg\:grid-cols-\[1fr_340px\]{grid-template-columns:1fr 340px}.lg\:grid-cols-\[1fr_360px\]{grid-template-columns:1fr 360px}.lg\:grid-cols-\[1fr_400px\]{grid-template-columns:1fr 400px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:border-l{border-left-width:1px}.lg\:border-surface-border{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.lg\:pl-12{padding-left:3rem}}
|