@bagelink/vue 1.10.39 → 1.11.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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/vue",
3
3
  "type": "module",
4
- "version": "1.10.39",
4
+ "version": "1.11.1",
5
5
  "description": "Bagel core sdk packages",
6
6
  "author": {
7
7
  "name": "Bagel Studio",
@@ -90,7 +90,7 @@
90
90
  "signature_pad": "^5.0.9",
91
91
  "vue-i18n": "^11.2.8",
92
92
  "vue-toastification": "^2.0.0-rc.5",
93
- "@bagelink/utils": "1.10.39"
93
+ "@bagelink/utils": "1.11.1"
94
94
  },
95
95
  "scripts": {
96
96
  "dev": "tsx watch src/index.ts",
@@ -429,7 +429,8 @@ export function useDraggable(options: DraggableOptions = {}) {
429
429
 
430
430
  // Update line indicator
431
431
  if (dropIndicator.value && defaultOptions.mode === 'line') {
432
- const isAfter = dropIndex > dragIndex
432
+ const targetIndex = draggedList.indexOf(newDropTarget)
433
+ const isAfter = dropIndex > targetIndex
433
434
  updateDropIndicator(newDropTarget, isAfter)
434
435
  }
435
436
 
@@ -1,8 +1,11 @@
1
1
  <script setup lang="ts" generic="T = unknown">
2
2
  import type { Ref, WritableComputedRef } from 'vue'
3
3
 
4
+ import type { DraggableEvent } from '../../draggable/useDraggable'
5
+
4
6
  import { Btn, resolveI18n, useI18n } from '@bagelink/vue'
5
7
  import { computed, ref, watch } from 'vue'
8
+ import Draggable from '../../draggable/Draggable.vue'
6
9
 
7
10
  const props = defineProps<{
8
11
  label?: string
@@ -26,10 +29,6 @@ const { $t } = useI18n()
26
29
 
27
30
  const items = ref(Array.isArray(props.modelValue) ? [...props.modelValue] : []) as Ref<T[]>
28
31
  const minimizedItems = ref(Array.from({ length: items.value.length }, () => true))
29
- const draggingIndex = ref<number | null>(null)
30
- const dragOverIndex = ref<number | null>(null)
31
- const keySeed = ref(0)
32
- const itemKeys = ref(Array.from({ length: items.value.length }, () => nextItemKey()))
33
32
 
34
33
  const itemLabelPrefix = computed(() => {
35
34
  const resolvedCustomLabel = resolveI18n(props.itemLabel)
@@ -39,11 +38,6 @@ const itemLabelPrefix = computed(() => {
39
38
  return $t('arrayInput.item')
40
39
  })
41
40
 
42
- function nextItemKey() {
43
- keySeed.value += 1
44
- return `array-item-${keySeed.value}`
45
- }
46
-
47
41
  const IDENTIFIER_FIELDS = ['title', 'name', 'label', 'displayName', 'display_name', 'heading', 'caption', 'text']
48
42
 
49
43
  function getItemIdentifier(item: T): string | null {
@@ -76,9 +70,6 @@ watch(
76
70
  if (minimizedItems.value.length !== newVal.length) {
77
71
  minimizedItems.value = Array.from({ length: newVal.length }, (_, i) => minimizedItems.value[i] ?? true)
78
72
  }
79
- if (itemKeys.value.length !== newVal.length) {
80
- itemKeys.value = Array.from({ length: newVal.length }, (_, i) => itemKeys.value[i] ?? nextItemKey())
81
- }
82
73
  }
83
74
  }
84
75
  )
@@ -86,14 +77,12 @@ watch(
86
77
  function addItem() {
87
78
  items.value.push(undefined as T)
88
79
  minimizedItems.value.push(true)
89
- itemKeys.value.push(nextItemKey())
90
80
  updateModel()
91
81
  }
92
82
 
93
83
  function deleteItem(i: number) {
94
84
  items.value.splice(i, 1)
95
85
  minimizedItems.value.splice(i, 1)
96
- itemKeys.value.splice(i, 1)
97
86
  updateModel()
98
87
  }
99
88
 
@@ -111,44 +100,11 @@ function moveItem(from: number, to: number) {
111
100
  const [movedMinimizedState] = minimizedItems.value.splice(from, 1)
112
101
  minimizedItems.value.splice(to, 0, movedMinimizedState)
113
102
 
114
- const [movedKey] = itemKeys.value.splice(from, 1)
115
- itemKeys.value.splice(to, 0, movedKey)
116
-
117
103
  updateModel()
118
104
  }
119
105
 
120
- function onDragStart(event: Event, index: number) {
121
- if (!props.allowReorder) {
122
- return
123
- }
124
- const dragEvent = event as DragEvent
125
- draggingIndex.value = index
126
- dragOverIndex.value = index
127
- if (dragEvent.dataTransfer) {
128
- dragEvent.dataTransfer.effectAllowed = 'move'
129
- dragEvent.dataTransfer.setData('text/plain', String(index))
130
- }
131
- }
132
-
133
- function onDragEnter(index: number) {
134
- if (!props.allowReorder || draggingIndex.value === null) {
135
- return
136
- }
137
- dragOverIndex.value = index
138
- }
139
-
140
- function onDrop(index: number) {
141
- if (!props.allowReorder || draggingIndex.value === null) {
142
- onDragEnd()
143
- return
144
- }
145
- moveItem(draggingIndex.value, index)
146
- onDragEnd()
147
- }
148
-
149
- function onDragEnd() {
150
- draggingIndex.value = null
151
- dragOverIndex.value = null
106
+ function onDraggableEnd(event: DraggableEvent) {
107
+ moveItem(event.oldIndex, event.newIndex)
152
108
  }
153
109
 
154
110
  function updateModel() {
@@ -172,7 +128,7 @@ function getItemRef(i: number) {
172
128
  </script>
173
129
 
174
130
  <template>
175
- <div>
131
+ <div class="array-input testMe1">
176
132
  <label v-if="label" class="txt12 txt-gray-90 mb-025 block">
177
133
  {{ resolveI18n(label) }}
178
134
  </label>
@@ -180,51 +136,51 @@ function getItemRef(i: number) {
180
136
  {{ helpText }}
181
137
  </p>
182
138
  <template v-if="!collapsible">
183
- <div v-for="(_, i) in items" :key="i" class="array-input-row grid gap-05 align-items-center">
139
+ <div v-for="(_, i) in items" :key="i" class="array-input-row grid align-items-center">
184
140
  <slot :item="getItemRef(i)" :index="i" />
185
- <Btn
186
- v-if="allowDelete" v-tooltip="resolveI18n(deleteTooltip || 'Delete')" flat icon="delete"
187
- @click="deleteItem(i)"
188
- />
189
- </div>
190
- </template>
191
- <TransitionGroup v-if="collapsible" name="array-list" tag="div" class="grid gap-05 mb-05">
192
- <div
193
- v-for="(_, i) in items" :key="itemKeys[i]" class="border radius-1"
194
- :class="{ 'array-item-drag-over1 bg-gray-light border border-primary ': allowReorder && dragOverIndex === i && draggingIndex !== null && draggingIndex !== i }"
195
- @dragover.prevent @dragenter.prevent="onDragEnter(i)" @drop.prevent="onDrop(i)"
196
- >
197
- <div class="grid gap-05 grid-array-line align-items-center pe-025">
198
- <Btn
199
- v-if="allowReorder" v-tooltip="resolveI18n('Drag to reorder')" flat thin icon="drag_indicator"
200
- class="grab" draggable="true" @dragstart="onDragStart($event, i)" @dragend="onDragEnd"
201
- />
202
- <Btn
203
- full-width align-txt="start" class="px-05" flat
204
- :icon="minimizedItems[i] ? 'expand_more' : 'expand_less'" @click="toggleItem(i)"
205
- >
206
- <p class="ellipsis-1">
207
- {{ getItemLabel(i) }}
208
- </p>
209
- </Btn>
210
-
141
+ <div v-if="allowDelete" class="ms-075 my-1 border-start h-100p ps-025">
211
142
  <Btn
212
- v-if="allowDelete" v-tooltip="resolveI18n(deleteTooltip || 'Delete')" flat icon="delete" thin
213
- :confirm="resolveI18n('Are you sure you want to delete this item?')" @click="deleteItem(i)"
143
+ v-tooltip="resolveI18n(deleteTooltip || 'Delete')" flat icon="delete"
144
+ @click="deleteItem(i)"
214
145
  />
215
146
  </div>
216
- <Transition name="array-collapse">
217
- <div v-if="!minimizedItems[i]" class="array-input-row grid gap-05 align-items-center ">
218
- <slot :item="getItemRef(i)" :index="i" />
219
- </div>
220
- </Transition>
221
147
  </div>
222
- </TransitionGroup>
223
- <Btn v-if="allowAdd" thin icon="add" :value="resolveI18n(addText || 'Add')" @click="addItem" />
148
+ </template>
149
+ <Draggable v-if="collapsible" :model-value="items" handle=".grab" :disabled="!allowReorder" class="grid gap-05 mb-05" @end="onDraggableEnd">
150
+ <template #default="{ index: i }">
151
+ <div class="border radius-1 overflow-hidden">
152
+ <div class="grid gap-05 grid-array-line align-items-center pe-025 hover">
153
+ <Btn
154
+ v-if="allowReorder" v-tooltip="resolveI18n('Drag to reorder')" flat thin icon="drag_indicator"
155
+ class="grab"
156
+ />
157
+ <Btn
158
+ full-width align-txt="start" class="px-05 bg-transparent color-inherit" :ripple="false"
159
+ :icon="minimizedItems[i] ? 'expand_more' : 'expand_less'" @click="toggleItem(i)"
160
+ >
161
+ <p class="ellipsis-1">
162
+ {{ getItemLabel(i) }}
163
+ </p>
164
+ </Btn>
165
+
166
+ <Btn v-if="allowDelete" v-tooltip="resolveI18n(deleteTooltip || 'Delete')" flat icon="delete" thin :confirm="resolveI18n('Are you sure you want to delete this item?')" @click="deleteItem(i)" />
167
+ </div>
168
+ <Transition name="array-collapse">
169
+ <div v-if="!minimizedItems[i]" class="array-input-row grid align-items-center px-05">
170
+ <slot :item="getItemRef(i)" :index="i" />
171
+ </div>
172
+ </Transition>
173
+ </div>
174
+ </template>
175
+ </Draggable>
176
+ <Btn v-if="allowAdd" class="radius-1" thin icon="add" :value="resolveI18n(addText || 'Add')" @click="addItem" />
224
177
  </div>
225
178
  </template>
226
179
 
227
180
  <style>
181
+ :root {
182
+ --array-input-bg: var(--input-bg);
183
+ }
228
184
  .array-input-row {
229
185
  grid-template-columns: 1fr auto;
230
186
  }
@@ -260,5 +216,14 @@ function getItemRef(i: number) {
260
216
 
261
217
  .grid-array-line {
262
218
  grid-template-columns: auto 1fr auto;
219
+ background: var(--array-input-bg) !important;
220
+ }
221
+
222
+ .grid-array-line button:hover {
223
+ filter: brightness(90%);
224
+ }
225
+
226
+ .grid-array-line button:active {
227
+ filter: brightness(80%);
263
228
  }
264
229
  </style>
@@ -230,6 +230,9 @@ const sidebarStyles = computed(() => {
230
230
  flex: 1;
231
231
  }
232
232
 
233
+ .cardWrapSide .bgl_icon-font {
234
+ visibility: visible !important;
235
+ }
233
236
  /* הסתרת גלילה בזמן שינוי גודל */
234
237
  .app-sidebar.transitioning .sidebar-nav {
235
238
  scrollbar-width: none;
@@ -101,45 +101,63 @@ onBeforeUnmount(() => {
101
101
  </div>
102
102
  </template>
103
103
 
104
+ <style>
105
+ :root {
106
+ --bgl_tabs-background: var(--input-bg);
107
+ --bgl_tabs-border-radius: var(--input-border-radius);
108
+ --bgl_tabs-inline-padding: calc(var(--btn-padding) / 8);
109
+ --bgl_tabs-block-padding: calc(var(--btn-padding) / 8);
110
+ --bgl_tabs-shadow: inset 0 0 10px #00000012;
111
+ --bgl_tabs-gap: 0.25rem;
112
+ --bgl_tabs-font-size: var(--input-font-size);
113
+ --bgl_tab-inline-padding: calc(var(--btn-padding) / 2);
114
+ --bgl_tab-block-padding: calc(var(--btn-padding) / 8);
115
+ --bgl_tab-gap: 0.5rem;
116
+ --bgl_tabs-border-radius: var(--input-border-radius);
117
+ --bgl-tab-hover-bg: rgba(255, 255, 255, .4);
118
+ --bgl_tabs-indicator-color: var(--bgl-popup-bg);
119
+ }
120
+ </style>
121
+
104
122
  <style scoped>
105
123
  .bgl_tabs_wrap {
106
- background: var(--input-bg);
107
- border-radius: calc(var(--input-border-radius) * 1.4);
108
- padding-inline: calc(var(--btn-padding) / 8);
109
- padding-block: calc(var(--btn-padding) / 8);
110
- box-shadow: inset 0 0 10px #00000012;
111
- gap: 0.25rem;
124
+ background: var(--bgl_tabs-background);
125
+ border-radius: calc(var(--bgl_tabs-border-radius) * 1.4);
126
+ padding-inline: var(--bgl_tabs-inline-padding);
127
+ padding-block: var(--bgl_tabs-block-padding);
128
+ box-shadow: var(--bgl_tabs-shadow);
129
+ gap: var(--bgl_tabs-gap);
112
130
  }
113
131
 
114
132
  .bgl_tab {
115
133
  border: none;
116
134
  background: transparent;
117
135
  cursor: pointer;
118
- font-size: var(--input-font-size);
136
+ font-size: var(--bgl_tabs-font-size);
119
137
  font-family: inherit;
120
- padding-inline: calc(var(--btn-padding) / 2);
121
- padding-block: calc(var(--btn-padding) / 8);
122
- border-radius: var(--input-border-radius);
138
+ padding-inline: var(--bgl_tab-inline-padding);
139
+ padding-block: var(--bgl_tab-block-padding);
140
+ border-radius: var(--bgl_tab-border-radius);
123
141
  transition: var(--bgl-transition);
124
142
  color: inherit;
125
143
  display: flex;
126
144
  align-items: center;
127
- gap: 0.5rem;
145
+ gap: var(--bgl_tab-gap);
128
146
  }
129
147
 
130
148
  .bgl_tab:hover {
131
- background: rgba(255, 255, 255, .4);
149
+ background: var(--bgl-tab-hover-bg);
132
150
  }
133
151
 
134
152
  .bgl_tabs_wrap::before {
135
153
  content: '';
136
154
  position: absolute;
137
- top: calc(var(--btn-padding) / 8);
138
- bottom: calc(var(--btn-padding) / 8);
155
+ top: var(--bgl_tabs-block-padding);
156
+ bottom: var(--bgl_tabs-block-padding);
139
157
  left: var(--indicator-left, 0);
140
158
  width: var(--indicator-width, 0);
141
- background: var(--bgl-popup-bg);
142
- border-radius: var(--input-border-radius);
159
+ background: var(--bgl_tabs-indicator-color);
160
+ border-radius: var(--bgl_tabs-border-radius);
143
161
  transition: var(--bgl-transition);
144
162
  z-index: 0;
145
163
  /* Hide indicator initially until position is calculated */
@@ -9,10 +9,10 @@ export { useDevice } from './useDevice'
9
9
  export { useExcel } from './useExcel'
10
10
  export { useLocalStore } from './useLocalStore'
11
11
  export { usePolling } from './usePolling'
12
+ export { useQuery } from './useQuery'
12
13
  export { useResizableLayoutProvider } from './useResizableLayout'
13
14
  export type { PanelConfig, PanelState, ResizableContext } from './useResizableLayout'
14
15
  export { useResizeObserver } from './useResizeObserver'
15
- export { useTheme } from './useTheme'
16
16
  interface UseBglSchemaParamsT<T> {
17
17
  schema?: MaybeRefOrGetter<BglFormSchemaT<T>>
18
18
  columns?: MaybeRefOrGetter<string[]>
@@ -35,4 +35,5 @@ export function useBglSchema<T = { [key: string]: unknown }>(
35
35
  return getFallbackSchema(data, _columns.value)
36
36
  }
37
37
 
38
+ export { useTheme } from './useTheme'
38
39
  export { useValidateFieldValue } from './useValidateFieldValue'
@@ -0,0 +1,50 @@
1
+ import type { WritableComputedRef } from 'vue'
2
+ import type { LocationQuery, LocationQueryRaw } from 'vue-router'
3
+ import { computed } from 'vue'
4
+ import { useRoute, useRouter } from 'vue-router'
5
+
6
+ function buildQuery(
7
+ current: LocationQuery,
8
+ key: string,
9
+ value: string | undefined,
10
+ ): LocationQueryRaw {
11
+ const query: LocationQueryRaw = { ...current }
12
+ if (value === undefined) delete query[key]
13
+ else query[key] = value
14
+ return query
15
+ }
16
+
17
+ type QueryDefaults<T> = { [K in keyof T]?: T[K] }
18
+ type QueryResult<T, D extends QueryDefaults<T>> = {
19
+ [K in keyof T]: WritableComputedRef<K extends keyof D ? NonNullable<T[K]> : T[K] | undefined>
20
+ }
21
+
22
+ /**
23
+ * Reactive URL query param bindings.
24
+ * Each key becomes a writable computed that reads/writes a single query param.
25
+ *
26
+ * @example
27
+ * const q = useQuery<{ search: string; page: string }>({ page: '1' })
28
+ * q.search.value = 'hello' // → ?search=hello&page=1
29
+ */
30
+ export function useQuery<
31
+ T extends Record<string, string> = Record<string, string>,
32
+ D extends QueryDefaults<T> = QueryDefaults<T>,
33
+ >(defaults?: D): QueryResult<T, D> {
34
+ const route = useRoute()
35
+ const router = useRouter()
36
+ const cache: Record<string, WritableComputedRef<string | undefined>> = {}
37
+
38
+ return new Proxy({} as QueryResult<T, D>, {
39
+ get(_, key: string) {
40
+ if (!(key in cache)) {
41
+ const fallback = defaults?.[key as keyof T] as string | undefined
42
+ cache[key] = computed({
43
+ get: () => (route.query[key] as string | undefined) ?? fallback,
44
+ set: value => router.replace({ query: buildQuery(route.query, key, value) }),
45
+ })
46
+ }
47
+ return cache[key] as QueryResult<T, D>[keyof T]
48
+ },
49
+ })
50
+ }
@@ -628,7 +628,7 @@ class Schema<T extends Record<string, any> = Record<string, any>> implements Sch
628
628
  *
629
629
  * @example
630
630
  * // Single-step form
631
- * const userSchema = schema<User>({
631
+ * const userSchema = defineSchema<User>({
632
632
  * email: $.email({ required: true }),
633
633
  * firstName: $.text({ required: true }),
634
634
  * 'meta.bio': $.richtext() // Nested path - type-checked!
@@ -636,12 +636,12 @@ class Schema<T extends Record<string, any> = Record<string, any>> implements Sch
636
636
  *
637
637
  * @example
638
638
  * // Multi-step form step (with label)
639
- * const step = schema('Personal Info', {
639
+ * const step = defineSchema('Personal Info', {
640
640
  * firstName: $.text({ required: true }),
641
641
  * lastName: $.text({ required: true })
642
642
  * })
643
643
  */
644
- export function schema<T extends Record<string, any>>(
644
+ export function defineSchema<T extends Record<string, any>>(
645
645
  labelOrFields: string | Partial<Record<NestedKeyOf<T>, FieldBuilder>>,
646
646
  maybeFields?: Partial<Record<NestedKeyOf<T>, FieldBuilder>>
647
647
  ): SchemaDefinition<T> {
@@ -155,5 +155,54 @@
155
155
  },
156
156
  "color": {
157
157
  "placeholder": "Enter color"
158
+ },
159
+ "pageDesigner": {
160
+ "deleteBlockConfirm": "Are you sure you want to delete this section?",
161
+ "saving": "Saving...",
162
+ "error": "Error",
163
+ "save": "Save",
164
+ "saved": "Saved",
165
+ "title": "Title",
166
+ "slug": "Slug",
167
+ "slugPlaceholder": "my-page",
168
+ "pageSettings": "Page Settings",
169
+ "deletePage": "Delete Page",
170
+ "deletePageConfirm": "Deleting this page cannot be undone.",
171
+ "newPage": "New Page",
172
+ "createPage": "Create Page",
173
+ "addNewBlock": "Add New Block",
174
+ "searchBlock": "Search block",
175
+ "page": "Page",
176
+ "pageStructure": "Page Structure",
177
+ "clickToEdit": "Click on section to edit",
178
+ "addNewBlockHere": "Click here to add a",
179
+ "newBlock": "new block",
180
+ "adding": "Adding",
181
+ "removeSection": "Remove Section",
182
+ "closeEditor": "Close Editor (ESC)",
183
+ "blockNotEditable": "This block's content comes from a data source",
184
+ "blockNotEditableDesc": "and cannot be edited here.",
185
+ "screenTooSmall": "The screen is too small for this editor. Try reducing zoom or using a larger screen.",
186
+ "cancel": "Cancel",
187
+ "publish": "Publish",
188
+ "unpublish": "Unpublish",
189
+ "discard": "Discard",
190
+ "selectItemPreview": "Select item for preview",
191
+ "language": "Language",
192
+ "defaultLanguage": "Default",
193
+ "setAsDefault": "Set as default",
194
+ "removeLanguage": "Remove language",
195
+ "languageCode": "he / en / fr",
196
+ "removeLanguageConfirm": "Remove language \"{locale}\"?",
197
+ "seoTitle": "SEO Title",
198
+ "seoDescription": "SEO Description",
199
+ "ogImageUrl": "OG Image URL",
200
+ "showGrid": "Show Grid",
201
+ "hideGrid": "Hide Grid",
202
+ "search": "Search...",
203
+ "lastSaved": "Last Saved",
204
+ "saveNow": "Save Now",
205
+ "publishDestination": "Choose publish destination",
206
+ "publishAll": "Publish all"
158
207
  }
159
208
  }
@@ -155,5 +155,54 @@
155
155
  },
156
156
  "color": {
157
157
  "placeholder": "Introduce un color"
158
+ },
159
+ "pageDesigner": {
160
+ "deleteBlockConfirm": "¿Estás seguro de que quieres eliminar esta sección?",
161
+ "saving": "Guardando...",
162
+ "error": "Error",
163
+ "save": "Guardar",
164
+ "saved": "Guardado",
165
+ "title": "Título",
166
+ "slug": "Slug",
167
+ "slugPlaceholder": "mi-pagina",
168
+ "pageSettings": "Configuración de página",
169
+ "deletePage": "Eliminar página",
170
+ "deletePageConfirm": "Eliminar esta página no se puede deshacer.",
171
+ "newPage": "Nueva página",
172
+ "createPage": "Crear página",
173
+ "addNewBlock": "Añadir nuevo bloque",
174
+ "searchBlock": "Buscar bloque",
175
+ "page": "Página",
176
+ "pageStructure": "Estructura de página",
177
+ "clickToEdit": "Haz clic en la sección para editar",
178
+ "addNewBlockHere": "Haz clic aquí para añadir un",
179
+ "newBlock": "nuevo bloque",
180
+ "adding": "Añadiendo",
181
+ "removeSection": "Eliminar sección",
182
+ "closeEditor": "Cerrar editor (ESC)",
183
+ "blockNotEditable": "El contenido de este bloque proviene de una fuente de datos",
184
+ "blockNotEditableDesc": "y no se puede editar aquí.",
185
+ "screenTooSmall": "La pantalla es demasiado pequeña para este editor. Prueba reducir el zoom o usar una pantalla más grande.",
186
+ "cancel": "Cancelar",
187
+ "publish": "Publicar",
188
+ "unpublish": "Despublicar",
189
+ "discard": "Descartar",
190
+ "selectItemPreview": "Seleccionar elemento para vista previa",
191
+ "language": "Idioma",
192
+ "defaultLanguage": "Predeterminado",
193
+ "setAsDefault": "Establecer como predeterminado",
194
+ "removeLanguage": "Eliminar idioma",
195
+ "languageCode": "es / en / fr",
196
+ "removeLanguageConfirm": "¿Eliminar idioma \"{locale}\"?",
197
+ "seoTitle": "Título SEO",
198
+ "seoDescription": "Descripción SEO",
199
+ "ogImageUrl": "URL de imagen OG",
200
+ "showGrid": "Mostrar cuadrícula",
201
+ "hideGrid": "Ocultar cuadrícula",
202
+ "search": "Buscar...",
203
+ "lastSaved": "Último guardado",
204
+ "saveNow": "Guardar ahora",
205
+ "publishDestination": "Elegir destino de publicación",
206
+ "publishAll": "Publicar todo"
158
207
  }
159
208
  }
@@ -155,5 +155,54 @@
155
155
  },
156
156
  "color": {
157
157
  "placeholder": "Entrez une couleur"
158
+ },
159
+ "pageDesigner": {
160
+ "deleteBlockConfirm": "Êtes-vous sûr de vouloir supprimer cette section ?",
161
+ "saving": "Enregistrement...",
162
+ "error": "Erreur",
163
+ "save": "Enregistrer",
164
+ "saved": "Enregistré",
165
+ "title": "Titre",
166
+ "slug": "Slug",
167
+ "slugPlaceholder": "ma-page",
168
+ "pageSettings": "Paramètres de la page",
169
+ "deletePage": "Supprimer la page",
170
+ "deletePageConfirm": "La suppression de cette page ne peut pas être annulée.",
171
+ "newPage": "Nouvelle page",
172
+ "createPage": "Créer une page",
173
+ "addNewBlock": "Ajouter un nouveau bloc",
174
+ "searchBlock": "Rechercher un bloc",
175
+ "page": "Page",
176
+ "pageStructure": "Structure de la page",
177
+ "clickToEdit": "Cliquez sur la section pour éditer",
178
+ "addNewBlockHere": "Cliquez ici pour ajouter un",
179
+ "newBlock": "nouveau bloc",
180
+ "adding": "Ajout",
181
+ "removeSection": "Supprimer la section",
182
+ "closeEditor": "Fermer l'éditeur (ESC)",
183
+ "blockNotEditable": "Le contenu de ce bloc provient d'une source de données",
184
+ "blockNotEditableDesc": "et ne peut pas être édité ici.",
185
+ "screenTooSmall": "L'écran est trop petit pour cet éditeur. Essayez de réduire le zoom ou d'utiliser un écran plus grand.",
186
+ "cancel": "Annuler",
187
+ "publish": "Publier",
188
+ "unpublish": "Dépublier",
189
+ "discard": "Ignorer",
190
+ "selectItemPreview": "Sélectionner un élément pour l'aperçu",
191
+ "language": "Langue",
192
+ "defaultLanguage": "Par défaut",
193
+ "setAsDefault": "Définir par défaut",
194
+ "removeLanguage": "Supprimer la langue",
195
+ "languageCode": "fr / en / es",
196
+ "removeLanguageConfirm": "Supprimer la langue \"{locale}\" ?",
197
+ "seoTitle": "Titre SEO",
198
+ "seoDescription": "Description SEO",
199
+ "ogImageUrl": "URL de l'image OG",
200
+ "showGrid": "Afficher la grille",
201
+ "hideGrid": "Masquer la grille",
202
+ "search": "Rechercher...",
203
+ "lastSaved": "Dernière sauvegarde",
204
+ "saveNow": "Enregistrer maintenant",
205
+ "publishDestination": "Choisir la destination",
206
+ "publishAll": "Tout publier"
158
207
  }
159
208
  }
@@ -176,5 +176,54 @@
176
176
  },
177
177
  "color": {
178
178
  "placeholder": "הזן צבע"
179
+ },
180
+ "pageDesigner": {
181
+ "deleteBlockConfirm": "האם אתם בטוחים שברצונכם למחוק את הסקשן הזה?",
182
+ "saving": "שומר...",
183
+ "error": "שגיאה",
184
+ "save": "שמירה",
185
+ "saved": "נשמר",
186
+ "title": "כותרת",
187
+ "slug": "נתיב (slug)",
188
+ "slugPlaceholder": "my-page",
189
+ "pageSettings": "הגדרות עמוד",
190
+ "deletePage": "מחיקת עמוד",
191
+ "deletePageConfirm": "מחיקת עמוד זה אינה ניתנת לביטול.",
192
+ "newPage": "עמוד חדש",
193
+ "createPage": "צור עמוד",
194
+ "addNewBlock": "הוספת בלוק חדש",
195
+ "searchBlock": "חיפוש בלוק",
196
+ "page": "עמוד",
197
+ "pageStructure": "מבנה העמוד",
198
+ "clickToEdit": "לחצו על מקטע כדי לערוך",
199
+ "addNewBlockHere": "לחצו כאן להוספת",
200
+ "newBlock": "בלוק חדש",
201
+ "adding": "מוסיף",
202
+ "removeSection": "הסרת מקטע",
203
+ "closeEditor": "סגור עורך (ESC)",
204
+ "blockNotEditable": "תוכן הבלוק הזה מגיע ממקור נתונים",
205
+ "blockNotEditableDesc": "ואינו ניתן לעריכה כאן.",
206
+ "screenTooSmall": "המסך קטן מדי לעורך הזה. נסו להקטין זום או להשתמש במסך גדול יותר.",
207
+ "cancel": "ביטול",
208
+ "publish": "פרסום",
209
+ "unpublish": "ביטול פרסום",
210
+ "discard": "ביטול",
211
+ "selectItemPreview": "בחר פריט לתצוגה מקדימה",
212
+ "language": "שפה",
213
+ "defaultLanguage": "ברירת מחדל",
214
+ "setAsDefault": "קביעת ברירת מחדל",
215
+ "removeLanguage": "הסרת שפה",
216
+ "languageCode": "he / en / fr",
217
+ "removeLanguageConfirm": "הסר את שפה \"{locale}\"?",
218
+ "seoTitle": "SEO כותרת",
219
+ "seoDescription": "SEO תיאור",
220
+ "ogImageUrl": "OG Image URL",
221
+ "showGrid": "הצג רשת",
222
+ "hideGrid": "הסתר רשת",
223
+ "search": "חיפוש...",
224
+ "lastSaved": "נשמר לאחרונה",
225
+ "saveNow": "שמור עכשיו",
226
+ "publishDestination": "בחר יעד לפרסום",
227
+ "publishAll": "פרסם הכל"
179
228
  }
180
229
  }