@module-federation/devtools 0.21.6 → 0.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/es/App.css +12 -0
  2. package/dist/es/App.js +330 -22
  3. package/dist/es/App.module.js +1 -1
  4. package/dist/es/App_module.css +291 -5
  5. package/dist/es/component/DependencyGraph/index.js +205 -0
  6. package/dist/es/component/DependencyGraph/index.module.js +5 -0
  7. package/dist/es/component/DependencyGraph/index_module.css +97 -0
  8. package/dist/es/component/{GraphItem → DependencyGraphItem}/index.js +15 -6
  9. package/dist/es/component/DependencyGraphItem/index.module.js +5 -0
  10. package/dist/es/component/DependencyGraphItem/index_module.css +95 -0
  11. package/dist/es/component/Form/index.js +191 -109
  12. package/dist/es/component/Form/index.module.js +1 -1
  13. package/dist/es/component/Form/index_module.css +179 -25
  14. package/dist/es/component/Layout/index.js +300 -49
  15. package/dist/es/component/Layout/index.module.js +1 -1
  16. package/dist/es/component/Layout/index_module.css +52 -32
  17. package/dist/es/component/ModuleInfo/index.js +289 -0
  18. package/dist/es/component/ModuleInfo/index.module.js +5 -0
  19. package/dist/es/component/ModuleInfo/index_module.css +183 -0
  20. package/dist/es/component/SharedDepsExplorer/FocusResultDisplay.js +33 -0
  21. package/dist/es/component/SharedDepsExplorer/FocusResultDisplay.module.js +5 -0
  22. package/dist/es/component/SharedDepsExplorer/FocusResultDisplay_module.css +45 -0
  23. package/dist/es/component/SharedDepsExplorer/index.js +506 -0
  24. package/dist/es/component/SharedDepsExplorer/index.module.js +5 -0
  25. package/dist/es/component/SharedDepsExplorer/index_module.css +457 -0
  26. package/dist/es/component/SharedDepsExplorer/share-utils.js +206 -0
  27. package/dist/es/template/constant.js +3 -19
  28. package/dist/es/utils/chrome/index.js +91 -38
  29. package/dist/es/utils/chrome/messages.js +6 -0
  30. package/dist/es/utils/chrome/override-remote.js +42 -0
  31. package/dist/es/utils/chrome/post-message-listener.js +2 -1
  32. package/dist/es/utils/chrome/post-message-start.js +10 -2
  33. package/dist/es/utils/chrome/storage.js +6 -1
  34. package/dist/es/utils/sdk/graph.js +25 -4
  35. package/dist/es/utils/sdk/index.js +9 -0
  36. package/dist/es/worker/index.js +168 -1
  37. package/dist/lib/App.css +12 -0
  38. package/dist/lib/App.js +321 -18
  39. package/dist/lib/App.module.js +1 -1
  40. package/dist/lib/App_module.css +291 -5
  41. package/dist/lib/component/DependencyGraph/index.js +227 -0
  42. package/dist/lib/component/{GraphItem → DependencyGraph}/index.module.js +1 -1
  43. package/dist/lib/component/DependencyGraph/index_module.css +97 -0
  44. package/dist/lib/component/{GraphItem → DependencyGraphItem}/index.js +18 -9
  45. package/dist/lib/component/{Graph → DependencyGraphItem}/index.module.js +1 -1
  46. package/dist/lib/component/DependencyGraphItem/index_module.css +95 -0
  47. package/dist/lib/component/Form/index.js +188 -107
  48. package/dist/lib/component/Form/index.module.js +1 -1
  49. package/dist/lib/component/Form/index_module.css +179 -25
  50. package/dist/lib/component/Layout/index.js +294 -47
  51. package/dist/lib/component/Layout/index.module.js +1 -1
  52. package/dist/lib/component/Layout/index_module.css +52 -32
  53. package/dist/lib/component/ModuleInfo/index.js +319 -0
  54. package/dist/lib/component/ModuleInfo/index.module.js +25 -0
  55. package/dist/lib/component/ModuleInfo/index_module.css +183 -0
  56. package/dist/lib/component/SharedDepsExplorer/FocusResultDisplay.js +63 -0
  57. package/dist/lib/component/SharedDepsExplorer/FocusResultDisplay.module.js +25 -0
  58. package/dist/lib/component/SharedDepsExplorer/FocusResultDisplay_module.css +45 -0
  59. package/dist/lib/component/SharedDepsExplorer/index.js +513 -0
  60. package/dist/lib/component/SharedDepsExplorer/index.module.js +25 -0
  61. package/dist/lib/component/SharedDepsExplorer/index_module.css +457 -0
  62. package/dist/lib/component/SharedDepsExplorer/share-utils.js +237 -0
  63. package/dist/lib/template/constant.js +4 -17
  64. package/dist/lib/utils/chrome/index.js +94 -38
  65. package/dist/lib/utils/chrome/messages.js +31 -0
  66. package/dist/lib/utils/chrome/override-remote.js +65 -0
  67. package/dist/lib/utils/chrome/post-message-listener.js +2 -1
  68. package/dist/lib/utils/chrome/post-message-start.js +10 -2
  69. package/dist/lib/utils/chrome/storage.js +5 -0
  70. package/dist/lib/utils/sdk/graph.js +25 -4
  71. package/dist/lib/utils/sdk/index.js +10 -0
  72. package/dist/lib/worker/index.js +156 -1
  73. package/dist/types/src/App.d.ts +2 -1
  74. package/dist/types/src/component/{Graph → DependencyGraph}/index.d.ts +0 -1
  75. package/dist/types/src/component/{GraphItem → DependencyGraphItem}/index.d.ts +0 -1
  76. package/dist/types/src/component/Form/index.d.ts +2 -0
  77. package/dist/types/src/component/Layout/index.d.ts +0 -1
  78. package/dist/types/src/component/ModuleInfo/index.d.ts +8 -0
  79. package/dist/types/src/component/SharedDepsExplorer/FocusResultDisplay.d.ts +15 -0
  80. package/dist/types/src/component/SharedDepsExplorer/index.d.ts +6 -0
  81. package/dist/types/src/component/SharedDepsExplorer/share-utils.d.ts +44 -0
  82. package/dist/types/src/init.d.ts +0 -1
  83. package/dist/types/src/template/constant.d.ts +2 -5
  84. package/dist/types/src/utils/chrome/index.d.ts +5 -3
  85. package/dist/types/src/utils/chrome/messages.d.ts +2 -0
  86. package/dist/types/src/utils/chrome/override-remote.d.ts +1 -0
  87. package/dist/types/src/utils/chrome/storage.d.ts +5 -4
  88. package/dist/types/src/utils/sdk/graph.d.ts +2 -1
  89. package/dist/types/src/utils/sdk/index.d.ts +1 -0
  90. package/dist/types/src/utils/types/common.d.ts +4 -0
  91. package/dist/types/src/worker/index.d.ts +1 -0
  92. package/package.json +16 -14
  93. package/dist/es/component/Graph/index.js +0 -127
  94. package/dist/es/component/Graph/index.module.js +0 -5
  95. package/dist/es/component/Graph/index_module.css +0 -12
  96. package/dist/es/component/GraphItem/index.module.js +0 -5
  97. package/dist/es/component/GraphItem/index_module.css +0 -61
  98. package/dist/lib/component/Graph/index.js +0 -149
  99. package/dist/lib/component/Graph/index_module.css +0 -12
  100. package/dist/lib/component/GraphItem/index_module.css +0 -61
