@manohub/app-kit 0.1.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 (103) hide show
  1. package/CONTRACT.md +592 -0
  2. package/README.md +27 -0
  3. package/dist/atoms/app-button.d.ts +90 -0
  4. package/dist/atoms/app-button.js +74 -0
  5. package/dist/atoms/app-checkbox.d.ts +86 -0
  6. package/dist/atoms/app-checkbox.js +78 -0
  7. package/dist/atoms/app-icon-button.d.ts +79 -0
  8. package/dist/atoms/app-icon-button.js +54 -0
  9. package/dist/atoms/app-input.d.ts +118 -0
  10. package/dist/atoms/app-input.js +83 -0
  11. package/dist/atoms/app-layout.d.ts +348 -0
  12. package/dist/atoms/app-layout.js +102 -0
  13. package/dist/atoms/app-notice.d.ts +90 -0
  14. package/dist/atoms/app-notice.js +59 -0
  15. package/dist/atoms/app-query-state.d.ts +191 -0
  16. package/dist/atoms/app-query-state.js +161 -0
  17. package/dist/atoms/app-radio-card.d.ts +80 -0
  18. package/dist/atoms/app-radio-card.js +72 -0
  19. package/dist/atoms/app-search-box.d.ts +80 -0
  20. package/dist/atoms/app-search-box.js +64 -0
  21. package/dist/atoms/app-select.d.ts +106 -0
  22. package/dist/atoms/app-select.js +74 -0
  23. package/dist/atoms/app-switch.d.ts +72 -0
  24. package/dist/atoms/app-switch.js +66 -0
  25. package/dist/atoms/app-textarea.d.ts +89 -0
  26. package/dist/atoms/app-textarea.js +61 -0
  27. package/dist/atoms/app-tooltip.d.ts +70 -0
  28. package/dist/atoms/app-tooltip.js +48 -0
  29. package/dist/atoms/atoms.css +679 -0
  30. package/dist/atoms/state-illustration.d.ts +21 -0
  31. package/dist/atoms/state-illustration.js +101 -0
  32. package/dist/components/app-badge.d.ts +72 -0
  33. package/dist/components/app-badge.js +40 -0
  34. package/dist/components/app-dialog.d.ts +164 -0
  35. package/dist/components/app-dialog.js +121 -0
  36. package/dist/components/app-filter.d.ts +173 -0
  37. package/dist/components/app-filter.js +200 -0
  38. package/dist/components/app-form.d.ts +446 -0
  39. package/dist/components/app-form.js +159 -0
  40. package/dist/components/app-pagination.d.ts +78 -0
  41. package/dist/components/app-pagination.js +57 -0
  42. package/dist/components/app-panel.d.ts +399 -0
  43. package/dist/components/app-panel.js +213 -0
  44. package/dist/components/app-section.d.ts +68 -0
  45. package/dist/components/app-section.js +28 -0
  46. package/dist/components/app-steps.d.ts +115 -0
  47. package/dist/components/app-steps.js +108 -0
  48. package/dist/components/app-table.d.ts +415 -0
  49. package/dist/components/app-table.js +479 -0
  50. package/dist/components/app-tabs.d.ts +58 -0
  51. package/dist/components/app-tabs.js +54 -0
  52. package/dist/components/app-tree.d.ts +273 -0
  53. package/dist/components/app-tree.js +222 -0
  54. package/dist/components/components.css +597 -0
  55. package/dist/composables/use-client-pagination.d.ts +39 -0
  56. package/dist/composables/use-client-pagination.js +29 -0
  57. package/dist/entry/create-query-client.d.ts +8 -0
  58. package/dist/entry/create-query-client.js +14 -0
  59. package/dist/entry/create-sub-app.d.ts +45 -0
  60. package/dist/entry/create-sub-app.js +110 -0
  61. package/dist/entry/index.d.ts +4 -0
  62. package/dist/entry/index.js +12 -0
  63. package/dist/entry/initial-guard.d.ts +12 -0
  64. package/dist/entry/initial-guard.js +23 -0
  65. package/dist/index.d.ts +37 -0
  66. package/dist/index.js +67 -0
  67. package/dist/providers/setup-i18n.d.ts +19 -0
  68. package/dist/providers/setup-i18n.js +24 -0
  69. package/dist/services/app-container.d.ts +15 -0
  70. package/dist/services/app-container.js +7 -0
  71. package/dist/services/app-context.d.ts +4 -0
  72. package/dist/services/app-context.js +17 -0
  73. package/dist/services/index.d.ts +5 -0
  74. package/dist/services/loading.d.ts +16 -0
  75. package/dist/services/loading.js +27 -0
  76. package/dist/services/message-box.d.ts +84 -0
  77. package/dist/services/message-box.js +65 -0
  78. package/dist/services/modal.d.ts +51 -0
  79. package/dist/services/modal.js +51 -0
  80. package/dist/services/notify.d.ts +24 -0
  81. package/dist/services/notify.js +22 -0
  82. package/dist/shell/AppShell.d.ts +139 -0
  83. package/dist/shell/AppShell.js +171 -0
  84. package/dist/shell/shell.css +153 -0
  85. package/dist/styles/farris-bridge.css +129 -0
  86. package/dist/styles/index.css +16 -0
  87. package/dist/styles/markdown.css +85 -0
  88. package/dist/styles/reset.css +74 -0
  89. package/dist/styles/tokens.css +111 -0
  90. package/lint/__tests__/fixtures/clean-src/styles.css +14 -0
  91. package/lint/__tests__/fixtures/clean-src/views/good-page.tsx +15 -0
  92. package/lint/__tests__/fixtures/violations-src/styles.css +18 -0
  93. package/lint/__tests__/fixtures/violations-src/views/bad-page.tsx +38 -0
  94. package/lint/__tests__/fixtures/violations-src/views/no-shell-page.tsx +4 -0
  95. package/lint/__tests__/guardrails.spec.mjs +144 -0
  96. package/lint/component-audit.mjs +131 -0
  97. package/lint/guardrails.config.schema.json +74 -0
  98. package/lint/pre-commit.sample +26 -0
  99. package/lint/run-all.mjs +59 -0
  100. package/lint/shared.mjs +347 -0
  101. package/lint/structure-audit.mjs +254 -0
  102. package/lint/style-audit.mjs +200 -0
  103. package/package.json +78 -0
