@mongoosejs/studio 0.2.13 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/backend/actions/ChatMessage/executeScript.js +5 -1
  2. package/backend/actions/ChatThread/createChatMessage.js +4 -1
  3. package/backend/actions/ChatThread/streamChatMessage.js +4 -2
  4. package/backend/actions/Dashboard/updateDashboard.js +2 -2
  5. package/backend/actions/Task/getTaskOverview.js +102 -0
  6. package/backend/actions/Task/getTasks.js +85 -45
  7. package/backend/actions/Task/index.js +1 -0
  8. package/eslint.config.js +4 -1
  9. package/frontend/public/app.js +25025 -762
  10. package/frontend/public/dark-theme.css +365 -0
  11. package/frontend/public/images/mongoose-studio.svg +4 -0
  12. package/frontend/public/index.html +21 -1
  13. package/frontend/public/style.css +5 -7
  14. package/frontend/public/theme-variables.css +294 -0
  15. package/frontend/public/tw.css +348 -213
  16. package/frontend/src/_util/dateRange.js +82 -0
  17. package/frontend/src/ace-editor/ace-editor.html +4 -0
  18. package/frontend/src/ace-editor/ace-editor.js +95 -0
  19. package/frontend/src/aceEditor.js +69 -0
  20. package/frontend/src/api.js +6 -0
  21. package/frontend/src/chat/chat-message/chat-message.html +1 -1
  22. package/frontend/src/chat/chat-message/chat-message.js +1 -1
  23. package/frontend/src/chat/chat-message-script/chat-message-script.html +54 -42
  24. package/frontend/src/chat/chat-message-script/chat-message-script.js +6 -55
  25. package/frontend/src/chat/chat.html +68 -39
  26. package/frontend/src/chat/chat.js +26 -2
  27. package/frontend/src/clone-document/clone-document.html +7 -2
  28. package/frontend/src/clone-document/clone-document.js +1 -8
  29. package/frontend/src/create-dashboard/create-dashboard.html +11 -6
  30. package/frontend/src/create-dashboard/create-dashboard.js +0 -7
  31. package/frontend/src/create-document/create-document.html +15 -9
  32. package/frontend/src/create-document/create-document.js +5 -12
  33. package/frontend/src/dashboard/dashboard.html +14 -12
  34. package/frontend/src/dashboard/dashboard.js +21 -4
  35. package/frontend/src/dashboard/edit-dashboard/edit-dashboard.html +13 -7
  36. package/frontend/src/dashboard/edit-dashboard/edit-dashboard.js +16 -23
  37. package/frontend/src/dashboard-result/dashboard-chart/dashboard-chart.html +19 -17
  38. package/frontend/src/dashboard-result/dashboard-chart/dashboard-chart.js +97 -2
  39. package/frontend/src/dashboard-result/dashboard-map/dashboard-map.js +27 -3
  40. package/frontend/src/dashboard-result/dashboard-result.html +3 -3
  41. package/frontend/src/dashboard-result/dashboard-result.js +3 -0
  42. package/frontend/src/dashboard-result/dashboard-table/dashboard-table.html +34 -0
  43. package/frontend/src/dashboard-result/dashboard-table/dashboard-table.js +37 -0
  44. package/frontend/src/dashboards/dashboards.html +101 -109
  45. package/frontend/src/dashboards/dashboards.js +25 -1
  46. package/frontend/src/detail-default/detail-default.html +2 -2
  47. package/frontend/src/detail-default/detail-default.js +24 -3
  48. package/frontend/src/document/confirm-changes/confirm-changes.html +1 -1
  49. package/frontend/src/document/confirm-delete/confirm-delete.html +1 -1
  50. package/frontend/src/document/document.css +1 -1
  51. package/frontend/src/document/document.html +28 -28
  52. package/frontend/src/document/execute-script/execute-script.html +20 -21
  53. package/frontend/src/document/execute-script/execute-script.js +1 -43
  54. package/frontend/src/document-details/document-details.css +4 -9
  55. package/frontend/src/document-details/document-details.html +34 -33
  56. package/frontend/src/document-details/document-details.js +2 -53
  57. package/frontend/src/document-details/document-property/document-property.html +12 -12
  58. package/frontend/src/edit-array/edit-array.html +7 -6
  59. package/frontend/src/edit-array/edit-array.js +10 -50
  60. package/frontend/src/edit-boolean/edit-boolean.html +12 -12
  61. package/frontend/src/edit-date/edit-date.html +2 -2
  62. package/frontend/src/edit-default/edit-default.html +1 -1
  63. package/frontend/src/edit-string/edit-string.html +3 -3
  64. package/frontend/src/edit-subdocument/edit-subdocument.html +5 -3
  65. package/frontend/src/edit-subdocument/edit-subdocument.js +1 -15
  66. package/frontend/src/export-query-results/export-query-results.html +3 -3
  67. package/frontend/src/json-node/json-node.html +3 -3
  68. package/frontend/src/list-json/json-node.html +1 -1
  69. package/frontend/src/models/document-search/document-search.html +3 -3
  70. package/frontend/src/models/model-switcher/model-switcher.html +53 -0
  71. package/frontend/src/models/model-switcher/model-switcher.js +123 -0
  72. package/frontend/src/models/models.css +3 -10
  73. package/frontend/src/models/models.html +146 -80
  74. package/frontend/src/models/models.js +116 -7
  75. package/frontend/src/navbar/navbar.html +157 -97
  76. package/frontend/src/navbar/navbar.js +31 -12
  77. package/frontend/src/routes.js +1 -1
  78. package/frontend/src/splash/splash.html +5 -5
  79. package/frontend/src/task-by-name/task-by-name.html +77 -7
  80. package/frontend/src/task-by-name/task-by-name.js +84 -9
  81. package/frontend/src/task-single/task-single.html +29 -29
  82. package/frontend/src/task-single/task-single.js +10 -10
  83. package/frontend/src/tasks/task-details/task-details.html +43 -43
  84. package/frontend/src/tasks/task-details/task-details.js +9 -3
  85. package/frontend/src/tasks/tasks.html +36 -35
  86. package/frontend/src/tasks/tasks.js +27 -143
  87. package/frontend/src/team/new-invitation/new-invitation.html +8 -8
  88. package/frontend/src/team/team.html +27 -27
  89. package/frontend/src/update-document/update-document.html +7 -2
  90. package/frontend/src/update-document/update-document.js +2 -11
  91. package/package.json +3 -1
  92. package/tailwind.config.js +75 -11
