@undefineds.co/xpod 0.4.19 → 0.4.20

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 (136) hide show
  1. package/dist/api/container/common.js +2 -1
  2. package/dist/api/handlers/AiConfigHandler.js +10 -2
  3. package/dist/runtime/host/node/NodeRuntimeHost.js +7 -3
  4. package/dist/runtime/port-finder.d.ts +0 -5
  5. package/dist/runtime/port-finder.js +24 -12
  6. package/node_modules/@undefineds.co/extension-sdk/dist/react/solid-auth-boundary.d.ts +20 -2
  7. package/node_modules/@undefineds.co/extension-sdk/dist/react/solid-auth-boundary.js +142 -125
  8. package/node_modules/@undefineds.co/shared-ui/dist/focus.d.ts +1 -1
  9. package/node_modules/@undefineds.co/shared-ui/dist/focus.js +1 -1
  10. package/node_modules/@undefineds.co/shared-ui/dist/index.d.ts +1 -0
  11. package/node_modules/@undefineds.co/shared-ui/dist/index.js +1 -0
  12. package/node_modules/@undefineds.co/shared-ui/dist/login/LoginModal.d.ts +2 -0
  13. package/node_modules/@undefineds.co/shared-ui/dist/login/LoginModal.js +2 -0
  14. package/node_modules/@undefineds.co/shared-ui/dist/login/LoginView.d.ts +3 -0
  15. package/node_modules/@undefineds.co/shared-ui/dist/login/LoginView.js +3 -0
  16. package/node_modules/@undefineds.co/shared-ui/dist/login.d.ts +15 -0
  17. package/node_modules/@undefineds.co/shared-ui/dist/login.js +15 -0
  18. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/AccountSections.d.ts +141 -0
  19. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/AccountSections.js +67 -0
  20. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/ConsentView.d.ts +53 -0
  21. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/ConsentView.js +27 -0
  22. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/DeviceDialogs.d.ts +40 -0
  23. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/DeviceDialogs.js +33 -0
  24. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/IdpChrome.d.ts +15 -0
  25. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/IdpChrome.js +8 -0
  26. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/IdpViews.d.ts +93 -0
  27. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/IdpViews.js +88 -0
  28. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/NetworkPanel.d.ts +46 -0
  29. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/NetworkPanel.js +42 -0
  30. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/PodSignIn.d.ts +63 -0
  31. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/PodSignIn.js +65 -0
  32. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/PodSignInFrame.d.ts +31 -0
  33. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/PodSignInFrame.js +111 -0
  34. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/StorageBadge.d.ts +8 -0
  35. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/StorageBadge.js +7 -0
  36. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/XpodMark.d.ts +8 -0
  37. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/XpodMark.js +8 -0
  38. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/account-parts.d.ts +37 -0
  39. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/account-parts.js +33 -0
  40. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/copy.d.ts +156 -0
  41. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/copy.js +304 -0
  42. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/index.d.ts +20 -0
  43. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/index.js +18 -0
  44. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/parts.d.ts +69 -0
  45. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/parts.js +65 -0
  46. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/types.d.ts +14 -0
  47. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/types.js +1 -0
  48. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/webid-name.d.ts +5 -0
  49. package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/webid-name.js +14 -0
  50. package/node_modules/@undefineds.co/shared-ui/dist/storage-bootstrap.d.ts +3 -0
  51. package/node_modules/@undefineds.co/shared-ui/dist/storage-bootstrap.js +3 -0
  52. package/node_modules/@undefineds.co/shared-ui/dist/theme.css +168 -83
  53. package/node_modules/@undefineds.co/shared-ui/dist/webid-auth.d.ts +5 -0
  54. package/node_modules/@undefineds.co/shared-ui/dist/webid-auth.js +5 -0
  55. package/package.json +2 -2
  56. package/static/app/assets/main.css +1 -1
  57. package/static/app/assets/main.js +55 -15
  58. package/static/dashboard/assets/{AiConfigContext-B5QP7ow2.js → AiConfigContext-CZEW16so.js} +1 -1
  59. package/static/dashboard/assets/{AiConfigPage-C_TdlUjq.js → AiConfigPage-Cfp0fRX1.js} +1 -1
  60. package/static/dashboard/assets/{DocumentProcessingPanel-CormNOdI.js → DocumentProcessingPanel-DaaRCLp6.js} +1 -1
  61. package/static/dashboard/assets/{IndexLifecyclePanel-S9wNNyHO.js → IndexLifecyclePanel-BCz3jNM8.js} +1 -1
  62. package/static/dashboard/assets/{IndexSubjectPanel-CofZT1oE.js → IndexSubjectPanel-DVCVIt7V.js} +1 -1
  63. package/static/dashboard/assets/ModelAssignmentsPanel-DxauxtEY.js +1 -0
  64. package/static/dashboard/assets/{ModelsPage-DZ46VnUh.js → ModelsPage-B8F3AtZL.js} +3 -3
  65. package/static/dashboard/assets/{NetworkPage-TwbIWASf.js → NetworkPage-Cu7ty71x.js} +2 -2
  66. package/static/dashboard/assets/{PaneListHeader-BtVnyutC.js → PaneListHeader-BEAXSlD9.js} +1 -1
  67. package/static/dashboard/assets/{SearchIndexingPanel-BCq_YMOP.js → SearchIndexingPanel-DEr1EDDC.js} +1 -1
  68. package/static/dashboard/assets/{StatusSubjectPanel-DsUKTysU.js → StatusSubjectPanel-Cg92MGhO.js} +1 -1
  69. package/static/dashboard/assets/{StatusWorkspace-CaVJBRqI.js → StatusWorkspace-BmJSOF3z.js} +1 -1
  70. package/static/dashboard/assets/{SystemSettingsPage-DRWfPjtu.js → SystemSettingsPage-rziu4Q3U.js} +1 -1
  71. package/static/dashboard/assets/SystemSettingsSubjectPanel-D16DGDNW.js +33 -0
  72. package/static/dashboard/assets/{XpodAiConnectionsPodStore-C9tHqutw.js → XpodAiConnectionsPodStore-FlZ0LEn0.js} +1 -1
  73. package/static/dashboard/assets/{activity-tgjewO88.js → activity-D55X-5L5.js} +1 -1
  74. package/static/dashboard/assets/{badge-Czun47II.js → badge-CRf1ISRJ.js} +1 -1
  75. package/static/dashboard/assets/{collection-runtime-DnYlU23-.js → collection-runtime-CfXMuwNc.js} +1 -1
  76. package/static/dashboard/assets/dashboard-B3kGI946.css +1 -0
  77. package/static/dashboard/assets/{dashboard-CF8SbVSR.js → dashboard-D4DWPaAy.js} +122 -122
  78. package/static/dashboard/assets/{dialog-D-Yc_lg-.js → dialog-EVyIyybL.js} +1 -1
  79. package/static/dashboard/assets/{download-vFuOkjCi.js → download-Et4aRDT2.js} +1 -1
  80. package/static/dashboard/assets/{external-link-Cg_VIecD.js → external-link-DT746o7t.js} +1 -1
  81. package/static/dashboard/assets/{index-IXCNeEwi.js → index-D2agcVRx.js} +3 -3
  82. package/static/dashboard/assets/{index-0au0WwkE.js → index-_wC13YGI.js} +1 -1
  83. package/static/dashboard/assets/{index-YDcVky3o.js → index-z6TnJzW6.js} +1 -1
  84. package/static/dashboard/assets/{key-round-9n1xgLbG.js → key-round-CHnogQ1D.js} +1 -1
  85. package/static/dashboard/assets/{rotate-ccw-DJ6s86DW.js → rotate-ccw-BNVDC4Zr.js} +1 -1
  86. package/static/dashboard/assets/{skeleton-Dg9HePtI.js → skeleton-BzsZekVf.js} +1 -1
  87. package/static/dashboard/assets/{waypoints-uxc_qOzk.js → waypoints-CLZA22UN.js} +1 -1
  88. package/static/dashboard/assets/{workspace-layout-BNtAXhPW.js → workspace-layout-urYcwAhS.js} +1 -1
  89. package/static/dashboard/dashboard.html +2 -2
  90. package/static/settings/assets/{AiConfigContext-y6ha7pGs.js → AiConfigContext-B2cVJFNu.js} +1 -1
  91. package/static/settings/assets/AiConfigPage-D_5jSPPF.js +1 -0
  92. package/static/settings/assets/{DocumentProcessingPanel-Oa_cxMcn.js → DocumentProcessingPanel-DodGlYIk.js} +1 -1
  93. package/static/settings/assets/{IndexLifecyclePanel-DlrnI0Kh.js → IndexLifecyclePanel-BtH-0GKv.js} +1 -1
  94. package/static/settings/assets/{IndexSubjectPanel-Dhsl0W32.js → IndexSubjectPanel-CqKhUcw2.js} +1 -1
  95. package/static/settings/assets/ModelAssignmentsPanel-Cam9V9BN.js +1 -0
  96. package/static/settings/assets/{ModelsPage-CuNW1hGX.js → ModelsPage-DWFic09l.js} +3 -3
  97. package/static/settings/assets/{NetworkPage-BBD2Lc_P.js → NetworkPage-CSwHoAWm.js} +2 -2
  98. package/static/settings/assets/{PaneListHeader-C81adSBX.js → PaneListHeader-270Z179Z.js} +1 -1
  99. package/static/settings/assets/{SearchIndexingPanel-Dc4QKWd0.js → SearchIndexingPanel-ATHKMDBQ.js} +1 -1
  100. package/static/settings/assets/{StatusSubjectPanel-DuxOvqzS.js → StatusSubjectPanel-DDWo3v3d.js} +1 -1
  101. package/static/settings/assets/StatusWorkspace-BYgqeCBM.js +1 -0
  102. package/static/settings/assets/SystemSettingsPage-BRaQAFWC.js +1 -0
  103. package/static/settings/assets/SystemSettingsSubjectPanel-Dc0roh9d.js +33 -0
  104. package/static/settings/assets/{XpodAiConnectionsPodStore-G0ClZksP.js → XpodAiConnectionsPodStore-OndzbigX.js} +2 -2
  105. package/static/settings/assets/{activity-DT8pzOea.js → activity-BAZEToJ3.js} +1 -1
  106. package/static/settings/assets/auth-callback-Bd3tvCOa.js +1 -0
  107. package/static/settings/assets/{badge-CvKRjSY2.js → badge-Cpol0LWF.js} +1 -1
  108. package/static/settings/assets/{collection-runtime-C6ZAp2cM.js → collection-runtime-B5vGx3gk.js} +1 -1
  109. package/static/settings/assets/{dialog-LFluK7Nx.js → dialog-_7AVvv5q.js} +1 -1
  110. package/static/settings/assets/{download-CZJeqUm1.js → download-DRAi-dnn.js} +1 -1
  111. package/static/settings/assets/{external-link-BsDft3Oe.js → external-link--Yq8inDb.js} +1 -1
  112. package/static/settings/assets/global-B3kGI946.css +1 -0
  113. package/static/settings/assets/{global-cmKEraT4.js → global-DMtP8ZF4.js} +111 -111
  114. package/static/settings/assets/{index-BiqSFOS1.js → index-C36H49PZ.js} +1 -1
  115. package/static/settings/assets/{index-XRgmPBKw.js → index-CQR3iePj.js} +1 -1
  116. package/static/settings/assets/{index-BMPlaRWG.js → index-DURnCfoQ.js} +1 -1
  117. package/static/settings/assets/{index-browser-B0slhJKc.js → index-browser-kAl2JmYB.js} +1 -1
  118. package/static/settings/assets/{key-round-D1XsWbN_.js → key-round-DzpWBVN9.js} +1 -1
  119. package/static/settings/assets/{rotate-ccw-CEe0P0fY.js → rotate-ccw-CtVsCcAx.js} +1 -1
  120. package/static/settings/assets/settings-DQtt6lql.js +1 -0
  121. package/static/settings/assets/{skeleton-DA404w6m.js → skeleton-R_ACks7d.js} +1 -1
  122. package/static/settings/assets/{waypoints-DJDWc4S9.js → waypoints-D-Qv_sME.js} +1 -1
  123. package/static/settings/assets/{workspace-layout-K38jT4OV.js → workspace-layout-BSMCQq35.js} +1 -1
  124. package/static/settings/auth-callback.html +3 -3
  125. package/static/settings/settings.html +3 -3
  126. package/static/dashboard/assets/ModelAssignmentsPanel-9tgOjj-y.js +0 -1
  127. package/static/dashboard/assets/SystemSettingsSubjectPanel-CgDP7Ii2.js +0 -33
  128. package/static/dashboard/assets/dashboard-DvuM3VTP.css +0 -1
  129. package/static/settings/assets/AiConfigPage-CIcIWdXA.js +0 -1
  130. package/static/settings/assets/ModelAssignmentsPanel-CHoiRZeL.js +0 -1
  131. package/static/settings/assets/StatusWorkspace-DeD3zi3G.js +0 -1
  132. package/static/settings/assets/SystemSettingsPage-8sHOaPb8.js +0 -1
  133. package/static/settings/assets/SystemSettingsSubjectPanel-B1JXut7S.js +0 -33
  134. package/static/settings/assets/auth-callback-1BlsOtMG.js +0 -1
  135. package/static/settings/assets/global-DvuM3VTP.css +0 -1
  136. package/static/settings/assets/settings-DfjkqEJ8.js +0 -1
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Short display name for a WebID that has no remembered profile: the last
3
+ * meaningful path segment (`/alice/profile/card#me` -> `alice`), else the host.
4
+ */
5
+ export function webIdShortName(webId) {
6
+ try {
7
+ const url = new URL(webId);
8
+ const segments = url.pathname.split('/').filter((segment) => segment && !['profile', 'card'].includes(segment));
9
+ return segments[segments.length - 1] ?? url.hostname;
10
+ }
11
+ catch {
12
+ return webId;
13
+ }
14
+ }
@@ -30,4 +30,7 @@ export interface StorageBootstrapViewProps {
30
30
  */
31
31
  framed?: boolean;
32
32
  }
