copilot.ts

  1import { ColorScheme } from "../theme/colorScheme"
  2import { background, border, foreground, svg, text } from "./components"
  3import { interactive } from "./interactive"
  4export default function copilot(colorScheme: ColorScheme) {
  5  let layer = colorScheme.middle
  6
  7  let content_width = 264
  8
  9  let ctaButton =
 10    // Copied from welcome screen. FIXME: Move this into a ZDS component
 11    interactive({
 12      base: {
 13        background: background(layer),
 14        border: border(layer, "default"),
 15        cornerRadius: 4,
 16        margin: {
 17          top: 4,
 18          bottom: 4,
 19          left: 8,
 20          right: 8,
 21        },
 22        padding: {
 23          top: 3,
 24          bottom: 3,
 25          left: 7,
 26          right: 7,
 27        },
 28        ...text(layer, "sans", "default", { size: "sm" })
 29      },
 30      state: {
 31        hovered: {
 32          ...text(layer, "sans", "default", { size: "sm" }),
 33          background: background(layer, "hovered"),
 34          border: border(layer, "active"),
 35        },
 36      }
 37    });
 38
 39  return {
 40    outLinkIcon:
 41      interactive({
 42        base: {
 43          icon: svg(
 44            foreground(layer, "variant"),
 45            "icons/link_out_12.svg",
 46            12,
 47            12
 48          ),
 49          container: {
 50            cornerRadius: 6,
 51            padding: { left: 6 },
 52          },
 53        },
 54        state: {
 55          hovered: {
 56            icon: {
 57              color:
 58                foreground(layer, "hovered")
 59            }
 60          },
 61        }
 62      }),
 63
 64    modal: {
 65      titleText: {
 66        default: {
 67          ...text(layer, "sans", { size: "xs", weight: "bold" })
 68        }
 69      },
 70      titlebar: {
 71        background: background(colorScheme.lowest),
 72        border: border(layer, "active"),
 73        padding: {
 74          top: 4,
 75          bottom: 4,
 76          left: 8,
 77          right: 8,
 78        },
 79      },
 80      container: {
 81        background: background(colorScheme.lowest),
 82        padding: {
 83          top: 0,
 84          left: 0,
 85          right: 0,
 86          bottom: 8,
 87        },
 88      },
 89      closeIcon: interactive({
 90        base:
 91        {
 92          icon: svg(
 93            foreground(layer, "variant"),
 94            "icons/x_mark_8.svg",
 95            8,
 96            8
 97          ),
 98          container: {
 99            cornerRadius: 2,
100            padding: {
101              top: 4,
102              bottom: 4,
103              left: 4,
104              right: 4,
105            },
106            margin: {
107              right: 0,
108            },
109          }
110        },
111        state: {
112          hovered: {
113            icon: svg(
114              foreground(layer, "on"),
115              "icons/x_mark_8.svg",
116              8,
117              8
118            ),
119          },
120          clicked: {
121            icon: svg(
122              foreground(layer, "base"),
123              "icons/x_mark_8.svg",
124              8,
125              8
126            ),
127          },
128        }
129      }),
130      dimensions: {
131        width: 280,
132        height: 280,
133      },
134    },
135
136    auth: {
137      content_width,
138
139      ctaButton,
140
141      header: {
142        icon: svg(
143          foreground(layer, "default"),
144          "icons/zed_plus_copilot_32.svg",
145          92,
146          32
147        ),
148        container: {
149          margin: {
150            top: 35,
151            bottom: 5,
152            left: 0,
153            right: 0,
154          },
155        },
156      },
157
158      prompting: {
159        subheading: {
160          ...text(layer, "sans", { size: "xs" }),
161          margin: {
162            top: 6,
163            bottom: 12,
164            left: 0,
165            right: 0,
166          },
167        },
168
169        hint: {
170          ...text(layer, "sans", { size: "xs", color: "#838994" }),
171          margin: {
172            top: 6,
173            bottom: 2,
174          },
175        },
176
177        deviceCode: {
178          text: text(layer, "mono", { size: "sm" }),
179          cta: {
180            ...ctaButton,
181            background: background(colorScheme.lowest),
182            border: border(colorScheme.lowest, "inverted"),
183            padding: {
184              top: 0,
185              bottom: 0,
186              left: 16,
187              right: 16,
188            },
189            margin: {
190              left: 16,
191              right: 16,
192            },
193          },
194          left: content_width / 2,
195          leftContainer: {
196            padding: {
197              top: 3,
198              bottom: 3,
199              left: 0,
200              right: 6,
201            },
202          },
203          right: (content_width * 1) / 3,
204          rightContainer: interactive({
205            base: {
206              border: border(colorScheme.lowest, "inverted", {
207                bottom: false,
208                right: false,
209                top: false,
210                left: true,
211              }),
212              padding: {
213                top: 3,
214                bottom: 5,
215                left: 8,
216                right: 0,
217              }
218            }, state: {
219              hovered: {
220                border: border(layer, "active", {
221                  bottom: false,
222                  right: false,
223                  top: false,
224                  left: true,
225                }),
226              },
227            }
228          })
229        },
230      },
231
232      notAuthorized: {
233        subheading: {
234          ...text(layer, "sans", { size: "xs" }),
235
236          margin: {
237            top: 16,
238            bottom: 16,
239            left: 0,
240            right: 0,
241          },
242        },
243
244        warning: {
245          ...text(layer, "sans", {
246            size: "xs",
247            color: foreground(layer, "warning"),
248          }),
249          border: border(layer, "warning"),
250          background: background(layer, "warning"),
251          cornerRadius: 2,
252          padding: {
253            top: 4,
254            left: 4,
255            bottom: 4,
256            right: 4,
257          },
258          margin: {
259            bottom: 16,
260            left: 8,
261            right: 8,
262          },
263        },
264      },
265
266      authorized: {
267        subheading: {
268          ...text(layer, "sans", { size: "xs" }),
269
270          margin: {
271            top: 16,
272            bottom: 16,
273          },
274        },
275
276        hint: {
277          ...text(layer, "sans", { size: "xs", color: "#838994" }),
278          margin: {
279            top: 24,
280            bottom: 4,
281          },
282        },
283      },
284    },
285  }
286}