@@ -14,7 +14,7 @@
14
14
  <async-button
15
15
  type="submit"
16
16
  @click="getWorkspaceCustomerPortalLink"
17
- class="inline-flex items-center justify-center rounded-md border border-transparent bg-ultramarine-600 py-1 px-2 text-sm font-medium text-white shadow-sm hover:bg-ultramarine-500 focus:outline-none focus:ring-2 focus:ring-forest-green-500 focus:ring-offset-2">
17
+ class="inline-flex items-center justify-center rounded-md border border-transparent bg-primary py-1 px-2 text-sm font-medium text-primary-text shadow-sm hover:bg-primary-hover focus:outline-none focus:ring-2 focus:ring-forest-green-500 focus:ring-offset-2">
18
18
  View in Stripe
19
19
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4 ml-1">
20
20
  <path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25" />
@@ -25,7 +25,7 @@
25
25
  <div v-else-if="workspace && !workspace.subscriptionTier" class="mt-4 flex justify-between items-center">
26
26
  <div>
27
27
  <span class="font-bold">No active subscription</span>
28
- <div class="text-sm text-gray-700">
28
+ <div class="text-sm text-content-secondary">
29
29
  You won't be able to invite your team until you activate a subscription
30
30
  </div>
31
31
  </div>
@@ -33,7 +33,7 @@
33
33
  <a
34
34
  :href="paymentLink"
35
35
  target="_blank"
36
- class="inline-flex items-center justify-center rounded-md border border-transparent bg-ultramarine-600 py-1 px-2 text-sm font-medium text-white shadow-sm hover:bg-ultramarine-500 focus:outline-none focus:ring-2 focus:ring-ultramarine-500 focus:ring-offset-2">
36
+ class="inline-flex items-center justify-center rounded-md border border-transparent bg-primary py-1 px-2 text-sm font-medium text-primary-text shadow-sm hover:bg-primary-hover focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2">
37
37
  Subscribe With Stripe
38
38
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4 ml-1">
39
39
  <path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25" />
@@ -52,21 +52,21 @@
52
52
  <ul v-else role="list" class="divide-y divide-gray-100">