33
+ /**
34
+ * @deprecated Use PodSignIn with a `notice` (the Pod is prepared after sign-in, not before) (see `pod-sign-in/`). Kept for one more version; behavior is unchanged.
35
+ */
33
36
  export declare function StorageBootstrapView({ state: stateInput, copy, pending, onCreate, onContinue, onRetry, onCancel, framed, }: StorageBootstrapViewProps): import("react").JSX.Element;
@@ -9,6 +9,9 @@ function normalizeState(state) {
9
9
  return { status: state };
10
10
  return state;
11
11
  }
12
+ /**
13
+ * @deprecated Use PodSignIn with a `notice` (the Pod is prepared after sign-in, not before) (see `pod-sign-in/`). Kept for one more version; behavior is unchanged.
14
+ */
12
15
  export function StorageBootstrapView({ state: stateInput, copy, pending = false, onCreate, onContinue, onRetry, onCancel, framed = true, }) {
13
16
  const state = normalizeState(stateInput);
14
17
  const canCreate = state.status === 'creation';
@@ -1,27 +1,30 @@
1
1
  @layer base {
2
2
  :root {
3
3
  color-scheme: light;
4
- --background: 0 0% 98%;
5
- --foreground: 0 0% 12%;
6
- --card: 0 0% 100%;
7
- --card-foreground: 0 0% 12%;
8
- --popover: 0 0% 100%;
9
- --popover-foreground: 0 0% 12%;
10
- --primary: 252 46% 57%;
11
- --primary-foreground: 0 0% 100%;
12
- --secondary: 0 0% 96%;
13
- --secondary-foreground: 0 0% 12%;
14
- --muted: 0 0% 96%;
15
- --muted-foreground: 0 0% 43%;
16
- --accent: 0 0% 96%;
17
- --accent-foreground: 0 0% 12%;
4
+ --background: 42 38.5% 94.9%; /* canvas #F7F4ED */
5
+ --foreground: 30 13.2% 14.9%; /* text #2B2621 */
6
+ --card: 45 33.3% 97.6%; /* raised #FBFAF7 */
7
+ --card-foreground: 30 13.2% 14.9%;
8
+ --popover: 45 33.3% 97.6%;
9
+ --popover-foreground: 30 13.2% 14.9%;
10
+ --primary: 260.6 36.1% 38%; /* action #563E84 */
11
+ --primary-foreground: 42 38.5% 94.9%; /* on-action #F7F4ED */
12
+ --primary-hover: 261 35.7% 32.9%; /* action hover #4B3672 */
13
+ --primary-pressed: 261.2 35.7% 28%; /* action pressed #402E61 */
14
+ --secondary: 0 10.2% 90.4%; /* tint canvas #E9E4E4 */
15
+ --secondary-foreground: 30 13.2% 14.9%;
16
+ --muted: 18 15.6% 87.5%; /* tint sunken #E4DDDA */
17
+ --muted-foreground: 33.3 9.8% 36.1%; /* muted #655D53 */
18
+ --accent: 0 10.2% 90.4%; /* tint #E9E4E4 */
19
+ --accent-foreground: 30 13.2% 14.9%;
18
20
  --destructive: 352 43% 49%;
19
21
  --destructive-foreground: 0 0% 100%;
20
- --border: 0 0% 88%;
21
- --input: 0 0% 88%;
22
- --ring: 252 46% 57%;
23
- --lineage: 252 46% 57%;
24
- --lineage-foreground: 0 0% 100%;
22
+ --border: 36 13.5% 85.5%; /* line #DFDBD5 */
23
+ --input: 36 4% 51%; /* control #87837D */
24
+ --control-strong: 33.3 9.8% 36.1%; /* control-strong on tint #655D53 */
25
+ --ring: 260.6 36.1% 38%; /* focus = action #563E84 */
26
+ --lineage: 260.6 36.1% 38%;
27
+ --lineage-foreground: 42 38.5% 94.9%;
25
28
  --boundary: 202 34% 37%;
26
29
  --boundary-foreground: 0 0% 100%;
27
30
  --success: 160 48% 30%;
@@ -36,92 +39,103 @@
36
39
  --radius-2xl: 16px;
37
40
  --radius-3xl: 16px;
38
41
  --radius: 0.5rem;
39
- --layout-sidebar: 0 0% 96%;
40
- --layout-list-header: 0 0% 100%;
41
- --layout-list-hover: 0 0% 96%;
42
- --layout-list-item: 0 0% 100%;
43
- --layout-list-selected: 252 24% 94%;
44
- --layout-content: 0 0% 100%;
45
- --purple-medium: 252 46% 57%;
46
- --purple-deep: 252 40% 46%;
42
+ --layout-sidebar: 41.3 38.1% 91.8%; /* sunken #F2EDE2 */
43
+ --layout-list-header: 42 38.5% 94.9%; /* canvas #F7F4ED */
44
+ --layout-list-hover: 0 10.2% 90.4%; /* tint #E9E4E4 */
45
+ --layout-list-item: 45 33.3% 97.6%; /* raised #FBFAF7 */
46
+ --layout-list-selected: 0 10.2% 90.4%; /* tint #E9E4E4 */
47
+ --layout-content: 42 38.5% 94.9%; /* canvas #F7F4ED */
48
+ --purple-medium: 260.6 36.1% 38%;
49
+ --purple-deep: 261.2 35.7% 28%;
47
50
  --purple-light: 258 48% 84%;
51
+ --sunken: 41.3 38.1% 91.8%; /* sunken #F2EDE2 */
48
52
  }
49
53
 
50
54
  .dark {
51
55
  color-scheme: dark;
52
- --background: 0 0% 8%;
53
- --foreground: 0 0% 96%;
54
- --card: 0 0% 10%;
55
- --card-foreground: 0 0% 96%;
56
- --popover: 0 0% 10%;
57
- --popover-foreground: 0 0% 96%;
58
- --primary: 252 48% 65%;
59
- --primary-foreground: 0 0% 100%;
60
- --secondary: 0 0% 15%;
61
- --secondary-foreground: 0 0% 96%;
62
- --muted: 0 0% 15%;
63
- --muted-foreground: 0 0% 68%;
64
- --accent: 0 0% 15%;
65
- --accent-foreground: 0 0% 96%;
56
+ --background: 30 13.8% 11.4%; /* canvas #211D19 */
57
+ --foreground: 42 38.5% 94.9%; /* text #F7F4ED */
58
+ --card: 30 13.2% 14.9%; /* raised #2B2621 */
59
+ --card-foreground: 42 38.5% 94.9%;
60
+ --popover: 30 13.2% 14.9%;
61
+ --popover-foreground: 42 38.5% 94.9%;
62
+ /* R2 §8.4: the fixed brand violet is 1.93:1 on dark canvas, so the dark
63
+ action role is the lightened mapping, never #563E84 itself. */
64
+ --primary: 270 16.7% 71.8%; /* action #B7ABC3 */
65
+ --primary-foreground: 30 13.8% 11.4%; /* on-action #211D19 */
66
+ --primary-hover: 271.6 16.8% 77.8%; /* action hover #C7BDD0 */
67
+ --primary-pressed: 264.4 18.8% 66.7%; /* action pressed #A79ABA */
68
+ --secondary: 276.9 11.7% 21.8%; /* tint #39313E */
69
+ --secondary-foreground: 42 38.5% 94.9%;
70
+ --muted: 276.9 11.7% 21.8%; /* tint #39313E */
71
+ --muted-foreground: 34.3 15.8% 73.9%; /* muted #C7BEB2 */
72
+ --accent: 276.9 11.7% 21.8%; /* tint #39313E */
73
+ --accent-foreground: 42 38.5% 94.9%;
66
74
  --destructive: 352 43% 49%;
67
75
  --destructive-foreground: 0 0% 100%;
68
- --border: 0 0% 21%;
69
- --input: 0 0% 21%;
70
- --ring: 252 48% 65%;
71
- --lineage: 252 48% 65%;
72
- --lineage-foreground: 0 0% 100%;
76
+ --border: 30 12.3% 25.5%; /* line #494139 */
77
+ --input: 32.7 9.2% 53.3%; /* control #93897D */
78
+ --control-strong: 33.9 13.6% 66.9%; /* control-strong on tint #B6AC9F */
79
+ --ring: 270 16.7% 71.8%; /* focus = action #B7ABC3 */
80
+ --lineage: 270 16.7% 71.8%;
81
+ --lineage-foreground: 30 13.8% 11.4%;
73
82
  --boundary: 202 34% 48%;
74
83
  --boundary-foreground: 0 0% 100%;
75
84
  --success: 160 48% 42%;
76
85
  --success-foreground: 0 0% 100%;
77
86
  --warning: 44 72% 48%;
78
87
  --warning-foreground: 0 0% 100%;
79
- --layout-sidebar: 0 0% 15%;
80
- --layout-list-header: 0 0% 8%;
81
- --layout-list-hover: 0 0% 15%;
82
- --layout-list-item: 0 0% 8%;
83
- --layout-list-selected: 252 14% 18%;
84
- --layout-content: 0 0% 8%;
88
+ --layout-sidebar: 30 13.6% 8.6%; /* sunken #191613 */
89
+ --layout-list-header: 30 13.8% 11.4%; /* canvas #211D19 */
90
+ --layout-list-hover: 276.9 11.7% 21.8%; /* tint #39313E */
91
+ --layout-list-item: 30 13.2% 14.9%; /* raised #2B2621 */
92
+ --layout-list-selected: 276.9 11.7% 21.8%; /* tint #39313E */
93
+ --layout-content: 30 13.8% 11.4%; /* canvas #211D19 */
94
+ --sunken: 30 13.6% 8.6%; /* sunken #191613 */
85
95
  }
86
96
 
87
97
  .light {
88
98
  color-scheme: light;
89
- --background: 0 0% 98%;
90
- --foreground: 0 0% 12%;
91
- --card: 0 0% 100%;
92
- --card-foreground: 0 0% 12%;
93
- --popover: 0 0% 100%;
94
- --popover-foreground: 0 0% 12%;
95
- --primary: 252 46% 57%;
96
- --primary-foreground: 0 0% 100%;
97
- --secondary: 0 0% 96%;
98
- --secondary-foreground: 0 0% 12%;
99
- --muted: 0 0% 96%;
100
- --muted-foreground: 0 0% 43%;
101
- --accent: 0 0% 96%;
102
- --accent-foreground: 0 0% 12%;
99
+ --background: 42 38.5% 94.9%;
100
+ --foreground: 30 13.2% 14.9%;
101
+ --card: 45 33.3% 97.6%;
102
+ --card-foreground: 30 13.2% 14.9%;
103
+ --popover: 45 33.3% 97.6%;
104
+ --popover-foreground: 30 13.2% 14.9%;
105
+ --primary: 260.6 36.1% 38%;
106
+ --primary-foreground: 42 38.5% 94.9%;
107
+ --primary-hover: 261 35.7% 32.9%;
108
+ --primary-pressed: 261.2 35.7% 28%;
109
+ --secondary: 0 10.2% 90.4%;
110
+ --secondary-foreground: 30 13.2% 14.9%;
111
+ --muted: 18 15.6% 87.5%;
112
+ --muted-foreground: 33.3 9.8% 36.1%;
113
+ --accent: 0 10.2% 90.4%;
114
+ --accent-foreground: 30 13.2% 14.9%;
103
115
  --destructive: 352 43% 49%;
104
116
  --destructive-foreground: 0 0% 100%;
105
- --border: 0 0% 88%;
106
- --input: 0 0% 88%;
107
- --ring: 252 46% 57%;
108
- --lineage: 252 46% 57%;
109
- --lineage-foreground: 0 0% 100%;
117
+ --border: 36 13.5% 85.5%;
118
+ --input: 36 4% 51%;
119
+ --control-strong: 33.3 9.8% 36.1%;
120
+ --ring: 260.6 36.1% 38%;
121
+ --lineage: 260.6 36.1% 38%;
122
+ --lineage-foreground: 42 38.5% 94.9%;
110
123
  --boundary: 202 34% 37%;
111
124
  --boundary-foreground: 0 0% 100%;
112
125
  --success: 160 48% 30%;
113
126
  --success-foreground: 0 0% 100%;
114
127
  --warning: 44 72% 36%;
115
128
  --warning-foreground: 0 0% 100%;
116
- --layout-sidebar: 0 0% 96%;
117
- --layout-list-header: 0 0% 100%;
118
- --layout-list-hover: 0 0% 96%;
119
- --layout-list-item: 0 0% 100%;
120
- --layout-list-selected: 252 24% 94%;
121
- --layout-content: 0 0% 100%;
122
- --purple-medium: 252 46% 57%;
123
- --purple-deep: 252 40% 46%;
129
+ --layout-sidebar: 41.3 38.1% 91.8%;
130
+ --layout-list-header: 42 38.5% 94.9%;
131
+ --layout-list-hover: 0 10.2% 90.4%;
132
+ --layout-list-item: 45 33.3% 97.6%;
133
+ --layout-list-selected: 0 10.2% 90.4%;
134
+ --layout-content: 42 38.5% 94.9%;
135
+ --purple-medium: 260.6 36.1% 38%;
136
+ --purple-deep: 261.2 35.7% 28%;
124
137
  --purple-light: 258 48% 84%;
138
+ --sunken: 41.3 38.1% 91.8%;
125
139
  }
126
140
 
127
141
  html,
@@ -131,10 +145,11 @@
131
145
  }
132
146
 
133
147
  /*
134
- * Shared native-control baseline. The `html` prefix intentionally gives
135
- * these semantic colors precedence over @tailwindcss/forms' fixed white
136
- * defaults, even when a consumer imports this theme before Tailwind's base
137
- * layer. Product components remain free to override the rest of the shape.
148
+ * Shared native-control baseline. The `html` prefix gives these rules more
149
+ * specificity than @tailwindcss/forms' `input:where([type='text'])` base
150
+ * (0,0,1) so the semantic colours stay in charge, while `:where()` keeps the
151
+ * added specificity at zero. The control's focus outline lives in one place
152
+ * (the shared `controlFocusClass`), so nothing here may outrank a utility.
138
153
  */
139
154
  html input:where(:not([type]), [type='text'], [type='email'], [type='password'], [type='number'], [type='date'], [type='datetime-local'], [type='month'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='week']),
140
155
  html textarea,
@@ -161,6 +176,28 @@
161
176
  --tw-ring-offset-color: hsl(var(--background));
162
177
  }
