@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.
@@ -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$2 = [];
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$2.indexOf(part) > -1)
51284
+ if (warned$3.indexOf(part) > -1)
51285
51285
  return;
51286
- warned$2.push(part);
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$1 = new Set();
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$1.has('__no-nc-textarea')) {
158787
- warned$1.add('__no-nc-textarea');
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$1.has(field.type)) {
158828
- warned$1.add(field.type);
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
- vue$1.renderSlot(_ctx.$slots, `tab-${tab.id}`)
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-c3ceda64";
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.registryWidgetBindings(item), ...$options.containerBindings(item) }, {
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.registryWidgetBindings(item), ...$options.containerBindings(item), ...$options.cellChromeBindings(item) }, {
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-20ca81f3";
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: 40768932 bytes
4
- sha256: 5eaf232e7473c7af37c95cfc8b0839550069002fa540192d0ea4b88131fbc06d
3
+ size: 40779638 bytes
4
+ sha256: b171c6d90fa9da1ac7b3e057618c0102feb5c4a930845adf71bda7617ccd3073
@@ -34796,28 +34796,28 @@ to {
34796
34796
  }
34797
34797
 
34798
34798
 
34799
- .cn-admin-settings-shell[data-v-c3ceda64] {
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-c3ceda64] {
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-c3ceda64] {
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-c3ceda64] {
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-c3ceda64] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
38487
+ .cn-dashboard-page__header-left[data-v-42bc14a4] {
38488
38488
  min-width: 0;
38489
38489
  }
38490
- .cn-dashboard-page__title-row[data-v-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] .button-vue {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3]:hover {
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-20ca81f3]:focus-visible {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] > * {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3]:hover {
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-20ca81f3]:focus-visible {
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-20ca81f3] {
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-20ca81f3]:hover {
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-20ca81f3] {
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-20ca81f3] .action-item__menutoggle {
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-20ca81f3] .button-vue,
38668
- .cn-dashboard-page__date-pill-custom[data-v-20ca81f3] .button-vue__wrapper,
38669
- .cn-dashboard-page__date-pill-custom[data-v-20ca81f3] .button-vue__icon {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
38687
+ .cn-page-view-region--empty[data-v-42bc14a4] {
38688
38688
  padding: 40px 20px;
38689
38689
  }
38690
- .cn-dashboard-page__page-filters[data-v-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] .cn-widget-wrapper__content,
38728
- .cn-dashboard-page__card-fit.cn-widget-wrapper--flush[data-v-20ca81f3] .cn-widget-wrapper__content {
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-20ca81f3] .cn-widget-wrapper__content {
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-20ca81f3] .cn-stat-widget,
38755
- .cn-dashboard-page__card-fit[data-v-20ca81f3] .cn-gauge-widget,
38756
- .cn-dashboard-page__card-fit[data-v-20ca81f3] .cn-delta-widget {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] .cn-widget-wrapper__actions .action-item__menutoggle,
38783
- .cn-dashboard-page--board[data-v-20ca81f3] .cn-widget-wrapper__actions .button-vue {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3] {
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-20ca81f3]:focus-visible {
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.89.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": {