@conduction/nextcloud-vue 0.1.0-beta.1 → 0.1.0-beta.10

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 (197) hide show
  1. package/README.md +226 -0
  2. package/css/index.css +5 -0
  3. package/dist/nextcloud-vue.cjs +67614 -0
  4. package/dist/nextcloud-vue.cjs.js +76311 -5905
  5. package/dist/nextcloud-vue.cjs.js.map +1 -1
  6. package/dist/nextcloud-vue.cjs.map +1 -0
  7. package/dist/nextcloud-vue.css +3279 -203
  8. package/dist/nextcloud-vue.esm.js +76240 -5882
  9. package/dist/nextcloud-vue.esm.js.map +1 -1
  10. package/package.json +89 -63
  11. package/src/components/CnActionsBar/CnActionsBar.vue +254 -0
  12. package/src/components/CnActionsBar/index.js +1 -0
  13. package/src/components/CnAdvancedFormDialog/CnAdvancedFormDialog.vue +569 -0
  14. package/src/components/CnAdvancedFormDialog/CnDataTab.vue +217 -0
  15. package/src/components/CnAdvancedFormDialog/CnMetadataTab.vue +121 -0
  16. package/src/components/CnAdvancedFormDialog/CnPropertiesTab.vue +422 -0
  17. package/src/components/CnAdvancedFormDialog/CnPropertyValueCell.vue +247 -0
  18. package/src/components/CnAdvancedFormDialog/index.js +1 -0
  19. package/src/components/CnCard/CnCard.vue +415 -0
  20. package/src/components/CnCard/index.js +1 -0
  21. package/src/components/CnCardGrid/CnCardGrid.vue +23 -20
  22. package/src/components/CnCardGrid/index.js +1 -1
  23. package/src/components/CnCellRenderer/index.js +1 -1
  24. package/src/components/CnChartWidget/CnChartWidget.vue +318 -0
  25. package/src/components/CnChartWidget/index.js +1 -0
  26. package/src/components/CnConfigurationCard/index.js +1 -1
  27. package/src/components/CnContextMenu/CnContextMenu.vue +142 -0
  28. package/src/components/CnContextMenu/index.js +1 -0
  29. package/src/components/CnCopyDialog/CnCopyDialog.vue +257 -0
  30. package/src/components/CnCopyDialog/index.js +1 -0
  31. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +229 -0
  32. package/src/components/CnDashboardGrid/index.js +1 -0
  33. package/src/components/CnDashboardPage/CnDashboardPage.vue +396 -0
  34. package/src/components/CnDashboardPage/index.js +1 -0
  35. package/src/components/CnDataTable/CnDataTable.vue +24 -16
  36. package/src/components/CnDataTable/index.js +1 -1
  37. package/src/components/CnDeleteDialog/CnDeleteDialog.vue +177 -0
  38. package/src/components/CnDeleteDialog/index.js +1 -0
  39. package/src/components/CnDetailCard/CnDetailCard.vue +225 -0
  40. package/src/components/CnDetailCard/index.js +1 -0
  41. package/src/components/CnDetailGrid/CnDetailGrid.vue +254 -0
  42. package/src/components/CnDetailGrid/index.js +1 -0
  43. package/src/components/CnDetailPage/CnDetailPage.vue +431 -0
  44. package/src/components/CnDetailPage/index.js +1 -0
  45. package/src/components/CnFacetSidebar/CnFacetSidebar.vue +12 -2
  46. package/src/components/CnFacetSidebar/index.js +1 -1
  47. package/src/components/CnFilterBar/index.js +1 -1
  48. package/src/components/CnFormDialog/CnFormDialog.vue +934 -0
  49. package/src/components/CnFormDialog/index.js +1 -0
  50. package/src/components/CnIcon/CnIcon.vue +89 -0
  51. package/src/components/CnIcon/index.js +1 -0
  52. package/src/components/CnIndexPage/CnIndexPage.vue +589 -291
  53. package/src/components/CnIndexPage/index.js +1 -1
  54. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +535 -0
  55. package/src/components/CnIndexSidebar/index.js +1 -0
  56. package/src/components/CnInfoWidget/CnInfoWidget.vue +219 -0
  57. package/src/components/CnInfoWidget/index.js +1 -0
  58. package/src/components/CnItemCard/CnItemCard.vue +134 -0
  59. package/src/components/CnItemCard/index.js +1 -0
  60. package/src/components/CnJsonViewer/CnJsonViewer.vue +283 -0
  61. package/src/components/CnJsonViewer/index.js +1 -0
  62. package/src/components/CnKpiGrid/CnKpiGrid.vue +5 -1
  63. package/src/components/CnKpiGrid/index.js +1 -1
  64. package/src/components/CnMassActionBar/CnMassActionBar.vue +6 -5
  65. package/src/components/CnMassActionBar/index.js +1 -1
  66. package/src/components/CnMassCopyDialog/CnMassCopyDialog.vue +16 -9
  67. package/src/components/CnMassCopyDialog/index.js +1 -1
  68. package/src/components/CnMassDeleteDialog/CnMassDeleteDialog.vue +16 -9
  69. package/src/components/CnMassDeleteDialog/index.js +1 -1
  70. package/src/components/CnMassExportDialog/CnMassExportDialog.vue +8 -7
  71. package/src/components/CnMassExportDialog/index.js +1 -1
  72. package/src/components/CnMassImportDialog/CnMassImportDialog.vue +20 -17
  73. package/src/components/CnMassImportDialog/index.js +1 -1
  74. package/src/components/CnNoteCard/CnNoteCard.vue +149 -0
  75. package/src/components/CnNoteCard/index.js +1 -0
  76. package/src/components/CnNotesCard/CnNotesCard.vue +415 -0
  77. package/src/components/CnNotesCard/index.js +1 -0
  78. package/src/components/CnObjectCard/CnObjectCard.vue +3 -1
  79. package/src/components/CnObjectCard/index.js +1 -1
  80. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +853 -0
  81. package/src/components/CnObjectDataWidget/index.js +1 -0
  82. package/src/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue +288 -0
  83. package/src/components/CnObjectMetadataWidget/index.js +1 -0
  84. package/src/components/CnObjectSidebar/CnAuditTrailTab.vue +368 -0
  85. package/src/components/CnObjectSidebar/CnFilesTab.vue +286 -0
  86. package/src/components/CnObjectSidebar/CnNotesTab.vue +249 -0
  87. package/src/components/CnObjectSidebar/CnObjectSidebar.vue +254 -0
  88. package/src/components/CnObjectSidebar/CnTagsTab.vue +258 -0
  89. package/src/components/CnObjectSidebar/CnTasksTab.vue +482 -0
  90. package/src/components/CnObjectSidebar/index.js +6 -0
  91. package/src/components/CnPageHeader/CnPageHeader.vue +61 -0
  92. package/src/components/CnPageHeader/index.js +1 -0
  93. package/src/components/CnPagination/CnPagination.vue +7 -6
  94. package/src/components/CnPagination/index.js +1 -1
  95. package/src/components/CnProgressBar/CnProgressBar.vue +262 -0
  96. package/src/components/CnProgressBar/index.js +1 -0
  97. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +792 -0
  98. package/src/components/CnRegisterMapping/index.js +1 -0
  99. package/src/components/CnRowActions/CnRowActions.vue +25 -3
  100. package/src/components/CnRowActions/index.js +1 -1
  101. package/src/components/CnSchemaFormDialog/CnSchemaConfigurationTab.vue +226 -0
  102. package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +787 -0
  103. package/src/components/CnSchemaFormDialog/CnSchemaPropertiesTab.vue +305 -0
  104. package/src/components/CnSchemaFormDialog/CnSchemaPropertyActions.vue +1398 -0
  105. package/src/components/CnSchemaFormDialog/CnSchemaSecurityTab.vue +236 -0
  106. package/src/components/CnSchemaFormDialog/index.js +1 -0
  107. package/src/components/CnSettingsCard/index.js +1 -1
  108. package/src/components/CnSettingsSection/index.js +1 -1
  109. package/src/components/CnStatsBlock/CnStatsBlock.vue +89 -19
  110. package/src/components/CnStatsBlock/index.js +1 -1
  111. package/src/components/CnStatsPanel/CnStatsPanel.vue +320 -0
  112. package/src/components/CnStatsPanel/index.js +1 -0
  113. package/src/components/CnStatusBadge/CnStatusBadge.vue +15 -2
  114. package/src/components/CnStatusBadge/index.js +1 -1
  115. package/src/components/CnTabbedFormDialog/CnTabbedFormDialog.vue +544 -0
  116. package/src/components/CnTabbedFormDialog/index.js +1 -0
  117. package/src/components/CnTableWidget/CnTableWidget.vue +332 -0
  118. package/src/components/CnTableWidget/index.js +1 -0
  119. package/src/components/CnTasksCard/CnTasksCard.vue +373 -0
  120. package/src/components/CnTasksCard/index.js +1 -0
  121. package/src/components/CnTileWidget/CnTileWidget.vue +159 -0
  122. package/src/components/CnTileWidget/index.js +1 -0
  123. package/src/components/CnTimelineStages/CnTimelineStages.vue +292 -0
  124. package/src/components/CnTimelineStages/index.js +1 -0
  125. package/src/components/CnUserActionMenu/CnUserActionMenu.vue +435 -0
  126. package/src/components/CnUserActionMenu/index.js +1 -0
  127. package/src/components/CnVersionInfoCard/index.js +1 -1
  128. package/src/components/CnWidgetRenderer/CnWidgetRenderer.vue +180 -0
  129. package/src/components/CnWidgetRenderer/index.js +1 -0
  130. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +246 -0
  131. package/src/components/CnWidgetWrapper/index.js +1 -0
  132. package/src/components/index.js +57 -25
  133. package/src/composables/index.js +5 -3
  134. package/src/composables/useContextMenu.js +126 -0
  135. package/src/composables/useDashboardView.js +286 -0
  136. package/src/composables/useDetailView.js +290 -132
  137. package/src/composables/useListView.js +364 -153
  138. package/src/composables/useSubResource.js +142 -142
  139. package/src/constants/metadata.js +30 -0
  140. package/src/css/CnSchemaFormDialog.css +546 -0
  141. package/src/css/__sample_nextcloud_tokens.css +110 -0
  142. package/src/css/actions-bar.css +54 -0
  143. package/src/css/badge.css +83 -51
  144. package/src/css/card.css +129 -128
  145. package/src/css/context-menu.css +20 -0
  146. package/src/css/dashboard.css +70 -0
  147. package/src/css/detail-page.css +235 -0
  148. package/src/css/detail.css +68 -68
  149. package/src/css/index-page.css +44 -0
  150. package/src/css/index-sidebar.css +193 -0
  151. package/src/css/index.css +17 -8
  152. package/src/css/layout.css +90 -90
  153. package/src/css/page-header.css +35 -0
  154. package/src/css/pagination.css +72 -72
  155. package/src/css/table.css +142 -143
  156. package/src/css/timeline-stages.css +220 -0
  157. package/src/css/utilities.css +46 -46
  158. package/src/index.js +91 -50
  159. package/src/mixins/gridLayout.js +118 -0
  160. package/src/store/createCrudStore.js +360 -0
  161. package/src/store/createSubResourcePlugin.js +125 -135
  162. package/src/store/index.js +4 -3
  163. package/src/store/plugins/auditTrails.js +357 -17
  164. package/src/store/plugins/files.js +250 -186
  165. package/src/store/plugins/index.js +7 -4
  166. package/src/store/plugins/lifecycle.js +180 -180
  167. package/src/store/plugins/registerMapping.js +195 -0
  168. package/src/store/plugins/relations.js +68 -68
  169. package/src/store/plugins/search.js +385 -0
  170. package/src/store/plugins/selection.js +104 -0
  171. package/src/store/useObjectStore.js +823 -625
  172. package/src/types/auditTrail.d.ts +32 -32
  173. package/src/types/file.d.ts +23 -23
  174. package/src/types/index.d.ts +35 -35
  175. package/src/types/notification.d.ts +36 -36
  176. package/src/types/object.d.ts +40 -40
  177. package/src/types/organisation.d.ts +41 -41
  178. package/src/types/register.d.ts +25 -25
  179. package/src/types/schema.d.ts +39 -39
  180. package/src/types/shared.d.ts +79 -79
  181. package/src/types/source.d.ts +14 -14
  182. package/src/types/task.d.ts +31 -31
  183. package/src/utils/errors.js +96 -96
  184. package/src/utils/getTheme.js +9 -0
  185. package/src/utils/headers.js +80 -44
  186. package/src/utils/id.js +13 -0
  187. package/src/utils/index.js +4 -3
  188. package/src/utils/schema.js +422 -287
  189. package/src/utils/widgetVisibility.js +162 -0
  190. package/src/components/CnDetailViewLayout/CnDetailViewLayout.vue +0 -88
  191. package/src/components/CnDetailViewLayout/index.js +0 -1
  192. package/src/components/CnEmptyState/CnEmptyState.vue +0 -78
  193. package/src/components/CnEmptyState/index.js +0 -1
  194. package/src/components/CnListViewLayout/CnListViewLayout.vue +0 -80
  195. package/src/components/CnListViewLayout/index.js +0 -1
  196. package/src/components/CnViewModeToggle/CnViewModeToggle.vue +0 -77
  197. package/src/components/CnViewModeToggle/index.js +0 -1