163
178
 
179
+ /*
180
+ * Clear @tailwindcss/forms' fixed blue focus colour (border + ring box-shadow)
181
+ * so it cannot stack with the shared outline into the double frame the design
182
+ * forbids. Every native control is covered — text inputs, textarea, select and
183
+ * also checkbox/radio, whose plugin rule is `input:where([type=...]):focus`
184
+ * (0,1,1) like the text fields and would otherwise keep its blue 2px/4px ring.
185
+ * This selector is deliberately (0,1,2): it outranks every plugin base
186
+ * (0,1,1) but loses to the shared `focus-visible:outline-*` utility (0,2,0),
187
+ * which stays the single owner of the visible control focus boundary. The
188
+ * checked/hover state selectors (0,2,1) still win, so a checked box keeps its
189
+ * filled appearance.
190
+ */
191
+ html input:focus,
192
+ html textarea:focus,
193
+ html select:focus {
194
+ border-color: hsl(var(--input));
195
+ outline: none;
196
+ box-shadow: none;
197
+ --tw-ring-shadow: 0 0 #0000;
198
+ --tw-ring-offset-shadow: 0 0 #0000;
199
+ }
200
+
164
201
  html button,
165
202
  html input,
166
203
  html textarea,
@@ -176,6 +213,22 @@
176
213
  outline: none;
