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

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 (54) hide show
  1. package/README.md +226 -0
  2. package/dist/nextcloud-vue.cjs.js +7039 -2409
  3. package/dist/nextcloud-vue.cjs.js.map +1 -1
  4. package/dist/nextcloud-vue.css +237 -52
  5. package/dist/nextcloud-vue.esm.js +7012 -2386
  6. package/dist/nextcloud-vue.esm.js.map +1 -1
  7. package/package.json +2 -4
  8. package/src/components/CnActionsBar/CnActionsBar.vue +225 -0
  9. package/src/components/CnActionsBar/index.js +1 -0
  10. package/src/components/CnCopyDialog/CnCopyDialog.vue +250 -0
  11. package/src/components/CnCopyDialog/index.js +1 -0
  12. package/src/components/CnDataTable/CnDataTable.vue +0 -5
  13. package/src/components/CnDeleteDialog/CnDeleteDialog.vue +170 -0
  14. package/src/components/CnDeleteDialog/index.js +1 -0
  15. package/src/components/CnFormDialog/CnFormDialog.vue +629 -0
  16. package/src/components/CnFormDialog/index.js +1 -0
  17. package/src/components/CnIcon/CnIcon.vue +89 -0
  18. package/src/components/CnIcon/index.js +1 -0
  19. package/src/components/CnIndexPage/CnIndexPage.vue +434 -300
  20. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +484 -0
  21. package/src/components/CnIndexSidebar/index.js +1 -0
  22. package/src/components/CnPageHeader/CnPageHeader.vue +57 -0
  23. package/src/components/CnPageHeader/index.js +1 -0
  24. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +792 -0
  25. package/src/components/CnRegisterMapping/index.js +1 -0
  26. package/src/components/index.js +8 -4
  27. package/src/constants/metadata.js +30 -0
  28. package/src/css/actions-bar.css +48 -0
  29. package/src/css/badge.css +4 -4
  30. package/src/css/card.css +23 -23
  31. package/src/css/detail.css +13 -13
  32. package/src/css/index-page.css +32 -0
  33. package/src/css/index-sidebar.css +187 -0
  34. package/src/css/index.css +4 -0
  35. package/src/css/layout.css +14 -14
  36. package/src/css/page-header.css +33 -0
  37. package/src/css/pagination.css +12 -12
  38. package/src/css/table.css +21 -22
  39. package/src/css/utilities.css +2 -2
  40. package/src/index.js +11 -8
  41. package/src/store/plugins/index.js +1 -0
  42. package/src/store/plugins/registerMapping.js +185 -0
  43. package/src/store/useObjectStore.js +122 -61
  44. package/src/utils/headers.js +7 -1
  45. package/src/utils/index.js +1 -1
  46. package/src/utils/schema.js +133 -1
  47. package/src/components/CnDetailViewLayout/CnDetailViewLayout.vue +0 -88
  48. package/src/components/CnDetailViewLayout/index.js +0 -1
  49. package/src/components/CnEmptyState/CnEmptyState.vue +0 -78
  50. package/src/components/CnEmptyState/index.js +0 -1
  51. package/src/components/CnListViewLayout/CnListViewLayout.vue +0 -80
  52. package/src/components/CnListViewLayout/index.js +0 -1
  53. package/src/components/CnViewModeToggle/CnViewModeToggle.vue +0 -77
  54. package/src/components/CnViewModeToggle/index.js +0 -1
@@ -0,0 +1 @@
1
+ export { default as CnRegisterMapping } from './CnRegisterMapping.vue'
@@ -1,9 +1,6 @@
1
1
  export { CnDataTable } from './CnDataTable/index.js'
2
2
  export { CnFilterBar } from './CnFilterBar/index.js'
3
- export { CnListViewLayout } from './CnListViewLayout/index.js'
4
- export { CnDetailViewLayout } from './CnDetailViewLayout/index.js'
5
3
  export { CnStatusBadge } from './CnStatusBadge/index.js'
6
- export { CnEmptyState } from './CnEmptyState/index.js'
7
4
  export { CnPagination } from './CnPagination/index.js'
