eco-vue-js 0.26.30 → 0.26.31

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.
@@ -7,6 +7,13 @@ import { Selection } from '../../utils/useSelected';
7
7
  import { ListMode } from '../../utils/utils';
8
8
  declare const __VLS_export: <Data extends DefaultData, QueryParams, Fields extends ListFields<Data, QueryParams>, CardColumns extends readonly GridCol[]>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
9
9
  props: import('vue').PublicProps & __VLS_PrettifyLocal<{
10
+ /**
11
+ * Heading of the list, as a section's: the list is a section of its own on the page, and a part of a section or a
12
+ * modal, with a smaller heading and a line above it after other content. The `title` slot replaces it.
13
+ */
14
+ title?: string;
15
+ /** A line under the heading on what the list holds. The `description` slot replaces it. */
16
+ description?: string;
10
17
  /** Total number of items, when known in advance. Sizes the skeleton and the select-all. Defaults to the count the query returns. */
11
18
  count?: number;
12
19
  /** Field components, one per column, each with a `meta` export for its title, label, ordering field and classes. A meta with `fields` groups nested fields. */
@@ -114,7 +121,13 @@ declare const __VLS_export: <Data extends DefaultData, QueryParams, Fields exten
114
121
  expose: (exposed: {}) => void;
115
122
  attrs: any;
116
123
  slots: {
117
- /** Content above the selection bar, with the count returned by the query. */
124
+ /** Heading of the list, in place of `title`, with the count returned by the query. */
125
+ title?: (props: {
126
+ count: number | undefined;
127
+ }) => void;
128
+ /** Line under the heading, in place of `description`. */
129
+ description?: () => void;
130
+ /** Content above the selection bar, under the heading, with the count returned by the query. */
118
131
  header?: (props: {
119
132
  count: number | undefined;
120
133
  }) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"WList.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/List/WList.vue"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WList.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/List/WList.vue"],"names":[],"mappings":"AAqQA;AAyuBA,OAAO,KAAK,EAAC,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAc,kBAAkB,EAAe,cAAc,EAAE,OAAO,EAAkB,UAAU,EAAE,aAAa,EAAC,MAAM,SAAS,CAAA;AACzM,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAA;AAczC,OAAO,EAAC,KAAK,mBAAmB,EAAc,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAAC,KAAK,SAAS,EAAgC,MAAM,qBAAqB,CAAA;AACjF,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAA;AAYtC,QAAA,MAAM,YAAY,GAAK,IAAI,SAAS,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,WAAW,SAAS,SAAS,OAAO,EAAE,EACjJ,aAAa,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAC9D,YAAY,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,EAC3G,gBAAgB,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,EAClE;WAijCO,OAAO,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;QA7iCpD;;;WAGG;gBACK,MAAM;QACd,2FAA2F;sBAC7E,MAAM;QACpB,oIAAoI;gBAC5H,MAAM;QACd,+JAA+J;gBACvJ,MAAM;QACd,uHAAuH;oBAC3G,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC;QACjD,iDAAiD;oBACrC,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QACjE,qEAAqE;2BAClD,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QACxE,6GAA6G;qBAChG,WAAW;QACxB,oCAAoC;uBACrB,mBAAmB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3D,gGAAgG;6BAC3E,MAAM;QAC3B,4EAA4E;wBAC5D,MAAM;QACtB,+MAA+M;eACxM,aAAa,CAAC,WAAW,CAAC,EAAE;QACnC,6FAA6F;iBACpF,eAAe,CAAC,WAAW,CAAC,EAAE;QACvC,yHAAyH;eAClH,aAAa,CAAC,IAAI,CAAC,EAAE;QAC5B,mCAAmC;yBAClB,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO;QACxC,0CAA0C;oBAC9B,MAAM;QAClB,wCAAwC;2BACrB,MAAM;QACzB,8DAA8D;6BACzC,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM;QACnE,sCAAsC;oBAC1B,OAAO;QACnB,4EAA4E;mBACjE,MAAM;QACjB,mGAAmG;0BACjF,cAAc,CAAC,MAAM,CAAC;QACxC,qFAAqF;sBACvE,QAAQ;QACtB,iRAAiR;mBACtQ,OAAO;QAClB,uEAAuE;sBACzD,OAAO;QACrB,mKAAmK;mBACxJ,OAAO;QAClB,wEAAwE;qBAC3D,OAAO;QACpB,iKAAiK;0BAC/I,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS;QACnE,sDAAsD;uBACvC,YAAY,CAAC,IAAI,EAAE,CAAC;QACnC,4GAA4G;kBAClG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,KAAK,OAAO;QACvC,sCAAsC;qBACzB,WAAW;QACxB,yKAAyK;mBAC9J,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;QACnD,4BAA4B;iBACnB,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS;QACpD,6CAA6C;oBACjC,OAAO;QACnB,qFAAqF;2BAClE,OAAO;QAC1B,gCAAgC;oBACpB,OAAO;QACnB,qDAAqD;0BACnC,MAAM;QACxB,yFAAyF;0BACvE,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/D,iCAAiC;yBAChB,MAAM;QACvB,4FAA4F;wBAC5E,OAAO;QACvB,+JAA+J;uBAChJ,OAAO;QACtB,yHAAyH;oBAC7G,SAAS,CAAC,MAAM,CAAC;QAC7B,uFAAuF;yBACtE,OAAO;QACxB,mJAAmJ;oBACvI,OAAO;QACnB,kHAAkH;qBACrG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM;QAClD,8DAA8D;iBACrD,OAAO;QAChB,oDAAoD;wBACpC,OAAO;QACvB,wFAAwF;qBAC3E,OAAO;QACpB,iGAAiG;4BAC7E,OAAO;;;;;;;;;;KA28B4D,CAAC,GAAG,CAAC,OAAO,UAAU,SAAS;QAAE,oBAAoB,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YAC5J,CAAC,OAAO,EAAE,EAAE,KAAK,IAAI;WACtB,GAAG;;QA95BT,sFAAsF;gBAC9E,CAAC,KAAK,EAAE;YAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;SAAC,KAAK,IAAI;QACpD,yDAAyD;sBAC3C,MAAM,IAAI;QACxB,gGAAgG;iBACvF,CAAC,KAAK,EAAE;YAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;SAAC,KAAK,IAAI;QACrD,yTAAyT;iBAChT,MAAM,IAAI;QACnB,8GAA8G;oBAClG,MAAM,IAAI;QACtB,oRAAoR;gBAC5Q,CAAC,KAAK,EAAE;YAAC,IAAI,EAAE,IAAI,CAAC;YAAC,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAA;SAAC,KAAK,IAAI;QACpF,iEAAiE;gBACzD,MAAM,IAAI;QAClB,qLAAqL;gBAC7K,CAAC,KAAK,EAAE;YAAC,KAAK,EAAE,KAAK,CAAC;YAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YAAC,UAAU,EAAE,OAAO,CAAA;SAAC,KAAK,IAAI;;;YA5BpF,cAAc,SAAS,QAAQ,GAAG,IAAI;YAEtC,cAAc,SAAS,gBAAgB,CAAC,IAAI,CAAC,GAAG,IAAI;YAEpD,qBAAqB,SAAS,WAAW,GAAG,IAAI;YAEhD,cAAc,SAAS,MAAM,GAAG,SAAS,GAAG,IAAI;YAEhD,kBAAkB,SAAS,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;;EAu6BrD,KACQ,OAAO,KAAK,EAAE,KAAK,GAAG;IAAE,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAA;CAAI,CAAC;wBACpE,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,CAAC,GAAG,EAAE,CAAC"}
@@ -2,6 +2,7 @@ import WEmptyComponent_default from "../EmptyComponent/WEmptyComponent.vue.js";
2
2
  import WInfiniteList_default from "../InfiniteList/WInfiniteList.vue.js";
3
3
  import { wScrollingElement } from "../InfiniteList/models/injection.js";
4
4
  import { wIsModal } from "../Modal/models/injection.js";
5
+ import SectionHeading_default from "../Surface/components/SectionHeading.vue.js";
5
6
  import { wSectionNested } from "../Surface/models/injection.js";
6
7
  import { useIsMobile } from "../../utils/mobile.js";
7
8
  import { encodeOrdering, parseOrdering } from "../../utils/order.js";
@@ -18,7 +19,7 @@ import { isField } from "./models/utils.js";
18
19
  import "./types.js";
19
20
  import { filterFields, forEachField, getFieldStylesSticky, getFieldTracks, sortFieldsDeep, useListConfig } from "./use/useListConfig.js";
20
21
  import { usePageTableMark, useStickyPath } from "./use/useStickyPath.js";
21
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createVNode, defineComponent, guardReactiveProps, inject, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onMounted, openBlock, provide, ref, renderList, renderSlot, resolveDynamicComponent, toRef, unref, useTemplateRef, watch, watchEffect, withCtx } from "vue";
22
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createVNode, defineComponent, guardReactiveProps, inject, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onMounted, openBlock, provide, ref, renderList, renderSlot, resolveDynamicComponent, toRef, unref, useSlots, useTemplateRef, watch, watchEffect, withCtx } from "vue";
22
23
  // src/components/List/WList.vue?vue&type=script&setup=true&lang.ts
