@frankieai/react 0.1.1 → 0.1.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.
@@ -7,15 +7,23 @@
7
7
  * a CSS variable scoped to `.frankie-root`, so a host can restyle the widget
8
8
  * without touching this file.
9
9
  *
10
- * Hosts that already run Tailwind v4 can skip this file entirely and instead
11
- * add `@source "../node_modules/@frankieai/react/dist";` to their own CSS: the
12
- * widget then compiles against their design tokens.
10
+ * This stylesheet is self-contained. Widget utilities are compiled ahead of
11
+ * time and prefixed with `.frankie-root`, so they cannot style the host app.
13
12
  */
14
13
 
15
14
  @layer theme, components, utilities;
16
15
 
17
16
  @import "tailwindcss/theme.css" layer(theme);
18
- @import "tailwindcss/utilities.css" layer(utilities) source(none);
17
+
18
+ /*
19
+ * The widget is embedded inside arbitrary applications. Native CSS scoping
20
+ * keeps Tailwind's generated utilities inside the widget instead of relying on
21
+ * Tailwind's invalid selector-important import syntax (which made the whole
22
+ * utility layer disappear in production).
23
+ */
24
+ @scope (.frankie-root) {
25
+ @tailwind utilities;
26
+ }
19
27
 
20
28
  @source "../";
21
29
 
@@ -156,3 +164,164 @@
156
164
  padding: 0;
157
165
  }
158
166
  }
167
+
168
+
169
+ @layer components {
170
+ .frankie-chat-page {
171
+ display: flex;
172
+ min-width: 0;
173
+ flex-direction: column;
174
+ overflow: hidden;
175
+ background:
176
+ radial-gradient(60rem 24rem at 50% -12rem, color-mix(in srgb, var(--frankie-primary) 8%, transparent), transparent 65%),
177
+ var(--frankie-background);
178
+ color: var(--frankie-foreground);
179
+ }
180
+
181
+ .frankie-page-header {
182
+ display: flex;
183
+ min-height: 56px;
184
+ flex: 0 0 56px;
185
+ align-items: center;
186
+ justify-content: space-between;
187
+ gap: 16px;
188
+ padding: 0 24px;
189
+ border-bottom: 1px solid var(--frankie-border);
190
+ background: color-mix(in srgb, var(--frankie-background) 92%, transparent);
191
+ backdrop-filter: blur(18px);
192
+ }
193
+
194
+ .frankie-page-header > div {
195
+ display: flex;
196
+ align-items: center;
197
+ gap: 10px;
198
+ }
199
+
200
+ .frankie-page-header strong { font-size: 0.925rem; font-weight: 650; }
201
+
202
+ .frankie-page-status {
203
+ width: 10px;
204
+ height: 10px;
205
+ border-radius: 999px;
206
+ background: var(--frankie-primary);
207
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--frankie-primary) 16%, transparent);
208
+ }
209
+
210
+ .frankie-page-header button {
211
+ min-height: 36px;
212
+ padding: 0 13px;
213
+ border: 1px solid var(--frankie-border);
214
+ border-radius: calc(var(--frankie-radius) * .9);
215
+ background: var(--frankie-secondary);
216
+ cursor: pointer;
217
+ }
218
+
219
+ .frankie-page-header button:hover { border-color: var(--frankie-primary); }
220
+
221
+ .frankie-page-canvas {
222
+ display: flex;
223
+ min-width: 0;
224
+ min-height: 0;
225
+ flex: 1;
226
+ }
227
+
228
+ .frankie-page-canvas > .frankie-inline {
229
+ width: 100%;
230
+ max-width: 56rem;
231
+ margin: 0 auto;
232
+ }
233
+
234
+ .frankie-page-canvas .frankie-scroll { padding: 2rem clamp(1rem, 4vw, 4rem) 1.25rem; }
235
+ .frankie-page-canvas .frankie-root > .border-t {
236
+ padding: .75rem clamp(1rem, 4vw, 4rem) 1.5rem;
237
+ border-top: 0;
238
+ background: linear-gradient(180deg, transparent, var(--frankie-background) 30%);
239
+ }
240
+
241
+ .frankie-page-empty {
242
+ display: flex;
243
+ width: min(100%, 38rem);
244
+ min-height: 100%;
245
+ margin: auto;
246
+ padding: clamp(2rem, 7vh, 4.5rem) 1rem 2rem;
247
+ flex-direction: column;
248
+ align-items: center;
249
+ justify-content: center;
250
+ gap: 1rem;
251
+ text-align: center;
252
+ }
253
+
254
+ .frankie-page-avatar {
255
+ display: grid;
256
+ width: 48px;
257
+ height: 48px;
258
+ place-items: center;
259
+ border-radius: calc(var(--frankie-radius) * 1.4);
260
+ background: var(--frankie-primary);
261
+ color: var(--frankie-primary-foreground);
262
+ font-weight: 750;
263
+ }
264
+
265
+ .frankie-page-kicker {
266
+ margin: 0 0 .4rem;
267
+ color: var(--frankie-primary);
268
+ font-size: .7rem;
269
+ font-weight: 750;
270
+ letter-spacing: .1em;
271
+ text-transform: uppercase;
272
+ }
273
+
274
+ .frankie-page-empty h1 {
275
+ margin: 0;
276
+ font-size: clamp(1.65rem, 4vw, 2.15rem);
277
+ line-height: 1.08;
278
+ letter-spacing: -.045em;
279
+ }
280
+
281
+ .frankie-page-empty h1 + p {
282
+ margin: .6rem auto 0;
283
+ max-width: 30rem;
284
+ color: var(--frankie-muted-foreground);
285
+ }
286
+
287
+ .frankie-page-prompts {
288
+ display: grid;
289
+ width: 100%;
290
+ gap: .55rem;
291
+ margin-top: .4rem;
292
+ }
293
+
294
+ .frankie-page-prompts button {
295
+ display: grid;
296
+ min-height: 60px;
297
+ grid-template-columns: 2rem minmax(0, 1fr) auto;
298
+ align-items: center;
299
+ gap: .65rem;
300
+ padding: .75rem .9rem;
301
+ border: 1px solid var(--frankie-border);
302
+ border-radius: calc(var(--frankie-radius) * 1.25);
303
+ background: var(--frankie-secondary);
304
+ text-align: left;
305
+ cursor: pointer;
306
+ }
307
+
308
+ .frankie-page-prompts button:hover {
309
+ border-color: color-mix(in srgb, var(--frankie-primary) 58%, var(--frankie-border));
310
+ transform: translateY(-1px);
311
+ }
312
+
313
+ .frankie-page-prompts button > span {
314
+ color: var(--frankie-muted-foreground);
315
+ font-size: .68rem;
316
+ font-weight: 700;
317
+ }
318
+
319
+ .frankie-page-prompts button > strong { font-size: .875rem; }
320
+ .frankie-page-prompts button > b { color: var(--frankie-primary); font-size: 1rem; }
321
+
322
+ @media (max-width: 640px) {
323
+ .frankie-page-header { min-height: 52px; flex-basis: 52px; padding: 0 12px; }
324
+ .frankie-page-canvas .frankie-scroll { padding: 1.25rem .75rem .5rem; }
325
+ .frankie-page-canvas .frankie-root > .border-t { padding: .65rem .75rem calc(.65rem + env(safe-area-inset-bottom)); }
326
+ }
327
+ }