@tangle-network/sandbox-ui 0.113.3 → 0.113.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/pages.js CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  SelectValue,
24
24
  Switch,
25
25
  Textarea
26
- } from "./chunk-2XPJ2XF7.js";
26
+ } from "./chunk-ANSC5AFC.js";
27
27
  import "./chunk-RQZRXKMR.js";
28
28
  import {
29
29
  cn
@@ -493,6 +493,7 @@ import {
493
493
  // src/pages/add-ssh-key-dialog.tsx
494
494
  import * as React2 from "react";
495
495
  import { Loader2 } from "lucide-react";
496
+ import { focusField } from "@tangle-network/ui/utils";
496
497
  import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
497
498
  var NAME_INPUT_ID = "add-ssh-key-name";
498
499
  var KEY_INPUT_ID = "add-ssh-key-public-key";
@@ -585,7 +586,7 @@ function AddSshKeyDialog({
585
586
  placeholder: "My laptop",
586
587
  autoComplete: "off",
587
588
  "aria-invalid": errors.name ? true : void 0,
588
- className: "w-full rounded-md border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
589
+ className: `w-full rounded-md border bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground ${focusField}`
589
590
  }
590
591
  ),
591
592
  errors.name && /* @__PURE__ */ jsx3("p", { className: "text-xs text-destructive", children: errors.name })
@@ -610,7 +611,7 @@ function AddSshKeyDialog({
610
611
  autoComplete: "off",
611
612
  spellCheck: false,
612
613
  "aria-invalid": errors.publicKey ? true : void 0,
613
- className: "min-h-24 w-full resize-y rounded-md border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2 font-mono text-xs text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
614
+ className: `min-h-24 w-full resize-y rounded-md border bg-surface-container-low px-3 py-2 font-mono text-xs text-foreground placeholder:text-muted-foreground ${focusField}`
614
615
  }
615
616
  ),
616
617
  errors.publicKey && /* @__PURE__ */ jsx3("p", { className: "text-xs text-destructive", children: errors.publicKey })
@@ -647,6 +648,7 @@ function AddSshKeyDialog({
647
648
  }
648
649
 
649
650
  // src/pages/provisioning-wizard.tsx
651
+ import { focusRing } from "@tangle-network/ui/utils";
650
652
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
651
653
  var VALID_DRIVERS = /* @__PURE__ */ new Set([
652
654
  "docker",
@@ -913,6 +915,7 @@ function EnvVarValueInput({
913
915
  Input,
914
916
  {
915
917
  type: revealed ? "text" : "password",
918
+ "aria-label": "Environment variable value",
916
919
  value,
917
920
  onChange: (e) => onChange(e.target.value),
918
921
  autoComplete: "off",
@@ -927,7 +930,7 @@ function EnvVarValueInput({
927
930
  onClick: () => setRevealed((s) => !s),
928
931
  "aria-label": revealed ? "Hide value" : "Show value",
929
932
  "aria-pressed": revealed,
930
- className: "absolute right-2 top-1/2 -translate-y-1/2 rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
933
+ className: `absolute right-2 top-1/2 -translate-y-1/2 rounded p-1 text-muted-foreground hover:text-foreground ${focusRing}`,
931
934
  children: revealed ? /* @__PURE__ */ jsx4(EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx4(Eye, { className: "h-4 w-4" })
932
935
  }
933
936
  )
@@ -947,6 +950,7 @@ function ProvisioningWizard({
947
950
  pricingRates,
948
951
  planTiers
949
952
  }) {
953
+ const fieldIdPrefix = React3.useId();
950
954
  const cpuMax = Math.max(CPU_MIN, resourceLimits?.cpuMax ?? CPU_MAX);
951
955
  const ramMax = Math.max(RAM_MIN, resourceLimits?.ramMaxGB ?? RAM_MAX);
952
956
  const storageMax = Math.max(
@@ -1284,6 +1288,7 @@ function ProvisioningWizard({
1284
1288
  ] }),
1285
1289
  /* @__PURE__ */ jsx4("div", { className: "space-y-4", children: [
1286
1290
  {
1291
+ id: "cpu",
1287
1292
  label: "Compute Cores (CPU)",
1288
1293
  value: cpuCores,
1289
1294
  setter: setCpuCores,
@@ -1293,6 +1298,7 @@ function ProvisioningWizard({
1293
1298
  unit: "vCPU"
1294
1299
  },
1295
1300
  {
1301
+ id: "ram",
1296
1302
  label: "Memory (RAM)",
1297
1303
  value: ramGB,
1298
1304
  setter: setRamGB,
@@ -1302,6 +1308,7 @@ function ProvisioningWizard({
1302
1308
  unit: "GB"
1303
1309
  },
1304
1310
  {
1311
+ id: "storage",
1305
1312
  label: "Ephemeral Storage",
1306
1313
  value: storageGB,
1307
1314
  setter: setStorageGB,
@@ -1311,16 +1318,17 @@ function ProvisioningWizard({
1311
1318
  unit: "GB"
1312
1319
  }
1313
1320
  ].map(
1314
- ({ label, value, setter, min, max, step: s, unit }) => {
1321
+ ({ id, label, value, setter, min, max, step: s, unit }) => {
1315
1322
  const displayUnit = unit === "vCPU" ? `${value} vCPU${value === 1 ? "" : "s"}` : `${value}${unit}`;
1316
1323
  return /* @__PURE__ */ jsxs4("div", { children: [
1317
1324
  /* @__PURE__ */ jsxs4("div", { className: "flex justify-between items-end pb-1 mb-1.5", children: [
1318
- /* @__PURE__ */ jsx4("label", { className: FIELD_LABEL_CLASS, children: label }),
1325
+ /* @__PURE__ */ jsx4("label", { htmlFor: `${fieldIdPrefix}-${id}`, className: FIELD_LABEL_CLASS, children: label }),
1319
1326
  /* @__PURE__ */ jsx4("span", { className: "text-sm font-semibold text-foreground tabular-nums", children: displayUnit })
1320
1327
  ] }),
1321
1328
  /* @__PURE__ */ jsx4(
1322
1329
  "input",
1323
1330
  {
1331
+ id: `${fieldIdPrefix}-${id}`,
1324
1332
  type: "range",
1325
1333
  min,
1326
1334
  max,
@@ -1353,20 +1361,23 @@ function ProvisioningWizard({
1353
1361
  {
1354
1362
  type: "button",
1355
1363
  onClick: () => setShowAdvanced(!showAdvanced),
1356
- className: "flex items-center gap-2 text-muted-foreground hover:text-foreground transition-colors text-sm font-medium focus:outline-none",
1364
+ "aria-expanded": showAdvanced,
1365
+ "aria-controls": `${fieldIdPrefix}-advanced`,
1366
+ className: `flex items-center gap-2 text-muted-foreground hover:text-foreground transition-colors text-sm font-medium ${focusRing}`,
1357
1367
  children: [
1358
1368
  /* @__PURE__ */ jsx4(Settings, { className: "w-4 h-4" }),
1359
1369
  showAdvanced ? "Hide Advanced Options" : "Show Advanced Options"
1360
1370
  ]
1361
1371
  }
1362
1372
  ),
1363
- showAdvanced && /* @__PURE__ */ jsxs4("div", { className: "mt-4 space-y-4", children: [
1373
+ /* @__PURE__ */ jsxs4("div", { id: `${fieldIdPrefix}-advanced`, hidden: !showAdvanced, className: "mt-4 space-y-4", children: [
1364
1374
  /* @__PURE__ */ jsxs4("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
1365
1375
  /* @__PURE__ */ jsxs4("div", { children: [
1366
- /* @__PURE__ */ jsx4("label", { className: cn(FIELD_LABEL_CLASS, "mb-1.5"), children: "Workspace Name" }),
1376
+ /* @__PURE__ */ jsx4("label", { htmlFor: `${fieldIdPrefix}-name`, className: cn(FIELD_LABEL_CLASS, "mb-1.5"), children: "Workspace Name" }),
1367
1377
  /* @__PURE__ */ jsx4(
1368
1378
  Input,
1369
1379
  {
1380
+ id: `${fieldIdPrefix}-name`,
1370
1381
  type: "text",
1371
1382
  value: name,
1372
1383
  onChange: (e) => setName(e.target.value),
@@ -1377,7 +1388,7 @@ function ProvisioningWizard({
1377
1388
  )
1378
1389
  ] }),
1379
1390
  /* @__PURE__ */ jsxs4("div", { children: [
1380
- /* @__PURE__ */ jsx4("label", { className: cn(FIELD_LABEL_CLASS, "mb-1.5"), children: "Virtualization Driver" }),
1391
+ /* @__PURE__ */ jsx4("label", { htmlFor: `${fieldIdPrefix}-driver`, className: cn(FIELD_LABEL_CLASS, "mb-1.5"), children: "Virtualization Driver" }),
1381
1392
  /* @__PURE__ */ jsxs4(
1382
1393
  Select,
1383
1394
  {
@@ -1389,7 +1400,7 @@ function ProvisioningWizard({
1389
1400
  );
1390
1401
  },
1391
1402
  children: [
1392
- /* @__PURE__ */ jsx4(SelectTrigger, { className: "h-9", children: /* @__PURE__ */ jsx4(SelectValue, {}) }),
1403
+ /* @__PURE__ */ jsx4(SelectTrigger, { id: `${fieldIdPrefix}-driver`, className: "h-9", children: /* @__PURE__ */ jsx4(SelectValue, {}) }),
1393
1404
  /* @__PURE__ */ jsxs4(SelectContent, { children: [
1394
1405
  /* @__PURE__ */ jsx4(SelectItem, { value: "docker", children: "Docker container (Default)" }),
1395
1406
  /* @__PURE__ */ jsx4(SelectItem, { value: "firecracker", children: "Firecracker microVM (Secure)" }),
@@ -1401,10 +1412,11 @@ function ProvisioningWizard({
1401
1412
  ] })
1402
1413
  ] }),
1403
1414
  /* @__PURE__ */ jsxs4("div", { children: [
1404
- /* @__PURE__ */ jsx4("label", { className: cn(FIELD_LABEL_CLASS, "mb-1.5"), children: "Git Repository URL" }),
1415
+ /* @__PURE__ */ jsx4("label", { htmlFor: `${fieldIdPrefix}-git-url`, className: cn(FIELD_LABEL_CLASS, "mb-1.5"), children: "Git Repository URL" }),
1405
1416
  /* @__PURE__ */ jsx4(
1406
1417
  Input,
1407
1418
  {
1419
+ id: `${fieldIdPrefix}-git-url`,
1408
1420
  type: "text",
1409
1421
  value: gitUrl,
1410
1422
  onChange: (e) => setGitUrl(e.target.value),
@@ -1435,6 +1447,7 @@ function ProvisioningWizard({
1435
1447
  Input,
1436
1448
  {
1437
1449
  type: "text",
1450
+ "aria-label": "Environment variable name",
1438
1451
  value: env.key,
1439
1452
  onChange: (e) => setEnvVars(
1440
1453
  envVars.map(
@@ -1496,7 +1509,7 @@ function ProvisioningWizard({
1496
1509
  (id) => id !== script.id
1497
1510
  ) : [...prev, script.id]
1498
1511
  ),
1499
- className: "mt-0.5 h-4 w-4 rounded border-[var(--md3-outline-variant)] text-primary focus:ring-primary/30"
1512
+ className: `mt-0.5 h-4 w-4 rounded border-[var(--md3-outline-variant)] text-primary ${focusRing}`
1500
1513
  }
1501
1514
  ),
1502
1515
  /* @__PURE__ */ jsxs4("div", { className: "flex-1 min-w-0", children: [
@@ -2549,6 +2562,7 @@ function parseEnvText(text) {
2549
2562
  }
2550
2563
 
2551
2564
  // src/pages/secrets-page.tsx
2565
+ import { focusField as focusField2 } from "@tangle-network/ui/utils";
2552
2566
  import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
2553
2567
  var MAX_IMPORT_FILE_BYTES = 256 * 1024;
2554
2568
  function SecretsPage({ apiClient, className, teamSecretsHint }) {
@@ -2738,7 +2752,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2738
2752
  {
2739
2753
  type: "button",
2740
2754
  onClick: () => setIsImportOpen(true),
2741
- className: "inline-flex items-center gap-2 rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container px-4 py-2.5 text-sm font-semibold text-foreground hover:bg-surface-container-high transition-colors active:scale-[0.97]",
2755
+ className: "inline-flex items-center gap-1.5 whitespace-nowrap rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container px-3 py-2.5 text-sm font-semibold text-foreground transition-colors hover:bg-surface-container-high active:scale-[0.97] sm:gap-2 sm:px-4",
2742
2756
  children: [
2743
2757
  /* @__PURE__ */ jsx7(Upload, { className: "h-4 w-4" }),
2744
2758
  "Import .env"
@@ -2750,7 +2764,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2750
2764
  {
2751
2765
  type: "button",
2752
2766
  onClick: () => setIsCreateOpen(true),
2753
- className: "inline-flex items-center gap-2 rounded-lg bg-[var(--btn-primary-bg)] border border-[var(--border-accent,transparent)] px-5 py-2.5 text-sm font-semibold text-[var(--btn-primary-text)] hover:bg-[var(--btn-primary-hover)] transition-colors active:scale-[0.97]",
2767
+ className: "inline-flex items-center gap-1.5 whitespace-nowrap rounded-lg border border-[var(--border-accent,transparent)] bg-[var(--btn-primary-bg)] px-3 py-2.5 text-sm font-semibold text-[var(--btn-primary-text)] transition-colors hover:bg-[var(--btn-primary-hover)] active:scale-[0.97] sm:gap-2 sm:px-5",
2754
2768
  children: [
2755
2769
  /* @__PURE__ */ jsx7(Plus3, { className: "h-4 w-4" }),
2756
2770
  "New Secret"
@@ -2760,14 +2774,16 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2760
2774
  ] })
2761
2775
  }
2762
2776
  ),
2763
- teamSecretsHint && /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-3 rounded-lg border border-[var(--md3-outline-variant)] bg-[var(--accent-surface-soft)]/40 px-4 py-3", children: [
2764
- /* @__PURE__ */ jsx7(Users, { className: "h-5 w-5 shrink-0 text-[var(--accent-text)]", "aria-hidden": "true" }),
2765
- /* @__PURE__ */ jsxs7("div", { className: "flex-1 text-sm", children: [
2766
- /* @__PURE__ */ jsx7("p", { className: "font-semibold text-foreground", children: "Setting up secrets for a team?" }),
2767
- /* @__PURE__ */ jsxs7("p", { className: "mt-0.5 text-muted-foreground text-xs", children: [
2768
- "Secrets here are ",
2769
- /* @__PURE__ */ jsx7("strong", { children: "personal" }),
2770
- " \u2014 only available in sandboxes you create. To share credentials with teammates, configure them on the team page instead."
2777
+ teamSecretsHint && /* @__PURE__ */ jsxs7("div", { className: "flex flex-wrap items-center gap-3 rounded-lg border border-[var(--md3-outline-variant)] bg-[var(--accent-surface-soft)]/40 px-4 py-3", children: [
2778
+ /* @__PURE__ */ jsxs7("div", { className: "flex min-w-[min(100%,18rem)] flex-1 items-start gap-3", children: [
2779
+ /* @__PURE__ */ jsx7(Users, { className: "mt-0.5 h-5 w-5 shrink-0 text-[var(--accent-text)]", "aria-hidden": "true" }),
2780
+ /* @__PURE__ */ jsxs7("div", { className: "min-w-0 text-sm", children: [
2781
+ /* @__PURE__ */ jsx7("p", { className: "font-semibold text-foreground", children: "Setting up secrets for a team?" }),
2782
+ /* @__PURE__ */ jsxs7("p", { className: "mt-0.5 text-xs text-muted-foreground", children: [
2783
+ "Secrets here are ",
2784
+ /* @__PURE__ */ jsx7("strong", { children: "personal" }),
2785
+ " and only available in sandboxes you create. Add shared credentials on the team page."
2786
+ ] })
2771
2787
  ] })
2772
2788
  ] }),
2773
2789
  /* @__PURE__ */ jsxs7(
@@ -2775,7 +2791,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2775
2791
  {
2776
2792
  type: "button",
2777
2793
  onClick: teamSecretsHint.onNavigate,
2778
- className: "inline-flex shrink-0 items-center gap-1 rounded-md border border-[var(--md3-outline-variant)] bg-surface-container px-3 py-1.5 text-xs font-semibold text-foreground hover:bg-surface-container-high transition-colors",
2794
+ className: "inline-flex w-full shrink-0 items-center justify-center gap-1 rounded-md border border-[var(--md3-outline-variant)] bg-surface-container px-3 py-1.5 text-xs font-semibold text-foreground transition-colors hover:bg-surface-container-high sm:w-auto",
2779
2795
  children: [
2780
2796
  teamSecretsHint.label ?? "Manage team secrets",
2781
2797
  /* @__PURE__ */ jsx7(ArrowRight, { className: "h-3 w-3", "aria-hidden": "true" })
@@ -2843,7 +2859,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2843
2859
  onChange: (e) => setNewName(e.target.value.toUpperCase().replace(/[^A-Z0-9_]/g, "_")),
2844
2860
  placeholder: "MY_SECRET_KEY",
2845
2861
  autoComplete: "off",
2846
- className: "w-full rounded-md border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2.5 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
2862
+ className: `w-full rounded-md border bg-surface-container-low px-3 py-2.5 text-sm font-mono text-foreground placeholder:text-muted-foreground ${focusField2}`
2847
2863
  }
2848
2864
  )
2849
2865
  ] }),
@@ -2860,7 +2876,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2860
2876
  onChange: (e) => setNewValue(e.target.value),
2861
2877
  placeholder: "Enter secret value...",
2862
2878
  autoComplete: "new-password",
2863
- className: "w-full rounded-md border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2.5 pr-10 text-sm font-mono text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
2879
+ className: `w-full rounded-md border bg-surface-container-low px-3 py-2.5 pr-10 text-sm font-mono text-foreground placeholder:text-muted-foreground ${focusField2}`
2864
2880
  }
2865
2881
  ),
2866
2882
  /* @__PURE__ */ jsx7(
@@ -2968,7 +2984,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2968
2984
  onChange: (e) => setImportText(e.target.value),
2969
2985
  rows: 6,
2970
2986
  spellCheck: false,
2971
- className: "w-full rounded-md border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2 font-mono text-xs text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
2987
+ className: `w-full rounded-md border bg-surface-container-low px-3 py-2 font-mono text-xs text-foreground placeholder:text-muted-foreground ${focusField2}`
2972
2988
  }
2973
2989
  ),
2974
2990
  /* @__PURE__ */ jsxs7("p", { className: "text-[11px] text-muted-foreground", children: [
@@ -3027,7 +3043,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
3027
3043
  value: row.key,
3028
3044
  onChange: (e) => updateRowKey(index, e.target.value),
3029
3045
  disabled: isImportSaving,
3030
- className: "w-2/5 rounded border border-[var(--md3-outline-variant)] bg-surface-container-low px-2 py-1.5 font-mono text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:opacity-60"
3046
+ className: `w-2/5 rounded border bg-surface-container-low px-2 py-1.5 font-mono text-xs text-foreground disabled:opacity-60 ${focusField2}`
3031
3047
  }
3032
3048
  ),
3033
3049
  /* @__PURE__ */ jsx7(
@@ -3038,7 +3054,7 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
3038
3054
  value: row.value,
3039
3055
  onChange: (e) => updateRowValue(index, e.target.value),
3040
3056
  disabled: isImportSaving,
3041
- className: "w-2/5 rounded border border-[var(--md3-outline-variant)] bg-surface-container-low px-2 py-1.5 font-mono text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:opacity-60"
3057
+ className: `w-2/5 rounded border bg-surface-container-low px-2 py-1.5 font-mono text-xs text-foreground disabled:opacity-60 ${focusField2}`
3042
3058
  }
3043
3059
  ),
3044
3060
  /* @__PURE__ */ jsxs7("div", { className: "flex w-1/5 flex-col items-end gap-1", children: [
@@ -3154,19 +3170,25 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
3154
3170
  )
3155
3171
  ] }) : /* @__PURE__ */ jsxs7("table", { className: "w-full text-left border-collapse", children: [
3156
3172
  /* @__PURE__ */ jsx7("thead", { children: /* @__PURE__ */ jsxs7("tr", { className: "bg-surface-container-high border-b border-[var(--md3-outline-variant)]", children: [
3157
- /* @__PURE__ */ jsx7("th", { className: "px-6 py-4 text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: "Secret Name" }),
3158
- /* @__PURE__ */ jsx7("th", { className: "px-6 py-4 text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: "Encrypted Value" }),
3159
- /* @__PURE__ */ jsx7("th", { className: "px-6 py-4 text-[10px] font-bold uppercase tracking-widest text-muted-foreground text-right", children: "Created" }),
3160
- /* @__PURE__ */ jsx7("th", { className: "px-6 py-4 w-12" })
3173
+ /* @__PURE__ */ jsx7("th", { scope: "col", className: "px-4 py-3 text-[10px] font-bold uppercase tracking-widest text-muted-foreground sm:px-6 sm:py-4", children: "Secret Name" }),
3174
+ /* @__PURE__ */ jsx7("th", { scope: "col", className: "hidden px-6 py-4 text-[10px] font-bold uppercase tracking-widest text-muted-foreground sm:table-cell", children: "Encrypted Value" }),
3175
+ /* @__PURE__ */ jsx7("th", { scope: "col", className: "hidden px-6 py-4 text-right text-[10px] font-bold uppercase tracking-widest text-muted-foreground sm:table-cell", children: "Created" }),
3176
+ /* @__PURE__ */ jsx7("th", { scope: "col", "aria-label": "Actions", className: "w-12 px-3 py-3 sm:px-6 sm:py-4" })
3161
3177
  ] }) }),
3162
3178
  /* @__PURE__ */ jsx7("tbody", { className: "divide-y divide-border", children: secrets.map((secret) => /* @__PURE__ */ jsxs7("tr", { className: "hover:bg-surface-container-high transition-colors", children: [
3163
- /* @__PURE__ */ jsx7("td", { className: "px-6 py-4", children: /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-3", children: [
3164
- /* @__PURE__ */ jsx7(Key, { className: "h-4 w-4 text-muted-foreground" }),
3165
- /* @__PURE__ */ jsx7("span", { className: "text-sm font-bold font-mono text-foreground", children: secret.name })
3179
+ /* @__PURE__ */ jsx7("td", { className: "px-4 py-3 sm:px-6 sm:py-4", children: /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-3", children: [
3180
+ /* @__PURE__ */ jsx7(Key, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
3181
+ /* @__PURE__ */ jsxs7("div", { className: "min-w-0", children: [
3182
+ /* @__PURE__ */ jsx7("span", { className: "break-all font-mono text-sm font-bold text-foreground sm:break-normal", children: secret.name }),
3183
+ /* @__PURE__ */ jsxs7("span", { className: "mt-1 block text-xs text-muted-foreground sm:hidden", children: [
3184
+ "Created ",
3185
+ formatDate(secret.createdAt)
3186
+ ] })
3187
+ ] })
3166
3188
  ] }) }),
3167
- /* @__PURE__ */ jsx7("td", { className: "px-6 py-4", children: /* @__PURE__ */ jsx7("code", { className: "text-xs font-mono text-muted-foreground bg-surface-container-high px-2 py-1 rounded", children: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }) }),
3168
- /* @__PURE__ */ jsx7("td", { className: "px-6 py-4 text-right", children: /* @__PURE__ */ jsx7("span", { className: "text-xs text-muted-foreground", children: formatDate(secret.createdAt) }) }),
3169
- /* @__PURE__ */ jsx7("td", { className: "px-6 py-4", children: /* @__PURE__ */ jsx7(
3189
+ /* @__PURE__ */ jsx7("td", { className: "hidden px-6 py-4 sm:table-cell", children: /* @__PURE__ */ jsx7("code", { className: "text-xs font-mono text-muted-foreground bg-surface-container-high px-2 py-1 rounded", children: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }) }),
3190
+ /* @__PURE__ */ jsx7("td", { className: "hidden px-6 py-4 text-right sm:table-cell", children: /* @__PURE__ */ jsx7("span", { className: "text-xs text-muted-foreground", children: formatDate(secret.createdAt) }) }),
3191
+ /* @__PURE__ */ jsx7("td", { className: "px-3 py-3 sm:px-6 sm:py-4", children: /* @__PURE__ */ jsx7(
3170
3192
  "button",
3171
3193
  {
3172
3194
  type: "button",
@@ -3252,6 +3274,7 @@ import {
3252
3274
  DialogHeader as DialogHeader4,
3253
3275
  DialogTitle as DialogTitle4
3254
3276
  } from "@tangle-network/ui/primitives";
3277
+ import { focusField as focusField3 } from "@tangle-network/ui/utils";
3255
3278
  import { jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
3256
3279
  var SCRIPT_TYPE_META = {
3257
3280
  bash: {
@@ -3703,7 +3726,7 @@ function StartupScriptsPage({ apiClient, className }) {
3703
3726
  onChange: (e) => setFormData((p) => ({ ...p, name: e.target.value })),
3704
3727
  placeholder: "Install Claude Code",
3705
3728
  maxLength: 64,
3706
- className: "mt-1.5 w-full rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
3729
+ className: `mt-1.5 w-full rounded-lg border bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground ${focusField3}`
3707
3730
  }
3708
3731
  )
3709
3732
  ] }),
@@ -3717,7 +3740,7 @@ function StartupScriptsPage({ apiClient, className }) {
3717
3740
  onChange: (e) => setFormData((p) => ({ ...p, description: e.target.value })),
3718
3741
  placeholder: "Sets up Claude Code with authentication",
3719
3742
  maxLength: 256,
3720
- className: "mt-1.5 w-full rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
3743
+ className: `mt-1.5 w-full rounded-lg border bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground ${focusField3}`
3721
3744
  }
3722
3745
  )
3723
3746
  ] }),
@@ -3754,7 +3777,7 @@ function StartupScriptsPage({ apiClient, className }) {
3754
3777
  onChange: (e) => setFormData((p) => ({ ...p, content: e.target.value })),
3755
3778
  rows: 12,
3756
3779
  spellCheck: false,
3757
- className: "mt-1.5 w-full rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container-low px-4 py-3 font-mono text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring resize-y"
3780
+ className: `mt-1.5 w-full rounded-lg border bg-surface-container-low px-4 py-3 font-mono text-sm text-foreground placeholder:text-muted-foreground resize-y ${focusField3}`
3758
3781
  }
3759
3782
  ),
3760
3783
  /* @__PURE__ */ jsxs9("p", { className: "mt-1 text-xs text-muted-foreground", children: [
@@ -3842,7 +3865,7 @@ function StartupScriptsPage({ apiClient, className }) {
3842
3865
  placeholder: "Any",
3843
3866
  min: 0.5,
3844
3867
  step: 0.5,
3845
- className: "mt-1.5 w-full rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
3868
+ className: `mt-1.5 w-full rounded-lg border bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground ${focusField3}`
3846
3869
  }
3847
3870
  )
3848
3871
  ] }),
@@ -3863,7 +3886,7 @@ function StartupScriptsPage({ apiClient, className }) {
3863
3886
  placeholder: "Any",
3864
3887
  min: 1,
3865
3888
  step: 1,
3866
- className: "mt-1.5 w-full rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
3889
+ className: `mt-1.5 w-full rounded-lg border bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground ${focusField3}`
3867
3890
  }
3868
3891
  )
3869
3892
  ] })
@@ -3882,7 +3905,7 @@ function StartupScriptsPage({ apiClient, className }) {
3882
3905
  onChange: (e) => setFormData((p) => ({ ...p, runOrder: e.target.value ? Math.max(0, Number(e.target.value)) : 0 })),
3883
3906
  min: 0,
3884
3907
  max: 9999,
3885
- className: "mt-1.5 w-full rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
3908
+ className: `mt-1.5 w-full rounded-lg border bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground ${focusField3}`
3886
3909
  }
3887
3910
  ),
3888
3911
  /* @__PURE__ */ jsx9("p", { className: "mt-1 text-xs text-muted-foreground", children: "Lower runs first" })
@@ -3900,7 +3923,7 @@ function StartupScriptsPage({ apiClient, className }) {
3900
3923
  onChange: (e) => setFormData((p) => ({ ...p, timeoutSeconds: e.target.value ? Math.max(5, Number(e.target.value)) : 300 })),
3901
3924
  min: 5,
3902
3925
  max: 3600,
3903
- className: "mt-1.5 w-full rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
3926
+ className: `mt-1.5 w-full rounded-lg border bg-surface-container-low px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground ${focusField3}`
3904
3927
  }
3905
3928
  )
3906
3929
  ] })
@@ -1,7 +1,8 @@
1
- export { ArtifactPane, ArtifactPaneProps, Avatar, AvatarFallback, AvatarImage, Badge, BadgeProps, Button, ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CodeBlock, CodeBlockProps, CopyButton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropZone, DropZoneProps, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateProps, FilterField, FilterFieldProps, InlineCode, InlineCodeProps, Input, InputProps, Label, Metric, MetricProps, MetricStrip, MetricStripProps, Progress, SegmentedControl, SegmentedControlOption, SegmentedControlProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarDropZone, SidebarDropZoneProps, Skeleton, SkeletonCard, SkeletonTable, StatCard, StatCardProps, StatusPill, StatusPillProps, StatusTone, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TerminalCursor, TerminalDisplay, TerminalInput, TerminalLine, Textarea, TextareaProps, ThemeToggle, Toast, ToastContainer, ToastProvider, Toolbar, ToolbarProps, UploadFile, UploadProgress, UploadProgressProps, badgeVariants, buttonVariants, useTheme, useToast } from '@tangle-network/ui/primitives';
2
- export { L as Logo, a as LogoProps, T as TangleKnot } from './logo-CaIvk3J1.js';
1
+ export { ArtifactPane, ArtifactPaneProps, Avatar, AvatarFallback, AvatarImage, Badge, BadgeProps, Button, ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CodeBlock, CodeBlockProps, CopyButton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropZone, DropZoneProps, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateProps, FilterField, FilterFieldProps, InlineCode, InlineCodeProps, Input, InputProps, Label, Metric, MetricProps, MetricStrip, MetricStripProps, Progress, SegmentedControl, SegmentedControlOption, SegmentedControlProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarDropZone, SidebarDropZoneProps, Skeleton, SkeletonCard, SkeletonTable, StatCard, StatCardProps, StatusPill, StatusPillProps, StatusTone, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TerminalCursor, TerminalDisplay, TerminalInput, TerminalLine, TextShimmer, TextShimmerProps, Textarea, TextareaProps, ThemeToggle, Toast, ToastContainer, ToastProvider, Toolbar, ToolbarProps, UploadFile, UploadProgress, UploadProgressProps, badgeVariants, buttonVariants, useTheme, useToast } from '@tangle-network/ui/primitives';
2
+ export { L as Logo, a as LogoProps } from './logo-DiAjq759.js';
3
3
  import * as React from 'react';
4
4
  import { HTMLAttributes, ElementType, ReactNode } from 'react';
5
+ export { TangleKnot } from '@tangle-network/brand';
5
6
 
6
7
  /**
7
8
  * Canonical type roles for the Tangle design system. Every title in every
@@ -87,6 +87,7 @@ import {
87
87
  TerminalDisplay,
88
88
  TerminalInput,
89
89
  TerminalLine,
90
+ TextShimmer,
90
91
  Textarea,
91
92
  ThemeToggle,
92
93
  ToastContainer,
@@ -97,7 +98,7 @@ import {
97
98
  buttonVariants,
98
99
  useTheme,
99
100
  useToast
100
- } from "./chunk-2XPJ2XF7.js";
101
+ } from "./chunk-ANSC5AFC.js";
101
102
  import "./chunk-EI44GEQ5.js";
102
103
  import "./chunk-CZ7CSFO4.js";
103
104
  export {
@@ -189,6 +190,7 @@ export {
189
190
  TerminalDisplay,
190
191
  TerminalInput,
191
192
  TerminalLine,
193
+ TextShimmer,
192
194
  Textarea,
193
195
  ThemeToggle,
194
196
  ToastContainer,