panelui-native 0.30.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +4 -2
  2. package/lib/module/components/calendar/index.js +107 -24
  3. package/lib/module/components/calendar/index.js.map +1 -1
  4. package/lib/module/components/heatmap-chart/index.js +9 -8
  5. package/lib/module/components/heatmap-chart/index.js.map +1 -1
  6. package/lib/module/components/map/index.js +50 -4
  7. package/lib/module/components/map/index.js.map +1 -1
  8. package/lib/module/components/plan/index.js +307 -21
  9. package/lib/module/components/plan/index.js.map +1 -1
  10. package/lib/module/components/post/index.js +992 -0
  11. package/lib/module/components/post/index.js.map +1 -0
  12. package/lib/module/components/response/index.js +296 -0
  13. package/lib/module/components/response/index.js.map +1 -0
  14. package/lib/module/components/response/markdown.js +463 -0
  15. package/lib/module/components/response/markdown.js.map +1 -0
  16. package/lib/module/components/select/index.js +97 -15
  17. package/lib/module/components/select/index.js.map +1 -1
  18. package/lib/module/components/table/index.js +632 -0
  19. package/lib/module/components/table/index.js.map +1 -0
  20. package/lib/module/icons/index.js +200 -0
  21. package/lib/module/icons/index.js.map +1 -1
  22. package/lib/module/index.js +4 -1
  23. package/lib/module/index.js.map +1 -1
  24. package/lib/module/utils/date.js +129 -22
  25. package/lib/module/utils/date.js.map +1 -1
  26. package/lib/typescript/src/components/calendar/index.d.ts +12 -3
  27. package/lib/typescript/src/components/calendar/index.d.ts.map +1 -1
  28. package/lib/typescript/src/components/heatmap-chart/index.d.ts.map +1 -1
  29. package/lib/typescript/src/components/map/index.d.ts +8 -1
  30. package/lib/typescript/src/components/map/index.d.ts.map +1 -1
  31. package/lib/typescript/src/components/plan/index.d.ts +121 -10
  32. package/lib/typescript/src/components/plan/index.d.ts.map +1 -1
  33. package/lib/typescript/src/components/post/index.d.ts +358 -0
  34. package/lib/typescript/src/components/post/index.d.ts.map +1 -0
  35. package/lib/typescript/src/components/response/index.d.ts +91 -0
  36. package/lib/typescript/src/components/response/index.d.ts.map +1 -0
  37. package/lib/typescript/src/components/response/markdown.d.ts +88 -0
  38. package/lib/typescript/src/components/response/markdown.d.ts.map +1 -0
  39. package/lib/typescript/src/components/select/index.d.ts +27 -2
  40. package/lib/typescript/src/components/select/index.d.ts.map +1 -1
  41. package/lib/typescript/src/components/table/index.d.ts +274 -0
  42. package/lib/typescript/src/components/table/index.d.ts.map +1 -0
  43. package/lib/typescript/src/icons/index.d.ts +40 -1
  44. package/lib/typescript/src/icons/index.d.ts.map +1 -1
  45. package/lib/typescript/src/index.d.ts +5 -2
  46. package/lib/typescript/src/index.d.ts.map +1 -1
  47. package/lib/typescript/src/utils/date.d.ts +49 -5
  48. package/lib/typescript/src/utils/date.d.ts.map +1 -1
  49. package/package.json +1 -1
  50. package/src/components/calendar/index.tsx +136 -23
  51. package/src/components/heatmap-chart/index.tsx +9 -9
  52. package/src/components/map/index.tsx +53 -4
  53. package/src/components/plan/index.tsx +344 -21
  54. package/src/components/post/index.tsx +1116 -0
  55. package/src/components/response/index.tsx +390 -0
  56. package/src/components/response/markdown.ts +489 -0
  57. package/src/components/select/index.tsx +132 -12
  58. package/src/components/table/index.tsx +747 -0
  59. package/src/icons/index.tsx +162 -1
  60. package/src/index.ts +60 -0
  61. package/src/utils/date.ts +146 -22
