@done-coding/admin-core 0.29.1-alpha.0 → 0.30.1-alpha.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.
Files changed (66) hide show
  1. package/es/bridge/badge.mjs +7 -1
  2. package/es/components/app-layout/AppPage.vue.mjs +1 -1
  3. package/es/components/app-layout/AppPage.vue2.mjs +15 -8
  4. package/es/components/app-layout/app-page-geometry.mjs +7 -3
  5. package/es/components/app-layout/use-slot-misuse-warn.mjs +40 -0
  6. package/es/components/data-view/DataGridView.vue.mjs +1 -1
  7. package/es/components/data-view/DataGridView.vue2.mjs +83 -32
  8. package/es/components/data-view/DataGridViewCard.vue.mjs +41 -0
  9. package/es/components/data-view/DataGridViewCard.vue2.mjs +4 -0
  10. package/es/components/data-view/InfiniteListView.vue.mjs +1 -1
  11. package/es/components/data-view/InfiniteListView.vue2.mjs +38 -11
  12. package/es/components/display/BadgeMark.vue.mjs +1 -1
  13. package/es/components/display/BadgeMark.vue2.mjs +31 -33
  14. package/es/components/display/use-badge.mjs +37 -33
  15. package/es/components/form/FormGroupTitle.vue.mjs +1 -1
  16. package/es/components/form/FormItem.vue.mjs +1 -1
  17. package/es/components/form/FormItemNestForm.vue.mjs +1 -1
  18. package/es/components/form/FormItemNestFormList.vue.mjs +1 -1
  19. package/es/components/form/FormTree.vue.mjs +5 -30
  20. package/es/components/form/FormTree.vue2.mjs +30 -1
  21. package/es/components/form/FormUpload.vue.mjs +1 -1
  22. package/es/components/modal/ModalPorter.vue.mjs +2 -0
  23. package/es/components/modal/use-slot-misuse-warn.mjs +22 -0
  24. package/es/components/page-layout/AppPageListDetailSplit.vue.mjs +1 -1
  25. package/es/components/page-layout/AppPageListDetailSplit.vue2.mjs +7 -7
  26. package/es/components/view-layout/ViewLayout.vue.mjs +1 -1
  27. package/es/components/view-layout/ViewLayout.vue2.mjs +71 -91
  28. package/es/components/view-layout/ViewLayoutToolbar.vue.mjs +7 -0
  29. package/es/components/view-layout/ViewLayoutToolbar.vue2.mjs +189 -0
  30. package/es/config/slot-region.mjs +23 -1
  31. package/es/hooks/use-custom-breakpoint.mjs +12 -2
  32. package/es/hooks/use-is-dev.mjs +16 -0
  33. package/es/hooks/use-theme-apply.mjs +2 -2
  34. package/es/index.mjs +90 -88
  35. package/es/style.css +138 -87
  36. package/package.json +2 -2
  37. package/src/bridge/docs/README.md +34 -4
  38. package/src/components/app-layout/docs/README-AppPage.md +68 -0
  39. package/src/components/data-view/docs/README-DataGridView.md +83 -1
  40. package/src/components/data-view/docs/README-DataListView.md +5 -2
  41. package/src/components/display/docs/README-BadgeMark.md +102 -41
  42. package/src/components/form/README.md +14 -0
  43. package/src/components/form/docs/README-FormItemNestForm.md +3 -0
  44. package/src/components/form/docs/README-FormItemNestFormList.md +3 -0
  45. package/src/components/form/docs/README-FormUpload.md +3 -0
  46. package/src/components/modal/docs/README-ModalPorter.md +26 -0
  47. package/src/components/page-layout/docs/README-AppPageListDetailLayout.md +1 -1
  48. package/src/components/view-layout/docs/README-ViewLayout.md +152 -9
  49. package/src/hooks/docs/README.md +37 -1
  50. package/types/bridge/badge.d.ts +38 -2
  51. package/types/components/app-layout/AppPage.vue.d.ts +16 -0
  52. package/types/components/app-layout/app-page-geometry.d.ts +26 -2
  53. package/types/components/app-layout/use-slot-misuse-warn.d.ts +19 -0
  54. package/types/components/data-view/DataGridView.vue.d.ts +9 -0
  55. package/types/components/data-view/DataGridViewCard.vue.d.ts +25 -0
  56. package/types/components/data-view/types.d.ts +63 -0
  57. package/types/components/display/BadgeMark.vue.d.ts +9 -8
  58. package/types/components/display/use-badge.d.ts +22 -14
  59. package/types/components/modal/use-slot-misuse-warn.d.ts +21 -0
  60. package/types/components/view-layout/ViewLayout.vue.d.ts +16 -0
  61. package/types/components/view-layout/ViewLayoutToolbar.vue.d.ts +52 -0
  62. package/types/components/view-layout/types.d.ts +56 -0
  63. package/types/config/slot-region.d.ts +12 -0
  64. package/types/hooks/use-custom-breakpoint.d.ts +1 -12
  65. package/types/hooks/use-is-dev.d.ts +24 -0
  66. package/types/injectInfo.json.d.ts +1 -1