8
5
  export { CnSettingsCard } from './CnSettingsCard/index.js'
9
6
  export { CnSettingsSection } from './CnSettingsSection/index.js'
@@ -14,12 +11,19 @@ export { CnCellRenderer } from './CnCellRenderer/index.js'
14
11
  export { CnObjectCard } from './CnObjectCard/index.js'
15
12
  export { CnCardGrid } from './CnCardGrid/index.js'
16
13
  export { CnFacetSidebar } from './CnFacetSidebar/index.js'
17
- export { CnViewModeToggle } from './CnViewModeToggle/index.js'
18
14
  export { CnRowActions } from './CnRowActions/index.js'
19
15
  export { CnIndexPage } from './CnIndexPage/index.js'
20
16
  export { CnMassActionBar } from './CnMassActionBar/index.js'
17
+ export { CnDeleteDialog } from './CnDeleteDialog/index.js'
18
+ export { CnCopyDialog } from './CnCopyDialog/index.js'
19
+ export { CnFormDialog } from './CnFormDialog/index.js'
21
20
  export { CnMassDeleteDialog } from './CnMassDeleteDialog/index.js'
22
21
  export { CnMassCopyDialog } from './CnMassCopyDialog/index.js'
23
22
  export { CnKpiGrid } from './CnKpiGrid/index.js'
24
23
  export { CnMassExportDialog } from './CnMassExportDialog/index.js'
25
24
  export { CnMassImportDialog } from './CnMassImportDialog/index.js'
25
+ export { CnIndexSidebar } from './CnIndexSidebar/index.js'
26
+ export { CnRegisterMapping } from './CnRegisterMapping/index.js'
27
+ export { CnIcon, ICON_MAP, registerIcons } from './CnIcon/index.js'
28
+ export { CnPageHeader } from './CnPageHeader/index.js'
29
+ export { CnActionsBar } from './CnActionsBar/index.js'
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Standard OpenRegister metadata columns.
3
+ *
4
+ * These system fields exist on every OpenRegister object. Used by
5
+ * CnIndexSidebar to auto-generate the "Metadata" column group.
6
+ */
7
+ export const METADATA_COLUMNS = [
8
+ { key: 'name', label: 'Name' },
9
+ { key: 'description', label: 'Description' },
10
+ { key: 'id', label: 'ID' },
11
+ { key: 'uri', label: 'URI' },
12
+ { key: 'version', label: 'Version' },
13
+ { key: 'register', label: 'Register' },
14
+ { key: 'schema', label: 'Schema' },
15
+ { key: 'files', label: 'Files' },
16
+ { key: 'locked', label: 'Locked' },
17
+ { key: 'organization', label: 'Organization' },
18
+ { key: 'validation', label: 'Validation' },
19
+ { key: 'owner', label: 'Owner' },
20
+ { key: 'application', label: 'Application' },
21
+ { key: 'folder', label: 'Folder' },
22
+ { key: 'geo', label: 'Geo' },
23
+ { key: 'retention', label: 'Retention' },
24
+ { key: 'size', label: 'Size' },
25
+ { key: 'published', label: 'Published' },
26
+ { key: 'depublished', label: 'Depublished' },
27
+ { key: 'deleted', label: 'Deleted' },
28
+ { key: 'created', label: 'Created' },
29
+ { key: 'updated', label: 'Updated' },
30
+ ]
@@ -0,0 +1,48 @@
1
+ /* CnActionsBar — Reusable actions toolbar styles */
2
+
3
+ .cn-actions-bar {
4
+ display: flex;
5
+ justify-content: space-between;
6
+ align-items: center;
7
+ margin-bottom: calc(5 * var(--default-grid-baseline));
8
+ padding: calc(2 * var(--default-grid-baseline));
9
+ background: var(--color-background-hover);
10
+ border-radius: var(--border-radius);
11
+ }
12
+
13
+ .cn-actions-bar__info {
14
+ font-weight: 500;
15
+ font-size: var(--default-font-size);
16
+ }
17
+
18
+ .cn-actions-bar__count {
19
+ color: var(--color-text-maxcontrast);
20
+ }
21
+
22
+ .cn-actions-bar__actions {
23
+ display: flex;
24
+ align-items: center;
25
+ gap: calc(2 * var(--default-grid-baseline));
26
+ }
27
+
28
+ /* View mode toggle container */
29
+ .cn-actions-bar__view-toggle {
30
+ display: flex;
31
+ align-items: center;
32
+ }
33
+
34
+ .cn-actions-bar__view-toggle span {
35
+ max-height: 34px;
36
+ }
37
+
38
+ /* Override Nextcloud's pointer-events:none on disabled action items
39
+ so native title tooltip is visible on hover.
40
+ The button's disabled attribute still prevents click events. */
41
+ .action.action--disabled {
42
+ pointer-events: auto !important;
43
+ cursor: not-allowed;
44
+ }
45
+
46
+ .action.action--disabled button {
47
+ cursor: not-allowed;
48
+ }
package/src/css/badge.css CHANGED
@@ -5,7 +5,7 @@
5
5
  .cn-status-badge {
6
6
  display: inline-flex;
7
7
  align-items: center;
8
- padding: 2px 10px;
8
+ padding: calc(0.5 * var(--default-grid-baseline)) calc(2.5 * var(--default-grid-baseline));
9
9
  border-radius: var(--border-radius-pill);
10
10
  font-size: 0.85em;
11
11
  font-weight: 500;
@@ -15,7 +15,7 @@
15
15
 
16
16
  /* Size variants */
17
17
  .cn-status-badge--small {
18
- padding: 1px 8px;
18
+ padding: calc(0.25 * var(--default-grid-baseline)) calc(2 * var(--default-grid-baseline));
19
19
  font-size: 0.75em;
20
20
  }
21
21
 
@@ -26,8 +26,8 @@
26
26
  }
