@btst/stack 2.5.1 → 2.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- export { B as BoardListResult, C as CreateKanbanTaskInput, i as KANBAN_QUERY_KEYS, b as KanbanApiContext, K as KanbanApiRouter, c as KanbanBackendHooks, a as KanbanRouteKey, e as createKanbanTask, f as findOrCreateKanbanBoard, g as getAllBoards, d as getBoardById, h as getKanbanColumnsByBoardId, k as kanbanBackendPlugin } from '../../../shared/stack.uWSqCWAb.cjs';
1
+ export { B as BoardListResult, C as CreateKanbanTaskInput, i as KANBAN_QUERY_KEYS, b as KanbanApiContext, K as KanbanApiRouter, c as KanbanBackendHooks, a as KanbanRouteKey, e as createKanbanTask, f as findOrCreateKanbanBoard, g as getAllBoards, d as getBoardById, h as getKanbanColumnsByBoardId, k as kanbanBackendPlugin } from '../../../shared/stack.DSxTDZBQ.cjs';
2
2
  import { B as BoardWithColumns, S as SerializedBoardWithColumns, C as ColumnWithTasks, a as SerializedColumn, T as Task, b as SerializedTask } from '../../../shared/stack.DJaKVY7v.cjs';
3
3
  import '@btst/stack/plugins/api';
4
4
  import 'better-call';
@@ -1,4 +1,4 @@
1
- export { B as BoardListResult, C as CreateKanbanTaskInput, i as KANBAN_QUERY_KEYS, b as KanbanApiContext, K as KanbanApiRouter, c as KanbanBackendHooks, a as KanbanRouteKey, e as createKanbanTask, f as findOrCreateKanbanBoard, g as getAllBoards, d as getBoardById, h as getKanbanColumnsByBoardId, k as kanbanBackendPlugin } from '../../../shared/stack.B8D4r97Z.mjs';
1
+ export { B as BoardListResult, C as CreateKanbanTaskInput, i as KANBAN_QUERY_KEYS, b as KanbanApiContext, K as KanbanApiRouter, c as KanbanBackendHooks, a as KanbanRouteKey, e as createKanbanTask, f as findOrCreateKanbanBoard, g as getAllBoards, d as getBoardById, h as getKanbanColumnsByBoardId, k as kanbanBackendPlugin } from '../../../shared/stack.CxNeGV2z.mjs';
2
2
  import { B as BoardWithColumns, S as SerializedBoardWithColumns, C as ColumnWithTasks, a as SerializedColumn, T as Task, b as SerializedTask } from '../../../shared/stack.DJaKVY7v.mjs';
3
3
  import '@btst/stack/plugins/api';
4
4
  import 'better-call';
@@ -1,4 +1,4 @@
1
- export { B as BoardListResult, C as CreateKanbanTaskInput, i as KANBAN_QUERY_KEYS, b as KanbanApiContext, K as KanbanApiRouter, c as KanbanBackendHooks, a as KanbanRouteKey, e as createKanbanTask, f as findOrCreateKanbanBoard, g as getAllBoards, d as getBoardById, h as getKanbanColumnsByBoardId, k as kanbanBackendPlugin } from '../../../shared/stack.DgKOwl20.js';
1
+ export { B as BoardListResult, C as CreateKanbanTaskInput, i as KANBAN_QUERY_KEYS, b as KanbanApiContext, K as KanbanApiRouter, c as KanbanBackendHooks, a as KanbanRouteKey, e as createKanbanTask, f as findOrCreateKanbanBoard, g as getAllBoards, d as getBoardById, h as getKanbanColumnsByBoardId, k as kanbanBackendPlugin } from '../../../shared/stack.BFcg0tDz.js';
2
2
  import { B as BoardWithColumns, S as SerializedBoardWithColumns, C as ColumnWithTasks, a as SerializedColumn, T as Task, b as SerializedTask } from '../../../shared/stack.DJaKVY7v.js';
3
3
  import '@btst/stack/plugins/api';
4
4
  import 'better-call';
@@ -1,5 +1,5 @@
1
1
  import * as _tanstack_react_query from '@tanstack/react-query';
2
- import { K as KanbanApiRouter, j as BoardsListDiscriminator } from '../../shared/stack.uWSqCWAb.cjs';
2
+ import { K as KanbanApiRouter, j as BoardsListDiscriminator } from '../../shared/stack.DSxTDZBQ.cjs';
3
3
  import { createApiClient } from '@btst/stack/plugins/client';
4
4
  import { S as SerializedBoardWithColumns } from '../../shared/stack.DJaKVY7v.cjs';
5
5
  import '@btst/stack/plugins/api';
@@ -1,5 +1,5 @@
1
1
  import * as _tanstack_react_query from '@tanstack/react-query';
2
- import { K as KanbanApiRouter, j as BoardsListDiscriminator } from '../../shared/stack.B8D4r97Z.mjs';
2
+ import { K as KanbanApiRouter, j as BoardsListDiscriminator } from '../../shared/stack.CxNeGV2z.mjs';
3
3
  import { createApiClient } from '@btst/stack/plugins/client';
