@dsh-plugin/dsh-loader 1.1.0-dev.32287576957 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/adapters/dsh-1-x.js +4 -0
  2. package/dist/adapters/dsh-1-x.js.map +1 -1
  3. package/dist/api.d.ts +2 -0
  4. package/dist/api.js +18 -2
  5. package/dist/api.js.map +1 -1
  6. package/dist/client.d.ts +0 -1
  7. package/dist/client.js +13 -3
  8. package/dist/client.js.map +1 -1
  9. package/dist/index.js +7 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/patch.d.ts +112 -0
  12. package/dist/patch.js +179 -0
  13. package/dist/patch.js.map +1 -0
  14. package/dist/services/dsh-symbols.d.ts +70 -0
  15. package/dist/services/dsh-symbols.js +82 -0
  16. package/dist/services/dsh-symbols.js.map +1 -0
  17. package/dist/services/llm.d.ts +30 -0
  18. package/dist/services/llm.js +35 -0
  19. package/dist/services/llm.js.map +1 -0
  20. package/dist/services/registry.d.ts +144 -0
  21. package/dist/services/registry.js +209 -0
  22. package/dist/services/registry.js.map +1 -0
  23. package/dist/services/settings.d.ts +6 -0
  24. package/dist/services/settings.js +29 -1
  25. package/dist/services/settings.js.map +1 -1
  26. package/dist/services/web.js +20 -4
  27. package/dist/services/web.js.map +1 -1
  28. package/dist/setup.js +17 -1
  29. package/dist/setup.js.map +1 -1
  30. package/dist/types.d.ts +55 -0
  31. package/dist/version.d.ts +1 -1
  32. package/dist/version.js +1 -1
  33. package/lib/client.js +2775 -4
  34. package/lib/client.js.map +1 -1
  35. package/lib/types/adapters/dsh-1-x.d.ts +23 -0
  36. package/lib/types/adapters/index.d.ts +22 -0
  37. package/lib/types/client-ui.d.ts +40 -0
  38. package/lib/types/client.d.ts +156 -0
  39. package/lib/types/patch.d.ts +112 -0
  40. package/lib/types/registry.d.ts +35 -0
  41. package/lib/types/services/dsh-symbols.d.ts +70 -0
  42. package/lib/types/services/llm.d.ts +30 -0
  43. package/lib/types/services/registry.d.ts +144 -0
  44. package/lib/types/services/settings.d.ts +47 -0
  45. package/lib/types/types.d.ts +166 -0
  46. package/lib/types/ui/anchors.d.ts +56 -0
  47. package/lib/types/ui/components.d.ts +159 -0
  48. package/lib/types/ui/icons.d.ts +142 -0
  49. package/lib/types/ui/index.d.ts +30 -0
  50. package/lib/types/ui/menu.d.ts +104 -0
  51. package/lib/types/ui/slots.d.ts +152 -0
  52. package/lib/types/ui/style.d.ts +97 -0
  53. package/lib/types/version.d.ts +2 -0
  54. package/package.json +42 -9
  55. package/src/stable/compaction-basic.d.ts +1 -0
  56. package/src/stable/compaction-basic.js +5 -0
  57. package/src/stable/credentials.d.ts +1 -0
  58. package/src/stable/credentials.js +5 -0
  59. package/src/stable/subagent.d.ts +1 -0
  60. package/src/stable/subagent.js +5 -0
  61. package/src/stable/timeout.d.ts +1 -0
  62. package/src/stable/timeout.js +5 -0
package/lib/client.js CHANGED
@@ -4,8 +4,35 @@ window.__ModuleLoader__.load({
4
4
  var module = { exports: {} };
5
5
  var exports = module.exports;
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
+ //#region \0rolldown/runtime.js
8
+ var __create = Object.create;
9
+ var __defProp = Object.defineProperty;
10
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
11
+ var __getOwnPropNames = Object.getOwnPropertyNames;
12
+ var __getProtoOf = Object.getPrototypeOf;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
16
+ key = keys[i];
17
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
18
+ get: ((k) => from[k]).bind(null, key),
19
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
20
+ });
21
+ }
22
+ return to;
23
+ };
24
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
25
+ value: mod,
26
+ enumerable: true
27
+ }) : target, mod));
28
+ //#endregion
29
+ let react = require("react");
30
+ let react$1 = __toESM(react, 1);
31
+ react = __toESM(react);
32
+ let react_dom_client = require("react-dom/client");
33
+ let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
7
34
  //#region src/version.ts
8
- const LOADER_VERSION = "1.0.0";
35
+ const LOADER_VERSION = "1.2.0";
9
36
  const LOG_PREFIX = "[dshloader]";
10
37
  //#endregion
11
38
  //#region src/adapters/dsh-1-x.ts
@@ -30,6 +57,14 @@ window.__ModuleLoader__.load({
30
57
  }];
31
58
  //#endregion
32
59
  //#region src/client.ts