@@ -0,0 +1,415 @@
1
+ <!--
2
+ CnNotesCard — Inline notes card for detail pages.
3
+
4
+ Displays up to 5 recent notes with author, content, and timestamp.
5
+ Includes an add-note form and integrates CnUserActionMenu on author names.
6
+ Wraps CnDetailCard for consistent styling.
7
+ -->
8
+ <template>
9
+ <CnDetailCard :title="titleLabel" :icon="CommentTextOutline" :collapsible="collapsible">
10
+ <div class="cn-notes-card">
11
+ <!-- Add note input -->
12
+ <div class="cn-notes-card__add-form">
13
+ <textarea
14
+ v-model="newNoteText"
15
+ class="cn-notes-card__textarea"
16
+ :placeholder="addNotePlaceholder"
17
+ rows="2"
18
+ @keydown.enter.ctrl.prevent="submitNote"
19
+ @keydown.enter.meta.prevent="submitNote" />
20
+ <NcButton
21
+ type="primary"
22
+ :disabled="!newNoteText.trim() || noteSaving"
23
+ @click="submitNote">
24
+ <template #icon>
25
+ <Send :size="20" />
26
+ </template>
27
+ {{ addNoteLabel }}
28
+ </NcButton>
29
+ </div>
30
+
31
+ <!-- Loading state -->
32
+ <NcLoadingIcon v-if="loading" />
33
+
34
+ <!-- Empty state -->
35
+ <div v-else-if="allNotes.length === 0" class="cn-notes-card__empty">
36
+ {{ noNotesLabel }}
37
+ </div>
38
+
39
+ <!-- Notes list (last 5) -->
40
+ <div v-else class="cn-notes-card__list">
41
+ <div
42
+ v-for="note in displayedNotes"
43
+ :key="note.id"
44
+ class="cn-notes-card__note">
45
+ <div class="cn-notes-card__note-header">
46
+ <CnUserActionMenu
47
+ v-if="!isCurrentUser(note)"
48
+ :user-id="getNoteAuthorId(note)"
49
+ :display-name="getNoteAuthorName(note)">
50
+ <strong class="cn-notes-card__author">{{ getNoteAuthorName(note) }}</strong>
51
+ </CnUserActionMenu>
52
+ <strong v-else class="cn-notes-card__author cn-notes-card__author--self">
53
+ {{ getNoteAuthorName(note) }}
54
+ </strong>
55
+ <span class="cn-notes-card__time">{{ formatDate(note.creationDateTime || note.created) }}</span>
56
+ </div>
57
+ <p class="cn-notes-card__body">
58
+ {{ note.message || note.content }}
59
+ </p>
60
+ <NcButton
61
+ v-if="canDeleteNote(note)"
62
+ type="tertiary-no-background"
63
+ class="cn-notes-card__delete-btn"
64
+ :aria-label="deleteLabel"
65
+ @click="confirmDelete(note)">
66
+ <template #icon>
67
+ <Delete :size="16" />
68
+ </template>
69
+ </NcButton>
70
+ </div>
71
+ </div>
72
+ </div>
73
+
74
+ <!-- Footer: "Show all" link -->
75
+ <template v-if="allNotes.length > maxDisplay" #footer>
76
+ <button
77
+ class="cn-notes-card__show-all"
78
+ @click="$emit('show-all')">
79
+ {{ showAllLabel }} ({{ allNotes.length }})
80
+ </button>
81
+ </template>
82
+ </CnDetailCard>
83
+ </template>
84
+
85
+ <script>
86
+ import { NcButton, NcLoadingIcon } from '@nextcloud/vue'
87
+ import CommentTextOutline from 'vue-material-design-icons/CommentTextOutline.vue'
88
+ import Send from 'vue-material-design-icons/Send.vue'
89
+ import Delete from 'vue-material-design-icons/Delete.vue'
90
+
91
+ import CnDetailCard from '../CnDetailCard/CnDetailCard.vue'
92
+ import CnUserActionMenu from '../CnUserActionMenu/CnUserActionMenu.vue'
93
+ import { buildHeaders } from '../../utils/index.js'
94
+
95
+ /**
96
+ * CnNotesCard — Inline notes widget for detail pages.
97
+ *
98
+ * Shows up to 5 recent notes with add/delete functionality.
99
+ * Integrates CnUserActionMenu on author names for quick communication.
100
+ *
101
+ * @example Basic usage
102
+ * <CnNotesCard
103
+ * register-id="uuid-register"
104
+ * schema-id="uuid-schema"
105
+ * object-id="uuid-object" />
106
+ *
107
+ * @example With sidebar sync
108
+ * <CnNotesCard
109
+ * register-id="reg"
110
+ * schema-id="schema"
111
+ * object-id="obj"
112
+ * @note-added="refreshNotes"
113
+ * @note-deleted="refreshNotes"
114
+ * @show-all="openSidebarNotesTab" />
115
+ */
116
+ export default {
117
+ name: 'CnNotesCard',
118
+
119
+ components: {
120
+ CnDetailCard,
121
+ CnUserActionMenu,
122
+ NcButton,
123
+ NcLoadingIcon,
124
+ Send,
125
+ Delete,
126
+ },
127
+
128
+ props: {
129
+ /** OpenRegister register ID */
130
+ registerId: {
131
+ type: String,
132
+ required: true,
133
+ },
134
+ /** OpenRegister schema ID */
135
+ schemaId: {
136
+ type: String,
137
+ required: true,
138
+ },
139
+ /** Object UUID */
140
+ objectId: {
141
+ type: String,
142
+ required: true,
143
+ },
144
+ /** Base API URL for OpenRegister */
145
+ apiBase: {
146
+ type: String,
147
+ default: '/apps/openregister/api',
148
+ },
149
+ /** Maximum number of notes to display */
150
+ maxDisplay: {
151
+ type: Number,
152
+ default: 5,
153
+ },
154
+ /** Whether the card is collapsible */
155
+ collapsible: {
156
+ type: Boolean,
157
+ default: false,
158
+ },
159
+
160
+ // --- Pre-translated labels ---
161
+ titleLabel: { type: String, default: 'Notes' },
162
+ addNoteLabel: { type: String, default: 'Add note' },
163
+ addNotePlaceholder: { type: String, default: 'Write a note...' },
164
+ noNotesLabel: { type: String, default: 'No notes yet' },
165
+ showAllLabel: { type: String, default: 'Show all' },
166
+ deleteLabel: { type: String, default: 'Delete note' },
167
+ },
168
+
169
+ emits: ['note-added', 'note-deleted', 'show-all'],
170
+
171
+ data() {
172
+ return {
173
+ CommentTextOutline,
174
+ allNotes: [],
175
+ loading: false,
176
+ newNoteText: '',
177
+ noteSaving: false,
178
+ deleteConfirmId: null,
179
+ }
180
+ },
181
+
182
+ computed: {
183
+ displayedNotes() {
184
+ // Reverse chronological, limited to maxDisplay
185
+ const sorted = [...this.allNotes].sort((a, b) => {
186
+ const dateA = new Date(a.creationDateTime || a.created || 0)
187
+ const dateB = new Date(b.creationDateTime || b.created || 0)
188
+ return dateB - dateA
189
+ })
190
+ return sorted.slice(0, this.maxDisplay)
191
+ },
192
+ },
193
+
194
+ watch: {
195
+ objectId: {
196
+ immediate: true,
197
+ handler(newId) {
198
+ if (newId && this.registerId && this.schemaId) {
199
+ this.fetchNotes()
200
+ }
201
+ },
202
+ },
203
+ },
204
+
205
+ methods: {
206
+ getNoteAuthorId(note) {
207
+ return note.actorId || note.author || ''
208
+ },
209
+
210
+ getNoteAuthorName(note) {
211
+ return note.actorDisplayName || note.author || 'Unknown'
212
+ },
213
+
214
+ isCurrentUser(note) {
215
+ const authorId = this.getNoteAuthorId(note)
216
+ const currentUser = typeof OC !== 'undefined' ? OC?.currentUser : null
217
+ return authorId === currentUser
218
+ },
219
+
220
+ canDeleteNote(note) {
221
+ return this.isCurrentUser(note)
222
+ },
223
+
224
+ async fetchNotes() {
225
+ if (!this.registerId || !this.schemaId || !this.objectId) return
226
+ this.loading = true
227
+ try {
228
+ const url = `${this.apiBase}/objects/${this.registerId}/${this.schemaId}/${this.objectId}/notes`
229
+ const response = await fetch(url, { headers: buildHeaders() })
230
+ if (response.ok) {
231
+ const data = await response.json()
232
+ this.allNotes = data.results || data || []
233
+ }
234
+ } catch (err) {
235
+ console.error('CnNotesCard: Failed to fetch notes', err)
236
+ } finally {
237
+ this.loading = false
238
+ }
239
+ },
240
+
241
+ async submitNote() {
242
+ if (!this.newNoteText.trim() || this.noteSaving) return
243
+ this.noteSaving = true
244
+ try {
245
+ const url = `${this.apiBase}/objects/${this.registerId}/${this.schemaId}/${this.objectId}/notes`
246
+ const response = await fetch(url, {
247
+ method: 'POST',
248
+ headers: buildHeaders(),
249
+ body: JSON.stringify({ message: this.newNoteText.trim() }),
250
+ })
251
+ if (response.ok) {
252
+ this.newNoteText = ''
253
+ await this.fetchNotes()
254
+ this.$emit('note-added')
255
+ } else {
256
+ this.showError('Failed to add note')
257
+ }
258
+ } catch (err) {
259
+ console.error('CnNotesCard: Failed to add note', err)
260
+ this.showError('Failed to add note')
261
+ } finally {
262
+ this.noteSaving = false
263
+ }
264
+ },
265
+
266
+ async confirmDelete(note) {
267
+ // Simple inline confirmation — delete directly
268
+ try {
269
+ const url = `${this.apiBase}/objects/${this.registerId}/${this.schemaId}/${this.objectId}/notes/${note.id}`
270
+ const response = await fetch(url, {
271
+ method: 'DELETE',
272
+ headers: buildHeaders(),
273
+ })
274
+ if (response.ok) {
275
+ this.allNotes = this.allNotes.filter(n => n.id !== note.id)
276
+ this.$emit('note-deleted')
277
+ }
278
+ } catch (err) {
279
+ console.error('CnNotesCard: Failed to delete note', err)
280
+ }
281
+ },
282
+
283
+ formatDate(dateStr) {
284
+ if (!dateStr) return ''
285
+ try {
286
+ return new Date(dateStr).toLocaleString(undefined, {
287
+ year: 'numeric',
288
+ month: 'short',
289
+ day: 'numeric',
290
+ hour: '2-digit',
291
+ minute: '2-digit',
292
+ })
293
+ } catch {
294
+ return dateStr
295
+ }
296
+ },
297
+
298
+ showError(message) {
299
+ try {
300
+ // eslint-disable-next-line n/no-missing-import
301
+ import('@nextcloud/dialogs').then(({ showError }) => {
302
+ showError(message)
303
+ })
304
+ } catch {
305
+ console.error(message)
306
+ }
307
+ },
308
+ },
309
+ }
310
+ </script>
311
+
312
+ <style scoped>
313
+ .cn-notes-card__add-form {
314
+ margin-bottom: 12px;
315
+ }
316
+
317
+ .cn-notes-card__textarea {
318
+ width: 100%;
319
+ padding: 8px;
320
+ border: 1px solid var(--color-border);
321
+ border-radius: var(--border-radius);
322
+ resize: vertical;
323
+ font-family: inherit;
324
+ font-size: 13px;
325
+ margin-bottom: 8px;
326
+ background: var(--color-main-background);
327
+ color: var(--color-main-text);
328
+ box-sizing: border-box;
329
+ }
330
+
331
+ .cn-notes-card__textarea:focus {
332
+ border-color: var(--color-primary-element);
333
+ outline: none;
334
+ }
335
+
336
+ .cn-notes-card__empty {
337
+ text-align: center;
338
+ padding: 16px 12px;
339
+ color: var(--color-text-maxcontrast);
340
+ font-size: 13px;
341
+ }
342
+
343
+ .cn-notes-card__list {
344
+ display: flex;
345
+ flex-direction: column;
346
+ }
347
+
348
+ .cn-notes-card__note {
349
+ padding: 10px 0;
350
+ border-bottom: 1px solid var(--color-border);
351
+ position: relative;
352
+ }
353
+
354
+ .cn-notes-card__note:last-child {
355
+ border-bottom: none;
356
+ }
357
+
358
+ .cn-notes-card__note-header {
359
+ display: flex;
360
+ justify-content: space-between;
361
+ align-items: baseline;
362
+ margin-bottom: 4px;
363
+ }
364
+
365
+ .cn-notes-card__author {
366
+ font-size: 13px;
367
+ }
368
+
369
+ .cn-notes-card__author--self {
370
+ color: var(--color-main-text);
371
+ }
372
+
373
+ .cn-notes-card__time {
374
+ font-size: 11px;
375
+ color: var(--color-text-maxcontrast);
376
+ flex-shrink: 0;
377
+ margin-left: 8px;
378
+ }
379
+
380
+ .cn-notes-card__body {
381
+ font-size: 13px;
382
+ margin: 0;
383
+ white-space: pre-wrap;
384
+ word-break: break-word;
385
+ padding-right: 32px;
386
+ }
387
+
388
+ .cn-notes-card__delete-btn {
389
+ position: absolute;
390
+ top: 8px;
391
+ right: -4px;
392
+ opacity: 0;
393
+ transition: opacity 0.15s ease;
394
+ }
395
+
396
+ .cn-notes-card__note:hover .cn-notes-card__delete-btn {
397
+ opacity: 1;
398
+ }
399
+
400
+ .cn-notes-card__show-all {
401
+ background: none;
402
+ border: none;
403
+ color: var(--color-primary-element);
404
+ font-size: 13px;
405
+ font-weight: 500;
406
+ cursor: pointer;
407
+ padding: 0;
408
+ width: 100%;
409
+ text-align: center;
410
+ }
411
+
412
+ .cn-notes-card__show-all:hover {
413
+ text-decoration: underline;
414
+ }
415
+ </style>
@@ -0,0 +1 @@
1
+ export { default as CnNotesCard } from './CnNotesCard.vue'
@@ -21,7 +21,9 @@
21
21
  class="cn-object-card__image">
22
22
 
23
23
  <div class="cn-object-card__title-area">
24
- <h3 class="cn-object-card__title">{{ title }}</h3>
24
+ <h3 class="cn-object-card__title">
25
+ {{ title }}
26
+ </h3>
25
27
  <p v-if="description" class="cn-object-card__description">
26
28
  {{ truncatedDescription }}
27
29
  </p>
@@ -1 +1 @@
1
- export { default as CnObjectCard } from './CnObjectCard.vue'
1
+ export { default as CnObjectCard } from './CnObjectCard.vue'