eco-vue-js 0.26.29 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"WInfiniteListWrapper.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/InfiniteList/WInfiniteListWrapper.vue"],"names":[],"mappings":"AAmDA;AA0PA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,SAAS,CAAA;AAEpD,OAAO,EAAC,KAAK,KAAK,EAA0E,MAAM,KAAK,CAAA;AAYvG,KAAK,WAAW,GAAG;IACjB,gIAAgI;IAChI,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,mGAAmG;IACnG,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAC;AAyKF,KAAK,WAAW,GAAG;IACjB,uGAAuG;IACvG,MAAM,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,KAAK,EAAE,CAAA;IACnD,+EAA+E;IAC/E,OAAO,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,KAAK,EAAE,CAAA;CACrD,CAAC;AA6FF,QAAA,MAAM,UAAU;;oPAGd,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"}
1
+ {"version":3,"file":"WInfiniteListWrapper.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/InfiniteList/WInfiniteListWrapper.vue"],"names":[],"mappings":"AAmDA;AAmRA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,SAAS,CAAA;AAEpD,OAAO,EAAC,KAAK,KAAK,EAA0E,MAAM,KAAK,CAAA;AAYvG,KAAK,WAAW,GAAG;IACjB,gIAAgI;IAChI,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,mGAAmG;IACnG,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAC;AAkMF,KAAK,WAAW,GAAG;IACjB,uGAAuG;IACvG,MAAM,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,KAAK,EAAE,CAAA;IACnD,+EAA+E;IAC/E,OAAO,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,KAAK,EAAE,CAAA;CACrD,CAAC;AA8FF,QAAA,MAAM,UAAU;;oPAGd,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"}
@@ -58,15 +58,27 @@ var WInfiniteListWrapper_vue_vue_type_script_setup_true_lang_default = /*@__PURE
58
58
  const isPadding = () => !joined && !isContained && !props.noHeaderUpdate;
59
59
  const updatePadding = () => {
60
60
  if (!isPadding()) return;
61
- const intersecting = props.inPlace || isIntersecting.value;
61
+ const intersecting = props.inPlace || isSectionInView.value || isIntersecting.value;
62
62
  if (intersecting === null) return;
63
63
  const offset = indicatorRef.value?.closest(".w-list-page") ? 0 : stickyGap.value;
64
64
  const height = headerHeight.value + offset;
65
65
  updateHeaderPadding(!intersecting && height ? height : 0);
66
66
  };
67
+ /**
68
+ * Whether the page list's section fits the screen below the header bar. Its frame then has no room to stick, so the
69
+ * section's top scrolls away above where a stuck header would draw it: the header scrolls along, as in a section.
70
+ */
71
+ const isSectionInView = ref(false);
72
+ const updateSectionInView = () => {
73
+ const page = indicatorRef.value?.closest(".w-list-page");
74
+ const surface = page?.querySelector(":scope > .w-list-page-surface");
75
+ const frame = page?.querySelector(":scope > .w-list-page-frame");
76
+ isSectionInView.value = !!surface && !!frame && getComputedStyle(frame).top !== "auto" && frame.getBoundingClientRect().height >= surface.getBoundingClientRect().height - 1;
77
+ };
67
78
  watch(() => [
68
79
  props.inPlace,
69
80
  isIntersecting.value,
81
+ isSectionInView.value,
70
82
  headerHeight.value,
71
83
  stickyGap.value
72
84
  ], updatePadding);