177
214
  }
178
215
 
216
+ /*
217
+ * Keyboard-focus fallback for legacy native controls that never adopted the
218
+ * shared `controlFocusClass` (settings pages, document panels, plain
219
+ * selects). The blanket `:focus { outline: none }` above must not erase the
220
+ * keyboard affordance, so this rule wins on source order at the same
221
+ * specificity and restores the one ink-violet outline. Shared controls keep
222
+ * the utility as the single owner: `focus-visible:outline-*` is (0,2,0) and
223
+ * outranks this (0,1,2) fallback, so no second boundary appears.
224
+ */
225
+ html input:focus-visible,
226
+ html textarea:focus-visible,
227
+ html select:focus-visible {
228
+ outline: 2px solid hsl(var(--ring));
229
+ outline-offset: 3px;
230
+ }
231
+
179
232
  html input:-webkit-autofill,
180
233
  html input:-webkit-autofill:hover,
181
234
  html input:-webkit-autofill:focus,
@@ -194,6 +247,8 @@
194
247
  --color-card-foreground: hsl(var(--card-foreground));
195
248
  --color-primary: hsl(var(--primary));
196
249
  --color-primary-foreground: hsl(var(--primary-foreground));
250
+ --color-primary-hover: hsl(var(--primary-hover));
251
+ --color-primary-pressed: hsl(var(--primary-pressed));
197
252
  --color-secondary: hsl(var(--secondary));
