visual-comments 0.0.0-stage → 0.2.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 (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -2
  3. package/dist/cli/index.d.ts +2 -0
  4. package/dist/cli/index.js +477 -0
  5. package/dist/core/aim.d.ts +21 -0
  6. package/dist/core/aim.js +21 -0
  7. package/dist/core/api.d.ts +5 -0
  8. package/dist/core/api.js +11 -0
  9. package/dist/core/metaball.d.ts +15 -0
  10. package/dist/core/metaball.js +42 -0
  11. package/dist/core/presence.d.ts +13 -0
  12. package/dist/core/presence.js +25 -0
  13. package/dist/core/surfaces.d.ts +95 -0
  14. package/dist/core/surfaces.js +197 -0
  15. package/dist/core/target.d.ts +59 -0
  16. package/dist/core/target.js +382 -0
  17. package/dist/core/threads.svelte.d.ts +80 -0
  18. package/dist/core/threads.svelte.js +336 -0
  19. package/dist/core/time.d.ts +3 -0
  20. package/dist/core/time.js +25 -0
  21. package/dist/index.d.ts +5 -0
  22. package/dist/index.js +6 -0
  23. package/dist/server/env.d.ts +78 -0
  24. package/dist/server/env.js +94 -0
  25. package/dist/server/index.d.ts +34 -0
  26. package/dist/server/index.js +74 -0
  27. package/dist/server/variables.d.ts +28 -0
  28. package/dist/server/variables.js +73 -0
  29. package/dist/shared/limits.d.ts +9 -0
  30. package/dist/shared/limits.js +10 -0
  31. package/dist/shared/protocol.d.ts +6 -0
  32. package/dist/shared/protocol.js +7 -0
  33. package/dist/shared/types.d.ts +157 -0
  34. package/dist/shared/types.js +2 -0
  35. package/dist/sveltekit/CommentTools.svelte +98 -0
  36. package/dist/sveltekit/CommentTools.svelte.d.ts +6 -0
  37. package/dist/sveltekit/Comments.svelte +104 -0
  38. package/dist/sveltekit/Comments.svelte.d.ts +25 -0
  39. package/dist/sveltekit/Toolbar.svelte +64 -0
  40. package/dist/sveltekit/Toolbar.svelte.d.ts +13 -0
  41. package/dist/sveltekit/ToolbarButton.svelte +66 -0
  42. package/dist/sveltekit/ToolbarButton.svelte.d.ts +12 -0
  43. package/dist/sveltekit/context.d.ts +16 -0
  44. package/dist/sveltekit/context.js +9 -0
  45. package/dist/sveltekit/index.d.ts +6 -0
  46. package/dist/sveltekit/index.js +6 -0
  47. package/dist/ui/Account.svelte +106 -0
  48. package/dist/ui/Account.svelte.d.ts +8 -0
  49. package/dist/ui/App.svelte +77 -0
  50. package/dist/ui/App.svelte.d.ts +7 -0
  51. package/dist/ui/Avatar.svelte +64 -0
  52. package/dist/ui/Avatar.svelte.d.ts +11 -0
  53. package/dist/ui/Composer.svelte +267 -0
  54. package/dist/ui/Composer.svelte.d.ts +20 -0
  55. package/dist/ui/Connect.svelte +128 -0
  56. package/dist/ui/Connect.svelte.d.ts +6 -0
  57. package/dist/ui/Icon.svelte +44 -0
  58. package/dist/ui/Icon.svelte.d.ts +29 -0
  59. package/dist/ui/Menu.svelte +69 -0
  60. package/dist/ui/Menu.svelte.d.ts +15 -0
  61. package/dist/ui/MenuItem.svelte +38 -0
  62. package/dist/ui/MenuItem.svelte.d.ts +12 -0
  63. package/dist/ui/Overlay.svelte +502 -0
  64. package/dist/ui/Overlay.svelte.d.ts +3 -0
  65. package/dist/ui/Panel.svelte +220 -0
  66. package/dist/ui/Panel.svelte.d.ts +10 -0
  67. package/dist/ui/Pin.svelte +156 -0
  68. package/dist/ui/Pin.svelte.d.ts +15 -0
  69. package/dist/ui/Presence.svelte +43 -0
  70. package/dist/ui/Presence.svelte.d.ts +8 -0
  71. package/dist/ui/ThreadCard.svelte +201 -0
  72. package/dist/ui/ThreadCard.svelte.d.ts +13 -0
  73. package/dist/ui/Toolbar.svelte +35 -0
  74. package/dist/ui/Toolbar.svelte.d.ts +18 -0
  75. package/dist/ui/context.d.ts +3 -0
  76. package/dist/ui/context.js +8 -0
  77. package/dist/ui/generated/styles.css +2 -0
  78. package/dist/ui/generated/styles.d.ts +2 -0
  79. package/dist/ui/generated/styles.js +3 -0
  80. package/dist/ui/styles.css +113 -0
  81. package/dist/ui/text.d.ts +5 -0
  82. package/dist/ui/text.js +11 -0
  83. package/dist/visual-comments.svelte.d.ts +230 -0
  84. package/dist/visual-comments.svelte.js +693 -0
  85. package/dist/vite/index.d.ts +20 -0
  86. package/dist/vite/index.js +78 -0
  87. package/dist-widget/visual-comments.js +58 -0
  88. package/package.json +86 -3
@@ -0,0 +1,35 @@
1
+ <!-- The floating toolbar: comment mode and the account, at the bottom of the window. -->
2
+ <script lang="ts">
3
+ import Account from './Account.svelte';
4
+ import { useComments } from './context.js';
5
+ import Icon from './Icon.svelte';
6
+
7
+ const vc = useComments();
8
+ </script>
9
+
10
+ <div data-vc-ui class="pointer-events-auto absolute bottom-4 left-1/2 flex -translate-x-1/2 flex-col items-center gap-2">
11
+ {#if vc.store.error && !vc.active}
12
+ <div role="alert" class="flex max-w-80 items-start gap-2 rounded-[8px] bg-vc-ink px-3 py-2 text-white shadow-lg">
13
+ <p class="flex-1">{vc.store.error}</p>
14
+ <button type="button" class="text-white/70 hover:text-white" aria-label="Dismiss" onclick={() => (vc.store.error = null)}>
15
+ <Icon name="close" size={14} />
16
+ </button>
17
+ </div>
18
+ {/if}
19
+ <div class="flex items-center gap-0.5 rounded-full bg-vc-island p-1 text-vc-island-ink shadow-[0_2px_10px_rgb(0_0_0/0.2)] backdrop-blur-[5px]">
20
+ <button
21
+ type="button"
22
+ class="vc-island-tool relative"
23
+ aria-pressed={vc.active}
24
+ aria-label="Comments"
25
+ title="Comments{vc.options.shortcut === false ? '' : ` (${(vc.options.shortcut ?? 'c').toUpperCase()})`}"
26
+ onclick={() => vc.toggle()}
27
+ >
28
+ <Icon name="comment" />
29
+ {#if vc.unreadCount && !vc.active}
30
+ <span class="absolute top-1 right-1 size-2 rounded-full bg-vc-comment"></span>
31
+ {/if}
32
+ </button>
33
+ <Account {vc} />
34
+ </div>
35
+ </div>
@@ -0,0 +1,18 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const Toolbar: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type Toolbar = InstanceType<typeof Toolbar>;
18
+ export default Toolbar;
@@ -0,0 +1,3 @@
1
+ import type { VisualComments } from '../visual-comments.svelte.js';
2
+ export declare function setComments(vc: VisualComments): void;
3
+ export declare function useComments(): VisualComments;
@@ -0,0 +1,8 @@
1
+ import { getContext, setContext } from 'svelte';
2
+ const KEY = Symbol('visual-comments');
3
+ export function setComments(vc) {
4
+ setContext(KEY, vc);
5
+ }
6
+ export function useComments() {
7
+ return getContext(KEY);
8
+ }
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-600:oklch(57.7% .245 27.325);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--font-weight-semibold:600;--leading-tight:1.25;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-vc:var(--vc-font,var(--vc-font-default));--color-vc-ink:var(--vc-ink,#292524);--color-vc-muted:var(--vc-muted,#78716c);--color-vc-wash:var(--vc-wash,#e7e5e4);--color-vc-accent:var(--vc-accent,#57534e);--color-vc-avatar:var(--vc-avatar,#009aaa);--color-vc-comment:var(--vc-comment,#0d99ff);--color-vc-island-ink:var(--vc-island-ink,#fff);--color-vc-island-hover:var(--vc-island-hover,#ffffff24);--color-vc-working:var(--vc-working,var(--vc-comment,#0d99ff))}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:host{font-family:var(--font-vc);color:var(--color-vc-ink);-webkit-font-smoothing:antialiased;font-size:13px;line-height:1.4}.vc-ui{cursor:auto!important}.vc-ui button,.vc-ui a,.vc-ui [role=menuitem]{cursor:pointer}}@layer components{.vc-tool{border-radius:.125rem;outline:none;justify-content:center;align-items:center;min-width:1.75rem;height:1.75rem;display:inline-flex}.vc-tool:hover{background:var(--color-vc-wash)}.vc-tool:focus-visible{box-shadow:0 0 0 2px var(--color-vc-accent)}.vc-island-tool{min-width:2rem;height:2rem;color:var(--color-vc-island-ink);border-radius:9999px;outline:none;justify-content:center;align-items:center;gap:.375rem;display:inline-flex}.vc-island-tool:hover,.vc-island-tool[aria-expanded=true]{background:var(--color-vc-island-hover)}.vc-island-tool[aria-pressed=true]{background:var(--color-vc-island-ink);color:var(--color-vc-ink)}.vc-island-tool:focus-visible{box-shadow:0 0 0 2px #fff9}.vc-comment-cursor{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'%3E%3Cpath d='M14 1.5a12.5 12.5 0 1 1 0 25H1.5V14A12.5 12.5 0 0 1 14 1.5z' fill='white' stroke='%231c1917' stroke-width='1.5'/%3E%3Cpath d='M14 9v10M9 14h10' stroke='%231c1917' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") 1 27,crosshair}.vc-working{animation:1.6s ease-out infinite vc-working}@keyframes vc-working{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--color-vc-working) 70%, transparent)}to{box-shadow:0 0 0 9px color-mix(in srgb, var(--color-vc-working) 0%, transparent)}}@media (prefers-reduced-motion:reduce){.vc-working{box-shadow:0 0 0 2px var(--color-vc-working);animation:none}}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.inset-auto{inset:auto}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.right-0\.5{right:calc(var(--spacing) * .5)}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-4{bottom:calc(var(--spacing) * 4)}.-left-2{left:calc(var(--spacing) * -2)}.left-1\/2{left:50%}.left-\[42px\]{left:42px}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.m-0{margin:0}.m-2{margin:calc(var(--spacing) * 2)}.m-auto{margin:auto}.my-1{margin-block:var(--spacing)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-\[3px\]{margin-top:3px}.ml-1{margin-left:var(--spacing)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-full{width:100%;height:100%}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-11{height:calc(var(--spacing) * 11)}.h-auto{height:auto}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[min\(70vh\,560px\)\]{max-height:min(70vh,560px)}.min-h-0{min-height:0}.w-4{width:calc(var(--spacing) * 4)}.w-40{width:calc(var(--spacing) * 40)}.w-80{width:calc(var(--spacing) * 80)}.w-\[296px\]{width:296px}.w-\[320px\]{width:320px}.w-\[360px\]{width:360px}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.max-w-72{max-width:calc(var(--spacing) * 72)}.max-w-80{max-width:calc(var(--spacing) * 80)}.max-w-\[240px\]{max-width:240px}.max-w-\[296px\]{max-width:296px}.max-w-\[calc\(100vw-24px\)\]{max-width:calc(100vw - 24px)}.min-w-0{min-width:0}.min-w-52{min-width:calc(var(--spacing) * 52)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-none\!{cursor:none!important}.resize-none{resize:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.self-center{align-self:center}.self-end{align-self:flex-end}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[12px\]{border-radius:12px}.rounded-\[14px\]{border-radius:14px}.rounded-\[18px\]{border-radius:18px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-vc-comment{border-color:var(--vc-comment,#0d99ff)}.border-vc-comment\!{border-color:var(--vc-comment,#0d99ff)!important}.border-vc-line,.border-vc-line\/70{border-color:var(--vc-line,#d6d3d1)}@supports (color:color-mix(in lab, red, red)){.border-vc-line\/70{border-color:color-mix(in oklab, var(--vc-line,#d6d3d1) 70%, transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.border-white\/10{border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.border-t-transparent{border-top-color:#0000}.bg-\[\#d9d9d9\]{background-color:#d9d9d9}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-current\/15{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.bg-current\/15{background-color:color-mix(in oklab, currentcolor 15%, transparent)}}.bg-transparent{background-color:#0000}.bg-vc-agent{background-color:var(--vc-agent,#292524)}.bg-vc-comment{background-color:var(--vc-comment,#0d99ff)}.bg-vc-comment-soft{background-color:var(--vc-comment-soft,#e5f4ff)}.bg-vc-ink{background-color:var(--vc-ink,#292524)}.bg-vc-island{background-color:var(--vc-island,#323232b8)}.bg-vc-surface{background-color:var(--vc-surface,#f5f5f4)}.bg-white{background-color:var(--color-white)}.bg-white\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.bg-white\/85{background-color:color-mix(in oklab, var(--color-white) 85%, transparent)}}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-\[3px\]{padding-block:3px}.py-\[5px\]{padding-block:5px}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pr-0\.5{padding-right:calc(var(--spacing) * .5)}.pr-1{padding-right:var(--spacing)}.pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-\[3px\]{padding-right:3px}.pr-\[5px\]{padding-right:5px}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pl-0\.5{padding-left:calc(var(--spacing) * .5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-3\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-vc{font-family:var(--vc-font,var(--vc-font-default))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[18px\]{--tw-leading:18px;line-height:18px}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-red-600{color:var(--color-red-600)}.text-vc-accent{color:var(--vc-accent,#57534e)}.text-vc-comment{color:var(--vc-comment,#0d99ff)}.text-vc-ink{color:var(--vc-ink,#292524)}.text-vc-island-ink{color:var(--vc-island-ink,#fff)}.text-vc-muted{color:var(--vc-muted,#78716c)}.text-vc-working{color:var(--vc-working,var(--vc-comment,#0d99ff))}.text-white{color:var(--color-white)}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.text-white\/70{color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.text-white\/90{color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_3px_rgb\(0_0_0\/0\.12\)\]{--tw-shadow:0 1px 3px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_4px_rgb\(0_0_0\/0\.3\)\]{--tw-shadow:0 1px 4px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_6px_rgb\(0_0_0\/0\.16\)\]{--tw-shadow:0 1px 6px var(--tw-shadow-color,#00000029);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_2px_10px_rgb\(0_0_0\/0\.2\)\]{--tw-shadow:0 2px 10px var(--tw-shadow-color,#0003);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_2px_14px_rgb\(0_0_0\/0\.18\)\]{--tw-shadow:0 2px 14px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_4px_24px_rgb\(0_0_0\/0\.22\)\]{--tw-shadow:0 4px 24px var(--tw-shadow-color,#00000038);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_8px_40px_rgb\(0_0_0\/0\.28\)\]{--tw-shadow:0 8px 40px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-\[1\.5px\]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1.5px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-vc-comment\/30{--tw-ring-color:var(--vc-comment,#0d99ff)}@supports (color:color-mix(in lab, red, red)){.ring-vc-comment\/30{--tw-ring-color:color-mix(in oklab, var(--vc-comment,#0d99ff) 30%, transparent)}}.ring-white{--tw-ring-color:var(--color-white)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\[5px\]{--tw-backdrop-blur:blur(5px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[grid-area\:1\/1\]{grid-area:1/1}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-vc-muted\/70::placeholder{color:var(--vc-muted,#78716c)}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-vc-muted\/70::placeholder{color:color-mix(in oklab, var(--vc-muted,#78716c) 70%, transparent)}}.placeholder\:text-vc-muted\/80::placeholder{color:var(--vc-muted,#78716c)}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-vc-muted\/80::placeholder{color:color-mix(in oklab, var(--vc-muted,#78716c) 80%, transparent)}}.backdrop\:bg-black\/30::backdrop{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.backdrop\:bg-black\/30::backdrop{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.focus-within\:border-vc-comment:focus-within{border-color:var(--vc-comment,#0d99ff)}.focus-within\:opacity-100:focus-within{opacity:1}.focus-within\:ring-1:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-within\:ring-vc-comment:focus-within{--tw-ring-color:var(--vc-comment,#0d99ff)}@media (hover:hover){.hover\:border-vc-line:hover{border-color:var(--vc-line,#d6d3d1)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.hover\:bg-vc-surface:hover{background-color:var(--vc-surface,#f5f5f4)}.hover\:bg-vc-wash:hover{background-color:var(--vc-wash,#e7e5e4)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.hover\:text-vc-ink:hover{color:var(--vc-ink,#292524)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus-visible\:bg-vc-wash:focus-visible{background-color:var(--vc-wash,#e7e5e4)}.focus-visible\:bg-white\/10:focus-visible{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.focus-visible\:bg-white\/10:focus-visible{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-vc-comment:focus-visible{outline-color:var(--vc-comment,#0d99ff)}.has-\[\[aria-expanded\=true\]\]\:opacity-100:has([aria-expanded=true]){opacity:1}}:host{--vc-font-default:ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
@@ -0,0 +1,2 @@
1
+ export const styles: string;
2
+ export const properties: string;
@@ -0,0 +1,3 @@
1
+ // Generated by scripts/build-css.mjs.
2
+ export const styles = "/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;--color-red-600:oklch(57.7% .245 27.325);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--font-weight-semibold:600;--leading-tight:1.25;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-vc:var(--vc-font,var(--vc-font-default));--color-vc-ink:var(--vc-ink,#292524);--color-vc-muted:var(--vc-muted,#78716c);--color-vc-wash:var(--vc-wash,#e7e5e4);--color-vc-accent:var(--vc-accent,#57534e);--color-vc-avatar:var(--vc-avatar,#009aaa);--color-vc-comment:var(--vc-comment,#0d99ff);--color-vc-island-ink:var(--vc-island-ink,#fff);--color-vc-island-hover:var(--vc-island-hover,#ffffff24);--color-vc-working:var(--vc-working,var(--vc-comment,#0d99ff))}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:host{font-family:var(--font-vc);color:var(--color-vc-ink);-webkit-font-smoothing:antialiased;font-size:13px;line-height:1.4}.vc-ui{cursor:auto!important}.vc-ui button,.vc-ui a,.vc-ui [role=menuitem]{cursor:pointer}}@layer components{.vc-tool{border-radius:.125rem;outline:none;justify-content:center;align-items:center;min-width:1.75rem;height:1.75rem;display:inline-flex}.vc-tool:hover{background:var(--color-vc-wash)}.vc-tool:focus-visible{box-shadow:0 0 0 2px var(--color-vc-accent)}.vc-island-tool{min-width:2rem;height:2rem;color:var(--color-vc-island-ink);border-radius:9999px;outline:none;justify-content:center;align-items:center;gap:.375rem;display:inline-flex}.vc-island-tool:hover,.vc-island-tool[aria-expanded=true]{background:var(--color-vc-island-hover)}.vc-island-tool[aria-pressed=true]{background:var(--color-vc-island-ink);color:var(--color-vc-ink)}.vc-island-tool:focus-visible{box-shadow:0 0 0 2px #fff9}.vc-comment-cursor{cursor:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'%3E%3Cpath d='M14 1.5a12.5 12.5 0 1 1 0 25H1.5V14A12.5 12.5 0 0 1 14 1.5z' fill='white' stroke='%231c1917' stroke-width='1.5'/%3E%3Cpath d='M14 9v10M9 14h10' stroke='%231c1917' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E\") 1 27,crosshair}.vc-working{animation:1.6s ease-out infinite vc-working}@keyframes vc-working{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--color-vc-working) 70%, transparent)}to{box-shadow:0 0 0 9px color-mix(in srgb, var(--color-vc-working) 0%, transparent)}}@media (prefers-reduced-motion:reduce){.vc-working{box-shadow:0 0 0 2px var(--color-vc-working);animation:none}}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.inset-auto{inset:auto}.top-0\\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-2\\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.right-0\\.5{right:calc(var(--spacing) * .5)}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-4{bottom:calc(var(--spacing) * 4)}.-left-2{left:calc(var(--spacing) * -2)}.left-1\\/2{left:50%}.left-\\[42px\\]{left:42px}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.m-0{margin:0}.m-2{margin:calc(var(--spacing) * 2)}.m-auto{margin:auto}.my-1{margin-block:var(--spacing)}.mt-0{margin-top:0}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-\\[3px\\]{margin-top:3px}.ml-1{margin-left:var(--spacing)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.size-1\\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-full{width:100%;height:100%}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-11{height:calc(var(--spacing) * 11)}.h-auto{height:auto}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\\[min\\(70vh\\,560px\\)\\]{max-height:min(70vh,560px)}.min-h-0{min-height:0}.w-4{width:calc(var(--spacing) * 4)}.w-40{width:calc(var(--spacing) * 40)}.w-80{width:calc(var(--spacing) * 80)}.w-\\[296px\\]{width:296px}.w-\\[320px\\]{width:320px}.w-\\[360px\\]{width:360px}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.max-w-72{max-width:calc(var(--spacing) * 72)}.max-w-80{max-width:calc(var(--spacing) * 80)}.max-w-\\[240px\\]{max-width:240px}.max-w-\\[296px\\]{max-width:296px}.max-w-\\[calc\\(100vw-24px\\)\\]{max-width:calc(100vw - 24px)}.min-w-0{min-width:0}.min-w-52{min-width:calc(var(--spacing) * 52)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-none\\!{cursor:none!important}.resize-none{resize:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-0\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.self-center{align-self:center}.self-end{align-self:flex-end}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-\\[2px\\]{border-radius:2px}.rounded-\\[6px\\]{border-radius:6px}.rounded-\\[8px\\]{border-radius:8px}.rounded-\\[12px\\]{border-radius:12px}.rounded-\\[14px\\]{border-radius:14px}.rounded-\\[18px\\]{border-radius:18px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-vc-comment{border-color:var(--vc-comment,#0d99ff)}.border-vc-comment\\!{border-color:var(--vc-comment,#0d99ff)!important}.border-vc-line,.border-vc-line\\/70{border-color:var(--vc-line,#d6d3d1)}@supports (color:color-mix(in lab, red, red)){.border-vc-line\\/70{border-color:color-mix(in oklab, var(--vc-line,#d6d3d1) 70%, transparent)}}.border-white\\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.border-white\\/10{border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.border-t-transparent{border-top-color:#0000}.bg-\\[\\#d9d9d9\\]{background-color:#d9d9d9}.bg-black\\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-current\\/15{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.bg-current\\/15{background-color:color-mix(in oklab, currentcolor 15%, transparent)}}.bg-transparent{background-color:#0000}.bg-vc-agent{background-color:var(--vc-agent,#292524)}.bg-vc-comment{background-color:var(--vc-comment,#0d99ff)}.bg-vc-comment-soft{background-color:var(--vc-comment-soft,#e5f4ff)}.bg-vc-ink{background-color:var(--vc-ink,#292524)}.bg-vc-island{background-color:var(--vc-island,#323232b8)}.bg-vc-surface{background-color:var(--vc-surface,#f5f5f4)}.bg-white{background-color:var(--color-white)}.bg-white\\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.bg-white\\/85{background-color:color-mix(in oklab, var(--color-white) 85%, transparent)}}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-inline:var(--spacing)}.px-1\\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\\.5{padding-inline:calc(var(--spacing) * 3.5)}.py-0\\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-\\[3px\\]{padding-block:3px}.py-\\[5px\\]{padding-block:5px}.pt-1\\.5{padding-top:calc(var(--spacing) * 1.5)}.pr-0\\.5{padding-right:calc(var(--spacing) * .5)}.pr-1{padding-right:var(--spacing)}.pr-1\\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-\\[3px\\]{padding-right:3px}.pr-\\[5px\\]{padding-right:5px}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pl-0\\.5{padding-left:calc(var(--spacing) * .5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-3\\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-vc{font-family:var(--vc-font,var(--vc-font-default))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.text-\\[13px\\]{font-size:13px}.text-\\[15px\\]{font-size:15px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\\[18px\\]{--tw-leading:18px;line-height:18px}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\\[0\\.2em\\]{--tw-tracking:.2em;letter-spacing:.2em}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-red-600{color:var(--color-red-600)}.text-vc-accent{color:var(--vc-accent,#57534e)}.text-vc-comment{color:var(--vc-comment,#0d99ff)}.text-vc-ink{color:var(--vc-ink,#292524)}.text-vc-island-ink{color:var(--vc-island-ink,#fff)}.text-vc-muted{color:var(--vc-muted,#78716c)}.text-vc-working{color:var(--vc-working,var(--vc-comment,#0d99ff))}.text-white{color:var(--color-white)}.text-white\\/70{color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.text-white\\/70{color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.text-white\\/90{color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.text-white\\/90{color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_1px_3px_rgb\\(0_0_0\\/0\\.12\\)\\]{--tw-shadow:0 1px 3px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_1px_4px_rgb\\(0_0_0\\/0\\.3\\)\\]{--tw-shadow:0 1px 4px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_1px_6px_rgb\\(0_0_0\\/0\\.16\\)\\]{--tw-shadow:0 1px 6px var(--tw-shadow-color,#00000029);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_2px_10px_rgb\\(0_0_0\\/0\\.2\\)\\]{--tw-shadow:0 2px 10px var(--tw-shadow-color,#0003);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_2px_14px_rgb\\(0_0_0\\/0\\.18\\)\\]{--tw-shadow:0 2px 14px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_4px_24px_rgb\\(0_0_0\\/0\\.22\\)\\]{--tw-shadow:0 4px 24px var(--tw-shadow-color,#00000038);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_8px_40px_rgb\\(0_0_0\\/0\\.28\\)\\]{--tw-shadow:0 8px 40px var(--tw-shadow-color,#00000047);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-\\[1\\.5px\\]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1.5px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-vc-comment\\/30{--tw-ring-color:var(--vc-comment,#0d99ff)}@supports (color:color-mix(in lab, red, red)){.ring-vc-comment\\/30{--tw-ring-color:color-mix(in oklab, var(--vc-comment,#0d99ff) 30%, transparent)}}.ring-white{--tw-ring-color:var(--color-white)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\\[5px\\]{--tw-backdrop-blur:blur(5px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\\[grid-area\\:1\\/1\\]{grid-area:1/1}@media (hover:hover){.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\\:text-vc-muted\\/70::placeholder{color:var(--vc-muted,#78716c)}@supports (color:color-mix(in lab, red, red)){.placeholder\\:text-vc-muted\\/70::placeholder{color:color-mix(in oklab, var(--vc-muted,#78716c) 70%, transparent)}}.placeholder\\:text-vc-muted\\/80::placeholder{color:var(--vc-muted,#78716c)}@supports (color:color-mix(in lab, red, red)){.placeholder\\:text-vc-muted\\/80::placeholder{color:color-mix(in oklab, var(--vc-muted,#78716c) 80%, transparent)}}.backdrop\\:bg-black\\/30::backdrop{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.backdrop\\:bg-black\\/30::backdrop{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.focus-within\\:border-vc-comment:focus-within{border-color:var(--vc-comment,#0d99ff)}.focus-within\\:opacity-100:focus-within{opacity:1}.focus-within\\:ring-1:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-within\\:ring-vc-comment:focus-within{--tw-ring-color:var(--vc-comment,#0d99ff)}@media (hover:hover){.hover\\:border-vc-line:hover{border-color:var(--vc-line,#d6d3d1)}.hover\\:bg-black\\/80:hover{background-color:#000c}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-black\\/80:hover{background-color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.hover\\:bg-vc-surface:hover{background-color:var(--vc-surface,#f5f5f4)}.hover\\:bg-vc-wash:hover{background-color:var(--vc-wash,#e7e5e4)}.hover\\:bg-white\\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/10:hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.hover\\:text-vc-ink:hover{color:var(--vc-ink,#292524)}.hover\\:text-white:hover{color:var(--color-white)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus-visible\\:bg-vc-wash:focus-visible{background-color:var(--vc-wash,#e7e5e4)}.focus-visible\\:bg-white\\/10:focus-visible{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:bg-white\\/10:focus-visible{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:outline-vc-comment:focus-visible{outline-color:var(--vc-comment,#0d99ff)}.has-\\[\\[aria-expanded\\=true\\]\\]\\:opacity-100:has([aria-expanded=true]){opacity:1}}:host{--vc-font-default:ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif}@keyframes spin{to{transform:rotate(360deg)}}";
3
+ export const properties = "@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-tracking{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@property --tw-backdrop-blur{syntax:\"*\";inherits:false}@property --tw-backdrop-brightness{syntax:\"*\";inherits:false}@property --tw-backdrop-contrast{syntax:\"*\";inherits:false}@property --tw-backdrop-grayscale{syntax:\"*\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\"*\";inherits:false}@property --tw-backdrop-invert{syntax:\"*\";inherits:false}@property --tw-backdrop-opacity{syntax:\"*\";inherits:false}@property --tw-backdrop-saturate{syntax:\"*\";inherits:false}@property --tw-backdrop-sepia{syntax:\"*\";inherits:false}";
@@ -0,0 +1,113 @@
1
+ /*
2
+ The comment UI's styles. They are compiled into a string and added to the
3
+ shadow roots the UI renders in, so the page's styles and these never mix.
4
+ Theme the UI from the page with the --vc-* custom properties, which inherit
5
+ into the shadow roots: --vc-comment, --vc-avatar, --vc-font and the rest.
6
+ */
7
+ @import 'tailwindcss' source(none);
8
+ @source './';
9
+
10
+ :host {
11
+ --vc-font-default: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
12
+ }
13
+
14
+ @theme inline {
15
+ --font-vc: var(--vc-font, var(--vc-font-default));
16
+ --color-vc-ink: var(--vc-ink, #292524);
17
+ --color-vc-muted: var(--vc-muted, #78716c);
18
+ --color-vc-line: var(--vc-line, #d6d3d1);
19
+ --color-vc-wash: var(--vc-wash, #e7e5e4);
20
+ --color-vc-surface: var(--vc-surface, #f5f5f4);
21
+ --color-vc-accent: var(--vc-accent, #57534e);
22
+ --color-vc-avatar: var(--vc-avatar, #009aaa);
23
+ --color-vc-comment: var(--vc-comment, #0d99ff);
24
+ --color-vc-comment-soft: var(--vc-comment-soft, #e5f4ff);
25
+ --color-vc-island: var(--vc-island, rgb(50 50 50 / 0.72));
26
+ --color-vc-island-ink: var(--vc-island-ink, #fff);
27
+ --color-vc-island-hover: var(--vc-island-hover, rgb(255 255 255 / 0.14));
28
+ /* An agent's badge, and the pulse of a pin and an avatar while an agent works on it. */
29
+ --color-vc-agent: var(--vc-agent, #292524);
30
+ --color-vc-working: var(--vc-working, var(--vc-comment, #0d99ff));
31
+ }
32
+
33
+ @layer base {
34
+ :host {
35
+ font-family: var(--font-vc);
36
+ font-size: 13px;
37
+ line-height: 1.4;
38
+ color: var(--color-vc-ink);
39
+ -webkit-font-smoothing: antialiased;
40
+ }
41
+ /* The page hides its cursor in comment mode; the UI shows its own. */
42
+ .vc-ui {
43
+ cursor: auto !important;
44
+ }
45
+ .vc-ui button,
46
+ .vc-ui a,
47
+ .vc-ui [role='menuitem'] {
48
+ cursor: pointer;
49
+ }
50
+ }
51
+
52
+ @layer components {
53
+ .vc-tool {
54
+ display: inline-flex;
55
+ height: 1.75rem;
56
+ min-width: 1.75rem;
57
+ align-items: center;
58
+ justify-content: center;
59
+ border-radius: 0.125rem;
60
+ outline: none;
61
+ }
62
+ .vc-tool:hover {
63
+ background: var(--color-vc-wash);
64
+ }
65
+ .vc-tool:focus-visible {
66
+ box-shadow: 0 0 0 2px var(--color-vc-accent);
67
+ }
68
+ /* The floating toolbar's tools: pill-shaped on a frosted pill. */
69
+ .vc-island-tool {
70
+ display: inline-flex;
71
+ height: 2rem;
72
+ min-width: 2rem;
73
+ align-items: center;
74
+ justify-content: center;
75
+ gap: 0.375rem;
76
+ border-radius: 9999px;
77
+ color: var(--color-vc-island-ink);
78
+ outline: none;
79
+ }
80
+ .vc-island-tool:hover,
81
+ .vc-island-tool[aria-expanded='true'] {
82
+ background: var(--color-vc-island-hover);
83
+ }
84
+ .vc-island-tool[aria-pressed='true'] {
85
+ background: var(--color-vc-island-ink);
86
+ color: var(--color-vc-ink);
87
+ }
88
+ .vc-island-tool:focus-visible {
89
+ box-shadow: 0 0 0 2px rgb(255 255 255 / 0.6);
90
+ }
91
+ /* The comment tool: a pin whose bottom-left point is the hotspot. */
92
+ .vc-comment-cursor {
93
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'%3E%3Cpath d='M14 1.5a12.5 12.5 0 1 1 0 25H1.5V14A12.5 12.5 0 0 1 14 1.5z' fill='white' stroke='%231c1917' stroke-width='1.5'/%3E%3Cpath d='M14 9v10M9 14h10' stroke='%231c1917' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") 1 27, crosshair;
94
+ }
95
+ /* Something is being worked on: a ring that pulses out of the element's edge. */
96
+ .vc-working {
97
+ animation: vc-working 1.6s ease-out infinite;
98
+ }
99
+ @keyframes vc-working {
100
+ from {
101
+ box-shadow: 0 0 0 0 color-mix(in srgb, var(--color-vc-working) 70%, transparent);
102
+ }
103
+ to {
104
+ box-shadow: 0 0 0 9px color-mix(in srgb, var(--color-vc-working) 0%, transparent);
105
+ }
106
+ }
107
+ @media (prefers-reduced-motion: reduce) {
108
+ .vc-working {
109
+ animation: none;
110
+ box-shadow: 0 0 0 2px var(--color-vc-working);
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,5 @@
1
+ import type { Author, Comment } from '../shared/types.js';
2
+ /** A comment's text for previews, or what it holds when it is only images. */
3
+ export declare function commentText(comment: Comment): string;
4
+ /** Who someone is, saying who added them when they are an agent. */
5
+ export declare function authorLabel(author: Author): string;
@@ -0,0 +1,11 @@
1
+ /** A comment's text for previews, or what it holds when it is only images. */
2
+ export function commentText(comment) {
3
+ if (comment.body)
4
+ return comment.body;
5
+ const count = comment.images?.length ?? 0;
6
+ return count === 1 ? 'Image' : `${count} images`;
7
+ }
8
+ /** Who someone is, saying who added them when they are an agent. */
9
+ export function authorLabel(author) {
10
+ return author.agent ? `${author.name} · added by ${author.agent.addedBy.name}` : author.name;
11
+ }
@@ -0,0 +1,230 @@
1
+ import { type Aim } from './core/aim.js';
2
+ import { Api } from './core/api.js';
3
+ import { type Rect, type Surface } from './core/surfaces.js';
4
+ import { type CommentTarget } from './core/target.js';
5
+ import { Threads } from './core/threads.svelte.js';
6
+ import type { CommentImage, CommentThread, Participant, Viewer } from './shared/types.js';
7
+ export interface VisualCommentsOptions {
8
+ /** Where the site's server passes comment requests on to the comment server. Default `/_comments`. */
9
+ endpoint?: string;
10
+ /**
11
+ * The site's sign-in: the path of its routes, as in `@cnvx/sign-in`
12
+ * (default `/auth`), or functions that sign in and out.
13
+ */
14
+ auth?: string | {
15
+ signIn(): void;
16
+ signOut(): void;
17
+ };
18
+ /**
19
+ * Who is signed in, when the page knows it already (null: nobody), so the
20
+ * account shows before the server answers. Default: ask the server.
21
+ */
22
+ viewer?: Viewer | null;
23
+ /**
24
+ * The page threads belong to. Default: the address's origin and path, so
25
+ * the query and fragment do not matter. A fixed string makes every page share threads.
26
+ */
27
+ page?: string | ((url: URL) => string);
28
+ /** What to store about where a thread is placed, besides the viewport size and `data-vc-context`. */
29
+ context?: (surface: SurfaceInfo) => Record<string, string | number | undefined> | undefined;
30
+ /**
31
+ * Brings a thread's surface into view when it is opened from the list or a
32
+ * link, e.g. by zooming a canvas to it or navigating to it. Return true when
33
+ * handled; otherwise threads on other pages are opened by navigating to them.
34
+ */
35
+ show?: (thread: CommentThread) => boolean | void;
36
+ /**
37
+ * Goes to a thread on another page, at its `link`, when `show` did not
38
+ * handle it. Default: `location.assign`, which loads the page anew. An app
39
+ * with its own router navigates in it instead; the thread stays open and
40
+ * shows once its page is there.
41
+ */
42
+ navigate?: (url: string, thread: CommentThread) => void;
43
+ /** The address that opens a thread. Default: where it was placed, with `#vc=<id>`. */
44
+ link?: (thread: CommentThread) => string;
45
+ /** A surface's title and place in the list, for surfaces not on screen. */
46
+ describe?: (surface: string) => {
47
+ title?: string;
48
+ order?: number;
49
+ } | undefined;
50
+ /** A frame surface's document, when the default (any same-origin frame once loaded) is not right. */
51
+ documentOf?: (surface: Element, frame: HTMLIFrameElement) => Document | undefined;
52
+ /** The key that turns comment mode on and off. Default: `c`. */
53
+ shortcut?: string | false;
54
+ /** Show the floating toolbar. Default: unless the page has a `[data-vc-toggle]` button. */
55
+ toolbar?: boolean;
56
+ }
57
+ export interface SurfaceInfo {
58
+ id: string;
59
+ title: string;
60
+ element: Element | null;
61
+ }
62
+ /** Where the viewer is, as the host knows it. Others see it on the viewer's `Participant`. */
63
+ export interface PresenceLocation {
64
+ /** Default: the page key. */
65
+ page?: string;
66
+ /** The surface on screen or selected, e.g. a frame's id. */
67
+ surface?: string;
68
+ }
69
+ export interface CommentFilters {
70
+ query: string;
71
+ sort: 'date' | 'place';
72
+ showResolved: boolean;
73
+ onlyMine: boolean;
74
+ /** Threads on every page, not only this one. */
75
+ allPages: boolean;
76
+ }
77
+ /** A new comment being written. */
78
+ export interface Draft extends Aim {
79
+ text: string;
80
+ /** Narrower targets the pin was widened from, innermost first. */
81
+ inner?: CommentTarget[];
82
+ /** Images added so far, so a click elsewhere keeps them like text. */
83
+ images?: number;
84
+ }
85
+ interface Pointer {
86
+ x: number;
87
+ y: number;
88
+ alt: boolean;
89
+ }
90
+ /**
91
+ * Comments on a page: pins, the comment mode, the list of threads and the
92
+ * sign-in, drawn in a shadow root over the page. One per page.
93
+ */
94
+ export declare class VisualComments {
95
+ readonly api: Api;
96
+ readonly store: Threads;
97
+ options: VisualCommentsOptions;
98
+ /** Comment mode: clicking a surface starts a thread. Pins always show. */
99
+ active: boolean;
100
+ /** Hide the list while keeping comment mode active. */
101
+ panelCollapsed: boolean;
102
+ /** The thread whose conversation is open. */
103
+ openId: number | undefined;
104
+ draft: Draft | undefined;
105
+ filters: CommentFilters;
106
+ /** Measured on every change of the page. */
107
+ surfaces: Surface[];
108
+ /** Bumped whenever anything on the page may have moved. */
109
+ layout: number;
110
+ page: string;
111
+ /** Where the host asked for the list to go. */
112
+ panelRect: Rect | undefined;
113
+ hostToggles: boolean;
114
+ /** Where a click would start a thread, while it would. */
115
+ aim: Aim | undefined;
116
+ /** The pointer while it is over a surface in comment mode: the comment cursor is drawn there. */
117
+ cursor: {
118
+ x: number;
119
+ y: number;
120
+ } | undefined;
121
+ /** Opening a thread scrolls its element into view once it is found. */
122
+ revealing: number | undefined;
123
+ /** An agent's request to join, from `#vc-connect=<id>`, while the dialog to approve it is shown. */
124
+ connecting: string | undefined;
125
+ /** The reply field of the open thread is being written in. */
126
+ typing: boolean;
127
+ /** Where the host says the viewer is, for others to see. */
128
+ private whereabouts;
129
+ readonly doc: Document;
130
+ readonly host: HTMLElement;
131
+ private app?;
132
+ private slots;
133
+ private frames;
134
+ private cleanup;
135
+ private pointer?;
136
+ private pressed?;
137
+ private measuring;
138
+ private aiming;
139
+ private animating;
140
+ private cursorSheet;
141
+ private focusDraftHandler?;
142
+ private linked?;
143
+ private typingTimer?;
144
+ private presenceTimer?;
145
+ constructor(options: VisualCommentsOptions, doc?: Document);
146
+ get viewer(): Viewer | null;
147
+ get threads(): CommentThread[];
148
+ get unreadCount(): number;
149
+ get loading(): boolean;
150
+ get open(): CommentThread | undefined;
151
+ /** Everyone present in the space: people's tabs, this one included, and agents' tasks. Empty when signed out. */
152
+ get participants(): Participant[];
153
+ /** This tab's connection to the server's event stream, as in `Participant.id`, while it is open. */
154
+ get connection(): string | undefined;
155
+ /** What this tab tells others: the host's location, the open thread, and whether its reply is being written. */
156
+ private get ownPresence();
157
+ /** Threads shown as pins: on this page, unresolved unless resolved ones are shown or it is open. */
158
+ get pinned(): CommentThread[];
159
+ get showToolbar(): boolean;
160
+ surface(id: string): Surface | undefined;
161
+ /** A surface's title for the list, whether or not it is on screen. */
162
+ titleOf(thread: CommentThread): string;
163
+ orderOf(thread: CommentThread): number;
164
+ linkOf(thread: CommentThread): string;
165
+ imageUrl(image: CommentImage): string;
166
+ /** Whether an element belongs to the comment UI. */
167
+ readonly ours: (element: Element) => boolean;
168
+ /** Changes options after creation, e.g. when a host's view mounts and can show threads. */
169
+ configure(options: Partial<VisualCommentsOptions>): void;
170
+ toggle(on?: boolean): void;
171
+ openThread(id: number | undefined): void;
172
+ /** Opens a thread from the list or a link, bringing it into view. */
173
+ focus(thread: CommentThread): void;
174
+ /** The thread's element, once found, scrolled into view inside its document. */
175
+ revealElement(element: Element): void;
176
+ /**
177
+ * Tells others where the viewer is: the page, by default the page key, and
178
+ * the surface, e.g. the frame on screen. Each call replaces the last.
179
+ */
180
+ setPresence(update: PresenceLocation): void;
181
+ /** Called by the UI as the viewer writes in the open thread; they stop typing 5 seconds after the last key. */
182
+ noteTyping(): void;
183
+ stopTyping(): void;
184
+ /** Closes the dialog for an agent's request and takes it out of the address. */
185
+ endConnect(): void;
186
+ /** Leaves for the site's sign-in, and comes back to this address. */
187
+ signIn(): void;
188
+ signOut(): void;
189
+ /** Measures the page again, e.g. after the host moved surfaces in a way it cannot see. */
190
+ relayout(): void;
191
+ /** For hosts that are not built with Svelte: called after any change of state. */
192
+ subscribe(listener: (comments: VisualComments) => void): () => void;
193
+ destroy(): void;
194
+ /** Called by the UI so a click elsewhere can bring the unsent comment back to attention. */
195
+ onFocusDraft(handler: (() => void) | undefined): void;
196
+ private get draftHasContent();
197
+ private start;
198
+ /** Watches a frame's own document: its scrolling, its changes and its keys. */
199
+ private watchFrame;
200
+ private schedule;
201
+ private measure;
202
+ /** Puts the account button in every `[data-vc-account]` element of the host's own toolbar. */
203
+ private mountSlots;
204
+ private fromUs;
205
+ private surfaceAt;
206
+ /** The pointer moved, or left (undefined). Also called by the layers over frames. */
207
+ move(pointer: Pointer | undefined): void;
208
+ private onPointerMove;
209
+ /** Aims again, at most once per frame: the pointer moved, or the page moved under it. */
210
+ private updateAim;
211
+ /** Over a surface in comment mode the page's cursor is hidden; the comment cursor is drawn instead. */
212
+ private updateCursorStyle;
213
+ /** Pressing on a surface in comment mode does not reach the page, unless the host keeps its gestures there. */
214
+ private onPress;
215
+ private onRelease;
216
+ private onOtherClick;
217
+ private onClick;
218
+ /** A click on a surface in comment mode starts a thread. A click away from an open thread closes it first. */
219
+ place(surface: Surface, x: number, y: number, free: boolean): void;
220
+ /** A layer over a frame passes wheel turns to whatever scrolls under the pointer. */
221
+ wheel(surface: Surface, event: WheelEvent): void;
222
+ private onKey;
223
+ /** Escape drops the new comment, else closes the open thread, else leaves comment mode. */
224
+ private onEscape;
225
+ /** Whether a key is the comments' to act on: not typed into a field, nor into the dialog to approve an agent. */
226
+ private ownsKey;
227
+ }
228
+ /** The page key: the address's origin and path, without a trailing slash. */
229
+ export declare function pageOf(option: VisualCommentsOptions['page']): string;
230
+ export {};