@flamingo-stack/openframe-frontend-core 0.0.850 → 0.0.851

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/dist/chat-protocol/events.d.ts +4 -1
  2. package/dist/chat-protocol/events.d.ts.map +1 -1
  3. package/dist/chat-protocol/index.cjs +90 -40
  4. package/dist/chat-protocol/nats-decoder.d.ts.map +1 -1
  5. package/dist/chat-protocol/nats-decoder.js +5 -1
  6. package/dist/chat-protocol/policy-review.d.ts +18 -0
  7. package/dist/chat-protocol/policy-review.d.ts.map +1 -0
  8. package/dist/chat-protocol/policy-review.js +55 -0
  9. package/dist/{chunk-ZDSC3GFX.cjs → chunk-2NGW73T2.cjs} +3 -3
  10. package/dist/{chunk-2QZUTNL3.cjs → chunk-2WZHNMQY.cjs} +67 -67
  11. package/dist/{chunk-R5JPZ6TY.cjs → chunk-5SEJEBAB.cjs} +8 -8
  12. package/dist/{chunk-TX4NTH22.cjs → chunk-B6D4WWKD.cjs} +36 -36
  13. package/dist/{chunk-FXLROQUT.cjs → chunk-CDW6JTAQ.cjs} +442 -459
  14. package/dist/{chunk-5PIR77V5.cjs → chunk-DN227KZH.cjs} +4 -4
  15. package/dist/{chunk-QJER2ZNA.cjs → chunk-FGSN5UNY.cjs} +3 -3
  16. package/dist/{chunk-ZGEWT3SF.cjs → chunk-HXURNKXI.cjs} +3 -3
  17. package/dist/{chunk-FRG724DU.cjs → chunk-KRTTH3ET.cjs} +4 -4
  18. package/dist/{chunk-YJZ7R3W5.cjs → chunk-KXFIYO4O.cjs} +8 -8
  19. package/dist/{chunk-4YBS4HIO.cjs → chunk-LM7EL3UQ.cjs} +444 -27
  20. package/dist/{chunk-LGYPCUHO.cjs → chunk-NQEPLUUW.cjs} +21 -21
  21. package/dist/{chunk-OHHDX3Z4.cjs → chunk-ODMZSAIY.cjs} +36 -36
  22. package/dist/{chunk-VRWBJL7B.cjs → chunk-OUP7L3U5.cjs} +50 -50
  23. package/dist/{chunk-5CBI2ZYV.cjs → chunk-PJNEBSP5.cjs} +5 -5
  24. package/dist/{chunk-6AJYGXXS.cjs → chunk-PPCRLSVR.cjs} +11 -11
  25. package/dist/{chunk-SA2NNWIJ.cjs → chunk-QCSA7GIX.cjs} +17 -62
  26. package/dist/{chunk-JWIITCVB.cjs → chunk-SPKAXETT.cjs} +42 -42
  27. package/dist/{chunk-CAGNWDVJ.cjs → chunk-U4RTWH5D.cjs} +42 -42
  28. package/dist/{chunk-IHY7E4EX.cjs → chunk-UFGPLXH6.cjs} +4 -4
  29. package/dist/{chunk-7ICHJVAT.cjs → chunk-UQK6J3ZS.cjs} +13 -13
  30. package/dist/{chunk-S3QXLD4X.cjs → chunk-VCFQHPOO.cjs} +37 -3
  31. package/dist/{chunk-IPGGSFR7.cjs → chunk-VU6N3NZS.cjs} +6 -6
  32. package/dist/{chunk-GAYLAA3L.cjs → chunk-VXIZCUNZ.cjs} +61 -61
  33. package/dist/{chunk-3W4ASAXN.cjs → chunk-WYROOMUZ.cjs} +2 -2
  34. package/dist/{chunk-XKOL5CNU.cjs → chunk-ZEPEFKHA.cjs} +811 -932
  35. package/dist/{cloud-tenants-TVB3DT3J.cjs → cloud-tenants-XH6GV4EI.cjs} +12 -13
  36. package/dist/components/case-studies/index.cjs +24 -25
  37. package/dist/components/chat/approval-batch-message.d.ts +5 -0
  38. package/dist/components/chat/approval-batch-message.d.ts.map +1 -1
  39. package/dist/components/chat/approval-batch-message.js +36 -10
  40. package/dist/components/chat/index.cjs +8 -9
  41. package/dist/components/chat/policy-review.d.ts +27 -0
  42. package/dist/components/chat/policy-review.d.ts.map +1 -0
  43. package/dist/components/chat/policy-review.js +67 -0
  44. package/dist/components/chat/stream/message-mutations.d.ts.map +1 -1
  45. package/dist/components/chat/stream/message-mutations.js +4 -1
  46. package/dist/components/chat/tool-execution-display.d.ts.map +1 -1
  47. package/dist/components/chat/tool-execution-display.js +16 -5
  48. package/dist/components/chat/types/message.types.d.ts +40 -2
  49. package/dist/components/chat/types/message.types.d.ts.map +1 -1
  50. package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
  51. package/dist/components/chat/utils/extract-incomplete-message-state.js +2 -0
  52. package/dist/components/chat/utils/message-segment-accumulator.d.ts.map +1 -1
  53. package/dist/components/chat/utils/message-segment-accumulator.js +3 -0
  54. package/dist/components/chat/utils/process-historical-messages.d.ts +2 -2
  55. package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
  56. package/dist/components/chat/utils/process-historical-messages.js +7 -1
  57. package/dist/components/contact/index.cjs +13 -14
  58. package/dist/components/docs/index.cjs +16 -17
  59. package/dist/components/embeds/index.cjs +13 -14
  60. package/dist/components/faq/index.cjs +14 -15
  61. package/dist/components/features/approval-level.d.ts +6 -12
  62. package/dist/components/features/approval-level.d.ts.map +1 -1
  63. package/dist/components/features/approval-level.js +45 -55
  64. package/dist/components/features/index.cjs +16 -16
  65. package/dist/components/features/notifications/approval-request-notification-tile.d.ts.map +1 -1
  66. package/dist/components/features/notifications/approval-request-notification-tile.js +71 -48
  67. package/dist/components/features/notifications/types.d.ts +2 -0
  68. package/dist/components/features/notifications/types.d.ts.map +1 -1
  69. package/dist/components/features/notifications/types.js +3 -1
  70. package/dist/components/features/policy-configuration-panel.d.ts.map +1 -1
  71. package/dist/components/features/policy-configuration-panel.js +75 -64
  72. package/dist/components/help-center-pages/index.cjs +78 -79
  73. package/dist/components/index.cjs +57 -59
  74. package/dist/components/meeting-scheduler/index.cjs +61 -61
  75. package/dist/components/navigation/index.cjs +15 -16
  76. package/dist/components/onboarding-guides/index.cjs +14 -15
  77. package/dist/components/product-demo/index.cjs +23 -24
  78. package/dist/components/tickets/index.cjs +17 -18
  79. package/dist/components/ui/file-manager/index.cjs +8 -9
  80. package/dist/components/ui/index.cjs +16 -18
  81. package/dist/components/ui/radio-group.d.ts.map +1 -1
  82. package/dist/components/ui/radio-group.js +8 -2
  83. package/dist/components/ui/tab-selector.d.ts +7 -1
  84. package/dist/components/ui/tab-selector.d.ts.map +1 -1
  85. package/dist/components/ui/tab-selector.js +22 -3
  86. package/dist/{devices-NGCTSXIU.cjs → devices-7PT6MPJI.cjs} +13 -14
  87. package/dist/{embeddable-chat-322NDFP5.cjs → embeddable-chat-5NY76K7K.cjs} +84 -85
  88. package/dist/index.cjs +23 -25
  89. package/dist/{knowledge-75PO5DYS.cjs → knowledge-J6N7IEVI.cjs} +13 -14
  90. package/dist/{logs-PZESOAIG.cjs → logs-D6KQP2BX.cjs} +19 -20
  91. package/dist/{policies-6XNMBFWO.cjs → policies-J7MCOL3C.cjs} +16 -17
  92. package/dist/{remote-session-Q2FIBCGT.cjs → remote-session-PXHA5KFK.cjs} +8 -9
  93. package/dist/{scripts-B3JW6TPF.cjs → scripts-VURXIHVS.cjs} +19 -20
  94. package/dist/{software-update-NWP542J7.cjs → software-update-6SHUBDIE.cjs} +16 -17
  95. package/dist/{tickets-board-7FLGQEHF.cjs → tickets-board-NLCN7WNX.cjs} +9 -9
  96. package/package.json +1 -1
  97. package/src/chat-protocol/events.ts +4 -1
  98. package/src/chat-protocol/nats-decoder.ts +4 -0
  99. package/src/chat-protocol/policy-review.ts +71 -0
  100. package/src/components/chat/approval-batch-message.tsx +47 -10
  101. package/src/components/chat/policy-review.tsx +90 -0
  102. package/src/components/chat/stream/message-mutations.ts +4 -0
  103. package/src/components/chat/tool-execution-display.tsx +23 -4
  104. package/src/components/chat/types/message.types.ts +42 -2
  105. package/src/components/chat/utils/extract-incomplete-message-state.ts +2 -0
  106. package/src/components/chat/utils/message-segment-accumulator.ts +3 -0
  107. package/src/components/chat/utils/process-historical-messages.ts +14 -3
  108. package/src/components/features/approval-level.tsx +74 -78
  109. package/src/components/features/notifications/approval-request-notification-tile.tsx +75 -50
  110. package/src/components/features/notifications/types.ts +4 -0
  111. package/src/components/features/policy-configuration-panel.tsx +100 -83
  112. package/src/components/ui/radio-group.tsx +20 -2
  113. package/src/components/ui/tab-selector.tsx +26 -3
  114. package/dist/chunk-N3MBQRCQ.cjs +0 -41