53
53
  <li class="flex justify-between gap-x-6 py-5" v-for="user in users">
54
54
  <div class="flex min-w-0 gap-x-4">
55
- <img class="size-12 flex-none rounded-full bg-gray-50" :src="user.picture ?? 'images/logo.svg'" alt="">
55
+ <img class="size-12 flex-none rounded-full bg-page" :src="user.picture ?? 'images/logo.svg'" alt="">
56
56
  <div class="min-w-0 flex-auto">
57
- <p class="text-sm/6 font-semibold text-gray-900">
57
+ <p class="text-sm/6 font-semibold text-content">
58
58
  {{user.name || user.githubUsername}}
59
59
  <span v-if="user.isFreeUser" class="ml-1 inline-flex items-center rounded-md bg-green-50 px-2 py-1 text-xs font-medium text-green-700 ring-1 ring-inset ring-green-600/20">Free</span>
60
60
  </p>
61
- <p class="mt-1 truncate text-xs/5 text-gray-500">{{user.email ?? 'No Email'}}</p>
61
+ <p class="mt-1 truncate text-xs/5 text-content-tertiary">{{user.email ?? 'No Email'}}</p>
62
62
  </div>
63
63
  </div>
64
64
  <div class="hidden shrink-0 sm:flex sm:flex-col sm:items-end">
65
- <p class="text-sm/6 text-gray-900 capitalize">{{getRolesForUser(user).join(', ')}}</p>
65
+ <p class="text-sm/6 text-content capitalize">{{getRolesForUser(user).join(', ')}}</p>
66
66
  <div class="flex gap-3">
67
67
  <button
68
68
  type="button"
69
- class="mt-1 text-xs/5 text-gray-500 cursor-pointer disabled:cursor-not-allowed disabled:text-gray-300"
69
+ class="mt-1 text-xs/5 text-content-tertiary cursor-pointer disabled:cursor-not-allowed disabled:text-gray-300"
70
70
  :disabled="getRolesForUser(user).includes('owner')"
71
71
  @click="openEditModal(user)">
72
72
  Edit
@@ -93,7 +93,7 @@
93
93
  @click="showNewInvitationModal = true"
94
94
  :disabled="status === 'loading'"
95
95
  :tier="workspace?.subscriptionTier"
96
- class="block rounded-md bg-ultramarine-600 px-3 py-2 text-center text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 disabled:bg-gray-500 disabled:cursor-not-allowed focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-600">
96
+ class="block rounded-md bg-primary px-3 py-2 text-center text-sm font-semibold text-primary-text shadow-sm hover:bg-primary-hover disabled:bg-page0 disabled:cursor-not-allowed focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary">
97
97
  New Invitation
98
98
  <svg class="inline w-4 h-4 ml-1" v-if="workspace && !workspace.subscriptionTier" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
99
99
  <path fill-rule="evenodd" d="M12 1.5a5.25 5.25 0 00-5.25 5.25v3a3 3 0 00-3 3v6.75a3 3 0 003 3h10.5a3 3 0 003-3v-6.75a3 3 0 00-3-3v-3c0-2.9-2.35-5.25-5.25-5.25zm3.75 8.25v-3a3.75 3.75 0 10-7.5 0v3h7.5z" clip-rule="evenodd" />
@@ -110,26 +110,26 @@
110
110
  <table class="min-w-full divide-y divide-gray-300">
111
111
  <thead>
112
112
  <tr>
113
- <th scope="col" class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-0">GitHub Username</th>
114
- <th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">Email</th>
115
- <th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">Status</th>
116
- <th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">Role</th>
113
+ <th scope="col" class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-content sm:pl-0">GitHub Username</th>
114
+ <th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-content">Email</th>
115
+ <th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-content">Status</th>
116
+ <th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-content">Role</th>
117
117
  </tr>
118
118
  </thead>
119
- <tbody class="divide-y divide-gray-200 bg-white">
119
+ <tbody class="divide-y divide-gray-200 bg-surface">
120
120
  <tr v-for="invitation in invitations">
121
121
  <td class="whitespace-nowrap py-5 pl-4 pr-3 text-sm sm:pl-0">
122
122
  {{invitation.githubUsername}}
123
123
  </td>