23
24
  var _hoisted_1 = { class: "w-list-page-strip" };
24
25
  var _hoisted_2 = { class: "w-list-page-strip-track" };
@@ -26,6 +27,8 @@ var WList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
26
27
  inheritAttrs: false,
27
28
  __name: "WList",
28
29
  props: {
30
+ title: { default: void 0 },
31
+ description: { default: void 0 },
29
32
  count: { default: void 0 },
30
33
  fields: {},
31
34
  expansion: {
@@ -114,6 +117,9 @@ var WList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
114
117
  const isPage = !isModal && inject(wScrollingElement, null) === null && !isSectionNested;
115
118
  const frame = isPage ? inject(wListPageFrame, null) : null;
116
119
  const isPageOwn = isPage && !frame;
120
+ const slots = useSlots();
121
+ const hasHeading = computed(() => !!(props.title || props.description || slots.title || slots.description));
122
+ const isHeadingNested = !isPageOwn;
117
123
  provide(wListPageFrame, null);
118
124
  provide(wListPageFrameHeader, frame ? {
119
125
  target: computed(() => frame.shown.value ? frame.target.value : null),
@@ -290,7 +296,8 @@ var WList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
290
296
  class: normalizeClass([listClasses.value, {
291
297
  "w-list-page": unref(isPageOwn),
292
298
  "w-list-page-table": unref(isPageOwn) && !unref(isGrid),
293
- "w-list-page-repaint": unref(isPageOwn) && isRepaint.value
299
+ "w-list-page-repaint": unref(isPageOwn) && isRepaint.value,
300
+ "w-list-section": hasHeading.value
294
301
  }])
295
302
  }, [(openBlock(), createBlock(resolveDynamicComponent(unref(isPageOwn) ? ListPageSurface_default : WEmptyComponent_default), null, {
296
303
  default: withCtx(() => [createVNode(WInfiniteList_default, {
@@ -365,9 +372,23 @@ var WList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
365
372
  "onSave:width": unref(save),
366
373
  "onClick:reset": resetConfig
367
374
  }, createSlots({ _: 2 }, [
368
- _ctx.$slots.header ? {
375
+ _ctx.$slots.header || hasHeading.value ? {
369
376
  name: "header",
370
- fn: withCtx((scope) => [renderSlot(_ctx.$slots, "header", normalizeProps(guardReactiveProps(scope)))]),
377
+ fn: withCtx((scope) => [hasHeading.value ? (openBlock(), createBlock(SectionHeading_default, {
378
+ key: 0,
379
+ title: __props.title,
380
+ description: __props.description,
381
+ nested: isHeadingNested,
382
+ class: "w-list-heading pb-2"
383
+ }, createSlots({ _: 2 }, [_ctx.$slots.title ? {
384
+ name: "title",
385
+ fn: withCtx(() => [renderSlot(_ctx.$slots, "title", normalizeProps(guardReactiveProps(scope)))]),
386
+ key: "0"
387
+ } : void 0, _ctx.$slots.description ? {
388
+ name: "description",
389
+ fn: withCtx(() => [renderSlot(_ctx.$slots, "description")]),
390
+ key: "1"
391
+ } : void 0]), 1032, ["title", "description"])) : createCommentVNode("", true), renderSlot(_ctx.$slots, "header", normalizeProps(guardReactiveProps(scope)))]),
371
392
  key: "0"
372
393
  } : void 0,
373
394
  _ctx.$slots.filter ? {
@@ -1 +1 @@
1
- {"version":3,"file":"WSection.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/Surface/WSection.vue"],"names":[],"mappings":"AA+DA;AAuIA,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAA;AAKjD,KAAK,WAAW,GAAG;IACf,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAC;AAYJ,KAAK,WAAW,GAAG;IACjB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;IAClB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB,kGAAkG;IAClG,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB,CAAC;AAqJF,QAAA,MAAM,UAAU;WAtMJ,MAAM;iBAOA,MAAM;kBAOL,YAAY;SALrB,MAAM;aAPF,MAAM;6EAuMlB,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"WSection.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/Surface/WSection.vue"],"names":[],"mappings":"AA0DA;AAmIA,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAA;AAMjD,KAAK,WAAW,GAAG;IACf,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAC;AAYJ,KAAK,WAAW,GAAG;IACjB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;IAClB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB,kGAAkG;IAClG,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB,CAAC;AA2IF,QAAA,MAAM,UAAU;WA5LJ,MAAM;iBAOA,MAAM;kBAOL,YAAY;SALrB,MAAM;aAPF,MAAM;6EA6LlB,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -1,27 +1,15 @@
1
1
  import { wIsModal } from "../Modal/models/injection.js";
2
2
  import { SemanticType } from "../../utils/SemanticType.js";
3
+ import SectionHeading_default from "./components/SectionHeading.vue.js";
3
4
  import { wSectionNested } from "./models/injection.js";
4
5
  import { sectionToneMap } from "./models/utils.js";
5
- import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, inject, normalizeClass, openBlock, provide, renderSlot, resolveDynamicComponent, toDisplayString, unref, withCtx } from "vue";
6
+ import { createBlock, createCommentVNode, createElementBlock, createSlots, defineComponent, inject, normalizeClass, openBlock, provide, renderSlot, resolveDynamicComponent, unref, withCtx } from "vue";
6
7
  // src/components/Surface/WSection.vue?vue&type=script&setup=true&lang.ts
7
8
  var _hoisted_1 = {
8
- key: 0,
9
- class: "flex flex-wrap items-center gap-x-4 gap-y-2"
10
- };
11
- var _hoisted_2 = { class: "mr-auto grid gap-1" };
12
- var _hoisted_3 = {
13
- key: 0,
14
- class: "text-description text-xs font-semibold tracking-wider uppercase"
15
- };
16
- var _hoisted_4 = {
17
- key: 1,
18
- class: "text-description max-w-prose text-sm text-pretty"
19
- };
20
- var _hoisted_5 = {
21
9
  key: 1,
22
10
  class: "surface-section-body grid content-start gap-4"
23
11
  };
24
- var _hoisted_6 = {
12
+ var _hoisted_2 = {
25
13
  key: 3,
26
14
  class: "surface-section-footer flex flex-wrap items-center gap-2"
27
15
  };
@@ -41,17 +29,39 @@ var WSection_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
41
29
  return (_ctx, _cache) => {
42
30
  return openBlock(), createBlock(resolveDynamicComponent(__props.tag), { class: normalizeClass(["surface-section gap-4", [__props.scroll ? "surface-section-scroll flex flex-col" : "grid", __props.semanticType && __props.semanticType !== unref(SemanticType).SECONDARY ? ["surface-section-tone", unref(sectionToneMap)[__props.semanticType]] : void 0]]) }, {
43
31
  default: withCtx(() => [
44
- __props.title || __props.eyebrow || __props.description || _ctx.$slots.title || _ctx.$slots.description || _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [
45
- __props.eyebrow ? (openBlock(), createElementBlock("div", _hoisted_3, toDisplayString(__props.eyebrow), 1)) : createCommentVNode("", true),
46
- (openBlock(), createBlock(resolveDynamicComponent(unref(isNested) ? "h3" : "h2"), { class: normalizeClass(["font-semibold", [unref(isNested) ? "text-base" : "text-xl", __props.semanticType && __props.semanticType !== unref(SemanticType).SECONDARY ? "text-tone" : "text-accent"]]) }, {
47
- default: withCtx(() => [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
48
- _: 3
49
- }, 8, ["class"])),
50
- __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_4, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true)
51
- ]), renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true),
32
+ __props.title || __props.eyebrow || __props.description || _ctx.$slots.title || _ctx.$slots.description || _ctx.$slots.actions ? (openBlock(), createBlock(SectionHeading_default, {
33
+ key: 0,
34
+ title: __props.title,
35
+ eyebrow: __props.eyebrow,
36
+ description: __props.description,
37
+ nested: unref(isNested),
38
+ toned: !!__props.semanticType && __props.semanticType !== unref(SemanticType).SECONDARY
39
+ }, createSlots({ _: 2 }, [
40
+ _ctx.$slots.title ? {
41
+ name: "title",
42
+ fn: withCtx(() => [renderSlot(_ctx.$slots, "title")]),
43
+ key: "0"
44
+ } : void 0,
45
+ _ctx.$slots.description ? {
46
+ name: "description",
47
+ fn: withCtx(() => [renderSlot(_ctx.$slots, "description")]),
48
+ key: "1"
49
+ } : void 0,
50
+ _ctx.$slots.actions ? {
51
+ name: "actions",
52
+ fn: withCtx(() => [renderSlot(_ctx.$slots, "actions")]),
53
+ key: "2"
54
+ } : void 0
55
+ ]), 1032, [
56
+ "title",
57
+ "eyebrow",
58
+ "description",
59
+ "nested",
60
+ "toned"
61
+ ])) : createCommentVNode("", true),
52
62
  renderSlot(_ctx.$slots, "head"),
53
- __props.scroll ? (openBlock(), createElementBlock("div", _hoisted_5, [renderSlot(_ctx.$slots, "default")])) : renderSlot(_ctx.$slots, "default", {}, void 0, void 0, 2),
54
- _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_6, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
63
+ __props.scroll ? (openBlock(), createElementBlock("div", _hoisted_1, [renderSlot(_ctx.$slots, "default")])) : renderSlot(_ctx.$slots, "default", {}, void 0, void 0, 2),
64
+ _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_2, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
55
65
  ]),
56
66
  _: 3
57
67
  }, 8, ["class"]);
@@ -0,0 +1,22 @@
1
+ type __VLS_Props = {
2
+ title?: string;
3
+ eyebrow?: string;
4
+ description?: string;
5
+ nested: boolean;
6
+ toned?: boolean;
7
+ };
8
+ type __VLS_Slots = {
9
+ title?: () => void;
10
+ description?: () => void;
11
+ actions?: () => void;
12
+ };
13
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
14
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
15
+ declare const _default: typeof __VLS_export;
16
+ export default _default;
17
+ type __VLS_WithSlots<T, S> = T & {
18
+ new (): {
19
+ $slots: S;
20
+ };
21
+ };
22
+ //# sourceMappingURL=SectionHeading.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeading.vue.d.ts","sourceRoot":"","sources":["../../../../../src/components/Surface/components/SectionHeading.vue"],"names":[],"mappings":"AAiCA;AAmDA,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAC;AAGF,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAC;AA6EF,QAAA,MAAM,UAAU,kSAEd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import SectionHeading_vue_vue_type_script_setup_true_lang_default from "./SectionHeading.vue_vue_type_script_setup_true_lang.js";
2
+ // src/components/Surface/components/SectionHeading.vue
3
+ var SectionHeading_default = SectionHeading_vue_vue_type_script_setup_true_lang_default;
4
+ export { SectionHeading_default as default };
@@ -0,0 +1,35 @@
1
+ import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeClass, openBlock, renderSlot, resolveDynamicComponent, toDisplayString, withCtx } from "vue";
2
+ // src/components/Surface/components/SectionHeading.vue?vue&type=script&setup=true&lang.ts
3
+ var _hoisted_1 = { class: "flex flex-wrap items-center gap-x-4 gap-y-2" };
4
+ var _hoisted_2 = { class: "mr-auto grid gap-1" };
5
+ var _hoisted_3 = {
6
+ key: 0,
7
+ class: "text-description text-xs font-semibold tracking-wider uppercase"
8
+ };
9
+ var _hoisted_4 = {
10
+ key: 1,
11
+ class: "text-description max-w-prose text-sm text-pretty"
12
+ };
13
+ var SectionHeading_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
14
+ __name: "SectionHeading",
15
+ props: {
16
+ title: {},
17
+ eyebrow: {},
18
+ description: {},
19
+ nested: { type: Boolean },
20
+ toned: { type: Boolean }
21
+ },
22
+ setup(__props) {
23
+ return (_ctx, _cache) => {
24
+ return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [
25
+ __props.eyebrow ? (openBlock(), createElementBlock("div", _hoisted_3, toDisplayString(__props.eyebrow), 1)) : createCommentVNode("", true),
26
+ (openBlock(), createBlock(resolveDynamicComponent(__props.nested ? "h3" : "h2"), { class: normalizeClass(["font-semibold", [__props.nested ? "text-base" : "text-xl", __props.toned ? "text-tone" : "text-accent"]]) }, {
27
+ default: withCtx(() => [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
28
+ _: 3
29
+ }, 8, ["class"])),
30
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_4, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true)
31
+ ]), renderSlot(_ctx.$slots, "actions")]);
32
+ };
33
+ }
34
+ });
35
+ export { SectionHeading_vue_vue_type_script_setup_true_lang_default as default };
@@ -101,6 +101,8 @@ import WList from 'eco-vue-js/dist/components/List/WList.vue'
101
101
 
102
102
  | Prop | Type | Default | Description |
103
103
  | --- | --- | --- | --- |
104
+ | `title` | `string` | — | Heading of the list, as a section's: the list is a section of its own on the page, and a part of a section or a modal, with a smaller heading and a line above it after other content. The `title` slot replaces it. |
105
+ | `description` | `string` | — | A line under the heading on what the list holds. The `description` slot replaces it. |
104
106
  | `count` | `number` | — | Total number of items, when known in advance. Sizes the skeleton and the select-all. Defaults to the count the query returns. |
105
107
  | `fields` | `Fields` | **required** | Field components, one per column, each with a `meta` export for its title, label, ordering field and classes. A meta with `fields` groups nested fields. |
106
108
  | `expansion` | `ExpansionComponent<Data, QueryParams>` | — | Detail component shown under a row when the row is clicked. Receives the same props as a field, except `config`. |
@@ -162,7 +164,9 @@ import WList from 'eco-vue-js/dist/components/List/WList.vue'
162
164
 
163
165
  | Slot | Props | Description |
164
166
  | --- | --- | --- |
165
- | `header` | `{ count: number \| undefined; }` | Content above the selection bar, with the count returned by the query. |
167
+ | `title` | `{ count: number \| undefined; }` | Heading of the list, in place of `title`, with the count returned by the query. |
168
+ | `description` | — | Line under the heading, in place of `description`. |
169
+ | `header` | `{ count: number \| undefined; }` | Content above the selection bar, under the heading, with the count returned by the query. |
166
170
  | `filter` | — | Filters at the start of the selection bar, usually a WListFilter. They keep to one line, the chips that do not fit go to a menu, the list actions move to the end and fold into More first, and a selection replaces them. `--w-list-toolbar-height` sets the bar's height, the inherited input height by default. |
167
171
  | `selection` | — | Replaces the buttons at the end of the selection bar — range select, refetch, sort and column settings. |
168
172
  | `group` | `{ item: Data; previous: Data \| undefined; skeleton: boolean; }` | Content of the heading before each group of rows, with `groupBy`. The heading spans the whole row, sticks under the toolbar and, in list mode, to the left edge while the rows scroll sideways. Its content is laid out by the slot. `skeleton` is true while the page loads. |
package/docs/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # eco-vue-js
2
2
 
3
- > Vue 3 UI kit with Tailwind v4 — components, utilities, icons and recipes. These are the docs of version 0.26.30, the one installed next to them. Start with Getting started and Conventions; each component page lists its props, events and slots with examples.
3
+ > Vue 3 UI kit with Tailwind v4 — components, utilities, icons and recipes. These are the docs of version 0.26.31, the one installed next to them. Start with Getting started and Conventions; each component page lists its props, events and slots with examples.
4
4
 
5
5
  Release notes, for what changed between versions: https://github.com/rsmple/eco-vue-js/releases. The docs site, with live demos: https://rsmple.github.io/eco-vue-js/
6
6
 
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "type": "git",
5
5
  "url": "https://github.com/rsmple/eco-vue-js.git"
6
6
  },
7
- "version": "0.26.30",
7
+ "version": "0.26.31",
8
8
  "homepage": "https://rsmple.github.io/eco-vue-js/",
9
9
  "dependencies": {
10
10
  "@stylistic/eslint-plugin": "5.10.0",
@@ -253,6 +253,36 @@
253
253
  padding-top: max(0px, 1rem - var(--w-section-padding));
254
254
  }
255
255
 
256
+ /*
257
+ * A joined section has no top edge, so neither the lit top edge of a glass shadow. Its shadow is drawn from a box
258
+ * running on up behind the head, and stops at the section's top as the head's stops at its bottom: clipping the section
259
+ * itself would leave a seam between the two fills. A section after another in a stack there is not joined, and its
260
+ * shadow box is its own. Positioned under the utilities, so a sticky section stays sticky.
261
+ */
262
+ @layer components {
263
+ :where(.surface-section-joined .surface-section:not(.surface-section *, .surface-section-tone)) {
264
+ --w-joined-reach: calc(3rem * var(--w-joined, 0));
265
+
266
+ position: relative;
267
+
268
+ &::before {
269
+ content: "";
270
+ position: absolute;
271
+ inset: calc(var(--w-joined-reach) * -1 - var(--w-section-border) * (1 - var(--w-joined, 0))) calc(var(--w-section-border) * -1) calc(var(--w-section-border) * -1);
272
+ border-radius: inherit;
273
+ box-shadow: var(--w-section-shadow);
274
+ clip-path: inset(calc(var(--w-joined-reach) - 100vh * (1 - var(--w-joined, 0))) -100vw -100vh);
275
+ pointer-events: none;
276
+ }
277
+ }
278
+ }
279
+
280
+ @layer utilities {
281
+ .surface-section-joined .surface-section:not(.surface-section *, .surface-section-tone) {
282
+ box-shadow: none;
283
+ }
284
+ }
285
+
256
286
  /* Reaches into the page gutter like a section: for a row of cards on the canvas. On phones the cards keep the page inset. */
257
287
  @utility w-page-bleed {
258
288
  margin-inline: calc(var(--w-page-bleed, 0px) * -1);
@@ -322,7 +352,7 @@
322
352
 
323
353
  /*
324
354
  * Blocks one after another on the page — sections, stacks of them, page lists, rows of cards, tabs over a section —
325
- * are apart through the wrappers of any page, as in `surface-stack-divided`: a page needs no stack of its own. In card
355
+ * are apart through the wrappers of any page, and after a wrapper that ends with one, such as a form of sections, as in `surface-stack-divided`: a page needs no stack of its own. In card
326
356
  * and glass `--w-section-gap` separates the surfaces; in flat, where sections paint nothing, the blocks are
327
357
  * `--w-stack-divide` apart and a section after a section has a line above its content, so its groups read apart there
328
358
  * too. Only in block flow, as a grid or a flex box spaces its children itself, not inside a section, where blocks are
@@ -339,7 +369,7 @@
339
369
 
340
370
  @scope (.w-page) to (.surface-section *, .surface-root *) {
341
371
  :where(:scope, :scope :not(.grid, .flex, .inline-grid, .inline-flex, .surface-columns, .surface-stack, .surface-stack-divided))
342
- > :where(.surface-section, .surface-stack, .surface-stack-divided, .surface-columns, .w-list-page, .w-page-bleed, .w-tabs-section)
372
+ > :where(.surface-section, .surface-stack, .surface-stack-divided, .surface-columns, .w-list-page, .w-page-bleed, .w-tabs-section, :has(> :where(.surface-section, .surface-stack, .surface-stack-divided, .surface-columns, .w-list-page, .w-page-bleed, .w-tabs-section):last-child))
343
373
  + :where(.surface-section, .surface-stack, .surface-stack-divided, .surface-columns, .w-list-page, .w-page-bleed, .w-tabs-section) {
344
374
  /* 1 in flat, where sections paint nothing, 0 where they do. */
345
375
  --w-stack-flat: calc(1 - min(1, var(--w-section-opacity) * 100));
@@ -362,6 +392,12 @@
362
392
  padding-top: calc(var(--w-section-padding) + var(--w-stack-divide, 2rem) * var(--w-stack-flat));
363
393
  border-top-width: calc(var(--w-section-border) + 1px * var(--w-stack-flat));
364
394
  }
395
+
396
+ /* A page list is a section: after a block, the line goes on its surface, which keeps to the view. */
397
+ :where(:scope, :scope :not(.grid, .flex, .inline-grid, .inline-flex, .surface-columns, .surface-stack, .surface-stack-divided))
398
+ > :where(.surface-section, .surface-stack, .surface-stack-divided, .surface-columns, .w-list-page, .w-page-bleed, .w-tabs-section, :has(> :where(.surface-section, .surface-stack, .surface-stack-divided, .surface-columns, .w-list-page, .w-page-bleed, .w-tabs-section):last-child)) + .w-list-page {
399
+ --w-list-line: var(--w-stack-flat);
400
+ }
365
401
  }
366
402
  }
367
403
 
@@ -492,9 +528,11 @@
492
528
  }
493
529
 
494
530
  /* A part after other content: a line above it, as between the groups of a form. */
495
- :scope * + .surface-section {
531
+ :scope * + .surface-section,
532
+ :scope * + .w-list-section .w-list-heading {
496
533
  border-top: 1px solid var(--w-line-subtle);
497
- padding-top: var(--w-subsection-divide, 1rem);
534
+ padding-top: var(--w-subsection-divide, 2rem);
535
+ margin-top: var(--w-subsection-divide, 2rem);
498
536
  }
499
537
  }
500
538
 
@@ -1003,8 +1041,11 @@
1003
1041
  transparent
1004
1042
  );
1005
1043
 
1044
+ /* 1 after a block on the page in flat: a line above the list, `--w-stack-divide` over its content. */
1045
+ --w-list-divide: calc(var(--w-stack-divide, 2rem) * var(--w-list-line, 0));
1046
+
1006
1047
  display: grid;
1007
- padding-block: var(--w-section-padding);
1048
+ padding-block: calc(var(--w-section-padding) + var(--w-list-divide)) var(--w-section-padding);
1008
1049
 
1009
1050
  @variant sm-not {
1010
1051
  --w-section-border: 0px;
@@ -1099,8 +1140,10 @@
1099
1140
  }
1100
1141
 
1101
1142
  .w-list-page-surface {
1143
+ margin-top: calc((var(--w-section-padding) + var(--w-list-divide)) * -1);
1102
1144
  background-color: var(--w-section-paint);
1103
1145
  border: var(--w-section-border) solid var(--w-line-subtle);
1146
+ border-top-width: calc(var(--w-section-border) + 1px * var(--w-list-line, 0));
1104
1147
  backdrop-filter: var(--w-section-backdrop);
1105
1148
  }
1106
1149