198
253
  --color-secondary-foreground: hsl(var(--secondary-foreground));
199
254
  --color-muted: hsl(var(--muted));
@@ -204,7 +259,9 @@
204
259
  --color-destructive-foreground: hsl(var(--destructive-foreground));
205
260
  --color-border: hsl(var(--border));
206
261
  --color-input: hsl(var(--input));
262
+ --color-control-strong: hsl(var(--control-strong));
207
263
  --color-ring: hsl(var(--ring));
264
+ --color-sunken: hsl(var(--sunken));
208
265
  --color-success: hsl(var(--success));
209
266
  --color-warning: hsl(var(--warning));
210
267
  --color-layout-sidebar: hsl(var(--layout-sidebar));
@@ -216,6 +273,34 @@
216
273
  }
217
274
 
218
275
  @layer components {
276
+ /*
277
+ * Pod sign-in front door (spec §5): system sans stack, 14/22 body, and one
278
+ * focus treatment (2px primary outline, 3px offset). No web fonts.
279
+ */
280
+ .pod-sign-in {
281
+ font-family: 'PingFang SC', 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans SC', 'Helvetica Neue', Arial, sans-serif;
282
+ font-size: 14px;
283
+ line-height: 22px;
284
+ }
285
+
286
+ /*
287
+ * Front-door focus for links, buttons and summary. Form controls are excluded:
288
+ * the shared control primitive owns their focus outline, so a control never
289
+ * draws this outline and its own at once.
290
+ */
291
+ .pod-sign-in :focus-visible:not(input):not(textarea):not(select) {
292
+ outline: 2px solid hsl(var(--ring));
293
+ outline-offset: 3px;
294
+ }
295
+
296
+ @media (prefers-reduced-motion: reduce) {
297
+ .pod-sign-in,
298
+ .pod-sign-in * {
299
+ animation: none !important;
300
+ transition: none !important;
301
+ }
302
+ }
303
+
219
304
  .warm-card {
220
305
  border: 1px solid hsl(var(--border) / 0.5);
221
306
  border-radius: var(--radius-xl);
@@ -106,6 +106,11 @@ export interface WebIdLoginEntryViewProps {
106
106
  * Frame-free presentation for hosts that expose exactly one WebID route.
107
107
  * Provider discovery, issuer validation, redirects, and session ownership all
108
108
  * stay in the host controller; this view only renders the one public action.
109
+ *
110
+ * @deprecated Use PodSignIn (state `choose-service`) (see `pod-sign-in/`). Kept for one more version; behavior is unchanged.
109
111
  */
110
112
  export declare function WebIdLoginEntryView({ copy, logo, pending, error, onStart, }: WebIdLoginEntryViewProps): import("react").JSX.Element;
113
+ /**
114
+ * @deprecated Use PodSignIn (see `pod-sign-in/`). Kept for one more version; behavior is unchanged.
115
+ */
111
116
  export declare function WebIdLoginRouteView({ route, state: stateInput, copy, onStart, onConnect, onRouteAction, onSelectRoute, onRetry, onCancel, onSwitchAccount, pending, framed, }: WebIdLoginRouteViewProps): import("react").JSX.Element;
@@ -9,6 +9,8 @@ import { cn } from './utils.js';
9
9
  * Frame-free presentation for hosts that expose exactly one WebID route.
10
10
  * Provider discovery, issuer validation, redirects, and session ownership all
11
11
  * stay in the host controller; this view only renders the one public action.
12
+ *
13
+ * @deprecated Use PodSignIn (state `choose-service`) (see `pod-sign-in/`). Kept for one more version; behavior is unchanged.
12
14
  */
13
15
  export function WebIdLoginEntryView({ copy, logo, pending = false, error, onStart, }) {
14
16
  return (_jsxs("div", { "data-testid": "webid-login-entry", className: "flex h-full min-h-0 flex-1 flex-col px-5 pb-5 pt-7", children: [_jsxs("div", { className: "flex min-h-0 flex-1 flex-col items-center justify-center gap-4 text-center", children: [logo ? _jsx("div", { className: "flex items-center justify-center", children: logo }) : null, copy.title || copy.description ? _jsxs("div", { className: "space-y-1.5", children: [copy.title ? _jsx("h2", { className: "text-lg font-semibold text-foreground", children: copy.title }) : null, copy.description ? (_jsx("p", { className: "text-xs leading-5 text-muted-foreground", children: copy.description })) : null] }) : null, error ? (_jsx("p", { role: "alert", className: "max-w-[15rem] text-sm leading-5 text-destructive", children: error })) : null] }), _jsxs(Button, { type: "button", className: "h-10 w-full shrink-0 rounded-xl", disabled: pending, "aria-busy": pending, onClick: () => void onStart(), children: [pending ? _jsx(Loader2, { "aria-hidden": "true", className: "mr-2 h-4 w-4 animate-spin" }) : null, pending ? copy.pendingLabel : copy.startLabel] })] }));
@@ -31,6 +33,9 @@ function rememberedName(state) {
31
33
  function stateMessage(state) {
32
34
  return 'message' in state ? state.message : undefined;
33
35
  }
36
+ /**
37
+ * @deprecated Use PodSignIn (see `pod-sign-in/`). Kept for one more version; behavior is unchanged.
38
+ */
34
39
  export function WebIdLoginRouteView({ route, state: stateInput, copy, onStart, onConnect, onRouteAction, onSelectRoute, onRetry, onCancel, onSwitchAccount, pending = false, framed = true, }) {
35
40
  const state = normalizeState(stateInput);
36
41
  const start = onStart ?? onConnect ?? onRouteAction ?? onSelectRoute;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@undefineds.co/xpod",
3
- "version": "0.4.19",
3
+ "version": "0.4.20",
4
4
  "description": "Xpod is an extended Community Solid Server, offering rich-feature, production-level Solid Pod and identity management.",
5
5
  "repository": "https://github.com/undefinedsco/xpod",
6
6
  "author": "developer@undefineds.co",
@@ -384,7 +384,7 @@
384
384
  }
385
385
  },
386
386
  "optionalDependencies": {
387
- "@undefineds.co/xpod-darwin-arm64": "0.4.19"
387
+ "@undefineds.co/xpod-darwin-arm64": "0.4.20"
388
388
  },
389
389
  "resolutions": {
390
390
  "@inrupt/solid-client-authn-browser": "^3.1.1",