@7365admin1/layer-common 3.2.2-staging.90 → 3.2.2-staging.92

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.
@@ -0,0 +1,40 @@
1
+ <!--
2
+ THE PAGE TITLE ROW.
3
+
4
+ The design opens EVERY screen with this row: the page's name at 22px/800,
5
+ and the screen's primary action on the right of the same line. The product
6
+ has never had it - the page name lived only in the browser tab and in the
7
+ navigation rail - which is the single most visible difference between the
8
+ staging site and the handoff.
9
+
10
+ It is a label and a slot. It fetches nothing, decides nothing and navigates
11
+ nowhere; the action passed into it is the screen's own button.
12
+ -->
13
+ <template>
14
+ <div class="app-page-head">
15
+ <div>
16
+ <h1 class="app-page-head__title">
17
+ <slot name="title">{{ title }}</slot>
18
+ </h1>
19
+
20
+ <!-- The design's second line: a location, a count, a date range. Only
21
+ drawn when a screen supplies one. -->
22
+ <div v-if="subtitle || $slots.subtitle" class="app-page-head__sub">
23
+ <v-icon v-if="subtitleIcon" :icon="subtitleIcon" size="15" />
24
+ <slot name="subtitle">{{ subtitle }}</slot>
25
+ </div>
26
+ </div>
27
+
28
+ <div v-if="$slots.actions" class="app-page-head__actions">
29
+ <slot name="actions" />
30
+ </div>
31
+ </div>
32
+ </template>
33
+
34
+ <script setup lang="ts">
35
+ defineProps({
36
+ title: { type: String, default: "" },
37
+ subtitle: { type: String, default: "" },
38
+ subtitleIcon: { type: String, default: "" },
39
+ });
40
+ </script>
@@ -10,7 +10,10 @@
10
10
  translate or shorten a status.
11
11
  -->
12
12
  <template>
13
- <span class="status-chip" :class="[toneClass, { 'status-chip--plain': !dot }]">
13
+ <span
14
+ class="status-chip"
15
+ :class="[toneClass, { 'status-chip--plain': !dot && !pill, 'status-chip--pill': pill }]"
16
+ >
14
17
  <span v-if="dot" class="status-chip__dot" />
15
18
  <!-- The slot is for the chips that already carried an icon next to their
16
19
  word - a padlock on "Closed - View Only" - so adopting the design's
@@ -27,8 +30,14 @@ const props = defineProps({
27
30
  status: { type: String, default: "" },
28
31
  /** What to PRINT, when that differs from the word being matched on. */
29
32
  label: { type: String, default: undefined },
30
- /** The design's tag chips (pass IDs, role names) carry no leading dot. */
33
+ /** The design's tag chips (pass IDs, counts) carry no leading dot. */
31
34
  dot: { type: Boolean, default: true },
35
+ /**
36
+ * The handoff draws TWO dotless chips, and they are not the same shape: the
37
+ * 7px-radius 11px tag on a pass, and the 999px 11.5px pill a role name sits
38
+ * in on the Members screen. `pill` picks the second.
39
+ */
40
+ pill: { type: Boolean, default: false },
32
41
  /**
33
42
  * For the chips that are not a status WORD at all - a countdown, a rating, a
34
43
  * count - where the screen has already worked out the meaning and only needs
@@ -68,6 +77,12 @@ const toneClass = computed(() =>
68
77
  font-size: var(--fs-chip);
69
78
  }
70
79
 
80
+ /* The role tag: `padding:3px 10px;border-radius:999px;font-size:11.5px`. */
81
+ .status-chip--pill {
82
+ padding: 3px 10px;
83
+ font-size: var(--fs-chip);
84
+ }
85
+
71
86
  .status-chip__dot {
72
87
  width: 6px;
73
88
  height: 6px;
@@ -100,6 +100,24 @@ const name = computed(() => {
100
100
  return prop.items.find((item) => item.value === selected.value)?.text ?? "";
101
101
  });
102
102
 
103
+ /**
104
+ * THE BREADCRUMB'S SITE HALF.
105
+ *
106
+ * The top bar draws `Site name / Page`, but the site's NAME is only ever
107
+ * resolved here - each application loads its own site list and hands it to
108
+ * this selector, so the bar had nothing to print and showed the page alone.
109
+ * The label already on screen is mirrored into shared state for the bar to
110
+ * read. It is a label: no request is made, and what the selector selects is
111
+ * untouched.
112
+ */
113
+ const shellSiteName = useState<string>("shell-context-site-name", () => "");
114
+
115
+ watchEffect(() => {
116
+ if (prop.title?.toLowerCase() === "site" && name.value) {
117
+ shellSiteName.value = name.value;
118
+ }
119
+ });
120
+
103
121
  const selectItem = (value: string) => {
104
122
  selected.value = value;
105
123
  menu.value = false;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@7365admin1/layer-common",
3
3
  "license": "MIT",
4
4
  "type": "module",
5
- "version": "3.2.2-staging.90",
5
+ "version": "3.2.2-staging.92",
6
6
  "author": "7365admin1",
7
7
  "main": "./nuxt.config.ts",
8
8
  "publishConfig": {
@@ -54,6 +54,7 @@ import type { CookieOptions } from "#app";
54
54
  import "../assets/css/tokens.css";
55
55
  import "../assets/css/shell.css";
56
56
  import "../assets/css/screens.css";
57
+ import "../assets/css/primitives.css";
57
58
 
58
59
  export default defineNuxtPlugin((app) => {
59
60
  /**