@wix/web5-core 1.56.0 → 1.57.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 (197) hide show
  1. package/dist/cjs/client/wixAuthFetch.js +2 -2
  2. package/dist/cjs/client/wixAuthFetch.js.map +1 -1
  3. package/dist/cjs/component/componentDefinitions/HeroEntitySectionDefinition.js +20 -15
  4. package/dist/cjs/component/componentDefinitions/HeroEntitySectionDefinition.js.map +1 -1
  5. package/dist/cjs/component/componentDefinitions/HeroSectionDefinition.js +12 -4
  6. package/dist/cjs/component/componentDefinitions/HeroSectionDefinition.js.map +1 -1
  7. package/dist/cjs/component/componentDefinitions/listItemsSectionDefinition.js +24 -29
  8. package/dist/cjs/component/componentDefinitions/listItemsSectionDefinition.js.map +1 -1
  9. package/dist/cjs/component/componentParser.js +8 -1
  10. package/dist/cjs/component/componentParser.js.map +1 -1
  11. package/dist/cjs/component/types.js.map +1 -1
  12. package/dist/cjs/components/placement/PlacementResponseRenderer.css +0 -4
  13. package/dist/cjs/components/placement/PlacementResponseRenderer.js +11 -33
  14. package/dist/cjs/components/placement/PlacementResponseRenderer.js.map +1 -1
  15. package/dist/cjs/components/placement/buildPlacementDependencies.js.map +1 -1
  16. package/dist/cjs/components/ui/OptimizedImage.js +59 -14
  17. package/dist/cjs/components/ui/OptimizedImage.js.map +1 -1
  18. package/dist/cjs/components/ui/SectionSkeleton.css +19 -0
  19. package/dist/cjs/components/ui/SectionSkeleton.js +8 -4
  20. package/dist/cjs/components/ui/SectionSkeleton.js.map +1 -1
  21. package/dist/cjs/components/ui/UserQuery.css +72 -0
  22. package/dist/cjs/components/ui/UserQuery.js +131 -37
  23. package/dist/cjs/components/ui/UserQuery.js.map +1 -1
  24. package/dist/cjs/context/UserQueryContext.js +34 -0
  25. package/dist/cjs/context/UserQueryContext.js.map +1 -0
  26. package/dist/cjs/entity/defaultExtractor.js +9 -2
  27. package/dist/cjs/entity/defaultExtractor.js.map +1 -1
  28. package/dist/cjs/entity/fetchEntityListData.js +13 -26
  29. package/dist/cjs/entity/fetchEntityListData.js.map +1 -1
  30. package/dist/cjs/entity/index.js +5 -1
  31. package/dist/cjs/entity/index.js.map +1 -1
  32. package/dist/cjs/entity/listEntityItems.js +90 -0
  33. package/dist/cjs/entity/listEntityItems.js.map +1 -0
  34. package/dist/cjs/hostScope.js +63 -0
  35. package/dist/cjs/hostScope.js.map +1 -0
  36. package/dist/cjs/index.js +38 -13
  37. package/dist/cjs/index.js.map +1 -1
  38. package/dist/cjs/patternValidator/validator.test.js +61 -61
  39. package/dist/cjs/patternValidator/validator.test.js.map +1 -1
  40. package/dist/cjs/registry/ComponentRegistry.js +22 -2
  41. package/dist/cjs/registry/ComponentRegistry.js.map +1 -1
  42. package/dist/cjs/registry/index.js +1 -3
  43. package/dist/cjs/registry/index.js.map +1 -1
  44. package/dist/cjs/registry/types.js.map +1 -1
  45. package/dist/cjs/styles/base-utilities.css +35 -0
  46. package/dist/cjs/styles/components.css +1 -0
  47. package/dist/cjs/styles/host-reset.css +81 -0
  48. package/dist/cjs/styles/tailwind-theme.css +6 -6
  49. package/dist/cjs/utils/backendEnvironment.js +78 -0
  50. package/dist/cjs/utils/backendEnvironment.js.map +1 -0
  51. package/dist/cjs/utils/entityLinkParser.js +3 -1
  52. package/dist/cjs/utils/entityLinkParser.js.map +1 -1
  53. package/dist/cjs/utils/imageBackdrop.js +269 -0
  54. package/dist/cjs/utils/imageBackdrop.js.map +1 -0
  55. package/dist/cjs/utils/intentExtractor.js +20 -9
  56. package/dist/cjs/utils/intentExtractor.js.map +1 -1
  57. package/dist/cjs/utils/productBackHandoff.js +106 -0
  58. package/dist/cjs/utils/productBackHandoff.js.map +1 -0
  59. package/dist/cjs/utils/refreshPrompts.js +72 -0
  60. package/dist/cjs/utils/refreshPrompts.js.map +1 -0
  61. package/dist/esm/client/wixAuthFetch.js +2 -2
  62. package/dist/esm/client/wixAuthFetch.js.map +1 -1
  63. package/dist/esm/component/componentDefinitions/HeroEntitySectionDefinition.js +20 -15
  64. package/dist/esm/component/componentDefinitions/HeroEntitySectionDefinition.js.map +1 -1
  65. package/dist/esm/component/componentDefinitions/HeroSectionDefinition.js +12 -4
  66. package/dist/esm/component/componentDefinitions/HeroSectionDefinition.js.map +1 -1
  67. package/dist/esm/component/componentDefinitions/listItemsSectionDefinition.js +25 -30
  68. package/dist/esm/component/componentDefinitions/listItemsSectionDefinition.js.map +1 -1
  69. package/dist/esm/component/componentParser.js +8 -1
  70. package/dist/esm/component/componentParser.js.map +1 -1
  71. package/dist/esm/component/types.js.map +1 -1
  72. package/dist/esm/components/placement/PlacementResponseRenderer.css +0 -4
  73. package/dist/esm/components/placement/PlacementResponseRenderer.js +1 -16
  74. package/dist/esm/components/placement/PlacementResponseRenderer.js.map +1 -1
  75. package/dist/esm/components/placement/buildPlacementDependencies.js.map +1 -1
  76. package/dist/esm/components/ui/OptimizedImage.js +50 -5
  77. package/dist/esm/components/ui/OptimizedImage.js.map +1 -1
  78. package/dist/esm/components/ui/SectionSkeleton.css +19 -0
  79. package/dist/esm/components/ui/SectionSkeleton.js +5 -1
  80. package/dist/esm/components/ui/SectionSkeleton.js.map +1 -1
  81. package/dist/esm/components/ui/UserQuery.css +72 -0
  82. package/dist/esm/components/ui/UserQuery.js +52 -6
  83. package/dist/esm/components/ui/UserQuery.js.map +1 -1
  84. package/dist/esm/context/UserQueryContext.js +21 -0
  85. package/dist/esm/context/UserQueryContext.js.map +1 -0
  86. package/dist/esm/entity/defaultExtractor.js +9 -2
  87. package/dist/esm/entity/defaultExtractor.js.map +1 -1
  88. package/dist/esm/entity/fetchEntityListData.js +14 -26
  89. package/dist/esm/entity/fetchEntityListData.js.map +1 -1
  90. package/dist/esm/entity/index.js +1 -0
  91. package/dist/esm/entity/index.js.map +1 -1
  92. package/dist/esm/entity/listEntityItems.js +85 -0
  93. package/dist/esm/entity/listEntityItems.js.map +1 -0
  94. package/dist/esm/hostScope.js +59 -0
  95. package/dist/esm/hostScope.js.map +1 -0
  96. package/dist/esm/index.js +13 -4
  97. package/dist/esm/index.js.map +1 -1
  98. package/dist/esm/patternValidator/validator.test.js +61 -61
  99. package/dist/esm/patternValidator/validator.test.js.map +1 -1
  100. package/dist/esm/registry/ComponentRegistry.js +22 -2
  101. package/dist/esm/registry/ComponentRegistry.js.map +1 -1
  102. package/dist/esm/registry/index.js +0 -1
  103. package/dist/esm/registry/index.js.map +1 -1
  104. package/dist/esm/registry/types.js.map +1 -1
  105. package/dist/esm/styles/base-utilities.css +35 -0
  106. package/dist/esm/styles/components.css +1 -0
  107. package/dist/esm/styles/host-reset.css +81 -0
  108. package/dist/esm/styles/tailwind-theme.css +6 -6
  109. package/dist/esm/utils/backendEnvironment.js +71 -0
  110. package/dist/esm/utils/backendEnvironment.js.map +1 -0
  111. package/dist/esm/utils/entityLinkParser.js +3 -1
  112. package/dist/esm/utils/entityLinkParser.js.map +1 -1
  113. package/dist/esm/utils/imageBackdrop.js +262 -0
  114. package/dist/esm/utils/imageBackdrop.js.map +1 -0
  115. package/dist/esm/utils/intentExtractor.js +21 -12
  116. package/dist/esm/utils/intentExtractor.js.map +1 -1
  117. package/dist/esm/utils/productBackHandoff.js +100 -0
  118. package/dist/esm/utils/productBackHandoff.js.map +1 -0
  119. package/dist/esm/utils/refreshPrompts.js +67 -0
  120. package/dist/esm/utils/refreshPrompts.js.map +1 -0
  121. package/dist/types/component/componentDefinitions/HeroEntitySectionDefinition.d.ts.map +1 -1
  122. package/dist/types/component/componentDefinitions/HeroSectionDefinition.d.ts.map +1 -1
  123. package/dist/types/component/componentDefinitions/listItemsSectionDefinition.d.ts +2 -2
  124. package/dist/types/component/componentDefinitions/listItemsSectionDefinition.d.ts.map +1 -1
  125. package/dist/types/component/componentParser.d.ts.map +1 -1
  126. package/dist/types/component/types.d.ts +1 -5
  127. package/dist/types/component/types.d.ts.map +1 -1
  128. package/dist/types/components/placement/PlacementResponseRenderer.d.ts +1 -1
  129. package/dist/types/components/placement/PlacementResponseRenderer.d.ts.map +1 -1
  130. package/dist/types/components/placement/buildPlacementDependencies.d.ts +1 -2
  131. package/dist/types/components/placement/buildPlacementDependencies.d.ts.map +1 -1
  132. package/dist/types/components/ui/OptimizedImage.d.ts +9 -0
  133. package/dist/types/components/ui/OptimizedImage.d.ts.map +1 -1
  134. package/dist/types/components/ui/SectionSkeleton.d.ts.map +1 -1
  135. package/dist/types/components/ui/UserQuery.d.ts +21 -0
  136. package/dist/types/components/ui/UserQuery.d.ts.map +1 -1
  137. package/dist/types/context/UserQueryContext.d.ts +12 -0
  138. package/dist/types/context/UserQueryContext.d.ts.map +1 -0
  139. package/dist/types/entity/defaultExtractor.d.ts.map +1 -1
  140. package/dist/types/entity/fetchEntityListData.d.ts +0 -2
  141. package/dist/types/entity/fetchEntityListData.d.ts.map +1 -1
  142. package/dist/types/entity/index.d.ts +1 -0
  143. package/dist/types/entity/index.d.ts.map +1 -1
  144. package/dist/types/entity/listEntityItems.d.ts +40 -0
  145. package/dist/types/entity/listEntityItems.d.ts.map +1 -0
  146. package/dist/types/hostScope.d.ts +83 -0
  147. package/dist/types/hostScope.d.ts.map +1 -0
  148. package/dist/types/index.d.ts +11 -7
  149. package/dist/types/index.d.ts.map +1 -1
  150. package/dist/types/registry/ComponentRegistry.d.ts +8 -0
  151. package/dist/types/registry/ComponentRegistry.d.ts.map +1 -1
  152. package/dist/types/registry/index.d.ts +0 -1
  153. package/dist/types/registry/index.d.ts.map +1 -1
  154. package/dist/types/registry/types.d.ts +5 -6
  155. package/dist/types/registry/types.d.ts.map +1 -1
  156. package/dist/types/utils/backendEnvironment.d.ts +30 -0
  157. package/dist/types/utils/backendEnvironment.d.ts.map +1 -0
  158. package/dist/types/utils/entityLinkParser.d.ts.map +1 -1
  159. package/dist/types/utils/imageBackdrop.d.ts +102 -0
  160. package/dist/types/utils/imageBackdrop.d.ts.map +1 -0
  161. package/dist/types/utils/intentExtractor.d.ts +21 -4
  162. package/dist/types/utils/intentExtractor.d.ts.map +1 -1
  163. package/dist/types/utils/productBackHandoff.d.ts +43 -0
  164. package/dist/types/utils/productBackHandoff.d.ts.map +1 -0
  165. package/dist/types/utils/refreshPrompts.d.ts +32 -0
  166. package/dist/types/utils/refreshPrompts.d.ts.map +1 -0
  167. package/package.json +4 -3
  168. package/src/components/placement/PlacementResponseRenderer.css +265 -0
  169. package/src/components/ui/Disclaimer.css +35 -0
  170. package/src/components/ui/FeedbackBar.css +267 -0
  171. package/src/components/ui/PlacementLoader.css +101 -0
  172. package/src/components/ui/PromptEntryEmptyState.css +172 -0
  173. package/src/components/ui/SearchSection.css +538 -0
  174. package/src/components/ui/SectionSkeleton.css +128 -0
  175. package/src/components/ui/UserQuery.css +72 -0
  176. package/src/styles/base-utilities.css +35 -0
  177. package/src/styles/components.css +1 -0
  178. package/src/styles/host-reset.css +81 -0
  179. package/src/styles/tailwind-theme.css +6 -6
  180. package/dist/cjs/registry/Intent.js +0 -19
  181. package/dist/cjs/registry/Intent.js.map +0 -1
  182. package/dist/cjs/utils/conversationApi.js +0 -52
  183. package/dist/cjs/utils/conversationApi.js.map +0 -1
  184. package/dist/cjs/utils/conversationMode.js +0 -23
  185. package/dist/cjs/utils/conversationMode.js.map +0 -1
  186. package/dist/esm/registry/Intent.js +0 -15
  187. package/dist/esm/registry/Intent.js.map +0 -1
  188. package/dist/esm/utils/conversationApi.js +0 -45
  189. package/dist/esm/utils/conversationApi.js.map +0 -1
  190. package/dist/esm/utils/conversationMode.js +0 -18
  191. package/dist/esm/utils/conversationMode.js.map +0 -1
  192. package/dist/types/registry/Intent.d.ts +0 -12
  193. package/dist/types/registry/Intent.d.ts.map +0 -1
  194. package/dist/types/utils/conversationApi.d.ts +0 -26
  195. package/dist/types/utils/conversationApi.d.ts.map +0 -1
  196. package/dist/types/utils/conversationMode.d.ts +0 -16
  197. package/dist/types/utils/conversationMode.d.ts.map +0 -1