27
27
 
28
28
  .cn-status-badge--primary {
29
- background-color: var(--nldesign-color-primary-light, var(--color-primary-element-light));
30
- color: var(--nldesign-color-primary, var(--color-primary-element));
29
+ background-color: var(--color-primary-element-light);
30
+ color: var(--color-primary-element);
31
31
  }
32
32
 
33
33
  .cn-status-badge--success {
package/src/css/card.css CHANGED
@@ -5,18 +5,18 @@
5
5
  /* Card Grid */
6
6
  .cn-card-grid {
7
7
  display: grid;
8
- gap: 1.5rem;
8
+ gap: calc(4 * var(--default-grid-baseline));
9
9
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
10
10
  }
11
11
 
12
12
  /* Base Card */
13
13
  .cn-card {
14
14
  background: var(--color-main-background);
15
- border-radius: 8px;
16
- padding: 20px;
15
+ border-radius: var(--border-radius-large);
16
+ padding: calc(5 * var(--default-grid-baseline));
17
17
  box-shadow: 0 2px 8px var(--color-box-shadow);
18
18
  min-height: 200px;
19
- transition: transform 0.2s ease-in-out;
19
+ transition: transform var(--animation-quick) ease-in-out;
20
20
  border: 1px solid var(--color-border);
21
21
  }
22
22
 
@@ -30,9 +30,9 @@
30
30
  display: flex;
31
31
  align-items: center;
32
32
  justify-content: space-between;
33
- gap: 8px;
34
- margin-bottom: 12px;
35
- padding-bottom: 8px;
33
+ gap: calc(2 * var(--default-grid-baseline));
34
+ margin-bottom: calc(3 * var(--default-grid-baseline));
35
+ padding-bottom: calc(2 * var(--default-grid-baseline));
36
36
  border-bottom: 1px solid var(--color-border);
37
37
  }
38
38
 
@@ -40,7 +40,7 @@
40
40
  .cn-card-header h3 {
41
41
  display: flex;
42
42
  align-items: center;
43
- gap: 8px;
43
+ gap: calc(2 * var(--default-grid-baseline));
44
44
  margin: 0;
45
45
  color: var(--color-main-text);
46
46
  }
@@ -52,18 +52,18 @@
52
52
  .cn-settings-card {
53
53
  background: var(--color-background-hover);
54
54
  border-radius: var(--border-radius-large);
55
- padding: 20px;
56
- margin-bottom: 20px;
55
+ padding: calc(5 * var(--default-grid-baseline));
56
+ margin-bottom: calc(5 * var(--default-grid-baseline));
57
57
  }