60
+ /**
61
+ * The ambient browser `window`, when this module runs in a browser-like realm.
62
+ * Read off `globalThis` so no DOM lib and no global declaration is required.
63
+ */
64
+ function ambientWindow$1() {
65
+ const found = globalThis.window;
66
+ return typeof found === "object" && found !== null ? found : void 0;
67
+ }
33
68
  var ModuleNotFoundError = class extends Error {
34
69
  specifier;
35
70
  constructor(specifier) {
@@ -114,7 +149,7 @@ window.__ModuleLoader__.load({
114
149
  * Install dshloader into a browser-like environment.
115
150
  */
116
151
  function installClient(opts = {}) {
117
- const win = opts.window ?? (typeof window !== "undefined" ? window : void 0);
152
+ const win = opts.window ?? ambientWindow$1();
118
153
  if (win === void 0) return void 0;
119
154
  const dshVersion = opts.dshVersion ?? win.__DSHLOADER_VERSION__;
120
155
  const adapter = pickClientAdapter(dshVersion);
@@ -260,22 +295,2758 @@ window.__ModuleLoader__.load({
260
295
  win.fetch = originalFetch;
261
296
  };
262
297
  }
298
+ //#endregion
299
+ //#region src/ui/anchors.ts
300
+ /** Query helper that tolerates an invalid selector (returns nothing). */
301
+ function all(selector) {
302
+ return () => {
303
+ if (typeof document === "undefined") return [];
304
+ try {
305
+ return document.querySelectorAll(selector);
306
+ } catch {
307
+ return [];
308
+ }
309
+ };
310
+ }
311
+ /** Anchor names dshloader ships for the dsh 1.x shell. */
312
+ const ANCHOR_NAMES = [
313
+ "conversation.status",
314
+ "conversation.column",
315
+ "shell.overlay",
316
+ "desktop.detailsSurface",
317
+ "layout.frame",
318
+ "settings.nav"
319
+ ];
320
+ /**
321
+ * The built-in anchors for dsh 1.x (verified against dsh 0.1.0-rc.6).
322
+ *
323
+ * Provenance of each selector:
324
+ *
325
+ * - `conversation.status` — dsh-thought-buddy, `src/client/index.ts:632-637`:
326
+ * `[data-conversation-scroll] [role="status"]` with a whole-document
327
+ * `[role="status"]` fallback. Callers add their own `accept` (thought-buddy
328
+ * matches the status text) via {@link AnchorSpec.accept} on a redefinition,
329
+ * or filter in `MountSpec.when`.
330
+ * - `conversation.column` — dsh-better-sidebar, `src/client/Sidebar.tsx:396`:
331
+ * `#root [data-slot="conversation"]`.
332
+ * - `shell.overlay` — dsh-code-review, `src/client.ts:1930` / `:2528`:
333
+ * `[data-shell-overlay]`.
334
+ * - `desktop.detailsSurface` — dsh-code-review, `src/client.ts:1957`:
335
+ * `.dshDesktopDetailsSurface`. A CSS-module-adjacent CLASS name and therefore
336
+ * the most fragile anchor in the table; kept because the behaviour needs it.
337
+ * - `layout.frame` — dsh-code-review, `src/client.ts:1176` / `:1209` / `:1244`:
338
+ * the frame whose `style.gridTemplateColumns` carries the sidebar width and
339
+ * whose `data-sidebar-collapsed` attribute carries the collapsed state. This
340
+ * anchor is READ (via `ui.hosts('layout.frame')`), never mounted into.
341
+ * - `settings.nav` — dsh-better-sidebar, `src/client/settings-nav-icon.ts`:
342
+ * the settings navigation list that gets an icon synced into it.
343
+ */
344
+ const BUILTIN_ANCHORS = {
345
+ "conversation.status": {
346
+ describe: "Conversation turn-status strip ([data-conversation-scroll] [role=\"status\"])",
347
+ find: all("[data-conversation-scroll] [role=\"status\"]"),
348
+ fallback: all("[role=\"status\"]"),
349
+ insert: "prepend"
350
+ },
351
+ "conversation.column": {
352
+ describe: "Conversation centre column (#root [data-slot=\"conversation\"])",
353
+ find: all("#root [data-slot=\"conversation\"]"),
354
+ insert: "append"
355
+ },
356
+ "shell.overlay": {
357
+ describe: "Shell overlay host ([data-shell-overlay])",
358
+ find: all("[data-shell-overlay]"),
359
+ insert: "append"
360
+ },
361
+ "desktop.detailsSurface": {
362
+ describe: "Desktop details surface (.dshDesktopDetailsSurface) — class-based, fragile",
363
+ find: all(".dshDesktopDetailsSurface"),
364
+ insert: "append"
365
+ },
366
+ "layout.frame": {
367
+ describe: "Layout frame carrying sidebar width / collapsed state (read-only anchor)",
368
+ find: all("[data-sidebar-collapsed], [data-shell-frame]"),
369
+ insert: "append"
370
+ },
371
+ "settings.nav": {
372
+ describe: "Settings navigation list",
373
+ find: all("[data-settings-nav]"),
374
+ fallback: all("[role=\"tablist\"]"),
375
+ insert: "append"
376
+ }
377
+ };
378
+ /**
379
+ * Project one `layout.frame` host into {@link LayoutFrameState}.
380
+ *
381
+ * Encapsulates the `style.gridTemplateColumns` parsing dsh-code-review does at
382
+ * `src/client.ts:1176`, so the regex lives with the anchor it belongs to.
383
+ */
384
+ function readLayoutFrame(host) {
385
+ const collapsed = host.hasAttribute("data-sidebar-collapsed");
386
+ let firstColumnPx;
387
+ const style = host.style;
388
+ const template = typeof style?.gridTemplateColumns === "string" ? style.gridTemplateColumns : "";
389
+ const match = /^\s*([\d.]+)px/.exec(template);
390
+ if (match !== null) {
391
+ const value = Number.parseFloat(match[1]);
392
+ if (Number.isFinite(value)) firstColumnPx = value;
393
+ }
394
+ return {
395
+ collapsed,
396
+ firstColumnPx
397
+ };
398
+ }
399
+ //#endregion
400
+ //#region src/ui/slots.tsx
401
+ /**
402
+ * The dshloader UI SLOT engine (`ctx.dshLoader.ui` / `__dshLoader__.ui`).
403
+ *
404
+ * dsh's Web shell offers official slots for a few places (`settings.section`,
405
+ * `conversation.chat.node`, …) but not for everything plugins need to decorate.
406
+ * Today four plugins in this family each hand-roll the same DOM-injection
407
+ * boilerplate against hardcoded shell selectors:
408
+ *
409
+ * - dsh-thought-buddy → `[data-conversation-scroll] [role="status"]`
410
+ * - dsh-auxiliary → the Models page's editable model rows
411
+ * - dsh-code-review → `[data-shell-overlay]`, `.dshDesktopDetailsSurface`
412
+ * - dsh-better-sidebar → `#root [data-slot="conversation"]`, theme root, …
413
+ *
414
+ * Every one of them re-implements: a MutationObserver, requestAnimationFrame
415
+ * coalescing, an idempotence guard, self-healing after a React re-render, and
416
+ * teardown. This module implements that ONCE and moves the shell selectors into
417
+ * a named ANCHOR TABLE the version adapter owns — so when dsh moves its DOM,
418
+ * one anchor entry changes instead of four plugins.
419
+ *
420
+ * What it cannot do: invent an anchor that no longer exists. A vanished anchor
421
+ * turns N silent breakages into ONE diagnosable one (`ui.diagnose()`), which is
422
+ * the honest goal — DOM injection is centralised here, not made robust. The
423
+ * durable fix stays "get the anchor promoted to an official slot".
424
+ *
425
+ * @module @dsh-plugin/dsh-loader/ui/slots
426
+ */
427
+ /** Attribute marking a generated mount node (and making re-mount idempotent). */
428
+ const SLOT_ATTR = "data-dshl-slot";
429
+ /**
430
+ * Build the `ui` facade with its own observer. One engine serves every anchor
431
+ * and every mount, so the shell is observed exactly once regardless of how many
432
+ * plugins inject.
433
+ */
434
+ function createUiAPI(options = {}) {
435
+ const warn = options.warn ?? ((message) => console.warn(message));
436
+ const anchors = /* @__PURE__ */ new Map();
437
+ /** anchor name → mount id → spec */
438
+ const mounts = /* @__PURE__ */ new Map();
439
+ /** anchor name → mount id → host → instance */
440
+ const live = /* @__PURE__ */ new Map();
441
+ /** Anchors whose primary locator came up empty on the last sweep. */
442
+ const fellBack = /* @__PURE__ */ new Set();
443
+ /** `onDomSettled` subscribers, notified once per coalesced batch. */
444
+ const settledListeners = /* @__PURE__ */ new Set();
445
+ let observer;
446
+ let scheduled = false;
447
+ let destroyed = false;
448
+ const hasDom = () => typeof document !== "undefined" && typeof MutationObserver !== "undefined";
449
+ /** Resolve an anchor to its host elements, recording fallback use. */
450
+ const resolve = (name, spec) => {
451
+ const collect = (source) => {
452
+ if (source === void 0) return [];
453
+ try {
454
+ return [...source()];
455
+ } catch {
456
+ return [];
457
+ }
458
+ };
459
+ let hosts = collect(spec.find);
460
+ if (hosts.length === 0) {
461
+ const alt = collect(spec.fallback);
462
+ if (alt.length > 0) {
463
+ fellBack.add(name);
464
+ hosts = alt;
465
+ } else fellBack.delete(name);
466
+ } else fellBack.delete(name);
467
+ if (spec.accept !== void 0) hosts = hosts.filter((host) => {
468
+ try {
469
+ return spec.accept(host);
470
+ } catch {
471
+ return false;
472
+ }
473
+ });
474
+ return [...new Set(hosts)];
475
+ };
476
+ /** Insert a freshly created mount node relative to its host. */
477
+ const place = (host, node, mode) => {
478
+ switch (mode) {
479
+ case "prepend":
480
+ host.insertBefore(node, host.firstChild);
481
+ return;
482
+ case "before":
483
+ host.parentNode?.insertBefore(node, host);
484
+ return;
485
+ case "after":
486
+ host.parentNode?.insertBefore(node, host.nextSibling);
487
+ return;
488
+ default: host.appendChild(node);
489
+ }
490
+ };
491
+ /** Tear down one instance, containing any cleanup failure. */
492
+ const teardown = (instance) => {
493
+ try {
494
+ instance.cleanup?.();
495
+ } catch (error) {
496
+ warn(`[dshloader.ui] mount cleanup threw: ${error instanceof Error ? error.message : String(error)}`);
497
+ }
498
+ if (instance.mount.parentNode !== null) instance.mount.parentNode.removeChild(instance.mount);
499
+ };
500
+ const instancesFor = (anchor, mountId) => {
501
+ let byMount = live.get(anchor);
502
+ if (byMount === void 0) {
503
+ byMount = /* @__PURE__ */ new Map();
504
+ live.set(anchor, byMount);
505
+ }
506
+ let byHost = byMount.get(mountId);
507
+ if (byHost === void 0) {
508
+ byHost = /* @__PURE__ */ new Map();
509
+ byMount.set(mountId, byHost);
510
+ }
511
+ return byHost;
512
+ };
513
+ /** One reconciliation pass over every anchor × mount. */
514
+ const sweep = () => {
515
+ if (destroyed || !hasDom()) return;
516
+ for (const [name, spec] of anchors) {
517
+ const specs = mounts.get(name);
518
+ if (specs === void 0 || specs.size === 0) continue;
519
+ const hosts = resolve(name, spec);
520
+ const insert = spec.insert ?? "append";
521
+ const tagName = spec.tagName ?? "span";
522
+ for (const [mountId, mountSpec] of specs) {
523
+ const instances = instancesFor(name, mountId);
524
+ for (const [host, instance] of [...instances]) if (!host.isConnected || !instance.mount.isConnected) {
525
+ teardown(instance);
526
+ instances.delete(host);
527
+ }
528
+ for (const host of hosts) {
529
+ if (instances.has(host)) continue;
530
+ if (mountSpec.when !== void 0) try {
531
+ if (!mountSpec.when(host)) continue;
532
+ } catch {
533
+ continue;
534
+ }
535
+ if (host.querySelector(`[${SLOT_ATTR}="${mountId}"]`) !== null) continue;
536
+ const node = document.createElement(tagName);
537
+ node.setAttribute(SLOT_ATTR, mountId);
538
+ try {
539
+ place(host, node, insert);
540
+ } catch (error) {
541
+ warn(`[dshloader.ui] could not place "${mountId}" on anchor "${name}": ${error instanceof Error ? error.message : String(error)}`);
542
+ continue;
543
+ }
544
+ let cleanup;
545
+ try {
546
+ cleanup = mountSpec.render(node, host) ?? void 0;
547
+ } catch (error) {
548
+ warn(`[dshloader.ui] mount "${mountId}" render threw: ${error instanceof Error ? error.message : String(error)}`);
549
+ if (node.parentNode !== null) node.parentNode.removeChild(node);
550
+ continue;
551
+ }
552
+ instances.set(host, {
553
+ mount: node,
554
+ cleanup
555
+ });
556
+ }
557
+ }
558
+ }
559
+ };
560
+ /** Coalesce mutation bursts into one sweep per frame. */
561
+ const schedule = () => {
562
+ if (scheduled || destroyed) return;
563
+ scheduled = true;
564
+ const run = () => {
565
+ scheduled = false;
566
+ sweep();
567
+ for (const listener of [...settledListeners]) try {
568
+ listener();
569
+ } catch (error) {
570
+ warn(`[dshloader.ui] onDomSettled listener threw: ${error instanceof Error ? error.message : String(error)}`);
571
+ }
572
+ };
573
+ if (typeof requestAnimationFrame === "function") requestAnimationFrame(run);
574
+ else setTimeout(run, 16);
575
+ };
576
+ /** Start observing on first use; a single observer serves every anchor. */
577
+ const ensureObserver = () => {
578
+ if (observer !== void 0 || destroyed || !hasDom()) return;
579
+ const root = options.observeRoot ?? document.documentElement;
580
+ observer = new MutationObserver(schedule);
581
+ observer.observe(root, {
582
+ childList: true,
583
+ subtree: true
584
+ });
585
+ };
586
+ const removeAllFor = (anchor, mountId) => {
587
+ const byMount = live.get(anchor);
588
+ if (byMount === void 0) return;
589
+ const ids = mountId === void 0 ? [...byMount.keys()] : [mountId];
590
+ for (const id of ids) {
591
+ const byHost = byMount.get(id);
592
+ if (byHost === void 0) continue;
593
+ for (const instance of byHost.values()) teardown(instance);
594
+ byHost.clear();
595
+ byMount.delete(id);
596
+ }
597
+ };
598
+ return {
599
+ defineAnchor(name, spec) {
600
+ anchors.set(name, spec);
601
+ ensureObserver();
602
+ schedule();
603
+ return () => {
604
+ removeAllFor(name);
605
+ anchors.delete(name);
606
+ mounts.delete(name);
607
+ live.delete(name);
608
+ fellBack.delete(name);
609
+ };
610
+ },
611
+ anchors() {
612
+ return [...anchors.keys()];
613
+ },
614
+ hosts(anchor) {
615
+ const spec = anchors.get(anchor);
616
+ return spec === void 0 ? [] : resolve(anchor, spec);
617
+ },
618
+ onDomSettled(listener) {
619
+ if (typeof listener !== "function") throw new TypeError("dshloader.ui.onDomSettled: listener must be a function");
620
+ settledListeners.add(listener);
621
+ ensureObserver();
622
+ schedule();
623
+ return () => {
624
+ settledListeners.delete(listener);
625
+ };
626
+ },
627
+ mount(anchor, spec) {
628
+ if (typeof spec.id !== "string" || spec.id.length === 0) throw new TypeError("dshloader.ui.mount: spec.id is required");
629
+ if (!anchors.has(anchor)) warn(`[dshloader.ui] mount "${spec.id}" targets unknown anchor "${anchor}" — known anchors: ${[...anchors.keys()].join(", ") || "(none)"}. The mount stays registered and activates if the anchor is defined later.`);
630
+ let specs = mounts.get(anchor);
631
+ if (specs === void 0) {
632
+ specs = /* @__PURE__ */ new Map();
633
+ mounts.set(anchor, specs);
634
+ }
635
+ if (specs.has(spec.id)) removeAllFor(anchor, spec.id);
636
+ specs.set(spec.id, spec);
637
+ ensureObserver();
638
+ schedule();
639
+ return () => {
640
+ removeAllFor(anchor, spec.id);
641
+ mounts.get(anchor)?.delete(spec.id);
642
+ };
643
+ },
644
+ mountReact(anchor, spec) {
645
+ const Component = spec.component;
646
+ return this.mount(anchor, {
647
+ id: spec.id,
648
+ when: spec.when,
649
+ render: (node, host) => {
650
+ let root;
651
+ try {
652
+ root = (0, react_dom_client.createRoot)(node);
653
+ root.render(react$1.createElement(Component, { host }));
654
+ } catch (error) {
655
+ warn(`[dshloader.ui] React mount "${spec.id}" failed: ${error instanceof Error ? error.message : String(error)}`);
656
+ return;
657
+ }
658
+ return () => {
659
+ try {
660
+ root?.unmount();
661
+ } catch {}
662
+ };
663
+ }
664
+ });
665
+ },
666
+ diagnose() {
667
+ const out = [];
668
+ for (const [name, spec] of anchors) {
669
+ const hosts = resolve(name, spec);
670
+ const specs = mounts.get(name);
671
+ let liveCount = 0;
672
+ const byMount = live.get(name);
673
+ if (byMount !== void 0) for (const byHost of byMount.values()) liveCount += byHost.size;
674
+ out.push({
675
+ anchor: name,
676
+ describe: spec.describe,
677
+ hosts: hosts.length,
678
+ usedFallback: fellBack.has(name),
679
+ mounts: specs === void 0 ? [] : [...specs.keys()],
680
+ live: liveCount
681
+ });
682
+ }
683
+ return out;
684
+ },
685
+ destroy() {
686
+ destroyed = true;
687
+ observer?.disconnect();
688
+ observer = void 0;
689
+ settledListeners.clear();
690
+ for (const anchor of [...live.keys()]) removeAllFor(anchor);
691
+ live.clear();
692
+ mounts.clear();
693
+ anchors.clear();
694
+ fellBack.clear();
695
+ }
696
+ };
697
+ }
698
+ //#endregion
699
+ //#region src/ui/style.ts
700
+ /**
701
+ * Design tokens and the idempotent stylesheet injector shared by every
702
+ * dshloader UI component.
703
+ *
704
+ * Tokens are the DSH shell's own CSS custom properties, each paired with a
705
+ * fallback so a component still renders sanely when the shell changes or the
706
+ * plugin is previewed outside it. The names were harvested from the shell
707
+ * styling the plugins in this family already rely on; when dsh renames one,
708
+ * this file is the single place to fix.
709
+ *
710
+ * @module @dsh-plugin/dsh-loader/ui/style
711
+ */
712
+ /** `var(--name, fallback)` — a token reference that degrades instead of breaking. */
713
+ function token(name, fallback) {
714
+ return `var(${name}, ${fallback})`;
715
+ }
716
+ /** The DSH shell tokens dshloader components consume. */
717
+ const T = {
718
+ /** Primary body text. */
719
+ labelPrimary: token("--dsw-alias-label-primary", "#1a1a1a"),
720
+ /** Secondary / supporting text. */
721
+ labelSecondary: token("--dsw-alias-label-secondary", "#4a4a4a"),
722
+ /** Tertiary text (hints, units). */
723
+ labelTertiary: token("--dsw-alias-label-tertiary", "#8a8a8a"),
724
+ /** Caption / disabled text. */
725
+ labelCaption: token("--dsw-alias-label-caption", "#a8a8a8"),
726
+ /** Page / card background. */
727
+ bgBase: token("--dsw-alias-bg-base", "#ffffff"),
728
+ /** Raised surface inside a page (shell layer 1). */
729
+ bgLayer1: token("--dsw-alias-bg-layer-1", "rgba(127,127,127,0.06)"),
730
+ /** Subtle raised surface. */
731
+ bgSubtle: token("--dsw-alias-bg-subtle", "rgba(127,127,127,0.06)"),
732
+ /** Hover wash for interactive rows. */
733
+ bgHover: token("--dsw-alias-bg-hover", "rgba(127,127,127,0.10)"),
734
+ /** Default control border. */
735
+ border: token("--dsw-alias-border-l2", "#d9d9d9"),
736
+ /** Lighter divider. */
737
+ borderSubtle: token("--dsw-alias-border-l1", "#ececec"),
738
+ /** Primary button fill — the shell's own button colour, NOT the brand accent. */
739
+ buttonPrimaryFill: token("--dsw-alias-button-primary-fill", "#4f7cff"),
740
+ /** Text placed on top of {@link buttonPrimaryFill}. */
741
+ buttonPrimaryForeground: token("--dsw-alias-label-primary-foreground", "#ffffff"),
742
+ /** Brand accent (checked states, focus rings). */
743
+ accent: token("--dsw-alias-brand-primary", "#4f7cff"),
744
+ /** Accent text placed on top of the accent fill. */
745
+ accentOn: token("--dsw-alias-brand-on-primary", "#ffffff"),
746
+ /** Destructive accent. */
747
+ danger: token("--dsw-alias-status-danger", "#e5484d"),
748
+ /** Success state (saved confirmations). */
749
+ success: token("--dsw-alias-state-success-primary", "#2e7d32"),
750
+ /** Monospace stack for code / paths. */
751
+ fontCode: token("--ds-font-family-code", "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace")
752
+ };
753
+ /**
754
+ * Shared control geometry so every dshloader control lines up.
755
+ *
756
+ * The values mirror the shell's native settings-page metrics (as established by
757
+ * dsh-auxiliary's section): pill-shaped primary buttons at height 32, inputs at
758
+ * height 28 with radius 6, cards with radius 10 and padding 16.
759
+ */
760
+ const G = {
761
+ /** Control height for inputs / selects. */
762
+ controlHeight: 28,
763
+ /** Compact control height. */
764
+ controlHeightSm: 24,
765
+ /** Primary button height (the shell's buttons run taller than inputs). */
766
+ buttonHeight: 32,
767
+ /** Standard corner radius (inputs). */
768
+ radius: 6,
769
+ /** Card corner radius. */
770
+ cardRadius: 10,
771
+ /** Pill radius (primary buttons, switches, chips). */
772
+ radiusPill: 999,
773
+ /** Horizontal padding inside an input. */
774
+ padX: 8,
775
+ /** Horizontal padding inside a primary button. */
776
+ padXButton: 14,
777
+ /** Standard row gap. */
778
+ gap: 8,
779
+ /** Base font size. */
780
+ fontSize: 13,
781
+ /** Small font size (descriptions). */
782
+ fontSizeSm: 12
783
+ };
784
+ /**
785
+ * Inject a stylesheet once, tagged with the DSH client-module ownership
786
+ * attributes (`data-plugin` / `data-plugin-css`) so the HMR driver can reclaim
787
+ * it. Calling this repeatedly with the same `cssId` is a no-op.
788
+ *
789
+ * @param pluginId - owning plugin id (package name), for `data-plugin`.
790
+ * @param cssId - stylesheet id within the plugin, e.g. `'ui/components.css'`.
791
+ * @param css - the stylesheet text.
792
+ * @returns a disposer removing the tag, for callers that want one.
793
+ */
794
+ function injectStyle(pluginId, cssId, css) {
795
+ if (typeof document === "undefined") return () => {};
796
+ const tagId = `${pluginId}/${cssId}`;
797
+ const selector = `style[data-plugin-css="${tagId}"]`;
798
+ if (document.querySelector(selector) !== null) return () => {};
799
+ const style = document.createElement("style");
800
+ style.dataset.plugin = pluginId;
801
+ style.dataset.pluginCss = tagId;
802
+ style.textContent = css;
803
+ document.head.appendChild(style);
804
+ return () => {
805
+ if (style.parentNode !== null) style.parentNode.removeChild(style);
806
+ };
807
+ }
808
+ /** The class-name prefix every dshloader UI class carries. */
809
+ const CX = "dshl";
810
+ /** Join truthy class names. */
811
+ function cx(...parts) {
812
+ return parts.filter(Boolean).join(" ");
813
+ }
814
+ //#endregion
815
+ //#region node_modules/@icon-park/react/es/runtime/index.js
816
+ var _excluded = [
817
+ "size",
818
+ "strokeWidth",
819
+ "strokeLinecap",
820
+ "strokeLinejoin",
821
+ "theme",
822
+ "fill",
823
+ "className",
824
+ "spin"
825
+ ];
826
+ function ownKeys(object, enumerableOnly) {
827
+ var keys = Object.keys(object);
828
+ if (Object.getOwnPropertySymbols) {
829
+ var symbols = Object.getOwnPropertySymbols(object);
830
+ enumerableOnly && (symbols = symbols.filter(function(sym) {
831
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
832
+ })), keys.push.apply(keys, symbols);
833
+ }
834
+ return keys;
835
+ }
836
+ function _objectSpread(target) {
837
+ for (var i = 1; i < arguments.length; i++) {
838
+ var source = null != arguments[i] ? arguments[i] : {};
839
+ i % 2 ? ownKeys(Object(source), !0).forEach(function(key) {
840
+ _defineProperty(target, key, source[key]);
841
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function(key) {
842
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
843
+ });
844
+ }
845
+ return target;
846
+ }
847
+ function _defineProperty(obj, key, value) {
848
+ if (key in obj) Object.defineProperty(obj, key, {
849
+ value,
850
+ enumerable: true,
851
+ configurable: true,
852
+ writable: true
853
+ });
854
+ else obj[key] = value;
855
+ return obj;
856
+ }
857
+ function _objectWithoutProperties(source, excluded) {
858
+ if (source == null) return {};
859
+ var target = _objectWithoutPropertiesLoose(source, excluded);
860
+ var key, i;
861
+ if (Object.getOwnPropertySymbols) {
862
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
863
+ for (i = 0; i < sourceSymbolKeys.length; i++) {
864
+ key = sourceSymbolKeys[i];
865
+ if (excluded.indexOf(key) >= 0) continue;
866
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
867
+ target[key] = source[key];
868
+ }
869
+ }
870
+ return target;
871
+ }
872
+ function _objectWithoutPropertiesLoose(source, excluded) {
873
+ if (source == null) return {};
874
+ var target = {};
875
+ var sourceKeys = Object.keys(source);
876
+ var key, i;
877
+ for (i = 0; i < sourceKeys.length; i++) {
878
+ key = sourceKeys[i];
879
+ if (excluded.indexOf(key) >= 0) continue;
880
+ target[key] = source[key];
881
+ }
882
+ return target;
883
+ }
884
+ var DEFAULT_ICON_CONFIGS = {
885
+ size: "1em",
886
+ strokeWidth: 4,
887
+ strokeLinecap: "round",
888
+ strokeLinejoin: "round",
889
+ rtl: false,
890
+ theme: "outline",
891
+ colors: {
892
+ outline: {
893
+ fill: "#333",
894
+ background: "transparent"
895
+ },
896
+ filled: {
897
+ fill: "#333",
898
+ background: "#FFF"
899
+ },
900
+ twoTone: {
901
+ fill: "#333",
902
+ twoTone: "#2F88FF"
903
+ },
904
+ multiColor: {
905
+ outStrokeColor: "#333",
906
+ outFillColor: "#2F88FF",
907
+ innerStrokeColor: "#FFF",
908
+ innerFillColor: "#43CCF8"
909
+ }
910
+ },
911
+ prefix: "i"
912
+ };
913
+ function guid() {
914
+ return "icon-" + ((1 + Math.random()) * 4294967296 | 0).toString(16).substring(1);
915
+ }
916
+ function IconConverter(id, icon, config) {
917
+ var fill = typeof icon.fill === "string" ? [icon.fill] : icon.fill || [];
918
+ var colors = [];
919
+ switch (icon.theme || config.theme) {
920
+ case "outline":
921
+ colors.push(typeof fill[0] === "string" ? fill[0] : "currentColor");
922
+ colors.push("none");
923
+ colors.push(typeof fill[0] === "string" ? fill[0] : "currentColor");
924
+ colors.push("none");
925
+ break;
926
+ case "filled":
927
+ colors.push(typeof fill[0] === "string" ? fill[0] : "currentColor");
928
+ colors.push(typeof fill[0] === "string" ? fill[0] : "currentColor");
929
+ colors.push("#FFF");
930
+ colors.push("#FFF");
931
+ break;
932
+ case "two-tone":
933
+ colors.push(typeof fill[0] === "string" ? fill[0] : "currentColor");
934
+ colors.push(typeof fill[1] === "string" ? fill[1] : config.colors.twoTone.twoTone);
935
+ colors.push(typeof fill[0] === "string" ? fill[0] : "currentColor");
936
+ colors.push(typeof fill[1] === "string" ? fill[1] : config.colors.twoTone.twoTone);
937
+ break;
938
+ case "multi-color":
939
+ colors.push(typeof fill[0] === "string" ? fill[0] : "currentColor");
940
+ colors.push(typeof fill[1] === "string" ? fill[1] : config.colors.multiColor.outFillColor);
941
+ colors.push(typeof fill[2] === "string" ? fill[2] : config.colors.multiColor.innerStrokeColor);
942
+ colors.push(typeof fill[3] === "string" ? fill[3] : config.colors.multiColor.innerFillColor);
943
+ }
944
+ return {
945
+ size: icon.size || config.size,
946
+ strokeWidth: icon.strokeWidth || config.strokeWidth,
947
+ strokeLinecap: icon.strokeLinecap || config.strokeLinecap,
948
+ strokeLinejoin: icon.strokeLinejoin || config.strokeLinejoin,
949
+ colors,
950
+ id
951
+ };
952
+ }
953
+ var IconContext = /*#__PURE__*/ (0, react.createContext)(DEFAULT_ICON_CONFIGS);
954
+ var IconProvider = IconContext.Provider;
955
+ function IconWrapper(name, rtl, render) {
956
+ return function(props) {
957
+ var size = props.size, strokeWidth = props.strokeWidth, strokeLinecap = props.strokeLinecap, strokeLinejoin = props.strokeLinejoin, theme = props.theme, fill = props.fill, className = props.className, spin = props.spin, extra = _objectWithoutProperties(props, _excluded);
958
+ var ICON_CONFIGS = (0, react.useContext)(IconContext);
959
+ var svgProps = IconConverter((0, react.useMemo)(guid, []), {
960
+ size,
961
+ strokeWidth,
962
+ strokeLinecap,
963
+ strokeLinejoin,
964
+ theme,
965
+ fill
966
+ }, ICON_CONFIGS);
967
+ var cls = [ICON_CONFIGS.prefix + "-icon"];
968
+ cls.push(ICON_CONFIGS.prefix + "-icon-" + name);
969
+ if (rtl && ICON_CONFIGS.rtl) cls.push(ICON_CONFIGS.prefix + "-icon-rtl");
970
+ if (spin) cls.push(ICON_CONFIGS.prefix + "-icon-spin");
971
+ if (className) cls.push(className);
972
+ return /*#__PURE__*/ react.default.createElement("span", _objectSpread(_objectSpread({}, extra), {}, { className: cls.join(" ") }), render(svgProps));
973
+ };
974
+ }
975
+ //#endregion
976
+ //#region node_modules/@icon-park/react/es/icons/Add.js
977
+ var Add_default = IconWrapper("add", false, function(props) {
978
+ return /*#__PURE__*/ react.default.createElement("svg", {
979
+ width: props.size,
980
+ height: props.size,
981
+ viewBox: "0 0 48 48",
982
+ fill: "none"
983
+ }, /*#__PURE__*/ react.default.createElement("rect", {
984
+ x: "6",
985
+ y: "6",
986
+ width: "36",
987
+ height: "36",
988
+ rx: "3",
989
+ fill: props.colors[1],
990
+ stroke: props.colors[0],
991
+ strokeWidth: props.strokeWidth,
992
+ strokeLinejoin: props.strokeLinejoin
993
+ }), /*#__PURE__*/ react.default.createElement("path", {
994
+ d: "M24 16V32",
995
+ stroke: props.colors[2],
996
+ strokeWidth: props.strokeWidth,
997
+ strokeLinecap: props.strokeLinecap,
998
+ strokeLinejoin: props.strokeLinejoin
999
+ }), /*#__PURE__*/ react.default.createElement("path", {
1000
+ d: "M16 24L32 24",
1001
+ stroke: props.colors[2],
1002
+ strokeWidth: props.strokeWidth,
1003
+ strokeLinecap: props.strokeLinecap,
1004
+ strokeLinejoin: props.strokeLinejoin
1005
+ }));
1006
+ });
1007
+ //#endregion
1008
+ //#region node_modules/@icon-park/react/es/icons/Alarm.js
1009
+ var Alarm_default = IconWrapper("alarm", true, function(props) {
1010
+ return /*#__PURE__*/ react.default.createElement("svg", {
1011
+ width: props.size,
1012
+ height: props.size,
1013
+ viewBox: "0 0 48 48",
1014
+ fill: "none"
1015
+ }, /*#__PURE__*/ react.default.createElement("path", {
1016
+ d: "M14 25C14 19.4772 18.4772 15 24 15C29.5228 15 34 19.4772 34 25V41H14V25Z",
1017
+ fill: props.colors[1],
1018
+ stroke: props.colors[0],
1019
+ strokeWidth: props.strokeWidth,
1020
+ strokeLinejoin: props.strokeLinejoin
1021
+ }), /*#__PURE__*/ react.default.createElement("path", {
1022
+ d: "M24 5V8",
1023
+ stroke: props.colors[0],
1024
+ strokeWidth: props.strokeWidth,
1025
+ strokeLinecap: props.strokeLinecap,
1026
+ strokeLinejoin: props.strokeLinejoin
1027
+ }), /*#__PURE__*/ react.default.createElement("path", {
1028
+ d: "M35.8918 9.32823L33.9634 11.6264",
1029
+ stroke: props.colors[0],
1030
+ strokeWidth: props.strokeWidth,
1031
+ strokeLinecap: props.strokeLinecap,
1032
+ strokeLinejoin: props.strokeLinejoin
1033
+ }), /*#__PURE__*/ react.default.createElement("path", {
1034
+ d: "M42.2187 20.2873L39.2642 20.8083",
1035
+ stroke: props.colors[0],
1036
+ strokeWidth: props.strokeWidth,
1037
+ strokeLinecap: props.strokeLinecap,
1038
+ strokeLinejoin: props.strokeLinejoin
1039
+ }), /*#__PURE__*/ react.default.createElement("path", {
1040
+ d: "M5.78116 20.2874L8.73558 20.8083",
1041
+ stroke: props.colors[0],
1042
+ strokeWidth: props.strokeWidth,
1043
+ strokeLinecap: props.strokeLinecap,
1044
+ strokeLinejoin: props.strokeLinejoin
1045
+ }), /*#__PURE__*/ react.default.createElement("path", {
1046
+ d: "M12.1086 9.32802L14.037 11.6262",
1047
+ stroke: props.colors[0],
1048
+ strokeWidth: props.strokeWidth,
1049
+ strokeLinecap: props.strokeLinecap,
1050
+ strokeLinejoin: props.strokeLinejoin
1051
+ }), /*#__PURE__*/ react.default.createElement("path", {
1052
+ d: "M6 41H43",
1053
+ stroke: props.colors[0],
1054
+ strokeWidth: props.strokeWidth,
1055
+ strokeLinecap: props.strokeLinecap,
1056
+ strokeLinejoin: props.strokeLinejoin
1057
+ }));
1058
+ });
1059
+ //#endregion
1060
+ //#region node_modules/@icon-park/react/es/icons/AllApplication.js
1061
+ var AllApplication_default = IconWrapper("all-application", false, function(props) {
1062
+ return /*#__PURE__*/ react.default.createElement("svg", {
1063
+ width: props.size,
1064
+ height: props.size,
1065
+ viewBox: "0 0 48 48",
1066
+ fill: "none"
1067
+ }, /*#__PURE__*/ react.default.createElement("path", {
1068
+ d: "M18 6H8C6.89543 6 6 6.89543 6 8V18C6 19.1046 6.89543 20 8 20H18C19.1046 20 20 19.1046 20 18V8C20 6.89543 19.1046 6 18 6Z",
1069
+ fill: props.colors[1],
1070
+ stroke: props.colors[0],
1071
+ strokeWidth: props.strokeWidth,
1072
+ strokeLinejoin: props.strokeLinejoin
1073
+ }), /*#__PURE__*/ react.default.createElement("path", {
1074
+ d: "M18 28H8C6.89543 28 6 28.8954 6 30V40C6 41.1046 6.89543 42 8 42H18C19.1046 42 20 41.1046 20 40V30C20 28.8954 19.1046 28 18 28Z",
1075
+ fill: props.colors[1],
1076
+ stroke: props.colors[0],
1077
+ strokeWidth: props.strokeWidth,
1078
+ strokeLinejoin: props.strokeLinejoin
1079
+ }), /*#__PURE__*/ react.default.createElement("path", {
1080
+ d: "M40 6H30C28.8954 6 28 6.89543 28 8V18C28 19.1046 28.8954 20 30 20H40C41.1046 20 42 19.1046 42 18V8C42 6.89543 41.1046 6 40 6Z",
1081
+ fill: props.colors[1],
1082
+ stroke: props.colors[0],
1083
+ strokeWidth: props.strokeWidth,
1084
+ strokeLinejoin: props.strokeLinejoin
1085
+ }), /*#__PURE__*/ react.default.createElement("path", {
1086
+ d: "M40 28H30C28.8954 28 28 28.8954 28 30V40C28 41.1046 28.8954 42 30 42H40C41.1046 42 42 41.1046 42 40V30C42 28.8954 41.1046 28 40 28Z",
1087
+ fill: props.colors[1],
1088
+ stroke: props.colors[0],
1089
+ strokeWidth: props.strokeWidth,
1090
+ strokeLinejoin: props.strokeLinejoin
1091
+ }));
1092
+ });
1093
+ //#endregion
1094
+ //#region node_modules/@icon-park/react/es/icons/Attention.js
1095
+ var Attention_default = IconWrapper("attention", true, function(props) {
1096
+ return /*#__PURE__*/ react.default.createElement("svg", {
1097
+ width: props.size,
1098
+ height: props.size,
1099
+ viewBox: "0 0 48 48",
1100
+ fill: "none"
1101
+ }, /*#__PURE__*/ react.default.createElement("path", {
1102
+ d: "M24 44C29.5228 44 34.5228 41.7614 38.1421 38.1421C41.7614 34.5228 44 29.5228 44 24C44 18.4772 41.7614 13.4772 38.1421 9.85786C34.5228 6.23858 29.5228 4 24 4C18.4772 4 13.4772 6.23858 9.85786 9.85786C6.23858 13.4772 4 18.4772 4 24C4 29.5228 6.23858 34.5228 9.85786 38.1421C13.4772 41.7614 18.4772 44 24 44Z",
1103
+ fill: props.colors[1],
1104
+ stroke: props.colors[0],
1105
+ strokeWidth: props.strokeWidth,
1106
+ strokeLinejoin: props.strokeLinejoin
1107
+ }), /*#__PURE__*/ react.default.createElement("path", {
1108
+ fillRule: "evenodd",
1109
+ clipRule: "evenodd",
1110
+ d: "M24 37C25.3807 37 26.5 35.8807 26.5 34.5C26.5 33.1193 25.3807 32 24 32C22.6193 32 21.5 33.1193 21.5 34.5C21.5 35.8807 22.6193 37 24 37Z",
1111
+ fill: props.colors[2]
1112
+ }), /*#__PURE__*/ react.default.createElement("path", {
1113
+ d: "M24 12V28",
1114
+ stroke: props.colors[2],
1115
+ strokeWidth: props.strokeWidth,
1116
+ strokeLinecap: props.strokeLinecap,
1117
+ strokeLinejoin: props.strokeLinejoin
1118
+ }));
1119
+ });
1120
+ //#endregion
1121
+ //#region node_modules/@icon-park/react/es/icons/Back.js
1122
+ var Back_default = IconWrapper("back", true, function(props) {
1123
+ return /*#__PURE__*/ react.default.createElement("svg", {
1124
+ width: props.size,
1125
+ height: props.size,
1126
+ viewBox: "0 0 48 48",
1127
+ fill: "none"
1128
+ }, /*#__PURE__*/ react.default.createElement("path", {
1129
+ fillRule: "evenodd",
1130
+ clipRule: "evenodd",
1131
+ d: "M44 40.8361C39.1069 34.8632 34.7617 31.4739 30.9644 30.6682C27.1671 29.8625 23.5517 29.7408 20.1182 30.303V41L4 23.5453L20.1182 7V17.167C26.4667 17.2172 31.8638 19.4948 36.3095 24C40.7553 28.5052 43.3187 34.1172 44 40.8361Z",
1132
+ fill: props.colors[1],
1133
+ stroke: props.colors[0],
1134
+ strokeWidth: props.strokeWidth,
1135
+ strokeLinejoin: props.strokeLinejoin
1136
+ }));
1137
+ });
1138
+ //#endregion
1139
+ //#region node_modules/@icon-park/react/es/icons/Branch.js
1140
+ var Branch_default = IconWrapper("branch", true, function(props) {
1141
+ return /*#__PURE__*/ react.default.createElement("svg", {
1142
+ width: props.size,
1143
+ height: props.size,
1144
+ viewBox: "0 0 48 48",
1145
+ fill: "none"
1146
+ }, /*#__PURE__*/ react.default.createElement("path", {
1147
+ d: "M40 28C42.2091 28 44 26.2091 44 24C44 21.7909 42.2091 20 40 20C37.7909 20 36 21.7909 36 24C36 26.2091 37.7909 28 40 28Z",
1148
+ fill: props.colors[1],
1149
+ stroke: props.colors[0],
1150
+ strokeWidth: props.strokeWidth,
1151
+ strokeLinejoin: props.strokeLinejoin
1152
+ }), /*#__PURE__*/ react.default.createElement("path", {
1153
+ d: "M9 12C11.2091 12 13 10.2091 13 8C13 5.79086 11.2091 4 9 4C6.79086 4 5 5.79086 5 8C5 10.2091 6.79086 12 9 12Z",
1154
+ fill: props.colors[1],
1155
+ stroke: props.colors[0],
1156
+ strokeWidth: props.strokeWidth,
1157
+ strokeLinejoin: props.strokeLinejoin
1158
+ }), /*#__PURE__*/ react.default.createElement("path", {
1159
+ d: "M9 44C11.2091 44 13 42.2091 13 40C13 37.7909 11.2091 36 9 36C6.79086 36 5 37.7909 5 40C5 42.2091 6.79086 44 9 44Z",
1160
+ fill: props.colors[1],
1161
+ stroke: props.colors[0],
1162
+ strokeWidth: props.strokeWidth,
1163
+ strokeLinejoin: props.strokeLinejoin
1164
+ }), /*#__PURE__*/ react.default.createElement("path", {
1165
+ d: "M9 12V36V24.0083H36",
1166
+ stroke: props.colors[0],
1167
+ strokeWidth: props.strokeWidth,
1168
+ strokeLinecap: props.strokeLinecap,
1169
+ strokeLinejoin: props.strokeLinejoin
1170
+ }));
1171
+ });
1172
+ //#endregion
1173
+ //#region node_modules/@icon-park/react/es/icons/Browser.js
1174
+ var Browser_default = IconWrapper("browser", true, function(props) {
1175
+ return /*#__PURE__*/ react.default.createElement("svg", {
1176
+ width: props.size,
1177
+ height: props.size,
1178
+ viewBox: "0 0 48 48",
1179
+ fill: "none"
1180
+ }, /*#__PURE__*/ react.default.createElement("path", {
1181
+ d: "M42 18V40C42 41.1046 41.1046 42 40 42H8C6.89543 42 6 41.1046 6 40V18",
1182
+ stroke: props.colors[0],
1183
+ strokeWidth: props.strokeWidth,
1184
+ strokeLinecap: props.strokeLinecap,
1185
+ strokeLinejoin: props.strokeLinejoin
1186
+ }), /*#__PURE__*/ react.default.createElement("path", {
1187
+ d: "M6 8C6 6.89543 6.89543 6 8 6H40C41.1046 6 42 6.89543 42 8V18H6V8Z",
1188
+ fill: props.colors[1],
1189
+ stroke: props.colors[0],
1190
+ strokeWidth: props.strokeWidth,
1191
+ strokeLinejoin: props.strokeLinejoin
1192
+ }), /*#__PURE__*/ react.default.createElement("path", {
1193
+ fillRule: "evenodd",
1194
+ clipRule: "evenodd",
1195
+ d: "M12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14Z",
1196
+ fill: props.colors[2]
1197
+ }), /*#__PURE__*/ react.default.createElement("path", {
1198
+ fillRule: "evenodd",
1199
+ clipRule: "evenodd",
1200
+ d: "M18 14C19.1046 14 20 13.1046 20 12C20 10.8954 19.1046 10 18 10C16.8954 10 16 10.8954 16 12C16 13.1046 16.8954 14 18 14Z",
1201
+ fill: props.colors[2]
1202
+ }), /*#__PURE__*/ react.default.createElement("path", {
1203
+ fillRule: "evenodd",
1204
+ clipRule: "evenodd",
1205
+ d: "M24 14C25.1046 14 26 13.1046 26 12C26 10.8954 25.1046 10 24 10C22.8954 10 22 10.8954 22 12C22 13.1046 22.8954 14 24 14Z",
1206
+ fill: props.colors[2]
1207
+ }));
1208
+ });
1209
+ //#endregion
1210
+ //#region node_modules/@icon-park/react/es/icons/Check.js
1211
+ var Check_default = IconWrapper("check", true, function(props) {
1212
+ return /*#__PURE__*/ react.default.createElement("svg", {
1213
+ width: props.size,
1214
+ height: props.size,
1215
+ viewBox: "0 0 48 48",
1216
+ fill: "none"
1217
+ }, /*#__PURE__*/ react.default.createElement("path", {
1218
+ d: "M43 11L16.875 37L5 25.1818",
1219
+ stroke: props.colors[0],
1220
+ strokeWidth: props.strokeWidth,
1221
+ strokeLinecap: props.strokeLinecap,
1222
+ strokeLinejoin: props.strokeLinejoin
1223
+ }));
1224
+ });
1225
+ //#endregion
1226
+ //#region node_modules/@icon-park/react/es/icons/CheckSmall.js
1227
+ var CheckSmall_default = IconWrapper("check-small", true, function(props) {
1228
+ return /*#__PURE__*/ react.default.createElement("svg", {
1229
+ width: props.size,
1230
+ height: props.size,
1231
+ viewBox: "0 0 48 48",
1232
+ fill: "none"
1233
+ }, /*#__PURE__*/ react.default.createElement("path", {
1234
+ d: "M10 24L20 34L40 14",
1235
+ stroke: props.colors[0],
1236
+ strokeWidth: props.strokeWidth,
1237
+ strokeLinecap: props.strokeLinecap,
1238
+ strokeLinejoin: props.strokeLinejoin
1239
+ }));
1240
+ });
1241
+ //#endregion
1242
+ //#region node_modules/@icon-park/react/es/icons/Close.js
1243
+ var Close_default = IconWrapper("close", false, function(props) {
1244
+ return /*#__PURE__*/ react.default.createElement("svg", {
1245
+ width: props.size,
1246
+ height: props.size,
1247
+ viewBox: "0 0 48 48",
1248
+ fill: "none"
1249
+ }, /*#__PURE__*/ react.default.createElement("path", {
1250
+ d: "M8 8L40 40",
1251
+ stroke: props.colors[0],
1252
+ strokeWidth: props.strokeWidth,
1253
+ strokeLinecap: props.strokeLinecap,
1254
+ strokeLinejoin: props.strokeLinejoin
1255
+ }), /*#__PURE__*/ react.default.createElement("path", {
1256
+ d: "M8 40L40 8",
1257
+ stroke: props.colors[0],
1258
+ strokeWidth: props.strokeWidth,
1259
+ strokeLinecap: props.strokeLinecap,
1260
+ strokeLinejoin: props.strokeLinejoin
1261
+ }));
1262
+ });
1263
+ //#endregion
1264
+ //#region node_modules/@icon-park/react/es/icons/CloseSmall.js
1265
+ var CloseSmall_default = IconWrapper("close-small", false, function(props) {
1266
+ return /*#__PURE__*/ react.default.createElement("svg", {
1267
+ width: props.size,
1268
+ height: props.size,
1269
+ viewBox: "0 0 48 48",
1270
+ fill: "none"
1271
+ }, /*#__PURE__*/ react.default.createElement("path", {
1272
+ d: "M14 14L34 34",
1273
+ stroke: props.colors[0],
1274
+ strokeWidth: props.strokeWidth,
1275
+ strokeLinecap: props.strokeLinecap,
1276
+ strokeLinejoin: props.strokeLinejoin
1277
+ }), /*#__PURE__*/ react.default.createElement("path", {
1278
+ d: "M14 34L34 14",
1279
+ stroke: props.colors[0],
1280
+ strokeWidth: props.strokeWidth,
1281
+ strokeLinecap: props.strokeLinecap,
1282
+ strokeLinejoin: props.strokeLinejoin
1283
+ }));
1284
+ });
1285
+ //#endregion
1286
+ //#region node_modules/@icon-park/react/es/icons/Code.js
1287
+ var Code_default = IconWrapper("code", true, function(props) {
1288
+ return /*#__PURE__*/ react.default.createElement("svg", {
1289
+ width: props.size,
1290
+ height: props.size,
1291
+ viewBox: "0 0 48 48",
1292
+ fill: "none"
1293
+ }, /*#__PURE__*/ react.default.createElement("path", {
1294
+ d: "M16 13L4 25.4322L16 37",
1295
+ stroke: props.colors[0],
1296
+ strokeWidth: props.strokeWidth,
1297
+ strokeLinecap: props.strokeLinecap,
1298
+ strokeLinejoin: props.strokeLinejoin
1299
+ }), /*#__PURE__*/ react.default.createElement("path", {
1300
+ d: "M32 13L44 25.4322L32 37",
1301
+ stroke: props.colors[0],
1302
+ strokeWidth: props.strokeWidth,
1303
+ strokeLinecap: props.strokeLinecap,
1304
+ strokeLinejoin: props.strokeLinejoin
1305
+ }), /*#__PURE__*/ react.default.createElement("path", {
1306
+ d: "M28 4L21 44",
1307
+ stroke: props.colors[0],
1308
+ strokeWidth: props.strokeWidth,
1309
+ strokeLinecap: props.strokeLinecap
1310
+ }));
1311
+ });
1312
+ //#endregion
1313
+ //#region node_modules/@icon-park/react/es/icons/Config.js
1314
+ var Config_default = IconWrapper("config", false, function(props) {
1315
+ return /*#__PURE__*/ react.default.createElement("svg", {
1316
+ width: props.size,
1317
+ height: props.size,
1318
+ viewBox: "0 0 48 48",
1319
+ fill: "none"
1320
+ }, /*#__PURE__*/ react.default.createElement("path", {
1321
+ d: "M24 4L18 10H10V18L4 24L10 30V38H18L24 44L30 38H38V30L44 24L38 18V10H30L24 4Z",
1322
+ fill: props.colors[1],
1323
+ stroke: props.colors[0],
1324
+ strokeWidth: props.strokeWidth,
1325
+ strokeLinejoin: props.strokeLinejoin
1326
+ }), /*#__PURE__*/ react.default.createElement("path", {
1327
+ d: "M24 30C27.3137 30 30 27.3137 30 24C30 20.6863 27.3137 18 24 18C20.6863 18 18 20.6863 18 24C18 27.3137 20.6863 30 24 30Z",
1328
+ fill: props.colors[3],
1329
+ stroke: props.colors[2],
1330
+ strokeWidth: props.strokeWidth,
1331
+ strokeLinejoin: props.strokeLinejoin
1332
+ }));
1333
+ });
1334
+ //#endregion
1335
+ //#region node_modules/@icon-park/react/es/icons/Copy.js
1336
+ var Copy_default = IconWrapper("copy", true, function(props) {
1337
+ return /*#__PURE__*/ react.default.createElement("svg", {
1338
+ width: props.size,
1339
+ height: props.size,
1340
+ viewBox: "0 0 48 48",
1341
+ fill: "none"
1342
+ }, /*#__PURE__*/ react.default.createElement("path", {
1343
+ d: "M13 12.4316V7.8125C13 6.2592 14.2592 5 15.8125 5H40.1875C41.7408 5 43 6.2592 43 7.8125V32.1875C43 33.7408 41.7408 35 40.1875 35H35.5163",
1344
+ stroke: props.colors[0],
1345
+ strokeWidth: props.strokeWidth,
1346
+ strokeLinecap: props.strokeLinecap,
1347
+ strokeLinejoin: props.strokeLinejoin
1348
+ }), /*#__PURE__*/ react.default.createElement("path", {
1349
+ d: "M32.1875 13H7.8125C6.2592 13 5 14.2592 5 15.8125V40.1875C5 41.7408 6.2592 43 7.8125 43H32.1875C33.7408 43 35 41.7408 35 40.1875V15.8125C35 14.2592 33.7408 13 32.1875 13Z",
1350
+ fill: props.colors[1],
1351
+ stroke: props.colors[0],
1352
+ strokeWidth: props.strokeWidth,
1353
+ strokeLinejoin: props.strokeLinejoin
1354
+ }));
1355
+ });
1356
+ //#endregion
1357
+ //#region node_modules/@icon-park/react/es/icons/Delete.js
1358
+ var Delete_default = IconWrapper("delete", false, function(props) {
1359
+ return /*#__PURE__*/ react.default.createElement("svg", {
1360
+ width: props.size,
1361
+ height: props.size,
1362
+ viewBox: "0 0 48 48",
1363
+ fill: "none"
1364
+ }, /*#__PURE__*/ react.default.createElement("path", {
1365
+ d: "M9 10V44H39V10H9Z",
1366
+ fill: props.colors[1],
1367
+ stroke: props.colors[0],
1368
+ strokeWidth: props.strokeWidth,
1369
+ strokeLinejoin: props.strokeLinejoin
1370
+ }), /*#__PURE__*/ react.default.createElement("path", {
1371
+ d: "M20 20V33",
1372
+ stroke: props.colors[2],
1373
+ strokeWidth: props.strokeWidth,
1374
+ strokeLinecap: props.strokeLinecap,
1375
+ strokeLinejoin: props.strokeLinejoin
1376
+ }), /*#__PURE__*/ react.default.createElement("path", {
1377
+ d: "M28 20V33",
1378
+ stroke: props.colors[2],
1379
+ strokeWidth: props.strokeWidth,
1380
+ strokeLinecap: props.strokeLinecap,
1381
+ strokeLinejoin: props.strokeLinejoin
1382
+ }), /*#__PURE__*/ react.default.createElement("path", {
1383
+ d: "M4 10H44",
1384
+ stroke: props.colors[0],
1385
+ strokeWidth: props.strokeWidth,
1386
+ strokeLinecap: props.strokeLinecap,
1387
+ strokeLinejoin: props.strokeLinejoin
1388
+ }), /*#__PURE__*/ react.default.createElement("path", {
1389
+ d: "M16 10L19.289 4H28.7771L32 10H16Z",
1390
+ fill: props.colors[1],
1391
+ stroke: props.colors[0],
1392
+ strokeWidth: props.strokeWidth,
1393
+ strokeLinejoin: props.strokeLinejoin
1394
+ }));
1395
+ });
1396
+ //#endregion
1397
+ //#region node_modules/@icon-park/react/es/icons/Diamond.js
1398
+ var Diamond_default = IconWrapper("diamond", false, function(props) {
1399
+ return /*#__PURE__*/ react.default.createElement("svg", {
1400
+ width: props.size,
1401
+ height: props.size,
1402
+ viewBox: "0 0 48 48",
1403
+ fill: "none"
1404
+ }, /*#__PURE__*/ react.default.createElement("path", {
1405
+ fillRule: "evenodd",
1406
+ clipRule: "evenodd",
1407
+ d: "M10.6364 5H37.3636L45 18.3L24 43L3 18.3L10.6364 5Z",
1408
+ stroke: props.colors[0],
1409
+ strokeWidth: props.strokeWidth,
1410
+ strokeLinecap: props.strokeLinecap,
1411
+ strokeLinejoin: props.strokeLinejoin
1412
+ }), /*#__PURE__*/ react.default.createElement("path", {
1413
+ d: "M10.6362 5L23.9999 43L37.3635 5",
1414
+ stroke: props.colors[0],
1415
+ strokeWidth: props.strokeWidth,
1416
+ strokeLinecap: props.strokeLinecap,
1417
+ strokeLinejoin: props.strokeLinejoin
1418
+ }), /*#__PURE__*/ react.default.createElement("path", {
1419
+ d: "M3 18.3H45",
1420
+ stroke: props.colors[0],
1421
+ strokeWidth: props.strokeWidth,
1422
+ strokeLinecap: props.strokeLinecap,
1423
+ strokeLinejoin: props.strokeLinejoin
1424
+ }), /*#__PURE__*/ react.default.createElement("path", {
1425
+ d: "M15.4092 18.3L24.0001 5L32.591 18.3",
1426
+ stroke: props.colors[0],
1427
+ strokeWidth: props.strokeWidth,
1428
+ strokeLinecap: props.strokeLinecap,
1429
+ strokeLinejoin: props.strokeLinejoin
1430
+ }));
1431
+ });
1432
+ //#endregion
1433
+ //#region node_modules/@icon-park/react/es/icons/Down.js
1434
+ var Down_default = IconWrapper("down", false, function(props) {
1435
+ return /*#__PURE__*/ react.default.createElement("svg", {
1436
+ width: props.size,
1437
+ height: props.size,
1438
+ viewBox: "0 0 48 48",
1439
+ fill: "none"
1440
+ }, /*#__PURE__*/ react.default.createElement("path", {
1441
+ d: "M36 18L24 30L12 18",
1442
+ stroke: props.colors[0],
1443
+ strokeWidth: props.strokeWidth,
1444
+ strokeLinecap: props.strokeLinecap,
1445
+ strokeLinejoin: props.strokeLinejoin
1446
+ }));
1447
+ });
1448
+ //#endregion
1449
+ //#region node_modules/@icon-park/react/es/icons/Download.js
1450
+ var Download_default = IconWrapper("download", false, function(props) {
1451
+ return /*#__PURE__*/ react.default.createElement("svg", {
1452
+ width: props.size,
1453
+ height: props.size,
1454
+ viewBox: "0 0 48 48",
1455
+ fill: "none"
1456
+ }, /*#__PURE__*/ react.default.createElement("path", {
1457
+ d: "M6 24.0083V42H42V24",
1458
+ stroke: props.colors[0],
1459
+ strokeWidth: props.strokeWidth,
1460
+ strokeLinecap: props.strokeLinecap,
1461
+ strokeLinejoin: props.strokeLinejoin
1462
+ }), /*#__PURE__*/ react.default.createElement("path", {
1463
+ d: "M33 23L24 32L15 23",
1464
+ stroke: props.colors[0],
1465
+ strokeWidth: props.strokeWidth,
1466
+ strokeLinecap: props.strokeLinecap,
1467
+ strokeLinejoin: props.strokeLinejoin
1468
+ }), /*#__PURE__*/ react.default.createElement("path", {
1469
+ d: "M23.9917 6V32",
1470
+ stroke: props.colors[0],
1471
+ strokeWidth: props.strokeWidth,
1472
+ strokeLinecap: props.strokeLinecap,
1473
+ strokeLinejoin: props.strokeLinejoin
1474
+ }));
1475
+ });
1476
+ //#endregion
1477
+ //#region node_modules/@icon-park/react/es/icons/Edit.js
1478
+ var Edit_default = IconWrapper("edit", true, function(props) {
1479
+ return /*#__PURE__*/ react.default.createElement("svg", {
1480
+ width: props.size,
1481
+ height: props.size,
1482
+ viewBox: "0 0 48 48",
1483
+ fill: "none"
1484
+ }, /*#__PURE__*/ react.default.createElement("path", {
1485
+ d: "M7 42H43",
1486
+ stroke: props.colors[0],
1487
+ strokeWidth: props.strokeWidth,
1488
+ strokeLinecap: props.strokeLinecap,
1489
+ strokeLinejoin: props.strokeLinejoin
1490
+ }), /*#__PURE__*/ react.default.createElement("path", {
1491
+ d: "M11 26.7199V34H18.3172L39 13.3081L31.6951 6L11 26.7199Z",
1492
+ fill: props.colors[1],
1493
+ stroke: props.colors[0],
1494
+ strokeWidth: props.strokeWidth,
1495
+ strokeLinejoin: props.strokeLinejoin
1496
+ }));
1497
+ });
1498
+ //#endregion
1499
+ //#region node_modules/@icon-park/react/es/icons/Error.js
1500
+ var Error_default = IconWrapper("error", false, function(props) {
1501
+ return /*#__PURE__*/ react.default.createElement("svg", {
1502
+ width: props.size,
1503
+ height: props.size,
1504
+ viewBox: "0 0 48 48",
1505
+ fill: "none"
1506
+ }, /*#__PURE__*/ react.default.createElement("path", {
1507
+ fillRule: "evenodd",
1508
+ clipRule: "evenodd",
1509
+ d: "M6 11L11 6L24 19L37 6L42 11L29 24L42 37L37 42L24 29L11 42L6 37L19 24L6 11Z",
1510
+ fill: props.colors[1],
1511
+ stroke: props.colors[0],
1512
+ strokeWidth: props.strokeWidth,
1513
+ strokeLinecap: props.strokeLinecap,
1514
+ strokeLinejoin: props.strokeLinejoin
1515
+ }));
1516
+ });
1517
+ //#endregion
1518
+ //#region node_modules/@icon-park/react/es/icons/FileCode.js
1519
+ var FileCode_default = IconWrapper("file-code", true, function(props) {
1520
+ return /*#__PURE__*/ react.default.createElement("svg", {
1521
+ width: props.size,
1522
+ height: props.size,
1523
+ viewBox: "0 0 48 48",
1524
+ fill: "none"
1525
+ }, /*#__PURE__*/ react.default.createElement("path", {
1526
+ d: "M10 44H38C39.1046 44 40 43.1046 40 42V14H30V4H10C8.89543 4 8 4.89543 8 6V42C8 43.1046 8.89543 44 10 44Z",
1527
+ fill: props.colors[1],
1528
+ stroke: props.colors[0],
1529
+ strokeWidth: props.strokeWidth,
1530
+ strokeLinecap: props.strokeLinecap,
1531
+ strokeLinejoin: props.strokeLinejoin
1532
+ }), /*#__PURE__*/ react.default.createElement("path", {
1533
+ d: "M30 4L40 14",
1534
+ stroke: props.colors[0],
1535
+ strokeWidth: props.strokeWidth,
1536
+ strokeLinecap: props.strokeLinecap,
1537
+ strokeLinejoin: props.strokeLinejoin
1538
+ }), /*#__PURE__*/ react.default.createElement("path", {
1539
+ d: "M27 24L32 29L27 34",
1540
+ stroke: props.colors[2],
1541
+ strokeWidth: props.strokeWidth,
1542
+ strokeLinecap: props.strokeLinecap,
1543
+ strokeLinejoin: props.strokeLinejoin
1544
+ }), /*#__PURE__*/ react.default.createElement("path", {
1545
+ d: "M21 24L16 29L21 34",
1546
+ stroke: props.colors[2],
1547
+ strokeWidth: props.strokeWidth,
1548
+ strokeLinecap: props.strokeLinecap,
1549
+ strokeLinejoin: props.strokeLinejoin
1550
+ }));
1551
+ });
1552
+ //#endregion
1553
+ //#region node_modules/@icon-park/react/es/icons/FileText.js
1554
+ var FileText_default = IconWrapper("file-text", true, function(props) {
1555
+ return /*#__PURE__*/ react.default.createElement("svg", {
1556
+ width: props.size,
1557
+ height: props.size,
1558
+ viewBox: "0 0 48 48",
1559
+ fill: "none"
1560
+ }, /*#__PURE__*/ react.default.createElement("path", {
1561
+ d: "M10 44H38C39.1046 44 40 43.1046 40 42V14H30V4H10C8.89543 4 8 4.89543 8 6V42C8 43.1046 8.89543 44 10 44Z",
1562
+ fill: props.colors[1],
1563
+ stroke: props.colors[0],
1564
+ strokeWidth: props.strokeWidth,
1565
+ strokeLinecap: props.strokeLinecap,
1566
+ strokeLinejoin: props.strokeLinejoin
1567
+ }), /*#__PURE__*/ react.default.createElement("path", {
1568
+ d: "M30 4L40 14",
1569
+ stroke: props.colors[0],
1570
+ strokeWidth: props.strokeWidth,
1571
+ strokeLinecap: props.strokeLinecap,
1572
+ strokeLinejoin: props.strokeLinejoin
1573
+ }), /*#__PURE__*/ react.default.createElement("path", {
1574
+ d: "M24 22V36",
1575
+ stroke: props.colors[2],
1576
+ strokeWidth: props.strokeWidth,
1577
+ strokeLinecap: props.strokeLinecap,
1578
+ strokeLinejoin: props.strokeLinejoin
1579
+ }), /*#__PURE__*/ react.default.createElement("path", {
1580
+ d: "M18 22H24L30 22",
1581
+ stroke: props.colors[2],
1582
+ strokeWidth: props.strokeWidth,
1583
+ strokeLinecap: props.strokeLinecap,
1584
+ strokeLinejoin: props.strokeLinejoin
1585
+ }));
1586
+ });
1587
+ //#endregion
1588
+ //#region node_modules/@icon-park/react/es/icons/Folder.js
1589
+ var Folder_default = IconWrapper("folder", true, function(props) {
1590
+ return /*#__PURE__*/ react.default.createElement("svg", {
1591
+ width: props.size,
1592
+ height: props.size,
1593
+ viewBox: "0 0 48 48",
1594
+ fill: "none"
1595
+ }, /*#__PURE__*/ react.default.createElement("path", {
1596
+ d: "M7 6C7 4.89543 7.89543 4 9 4H39C40.1046 4 41 4.89543 41 6V42C41 43.1046 40.1046 44 39 44H9C7.89543 44 7 43.1046 7 42V6Z",
1597
+ fill: props.colors[1],
1598
+ stroke: props.colors[0],
1599
+ strokeWidth: props.strokeWidth,
1600
+ strokeLinecap: props.strokeLinecap,
1601
+ strokeLinejoin: props.strokeLinejoin
1602
+ }), /*#__PURE__*/ react.default.createElement("path", {
1603
+ d: "M16 29H20",
1604
+ stroke: props.colors[2],
1605
+ strokeWidth: props.strokeWidth,
1606
+ strokeLinecap: props.strokeLinecap,
1607
+ strokeLinejoin: props.strokeLinejoin
1608
+ }), /*#__PURE__*/ react.default.createElement("path", {
1609
+ d: "M16 35H26",
1610
+ stroke: props.colors[2],
1611
+ strokeWidth: props.strokeWidth,
1612
+ strokeLinecap: props.strokeLinecap,
1613
+ strokeLinejoin: props.strokeLinejoin
1614
+ }), /*#__PURE__*/ react.default.createElement("path", {
1615
+ d: "M8 5C8 5 11.7647 18 24 18C36.2353 18 40 5 40 5",
1616
+ stroke: props.colors[2],
1617
+ strokeWidth: props.strokeWidth,
1618
+ strokeLinecap: props.strokeLinecap,
1619
+ strokeLinejoin: props.strokeLinejoin
1620
+ }), /*#__PURE__*/ react.default.createElement("circle", {
1621
+ cx: "24",
1622
+ cy: "18",
1623
+ r: "4",
1624
+ fill: props.colors[3],
1625
+ stroke: props.colors[2],
1626
+ strokeWidth: props.strokeWidth,
1627
+ strokeLinecap: props.strokeLinecap,
1628
+ strokeLinejoin: props.strokeLinejoin
1629
+ }), /*#__PURE__*/ react.default.createElement("path", {
1630
+ d: "M15 4H9C7.89543 4 7 4.89543 7 6V12",
1631
+ stroke: props.colors[0],
1632
+ strokeWidth: props.strokeWidth,
1633
+ strokeLinecap: props.strokeLinecap,
1634
+ strokeLinejoin: props.strokeLinejoin
1635
+ }), /*#__PURE__*/ react.default.createElement("path", {
1636
+ d: "M33 4H39C40.1046 4 41 4.89543 41 6V12",
1637
+ stroke: props.colors[0],
1638
+ strokeWidth: props.strokeWidth,
1639
+ strokeLinecap: props.strokeLinecap,
1640
+ strokeLinejoin: props.strokeLinejoin
1641
+ }));
1642
+ });
1643
+ //#endregion
1644
+ //#region node_modules/@icon-park/react/es/icons/FolderOpen.js
1645
+ var FolderOpen_default = IconWrapper("folder-open", true, function(props) {
1646
+ return /*#__PURE__*/ react.default.createElement("svg", {
1647
+ width: props.size,
1648
+ height: props.size,
1649
+ viewBox: "0 0 48 48",
1650
+ fill: "none"
1651
+ }, /*#__PURE__*/ react.default.createElement("path", {
1652
+ d: "M4 9V41L9 21H39.5V15C39.5 13.8954 38.6046 13 37.5 13H24L19 7H6C4.89543 7 4 7.89543 4 9Z",
1653
+ stroke: props.colors[0],
1654
+ strokeWidth: props.strokeWidth,
1655
+ strokeLinecap: props.strokeLinecap,
1656
+ strokeLinejoin: props.strokeLinejoin
1657
+ }), /*#__PURE__*/ react.default.createElement("path", {
1658
+ d: "M40 41L44 21H8.8125L4 41H40Z",
1659
+ fill: props.colors[1],
1660
+ stroke: props.colors[0],
1661
+ strokeWidth: props.strokeWidth,
1662
+ strokeLinecap: props.strokeLinecap,
1663
+ strokeLinejoin: props.strokeLinejoin
1664
+ }));
1665
+ });
1666
+ //#endregion
1667
+ //#region node_modules/@icon-park/react/es/icons/FullScreen.js
1668
+ var FullScreen_default = IconWrapper("full-screen", false, function(props) {
1669
+ return /*#__PURE__*/ react.default.createElement("svg", {
1670
+ width: props.size,
1671
+ height: props.size,
1672
+ viewBox: "0 0 48 48",
1673
+ fill: "none"
1674
+ }, /*#__PURE__*/ react.default.createElement("path", {
1675
+ d: "M33 6H42V15",
1676
+ stroke: props.colors[0],
1677
+ strokeWidth: props.strokeWidth,
1678
+ strokeLinecap: props.strokeLinecap,
1679
+ strokeLinejoin: props.strokeLinejoin
1680
+ }), /*#__PURE__*/ react.default.createElement("path", {
1681
+ d: "M42 33V42H33",
1682
+ stroke: props.colors[0],
1683
+ strokeWidth: props.strokeWidth,
1684
+ strokeLinecap: props.strokeLinecap,
1685
+ strokeLinejoin: props.strokeLinejoin
1686
+ }), /*#__PURE__*/ react.default.createElement("path", {
1687
+ d: "M15 42H6V33",
1688
+ stroke: props.colors[0],
1689
+ strokeWidth: props.strokeWidth,
1690
+ strokeLinecap: props.strokeLinecap,
1691
+ strokeLinejoin: props.strokeLinejoin
1692
+ }), /*#__PURE__*/ react.default.createElement("path", {
1693
+ d: "M6 15V6H15",
1694
+ stroke: props.colors[0],
1695
+ strokeWidth: props.strokeWidth,
1696
+ strokeLinecap: props.strokeLinecap,
1697
+ strokeLinejoin: props.strokeLinejoin
1698
+ }));
1699
+ });
1700
+ //#endregion
1701
+ //#region node_modules/@icon-park/react/es/icons/Globe.js
1702
+ var Globe_default = IconWrapper("globe", true, function(props) {
1703
+ return /*#__PURE__*/ react.default.createElement("svg", {
1704
+ width: props.size,
1705
+ height: props.size,
1706
+ viewBox: "0 0 48 48",
1707
+ fill: "none"
1708
+ }, /*#__PURE__*/ react.default.createElement("path", {
1709
+ d: "M37.8261 4C41.6276 7.58886 44 12.6753 44 18.3158C44 29.1871 35.1871 38 24.3158 38C18.6753 38 13.5889 35.6276 10 31.8261",
1710
+ stroke: props.colors[0],
1711
+ strokeWidth: props.strokeWidth,
1712
+ strokeLinecap: props.strokeLinecap,
1713
+ strokeLinejoin: props.strokeLinejoin
1714
+ }), /*#__PURE__*/ react.default.createElement("path", {
1715
+ fillRule: "evenodd",
1716
+ clipRule: "evenodd",
1717
+ d: "M24 32C31.732 32 38 25.732 38 18C38 10.268 31.732 4 24 4C16.268 4 10 10.268 10 18C10 25.732 16.268 32 24 32Z",
1718
+ fill: props.colors[1],
1719
+ stroke: props.colors[0],
1720
+ strokeWidth: props.strokeWidth,
1721
+ strokeLinecap: props.strokeLinecap,
1722
+ strokeLinejoin: props.strokeLinejoin
1723
+ }), /*#__PURE__*/ react.default.createElement("path", {
1724
+ d: "M24 38V44",
1725
+ stroke: props.colors[0],
1726
+ strokeWidth: props.strokeWidth,
1727
+ strokeLinecap: props.strokeLinecap,
1728
+ strokeLinejoin: props.strokeLinejoin
1729
+ }), /*#__PURE__*/ react.default.createElement("path", {
1730
+ d: "M18 44H30",
1731
+ stroke: props.colors[0],
1732
+ strokeWidth: props.strokeWidth,
1733
+ strokeLinecap: props.strokeLinecap,
1734
+ strokeLinejoin: props.strokeLinejoin
1735
+ }));
1736
+ });
1737
+ //#endregion
1738
+ //#region node_modules/@icon-park/react/es/icons/Help.js
1739
+ var Help_default = IconWrapper("help", true, function(props) {
1740
+ return /*#__PURE__*/ react.default.createElement("svg", {
1741
+ width: props.size,
1742
+ height: props.size,
1743
+ viewBox: "0 0 48 48",
1744
+ fill: "none"
1745
+ }, /*#__PURE__*/ react.default.createElement("path", {
1746
+ d: "M24 44C29.5228 44 34.5228 41.7614 38.1421 38.1421C41.7614 34.5228 44 29.5228 44 24C44 18.4772 41.7614 13.4772 38.1421 9.85786C34.5228 6.23858 29.5228 4 24 4C18.4772 4 13.4772 6.23858 9.85786 9.85786C6.23858 13.4772 4 18.4772 4 24C4 29.5228 6.23858 34.5228 9.85786 38.1421C13.4772 41.7614 18.4772 44 24 44Z",
1747
+ fill: props.colors[1],
1748
+ stroke: props.colors[0],
1749
+ strokeWidth: props.strokeWidth,
1750
+ strokeLinejoin: props.strokeLinejoin
1751
+ }), /*#__PURE__*/ react.default.createElement("path", {
1752
+ d: "M24 28.6248V24.6248C27.3137 24.6248 30 21.9385 30 18.6248C30 15.3111 27.3137 12.6248 24 12.6248C20.6863 12.6248 18 15.3111 18 18.6248",
1753
+ stroke: props.colors[2],
1754
+ strokeWidth: props.strokeWidth,
1755
+ strokeLinecap: props.strokeLinecap,
1756
+ strokeLinejoin: props.strokeLinejoin
1757
+ }), /*#__PURE__*/ react.default.createElement("path", {
1758
+ fillRule: "evenodd",
1759
+ clipRule: "evenodd",
1760
+ d: "M24 37.6248C25.3807 37.6248 26.5 36.5055 26.5 35.1248C26.5 33.7441 25.3807 32.6248 24 32.6248C22.6193 32.6248 21.5 33.7441 21.5 35.1248C21.5 36.5055 22.6193 37.6248 24 37.6248Z",
1761
+ fill: props.colors[2]
1762
+ }));
1763
+ });
1764
+ //#endregion
1765
+ //#region node_modules/@icon-park/react/es/icons/Info.js
1766
+ var Info_default = IconWrapper("info", true, function(props) {
1767
+ return /*#__PURE__*/ react.default.createElement("svg", {
1768
+ width: props.size,
1769
+ height: props.size,
1770
+ viewBox: "0 0 48 48",
1771
+ fill: "none"
1772
+ }, /*#__PURE__*/ react.default.createElement("path", {
1773
+ d: "M24 44C29.5228 44 34.5228 41.7614 38.1421 38.1421C41.7614 34.5228 44 29.5228 44 24C44 18.4772 41.7614 13.4772 38.1421 9.85786C34.5228 6.23858 29.5228 4 24 4C18.4772 4 13.4772 6.23858 9.85786 9.85786C6.23858 13.4772 4 18.4772 4 24C4 29.5228 6.23858 34.5228 9.85786 38.1421C13.4772 41.7614 18.4772 44 24 44Z",
1774
+ fill: props.colors[1],
1775
+ stroke: props.colors[0],
1776
+ strokeWidth: props.strokeWidth,
1777
+ strokeLinejoin: props.strokeLinejoin
1778
+ }), /*#__PURE__*/ react.default.createElement("path", {
1779
+ fillRule: "evenodd",
1780
+ clipRule: "evenodd",
1781
+ d: "M24 11C25.3807 11 26.5 12.1193 26.5 13.5C26.5 14.8807 25.3807 16 24 16C22.6193 16 21.5 14.8807 21.5 13.5C21.5 12.1193 22.6193 11 24 11Z",
1782
+ fill: props.colors[2]
1783
+ }), /*#__PURE__*/ react.default.createElement("path", {
1784
+ d: "M24.5 34V20H23.5H22.5",
1785
+ stroke: props.colors[2],
1786
+ strokeWidth: props.strokeWidth,
1787
+ strokeLinecap: props.strokeLinecap,
1788
+ strokeLinejoin: props.strokeLinejoin
1789
+ }), /*#__PURE__*/ react.default.createElement("path", {
1790
+ d: "M21 34H28",
1791
+ stroke: props.colors[2],
1792
+ strokeWidth: props.strokeWidth,
1793
+ strokeLinecap: props.strokeLinecap,
1794
+ strokeLinejoin: props.strokeLinejoin
1795
+ }));
1796
+ });
1797
+ //#endregion
1798
+ //#region node_modules/@icon-park/react/es/icons/Left.js
1799
+ var Left_default = IconWrapper("left", true, function(props) {
1800
+ return /*#__PURE__*/ react.default.createElement("svg", {
1801
+ width: props.size,
1802
+ height: props.size,
1803
+ viewBox: "0 0 48 48",
1804
+ fill: "none"
1805
+ }, /*#__PURE__*/ react.default.createElement("path", {
1806
+ d: "M31 36L19 24L31 12",
1807
+ stroke: props.colors[0],
1808
+ strokeWidth: props.strokeWidth,
1809
+ strokeLinecap: props.strokeLinecap,
1810
+ strokeLinejoin: props.strokeLinejoin
1811
+ }));
1812
+ });
1813
+ //#endregion
1814
+ //#region node_modules/@icon-park/react/es/icons/Link.js
1815
+ var Link_default = IconWrapper("link", true, function(props) {
1816
+ return /*#__PURE__*/ react.default.createElement("svg", {
1817
+ width: props.size,
1818
+ height: props.size,
1819
+ viewBox: "0 0 48 48",
1820
+ fill: "none"
1821
+ }, /*#__PURE__*/ react.default.createElement("path", {
1822
+ d: "M24.7073 9.56521L9.85801 24.4145C6.34329 27.9292 6.34329 33.6277 9.85801 37.1424V37.1424C13.3727 40.6571 19.0712 40.6571 22.5859 37.1424L40.2636 19.4647C42.6067 17.1216 42.6067 13.3226 40.2636 10.9794V10.9794C37.9205 8.63628 34.1215 8.63628 31.7783 10.9794L14.1007 28.6571C12.9291 29.8287 12.9291 31.7282 14.1007 32.8997V32.8997C15.2722 34.0713 17.1717 34.0713 18.3433 32.8997L33.1925 18.0505",
1823
+ stroke: props.colors[0],
1824
+ strokeWidth: props.strokeWidth,
1825
+ strokeLinecap: props.strokeLinecap,
1826
+ strokeLinejoin: props.strokeLinejoin
1827
+ }));
1828
+ });
1829
+ //#endregion
1830
+ //#region node_modules/@icon-park/react/es/icons/Loading.js
1831
+ var Loading_default = IconWrapper("loading", true, function(props) {
1832
+ return /*#__PURE__*/ react.default.createElement("svg", {
1833
+ width: props.size,
1834
+ height: props.size,
1835
+ viewBox: "0 0 48 48",
1836
+ fill: "none"
1837
+ }, /*#__PURE__*/ react.default.createElement("path", {
1838
+ d: "M4 24C4 35.0457 12.9543 44 24 44V44C35.0457 44 44 35.0457 44 24C44 12.9543 35.0457 4 24 4",
1839
+ stroke: props.colors[0],
1840
+ strokeWidth: props.strokeWidth,
1841
+ strokeLinecap: props.strokeLinecap,
1842
+ strokeLinejoin: props.strokeLinejoin
1843
+ }), /*#__PURE__*/ react.default.createElement("path", {
1844
+ d: "M36 24C36 17.3726 30.6274 12 24 12C17.3726 12 12 17.3726 12 24C12 30.6274 17.3726 36 24 36V36",
1845
+ stroke: props.colors[0],
1846
+ strokeWidth: props.strokeWidth,
1847
+ strokeLinecap: props.strokeLinecap,
1848
+ strokeLinejoin: props.strokeLinejoin
1849
+ }));
1850
+ });
1851
+ //#endregion
1852
+ //#region node_modules/@icon-park/react/es/icons/Lock.js
1853
+ var Lock_default = IconWrapper("lock", false, function(props) {
1854
+ return /*#__PURE__*/ react.default.createElement("svg", {
1855
+ width: props.size,
1856
+ height: props.size,
1857
+ viewBox: "0 0 48 48",
1858
+ fill: "none"
1859
+ }, /*#__PURE__*/ react.default.createElement("rect", {
1860
+ x: "6",
1861
+ y: "22",
1862
+ width: "36",
1863
+ height: "22",
1864
+ rx: "2",
1865
+ fill: props.colors[1],
1866
+ stroke: props.colors[0],
1867
+ strokeWidth: props.strokeWidth,
1868
+ strokeLinejoin: props.strokeLinejoin
1869
+ }), /*#__PURE__*/ react.default.createElement("path", {
1870
+ d: "M14 22V14C14 8.47715 18.4772 4 24 4C29.5228 4 34 8.47715 34 14V22",
1871
+ stroke: props.colors[0],
1872
+ strokeWidth: props.strokeWidth,
1873
+ strokeLinecap: props.strokeLinecap,
1874
+ strokeLinejoin: props.strokeLinejoin
1875
+ }), /*#__PURE__*/ react.default.createElement("path", {
1876
+ d: "M24 30V36",
1877
+ stroke: props.colors[2],
1878
+ strokeWidth: props.strokeWidth,
1879
+ strokeLinecap: props.strokeLinecap,
1880
+ strokeLinejoin: props.strokeLinejoin
1881
+ }));
1882
+ });
1883
+ //#endregion
1884
+ //#region node_modules/@icon-park/react/es/icons/More.js
1885
+ var More_default = IconWrapper("more", false, function(props) {
1886
+ return /*#__PURE__*/ react.default.createElement("svg", {
1887
+ width: props.size,
1888
+ height: props.size,
1889
+ viewBox: "0 0 48 48",
1890
+ fill: "none"
1891
+ }, /*#__PURE__*/ react.default.createElement("circle", {
1892
+ cx: "12",
1893
+ cy: "24",
1894
+ r: "3",
1895
+ fill: props.colors[0]
1896
+ }), /*#__PURE__*/ react.default.createElement("circle", {
1897
+ cx: "24",
1898
+ cy: "24",
1899
+ r: "3",
1900
+ fill: props.colors[0]
1901
+ }), /*#__PURE__*/ react.default.createElement("circle", {
1902
+ cx: "36",
1903
+ cy: "24",
1904
+ r: "3",
1905
+ fill: props.colors[0]
1906
+ }));
1907
+ });
1908
+ //#endregion
1909
+ //#region node_modules/@icon-park/react/es/icons/Pause.js
1910
+ var Pause_default = IconWrapper("pause", true, function(props) {
1911
+ return /*#__PURE__*/ react.default.createElement("svg", {
1912
+ width: props.size,
1913
+ height: props.size,
1914
+ viewBox: "0 0 48 48",
1915
+ fill: "none"
1916
+ }, /*#__PURE__*/ react.default.createElement("path", {
1917
+ d: "M16 12V36",
1918
+ stroke: props.colors[0],
1919
+ strokeWidth: props.strokeWidth,
1920
+ strokeLinecap: props.strokeLinecap,
1921
+ strokeLinejoin: props.strokeLinejoin
1922
+ }), /*#__PURE__*/ react.default.createElement("path", {
1923
+ d: "M32 12V36",
1924
+ stroke: props.colors[0],
1925
+ strokeWidth: props.strokeWidth,
1926
+ strokeLinecap: props.strokeLinecap,
1927
+ strokeLinejoin: props.strokeLinejoin
1928
+ }));
1929
+ });
1930
+ //#endregion
1931
+ //#region node_modules/@icon-park/react/es/icons/Play.js
1932
+ var Play_default = IconWrapper("play", true, function(props) {
1933
+ return /*#__PURE__*/ react.default.createElement("svg", {
1934
+ width: props.size,
1935
+ height: props.size,
1936
+ viewBox: "0 0 48 48",
1937
+ fill: "none"
1938
+ }, /*#__PURE__*/ react.default.createElement("path", {
1939
+ d: "M24 44C35.0457 44 44 35.0457 44 24C44 12.9543 35.0457 4 24 4C12.9543 4 4 12.9543 4 24C4 35.0457 12.9543 44 24 44Z",
1940
+ fill: props.colors[1],
1941
+ stroke: props.colors[0],
1942
+ strokeWidth: props.strokeWidth,
1943
+ strokeLinejoin: props.strokeLinejoin
1944
+ }), /*#__PURE__*/ react.default.createElement("path", {
1945
+ d: "M20 24V17.0718L26 20.5359L32 24L26 27.4641L20 30.9282V24Z",
1946
+ fill: props.colors[3],
1947
+ stroke: props.colors[2],
1948
+ strokeWidth: props.strokeWidth,
1949
+ strokeLinejoin: props.strokeLinejoin
1950
+ }));
1951
+ });
1952
+ //#endregion
1953
+ //#region node_modules/@icon-park/react/es/icons/PreviewClose.js
1954
+ var PreviewClose_default = IconWrapper("preview-close", false, function(props) {
1955
+ return /*#__PURE__*/ react.default.createElement("svg", {
1956
+ width: props.size,
1957
+ height: props.size,
1958
+ viewBox: "0 0 48 48",
1959
+ fill: "none"
1960
+ }, /*#__PURE__*/ react.default.createElement("path", {
1961
+ d: "M6 16C6.63472 17.2193 7.59646 18.3504 8.82276 19.3554C12.261 22.1733 17.779 24 24 24C30.221 24 35.739 22.1733 39.1772 19.3554C40.4035 18.3504 41.3653 17.2193 42 16",
1962
+ stroke: props.colors[0],
1963
+ strokeWidth: props.strokeWidth,
1964
+ strokeLinecap: props.strokeLinecap,
1965
+ strokeLinejoin: props.strokeLinejoin
1966
+ }), /*#__PURE__*/ react.default.createElement("path", {
1967
+ d: "M28.9775 24L31.048 31.7274",
1968
+ stroke: props.colors[0],
1969
+ strokeWidth: props.strokeWidth,
1970
+ strokeLinecap: props.strokeLinecap,
1971
+ strokeLinejoin: props.strokeLinejoin
1972
+ }), /*#__PURE__*/ react.default.createElement("path", {
1973
+ d: "M37.3535 21.3536L43.0103 27.0104",
1974
+ stroke: props.colors[0],
1975
+ strokeWidth: props.strokeWidth,
1976
+ strokeLinecap: props.strokeLinecap,
1977
+ strokeLinejoin: props.strokeLinejoin
1978
+ }), /*#__PURE__*/ react.default.createElement("path", {
1979
+ d: "M5.00004 27.0103L10.6569 21.3534",
1980
+ stroke: props.colors[0],
1981
+ strokeWidth: props.strokeWidth,
1982
+ strokeLinecap: props.strokeLinecap,
1983
+ strokeLinejoin: props.strokeLinejoin
1984
+ }), /*#__PURE__*/ react.default.createElement("path", {
1985
+ d: "M16.9278 31.7276L18.9983 24.0001",
1986
+ stroke: props.colors[0],
1987
+ strokeWidth: props.strokeWidth,
1988
+ strokeLinecap: props.strokeLinecap,
1989
+ strokeLinejoin: props.strokeLinejoin
1990
+ }));
1991
+ });
1992
+ //#endregion
1993
+ //#region node_modules/@icon-park/react/es/icons/PreviewOpen.js
1994
+ var PreviewOpen_default = IconWrapper("preview-open", false, function(props) {
1995
+ return /*#__PURE__*/ react.default.createElement("svg", {
1996
+ width: props.size,
1997
+ height: props.size,
1998
+ viewBox: "0 0 48 48",
1999
+ fill: "none"
2000
+ }, /*#__PURE__*/ react.default.createElement("path", {
2001
+ d: "M24 36C35.0457 36 44 24 44 24C44 24 35.0457 12 24 12C12.9543 12 4 24 4 24C4 24 12.9543 36 24 36Z",
2002
+ fill: props.colors[1],
2003
+ stroke: props.colors[0],
2004
+ strokeWidth: props.strokeWidth,
2005
+ strokeLinejoin: props.strokeLinejoin
2006
+ }), /*#__PURE__*/ react.default.createElement("path", {
2007
+ d: "M24 29C26.7614 29 29 26.7614 29 24C29 21.2386 26.7614 19 24 19C21.2386 19 19 21.2386 19 24C19 26.7614 21.2386 29 24 29Z",
2008
+ fill: props.colors[3],
2009
+ stroke: props.colors[2],
2010
+ strokeWidth: props.strokeWidth,
2011
+ strokeLinejoin: props.strokeLinejoin
2012
+ }));
2013
+ });
2014
+ //#endregion
2015
+ //#region node_modules/@icon-park/react/es/icons/Redo.js
2016
+ var Redo_default = IconWrapper("redo", true, function(props) {
2017
+ return /*#__PURE__*/ react.default.createElement("svg", {
2018
+ width: props.size,
2019
+ height: props.size,
2020
+ viewBox: "0 0 48 48",
2021
+ fill: "none"
2022
+ }, /*#__PURE__*/ react.default.createElement("path", {
2023
+ d: "M36.7279 36.7279C33.4706 39.9853 28.9706 42 24 42C14.0589 42 6 33.9411 6 24C6 14.0589 14.0589 6 24 6C28.9706 6 33.4706 8.01472 36.7279 11.2721C38.3859 12.9301 42 17 42 17",
2024
+ stroke: props.colors[0],
2025
+ strokeWidth: props.strokeWidth,
2026
+ strokeLinecap: props.strokeLinecap,
2027
+ strokeLinejoin: props.strokeLinejoin
2028
+ }), /*#__PURE__*/ react.default.createElement("path", {
2029
+ d: "M42 8V17H33",
2030
+ stroke: props.colors[0],
2031
+ strokeWidth: props.strokeWidth,
2032
+ strokeLinecap: props.strokeLinecap,
2033
+ strokeLinejoin: props.strokeLinejoin
2034
+ }));
2035
+ });
2036
+ //#endregion
2037
+ //#region node_modules/@icon-park/react/es/icons/Refresh.js
2038
+ var Refresh_default = IconWrapper("refresh", true, function(props) {
2039
+ return /*#__PURE__*/ react.default.createElement("svg", {
2040
+ width: props.size,
2041
+ height: props.size,
2042
+ viewBox: "0 0 48 48",
2043
+ fill: "none"
2044
+ }, /*#__PURE__*/ react.default.createElement("path", {
2045
+ d: "M42 8V24",
2046
+ stroke: props.colors[0],
2047
+ strokeWidth: props.strokeWidth,
2048
+ strokeLinecap: props.strokeLinecap,
2049
+ strokeLinejoin: props.strokeLinejoin
2050
+ }), /*#__PURE__*/ react.default.createElement("path", {
2051
+ d: "M6 24L6 40",
2052
+ stroke: props.colors[0],
2053
+ strokeWidth: props.strokeWidth,
2054
+ strokeLinecap: props.strokeLinecap,
2055
+ strokeLinejoin: props.strokeLinejoin
2056
+ }), /*#__PURE__*/ react.default.createElement("path", {
2057
+ d: "M42 24C42 14.0589 33.9411 6 24 6C18.9145 6 14.3216 8.10896 11.0481 11.5M6 24C6 33.9411 14.0589 42 24 42C28.8556 42 33.2622 40.0774 36.5 36.9519",
2058
+ stroke: props.colors[0],
2059
+ strokeWidth: props.strokeWidth,
2060
+ strokeLinecap: props.strokeLinecap,
2061
+ strokeLinejoin: props.strokeLinejoin
2062
+ }));
2063
+ });
2064
+ //#endregion
2065
+ //#region node_modules/@icon-park/react/es/icons/Right.js
2066
+ var Right_default = IconWrapper("right", true, function(props) {
2067
+ return /*#__PURE__*/ react.default.createElement("svg", {
2068
+ width: props.size,
2069
+ height: props.size,
2070
+ viewBox: "0 0 48 48",
2071
+ fill: "none"
2072
+ }, /*#__PURE__*/ react.default.createElement("path", {
2073
+ d: "M19 12L31 24L19 36",
2074
+ stroke: props.colors[0],
2075
+ strokeWidth: props.strokeWidth,
2076
+ strokeLinecap: props.strokeLinecap,
2077
+ strokeLinejoin: props.strokeLinejoin
2078
+ }));
2079
+ });
2080
+ //#endregion
2081
+ //#region node_modules/@icon-park/react/es/icons/Save.js
2082
+ var Save_default = IconWrapper("save", true, function(props) {
2083
+ return /*#__PURE__*/ react.default.createElement("svg", {
2084
+ width: props.size,
2085
+ height: props.size,
2086
+ viewBox: "0 0 48 48",
2087
+ fill: "none"
2088
+ }, /*#__PURE__*/ react.default.createElement("path", {
2089
+ d: "M6 9C6 7.34315 7.34315 6 9 6H34.2814L42 13.2065V39C42 40.6569 40.6569 42 39 42H9C7.34315 42 6 40.6569 6 39V9Z",
2090
+ fill: props.colors[1],
2091
+ stroke: props.colors[0],
2092
+ strokeWidth: props.strokeWidth,
2093
+ strokeLinejoin: props.strokeLinejoin
2094
+ }), /*#__PURE__*/ react.default.createElement("path", {
2095
+ fillRule: "evenodd",
2096
+ clipRule: "evenodd",
2097
+ d: "M24.0083 6L24 13.3846C24 13.7245 23.5523 14 23 14H15C14.4477 14 14 13.7245 14 13.3846L14 6",
2098
+ fill: props.colors[3]
2099
+ }), /*#__PURE__*/ react.default.createElement("path", {
2100
+ d: "M24.0083 6L24 13.3846C24 13.7245 23.5523 14 23 14H15C14.4477 14 14 13.7245 14 13.3846L14 6H24.0083Z",
2101
+ stroke: props.colors[2],
2102
+ strokeWidth: props.strokeWidth,
2103
+ strokeLinejoin: props.strokeLinejoin
2104
+ }), /*#__PURE__*/ react.default.createElement("path", {
2105
+ d: "M9 6H34.2814",
2106
+ stroke: props.colors[0],
2107
+ strokeWidth: props.strokeWidth,
2108
+ strokeLinecap: props.strokeLinecap,
2109
+ strokeLinejoin: props.strokeLinejoin
2110
+ }), /*#__PURE__*/ react.default.createElement("path", {
2111
+ d: "M14 26H34",
2112
+ stroke: props.colors[2],
2113
+ strokeWidth: props.strokeWidth,
2114
+ strokeLinecap: props.strokeLinecap,
2115
+ strokeLinejoin: props.strokeLinejoin
2116
+ }), /*#__PURE__*/ react.default.createElement("path", {
2117
+ d: "M14 34H24.0083",
2118
+ stroke: props.colors[2],
2119
+ strokeWidth: props.strokeWidth,
2120
+ strokeLinecap: props.strokeLinecap,
2121
+ strokeLinejoin: props.strokeLinejoin
2122
+ }));
2123
+ });
2124
+ //#endregion
2125
+ //#region node_modules/@icon-park/react/es/icons/Search.js
2126
+ var Search_default = IconWrapper("search", true, function(props) {
2127
+ return /*#__PURE__*/ react.default.createElement("svg", {
2128
+ width: props.size,
2129
+ height: props.size,
2130
+ viewBox: "0 0 48 48",
2131
+ fill: "none"
2132
+ }, /*#__PURE__*/ react.default.createElement("path", {
2133
+ d: "M21 38C30.3888 38 38 30.3888 38 21C38 11.6112 30.3888 4 21 4C11.6112 4 4 11.6112 4 21C4 30.3888 11.6112 38 21 38Z",
2134
+ fill: props.colors[1],
2135
+ stroke: props.colors[0],
2136
+ strokeWidth: props.strokeWidth,
2137
+ strokeLinejoin: props.strokeLinejoin
2138
+ }), /*#__PURE__*/ react.default.createElement("path", {
2139
+ d: "M26.657 14.3431C25.2093 12.8954 23.2093 12 21.0001 12C18.791 12 16.791 12.8954 15.3433 14.3431",
2140
+ stroke: props.colors[2],
2141
+ strokeWidth: props.strokeWidth,
2142
+ strokeLinecap: props.strokeLinecap,
2143
+ strokeLinejoin: props.strokeLinejoin
2144
+ }), /*#__PURE__*/ react.default.createElement("path", {
2145
+ d: "M33.2216 33.2217L41.7069 41.707",
2146
+ stroke: props.colors[0],
2147
+ strokeWidth: props.strokeWidth,
2148
+ strokeLinecap: props.strokeLinecap,
2149
+ strokeLinejoin: props.strokeLinejoin
2150
+ }));
2151
+ });
2152
+ //#endregion
2153
+ //#region node_modules/@icon-park/react/es/icons/Setting.js
2154
+ var Setting_default = IconWrapper("setting", false, function(props) {
2155
+ return /*#__PURE__*/ react.default.createElement("svg", {
2156
+ width: props.size,
2157
+ height: props.size,
2158
+ viewBox: "0 0 48 48",
2159
+ fill: "none"
2160
+ }, /*#__PURE__*/ react.default.createElement("path", {
2161
+ d: "M36.686 15.171C37.9364 16.9643 38.8163 19.0352 39.2147 21.2727H44V26.7273H39.2147C38.8163 28.9648 37.9364 31.0357 36.686 32.829L40.0706 36.2137L36.2137 40.0706L32.829 36.686C31.0357 37.9364 28.9648 38.8163 26.7273 39.2147V44H21.2727V39.2147C19.0352 38.8163 16.9643 37.9364 15.171 36.686L11.7863 40.0706L7.92939 36.2137L11.314 32.829C10.0636 31.0357 9.18372 28.9648 8.78533 26.7273H4V21.2727H8.78533C9.18372 19.0352 10.0636 16.9643 11.314 15.171L7.92939 11.7863L11.7863 7.92939L15.171 11.314C16.9643 10.0636 19.0352 9.18372 21.2727 8.78533V4H26.7273V8.78533C28.9648 9.18372 31.0357 10.0636 32.829 11.314L36.2137 7.92939L40.0706 11.7863L36.686 15.171Z",
2162
+ fill: props.colors[1],
2163
+ stroke: props.colors[0],
2164
+ strokeWidth: props.strokeWidth,
2165
+ strokeLinejoin: props.strokeLinejoin
2166
+ }), /*#__PURE__*/ react.default.createElement("path", {
2167
+ d: "M24 29C26.7614 29 29 26.7614 29 24C29 21.2386 26.7614 19 24 19C21.2386 19 19 21.2386 19 24C19 26.7614 21.2386 29 24 29Z",
2168
+ fill: props.colors[3],
2169
+ stroke: props.colors[2],
2170
+ strokeWidth: props.strokeWidth,
2171
+ strokeLinejoin: props.strokeLinejoin
2172
+ }));
2173
+ });
2174
+ //#endregion
2175
+ //#region node_modules/@icon-park/react/es/icons/SettingTwo.js
2176
+ var SettingTwo_default = IconWrapper("setting-two", false, function(props) {
2177
+ return /*#__PURE__*/ react.default.createElement("svg", {
2178
+ width: props.size,
2179
+ height: props.size,
2180
+ viewBox: "0 0 48 48",
2181
+ fill: "none"
2182
+ }, /*#__PURE__*/ react.default.createElement("path", {
2183
+ d: "M18.2838 43.1713C14.9327 42.1736 11.9498 40.3213 9.58787 37.867C10.469 36.8227 11 35.4734 11 34.0001C11 30.6864 8.31371 28.0001 5 28.0001C4.79955 28.0001 4.60139 28.01 4.40599 28.0292C4.13979 26.7277 4 25.3803 4 24.0001C4 21.9095 4.32077 19.8938 4.91579 17.9995C4.94381 17.9999 4.97188 18.0001 5 18.0001C8.31371 18.0001 11 15.3138 11 12.0001C11 11.0488 10.7786 10.1493 10.3846 9.35011C12.6975 7.1995 15.5205 5.59002 18.6521 4.72314C19.6444 6.66819 21.6667 8.00013 24 8.00013C26.3333 8.00013 28.3556 6.66819 29.3479 4.72314C32.4795 5.59002 35.3025 7.1995 37.6154 9.35011C37.2214 10.1493 37 11.0488 37 12.0001C37 15.3138 39.6863 18.0001 43 18.0001C43.0281 18.0001 43.0562 17.9999 43.0842 17.9995C43.6792 19.8938 44 21.9095 44 24.0001C44 25.3803 43.8602 26.7277 43.594 28.0292C43.3986 28.01 43.2005 28.0001 43 28.0001C39.6863 28.0001 37 30.6864 37 34.0001C37 35.4734 37.531 36.8227 38.4121 37.867C36.0502 40.3213 33.0673 42.1736 29.7162 43.1713C28.9428 40.752 26.676 39.0001 24 39.0001C21.324 39.0001 19.0572 40.752 18.2838 43.1713Z",
2184
+ fill: props.colors[1],
2185
+ stroke: props.colors[0],
2186
+ strokeWidth: props.strokeWidth,
2187
+ strokeLinejoin: props.strokeLinejoin
2188
+ }), /*#__PURE__*/ react.default.createElement("path", {
2189
+ d: "M24 31C27.866 31 31 27.866 31 24C31 20.134 27.866 17 24 17C20.134 17 17 20.134 17 24C17 27.866 20.134 31 24 31Z",
2190
+ fill: props.colors[3],
2191
+ stroke: props.colors[2],
2192
+ strokeWidth: props.strokeWidth,
2193
+ strokeLinejoin: props.strokeLinejoin
2194
+ }));
2195
+ });
2196
+ //#endregion
2197
+ //#region node_modules/@icon-park/react/es/icons/Sort.js
2198
+ var Sort_default = IconWrapper("sort", false, function(props) {
2199
+ return /*#__PURE__*/ react.default.createElement("svg", {
2200
+ width: props.size,
2201
+ height: props.size,
2202
+ viewBox: "0 0 48 48",
2203
+ fill: "none"
2204
+ }, /*#__PURE__*/ react.default.createElement("path", {
2205
+ d: "M24 42L15 29H33L24 42Z",
2206
+ fill: props.colors[1],
2207
+ stroke: props.colors[0],
2208
+ strokeWidth: props.strokeWidth,
2209
+ strokeLinejoin: props.strokeLinejoin
2210
+ }), /*#__PURE__*/ react.default.createElement("path", {
2211
+ d: "M24 6L15 19H33L24 6Z",
2212
+ fill: props.colors[1],
2213
+ stroke: props.colors[0],
2214
+ strokeWidth: props.strokeWidth,
2215
+ strokeLinejoin: props.strokeLinejoin
2216
+ }));
2217
+ });
2218
+ //#endregion
2219
+ //#region node_modules/@icon-park/react/es/icons/Success.js
2220
+ var Success_default = IconWrapper("success", true, function(props) {
2221
+ return /*#__PURE__*/ react.default.createElement("svg", {
2222
+ width: props.size,
2223
+ height: props.size,
2224
+ viewBox: "0 0 48 48",
2225
+ fill: "none"
2226
+ }, /*#__PURE__*/ react.default.createElement("path", {
2227
+ d: "M24 4L29.2533 7.83204L35.7557 7.81966L37.7533 14.0077L43.0211 17.8197L41 24L43.0211 30.1803L37.7533 33.9923L35.7557 40.1803L29.2533 40.168L24 44L18.7467 40.168L12.2443 40.1803L10.2467 33.9923L4.97887 30.1803L7 24L4.97887 17.8197L10.2467 14.0077L12.2443 7.81966L18.7467 7.83204L24 4Z",
2228
+ fill: props.colors[1],
2229
+ stroke: props.colors[0],
2230
+ strokeWidth: props.strokeWidth,
2231
+ strokeLinecap: props.strokeLinecap,
2232
+ strokeLinejoin: props.strokeLinejoin
2233
+ }), /*#__PURE__*/ react.default.createElement("path", {
2234
+ d: "M17 24L22 29L32 19",
2235
+ stroke: props.colors[2],
2236
+ strokeWidth: props.strokeWidth,
2237
+ strokeLinecap: props.strokeLinecap,
2238
+ strokeLinejoin: props.strokeLinejoin
2239
+ }));
2240
+ });
2241
+ //#endregion
2242
+ //#region node_modules/@icon-park/react/es/icons/Terminal.js
2243
+ var Terminal_default = IconWrapper("terminal", true, function(props) {
2244
+ return /*#__PURE__*/ react.default.createElement("svg", {
2245
+ width: props.size,
2246
+ height: props.size,
2247
+ viewBox: "0 0 48 48",
2248
+ fill: "none"
2249
+ }, /*#__PURE__*/ react.default.createElement("rect", {
2250
+ x: "4",
2251
+ y: "8",
2252
+ width: "40",
2253
+ height: "32",
2254
+ rx: "2",
2255
+ fill: props.colors[1],
2256
+ stroke: props.colors[0],
2257
+ strokeWidth: props.strokeWidth,
2258
+ strokeLinejoin: props.strokeLinejoin
2259
+ }), /*#__PURE__*/ react.default.createElement("path", {
2260
+ d: "M12 18L19 24L12 30",
2261
+ stroke: props.colors[2],
2262
+ strokeWidth: props.strokeWidth,
2263
+ strokeLinecap: props.strokeLinecap,
2264
+ strokeLinejoin: props.strokeLinejoin
2265
+ }), /*#__PURE__*/ react.default.createElement("path", {
2266
+ d: "M23 32H36",
2267
+ stroke: props.colors[2],
2268
+ strokeWidth: props.strokeWidth,
2269
+ strokeLinecap: props.strokeLinecap,
2270
+ strokeLinejoin: props.strokeLinejoin
2271
+ }));
2272
+ });
2273
+ //#endregion
2274
+ //#region node_modules/@icon-park/react/es/icons/Undo.js
2275
+ var Undo_default = IconWrapper("undo", true, function(props) {
2276
+ return /*#__PURE__*/ react.default.createElement("svg", {
2277
+ width: props.size,
2278
+ height: props.size,
2279
+ viewBox: "0 0 48 48",
2280
+ fill: "none"
2281
+ }, /*#__PURE__*/ react.default.createElement("path", {
2282
+ d: "M11.2721 36.7279C14.5294 39.9853 19.0294 42 24 42C33.9411 42 42 33.9411 42 24C42 14.0589 33.9411 6 24 6C19.0294 6 14.5294 8.01472 11.2721 11.2721C9.61407 12.9301 6 17 6 17",
2283
+ stroke: props.colors[0],
2284
+ strokeWidth: props.strokeWidth,
2285
+ strokeLinecap: props.strokeLinecap,
2286
+ strokeLinejoin: props.strokeLinejoin
2287
+ }), /*#__PURE__*/ react.default.createElement("path", {
2288
+ d: "M6 9V17H14",
2289
+ stroke: props.colors[0],
2290
+ strokeWidth: props.strokeWidth,
2291
+ strokeLinecap: props.strokeLinecap,
2292
+ strokeLinejoin: props.strokeLinejoin
2293
+ }));
2294
+ });
2295
+ //#endregion
2296
+ //#region node_modules/@icon-park/react/es/icons/Unlock.js
2297
+ var Unlock_default = IconWrapper("unlock", true, function(props) {
2298
+ return /*#__PURE__*/ react.default.createElement("svg", {
2299
+ width: props.size,
2300
+ height: props.size,
2301
+ viewBox: "0 0 48 48",
2302
+ fill: "none"
2303
+ }, /*#__PURE__*/ react.default.createElement("rect", {
2304
+ x: "7",
2305
+ y: "22.0476",
2306
+ width: "34",
2307
+ height: "22",
2308
+ rx: "2",
2309
+ fill: props.colors[1],
2310
+ stroke: props.colors[0],
2311
+ strokeWidth: props.strokeWidth,
2312
+ strokeLinejoin: props.strokeLinejoin
2313
+ }), /*#__PURE__*/ react.default.createElement("path", {
2314
+ d: "M14 22V14.0047C13.9948 8.87022 17.9227 4.56718 23.0859 4.05117C28.249 3.53516 32.9673 6.97408 34 12.0059",
2315
+ stroke: props.colors[0],
2316
+ strokeWidth: props.strokeWidth,
2317
+ strokeLinecap: props.strokeLinecap,
2318
+ strokeLinejoin: props.strokeLinejoin
2319
+ }), /*#__PURE__*/ react.default.createElement("path", {
2320
+ d: "M24 30V36",
2321
+ stroke: props.colors[2],
2322
+ strokeWidth: props.strokeWidth,
2323
+ strokeLinecap: props.strokeLinecap,
2324
+ strokeLinejoin: props.strokeLinejoin
2325
+ }));
2326
+ });
2327
+ //#endregion
2328
+ //#region node_modules/@icon-park/react/es/icons/Up.js
2329
+ var Up_default = IconWrapper("up", false, function(props) {
2330
+ return /*#__PURE__*/ react.default.createElement("svg", {
2331
+ width: props.size,
2332
+ height: props.size,
2333
+ viewBox: "0 0 48 48",
2334
+ fill: "none"
2335
+ }, /*#__PURE__*/ react.default.createElement("path", {
2336
+ d: "M13 30L25 18L37 30",
2337
+ stroke: props.colors[0],
2338
+ strokeWidth: props.strokeWidth,
2339
+ strokeLinecap: props.strokeLinecap,
2340
+ strokeLinejoin: props.strokeLinejoin
2341
+ }));
2342
+ });
2343
+ //#endregion
2344
+ //#region node_modules/@icon-park/react/es/icons/Upload.js
2345
+ var Upload_default = IconWrapper("upload", false, function(props) {
2346
+ return /*#__PURE__*/ react.default.createElement("svg", {
2347
+ width: props.size,
2348
+ height: props.size,
2349
+ viewBox: "0 0 48 48",
2350
+ fill: "none"
2351
+ }, /*#__PURE__*/ react.default.createElement("mask", {
2352
+ id: props.id + "7070702c",
2353
+ maskUnits: "userSpaceOnUse",
2354
+ x: "0",
2355
+ y: "0",
2356
+ width: "48",
2357
+ height: "48",
2358
+ style: { maskType: "alpha" }
2359
+ }, /*#__PURE__*/ react.default.createElement("path", {
2360
+ d: "M48 0H0V48H48V0Z",
2361
+ fill: props.colors[2]
2362
+ })), /*#__PURE__*/ react.default.createElement("g", { mask: "url(#" + props.id + "7070702c)" }, /*#__PURE__*/ react.default.createElement("path", {
2363
+ d: "M6 24.0083V42H42V24",
2364
+ stroke: props.colors[0],
2365
+ strokeWidth: props.strokeWidth,
2366
+ strokeLinecap: props.strokeLinecap,
2367
+ strokeLinejoin: props.strokeLinejoin
2368
+ }), /*#__PURE__*/ react.default.createElement("path", {
2369
+ d: "M33 15L24 6L15 15",
2370
+ stroke: props.colors[0],
2371
+ strokeWidth: props.strokeWidth,
2372
+ strokeLinecap: props.strokeLinecap,
2373
+ strokeLinejoin: props.strokeLinejoin
2374
+ }), /*#__PURE__*/ react.default.createElement("path", {
2375
+ d: "M23.9917 32V6",
2376
+ stroke: props.colors[0],
2377
+ strokeWidth: props.strokeWidth,
2378
+ strokeLinecap: props.strokeLinecap,
2379
+ strokeLinejoin: props.strokeLinejoin
2380
+ })));
2381
+ });
2382
+ //#endregion
2383
+ //#region src/ui/icons.tsx
2384
+ /**
2385
+ * The curated dshloader ICON SET.
2386
+ *
2387
+ * Sourced from `@icon-park/react` so no plugin hand-maintains SVG path data
2388
+ * again (dsh-better-sidebar's `src/client/icons.tsx` keeps 10 icons by hand
2389
+ * today; every entry here replaces one of those or a
2390
+ * `@deepseek-ai/dsh-client-ui-primitives` icon import).
2391
+ *
2392
+ * WHY A SUBSET, NOT `export *`: IconPark ships ~2000 icons. dshloader's client
2393
+ * bundle is materialised through the DSH client module table, and a runtime
2394
+ * module boundary cannot be tree-shaken — re-exporting everything would put all
2395
+ * ~2000 icons into one bundle every plugin pays for. Naming a subset keeps the
2396
+ * cost proportional (only the icons listed here are bundled), and a plugin that
2397
+ * needs an exotic glyph can still depend on `@icon-park/react` directly.
2398
+ *
2399
+ * Adding an icon: import it below and add it to the export block. That is the
2400
+ * only change needed — no SVG, no viewBox, no stroke bookkeeping.
2401
+ *
2402
+ * @module @dsh-plugin/dsh-loader/ui/icons
2403
+ */
2404
+ /**
2405
+ * The curated set, grouped by purpose. Names are intent-based (`Settings`,
2406
+ * `Warning`) rather than IconPark's raw names so a glyph can be swapped without
2407
+ * touching consumers.
2408
+ */
2409
+ const Icons = {
2410
+ ChevronUp: Up_default,
2411
+ ChevronDown: Down_default,
2412
+ ChevronLeft: Left_default,
2413
+ ChevronRight: Right_default,
2414
+ Back: Back_default,
2415
+ Expand: FullScreen_default,
2416
+ More: More_default,
2417
+ Sort: Sort_default,
2418
+ Add: Add_default,
2419
+ Edit: Edit_default,
2420
+ Write: IconWrapper("write", true, function(props) {
2421
+ return /*#__PURE__*/ react.default.createElement("svg", {
2422
+ width: props.size,
2423
+ height: props.size,
2424
+ viewBox: "0 0 48 48",
2425
+ fill: "none"
2426
+ }, /*#__PURE__*/ react.default.createElement("path", {
2427
+ d: "M5.32497 43.4996L13.81 43.4998L44.9227 12.3871L36.4374 3.90186L5.32471 35.0146L5.32497 43.4996Z",
2428
+ fill: props.colors[1],
2429
+ stroke: props.colors[0],
2430
+ strokeWidth: props.strokeWidth,
2431
+ strokeLinejoin: props.strokeLinejoin
2432
+ }), /*#__PURE__*/ react.default.createElement("path", {
2433
+ d: "M27.9521 12.3872L36.4374 20.8725",
2434
+ stroke: props.colors[0],
2435
+ strokeWidth: props.strokeWidth,
2436
+ strokeLinecap: props.strokeLinecap,
2437
+ strokeLinejoin: props.strokeLinejoin
2438
+ }));
2439
+ }),
2440
+ Delete: Delete_default,
2441
+ Copy: Copy_default,
2442
+ Save: Save_default,
2443
+ Search: Search_default,
2444
+ Refresh: Refresh_default,
2445
+ Download: Download_default,
2446
+ Upload: Upload_default,
2447
+ Undo: Undo_default,
2448
+ Redo: Redo_default,
2449
+ Play: Play_default,
2450
+ Stop: Pause_default,
2451
+ Close: Close_default,
2452
+ CloseSmall: CloseSmall_default,
2453
+ Check: Check_default,
2454
+ CheckSmall: CheckSmall_default,
2455
+ Info: Info_default,
2456
+ Warning: Attention_default,
2457
+ Error: Error_default,
2458
+ Success: Success_default,
2459
+ Loading: Loading_default,
2460
+ Help: Help_default,
2461
+ Settings: Setting_default,
2462
+ SettingsAlt: SettingTwo_default,
2463
+ Config: Config_default,
2464
+ Terminal: Terminal_default,
2465
+ Code: Code_default,
2466
+ FileCode: FileCode_default,
2467
+ Doc: FileText_default,
2468
+ Folder: Folder_default,
2469
+ FolderOpen: FolderOpen_default,
2470
+ GitBranch: Branch_default,
2471
+ Link: Link_default,
2472
+ Web: Globe_default,
2473
+ Browser: Browser_default,
2474
+ Lock: Lock_default,
2475
+ Unlock: Unlock_default,
2476
+ EyeOpen: PreviewOpen_default,
2477
+ EyeClosed: PreviewClose_default,
2478
+ Alarm: Alarm_default,
2479
+ Diamond: Diamond_default,
2480
+ Apps: AllApplication_default
2481
+ };
2482
+ /** Every curated icon name, for pickers and tests. */
2483
+ const ICON_NAMES = Object.keys(Icons);
2484
+ /**
2485
+ * Look one icon up by name. Unknown names resolve to `Help` rather than
2486
+ * throwing, so a stale name degrades to a visible placeholder.
2487
+ */
2488
+ function icon(name) {
2489
+ return Icons[name] ?? Icons.Help;
2490
+ }
2491
+ /**
2492
+ * `<Icon name="Settings" />` — the ergonomic form for data-driven icon choices
2493
+ * (menu descriptors, settings rows) where a component reference is awkward.
2494
+ */
2495
+ function Icon({ name, ...rest }) {
2496
+ const Component = icon(name);
2497
+ return react$1.createElement(Component, rest);
2498
+ }
2499
+ /** The icon defaults dshloader components render with. */
2500
+ const DSH_ICON_CONFIG = {
2501
+ ...DEFAULT_ICON_CONFIGS,
2502
+ size: G.fontSize + 3,
2503
+ strokeWidth: 3,
2504
+ theme: "outline",
2505
+ colors: {
2506
+ ...DEFAULT_ICON_CONFIGS.colors,
2507
+ outline: {
2508
+ fill: "currentColor",
2509
+ background: "transparent"
2510
+ }
2511
+ }
2512
+ };
2513
+ /**
2514
+ * Wrap a subtree so every dshloader icon inside inherits the DSH defaults
2515
+ * (outline theme, `currentColor` fill, matching size). Plugins that render
2516
+ * dshloader components inside their own React tree should mount this once near
2517
+ * the root; the components in `./components.js` do not require it, but they look
2518
+ * consistent with the rest of DSH when it is present.
2519
+ */
2520
+ function DshIconProvider({ children }) {
2521
+ return react$1.createElement(IconProvider, { value: DSH_ICON_CONFIG }, children);
2522
+ }
2523
+ //#endregion
2524
+ //#region src/ui/menu.tsx
2525
+ /** Whether the platform primitive is already known to be missing. */
2526
+ let platformMissing = false;
2527
+ /**
2528
+ * The stable menu surface for dshloader consumers.
2529
+ *
2530
+ * Forwards every prop verbatim to the platform primitive — this wrapper's job
2531
+ * is ISOLATION (one import site, hand-owned types), not behaviour change. When
2532
+ * the platform evolves, adaptation code goes here and consumers stay put.
2533
+ */
2534
+ function DshMenu(props) {
2535
+ if (platformMissing) return null;
2536
+ try {
2537
+ return (0, _deepseek_ai_dsh_client_ui_primitives.Menu)(props);
2538
+ } catch (error) {
2539
+ platformMissing = true;
2540
+ console.warn(`[dshloader] DshMenu: the platform menu primitive failed (${error instanceof Error ? error.message : String(error)}); rendering nothing. Update src/ui/menu.tsx to adapt to the new platform contract.`);
2541
+ return null;
2542
+ }
2543
+ }
2544
+ //#endregion
2545
+ //#region src/ui/components.tsx
2546
+ /**
2547
+ * The dshloader BASE CONTROLS.
2548
+ *
2549
+ * A small, deliberately unopinionated control set so every plugin in this family
2550
+ * renders the same design language instead of each hand-rolling inline styles
2551
+ * (dsh-network-settings alone carries ~40 inline style objects today, and
2552
+ * dsh-auxiliary / dsh-code-review each maintain their own button and input
2553
+ * looks).
2554
+ *
2555
+ * Design rules:
2556
+ * - Styling is ONE injected stylesheet with `dshl-` prefixed classes, tagged
2557
+ * with the DSH `data-plugin` / `data-plugin-css` ownership attributes so HMR
2558
+ * can reclaim it. No CSS Modules, so consumers need no build-time CSS setup.
2559
+ * - Every colour is a DSH token with a fallback (see `./style.js`), so controls
2560
+ * follow the shell's theme, including dark mode, with no JS theme plumbing.
2561
+ * - Icons come from the curated set and inherit `currentColor`.
2562
+ * - Every control forwards native props and `className`, so a plugin can always
2563
+ * escape the defaults without forking the component.
2564
+ *
2565
+ * @module @dsh-plugin/dsh-loader/ui/components
2566
+ */
2567
+ /** Owner id used on the injected `<style>` tag. */
2568
+ const OWNER = "@dsh-plugin/dsh-loader";
2569
+ /** The single stylesheet backing every control. */
2570
+ const CSS = `
2571
+ .${CX}-row{display:flex;align-items:center;gap:${G.gap}px}
2572
+ .${CX}-col{display:flex;flex-direction:column;gap:${G.gap}px}
2573
+ .${CX}-btn{
2574
+ display:inline-flex;align-items:center;justify-content:center;gap:6px;
2575
+ height:${G.buttonHeight}px;padding:0 ${G.padXButton}px;
2576
+ font-size:14px;font-family:inherit;line-height:22px;
2577
+ border-radius:${G.radiusPill}px;border:none;
2578
+ background:${T.bgBase};color:${T.labelPrimary};
2579
+ cursor:pointer;box-sizing:border-box;white-space:nowrap;
2580
+ transition:background .12s ease,border-color .12s ease,opacity .12s ease;
2581
+ }
2582
+ .${CX}-btn:hover:not(:disabled){background:${T.bgHover}}
2583
+ .${CX}-btn:disabled{opacity:.5;cursor:not-allowed}
2584
+ .${CX}-btn--primary{
2585
+ background:${T.buttonPrimaryFill};
2586
+ color:${T.buttonPrimaryForeground};
2587
+ }
2588
+ .${CX}-btn--primary:hover:not(:disabled){filter:brightness(1.07);background:${T.buttonPrimaryFill}}
2589
+ .${CX}-btn--ghost{background:transparent;border-color:transparent;color:${T.labelSecondary}}
2590
+ .${CX}-btn--ghost:hover:not(:disabled){background:${T.bgHover};color:${T.labelPrimary}}
2591
+ .${CX}-btn--danger{background:transparent;border:1px solid ${T.danger};color:${T.danger};border-radius:${G.radius}px}
2592
+ .${CX}-btn--sm{height:${G.controlHeightSm}px;padding:0 ${G.padX + 2}px;font-size:${G.fontSizeSm}px;border-radius:${G.radius}px}
2593
+ .${CX}-iconbtn{
2594
+ display:inline-flex;align-items:center;justify-content:center;
2595
+ width:${G.controlHeight}px;height:${G.controlHeight}px;padding:0;
2596
+ border-radius:${G.radius}px;border:1px solid transparent;
2597
+ background:transparent;color:${T.labelSecondary};cursor:pointer;
2598
+ }
2599
+ .${CX}-iconbtn:hover:not(:disabled){background:${T.bgHover};color:${T.labelPrimary}}
2600
+ .${CX}-iconbtn:disabled{opacity:.5;cursor:not-allowed}
2601
+ .${CX}-input,.${CX}-textarea,.${CX}-select{
2602
+ width:100%;box-sizing:border-box;font-family:inherit;font-size:${G.fontSize}px;
2603
+ color:${T.labelPrimary};background:${T.bgLayer1};
2604
+ border:1px solid ${T.border};border-radius:${G.radius}px;
2605
+ padding:0 ${G.padX}px;height:${G.controlHeight}px;
2606
+ transition:border-color .12s ease;
2607
+ }
2608
+ .${CX}-textarea{height:auto;min-height:72px;padding:7px ${G.padX}px;line-height:1.5;resize:vertical}
2609
+ .${CX}-input:focus,.${CX}-textarea:focus,.${CX}-select:focus{outline:none;border-color:${T.accent}}
2610
+ .${CX}-input:disabled,.${CX}-textarea:disabled,.${CX}-select:disabled{opacity:.55;cursor:not-allowed}
2611
+ .${CX}-input--mono,.${CX}-textarea--mono{font-family:${T.fontCode}}
2612
+ .${CX}-input--invalid,.${CX}-textarea--invalid{border-color:${T.danger}}
2613
+ .${CX}-select{appearance:none;padding-right:26px;cursor:pointer;background-color:${T.bgBase}}
2614
+ .${CX}-selectwrap{position:relative;display:block;width:100%}
2615
+ .${CX}-selectwrap>.${CX}-caret{
2616
+ position:absolute;right:8px;top:50%;transform:translateY(-50%);
2617
+ pointer-events:none;color:${T.labelTertiary};display:inline-flex;
2618
+ }
2619
+ .${CX}-mselect{position:relative;width:100%}
2620
+ .${CX}-mselect__trigger{
2621
+ display:flex;align-items:center;justify-content:space-between;gap:8px;
2622
+ width:100%;box-sizing:border-box;min-height:36px;padding:7px 10px;
2623
+ font-family:inherit;font-size:14px;line-height:20px;text-align:left;
2624
+ color:${T.labelPrimary};background:${T.bgLayer1};
2625
+ border:1px solid ${T.border};border-radius:8px;cursor:pointer;appearance:none;
2626
+ }
2627
+ .${CX}-mselect__trigger:disabled{opacity:.45;cursor:not-allowed}
2628
+ .${CX}-mselect__text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
2629
+ .${CX}-mselect__text--ph{color:${T.labelTertiary}}
2630
+ .${CX}-mselect__caret{display:inline-flex;align-items:center;flex:none;color:${T.labelTertiary}}
2631
+ .${CX}-check{display:inline-flex;align-items:center;gap:7px;cursor:pointer;font-size:13px;color:${T.labelPrimary};line-height:20px}
2632
+ .${CX}-check input{
2633
+ position:relative;margin:0;width:16px;height:16px;flex:none;
2634
+ appearance:auto;-webkit-appearance:checkbox;cursor:pointer;
2635
+ accent-color:${T.accent};
2636
+ }
2637
+ .${CX}-check input[disabled]{cursor:not-allowed}
2638
+ .${CX}-check--disabled{opacity:.55;cursor:not-allowed}
2639
+ .${CX}-switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:${G.fontSize}px;color:${T.labelPrimary}}
2640
+ .${CX}-switch input{position:absolute;opacity:0;width:0;height:0}
2641
+ .${CX}-switch__track{
2642
+ position:relative;flex:none;width:34px;height:20px;border-radius:${G.radiusPill}px;
2643
+ background:${T.border};transition:background .16s ease;
2644
+ }
2645
+ .${CX}-switch__knob{
2646
+ position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;
2647
+ background:${T.bgBase};box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform .16s ease;
2648
+ }
2649
+ .${CX}-switch input:checked+.${CX}-switch__track{background:${T.accent}}
2650
+ .${CX}-switch input:checked+.${CX}-switch__track>.${CX}-switch__knob{transform:translateX(14px)}
2651
+ .${CX}-switch input:focus-visible+.${CX}-switch__track{box-shadow:0 0 0 2px ${T.accent}55}
2652
+ .${CX}-switch--disabled{opacity:.55;cursor:not-allowed}
2653
+ .${CX}-field{display:flex;flex-direction:column;gap:6px}
2654
+ .${CX}-field__label{font-size:12px;font-weight:500;color:${T.labelSecondary};line-height:18px}
2655
+ .${CX}-field__desc{font-size:${G.fontSizeSm}px;color:${T.labelTertiary};line-height:18px}
2656
+ .${CX}-field__error{font-size:${G.fontSizeSm}px;color:${T.danger}}
2657
+ .${CX}-card{
2658
+ display:flex;flex-direction:column;gap:10px;
2659
+ padding:16px;border:1px solid ${T.border};border-radius:${G.cardRadius}px;
2660
+ background:transparent;box-sizing:border-box;
2661
+ }
2662
+ .${CX}-card__title{margin:0;font-size:15px;font-weight:500;line-height:22px;color:${T.labelPrimary}}
2663
+ .${CX}-spin{display:inline-flex;animation:${CX}-spin 1s linear infinite}
2664
+ @keyframes ${CX}-spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}
2665
+ @media (prefers-reduced-motion:reduce){
2666
+ .${CX}-spin{animation:none}
2667
+ .${CX}-btn,.${CX}-input,.${CX}-switch__track,.${CX}-switch__knob,.${CX}-check__box{transition:none}
2668
+ }
2669
+ `;
2670
+ /** Inject the control stylesheet once (idempotent, safe to call from any component). */
2671
+ function ensureStyles() {
2672
+ injectStyle(OWNER, "ui/controls.css", CSS);
2673
+ }
2674
+ /** Call `ensureStyles` on first render of any control. */
2675
+ function useStyles() {
2676
+ ensureStyles();
2677
+ }
2678
+ /** A button in the DSH design language. */
2679
+ const Button = react$1.forwardRef(function Button({ variant = "default", small, icon, loading, className, children, disabled, ...rest }, ref) {
2680
+ useStyles();
2681
+ return react$1.createElement("button", {
2682
+ ref,
2683
+ type: rest.type ?? "button",
2684
+ className: cx(`${CX}-btn`, variant !== "default" && `dshl-btn--${variant}`, small && `dshl-btn--sm`, className),
2685
+ disabled: disabled === true || loading === true,
2686
+ ...rest
2687
+ }, loading === true ? react$1.createElement("span", {
2688
+ className: `${CX}-spin`,
2689
+ key: "spin"
2690
+ }, react$1.createElement(Icon, { name: "Loading" })) : icon !== void 0 ? react$1.createElement(Icon, {
2691
+ name: icon,
2692
+ key: "icon"
2693
+ }) : null, children);
2694
+ });
2695
+ /** A square icon-only button. `label` becomes its accessible name. */
2696
+ const IconButton = react$1.forwardRef(function IconButton({ icon, label, className, ...rest }, ref) {
2697
+ useStyles();
2698
+ return react$1.createElement("button", {
2699
+ ref,
2700
+ type: rest.type ?? "button",
2701
+ className: cx(`${CX}-iconbtn`, className),
2702
+ "aria-label": label,
2703
+ title: rest.title ?? label,
2704
+ ...rest
2705
+ }, react$1.createElement(Icon, { name: icon }));
2706
+ });
2707
+ /** A single-line text input. */
2708
+ const TextInput = react$1.forwardRef(function TextInput({ mono, invalid, className, ...rest }, ref) {
2709
+ useStyles();
2710
+ return react$1.createElement("input", {
2711
+ ref,
2712
+ type: rest.type ?? "text",
2713
+ className: cx(`${CX}-input`, mono && `dshl-input--mono`, invalid && `dshl-input--invalid`, className),
2714
+ "aria-invalid": invalid === true ? true : void 0,
2715
+ ...rest
2716
+ });
2717
+ });
2718
+ /** A multi-line text area. */
2719
+ const Textarea = react$1.forwardRef(function Textarea({ mono, invalid, className, ...rest }, ref) {
2720
+ useStyles();
2721
+ return react$1.createElement("textarea", {
2722
+ ref,
2723
+ className: cx(`${CX}-textarea`, mono && `dshl-textarea--mono`, invalid && `dshl-textarea--invalid`, className),
2724
+ "aria-invalid": invalid === true ? true : void 0,
2725
+ ...rest
2726
+ });
2727
+ });
2728
+ /**
2729
+ * A dropdown built on the native `<select>`.
2730
+ *
2731
+ * Native on purpose: it inherits the platform's keyboard handling, mobile
2732
+ * pickers, and accessibility for free. Plugins needing DSH's rich popup should
2733
+ * use `Menu` from `@dsh-plugin/dsh-loader/ui-primitives` instead.
2734
+ */
2735
+ const Select = react$1.forwardRef(function Select({ options, placeholder, className, value, ...rest }, ref) {
2736
+ useStyles();
2737
+ return react$1.createElement("span", { className: `${CX}-selectwrap` }, react$1.createElement("select", {
2738
+ ref,
2739
+ className: cx(`${CX}-select`, className),
2740
+ value,
2741
+ ...rest
2742
+ }, placeholder !== void 0 ? react$1.createElement("option", {
2743
+ key: "__ph",
2744
+ value: "",
2745
+ disabled: true
2746
+ }, placeholder) : null, options.map((option) => react$1.createElement("option", {
2747
+ key: option.value,
2748
+ value: option.value,
2749
+ disabled: option.disabled
2750
+ }, option.label))), react$1.createElement("span", { className: `${CX}-caret` }, react$1.createElement(Icon, { name: "ChevronDown" })));
2751
+ });
2752
+ /** Height budget used when deciding whether the popup opens above the trigger. */
2753
+ const MENU_SELECT_MAX_HEIGHT = 264;
2754
+ /**
2755
+ * A dropdown whose trigger and popup match the shell's own pickers (the
2756
+ * dsh-auxiliary model picker look): a bordered layer-1 trigger button plus the
2757
+ * platform menu popup via {@link DshMenu}.
2758
+ *
2759
+ * Prefer this over {@link Select} on settings pages: the native `<select>`
2760
+ * popup is OS-styled and cannot follow the shell theme, which is exactly the
2761
+ * visual drift this component removes. `Select` remains for dense/inline forms
2762
+ * where the native control's compactness matters.
2763
+ */
2764
+ function MenuSelect({ options, value, placeholder, disabled, onChange, id, label, className }) {
2765
+ useStyles();
2766
+ const [open, setOpen] = react$1.useState(false);
2767
+ const [side, setSide] = react$1.useState("bottom");
2768
+ const triggerRef = react$1.useRef(null);
2769
+ const updateSide = react$1.useCallback(() => {
2770
+ const trigger = triggerRef.current;
2771
+ if (trigger === null) return;
2772
+ const rect = trigger.getBoundingClientRect();
2773
+ const below = window.innerHeight - rect.bottom - 12;
2774
+ const above = rect.top - 12;
2775
+ setSide(below >= Math.min(MENU_SELECT_MAX_HEIGHT, above) ? "bottom" : "top");
2776
+ }, []);
2777
+ react$1.useEffect(() => {
2778
+ if (!open) return void 0;
2779
+ updateSide();
2780
+ window.addEventListener("scroll", updateSide, true);
2781
+ window.addEventListener("resize", updateSide);
2782
+ return () => {
2783
+ window.removeEventListener("scroll", updateSide, true);
2784
+ window.removeEventListener("resize", updateSide);
2785
+ };
2786
+ }, [open, updateSide]);
2787
+ const selected = options.find((option) => option.value === value);
2788
+ const text = selected !== void 0 ? selected.label : placeholder ?? "";
2789
+ const items = react$1.useMemo(() => options.map((option) => ({
2790
+ id: option.value,
2791
+ label: option.label,
2792
+ disabled: option.disabled
2793
+ })), [options]);
2794
+ return react$1.createElement("div", { className: cx(`${CX}-mselect`, className) }, react$1.createElement(DshMenu, {
2795
+ open,
2796
+ anchor: react$1.createElement("button", {
2797
+ ref: triggerRef,
2798
+ type: "button",
2799
+ id,
2800
+ disabled: disabled === true,
2801
+ className: `${CX}-mselect__trigger`,
2802
+ "aria-label": label !== void 0 ? `${label}: ${text}` : text,
2803
+ "aria-haspopup": "menu",
2804
+ "aria-expanded": open,
2805
+ title: text,
2806
+ onClick: () => setOpen((previous) => !previous)
2807
+ }, react$1.createElement("span", { className: cx(`${CX}-mselect__text`, selected === void 0 && `dshl-mselect__text--ph`) }, text), react$1.createElement("span", {
2808
+ className: `${CX}-mselect__caret`,
2809
+ "aria-hidden": true
2810
+ }, react$1.createElement(Icon, {
2811
+ name: "ChevronDown",
2812
+ size: 14
2813
+ }))),
2814
+ items,
2815
+ selectedId: value,
2816
+ onSelect: (chosen) => {
2817
+ onChange?.(chosen);
2818
+ setOpen(false);
2819
+ },
2820
+ onClose: () => setOpen(false),
2821
+ align: "start",
2822
+ side,
2823
+ dense: true
2824
+ }));
2825
+ }
2826
+ /** A checkbox with an optional label. Native input styled via `accent-color`,
2827
+ * matching the shell's own settings pages. */
2828
+ const Checkbox = react$1.forwardRef(function Checkbox({ label, className, disabled, ...rest }, ref) {
2829
+ useStyles();
2830
+ return react$1.createElement("label", { className: cx(`${CX}-check`, disabled === true && `dshl-check--disabled`, className) }, react$1.createElement("input", {
2831
+ ref,
2832
+ type: "checkbox",
2833
+ disabled,
2834
+ ...rest
2835
+ }), label === void 0 ? null : react$1.createElement("span", null, label));
2836
+ });
2837
+ /** A toggle switch — use for "applies immediately" settings. */
2838
+ const Switch = react$1.forwardRef(function Switch({ label, className, disabled, ...rest }, ref) {
2839
+ useStyles();
2840
+ return react$1.createElement("label", { className: cx(`${CX}-switch`, disabled === true && `dshl-switch--disabled`, className) }, react$1.createElement("input", {
2841
+ ref,
2842
+ type: "checkbox",
2843
+ role: "switch",
2844
+ disabled,
2845
+ ...rest
2846
+ }), react$1.createElement("span", {
2847
+ className: `${CX}-switch__track`,
2848
+ "aria-hidden": true
2849
+ }, react$1.createElement("span", { className: `${CX}-switch__knob` })), label === void 0 ? null : react$1.createElement("span", null, label));
2850
+ });
2851
+ /** Label + control + description/error, the standard settings row. */
2852
+ function Field({ label, description, error, htmlFor, children, className }) {
2853
+ useStyles();
2854
+ return react$1.createElement("div", { className: cx(`${CX}-field`, className) }, label === void 0 ? null : react$1.createElement("label", {
2855
+ className: `${CX}-field__label`,
2856
+ htmlFor
2857
+ }, label), children, description === void 0 ? null : react$1.createElement("span", { className: `${CX}-field__desc` }, description), error === void 0 || error === null || error === false ? null : react$1.createElement("span", {
2858
+ className: `${CX}-field__error`,
2859
+ role: "alert"
2860
+ }, error));
2861
+ }
2862
+ /** A bordered section container — the settings-page card look. */
2863
+ function Card({ title, children, className }) {
2864
+ useStyles();
2865
+ return react$1.createElement("section", { className: cx(`${CX}-card`, className) }, title === void 0 ? null : react$1.createElement("h3", { className: `${CX}-card__title` }, title), children);
2866
+ }
2867
+ /** A horizontal flex row with the standard gap. */
2868
+ function Row({ children, className }) {
2869
+ useStyles();
2870
+ return react$1.createElement("div", { className: cx(`${CX}-row`, className) }, children);
2871
+ }
2872
+ /** A vertical flex column with the standard gap. */
2873
+ function Col({ children, className }) {
2874
+ useStyles();
2875
+ return react$1.createElement("div", { className: cx(`${CX}-col`, className) }, children);
2876
+ }
2877
+ /** An inline spinner. */
2878
+ function Spinner({ size }) {
2879
+ useStyles();
2880
+ return react$1.createElement("span", {
2881
+ className: `${CX}-spin`,
2882
+ role: "status",
2883
+ "aria-label": "loading"
2884
+ }, react$1.createElement(Icon, {
2885
+ name: "Loading",
2886
+ size
2887
+ }));
2888
+ }
2889
+ //#endregion
2890
+ //#region src/ui/index.ts
2891
+ /**
2892
+ * The dshloader UI surface: virtual slots, the curated icon set, and the base
2893
+ * controls, wrapped as one `ui` facade.
2894
+ *
2895
+ * Consumers reach this at runtime through `@dsh-plugin/dsh-loader/client`, which
2896
+ * the DSH client module table resolves by stripping the `/client` suffix to
2897
+ * dshloader's registered bundle id — so no alias and no load-order coordination
2898
+ * is needed (see docs/ui.md).
2899
+ *
2900
+ * @module @dsh-plugin/dsh-loader/ui
2901
+ */
2902
+ /**
2903
+ * Build the UI facade and seed it with the dsh 1.x anchor table.
2904
+ *
2905
+ * @param options - forwarded to {@link createUiAPI} (observe root, warn sink).
2906
+ */
2907
+ function createUi(options = {}) {
2908
+ const api = createUiAPI(options);
2909
+ for (const [name, spec] of Object.entries(BUILTIN_ANCHORS)) api.defineAnchor(name, spec);
2910
+ return {
2911
+ ...api,
2912
+ mount: api.mount.bind(api),
2913
+ mountReact: api.mountReact.bind(api),
2914
+ defineAnchor: api.defineAnchor.bind(api),
2915
+ anchors: api.anchors.bind(api),
2916
+ hosts: api.hosts.bind(api),
2917
+ onDomSettled: api.onDomSettled.bind(api),
2918
+ diagnose: api.diagnose.bind(api),
2919
+ destroy: api.destroy.bind(api),
2920
+ layoutFrame() {
2921
+ const [host] = api.hosts("layout.frame");
2922
+ return host === void 0 ? void 0 : readLayoutFrame(host);
2923
+ }
2924
+ };
2925
+ }
2926
+ //#endregion
2927
+ //#region src/client-ui.tsx
2928
+ /**
2929
+ * dshloader BROWSER BUNDLE ENTRY.
2930
+ *
2931
+ * Composes the two browser halves of dshloader:
2932
+ *
2933
+ * 1. the compatibility infrastructure in `./client.ts` — `window.__dshLoader__`,
2934
+ * the `__ModuleLoader__.load` wrapper that applies package aliases, the
2935
+ * module-alias factories, and the optional settings fetch interceptor;
2936
+ * 2. the UI surface in `./ui/` — the virtual slot engine, the curated icon set,
2937
+ * and the base controls.
2938
+ *
2939
+ * WHY A SEPARATE ENTRY FROM `client.ts`: `client.ts` must keep compiling in the
2940
+ * NODE program (`tsconfig.build.json` → `dist/client.js`), because the client
2941
+ * unit tests import it from there. The UI modules need `lib.dom` and JSX, which
2942
+ * that program does not have. Keeping the entry separate lets each half compile
2943
+ * under the program that suits it while both land in one bundle.
2944
+ *
2945
+ * Consumers import from `@dsh-plugin/dsh-loader/client`, marked external in
2946
+ * their bundler: the DSH client module table strips the `/client` suffix to
2947
+ * dshloader's registered bundle id and materialises this module recursively, so
2948
+ * no package alias and no load-order coordination is required.
2949
+ *
2950
+ * @module @dsh-plugin/dsh-loader/client
2951
+ */
2952
+ /** cordis plugin name (matches the npm package name and the bundle id). */
263
2953
  const name = "@dsh-plugin/dsh-loader";
2954
+ /** dshloader consumes no cordis service; it only provides. */
264
2955
  const inject = [];
2956
+ /** The live UI facade, once `apply` has run. */
2957
+ let ui;
2958
+ /**
2959
+ * The UI facade for callers that reach dshloader through the module table rather
2960
+ * than `window.__dshLoader__`.
2961
+ *
2962
+ * @returns the facade, or `undefined` before the client plugin has applied.
2963
+ */
2964
+ function getUi() {
2965
+ return ui;
2966
+ }
2967
+ /** The browser `window`, read off `globalThis` so no DOM lib is assumed here. */
2968
+ function ambientWindow() {
2969
+ const found = globalThis.window;
2970
+ return typeof found === "object" && found !== null ? found : void 0;
2971
+ }
2972
+ /**
2973
+ * The cordis client service name dshloader publishes its UI facade under.
2974
+ *
2975
+ * Consumers should declare `inject: ['dshLoaderUi']` and read `ctx.dshLoaderUi`:
2976
+ * cordis then activates them only after dshloader's client half has applied,
2977
+ * which is the only ordering guarantee available on the browser side.
2978
+ * `dsh.client.immediately` guarantees the bundle's factory is REGISTERED early,
2979
+ * not that its `apply` has run — so a plugin that reads
2980
+ * `window.__dshLoader__.ui` without injecting can observe `undefined`.
2981
+ */
2982
+ const UI_SERVICE = "dshLoaderUi";
2983
+ /**
2984
+ * cordis client-plugin entry.
2985
+ *
2986
+ * Mounts the infrastructure first (so the `__ModuleLoader__` wrapper is in place
2987
+ * before any sibling bundle materialises), then the UI facade, then publishes it
2988
+ * both as the `dshLoaderUi` cordis service (ordered access) and on
2989
+ * `window.__dshLoader__.ui` (ad-hoc access from non-cordis code).
2990
+ */
265
2991
  function apply(ctx) {
266
- if (typeof window !== "undefined") installClient({
267
- window,
2992
+ const win = ambientWindow();
2993
+ if (win === void 0) return;
2994
+ const api = installClient({
2995
+ window: win,
268
2996
  clientCtx: ctx
269
2997
  });
2998
+ ui = createUi();
2999
+ if (api !== void 0) api.ui = ui;
3000
+ else if (win.__dshLoader__ !== void 0) win.__dshLoader__.ui = ui;
3001
+ ctx.provide?.(UI_SERVICE, ui);
3002
+ ctx.effect?.(() => () => {
3003
+ ui?.destroy();
3004
+ ui = void 0;
3005
+ });
270
3006
  }
271
3007
  //#endregion
3008
+ exports.ANCHOR_NAMES = ANCHOR_NAMES;
3009
+ exports.BUILTIN_ANCHORS = BUILTIN_ANCHORS;
3010
+ exports.Button = Button;
3011
+ exports.CX = CX;
3012
+ exports.Card = Card;
3013
+ exports.Checkbox = Checkbox;
3014
+ exports.Col = Col;
3015
+ exports.DSH_ICON_CONFIG = DSH_ICON_CONFIG;
3016
+ exports.DshIconProvider = DshIconProvider;
3017
+ exports.DshMenu = DshMenu;
3018
+ exports.Field = Field;
3019
+ exports.G = G;
3020
+ exports.ICON_NAMES = ICON_NAMES;
3021
+ exports.Icon = Icon;
3022
+ exports.IconButton = IconButton;
3023
+ exports.IconProvider = IconProvider;
3024
+ exports.Icons = Icons;
3025
+ exports.MenuSelect = MenuSelect;
272
3026
  exports.ModuleNotFoundError = ModuleNotFoundError;
3027
+ exports.Row = Row;
3028
+ exports.Select = Select;
3029
+ exports.Spinner = Spinner;
3030
+ exports.Switch = Switch;
3031
+ exports.T = T;
3032
+ exports.TextInput = TextInput;
3033
+ exports.Textarea = Textarea;
3034
+ exports.UI_SERVICE = UI_SERVICE;
273
3035
  exports.apply = apply;
274
3036
  exports.createClientAPI = createClientAPI;
3037
+ exports.createUi = createUi;
3038
+ exports.createUiAPI = createUiAPI;
3039
+ exports.cx = cx;
3040
+ exports.ensureStyles = ensureStyles;
3041
+ exports.getUi = getUi;
3042
+ exports.icon = icon;
275
3043
  exports.inject = inject;
3044
+ exports.injectStyle = injectStyle;
276
3045
  exports.installClient = installClient;
277
3046
  exports.installSettingsFetchInterceptor = installSettingsFetchInterceptor;
278
3047
  exports.name = name;
3048
+ exports.readLayoutFrame = readLayoutFrame;
3049
+ exports.token = token;
279
3050
  return module.exports;
280
3051
  }
281
3052
  });