@@ -0,0 +1,463 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * A small Markdown reader, written for text that is still arriving.
5
+ *
6
+ * No parser library. What a chat answer actually contains is headings,
7
+ * paragraphs, lists, fenced code, blockquotes, tables, rules and a handful of
8
+ * inline marks — and every general-purpose parser worth using assumes it has
9
+ * been handed the whole document. That assumption is the one thing that is
10
+ * never true here.
11
+ *
12
+ * ## Half-arrived markdown
13
+ *
14
+ * A token stream shows you every prefix of the final text, so the reader sees
15
+ * `**bo`, then `**bol`, then `**bold**`. Treated naively that is three
16
+ * documents: two with literal asterisks in them and one with a bolded word. The
17
+ * text would flash between styles on nearly every frame, which is worse than no
18
+ * formatting at all — the eye tracks the flicker instead of the words.
19
+ *
20
+ * So an unterminated construct at the very end of the input is *completed
21
+ * speculatively* rather than escaped: an open fence becomes a code block that
22
+ * is still filling, an open `**` becomes bold text that is still being written.
23
+ * Anything unterminated anywhere else is literal, because a document that has
24
+ * stopped arriving means what it says.
25
+ *
26
+ * The two rules that follow from this:
27
+ *
28
+ * - **Only the tail is speculative.** An asterisk in the middle of a finished
29
+ * paragraph is an asterisk.
30
+ * - **A speculative construct never removes visible text.** The characters that
31
+ * opened it are hidden, and everything after them stays on screen. Otherwise
32
+ * the last word of the answer disappears and reappears as its delimiter
33
+ * arrives.
34
+ */
35
+
36
+ const FENCE = /^ {0,3}(`{3,}|~{3,})\s*([^`\s]*)/;
37
+ const HEADING = /^ {0,3}(#{1,6})\s+(.*)$/;
38
+ const RULE = /^ {0,3}((\*\s*){3,}|(-\s*){3,}|(_\s*){3,})$/;
39
+ const QUOTE = /^ {0,3}> ?(.*)$/;
40
+ const BULLET = /^(\s*)([-*+])\s+(.*)$/;
41
+ const ORDERED = /^(\s*)(\d{1,9})[.)]\s+(.*)$/;
42
+ const TABLE_DIVIDER = /^\s*\|?\s*:?-{1,}:?\s*(\|\s*:?-{1,}:?\s*)*\|?\s*$/;
43
+
44
+ /**
45
+ * Splits a document into blocks.
46
+ *
47
+ * `streaming` is what turns speculative completion on. With it off — a stored
48
+ * answer, a message that has finished — an unterminated fence is just a
49
+ * paragraph starting with three backticks, which is what it literally is.
50
+ */
51
+ export function parseMarkdown(source, streaming = false) {
52
+ const lines = source.replace(/\r\n?/g, '\n').split('\n');
53
+ return parseBlocks(lines, streaming);
54
+ }
55
+ function parseBlocks(lines, streaming) {
56
+ const blocks = [];
57
+ let index = 0;
58
+ while (index < lines.length) {
59
+ const line = lines[index];
60
+ if (!line.trim()) {
61
+ index += 1;
62
+ continue;
63
+ }
64
+ const fence = FENCE.exec(line);
65
+ if (fence) {
66
+ const marker = fence[1];
67
+ const language = fence[2] || undefined;
68
+ const body = [];
69
+ let closed = false;
70
+ index += 1;
71
+ while (index < lines.length) {
72
+ const current = lines[index];
73
+ // Closed by a run of the same character at least as long as the opener,
74
+ // and nothing else on the line.
75
+ if (current.trimStart().startsWith(marker[0].repeat(marker.length)) && !current.trim().slice(marker.length).trim()) {
76
+ closed = true;
77
+ index += 1;
78
+ break;
79
+ }
80
+ body.push(current);
81
+ index += 1;
82
+ }
83
+
84
+ // An unclosed fence in a finished document is not a code block: it is a
85
+ // paragraph that begins with three backticks, and pretending otherwise
86
+ // swallows the rest of the answer.
87
+ if (!closed && !streaming) {
88
+ blocks.push({
89
+ type: 'paragraph',
90
+ inline: parseInline(line, false)
91
+ });
92
+ for (const text of body) {
93
+ if (text.trim()) blocks.push({
94
+ type: 'paragraph',
95
+ inline: parseInline(text, false)
96
+ });
97
+ }
98
+ continue;
99
+ }
100
+ blocks.push({
101
+ type: 'code',
102
+ code: body.join('\n'),
103
+ language,
104
+ open: !closed
105
+ });
106
+ continue;
107
+ }
108
+ if (RULE.test(line)) {
109
+ blocks.push({
110
+ type: 'rule'
111
+ });
112
+ index += 1;
113
+ continue;
114
+ }
115
+ const heading = HEADING.exec(line);
116
+ if (heading) {
117
+ const level = heading[1].length;
118
+ blocks.push({
119
+ type: 'heading',
120
+ level,
121
+ // Trailing hashes are a closing marker, not content.
122
+ inline: parseInline(heading[2].replace(/\s+#+\s*$/, ''), streaming && index === lines.length - 1)
123
+ });
124
+ index += 1;
125
+ continue;
126
+ }
127
+ if (QUOTE.test(line)) {
128
+ const body = [];
129
+ while (index < lines.length) {
130
+ const match = QUOTE.exec(lines[index]);
131
+ if (!match) break;
132
+ body.push(match[1]);
133
+ index += 1;
134
+ }
135
+ blocks.push({
136
+ type: 'quote',
137
+ blocks: parseBlocks(body, streaming)
138
+ });
139
+ continue;
140
+ }
141
+ const table = parseTable(lines, index, streaming);
142
+ if (table) {
143
+ blocks.push(table.block);
144
+ index = table.next;
145
+ continue;
146
+ }
147
+ if (BULLET.test(line) || ORDERED.test(line)) {
148
+ const list = parseList(lines, index, streaming);
149
+ blocks.push(list.block);
150
+ index = list.next;
151
+ continue;
152
+ }
153
+
154
+ // A paragraph runs to the first blank line or the first line that starts
155
+ // something else.
156
+ const body = [];
157
+ while (index < lines.length) {
158
+ const current = lines[index];
159
+ if (!current.trim()) break;
160
+ if (index > 0 && (FENCE.test(current) || HEADING.test(current) || RULE.test(current) || QUOTE.test(current) || BULLET.test(current) || ORDERED.test(current)) && body.length) {
161
+ break;
162
+ }
163
+ body.push(current.trim());
164
+ index += 1;
165
+ }
166
+ blocks.push({
167
+ type: 'paragraph',
168
+ inline: parseInline(body.join(' '), streaming && index >= lines.length)
169
+ });
170
+ }
171
+ return blocks;
172
+ }
173
+
174
+ /**
175
+ * A GFM table, or nothing.
176
+ *
177
+ * The divider row is what makes a table a table — a run of pipes on its own is
178
+ * just a paragraph with pipes in it — so a header line is only a header once
179
+ * the line under it has arrived. Mid-stream that means a table appears a beat
180
+ * after its first row, which is the right beat: it is not a table yet.
181
+ */
182
+ function parseTable(lines, start, streaming) {
183
+ const header = lines[start];
184
+ const divider = lines[start + 1];
185
+ if (!header || !divider) return null;
186
+ if (!header.includes('|')) return null;
187
+ if (!TABLE_DIVIDER.test(divider)) return null;
188
+ const head = splitRow(header).map(cell => parseInline(cell, false));
189
+ const align = splitRow(divider).map(cell => {
190
+ const left = cell.startsWith(':');
191
+ const right = cell.endsWith(':');
192
+ if (left && right) return 'center';
193
+ if (right) return 'right';
194
+ if (left) return 'left';
195
+ return null;
196
+ });
197
+ const rows = [];
198
+ let index = start + 2;
199
+ while (index < lines.length) {
200
+ const line = lines[index];
201
+ if (!line.trim() || !line.includes('|')) break;
202
+ // The last line of a stream is very likely half-typed. Holding it back for
203
+ // one token is better than a row that grows a cell at a time.
204
+ const partial = streaming && index === lines.length - 1;
205
+ if (partial) {
206
+ index += 1;
207
+ break;
208
+ }
209
+ rows.push(splitRow(line).map(cell => parseInline(cell, false)));
210
+ index += 1;
211
+ }
212
+ return {
213
+ block: {
214
+ type: 'table',
215
+ head,
216
+ rows,
217
+ align
218
+ },
219
+ next: index
220
+ };
221
+ }
222
+ function splitRow(row) {
223
+ return row.trim().replace(/^\|/, '').replace(/\|$/, '').split('|').map(cell => cell.trim());
224
+ }
225
+
226
+ /**
227
+ * A list, and everything indented under it.
228
+ *
229
+ * Nesting is by indent, and a nested list becomes a block inside its parent
230
+ * item rather than a sibling — which is what lets an item hold a paragraph, a
231
+ * sub-list and a code block at once.
232
+ */
233
+ function parseList(lines, start, streaming) {
234
+ const first = BULLET.exec(lines[start]) ?? ORDERED.exec(lines[start]);
235
+ const ordered = !BULLET.test(lines[start]);
236
+ const baseIndent = first[1].length;
237
+ const startNumber = ordered ? Number(first[2]) : 1;
238
+ const items = [];
239
+ let current = null;
240
+ let index = start;
241
+ while (index < lines.length) {
242
+ const line = lines[index];
243
+ if (!line.trim()) {
244
+ // A blank line inside a list is only the end of it if what follows is not
245
+ // indented under an item.
246
+ const next = lines[index + 1];
247
+ if (next && next.trim() && leadingSpaces(next) <= baseIndent && !isItem(next)) break;
248
+ if (current) current.push('');
249
+ index += 1;
250
+ continue;
251
+ }
252
+ const item = BULLET.exec(line) ?? ORDERED.exec(line);
253
+ if (item && item[1].length <= baseIndent) {
254
+ if (ordered !== !BULLET.test(line)) break;
255
+ current = [item[3]];
256
+ items.push(current);
257
+ index += 1;
258
+ continue;
259
+ }
260
+ if (leadingSpaces(line) > baseIndent && current) {
261
+ current.push(line.slice(baseIndent + 1));
262
+ index += 1;
263
+ continue;
264
+ }
265
+ break;
266
+ }
267
+ return {
268
+ block: {
269
+ type: 'list',
270
+ ordered,
271
+ start: Number.isFinite(startNumber) ? startNumber : 1,
272
+ items: items.map((body, position) => parseBlocks(body, streaming && position === items.length - 1))
273
+ },
274
+ next: index
275
+ };
276
+ }
277
+ function isItem(line) {
278
+ return BULLET.test(line) || ORDERED.test(line);
279
+ }
280
+ function leadingSpaces(line) {
281
+ return line.length - line.trimStart().length;
282
+ }
283
+
284
+ /* -------------------------------------------------------------------------- */
285
+ /* Inline */
286
+ /* -------------------------------------------------------------------------- */
287
+
288
+ /**
289
+ * Splits a run of text into styled spans.
290
+ *
291
+ * `tail` says this run is the end of a stream, which is what licenses closing
292
+ * an open delimiter speculatively. It is deliberately narrow: only the *last*
293
+ * unterminated opener on the line is completed, and only when nothing after it
294
+ * could still turn out to be the closer.
295
+ */
296
+ export function parseInline(source, tail) {
297
+ const tokens = [];
298
+ let buffer = '';
299
+ let index = 0;
300
+ const marks = {};
301
+ const flush = () => {
302
+ if (!buffer) return;
303
+ tokens.push({
304
+ kind: 'text',
305
+ value: buffer,
306
+ ...marks
307
+ });
308
+ buffer = '';
309
+ };
310
+ while (index < source.length) {
311
+ const rest = source.slice(index);
312
+
313
+ // Escapes come first, or `\*` would open emphasis.
314
+ if (rest[0] === '\\' && rest.length > 1) {
315
+ buffer += rest[1];
316
+ index += 2;
317
+ continue;
318
+ }
319
+
320
+ // Inline code wins over emphasis: asterisks inside backticks are literal.
321
+ if (rest[0] === '`') {
322
+ const run = /^(`+)/.exec(rest)[1];
323
+ const closer = source.indexOf(run, index + run.length);
324
+ if (closer !== -1) {
325
+ flush();
326
+ tokens.push({
327
+ kind: 'code',
328
+ value: source.slice(index + run.length, closer),
329
+ ...marks
330
+ });
331
+ index = closer + run.length;
332
+ continue;
333
+ }
334
+ if (tail) {
335
+ // Still being typed. Everything after the backtick is code so far.
336
+ flush();
337
+ const value = source.slice(index + run.length);
338
+ if (value) tokens.push({
339
+ kind: 'code',
340
+ value,
341
+ ...marks
342
+ });
343
+ index = source.length;
344
+ continue;
345
+ }
346
+ buffer += run;
347
+ index += run.length;
348
+ continue;
349
+ }
350
+ const image = /^!\[([^\]]*)\]\(([^)\s]*)[^)]*\)/.exec(rest);
351
+ if (image) {
352
+ flush();
353
+ tokens.push({
354
+ kind: 'image',
355
+ value: image[1],
356
+ href: image[2]
357
+ });
358
+ index += image[0].length;
359
+ continue;
360
+ }
361
+ const link = /^\[([^\]]*)\]\(([^)\s]*)[^)]*\)/.exec(rest);
362
+ if (link) {
363
+ flush();
364
+ tokens.push({
365
+ kind: 'link',
366
+ value: link[1],
367
+ href: link[2],
368
+ ...marks
369
+ });
370
+ index += link[0].length;
371
+ continue;
372
+ }
373
+
374
+ // A link whose closing paren has not arrived. Show the label and nothing
375
+ // else — the brackets and the half-typed URL are scaffolding, and dropping
376
+ // them now means the text does not jump when the rest lands.
377
+ if (tail) {
378
+ const partialLink = /^\[([^\]]*)\](\([^)]*)?$/.exec(rest);
379
+ if (partialLink) {
380
+ flush();
381
+ if (partialLink[1]) tokens.push({
382
+ kind: 'text',
383
+ value: partialLink[1],
384
+ ...marks
385
+ });
386
+ index = source.length;
387
+ continue;
388
+ }
389
+ }
390
+ const emphasis = /^(\*\*\*|___|\*\*|__|~~|\*|_)/.exec(rest);
391
+ if (emphasis) {
392
+ const marker = emphasis[1];
393
+ const applied = markFor(marker);
394
+ const open = Object.keys(applied).every(key => marks[key]);
395
+
396
+ // Closing whichever of these is currently open.
397
+ if (open) {
398
+ flush();
399
+ for (const key of Object.keys(applied)) delete marks[key];
400
+ index += marker.length;
401
+ continue;
402
+ }
403
+
404
+ // An opener has to lean on the word it opens. `2 * 3` is multiplication,
405
+ // and `a * b` is not the start of anything — without this the asterisk
406
+ // disappears and the reader is left with two spaces where an operator was.
407
+ const after = source[index + marker.length];
408
+ if (after === undefined || /\s/.test(after)) {
409
+ buffer += marker;
410
+ index += marker.length;
411
+ continue;
412
+ }
413
+ const closer = source.indexOf(marker, index + marker.length);
414
+ if (closer !== -1) {
415
+ flush();
416
+ Object.assign(marks, applied);
417
+ index += marker.length;
418
+ continue;
419
+ }
420
+ if (tail && index + marker.length < source.length) {
421
+ // Unterminated at the end of a stream: assume it will close, so the
422
+ // words that have arrived are styled now rather than restyled later.
423
+ flush();
424
+ Object.assign(marks, applied);
425
+ index += marker.length;
426
+ continue;
427
+ }
428
+
429
+ // Unterminated in finished text, or nothing after it yet. Literal.
430
+ buffer += marker;
431
+ index += marker.length;
432
+ continue;
433
+ }
434
+ buffer += rest[0];
435
+ index += 1;
436
+ }
437
+ flush();
438
+ return tokens;
439
+ }
440
+ function markFor(marker) {
441
+ switch (marker) {
442
+ case '***':
443
+ case '___':
444
+ return {
445
+ bold: true,
446
+ italic: true
447
+ };
448
+ case '**':
449
+ case '__':
450
+ return {
451
+ bold: true
452
+ };
453
+ case '~~':
454
+ return {
455
+ strike: true
456
+ };
457
+ default:
458
+ return {
459
+ italic: true
460
+ };
461
+ }
462
+ }
463
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FENCE","HEADING","RULE","QUOTE","BULLET","ORDERED","TABLE_DIVIDER","parseMarkdown","source","streaming","lines","replace","split","parseBlocks","blocks","index","length","line","trim","fence","exec","marker","language","undefined","body","closed","current","trimStart","startsWith","repeat","slice","push","type","inline","parseInline","text","code","join","open","test","heading","level","match","table","parseTable","block","next","list","parseList","start","header","divider","includes","head","splitRow","map","cell","align","left","right","endsWith","rows","partial","row","first","ordered","baseIndent","startNumber","Number","items","leadingSpaces","isItem","item","isFinite","position","tail","tokens","buffer","marks","flush","kind","value","rest","run","closer","indexOf","image","href","link","partialLink","emphasis","applied","markFor","Object","keys","every","key","after","assign","bold","italic","strike"],"sourceRoot":"../../../../src","sources":["components/response/markdown.ts"],"mappings":"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","ignoreList":[]}