58
58
 
59
59
  .cn-settings-card h4 {
60
- margin: 0 0 16px 0;
60
+ margin: 0 0 calc(4 * var(--default-grid-baseline)) 0;
61
61
  color: var(--color-main-text);
62
62
  font-size: 16px;
63
63
  font-weight: 600;
64
64
  display: flex;
65
65
  align-items: center;
66
- gap: 8px;
66
+ gap: calc(2 * var(--default-grid-baseline));
67
67
  }
68
68
 
69
69
  .cn-settings-card--collapsible h4 {
@@ -72,7 +72,7 @@
72
72
  display: flex;
73
73
  justify-content: space-between;
74
74
  align-items: center;
75
- transition: color 0.2s ease;
75
+ transition: color var(--animation-quick) ease;
76
76
  margin-bottom: 0;
77
77
  }
78
78
 
@@ -81,7 +81,7 @@
81
81
  }
82
82
 
83
83
  .cn-settings-card__chevron {
84
- transition: transform 0.3s ease;
84
+ transition: transform var(--animation-slow) ease;
85
85
  color: var(--color-text-maxcontrast);
86
86
  }
87
87
 
@@ -90,21 +90,21 @@
90
90
  }
91
91
 
92
92
  .cn-settings-card__content {
93
- padding-top: 16px;
93
+ padding-top: calc(4 * var(--default-grid-baseline));
94
94
  }
95
95
 
96
96
  /* Stat Grid */
97
97
  .cn-stat-grid {
98
98
  display: grid;
99
99
  grid-template-columns: repeat(2, 1fr);
100
- gap: 12px;
101
- margin-bottom: 16px;
100
+ gap: calc(3 * var(--default-grid-baseline));
101
+ margin-bottom: calc(4 * var(--default-grid-baseline));
102
102
  }
103
103
 
104
104
  .cn-stat-item {
105
105
  display: flex;
106
106
  flex-direction: column;
107
- gap: 4px;
107
+ gap: var(--default-grid-baseline);
108
108
  }
109
109
 
110
110
  .cn-stat-label {
@@ -118,11 +118,11 @@
118
118
  }
119
119
 
120
120
  /* Backwards compatibility aliases */