@@ -1,4 +1,4 @@
1
- import { ComputedRef, Component } from 'vue';
1
+ import { ComputedRef } from 'vue';
2
2
  import { BadgeProps } from 'element-plus';
3
3
  import { BadgeEntry } from '../../bridge';
4
4
  /**
@@ -32,22 +32,20 @@ export interface BadgeResolved {
32
32
  max?: number;
33
33
  /** ElBadge 语义色档 */
34
34
  type: BadgeProps["type"];
35
- /** 图标(状态三档走图标而非文字);有它则 `value` 不渲染、改由 `#content` 出图标 */
36
- icon?: Component;
37
- /** 完整文案——图标档的悬浮气泡用它把语义补回来 */
38
- label?: string;
39
35
  /**
40
- * 图标缩放(逐档可选,1 = 原尺寸)。
41
- * 🔴 [MUST] 留在**预设的逐档字段**里,[MUST NOT] 提成全局常量或只给某一档打补丁 ——
42
- * 七档全图标化之后,后续还会有别的档需要同样处理(甲方 2026-09-18 明示)。
43
- */
44
- iconScale?: number;
45
- /**
46
- * 纯锚点档(`kind: "anchor"`):角标**不显示**,但 DOM 挂点照常渲染。
36
+ * 角标**藏起来**(挂点照常渲染)。两条来路,**同一套藏法**:
37
+ * `kind: "anchor"`(恒隐藏,「本来就没有标」);
38
+ * `entry.visible === false` 或全局默认关(「有标,只是此刻不显示」)。
47
39
  *
48
40
  * 🔴 [MUST NOT] 改成「返回 undefined 让它不渲染」—— `BadgeMark` 是 `v-if="resolved"`,
49
41
  * 不渲染会连 `data-dc-badge-key` 一起没掉,消费方(guide)反而**定位不到**,
50
- * 与本档的用途正好相反。故走 `ElBadge` 的 `hidden`:藏角标、留挂点。
42
+ * 与隐藏的用途正好相反。
43
+ *
44
+ * 🔴 藏法由甲方裁定:**0 尺寸 + `overflow:hidden` + 事件屏蔽**(落点在 `BadgeMark` 的
45
+ * scoped 样式),[MUST NOT] 用 `display:none`,也 [MUST NOT] 沿用 `ElBadge` 的
46
+ * `hidden` prop —— 后者内部就是把 sup 从布局里摘掉。理由是**仍然占位可测**:
47
+ * `display:none` 的元素 `getClientRects().length === 0`,而那正是
48
+ * `plugin-guide/src/anchor.ts` 的可见性判据所依赖的线。
51
49
  */
52
50
  hidden?: boolean;
53
51
  }
