@designcrowd/library.brand-page 5.18.3-actionable-buttons-1 → 5.18.3-actionable-buttons-2

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 (24) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-B27yG7Im.js → CreatedOnBrandCrowd-de-de-HPO35Atc.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-D-Qt-E8d.js → CreatedOnBrandCrowd-en-us-Cl4aaalq.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-BQ1ZfmeW.js → CreatedOnBrandCrowd-es-es-B_2laZxX.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-Cx3bWshs.js → CreatedOnBrandCrowd-fr-ca-BTauzkB5.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-Cx3bWshs.js → CreatedOnBrandCrowd-fr-fr-BTauzkB5.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-DBIvSND9.js → CreatedOnBrandCrowd-pt-br-B0V4UZv3.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-DBIvSND9.js → CreatedOnBrandCrowd-pt-pt-B0V4UZv3.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-Dm_1xPJE.js → CreatedOnDcom-de-de-DvX7MlWL.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-Dx86ZBPI.js → CreatedOnDcom-en-us-BnXBQ4jL.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-FVsEih0c.js → CreatedOnDcom-es-es-lKzARICU.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-wQ_ZXFlw.js → CreatedOnDcom-fr-ca-BXBuLMp3.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-C17s3Cri.js → CreatedOnDcom-fr-fr-wUZo-ppX.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-CIGrEeSH.js → CreatedOnDcom-pt-br-Dcpf3PTV.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-BGvzTd4W.js → CreatedOnDcom-pt-pt-BUN3ynDi.js} +1 -1
  15. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +185 -182
  16. package/lib/src/css/library.brand-page-brandCrowd.min.css +9 -0
  17. package/lib/src/css/library.brand-page-brandPage.min.css +9 -0
  18. package/lib/src/css/library.brand-page-designCom.min.css +9 -0
  19. package/lib/src/css/library.brand-page-preview.min.css +9 -0
  20. package/lib/src/index.mjs +1 -1
  21. package/lib/src/{lib-MtnS_D2m.js → lib-BP3rUcsW.js} +3920 -3917
  22. package/package.json +1 -1
  23. package/src/brand-page-maker/components/ai-text-edit/AiActionButtons.vue +12 -0
  24. package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +240 -230
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-MtnS_D2m.js";
2
+ import { _ as t } from "./lib-BP3rUcsW.js";
3
3
  const i = {}, h = {
4
4
  width: "275",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-MtnS_D2m.js";
2
+ import { _ as t } from "./lib-BP3rUcsW.js";
3
3
  const i = {}, h = {
4
4
  width: "251",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-MtnS_D2m.js";
2
+ import { _ as t } from "./lib-BP3rUcsW.js";
3
3
  const i = {}, h = {
4
4
  width: "250",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-MtnS_D2m.js";
2
+ import { _ as t } from "./lib-BP3rUcsW.js";
3
3
  const i = {}, h = {
4
4
  width: "237",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-MtnS_D2m.js";
2
+ import { _ as t } from "./lib-BP3rUcsW.js";
3
3
  const i = {}, h = {
4
4
  width: "237",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-MtnS_D2m.js";
2
+ import { _ as t } from "./lib-BP3rUcsW.js";
3
3
  const i = {}, h = {
4
4
  width: "263",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-MtnS_D2m.js";
2
+ import { _ as t } from "./lib-BP3rUcsW.js";
3
3
  const i = {}, h = {
4
4
  width: "263",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-MtnS_D2m.js";
2
+ import { _ as e } from "./lib-BP3rUcsW.js";
3
3
  const M = {}, Z = {
4
4
  width: "242",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-MtnS_D2m.js";
2
+ import { _ as e } from "./lib-BP3rUcsW.js";
3
3
  const i = {}, M = {
4
4
  width: "231",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-MtnS_D2m.js";
2
+ import { _ as e } from "./lib-BP3rUcsW.js";
3
3
  const M = {}, Z = {
4
4
  width: "230",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-MtnS_D2m.js";
2
+ import { _ as e } from "./lib-BP3rUcsW.js";
3
3
  const i = {}, l = {
4
4
  width: "216",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-MtnS_D2m.js";
2
+ import { _ as e } from "./lib-BP3rUcsW.js";
3
3
  const i = {}, l = {
4
4
  width: "216",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as M } from "./lib-MtnS_D2m.js";
2
+ import { _ as M } from "./lib-BP3rUcsW.js";
3
3
  const Z = {}, e = {
4
4
  width: "232",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as M } from "./lib-MtnS_D2m.js";
2
+ import { _ as M } from "./lib-BP3rUcsW.js";
3
3
  const Z = {}, e = {
4
4
  width: "232",
5
5
  height: "36",
@@ -384,198 +384,206 @@ export function useAiWebsiteBuilderChat() {
384
384
  finishBuild();
385
385
  reject(new Error('Build timeout'));
386
386
  }, BUILD_TIMEOUT_MS);
387
- handler = (msg) => {
387
+ // Transition the build to "done" exactly once (idempotent). Returns
388
+ // false when already settled, so callers can early-return.
389
+ const markDone = () => {
388
390
  if (settled)
389
- return;
391
+ return false;
392
+ settled = true;
393
+ clearTimeout(timeout);
394
+ finishBuild();
395
+ return true;
396
+ };
397
+ // The single terminal path. Every resolve goes through here, so "where
398
+ // does this Promise settle?" has one answer.
399
+ const settle = (result) => {
400
+ if (markDone())
401
+ resolve(result);
402
+ };
403
+ // Streaming progress frames mutate the in-flight typing bubble and never
404
+ // settle the build. Returns true when `msg` was a progress frame.
405
+ const applyProgressUpdate = (msg) => {
406
+ if (msg.type === 'chat_started' && msg.message) {
407
+ withTypingMessage((m) => {
408
+ m.initialMessage = msg.message;
409
+ });
410
+ return true;
411
+ }
412
+ if (msg.type === 'plan_announced' && msg.items) {
413
+ withTypingMessage((m) => {
414
+ if (!m.planItems)
415
+ m.planItems = msg.items;
416
+ });
417
+ return true;
418
+ }
419
+ if (msg.type === 'item_complete' && msg.itemId) {
420
+ const itemId = msg.itemId;
421
+ withTypingMessage((m) => {
422
+ if (!m.completedItemIds?.includes(itemId)) {
423
+ m.completedItemIds = [...(m.completedItemIds ?? []), itemId];
424
+ }
425
+ });
426
+ return true;
427
+ }
428
+ return false;
429
+ };
430
+ // Apply one round of build tool calls: settle on completion/failure, or
431
+ // bump retryCount so the handler processes the next round's frame.
432
+ const processServerResponse = async (aiResponse) => {
433
+ const toolCalls = aiResponse.toolCalls ?? [];
390
434
  try {
391
- if (msg.buildId !== aiThreadStore.buildId)
392
- return;
393
- if (isStopped.value) {
394
- settled = true;
395
- clearTimeout(timeout);
396
- finishBuild();
397
- resolve({ text: null });
398
- return;
399
- }
400
- if (msg.type === 'chat_started' && msg.message) {
401
- withTypingMessage((m) => {
402
- m.initialMessage = msg.message;
435
+ // No tool calls = build cycle complete (success, max retries, or no retryable sections).
436
+ if (toolCalls.length === 0) {
437
+ // Defence-in-depth: empty toolCalls AND empty message is a
438
+ // degenerate response (graph reached END producing nothing). Never
439
+ // show "Your website has been updated" — it hides real failures.
440
+ const hasMeaningfulMessage = Boolean(aiResponse.message || lastAiMessage);
441
+ if (!hasMeaningfulMessage) {
442
+ raygunUtil.safeSendRaygunError(new Error('AI build server_response had empty toolCalls and empty message'), {
443
+ tags: [
444
+ 'feature:ai-website-builder',
445
+ 'failure:degenerate_server_response',
446
+ ],
447
+ customData: {
448
+ build_id: aiThreadStore.buildId ?? null,
449
+ thread_id: aiThreadStore.threadId ?? null,
450
+ },
451
+ });
452
+ settle({
453
+ text: 'Something went wrong while updating your website. Please try again.',
454
+ isError: true,
455
+ });
456
+ return;
457
+ }
458
+ // Mark settled BEFORE the await so concurrent frames are ignored.
459
+ if (!markDone())
460
+ return;
461
+ await snapshotStore.refreshSnapshotAsync();
462
+ resolve({
463
+ text: aiResponse.message || lastAiMessage || '',
464
+ actions: lastActions,
403
465
  });
404
466
  return;
405
467
  }
406
- if (msg.type === 'plan_announced' && msg.items) {
407
- withTypingMessage((m) => {
408
- if (!m.planItems)
409
- m.planItems = msg.items;
468
+ // Tool calls present — apply locally and submit results back.
469
+ const { toolResults, aiMessage } = await applyToolCallsAsync(aiResponse, userMessageId, vacantSlots);
470
+ lastAiMessage = aiMessage;
471
+ // Submit all tool results (success + failure) so the AI pipeline
472
+ // persists ToolMessages matching every tool_call in the conversation.
473
+ const failedResults = toolResults.filter((tr) => tr.success !== 'success');
474
+ aiLogger.log('tool submission for results', {
475
+ total: toolResults.length,
476
+ failed: failedResults.length,
477
+ failedResults,
478
+ retryCount,
479
+ });
480
+ const submitResult = await client.submitToolResultsBuildAsync(aiThreadStore.threadId, {
481
+ toolCalls: toolResults,
482
+ agentType: AI_ASSISTANT_AGENT_TYPES.WEBSITE_BUILDER,
483
+ connectionId,
484
+ retryCount,
485
+ userPlan,
486
+ });
487
+ if (failedResults.length === 0) {
488
+ settle({
489
+ text: aiMessage || 'Your website has been updated.',
490
+ actions: lastActions,
410
491
  });
411
492
  return;
412
493
  }
413
- if (msg.type === 'item_complete' && msg.itemId) {
414
- const itemId = msg.itemId;
415
- withTypingMessage((m) => {
416
- if (!m.completedItemIds?.includes(itemId)) {
417
- m.completedItemIds = [...(m.completedItemIds ?? []), itemId];
418
- }
419
- });
494
+ // Failed sections will retry: refresh buildId so the handler matches
495
+ // the next round's frames, and count the round.
496
+ if (submitResult.buildId) {
497
+ aiThreadStore.buildId = submitResult.buildId;
498
+ }
499
+ retryCount += 1;
500
+ }
501
+ catch (err) {
502
+ aiLogger.log('server_response apply error', { err });
503
+ // Client-side apply failure (metadata builder, tool-call parser,
504
+ // missing field, etc.) — the server thinks the build succeeded but we
505
+ // couldn't materialise the changes. Surface it and report to Raygun
506
+ // (the server didn't see this failure).
507
+ raygunUtil.safeSendRaygunError(err instanceof Error
508
+ ? err
509
+ : new Error('AI apply failed: non-Error thrown'), {
510
+ tags: [
511
+ 'feature:ai-website-builder',
512
+ 'failure:apply_error',
513
+ 'stage:client_apply',
514
+ ],
515
+ customData: {
516
+ thread_id: aiThreadStore.threadId ?? null,
517
+ build_id: aiThreadStore.buildId ?? null,
518
+ },
519
+ });
520
+ settle({
521
+ text: "I couldn't apply those changes to your website. Please try again.",
522
+ isError: true,
523
+ });
524
+ }
525
+ };
526
+ const handleBuildError = (msg) => {
527
+ if (!markDone())
528
+ return;
529
+ // Backend already reports the underlying pipeline failure to Raygun
530
+ // (with full traceback). We report the frontend's RECEIPT of the error
531
+ // frame as a separate signal — distinct tag/grouping — for triangulation:
532
+ // both sides → normal crash; frontend only → backend Raygun outage;
533
+ // backend only → WS frame didn't reach client.
534
+ const wsMsg = msg;
535
+ raygunUtil.safeSendRaygunError(new Error(`AI build ${wsMsg.type}: ${wsMsg.code ?? wsMsg.error ?? 'unknown'}`), {
536
+ tags: [
537
+ 'feature:ai-website-builder',
538
+ 'failure:websocket_error_received',
539
+ `frame_type:${wsMsg.type}`,
540
+ ],
541
+ customData: {
542
+ code: wsMsg.code ?? null,
543
+ message: wsMsg.message ?? null,
544
+ error: wsMsg.error ?? null,
545
+ build_id: wsMsg.buildId ?? null,
546
+ thread_id: aiThreadStore.threadId ?? null,
547
+ },
548
+ });
549
+ resolve({ text: pickWsErrorMessage(msg), isError: true });
550
+ };
551
+ // Single dispatch point: ignore stale/already-settled frames, then route
552
+ // by frame kind. Progress frames update the bubble; server_response and
553
+ // error frames are the only ones that can settle the build.
554
+ handler = (msg) => {
555
+ if (settled)
556
+ return;
557
+ try {
558
+ if (msg.buildId !== aiThreadStore.buildId)
559
+ return;
560
+ if (isStopped.value) {
561
+ settle({ text: null });
420
562
  return;
421
563
  }
564
+ if (applyProgressUpdate(msg))
565
+ return;
422
566
  if (msg.type === 'server_response') {
423
- // CTA buttons (e.g. Upgrade) ride in toolCalls alongside page
424
- // mutations, but they are presentation, not page edits. Split them
425
- // so only real mutations reach the metadata-builder and the tool-
426
- // result submission — a UI action must never be answered with a tool
427
- // result (it isn't in the agent's conversation), or the next turn fails.
428
- const { mutationToolCalls, actions: extractedActions } = partitionAiToolCalls((msg.toolCalls || []));
429
- if (extractedActions.length) {
430
- lastActions = extractedActions;
431
- }
432
- const toolCalls = mutationToolCalls;
433
- const aiResponse = {
567
+ // CTA buttons (e.g. Upgrade) ride in toolCalls but are presentation,
568
+ // not page edits. Split them out so only real mutations reach the
569
+ // metadata-builder and the tool-result submission — a UI action must
570
+ // never be answered with a tool result (it isn't in the agent's
571
+ // conversation), or the next turn on the thread fails.
572
+ const { mutationToolCalls, actions } = partitionAiToolCalls((msg.toolCalls || []));
573
+ if (actions.length)
574
+ lastActions = actions;
575
+ void processServerResponse({
434
576
  threadId: aiThreadStore.threadId || '',
435
- toolCalls,
577
+ toolCalls: mutationToolCalls,
436
578
  message: msg.message || null,
437
579
  type: 'tool_calls',
438
580
  totalPaidToolCalls: 0,
439
581
  timestamp: Date.now(),
440
- };
441
- (async () => {
442
- try {
443
- // No tool calls = build cycle complete (success, max retries, or no retryable sections)
444
- if (toolCalls.length === 0) {
445
- // Defence-in-depth: a server_response with no toolCalls AND
446
- // no message text is a degenerate response — it means the
447
- // backend graph reached END without producing anything
448
- // actionable. The server-side fix in stream_with_push now
449
- // converts this to a build_error frame, but if a future
450
- // regression slips through we must NOT show "Your website
451
- // has been updated" — that hides real failures from users
452
- // and from monitoring.
453
- const hasMeaningfulMessage = Boolean(aiResponse.message || lastAiMessage);
454
- if (!hasMeaningfulMessage) {
455
- raygunUtil.safeSendRaygunError(new Error('AI build server_response had empty toolCalls and empty message'), {
456
- tags: [
457
- 'feature:ai-website-builder',
458
- 'failure:degenerate_server_response',
459
- ],
460
- customData: {
461
- build_id: aiThreadStore.buildId ?? null,
462
- thread_id: aiThreadStore.threadId ?? null,
463
- },
464
- });
465
- settled = true;
466
- clearTimeout(timeout);
467
- finishBuild();
468
- resolve({
469
- text: 'Something went wrong while updating your website. Please try again.',
470
- isError: true,
471
- });
472
- return;
473
- }
474
- settled = true;
475
- clearTimeout(timeout);
476
- finishBuild();
477
- await snapshotStore.refreshSnapshotAsync();
478
- resolve({
479
- text: aiResponse.message || lastAiMessage || '',
480
- actions: lastActions,
481
- });
482
- return;
483
- }
484
- // Tool calls present — apply locally and submit results back
485
- const { toolResults, aiMessage } = await applyToolCallsAsync(aiResponse, userMessageId, vacantSlots);
486
- lastAiMessage = aiMessage;
487
- // Submit all tool results (success + failure) so the AI pipeline
488
- // persists ToolMessages matching every tool_call in the conversation.
489
- const failedResults = toolResults.filter((tr) => tr.success !== 'success');
490
- aiLogger.log('tool submission for results', {
491
- total: toolResults.length,
492
- failed: failedResults.length,
493
- failedResults,
494
- retryCount,
495
- });
496
- const submitResult = await client.submitToolResultsBuildAsync(aiThreadStore.threadId, {
497
- toolCalls: toolResults,
498
- agentType: AI_ASSISTANT_AGENT_TYPES.WEBSITE_BUILDER,
499
- connectionId,
500
- retryCount,
501
- userPlan,
502
- });
503
- if (failedResults.length === 0) {
504
- settled = true;
505
- clearTimeout(timeout);
506
- finishBuild();
507
- resolve({
508
- text: aiMessage || 'Your website has been updated.',
509
- actions: lastActions,
510
- });
511
- return;
512
- }
513
- // Update buildId so the handler matches subsequent WS messages
514
- if (submitResult.buildId) {
515
- aiThreadStore.buildId = submitResult.buildId;
516
- }
517
- // eslint-disable-next-line no-plusplus
518
- retryCount++;
519
- }
520
- catch (err) {
521
- aiLogger.log('server_response apply error', { err });
522
- // Client-side apply failure (metadata builder, tool-call parser,
523
- // missing field, etc.) — server thinks the build succeeded but we
524
- // couldn't materialise the changes. Mark the chat bubble as an
525
- // error so the user sees the real outcome, and report to Raygun
526
- // so the failure is visible in monitoring (the server didn't see it).
527
- raygunUtil.safeSendRaygunError(err instanceof Error
528
- ? err
529
- : new Error('AI apply failed: non-Error thrown'), {
530
- tags: [
531
- 'feature:ai-website-builder',
532
- 'failure:apply_error',
533
- 'stage:client_apply',
534
- ],
535
- customData: {
536
- thread_id: aiThreadStore.threadId ?? null,
537
- build_id: aiThreadStore.buildId ?? null,
538
- },
539
- });
540
- settled = true;
541
- clearTimeout(timeout);
542
- finishBuild();
543
- resolve({
544
- text: "I couldn't apply those changes to your website. Please try again.",
545
- isError: true,
546
- });
547
- }
548
- })();
582
+ });
549
583
  return;
550
584
  }
551
585
  if (msg.type === 'server_error' || msg.type === 'build_error') {
552
- settled = true;
553
- clearTimeout(timeout);
554
- finishBuild();
555
- // Backend already reports the underlying pipeline failure to
556
- // Raygun via its structured handler (stage:run_build /
557
- // stage:section_builder / etc. with full Python traceback).
558
- // We report the frontend's RECEIPT of the error frame as a
559
- // separate signal — distinct tag, distinct grouping. This
560
- // gives triangulation: both sides have entry → normal crash;
561
- // frontend only → backend Raygun outage; backend only → WS
562
- // frame didn't reach client (different bug shape).
563
- const wsMsg = msg;
564
- raygunUtil.safeSendRaygunError(new Error(`AI build ${wsMsg.type}: ${wsMsg.code ?? wsMsg.error ?? 'unknown'}`), {
565
- tags: [
566
- 'feature:ai-website-builder',
567
- 'failure:websocket_error_received',
568
- `frame_type:${wsMsg.type}`,
569
- ],
570
- customData: {
571
- code: wsMsg.code ?? null,
572
- message: wsMsg.message ?? null,
573
- error: wsMsg.error ?? null,
574
- build_id: wsMsg.buildId ?? null,
575
- thread_id: aiThreadStore.threadId ?? null,
576
- },
577
- });
578
- resolve({ text: pickWsErrorMessage(msg), isError: true });
586
+ handleBuildError(msg);
579
587
  return;
580
588
  }
581
589
  }
@@ -584,15 +592,10 @@ export function useAiWebsiteBuilderChat() {
584
592
  err,
585
593
  type: msg.type,
586
594
  });
587
- if (!settled) {
588
- settled = true;
589
- clearTimeout(timeout);
590
- finishBuild();
591
- resolve({
592
- text: 'An error occurred during the build.',
593
- isError: true,
594
- });
595
- }
595
+ settle({
596
+ text: 'An error occurred during the build.',
597
+ isError: true,
598
+ });
596
599
  }
597
600
  };
598
601
  wsClient.onMessage(handler);
@@ -9364,6 +9364,15 @@ input.dynamic-width-input[data-v-97be2e87]:focus {
9364
9364
  margin-bottom: 1.5rem
9365
9365
  }
9366
9366
 
9367
+ /* The upgrade glyph (`upgrade-alt`) is a hairline faceted gem that barely reads
9368
+ at button size. Give it a stroke in the current text colour so the icon is
9369
+ distinguishable from afar. Scoped to the CTA button via the `ai-cta-button`
9370
+ class passed to the design-system Button. */
9371
+ [data-v-4067f968] .ai-cta-button svg path {
9372
+ stroke: currentColor;
9373
+ stroke-width: 1;
9374
+ }
9375
+
9367
9376
  .shimmer-text[data-v-7a203d2a] {
9368
9377
  background: -webkit-gradient(
9369
9378
  linear,
@@ -9698,6 +9698,15 @@ input.dynamic-width-input[data-v-97be2e87]:focus {
9698
9698
  margin-bottom: 1.5rem
9699
9699
  }
9700
9700
 
9701
+ /* The upgrade glyph (`upgrade-alt`) is a hairline faceted gem that barely reads
9702
+ at button size. Give it a stroke in the current text colour so the icon is
9703
+ distinguishable from afar. Scoped to the CTA button via the `ai-cta-button`
9704
+ class passed to the design-system Button. */
9705
+ [data-v-4067f968] .ai-cta-button svg path {
9706
+ stroke: currentColor;
9707
+ stroke-width: 1;
9708
+ }
9709
+
9701
9710
  .shimmer-text[data-v-7a203d2a] {
9702
9711
  background: -webkit-gradient(
9703
9712
  linear,
@@ -9394,6 +9394,15 @@ input.dynamic-width-input[data-v-97be2e87]:focus {
9394
9394
  margin-bottom: 1.5rem
9395
9395
  }
9396
9396
 
9397
+ /* The upgrade glyph (`upgrade-alt`) is a hairline faceted gem that barely reads
9398
+ at button size. Give it a stroke in the current text colour so the icon is
9399
+ distinguishable from afar. Scoped to the CTA button via the `ai-cta-button`
9400
+ class passed to the design-system Button. */
9401
+ [data-v-4067f968] .ai-cta-button svg path {
9402
+ stroke: currentColor;
9403
+ stroke-width: 1;
9404
+ }
9405
+
9397
9406
  .shimmer-text[data-v-7a203d2a] {
9398
9407
  background: -webkit-gradient(
9399
9408
  linear,
@@ -9108,6 +9108,15 @@ input.dynamic-width-input[data-v-97be2e87]:focus {
9108
9108
  margin-bottom: 1.5rem
9109
9109
  }
9110
9110
 
9111
+ /* The upgrade glyph (`upgrade-alt`) is a hairline faceted gem that barely reads
9112
+ at button size. Give it a stroke in the current text colour so the icon is
9113
+ distinguishable from afar. Scoped to the CTA button via the `ai-cta-button`
9114
+ class passed to the design-system Button. */
9115
+ [data-v-4067f968] .ai-cta-button svg path {
9116
+ stroke: currentColor;
9117
+ stroke-width: 1;
9118
+ }
9119
+
9111
9120
  .bp .shimmer-text[data-v-7a203d2a] {
9112
9121
  background: -webkit-gradient(
9113
9122
  linear,
package/lib/src/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as E, a as T, b as s, c as I, d as S, e as N, f as e, B as A, g as O, h as C, i as G, j as D, k as P, l as t, m as R, n as L, o as M, p as o, q as r, r as b, s as n, t as F, u as i, v as l, w as g, x as B, y as c, z as Y, C as U, D as d, E as u, F as H, G as p, H as y, I as K, J as k, K as m, L as V, M as X, N as h, O as v, P as W, Q as f, R as x, S as z, T as w, U as Z, V as j, W as Q, X as q, Y as J, Z as $, $ as aa, a0 as _a, a1 as Ea, a2 as Ta, a3 as sa, a4 as Ia, a5 as Sa, a6 as Na, a7 as ea, a8 as Aa, a9 as Oa, aa as Ca, ab as Ga, ac as Da, ad as Pa, ae as ta, af as Ra, ag as La, ah as Ma, ai as oa, aj as ra, ak as ba, al as na, am as Fa, an as ia, ao as la, ap as ga, aq as Ba, ar as ca, as as Ya, at as Ua, au as da, av as ua, aw as Ha, ax as pa, ay as ya, az as Ka, aA as ka, aB as ma, aC as Va, aD as Xa, aE as ha, aF as va, aG as Wa, aH as fa, aI as xa, aJ as za, aK as wa, aL as Za, aM as ja, aN as Qa, aO as qa, aP as Ja, aQ as $a, aR as a_, aS as __, aT as E_, aU as T_, aV as s_, aW as I_, aX as S_, aY as N_, aZ as e_, a_ as A_, a$ as O_, b0 as C_, b1 as G_, b2 as D_, b3 as P_, b4 as t_, b5 as R_, b6 as L_, b7 as M_, b8 as o_, b9 as r_, ba as b_, bb as n_, bc as F_, bd as i_, be as l_, bf as g_, bg as B_, bh as c_, bi as Y_, bj as U_, bk as d_, bl as u_, bm as H_, bn as p_, bo as y_, bp as K_, bq as k_, br as m_, bs as V_, bt as X_, bu as h_, bv as v_, bw as W_, bx as f_, by as x_, bz as z_, bA as w_, bB as Z_, bC as j_, bD as Q_, bE as q_, bF as J_, bG as $_, bH as aE, bI as _E, bJ as EE, bK as TE, bL as sE, bM as IE, bN as SE, bO as NE, bP as eE, bQ as AE, bR as OE, bS as CE, bT as GE, bU as DE, bV as PE, bW as tE, bX as RE, bY as LE, bZ as ME, b_ as oE, b$ as rE, c0 as bE, c1 as nE, c2 as FE, c3 as iE, c4 as lE, c5 as gE, c6 as BE, c7 as cE, c8 as YE, c9 as UE, ca as dE, cb as uE, cc as HE, cd as pE, ce as yE, cf as KE, cg as kE, ch as mE, ci as VE, cj as XE, ck as hE, cl as vE, cm as WE, cn as fE, co as xE } from "./lib-MtnS_D2m.js";
1
+ import { A as E, a as T, b as s, c as I, d as S, e as N, f as e, B as A, g as O, h as C, i as G, j as D, k as P, l as t, m as R, n as L, o as M, p as o, q as r, r as b, s as n, t as F, u as i, v as l, w as g, x as B, y as c, z as Y, C as U, D as d, E as u, F as H, G as p, H as y, I as K, J as k, K as m, L as V, M as X, N as h, O as v, P as W, Q as f, R as x, S as z, T as w, U as Z, V as j, W as Q, X as q, Y as J, Z as $, $ as aa, a0 as _a, a1 as Ea, a2 as Ta, a3 as sa, a4 as Ia, a5 as Sa, a6 as Na, a7 as ea, a8 as Aa, a9 as Oa, aa as Ca, ab as Ga, ac as Da, ad as Pa, ae as ta, af as Ra, ag as La, ah as Ma, ai as oa, aj as ra, ak as ba, al as na, am as Fa, an as ia, ao as la, ap as ga, aq as Ba, ar as ca, as as Ya, at as Ua, au as da, av as ua, aw as Ha, ax as pa, ay as ya, az as Ka, aA as ka, aB as ma, aC as Va, aD as Xa, aE as ha, aF as va, aG as Wa, aH as fa, aI as xa, aJ as za, aK as wa, aL as Za, aM as ja, aN as Qa, aO as qa, aP as Ja, aQ as $a, aR as a_, aS as __, aT as E_, aU as T_, aV as s_, aW as I_, aX as S_, aY as N_, aZ as e_, a_ as A_, a$ as O_, b0 as C_, b1 as G_, b2 as D_, b3 as P_, b4 as t_, b5 as R_, b6 as L_, b7 as M_, b8 as o_, b9 as r_, ba as b_, bb as n_, bc as F_, bd as i_, be as l_, bf as g_, bg as B_, bh as c_, bi as Y_, bj as U_, bk as d_, bl as u_, bm as H_, bn as p_, bo as y_, bp as K_, bq as k_, br as m_, bs as V_, bt as X_, bu as h_, bv as v_, bw as W_, bx as f_, by as x_, bz as z_, bA as w_, bB as Z_, bC as j_, bD as Q_, bE as q_, bF as J_, bG as $_, bH as aE, bI as _E, bJ as EE, bK as TE, bL as sE, bM as IE, bN as SE, bO as NE, bP as eE, bQ as AE, bR as OE, bS as CE, bT as GE, bU as DE, bV as PE, bW as tE, bX as RE, bY as LE, bZ as ME, b_ as oE, b$ as rE, c0 as bE, c1 as nE, c2 as FE, c3 as iE, c4 as lE, c5 as gE, c6 as BE, c7 as cE, c8 as YE, c9 as UE, ca as dE, cb as uE, cc as HE, cd as pE, ce as yE, cf as KE, cg as kE, ch as mE, ci as VE, cj as XE, ck as hE, cl as vE, cm as WE, cn as fE, co as xE } from "./lib-BP3rUcsW.js";
2
2
  import { createPinia as wE, setActivePinia as ZE } from "pinia";
3
3
  export {
4
4
  E as ABOUT_SECTION_SETTINGS_CONFIG,