@@ -0,0 +1,159 @@
1
+ import { defineComponent, provide, toRef, createVNode, inject, createTextVNode } from "vue";
2
+ import { AppSection } from "./app-section.js";
3
+ const FORM_LABEL_WIDTH = /* @__PURE__ */ Symbol("ak-form-label-width");
4
+ const FORM_CONTROL_WIDTH = /* @__PURE__ */ Symbol("ak-form-control-width");
5
+ const FORM_LABEL_ALIGN = /* @__PURE__ */ Symbol("ak-form-label-align");
6
+ const FORM_TEXT_EMPTY = "—";
7
+ const AppFormItem = /* @__PURE__ */ defineComponent({
8
+ name: "AppFormItem",
9
+ inheritAttrs: false,
10
+ props: {
11
+ label: {
12
+ type: String,
13
+ default: void 0
14
+ },
15
+ required: {
16
+ type: Boolean,
17
+ default: false
18
+ },
19
+ error: {
20
+ type: String,
21
+ default: ""
22
+ },
23
+ hint: {
24
+ type: String,
25
+ default: ""
26
+ },
27
+ labelWidth: {
28
+ type: Number,
29
+ default: void 0
30
+ },
31
+ labelAlign: {
32
+ type: String,
33
+ default: void 0
34
+ },
35
+ controlWidth: {
36
+ type: Number,
37
+ default: void 0
38
+ },
39
+ fullWidth: {
40
+ type: Boolean,
41
+ default: false
42
+ },
43
+ /** `undefined` 与「传了空串」必须区分:前者走插槽(控件形态),后者是「值为空的只读行」 */
44
+ text: {
45
+ type: String,
46
+ default: void 0
47
+ },
48
+ /** 只读展示行(label 弱化,内容走插槽):用于控件位是徽标 / 链接这类非文本的只读内容 */
49
+ readonly: {
50
+ type: Boolean,
51
+ default: false
52
+ }
53
+ },
54
+ slots: Object,
55
+ setup(props, {
56
+ slots,
57
+ attrs
58
+ }) {
59
+ const inheritedLabelWidth = inject(FORM_LABEL_WIDTH, void 0);
60
+ const inheritedLabelAlign = inject(FORM_LABEL_ALIGN, void 0);
61
+ const inheritedControlWidth = inject(FORM_CONTROL_WIDTH, void 0);
62
+ return () => {
63
+ const labelWidth = props.labelWidth ?? inheritedLabelWidth?.value;
64
+ const labelAlign = props.labelAlign ?? inheritedLabelAlign?.value;
65
+ const controlWidth = props.controlWidth ?? inheritedControlWidth?.value;
66
+ const styles = [attrs.style, labelWidth ? {
67
+ "--ak-form-label-width": `${labelWidth}px`
68
+ } : null].filter(Boolean);
69
+ const showLabel = !!props.label || props.required;
70
+ const hasText = props.text !== void 0;
71
+ const textIsEmpty = hasText && !props.text.trim();
72
+ const isReadonlyRow = hasText || props.readonly;
73
+ return createVNode("div", {
74
+ "class": [
75
+ "ak-form-item",
76
+ props.error ? "is-invalid" : "",
77
+ props.fullWidth ? "ak-form-item--full" : "",
78
+ // 右对齐是基类默认值,只有左对齐需要额外的修饰类(两处都挂会让「谁胜出」依赖源码顺序)
79
+ labelAlign === "left" ? "ak-form-item--label-left" : "",
80
+ // 只读展示行:label 降一档为次要色,与值拉开层级(样式见 `.ak-form-item--readonly .ak-form-item__label`)
81
+ isReadonlyRow ? "ak-form-item--readonly" : "",
82
+ attrs.class
83
+ ].filter(Boolean).join(" "),
84
+ "data-invalid": props.error ? "true" : "false",
85
+ "style": styles
86
+ }, [showLabel ? createVNode("label", {
87
+ "class": "ak-form-item__label"
88
+ }, [props.required ? createVNode("span", {
89
+ "class": "ak-form-item__required"
90
+ }, [createTextVNode("*")]) : null, createVNode("span", {
91
+ "class": "ak-form-item__label-text"
92
+ }, [props.label])]) : null, createVNode("div", {
93
+ "class": "ak-form-item__control",
94
+ "style": controlWidth ? {
95
+ maxWidth: `${controlWidth}px`
96
+ } : void 0
97
+ }, [hasText ? (
98
+ /*
99
+ * 只读文本形态(摘要 / 详情行):控件位直接渲染业务值,占位与换行规则都在组件里
100
+ * —— 应用侧不再自绘 label/value 表格(那套几何与表单行迟早会漂开)。
101
+ */
102
+ createVNode("div", {
103
+ "class": "ak-form-item__text",
104
+ "data-empty": textIsEmpty ? "true" : "false"
105
+ }, [textIsEmpty ? FORM_TEXT_EMPTY : props.text])
106
+ ) : slots.default?.(), props.error ? createVNode("div", {
107
+ "class": "ak-form-item__error"
108
+ }, [props.error]) : null, props.hint ? createVNode("div", {
109
+ "class": "ak-form-item__hint"
110
+ }, [props.hint]) : null])]);
111
+ };
112
+ }
113
+ });
114
+ const AppFormRoot = /* @__PURE__ */ defineComponent({
115
+ name: "AppForm",
116
+ inheritAttrs: false,
117
+ props: {
118
+ /** 表单级 label 列宽(px);`AppForm.Item` 的 `labelWidth` 优先级更高 */
119
+ labelWidth: {
120
+ type: Number,
121
+ default: void 0
122
+ },
123
+ /** 表单级 label 对齐;`AppForm.Item` 的 `labelAlign` 优先级更高 */
124
+ labelAlign: {
125
+ type: String,
126
+ default: void 0
127
+ },
128
+ /** 表单级控件列宽上限(px);`AppForm.Item` 的 `controlWidth` 优先级更高 */
129
+ controlWidth: {
130
+ type: Number,
131
+ default: void 0
132
+ },
133
+ /** 列数:1(逐行,默认)/ 2(容器够宽才并排,窄了自动回落一列) */
134
+ columns: {
135
+ type: Number,
136
+ default: 1
137
+ }
138
+ },
139
+ slots: Object,
140
+ setup(props, {
141
+ slots,
142
+ attrs
143
+ }) {
144
+ provide(FORM_LABEL_WIDTH, toRef(props, "labelWidth"));
145
+ provide(FORM_LABEL_ALIGN, toRef(props, "labelAlign"));
146
+ provide(FORM_CONTROL_WIDTH, toRef(props, "controlWidth"));
147
+ return () => createVNode("div", {
148
+ "class": ["ak-form", props.columns === 2 ? "ak-form--two-column" : "", attrs.class].filter(Boolean).join(" ")
149
+ }, [slots.default?.()]);
150
+ }
151
+ });
152
+ const AppForm = Object.assign(AppFormRoot, {
153
+ Item: AppFormItem,
154
+ Section: AppSection
155
+ });
156
+ export {
157
+ AppForm,
158
+ AppFormItem
159
+ };
@@ -0,0 +1,78 @@
1
+ import { type PropType } from 'vue';
2
+ /**
3
+ * 分页器(封装 farris FPagination)。
4
+ *
5
+ * 契约:**page 统一 0 基**(对齐后端分页参数),内部 +1 翻译 farris 的 1 基 currentPage。
6
+ * pageSize 切换时独立回调,翻页语义归消费方(现状惯例:切 pageSize 后回第 0 页)。
7
+ *
8
+ * @example
9
+ * <AppPagination page={page} pageSize={pageSize} total={total}
10
+ * onPageChange={(p) => (page = p)}
11
+ * onPageSizeChange={(s) => { pageSize = s; page = 0 }} />
12
+ */
13
+ export declare const AppPagination: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
14
+ /** 0 基页码 */
15
+ page: {
16
+ type: NumberConstructor;
17
+ required: true;
18
+ };
19
+ pageSize: {
20
+ type: NumberConstructor;
21
+ required: true;
22
+ };
23
+ total: {
24
+ type: NumberConstructor;
25
+ required: true;
26
+ };
27
+ pageSizeOptions: {
28
+ type: PropType<number[]>;
29
+ default: () => number[];
30
+ };
31
+ showInfo: {
32
+ type: BooleanConstructor;
33
+ default: boolean;
34
+ };
35
+ onPageChange: {
36
+ type: PropType<(page: number) => void>;
37
+ default: undefined;
38
+ };
39
+ onPageSizeChange: {
40
+ type: PropType<(pageSize: number) => void>;
41
+ default: undefined;
42
+ };
43
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
44
+ /** 0 基页码 */
45
+ page: {
46
+ type: NumberConstructor;
47
+ required: true;
48
+ };
49
+ pageSize: {
50
+ type: NumberConstructor;
51
+ required: true;
52
+ };
53
+ total: {
54
+ type: NumberConstructor;
55
+ required: true;
56
+ };
57
+ pageSizeOptions: {
58
+ type: PropType<number[]>;
59
+ default: () => number[];
60
+ };
61
+ showInfo: {
62
+ type: BooleanConstructor;
63
+ default: boolean;
64
+ };
65
+ onPageChange: {
66
+ type: PropType<(page: number) => void>;
67
+ default: undefined;
68
+ };
69
+ onPageSizeChange: {
70
+ type: PropType<(pageSize: number) => void>;
71
+ default: undefined;
72
+ };
73
+ }>> & Readonly<{}>, {
74
+ pageSizeOptions: number[];
75
+ showInfo: boolean;
76
+ onPageChange: (page: number) => void;
77
+ onPageSizeChange: (pageSize: number) => void;
78
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -0,0 +1,57 @@
1
+ import { defineComponent, createVNode } from "vue";
2
+ import { FPagination } from "@farris/ui-vue";
3
+ const AppPagination = /* @__PURE__ */ defineComponent({
4
+ name: "AppPagination",
5
+ inheritAttrs: false,
6
+ props: {
7
+ /** 0 基页码 */
8
+ page: {
9
+ type: Number,
10
+ required: true
11
+ },
12
+ pageSize: {
13
+ type: Number,
14
+ required: true
15
+ },
16
+ total: {
17
+ type: Number,
18
+ required: true
19
+ },
20
+ pageSizeOptions: {
21
+ type: Array,
22
+ default: () => [10, 20, 50]
23
+ },
24
+ showInfo: {
25
+ type: Boolean,
26
+ default: true
27
+ },
28
+ onPageChange: {
29
+ type: Function,
30
+ default: void 0
31
+ },
32
+ onPageSizeChange: {
33
+ type: Function,
34
+ default: void 0
35
+ }
36
+ },
37
+ setup(props, {
38
+ attrs
39
+ }) {
40
+ return () => createVNode("div", {
41
+ "class": ["ak-pagination", attrs.class].filter(Boolean).join(" ")
42
+ }, [createVNode(FPagination, {
43
+ "currentPage": props.page + 1,
44
+ "totalItems": props.total,
45
+ "pageSize": props.pageSize,
46
+ "pageList": props.pageSizeOptions,
47
+ "showPageList": true,
48
+ "showGoButton": false,
49
+ "showPageInfo": props.showInfo,
50
+ "onUpdate:currentPage": (newPage) => props.onPageChange?.(newPage - 1),
51
+ "onUpdate:pageSize": (newSize) => props.onPageSizeChange?.(newSize)
52
+ }, null)]);
53
+ }
54
+ });
55
+ export {
56
+ AppPagination
57
+ };