rl-core-front 0.15.6 → 0.16.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 (31) hide show
  1. package/package.json +1 -1
  2. package/src/_services/api/schema.d.ts +267 -4
  3. package/src/_services/images/index.ts +81 -0
  4. package/src/_utils/upload-url.ts +27 -0
  5. package/src/components/index.ts +1 -0
  6. package/src/components/job-dock.tsx +118 -0
  7. package/src/components/ui/data-table.tsx +113 -2
  8. package/src/components/ui/image-upload.tsx +329 -0
  9. package/src/components/ui/index.ts +2 -0
  10. package/src/components/ui/tab-shortcuts.tsx +77 -0
  11. package/src/components/user-avatar.tsx +7 -13
  12. package/src/contexts/index.ts +2 -0
  13. package/src/contexts/jobs-context.tsx +146 -0
  14. package/src/contexts/jobs-store.ts +391 -0
  15. package/src/features/login/hooks/use-login-flow.ts +1 -1
  16. package/src/features/notifications/components/notification-item.tsx +34 -10
  17. package/src/features/notifications/hooks/use-notifications.ts +32 -1
  18. package/src/features/notifications/notifications-center.tsx +37 -15
  19. package/src/features/notifications/services/notifications.service.ts +10 -0
  20. package/src/features/profile/force-password-change.tsx +1 -1
  21. package/src/features/profile/profile-screen.tsx +4 -2
  22. package/src/features/recovery/reset-password-screen.tsx +1 -1
  23. package/src/features/shortcuts/components/shortcut-card.tsx +0 -5
  24. package/src/features/shortcuts/shortcuts-screen.tsx +14 -3
  25. package/src/hooks/use-image-upload.ts +169 -0
  26. package/src/hooks/use-request.ts +47 -5
  27. package/src/hooks/use-shortcut.ts +52 -3
  28. package/src/i18n/messages/en.ts +27 -1
  29. package/src/i18n/messages/pt.ts +27 -1
  30. package/src/index.ts +32 -0
  31. package/src/styles/core.css +31 -0
@@ -93,6 +93,21 @@ export const pt = {
93
93
  running: "Processando…",
94
94
  completed: "Processamento concluído",
95
95
  failed: "Não foi possível concluir o processamento",
96
+ dockRunning: "{count} em andamento",
97
+ dockFailed: "Algo não deu certo",
98
+ },
99
+ image: {
100
+ empty: "Arraste uma imagem, cole, ou",
101
+ choose: "escolha um arquivo",
102
+ urlLabel: "Ou cole o endereço de uma imagem",
103
+ urlAction: "Buscar",
104
+ remove: "Remover imagem",
105
+ replace: "Trocar imagem",
106
+ sending: "Enviando…",
107
+ tooLarge: "A imagem passa do limite de {size}MB",
108
+ invalidType: "Formato inválido — use JPEG, PNG ou WebP",
109
+ failed: "Não foi possível enviar a imagem",
110
+ hint: "A imagem é convertida para {format} em até {width}px.",
96
111
  },
