@dnax/ui 0.0.46 → 0.0.49

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 (47) hide show
  1. package/components/QBottomSheet.vue +172 -6
  2. package/components/QBtn.vue +3 -4
  3. package/components/QContainer.vue +2 -2
  4. package/components/QImagePicker.vue +28 -1
  5. package/components/QInputChat.vue +859 -0
  6. package/components/QInputCurrency.vue +319 -0
  7. package/components/QItemLabel.vue +99 -0
  8. package/components/QMap.vue +410 -0
  9. package/components/QNumericKeyboard.vue +304 -0
  10. package/components/QPage.vue +26 -6
  11. package/components/QPageContainer.vue +32 -0
  12. package/components/QPopupProxy.vue +378 -0
  13. package/components/QQrcode.vue +132 -0
  14. package/components/QSpreadsheet.vue +395 -69
  15. package/components/QTime.vue +845 -0
  16. package/components/QTimeline.vue +111 -0
  17. package/components/QTimelineEntry.vue +271 -0
  18. package/index.ts +11 -1
  19. package/lib/bottomSheet.test.ts +121 -0
  20. package/lib/bottomSheet.ts +115 -0
  21. package/lib/color.ts +13 -0
  22. package/lib/currency.test.ts +193 -0
  23. package/lib/currency.ts +301 -0
  24. package/lib/fixedLayout.ts +12 -11
  25. package/lib/icons.ts +3 -20
  26. package/lib/map.test.ts +365 -0
  27. package/lib/map.ts +438 -0
  28. package/lib/mapEngine.ts +158 -0
  29. package/lib/mapLeaflet.ts +142 -0
  30. package/lib/mapMaplibre.ts +106 -0
  31. package/lib/mapMaptiler.ts +93 -0
  32. package/lib/numericKeyboard.test.ts +179 -0
  33. package/lib/numericKeyboard.ts +166 -0
  34. package/lib/pagePadding.test.ts +37 -0
  35. package/lib/pagePadding.ts +32 -0
  36. package/lib/qrcode.test.ts +103 -0
  37. package/lib/qrcode.ts +125 -0
  38. package/lib/spreadsheetChanges.test.ts +230 -0
  39. package/lib/spreadsheetChanges.ts +331 -0
  40. package/package.json +5 -17
  41. package/shims.d.ts +19 -0
  42. package/styles/main.css +702 -893
  43. package/components/QTiptap.vue +0 -996
  44. package/components/internal/QTiptapTableView.vue +0 -123
  45. package/components/internal/QTiptapTaskItemView.vue +0 -49
  46. package/lib/tiptap-table.ts +0 -19
  47. 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>
@@ -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
- })
@@ -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
- })