@conduction/nextcloud-vue 2.89.2 → 2.90.0
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/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +13 -0
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +3 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +18 -0
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -2
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +63 -63
- package/dist/esm/utils/declaredProps.js +106 -0
- package/dist/esm/utils/declaredProps.js.map +1 -0
- package/dist/nextcloud-vue.cjs.js +150 -16
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +63 -63
- package/package.json +1 -1
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +14 -1
- package/src/components/CnDashboardPage/CnDashboardPage.vue +20 -2
- package/src/utils/declaredProps.js +115 -0
|
@@ -51261,7 +51261,7 @@ function matchPlainBrackets(state, pos, dir, tree, tokenType, maxScanDistance, b
|
|
|
51261
51261
|
}
|
|
51262
51262
|
const noTokens = /*@__PURE__*/Object.create(null);
|
|
51263
51263
|
const typeArray = [NodeType.none];
|
|
51264
|
-
const warned$
|
|
51264
|
+
const warned$3 = [];
|
|
51265
51265
|
// Cache of node types by name and tags
|
|
51266
51266
|
const byTag = /*@__PURE__*/Object.create(null);
|
|
51267
51267
|
const defaultTable = /*@__PURE__*/Object.create(null);
|
|
@@ -51281,9 +51281,9 @@ for (let [legacyName, name] of [
|
|
|
51281
51281
|
])
|
|
51282
51282
|
defaultTable[legacyName] = /*@__PURE__*/createTokenType(noTokens, name);
|
|
51283
51283
|
function warnForPart(part, msg) {
|
|
51284
|
-
if (warned$
|
|
51284
|
+
if (warned$3.indexOf(part) > -1)
|
|
51285
51285
|
return;
|
|
51286
|
-
warned$
|
|
51286
|
+
warned$3.push(part);
|
|
51287
51287
|
console.warn(msg);
|
|
51288
51288
|
}
|
|
51289
51289
|
function createTokenType(extra, tagStr) {
|
|
@@ -158624,7 +158624,7 @@ const DEFAULT_COMPONENT_MAP = Object.freeze({
|
|
|
158624
158624
|
|
|
158625
158625
|
const KNOWN_TYPES = ['boolean', 'number', 'password', 'string', 'enum', 'json', 'file'];
|
|
158626
158626
|
|
|
158627
|
-
const warned$
|
|
158627
|
+
const warned$2 = new Set();
|
|
158628
158628
|
|
|
158629
158629
|
/**
|
|
158630
158630
|
* Coerce an enum field's options into the `{ label, value }` shape
|
|
@@ -158783,8 +158783,8 @@ function cnRenderFormField({ field, value, onInput, t, error, componentMap } = {
|
|
|
158783
158783
|
// per process. It used to be taken unconditionally and silently,
|
|
158784
158784
|
// because the CommonJS lookup that fed `NcTextArea` could never
|
|
158785
158785
|
// resolve from an ESM build.
|
|
158786
|
-
if (!map['string-textarea'] && !warned$
|
|
158787
|
-
warned$
|
|
158786
|
+
if (!map['string-textarea'] && !warned$2.has('__no-nc-textarea')) {
|
|
158787
|
+
warned$2.add('__no-nc-textarea');
|
|
158788
158788
|
// eslint-disable-next-line no-console
|
|
158789
158789
|
console.warn('[cnRenderFormField] NcTextArea is unavailable from @nextcloud/vue; '
|
|
158790
158790
|
+ 'falling back to a bare <textarea> for `widget: "textarea"` fields. '
|
|
@@ -158824,8 +158824,8 @@ function cnRenderFormField({ field, value, onInput, t, error, componentMap } = {
|
|
|
158824
158824
|
}
|
|
158825
158825
|
} else if (!KNOWN_TYPES.includes(field.type)) {
|
|
158826
158826
|
// Unknown type — warn ONCE per type and fall back to NcTextField.
|
|
158827
|
-
if (!warned$
|
|
158828
|
-
warned$
|
|
158827
|
+
if (!warned$2.has(field.type)) {
|
|
158828
|
+
warned$2.add(field.type);
|
|
158829
158829
|
// eslint-disable-next-line no-console
|
|
158830
158830
|
console.warn(`[cnRenderFormField] Unknown field.type "${field.type}" for field "${field.key}". Falling back to NcTextField. Known types: ${KNOWN_TYPES.join(', ')}.`);
|
|
158831
158831
|
}
|
|
@@ -257068,7 +257068,7 @@ const __sfc_main$2l = script$2l;
|
|
|
257068
257068
|
* @spec openspec/changes/environment-banner/tasks.md#task-2
|
|
257069
257069
|
*/
|
|
257070
257070
|
|
|
257071
|
-
let warned = false;
|
|
257071
|
+
let warned$1 = false;
|
|
257072
257072
|
|
|
257073
257073
|
/**
|
|
257074
257074
|
* @param {object} options Options.
|
|
@@ -257094,8 +257094,8 @@ function useEnvironment({ environment, tenant, apiBase = '/apps/openregister/api
|
|
|
257094
257094
|
const value = response && response.data && (response.data.environment ?? (response.data.results && response.data.results.environment));
|
|
257095
257095
|
fetched.value = { ...fetched.value, [uuid]: typeof value === 'string' ? value : '' };
|
|
257096
257096
|
} catch (error) {
|
|
257097
|
-
if (!warned) {
|
|
257098
|
-
warned = true;
|
|
257097
|
+
if (!warned$1) {
|
|
257098
|
+
warned$1 = true;
|
|
257099
257099
|
// eslint-disable-next-line no-console
|
|
257100
257100
|
console.warn('[useEnvironment] The organisation could not be read, so no environment is shown.', error);
|
|
257101
257101
|
}
|
|
@@ -257390,6 +257390,19 @@ var script$2k = {
|
|
|
257390
257390
|
default: '',
|
|
257391
257391
|
},
|
|
257392
257392
|
|
|
257393
|
+
/**
|
|
257394
|
+
* Mount a tab's `tab-<id>` slot only while that tab is open, and
|
|
257395
|
+
* unmount it when another tab opens, so each visit mounts it afresh
|
|
257396
|
+
* and the page does not load every tab at once. Off (the default),
|
|
257397
|
+
* every panel stays mounted and only the open one shows.
|
|
257398
|
+
*
|
|
257399
|
+
* @spec openspec/changes/admin-settings-lazy-tabs/specs/settings-board-look/spec.md#requirement-the-admin-shell-can-mount-only-the-open-tab
|
|
257400
|
+
*/
|
|
257401
|
+
lazyTabs: {
|
|
257402
|
+
type: Boolean,
|
|
257403
|
+
default: false,
|
|
257404
|
+
},
|
|
257405
|
+
|
|
257393
257406
|
/**
|
|
257394
257407
|
* How the `tabs` strip is drawn, as CnTabs' `variant`: `line`, the
|
|
257395
257408
|
* folder tabs (the default), or `underline`, plain labels on a rule
|
|
@@ -257950,7 +257963,9 @@ function render$2k(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
257950
257963
|
class: "cn-admin-settings-shell__panel",
|
|
257951
257964
|
"data-tab": tab.id
|
|
257952
257965
|
}, [
|
|
257953
|
-
|
|
257966
|
+
(!$props.lazyTabs || tab.id === $options.activeTabId)
|
|
257967
|
+
? vue$1.renderSlot(_ctx.$slots, `tab-${tab.id}`, {}, undefined, undefined, 0)
|
|
257968
|
+
: vue$1.createCommentVNode("v-if", true)
|
|
257954
257969
|
], 8 /* PROPS */, _hoisted_11$N)
|
|
257955
257970
|
]),
|
|
257956
257971
|
_: 2 /* DYNAMIC */
|
|
@@ -258089,7 +258104,7 @@ function render$2k(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
258089
258104
|
}
|
|
258090
258105
|
|
|
258091
258106
|
script$2k.render = render$2k;
|
|
258092
|
-
script$2k.__scopeId = "data-v-
|
|
258107
|
+
script$2k.__scopeId = "data-v-038f200a";
|
|
258093
258108
|
const __sfc_main$2k = script$2k;
|
|
258094
258109
|
|
|
258095
258110
|
/**
|
|
@@ -318396,6 +318411,108 @@ script$1j.render = render$1j;
|
|
|
318396
318411
|
script$1j.__scopeId = "data-v-a78d1ec4";
|
|
318397
318412
|
const __sfc_main$1j = script$1j;
|
|
318398
318413
|
|
|
318414
|
+
/**
|
|
318415
|
+
* SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
318416
|
+
* SPDX-License-Identifier: EUPL-1.2
|
|
318417
|
+
*/
|
|
318418
|
+
|
|
318419
|
+
|
|
318420
|
+
const warned = new Set();
|
|
318421
|
+
|
|
318422
|
+
/**
|
|
318423
|
+
* Add the prop names one component options object declares, following its
|
|
318424
|
+
* `extends` and `mixins`.
|
|
318425
|
+
*
|
|
318426
|
+
* @param {object} options A component options object.
|
|
318427
|
+
* @param {Set<string>} names The set to add camelCase prop names to.
|
|
318428
|
+
* @param {number} depth Recursion guard.
|
|
318429
|
+
*/
|
|
318430
|
+
function collect(options, names, depth) {
|
|
318431
|
+
if (!options || typeof options !== 'object' || depth > 8) {
|
|
318432
|
+
return
|
|
318433
|
+
}
|
|
318434
|
+
const props = options.props;
|
|
318435
|
+
if (Array.isArray(props)) {
|
|
318436
|
+
props.forEach((name) => names.add(vue$1.camelize(String(name))));
|
|
318437
|
+
} else if (props && typeof props === 'object') {
|
|
318438
|
+
Object.keys(props).forEach((name) => names.add(vue$1.camelize(name)));
|
|
318439
|
+
}
|
|
318440
|
+
collect(options.extends, names, depth + 1);
|
|
318441
|
+
if (Array.isArray(options.mixins)) {
|
|
318442
|
+
options.mixins.forEach((mixin) => collect(mixin, names, depth + 1));
|
|
318443
|
+
}
|
|
318444
|
+
}
|
|
318445
|
+
|
|
318446
|
+
/**
|
|
318447
|
+
* The prop names a component declares, or `null` when it takes every
|
|
318448
|
+
* attribute itself and so must keep receiving all of them:
|
|
318449
|
+
* - `inheritAttrs: false`: the component forwards `$attrs` on purpose;
|
|
318450
|
+
* - a functional component without `props`: its attrs are its props;
|
|
318451
|
+
* - an async component that has not resolved yet.
|
|
318452
|
+
*
|
|
318453
|
+
* @spec openspec/changes/dashboard-declared-widget-props/specs/dashboard-page/spec.md#requirement-a-dashboard-widget-receives-only-the-content-keys-it-declares
|
|
318454
|
+
* @param {object|((...args: unknown[]) => unknown)|null} component A component definition.
|
|
318455
|
+
* @return {Set<string>|null} camelCase prop names, or null for "all".
|
|
318456
|
+
*/
|
|
318457
|
+
function declaredPropNames(component) {
|
|
318458
|
+
if (!component) {
|
|
318459
|
+
return null
|
|
318460
|
+
}
|
|
318461
|
+
if (typeof component === 'function') {
|
|
318462
|
+
if (!component.props) {
|
|
318463
|
+
return null
|
|
318464
|
+
}
|
|
318465
|
+
const names = new Set();
|
|
318466
|
+
collect({ props: component.props }, names, 0);
|
|
318467
|
+
return names
|
|
318468
|
+
}
|
|
318469
|
+
if (typeof component !== 'object') {
|
|
318470
|
+
return null
|
|
318471
|
+
}
|
|
318472
|
+
if (component.__asyncLoader) {
|
|
318473
|
+
return component.__asyncResolved ? declaredPropNames(component.__asyncResolved) : null
|
|
318474
|
+
}
|
|
318475
|
+
const chain = [component, component.extends, ...(component.mixins || [])];
|
|
318476
|
+
if (chain.some((options) => options && options.inheritAttrs === false)) {
|
|
318477
|
+
return null
|
|
318478
|
+
}
|
|
318479
|
+
const names = new Set();
|
|
318480
|
+
collect(component, names, 0);
|
|
318481
|
+
return names
|
|
318482
|
+
}
|
|
318483
|
+
|
|
318484
|
+
/**
|
|
318485
|
+
* Keep the entries of `bindings` whose key `component` declares as a prop.
|
|
318486
|
+
* A component for which {@link declaredPropNames} returns null gets every
|
|
318487
|
+
* entry. A dropped key is warned about once outside production when the
|
|
318488
|
+
* component has no `content` prop either, so the key reaches nothing.
|
|
318489
|
+
*
|
|
318490
|
+
* @spec openspec/changes/dashboard-declared-widget-props/specs/dashboard-page/spec.md#requirement-a-dashboard-widget-receives-only-the-content-keys-it-declares
|
|
318491
|
+
* @param {object|((...args: unknown[]) => unknown)|null} component The component that will receive the bindings.
|
|
318492
|
+
* @param {object} bindings The candidate bindings.
|
|
318493
|
+
* @param {string} label Names the component in the warning (for example the widget type).
|
|
318494
|
+
* @return {object} The bindings the component declares.
|
|
318495
|
+
*/
|
|
318496
|
+
function pickDeclaredProps(component, bindings, label) {
|
|
318497
|
+
const declared = declaredPropNames(component);
|
|
318498
|
+
if (!declared || !bindings || typeof bindings !== 'object') {
|
|
318499
|
+
return bindings
|
|
318500
|
+
}
|
|
318501
|
+
const out = {};
|
|
318502
|
+
for (const [key, value] of Object.entries(bindings)) {
|
|
318503
|
+
if (declared.has(vue$1.camelize(key))) {
|
|
318504
|
+
out[key] = value;
|
|
318505
|
+
continue
|
|
318506
|
+
}
|
|
318507
|
+
if (process.env.NODE_ENV !== 'production' && !declared.has('content') && !warned.has(`${label}\u0000${key}`)) {
|
|
318508
|
+
warned.add(`${label}\u0000${key}`);
|
|
318509
|
+
// eslint-disable-next-line no-console
|
|
318510
|
+
console.warn(`[nextcloud-vue] content key "${key}" is not passed to widget "${label}": it declares neither that prop nor \`content\`.`);
|
|
318511
|
+
}
|
|
318512
|
+
}
|
|
318513
|
+
return out
|
|
318514
|
+
}
|
|
318515
|
+
|
|
318399
318516
|
/** Surfaces understood by the pluggable integration registry (AD-19). */
|
|
318400
318517
|
const INTEGRATION_SURFACES = ['user-dashboard', 'app-dashboard', 'detail-page', 'single-entity'];
|
|
318401
318518
|
|
|
@@ -321041,6 +321158,23 @@ var script$1i = {
|
|
|
321041
321158
|
return outcome ? { ...content, conditionOutcome: outcome } : content
|
|
321042
321159
|
},
|
|
321043
321160
|
|
|
321161
|
+
/**
|
|
321162
|
+
* The content keys a registry widget receives as props: only the ones
|
|
321163
|
+
* its renderer declares. An undeclared key would otherwise fall through
|
|
321164
|
+
* as an attribute onto the renderer's root component and could override
|
|
321165
|
+
* a value the widget computes for it. The whole content still arrives
|
|
321166
|
+
* as `content`. A renderer that forwards its own attributes
|
|
321167
|
+
* (`inheritAttrs: false`) keeps receiving every key.
|
|
321168
|
+
*
|
|
321169
|
+
* @param {object} item Layout item.
|
|
321170
|
+
* @return {object} The bindings the renderer declares.
|
|
321171
|
+
* @spec openspec/changes/dashboard-declared-widget-props/specs/dashboard-page/spec.md#requirement-a-dashboard-widget-receives-only-the-content-keys-it-declares
|
|
321172
|
+
*/
|
|
321173
|
+
registryWidgetProps(item) {
|
|
321174
|
+
const def = this.getWidgetDef(item.widgetId);
|
|
321175
|
+
return pickDeclaredProps(this.registryRenderer(item), this.registryWidgetBindings(item), def?.type || item.widgetId)
|
|
321176
|
+
},
|
|
321177
|
+
|
|
321044
321178
|
/**
|
|
321045
321179
|
* What a container widget (registry `container`, such as `tabs`) needs
|
|
321046
321180
|
* beside its content: the page's widget definitions, so its tabs find
|
|
@@ -322681,7 +322815,7 @@ function render$1i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
322681
322815
|
(vue$1.openBlock(), vue$1.createBlock(vue$1.resolveDynamicComponent($options.registryRenderer(item)), vue$1.mergeProps({
|
|
322682
322816
|
widgetId: item.widgetId,
|
|
322683
322817
|
content: $options.registryWidgetBindings(item)
|
|
322684
|
-
}, { ref_for: true }, { ...$options.
|
|
322818
|
+
}, { ref_for: true }, { ...$options.registryWidgetProps(item), ...$options.containerBindings(item) }, {
|
|
322685
322819
|
onHeader: $event => ($options.onWidgetHeader(item, $event))
|
|
322686
322820
|
}), null, 16 /* FULL_PROPS */, ["widgetId", "content", "onHeader"]))
|
|
322687
322821
|
]),
|
|
@@ -323150,7 +323284,7 @@ function render$1i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
323150
323284
|
(vue$1.openBlock(), vue$1.createBlock(vue$1.resolveDynamicComponent($options.registryRenderer(item)), vue$1.mergeProps({
|
|
323151
323285
|
widgetId: item.widgetId,
|
|
323152
323286
|
content: $options.registryWidgetBindings(item)
|
|
323153
|
-
}, { ref_for: true }, { ...$options.
|
|
323287
|
+
}, { ref_for: true }, { ...$options.registryWidgetProps(item), ...$options.containerBindings(item), ...$options.cellChromeBindings(item) }, {
|
|
323154
323288
|
onHeader: $event => ($options.onWidgetHeader(item, $event))
|
|
323155
323289
|
}), null, 16 /* FULL_PROPS */, ["widgetId", "content", "onHeader"]))
|
|
323156
323290
|
]),
|
|
@@ -323310,7 +323444,7 @@ function render$1i(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
323310
323444
|
}
|
|
323311
323445
|
|
|
323312
323446
|
script$1i.render = render$1i;
|
|
323313
|
-
script$1i.__scopeId = "data-v-
|
|
323447
|
+
script$1i.__scopeId = "data-v-42bc14a4";
|
|
323314
323448
|
const __sfc_main$1i = script$1i;
|
|
323315
323449
|
|
|
323316
323450
|
var CnDashboardPage = /*#__PURE__*/Object.freeze({
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/dist/nextcloud-vue.cjs.js.map
|
|
3
|
-
size:
|
|
4
|
-
sha256:
|
|
3
|
+
size: 40779638 bytes
|
|
4
|
+
sha256: b171c6d90fa9da1ac7b3e057618c0102feb5c4a930845adf71bda7617ccd3073
|
package/dist/nextcloud-vue.css
CHANGED
|
@@ -34796,28 +34796,28 @@ to {
|
|
|
34796
34796
|
}
|
|
34797
34797
|
|
|
34798
34798
|
|
|
34799
|
-
.cn-admin-settings-shell[data-v-
|
|
34799
|
+
.cn-admin-settings-shell[data-v-038f200a] {
|
|
34800
34800
|
max-width: 900px;
|
|
34801
34801
|
}
|
|
34802
34802
|
|
|
34803
34803
|
/* The board look lifts the width and lays the header and cards on a grid (look-board.css). */
|
|
34804
|
-
.cn-support-info[data-v-
|
|
34804
|
+
.cn-support-info[data-v-038f200a] {
|
|
34805
34805
|
margin-top: 16px;
|
|
34806
34806
|
padding-top: 16px;
|
|
34807
34807
|
border-top: 1px solid var(--color-border);
|
|
34808
34808
|
}
|
|
34809
|
-
.cn-support-info h4[data-v-
|
|
34809
|
+
.cn-support-info h4[data-v-038f200a] {
|
|
34810
34810
|
margin: 0 0 8px 0;
|
|
34811
34811
|
font-size: 14px;
|
|
34812
34812
|
font-weight: 600;
|
|
34813
34813
|
color: var(--color-main-text);
|
|
34814
34814
|
}
|
|
34815
|
-
.cn-support-info p[data-v-
|
|
34815
|
+
.cn-support-info p[data-v-038f200a] {
|
|
34816
34816
|
margin: 4px 0;
|
|
34817
34817
|
color: var(--color-text-maxcontrast);
|
|
34818
34818
|
font-size: 14px;
|
|
34819
34819
|
}
|
|
34820
|
-
.cn-support-info a[data-v-
|
|
34820
|
+
.cn-support-info a[data-v-038f200a] {
|
|
34821
34821
|
color: var(--color-primary-element);
|
|
34822
34822
|
}
|
|
34823
34823
|
|
|
@@ -38458,7 +38458,7 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38458
38458
|
}
|
|
38459
38459
|
|
|
38460
38460
|
|
|
38461
|
-
.cn-dashboard-page[data-v-
|
|
38461
|
+
.cn-dashboard-page[data-v-42bc14a4] {
|
|
38462
38462
|
padding: 20px;
|
|
38463
38463
|
max-width: 1800px;
|
|
38464
38464
|
/* Centre the leftover space once the cap engages, so a wide screen shows
|
|
@@ -38472,7 +38472,7 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38472
38472
|
overflow-y: auto;
|
|
38473
38473
|
box-sizing: border-box;
|
|
38474
38474
|
}
|
|
38475
|
-
.cn-dashboard-page__header[data-v-
|
|
38475
|
+
.cn-dashboard-page__header[data-v-42bc14a4] {
|
|
38476
38476
|
display: flex;
|
|
38477
38477
|
justify-content: space-between;
|
|
38478
38478
|
align-items: flex-start;
|
|
@@ -38484,21 +38484,21 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38484
38484
|
room. Only the HEADER shifts right — body widgets keep full width. */
|
|
38485
38485
|
padding-inline-start: 56px;
|
|
38486
38486
|
}
|
|
38487
|
-
.cn-dashboard-page__header-left[data-v-
|
|
38487
|
+
.cn-dashboard-page__header-left[data-v-42bc14a4] {
|
|
38488
38488
|
min-width: 0;
|
|
38489
38489
|
}
|
|
38490
|
-
.cn-dashboard-page__title-row[data-v-
|
|
38490
|
+
.cn-dashboard-page__title-row[data-v-42bc14a4] {
|
|
38491
38491
|
display: flex;
|
|
38492
38492
|
align-items: center;
|
|
38493
38493
|
flex-wrap: wrap;
|
|
38494
38494
|
gap: 12px;
|
|
38495
38495
|
}
|
|
38496
|
-
.cn-dashboard-page__title[data-v-
|
|
38496
|
+
.cn-dashboard-page__title[data-v-42bc14a4] {
|
|
38497
38497
|
margin: 0;
|
|
38498
38498
|
font-size: 20px;
|
|
38499
38499
|
font-weight: 700;
|
|
38500
38500
|
}
|
|
38501
|
-
.cn-dashboard-page__description[data-v-
|
|
38501
|
+
.cn-dashboard-page__description[data-v-42bc14a4] {
|
|
38502
38502
|
margin: 4px 0 0;
|
|
38503
38503
|
font-size: 14px;
|
|
38504
38504
|
color: var(--color-text-maxcontrast);
|
|
@@ -38506,19 +38506,19 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38506
38506
|
|
|
38507
38507
|
/* Board look (screens-dashboard-parity): h1 28/700, a 15px grey subtitle 6px
|
|
38508
38508
|
under it, and 40px buttons with a 10px gap. */
|
|
38509
|
-
.cn-dashboard-page--board .cn-dashboard-page__title[data-v-
|
|
38509
|
+
.cn-dashboard-page--board .cn-dashboard-page__title[data-v-42bc14a4] {
|
|
38510
38510
|
font-size: 28px;
|
|
38511
38511
|
font-weight: 700;
|
|
38512
38512
|
line-height: 1.2;
|
|
38513
38513
|
}
|
|
38514
|
-
.cn-dashboard-page--board .cn-dashboard-page__description[data-v-
|
|
38514
|
+
.cn-dashboard-page--board .cn-dashboard-page__description[data-v-42bc14a4] {
|
|
38515
38515
|
margin: 6px 0 0;
|
|
38516
38516
|
font-size: 15px;
|
|
38517
38517
|
}
|
|
38518
|
-
.cn-dashboard-page--board .cn-dashboard-page__header-actions[data-v-
|
|
38518
|
+
.cn-dashboard-page--board .cn-dashboard-page__header-actions[data-v-42bc14a4] {
|
|
38519
38519
|
gap: 10px;
|
|
38520
38520
|
}
|
|
38521
|
-
.cn-dashboard-page--board .cn-dashboard-page__header-actions[data-v-
|
|
38521
|
+
.cn-dashboard-page--board .cn-dashboard-page__header-actions[data-v-42bc14a4] .button-vue {
|
|
38522
38522
|
min-height: var(--cn-board-control-height, 40px);
|
|
38523
38523
|
height: var(--cn-board-control-height, 40px);
|
|
38524
38524
|
}
|
|
@@ -38526,17 +38526,17 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38526
38526
|
/* The switch row under the header (screens-dashboard-greeting-header): the
|
|
38527
38527
|
view switch left, the `viewLinks` pills right (DqMijnWerk: pills 34px high,
|
|
38528
38528
|
radius 17, 13px/600, a 14px icon, primary light on primary deep). */
|
|
38529
|
-
.cn-dashboard-page__switch-row[data-v-
|
|
38529
|
+
.cn-dashboard-page__switch-row[data-v-42bc14a4] {
|
|
38530
38530
|
display: flex;
|
|
38531
38531
|
flex-wrap: wrap;
|
|
38532
38532
|
align-items: center;
|
|
38533
38533
|
gap: 10px;
|
|
38534
38534
|
margin-bottom: var(--cn-board-section-gap, 20px);
|
|
38535
38535
|
}
|
|
38536
|
-
.cn-dashboard-page__switch-row-spacer[data-v-
|
|
38536
|
+
.cn-dashboard-page__switch-row-spacer[data-v-42bc14a4] {
|
|
38537
38537
|
flex: 1 1 auto;
|
|
38538
38538
|
}
|
|
38539
|
-
.cn-dashboard-page__view-link[data-v-
|
|
38539
|
+
.cn-dashboard-page__view-link[data-v-42bc14a4] {
|
|
38540
38540
|
display: inline-flex;
|
|
38541
38541
|
align-items: center;
|
|
38542
38542
|
gap: 6px;
|
|
@@ -38550,36 +38550,36 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38550
38550
|
white-space: nowrap;
|
|
38551
38551
|
text-decoration: none !important;
|
|
38552
38552
|
}
|
|
38553
|
-
.cn-dashboard-page__view-link[data-v-
|
|
38553
|
+
.cn-dashboard-page__view-link[data-v-42bc14a4]:hover {
|
|
38554
38554
|
background: var(--color-primary-element-light-hover, var(--color-primary-element-light));
|
|
38555
38555
|
}
|
|
38556
|
-
.cn-dashboard-page__view-link[data-v-
|
|
38556
|
+
.cn-dashboard-page__view-link[data-v-42bc14a4]:focus-visible {
|
|
38557
38557
|
outline: 2px solid var(--color-main-text);
|
|
38558
38558
|
outline-offset: 2px;
|
|
38559
38559
|
}
|
|
38560
|
-
.cn-dashboard-page__view-link-icon[data-v-
|
|
38560
|
+
.cn-dashboard-page__view-link-icon[data-v-42bc14a4] {
|
|
38561
38561
|
display: inline-flex;
|
|
38562
38562
|
}
|
|
38563
38563
|
|
|
38564
38564
|
/* The period group, in a row of its own between the header and the KPI row. */
|
|
38565
|
-
.cn-dashboard-page__date-range--segmented[data-v-
|
|
38565
|
+
.cn-dashboard-page__date-range--segmented[data-v-42bc14a4] {
|
|
38566
38566
|
margin-bottom: 16px;
|
|
38567
38567
|
}
|
|
38568
|
-
.cn-dashboard-page__date-segmented[data-v-
|
|
38568
|
+
.cn-dashboard-page__date-segmented[data-v-42bc14a4] {
|
|
38569
38569
|
display: flex;
|
|
38570
38570
|
align-items: center;
|
|
38571
38571
|
gap: 8px;
|
|
38572
38572
|
}
|
|
38573
38573
|
|
|
38574
38574
|
/* The KPI row above the grid: tiles are cells of the auto-fit grid. */
|
|
38575
|
-
.cn-dashboard-page__kpi-row[data-v-
|
|
38575
|
+
.cn-dashboard-page__kpi-row[data-v-42bc14a4] {
|
|
38576
38576
|
margin-bottom: var(--cn-board-section-gap, 16px);
|
|
38577
38577
|
}
|
|
38578
|
-
.cn-dashboard-page__kpi-cell[data-v-
|
|
38578
|
+
.cn-dashboard-page__kpi-cell[data-v-42bc14a4] {
|
|
38579
38579
|
display: flex;
|
|
38580
38580
|
min-width: 0;
|
|
38581
38581
|
}
|
|
38582
|
-
.cn-dashboard-page__kpi-cell[data-v-
|
|
38582
|
+
.cn-dashboard-page__kpi-cell[data-v-42bc14a4] > * {
|
|
38583
38583
|
flex: 1 1 auto;
|
|
38584
38584
|
min-width: 0;
|
|
38585
38585
|
}
|
|
@@ -38592,7 +38592,7 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38592
38592
|
scoped chip rules then silently don't match and the chip collapses into
|
|
38593
38593
|
NcActions' ~30px icon slot (text wraps to "Last / 30 / days"). The
|
|
38594
38594
|
data-testid is stable across chunks, so those rules match regardless. */
|
|
38595
|
-
.cn-dashboard-page__header-actions[data-v-
|
|
38595
|
+
.cn-dashboard-page__header-actions[data-v-42bc14a4] {
|
|
38596
38596
|
display: flex;
|
|
38597
38597
|
align-items: center;
|
|
38598
38598
|
gap: 8px;
|
|
@@ -38608,19 +38608,19 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38608
38608
|
|
|
38609
38609
|
/* Date-range header band. Kept compact so it doesn't open a tall gap
|
|
38610
38610
|
above the grid; the pills variant is a single tidy toggle row. */
|
|
38611
|
-
.cn-dashboard-page__date-range[data-v-
|
|
38611
|
+
.cn-dashboard-page__date-range[data-v-42bc14a4] {
|
|
38612
38612
|
margin-bottom: 12px;
|
|
38613
38613
|
}
|
|
38614
|
-
.cn-dashboard-page__date-range--pills[data-v-
|
|
38614
|
+
.cn-dashboard-page__date-range--pills[data-v-42bc14a4] {
|
|
38615
38615
|
margin-bottom: 8px;
|
|
38616
38616
|
}
|
|
38617
|
-
.cn-dashboard-page__date-pills[data-v-
|
|
38617
|
+
.cn-dashboard-page__date-pills[data-v-42bc14a4] {
|
|
38618
38618
|
display: flex;
|
|
38619
38619
|
align-items: center;
|
|
38620
38620
|
flex-wrap: wrap;
|
|
38621
38621
|
gap: 6px;
|
|
38622
38622
|
}
|
|
38623
|
-
.cn-dashboard-page__date-pill[data-v-
|
|
38623
|
+
.cn-dashboard-page__date-pill[data-v-42bc14a4] {
|
|
38624
38624
|
display: inline-flex;
|
|
38625
38625
|
align-items: center;
|
|
38626
38626
|
padding: 5px 14px;
|
|
@@ -38635,77 +38635,77 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38635
38635
|
cursor: pointer;
|
|
38636
38636
|
transition: background-color 100ms ease, border-color 100ms ease, color 100ms ease;
|
|
38637
38637
|
}
|
|
38638
|
-
.cn-dashboard-page__date-pill[data-v-
|
|
38638
|
+
.cn-dashboard-page__date-pill[data-v-42bc14a4]:hover {
|
|
38639
38639
|
background: var(--color-background-hover);
|
|
38640
38640
|
}
|
|
38641
|
-
.cn-dashboard-page__date-pill[data-v-
|
|
38641
|
+
.cn-dashboard-page__date-pill[data-v-42bc14a4]:focus-visible {
|
|
38642
38642
|
outline: 2px solid var(--color-primary-element);
|
|
38643
38643
|
outline-offset: 2px;
|
|
38644
38644
|
}
|
|
38645
|
-
.cn-dashboard-page__date-pill--active[data-v-
|
|
38645
|
+
.cn-dashboard-page__date-pill--active[data-v-42bc14a4] {
|
|
38646
38646
|
background: var(--color-primary-element);
|
|
38647
38647
|
border-color: var(--color-primary-element);
|
|
38648
38648
|
color: var(--color-primary-element-text);
|
|
38649
38649
|
}
|
|
38650
|
-
.cn-dashboard-page__date-pill--active[data-v-
|
|
38650
|
+
.cn-dashboard-page__date-pill--active[data-v-42bc14a4]:hover {
|
|
38651
38651
|
background: var(--color-primary-element-hover, var(--color-primary-element));
|
|
38652
38652
|
}
|
|
38653
38653
|
|
|
38654
38654
|
/* The custom-range pill is de-emphasised — dashed outline, muted text —
|
|
38655
38655
|
so it reads as an escape hatch rather than a primary option. */
|
|
38656
|
-
.cn-dashboard-page__date-pill--custom[data-v-
|
|
38656
|
+
.cn-dashboard-page__date-pill--custom[data-v-42bc14a4] {
|
|
38657
38657
|
border-style: dashed;
|
|
38658
38658
|
color: var(--color-text-maxcontrast);
|
|
38659
38659
|
}
|
|
38660
|
-
.cn-dashboard-page__date-pill-custom[data-v-
|
|
38660
|
+
.cn-dashboard-page__date-pill-custom[data-v-42bc14a4] .action-item__menutoggle {
|
|
38661
38661
|
min-width: 0;
|
|
38662
38662
|
min-height: 0;
|
|
38663
38663
|
padding: 0;
|
|
38664
38664
|
background: transparent;
|
|
38665
38665
|
border: none;
|
|
38666
38666
|
}
|
|
38667
|
-
.cn-dashboard-page__date-pill-custom[data-v-
|
|
38668
|
-
.cn-dashboard-page__date-pill-custom[data-v-
|
|
38669
|
-
.cn-dashboard-page__date-pill-custom[data-v-
|
|
38667
|
+
.cn-dashboard-page__date-pill-custom[data-v-42bc14a4] .button-vue,
|
|
38668
|
+
.cn-dashboard-page__date-pill-custom[data-v-42bc14a4] .button-vue__wrapper,
|
|
38669
|
+
.cn-dashboard-page__date-pill-custom[data-v-42bc14a4] .button-vue__icon {
|
|
38670
38670
|
width: auto !important;
|
|
38671
38671
|
min-width: 0 !important;
|
|
38672
38672
|
overflow: visible !important;
|
|
38673
38673
|
}
|
|
38674
|
-
.cn-dashboard-page__empty[data-v-
|
|
38674
|
+
.cn-dashboard-page__empty[data-v-42bc14a4] {
|
|
38675
38675
|
padding: 60px 20px;
|
|
38676
38676
|
}
|
|
38677
38677
|
|
|
38678
38678
|
/* The page's view switch on a page without a header row: at the end of its
|
|
38679
38679
|
own row, above the grids, where the header would have put it. */
|
|
38680
|
-
.cn-dashboard-page__view-switch[data-v-
|
|
38680
|
+
.cn-dashboard-page__view-switch[data-v-42bc14a4] {
|
|
38681
38681
|
display: flex;
|
|
38682
38682
|
justify-content: flex-end;
|
|
38683
38683
|
margin-bottom: 12px;
|
|
38684
38684
|
}
|
|
38685
38685
|
|
|
38686
38686
|
/* A view the switch shows with nothing to draw. */
|
|
38687
|
-
.cn-page-view-region--empty[data-v-
|
|
38687
|
+
.cn-page-view-region--empty[data-v-42bc14a4] {
|
|
38688
38688
|
padding: 40px 20px;
|
|
38689
38689
|
}
|
|
38690
|
-
.cn-dashboard-page__page-filters[data-v-
|
|
38690
|
+
.cn-dashboard-page__page-filters[data-v-42bc14a4] {
|
|
38691
38691
|
display: flex;
|
|
38692
38692
|
flex-wrap: wrap;
|
|
38693
38693
|
gap: 16px;
|
|
38694
38694
|
align-items: flex-end;
|
|
38695
38695
|
margin-bottom: 12px;
|
|
38696
38696
|
}
|
|
38697
|
-
.cn-dashboard-page__page-filter[data-v-
|
|
38697
|
+
.cn-dashboard-page__page-filter[data-v-42bc14a4] {
|
|
38698
38698
|
display: flex;
|
|
38699
38699
|
flex-direction: column;
|
|
38700
38700
|
gap: 4px;
|
|
38701
38701
|
min-width: 200px;
|
|
38702
38702
|
}
|
|
38703
|
-
.cn-dashboard-page__page-filter-label[data-v-
|
|
38703
|
+
.cn-dashboard-page__page-filter-label[data-v-42bc14a4] {
|
|
38704
38704
|
font-size: 0.85em;
|
|
38705
38705
|
font-weight: 600;
|
|
38706
38706
|
color: var(--color-text-maxcontrast);
|
|
38707
38707
|
}
|
|
38708
|
-
.cn-dashboard-page__widget-edit[data-v-
|
|
38708
|
+
.cn-dashboard-page__widget-edit[data-v-42bc14a4] {
|
|
38709
38709
|
position: absolute;
|
|
38710
38710
|
top: 4px;
|
|
38711
38711
|
inset-inline-end: 4px;
|
|
@@ -38724,8 +38724,8 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38724
38724
|
and centre the card. */
|
|
38725
38725
|
/* `safe` centre so an overflowing tile does not spill out of the top, where
|
|
38726
38726
|
flex overflow cannot be scrolled back to. Same as detail-page.css. */
|
|
38727
|
-
.cn-dashboard-page__card-fit[data-v-
|
|
38728
|
-
.cn-dashboard-page__card-fit.cn-widget-wrapper--flush[data-v-
|
|
38727
|
+
.cn-dashboard-page__card-fit[data-v-42bc14a4] .cn-widget-wrapper__content,
|
|
38728
|
+
.cn-dashboard-page__card-fit.cn-widget-wrapper--flush[data-v-42bc14a4] .cn-widget-wrapper__content {
|
|
38729
38729
|
overflow: hidden;
|
|
38730
38730
|
display: flex;
|
|
38731
38731
|
flex-direction: column;
|
|
@@ -38741,7 +38741,7 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38741
38741
|
shows up as a scrollbar the user has to drag to see the whole graph. Same
|
|
38742
38742
|
shape as the card-fit rule above, minus the padding: chart tiles render
|
|
38743
38743
|
`flush`, and apexcharts already draws its own margins. */
|
|
38744
|
-
.cn-dashboard-page__chart-fit[data-v-
|
|
38744
|
+
.cn-dashboard-page__chart-fit[data-v-42bc14a4] .cn-widget-wrapper__content {
|
|
38745
38745
|
overflow: hidden;
|
|
38746
38746
|
display: flex;
|
|
38747
38747
|
flex-direction: column;
|
|
@@ -38751,13 +38751,13 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38751
38751
|
/* Card content (stat / gauge / delta) must fit the tile width: let the
|
|
38752
38752
|
widget shrink and its value/label truncate instead of pushing past the
|
|
38753
38753
|
tile edge (the horizontal clip on long currency values). */
|
|
38754
|
-
.cn-dashboard-page__card-fit[data-v-
|
|
38755
|
-
.cn-dashboard-page__card-fit[data-v-
|
|
38756
|
-
.cn-dashboard-page__card-fit[data-v-
|
|
38754
|
+
.cn-dashboard-page__card-fit[data-v-42bc14a4] .cn-stat-widget,
|
|
38755
|
+
.cn-dashboard-page__card-fit[data-v-42bc14a4] .cn-gauge-widget,
|
|
38756
|
+
.cn-dashboard-page__card-fit[data-v-42bc14a4] .cn-delta-widget {
|
|
38757
38757
|
min-width: 0;
|
|
38758
38758
|
max-width: 100%;
|
|
38759
38759
|
}
|
|
38760
|
-
.cn-dashboard-page__unknown[data-v-
|
|
38760
|
+
.cn-dashboard-page__unknown[data-v-42bc14a4] {
|
|
38761
38761
|
display: flex;
|
|
38762
38762
|
align-items: center;
|
|
38763
38763
|
justify-content: center;
|
|
@@ -38768,29 +38768,29 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38768
38768
|
}
|
|
38769
38769
|
|
|
38770
38770
|
/* widget-ref content items */
|
|
38771
|
-
.cn-dashboard-page__content[data-v-
|
|
38771
|
+
.cn-dashboard-page__content[data-v-42bc14a4] {
|
|
38772
38772
|
display: flex;
|
|
38773
38773
|
flex-direction: column;
|
|
38774
38774
|
gap: 16px;
|
|
38775
38775
|
}
|
|
38776
|
-
.cn-dashboard-page__content-item[data-v-
|
|
38776
|
+
.cn-dashboard-page__content-item[data-v-42bc14a4] {
|
|
38777
38777
|
width: 100%;
|
|
38778
38778
|
}
|
|
38779
38779
|
/* On a phone (screens-dashboard-phone) the touch targets of a board dashboard
|
|
38780
38780
|
are 44px: the widget Actions menu and the KPI tiles. */
|
|
38781
38781
|
@media (max-width: 640px) {
|
|
38782
|
-
.cn-dashboard-page--board[data-v-
|
|
38783
|
-
.cn-dashboard-page--board[data-v-
|
|
38782
|
+
.cn-dashboard-page--board[data-v-42bc14a4] .cn-widget-wrapper__actions .action-item__menutoggle,
|
|
38783
|
+
.cn-dashboard-page--board[data-v-42bc14a4] .cn-widget-wrapper__actions .button-vue {
|
|
38784
38784
|
min-height: 44px;
|
|
38785
38785
|
}
|
|
38786
|
-
.cn-dashboard-page--board .cn-dashboard-page__kpi-cell[data-v-
|
|
38786
|
+
.cn-dashboard-page--board .cn-dashboard-page__kpi-cell[data-v-42bc14a4] {
|
|
38787
38787
|
min-height: 44px;
|
|
38788
38788
|
}
|
|
38789
38789
|
}
|
|
38790
38790
|
|
|
38791
38791
|
/* What a registry widget reports for its card header (`header` event): the
|
|
38792
38792
|
note beside the link ("3 in total") and one action, as on a detail page. */
|
|
38793
|
-
.cn-dashboard-page__widget-count[data-v-
|
|
38793
|
+
.cn-dashboard-page__widget-count[data-v-42bc14a4] {
|
|
38794
38794
|
align-self: center;
|
|
38795
38795
|
padding: 1px 8px;
|
|
38796
38796
|
border-radius: 10px;
|
|
@@ -38799,13 +38799,13 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38799
38799
|
font-size: 13px;
|
|
38800
38800
|
font-weight: 600;
|
|
38801
38801
|
}
|
|
38802
|
-
.cn-dashboard-page__widget-note[data-v-
|
|
38802
|
+
.cn-dashboard-page__widget-note[data-v-42bc14a4] {
|
|
38803
38803
|
align-self: center;
|
|
38804
38804
|
color: var(--color-text-maxcontrast);
|
|
38805
38805
|
font-size: 14px;
|
|
38806
38806
|
white-space: nowrap;
|
|
38807
38807
|
}
|
|
38808
|
-
.cn-dashboard-page__widget-action[data-v-
|
|
38808
|
+
.cn-dashboard-page__widget-action[data-v-42bc14a4] {
|
|
38809
38809
|
display: inline-flex;
|
|
38810
38810
|
align-items: center;
|
|
38811
38811
|
align-self: center;
|
|
@@ -38821,7 +38821,7 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38821
38821
|
white-space: nowrap;
|
|
38822
38822
|
cursor: pointer;
|
|
38823
38823
|
}
|
|
38824
|
-
.cn-dashboard-page__widget-action[data-v-
|
|
38824
|
+
.cn-dashboard-page__widget-action[data-v-42bc14a4]:focus-visible {
|
|
38825
38825
|
outline: 2px solid var(--color-primary-element);
|
|
38826
38826
|
outline-offset: 2px;
|
|
38827
38827
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@conduction/nextcloud-vue",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.90.0",
|
|
4
4
|
"description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
|
|
5
5
|
"homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
|
|
6
6
|
"bugs": {
|