@@ -1,18 +1,22 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { ChevronDown, Shield } from "lucide-react";
4
3
  import { useState } from "react";
5
4
  import { cn } from "../../utils/cn.js";
6
5
  import { useCollapsible } from "../chat/hooks/use-collapsible.js";
6
+ import { Chevron02DownIcon, ShieldIcon } from "../icons-v2-generated/index.js";
7
7
  import { TextLineSkeleton } from "../loading/unified-skeleton.js";
8
8
  import { ToolIcon } from "../tool-icon.js";
9
9
  import { Button } from "../ui/button/index.js";
10
- import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../ui/dropdown-menu.js";
10
+ import {
11
+ DropdownMenu,
12
+ DropdownMenuContent,
13
+ DropdownMenuItem,
14
+ DropdownMenuSeparator,
15
+ DropdownMenuTrigger
16
+ } from "../ui/dropdown-menu.js";
11
17
  import { loadingItemProps, useLoadingScope } from "../ui/loading-scope.js";
12
- import { APPROVAL_LEVEL_META, APPROVAL_LEVELS } from "./approval-level.js";
13
- const approvalLevelOptions = APPROVAL_LEVELS.map((value) => ({ value, label: APPROVAL_LEVEL_META[value].label }));
14
- const POLICY_LEVEL_WIDTH = "w-[180px]";
15
- const CATEGORY_LEVEL_WIDTH = "w-[256px]";
18
+ import { APPROVAL_LEVEL_META, APPROVAL_LEVELS, ApprovalLevelView } from "./approval-level.js";
19
+ const CATEGORY_LEVEL_WIDTH = "w-[296px]";
16
20
  const POLICY_CONFIGURATION_PANEL_SKELETON_CATEGORIES = 4;