121
- .cardGrid { display: grid; gap: 1.5rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
122
- .card { background: var(--color-main-background); border-radius: 8px; padding: 20px; box-shadow: 0 2px 8px var(--color-box-shadow); min-height: 200px; transition: transform 0.2s ease-in-out; border: 1px solid var(--color-border); }
121
+ .cardGrid { display: grid; gap: calc(4 * var(--default-grid-baseline)); grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
122
+ .card { background: var(--color-main-background); border-radius: var(--border-radius-large); padding: calc(5 * var(--default-grid-baseline)); box-shadow: 0 2px 8px var(--color-box-shadow); min-height: 200px; transition: transform var(--animation-quick) ease-in-out; border: 1px solid var(--color-border); }
123
123
  .card:hover { transform: scale(1.01); box-shadow: 0 4px 12px var(--color-box-shadow); }
124
- .cardHeader { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 12px; padding-bottom: 8px; border-bottom: 1px solid var(--color-border); }
125
- .statGrid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; margin-bottom: 16px; }
126
- .statItem { display: flex; flex-direction: column; gap: 4px; }
124
+ .cardHeader { display: flex; align-items: center; justify-content: space-between; gap: calc(2 * var(--default-grid-baseline)); margin-bottom: calc(3 * var(--default-grid-baseline)); padding-bottom: calc(2 * var(--default-grid-baseline)); border-bottom: 1px solid var(--color-border); }
125
+ .statGrid { display: grid; grid-template-columns: repeat(2, 1fr); gap: calc(3 * var(--default-grid-baseline)); margin-bottom: calc(4 * var(--default-grid-baseline)); }
126
+ .statItem { display: flex; flex-direction: column; gap: var(--default-grid-baseline); }
127
127
  .statLabel { color: var(--color-text-maxcontrast); font-size: 0.9em; }
128
128
  .statValue { font-size: 1.1em; font-weight: 600; }
@@ -1,20 +1,20 @@
1
1
  /* ========================================
2
- @conduction/nextcloud-vue — Detail Styles
2
+ @conduction/nextcloud-vue — Detail Grid & Layout Utility Styles
3
3
  ======================================== */
4
4
 
5
5
  /* Detail Grid (metadata display) */
6
6
  .cn-detail-grid {
7
7
  display: grid;
8
8
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
9
- gap: 16px;
10
- margin-bottom: 20px;
9
+ gap: calc(4 * var(--default-grid-baseline));
10
+ margin-bottom: calc(5 * var(--default-grid-baseline));
11
11
  }
12
12
 
13
13
  .cn-detail-item {
14
14
  display: flex;
15
15
  flex-direction: column;
16
- gap: 4px;
17
- padding: 8px 12px;
16
+ gap: var(--default-grid-baseline);
17
+ padding: calc(2 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline));
18
18
  border-left: 3px solid var(--color-primary-element);
19
19
  background: var(--color-background-hover);
20
20
  border-radius: 0 var(--border-radius) var(--border-radius) 0;
@@ -35,14 +35,14 @@
35
35
  /* Detail Layout */
36
36
  .cn-detail-layout {
37
37
  max-width: 1000px;
38
- padding: 20px;
38
+ padding: calc(5 * var(--default-grid-baseline));
39
39
  }
40
40
 
41
41
  .cn-detail-layout__header {
42
42
  display: flex;
43
43
  align-items: center;
44
- gap: 12px;
45
- margin-bottom: 24px;
44
+ gap: calc(3 * var(--default-grid-baseline));
45
+ margin-bottom: calc(6 * var(--default-grid-baseline));
46
46
  }
47
47
 
48
48
  .cn-detail-layout__title {
@@ -54,15 +54,15 @@
54
54
 
55
55
  .cn-detail-layout__actions {
56
56
  display: flex;
57
- gap: 8px;
57
+ gap: calc(2 * var(--default-grid-baseline));
58
58
  flex-shrink: 0;
59
59
  }
60
60
 
61
61
  .cn-detail-layout__content {
62
- margin-top: 16px;
62
+ margin-top: calc(4 * var(--default-grid-baseline));
63
63
  }
64
64
 
65
65
  /* Backwards compatibility aliases */
66
- .detail-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 16px; margin-bottom: 20px; }
67
- .detail-item { display: flex; flex-direction: column; gap: 4px; padding: 8px 12px; border-left: 3px solid var(--color-primary-element); background: var(--color-background-hover); border-radius: 0 var(--border-radius) var(--border-radius) 0; }
68
- .detailContainer { margin-block-start: 20px; margin-inline-start: 20px; margin-inline-end: 20px; }
66
+ .detail-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: calc(4 * var(--default-grid-baseline)); margin-bottom: calc(5 * var(--default-grid-baseline)); }
67
+ .detail-item { display: flex; flex-direction: column; gap: var(--default-grid-baseline); padding: calc(2 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline)); border-left: 3px solid var(--color-primary-element); background: var(--color-background-hover); border-radius: 0 var(--border-radius) var(--border-radius) 0; }
68
+ .detailContainer { margin-block-start: calc(5 * var(--default-grid-baseline)); margin-inline-start: calc(5 * var(--default-grid-baseline)); margin-inline-end: calc(5 * var(--default-grid-baseline)); }
@@ -0,0 +1,32 @@
1
+ /* CnIndexPage — Index page layout styles */
2
+ /* Header styles: see page-header.css (CnPageHeader) */
3
+ /* Actions bar styles: see actions-bar.css (CnActionsBar) */
4
+
5
+ .cn-index-page {
6
+ padding: calc(5 * var(--default-grid-baseline));
7
+ }
8
+
9
+ /* Body layout */
10
+ .cn-index-page__body {
11
+ display: flex;
12
+ }
13
+
14
+ .cn-index-page__main {
15
+ flex: 1;
16
+ min-width: 0;
17
+ }
18
+
19
+ .cn-index-page__loading {
20
+ display: flex;
21
+ justify-content: center;
22
+ padding: calc(15 * var(--default-grid-baseline));
23
+ }
24
+
25
+ .cn-index-page__empty {
26
+ padding: calc(10 * var(--default-grid-baseline)) calc(5 * var(--default-grid-baseline));
27
+ text-align: center;
28
+ }
29
+
30
+ .cn-index-page__pagination {
31
+ margin-top: calc(4 * var(--default-grid-baseline));
32
+ }
@@ -0,0 +1,187 @@
1
+ /* CnIndexSidebar — NcAppSidebar wrapper styles */
2
+
3
+ /* Sidebar header icon (compact mode figure area) */
4
+ .cn-index-sidebar__header-icon {
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ width: 100%;
9
+ height: 100%;
10
+ color: var(--color-primary-element);
11
+ }
12
+
13
+ .cn-index-sidebar__header-emoji {
14
+ font-size: 28px;
15
+ line-height: 1;
16
+ }
17
+
18
+ /* Search tab sections */
19
+ .cn-index-sidebar__section {
20
+ padding: calc(4 * var(--default-grid-baseline));
21
+ }
22
+
23
+ .cn-index-sidebar__section h3 {
24
+ margin: 0 0 calc(3 * var(--default-grid-baseline)) 0;
25
+ font-size: 15px;
26
+ font-weight: 600;
27
+ }
28
+
29
+ .cn-index-sidebar__description {
30
+ color: var(--color-text-maxcontrast);
31
+ font-size: 13px;
32
+ margin: 0 0 calc(4 * var(--default-grid-baseline)) 0;
33
+ }
34
+
35
+ .cn-index-sidebar__filter-group {
36
+ margin-bottom: calc(3 * var(--default-grid-baseline));
37
+ }
38
+
39
+ .cn-index-sidebar__filter-header {
40
+ display: flex;
41
+ align-items: center;
42
+ gap: var(--default-grid-baseline);
43
+ margin-bottom: var(--default-grid-baseline);
44
+ }
45
+
46
+ .cn-index-sidebar__filter-label {
47
+ font-size: 13px;
48
+ font-weight: 500;
49
+ color: var(--color-main-text);
50
+ }
51
+
52
+ .cn-index-sidebar__info-btn {
53
+ min-width: var(--clickable-area-small, 24px) !important;
54
+ min-height: var(--clickable-area-small, 24px) !important;
55
+ width: var(--clickable-area-small, 24px) !important;
56
+ height: var(--clickable-area-small, 24px) !important;
57
+ padding: 0 !important;
58
+ color: var(--color-text-maxcontrast);
59
+ }
60
+
61
+ .cn-index-sidebar__info-btn:hover {
62
+ color: var(--color-primary);
63
+ }
64
+
65
+ .cn-index-sidebar__filter-description {
66
+ padding: calc(2 * var(--default-grid-baseline)) calc(3 * var(--default-grid-baseline));
67
+ max-width: 260px;
68
+ font-size: 13px;
69
+ color: var(--color-main-text);
70
+ margin: 0;
71
+ line-height: var(--default-line-height, 1.4);
72
+ }
73
+
74
+ .cn-index-sidebar__select {
75
+ width: 100%;
76
+ }
77
+
78
+ /* Visually hide NcSelect's rendered label — the filter heading already shows it.
79
+ Keep input-label prop for screen-reader accessibility. */
80
+ .cn-index-sidebar__select label {
81
+ position: absolute;
82
+ width: 1px;
83
+ height: 1px;
84
+ padding: 0;
85
+ margin: -1px;
86
+ overflow: hidden;
87
+ clip: rect(0, 0, 0, 0);
88
+ white-space: nowrap;
89
+ border: 0;
90
+ }
91
+
92
+ .cn-index-sidebar__empty {
93
+ color: var(--color-text-maxcontrast);
94
+ font-size: 13px;
95
+ font-style: italic;
96
+ }
97
+
98
+ /* ── Columns tab ── */
99
+
100
+ .cn-sidebar-columns {
101
+ padding: calc(4 * var(--default-grid-baseline));
102
+ min-height: calc(100vh - 200px);
103
+ }
104
+
105
+ .cn-sidebar-columns h3 {
106
+ margin-top: 0;
107
+ margin-bottom: calc(2 * var(--default-grid-baseline));
108
+ font-size: 18px;
109
+ font-weight: 600;
110
+ }
111
+
112
+ .cn-sidebar-columns__description {
113
+ color: var(--color-text-maxcontrast);
114
+ margin-bottom: calc(4 * var(--default-grid-baseline));
115
+ font-size: var(--default-font-size);
116
+ }
117
+
118
+ /* Collapsible column group card */
119
+ .cn-sidebar-columns__group {
120
+ margin-bottom: calc(6 * var(--default-grid-baseline));
121
+ }
122
+
123
+ .cn-sidebar-columns__group h4 {
124
+ margin-top: 0;
125
+ margin-bottom: calc(3 * var(--default-grid-baseline));
126
+ font-size: var(--default-font-size);
127
+ font-weight: 600;
128
+ color: var(--color-text-light);
129
+ border-bottom: 1px solid var(--color-border);
130
+ padding-bottom: calc(2 * var(--default-grid-baseline));
131
+ }
132
+
133
+ .cn-sidebar-columns__group .checkbox-radio-switch {
134
+ margin-bottom: calc(2 * var(--default-grid-baseline));
135
+ }
136
+
137
+ .cn-sidebar-columns__group .checkbox-radio-switch__content {
138
+ padding: var(--default-grid-baseline) 0;
139
+ }
140
+
141
+ .cn-sidebar-columns__group--collapsible {
142
+ border: 1px solid var(--color-border);
143
+ border-radius: var(--border-radius);
144
+ padding: 0;
145
+ margin-bottom: calc(3 * var(--default-grid-baseline));
146
+ }
147
+
148
+ .cn-sidebar-columns__group-header {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: calc(2 * var(--default-grid-baseline));
152
+ padding: calc(3 * var(--default-grid-baseline));
153
+ cursor: pointer;
154
+ user-select: none;
155
+ transition: background-color var(--animation-quick) ease;
156
+ }
157
+
158
+ .cn-sidebar-columns__group-header:hover {
159
+ background-color: var(--color-background-hover);
160
+ }
161
+
162
+ .cn-sidebar-columns__group-header h4 {
163
+ margin: 0;
164
+ padding: 0;
165
+ border: none;
166
+ flex: 1;
167
+ color: var(--color-main-text);
168
+ }
169
+
170
+ .cn-sidebar-columns__select-all {
171
+ margin: 0 !important;
172
+ font-size: 12px;
173
+ }
174
+
175
+ .cn-sidebar-columns__group-content {
176
+ padding: calc(3 * var(--default-grid-baseline));
177
+ border-top: 1px solid var(--color-border);
178
+ display: flex;
179
+ flex-direction: column;
180
+ gap: calc(2 * var(--default-grid-baseline));
181
+ }
182
+
183
+ .cn-sidebar-columns__empty {
184
+ color: var(--color-text-maxcontrast);
185
+ font-size: 13px;
186
+ font-style: italic;
187
+ }
package/src/css/index.css CHANGED
@@ -6,3 +6,7 @@
6
6
  @import './badge.css';