124
- <td class="whitespace-nowrap px-3 py-5 text-sm text-gray-500">
124
+ <td class="whitespace-nowrap px-3 py-5 text-sm text-content-tertiary">
125
125
  {{invitation.email}}
126
126
  </td>
127
- <td class="whitespace-nowrap px-3 py-5 text-sm text-gray-500">
128
- <span class="inline-flex items-center rounded-md bg-gray-50 px-2 py-1 text-xs font-medium text-gray-700 ring-1 ring-inset ring-gray-600/20">
127
+ <td class="whitespace-nowrap px-3 py-5 text-sm text-content-tertiary">
128
+ <span class="inline-flex items-center rounded-md bg-page px-2 py-1 text-xs font-medium text-content-secondary ring-1 ring-inset ring-gray-600/20">
129
129
  Pending
130
130
  </span>
131
131
  </td>
132
- <td class="whitespace-nowrap px-3 py-5 text-sm text-gray-500">
132
+ <td class="whitespace-nowrap px-3 py-5 text-sm text-content-tertiary">
133
133
  {{invitation.roles.join(', ')}}
134
134
  </td>
135
135
  </tr>
@@ -143,8 +143,8 @@
143
143
  <svg class="mx-auto size-12 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
144
144
  <path vector-effect="non-scaling-stroke" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z" />
145
145
  </svg>
146
- <h3 class="mt-2 text-sm font-semibold text-gray-900">No invitations</h3>
147
- <p class="mt-1 text-sm text-gray-500">You have no outstanding invitations</p>
146
+ <h3 class="mt-2 text-sm font-semibold text-content">No invitations</h3>
147
+ <p class="mt-1 text-sm text-content-tertiary">You have no outstanding invitations</p>
148
148
  </div>
149
149
  </div>
150
150
  </div>
@@ -165,32 +165,32 @@
165
165
  </div>
166
166
 
167
167
  <div>
168
- <div class="text-sm/6 font-semibold text-gray-900">
168
+ <div class="text-sm/6 font-semibold text-content">
169
169
  {{showEditModal.user.name || showEditModal.user.githubUsername}}
170
170
  </div>
171
- <div class="text-xs/5 text-gray-500">
171
+ <div class="text-xs/5 text-content-tertiary">
172
172
  {{showEditModal.user.email ?? 'No Email'}}
173
173
  </div>
174
174
  </div>
175
175
 
176
176
  <div>
177
- <label for="editRole" class="block text-sm/6 font-medium text-gray-900">Role</label>
177
+ <label for="editRole" class="block text-sm/6 font-medium text-content">Role</label>
178
178
  <div class="mt-2 grid grid-cols-1">
179
179
  <select
180
180
  id="editRole"
181
181
  name="editRole"
182
182
  v-model="showEditModal.role"
183
- class="col-start-1 row-start-1 w-full appearance-none rounded-md bg-white py-1.5 pl-3 pr-8 text-base text-gray-900 outline outline-1 -outline-offset-1 outline-gray-300 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-ultramarine-600 sm:text-sm/6">
183
+ class="col-start-1 row-start-1 w-full appearance-none rounded-md bg-surface py-1.5 pl-3 pr-8 text-base text-content outline outline-1 -outline-offset-1 outline-edge-strong focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-primary sm:text-sm/6">
184
184
  <option value="admin" :disabled="disableRoleOption('admin')">Admin</option>
185
185
  <option value="member" :disabled="disableRoleOption('member')">Member</option>
186
186
  <option value="readonly" :disabled="disableRoleOption('readonly')">Read-only</option>
187
187
  <option value="dashboards" :disabled="disableRoleOption('dashboards')">Dashboards Only</option>
188
188
  </select>
189
- <svg class="pointer-events-none col-start-1 row-start-1 mr-2 size-5 self-center justify-self-end text-gray-500 sm:size-4" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true" data-slot="icon">
189
+ <svg class="pointer-events-none col-start-1 row-start-1 mr-2 size-5 self-center justify-self-end text-content-tertiary sm:size-4" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true" data-slot="icon">
190
190
  <path fill-rule="evenodd" d="M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd" />
191
191
  </svg>
192
192
  </div>
193
- <div v-if="!workspace?.subscriptionTier" class="mt-2 text-sm text-gray-700">
193
+ <div v-if="!workspace?.subscriptionTier" class="mt-2 text-sm text-content-secondary">
194
194
  You can only assign the "Dashboards Only" role until you activate a subscription.