@@ -18,9 +18,8 @@ var __async = (__this, __arguments, generator) => {
18
18
  step((generator = generator.apply(__this, __arguments)).next());
19
19
  });
20
20
  };
21
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
21
+ import { jsx, jsxs } from "react/jsx-runtime";
22
22
  import { useEffect } from "react";
23
- import { flushSync } from "react-dom";
24
23
  import {
25
24
  Checkbox,
26
25
  Button,
@@ -34,7 +33,8 @@ import {
34
33
  import {
35
34
  IconDelete,
36
35
  IconPlus,
37
- IconInfoCircle
36
+ IconInfoCircle,
37
+ IconQuestionCircle
38
38
  } from "@arco-design/web-react/icon";
39
39
  import { defaultDataItem, proxyFormField } from "../../template/constant";
40
40
  import {
@@ -60,9 +60,15 @@ const FormComponent = (props) => {
60
60
  versionList,
61
61
  setVersionList,
62
62
  getVersion,
63
- customValueValidate
63
+ customValueValidate,
64
+ enableClip,
65
+ onClipChange
64
66
  } = props;
65
- const { moduleInfo } = window.__FEDERATION__;
67
+ const federation = window.__FEDERATION__ || {
68
+ moduleInfo: {},
69
+ originModuleInfo: {}
70
+ };
71
+ const { moduleInfo } = federation;
66
72
  let { producer } = separateType(moduleInfo);
67
73
  const filterDupMap = /* @__PURE__ */ new Map();
68
74
  producer = producer.filter((t) => {
@@ -113,11 +119,16 @@ const FormComponent = (props) => {
113
119
  }
114
120
  if (key) {
115
121
  statusSet[index].keyStatus = true;
116
- flushSync(() => setFormStatus(statusSet));
117
- return callback();
122
+ setTimeout(() => {
123
+ setFormStatus(statusSet);
124
+ callback();
125
+ }, 0);
126
+ return;
118
127
  }
119
128
  statusSet[index].keyStatus = false;
120
- flushSync(() => setFormStatus(statusSet));
129
+ setTimeout(() => {
130
+ setFormStatus(statusSet);
131
+ }, 0);
121
132
  return callback("Module name can not be empty");
122
133
  };
123
134
  const validateValue = (value, callback, index) => {
@@ -134,11 +145,16 @@ const FormComponent = (props) => {
134
145
  }
135
146
  if (validateCustom(value) || validateSemver(value) || validatePort(value) || (customValueValidate == null ? void 0 : customValueValidate(value))) {
136
147
  statusSet[index].valueStatus = true;
137
- flushSync(() => setFormStatus(statusSet));
138
- return callback();
148
+ setTimeout(() => {
149
+ setFormStatus(statusSet);
150
+ callback();
151
+ }, 0);
152
+ return;
139
153
  }
140
154
  statusSet[index].valueStatus = false;
141
- flushSync(() => setFormStatus(statusSet));
155
+ setTimeout(() => {
156
+ setFormStatus(statusSet);
157
+ }, 0);
142
158
  return callback(
143
159
  "The module information format is incorrect, check the format in the upper left corner"
144
160
  );
@@ -158,6 +174,9 @@ const FormComponent = (props) => {
158
174
  const hmrChange = (on) => {
159
175
  onHMRChange(on);
160
176
  };
177
+ const handleSwitchChange = (on) => {
178
+ onClipChange(on);
179
+ };
161
180
  const onKeyChange = (key, index) => __async(void 0, null, function* () {
162
181
  const version = yield getVersion == null ? void 0 : getVersion(key);
163
182
  if (version) {
@@ -166,31 +185,52 @@ const FormComponent = (props) => {
166
185
  setVersionList == null ? void 0 : setVersionList(list);
167
186
  }
168
187
  });
169
- return /* @__PURE__ */ jsx(FormList, { field: proxyFormField, children: (fields, { add, remove }) => /* @__PURE__ */ jsxs("div", { children: [
170
- /* @__PURE__ */ jsxs("div", { className: styles.header, children: [
171
- /* @__PURE__ */ jsx(
172
- Tooltip,
173
- {
174
- content: /* @__PURE__ */ jsx("div", { children: "Example: Customize the remote module address, which should end with 「.json」, for example key: @module-federation/button, value: http://localhost:3000/mf-manifest.json" }),
175
- children: /* @__PURE__ */ jsx(IconInfoCircle, {})
176
- }
177
- ),
178
- /* @__PURE__ */ jsx("div", { className: styles.title, children: "Module Proxy" }),
179
- /* @__PURE__ */ jsx(
180
- Button,
181
- {
182
- icon: /* @__PURE__ */ jsx(IconPlus, {}),
183
- shape: "circle",
184
- className: styles.add,
185
- onClick: () => onAdd(add),
186
- "data-set-e2e": "e2eAdd"
187
- }
188
- ),
189
- /* @__PURE__ */ jsxs("div", { className: styles.status, children: [
190
- /* @__PURE__ */ jsx(Badge, { color: condition.color, className: styles.badge }),
191
- /* @__PURE__ */ jsx("span", { className: styles.message, children: condition.message }),
192
- /* @__PURE__ */ jsxs("span", { className: styles.headerSlot, children: [
188
+ return /* @__PURE__ */ jsx(FormList, { field: proxyFormField, children: (fields, { add, remove }) => /* @__PURE__ */ jsxs("div", { className: styles.wrapper, children: [
189
+ /* @__PURE__ */ jsxs("div", { className: styles.sectionHeader, children: [
190
+ /* @__PURE__ */ jsxs("div", { className: styles.heading, children: [
191
+ /* @__PURE__ */ jsxs("div", { className: styles.titleRow, children: [
192
+ /* @__PURE__ */ jsx(
193
+ Tooltip,
194
+ {
195
+ content: /* @__PURE__ */ jsx("div", { children: "Example: Customise the remote module address ending with 「.json」. For instance key: @module-federation/button, value: http://localhost:3000/mf-manifest.json" }),
196
+ children: /* @__PURE__ */ jsx(IconInfoCircle, {})
197
+ }
198
+ ),
199
+ /* @__PURE__ */ jsx("span", { className: styles.title, children: "Proxy Overrides" }),
200
+ /* @__PURE__ */ jsxs(
201
+ "span",
202
+ {
203
+ className: styles.statusMessage,
204
+ style: { marginLeft: 8 },
205
+ children: [
206
+ /* @__PURE__ */ jsx(Badge, { color: condition.color, className: styles.badge }),
207
+ condition.message
208
+ ]
209
+ }
210
+ )
211
+ ] }),
212
+ /* @__PURE__ */ jsx("span", { className: styles.subtitle, children: "Point consumers to specific remote bundles or manifests for quicker validation." })
213
+ ] }),
214
+ /* @__PURE__ */ jsxs("div", { className: styles.headerActions, children: [
215
+ /* @__PURE__ */ jsxs("span", { className: styles.hmrArea, children: [
193
216
  props.headerSlot,
217
+ /* @__PURE__ */ jsx(
218
+ Switch,
219
+ {
220
+ checked: enableClip,
221
+ checkedText: "Enable Clip",
222
+ uncheckedText: "Disable Clip",
223
+ onChange: handleSwitchChange,
224
+ className: styles.switch
225
+ }
226
+ ),
227
+ /* @__PURE__ */ jsx(Tooltip, { content: "After enabling data clipping, snapshot modules and shared information will be removed, affecting preloading logic.", children: /* @__PURE__ */ jsx(
228
+ IconQuestionCircle,
229
+ {
230
+ style: { marginLeft: 5, cursor: "pointer" }
231
+ }
232
+ ) }),
233
+ /* @__PURE__ */ jsx("div", { className: styles.divider }),
194
234
  /* @__PURE__ */ jsx(
195
235
  Switch,
196
236
  {
@@ -201,85 +241,127 @@ const FormComponent = (props) => {
201
241
  className: styles.switch
202
242
  }
203
243
  )
204
- ] })
244
+ ] }),
245
+ /* @__PURE__ */ jsx(
246
+ Button,
247
+ {
248
+ icon: /* @__PURE__ */ jsx(IconPlus, {}),
249
+ shape: "circle",
250
+ className: styles.add,
251
+ onClick: () => onAdd(add),
252
+ "data-set-e2e": "e2eAdd",
253
+ type: "primary"
254
+ }
255
+ )
205
256
  ] })
206
257
  ] }),
207
- fields.length ? /* @__PURE__ */ jsx(Fragment, { children: fields.map((item, index) => {
258
+ fields.length ? /* @__PURE__ */ jsx("div", { className: styles.rules, children: fields.map((item, index) => {
208
259
  var _a, _b;
209
- return /* @__PURE__ */ jsxs(
210
- "div",
211
- {
212
- className: styles.container,
213
- "data-set-e2e": "e2eProxyItem",
214
- children: [
215
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
216
- FormItem,
217
- {
218
- field: `${item.field}.checked`,
219
- triggerPropName: "checked",
220
- children: /* @__PURE__ */ jsx(Checkbox, { className: styles.checkBox })
221
- }
222
- ) }),
223
- /* @__PURE__ */ jsx("div", { className: styles.input, children: /* @__PURE__ */ jsx(
224
- FormItem,
225
- {
226
- field: `${item.field}.key`,
227
- rules: [
228
- {
229
- validator: (value, cb) => validateKey(value, cb, index)
230
- }
231
- ],
232
- children: /* @__PURE__ */ jsx(
233
- Select,
234
- {
235
- "data-set-e2e": "e2eProxyKey",
236
- placeholder: "Module Name",
237
- onChange: (key) => onKeyChange(key, index),
238
- allowClear: true,
239
- showSearch: true,
240
- children: formatProducer.map((item2) => /* @__PURE__ */ jsx(Option, { value: item2.value, children: item2.label }, item2.value))
241
- }
242
- )
243
- }
244
- ) }),
245
- /* @__PURE__ */ jsx("div", { className: styles.input, children: /* @__PURE__ */ jsx(
246
- FormItem,
247
- {
248
- field: `${item.field}.value`,
249
- rules: [
250
- {
251
- validator: (value, cb) => validateValue(value, cb, index)
260
+ return /* @__PURE__ */ jsxs("div", { className: styles.ruleCard, children: [
261
+ /* @__PURE__ */ jsxs("div", { className: styles.ruleHeader, children: [
262
+ /* @__PURE__ */ jsx(
263
+ FormItem,
264
+ {
265
+ field: `${item.field}.checked`,
266
+ triggerPropName: "checked",
267
+ children: /* @__PURE__ */ jsx(Checkbox, { className: styles.toggle })
268
+ }
269
+ ),
270
+ /* @__PURE__ */ jsx(
271
+ Button,
272
+ {
273
+ icon: /* @__PURE__ */ jsx(IconDelete, {}),
274
+ shape: "circle",
275
+ status: "danger",
276
+ className: styles.delete,
277
+ "data-set-e2e": "e2eDelete",
278
+ onClick: () => onRemove(remove, index)
279
+ }
280
+ )
281
+ ] }),
282
+ /* @__PURE__ */ jsxs("div", { className: styles.inputs, "data-set-e2e": "e2eProxyItem", children: [
283
+ /* @__PURE__ */ jsx(
284
+ FormItem,
285
+ {
286
+ field: `${item.field}.key`,
287
+ rules: [
288
+ {
289
+ validator: (value, cb) => {
290
+ const isValid = Boolean(value);
291
+ if (isValid) {
292
+ cb();
293
+ validateKey(value, () => {
294
+ }, index);
295
+ } else {
296
+ cb("Module name can not be empty");
297
+ validateKey(value, () => {
298
+ }, index);
299
+ }
252
300
  }
253
- ],
254
- children: /* @__PURE__ */ jsx(
255
- Select,
256
- {
257
- "data-set-e2e": "e2eProxyValue",
258
- placeholder: "Custom Manifest URL",
259
- allowClear: true,
260
- showSearch: true,
261
- allowCreate: true,
262
- children: (_b = (_a = versionList || []) == null ? void 0 : _a[index]) == null ? void 0 : _b.map((version) => /* @__PURE__ */ jsx(Option, { value: version, children: version }, version))
301
+ }
302
+ ],
303
+ className: styles.field,
304
+ children: /* @__PURE__ */ jsx(
305
+ Select,
306
+ {
307
+ "data-set-e2e": "e2eProxyKey",
308
+ placeholder: "Module Name",
309
+ onChange: (key) => onKeyChange(key, index),
310
+ allowClear: true,
311
+ showSearch: true,
312
+ dropdownMenuClassName: styles.dropdown,
313
+ children: formatProducer.map((item2) => /* @__PURE__ */ jsx(Option, { value: item2.value, children: item2.label }, item2.value))
314
+ }
315
+ )
316
+ }
317
+ ),
318
+ /* @__PURE__ */ jsx(
319
+ FormItem,
320
+ {
321
+ field: `${item.field}.value`,
322
+ rules: [
323
+ {
324
+ validator: (value, cb) => {
325
+ const isValid = validateCustom(value) || validateSemver(value) || validatePort(value) || (customValueValidate == null ? void 0 : customValueValidate(value));
326
+ if (isValid) {
327
+ cb();
328
+ validateValue(value, () => {
329
+ }, index);
330
+ } else {
331
+ cb(
332
+ "The module information format is incorrect, check the format in the upper left corner"
333
+ );
334
+ validateValue(value, () => {
335
+ }, index);
336
+ }
263
337
  }
264
- )
265
- }
266
- ) }),
267
- /* @__PURE__ */ jsx(
268
- Button,
269
- {
270
- icon: /* @__PURE__ */ jsx(IconDelete, {}),
271
- shape: "circle",
272
- status: "danger",
273
- className: styles.delete,
274
- "data-set-e2e": "e2eDelete",
275
- onClick: () => onRemove(remove, index)
276
- }
277
- )
278
- ]
279
- },
280
- item.field
281
- );
282
- }) }) : /* @__PURE__ */ jsx(Empty, {})
338
+ }
339
+ ],
340
+ className: styles.field,
341
+ children: /* @__PURE__ */ jsx(
342
+ Select,
343
+ {
344
+ "data-set-e2e": "e2eProxyValue",
345
+ placeholder: "Custom Manifest URL",
346
+ allowClear: true,
347
+ showSearch: true,
348
+ allowCreate: true,
349
+ dropdownMenuClassName: styles.dropdown,
350
+ children: (_b = (_a = versionList || []) == null ? void 0 : _a[index]) == null ? void 0 : _b.map((version) => /* @__PURE__ */ jsx(Option, { value: version, children: version }, version))
351
+ }
352
+ )
353
+ }
354
+ )
355
+ ] })
356
+ ] }, item.field);
357
+ }) }) : /* @__PURE__ */ jsx("div", { className: styles.emptyWrapper, children: /* @__PURE__ */ jsx(
358
+ Empty,
359
+ {
360
+ description: "Add your first override to begin redirecting remotes.",
361
+ className: styles.empty
362
+ }
363
+ ) }),
364
+ /* @__PURE__ */ jsx("div", { className: styles.footerHint, children: "Changes persist per domain and refresh the inspected tab when valid." })
283
365
  ] }) });
284
366
  };
285
367
  var Form_default = FormComponent;
@@ -1,5 +1,5 @@
1
1
  import "./index_module.css";
2
- var index_module_default = { "container": "container_20b79", "checkBox": "checkBox_20b79", "input": "input_20b79", "delete": "delete_20b79", "header": "header_20b79", "add": "add_20b79", "title": "title_20b79", "status": "status_20b79", "message": "message_20b79", "switch": "switch_20b79", "headerSlot": "headerSlot_20b79", "badge": "badge_20b79" };
2
+ var index_module_default = { "wrapper": "wrapper_20b79", "sectionHeader": "sectionHeader_20b79", "heading": "heading_20b79", "titleRow": "titleRow_20b79", "title": "title_20b79", "subtitle": "subtitle_20b79", "headerActions": "headerActions_20b79", "add": "add_20b79", "badge": "badge_20b79", "statusMessage": "statusMessage_20b79", "divider": "divider_20b79", "hmrArea": "hmrArea_20b79", "switch": "switch_20b79", "rules": "rules_20b79", "ruleCard": "ruleCard_20b79", "ruleHeader": "ruleHeader_20b79", "toggle": "toggle_20b79", "inputs": "inputs_20b79", "field": "field_20b79", "dropdown": "dropdown_20b79", "delete": "delete_20b79", "emptyWrapper": "emptyWrapper_20b79", "empty": "empty_20b79", "footerHint": "footerHint_20b79" };
3
3
  export {
4
4
  index_module_default as default
5
5
  };
@@ -1,47 +1,201 @@
1
- .container_20b79 {
1
+ .wrapper_20b79 {
2
2
  display: flex;
3
- justify-content: center;
3
+ flex-direction: column;
4
+ gap: 18px;
5
+ color: #1f2937;
4
6
  }
5
- .container_20b79 .checkBox_20b79 {
6
- transform: scale(1.25);
7
+
8
+ .sectionHeader_20b79 {
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: space-between;
12
+ gap: 18px;
13
+ padding: 12px 16px;
14
+ background: rgba(228, 228, 231, 0.5);
15
+ border: 1px solid rgba(228, 228, 231, 0.5);
7
16
  }
8
- .container_20b79 .input_20b79 {
9
- margin: 0 1vw 0 0;
17
+
18
+ .heading_20b79 {
19
+ display: flex;
20
+ flex-direction: column;
21
+ gap: 6px;
10
22
  flex: 1 1;
11
23
  }
12
- .container_20b79 .delete_20b79 {
13
- margin: 0 0 0 1vw;
24
+
25
+ .titleRow_20b79 {
26
+ display: flex;
27
+ align-items: center;
28
+ gap: 10px;
29
+ font-size: 16px;
30
+ font-weight: 600;
31
+ color: #1f2937;
32
+ }
33
+ .titleRow_20b79 .arco-icon {
34
+ color: rgba(23, 75, 180, 0.9);
35
+ font-size: 18px;
36
+ }
37
+
38
+ .title_20b79 {
39
+ letter-spacing: 0.02em;
14
40
  }
15
41
 
16
- .header_20b79 {
42
+ .subtitle_20b79 {
43
+ font-size: 12px;
44
+ color: #4b5563;
45
+ line-height: 1.5;
46
+ }
47
+
48
+ .headerActions_20b79 {
17
49
  display: flex;
18
50
  align-items: center;
19
- margin: 1vh 0;
51
+ gap: 12px;
52
+ flex-wrap: wrap;
53
+ }
54
+ .headerActions_20b79 .add_20b79 {
55
+ box-shadow: 0 8px 16px rgba(243, 244, 246, 0.9);
20
56
  }
21
- .header_20b79 .add_20b79 {
22
- margin: 0 0.5vw;
57
+
58
+ .badge_20b79 {
59
+ transform: scale(1.4);
60
+ margin-right: 6px;
61
+ }
62
+
63
+ .statusMessage_20b79 {
64
+ font-size: 12px;
65
+ color: #4b5563;
66
+ max-width: 260px;
67
+ line-height: 1.4;
23
68
  }
24
- .header_20b79 .title_20b79 {
25
- margin: 0 0.5vw;
69
+
70
+ .divider_20b79 {
71
+ width: 1px;
72
+ height: 1px;
73
+ background: rgba(96, 165, 250, 0.3);
26
74
  }
27
- .header_20b79 .status_20b79 {
75
+
76
+ .hmrArea_20b79 {
28
77
  display: flex;
29
- flex: 1 1;
30
- justify-content: flex-end;
31
78
  align-items: center;
79
+ gap: 8px;
80
+ font-size: 12px;
81
+ color: #4b5563;
32
82
  }
33
- .header_20b79 .status_20b79 .message_20b79 {
34
- flex: 1 1;
83
+
84
+ .switch_20b79 .arco-switch {
85
+ background: rgba(243, 244, 246, 0.9);
86
+ border-color: rgba(96, 165, 250, 0.35);
87
+ color: #4b5563;
35
88
  }
36
- .header_20b79 .status_20b79 .switch_20b79 {
37
- margin-left: 0.5vw;
89
+ .switch_20b79 .arco-switch-checked {
90
+ background: rgba(243, 244, 246, 0.9);
91
+ border-color: rgba(96, 165, 250, 0.35);
38
92
  }
39
- .header_20b79 .headerSlot_20b79 {
93
+
94
+ .rules_20b79 {
95
+ display: flex;
96
+ flex-direction: column;
97
+ gap: 16px;
98
+ }
99
+
100
+ .ruleCard_20b79 {
101
+ display: flex;
102
+ flex-direction: column;
103
+ gap: 14px;
104
+ padding: 18px;
105
+ border-radius: 18px;
106
+ border: 1px solid rgba(228, 228, 231, 0.5);
107
+ background: rgba(255, 255, 255, 0.9);
108
+ box-shadow: 0 15px 32px rgba(8, 11, 25, 0.45);
109
+ }
110
+
111
+ .ruleHeader_20b79 {
40
112
  display: flex;
41
113
  align-items: center;
114
+ justify-content: space-between;
42
115
  }
43
- .header_20b79 .badge_20b79 {
116
+
117
+ .toggle_20b79 .arco-checkbox {
118
+ transform: scale(1.4);
119
+ }
120
+ .toggle_20b79 .arco-checkbox-icon {
121
+ border-radius: 6px;
122
+ border-color: rgba(228, 228, 231, 0.5);
123
+ background: rgba(243, 244, 246, 0.9);
124
+ }
125
+ .toggle_20b79 .arco-checkbox-checked .arco-checkbox-icon {
126
+ background: rgba(243, 244, 246, 0.9);
127
+ border-color: rgba(228, 228, 231, 0.5);
128
+ }
129
+
130
+ .inputs_20b79 {
131
+ display: flex;
132
+ flex-direction: column;
133
+ gap: 12px;
134
+ }
135
+
136
+ @media (min-width: 520px) {
137
+ .inputs_20b79 {
138
+ flex-direction: row;
139
+ }
140
+ }
141
+ .field_20b79 {
142
+ flex: 1 1;
143
+ }
144
+ .field_20b79 .arco-form-item-content {
145
+ width: 100%;
146
+ }
147
+ .field_20b79 .arco-select-view {
148
+ background: rgba(243, 244, 246, 0.9);
149
+ border: 1px solid rgba(228, 228, 231, 0.5);
150
+ border-radius: 14px;
151
+ color: #1f2937;
152
+ min-height: 42px;
153
+ padding: 6px 12px;
154
+ }
155
+ .field_20b79 .arco-select-view-input {
156
+ color: #4b5563;
157
+ }
158
+ .field_20b79 .arco-select-view-placeholder {
159
+ color: #4b5563;
160
+ }
161
+
162
+ .dropdown_20b79 {
163
+ background: rgba(255, 255, 255, 0.9);
164
+ border: 1px solid rgba(228, 228, 231, 0.5);
165
+ box-shadow: 0 16px 30px rgba(8, 11, 25, 0.45);
166
+ }
167
+ .dropdown_20b79 .arco-select-option {
168
+ color: #4b5563;
169
+ }
170
+ .dropdown_20b79 .arco-select-option:hover,
171
+ .dropdown_20b79 .arco-select-option.arco-select-option-selected {
172
+ background: rgba(243, 244, 246, 0.9);
173
+ }
174
+
175
+ .delete_20b79 {
176
+ box-shadow: 0 8px 16px rgba(248, 113, 113, 0.18);
177
+ }
178
+
179
+ .emptyWrapper_20b79 {
180
+ border-radius: 16px;
181
+ border: 1px dashed rgba(228, 228, 231, 0.5);
182
+ padding: 28px 16px;
183
+ background: rgba(255, 255, 255, 0.9);
184
+ display: flex;
185
+ justify-content: center;
186
+ }
187
+
188
+ .empty_20b79 .arco-empty-description {
189
+ color: #4b5563;
190
+ }
191
+
192
+ .footerHint_20b79 {
193
+ font-size: 11px;
194
+ color: #4b5563;
195
+ text-align: right;
196
+ letter-spacing: 0.04em;
197
+ text-transform: uppercase;
198
+ align-items: center;
199
+ justify-content: center;
44
200
  display: flex;
45
- transform: scale(1.6);
46
- margin: 0 0.6vw;
47
201
  }