@@ -66,5 +64,15 @@ export interface BadgeResolved {
66
64
  export declare function useBadgeHit(getKey: () => BadgeKeyInput): ComputedRef<BadgeHit | undefined>;
67
65
  /**
68
66
  * 标 → 可渲染展示数据。纯函数(不碰 bridge / 不建响应式依赖),查表归 {@link useBadgeHit}。
67
+ *
68
+ * @param defaultVisible 全局默认显不显示(缺省 `true`,= `bridge.badge.defaultVisible`)
69
+ * @param onRefuseHide 遮挡档挡回隐藏请求时的回调(调用方决定要不要 warn)
70
+ */
71
+ export declare function badgeResolveDisplay(entry: BadgeEntry | undefined, defaultVisible?: boolean, onRefuseHide?: () => void): BadgeResolved | undefined;
72
+ /**
73
+ * 遮挡档挡回隐藏请求时的 dev 警告(按 key 去重,[MUST NOT] 静默 ——
74
+ * 静默忽略 = 消费方以为设了其实没设)。
75
+ *
76
+ * 调用方 [MUST] 自己先过 dev 闸(`useIsDev`);本函数只管文案与去重。
69
77
  */
70
- export declare function badgeResolveDisplay(entry: BadgeEntry | undefined): BadgeResolved | undefined;
78
+ export declare const badgeWarnHideRefused: (key: string, kind: string) => void;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ModalPorter 落错槽的运行期检测(**非主干功能**,规则 22:删掉本文件 + 组件里那一行
3
+ * 委托即零残留;[MUST NOT] 出桶导出)。
4
+ *
5
+ * 要防的错:把 Porter 放进 `AppPage` 的 `#top`/`#bottom`/`#left`/`#right`。
6
+ * 方位槽是页面内置 `ModalShelf` 的**兄弟节点**而非后代 ⇒ provide 够不到,
7
+ * `evoke()` 恒返回 `null`——表现为「点按钮毫无反应」,**不报错也不崩**。
8
+ *
9
+ * 🔴 为什么非报不可:此前只有 `evoke` 里那句「未找到 ModalShelf」,那说的是**症状**不是病因,
10
+ * 读的人不会想到是槽位问题。实证:消费方规范 + 守卫俱在,仍一次排查出 8 个页面犯同一条
11
+ * (理由都是「弹窗经弹层挂载、不占版面 ⇒ 放哪都行」——只对了一半,**槽本身**照样渲染)。
12
+ * ⇒ 这类错 [MUST] 由运行期报出来,[MUST NOT] 指望下一份规范写得更清楚。
13
+ *
14
+ * 机制同 `use-context-defaults`:挂载后读 `$el.parentElement` 上的 `DC_SLOT_ATTR`。
15
+ * ModalPorter 根是 `<slot/>`(fragment)⇒ `$el` 是锚点文本 / 注释节点,`parentElement`
16
+ * 照样是槽 shim,可用。
17
+ *
18
+ * **恒报不限 dev**:方位槽里出现 Porter **没有任何正当用法**,零误报
19
+ * (对照 AppPage 的空壳槽检测:那条有合法动态状态,故 dev-only + 去重)。
20
+ */
21
+ export declare const useModalPorterSlotMisuseWarn: () => void;
@@ -34,6 +34,14 @@ declare const _default: <P extends Record<string, any> = Record<string, any>, R
34
34
  loading: boolean;
35
35
  fetchSeq: number;
36
36
  }) => VNode[];
37
+ /**
38
+ * `appBar` 形态右侧「更多」位的内容(默认 `MoreFilled` ⋮)。**仅 `appBar` 开启时渲染**。
39
+ *
40
+ * ⚠️ 点击绑在**外层 `span`** 上 ⇒ 本槽内容 [MUST] 按「哑内容」设计(图标 / 文字)。
41
+ * 塞进带点击的组件(如 `ActionBtn`)时其事件会冒泡到外层、与 `onMore` / 菜单**双触发**;
42
+ * 要自己接管点击就别传回调,或在槽内 `@click.stop`。
43
+ */
44
+ more?: () => VNode[];
37
45
  }> & {
38
46
  default: (scope: ViewLayoutScope<R>) => VNode[];
39
47
  /**
@@ -60,6 +68,14 @@ declare const _default: <P extends Record<string, any> = Record<string, any>, R
60
68
  loading: boolean;
61
69
  fetchSeq: number;
62
70
  }) => VNode[];
71
+ /**
72
+ * `appBar` 形态右侧「更多」位的内容(默认 `MoreFilled` ⋮)。**仅 `appBar` 开启时渲染**。
73
+ *
74
+ * ⚠️ 点击绑在**外层 `span`** 上 ⇒ 本槽内容 [MUST] 按「哑内容」设计(图标 / 文字)。
75
+ * 塞进带点击的组件(如 `ActionBtn`)时其事件会冒泡到外层、与 `onMore` / 菜单**双触发**;
76
+ * 要自己接管点击就别传回调,或在槽内 `@click.stop`。
77
+ */
78
+ more?: () => VNode[];
63
79
  };