7
7
  @import './layout.css';
8
8
  @import './utilities.css';
9
+ @import './page-header.css';
10
+ @import './actions-bar.css';
11
+ @import './index-page.css';
12
+ @import './index-sidebar.css';
@@ -1,23 +1,23 @@
1
1
  /* ========================================
2
- @conduction/nextcloud-vue — Layout Styles
2
+ @conduction/nextcloud-vue — Layout & Filter Utility Styles
3
3
  ======================================== */
4
4
 
5
5
  /* List View Layout */
6
6
  .cn-list-layout {
7
- padding: 20px;
7
+ padding: calc(5 * var(--default-grid-baseline));
8
8
  }
9
9
 
10
10
  .cn-list-layout__header {
11
11
  display: flex;
12
12
  align-items: center;
13
13
  justify-content: space-between;
14
- margin-bottom: 16px;
14
+ margin-bottom: calc(4 * var(--default-grid-baseline));
15
15
  }
16
16
 
17
17
  .cn-list-layout__title {
18
18
  display: flex;
19
19
  align-items: baseline;
20
- gap: 8px;
20
+ gap: calc(2 * var(--default-grid-baseline));
21
21
  }
22
22
 
23
23
  .cn-list-layout__title h2 {
@@ -33,15 +33,15 @@
33
33
 
34
34
  .cn-list-layout__actions {
35
35
  display: flex;
36
- gap: 8px;
36
+ gap: calc(2 * var(--default-grid-baseline));
37
37
  }
38
38
 
39
39
  /* Filter Bar */
40
40
  .cn-filter-bar {
41
41
  display: flex;
42
42
  align-items: center;
43
- gap: 12px;
44
- margin-bottom: 16px;
43
+ gap: calc(3 * var(--default-grid-baseline));
44
+ margin-bottom: calc(4 * var(--default-grid-baseline));
45
45
  flex-wrap: wrap;
46
46
  }
47
47
 
@@ -54,7 +54,7 @@
54
54
  .cn-filter-bar__filters {
55
55
  display: flex;
56
56
  align-items: center;
57
- gap: 8px;
57
+ gap: calc(2 * var(--default-grid-baseline));
58
58
  flex-wrap: wrap;
59
59
  }
60
60
 
@@ -71,20 +71,20 @@
71
71
  .cn-dashboard-content {
72
72
  margin-inline: auto;
73
73
  max-width: 1200px;
74
- padding-block: 20px;
75
- padding-inline: 20px;
74
+ padding-block: calc(5 * var(--default-grid-baseline));
75
+ padding-inline: calc(5 * var(--default-grid-baseline));
76
76
  }
77
77
 
78
78
  /* Loading Container */
79
79
  .cn-loading-container {
80
80
  display: flex;
81
81
  align-items: center;
82
- gap: 10px;
82
+ gap: calc(2 * var(--default-grid-baseline));
83
83
  color: var(--color-text-maxcontrast);
84
84
  justify-content: center;
85
- padding-block: 40px;
85
+ padding-block: calc(10 * var(--default-grid-baseline));
86
86
  }
87
87
 
88
88
  /* Backwards compatibility aliases */
89
- .dashboardContent { margin-inline: auto; max-width: 1200px; padding-block: 20px; padding-inline: 20px; }
90
- .loadingContainer { display: flex; align-items: center; gap: 10px; color: var(--color-text-maxcontrast); justify-content: center; padding-block: 40px; }
89
+ .dashboardContent { margin-inline: auto; max-width: 1200px; padding-block: calc(5 * var(--default-grid-baseline)); padding-inline: calc(5 * var(--default-grid-baseline)); }
90
+ .loadingContainer { display: flex; align-items: center; gap: calc(2 * var(--default-grid-baseline)); color: var(--color-text-maxcontrast); justify-content: center; padding-block: calc(10 * var(--default-grid-baseline)); }
@@ -0,0 +1,33 @@
1
+ /* CnPageHeader — Reusable page header styles */
2
+
3
+ .cn-page-header {
4
+ display: flex;
5
+ align-items: flex-start;
6
+ gap: calc(3 * var(--default-grid-baseline));
7
+ margin-bottom: calc(4 * var(--default-grid-baseline));
8
+ }
9
+
10
+ .cn-page-header__icon {
11
+ flex-shrink: 0;
12
+ display: flex;
13
+ align-items: center;
14
+ padding-top: var(--default-grid-baseline);
15
+ color: var(--color-primary);
16
+ }
17
+
18
+ .cn-page-header__text {
19
+ flex: 1;
20
+ min-width: 0;
21
+ }
22
+
23
+ .cn-page-header__title {
24
+ margin: 0 0 var(--default-grid-baseline) 0;
25
+ font-size: 2rem;
26
+ font-weight: 300;
27
+ }
28
+
29
+ .cn-page-header__description {
30
+ color: var(--color-text-maxcontrast);
31
+ margin: 0;
32
+ font-size: var(--default-font-size);
33
+ }