17
21
  const CATEGORY_HEADER_CLASS = "flex items-center gap-[var(--spacing-system-m)] border-t border-ods-border bg-ods-card py-[var(--spacing-system-s)] pl-[var(--spacing-system-m)] pr-[var(--spacing-system-xsf)] first:border-t-0";
18
22
  const ICON_TILE_SIZE_CLASS = "h-8 w-8 shrink-0 rounded-md";
@@ -22,56 +26,59 @@ const CATEGORY_LEVEL_COLUMN_CLASS = cn(
22
26
  "hidden shrink-0 px-[var(--spacing-system-sf)] py-[var(--spacing-system-xsf)] content-md:block",
23
27
  CATEGORY_LEVEL_WIDTH
24
28
  );
25
- const CHEVRON_CLASS = "h-6 w-6 text-ods-text-primary transition-transform duration-300";
26
- const getApprovalLevelLabel = (level) => APPROVAL_LEVEL_META[level]?.label ?? level;
29
+ const CHEVRON_CLASS = "!h-6 !w-6 text-ods-text-primary transition-transform duration-300";
30
+ const LevelOption = ({ level }) => {
31
+ const { label, Icon, toneClassName } = APPROVAL_LEVEL_META[level];
32
+ return /* @__PURE__ */ jsxs("span", { className: "inline-flex min-w-0 items-center gap-[var(--spacing-system-xsf)]", children: [
33
+ /* @__PURE__ */ jsx(Icon, { size: 24, className: cn("shrink-0", toneClassName), "aria-hidden": true }),
34
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: label })
35
+ ] });
36
+ };
37
+ const LEVEL_MENU_ITEM_CLASS = "p-[var(--spacing-system-sf)] text-h4 [&_svg]:size-4 md:[&_svg]:size-6";
27
38
  const ApprovalLevelDropdown = ({ value, onChange, allowClear = false, triggerClassName, contentClassName, disabled }) => /* @__PURE__ */ jsxs(DropdownMenu, { children: [
28
39
  /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx(
29
40
  Button,
30
41
  {
31
42
  variant: "outline",
32
43
  disabled,
33
- rightIcon: /* @__PURE__ */ jsx(ChevronDown, { className: "h-6 w-6 text-ods-text-secondary" }),
44
+ rightIcon: /* @__PURE__ */ jsx(Chevron02DownIcon, { className: "!h-6 !w-6 text-ods-text-secondary" }),
34
45
  className: cn(
35
- "flex h-auto items-center justify-between gap-[var(--spacing-system-xsf)] rounded-md border border-ods-border bg-ods-card !px-[var(--spacing-system-xsf)] py-[var(--spacing-system-xsf)] transition-colors !text-h6 hover:bg-ods-bg-hover",
46
+ "flex h-auto items-center justify-between gap-[var(--spacing-system-xsf)] rounded-md border border-ods-border bg-ods-card !p-[var(--spacing-system-sf)] transition-colors !text-h4 hover:bg-ods-bg-hover",
36
47
  value ? "text-ods-text-primary" : "text-ods-text-secondary",
37
48
  triggerClassName
38
49
  ),
39
- children: value ? getApprovalLevelLabel(value) : "Set Global Permission"
50
+ children: value ? /* @__PURE__ */ jsx(LevelOption, { level: value }) : "Set Global Permission"
40
51
  }
41
52
  ) }),
42
53
  /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", className: contentClassName, children: [
43
- allowClear && /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => onChange(void 0), className: "text-h6", children: "Clear Global Permission" }),
44
- approvalLevelOptions.map((option) => /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => onChange(option.value), className: "text-h6", children: option.label }, option.value))
54
+ APPROVAL_LEVELS.map((level) => /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => onChange(level), className: LEVEL_MENU_ITEM_CLASS, children: /* @__PURE__ */ jsx(LevelOption, { level }) }, level)),
55
+ allowClear && /* @__PURE__ */ jsxs(Fragment, { children: [
56
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
57
+ /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => onChange(void 0), className: LEVEL_MENU_ITEM_CLASS, children: "Clear Global Permission" })
58
+ ] })
45
59
  ] })