@@ -97,8 +109,10 @@ var WInfiniteListWrapper_vue_vue_type_script_setup_true_lang_default = /*@__PURE
97
109
  const onResize = () => {
98
110
  updateHeaderTop();
99
111
  observe();
112
+ updateSectionInView();
100
113
  };
101
114
  let resizeObserver = null;
115
+ let sectionObserver = null;
102
116
  onMounted(() => {
103
117
  if (!getIsClientSide() || joined || !headerRef.value) return;
104
118
  resizeObserver = new ResizeObserver((entries) => {
@@ -108,12 +122,18 @@ var WInfiniteListWrapper_vue_vue_type_script_setup_true_lang_default = /*@__PURE
108
122
  updateHeaderTop();
109
123
  });
110
124
  resizeObserver.observe(headerRef.value);
125
+ const page = indicatorRef.value?.closest(".w-list-page");
126
+ if (page && !isContained) {
127
+ sectionObserver = new ResizeObserver(updateSectionInView);
128
+ sectionObserver.observe(page);
129
+ }
111
130
  observe();
112
131
  window.addEventListener("resize", onResize);
113
132
  });
114
133
  onBeforeUnmount(() => {
115
134
  window.removeEventListener("resize", onResize);
116
135
  resizeObserver?.disconnect();
136
+ sectionObserver?.disconnect();
117
137
  intersectionObserver?.disconnect();
118
138
  if (isPadding()) updateHeaderPadding(0);
119
139
  });
@@ -139,10 +159,10 @@ var WInfiniteListWrapper_vue_vue_type_script_setup_true_lang_default = /*@__PURE
139
159
  createElementVNode("div", {
140
160
  ref: "header",
141
161
  class: normalizeClass(["print:hidden", __props.inPlace ? void 0 : {
142
- "sticky": true,
162
+ "sticky": !isSectionInView.value,
143
163
  "top-(--w-header-inner)": !unref(isContained),
144
164
  "w-infinite-list-header": !unref(isContained) && !__props.noHeaderUpdate,
145
- "w-infinite-list-header-stuck": !unref(isContained) && !__props.noHeaderUpdate && isIntersecting.value === false,
165
+ "w-infinite-list-header-stuck": !unref(isContained) && !__props.noHeaderUpdate && !isSectionInView.value && isIntersecting.value === false,
146
166
  "top-0 not-empty:pt-(--w-list-contained-top,0.75rem)": unref(isContained) && !unref(isModal),
147
167
  "top---modal-header-height": unref(isModal),
148
168
  "bg-surface": __props.noHeaderUpdate || unref(isContained)
@@ -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":"AA2OA;AA6rBA,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;AAazC,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;WAi/BO,OAAO,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;QA7+BpD,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;;;;;;;;;;KAk5B4D,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;;QAv2BT,6EAA6E;iBACpE,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;;;YAxBpF,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;;EAg3BrD,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"}
1
+ {"version":3,"file":"WList.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/List/WList.vue"],"names":[],"mappings":"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"}
@@ -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":"ListToolbar.vue.d.ts","sourceRoot":"","sources":["../../../../../src/components/List/components/ListToolbar.vue"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ListToolbar.vue.d.ts","sourceRoot":"","sources":["../../../../../src/components/List/components/ListToolbar.vue"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock
15
15
  // src/components/List/components/ListToolbar.vue?vue&type=script&setup=true&lang.ts
16
16
  var _hoisted_1 = {
17
17
  key: 0,
18
- class: "w-list-header"
18
+ class: "w-list-header list:left---left-inner list:w---width-inner list:sticky"
19
19
  };
20
20
  var _hoisted_2 = { class: "grid grid-cols-[1fr_auto] gap-4" };
21
21
  var _hoisted_3 = { class: "text-description whitespace-nowrap" };
@@ -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.29, 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.29",
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,16 +352,24 @@
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
329
359
  * its parts, and not in a stack the page sets, which spaces its own: `surface-stack` runs sections together in flat.
330
360
  */