@@ -0,0 +1,267 @@
1
+ /* "Was this helpful?" bar + popover. Mounted by the host app inside the
2
+ sections container; clients can override the whole component via the
3
+ FeedbackBarComponent UI slot. */
4
+
5
+ .web5-feedback-bar {
6
+ display: flex;
7
+ align-items: center;
8
+ justify-content: flex-start;
9
+ gap: 12px;
10
+ width: fit-content;
11
+ /* Negative top margin pulls the bar up into the previous section's bottom
12
+ padding so it visually sits inside that section's color band (matches
13
+ Figma — bar at the bottom of the NextSteps purple gradient) without
14
+ changing its DOM position. Tune via --web5-feedback-margin-top. */
15
+ margin: var(--web5-feedback-margin-top, -4rem) 0
16
+ var(--web5-feedback-margin-bottom, 1.5rem) 0;
17
+ font-size: var(--web5-feedback-bar-font-size, 13px);
18
+ font-weight: 400;
19
+ line-height: normal;
20
+ /* Bar-scoped label color falls back to the shared muted color so popover
21
+ elements (title-hint, close button) stay readable on white when Circana
22
+ re-skins the bar text to light. */
23
+ color: var(
24
+ --web5-feedback-bar-color,
25
+ var(--web5-feedback-label-color, #6b7280)
26
+ );
27
+ }
28
+
29
+ .web5-feedback-label {
30
+ margin: 0;
31
+ }
32
+
33
+ .web5-feedback-thumb {
34
+ position: relative;
35
+ width: 32px;
36
+ height: 32px;
37
+ border-radius: 50%;
38
+ border: 0;
39
+ background: transparent;
40
+ color: var(--web5-feedback-thumb-color, #2b2b2b);
41
+ display: inline-flex;
42
+ align-items: center;
43
+ justify-content: center;
44
+ cursor: pointer;
45
+ transition:
46
+ background 0.12s,
47
+ color 0.12s;
48
+ }
49
+
50
+ /* Hover tooltip — pill above the thumb. Scoped to bar thumbs only; the
51
+ popover header thumbs are sentiment switchers and don't need tooltips. */
52
+ .web5-feedback-bar .web5-feedback-thumb[data-tooltip]::after {
53
+ content: attr(data-tooltip);
54
+ position: absolute;
55
+ bottom: calc(100% + 8px);
56
+ left: 50%;
57
+ transform: translateX(-50%);
58
+ padding: 8px 16px;
59
+ background: var(--web5-feedback-tooltip-bg, #1f1f1f);
60
+ color: var(--web5-feedback-tooltip-color, #fff);
61
+ border-radius: 999px;
62
+ font-size: 14px;
63
+ font-weight: 500;
64
+ line-height: 1;
65
+ white-space: nowrap;
66
+ opacity: 0;
67
+ pointer-events: none;
68
+ transition: opacity 0.12s;
69
+ z-index: 50;
70
+ }
71
+
72
+ .web5-feedback-bar .web5-feedback-thumb[data-tooltip]:hover::after,
73
+ .web5-feedback-bar .web5-feedback-thumb[data-tooltip]:focus-visible::after {
74
+ opacity: 1;
75
+ }
76
+
77
+ .web5-feedback-thumb:hover {
78
+ background: var(--web5-feedback-thumb-hover-bg, rgba(0, 0, 0, 0.06));
79
+ }
80
+
81
+ .web5-feedback-thumb--active {
82
+ background: var(--web5-feedback-accent, #1a1422);
83
+ color: #fff;
84
+ }
85
+
86
+ .web5-feedback-thumb--active:hover {
87
+ background: var(--web5-feedback-accent-hover, #2a2236);
88
+ }
89
+
90
+ /* Bar-only overrides — the bar may sit on a colored band (e.g. NextSteps'
91
+ purple gradient) and need light icons/hover, while the popover thumbs
92
+ always sit on white and stay dark. Selector path stops at the bar's own
93
+ thumbs-row to avoid leaking into the popover header thumbs. */
94
+ .web5-feedback-bar > .web5-feedback-thumbs-row > .web5-feedback-thumb {
95
+ color: var(
96
+ --web5-feedback-bar-thumb-color,
97
+ var(--web5-feedback-thumb-color, #2b2b2b)
98
+ );
99
+ }
100
+
101
+ .web5-feedback-bar > .web5-feedback-thumbs-row > .web5-feedback-thumb:hover {
102
+ background: var(
103
+ --web5-feedback-bar-thumb-hover-bg,
104
+ var(--web5-feedback-thumb-hover-bg, rgba(0, 0, 0, 0.06))
105
+ );
106
+ }
107
+
108
+ /* Dim the rest of the page while the popover is open. */
109
+ .web5-feedback-backdrop {
110
+ position: fixed;
111
+ inset: 0;
112
+ background: rgba(0, 0, 0, 0.4);
113
+ z-index: 65;
114
+ animation: web5-feedback-backdrop-in 0.18s ease both;
115
+ }
116
+
117
+ @keyframes web5-feedback-backdrop-in {
118
+ from {
119
+ opacity: 0;
120
+ }
121
+ }
122
+
123
+ /* Centered on the viewport rather than anchored to the bar — so the form
124
+ reads as a focused modal regardless of where the bar sits on the page. */
125
+ .web5-feedback-popover {
126
+ position: fixed;
127
+ top: 50%;
128
+ left: 50%;
129
+ transform: translate(-50%, -50%);
130
+ width: min(574px, 92vw);
131
+ z-index: 70;
132
+ background: #fff;
133
+ border: 1px solid rgba(0, 0, 0, 0.06);
134
+ border-radius: 14px;
135
+ padding: 30px;
136
+ display: flex;
137
+ flex-direction: column;
138
+ gap: 25px;
139
+ box-shadow: 0 24px 48px -12px rgba(20, 14, 32, 0.25),
140
+ 0 8px 16px -8px rgba(20, 14, 32, 0.12);
141
+ animation: web5-feedback-pop-in 0.18s ease both;
142
+ }
143
+
144
+ @keyframes web5-feedback-pop-in {
145
+ from {
146
+ opacity: 0;
147
+ transform: translate(-50%, calc(-50% + 8px));
148
+ }
149
+ }
150
+
151
+ .web5-feedback-head {
152
+ display: flex;
153
+ flex-direction: column;
154
+ gap: 15px;
155
+ }
156
+
157
+ .web5-feedback-thumbs-row {
158
+ display: flex;
159
+ gap: 0;
160
+ }
161
+
162
+ .web5-feedback-title {
163
+ margin: 0;
164
+ font-size: 15px;
165
+ font-weight: 600;
166
+ color: var(--web5-feedback-title-color, #2b2b2b);
167
+ }
168
+
169
+ .web5-feedback-title-hint {
170
+ font-weight: 400;
171
+ color: var(--web5-feedback-label-color, #6b7280);
172
+ }
173
+
174
+ .web5-feedback-close {
175
+ position: absolute;
176
+ top: 24px;
177
+ right: 24px;
178
+ width: 24px;
179
+ height: 24px;
180
+ border-radius: 50%;
181
+ border: 0;
182
+ background: transparent;
183
+ color: var(--web5-feedback-label-color, #6b7280);
184
+ cursor: pointer;
185
+ display: inline-flex;
186
+ align-items: center;
187
+ justify-content: center;
188
+ }
189
+
190
+ .web5-feedback-close:hover {
191
+ background: rgba(0, 0, 0, 0.06);
192
+ color: var(--web5-feedback-title-color, #2b2b2b);
193
+ }
194
+
195
+ .web5-feedback-chips {
196
+ display: flex;
197
+ gap: 13px;
198
+ flex-wrap: wrap;
199
+ }
200
+
201
+ .web5-feedback-chip {
202
+ display: inline-flex;
203
+ align-items: center;
204
+ padding: 8px 15px;
205
+ height: 30px;
206
+ border-radius: 999px;
207
+ border: 1px solid rgba(0, 0, 0, 0.12);
208
+ background: #fff;
209
+ color: var(--web5-feedback-chip-color, #2b2b2b);
210
+ font-size: 13px;
211
+ cursor: pointer;
212
+ transition:
213
+ background 0.12s,
214
+ border-color 0.12s,
215
+ color 0.12s;
216
+ }
217
+
218
+ /* Hover: neutral fill, default border — no accent tint. */
219
+ .web5-feedback-chip:hover {
220
+ background: var(--web5-feedback-chip-hover-bg, rgba(0, 0, 0, 0.04));
221
+ }
222
+
223
+ /* Selected: accent-colored border, subtle fill, default text color
224
+ (matches Figma — the chip label stays dark, only the outline changes). */
225
+ .web5-feedback-chip.web5-feedback-chip--selected,
226
+ .web5-feedback-chip.web5-feedback-chip--selected:hover {
227
+ background: var(--web5-feedback-chip-selected-bg, rgba(0, 0, 0, 0.04));
228
+ border-color: var(--web5-feedback-accent, #1a1422);
229
+ }
230
+
231
+ .web5-feedback-textarea {
232
+ width: 100%;
233
+ min-height: 100px;
234
+ padding: 15px;
235
+ border-radius: 10px;
236
+ border: 1px solid rgba(0, 0, 0, 0.12);
237
+ background: #fff;
238
+ font: 14px/1.4 inherit;
239
+ color: var(--web5-feedback-title-color, #2b2b2b);
240
+ resize: vertical;
241
+ }
242
+
243
+ .web5-feedback-textarea::placeholder {
244
+ color: var(--web5-feedback-placeholder-color, #7a838a);
245
+ }
246
+
247
+ .web5-feedback-submit {
248
+ width: 100%;
249
+ height: 38px;
250
+ border-radius: 999px;
251
+ border: 0;
252
+ background: var(--web5-feedback-accent, #1a1422);
253
+ color: #fff;
254
+ font-size: 14px;
255
+ font-weight: 500;
256
+ cursor: pointer;
257
+ transition: background 0.12s;
258
+ }
259
+
260
+ .web5-feedback-submit:hover {
261
+ background: var(--web5-feedback-accent-hover, #2a2236);
262
+ }
263
+
264
+ .web5-feedback-submit:disabled {
265
+ background: var(--web5-feedback-accent-disabled, rgba(26, 20, 34, 0.45));
266
+ cursor: not-allowed;
267
+ }
@@ -0,0 +1,101 @@
1
+ /* PlacementLoader — placement loading skeleton.
2
+ Rendered before the streamed response arrives. Client packages can re-skin
3
+ via the `--w5-placement-loader-*` tokens below without touching the markup.
4
+ Defaults mirror the canonical wireframe: a soft-bordered rounded container
5
+ with two stub text lines and a larger content block, all using a very
6
+ light accent-tinted skeleton wash.
7
+ The rendered placement's card chrome lives in
8
+ `../placement/PlacementResponseRenderer.css`. */
9
+
10
+ /* Wrapper around the loader. Drives the entrance animation: the slot starts
11
+ empty, the wrapper expands from a 0-height grid row to its natural row,
12
+ smoothly pushing surrounding host content down instead of popping in. The
13
+ margin-block on either side gives breathing room from neighbouring blocks
14
+ on the host page and animates in alongside the height for a coherent
15
+ reveal. Clients can re-skin the spacing via `--w5-placement-spacing`.
16
+ The loader→content swap itself is height-animated by the
17
+ PlacementSmoothHeight wrapper (see `../placement/PlacementResponseRenderer.css`). */
18
+ .w5-placement--loading {
19
+ display: grid;
20
+ grid-template-rows: 1fr;
21
+ margin-block: var(--w5-placement-spacing, 24px);
22
+ animation: w5-placement-loader-reveal 420ms ease-out both;
23
+ }
24
+
25
+ .w5-placement--loading > * {
26
+ min-height: 0;
27
+ overflow: hidden;
28
+ }
29
+
30
+ @keyframes w5-placement-loader-reveal {
31
+ from {
32
+ grid-template-rows: 0fr;
33
+ margin-block: 0;
34
+ opacity: 0;
35
+ }
36
+ to {
37
+ grid-template-rows: 1fr;
38
+ margin-block: var(--w5-placement-spacing, 24px);
39
+ opacity: 1;
40
+ }
41
+ }
42
+
43
+ .w5-placement-loader {
44
+ display: flex;
45
+ flex-direction: column;
46
+ gap: var(--w5-placement-loader-gap, 24px);
47
+ padding: var(--w5-placement-loader-padding, 20px 24px);
48
+ border: var(--w5-placement-loader-border, 1px solid rgb(226 232 240));
49
+ border-radius: var(--w5-placement-loader-radius, 12px);
50
+ background: var(--w5-placement-loader-bg, #fff);
51
+ width: 100%;
52
+ box-sizing: border-box;
53
+ }
54
+
55
+ .w5-placement-loader__lines {
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: var(--w5-placement-loader-line-gap, 10px);
59
+ }
60
+
61
+ .w5-placement-loader__line,
62
+ .w5-placement-loader__block {
63
+ display: block;
64
+ /* Very light tint of the placement accent (oklch(0.6 0.24 26.24)) —
65
+ same hue, lightness raised and chroma dropped for a skeleton wash. */
66
+ background: var(--w5-placement-loader-skeleton, oklch(0.95 0.04 26.24));
67
+ border-radius: var(--w5-placement-loader-skeleton-radius, 6px);
68
+ animation: w5-placement-loader-pulse 1.4s ease-in-out infinite;
69
+ }
70
+
71
+ .w5-placement-loader__line {
72
+ height: var(--w5-placement-loader-line-height, 14px);
73
+ width: 100%;
74
+ }
75
+
76
+ .w5-placement-loader__line--short {
77
+ width: var(--w5-placement-loader-line-short-width, 70%);
78
+ }
79
+
80
+ .w5-placement-loader__block {
81
+ height: var(--w5-placement-loader-block-height, 120px);
82
+ width: 100%;
83
+ }
84
+
85
+ @keyframes w5-placement-loader-pulse {
86
+ 0%,
87
+ 100% {
88
+ opacity: 1;
89
+ }
90
+ 50% {
91
+ opacity: 0.55;
92
+ }
93
+ }
94
+
95
+ @media (prefers-reduced-motion: reduce) {
96
+ .w5-placement--loading,
97
+ .w5-placement-loader__line,
98
+ .w5-placement-loader__block {
99
+ animation: none;
100
+ }
101
+ }
@@ -0,0 +1,172 @@
1
+ .web5-empty-state {
2
+ width: 100%;
3
+ /* Subtract the host's fixed top-nav height (measured into this var by
4
+ inject-host-nav-offset.ts) so the centered empty state fills exactly the
5
+ space below the nav instead of a full viewport — which would overflow by
6
+ the nav height and add unnecessary vertical scroll. Falls back to 0px
7
+ (full 100dvh) when embedded without a pinned host nav. */
8
+ min-height: calc(100dvh - var(--web5-window-scroll-top-offset, 0px));
9
+ padding:
10
+ clamp(1.5rem, 4vw, 3rem)
11
+ clamp(1.5rem, 4vw, 3rem)
12
+ clamp(2rem, 5vw, 3rem);
13
+ box-sizing: border-box;
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ position: relative;
18
+ overflow: hidden;
19
+ }
20
+
21
+ /* Decorative full-bleed layer behind the content (e.g. a hero image). */
22
+ .web5-empty-state__bg {
23
+ position: absolute;
24
+ inset: 0;
25
+ z-index: 0;
26
+ pointer-events: none;
27
+ overflow: hidden;
28
+ }
29
+
30
+ .web5-empty-state__inner {
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ width: 100%;
35
+ position: relative;
36
+ z-index: 1;
37
+ }
38
+
39
+ /* ── Hero (left-aligned) variant ── */
40
+ .web5-empty-state--start .web5-empty-state__inner {
41
+ justify-content: flex-start;
42
+ }
43
+
44
+ .web5-empty-state--start .web5-empty-state__content {
45
+ align-items: flex-start;
46
+ text-align: left;
47
+ width: min(100%, var(--pi-empty-start-max-w, 38rem));
48
+ }
49
+
50
+ .web5-empty-state--start .web5-empty-state__copy {
51
+ align-items: flex-start;
52
+ }
53
+
54
+ .web5-empty-state--start .web5-empty-state__prompt {
55
+ width: 100%;
56
+ }
57
+
58
+ .web5-empty-state__content {
59
+ display: flex;
60
+ flex-direction: column;
61
+ align-items: center;
62
+ gap: var(--pi-empty-stack-gap, 2rem);
63
+ width: min(100%, var(--pi-empty-max-w, 60rem));
64
+ text-align: center;
65
+ }
66
+
67
+ .web5-empty-state__copy {
68
+ display: flex;
69
+ flex-direction: column;
70
+ align-items: center;
71
+ gap: 0.875rem;
72
+ max-width: min(100%, 42rem);
73
+ }
74
+
75
+ .web5-empty-state__eyebrow {
76
+ margin: 0;
77
+ color: var(--pi-empty-eyebrow-color, var(--pi-field-text));
78
+ font-family: var(--pi-field-font-family);
79
+ font-size: 0.875rem;
80
+ font-weight: 400;
81
+ line-height: 1.4;
82
+ letter-spacing: -0.01em;
83
+ }
84
+
85
+ .web5-empty-state__title {
86
+ margin: 0;
87
+ color: var(--pi-empty-title-color, var(--pi-field-text));
88
+ font-family: var(--pi-field-font-family);
89
+ font-size: clamp(2rem, 4vw, 2.625rem);
90
+ font-weight: 600;
91
+ line-height: 1.1;
92
+ letter-spacing: -0.03em;
93
+ text-wrap: balance;
94
+ }
95
+
96
+ .web5-empty-state__description {
97
+ margin: 0;
98
+ color: var(--pi-empty-description-color, var(--pi-field-text));
99
+ font-family: var(--pi-field-font-family);
100
+ font-size: clamp(1rem, 1.3vw, 1.125rem);
101
+ line-height: 1.45;
102
+ text-wrap: pretty;
103
+ }
104
+
105
+ .web5-empty-state__prompt {
106
+ width: min(100%, 42.1875rem);
107
+ }
108
+
109
+ .web5-empty-state__prompt .web5-prompt-shell__panel {
110
+ padding-block: 0;
111
+ background: transparent;
112
+ box-shadow: none;
113
+ backdrop-filter: none;
114
+ }
115
+
116
+ .web5-empty-state__prompt .web5-prompt-shell__stack {
117
+ gap: var(--pi-stack-gap);
118
+ }
119
+
120
+ .web5-empty-state__prompt .web5-prompt-search__inner {
121
+ width: min(100%, 42.1875rem);
122
+ }
123
+
124
+ .web5-empty-state__prompt .web5-prompt-field {
125
+ /* Start as a single line; the textarea auto-grows (SearchSection) up to the
126
+ input max-height (5 lines) below. */
127
+ min-height: var(--pi-field-min-h, 3.5rem);
128
+ align-items: center;
129
+ padding: 0.75rem 1.3125rem;
130
+ border-radius: var(--pi-home-entry-field-radius, var(--pi-field-radius-multiline));
131
+ background: var(--pi-field-bg);
132
+ box-shadow: var(--pi-field-shadow);
133
+ }
134
+
135
+ .web5-empty-state__prompt .web5-prompt-input {
136
+ min-height: 1.75rem;
137
+ /* Grow up to 5 lines (5 × 1.5rem line-height), then scroll. */
138
+ max-height: 7.5rem;
139
+ padding-right: 3.375rem;
140
+ color: #52575b;
141
+ font-size: 1rem;
142
+ line-height: 1.5rem;
143
+ }
144
+
145
+ .web5-empty-state__prompt .web5-prompt-input::placeholder {
146
+ color: var(--pi-field-placeholder);
147
+ }
148
+
149
+ .web5-empty-state__prompt .web5-prompt-actions {
150
+ top: auto;
151
+ right: 0.875rem;
152
+ bottom: 0.8125rem;
153
+ transform: none;
154
+ }
155
+
156
+ @media (max-width: 48rem) {
157
+ .web5-empty-state {
158
+ padding:
159
+ 1.5rem
160
+ 1.25rem
161
+ 2rem;
162
+ }
163
+
164
+ .web5-empty-state__content {
165
+ gap: 1.5rem;
166
+ }
167
+
168
+ .web5-empty-state__copy {
169
+ max-width: 32rem;
170
+ }
171
+
172
+ }