@sincpro/web-ui 0.2.0 → 1.0.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 (128) hide show
  1. package/README.md +3 -3
  2. package/dist/components/activity/ActivityBadge.d.ts +16 -0
  3. package/dist/components/activity/ActivityBadge.js +29 -0
  4. package/dist/components/activity/index.d.ts +1 -0
  5. package/dist/components/activity/index.js +1 -0
  6. package/dist/components/calendar/RecordCalendar.d.ts +48 -0
  7. package/dist/components/calendar/RecordCalendar.js +101 -0
  8. package/dist/components/calendar/index.d.ts +1 -0
  9. package/dist/components/calendar/index.js +1 -0
  10. package/dist/components/form/Sheet.js +5 -1
  11. package/dist/components/gantt/RecordGantt.d.ts +44 -0
  12. package/dist/components/gantt/RecordGantt.js +110 -0
  13. package/dist/components/gantt/index.d.ts +1 -0
  14. package/dist/components/gantt/index.js +1 -0
  15. package/dist/components/index.d.ts +3 -0
  16. package/dist/components/index.js +3 -0
  17. package/dist/components/lines/LineItems.d.ts +5 -2
  18. package/dist/components/lines/LineItems.js +3 -3
  19. package/dist/components/listing/BoardColumns.d.ts +39 -0
  20. package/dist/components/listing/BoardColumns.js +138 -0
  21. package/dist/components/listing/ListingBar.d.ts +5 -0
  22. package/dist/components/listing/ListingBar.js +5 -2
  23. package/dist/components/listing/PivotExplorer.d.ts +34 -0
  24. package/dist/components/listing/PivotExplorer.js +86 -0
  25. package/dist/components/listing/RecordCard.d.ts +6 -8
  26. package/dist/components/listing/RecordCard.js +13 -7
  27. package/dist/components/listing/Row.d.ts +21 -2
  28. package/dist/components/listing/Row.js +29 -13
  29. package/dist/components/listing/index.d.ts +2 -0
  30. package/dist/components/listing/index.js +2 -0
  31. package/dist/components/listing/set.d.ts +1 -1
  32. package/dist/components/navigation/index.d.ts +0 -2
  33. package/dist/components/navigation/index.js +2 -3
  34. package/dist/components/record/RecordAudit.d.ts +17 -0
  35. package/dist/components/record/RecordAudit.js +27 -0
  36. package/dist/components/record/RecordHeader.d.ts +7 -1
  37. package/dist/components/record/RecordHeader.js +30 -18
  38. package/dist/components/record/RecordRibbon.d.ts +13 -0
  39. package/dist/components/record/RecordRibbon.js +22 -0
  40. package/dist/components/record/index.d.ts +2 -0
  41. package/dist/components/record/index.js +2 -0
  42. package/dist/components/search/CriteriaChips.d.ts +6 -1
  43. package/dist/components/search/CriteriaChips.js +71 -20
  44. package/dist/components/search/SearchBar.d.ts +4 -1
  45. package/dist/components/search/SearchBar.js +15 -7
  46. package/dist/components/timeline/RecordTimeline.d.ts +60 -0
  47. package/dist/components/timeline/RecordTimeline.js +214 -0
  48. package/dist/components/timeline/TimelineToolbar.d.ts +30 -0
  49. package/dist/components/timeline/TimelineToolbar.js +31 -0
  50. package/dist/components/timeline/index.d.ts +3 -0
  51. package/dist/components/timeline/index.js +3 -0
  52. package/dist/components/timeline/time.d.ts +43 -0
  53. package/dist/components/timeline/time.js +135 -0
  54. package/dist/foundations/copy.d.ts +106 -14
  55. package/dist/foundations/copy.es.js +83 -9
  56. package/dist/foundations/copy.js +83 -9
  57. package/dist/foundations/index.d.ts +1 -1
  58. package/dist/foundations/match.d.ts +23 -0
  59. package/dist/foundations/match.js +63 -0
  60. package/dist/foundations/slots.d.ts +1 -1
  61. package/dist/foundations/slots.js +8 -3
  62. package/dist/foundations/types.d.ts +7 -0
  63. package/dist/foundations/types.js +0 -36
  64. package/dist/primitives/block/index.d.ts +1 -1
  65. package/dist/primitives/block/index.js +1 -1
  66. package/dist/primitives/cell/CellStack.d.ts +7 -1
  67. package/dist/primitives/cell/CellStack.js +5 -2
  68. package/dist/primitives/choice/ComboBox.js +8 -4
  69. package/dist/primitives/choice/KanbanState.d.ts +14 -0
  70. package/dist/primitives/choice/KanbanState.js +37 -0
  71. package/dist/primitives/choice/Priority.d.ts +20 -0
  72. package/dist/primitives/choice/Priority.js +41 -0
  73. package/dist/primitives/choice/Slider.d.ts +6 -1
  74. package/dist/primitives/choice/Slider.js +2 -2
  75. package/dist/primitives/choice/index.d.ts +2 -0
  76. package/dist/primitives/choice/index.js +2 -0
  77. package/dist/primitives/dialog/Dialog.d.ts +9 -3
  78. package/dist/primitives/dialog/Dialog.js +41 -5
  79. package/dist/primitives/dialog/index.d.ts +0 -1
  80. package/dist/primitives/dialog/index.js +0 -2
  81. package/dist/primitives/notice/index.d.ts +1 -1
  82. package/dist/primitives/notice/index.js +1 -1
  83. package/dist/primitives/overlay/Preview.js +13 -4
  84. package/dist/primitives/picker/MatchedText.d.ts +10 -0
  85. package/dist/primitives/picker/MatchedText.js +12 -0
  86. package/dist/primitives/picker/Picker.d.ts +29 -7
  87. package/dist/primitives/picker/Picker.js +88 -23
  88. package/dist/primitives/table/EditableTable.d.ts +6 -1
  89. package/dist/primitives/table/EditableTable.js +70 -9
  90. package/dist/primitives/table/ReportTable.js +2 -1
  91. package/dist/primitives/table/RowActions.js +7 -2
  92. package/dist/primitives/table/Table.d.ts +5 -0
  93. package/dist/primitives/table/Table.js +17 -8
  94. package/dist/primitives/tag/Tags.d.ts +2 -0
  95. package/dist/primitives/tag/Tags.js +2 -1
  96. package/dist/primitives/tag/TagsField.d.ts +10 -0
  97. package/dist/primitives/tag/TagsField.js +34 -9
  98. package/dist/primitives/tag/choices.d.ts +2 -0
  99. package/dist/primitives/value/Avatar.d.ts +16 -0
  100. package/dist/primitives/value/Avatar.js +91 -0
  101. package/dist/primitives/value/Person.d.ts +6 -51
  102. package/dist/primitives/value/Person.js +9 -148
  103. package/dist/primitives/value/Relation.d.ts +21 -9
  104. package/dist/primitives/value/Relation.js +35 -24
  105. package/dist/primitives/value/contact.d.ts +30 -0
  106. package/dist/primitives/value/contact.js +51 -0
  107. package/dist/primitives/value/index.d.ts +1 -1
  108. package/dist/primitives/value/index.js +1 -1
  109. package/dist/tokens.css +136 -1
  110. package/dist/views/list/List.d.ts +25 -2
  111. package/dist/views/list/List.js +48 -8
  112. package/dist/views/list/ListView.d.ts +1 -1
  113. package/dist/views/list/ListView.js +39 -8
  114. package/dist/views/list/columns.js +8 -1
  115. package/dist/views/list/presentations.d.ts +5 -2
  116. package/dist/views/list/presentations.js +32 -2
  117. package/dist/views/list/types.d.ts +44 -0
  118. package/dist/views/list/useNarrowList.d.ts +10 -0
  119. package/dist/views/list/useNarrowList.js +20 -6
  120. package/dist/views/record/Record.d.ts +14 -0
  121. package/dist/views/record/Record.js +22 -7
  122. package/package.json +11 -4
  123. package/dist/components/navigation/CommandPalette.d.ts +0 -40
  124. package/dist/components/navigation/CommandPalette.js +0 -114
  125. package/dist/components/navigation/commands.d.ts +0 -30
  126. package/dist/components/navigation/commands.js +0 -30
  127. package/dist/primitives/dialog/Drill.d.ts +0 -90
  128. package/dist/primitives/dialog/Drill.js +0 -172