46
60
  ] });
47
61
  const PolicyRow = ({ policy, categoryId, editMode, onPermissionChange }) => {
48
- const handleChange = (level) => {
49
- if (level) onPermissionChange(categoryId, policy.id, level);
50
- };
62
+ const nameId = `policy-${categoryId}-${policy.id}`;
63
+ const level = policy.approvalLevel ? /* @__PURE__ */ jsx(
64
+ ApprovalLevelView,
65
+ {
66
+ value: policy.approvalLevel,
67
+ editable: editMode,
68
+ onChange: (next) => onPermissionChange(categoryId, policy.id, next),
69
+ "aria-labelledby": nameId
70
+ }
71
+ ) : null;
51
72
  return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-[var(--spacing-system-m)] border-b border-ods-border bg-ods-bg px-[var(--spacing-system-m)] py-[var(--spacing-system-sf)] last:border-b-0 content-md:items-center", children: [
52
- /* @__PURE__ */ jsx("div", { className: ICON_TILE_CLASS, children: /* @__PURE__ */ jsx(ToolIcon, { toolType: policy.toolName, size: 16 }) }),
73
+ /* @__PURE__ */ jsx("div", { className: cn(ICON_TILE_CLASS, "text-ods-text-secondary", editMode && "hidden content-md:flex"), children: /* @__PURE__ */ jsx(ToolIcon, { toolType: policy.toolName, size: 16 }) }),
53
74
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
54
- /* @__PURE__ */ jsx("p", { className: "truncate text-ods-text-primary text-h4", title: policy.name, children: policy.name }),
55
- /* @__PURE__ */ jsx("p", { className: "break-all text-ods-text-secondary text-h6", children: policy.commandPattern }),
56
- editMode ? /* @__PURE__ */ jsx("div", { className: "mt-[var(--spacing-system-xsf)] content-md:hidden", children: /* @__PURE__ */ jsx(
57
- ApprovalLevelDropdown,
58
- {
59
- value: policy.approvalLevel,
60
- onChange: handleChange,
61
- triggerClassName: "w-full",
62
- contentClassName: POLICY_LEVEL_WIDTH
63
- }
64
- ) }) : policy.approvalLevel ? /* @__PURE__ */ jsx("span", { className: "text-ods-text-primary text-h4 content-md:hidden", children: getApprovalLevelLabel(policy.approvalLevel) }) : null
75
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-[var(--spacing-system-sf)]", children: [
76
+ /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsx("p", { id: nameId, className: "truncate text-ods-text-primary text-h4", title: policy.name, children: policy.name }) }),
77
+ editMode && /* @__PURE__ */ jsx("span", { className: "flex shrink-0 text-ods-text-secondary content-md:hidden", children: /* @__PURE__ */ jsx(ToolIcon, { toolType: policy.toolName, size: 16 }) })
78
+ ] }),
79
+ level && /* @__PURE__ */ jsx("div", { className: cn("flex content-md:hidden", editMode && "mt-[var(--spacing-system-sf)]"), children: level })
65
80
  ] }),