4
4
  import { S as SerializedBoardWithColumns } from '../../shared/stack.DJaKVY7v.mjs';
5
5
  import '@btst/stack/plugins/api';
@@ -1,5 +1,5 @@
1
1
  import * as _tanstack_react_query from '@tanstack/react-query';
2
- import { K as KanbanApiRouter, j as BoardsListDiscriminator } from '../../shared/stack.DgKOwl20.js';
2
+ import { K as KanbanApiRouter, j as BoardsListDiscriminator } from '../../shared/stack.BFcg0tDz.js';
3
3
  import { createApiClient } from '@btst/stack/plugins/client';
4
4
  import { S as SerializedBoardWithColumns } from '../../shared/stack.DJaKVY7v.js';
5
5
  import '@btst/stack/plugins/api';
@@ -4,4 +4,4 @@
4
4
  @import "./client.css";
5
5
 
6
6
  /* Import minimal-tiptap styles for rich text editor in task forms */
7
- @import "@workspace/ui/components/minimal-tiptap/styles.css";
7
+ @import "../shared/components-minimal-tiptap-styles.css";
@@ -0,0 +1,547 @@
1
+ /* Reference tailwindcss for @apply directives to work in distributed packages */
2
+ @reference "tailwindcss";
3
+
4
+ .minimal-tiptap-editor .ProseMirror code.inline {
5
+ @apply rounded border border-[var(--mt-code-color)] bg-[var(--mt-code-background)] px-1 py-0.5 text-sm;
6
+ }
7
+
8
+ .minimal-tiptap-editor .ProseMirror pre {
9
+ @apply relative overflow-auto rounded border font-mono text-sm;
10
+ @apply border-[var(--mt-pre-border)] bg-[var(--mt-pre-background)] text-[var(--mt-pre-color)];
11
+ @apply text-left hyphens-none whitespace-pre;
12
+ }
13
+
14
+ .minimal-tiptap-editor .ProseMirror code {
15
+ @apply leading-[1.7em] break-words;
16
+ }
17
+
18
+ .minimal-tiptap-editor .ProseMirror pre code {
19
+ @apply block overflow-x-auto p-3.5;
20
+ }
21
+
22
+ .minimal-tiptap-editor .ProseMirror pre {
23
+ .hljs-keyword,
24
+ .hljs-operator,
25
+ .hljs-function,
26
+ .hljs-built_in,
27
+ .hljs-builtin-name {
28
+ color: var(--hljs-keyword);
29
+ }
30
+
31
+ .hljs-attr,
32
+ .hljs-symbol,
33
+ .hljs-property,
34
+ .hljs-attribute,
35
+ .hljs-variable,
36
+ .hljs-template-variable,
37
+ .hljs-params {
38
+ color: var(--hljs-attr);
39
+ }
40
+
41
+ .hljs-name,
42
+ .hljs-regexp,
43
+ .hljs-link,
44
+ .hljs-type,
45
+ .hljs-addition {
46
+ color: var(--hljs-name);
47
+ }
48
+
49
+ .hljs-string,
50
+ .hljs-bullet {
51
+ color: var(--hljs-string);
52
+ }
53
+
54
+ .hljs-title,
55
+ .hljs-subst,
56
+ .hljs-section {
57
+ color: var(--hljs-title);
58
+ }
59
+
60
+ .hljs-literal,
61
+ .hljs-type,
62
+ .hljs-deletion {
63
+ color: var(--hljs-literal);
64
+ }
65
+
66
+ .hljs-selector-tag,
67
+ .hljs-selector-id,
68
+ .hljs-selector-class {
69
+ color: var(--hljs-selector-tag);
70
+ }
71
+
72
+ .hljs-number {
73
+ color: var(--hljs-number);
74
+ }
75
+
76
+ .hljs-comment,
77
+ .hljs-meta,
78
+ .hljs-quote {
79
+ color: var(--hljs-comment);
80
+ }
81
+
82
+ .hljs-emphasis {
83
+ @apply italic;
84
+ }
85
+
86
+ .hljs-strong {
87
+ @apply font-bold;
88
+ }
89
+ }
90
+
91
+ .minimal-tiptap-editor .ProseMirror > p.is-editor-empty::before {
92
+ content: attr(data-placeholder);
93
+ @apply pointer-events-none float-left h-0 text-[var(--mt-secondary)];
94
+ }
95
+
96
+ .minimal-tiptap-editor .ProseMirror ol {
97
+ @apply list-decimal;
98
+ }
99
+
100
+ .minimal-tiptap-editor .ProseMirror ol ol {
101
+ list-style: lower-alpha;
102
+ }
103
+
104
+ .minimal-tiptap-editor .ProseMirror ol ol ol {
105
+ list-style: lower-roman;
106
+ }
107
+
108
+ .minimal-tiptap-editor .ProseMirror ul {
109
+ list-style: disc;
110
+ }
111
+
112
+ .minimal-tiptap-editor .ProseMirror ul ul {
113
+ list-style: circle;
114
+ }
115
+
116
+ .minimal-tiptap-editor .ProseMirror ul ul ul {
117
+ list-style: square;
118
+ }
119
+
120
+ /* Task Lists */
121
+ .minimal-tiptap-editor .ProseMirror ul[data-type="taskList"] {
122
+ @apply list-none pl-0;
123
+ }
124
+
125
+ .minimal-tiptap-editor .ProseMirror ul[data-type="taskList"] li {
126
+ @apply flex items-start gap-2;
127
+ }
128
+
129
+ .minimal-tiptap-editor .ProseMirror ul[data-type="taskList"] li > label {
130
+ @apply flex items-center mt-1.5;
131
+ }
132
+
133
+ .minimal-tiptap-editor .ProseMirror ul[data-type="taskList"] li > label input[type="checkbox"] {
134
+ @apply size-4 cursor-pointer rounded border border-input accent-primary;
135
+ }
136
+
137
+ .minimal-tiptap-editor .ProseMirror ul[data-type="taskList"] li > div {
138
+ @apply flex-1;
139
+ }
140
+
141
+ .minimal-tiptap-editor .ProseMirror ul[data-type="taskList"] li[data-checked="true"] > div {
142
+ @apply text-muted-foreground line-through;
143
+ }
144
+
145
+ .minimal-tiptap-editor .ProseMirror .heading-node {
146
+ @apply relative font-semibold;
147
+ }
148
+
149
+ .minimal-tiptap-editor .ProseMirror .heading-node:first-child {
150
+ @apply mt-0;
151
+ }
152
+
153
+ .minimal-tiptap-editor .ProseMirror h1 {
154
+ @apply mt-[46px] mb-4 text-[1.375rem] leading-7 tracking-[-0.004375rem];
155
+ }
156
+
157
+ .minimal-tiptap-editor .ProseMirror h2 {
158
+ @apply mt-8 mb-3.5 text-[1.1875rem] leading-7 tracking-[0.003125rem];
159
+ }
160
+
161
+ .minimal-tiptap-editor .ProseMirror h3 {
162
+ @apply mt-6 mb-3 text-[1.0625rem] leading-6 tracking-[0.00625rem];
163
+ }
164
+
165
+ .minimal-tiptap-editor .ProseMirror h4 {
166
+ @apply mt-4 mb-2 text-[0.9375rem] leading-6;
167
+ }
168
+
169
+ .minimal-tiptap-editor .ProseMirror h5 {
170
+ @apply mt-4 mb-2 text-sm;
171
+ }
172
+
173
+ .minimal-tiptap-editor .ProseMirror h5 {
174
+ @apply mt-4 mb-2 text-sm;
175
+ }
176
+
177
+ .minimal-tiptap-editor .ProseMirror a.link {
178
+ @apply text-primary underline;
179
+ }
180
+
181
+ .minimal-tiptap-editor .ProseMirror a.link:hover {
182
+ @apply underline;
183
+ }
184
+
185
+ [data-rmiz-ghost] {
186
+ position: absolute;
187
+ pointer-events: none;
188
+ }
189
+ [data-rmiz-btn-zoom],
190
+ [data-rmiz-btn-unzoom] {
191
+ background-color: rgba(0, 0, 0, 0.7);
192
+ border-radius: 50%;
193
+ border: none;
194
+ box-shadow: 0 0 1px rgba(255, 255, 255, 0.5);
195
+ color: #fff;
196
+ height: 40px;
197
+ margin: 0;
198
+ outline-offset: 2px;
199
+ padding: 9px;
200
+ touch-action: manipulation;
201
+ width: 40px;
202
+ -webkit-appearance: none;
203
+ -moz-appearance: none;
204
+ appearance: none;
205
+ }
206
+ [data-rmiz-btn-zoom]:not(:focus):not(:active) {
207
+ position: absolute;
208
+ clip: rect(0 0 0 0);
209
+ clip-path: inset(50%);
210
+ height: 1px;
211
+ overflow: hidden;
212
+ pointer-events: none;
213
+ white-space: nowrap;
214
+ width: 1px;
215
+ }
216
+ [data-rmiz-btn-zoom] {
217
+ position: absolute;
218
+ inset: 10px 10px auto auto;
219
+ cursor: zoom-in;
220
+ }
221
+ [data-rmiz-btn-unzoom] {
222
+ position: absolute;
223
+ inset: 20px 20px auto auto;
224
+ cursor: zoom-out;
225
+ z-index: 1;
226
+ }
227
+ [data-rmiz-content="found"] img,
228
+ [data-rmiz-content="found"] svg,
229
+ [data-rmiz-content="found"] [role="img"],
230
+ [data-rmiz-content="found"] [data-zoom] {
231
+ cursor: inherit;
232
+ }
233
+ [data-rmiz-modal]::backdrop {
234
+ display: none;
235
+ }
236
+ [data-rmiz-modal][open] {
237
+ position: fixed;
238
+ width: 100vw;
239
+ width: 100dvw;
240
+ height: 100vh;
241
+ height: 100dvh;
242
+ max-width: none;
243
+ max-height: none;
244
+ margin: 0;
245
+ padding: 0;
246
+ border: 0;
247
+ background: transparent;
248
+ overflow: hidden;
249
+ }
250
+ [data-rmiz-modal-overlay] {
251
+ position: absolute;
252
+ inset: 0;
253
+ transition: background-color 0.3s;
254
+ }
255
+ [data-rmiz-modal-overlay="hidden"] {
256
+ background-color: rgba(255, 255, 255, 0);
257
+ }
258
+ [data-rmiz-modal-overlay="visible"] {
259
+ background-color: rgba(255, 255, 255, 1);
260
+ }
261
+ [data-rmiz-modal-content] {
262
+ position: relative;
263
+ width: 100%;
264
+ height: 100%;
265
+ }
266
+ [data-rmiz-modal-img] {
267
+ position: absolute;
268
+ cursor: zoom-out;
269
+ image-rendering: high-quality;
270
+ transform-origin: top left;
271
+ transition: transform 0.3s;
272
+ }
273
+ @media (prefers-reduced-motion: reduce) {
274
+ [data-rmiz-modal-overlay],
275
+ [data-rmiz-modal-img] {
276
+ transition-duration: 0.01ms !important;
277
+ }
278
+ }
279
+
280
+
281
+ :root {
282
+ --mt-overlay: rgba(251, 251, 251, 0.75);
283
+ --mt-transparent-foreground: rgba(0, 0, 0, 0.4);
284
+ --mt-bg-secondary: rgba(251, 251, 251, 0.8);
285
+ --mt-code-background: #082b781f;
286
+ --mt-code-color: #d4d4d4;
287
+ --mt-secondary: #9d9d9f;
288
+ --mt-pre-background: #ececec;
289
+ --mt-pre-border: #e0e0e0;
290
+ --mt-pre-color: #2f2f31;
291
+ --mt-hr: #dcdcdc;
292
+ --mt-drag-handle-hover: #5c5c5e;
293
+
294
+ --mt-accent-bold-blue: #05c;
295
+ --mt-accent-bold-teal: #206a83;
296
+ --mt-accent-bold-green: #216e4e;
297
+ --mt-accent-bold-orange: #a54800;
298
+ --mt-accent-bold-red: #ae2e24;
299
+ --mt-accent-bold-purple: #5e4db2;
300
+
301
+ --mt-accent-gray: #758195;
302
+ --mt-accent-blue: #1d7afc;
303
+ --mt-accent-teal: #2898bd;
304
+ --mt-accent-green: #22a06b;
305
+ --mt-accent-orange: #fea362;
306
+ --mt-accent-red: #c9372c;
307
+ --mt-accent-purple: #8270db;
308
+
309
+ --mt-accent-blue-subtler: #cce0ff;
310
+ --mt-accent-teal-subtler: #c6edfb;
311
+ --mt-accent-green-subtler: #baf3db;
312
+ --mt-accent-yellow-subtler: #f8e6a0;
313
+ --mt-accent-red-subtler: #ffd5d2;
314
+ --mt-accent-purple-subtler: #dfd8fd;
315
+
316
+ --hljs-string: #aa430f;
317
+ --hljs-title: #b08836;
318
+ --hljs-comment: #999999;
319
+ --hljs-keyword: #0c5eb1;
320
+ --hljs-attr: #3a92bc;
321
+ --hljs-literal: #c82b0f;
322
+ --hljs-name: #259792;
323
+ --hljs-selector-tag: #c8500f;
324
+ --hljs-number: #3da067;
325
+ }
326
+
327
+ .dark {
328
+ --mt-overlay: rgba(31, 32, 35, 0.75);
329
+ --mt-transparent-foreground: rgba(255, 255, 255, 0.4);
330
+ --mt-bg-secondary: rgba(31, 32, 35, 0.8);
331
+ --mt-code-background: #ffffff13;
332
+ --mt-code-color: #2c2e33;
333
+ --mt-secondary: #595a5c;
334
+ --mt-pre-background: #080808;
335
+ --mt-pre-border: #23252a;
336
+ --mt-pre-color: #e3e4e6;
337
+ --mt-hr: #26282d;
338
+ --mt-drag-handle-hover: #969799;
339
+
340
+ --mt-accent-bold-blue: #85b8ff;
341
+ --mt-accent-bold-teal: #9dd9ee;
342
+ --mt-accent-bold-green: #7ee2b8;
343
+ --mt-accent-bold-orange: #fec195;
344
+ --mt-accent-bold-red: #fd9891;
345
+ --mt-accent-bold-purple: #b8acf6;
346
+
347
+ --mt-accent-gray: #738496;
348
+ --mt-accent-blue: #388bff;
349
+ --mt-accent-teal: #42b2d7;
350
+ --mt-accent-green: #2abb7f;
351
+ --mt-accent-orange: #a54800;
352
+ --mt-accent-red: #e2483d;
353
+ --mt-accent-purple: #8f7ee7;
354
+
355
+ --mt-accent-blue-subtler: #09326c;
356
+ --mt-accent-teal-subtler: #164555;
357
+ --mt-accent-green-subtler: #164b35;
358
+ --mt-accent-yellow-subtler: #533f04;
359
+ --mt-accent-red-subtler: #5d1f1a;
360
+ --mt-accent-purple-subtler: #352c63;
361
+
362
+ --hljs-string: #da936b;
363
+ --hljs-title: #f1d59d;
364
+ --hljs-comment: #aaaaaa;
365
+ --hljs-keyword: #6699cc;
366
+ --hljs-attr: #90cae8;
367
+ --hljs-literal: #f2777a;
368
+ --hljs-name: #5fc0a0;
369
+ --hljs-selector-tag: #e8c785;
370
+ --hljs-number: #b6e7b6;
371
+ }
372
+
373
+ .minimal-tiptap-editor .ProseMirror {
374
+ @apply flex max-w-full cursor-text flex-col;
375
+ @apply z-0 outline-0;
376
+ }
377
+
378
+ .minimal-tiptap-editor .ProseMirror > div.editor {
379
+ @apply block flex-1 whitespace-pre-wrap;
380
+ }
381
+
382
+ .minimal-tiptap-editor .ProseMirror .block-node:not(:last-child),
383
+ .minimal-tiptap-editor .ProseMirror .list-node:not(:last-child),
384
+ .minimal-tiptap-editor .ProseMirror .text-node:not(:last-child) {
385
+ @apply mb-2.5;
386
+ }
387
+
388
+ .minimal-tiptap-editor .ProseMirror ol,
389
+ .minimal-tiptap-editor .ProseMirror ul {
390
+ @apply pl-6;
391
+ }
392
+
393
+ .minimal-tiptap-editor .ProseMirror blockquote,
394
+ .minimal-tiptap-editor .ProseMirror dl,
395
+ .minimal-tiptap-editor .ProseMirror ol,
396
+ .minimal-tiptap-editor .ProseMirror p,
397
+ .minimal-tiptap-editor .ProseMirror pre,
398
+ .minimal-tiptap-editor .ProseMirror ul {
399
+ @apply m-0;
400
+ }
401
+
402
+ .minimal-tiptap-editor .ProseMirror li {
403
+ @apply leading-7;
404
+ }
405
+
406
+ .minimal-tiptap-editor .ProseMirror p {
407
+ @apply break-words;
408
+ }
409
+
410
+ .minimal-tiptap-editor .ProseMirror li .text-node:has(+ .list-node),
411
+ .minimal-tiptap-editor .ProseMirror li > .list-node,
412
+ .minimal-tiptap-editor .ProseMirror li > .text-node,
413
+ .minimal-tiptap-editor .ProseMirror li p {
414
+ @apply mb-0;
415
+ }
416
+
417
+ .minimal-tiptap-editor .ProseMirror blockquote {
418
+ @apply relative pl-3.5;
419
+ }
420
+
421
+ .minimal-tiptap-editor .ProseMirror blockquote::before,
422
+ .minimal-tiptap-editor .ProseMirror blockquote.is-empty::before {
423
+ @apply bg-accent-foreground/15 absolute top-0 bottom-0 left-0 h-full w-1 rounded-sm content-[''];
424
+ }
425
+
426
+ .minimal-tiptap-editor .ProseMirror hr {
427
+ @apply my-3 h-0.5 w-full border-none bg-[var(--mt-hr)];
428
+ }
429
+
430
+ .minimal-tiptap-editor .ProseMirror-focused hr.ProseMirror-selectednode {
431
+ @apply outline-muted-foreground rounded-full outline-2 outline-offset-1;
432
+ }
433
+
434
+ .minimal-tiptap-editor .ProseMirror .ProseMirror-gapcursor {
435
+ @apply pointer-events-none absolute hidden;
436
+ }
437
+
438
+ .minimal-tiptap-editor .ProseMirror .ProseMirror-hideselection {
439
+ @apply caret-transparent;
440
+ }
441
+
442
+ .minimal-tiptap-editor .ProseMirror.resize-cursor {
443
+ @apply cursor-col-resize;
444
+ }
445
+
446
+ .minimal-tiptap-editor .ProseMirror .selection {
447
+ @apply inline-block;
448
+ }
449
+
450
+ .minimal-tiptap-editor .ProseMirror s span {
451
+ @apply line-through;
452
+ }
453
+
454
+ .minimal-tiptap-editor .ProseMirror .selection,
455
+ .minimal-tiptap-editor .ProseMirror *::selection {
456
+ @apply bg-primary/25;
457
+ }
458
+
459
+ /* Override native selection when custom selection is present */
460
+ .minimal-tiptap-editor .ProseMirror .selection::selection {
461
+ background: transparent;
462
+ }
463
+
464
+ /* Tables */
465
+ .minimal-tiptap-editor .ProseMirror table {
466
+ @apply my-4 w-full border-collapse overflow-hidden rounded-lg border border-border;
467
+ }
468
+
469
+ .minimal-tiptap-editor .ProseMirror table td,
470
+ .minimal-tiptap-editor .ProseMirror table th {
471
+ @apply relative min-w-[100px] border border-border px-3 py-2 text-left align-top;
472
+ }
473
+
474
+ .minimal-tiptap-editor .ProseMirror table th {
475
+ @apply bg-muted font-semibold;
476
+ }
477
+
478
+ .minimal-tiptap-editor .ProseMirror table .selectedCell {
479
+ @apply bg-primary/10;
480
+ }
481
+
482
+ .minimal-tiptap-editor .ProseMirror table .selectedCell::after {
483
+ @apply pointer-events-none absolute inset-0 bg-primary/10 content-[''];
484
+ }
485
+
486
+ /* Column resize handle */
487
+ .minimal-tiptap-editor .ProseMirror .column-resize-handle {
488
+ @apply absolute -right-0.5 top-0 bottom-0 z-10 w-1 cursor-col-resize bg-primary/50;
489
+ }
490
+
491
+ .minimal-tiptap-editor .ProseMirror.resize-cursor {
492
+ @apply cursor-col-resize;
493
+ }
494
+
495
+ /* Mentions */
496
+ .minimal-tiptap-editor .ProseMirror .mention {
497
+ @apply inline-block rounded-md bg-primary/10 px-1.5 py-0.5 font-medium text-primary;
498
+ }
499
+
500
+ .minimal-tiptap-editor .ProseMirror .mention:hover {
501
+ @apply bg-primary/20;
502
+ }
503
+
504
+ /* Highlight */
505
+ .minimal-tiptap-editor .ProseMirror mark {
506
+ @apply rounded-sm bg-yellow-200 px-0.5 dark:bg-yellow-500/40;
507
+ }
508
+
509
+ .minimal-tiptap-editor .ProseMirror mark[data-color] {
510
+ background-color: var(--highlight-color, #fef08a);
511
+ }
512
+
513
+ /* Details / Collapsible */
514
+ .minimal-tiptap-editor .ProseMirror details {
515
+ @apply my-2 rounded-lg border border-border bg-muted/30;
516
+ }
517
+
518
+ .minimal-tiptap-editor .ProseMirror details summary {
519
+ @apply cursor-pointer px-4 py-2 font-medium select-none;
520
+ }
521
+
522
+ .minimal-tiptap-editor .ProseMirror details summary:hover {
523
+ @apply bg-muted/50;
524
+ }
525
+
526
+ .minimal-tiptap-editor .ProseMirror details[open] summary {
527
+ @apply border-b border-border;
528
+ }
529
+
530
+ .minimal-tiptap-editor .ProseMirror details > div:not(summary) {
531
+ @apply px-4 py-3;
532
+ }
533
+
534
+ /* YouTube / Twitch embeds */
535
+ .minimal-tiptap-editor .ProseMirror .youtube-node,
536
+ .minimal-tiptap-editor .ProseMirror .twitch-node {
537
+ @apply my-4;
538
+ }
539
+
540
+ .minimal-tiptap-editor .ProseMirror iframe {
541
+ @apply max-w-full rounded-lg border border-border;
542
+ aspect-ratio: 16 / 9;
543
+ }
544
+
545
+ .minimal-tiptap-editor .ProseMirror .ProseMirror-selectednode iframe {
546
+ @apply outline outline-2 outline-offset-2 outline-primary;
547
+ }
@@ -1,7 +1,7 @@
1
1
  @import "./client.css";
2
2
 
3
3
  /* Import minimal-tiptap styles for rich text editor in form field overrides */
4
- @import "@workspace/ui/components/minimal-tiptap/styles.css";
4
+ @import "../shared/components-minimal-tiptap-styles.css";
5
5
 
6
6
  /* Load Tailwind Typography plugin for prose classes used by Markdown component */
7
7
  @plugin "@tailwindcss/typography";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@btst/stack",
3
- "version": "2.5.1",
3
+ "version": "2.5.2",
4
4
  "description": "A composable, plugin-based library for building full-stack applications.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -7,12 +7,12 @@ import { QueryClient } from '@tanstack/react-query';
7
7
 
8
8
  declare const createBoardSchema: z.ZodObject<{
9
9
  description: z.ZodOptional<z.ZodString>;
10
+ name: z.ZodString;
10
11
  slug: z.ZodOptional<z.ZodString>;
11
12
  ownerId: z.ZodOptional<z.ZodString>;
12
13
  organizationId: z.ZodOptional<z.ZodString>;
13
14
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
14
15
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
15
- name: z.ZodString;
16
16
  }, z.core.$strip>;
17
17
  declare const updateBoardSchema: z.ZodObject<{
18
18
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
@@ -26,10 +26,10 @@ declare const updateBoardSchema: z.ZodObject<{
26
26
  }, z.core.$strip>;
27
27
  declare const createColumnSchema: z.ZodObject<{
28
28
  title: z.ZodString;
29
+ boardId: z.ZodString;
29
30
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
30
31
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
31
32
  order: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
32
- boardId: z.ZodString;
33
33
  }, z.core.$strip>;
34
34
  declare const updateColumnSchema: z.ZodObject<{
35
35
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
@@ -323,12 +323,12 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
323
323
  method: "POST";
324
324
  body: z.ZodObject<{
325
325
  description: z.ZodOptional<z.ZodString>;
326
+ name: z.ZodString;
326
327
  slug: z.ZodOptional<z.ZodString>;
327
328
  ownerId: z.ZodOptional<z.ZodString>;
328
329
  organizationId: z.ZodOptional<z.ZodString>;
329
330
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
330
331
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
331
- name: z.ZodString;
332
332
  }, z.core.$strip>;
333
333
  }, {
334
334
  columns: ColumnWithTasks[];
@@ -345,12 +345,12 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
345
345
  method: "PUT";
346
346
  body: z.ZodObject<{
347
347
  description: z.ZodOptional<z.ZodOptional<z.ZodString>>;
348
+ name: z.ZodOptional<z.ZodString>;
348
349
  slug: z.ZodOptional<z.ZodString>;
349
350
  ownerId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
350
351
  organizationId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
351
352
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
352
353
  updatedAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
353
- name: z.ZodOptional<z.ZodString>;
354
354
  }, z.core.$strip>;
355
355
  }, Board>;
356
356
  readonly deleteBoard: better_call.StrictEndpoint<"/boards/:id", {
@@ -362,20 +362,20 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
362
362
  method: "POST";
363
363
  body: z.ZodObject<{
364
364
  title: z.ZodString;
365
+ boardId: z.ZodString;
365
366
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
366
367
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
367
368
  order: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
368
- boardId: z.ZodString;
369
369
  }, z.core.$strip>;
370
370
  }, Column>;
371
371
  readonly updateColumn: better_call.StrictEndpoint<"/columns/:id", {
372
372
  method: "PUT";
373
373
  body: z.ZodObject<{
374
374
  title: z.ZodOptional<z.ZodString>;
375
+ boardId: z.ZodOptional<z.ZodString>;
375
376
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
376
377
  updatedAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
377
378
  order: z.ZodOptional<z.ZodDefault<z.ZodOptional<z.ZodNumber>>>;
378
- boardId: z.ZodOptional<z.ZodString>;
379
379
  }, z.core.$strip>;
380
380
  }, Column>;
381
381
  readonly deleteColumn: better_call.StrictEndpoint<"/columns/:id", {
@@ -7,12 +7,12 @@ import { QueryClient } from '@tanstack/react-query';
7
7
 
8
8
  declare const createBoardSchema: z.ZodObject<{
9
9
  description: z.ZodOptional<z.ZodString>;
10
+ name: z.ZodString;
10
11
  slug: z.ZodOptional<z.ZodString>;
11
12
  ownerId: z.ZodOptional<z.ZodString>;
12
13
  organizationId: z.ZodOptional<z.ZodString>;
13
14
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
14
15
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
15
- name: z.ZodString;
16
16
  }, z.core.$strip>;
17
17
  declare const updateBoardSchema: z.ZodObject<{
18
18
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
@@ -26,10 +26,10 @@ declare const updateBoardSchema: z.ZodObject<{
26
26
  }, z.core.$strip>;
27
27
  declare const createColumnSchema: z.ZodObject<{
28
28
  title: z.ZodString;
29
+ boardId: z.ZodString;
29
30
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
30
31
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
31
32
  order: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
32
- boardId: z.ZodString;
33
33
  }, z.core.$strip>;
34
34
  declare const updateColumnSchema: z.ZodObject<{
35
35
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
@@ -323,12 +323,12 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
323
323
  method: "POST";
324
324
  body: z.ZodObject<{
325
325
  description: z.ZodOptional<z.ZodString>;
326
+ name: z.ZodString;
326
327
  slug: z.ZodOptional<z.ZodString>;
327
328
  ownerId: z.ZodOptional<z.ZodString>;
328
329
  organizationId: z.ZodOptional<z.ZodString>;
329
330
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
330
331
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
331
- name: z.ZodString;
332
332
  }, z.core.$strip>;
333
333
  }, {
334
334
  columns: ColumnWithTasks[];
@@ -345,12 +345,12 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
345
345
  method: "PUT";
346
346
  body: z.ZodObject<{
347
347
  description: z.ZodOptional<z.ZodOptional<z.ZodString>>;
348
+ name: z.ZodOptional<z.ZodString>;
348
349
  slug: z.ZodOptional<z.ZodString>;
349
350
  ownerId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
350
351
  organizationId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
351
352
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
352
353
  updatedAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
353
- name: z.ZodOptional<z.ZodString>;
354
354
  }, z.core.$strip>;
355
355
  }, Board>;
356
356
  readonly deleteBoard: better_call.StrictEndpoint<"/boards/:id", {
@@ -362,20 +362,20 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
362
362
  method: "POST";
363
363
  body: z.ZodObject<{
364
364
  title: z.ZodString;
365
+ boardId: z.ZodString;
365
366
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
366
367
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
367
368
  order: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
368
- boardId: z.ZodString;
369
369
  }, z.core.$strip>;
370
370
  }, Column>;
371
371
  readonly updateColumn: better_call.StrictEndpoint<"/columns/:id", {
372
372
  method: "PUT";
373
373
  body: z.ZodObject<{
374
374
  title: z.ZodOptional<z.ZodString>;
375
+ boardId: z.ZodOptional<z.ZodString>;
375
376
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
376
377
  updatedAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
377
378
  order: z.ZodOptional<z.ZodDefault<z.ZodOptional<z.ZodNumber>>>;
378
- boardId: z.ZodOptional<z.ZodString>;
379
379
  }, z.core.$strip>;
380
380
  }, Column>;
381
381
  readonly deleteColumn: better_call.StrictEndpoint<"/columns/:id", {
@@ -7,12 +7,12 @@ import { QueryClient } from '@tanstack/react-query';
7
7
 
8
8
  declare const createBoardSchema: z.ZodObject<{
9
9
  description: z.ZodOptional<z.ZodString>;
10
+ name: z.ZodString;
10
11
  slug: z.ZodOptional<z.ZodString>;
11
12
  ownerId: z.ZodOptional<z.ZodString>;
12
13
  organizationId: z.ZodOptional<z.ZodString>;
13
14
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
14
15
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
15
- name: z.ZodString;
16
16
  }, z.core.$strip>;
17
17
  declare const updateBoardSchema: z.ZodObject<{
18
18
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
@@ -26,10 +26,10 @@ declare const updateBoardSchema: z.ZodObject<{
26
26
  }, z.core.$strip>;
27
27
  declare const createColumnSchema: z.ZodObject<{
28
28
  title: z.ZodString;
29
+ boardId: z.ZodString;
29
30
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
30
31
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
31
32
  order: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
32
- boardId: z.ZodString;
33
33
  }, z.core.$strip>;
34
34
  declare const updateColumnSchema: z.ZodObject<{
35
35
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
@@ -323,12 +323,12 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
323
323
  method: "POST";
324
324
  body: z.ZodObject<{
325
325
  description: z.ZodOptional<z.ZodString>;
326
+ name: z.ZodString;
326
327
  slug: z.ZodOptional<z.ZodString>;
327
328
  ownerId: z.ZodOptional<z.ZodString>;
328
329
  organizationId: z.ZodOptional<z.ZodString>;
329
330
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
330
331
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
331
- name: z.ZodString;
332
332
  }, z.core.$strip>;
333
333
  }, {
334
334
  columns: ColumnWithTasks[];
@@ -345,12 +345,12 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
345
345
  method: "PUT";
346
346
  body: z.ZodObject<{
347
347
  description: z.ZodOptional<z.ZodOptional<z.ZodString>>;
348
+ name: z.ZodOptional<z.ZodString>;
348
349
  slug: z.ZodOptional<z.ZodString>;
349
350
  ownerId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
350
351
  organizationId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
351
352
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
352
353
  updatedAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
353
- name: z.ZodOptional<z.ZodString>;
354
354
  }, z.core.$strip>;
355
355
  }, Board>;
356
356
  readonly deleteBoard: better_call.StrictEndpoint<"/boards/:id", {
@@ -362,20 +362,20 @@ declare const kanbanBackendPlugin: (hooks?: KanbanBackendHooks) => _btst_stack_p
362
362
  method: "POST";
363
363
  body: z.ZodObject<{
364
364
  title: z.ZodString;
365
+ boardId: z.ZodString;
365
366
  createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
366
367
  updatedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
367
368
  order: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
368
- boardId: z.ZodString;
369
369
  }, z.core.$strip>;
370
370
  }, Column>;
371
371
  readonly updateColumn: better_call.StrictEndpoint<"/columns/:id", {
372
372
  method: "PUT";
373
373
  body: z.ZodObject<{
374
374
  title: z.ZodOptional<z.ZodString>;
375
+ boardId: z.ZodOptional<z.ZodString>;
375
376
  createdAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
376
377
  updatedAt: z.ZodOptional<z.ZodOptional<z.ZodCoercedDate<unknown>>>;
377
378
  order: z.ZodOptional<z.ZodDefault<z.ZodOptional<z.ZodNumber>>>;
378
- boardId: z.ZodOptional<z.ZodString>;
379
379
  }, z.core.$strip>;
380
380
  }, Column>;
381
381
  readonly deleteColumn: better_call.StrictEndpoint<"/columns/:id", {