@@ -27,6 +27,9 @@ export type UiCopy = {
27
27
  report: string;
28
28
  /** Dos preguntas a la vez: montones cruzados por montones. */
29
29
  pivot: string;
30
+ calendar: string;
31
+ gantt: string;
32
+ timeline: string;
30
33
  chart: string;
31
34
  group: string;
32
35
  };
@@ -48,6 +51,8 @@ export type UiCopy = {
48
51
  named: string;
49
52
  more: string;
50
53
  moreOf: string;
54
+ /** «Elegir los 187 que coinciden»: the whole result, not the page. */
55
+ allMatching: string;
51
56
  };
52
57
  pager: {
53
58
  size: string;
@@ -76,6 +81,9 @@ export type UiCopy = {
76
81
  noticeMany: string;
77
82
  /** The accessible name of the band of what is wrong with the record. */
78
83
  blocking: string;
84
+ /** The paper's last line (`Record.Audit`): «{by}» and «{at}» are already written. */
85
+ created: string;
86
+ updated: string;
79
87
  };
80
88
  shell: {
81
89
  modules: string;
@@ -88,8 +96,6 @@ export type UiCopy = {
88
96
  closePreview: string;
89
97
  account: string;
90
98
  openAsPanel: string;
91
- /** The accessible name of the command palette's dialog. */
92
- commandPalette: string;
93
99
  };
94
100
  field: {
95
101
  drop: string;
@@ -131,6 +137,14 @@ export type UiCopy = {
131
137
  groupedBy: string;
132
138
  /** Lo que encabeza el corchete de los recortes. */
133
139
  narrowedBy: string;
140
+ /** The «+N» chip that unfolds the facets the bar folded away. */
141
+ moreFacets: string;
142
+ /** Folds them back. */
143
+ fewerFacets: string;
144
+ /** The × of the grouping chain: drops every level at once. */
145
+ removeGrouping: string;
146
+ /** The × at the end of the bar: drops every filter and level. */
147
+ clearAll: string;
134
148
  /** Cambiar la conjunción entre búsquedas: todas a la vez, o cualquiera. */
135
149
  switchJoin: string;
136
150
  /**
@@ -229,6 +243,10 @@ export type UiCopy = {
229
243
  * one: «1 records» is wrong in every language this ships in. */
230
244
  countOne: string;
231
245
  count: string;
246
+ /** A row's two ways in, named on their buttons: a look without leaving the list, and the
247
+ * record itself. */
248
+ peek: string;
249
+ open: string;
232
250
  };
233
251
  /** La historia de un registro: eventos y mensajes. */
234
252
  /** The panel of everything around a record: its notices, its conversation and its
@@ -372,6 +390,9 @@ export type UiCopy = {
372
390
  addRow: string;
373
391
  empty: string;
374
392
  remove: string;
393
+ /** The grip that changes a row's place (`EditableTable onReorder`). */
394
+ reorder: string;
395
+ reorderHint: string;
375
396
  };
376
397
  picker: {
377
398
  placeholder: string;
@@ -382,8 +403,23 @@ export type UiCopy = {
382
403
  refine: string;
383
404
  open: string;
384
405
  browseAll: string;
406
+ /** The option that creates a record from the typed text. `{name}` is that text. */
407
+ create: string;
408
+ /** The option that opens the full form of a new record, with the typed text as its name. */
409
+ createAndEdit: string;
410
+ /** Why an option whose name does not match is listed: the hidden code it matched. */
411
+ matched: string;
385
412
  /** The quiet row at the end of a list that is fetching its next page. */
386
413
  loadingMore: string;
414
+ /** Where a many2one's record opens (`OpenTarget`), on its buttons and its menu. */
415
+ openIn: {
416
+ modal: string;
417
+ peek: string;
418
+ page: string;
419
+ side: string;
420
+ window: string;
421
+ };
422
+ openMore: string;
387
423
  };
388
424
  cell: {
389
425
  missing: string;
@@ -395,13 +431,6 @@ export type UiCopy = {
395
431
  invalid: string;
396
432
  noDate: string;
397
433
  };
398
- /** The dialog that holds a stack of contexts opened from a record (`Drill`). */
399
- drill: {
400
- /** Up one level. `{name}` is the context it goes back to. */
401
- back: string;
402
- /** The accessible name of the trail of contexts this one was opened from. */
403
- trail: string;
404
- };
405
434
  dialog: {
406
435
  expand: string;
407
436
  /** The wizard's own buttons: leave, go back, go on, end — and what the main
@@ -498,17 +527,22 @@ export type UiCopy = {
498
527
  rows: string;
499
528
  /** Abrir un cruce: qué filas cayeron ahí. */
500
529
  open: string;
530
+ /** The pivot's own controls (`PivotExplorer`). */
531
+ measures: string;
532
+ rowsAxis: string;
533
+ columnsAxis: string;
534
+ addLevel: string;
535
+ removeLevel: string;
536
+ swap: string;
537
+ download: string;
538
+ fromSearch: string;
501
539
  };
502
540
  /** A person as a value: who is not there, and the ways to reach who is. */
503
541
  person: {
504
542
  unassigned: string;
505
- /** The title of the contact card that opens from a person. */
506
- contact: string;
507
543
  email: string;
508
544
  call: string;
509
545
  whatsapp: string;
510
- /** Go to the person's own record. */
511
- open: string;
512
546
  };
513
547
  /** The sub-list of lines inside a record: the lines of an order, of an entry. */
514
548
  lines: {
@@ -545,6 +579,60 @@ export type UiCopy = {
545
579
  table: string;
546
580
  };
547
581
  /** A field that points to another record: going there, and pointing nowhere. */
582
+ /** The stars of `Priority`. */
583
+ priority: {
584
+ label: string;
585
+ level: string;
586
+ none: string;
587
+ };
588
+ /** The board by stages (`BoardColumns`). */
589
+ board: {
590
+ emptyLane: string;
591
+ moveHint: string;
592
+ moved: string;
593
+ quickCreate: string;
594
+ quickPlaceholder: string;
595
+ fold: string;
596
+ unfold: string;
597
+ addColumn: string;
598
+ addColumnPlaceholder: string;
599
+ };
600
+ /** A timeline of records and its toolbar (`RecordTimeline`, `TimelineToolbar`). */
601
+ timeline: {
602
+ prev: string;
603
+ next: string;
604
+ today: string;
605
+ goTo: string;
606
+ zoom: string;
607
+ zoomIn: string;
608
+ zoomOut: string;
609
+ fullscreen: string;
610
+ exitFullscreen: string;
611
+ scale: string;
612
+ scales: {
613
+ day: string;
614
+ week: string;
615
+ month: string;
616
+ year: string;
617
+ };
618
+ moveHint: string;
619
+ moved: string;
620
+ create: string;
621
+ };
622
+ /** Odoo's kanban state — the traffic light on a card (`KanbanState`). */
623
+ kanbanState: {
624
+ label: string;
625
+ normal: string;
626
+ done: string;
627
+ blocked: string;
628
+ };
629
+ /** The planned activities of a record, on its card (`ActivityBadge`). */
630
+ activityState: {
631
+ none: string;
632
+ overdue: string;
633
+ today: string;
634
+ planned: string;
635
+ };
548
636
  relation: {
549
637
  open: string;
550
638
  /** No record chosen. It is an answer, not a hole. */
@@ -675,7 +763,6 @@ export type UiCopyOverride = {
675
763
  picker?: Partial<UiCopy["picker"]>;
676
764
  cell?: Partial<UiCopy["cell"]>;
677
765
  time?: Partial<UiCopy["time"]>;
678
- drill?: Partial<UiCopy["drill"]>;
679
766
  dialog?: Partial<UiCopy["dialog"]>;
680
767
  report?: Partial<UiCopy["report"]>;
681
768
  builder?: Partial<UiCopy["builder"]>;
@@ -683,6 +770,11 @@ export type UiCopyOverride = {
683
770
  person?: Partial<UiCopy["person"]>;
684
771
  lines?: Partial<UiCopy["lines"]>;
685
772
  lineItems?: Partial<UiCopy["lineItems"]>;
773
+ priority?: Partial<UiCopy["priority"]>;
774
+ board?: Partial<UiCopy["board"]>;
775
+ kanbanState?: Partial<UiCopy["kanbanState"]>;
776
+ timeline?: Partial<UiCopy["timeline"]>;
777
+ activityState?: Partial<UiCopy["activityState"]>;
686
778
  relation?: Partial<UiCopy["relation"]>;
687
779
  relationCard?: Partial<UiCopy["relationCard"]>;
688
780
  totals?: Partial<UiCopy["totals"]>;
@@ -31,6 +31,9 @@ export const SPANISH_COPY = {
31
31
  sheet: "Planilla",
32
32
  report: "Reporte",
33
33
  pivot: "Pivote",
34
+ calendar: "Calendario",
35
+ gantt: "Gantt",
36
+ timeline: "Planificación",
34
37
  chart: "Gráfico",
35
38
  group: "Cómo verlo",
36
39
  },
@@ -54,6 +57,7 @@ export const SPANISH_COPY = {
54
57
  named: "Elegir {name}",
55
58
  more: "Más acciones",
56
59
  moreOf: "Más acciones de {name}",
60
+ allMatching: "Elegir los {count} que coinciden",
57
61
  },
58
62
  pager: {
59
63
  size: "Filas por página",
@@ -76,6 +80,8 @@ export const SPANISH_COPY = {
76
80
  noticeOne: "{count} aviso",
77
81
  noticeMany: "{count} avisos",
78
82
  blocking: "Lo que está mal en este registro",
83
+ created: "Creado por {by} · {at}",
84
+ updated: "Modificado por última vez por {by} · {at}",
79
85
  },
80
86
  shell: {
81
87
  close: "Cerrar",
@@ -88,7 +94,6 @@ export const SPANISH_COPY = {
88
94
  closePreview: "Cerrar la vista previa",
89
95
  account: "Mi cuenta",
90
96
  openAsPanel: "Abrir como panel",
91
- commandPalette: "Paleta de comandos",
92
97
  },
93
98
  field: {
94
99
  drop: "Soltá un archivo acá, o elegí uno.",
@@ -131,6 +136,10 @@ export const SPANISH_COPY = {
131
136
  or: "o",
132
137
  groupedBy: "agrupado por",
133
138
  narrowedBy: "mostrando",
139
+ moreFacets: "+{count}",
140
+ fewerFacets: "ver menos",
141
+ removeGrouping: "Dejar de agrupar",
142
+ clearAll: "Quitar todos los filtros y el agrupado",
134
143
  placeholder: "buscar…",
135
144
  switchJoin: "Todas, cualquiera o ninguna",
136
145
  joins: { all: "todas", any: "cualquiera", none: "ninguna" },
@@ -193,6 +202,8 @@ export const SPANISH_COPY = {
193
202
  emptyFiltered: "Nada coincide con lo que está puesto.",
194
203
  countOne: "1 registro",
195
204
  count: "{count} registros",
205
+ peek: "Vista previa",
206
+ open: "Abrir",
196
207
  },
197
208
  activity: {
198
209
  bySystem: "el sistema",
@@ -265,6 +276,8 @@ export const SPANISH_COPY = {
265
276
  addRow: "agregar una fila",
266
277
  empty: "nada todavía",
267
278
  remove: "quitar",
279
+ reorder: "Mover la fila",
280
+ reorderHint: "Arrastrala, o Alt + ↑ / ↓",
268
281
  },
269
282
  picker: {
270
283
  placeholder: "elegí uno…",
@@ -274,14 +287,21 @@ export const SPANISH_COPY = {
274
287
  more: "{count} más",
275
288
  refine: "— afiná el filtro",
276
289
  open: "Abrir",
277
- browseAll: "ver todos…",
290
+ browseAll: "Buscar más…",
291
+ create: "Crear «{name}»",
292
+ createAndEdit: "Crear y editar…",
293
+ matched: "coincide",
278
294
  loadingMore: "cargando más…",
295
+ openIn: {
296
+ modal: "Abrir en un modal",
297
+ peek: "Vista previa",
298
+ page: "Abrir como página",
299
+ side: "Abrir al costado",
300
+ window: "Abrir en una ventana",
301
+ },
302
+ openMore: "Abrir en…",
279
303
  },
280
304
  cell: { empty: "—", missing: "falta", emptyBin: "(vacío)" },
281
- drill: {
282
- back: "Volver a {name}",
283
- trail: "Abierto desde",
284
- },
285
305
  dialog: {
286
306
  expand: "Agrandar a panel",
287
307
  cancel: "Cancelar",
@@ -341,14 +361,24 @@ export const SPANISH_COPY = {
341
361
  dropOrderBy: "quitar el orden por {field}",
342
362
  dropLevel: "quitar el nivel {field}",
343
363
  },
344
- pivot: { total: "Total", rows: "filas", open: "Abrir {row} × {column}" },
364
+ pivot: {
365
+ total: "Total",
366
+ rows: "filas",
367
+ open: "Abrir {row} × {column}",
368
+ measures: "Medidas",
369
+ rowsAxis: "Filas",
370
+ columnsAxis: "Columnas",
371
+ addLevel: "Agregar a {axis}",
372
+ removeLevel: "Quitar {level}",
373
+ swap: "Intercambiar filas y columnas",
374
+ download: "Descargar",
375
+ fromSearch: "del agrupado del buscador",
376
+ },
345
377
  person: {
346
378
  unassigned: "sin asignar",
347
- contact: "Contacto",
348
379
  email: "Escribir un correo",
349
380
  call: "Llamar",
350
381
  whatsapp: "WhatsApp",
351
- open: "Ver ficha",
352
382
  },
353
383
  lines: {
354
384
  add: "Agregar una línea",
@@ -372,6 +402,50 @@ export const SPANISH_COPY = {
372
402
  undo: "Deshacer",
373
403
  table: "Líneas",
374
404
  },
405
+ priority: {
406
+ label: "Prioridad",
407
+ level: "{value} de {max}",
408
+ none: "sin prioridad",
409
+ },
410
+ board: {
411
+ emptyLane: "Nada en esta etapa.",
412
+ moveHint: "Arrastrala, o Alt + ← / → para pasarla a otra etapa",
413
+ moved: "{name} pasó a {column}",
414
+ quickCreate: "Crear rápido en {column}",
415
+ quickPlaceholder: "Nombre… (Enter crea)",
416
+ fold: "Plegar {column}",
417
+ unfold: "Desplegar {column}",
418
+ addColumn: "Agregar etapa",
419
+ addColumnPlaceholder: "Nombre de la etapa… (Enter agrega)",
420
+ },
421
+ timeline: {
422
+ prev: "Anterior",
423
+ next: "Siguiente",
424
+ today: "Hoy",
425
+ goTo: "Ir a una fecha",
426
+ zoom: "Zoom",
427
+ zoomIn: "Acercar",
428
+ zoomOut: "Alejar",
429
+ fullscreen: "Pantalla completa",
430
+ exitFullscreen: "Salir de pantalla completa",
431
+ scale: "Escala",
432
+ scales: { day: "Día", week: "Semana", month: "Mes", year: "Año" },
433
+ moveHint: "Arrastrala para moverla, su borde derecho para estirarla; Alt + flechas con el teclado",
434
+ moved: "{name}: {range}",
435
+ create: "Crear en {row} · {at}",
436
+ },
437
+ kanbanState: {
438
+ label: "Estado",
439
+ normal: "En curso",
440
+ done: "Listo para la siguiente etapa",
441
+ blocked: "Bloqueado",
442
+ },
443
+ activityState: {
444
+ none: "Sin actividades",
445
+ overdue: "Vencida",
446
+ today: "Para hoy",
447
+ planned: "Planificada",
448
+ },
375
449
  relation: { open: "Abrir", none: "Sin asignar" },
376
450
  relationCard: { summary: "Resumen de {name}" },
377
451
  totals: {
@@ -10,6 +10,9 @@ export const ENGLISH_COPY = {
10
10
  sheet: "Sheet",
11
11
  report: "Report",
12
12
  pivot: "Pivot",
13
+ calendar: "Calendar",
14
+ gantt: "Gantt",
15
+ timeline: "Planning",
13
16
  chart: "Chart",
14
17
  group: "How to view",
15
18
  },
@@ -31,6 +34,7 @@ export const ENGLISH_COPY = {
31
34
  named: "Select {name}",
32
35
  more: "More actions",
33
36
  moreOf: "More actions for {name}",
37
+ allMatching: "Select all {count} that match",
34
38
  },
35
39
  pager: {
36
40
  size: "Rows per page",
@@ -53,6 +57,8 @@ export const ENGLISH_COPY = {
53
57
  noticeOne: "{count} notice",
54
58
  noticeMany: "{count} notices",
55
59
  blocking: "What is wrong with this record",
60
+ created: "Created by {by} · {at}",
61
+ updated: "Last changed by {by} · {at}",
56
62
  },
57
63
  shell: {
58
64
  modules: "All modules",
@@ -65,7 +71,6 @@ export const ENGLISH_COPY = {
65
71
  closePreview: "Close preview",
66
72
  account: "My account",
67
73
  openAsPanel: "Open as panel",
68
- commandPalette: "Command palette",
69
74
  },
70
75
  field: {
71
76
  drop: "Drop a file here, or choose one.",
@@ -94,6 +99,10 @@ export const ENGLISH_COPY = {
94
99
  or: "or",
95
100
  groupedBy: "grouped by",
96
101
  narrowedBy: "showing",
102
+ moreFacets: "+{count}",
103
+ fewerFacets: "show less",
104
+ removeGrouping: "Stop grouping",
105
+ clearAll: "Clear every filter and grouping",
97
106
  switchJoin: "All of them, or any of them",
98
107
  joins: { all: "all", any: "any", none: "none" },
99
108
  notWord: "not",
@@ -142,6 +151,8 @@ export const ENGLISH_COPY = {
142
151
  emptyFiltered: "Nothing matches what is on.",
143
152
  countOne: "1 record",
144
153
  count: "{count} records",
154
+ peek: "Quick look",
155
+ open: "Open",
145
156
  },
146
157
  activity: {
147
158
  bySystem: "the system",
@@ -243,6 +254,8 @@ export const ENGLISH_COPY = {
243
254
  addRow: "Add a row",
244
255
  empty: "No lines yet.",
245
256
  remove: "Remove the line",
257
+ reorder: "Move the row",
258
+ reorderHint: "Drag it, or Alt + ↑ / ↓",
246
259
  },
247
260
  picker: {
248
261
  placeholder: "pick one…",
@@ -252,8 +265,19 @@ export const ENGLISH_COPY = {
252
265
  more: "{count} more",
253
266
  refine: "— narrow the filter",
254
267
  open: "Open",
255
- browseAll: "see all…",
268
+ browseAll: "Search more…",
269
+ create: "Create «{name}»",
270
+ createAndEdit: "Create and edit…",
271
+ matched: "matches",
256
272
  loadingMore: "loading more…",
273
+ openIn: {
274
+ modal: "Open in a modal",
275
+ peek: "Quick look",
276
+ page: "Open as the page",
277
+ side: "Open beside",
278
+ window: "Open in a window",
279
+ },
280
+ openMore: "Open in…",
257
281
  },
258
282
  cell: {
259
283
  missing: "missing",
@@ -265,10 +289,6 @@ export const ENGLISH_COPY = {
265
289
  invalid: "invalid date",
266
290
  noDate: "no date",
267
291
  },
268
- drill: {
269
- back: "Back to {name}",
270
- trail: "Opened from",
271
- },
272
292
  dialog: {
273
293
  expand: "Expand to a panel",
274
294
  cancel: "Cancel",
@@ -336,14 +356,20 @@ export const ENGLISH_COPY = {
336
356
  total: "Total",
337
357
  rows: "rows",
338
358
  open: "Open {row} × {column}",
359
+ measures: "Measures",
360
+ rowsAxis: "Rows",
361
+ columnsAxis: "Columns",
362
+ addLevel: "Add to {axis}",
363
+ removeLevel: "Remove {level}",
364
+ swap: "Swap rows and columns",
365
+ download: "Download",
366
+ fromSearch: "from the search's grouping",
339
367
  },
340
368
  person: {
341
369
  unassigned: "unassigned",
342
- contact: "Contact",
343
370
  email: "Write an email",
344
371
  call: "Call",
345
372
  whatsapp: "WhatsApp",
346
- open: "Open profile",
347
373
  },
348
374
  lines: {
349
375
  add: "Add a line",
@@ -367,6 +393,50 @@ export const ENGLISH_COPY = {
367
393
  undo: "Undo",
368
394
  table: "Lines",
369
395
  },
396
+ priority: {
397
+ label: "Priority",
398
+ level: "{value} of {max}",
399
+ none: "no priority",
400
+ },
401
+ board: {
402
+ emptyLane: "Nothing in this stage.",
403
+ moveHint: "Drag it, or Alt + ← / → to move it to another stage",
404
+ moved: "{name} moved to {column}",
405
+ quickCreate: "Quick create in {column}",
406
+ quickPlaceholder: "Name… (Enter creates)",
407
+ fold: "Fold {column}",
408
+ unfold: "Unfold {column}",
409
+ addColumn: "Add a stage",
410
+ addColumnPlaceholder: "Stage name… (Enter adds)",
411
+ },
412
+ timeline: {
413
+ prev: "Previous",
414
+ next: "Next",
415
+ today: "Today",
416
+ goTo: "Go to a date",
417
+ zoom: "Zoom",
418
+ zoomIn: "Zoom in",
419
+ zoomOut: "Zoom out",
420
+ fullscreen: "Full screen",
421
+ exitFullscreen: "Exit full screen",
422
+ scale: "Scale",
423
+ scales: { day: "Day", week: "Week", month: "Month", year: "Year" },
424
+ moveHint: "Drag it to move it, its right edge to stretch it; Alt + arrows from the keyboard",
425
+ moved: "{name}: {range}",
426
+ create: "Create in {row} · {at}",
427
+ },
428
+ kanbanState: {
429
+ label: "State",
430
+ normal: "In progress",
431
+ done: "Ready for the next stage",
432
+ blocked: "Blocked",
433
+ },
434
+ activityState: {
435
+ none: "No activities",
436
+ overdue: "Overdue",
437
+ today: "Due today",
438
+ planned: "Planned",
439
+ },
370
440
  relation: {
371
441
  open: "Open",
372
442
  none: "Not set",
@@ -480,7 +550,6 @@ export function mergeCopy(over) {
480
550
  picker: { ...ENGLISH_COPY.picker, ...over.picker },
481
551
  cell: { ...ENGLISH_COPY.cell, ...over.cell },
482
552
  time: { ...ENGLISH_COPY.time, ...over.time },
483
- drill: { ...ENGLISH_COPY.drill, ...over.drill },
484
553
  dialog: { ...ENGLISH_COPY.dialog, ...over.dialog },
485
554
  report: { ...ENGLISH_COPY.report, ...over.report },
486
555
  builder: { ...ENGLISH_COPY.builder, ...over.builder },
@@ -488,6 +557,11 @@ export function mergeCopy(over) {
488
557
  person: { ...ENGLISH_COPY.person, ...over.person },
489
558
  lines: { ...ENGLISH_COPY.lines, ...over.lines },
490
559
  lineItems: { ...ENGLISH_COPY.lineItems, ...over.lineItems },
560
+ priority: { ...ENGLISH_COPY.priority, ...over.priority },
561
+ board: { ...ENGLISH_COPY.board, ...over.board },
562
+ kanbanState: { ...ENGLISH_COPY.kanbanState, ...over.kanbanState },
563
+ timeline: { ...ENGLISH_COPY.timeline, ...over.timeline },
564
+ activityState: { ...ENGLISH_COPY.activityState, ...over.activityState },
491
565
  relation: { ...ENGLISH_COPY.relation, ...over.relation },
492
566
  relationCard: { ...ENGLISH_COPY.relationCard, ...over.relationCard },
493
567
  totals: { ...ENGLISH_COPY.totals, ...over.totals },
@@ -2,7 +2,7 @@ export { currentCopy, currentCopyLocale, ENGLISH_COPY, fillCopy, installCopy, me
2
2
  export { byDensity, type Density, DensityProvider, useDensity, } from "./density.js";
3
3
  export { bySurface, SurfaceProvider, useSurface } from "./surface.js";
4
4
  export { applyTheme, isTheme, type ResolvedTheme, resolveTheme, type Theme, THEME_ATTRIBUTE, ThemeProvider, type ThemeProviderProps, THEMES, useTheme, } from "./theme.js";
5
- export type { Size, Surface, Tone } from "./types.js";
5
+ export type { OpenTarget, Size, Surface, Tone } from "./types.js";
6
6
  /** El castellano del sistema, para quien lo quiera instalar entero. */
7
7
  export { SPANISH_COPY } from "./copy.es.js";
8
8
  export { flatten, loose, pick, pickAll, propsOf, slot, slotOf, type Slotted, } from "./slots.js";
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Where a typed search falls inside a text — «tería» inside «Ferretería» — so a list can SHOW
3
+ * why each option is there.
4
+ *
5
+ * Context: a picker filters accent- and case-insensitively (React Aria's `useFilter`, base
6
+ * sensitivity): «ferreteria» finds «Ferretería». Highlighting has to agree with it, or the
7
+ * option is listed with nothing marked and reads as a wrong match. So the text is folded the
8
+ * same way — decomposed, marks dropped, lower-cased in the locale — while remembering which
9
+ * original character each folded one came from, and the spans are cut on the ORIGINAL text:
10
+ * what is drawn keeps its accents.
11
+ */
12
+ export type MatchSpan = {
13
+ text: string;
14
+ hit: boolean;
15
+ };
16
+ /** The text cut into what matched the query and what did not, in order. An empty query (or
17
+ * one that does not occur) is one span with no hit. */
18
+ export declare function matchSpans(text: string, query: string, locale?: string): MatchSpan[];
19
+ /** Whether the query occurs in the text, folded the same way as `matchSpans`. */
20
+ export declare function matches(text: string, query: string, locale?: string): boolean;
21
+ /** The word of a hidden search text where the query fell — the code «CEM-IP30» out of
22
+ * «CEM-IP30 7771234000017» — to say why an option whose name does not match is listed. */
23
+ export declare function matchedWord(text: string, query: string, locale?: string): string | null;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Where a typed search falls inside a text — «tería» inside «Ferretería» — so a list can SHOW
3
+ * why each option is there.
4
+ *
5
+ * Context: a picker filters accent- and case-insensitively (React Aria's `useFilter`, base
6
+ * sensitivity): «ferreteria» finds «Ferretería». Highlighting has to agree with it, or the
7
+ * option is listed with nothing marked and reads as a wrong match. So the text is folded the
8
+ * same way — decomposed, marks dropped, lower-cased in the locale — while remembering which
9
+ * original character each folded one came from, and the spans are cut on the ORIGINAL text:
10
+ * what is drawn keeps its accents.
11
+ */
12
+ function fold(char, locale) {
13
+ return char.normalize("NFD").replace(/\p{M}/gu, "").toLocaleLowerCase(locale);
14
+ }
15
+ /** The text cut into what matched the query and what did not, in order. An empty query (or
16
+ * one that does not occur) is one span with no hit. */
17
+ export function matchSpans(text, query, locale) {
18
+ const wanted = [...query.trim()].map((char) => fold(char, locale)).join("");
19
+ if (wanted === "")
20
+ return [{ text, hit: false }];
21
+ /* `origin[i]` is where, in the original text, folded character i came from. One more entry
22
+ at the end maps «the end of the folded text» to the end of the original. */
23
+ let folded = "";
24
+ const origin = [];
25
+ let at = 0;
26
+ for (const char of text) {
27
+ const piece = fold(char, locale);
28
+ for (let k = 0; k < piece.length; k += 1)
29
+ origin.push(at);
30
+ folded += piece;
31
+ at += char.length;
32
+ }
33
+ origin.push(text.length);
34
+ const spans = [];
35
+ let cursor = 0;
36
+ let found = folded.indexOf(wanted);
37
+ while (found !== -1) {
38
+ const start = origin[found] ?? text.length;
39
+ const end = origin[found + wanted.length] ?? text.length;
40
+ if (start > cursor)
41
+ spans.push({ text: text.slice(cursor, start), hit: false });
42
+ if (end > start)
43
+ spans.push({ text: text.slice(start, end), hit: true });
44
+ cursor = Math.max(cursor, end);
45
+ found = folded.indexOf(wanted, found + wanted.length);
46
+ }
47
+ if (cursor < text.length)
48
+ spans.push({ text: text.slice(cursor), hit: false });
49
+ return spans.length === 0 ? [{ text, hit: false }] : spans;
50
+ }
51
+ /** Whether the query occurs in the text, folded the same way as `matchSpans`. */
52
+ export function matches(text, query, locale) {
53
+ return matchSpans(text, query, locale).some((span) => span.hit);
54
+ }
55
+ /** The word of a hidden search text where the query fell — the code «CEM-IP30» out of
56
+ * «CEM-IP30 7771234000017» — to say why an option whose name does not match is listed. */
57
+ export function matchedWord(text, query, locale) {
58
+ for (const word of text.split(/\s+/)) {
59
+ if (word !== "" && matches(word, query, locale))
60
+ return word;
61
+ }
62
+ return null;
63
+ }
@@ -52,7 +52,7 @@ export declare function slotOf<Name extends string>(node: ReactNode): Name | und
52
52
  * medio del árbol —lo que escribe cualquiera que ponga dos ranuras bajo un
53
53
  * condicional— escondería las ranuras que tiene adentro.
54
54
  */
55
- export declare function flatten(children: ReactNode): ReactNode[];
55
+ export declare function flatten(children: ReactNode, prefix?: string): ReactNode[];
56
56
  /** La primera ranura de ese nombre. */
57
57
  export declare function pick<Name extends string>(nodes: readonly ReactNode[], name: Name): ReactNode | undefined;
58
58
  /** Todas las ranuras de ese nombre, en el orden en que se escribieron. Lo usa el