97
112
  queues: {
98
113
  title: "Filas",
@@ -129,12 +144,17 @@ export const pt = {
129
144
  where: "Em qualquer listagem que tenha o botão de cadastrar.",
130
145
  caveat: "Não dispara dentro de um campo de texto nem com um modal aberto",
131
146
  },
147
+ tabs: {
148
+ name: "Trocar de aba",
149
+ where:
150
+ "Em qualquer tela com abas, o número abre a aba naquela posição — 1 é a primeira.",
151
+ caveat: "Não dispara dentro de um campo de texto nem com um modal aberto",
152
+ },
132
153
  expand: {
133
154
  name: "Ampliar o modal",
134
155
  where:
135
156
  "Com um modal aberto, alterna entre o tamanho normal e o ampliado. Vale em qualquer lugar do modal, como o Esc.",
136
157
  caveat: "Funciona em qualquer campo, e não envia o formulário junto",
137
- note: "No Mac, o Alt é a tecla Option (⌥) — em boa parte dos teclados ela vem escrita das duas formas.",
138
158
  },
139
159
  submit: {
140
160
  name: "Enviar o formulário",
@@ -157,6 +177,8 @@ export const pt = {
157
177
  },
158
178
  table: {
159
179
  columns: "Colunas",
180
+ selectAll: "Selecionar todas as linhas da página",
181
+ selectRow: "Selecionar esta linha",
160
182
  columnsButton: "Colunas",
161
183
  columnsTitle: "Configurar visualização de colunas",
162
184
  columnsHint: "Selecione as colunas que deseja visualizar na tabela.",
@@ -181,6 +203,7 @@ export const pt = {
181
203
  hint: "Preencha só os campos que quiser usar. Tudo é combinado com E.",
182
204
  apply: "Aplicar",
183
205
  clear: "Limpar",
206
+ close: "Fechar",
184
207
  empty: "Esta listagem ainda não tem filtros.",
185
208
  noOptions: "Nenhuma opção disponível",
186
209
  all: "Todos",
@@ -239,6 +262,9 @@ export const pt = {
239
262
  title: "Notificações",
240
263
  all: "Todas",
241
264
  unread: "Não lidas",
265
+ read: "Lidas",
266
+ clearRead: "Limpar lidas",
267
+ dismiss: "Tirar da lista",
242
268
  markAllRead: "Marcar todas como lidas",
243
269
  empty: "Nenhuma notificação",
244
270
  },
package/src/index.ts CHANGED
@@ -87,6 +87,8 @@ export type { UseFilterSchemaResult } from "#core/hooks/use-filter-schema";
87
87
  export { useFilterSchema } from "#core/hooks/use-filter-schema";
88
88
  export type { FilterMode, FiltersState } from "#core/hooks/use-filters";
89
89
  export { useFilters } from "#core/hooks/use-filters";
90
+ export type { UseImageUploadResult } from "#core/hooks/use-image-upload";
91
+ export { useImageUpload } from "#core/hooks/use-image-upload";
90
92
  export type {
91
93
  JobState,
92
94
  UseJobProgressResult,
@@ -104,10 +106,13 @@ export { useListQuery } from "#core/hooks/use-list-query";
104
106
  export type { RunOptions, UseRequestResult } from "#core/hooks/use-request";
105
107
  export type { ShortcutOptions } from "#core/hooks/use-shortcut";
106
108
  export {
109
+ ALT_KEY_LABELS,
107
110
  CREATE_SHORTCUT_KEYS,
108
111
  CREATE_SHORTCUT_LABEL,
109
112
  EXPAND_SHORTCUT_KEY,
110
113
  EXPAND_SHORTCUT_LABEL,
114
+ MAX_TAB_SHORTCUTS,
115
+ TAB_SHORTCUT_DIGITS,
111
116
  useShortcut,
112
117
  } from "#core/hooks/use-shortcut";
113
118
  export type { TableView, UseTableViewResult } from "#core/hooks/use-table-view";
@@ -125,3 +130,30 @@ export { toListParams } from "#core/_services/api/list-query";
125
130
  export { en } from "#core/i18n/messages/en";
126
131
  export type { Messages } from "#core/i18n/messages/pt";
127
132
  export { pt } from "#core/i18n/messages/pt";
133
+
134
+ // ---------------------------------------------------------------------------
135
+ // Upload de imagem — o componente, o serviço e o painel de trabalhos
136
+ // ---------------------------------------------------------------------------
137
+ // O projeto declara o perfil no backend (tamanho, formato, pasta) e usa o
138
+ // componente com o nome dele: `<ImageUpload profile="funkos" … />`. O
139
+ // `JobsProvider` entra no layout, dentro do `SocketProvider` — é ele que
140
+ // mantém o acompanhamento vivo quando a pessoa troca de tela no meio de um
141
+ // upload, e é ele que renderiza o painel do rodapé.
142
+ export type {
143
+ ImageAccepted,
144
+ ImageJobSummary,
145
+ ImageProfileInfo,
146
+ } from "#core/_services/images";
147
+ export { ImageFit, ImageFormat, imagesService } from "#core/_services/images";
148
+ export { uploadUrlOf } from "#core/_utils/upload-url";
149
+ export { JobDock } from "#core/components/job-dock";
150
+ export type { ImageUploadProps } from "#core/components/ui/image-upload";
151
+ export { ImageUpload } from "#core/components/ui/image-upload";
152
+ export type { JobsContextType } from "#core/contexts/jobs-context";
153
+ export { JobsProvider, useJobs } from "#core/contexts/jobs-context";
154
+ export type {
155
+ JobHandle,
156
+ TrackedJob,
157
+ TrackedJobState,
158
+ } from "#core/contexts/jobs-store";
159
+ export { JobsStore } from "#core/contexts/jobs-store";
@@ -237,3 +237,34 @@
237
237
  width: 0%;
238
238
  }
239
239
  }
240
+
241
+ /*
242
+ * Listras andando na barra de progresso do painel de jobs.
243
+ *
244
+ * Existe porque um job de imagem não tem etapas contáveis: ele passa de "estou
245
+ * baixando" para "acabei" sem números no meio, e uma barra parada em 50% é
246
+ * indistinguível de uma barra travada. As listras dizem "ainda estou aqui" sem
247
+ * fingir precisão que o job não tem.
248
+ */
249
+ .rl-job-stripes {
250
+ background-image: linear-gradient(
251
+ 45deg,
252
+ rgb(255 255 255 / 0.3) 25%,
253
+ transparent 25%,
254
+ transparent 50%,
255
+ rgb(255 255 255 / 0.3) 50%,
256
+ rgb(255 255 255 / 0.3) 75%,
257
+ transparent 75%,
258
+ transparent
259
+ );
260
+ background-size: 1rem 1rem;
261
+ animation: rl-job-stripes 1s linear infinite;
262
+ }
263
+ @keyframes rl-job-stripes {
264
+ from {
265
+ background-position: 0 0;
266
+ }
267
+ to {
268
+ background-position: 1rem 0;
269
+ }
270
+ }