@nlweb-ai/search-components 0.1.9

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["#style-inject:#style-inject","../src/styles.css","../src/components/ChatSearch.tsx","../src/lib/useNlWeb.ts","../src/lib/parseSchema.ts","../src/lib/util.ts","../src/components/SearchQuery.tsx","../src/lib/useAutoScroll.ts","../src/components/HistorySidebar.tsx","../src/components/DebugTools.tsx","../src/components/SiteDropdown.tsx","../src/lib/useHistory.ts","../src/lib/db.ts"],"sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\\n@layer properties;\\n@layer theme, base, components, utilities;\\n@layer theme {\\n :root,\\n :host {\\n --font-sans:\\n ui-sans-serif,\\n system-ui,\\n sans-serif,\\n \\\"Apple Color Emoji\\\",\\n \\\"Segoe UI Emoji\\\",\\n \\\"Segoe UI Symbol\\\",\\n \\\"Noto Color Emoji\\\";\\n --font-mono:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n --color-red-500: oklch(63.7% 0.237 25.331);\\n --color-yellow-500: oklch(79.5% 0.184 86.047);\\n --color-blue-300: oklch(80.9% 0.105 251.813);\\n --color-blue-600: oklch(54.6% 0.245 262.881);\\n --color-gray-50: oklch(98.5% 0.002 247.839);\\n --color-gray-100: oklch(96.7% 0.003 264.542);\\n --color-gray-200: oklch(92.8% 0.006 264.531);\\n --color-gray-300: oklch(87.2% 0.01 258.338);\\n --color-gray-400: oklch(70.7% 0.022 261.325);\\n --color-gray-500: oklch(55.1% 0.027 264.364);\\n --color-gray-600: oklch(44.6% 0.03 256.802);\\n --color-gray-700: oklch(37.3% 0.034 259.733);\\n --color-gray-800: oklch(27.8% 0.033 256.848);\\n --color-gray-900: oklch(21% 0.034 264.665);\\n --color-black: #000;\\n --color-white: #fff;\\n --spacing: 0.25rem;\\n --container-md: 28rem;\\n --container-xl: 36rem;\\n --container-2xl: 42rem;\\n --container-3xl: 48rem;\\n --container-7xl: 80rem;\\n --text-xs: 0.75rem;\\n --text-xs--line-height: calc(1 / 0.75);\\n --text-sm: 0.875rem;\\n --text-sm--line-height: calc(1.25 / 0.875);\\n --text-base: 1rem;\\n --text-base--line-height: calc(1.5 / 1);\\n --text-lg: 1.125rem;\\n --text-lg--line-height: calc(1.75 / 1.125);\\n --text-2xl: 1.5rem;\\n --text-2xl--line-height: calc(2 / 1.5);\\n --font-weight-normal: 400;\\n --font-weight-medium: 500;\\n --font-weight-semibold: 600;\\n --font-weight-bold: 700;\\n --leading-relaxed: 1.625;\\n --radius-sm: 0.25rem;\\n --radius-md: 0.375rem;\\n --radius-lg: 0.5rem;\\n --radius-2xl: 1rem;\\n --animate-spin: spin 1s linear infinite;\\n --default-transition-duration: 150ms;\\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n --default-font-family: var(--font-sans);\\n --default-mono-font-family: var(--font-mono);\\n }\\n}\\n@layer base {\\n *,\\n ::after,\\n ::before,\\n ::backdrop,\\n ::file-selector-button {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n border: 0 solid;\\n }\\n html,\\n :host {\\n line-height: 1.5;\\n -webkit-text-size-adjust: 100%;\\n tab-size: 4;\\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");\\n font-feature-settings: var(--default-font-feature-settings, normal);\\n font-variation-settings: var(--default-font-variation-settings, normal);\\n -webkit-tap-highlight-color: transparent;\\n }\\n hr {\\n height: 0;\\n color: inherit;\\n border-top-width: 1px;\\n }\\n abbr:where([title]) {\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n }\\n h1,\\n h2,\\n h3,\\n h4,\\n h5,\\n h6 {\\n font-size: inherit;\\n font-weight: inherit;\\n }\\n a {\\n color: inherit;\\n -webkit-text-decoration: inherit;\\n text-decoration: inherit;\\n }\\n b,\\n strong {\\n font-weight: bolder;\\n }\\n code,\\n kbd,\\n samp,\\n pre {\\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);\\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\\n font-size: 1em;\\n }\\n small {\\n font-size: 80%;\\n }\\n sub,\\n sup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n }\\n sub {\\n bottom: -0.25em;\\n }\\n sup {\\n top: -0.5em;\\n }\\n table {\\n text-indent: 0;\\n border-color: inherit;\\n border-collapse: collapse;\\n }\\n :-moz-focusring {\\n outline: auto;\\n }\\n progress {\\n vertical-align: baseline;\\n }\\n summary {\\n display: list-item;\\n }\\n ol,\\n ul,\\n menu {\\n list-style: none;\\n }\\n img,\\n svg,\\n video,\\n canvas,\\n audio,\\n iframe,\\n embed,\\n object {\\n display: block;\\n vertical-align: middle;\\n }\\n img,\\n video {\\n max-width: 100%;\\n height: auto;\\n }\\n button,\\n input,\\n select,\\n optgroup,\\n textarea,\\n ::file-selector-button {\\n font: inherit;\\n font-feature-settings: inherit;\\n font-variation-settings: inherit;\\n letter-spacing: inherit;\\n color: inherit;\\n border-radius: 0;\\n background-color: transparent;\\n opacity: 1;\\n }\\n :where(select:is([multiple], [size])) optgroup {\\n font-weight: bolder;\\n }\\n :where(select:is([multiple], [size])) optgroup option {\\n padding-inline-start: 20px;\\n }\\n ::file-selector-button {\\n margin-inline-end: 4px;\\n }\\n ::placeholder {\\n opacity: 1;\\n }\\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\\n ::placeholder {\\n color: currentcolor;\\n @supports (color: color-mix(in lab, red, red)) {\\n color: color-mix(in oklab, currentcolor 50%, transparent);\\n }\\n }\\n }\\n textarea {\\n resize: vertical;\\n }\\n ::-webkit-search-decoration {\\n -webkit-appearance: none;\\n }\\n ::-webkit-date-and-time-value {\\n min-height: 1lh;\\n text-align: inherit;\\n }\\n ::-webkit-datetime-edit {\\n display: inline-flex;\\n }\\n ::-webkit-datetime-edit-fields-wrapper {\\n padding: 0;\\n }\\n ::-webkit-datetime-edit,\\n ::-webkit-datetime-edit-year-field,\\n ::-webkit-datetime-edit-month-field,\\n ::-webkit-datetime-edit-day-field,\\n ::-webkit-datetime-edit-hour-field,\\n ::-webkit-datetime-edit-minute-field,\\n ::-webkit-datetime-edit-second-field,\\n ::-webkit-datetime-edit-millisecond-field,\\n ::-webkit-datetime-edit-meridiem-field {\\n padding-block: 0;\\n }\\n ::-webkit-calendar-picker-indicator {\\n line-height: 1;\\n }\\n :-moz-ui-invalid {\\n box-shadow: none;\\n }\\n button,\\n input:where([type=button], [type=reset], [type=submit]),\\n ::file-selector-button {\\n appearance: button;\\n }\\n ::-webkit-inner-spin-button,\\n ::-webkit-outer-spin-button {\\n height: auto;\\n }\\n [hidden]:where(:not([hidden=until-found])) {\\n display: none !important;\\n }\\n}\\n@layer utilities {\\n .shimmer-container {\\n container-type: inline-size;\\n & .shimmer {\\n --shimmer-track-width: 100cqw;\\n --shimmer-track-height: max(100cqh, 50cqw, 200px);\\n }\\n }\\n .pointer-events-none {\\n pointer-events: none;\\n }\\n .invisible {\\n visibility: hidden;\\n }\\n .absolute {\\n position: absolute;\\n }\\n .fixed {\\n position: fixed;\\n }\\n .relative {\\n position: relative;\\n }\\n .inset-0 {\\n inset: calc(var(--spacing) * 0);\\n }\\n .inset-y-0 {\\n inset-block: calc(var(--spacing) * 0);\\n }\\n .top-0 {\\n top: calc(var(--spacing) * 0);\\n }\\n .top-3 {\\n top: calc(var(--spacing) * 3);\\n }\\n .top-4 {\\n top: calc(var(--spacing) * 4);\\n }\\n .top-12 {\\n top: calc(var(--spacing) * 12);\\n }\\n .top-\\\\[calc\\\\(100\\\\%_-_100px\\\\)\\\\] {\\n top: calc(100% - 100px);\\n }\\n .right-0 {\\n right: calc(var(--spacing) * 0);\\n }\\n .right-2 {\\n right: calc(var(--spacing) * 2);\\n }\\n .right-4 {\\n right: calc(var(--spacing) * 4);\\n }\\n .right-6 {\\n right: calc(var(--spacing) * 6);\\n }\\n .right-10 {\\n right: calc(var(--spacing) * 10);\\n }\\n .bottom-0 {\\n bottom: calc(var(--spacing) * 0);\\n }\\n .bottom-8 {\\n bottom: calc(var(--spacing) * 8);\\n }\\n .left-0 {\\n left: calc(var(--spacing) * 0);\\n }\\n .left-2 {\\n left: calc(var(--spacing) * 2);\\n }\\n .left-3\\\\.5 {\\n left: calc(var(--spacing) * 3.5);\\n }\\n .left-4 {\\n left: calc(var(--spacing) * 4);\\n }\\n .left-10 {\\n left: calc(var(--spacing) * 10);\\n }\\n .z-10 {\\n z-index: 10;\\n }\\n .z-30 {\\n z-index: 30;\\n }\\n .z-50 {\\n z-index: 50;\\n }\\n .container {\\n width: 100%;\\n @media (width >= 40rem) {\\n max-width: 40rem;\\n }\\n @media (width >= 48rem) {\\n max-width: 48rem;\\n }\\n @media (width >= 64rem) {\\n max-width: 64rem;\\n }\\n @media (width >= 80rem) {\\n max-width: 80rem;\\n }\\n @media (width >= 96rem) {\\n max-width: 96rem;\\n }\\n }\\n .m-0 {\\n margin: calc(var(--spacing) * 0);\\n }\\n .-mx-2 {\\n margin-inline: calc(var(--spacing) * -2);\\n }\\n .mx-auto {\\n margin-inline: auto;\\n }\\n .mt-1 {\\n margin-top: calc(var(--spacing) * 1);\\n }\\n .mt-4 {\\n margin-top: calc(var(--spacing) * 4);\\n }\\n .mb-1 {\\n margin-bottom: calc(var(--spacing) * 1);\\n }\\n .mb-2 {\\n margin-bottom: calc(var(--spacing) * 2);\\n }\\n .mb-3 {\\n margin-bottom: calc(var(--spacing) * 3);\\n }\\n .mb-4 {\\n margin-bottom: calc(var(--spacing) * 4);\\n }\\n .mb-6 {\\n margin-bottom: calc(var(--spacing) * 6);\\n }\\n .ml-auto {\\n margin-left: auto;\\n }\\n .line-clamp-2 {\\n overflow: hidden;\\n display: -webkit-box;\\n -webkit-box-orient: vertical;\\n -webkit-line-clamp: 2;\\n }\\n .line-clamp-3 {\\n overflow: hidden;\\n display: -webkit-box;\\n -webkit-box-orient: vertical;\\n -webkit-line-clamp: 3;\\n }\\n .block {\\n display: block;\\n }\\n .flex {\\n display: flex;\\n }\\n .grid {\\n display: grid;\\n }\\n .hidden {\\n display: none;\\n }\\n .size-4 {\\n width: calc(var(--spacing) * 4);\\n height: calc(var(--spacing) * 4);\\n }\\n .size-5 {\\n width: calc(var(--spacing) * 5);\\n height: calc(var(--spacing) * 5);\\n }\\n .size-6 {\\n width: calc(var(--spacing) * 6);\\n height: calc(var(--spacing) * 6);\\n }\\n .h-2 {\\n height: calc(var(--spacing) * 2);\\n }\\n .h-3 {\\n height: calc(var(--spacing) * 3);\\n }\\n .h-4 {\\n height: calc(var(--spacing) * 4);\\n }\\n .h-5 {\\n height: calc(var(--spacing) * 5);\\n }\\n .h-7 {\\n height: calc(var(--spacing) * 7);\\n }\\n .h-12 {\\n height: calc(var(--spacing) * 12);\\n }\\n .h-36 {\\n height: calc(var(--spacing) * 36);\\n }\\n .h-full\\\\! {\\n height: 100% !important;\\n }\\n .h-screen {\\n height: 100vh;\\n }\\n .max-h-12 {\\n max-height: calc(var(--spacing) * 12);\\n }\\n .max-h-60 {\\n max-height: calc(var(--spacing) * 60);\\n }\\n .max-h-\\\\[60vh\\\\] {\\n max-height: 60vh;\\n }\\n .max-h-\\\\[80vh\\\\] {\\n max-height: 80vh;\\n }\\n .w-1\\\\/6 {\\n width: calc(1/6 * 100%);\\n }\\n .w-3 {\\n width: calc(var(--spacing) * 3);\\n }\\n .w-3\\\\/4 {\\n width: calc(3/4 * 100%);\\n }\\n .w-4 {\\n width: calc(var(--spacing) * 4);\\n }\\n .w-5 {\\n width: calc(var(--spacing) * 5);\\n }\\n .w-5\\\\/6 {\\n width: calc(5/6 * 100%);\\n }\\n .w-7 {\\n width: calc(var(--spacing) * 7);\\n }\\n .w-10\\\\/12 {\\n width: calc(10/12 * 100%);\\n }\\n .w-11\\\\/12 {\\n width: calc(11/12 * 100%);\\n }\\n .w-full {\\n width: 100%;\\n }\\n .w-full\\\\! {\\n width: 100% !important;\\n }\\n .w-screen {\\n width: 100vw;\\n }\\n .max-w-2xl {\\n max-width: var(--container-2xl);\\n }\\n .max-w-3xl {\\n max-width: var(--container-3xl);\\n }\\n .max-w-7xl {\\n max-width: var(--container-7xl);\\n }\\n .max-w-12 {\\n max-width: calc(var(--spacing) * 12);\\n }\\n .max-w-70 {\\n max-width: calc(var(--spacing) * 70);\\n }\\n .max-w-xl {\\n max-width: var(--container-xl);\\n }\\n .min-w-0 {\\n min-width: calc(var(--spacing) * 0);\\n }\\n .min-w-50 {\\n min-width: calc(var(--spacing) * 50);\\n }\\n .min-w-64 {\\n min-width: calc(var(--spacing) * 64);\\n }\\n .flex-1 {\\n flex: 1;\\n }\\n .flex-shrink-0 {\\n flex-shrink: 0;\\n }\\n .shimmer {\\n --_gradient-width: calc(var(--_spread) + var(--shimmer-track-height) * tan(var(--shimmer-angle)));\\n --_active-distance: calc(var(--shimmer-track-width, 200px) + var(--_gradient-width));\\n --_duration: var(--shimmer-duration, calc(var(--_active-distance) / var(--_speed) / 1px * 1000));\\n --_repeat-delay: var(--shimmer-repeat-delay, calc(20000 / var(--_speed)));\\n --_repeat-delay-px: calc(var(--_repeat-delay) * var(--_active-distance) / var(--_duration));\\n --_xy-offset-px: calc((var(--shimmer-x, 0) + var(--shimmer-y, 0) * tan(var(--shimmer-angle))) * 1px);\\n --_bg-width: calc( 100% + var(--shimmer-track-width, 100%) + var(--_gradient-width) + var(--_repeat-delay-px) );\\n --_position: calc( var(--shimmer-track-width, (100% - var(--_gradient-width) - var(--_repeat-delay-px)) / 2) + var(--_gradient-width) / 2 + var(--_repeat-delay-px) - var(--_xy-offset-px) );\\n &:not(.shimmer-bg) {\\n --_speed: var(--shimmer-speed, 200);\\n --_spread: var(--shimmer-spread, calc(4ch + 80px));\\n --_bg: currentColor;\\n --_fg: var(--shimmer-color, oklch(from currentColor l c h / calc(alpha * 0.2)));\\n background-clip: text;\\n -webkit-text-fill-color: transparent;\\n }\\n &.shimmer-bg {\\n --_speed: var(--shimmer-speed, 1000);\\n --_spread: var(--shimmer-spread, 480px);\\n --_bg: transparent;\\n --_fg: var(--shimmer-color, oklch(from currentColor 0 c h / 0.06));\\n }\\n @media (prefers-color-scheme: dark) {\\n &:not(.shimmer-bg) {\\n --_fg: var(--shimmer-color, oklch(from currentColor max(0.8, calc(l + 0.4)) c h / calc(alpha + 0.4)));\\n }\\n &.shimmer-bg {\\n --_fg: var(--shimmer-color, oklch(from currentColor 0 c h / 0.30));\\n }\\n }\\n @-moz-document url-prefix() {\\n --_duration: var(--shimmer-duration, calc(375000 / var(--_speed)));\\n }\\n --_mix-96: var(--_fg);\\n @supports (color: color-mix(in lab, red, red)) {\\n --_mix-96: color-mix(in oklch, var(--_fg), var(--_bg) 96%);\\n }\\n --_mix-83: var(--_fg);\\n @supports (color: color-mix(in lab, red, red)) {\\n --_mix-83: color-mix(in oklch, var(--_fg), var(--_bg) 83%);\\n }\\n --_mix-67: var(--_fg);\\n @supports (color: color-mix(in lab, red, red)) {\\n --_mix-67: color-mix(in oklch, var(--_fg), var(--_bg) 67%);\\n }\\n --_mix-50: var(--_fg);\\n @supports (color: color-mix(in lab, red, red)) {\\n --_mix-50: color-mix(in oklch, var(--_fg), var(--_bg) 50%);\\n }\\n --_mix-33: var(--_fg);\\n @supports (color: color-mix(in lab, red, red)) {\\n --_mix-33: color-mix(in oklch, var(--_fg), var(--_bg) 33%);\\n }\\n --_mix-17: var(--_fg);\\n @supports (color: color-mix(in lab, red, red)) {\\n --_mix-17: color-mix(in oklch, var(--_fg), var(--_bg) 17%);\\n }\\n --_mix-4: var(--_fg);\\n @supports (color: color-mix(in lab, red, red)) {\\n --_mix-4: color-mix(in oklch, var(--_fg), var(--_bg) 4%);\\n }\\n background:\\n linear-gradient(\\n calc(90deg + var(--shimmer-angle)),\\n var(--_bg) calc(var(--_position) - var(--_spread) * 0.5),\\n var(--_mix-96) calc(var(--_position) - var(--_spread) * 0.44),\\n var(--_mix-83) calc(var(--_position) - var(--_spread) * 0.37),\\n var(--_mix-67) calc(var(--_position) - var(--_spread) * 0.31),\\n var(--_mix-50) calc(var(--_position) - var(--_spread) * 0.25),\\n var(--_mix-33) calc(var(--_position) - var(--_spread) * 0.19),\\n var(--_mix-17) calc(var(--_position) - var(--_spread) * 0.12),\\n var(--_mix-4) calc(var(--_position) - var(--_spread) * 0.06),\\n var(--_fg) var(--_position),\\n var(--_mix-4) calc(var(--_position) + var(--_spread) * 0.06),\\n var(--_mix-17) calc(var(--_position) + var(--_spread) * 0.12),\\n var(--_mix-33) calc(var(--_position) + var(--_spread) * 0.19),\\n var(--_mix-50) calc(var(--_position) + var(--_spread) * 0.25),\\n var(--_mix-67) calc(var(--_position) + var(--_spread) * 0.31),\\n var(--_mix-83) calc(var(--_position) + var(--_spread) * 0.37),\\n var(--_mix-96) calc(var(--_position) + var(--_spread) * 0.44),\\n var(--_bg) calc(var(--_position) + var(--_spread) * 0.5)) 0 0 / var(--_bg-width) 100% no-repeat;\\n animation: tw-shimmer 1s linear 0s infinite backwards;\\n animation-duration: calc((var(--_duration) + var(--_repeat-delay)) * 1ms);\\n }\\n .animate-spin {\\n animation: var(--animate-spin);\\n }\\n .cursor-default {\\n cursor: default;\\n }\\n .cursor-not-allowed {\\n cursor: not-allowed;\\n }\\n .grid-cols-1 {\\n grid-template-columns: repeat(1, minmax(0, 1fr));\\n }\\n .flex-col {\\n flex-direction: column;\\n }\\n .flex-row {\\n flex-direction: row;\\n }\\n .items-center {\\n align-items: center;\\n }\\n .items-stretch {\\n align-items: stretch;\\n }\\n .justify-center {\\n justify-content: center;\\n }\\n .justify-end {\\n justify-content: flex-end;\\n }\\n .justify-start {\\n justify-content: flex-start;\\n }\\n .gap-0 {\\n gap: calc(var(--spacing) * 0);\\n }\\n .gap-1 {\\n gap: calc(var(--spacing) * 1);\\n }\\n .gap-2 {\\n gap: calc(var(--spacing) * 2);\\n }\\n .gap-3 {\\n gap: calc(var(--spacing) * 3);\\n }\\n .gap-6 {\\n gap: calc(var(--spacing) * 6);\\n }\\n .space-y-1 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-2 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-3 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .space-y-4 {\\n :where(& > :not(:last-child)) {\\n --tw-space-y-reverse: 0;\\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\\n }\\n }\\n .divide-y {\\n :where(& > :not(:last-child)) {\\n --tw-divide-y-reverse: 0;\\n border-bottom-style: var(--tw-border-style);\\n border-top-style: var(--tw-border-style);\\n border-top-width: calc(1px * var(--tw-divide-y-reverse));\\n border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));\\n }\\n }\\n .truncate {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n }\\n .overflow-auto {\\n overflow: auto;\\n }\\n .overflow-hidden {\\n overflow: hidden;\\n }\\n .overflow-y-auto {\\n overflow-y: auto;\\n }\\n .rounded {\\n border-radius: 0.25rem;\\n }\\n .rounded\\\\! {\\n border-radius: 0.25rem !important;\\n }\\n .rounded-2xl {\\n border-radius: var(--radius-2xl);\\n }\\n .rounded-lg {\\n border-radius: var(--radius-lg);\\n }\\n .rounded-md {\\n border-radius: var(--radius-md);\\n }\\n .rounded-tr-sm {\\n border-top-right-radius: var(--radius-sm);\\n }\\n .border {\\n border-style: var(--tw-border-style);\\n border-width: 1px;\\n }\\n .border-r {\\n border-right-style: var(--tw-border-style);\\n border-right-width: 1px;\\n }\\n .border-b {\\n border-bottom-style: var(--tw-border-style);\\n border-bottom-width: 1px;\\n }\\n .border-b-2 {\\n border-bottom-style: var(--tw-border-style);\\n border-bottom-width: 2px;\\n }\\n .border-none {\\n --tw-border-style: none;\\n border-style: none;\\n }\\n .border-gray-200 {\\n border-color: var(--color-gray-200);\\n }\\n .border-gray-300 {\\n border-color: var(--color-gray-300);\\n }\\n .border-gray-400 {\\n border-color: var(--color-gray-400);\\n }\\n .border-gray-900 {\\n border-color: var(--color-gray-900);\\n }\\n .bg-black {\\n background-color: var(--color-black);\\n }\\n .bg-black\\\\/30 {\\n background-color: color-mix(in srgb, #000 30%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-black) 30%, transparent);\\n }\\n }\\n .bg-blue-600 {\\n background-color: var(--color-blue-600);\\n }\\n .bg-gray-50 {\\n background-color: var(--color-gray-50);\\n }\\n .bg-gray-100 {\\n background-color: var(--color-gray-100);\\n }\\n .bg-gray-200 {\\n background-color: var(--color-gray-200);\\n }\\n .bg-gray-200\\\\/50 {\\n background-color: color-mix(in srgb, oklch(92.8% 0.006 264.531) 50%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n background-color: color-mix(in oklab, var(--color-gray-200) 50%, transparent);\\n }\\n }\\n .bg-gray-900 {\\n background-color: var(--color-gray-900);\\n }\\n .bg-white {\\n background-color: var(--color-white);\\n }\\n .bg-gradient-to-b {\\n --tw-gradient-position: to bottom in oklab;\\n background-image: linear-gradient(var(--tw-gradient-stops));\\n }\\n .from-transparent {\\n --tw-gradient-from: transparent;\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n .to-white {\\n --tw-gradient-to: var(--color-white);\\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\\n }\\n .object-cover\\\\! {\\n object-fit: cover !important;\\n }\\n .p-2 {\\n padding: calc(var(--spacing) * 2);\\n }\\n .p-3 {\\n padding: calc(var(--spacing) * 3);\\n }\\n .p-4 {\\n padding: calc(var(--spacing) * 4);\\n }\\n .p-6 {\\n padding: calc(var(--spacing) * 6);\\n }\\n .p-8 {\\n padding: calc(var(--spacing) * 8);\\n }\\n .px-2 {\\n padding-inline: calc(var(--spacing) * 2);\\n }\\n .px-3 {\\n padding-inline: calc(var(--spacing) * 3);\\n }\\n .px-4 {\\n padding-inline: calc(var(--spacing) * 4);\\n }\\n .px-5 {\\n padding-inline: calc(var(--spacing) * 5);\\n }\\n .px-6 {\\n padding-inline: calc(var(--spacing) * 6);\\n }\\n .py-1 {\\n padding-block: calc(var(--spacing) * 1);\\n }\\n .py-1\\\\.5 {\\n padding-block: calc(var(--spacing) * 1.5);\\n }\\n .py-2 {\\n padding-block: calc(var(--spacing) * 2);\\n }\\n .py-3 {\\n padding-block: calc(var(--spacing) * 3);\\n }\\n .py-6 {\\n padding-block: calc(var(--spacing) * 6);\\n }\\n .py-8 {\\n padding-block: calc(var(--spacing) * 8);\\n }\\n .pt-16 {\\n padding-top: calc(var(--spacing) * 16);\\n }\\n .pr-2 {\\n padding-right: calc(var(--spacing) * 2);\\n }\\n .pr-3 {\\n padding-right: calc(var(--spacing) * 3);\\n }\\n .pr-4 {\\n padding-right: calc(var(--spacing) * 4);\\n }\\n .pr-10 {\\n padding-right: calc(var(--spacing) * 10);\\n }\\n .pr-12 {\\n padding-right: calc(var(--spacing) * 12);\\n }\\n .pr-20 {\\n padding-right: calc(var(--spacing) * 20);\\n }\\n .pb-0 {\\n padding-bottom: calc(var(--spacing) * 0);\\n }\\n .pb-2 {\\n padding-bottom: calc(var(--spacing) * 2);\\n }\\n .pb-24 {\\n padding-bottom: calc(var(--spacing) * 24);\\n }\\n .pl-2 {\\n padding-left: calc(var(--spacing) * 2);\\n }\\n .pl-3 {\\n padding-left: calc(var(--spacing) * 3);\\n }\\n .pl-4 {\\n padding-left: calc(var(--spacing) * 4);\\n }\\n .pl-8 {\\n padding-left: calc(var(--spacing) * 8);\\n }\\n .pl-10 {\\n padding-left: calc(var(--spacing) * 10);\\n }\\n .text-center {\\n text-align: center;\\n }\\n .text-left {\\n text-align: left;\\n }\\n .text-2xl {\\n font-size: var(--text-2xl);\\n line-height: var(--tw-leading, var(--text-2xl--line-height));\\n }\\n .text-base {\\n font-size: var(--text-base);\\n line-height: var(--tw-leading, var(--text-base--line-height));\\n }\\n .text-lg {\\n font-size: var(--text-lg);\\n line-height: var(--tw-leading, var(--text-lg--line-height));\\n }\\n .text-sm {\\n font-size: var(--text-sm);\\n line-height: var(--tw-leading, var(--text-sm--line-height));\\n }\\n .text-xs {\\n font-size: var(--text-xs);\\n line-height: var(--tw-leading, var(--text-xs--line-height));\\n }\\n .leading-5 {\\n --tw-leading: calc(var(--spacing) * 5);\\n line-height: calc(var(--spacing) * 5);\\n }\\n .leading-relaxed {\\n --tw-leading: var(--leading-relaxed);\\n line-height: var(--leading-relaxed);\\n }\\n .font-bold {\\n --tw-font-weight: var(--font-weight-bold);\\n font-weight: var(--font-weight-bold);\\n }\\n .font-medium {\\n --tw-font-weight: var(--font-weight-medium);\\n font-weight: var(--font-weight-medium);\\n }\\n .font-normal {\\n --tw-font-weight: var(--font-weight-normal);\\n font-weight: var(--font-weight-normal);\\n }\\n .font-semibold {\\n --tw-font-weight: var(--font-weight-semibold);\\n font-weight: var(--font-weight-semibold);\\n }\\n .whitespace-pre-line {\\n white-space: pre-line;\\n }\\n .text-blue-600 {\\n color: var(--color-blue-600);\\n }\\n .text-gray-400 {\\n color: var(--color-gray-400);\\n }\\n .text-gray-500 {\\n color: var(--color-gray-500);\\n }\\n .text-gray-600 {\\n color: var(--color-gray-600);\\n }\\n .text-gray-700 {\\n color: var(--color-gray-700);\\n }\\n .text-gray-800 {\\n color: var(--color-gray-800);\\n }\\n .text-gray-900 {\\n color: var(--color-gray-900);\\n }\\n .text-white {\\n color: var(--color-white);\\n }\\n .text-yellow-500 {\\n color: var(--color-yellow-500);\\n }\\n .uppercase {\\n text-transform: uppercase;\\n }\\n .italic {\\n font-style: italic;\\n }\\n .no-underline\\\\! {\\n text-decoration-line: none !important;\\n }\\n .underline {\\n text-decoration-line: underline;\\n }\\n .opacity-0 {\\n opacity: 0%;\\n }\\n .opacity-25 {\\n opacity: 25%;\\n }\\n .opacity-50 {\\n opacity: 50%;\\n }\\n .opacity-75 {\\n opacity: 75%;\\n }\\n .opacity-100 {\\n opacity: 100%;\\n }\\n .shadow-lg {\\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .shadow-md {\\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .shadow-sm {\\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .shadow-xl {\\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .ring-1 {\\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .ring-2 {\\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n .ring-black\\\\/5 {\\n --tw-ring-color: color-mix(in srgb, #000 5%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-ring-color: color-mix(in oklab, var(--color-black) 5%, transparent);\\n }\\n }\\n .ring-gray-100 {\\n --tw-ring-color: var(--color-gray-100);\\n }\\n .blur {\\n --tw-blur: blur(8px);\\n 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,);\\n }\\n .filter {\\n 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,);\\n }\\n .transition-all {\\n transition-property: all;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .transition-colors {\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n outline-color,\\n text-decoration-color,\\n fill,\\n stroke,\\n --tw-gradient-from,\\n --tw-gradient-via,\\n --tw-gradient-to;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .transition-opacity {\\n transition-property: opacity;\\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\\n transition-duration: var(--tw-duration, var(--default-transition-duration));\\n }\\n .duration-200 {\\n --tw-duration: 200ms;\\n transition-duration: 200ms;\\n }\\n .shimmer-color-gray-300\\\\/30 {\\n --alpha: 100%;\\n --alpha: calc(30 * 1%);\\n --shimmer-color: oklch(87.2% 0.01 258.338);\\n @supports (color: color-mix(in lab, red, red)) {\\n --shimmer-color: color-mix(in oklab, var(--color-gray-300) var(--alpha, 100%), transparent);\\n }\\n }\\n .shimmer-color-gray-400\\\\/20 {\\n --alpha: 100%;\\n --alpha: calc(20 * 1%);\\n --shimmer-color: oklch(70.7% 0.022 261.325);\\n @supports (color: color-mix(in lab, red, red)) {\\n --shimmer-color: color-mix(in oklab, var(--color-gray-400) var(--alpha, 100%), transparent);\\n }\\n }\\n .outline-none {\\n --tw-outline-style: none;\\n outline-style: none;\\n }\\n .select-none {\\n -webkit-user-select: none;\\n user-select: none;\\n }\\n .\\\\[--shimmer-x\\\\:60\\\\] {\\n --shimmer-x: 60;\\n }\\n .\\\\[--shimmer-y\\\\:0\\\\] {\\n --shimmer-y: 0;\\n }\\n .\\\\[--shimmer-y\\\\:20\\\\] {\\n --shimmer-y: 20;\\n }\\n .\\\\[--shimmer-y\\\\:40\\\\] {\\n --shimmer-y: 40;\\n }\\n .\\\\[--shimmer-y\\\\:60\\\\] {\\n --shimmer-y: 60;\\n }\\n .\\\\[--shimmer-y\\\\:80\\\\] {\\n --shimmer-y: 80;\\n }\\n .group-hover\\\\:opacity-100 {\\n &:is(:where(.group):hover *) {\\n @media (hover: hover) {\\n opacity: 100%;\\n }\\n }\\n }\\n .hover\\\\:border-gray-300 {\\n &:hover {\\n @media (hover: hover) {\\n border-color: var(--color-gray-300);\\n }\\n }\\n }\\n .hover\\\\:border-gray-400 {\\n &:hover {\\n @media (hover: hover) {\\n border-color: var(--color-gray-400);\\n }\\n }\\n }\\n .hover\\\\:bg-gray-50 {\\n &:hover {\\n @media (hover: hover) {\\n background-color: var(--color-gray-50);\\n }\\n }\\n }\\n .hover\\\\:bg-gray-100 {\\n &:hover {\\n @media (hover: hover) {\\n background-color: var(--color-gray-100);\\n }\\n }\\n }\\n .hover\\\\:bg-gray-800 {\\n &:hover {\\n @media (hover: hover) {\\n background-color: var(--color-gray-800);\\n }\\n }\\n }\\n .hover\\\\:text-black {\\n &:hover {\\n @media (hover: hover) {\\n color: var(--color-black);\\n }\\n }\\n }\\n .hover\\\\:text-gray-700 {\\n &:hover {\\n @media (hover: hover) {\\n color: var(--color-gray-700);\\n }\\n }\\n }\\n .hover\\\\:text-red-500 {\\n &:hover {\\n @media (hover: hover) {\\n color: var(--color-red-500);\\n }\\n }\\n }\\n .focus\\\\:ring-0 {\\n &:focus {\\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n }\\n .focus\\\\:outline-none {\\n &:focus {\\n --tw-outline-style: none;\\n outline-style: none;\\n }\\n }\\n .focus-visible\\\\:ring-2 {\\n &:focus-visible {\\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\\n box-shadow:\\n var(--tw-inset-shadow),\\n var(--tw-inset-ring-shadow),\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow);\\n }\\n }\\n .focus-visible\\\\:ring-white\\\\/75 {\\n &:focus-visible {\\n --tw-ring-color: color-mix(in srgb, #fff 75%, transparent);\\n @supports (color: color-mix(in lab, red, red)) {\\n --tw-ring-color: color-mix(in oklab, var(--color-white) 75%, transparent);\\n }\\n }\\n }\\n .focus-visible\\\\:ring-offset-2 {\\n &:focus-visible {\\n --tw-ring-offset-width: 2px;\\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n }\\n }\\n .focus-visible\\\\:ring-offset-blue-300 {\\n &:focus-visible {\\n --tw-ring-offset-color: var(--color-blue-300);\\n }\\n }\\n .active\\\\:scale-95 {\\n &:active {\\n --tw-scale-x: 95%;\\n --tw-scale-y: 95%;\\n --tw-scale-z: 95%;\\n scale: var(--tw-scale-x) var(--tw-scale-y);\\n }\\n }\\n .data-closed\\\\:opacity-0 {\\n &[data-closed] {\\n opacity: 0%;\\n }\\n }\\n .sm\\\\:grid-cols-2 {\\n @media (width >= 40rem) {\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n }\\n }\\n .sm\\\\:text-sm {\\n @media (width >= 40rem) {\\n font-size: var(--text-sm);\\n line-height: var(--tw-leading, var(--text-sm--line-height));\\n }\\n }\\n .md\\\\:min-w-md {\\n @media (width >= 48rem) {\\n min-width: var(--container-md);\\n }\\n }\\n .md\\\\:grid-cols-3 {\\n @media (width >= 48rem) {\\n grid-template-columns: repeat(3, minmax(0, 1fr));\\n }\\n }\\n}\\n@property --shimmer-track-height { syntax: \\\"<length>\\\"; inherits: true; initial-value: 200px; }\\n@property --shimmer-angle { syntax: \\\"<angle>\\\"; inherits: true; initial-value: 15deg; }\\n@layer base {\\n *,\\n ::after,\\n ::before,\\n ::backdrop,\\n ::file-selector-button {\\n border-color: var(--color-gray-200, currentcolor);\\n }\\n}\\n.editor-paragraph {\\n margin-bottom: 0px !important;\\n}\\n@property --tw-space-y-reverse { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-divide-y-reverse { syntax: \\\"*\\\"; inherits: false; initial-value: 0; }\\n@property --tw-border-style { syntax: \\\"*\\\"; inherits: false; initial-value: solid; }\\n@property --tw-gradient-position { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-gradient-from { syntax: \\\"<color>\\\"; inherits: false; initial-value: #0000; }\\n@property --tw-gradient-via { syntax: \\\"<color>\\\"; inherits: false; initial-value: #0000; }\\n@property --tw-gradient-to { syntax: \\\"<color>\\\"; inherits: false; initial-value: #0000; }\\n@property --tw-gradient-stops { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-gradient-via-stops { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-gradient-from-position { syntax: \\\"<length-percentage>\\\"; inherits: false; initial-value: 0%; }\\n@property --tw-gradient-via-position { syntax: \\\"<length-percentage>\\\"; inherits: false; initial-value: 50%; }\\n@property --tw-gradient-to-position { syntax: \\\"<length-percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-leading { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-font-weight { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-shadow-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-shadow-alpha { syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-inset-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-inset-shadow-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-inset-shadow-alpha { syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-ring-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-ring-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-inset-ring-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-inset-ring-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-ring-inset { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-ring-offset-width { syntax: \\\"<length>\\\"; inherits: false; initial-value: 0px; }\\n@property --tw-ring-offset-color { syntax: \\\"*\\\"; inherits: false; initial-value: #fff; }\\n@property --tw-ring-offset-shadow { syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000; }\\n@property --tw-blur { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-brightness { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-contrast { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-grayscale { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-hue-rotate { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-invert { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-opacity { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-saturate { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-sepia { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-drop-shadow { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-drop-shadow-color { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-drop-shadow-alpha { syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%; }\\n@property --tw-drop-shadow-size { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-duration { syntax: \\\"*\\\"; inherits: false; }\\n@property --tw-scale-x { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-scale-y { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@property --tw-scale-z { syntax: \\\"*\\\"; inherits: false; initial-value: 1; }\\n@keyframes spin {\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n@keyframes tw-shimmer {\\n from {\\n background-position: 100% 0;\\n }\\n}\\n@layer properties {\\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\\n :root,\\n :host {\\n --shimmer-track-height: 200px;\\n --shimmer-angle: 15deg;\\n }\\n *,\\n ::before,\\n ::after,\\n ::backdrop {\\n --tw-space-y-reverse: 0;\\n --tw-divide-y-reverse: 0;\\n --tw-border-style: solid;\\n --tw-gradient-position: initial;\\n --tw-gradient-from: #0000;\\n --tw-gradient-via: #0000;\\n --tw-gradient-to: #0000;\\n --tw-gradient-stops: initial;\\n --tw-gradient-via-stops: initial;\\n --tw-gradient-from-position: 0%;\\n --tw-gradient-via-position: 50%;\\n --tw-gradient-to-position: 100%;\\n --tw-leading: initial;\\n --tw-font-weight: initial;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-color: initial;\\n --tw-shadow-alpha: 100%;\\n --tw-inset-shadow: 0 0 #0000;\\n --tw-inset-shadow-color: initial;\\n --tw-inset-shadow-alpha: 100%;\\n --tw-ring-color: initial;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-inset-ring-color: initial;\\n --tw-inset-ring-shadow: 0 0 #0000;\\n --tw-ring-inset: initial;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-blur: initial;\\n --tw-brightness: initial;\\n --tw-contrast: initial;\\n --tw-grayscale: initial;\\n --tw-hue-rotate: initial;\\n --tw-invert: initial;\\n --tw-opacity: initial;\\n --tw-saturate: initial;\\n --tw-sepia: initial;\\n --tw-drop-shadow: initial;\\n --tw-drop-shadow-color: initial;\\n --tw-drop-shadow-alpha: 100%;\\n --tw-drop-shadow-size: initial;\\n --tw-duration: initial;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-scale-z: 1;\\n }\\n }\\n}\\n\")","import {\n RefObject,\n ReactNode,\n useEffect,\n useState,\n ImgHTMLAttributes,\n} from \"react\";\nimport {\n NLWeb,\n useNlWeb,\n UseNlWebConfig,\n NLWebSearchState,\n SearchResponse,\n} from \"../lib/useNlWeb\";\nimport { Dialog, DialogPanel, Button } from \"@headlessui/react\";\nimport { XMarkIcon, NewspaperIcon } from \"@heroicons/react/24/solid\";\nimport { clsx } from \"clsx\";\nimport {\n getThumbnailCandidates,\n isMovieResult,\n NlwebResult,\n} from \"../lib/parseSchema\";\nimport { shortQuantity, intersperse } from \"../lib/util\";\nimport { QueryResultSet } from \"../lib/useHistory\";\nimport { SearchQuery } from \"./SearchQuery\";\nimport { useAutoScroll } from \"../lib/useAutoScroll\";\n\nfunction decodeHtmlEntities(text: string): string {\n return text\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) =>\n String.fromCharCode(parseInt(hex, 16)),\n )\n .replace(/&#(\\d+);/g, (_, dec) => String.fromCharCode(parseInt(dec, 10)))\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&nbsp;/g, \" \");\n}\n\nfunction ResultCardSkeleton() {\n return (\n <div className=\"block w-full transition-all overflow-hidden shimmer-container\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"h-36 w-full shimmer shimmer-bg shimmer-color-gray-300/30 [--shimmer-x:60] [--shimmer-y:0] bg-gray-100 rounded\"></div>\n <div className=\"flex-1 min-w-0 space-y-2\">\n <div className=\"h-4 bg-gray-100 rounded w-3/4\"></div>\n <div className=\"space-y-1\">\n <div className=\"h-3 bg-gray-100 rounded w-full\"></div>\n <div className=\"h-3 bg-gray-100 rounded w-5/6\"></div>\n <div className=\"h-3 bg-gray-100 rounded w-5/6\"></div>\n </div>\n <div className=\"h-2 bg-gray-100 rounded w-1/6\"></div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ResultCard({ result }: { result: NlwebResult }) {\n const srcs = getThumbnailCandidates(result);\n\n return (\n <a\n href={(result.url || result.grounding || \"#\") as string}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block no-underline! transition-all duration-200 overflow-hidden\"\n >\n <div className=\"flex flex-col gap-3\">\n <Thumbnail\n srcs={srcs}\n alt={decodeHtmlEntities(\n (result.name || result.title || \"Result image\") as string,\n )}\n />\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-medium text-gray-900 text-sm mb-1 line-clamp-2\">\n {decodeHtmlEntities(\n (result.name || result.title || \"Untitled\") as string,\n )}\n </h3>\n <ResultCardDetails result={result} />\n {result.description && (\n <p className=\"text-xs text-gray-600 line-clamp-3 mb-2\">\n {typeof result.description == \"string\"\n ? decodeHtmlEntities(result.description)\n : \"\"}\n </p>\n )}\n {result.site && (\n <div className=\"flex items-center gap-1 text-xs text-gray-500\">\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\"\n />\n </svg>\n <span className=\"truncate\">{result.site}</span>\n </div>\n )}\n </div>\n </div>\n </a>\n );\n}\n\n/**\n * `@type`-specific details for rendering inside a result card.\n */\nfunction ResultCardDetails({ result }: { result: NlwebResult }) {\n if (isMovieResult(result)) {\n return (\n <>\n {result.director && (\n <div className=\"text-xs text-gray-500 font-semibold\">\n {Array.isArray(result.director)\n ? result.director.map((d) => d.name).join(\", \")\n : result.director.name}\n </div>\n )}\n <div className=\"flex items-center gap-1\">\n {intersperse(\n [\n result.aggregateRating?.ratingValue ? (\n <span className=\"flex items-center gap-1\">\n <span className=\"text-yellow-500\">★</span>\n <span className=\"text-xs\">\n {typeof result.aggregateRating.ratingValue === \"number\"\n ? result.aggregateRating.ratingValue.toFixed(1)\n : result.aggregateRating.ratingValue}\n </span>\n </span>\n ) : null,\n result.aggregateRating?.ratingCount ? (\n <span className=\"text-xs text-gray-500\">\n {shortQuantity(result.aggregateRating.ratingCount)} review\n {result.aggregateRating.ratingCount != 1 ? \"s\" : \"\"}\n </span>\n ) : null,\n ].filter(Boolean),\n <span className=\"text-xs text-gray-400\">|</span>,\n )}\n </div>\n </>\n );\n }\n\n return null;\n}\n\nfunction Thumbnail({\n srcs,\n className,\n ...rest\n}: { srcs: string[] } & ImgHTMLAttributes<HTMLImageElement>) {\n // We allow `hasError` to advance this until we exhaust all srcs, at which point\n // we render the placeholder icon.\n const [srcIndex, setSrcIndex] = useState(0);\n\n function advance() {\n setSrcIndex((srcIndex) => {\n const nextIndex = srcIndex + 1;\n return Math.min(nextIndex, srcs.length);\n });\n }\n\n const srcsExhausted = srcIndex >= srcs.length;\n return (\n <div\n className={clsx(\n \"relative text-xs flex-shrink-0 h-36 rounded\",\n srcsExhausted && \"bg-gray-100 flex items-center justify-center\",\n className,\n )}\n >\n {srcsExhausted ? (\n <NewspaperIcon className=\"absolute size-5 text-gray-400\" />\n ) : null}\n <img\n src={srcs[srcIndex]}\n className={clsx(\n \"w-full! h-full! object-cover! rounded!\",\n srcsExhausted && \"invisible\",\n )}\n {...rest}\n onError={advance}\n />\n </div>\n );\n}\n\nfunction SummarySkeleton() {\n return (\n <div className=\"space-y-3 w-full md:min-w-md shimmer-container\">\n <div className=\"h-4 shimmer shimmer-bg shimmer-color-gray-400/20 [--shimmer-x:60] [--shimmer-y:0] bg-gray-200 rounded-md w-full\"></div>\n <div className=\"h-4 shimmer shimmer-bg shimmer-color-gray-400/20 [--shimmer-x:60] [--shimmer-y:20] bg-gray-200 rounded-md w-11/12\"></div>\n <div className=\"h-4 shimmer shimmer-bg shimmer-color-gray-400/20 [--shimmer-x:60] [--shimmer-y:40] bg-gray-200 rounded-md w-full\"></div>\n <div className=\"h-4 shimmer shimmer-bg shimmer-color-gray-400/20 [--shimmer-x:60] [--shimmer-y:60] bg-gray-200 rounded-md w-10/12\"></div>\n <div className=\"h-4 shimmer shimmer-bg shimmer-color-gray-400/20 [--shimmer-x:60] [--shimmer-y:80] bg-gray-200 rounded-md w-full\"></div>\n </div>\n );\n}\nfunction SummaryCard({ summary }: { summary?: string | null }) {\n if (summary) {\n return (\n <div className=\"text-lg text-gray-800 leading-relaxed\">{summary}</div>\n );\n }\n\n // Skeleton loader with pulsing animation\n return <SummarySkeleton />;\n}\n\nfunction SearchingFor({\n query,\n streaming,\n}: {\n query?: string | null;\n streaming?: boolean;\n}) {\n return (\n <div\n className={clsx(\n \"text-gray-500 gap-1 flex items-center text-sm pb-2 px-2\",\n streaming && \"shimmer\",\n )}\n >\n {query ? (\n <span key={query} className=\"text-gray-800 overflow-ellipse\">\n Searching for: {query}\n </span>\n ) : (\n \"Working on it\"\n )}\n </div>\n );\n}\n\nfunction PageButton({\n page,\n onClick,\n activePage,\n disabled = true,\n}: {\n page: number;\n activePage: number;\n onClick: () => void;\n disabled?: boolean;\n}) {\n return (\n <Button\n disabled={disabled}\n onClick={onClick}\n className={clsx(\n \"text-sm p-2 size-6 rounded-md transition-colors duration-200 hover:bg-gray-100 flex items-center justify-center\",\n page == activePage ? \"text-gray-700\" : \"text-gray-400\",\n disabled ? \"opacity-50 pointer-events-none\" : \"\",\n )}\n >\n {page + 1}\n </Button>\n );\n}\n\nfunction AssistantMessage({\n summary,\n results,\n loading,\n addResults,\n followUpQuery,\n config,\n anchorRef,\n}: {\n summary?: string | null;\n results: NlwebResult[];\n addResults: (results: NlwebResult[]) => Promise<void>;\n followUpQuery: string;\n config: UseNlWebConfig;\n loading?: boolean;\n anchorRef?: RefObject<HTMLDivElement | null>;\n}) {\n // Create a local nlweb instance, to power pagination.\n const nlweb = useNlWeb(config);\n // We dont want decontextualization to happen.\n const maxResults = config.maxResults || 50;\n const numRetrievalResults = config.numRetrievalResults || 50;\n const pagesAvailable = Math.floor(numRetrievalResults / maxResults);\n const [page, setPage] = useState(0);\n const pageRange: number[] = Array.from(\n { length: pagesAvailable + 1 },\n (_, index) => index,\n );\n async function viewMoreResults(pageNumber: number) {\n setPage(pageNumber);\n const offsetToFetch = pageNumber * maxResults;\n if (results.length <= offsetToFetch) {\n // Here, we explicitly set convo history to none so that we dont\n // decontexttualize the query again.\n const response = await nlweb.search({\n query: followUpQuery,\n conversationHistory: [],\n resultOffset: offsetToFetch,\n });\n await addResults(response.results);\n }\n }\n const pageOffset = page * maxResults;\n const isStreamingPage = pageOffset == nlweb.resultOffset;\n const resultsOfPage = isStreamingPage\n ? nlweb.results\n : results.slice(pageOffset, (page + 1) * maxResults);\n const skeletonCount = Math.max(0, 9 - resultsOfPage.length);\n return (\n <div className=\"flex justify-start\">\n <div className=\"max-w-3xl flex-1 bg-gray-50 p-6 rounded-lg\">\n <div className=\"space-y-4 mb-2\">\n <SummaryCard summary={summary} />\n <div ref={anchorRef} />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-6\">\n {resultsOfPage.map((r, idx) => (\n <ResultCard result={r} key={(r.url || r.name || idx) as string} />\n ))}\n {(loading || (nlweb.loading && isStreamingPage)) &&\n Array.from({ length: skeletonCount }).map((_, idx) => (\n <ResultCardSkeleton key={`skeleton-${idx}`} />\n ))}\n </div>\n </div>\n <div className=\"flex mt-4 -mx-2 items-center gap-2\">\n {pageRange.map(\n (p) =>\n results.length >= p * maxResults &&\n (p + 1) * maxResults < numRetrievalResults && (\n <PageButton\n onClick={() => viewMoreResults(p)}\n page={p}\n activePage={page}\n key={p}\n disabled={loading}\n />\n ),\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction QueryMessage({ query }: { query: string }) {\n return (\n <div className=\"flex justify-end mb-6\">\n <div className=\"max-w-2xl\">\n <div className=\"bg-gray-900 text-white rounded-2xl rounded-tr-sm px-4 py-3 shadow-sm\">\n <p className=\"text-sm leading-relaxed whitespace-pre-line\">{query}</p>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ChatEntry({\n index,\n query,\n loading,\n decontextualizedQuery,\n summary,\n results,\n config,\n addResults,\n anchorRef,\n}: {\n index: number;\n query: string;\n loading: boolean;\n decontextualizedQuery?: string | null;\n summary?: string | null;\n results: NlwebResult[];\n config: UseNlWebConfig;\n addResults: (results: NlwebResult[]) => Promise<void>;\n anchorRef?: RefObject<HTMLDivElement | null>;\n}) {\n return (\n <div key={`${query}-${index}`}>\n {index > 0 ? <QueryMessage query={query} /> : null}\n {index > 0 ? (\n <SearchingFor streaming={loading} query={decontextualizedQuery} />\n ) : null}\n {results.length > 0 || loading ? (\n <AssistantMessage\n anchorRef={anchorRef}\n summary={summary}\n results={results}\n loading={loading}\n followUpQuery={decontextualizedQuery || query}\n addResults={addResults}\n config={config}\n />\n ) : (\n <div className=\"flex max-w-3xl text-base text-gray-500 justify-start bg-gray-50 p-6 rounded-lg\">\n No results found\n </div>\n )}\n </div>\n );\n}\n\nfunction ChatResults({\n nlweb,\n config,\n searches,\n addResults,\n anchorRef,\n}: {\n nlweb: NLWebSearchState;\n config: UseNlWebConfig;\n searches: QueryResultSet[];\n addResults: (id: string, results: NlwebResult[]) => Promise<void>;\n anchorRef: RefObject<HTMLDivElement | null>;\n}) {\n const combinedStreamedResults =\n searches.length - 1 == nlweb.streamingIndex &&\n searches[nlweb.streamingIndex]?.response\n ? [\n ...nlweb.results,\n ...searches[nlweb.streamingIndex].response.results.slice(\n nlweb.results.length,\n ),\n ]\n : nlweb.results;\n return (\n <div className=\"space-y-4 py-6\">\n {searches.map(\n (r, idx) =>\n idx != nlweb.streamingIndex && (\n <ChatEntry\n key={`${r.query}-${idx}`}\n loading={false}\n index={idx}\n query={r.query}\n results={r.response.results}\n summary={r.response.summary}\n decontextualizedQuery={r.response.decontextualizedQuery}\n config={config}\n addResults={(results) => addResults(r.id || \"\", results)}\n />\n ),\n )}\n {nlweb.query && (\n <ChatEntry\n key={`${nlweb.query}-${nlweb.streamingIndex}`}\n index={nlweb.streamingIndex}\n query={nlweb.query}\n results={combinedStreamedResults}\n summary={nlweb.summary}\n decontextualizedQuery={nlweb.decontextualizedQuery}\n loading={nlweb.loading}\n anchorRef={anchorRef}\n config={config}\n addResults={(r) =>\n addResults(searches[nlweb.streamingIndex].id || \"\", r)\n }\n />\n )}\n </div>\n );\n}\n\nexport function ChatSearch({\n searches,\n addSearch,\n addResults,\n startSession,\n endSession,\n nlweb,\n config,\n children,\n sidebar,\n sessionId = \"NLWEB_DEFAULT_SESSION\",\n}: {\n sessionId?: string;\n searches: QueryResultSet[];\n addSearch: (r: QueryResultSet) => Promise<void> | void;\n addResults: (id: string, results: NlwebResult[]) => Promise<void>;\n startSession: (query: string) => Promise<string> | void;\n endSession: () => void;\n nlweb: NLWeb;\n config: UseNlWebConfig;\n children?: ReactNode;\n sidebar?: ReactNode;\n}) {\n const { anchorRef } = useAutoScroll<HTMLDivElement>([nlweb.query]);\n const [searchOpen, setSearchOpen] = useState(searches.length > 0);\n function closeSearch() {\n setSearchOpen(false);\n if (endSession) {\n endSession();\n }\n }\n async function handleSearch(query: string, isRoot: boolean) {\n let response: SearchResponse;\n let sId: string = sessionId;\n if (isRoot) {\n sId = (await startSession(query)) || sessionId;\n setSearchOpen(true);\n response = await nlweb.search({\n query: query,\n });\n } else {\n response = await nlweb.search({\n query: query,\n conversationHistory: searches.map((r) => r.query),\n });\n }\n // Add to store, in the correct way\n if (sId) {\n const search = { query: query, response: response, sessionId: sId };\n await addSearch(search);\n }\n }\n useEffect(() => {\n if (searches.length > 0 && !searchOpen) {\n setSearchOpen(true);\n }\n }, [searches]);\n const rootQuery = searches.length > 0 ? searches[0].query : nlweb.query;\n return (\n <div>\n <div className=\"mb-6 min-w-50 max-h-12 relative z-30\">\n <SearchQuery\n loading={nlweb.loading}\n handleSearch={(q) => handleSearch(q, true)}\n />\n </div>\n <Dialog\n className={\"relative z-50\"}\n open={searchOpen}\n onClose={closeSearch}\n >\n <div className=\"fixed bg-white inset-0 w-screen h-screen overflow-hidden\">\n <Button\n onClick={closeSearch}\n className=\"z-50 text-gray-500 hover:text-black absolute right-6 top-4\"\n >\n <XMarkIcon className=\"size-5\" />\n </Button>\n <DialogPanel\n className={\"w-full h-screen flex items-stretch overflow-hidden\"}\n >\n {sidebar}\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {children}\n <div className=\"relative flex-1 overflow-hidden flex flex-col\">\n <div className=\"flex-1 overflow-y-auto p-4 pt-16 pb-24\">\n <div className=\"max-w-7xl mx-auto\">\n <div className=\"mb-6 max-w-xl mx-auto\">\n <SearchQuery\n key={rootQuery || \"empty-search\"}\n className=\"bg-gray-50\"\n loading={nlweb.loading}\n handleSearch={(q) => handleSearch(q, true)}\n initQuery={rootQuery}\n />\n </div>\n <ChatResults\n nlweb={nlweb}\n searches={searches}\n addResults={addResults}\n config={config}\n anchorRef={anchorRef}\n />\n </div>\n </div>\n <div className=\"absolute pointer-events-none bottom-0 top-[calc(100%_-_100px)] bg-gradient-to-b from-transparent to-white left-0 right-0\" />\n <div className=\"absolute bottom-8 left-4 right-4\">\n <div className=\"max-w-xl mx-auto\">\n <SearchQuery\n key={nlweb.query}\n loading={nlweb.loading}\n handleSearch={(q) => handleSearch(q, false)}\n inputClassName=\"max-h-[60vh] overflow-y-auto\"\n className=\"shadow-xl bg-white\"\n placeholder=\"Enter a follow up query\"\n />\n </div>\n </div>\n </div>\n </div>\n </DialogPanel>\n </div>\n </Dialog>\n </div>\n );\n}\n","// Copyright (c) 2025 Microsoft Corporation.\n// Licensed under the MIT License\n\nimport { useState, useCallback, useEffect, useRef } from \"react\";\nimport { Thing } from \"schema-dts\";\nimport { NlwebResult, parseSchema } from \"./parseSchema\";\n\n/**\n * Error response structure\n */\ninterface NLWebError {\n code: string;\n message: string;\n}\n\n/**\n * Search state\n */\nexport interface NLWebSearchState {\n results: NlwebResult[];\n resultOffset?: number;\n streamingIndex: number;\n summary?: string;\n decontextualizedQuery?: string;\n query: string | null;\n loading: boolean;\n error: string | null;\n rawLogs?: object[];\n}\n\nexport interface NLWeb extends NLWebSearchState {\n search: (params: NLWebSearchParams) => Promise<SearchResponse>;\n cancelSearch: () => void;\n clearResults: () => void;\n}\n/**\n * Search request parameters\n */\nexport interface NLWebSearchParams {\n query: string;\n mode?: \"list\" | \"list,summarize\";\n userId?: string;\n remember?: boolean;\n conversationHistory?: string[];\n resultOffset?: number;\n}\n\n/**\n * v0.54 API Request structure\n */\nexport interface V054Request {\n query: {\n text: string;\n site: string;\n max_results: number; // Ranked results\n num_results: number; // Retrieval results\n };\n prefer: {\n streaming: boolean;\n response_format: \"conv_search\" | \"chatgpt_app\";\n mode: string;\n };\n meta: {\n api_version: string;\n user?: {\n id: string;\n };\n remember?: boolean;\n start_num?: number;\n };\n context?: {\n \"@type\": \"ConversationalContext\";\n prev: string[];\n };\n}\n\n/**\n * Hook configuration\n */\nexport interface UseNlWebConfig {\n endpoint: string;\n site: string;\n maxResults?: number;\n numRetrievalResults?: number;\n}\n\nexport interface SearchResponse {\n results: NlwebResult[];\n decontextualizedQuery?: string;\n summary?: string;\n rawLogs?: object[];\n}\n\nexport function convertParamsToRequest(\n params: NLWebSearchParams,\n site: string,\n numRetrievalResults: number = 50,\n maxResults: number = 9,\n): V054Request {\n const v054Request: V054Request = {\n query: {\n text: params.query,\n site: site,\n max_results: maxResults,\n num_results: numRetrievalResults,\n },\n prefer: {\n streaming: true,\n response_format: \"conv_search\",\n mode: \"list, summarize\",\n },\n meta: {\n api_version: \"0.54\",\n start_num: params.resultOffset || 0,\n },\n };\n\n // Add user metadata if provided\n if (params.userId) {\n v054Request.meta.user = {\n id: params.userId,\n };\n }\n\n // Add remember flag if provided\n if (params.remember) {\n v054Request.meta.remember = true;\n }\n\n // Add conversation context if available\n if (params.conversationHistory && params.conversationHistory.length > 0) {\n v054Request.context = {\n \"@type\": \"ConversationalContext\",\n prev: params.conversationHistory.slice(-5), // Last 5 queries\n };\n }\n\n return v054Request;\n}\n\n/**\n * Custom hook for NLWeb search with SSE streaming support\n *\n * @param config - Hook configuration including endpoint URL\n * @returns Search state and search function\n */\nexport function useNlWeb(config: UseNlWebConfig): NLWeb {\n const { endpoint, site, maxResults = 9, numRetrievalResults = 50 } = config;\n\n const [state, setState] = useState<NLWebSearchState>({\n results: [],\n query: null,\n error: null,\n rawLogs: [],\n streamingIndex: -1,\n loading: false,\n });\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n /**\n * Sort results by score in descending order\n */\n const sortResultsByScore = useCallback(\n (results: NlwebResult[]): NlwebResult[] => {\n return [...results].sort((a, b) => {\n const scoreA = a.score || 0;\n const scoreB = b.score || 0;\n return scoreB - scoreA;\n });\n },\n [],\n );\n\n /**\n * Handle streaming response from NLWeb\n */\n const handleStreamingResponse = useCallback(\n async (response: Response): Promise<SearchResponse> => {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"Response body is not readable\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n const accumulatedResults: NlwebResult[] = [];\n let summary: string = \"\";\n let decontextualizedQuery: string = \"\";\n const debugLogs: object[] = [];\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n for (const line of lines) {\n if (!line.trim() || !line.startsWith(\"data: \")) continue;\n try {\n const dataStr = line.slice(6); // Remove 'data: ' prefix\n const data = JSON.parse(dataStr);\n debugLogs.push(data);\n // Check metadata, if present\n if (data._meta) {\n // Check for failure response\n if (data._meta.response_type === \"Failure\" && data.error) {\n const error: NLWebError = data.error;\n throw new Error(`Error (${error.code}): ${error.message}`);\n } else if (data._meta.decontextualized_query) {\n decontextualizedQuery = data._meta.decontextualized_query;\n setState((prev) => ({\n ...prev,\n rawLogs: debugLogs,\n decontextualizedQuery: decontextualizedQuery,\n }));\n }\n }\n\n // Handle v0.54 results array (conv_search format)\n if (data.results && Array.isArray(data.results)) {\n data.results.forEach((result: Thing) => {\n const parsed = parseSchema(result);\n if (parsed) {\n if (parsed[\"@type\"] == \"Summary\") {\n summary = parsed.text;\n } else {\n // Check if result already exists (by URL or name)\n const exists = accumulatedResults.some(\n (item) => item[\"@id\"] == parsed[\"@id\"],\n );\n\n if (!exists) {\n accumulatedResults.push(parsed);\n }\n }\n }\n });\n\n // Sort and update state\n const sortedResults = sortResultsByScore(accumulatedResults);\n setState((prev) => ({\n ...prev,\n rawLogs: debugLogs,\n summary: summary,\n results: sortedResults,\n decontextualizedQuery: decontextualizedQuery,\n }));\n }\n\n // Handle v0.54 structuredData array (chatgpt_app format)\n if (data.structuredData && Array.isArray(data.structuredData)) {\n data.structuredData.forEach((result: NlwebResult) => {\n // Check if result already exists (by URL or name)\n const exists = accumulatedResults.some(\n (item) =>\n (item.url && item.url === result.url) ||\n (item.name && item.name === result.name),\n );\n\n if (!exists) {\n accumulatedResults.push(result);\n }\n });\n\n // Sort and update state\n const sortedResults = sortResultsByScore(accumulatedResults);\n setState((prev) => ({\n ...prev,\n rawLogs: debugLogs,\n results: sortedResults,\n decontextualizedQuery: decontextualizedQuery,\n }));\n }\n } catch (err) {\n console.error(\"Error parsing SSE line:\", err, \"Line:\", line);\n }\n }\n }\n\n return {\n results: sortResultsByScore(accumulatedResults),\n summary: summary,\n decontextualizedQuery: decontextualizedQuery,\n rawLogs: debugLogs,\n };\n } finally {\n reader.releaseLock();\n }\n },\n [sortResultsByScore],\n );\n\n /**\n * Perform search with streaming results\n */\n const search = useCallback(\n async (params: NLWebSearchParams): Promise<SearchResponse> => {\n // Cancel any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new abort controller\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n const query = params.query;\n const streamingIndex = params.conversationHistory\n ? params.conversationHistory.length\n : 0;\n // Reset state\n setState({\n results: [],\n query: query,\n error: null,\n rawLogs: [],\n streamingIndex: streamingIndex,\n resultOffset: params.resultOffset || 0,\n loading: true,\n });\n\n try {\n // Build v0.54 request\n const v054Request = convertParamsToRequest(\n params,\n site,\n numRetrievalResults,\n maxResults,\n );\n // Send POST request to get streaming response\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n },\n body: JSON.stringify(v054Request),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Handle streaming response\n const results = await handleStreamingResponse(response);\n\n // Update final state\n setState({\n results: results.results,\n summary: results.summary,\n decontextualizedQuery: results.decontextualizedQuery,\n error: null,\n query: query,\n resultOffset: params.resultOffset,\n streamingIndex: streamingIndex,\n rawLogs: results.rawLogs,\n loading: false,\n });\n\n return results;\n } catch (error: any) {\n // Only set error if not aborted\n if (error.name !== \"AbortError\") {\n const errorMessage =\n error.message || \"An error occurred during search\";\n setState({\n results: [],\n query: null,\n error: errorMessage,\n rawLogs: [],\n streamingIndex: streamingIndex,\n loading: false,\n });\n throw error;\n }\n\n // Return empty results if aborted\n return {\n results: [],\n rawLogs: [],\n };\n }\n },\n [endpoint, site, maxResults, handleStreamingResponse],\n );\n\n /**\n * Cancel ongoing search\n */\n const cancelSearch = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n\n setState((prev) => ({\n ...prev,\n query: null,\n }));\n }\n }, []);\n\n /**\n * Clear results\n */\n const clearResults = useCallback(() => {\n setState({\n results: [],\n query: null,\n error: null,\n streamingIndex: -1,\n loading: false,\n });\n }, []);\n\n useEffect(() => {\n clearResults();\n }, [site]);\n\n return {\n ...state,\n search,\n cancelSearch,\n clearResults,\n };\n}\n","import { Thing } from \"schema-dts\";\nimport { z } from \"zod\";\nimport { filterTruthy } from \"./util\";\n\n// === SUPPORTING SCHEMAS ===\n\n// Zod validator for ImageObject\nconst ImageObjectSchema = z\n .object({\n \"@type\": z.literal(\"ImageObject\").optional(),\n \"@id\": z.string(),\n url: z.string().optional(),\n contentUrl: z.string().optional(),\n })\n .passthrough();\n\n// Zod validator for Image - can be string, ImageObject, or array of either\nconst ImageSchema = z.union([\n z.string(),\n ImageObjectSchema,\n z.array(z.union([z.string(), ImageObjectSchema])),\n]);\n\nexport type ImageType = z.infer<typeof ImageSchema>;\n\n// Person schema for director/actor\nconst PersonSchema = z\n .object({\n \"@type\": z.literal(\"Person\").optional(),\n name: z.string(),\n url: z.string().optional(),\n })\n .passthrough();\nexport type PersonType = z.infer<typeof PersonSchema>;\n\n// Organization schema for productionCompany, publisher\nconst OrganizationSchema = z\n .object({\n \"@type\": z.literal(\"Organization\").optional(),\n name: z.string(),\n url: z.string().optional(),\n })\n .passthrough();\nexport type OrganizationType = z.infer<typeof OrganizationSchema>;\n\n// Rating schema for review ratings\nconst RatingSchema = z\n .object({\n \"@type\": z.literal(\"Rating\").optional(),\n ratingValue: z.union([z.string(), z.number()]),\n bestRating: z.union([z.string(), z.number()]).optional(),\n worstRating: z.union([z.string(), z.number()]).optional(),\n })\n .passthrough();\nexport type RatingType = z.infer<typeof RatingSchema>;\n\n// AggregateRating schema\nconst AggregateRatingSchema = z\n .object({\n \"@type\": z.literal(\"AggregateRating\").optional(),\n ratingValue: z.union([z.string(), z.number()]),\n bestRating: z.union([z.string(), z.number()]).optional(),\n worstRating: z.union([z.string(), z.number()]).optional(),\n ratingCount: z.union([z.string(), z.number()]).optional(),\n reviewCount: z.union([z.string(), z.number()]).optional(),\n })\n .passthrough();\nexport type AggregateRatingType = z.infer<typeof AggregateRatingSchema>;\n\n// Review schema\nconst ReviewSchema = z\n .object({\n \"@type\": z.literal(\"Review\").optional(),\n datePublished: z.string().optional(),\n reviewBody: z.string().optional(),\n reviewRating: RatingSchema.optional(),\n author: z.union([PersonSchema, OrganizationSchema, z.string()]).optional(),\n })\n .passthrough();\nexport type ReviewType = z.infer<typeof ReviewSchema>;\n\n// VideoObject schema for trailer\nconst VideoObjectSchema = z\n .object({\n \"@type\": z.literal(\"VideoObject\").optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n thumbnailUrl: z.string().optional(),\n uploadDate: z.string().optional(),\n contentUrl: z.string().optional(),\n embedUrl: z.string().optional(),\n duration: z.string().optional(),\n })\n .passthrough();\nexport type VideoObjectType = z.infer<typeof VideoObjectSchema>;\n\n// === NLWEB RESULT SCHEMAS ===\n\nexport interface Summary {\n \"@type\": \"Summary\";\n text: string;\n}\n\nfunction resultTypeIs(result: NlwebResult, type: string) {\n if (Array.isArray(result[\"@type\"])) {\n return result[\"@type\"].includes(type);\n }\n return result[\"@type\"] == type;\n}\n\n/**\n * Based on the result `@type`, extract possible thumbnail URLs. Different types\n * have different candidates to try; the rules here are based on what works empirically.\n * The `Thumbnail` component uses this to try each candidate in order until one works.\n */\nexport function getThumbnailCandidates(result: NlwebResult): string[] {\n function filter<T>(candidates: (T | null | undefined)[]): T[] {\n return deduplicate(filterTruthy(candidates));\n }\n\n if (isArticleResult(result) && typeof result.thumbnailUrl === \"string\") {\n const thumbnailUrl = result.thumbnailUrl\n ? result.thumbnailUrl.startsWith(\"http\")\n ? result.thumbnailUrl\n : `https://${result.site}${result.thumbnailUrl}`\n : null;\n return filter([thumbnailUrl, getImageUrl(result.image)]);\n }\n if (isMovieResult(result)) {\n return filter([getImageUrl(result.image), result.trailer?.thumbnailUrl]);\n }\n return filter([getImageUrl(result.image)]);\n}\n\nfunction deduplicate<T>(array: T[]): T[] {\n const seen = new Set<T>();\n return array.filter((item) => {\n if (seen.has(item)) {\n return false;\n }\n seen.add(item);\n return true;\n });\n}\n\n// Helper function to extract image URL from various image formats\nexport function getImageUrl(image: ImageType | undefined): string | null {\n if (!image) {\n return null;\n }\n\n // If it's a string, return it directly\n if (typeof image === \"string\") {\n return image;\n }\n\n // If it's an array, get the first item\n if (Array.isArray(image)) {\n if (image.length === 0) {\n return null;\n }\n const firstImage = image[0];\n if (typeof firstImage === \"string\") {\n return firstImage;\n }\n // It's an ImageObject\n return firstImage.contentUrl || firstImage.url || null;\n }\n\n // It's an ImageObject\n return image.contentUrl || image.url || image[\"@id\"];\n}\n\n// Zod validator for Recipe\nconst RecipeSchema = z\n .object({\n \"@type\": z.union([\n z.literal(\"Recipe\"),\n z.array(z.string()).refine((arr) => arr.includes(\"Recipe\"), {\n message: \"Array must contain 'Recipe'\",\n }),\n ]),\n \"@id\": z.string(),\n score: z.number(),\n site: z.string(),\n name: z.string().optional(),\n recipeIngredient: z.union([z.array(z.string()), z.string()]).optional(),\n recipeInstructions: z.any().optional(),\n recipeYield: z.any().optional(),\n cookTime: z.string().optional(),\n prepTime: z.string().optional(),\n totalTime: z.string().optional(),\n description: z.string().optional(),\n image: ImageSchema.optional(),\n })\n .passthrough(); // Allow additional properties\nexport type RecipeResult = z.infer<typeof RecipeSchema>;\n\nexport function isRecipeResult(result: NlwebResult): result is RecipeResult {\n return resultTypeIs(result, \"Recipe\");\n}\n\n// Zod validator for Article\nconst ArticleSchema = z\n .object({\n \"@type\": z.union([\n z.literal(\"Article\"),\n z.literal(\"NewsArticle\"),\n z.literal(\"BlogPosting\"),\n z\n .array(z.string())\n .refine(\n (arr) =>\n arr.includes(\"Article\") ||\n arr.includes(\"NewsArticle\") ||\n arr.includes(\"BlogPosting\"),\n {\n message:\n \"Array must contain 'Article', 'NewsArticle', or 'BlogPosting'\",\n },\n ),\n ]),\n \"@id\": z.string(),\n score: z.number(),\n site: z.string(),\n headline: z.string().optional(),\n description: z.string().optional(),\n image: ImageSchema.optional(),\n author: z.any().optional(),\n publisher: z.any().optional(),\n datePublished: z.string().optional(),\n dateModified: z.string().optional(),\n thumbnailUrl: z.string().optional(),\n })\n .passthrough(); // Allow additional properties\nexport type ArticleResult = z.infer<typeof ArticleSchema>;\n\nexport function isArticleResult(result: NlwebResult): result is ArticleResult {\n return (\n resultTypeIs(result, \"Article\") ||\n resultTypeIs(result, \"NewsArticle\") ||\n resultTypeIs(result, \"BlogPosting\")\n );\n}\n\nconst MovieSchema = z\n .object({\n \"@type\": z.union([\n z.literal(\"Movie\"),\n z.array(z.string()).refine((arr) => arr.includes(\"Movie\"), {\n message: \"Array must contain 'Movie'\",\n }),\n ]),\n \"@id\": z.string(),\n score: z.number(),\n site: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n image: ImageSchema.optional(),\n url: z.string().optional(),\n genre: z.array(z.string()).optional(),\n datePublished: z.string().optional(),\n director: z.union([PersonSchema, z.array(PersonSchema)]).optional(),\n actor: z.union([PersonSchema, z.array(PersonSchema)]).optional(),\n aggregateRating: AggregateRatingSchema.optional(),\n duration: z.string().optional(),\n contentRating: z.string().optional(),\n productionCompany: z\n .union([OrganizationSchema, z.array(OrganizationSchema)])\n .optional(),\n trailer: VideoObjectSchema.optional(),\n review: z.union([ReviewSchema, z.array(ReviewSchema)]).optional(),\n sameAs: z.array(z.string()).optional(),\n // Additional schema.org/Movie properties\n countryOfOrigin: z.any().optional(),\n musicBy: z.union([PersonSchema, z.array(PersonSchema)]).optional(),\n producer: z\n .union([\n PersonSchema,\n OrganizationSchema,\n z.array(z.union([PersonSchema, OrganizationSchema])),\n ])\n .optional(),\n })\n .passthrough(); // Allow additional properties\nexport type MovieResult = z.infer<typeof MovieSchema>;\n\nexport function isMovieResult(result: NlwebResult): result is MovieResult {\n return resultTypeIs(result, \"Movie\");\n}\n\n// Zod validator for Summary\nconst SummarySchema = z\n .object({\n \"@type\": z.literal(\"Summary\"),\n text: z.string(),\n })\n .passthrough(); // Allow additional properties\n\nexport type NlwebResult = RecipeResult | ArticleResult | MovieResult;\n\nexport function parseSchema(data: Thing): NlwebResult | Summary | null {\n // Try to parse as Recipe\n const recipeResult = RecipeSchema.safeParse(data);\n if (recipeResult.success) {\n return recipeResult.data as RecipeResult;\n }\n\n const movieResult = MovieSchema.safeParse(data);\n if (movieResult.success) {\n return movieResult.data as MovieResult;\n }\n\n // Try to parse as Article\n const articleResult = ArticleSchema.safeParse(data);\n if (articleResult.success) {\n return articleResult.data as ArticleResult;\n }\n\n // Try to parse as Summary\n const summaryResult = SummarySchema.safeParse(data);\n if (summaryResult.success) {\n return summaryResult.data as Summary;\n } else {\n console.log(\"failed to parse\", data);\n }\n\n // If none match, return null\n return null;\n}\n","/**\n * abridgedCount(999) => \"999\"\n * abridgedCount(1_500) => \"1.5K\"\n * abridgedCount(15_000) => \"15K\"\n * abridgedCount(150_000) => \"150K\"\n * abridgedCount(2_500_000) => \"2.5M\"\n * abridgedCount(25_000_000) => \"25M\"\n * abridgedCount(3_600_000_000) => \"3.6B\"\n * abridgedCount(7_000_000_000) => \"7B\"\n * ...\n */\nexport function abridgedCount(n: number): string {\n if (n < 1000) {\n return n.toString();\n }\n\n if (n < 1_000_000) {\n const divided = n / 1000;\n const formatted =\n divided % 1 === 0 ? divided.toString() : divided.toFixed(1);\n return formatted + \"K\";\n }\n\n if (n < 1_000_000_000) {\n const divided = n / 1_000_000;\n const formatted =\n divided % 1 === 0 ? divided.toString() : divided.toFixed(1);\n return formatted + \"M\";\n }\n\n const divided = n / 1_000_000_000;\n const formatted = divided % 1 === 0 ? divided.toString() : divided.toFixed(1);\n return formatted + \"B\";\n}\n\n/**\n * The order of magnitude of a number in base 10.\n */\nexport function magnitude(n: number): number {\n if (n === 0) return 0;\n return Math.floor(Math.log10(Math.abs(n)));\n}\n\n/**\n * Picks only truthy values from an array.\n */\nexport function filterTruthy<T>(arr: (T | null | undefined | false)[]): T[] {\n return arr.filter(Boolean) as T[];\n}\n\nexport function intersperse<T>(arr: T[], sep: T): T[] {\n if (arr.length === 0) return [];\n return arr.slice(1).reduce((acc, item) => acc.concat([sep, item]), [arr[0]]);\n}\n\nexport function shortQuantity(value: string | number): string {\n const parsed = tryParseNumber(value);\n return typeof parsed === \"number\" && !isNaN(parsed)\n ? abridgedCount(parsed)\n : String(value);\n}\n\nfunction tryParseNumber(value: string | number): string | number {\n try {\n return typeof value === \"string\" ? parseFloat(value) : value;\n } catch {\n // Should not happen given type of `value`, but just in case.\n return value;\n }\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport { Button } from \"@headlessui/react\";\nimport { MagnifyingGlassIcon, ArrowRightIcon } from \"@heroicons/react/24/solid\";\nimport { clsx } from \"clsx\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { PlainTextPlugin } from \"@lexical/react/LexicalPlainTextPlugin\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useLexicalIsTextContentEmpty } from \"@lexical/react/useLexicalIsTextContentEmpty\";\nimport {\n $getRoot,\n COMMAND_PRIORITY_HIGH,\n KEY_ENTER_COMMAND,\n $createParagraphNode,\n $createTextNode,\n} from \"lexical\";\nimport type { LexicalEditor } from \"lexical\";\n\n// Plugin to handle Enter key vs Shift+Enter\nfunction EnterKeyPlugin({\n onSubmit,\n disabled,\n}: {\n onSubmit: () => void;\n disabled: boolean;\n}) {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n return editor.registerCommand(\n KEY_ENTER_COMMAND,\n (event: KeyboardEvent) => {\n if (disabled) {\n event.preventDefault();\n return true;\n }\n\n if (event.shiftKey) {\n // Shift+Enter: allow default behavior (newline)\n return false;\n } else {\n // Enter: submit the form\n event.preventDefault();\n onSubmit();\n return true;\n }\n },\n COMMAND_PRIORITY_HIGH,\n );\n }, [editor, onSubmit, disabled]);\n\n return null;\n}\n\n// Plugin to set initial value\nfunction InitialValuePlugin({ initQuery }: { initQuery?: string | null }) {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (initQuery) {\n editor.update(() => {\n const root = $getRoot();\n root.clear();\n const paragraph = $createParagraphNode();\n paragraph.append($createTextNode(initQuery));\n root.append(paragraph);\n });\n }\n }, [editor, initQuery]);\n\n return null;\n}\n\n// Plugin to handle focus state\nfunction FocusPlugin({\n onFocusChange,\n}: {\n onFocusChange: (focused: boolean) => void;\n}) {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n return editor.registerRootListener((rootElement, prevRootElement) => {\n if (prevRootElement !== null) {\n prevRootElement.removeEventListener(\"focus\", () => onFocusChange(true));\n prevRootElement.removeEventListener(\"blur\", () => onFocusChange(false));\n }\n if (rootElement !== null) {\n rootElement.addEventListener(\"focus\", () => onFocusChange(true));\n rootElement.addEventListener(\"blur\", () => onFocusChange(false));\n }\n });\n }, [editor, onFocusChange]);\n\n return null;\n}\n\n// Combined plugin to expose editor instance and track empty/multiline state\nfunction EditorStatePlugin({\n editorRef,\n onEmptyChange,\n onMultilineChange,\n}: {\n editorRef: React.MutableRefObject<LexicalEditor | null>;\n onEmptyChange: (isEmpty: boolean) => void;\n onMultilineChange: (isMultiline: boolean) => void;\n}) {\n const [editor] = useLexicalComposerContext();\n const isEmpty = useLexicalIsTextContentEmpty(editor);\n const initialHeightRef = useRef<number | null>(null);\n const isMultilineRef = useRef<boolean>(false);\n\n // Set editor ref\n useEffect(() => {\n editorRef.current = editor;\n return () => {\n editorRef.current = null;\n };\n }, [editor, editorRef]);\n\n // Track empty state\n useEffect(() => {\n onEmptyChange(isEmpty);\n\n // Reset multiline to false when editor becomes empty\n if (isEmpty && isMultilineRef.current) {\n isMultilineRef.current = false;\n onMultilineChange(false);\n }\n }, [isEmpty, onEmptyChange, onMultilineChange]);\n\n // Track height changes for multiline detection\n useEffect(() => {\n const rootElement = editor.getRootElement();\n if (!rootElement) return;\n\n // Capture initial height\n if (initialHeightRef.current === null) {\n initialHeightRef.current = rootElement.offsetHeight;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const currentHeight = entry.contentRect.height;\n // Only set to true when height increases (text wraps)\n if (\n initialHeightRef.current !== null &&\n currentHeight >= initialHeightRef.current\n ) {\n if (!isMultilineRef.current) {\n isMultilineRef.current = true;\n onMultilineChange(true);\n }\n }\n // Don't set to false here - only reset when empty (handled above)\n }\n });\n\n resizeObserver.observe(rootElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [editor, onMultilineChange]);\n\n return null;\n}\n\nexport function SearchQuery({\n initQuery,\n className,\n inputClassName,\n loading,\n handleSearch,\n placeholder = \"Ask anything...\",\n}: {\n initQuery?: string | null;\n className?: string;\n inputClassName?: string;\n placeholder?: string;\n loading: boolean;\n handleSearch: (query: string) => Promise<void>;\n}) {\n const [isFocused, setIsFocused] = useState(false);\n const [isMultiline, setIsMultiline] = useState(false);\n const [hasText, setHasText] = useState(!!initQuery);\n const editorRef = useRef<LexicalEditor | null>(null);\n\n const initialConfig = {\n namespace: \"SearchQuery\",\n theme: {\n paragraph: \"editor-paragraph\",\n text: {\n bold: \"editor-text-bold\",\n italic: \"editor-text-italic\",\n underline: \"editor-text-underline\",\n },\n },\n onError: (error: Error) => {\n console.error(error);\n },\n };\n\n const handleSubmit = useCallback(async () => {\n if (!editorRef.current || loading) return;\n\n // Only serialize when submitting\n const query = editorRef.current.getEditorState().read(() => {\n const root = $getRoot();\n return root.getTextContent();\n });\n\n if (query.trim()) {\n await handleSearch(query);\n }\n }, [loading, handleSearch]);\n\n const handleEmptyChange = useCallback((isEmpty: boolean) => {\n setHasText(!isEmpty);\n }, []);\n\n const handleMultilineChange = useCallback((isMultiline: boolean) => {\n setIsMultiline(isMultiline);\n }, []);\n\n return (\n <LexicalComposer initialConfig={initialConfig}>\n <div\n className={clsx(\n `flex relative rounded-lg border transition-all duration-200`,\n isFocused\n ? \"border-gray-400 shadow-md ring-2 ring-gray-100\"\n : \"border-gray-200 hover:border-gray-300\",\n isMultiline\n ? \"flex-col items-stretch gap-0\"\n : \"flex-row items-center gap-3\",\n className || \"bg-white\",\n )}\n >\n <div\n className={clsx(\n \"absolute left-3.5 pointer-events-none z-10\",\n isMultiline ? \"hidden\" : \"\",\n )}\n >\n <MagnifyingGlassIcon className=\"size-4 text-gray-400\" />\n </div>\n <div className=\"flex-1 relative\">\n <PlainTextPlugin\n contentEditable={\n <ContentEditable\n className={clsx(\n \"outline-none flex-1 m-0 rounded-md text-base px-4 py-3 text-gray-900\",\n isMultiline ? \"pl-4\" : \"pl-10 pr-12\",\n inputClassName,\n loading && \"opacity-50 cursor-not-allowed\",\n )}\n aria-placeholder={placeholder}\n placeholder={\n <div\n className={clsx(\n \"absolute top-3 text-base text-gray-400 pointer-events-none select-none\",\n isMultiline ? \"left-4\" : \"left-10 truncate right-10\",\n )}\n >\n {placeholder}\n </div>\n }\n />\n }\n ErrorBoundary={() => null}\n />\n <HistoryPlugin />\n <EnterKeyPlugin onSubmit={handleSubmit} disabled={loading} />\n <InitialValuePlugin initQuery={initQuery} />\n <FocusPlugin onFocusChange={setIsFocused} />\n <EditorStatePlugin\n editorRef={editorRef}\n onEmptyChange={handleEmptyChange}\n onMultilineChange={handleMultilineChange}\n />\n </div>\n <div\n className={clsx(\n isMultiline ? \"relative flex justify-end p-2\" : \"absolute right-2 \",\n )}\n >\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!hasText || loading}\n className={`p-2 rounded-md transition-all duration-200 ${\n hasText && !loading\n ? \"bg-black text-white hover:bg-gray-800 active:scale-95\"\n : \"bg-gray-100 text-gray-400 cursor-not-allowed\"\n }`}\n aria-label=\"Submit search\"\n >\n {loading ? (\n <svg\n className=\"w-4 h-4 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n ) : (\n <ArrowRightIcon className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </LexicalComposer>\n );\n}\n","import { useEffect, useRef, useCallback } from \"react\";\n\nexport interface AutoScrollRefs<T extends HTMLElement> {\n containerRef: React.RefObject<T | null>;\n anchorRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport const useAutoScroll = <T extends HTMLElement>(\n dependency: any[],\n): AutoScrollRefs<T> => {\n const containerRef = useRef<T>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const shouldScrollRef = useRef(true);\n\n // Function to scroll to the anchor element\n const scrollToAnchor = useCallback(() => {\n if (anchorRef.current) {\n anchorRef.current.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n });\n }\n }, []);\n\n // Effect to manage auto-scrolling when dependency changes (e.g., new message)\n useEffect(() => {\n if (shouldScrollRef.current) {\n scrollToAnchor();\n }\n }, dependency); // eslint-disable-line react-hooks/exhaustive-deps\n\n return { containerRef, anchorRef };\n};\n\nexport default useAutoScroll;\n","import { SearchSession } from \"../lib/useHistory\";\nimport { Button } from \"@headlessui/react\";\nimport {\n XMarkIcon,\n PencilSquareIcon,\n Bars3Icon,\n} from \"@heroicons/react/24/solid\";\nimport { Transition } from \"@headlessui/react\";\nimport { useState } from \"react\";\nimport { clsx } from \"clsx\";\n\ninterface GroupedSessions {\n [site: string]: SearchSession[];\n}\n\nfunction SiteBadge({ site }: { site: string }) {\n const siteParts = site.split(\".\");\n return (\n <div className=\"px-3 py-2 flex gap-2 items-center text-xs font-medium text-gray-400 uppercase\">\n {siteParts[0]}\n </div>\n );\n}\n\nfunction SessionButton({\n session,\n onSelect,\n onDelete,\n selected = false,\n}: {\n session: SearchSession;\n onSelect: () => void;\n onDelete: () => void;\n selected?: boolean;\n}) {\n return (\n <div\n className={clsx(\n \"flex group hover:bg-gray-100 rounded-md overflow-hidden\",\n selected ? \"bg-gray-200/50\" : \"\",\n )}\n >\n <Button\n onClick={onSelect}\n className=\"w-full text-left px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md truncate\"\n >\n {session.query}\n </Button>\n <Button\n onClick={onDelete}\n className=\"opacity-0 group-hover:opacity-100 px-2 flex items-center justify-center text-gray-400 hover:text-red-500 rounded-md transition-all\"\n >\n <XMarkIcon className=\"size-4\" />\n </Button>\n </div>\n );\n}\n\nexport function HistorySidebar({\n selected,\n sessions,\n onSelect,\n onDelete,\n onCreate,\n}: {\n selected?: string;\n sessions: SearchSession[];\n onSelect: (session: SearchSession) => void;\n onDelete: (sessionId: string) => void;\n onCreate: () => void;\n}) {\n const [isOpen, setIsOpen] = useState(sessions.length > 1);\n // Group sessions by site\n const groupedSessions: GroupedSessions = sessions.reduce((acc, session) => {\n const site = session.backend.site;\n if (!acc[site]) {\n acc[site] = [];\n }\n acc[site].push(session);\n return acc;\n }, {} as GroupedSessions);\n return (\n <div\n className={clsx(\n \"flex-1 flex flex-col relative z-50 transition-all\",\n isOpen ? \"max-w-70\" : \"max-w-12\",\n )}\n >\n <div className=\"flex flex-col flex-1 overflow-hidden\">\n <div\n className={clsx(\n \"absolute right-2 top-0 h-12 flex items-center\",\n !isOpen ? \"left-2 flex justify-center\" : \"\",\n )}\n >\n <Button\n onClick={() => setIsOpen(!isOpen)}\n className={\n \"text-gray-400 hover:text-gray-700 transition-colors rounded-lg w-7 h-7 hover:bg-gray-50 flex items-center justify-center\"\n }\n >\n <Bars3Icon className=\"size-5\" />\n </Button>\n </div>\n <div\n className={clsx(\n \"border-r min-w-64 bg-gray-50 overflow-y-auto\",\n \"flex-1 data-closed:opacity-0\",\n )}\n >\n <div\n className={clsx(\n \"h-12 items-center font-medium p-4 px-5 pb-0 pointer-events-none text-xs text-gray-500 transition-opacity\",\n isOpen ? \"opacity-100\" : \"opacity-0\",\n )}\n >\n Chats\n </div>\n <div className=\"px-2\">\n <Button\n onClick={onCreate}\n className={clsx(\n \"flex items-center gap-2 text-left px-2 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md truncate\",\n isOpen ? \"w-full\" : \"\",\n )}\n >\n <PencilSquareIcon className=\"size-4 text-gray-400\" />\n <Transition show={isOpen}>\n <div>New Chat</div>\n </Transition>\n </Button>\n </div>\n <Transition show={isOpen}>\n <div className=\"divide-y\">\n {Object.entries(groupedSessions).map(([site, siteSessions]) => (\n <div key={site} className=\"p-2\">\n <SiteBadge site={site} />\n <div className=\"space-y-1\">\n {siteSessions.map((session) => (\n <SessionButton\n key={session.sessionId}\n selected={session.sessionId == selected}\n session={session}\n onSelect={() => onSelect(session)}\n onDelete={() => onDelete(session.sessionId)}\n />\n ))}\n </div>\n </div>\n ))}\n\n {sessions.length === 0 && (\n <div className=\"px-3 py-8 text-sm text-gray-500 text-center\">\n No search history yet\n </div>\n )}\n </div>\n </Transition>\n </div>\n </div>\n </div>\n );\n}\n","import { QueryResultSet } from \"../lib/useHistory\";\nimport { BugAntIcon } from \"@heroicons/react/24/solid\";\nimport { useState } from \"react\";\nimport {\n Dialog,\n DialogPanel,\n Button,\n Tab,\n TabGroup,\n TabList,\n TabPanel,\n TabPanels,\n} from \"@headlessui/react\";\nimport { clsx } from \"clsx\";\nimport {\n NLWebSearchParams,\n NLWebSearchState,\n UseNlWebConfig,\n V054Request,\n convertParamsToRequest,\n} from \"../lib/useNlWeb\";\n\ninterface NlWebTurn {\n request: V054Request;\n response: object[];\n}\n\nfunction translateResultsToNlWebRequests(\n streamingState: NLWebSearchState,\n results: QueryResultSet[],\n config: UseNlWebConfig,\n): NlWebTurn[] {\n const turns: NlWebTurn[] = [];\n\n // Process completed results\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n\n // Build the search params\n const params: NLWebSearchParams = {\n query: result.query,\n conversationHistory:\n i > 0 ? results.slice(0, i).map((r) => r.query) : undefined,\n };\n\n // Convert to V054Request using the utility function\n const request = convertParamsToRequest(\n params,\n config.site,\n config.numRetrievalResults,\n config.maxResults,\n );\n\n // Create the turn with the request and raw logs as response\n turns.push({\n request: request,\n response: result.response.rawLogs || [],\n });\n }\n\n // Handle loading query and streaming state\n if (streamingState.query) {\n // Build the search params for the loading query\n const streamingParams: NLWebSearchParams = {\n query: streamingState.query,\n conversationHistory:\n results.length > 0 ? results.map((r) => r.query) : undefined,\n };\n\n // Convert to V054Request\n const streamingRequest = convertParamsToRequest(\n streamingParams,\n config.site,\n config.numRetrievalResults,\n config.maxResults,\n );\n\n // Create the turn with the request and streaming raw logs as response\n turns.push({\n request: streamingRequest,\n response: streamingState.rawLogs || [],\n });\n }\n\n return turns;\n}\n\nfunction CodeBlock({ code }: { code: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error(\"Failed to copy:\", err);\n }\n };\n\n return (\n <div className=\"relative overflow-hidden\">\n <Button\n onClick={handleCopy}\n className=\"absolute top-0 right-0 px-3 py-1.5 text-xs font-medium text-gray-600 bg-white border border-gray-300 rounded hover:bg-gray-50 hover:border-gray-400 transition-colors\"\n >\n {copied ? \"Copied!\" : \"Copy\"}\n </Button>\n <pre className=\"overflow-auto text-gray-500 text-sm pr-20\">{code}</pre>\n </div>\n );\n}\n\nfunction MessagesDialog({\n isOpen,\n onClose,\n searches,\n streamingState,\n config,\n}: {\n isOpen: boolean;\n onClose: () => void;\n searches: QueryResultSet[];\n streamingState: NLWebSearchState;\n config: UseNlWebConfig;\n}) {\n return (\n <Dialog open={isOpen} onClose={onClose} className=\"relative z-50\">\n {/* Backdrop */}\n <div className=\"fixed inset-0 bg-black/30\" aria-hidden=\"true\" />\n\n {/* Full-screen container */}\n <div className=\"fixed inset-0 flex items-center justify-center p-4\">\n <DialogPanel className=\"flex flex-col bg-white rounded-lg shadow-xl max-w-3xl w-full max-h-[80vh] overflow-hidden flex flex-col\">\n {/* Content with Tabs */}\n <TabGroup className={\"flex flex-col flex-1 overflow-hidden\"}>\n <TabList className=\"flex border-b bg-gray-50\">\n <Tab\n className={({ selected }) =>\n clsx(\n \"px-6 py-3 text-sm font-medium outline-none transition-colors\",\n selected\n ? \"border-b-2 border-gray-900 text-gray-900\"\n : \"text-gray-500 hover:text-gray-700\",\n )\n }\n >\n Raw Messages\n </Tab>\n </TabList>\n\n <TabPanels className=\"flex-1 overflow-y-auto\">\n <TabPanel className=\"p-6\">\n <CodeBlock\n code={JSON.stringify(\n translateResultsToNlWebRequests(\n streamingState,\n searches,\n config,\n ),\n null,\n 2,\n )}\n />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n </DialogPanel>\n </div>\n </Dialog>\n );\n}\n\nexport function DebugTool({\n searches,\n streamingState,\n config,\n}: {\n searches: QueryResultSet[];\n streamingState: NLWebSearchState;\n config: UseNlWebConfig;\n}) {\n const [messagesOpen, setMessagesOpen] = useState(false);\n return (\n <>\n <Button\n onClick={() => setMessagesOpen(true)}\n className=\"flex bg-white items-center gap-2 ml-auto text-gray-600 hover:bg-gray-100 p-3 py-2 rounded-md text-sm\"\n >\n <BugAntIcon className=\"size-4 text-gray-500\" />\n JSON\n </Button>\n <MessagesDialog\n isOpen={messagesOpen}\n onClose={() => setMessagesOpen(false)}\n searches={searches}\n streamingState={streamingState}\n config={config}\n />\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n Combobox,\n ComboboxButton,\n ComboboxInput,\n ComboboxOption,\n ComboboxOptions,\n} from \"@headlessui/react\";\nimport {\n CheckIcon,\n GlobeAltIcon,\n ChevronUpDownIcon,\n StarIcon,\n} from \"@heroicons/react/20/solid\";\n\nexport interface Site {\n featured?: boolean;\n url: string;\n}\n\ninterface SiteDropdownProps {\n sites: Site[];\n selected: Site;\n onSelect: (url: string | null) => void;\n placeholder?: string;\n}\n\nexport function SiteDropdown({\n sites,\n selected,\n onSelect,\n placeholder = \"Select a site...\",\n}: SiteDropdownProps) {\n const [query, setQuery] = useState(\"\");\n\n const filteredSites =\n query === \"\"\n ? sites\n : sites.filter((site) => {\n return site.url.toLowerCase().includes(query.toLowerCase());\n });\n\n return (\n <Combobox value={selected.url} onChange={onSelect}>\n <div className=\"relative w-full\">\n <div className=\"relative flex items-center w-full cursor-default overflow-hidden rounded-lg bg-white text-left border focus:outline-none focus-visible:ring-2 focus-visible:ring-white/75 focus-visible:ring-offset-2 focus-visible:ring-offset-blue-300 sm:text-sm\">\n <ComboboxInput\n className=\"w-full pl-8 rounded-md text-sm border-none py-2 pl-3 pr-10 text-sm leading-5 text-gray-900 focus:ring-0\"\n displayValue={(site: string | null) => site || \"\"}\n onChange={(event) => setQuery(event.target.value)}\n placeholder={placeholder}\n />\n <ComboboxButton className=\"absolute inset-y-0 left-0 flex items-center pl-2\">\n <GlobeAltIcon className=\"text-gray-400 size-4\" />\n </ComboboxButton>\n <ComboboxButton className=\"absolute inset-y-0 right-0 flex items-center pr-2\">\n <ChevronUpDownIcon className=\"text-gray-400 size-4\" />\n </ComboboxButton>\n </div>\n <ComboboxOptions className=\"absolute mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black/5 focus:outline-none sm:text-sm z-10\">\n {filteredSites.map((site) => (\n <ComboboxOption\n key={site.url}\n className={({ focus }) =>\n `relative text-sm cursor-default select-none py-2 pl-10 pr-4 ${\n focus ? \"bg-blue-600 text-white\" : \"text-gray-900\"\n }`\n }\n value={site.url}\n >\n {({ selected, focus }) => (\n <>\n <span\n className={`block truncate ${\n selected ? \"font-medium\" : \"font-normal\"\n }`}\n >\n {site.url}\n </span>\n {selected ? (\n <span\n className={`absolute inset-y-0 left-0 flex items-center pl-3 ${\n focus ? \"text-white\" : \"text-blue-600\"\n }`}\n >\n <CheckIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n </span>\n ) : null}\n {site.featured ? (\n <span\n className={`absolute inset-y-0 right-0 flex items-center pr-3 ${\n focus ? \"text-white\" : \"text-blue-600\"\n }`}\n >\n <StarIcon className=\"size-5 text-yellow-500\" />\n </span>\n ) : null}\n </>\n )}\n </ComboboxOption>\n ))}\n {query !== \"\" &&\n !sites.some(\n (site) => site.url.toLowerCase() === query.toLowerCase(),\n ) && (\n <ComboboxOption\n className={({ focus }) =>\n `relative text-sm cursor-default select-none py-2 pl-10 pr-4 ${\n focus ? \"bg-blue-600 text-white\" : \"text-gray-900\"\n }`\n }\n value={query}\n >\n {({ focus }) => (\n <span\n className={`block truncate ${focus ? \"font-medium\" : \"font-normal\"}`}\n >\n Use \"{query}\"\n </span>\n )}\n </ComboboxOption>\n )}\n </ComboboxOptions>\n </div>\n </Combobox>\n );\n}\n","import { useLiveQuery } from \"dexie-react-hooks\";\nimport {\n db,\n type QueryResultSet,\n type Backend,\n type SearchSession,\n} from \"./db\";\nimport { NlwebResult } from \"./parseSchema\";\n\nexport type { QueryResultSet, Backend, SearchSession };\nexport function useSearchSessions(): {\n sessions: SearchSession[];\n startSession: (\n sessionId: string,\n query: string,\n backend: Backend,\n ) => Promise<void>;\n deleteSession: (sessionId: string) => Promise<void>;\n} {\n const sessions =\n useLiveQuery(\n () => db.sessions.orderBy(\"updated\").reverse().toArray(),\n [],\n ) ?? [];\n async function startSession(\n sessionId: string,\n query: string,\n backend: Backend,\n ) {\n await db.transaction(\"rw\", db.messages, db.sessions, async () => {\n // Find a session with the same query. If one exists, delete it.\n const duplicates = sessions.filter((s) => s.query == query);\n for (const s of duplicates) {\n await db.messages.where(\"sessionId\").equals(s.sessionId).delete();\n db.sessions.delete(s.sessionId);\n }\n const created = new Date();\n const updated = new Date();\n await db.sessions.put({ sessionId, query, backend, created, updated });\n });\n }\n\n async function deleteSession(sessionId: string) {\n await db.transaction(\"rw\", db.messages, db.sessions, async () => {\n await db.messages.where(\"sessionId\").equals(sessionId).delete();\n db.sessions.delete(sessionId);\n });\n }\n\n return {\n sessions: sessions,\n startSession: startSession,\n deleteSession: deleteSession,\n };\n}\n\nexport interface SearchSessionManager {\n searches: QueryResultSet[];\n addSearch: (data: QueryResultSet) => Promise<void>;\n addResults: (id: string, results: NlwebResult[]) => Promise<void>;\n}\nexport function useSearchSession(\n sessionId: string | null,\n): SearchSessionManager {\n const queryResults =\n useLiveQuery<QueryResultSet[]>(async () => {\n if (!sessionId) return [];\n return await db.messages\n .where(\"sessionId\")\n .equals(sessionId)\n .sortBy(\"id\");\n }, [sessionId]) ?? [];\n\n async function addSearch(result: QueryResultSet) {\n await db.transaction(\"rw\", db.messages, db.sessions, async () => {\n db.sessions.update(result.sessionId, {\n updated: new Date(),\n });\n db.messages.add(result);\n });\n }\n\n async function addResults(id: string, results: NlwebResult[]) {\n await db.transaction(\"rw\", db.messages, db.sessions, async () => {\n const currMessage = await db.messages.get(id);\n if (currMessage) {\n db.sessions.update(currMessage.sessionId, {\n updated: new Date(),\n });\n db.messages.update(id, {\n ...currMessage,\n response: {\n ...currMessage.response,\n results: [...currMessage.response.results, ...results],\n },\n });\n }\n });\n }\n\n return {\n searches: queryResults,\n addSearch,\n addResults,\n };\n}\n","// db.ts\nimport { Dexie, type EntityTable } from \"dexie\";\nimport { SearchResponse } from \"./useNlWeb\";\n\ninterface QueryResultSet {\n id?: string;\n sessionId: string;\n query: string;\n response: SearchResponse;\n}\n\ninterface Backend {\n site: string;\n endpoint: string;\n}\n\ninterface SearchSession {\n query: string;\n sessionId: string;\n backend: Backend;\n updated: Date;\n created: Date;\n}\n\nconst db = new Dexie(\"ChatHistory\") as Dexie & {\n messages: EntityTable<\n QueryResultSet,\n \"id\" // primary key \"id\" (for the typings only)\n >;\n sessions: EntityTable<SearchSession, \"sessionId\">;\n};\n\n// Schema declaration:\ndb.version(1).stores({\n messages: \"++id, sessionId\", // primary key \"id\" (for the runtime!),\n sessions: \"sessionId, created, updated\",\n});\n\nexport type { QueryResultSet, Backend, SearchSession };\nexport { db };\n"],"mappings":"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","names":["useEffect","useState","divided","formatted","Button","clsx","useState","useEffect","useCallback","useRef","isMultiline","useEffect","useRef","useCallback","jsx","jsxs","useState","srcIndex","clsx","Button","useEffect","Button","XMarkIcon","useState","clsx","jsx","jsxs","useState","Dialog","DialogPanel","Button","clsx","Fragment","jsx","jsxs","useState","Button","Dialog","DialogPanel","clsx","useState","Fragment","jsx","jsxs","selected"]}
package/package.json ADDED
@@ -0,0 +1,91 @@
1
+ {
2
+ "name": "@nlweb-ai/search-components",
3
+ "version": "0.1.9",
4
+ "description": "React component library for search interfaces",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ },
14
+ "./styles.css": "./dist/index.css"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "dev": "tsup --watch",
22
+ "lint": "eslint src --ext .ts,.tsx",
23
+ "lint:fix": "eslint src --ext .ts,.tsx --fix",
24
+ "format": "prettier --write \"src/**/*.{ts,tsx,json,css}\"",
25
+ "format:check": "prettier --check \"src/**/*.{ts,tsx,json,css}\"",
26
+ "typecheck": "tsc --noEmit",
27
+ "prepublishOnly": "pnpm run build",
28
+ "storybook": "storybook dev -p 6006",
29
+ "build-storybook": "storybook build"
30
+ },
31
+ "keywords": [
32
+ "react",
33
+ "components",
34
+ "search",
35
+ "ui",
36
+ "tailwind"
37
+ ],
38
+ "author": "nlweb-ai",
39
+ "license": "MIT",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/nlweb-ai/nlweb-ask-agent.git",
43
+ "directory": "frontend/search-components"
44
+ },
45
+ "publishConfig": {
46
+ "registry": "https://registry.npmjs.org",
47
+ "access": "public"
48
+ },
49
+ "peerDependencies": {
50
+ "react": ">=17.0.0",
51
+ "react-dom": ">=17.0.0"
52
+ },
53
+ "devDependencies": {
54
+ "@storybook/addon-essentials": "^8.6.14",
55
+ "@storybook/addon-interactions": "^8.6.14",
56
+ "@storybook/addon-links": "^8.6.15",
57
+ "@storybook/blocks": "^8.6.14",
58
+ "@storybook/react": "^8.6.15",
59
+ "@storybook/react-vite": "^8.6.15",
60
+ "@storybook/test": "^8.6.15",
61
+ "@tailwindcss/postcss": "^4.1.18",
62
+ "@types/react": "^19.2.5",
63
+ "@types/react-dom": "^19.2.3",
64
+ "@typescript-eslint/eslint-plugin": "^6.18.1",
65
+ "@typescript-eslint/parser": "^6.18.1",
66
+ "eslint": "^8.56.0",
67
+ "eslint-plugin-react": "^7.33.2",
68
+ "eslint-plugin-react-hooks": "^4.6.0",
69
+ "postcss": "^8.4.33",
70
+ "prettier": "^3.1.1",
71
+ "react": "^19.2.0",
72
+ "react-dom": "^19.2.0",
73
+ "storybook": "^8.6.15",
74
+ "tailwindcss": "^4.1.18",
75
+ "tsup": "^8.0.1",
76
+ "typescript": "^5.3.3",
77
+ "vite": "^6.4.1"
78
+ },
79
+ "dependencies": {
80
+ "@headlessui/react": "^2.2.9",
81
+ "@heroicons/react": "^2.2.0",
82
+ "@lexical/react": "^0.40.0",
83
+ "clsx": "^2.1.1",
84
+ "dexie": "^4.3.0",
85
+ "dexie-react-hooks": "^4.2.0",
86
+ "lexical": "^0.40.0",
87
+ "schema-dts": "^1.1.5",
88
+ "tw-shimmer": "^0.4.4",
89
+ "zod": "^4.3.6"
90
+ }
91
+ }