195
195
  </div>
196
196
  </div>
@@ -199,7 +199,7 @@
199
199
  <async-button
200
200
  @click="updateWorkspaceMember"
201
201
  :disabled="showEditModal.role === showEditModal.originalRole"
202
- class="border-0 mt-0 flex w-full items-center justify-center gap-3 rounded-md bg-ultramarine-600 hover:bg-ultramarine-500 px-3 py-1.5 text-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ultramarine-500">
202
+ class="border-0 mt-0 flex w-full items-center justify-center gap-3 rounded-md bg-primary hover:bg-primary-hover px-3 py-1.5 text-primary-text focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary">
203
203
  <span class="text-sm font-semibold leading-6">Save</span>
204
204
  </async-button>
205
205
 
@@ -1,8 +1,13 @@
1
1
  <div>
2
2
  <div class="mb-2">
3
- <textarea class="border border-gray-200 p-2 h-[300px] w-full" ref="codeEditor"></textarea>
3
+ <ace-editor
4
+ v-model="editorValue"
5
+ mode="javascript"
6
+ :line-numbers="true"
7
+ class="h-[300px] w-full"
8
+ />
4
9
  </div>
5
- <button @click="updateDocument()" class="rounded-md bg-ultramarine-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-ultramarine-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600">Submit</button>
10
+ <button @click="updateDocument()" class="rounded-md bg-primary px-2.5 py-1.5 text-sm font-semibold text-primary-text shadow-sm hover:bg-primary-hover focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-teal-600">Submit</button>
6
11
  <div v-if="errors.length > 0" class="rounded-md bg-red-50 p-4 mt-1">
7
12
  <div class="flex">
8
13
  <div class="flex-shrink-0">
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  const api = require('../api');
4
-
5
4
  const { BSON, EJSON } = require('mongodb/lib/bson');
6
5
 
