@dnax/ui 0.0.48 → 0.0.50
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/components/QBottomSheet.vue +172 -6
- package/components/QChart.vue +1 -0
- package/components/QDatePicker.vue +1 -1
- package/components/QImagePicker.vue +28 -1
- package/components/QInputChat.vue +859 -0
- package/components/QInputCurrency.vue +319 -0
- package/components/QItemLabel.vue +99 -0
- package/components/QMap.vue +410 -0
- package/components/QNumericKeyboard.vue +304 -0
- package/components/QPage.vue +26 -6
- package/components/QPageContainer.vue +32 -0
- package/components/QPopupProxy.vue +378 -0
- package/components/QQrcode.vue +132 -0
- package/components/QSelect.vue +12 -0
- package/components/QSpreadsheet.vue +395 -69
- package/components/QTime.vue +845 -0
- package/components/QTimeline.vue +111 -0
- package/components/QTimelineEntry.vue +271 -0
- package/index.ts +11 -1
- package/lib/bottomSheet.test.ts +121 -0
- package/lib/bottomSheet.ts +115 -0
- package/lib/color.ts +13 -0
- package/lib/currency.test.ts +193 -0
- package/lib/currency.ts +301 -0
- package/lib/fixedLayout.ts +12 -11
- package/lib/icons.ts +3 -20
- package/lib/map.test.ts +365 -0
- package/lib/map.ts +438 -0
- package/lib/mapEngine.ts +158 -0
- package/lib/mapLeaflet.ts +142 -0
- package/lib/mapMaplibre.ts +106 -0
- package/lib/mapMaptiler.ts +93 -0
- package/lib/numericKeyboard.test.ts +179 -0
- package/lib/numericKeyboard.ts +166 -0
- package/lib/pagePadding.test.ts +37 -0
- package/lib/pagePadding.ts +32 -0
- package/lib/qrcode.test.ts +103 -0
- package/lib/qrcode.ts +125 -0
- package/lib/spreadsheetChanges.test.ts +230 -0
- package/lib/spreadsheetChanges.ts +331 -0
- package/package.json +5 -17
- package/shims.d.ts +19 -0
- package/styles/main.css +689 -884
- package/components/QTiptap.vue +0 -996
- package/components/internal/QTiptapTableView.vue +0 -123
- package/components/internal/QTiptapTaskItemView.vue +0 -49
- package/lib/tiptap-table.ts +0 -19
- package/lib/tiptap-task-list.ts +0 -16
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
// QTiptapTableView — NodeView Vue du nœud « table » : rend un vrai <table>
|
|
3
|
-
// avec le contentDOM ProseMirror dans le <tbody>. Les rangées/cellules restent
|
|
4
|
-
// du contenu ProseMirror classique (sélection, merge/split, clavier).
|
|
5
|
-
// Ajouts maison : colgroup + poignées de redimensionnement de colonnes
|
|
6
|
-
// (drag), appliqué localement via des largeurs en % (non persistées dans le
|
|
7
|
-
// document — pour persister il faudrait écrire les attrs colwidth des cellules).
|
|
8
|
-
import { computed, onBeforeUnmount, ref, watch } from "vue"
|
|
9
|
-
import { nodeViewProps, NodeViewContent, NodeViewWrapper } from "@tiptap/vue-3"
|
|
10
|
-
|
|
11
|
-
const props = defineProps(nodeViewProps)
|
|
12
|
-
|
|
13
|
-
// Nombre de colonnes = largeur de la première rangée (les suivantes suivent
|
|
14
|
-
// les rowspans/colspans du schéma).
|
|
15
|
-
const cols = computed(() => {
|
|
16
|
-
const first = props.node?.firstChild
|
|
17
|
-
return first ? first.childCount : 0
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
// Largeurs en % (initialement égales) ; recalculees quand le nombre de
|
|
21
|
-
// colonnes change (ajout/suppression).
|
|
22
|
-
const widths = ref<number[]>([])
|
|
23
|
-
watch(
|
|
24
|
-
cols,
|
|
25
|
-
(count) => {
|
|
26
|
-
if (count === widths.value.length) return
|
|
27
|
-
const each = count > 0 ? 100 / count : 0
|
|
28
|
-
widths.value = Array.from({ length: count }, () => each)
|
|
29
|
-
},
|
|
30
|
-
{ immediate: true },
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
// — Drag de redimensionnement (poignées entre colonnes) —
|
|
34
|
-
const tableEl = ref<HTMLElement | null>(null)
|
|
35
|
-
let dragging = false
|
|
36
|
-
let boundary = 0
|
|
37
|
-
let startX = 0
|
|
38
|
-
let leftStart = 0
|
|
39
|
-
let rightStart = 0
|
|
40
|
-
let tableWidth = 0
|
|
41
|
-
|
|
42
|
-
const onMove = (event: PointerEvent) => {
|
|
43
|
-
if (!dragging) return
|
|
44
|
-
const delta = event.clientX - startX
|
|
45
|
-
const minPx = 48
|
|
46
|
-
let leftPx = leftStart + delta
|
|
47
|
-
let rightPx = rightStart - delta
|
|
48
|
-
if (leftPx < minPx) {
|
|
49
|
-
rightPx -= minPx - leftPx
|
|
50
|
-
leftPx = minPx
|
|
51
|
-
}
|
|
52
|
-
if (rightPx < minPx) {
|
|
53
|
-
leftPx -= minPx - rightPx
|
|
54
|
-
rightPx = minPx
|
|
55
|
-
}
|
|
56
|
-
if (leftPx < minPx || rightPx < minPx) return
|
|
57
|
-
const total = tableWidth || 1
|
|
58
|
-
const next = [...widths.value]
|
|
59
|
-
next[boundary - 1] = (leftPx / total) * 100
|
|
60
|
-
next[boundary] = (rightPx / total) * 100
|
|
61
|
-
widths.value = next
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const onUp = () => {
|
|
65
|
-
dragging = false
|
|
66
|
-
window.removeEventListener("pointermove", onMove)
|
|
67
|
-
window.removeEventListener("pointerup", onUp)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const startResize = (event: PointerEvent, boundaryIndex: number) => {
|
|
71
|
-
if (!props.editor.isEditable) return
|
|
72
|
-
event.preventDefault()
|
|
73
|
-
const table = tableEl.value
|
|
74
|
-
if (!table) return
|
|
75
|
-
const row = table.querySelector("tr")
|
|
76
|
-
if (!row) return
|
|
77
|
-
const leftCell = row.children[boundaryIndex - 1] as HTMLElement | undefined
|
|
78
|
-
const rightCell = row.children[boundaryIndex] as HTMLElement | undefined
|
|
79
|
-
if (!leftCell || !rightCell) return
|
|
80
|
-
tableWidth = table.getBoundingClientRect().width || 1
|
|
81
|
-
leftStart = leftCell.getBoundingClientRect().width
|
|
82
|
-
rightStart = rightCell.getBoundingClientRect().width
|
|
83
|
-
startX = event.clientX
|
|
84
|
-
boundary = boundaryIndex
|
|
85
|
-
dragging = true
|
|
86
|
-
window.addEventListener("pointermove", onMove)
|
|
87
|
-
window.addEventListener("pointerup", onUp)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
onBeforeUnmount(() => {
|
|
91
|
-
window.removeEventListener("pointermove", onMove)
|
|
92
|
-
window.removeEventListener("pointerup", onUp)
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
// Position d'une poignée (bord droit de la colonne index) en %
|
|
96
|
-
const boundaryLeft = (index: number) => {
|
|
97
|
-
const acc = widths.value.slice(0, index).reduce((sum, w) => sum + w, 0)
|
|
98
|
-
return Math.min(acc, 99.5)
|
|
99
|
-
}
|
|
100
|
-
</script>
|
|
101
|
-
|
|
102
|
-
<template>
|
|
103
|
-
<node-view-wrapper as="div" class="q-tiptap__table-wrapper">
|
|
104
|
-
<table ref="tableEl" class="q-tiptap__table" :class="{ 'q-tiptap__table--resizable': editor.isEditable }">
|
|
105
|
-
<colgroup v-if="widths.length">
|
|
106
|
-
<col v-for="(width, i) in widths" :key="i" :style="{ width: width + '%' }" />
|
|
107
|
-
</colgroup>
|
|
108
|
-
<node-view-content as="tbody" />
|
|
109
|
-
</table>
|
|
110
|
-
|
|
111
|
-
<!-- Poignées de redimensionnement entre les colonnes (éditable seulement) -->
|
|
112
|
-
<span
|
|
113
|
-
v-for="index in Math.max(cols - 1, 0)"
|
|
114
|
-
:key="'handle-' + index"
|
|
115
|
-
class="q-tiptap__resize-handle"
|
|
116
|
-
:style="{ left: boundaryLeft(index) + '%' }"
|
|
117
|
-
role="separator"
|
|
118
|
-
aria-orientation="vertical"
|
|
119
|
-
:aria-label="'Resize column ' + index"
|
|
120
|
-
@pointerdown.prevent.stop="startResize($event, index)"
|
|
121
|
-
/>
|
|
122
|
-
</node-view-wrapper>
|
|
123
|
-
</template>
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
// QTiptapTaskItemView — NodeView Vue du nœud « taskItem » : rend une vraie
|
|
3
|
-
// <q-checkbox> dnax.ui (au lieu du <input> natif du DOM par défaut).
|
|
4
|
-
// Le nœud est fourni par l'extension officielle TaskItem (schéma, keymap
|
|
5
|
-
// Enter/Tab, input rules "[ ]" / "[x]") dont on ne remplace que addNodeView.
|
|
6
|
-
//
|
|
7
|
-
// ⚠ NodeView Vue : la RACINE DOIT être <node-view-wrapper> (erreur Tiptap
|
|
8
|
-
// « Please use the NodeViewWrapper component » sinon). En v3 ce wrapper ne
|
|
9
|
-
// propage pas les attrs → data-checked/class cochée portés par le div interne
|
|
10
|
-
// qui contient <node-view-content> (le contentDOM peut être imbriqué).
|
|
11
|
-
import { nodeViewProps, NodeViewContent, NodeViewWrapper } from "@tiptap/vue-3"
|
|
12
|
-
import QCheckbox from "../QCheckbox.vue"
|
|
13
|
-
|
|
14
|
-
// nodeViewProps : descripteurs runtime officiels (editor, node, updateAttributes,
|
|
15
|
-
// getPos…) — pattern documenté pour les NodeViews Vue dans Tiptap.
|
|
16
|
-
const props = defineProps(nodeViewProps)
|
|
17
|
-
|
|
18
|
-
const checked = () => !!props.node.attrs.checked
|
|
19
|
-
const isEditable = () => props.editor.isEditable
|
|
20
|
-
|
|
21
|
-
const onToggle = (value: unknown) => {
|
|
22
|
-
if (!isEditable()) return
|
|
23
|
-
if (typeof props.getPos !== "function") return
|
|
24
|
-
props.editor.chain().focus().command(({ tr }) => {
|
|
25
|
-
const position = props.getPos()
|
|
26
|
-
if (typeof position !== "number") return false
|
|
27
|
-
const current = tr.doc.nodeAt(position)
|
|
28
|
-
tr.setNodeMarkup(position, undefined, { ...current?.attrs, checked: Boolean(value) })
|
|
29
|
-
return true
|
|
30
|
-
}).run()
|
|
31
|
-
}
|
|
32
|
-
</script>
|
|
33
|
-
|
|
34
|
-
<template>
|
|
35
|
-
<node-view-wrapper as="li">
|
|
36
|
-
<label class="q-tiptap__task-check" contenteditable="false" @mousedown.prevent>
|
|
37
|
-
<q-checkbox
|
|
38
|
-
:model-value="checked()"
|
|
39
|
-
dense
|
|
40
|
-
:disable="!isEditable()"
|
|
41
|
-
aria-label="Task done"
|
|
42
|
-
@update:model-value="onToggle"
|
|
43
|
-
/>
|
|
44
|
-
</label>
|
|
45
|
-
<div class="q-tiptap__task-content" :class="{ 'q-tiptap__task-content--checked': checked() }">
|
|
46
|
-
<node-view-content />
|
|
47
|
-
</div>
|
|
48
|
-
</node-view-wrapper>
|
|
49
|
-
</template>
|
package/lib/tiptap-table.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
// Tables Tiptap pour QTiptap — le nœud « table » est rendu par une NodeView
|
|
2
|
-
// Vue (QTiptapTableView) au lieu du rendu DOM/colgroup par défaut. On garde
|
|
3
|
-
// les nœuds officiels TableRow/TableHeader/TableCell (schéma, keymaps,
|
|
4
|
-
// commandes) ; on ne remplace que le addNodeView de « table ».
|
|
5
|
-
import { Table, TableHeader, TableCell, TableRow } from "@tiptap/extension-table"
|
|
6
|
-
import { VueNodeViewRenderer } from "@tiptap/vue-3"
|
|
7
|
-
import type { NodeViewProps } from "@tiptap/vue-3"
|
|
8
|
-
import type { Component } from "vue"
|
|
9
|
-
import QTiptapTableView from "../components/internal/QTiptapTableView.vue"
|
|
10
|
-
|
|
11
|
-
export { TableHeader, TableCell, TableRow }
|
|
12
|
-
|
|
13
|
-
export const QTipTapTable = Table.extend({
|
|
14
|
-
addNodeView() {
|
|
15
|
-
// defineProps(nodeViewProps) ne fait pas remonter les types vers le renderer
|
|
16
|
-
// → cast vers Component<NodeViewProps>
|
|
17
|
-
return VueNodeViewRenderer(QTiptapTableView as Component<NodeViewProps>)
|
|
18
|
-
},
|
|
19
|
-
})
|
package/lib/tiptap-task-list.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// Task list Tiptap pour QTiptap — l'élément de liste est rendu par une
|
|
2
|
-
// NodeView Vue (q-checkbox dnax.ui) : on garde l'extension officielle
|
|
3
|
-
// TaskItem (schéma, parse/render, keymap, input rules) et on ne remplace que
|
|
4
|
-
// son addNodeView par VueNodeViewRenderer(QTiptapTaskItemView).
|
|
5
|
-
import TaskList from "@tiptap/extension-task-list"
|
|
6
|
-
import TaskItem from "@tiptap/extension-task-item"
|
|
7
|
-
import { VueNodeViewRenderer } from "@tiptap/vue-3"
|
|
8
|
-
import QTiptapTaskItemView from "../components/internal/QTiptapTaskItemView.vue"
|
|
9
|
-
|
|
10
|
-
export { TaskList }
|
|
11
|
-
|
|
12
|
-
export const QTipTapTaskItem = TaskItem.extend({
|
|
13
|
-
addNodeView() {
|
|
14
|
-
return VueNodeViewRenderer(QTiptapTaskItemView)
|
|
15
|
-
},
|
|
16
|
-
})
|