64
80
  emit: (evt: "update:isAutoRefresh", value: boolean) => void;
65
81
  }>) => import('vue').VNode & {
@@ -0,0 +1,52 @@
1
+ import { AppPageListDetailNavigationContext, ViewLayoutButtonConfig, ViewLayoutButtonContext, ViewLayoutMoreOption } from './types';
2
+ type __VLS_Props = {
3
+ /** v-show 判据(父算好传入:有工具条内容或有标题) */
4
+ visible: boolean;
5
+ /** 是否渲染标题块 */
6
+ hasHeader: boolean;
7
+ /** 按钮渲染上下文(loading + refresh + 导航句柄) */
8
+ ctx: ViewLayoutButtonContext;
9
+ leftExtraButtons: ViewLayoutButtonConfig[];
10
+ rightExtraButtons: ViewLayoutButtonConfig[];
11
+ /** 内置上/下一条导航:父已做完「可选 inject 探测 + prop」的与运算 */
12
+ showNavigation: boolean;
13
+ navigationCtx?: AppPageListDetailNavigationContext;
14
+ /** 与 `AutoRefreshGroup` 的 v-model 对齐(`defineModel<boolean>()` ⇒ 可空) */
15
+ isAutoRefresh?: boolean;
16
+ /** 刷新动作(透传 AutoRefreshGroup,其契约是返回 Promise) */
17
+ refreshFn: () => Promise<unknown>;
18
+ loading: boolean;
19
+ showAutoRefresh: boolean;
20
+ showRefresh: boolean;
21
+ /** 横向内边距(左右同值,gap 阶梯派生,父算好传入;[MUST NOT] 在本组件重算) */
22
+ padXPx: string;
23
+ /** 移动端 app bar 形态(四项 gate 的总闸) */
24
+ appBar?: boolean;
25
+ back?: () => void;
26
+ moreOptions?: ViewLayoutMoreOption[];
27
+ onMoreSelect?: (item: ViewLayoutMoreOption) => void;
28
+ onMore?: () => void;
29
+ };
30
+ declare function __VLS_template(): {
31
+ attrs: Partial<{}>;
32
+ slots: {
33
+ header?(_: {}): any;
34
+ more?(_: {}): any;
35
+ more?(_: {}): any;
36
+ };
37
+ refs: {};
38
+ rootEl: HTMLDivElement;
39
+ };
40
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
41
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
42
+ "update:isAutoRefresh": (value: boolean | undefined) => any;
43
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
44
+ "onUpdate:isAutoRefresh"?: ((value: boolean | undefined) => any) | undefined;
45
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
46
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
47
+ export default _default;
48
+ type __VLS_WithTemplateSlots<T, S> = T & {
49
+ new (): {
50
+ $slots: S;
51
+ };
52
+ };
@@ -61,6 +61,15 @@ export type ViewLayoutButtonConfig = ActionBtnConfigItem<ViewLayoutButtonContext
61
61
  /**
62
62
  * ViewLayout 展示布局 props
63
63
  */
64
+ /**
65
+ * `appBar` 形态下右侧「更多」菜单的一项(规则 9:桶内符号带 `ViewLayout` 命名空间前缀)。
66
+ */
67
+ export interface ViewLayoutMoreOption {
68
+ /** 菜单项展示文案 */
69
+ label: string;
70
+ /** 菜单项值(业务据它分发;回调入参是**整条配置**而非本值) */
71
+ value: string | number;
72
+ }
64
73
  export interface ViewLayoutProps<P = Record<string, any>, R = any> {
65
74
  /** 数据拉取函数:params 来自 props.params(未传则收 undefined),每次拉取(激活 / 手动刷新 / 自动刷新)传入 */
66
75
  api: (params?: P) => Promise<R>;
@@ -122,4 +131,51 @@ export interface ViewLayoutProps<P = Record<string, any>, R = any> {
122
131
  leftExtraButtons?: ViewLayoutButtonConfig[];
123
132
  /** 右侧额外按钮(置于 AutoRefreshGroup 之前) */
124
133
  rightExtraButtons?: ViewLayoutButtonConfig[];
134
+ /**
135
+ * **移动端 app bar 形态**(默认关,opt-in)。
136
+ *
137
+ * 开启后 toolbar 变成移动端 header 的样子:去掉左缘 3px 主色条 · 下边缘加投影 ·
138
+ * `min-height: 44px`,并**解锁** {@link back} 与右侧「更多」位。
139
+ *
140
+ * 🔴 **四项能力全部由本开关 gate**(甲方 2026-09-19:「左侧的 back、右侧的三个点、
141
+ * chrome 最小高度 44、无圆角,**都是通过 props 开启移动端模式才有的**」)——
142
+ * 不开启时传了 `back` / `moreOptions` 也**不渲染**,高度不加 44 下限。
143
+ * [MUST NOT] 实现成「传了就生效」:那在默认形态下只是多出一个按钮、不报错,
144
+ * 是最容易漏掉又最难发现的一类偏差。
145
+ *
146
+ * 🔴 **只由消费方显式开启,[MUST NOT] 自动检测**(甲方:「是**开启**,不是检测是移动端」)。
147
+ * [MUST NOT] 用 `matchMedia` / UA / 视口宽 / 容器断点自动切 —— 同一套 core 服务多形态应用,
148
+ * 「窄就是移动端」不成立(分栏详情 / 侧栏 / 弹窗里都窄),自动切会让消费方在完全
149
+ * 没配置的情况下突然换一套 chrome。
150
+ *
151
+ * ⚠️ 命名避开 `header`:本组件**已有 `#header` 插槽**(标题槽),
152
+ * 叫 `headerMode` 会让「header 模式」与「#header 槽」在文档与代码里天天打架。
153
+ */
154
+ appBar?: boolean;
155
+ /**
156
+ * 返回回调;给了才渲染左侧返回箭头,**且仅 `appBar` 开启时**。
157
+ *
158
+ * 箭头的点击热区靠外层 padding 撑到 ≥44×44(移动端触控下限),
159
+ * [MUST NOT] 只放大图标本身 —— 那只是看着大、点不准。
160
+ */
161
+ back?: () => void;
162
+ /**
163
+ * `appBar` 右侧「更多」菜单项;配了(非空)即点击开 `ElDropdown` 菜单。
164
+ * **仅 `appBar` 开启时生效**。
165
+ */
166
+ moreOptions?: ViewLayoutMoreOption[];
167
+ /**
168
+ * 选中「更多」菜单项。**入参恒是整条 item 配置**(不是 `value`)。
169
+ *
170
+ * 仅在**配了** {@link moreOptions} 时可能触发;没配菜单时走 {@link onMore}。
171
+ * 🔴 两个回调**各自单义、由配置互斥**,[MUST NOT] 合并成「一个回调 + 可选参数」——
172
+ * 消费方**静态就知道**自己配没配菜单,可选参数会强迫他处理一个在他那份配置里
173
+ * 根本不可能发生的分支,而文档只能靠脚注补救。需要脚注解释的签名通常是该拆了。
174
+ */
175
+ onMoreSelect?: (item: ViewLayoutMoreOption) => void;
176
+ /**
177
+ * **没配** {@link moreOptions} 时,点击「更多」位**直接触发**(不出菜单)。
178
+ * 仅 `appBar` 开启时生效;与 {@link onMoreSelect} 由配置互斥。
179
+ */
180
+ onMore?: () => void;
125
181
  }
@@ -42,3 +42,15 @@ export declare enum SlotRegion {
42
42
  * 缺失 / 非法 → `undefined`(未命中 region = 不处理,由消费 hook 决定原样透传)。
43
43
  */
44
44
  export declare const parseSlotRegion: (raw: string | null | undefined) => SlotRegion | undefined;
45
+ /** `AppPage` 四向方位槽名(= 插槽名,报错文案直接拼 `#${name}`)。 */
46
+ export type AppPageSlotName = "top" | "right" | "bottom" | "left";
47
+ /** `AppPage` 四向方位槽名清单(**不含默认槽**——默认槽是正确落点)。 */
48
+ export declare const APP_PAGE_SIDE_SLOTS: readonly AppPageSlotName[];
49
+ /**
50
+ * `AppPage` 四向方位槽 region → 槽名;默认槽 / 非 AppPage region / 未命中 → `undefined`。
51
+ *
52
+ * 用途 = **误用检测的公共判据**(ModalPorter 落错槽 / AppPage 空壳槽),两处同源一份映射,
53
+ * [MUST NOT] 各写一份 switch。
54
+ * 🔴 [MUST NOT] 把 `AppPage_Default` 算进来——默认槽是**正确**落点,不是方位槽。
55
+ */
56
+ export declare const resolveAppPageSlotName: (region: SlotRegion | undefined) => AppPageSlotName | undefined;
@@ -10,19 +10,8 @@ export type CustomBreakpointTarget = HTMLElement | ComponentPublicInstance | nul
10
10
  * - 组件实例(有 $el)→ 取 $el;$el 非 Element(多根组件 / 注释锚点)→ dev warn + null(不猜测)。
11
11
  */
12
12
  export declare const resolveRootEl: (target: CustomBreakpointTarget) => HTMLElement | null;
13
- /**
14
- * 容器断点 hook:按**目标自身宽度**(非视口)判定响应式断点。
15
- * 反转接口——hook 导出 `elRef`,调用方经 `ref="elRef"` 挂到目标原生元素或组件上;
16
- * hook 内部解析根节点 + ResizeObserver 观测宽度 → activeBreakpoint。
17
- *
18
- * 与视口 `useBreakpoint` 互补:视口版(matchMedia)用于与 ElCol 的 CSS 媒体查询对齐;
19
- * 本版用于组件被塞进窄容器(如侧栏)时按容器宽自校准。
20
- *
21
- * 约束:仅支持根节点**稳定**的原生元素 / 组件(elRef 值身份变化才重解析)。
22
- * 若目标组件根节点在**同一实例内**从注释锚点(如 v-if 关)切到元素,elRef 身份不变、
23
- * 不会自动重挂观测——需保证挂载目标为稳定单根(如本项目 WatchSize 恒为单 div 根)。
24
- */
25
13
  export declare const useCustomBreakpoint: () => {
26
14
  elRef: import('vue').ShallowRef<CustomBreakpointTarget, CustomBreakpointTarget>;
27
15
  activeBreakpoint: Readonly<import('vue').Ref<Breakpoint, Breakpoint>>;
16
+ measured: Readonly<import('vue').Ref<boolean, boolean>>;
28
17
  };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 「现在是不是开发环境」的判据 —— **证明不了是生产环境就报**(fail-loud)。
3
+ *
4
+ * core 是 npm 发布包,**构建期常量在这里一律不可用**。两条已被实测证伪的写法,
5
+ * [MUST NOT] 回头再用:
6
+ *
7
+ * | 写法 | 为什么不行 |
8
+ * | --- | --- |
9
+ * | `import.meta.env.DEV` | **构建期**常量 —— Vite 在 **core 自己 build 时**就把它替换成 `false` 并把整段摇掉,下游永远看不到 |
10
+ * | 单用 `process.env.NODE_ENV !== "production"` | Vite **dev** 下源码侧根本没有 `process` 全局(真浏览器实测 `typeof process === "undefined"`)⇒ 恰好在最该报的 dev 里哑火,与 prod 行为正好反了 |
11
+ *
12
+ * ⇒ 三档依次取:
13
+ *
14
+ * ⓐ **整 bridge 的 `APP_ENV_INFO.isDev`**(精确,常态):由**下游 app 自己**从它的
15
+ * `import.meta.env` 推出来再交给 core,是唯一不受 core 构建期影响的真信号。
16
+ * 要求下游 `app.use(coreBridge)`(本仓标准装法)。
17
+ * ⓑ 无 bridge 时退 `process.env.NODE_ENV`(webpack / Vite **build** 都会替换它)。
18
+ * ⓒ 两者都取不到 ⇒ **当作 dev**。诊断类输出宁可多一条,也 [MUST NOT] 默认静默 ——
19
+ * 「检测静默失效」的症状与「压根没写」一模一样。
20
+ *
21
+ * **[MUST NOT] 出桶导出**(规则 22,`hooks/index.ts` 已锁面):它是 core 内部诊断设施,
22
+ * 不是给下游的 API。[MUST] 在 setup 期调用(内部 `inject`),返回的是 getter。
23
+ */
24
+ export declare const useIsDev: () => (() => boolean);
@@ -1,6 +1,6 @@
1
1
  declare const _default: {
2
2
  "name": "@done-coding/admin-core",
3
- "version": "0.29.1-alpha.0",
3
+ "version": "0.30.1-alpha.0",
4
4
  "description": "内部前端库"
5
5
  };
6
6