7
6
  const ObjectId = new Proxy(BSON.ObjectId, {
@@ -21,13 +20,13 @@ module.exports = app => app.component('update-document', {
21
20
  template,
22
21
  data: function() {
23
22
  return {
24
- editor: null,
23
+ editorValue: '{\n \n}',
25
24
  errors: []
26
25
  };
27
26
  },
28
27
  methods: {
29
28
  async updateDocument() {
30
- const data = EJSON.serialize(eval(`(${this.editor.getValue()})`));
29
+ const data = EJSON.serialize(eval(`(${this.editorValue})`));
31
30
  try {
32
31
  if (this.multiple) {
33
32
  const ids = this.document.map(x => x._id);
@@ -52,13 +51,5 @@ module.exports = app => app.component('update-document', {
52
51
  throw err;
53
52
  }
54
53
  }
55
- },
56
- mounted: function() {
57
- this.$refs.codeEditor.value = '{\n \n}';
58
- this.editor = CodeMirror.fromTextArea(this.$refs.codeEditor, {
59
- mode: 'javascript',
60
- lineNumbers: true,
61
- smartIndent: false
62
- });
63
54
  }
64
55
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mongoosejs/studio",
3
- "version": "0.2.13",
3
+ "version": "0.3.1",
4
4
  "description": "A Mongoose-native MongoDB UI with schema-aware autocomplete, AI-assisted queries, and dashboards that understand your models - not just your data.",
5
5
  "homepage": "https://mongoosestudio.app/",
6
6
  "repository": {
@@ -12,6 +12,7 @@
12
12
  "@ai-sdk/anthropic": "2.x",
13
13
  "@ai-sdk/google": "2.x",
14
14
  "@ai-sdk/openai": "2.x",
15
+ "ace-builds": "^1.43.6",
15
16
  "ai": "5.x",
16
17
  "archetype": "0.13.1",
17
18
  "csv-stringify": "6.3.0",
@@ -19,6 +20,7 @@
19
20
  "extrovert": "^0.2.0",
20
21
  "marked": "15.0.12",
21
22
  "node-inspect-extracted": "3.x",
23
+ "regexp.escape": "^2.0.1",
22
24
  "tailwindcss": "3.4.0",
23
25
  "vue": "3.x",
24
26
  "vue-toastification": "^2.0.0-rc.5",
@@ -2,6 +2,7 @@
2
2
 
3
3
  module.exports = {
4
4
  mode: 'jit',
5
+ darkMode: 'class',
5
6
  content: ['./frontend/src/**/*.html', './frontend/src/**/*.js', './frontend/src/**/**/*.html', './frontend/src/**/**/*.js'],
6
7
  corePlugins: {
7
8
  container: true
@@ -10,6 +11,30 @@ module.exports = {
10
11
  theme: {
11
12
  extend: {
12
13
  colors: {
14
+ /* Semantic tokens – swap automatically in .dark via CSS variables */
15
+ 'primary': {
16
+ DEFAULT: 'var(--color-primary)',
17
+ 'hover': 'var(--color-primary-hover)',
18
+ 'subtle': 'var(--color-primary-subtle)',
19
+ 'text': 'var(--color-primary-text)',
20
+ },
21
+ 'surface': {
22
+ DEFAULT: 'var(--color-surface)',
23
+ 'hover': 'var(--color-surface-hover)',
24
+ },
25
+ 'page': 'var(--color-page)',
26
+ 'muted': 'var(--color-muted)',
27
+ 'subtle': 'var(--color-subtle)',
28
+ 'content': {
29
+ DEFAULT: 'var(--color-content)',
30
+ 'secondary': 'var(--color-content-secondary)',
31
+ 'tertiary': 'var(--color-content-tertiary)',
32
+ 'disabled': 'var(--color-content-disabled)',
33
+ },
34
+ 'edge': {
35
+ DEFAULT: 'var(--color-edge)',
36
+ 'strong': 'var(--color-edge-strong)',
37
+ },
13
38
  'puerto-rico': {
14
39
  '50': '#eefffb',
15
40
  '100': '#c6fff3',
@@ -24,17 +49,17 @@ module.exports = {
24
49
  '950': '#003432',
25
50
  },
26
51
  'teal': {
27
- '50': '#eefffc',
28
- '100': '#c5fffa',
29
- '200': '#8bfff5',
30
- '300': '#4afef0',
31
- '400': '#15ece2',
32
- '500': '#00d0c9',
33
- '600': '#00a8a5',
34
- '700': '#008888',
35
- '800': '#066769',
36
- '900': '#0a5757',
37
- '950': '#003235',
52
+ '50': '#eefffc',
53
+ '100': '#c5fffa',
54
+ '200': '#8bfff5',
55
+ '300': '#4afef0',
56
+ '400': '#15ece2',
57
+ '500': '#00d0c9',
58
+ '600': '#00a8a5',
59
+ '700': '#008080',
60
+ '800': '#066769',
61
+ '900': '#0a5757',
62
+ '950': '#003235',
38
63
  },
39
64
  'ultramarine': {
40
65
  '50': '#f1f5ff',
@@ -74,6 +99,45 @@ module.exports = {
74
99
  '800': '#8d2727',
75
100
  '900': '#752727',
76
101
  '950': '#3f1010',
102
+ },
103
+ 'merlot': {
104
+ '50': '#fef3f2',
105
+ '100': '#fde8e6',
106
+ '200': '#fad3d1',
107
+ '300': '#f6adab',
108
+ '400': '#ef807d',
109
+ '500': '#e54e4f',
110
+ '600': '#d12d36',
111
+ '700': '#b0202b',
112
+ '800': '#931e2b',
113
+ '900': '#7f1d2b',
114
+ '950': '#460b12',
115
+ },
116
+ 'shark': {
117
+ '50': '#fafafa',
118
+ '100': '#f3f4f6',
119
+ '200': '#e1e5ea',
120
+ '300': '#d0d6dc',
121
+ '400': '#98a5b3',
122
+ '500': '#687583',
123
+ '600': '#495664',
124
+ '700': '#38424d',
125
+ '800': '#212529',
126
+ '900': '#15191e',
127
+ '950': '#070a0d',
128
+ },
129
+ 'steel-blue': {
130
+ '50': '#f4f7fb',
131
+ '100': '#e9eef5',
132
+ '200': '#cedae9',
133
+ '300': '#a2bbd7',
134
+ '400': '#7097c0',
135
+ '500': '#4f7cac',
136
+ '600': '#3b618e',
137
+ '700': '#314e73',
138
+ '800': '#2c4360',
139
+ '900': '#293a51',
140
+ '950': '#1b2536',
77
141
  }
78
142
  }
79
143
  }