66
- /* @__PURE__ */ jsx("div", { className: "hidden shrink-0 content-md:block", children: editMode ? /* @__PURE__ */ jsx(
67
- ApprovalLevelDropdown,
68
- {
69
- value: policy.approvalLevel,
70
- onChange: handleChange,
71
- triggerClassName: POLICY_LEVEL_WIDTH,
72
- contentClassName: POLICY_LEVEL_WIDTH
73
- }
74
- ) : /* @__PURE__ */ jsx("div", { className: cn("px-[var(--spacing-system-sf)] py-[var(--spacing-system-xsf)]", POLICY_LEVEL_WIDTH), children: policy.approvalLevel && /* @__PURE__ */ jsx("span", { className: "text-ods-text-primary text-h4", children: getApprovalLevelLabel(policy.approvalLevel) }) }) })
81
+ level && /* @__PURE__ */ jsx("div", { className: "hidden shrink-0 items-center content-md:flex", children: level })
75
82
  ] });
76
83
  };
77
84
  const LOADING_CATEGORY = { id: "", name: "", policies: [] };
@@ -95,29 +102,22 @@ const CategorySection = ({
95
102
  "div",
96
103
  {
97
104
  ...loadingItemProps(props),
98
- className: cn(CATEGORY_HEADER_CLASS, !loading && "cursor-pointer transition-colors hover:bg-ods-bg-hover"),
105
+ className: cn(
106
+ CATEGORY_HEADER_CLASS,
107
+ !loading && "cursor-pointer transition-colors hover:bg-ods-bg-hover [&:has([data-bulk-level]:hover)]:bg-ods-card"
108
+ ),
99
109
  onClick: loading ? void 0 : () => onToggle(category.id),
100
110
  children: [
101
- /* @__PURE__ */ jsx("div", { className: ICON_TILE_CLASS, children: /* @__PURE__ */ jsx("div", { className: "text-ods-text-secondary", children: category.icon ?? /* @__PURE__ */ jsx(Shield, { className: "h-4 w-4" }) }) }),
111
+ /* @__PURE__ */ jsx("div", { className: ICON_TILE_CLASS, children: /* @__PURE__ */ jsx("div", { className: "text-ods-text-secondary", children: category.icon ?? /* @__PURE__ */ jsx(ShieldIcon, { size: 16 }) }) }),
102
112
  /* @__PURE__ */ jsxs("div", { className: CATEGORY_TEXT_CLASS, children: [
103
113
  category.name ? /* @__PURE__ */ jsx("p", { className: "truncate text-ods-text-primary text-h4", title: category.name, children: category.name }) : /* @__PURE__ */ jsx(TextLineSkeleton, { type: "h4", className: "w-40 max-w-full" }),
104
114
  loading ? /* @__PURE__ */ jsx(TextLineSkeleton, { type: "h6", className: "w-24" }) : /* @__PURE__ */ jsxs("p", { className: "text-ods-text-secondary text-h6", children: [
105
115
  category.policies.length,
106
- " Configurations"
107
- ] }),
108
- editMode && /* @__PURE__ */ jsx("div", { className: "mt-[var(--spacing-system-xsf)] content-md:hidden", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx(
109
- ApprovalLevelDropdown,
110
- {
111
- value: bulkLevel,
112
- onChange: handleBulkChange,
113
- allowClear: true,
114
- triggerClassName: "w-full",
115
- contentClassName: CATEGORY_LEVEL_WIDTH,
116
- disabled: loading
117
- }
118
- ) })
116
+ " ",
117
+ category.policies.length === 1 ? "Configuration" : "Configurations"
118
+ ] })
119
119
  ] }),
120
- editMode ? /* @__PURE__ */ jsx("div", { className: "hidden shrink-0 content-md:block", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx(
120
+ editMode ? /* @__PURE__ */ jsx("div", { "data-bulk-level": true, className: "hidden shrink-0 content-md:block", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx(
121
121
  ApprovalLevelDropdown,
122
122
  {
123
123
  value: bulkLevel,
@@ -138,8 +138,12 @@ const CategorySection = ({
138
138
  e.stopPropagation();
139
139
  onToggle(category.id);
140
140
  },
141
- leftIcon: /* @__PURE__ */ jsx(ChevronDown, { className: cn(CHEVRON_CLASS, isExpanded && "rotate-180") }),
142
- className: "h-auto w-auto shrink-0 rounded-md",
141
+ leftIcon: /* @__PURE__ */ jsx(Chevron02DownIcon, { className: cn(CHEVRON_CLASS, isExpanded && "rotate-180") }),
142
+ className: cn(
143
+ "h-auto w-auto shrink-0 rounded-md !p-[var(--spacing-system-xsf)] content-md:!p-[var(--spacing-system-sf)]",
144
+ // The row is the hover; the chevron adds none of its own.
145
+ "hover:bg-transparent active:bg-transparent"
146
+ ),
143
147
  "aria-label": isExpanded ? "Collapse" : "Expand"
144
148
  }
145
149
  )
@@ -157,16 +161,23 @@ const CategorySection = ({
157
161
  visibility: isExpanded ? "visible" : "hidden"
158
162
  },
159
163
  className: isExpanded ? "opacity-100" : "opacity-0",
160
- children: /* @__PURE__ */ jsx("div", { ref: innerRef, className: "px-[var(--spacing-system-mf)] pb-[var(--spacing-system-mf)] pt-0", children: /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-md border border-ods-border", children: (loading ? [] : category.policies).map((policy) => /* @__PURE__ */ jsx(
161
- PolicyRow,
164
+ children: /* @__PURE__ */ jsx(
165
+ "div",
162
166
  {
163
- policy,
164
- categoryId: category.id,
165
- editMode,
166
- onPermissionChange: onPolicyPermissionChange
167
- },
168
- policy.id
169
- )) }) })
167
+ ref: innerRef,
168
+ className: "border-t border-ods-border px-[var(--spacing-system-mf)] pb-[var(--spacing-system-mf)] pt-[var(--spacing-system-mf)]",
169
+ children: /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-md border border-ods-border", children: (loading ? [] : category.policies).map((policy) => /* @__PURE__ */ jsx(
170
+ PolicyRow,
171
+ {
172
+ policy,
173
+ categoryId: category.id,
174
+ editMode,
175
+ onPermissionChange: onPolicyPermissionChange
176
+ },
177
+ policy.id
178
+ )) })
179
+ }
180
+ )
170
181
  }
171
182
  )
172
183
  ] });