331
361
  @layer components {
362
+ /*
363
+ * A page list is a section of its own: apart from the content before it, as sections in a `surface-stack` are. In
364
+ * this layer, under the page's spacing below, which wins in block flow; a stack the list is in sets its own.
365
+ */
366
+ :where(* + .w-list-page-table) {
367
+ margin-top: var(--w-section-gap);
368
+ }
369
+
332
370
  @scope (.w-page) to (.surface-section *, .surface-root *) {
333
371
  :where(:scope, :scope :not(.grid, .flex, .inline-grid, .inline-flex, .surface-columns, .surface-stack, .surface-stack-divided))
334
- > :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))
335
373
  + :where(.surface-section, .surface-stack, .surface-stack-divided, .surface-columns, .w-list-page, .w-page-bleed, .w-tabs-section) {
336
374
  /* 1 in flat, where sections paint nothing, 0 where they do. */
337
375
  --w-stack-flat: calc(1 - min(1, var(--w-section-opacity) * 100));
@@ -354,6 +392,12 @@
354
392
  padding-top: calc(var(--w-section-padding) + var(--w-stack-divide, 2rem) * var(--w-stack-flat));
355
393
  border-top-width: calc(var(--w-section-border) + 1px * var(--w-stack-flat));
356
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
+ }
357
401
  }
358
402
  }
359
403
 
@@ -484,9 +528,11 @@
484
528
  }
485
529
 
486
530
  /* A part after other content: a line above it, as between the groups of a form. */
487
- :scope * + .surface-section {
531
+ :scope * + .surface-section,
532
+ :scope * + .w-list-section .w-list-heading {
488
533
  border-top: 1px solid var(--w-line-subtle);
489
- padding-top: var(--w-subsection-divide, 1rem);
534
+ padding-top: var(--w-subsection-divide, 2rem);
535
+ margin-top: var(--w-subsection-divide, 2rem);
490
536
  }
491
537
  }
492
538
 
@@ -995,19 +1041,17 @@
995
1041
  transparent
996
1042
  );
997
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
+
998
1047
  display: grid;
999
- padding-block: var(--w-section-padding);
1048
+ padding-block: calc(var(--w-section-padding) + var(--w-list-divide)) var(--w-section-padding);
1000
1049
 
1001
1050
  @variant sm-not {
1002
1051
  --w-section-border: 0px;
1003
1052
  }
1004
1053
  }
1005
1054
 
1006
- /* A section of its own: apart from the page content before it, as sections in a `surface-stack` are. A stack it is in sets its own. */
1007
- :where(* + .w-list-page-table) {
1008
- margin-top: var(--w-section-gap);
1009
- }
1010
-
1011
1055
  /* As wide as its rows, plus the right inset: the last column scrolls clear of the sticky menu column. */
1012
1056
  .w-list-page-table {
1013
1057
  width: max-content;
@@ -1055,6 +1099,23 @@
1055
1099
  }
1056
1100
  }
1057
1101
 
1102
+ /*
1103
+ * A page list of cards wraps and never scrolls sideways: while a table scrolls the window, its content keeps to the
1104
+ * view as content beside the table does. Its parts stick on their own, as a table's toolbar does, and not as one
1105
+ * box: the stuck header would stick inside another sticky box, which browsers move apart from it while scrolling,
1106
+ * and the box's layer would hold the header and the edges under the frame. The surface, frame and edges keep to the
1107
+ * view already.
1108
+ */
1109
+ :root[data-w-page-table] .w-list-page:not(.w-list-page-table) {
1110
+ @variant sm {
1111
+ & :where(.w-list-page-content > :not(.w-infinite-list-header, .w-list-page-end), .w-infinite-list-header > :not(.w-infinite-list-header-edge)) {
1112
+ position: sticky;
1113
+ left: var(--w-left-inner);
1114
+ max-width: var(--w-width-inner);
1115
+ }
1116
+ }
1117
+ }
1118
+
1058
1119
  /* What a page sets in the list's header, such as its title, keeps the page inset there. */
1059
1120
  .w-list-page .w-list-header {
1060
1121
  @variant sm-not {
@@ -1079,8 +1140,10 @@
1079
1140
  }
1080
1141
 
1081
1142
  .w-list-page-surface {
1143
+ margin-top: calc((var(--w-section-padding) + var(--w-list-divide)) * -1);
1082
1144
  background-color: var(--w-section-paint);
1083
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));
1084
1147
  backdrop-filter: var(--w-section-backdrop);
1085
1148
  }
1086
1149