@shwfed/config 2.10.12 → 2.11.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 (131) hide show
  1. package/dist/mcp.mjs +46 -49
  2. package/dist/module.json +1 -1
  3. package/dist/preview/assets/{FieldGroup.vue_vue_type_script_setup_true_lang-BeqytPDr.js → FieldGroup.vue_vue_type_script_setup_true_lang-UfhMyymD.js} +1 -1
  4. package/dist/preview/assets/{badge-DkHwLDps.js → badge-CJ9IQ3Jx.js} +1 -1
  5. package/dist/preview/assets/{config-Cft-srKd.js → config--Vx4fL61.js} +1 -1
  6. package/dist/preview/assets/{config-DJQ2LOWo.js → config-5PPug5mk.js} +1 -1
  7. package/dist/preview/assets/{config-Dx1SXsSf.js → config-7V1qHjUk.js} +1 -1
  8. package/dist/preview/assets/{config-Cedm-E2H.js → config-BYktCefJ.js} +1 -1
  9. package/dist/preview/assets/{config-DAZ2Uj6B.js → config-BeRYF_cz.js} +1 -1
  10. package/dist/preview/assets/{config-DCANpbtq.js → config-BldsYfGM.js} +1 -1
  11. package/dist/preview/assets/{config-Uw4cvZGX.js → config-CQrDCzYN.js} +1 -1
  12. package/dist/preview/assets/{config-7KeAl8UU.js → config-C_g-FYCR.js} +1 -1
  13. package/dist/preview/assets/{config-CZ1e9utV.js → config-DIsAIc7H.js} +1 -1
  14. package/dist/preview/assets/{config-OPQWANCx.js → config-DPX7vGqV.js} +1 -1
  15. package/dist/preview/assets/{config-DQVKd54J.js → config-DpLMetys.js} +1 -1
  16. package/dist/preview/assets/{config-CVPVYMuh.js → config-IMd4FZi8.js} +1 -1
  17. package/dist/preview/assets/{config-Cy6Eix27.js → config-N-FdgfwK.js} +1 -1
  18. package/dist/preview/assets/{config-DbV3RlZz.js → config-uUF-UHPt.js} +1 -1
  19. package/dist/preview/assets/{definition.vue_vue_type_script_setup_true_lang-D4Gh9PzS.js → definition.vue_vue_type_script_setup_true_lang-B_PKfe3G.js} +1 -1
  20. package/dist/preview/assets/index-8Ph-sFDI.css +1 -0
  21. package/dist/preview/assets/index-BCl1NN6k.js +763 -0
  22. package/dist/preview/assets/index-Core7vRW.js +1 -0
  23. package/dist/preview/assets/{index-Cum0oK9u.js → index-DKWp47QP.js} +1 -1
  24. package/dist/preview/assets/{item-H4QeOpnC.js → item-XsW7swFt.js} +1 -1
  25. package/dist/preview/assets/{runtime-CTnwTJlw.js → runtime-B-ABO0r0.js} +1 -1
  26. package/dist/preview/assets/{runtime-C3532B0Y.js → runtime-BeHohaOZ.js} +1 -1
  27. package/dist/preview/assets/{runtime-CNMjRr9Y.js → runtime-BiFFwOIl.js} +1 -1
  28. package/dist/preview/assets/{runtime-ibuFFD1K.js → runtime-ByArW-jJ.js} +1 -1
  29. package/dist/preview/assets/{runtime-DvCHNIPq.js → runtime-CpVTGNFZ.js} +1 -1
  30. package/dist/preview/assets/{runtime-sPGVp7yA.js → runtime-DQ1TnQ7n.js} +1 -1
  31. package/dist/preview/assets/{runtime-CwgX0PuH.js → runtime-DY7hr7v1.js} +1 -1
  32. package/dist/preview/assets/{runtime-BotFX6qJ.js → runtime-Dn172S7t.js} +1 -1
  33. package/dist/preview/assets/{runtime-D5HcLLLR.js → runtime-JxBzvGnw.js} +1 -1
  34. package/dist/preview/assets/{runtime-cKOD2A6u.js → runtime-bq0hmEXY.js} +1 -1
  35. package/dist/preview/assets/{schema-meta-DtZNwp3h.js → schema-meta-CZ9yXnsa.js} +1 -1
  36. package/dist/preview/index.html +2 -2
  37. package/dist/runtime/components/form/fields/2026-06-09/com.shwfed.form.field.upload/runtime.vue +23 -1
  38. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.date/config.vue +30 -0
  39. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.date/schema.d.ts +2 -1
  40. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.date/schema.js +1 -1
  41. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.icon/config.vue +30 -0
  42. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.icon/schema.d.ts +2 -1
  43. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.icon/schema.js +7 -4
  44. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.number/config.vue +30 -0
  45. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.number/schema.d.ts +2 -1
  46. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.number/schema.js +1 -1
  47. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.text/config.vue +30 -0
  48. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.text/schema.d.ts +2 -1
  49. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.text/schema.js +1 -1
  50. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch/schema.d.ts +2 -1
  51. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch/schema.js +1 -0
  52. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch.remote/config.vue +30 -0
  53. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch.remote/schema.d.ts +2 -1
  54. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch.remote/schema.js +1 -1
  55. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/config.vue +60 -32
  56. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/runtime.vue +7 -9
  57. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/schema.d.ts +4 -1
  58. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/schema.js +2 -5
  59. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/config.vue +67 -32
  60. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/runtime.vue +6 -9
  61. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/schema.d.ts +4 -1
  62. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/schema.js +2 -5
  63. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/config.vue +66 -31
  64. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/runtime.vue +7 -9
  65. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/schema.d.ts +4 -1
  66. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/schema.js +2 -5
  67. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.d.vue.ts +2 -2
  68. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.vue.d.ts +2 -2
  69. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/schema.d.ts +1 -1
  70. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/schema.js +1 -0
  71. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.d.vue.ts +2 -2
  72. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.vue.d.ts +2 -2
  73. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/schema.d.ts +1 -1
  74. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/schema.js +1 -0
  75. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.d.vue.ts +2 -2
  76. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.vue.d.ts +2 -2
  77. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/schema.d.ts +1 -1
  78. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/schema.js +1 -0
  79. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.d.vue.ts +2 -2
  80. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.vue.d.ts +2 -2
  81. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/schema.d.ts +1 -1
  82. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/schema.js +1 -0
  83. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.d.vue.ts +2 -2
  84. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.vue.d.ts +2 -2
  85. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/schema.d.ts +1 -1
  86. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/schema.js +1 -0
  87. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.d.vue.ts +2 -2
  88. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.vue.d.ts +2 -2
  89. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/schema.d.ts +1 -1
  90. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/schema.js +1 -0
  91. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.d.vue.ts +4 -2
  92. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.vue +61 -22
  93. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.vue.d.ts +4 -2
  94. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/runtime.vue +6 -9
  95. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/schema.d.ts +4 -1
  96. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/schema.js +3 -4
  97. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.d.vue.ts +4 -2
  98. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.vue +61 -22
  99. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.vue.d.ts +4 -2
  100. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/runtime.vue +6 -9
  101. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/schema.d.ts +4 -1
  102. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/schema.js +3 -4
  103. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.d.vue.ts +4 -2
  104. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.vue +67 -23
  105. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.vue.d.ts +4 -2
  106. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/runtime.vue +6 -9
  107. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/schema.d.ts +4 -1
  108. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/schema.js +2 -4
  109. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.d.vue.ts +4 -2
  110. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.vue +67 -23
  111. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.vue.d.ts +4 -2
  112. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/runtime.vue +6 -9
  113. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/schema.d.ts +4 -1
  114. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/schema.js +2 -4
  115. package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/config.vue +67 -32
  116. package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/runtime.vue +7 -9
  117. package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/schema.d.ts +4 -1
  118. package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/schema.js +2 -5
  119. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/config.vue +66 -31
  120. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/runtime.vue +5 -8
  121. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/schema.d.ts +4 -1
  122. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/schema.js +2 -5
  123. package/dist/runtime/components/table/index.vue +46 -7
  124. package/dist/runtime/components/table/utils/runtime.d.ts +1 -0
  125. package/dist/runtime/components/table/utils/runtime.js +5 -0
  126. package/dist/runtime/components/table/utils/shared.d.ts +3 -1
  127. package/dist/runtime/components/table/utils/shared.js +17 -5
  128. package/package.json +1 -1
  129. package/dist/preview/assets/index-B3HnlKis.js +0 -763
  130. package/dist/preview/assets/index-BAY6NLoo.css +0 -1
  131. package/dist/preview/assets/index-CxUuhfsO.js +0 -1
@@ -4,6 +4,7 @@ import { Icon } from "@iconify/vue";
4
4
  import { format as formatDate } from "date-fns";
5
5
  import { ExpressionEditor } from "../../../../ui/expression-editor";
6
6
  import { Separator } from "../../../../ui/separator";
7
+ import { Switch } from "../../../../ui/switch";
7
8
  import { Button } from "../../../../ui/button";
8
9
  import { Field, FieldLabel } from "../../../../ui/field";
9
10
  import { Locale } from "../../../../ui/locale";
@@ -15,6 +16,12 @@ import {
15
16
  InputGroupNumberField,
16
17
  InputGroupText
17
18
  } from "../../../../ui/input-group";
19
+ import {
20
+ DropdownMenu,
21
+ DropdownMenuContent,
22
+ DropdownMenuItem,
23
+ DropdownMenuTrigger
24
+ } from "../../../../ui/dropdown-menu";
18
25
  import { getStructFieldDescription, getStructFieldTitle } from "../../../utils/schema-meta";
19
26
  import { Markdown } from "../../../../ui/markdown";
20
27
  import DerivedValueEditor from "../../../../form/DerivedValueEditor.vue";
@@ -29,6 +36,14 @@ const presetFieldSchema = presetSchema(() => {
29
36
  });
30
37
  const presetFieldTitle = (field) => getStructFieldTitle(presetFieldSchema, field) ?? field;
31
38
  const presetFieldDescription = (field) => getStructFieldDescription(presetFieldSchema, field);
39
+ const ALIGN_OPTIONS = [
40
+ { value: "left", label: "\u5DE6\u5BF9\u9F50", icon: "fluent:text-align-left-20-regular" },
41
+ { value: "center", label: "\u5C45\u4E2D", icon: "fluent:text-align-center-20-regular" },
42
+ { value: "right", label: "\u53F3\u5BF9\u9F50", icon: "fluent:text-align-right-20-regular" }
43
+ ];
44
+ const currentAlignIcon = computed(
45
+ () => (ALIGN_OPTIONS.find((o) => o.value === (value.value.align ?? "left")) ?? ALIGN_OPTIONS[0]).icon
46
+ );
32
47
  const ROW_VARS = {
33
48
  row: { type: "dyn", label: "\u5F53\u524D\u884C\u6570\u636E" },
34
49
  index: { type: "number", label: "\u884C\u7D22\u5F15" }
@@ -77,6 +92,14 @@ const bindingText = computed({
77
92
  }
78
93
  }
79
94
  });
95
+ function onHiddenChange(v) {
96
+ if (v) {
97
+ value.value = { ...value.value, hidden: true };
98
+ } else {
99
+ const { hidden: _drop, ...rest } = value.value;
100
+ value.value = rest;
101
+ }
102
+ }
80
103
  const formatText = computed({
81
104
  get: () => value.value.format ?? "",
82
105
  set: (v) => {
@@ -111,17 +134,6 @@ function previewFormat(fmt) {
111
134
  }
112
135
  const formatExample = computed(() => previewFormat(value.value.format ?? ""));
113
136
  const valueFormatExample = computed(() => previewFormat(value.value.valueFormat ?? ""));
114
- const hiddenModel = computed({
115
- get: () => value.value.hidden ?? "",
116
- set: (v) => {
117
- if (v === "") {
118
- const { hidden: _drop, ...rest } = value.value;
119
- value.value = rest;
120
- } else {
121
- value.value = { ...value.value, hidden: v };
122
- }
123
- }
124
- });
125
137
  const disabledModel = computed({
126
138
  get: () => value.value.disabled ?? "",
127
139
  set: (v) => {
@@ -311,6 +323,29 @@ const derivedModel = computed({
311
323
  {{ fieldTitle("size") }}
312
324
  </FieldLabel>
313
325
  <InputGroup>
326
+ <InputGroupAddon align="inline-start">
327
+ <DropdownMenu>
328
+ <DropdownMenuTrigger as-child>
329
+ <InputGroupButton
330
+ variant="ghost"
331
+ size="xs"
332
+ :title="fieldTitle('align')"
333
+ >
334
+ <Icon :icon="currentAlignIcon" />
335
+ </InputGroupButton>
336
+ </DropdownMenuTrigger>
337
+ <DropdownMenuContent align="start">
338
+ <DropdownMenuItem
339
+ v-for="opt in ALIGN_OPTIONS"
340
+ :key="opt.value"
341
+ @select="value = { ...value, align: opt.value }"
342
+ >
343
+ <Icon :icon="opt.icon" />
344
+ {{ opt.label }}
345
+ </DropdownMenuItem>
346
+ </DropdownMenuContent>
347
+ </DropdownMenu>
348
+ </InputGroupAddon>
314
349
  <InputGroupNumberField
315
350
  :model-value="value.size"
316
351
  :disabled="value.grow"
@@ -329,27 +364,6 @@ const derivedModel = computed({
329
364
  </InputGroupAddon>
330
365
  </InputGroup>
331
366
  </Field>
332
- <Field orientation="vertical">
333
- <FieldLabel class="text-xs text-zinc-500">
334
- <template
335
- v-if="fieldDescription('hidden')"
336
- #tooltip
337
- >
338
- <Markdown
339
- :source="fieldDescription('hidden')"
340
- block
341
- class="prose prose-sm prose-zinc"
342
- />
343
- </template>
344
- {{ fieldTitle("hidden") }}
345
- </FieldLabel>
346
- <ExpressionEditor
347
- v-model="hiddenModel"
348
- placeholder="例:row.archived"
349
- result-type="bool"
350
- :extra-vars="ROW_VARS"
351
- />
352
- </Field>
353
367
  <Field orientation="vertical">
354
368
  <FieldLabel class="text-xs text-zinc-500">
355
369
  <template
@@ -538,6 +552,27 @@ const derivedModel = computed({
538
552
  </InputGroupAddon>
539
553
  </InputGroup>
540
554
  </Field>
555
+ <Field orientation="vertical">
556
+ <FieldLabel class="text-xs text-zinc-500">
557
+ <template
558
+ v-if="fieldDescription('hidden')"
559
+ #tooltip
560
+ >
561
+ <Markdown
562
+ :source="fieldDescription('hidden')"
563
+ block
564
+ class="prose prose-sm prose-zinc"
565
+ />
566
+ </template>
567
+ {{ fieldTitle("hidden") }}
568
+ </FieldLabel>
569
+ <div>
570
+ <Switch
571
+ :model-value="value.hidden ?? false"
572
+ @update:model-value="onHiddenChange"
573
+ />
574
+ </div>
575
+ </Field>
541
576
  </div>
542
577
  </div>
543
578
  </template>
@@ -9,6 +9,7 @@ import { useFormReadonly } from "../../../../form/utils/readonly";
9
9
  import { getLocalizedText } from "../../../../../share/locale";
10
10
  import { DATE_PICKER_DEFAULT_FORMATS, DatePicker } from "../../../../ui/date-picker";
11
11
  import { useFormState } from "../../../../form/utils/state";
12
+ import { JUSTIFY_CLASS, TEXT_ALIGN_CLASS } from "../../../utils/runtime";
12
13
  defineOptions({ name: "ShwfedTableDateInputRendererRuntime" });
13
14
  const props = defineProps({
14
15
  column: { type: null, required: true },
@@ -29,7 +30,6 @@ function evalBool(expression, label) {
29
30
  return false;
30
31
  }
31
32
  }
32
- const isHidden = computed(() => evalBool(props.column.hidden, "hidden"));
33
33
  const isDisabled = computed(() => evalBool(props.column.disabled, "disabled"));
34
34
  const formReadonly = useFormReadonly();
35
35
  const isReadonly = computed(
@@ -41,6 +41,8 @@ const effectiveReadonly = computed(
41
41
  const resolvedValueFormat = computed(
42
42
  () => props.column.valueFormat ?? DATE_PICKER_DEFAULT_FORMATS.date.value
43
43
  );
44
+ const justifyClass = computed(() => JUSTIFY_CLASS[props.column.align ?? "left"] ?? JUSTIFY_CLASS.left);
45
+ const textAlignClass = computed(() => TEXT_ALIGN_CLASS[props.column.align ?? "left"] ?? TEXT_ALIGN_CLASS.left);
44
46
  const shortcuts = computed(() => {
45
47
  const list = props.column.presets;
46
48
  if (!list || list.length === 0) return void 0;
@@ -71,14 +73,10 @@ const model = computed({
71
73
  <template>
72
74
  <!--
73
75
  Row budget matches the editable input columns: 2px outer inset around a 28px
74
- (`h-7`) control — total 32px. Every branch (hidden / readonly / editable) is
76
+ (`h-7`) control — total 32px. Every branch (readonly / editable) is
75
77
  sized identically so rows do not jump when a CEL condition flips.
76
78
  -->
77
79
  <div class="p-[0.125rem] w-full">
78
- <span
79
- v-if="isHidden"
80
- class="block h-7 w-full"
81
- />
82
80
  <!--
83
81
  Readonly empty state mirrors the `text-input` column: a centered, faded,
84
82
  non-selectable `-` so a readonly grid reads uniformly regardless of which
@@ -86,10 +84,10 @@ const model = computed({
86
84
  dark text.
87
85
  -->
88
86
  <span
89
- v-else-if="effectiveReadonly"
87
+ v-if="effectiveReadonly"
90
88
  :class="[
91
89
  'flex items-center h-7 w-full px-2 text-[0.75rem] truncate',
92
- model ? 'text-zinc-700' : 'justify-center font-mono text-zinc-300 select-none'
90
+ model ? ['text-zinc-700', justifyClass] : 'justify-center font-mono text-zinc-300 select-none'
93
91
  ]"
94
92
  >
95
93
  {{ model || "-" }}
@@ -107,7 +105,7 @@ const model = computed({
107
105
  type="date"
108
106
  size="sm"
109
107
  class="w-full"
110
- input-class="border-zinc-200/30 hover:border-zinc-200 focus-within:border-zinc-200 transition-colors ease-out duration-180"
108
+ :input-class="['border-zinc-200/30 hover:border-zinc-200 focus-within:border-zinc-200 transition-colors ease-out duration-180', textAlignClass]"
111
109
  :format="column.format"
112
110
  :value-format="column.valueFormat"
113
111
  :placeholder="placeholderText"
@@ -20,6 +20,9 @@ export declare function presetSchema(configure: (env: Environment) => void): Sch
20
20
  value: Schema.Schema<string, string, never>;
21
21
  }>;
22
22
  export declare function schema(configure: (env: Environment) => void): Schema.Struct<{
23
+ align: Schema.optionalWith<Schema.Literal<["left", "center", "right"]>, {
24
+ default: () => "left";
25
+ }>;
23
26
  placeholder: Schema.optional<Schema.TupleType<readonly [Schema.Struct<{
24
27
  locale: Schema.Literal<["zh"]>;
25
28
  message: Schema.SchemaClass<string, string, never>;
@@ -27,7 +30,6 @@ export declare function schema(configure: (env: Environment) => void): Schema.St
27
30
  locale: Schema.Literal<["ja", "en", "ko"]>;
28
31
  message: Schema.SchemaClass<string, string, never>;
29
32
  }>]>>;
30
- hidden: Schema.optional<Schema.Schema<string, string, never>>;
31
33
  disabled: Schema.optional<Schema.Schema<string, string, never>>;
32
34
  readonly: Schema.optional<Schema.Schema<string, string, never>>;
33
35
  derived: Schema.optional<Schema.Struct<{
@@ -66,6 +68,7 @@ export declare function schema(configure: (env: Environment) => void): Schema.St
66
68
  locale: Schema.Literal<["ja", "en", "ko"]>;
67
69
  message: Schema.SchemaClass<string, string, never>;
68
70
  }>]>>;
71
+ hidden: Schema.optional<Schema.SchemaClass<boolean, boolean, never>>;
69
72
  id: Schema.refine<string, typeof Schema.String>;
70
73
  groupId: Schema.optional<typeof Schema.UUID>;
71
74
  type: Schema.Literal<["com.shwfed.table.column.date-input"]>;
@@ -1,7 +1,7 @@
1
1
  import { Schema } from "effect";
2
2
  import { getProperty } from "dot-prop";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
- import { CelRowAccess, derivedRowField, editableColumnFields, editableHeader } from "../../../utils/shared.js";
4
+ import { Align, CelRowAccess, derivedRowField, editableColumnFields, editableHeader } from "../../../utils/shared.js";
5
5
  export const type = "com.shwfed.table.column.date-input";
6
6
  export const compatibilityDate = "2026-06-17";
7
7
  export const metadata = {
@@ -31,14 +31,11 @@ export function schema(configure) {
31
31
  type: Schema.Literal(type),
32
32
  compatibilityDate: Schema.Literal(compatibilityDate),
33
33
  ...editableColumnFields(),
34
+ align: Schema.optionalWith(Align.annotations({ title: "\u5BF9\u9F50" }), { default: () => "left" }),
34
35
  placeholder: Schema.optional(Locale.annotations({
35
36
  title: "\u5360\u4F4D\u7B26",
36
37
  description: "\u672A\u9009\u4E2D\u65E5\u671F\u65F6\u8F93\u5165\u6846\u4E2D\u7684\u5360\u4F4D\u6587\u672C"
37
38
  })),
38
- hidden: Schema.optional(CelBool.annotations({
39
- title: "\u9690\u85CF\u6761\u4EF6",
40
- description: "\u8FD4\u56DE `true` \u65F6\u8BE5\u884C\u7684\u8F93\u5165\u6846\u4E0D\u6E32\u67D3\uFF08\u5176\u4F59\u884C\u4E0D\u53D7\u5F71\u54CD\uFF09"
41
- })),
42
39
  disabled: Schema.optional(CelBool.annotations({
43
40
  title: "\u7981\u7528\u6761\u4EF6",
44
41
  description: "\u8FD4\u56DE `true` \u65F6\u8F93\u5165\u6846\u4ECD\u7136\u6E32\u67D3\u4F46\u4E0D\u53EF\u7F16\u8F91"
@@ -4,6 +4,7 @@ import { Icon } from "@iconify/vue";
4
4
  import { format as formatDate } from "date-fns";
5
5
  import { ExpressionEditor } from "../../../../ui/expression-editor";
6
6
  import { Separator } from "../../../../ui/separator";
7
+ import { Switch } from "../../../../ui/switch";
7
8
  import { Button } from "../../../../ui/button";
8
9
  import { Field, FieldLabel } from "../../../../ui/field";
9
10
  import { IconPicker } from "../../../../ui/icon-picker";
@@ -16,6 +17,12 @@ import {
16
17
  InputGroupNumberField,
17
18
  InputGroupText
18
19
  } from "../../../../ui/input-group";
20
+ import {
21
+ DropdownMenu,
22
+ DropdownMenuContent,
23
+ DropdownMenuItem,
24
+ DropdownMenuTrigger
25
+ } from "../../../../ui/dropdown-menu";
19
26
  import { getStructFieldDescription, getStructFieldTitle } from "../../../utils/schema-meta";
20
27
  import { Markdown } from "../../../../ui/markdown";
21
28
  import DerivedValueEditor from "../../../../form/DerivedValueEditor.vue";
@@ -30,6 +37,14 @@ const presetFieldSchema = presetSchema(() => {
30
37
  });
31
38
  const presetFieldTitle = (field) => getStructFieldTitle(presetFieldSchema, field) ?? field;
32
39
  const presetFieldDescription = (field) => getStructFieldDescription(presetFieldSchema, field);
40
+ const ALIGN_OPTIONS = [
41
+ { value: "left", label: "\u5DE6\u5BF9\u9F50", icon: "fluent:text-align-left-20-regular" },
42
+ { value: "center", label: "\u5C45\u4E2D", icon: "fluent:text-align-center-20-regular" },
43
+ { value: "right", label: "\u53F3\u5BF9\u9F50", icon: "fluent:text-align-right-20-regular" }
44
+ ];
45
+ const currentAlignIcon = computed(
46
+ () => (ALIGN_OPTIONS.find((o) => o.value === (value.value.align ?? "left")) ?? ALIGN_OPTIONS[0]).icon
47
+ );
33
48
  const ROW_VARS = {
34
49
  row: { type: "dyn", label: "\u5F53\u524D\u884C\u6570\u636E" },
35
50
  index: { type: "number", label: "\u884C\u7D22\u5F15" }
@@ -156,17 +171,14 @@ function previewFormat(fmt) {
156
171
  }
157
172
  const formatExample = computed(() => previewFormat(value.value.format ?? ""));
158
173
  const valueFormatExample = computed(() => previewFormat(value.value.valueFormat ?? ""));
159
- const hiddenModel = computed({
160
- get: () => value.value.hidden ?? "",
161
- set: (v) => {
162
- if (v === "") {
163
- const { hidden: _drop, ...rest } = value.value;
164
- value.value = rest;
165
- } else {
166
- value.value = { ...value.value, hidden: v };
167
- }
174
+ function onHiddenChange(v) {
175
+ if (v) {
176
+ value.value = { ...value.value, hidden: true };
177
+ } else {
178
+ const { hidden: _drop, ...rest } = value.value;
179
+ value.value = rest;
168
180
  }
169
- });
181
+ }
170
182
  const disabledModel = computed({
171
183
  get: () => value.value.disabled ?? "",
172
184
  set: (v) => {
@@ -462,6 +474,29 @@ const derivedModel = computed({
462
474
  {{ fieldTitle("size") }}
463
475
  </FieldLabel>
464
476
  <InputGroup>
477
+ <InputGroupAddon align="inline-start">
478
+ <DropdownMenu>
479
+ <DropdownMenuTrigger as-child>
480
+ <InputGroupButton
481
+ variant="ghost"
482
+ size="xs"
483
+ :title="fieldTitle('align')"
484
+ >
485
+ <Icon :icon="currentAlignIcon" />
486
+ </InputGroupButton>
487
+ </DropdownMenuTrigger>
488
+ <DropdownMenuContent align="start">
489
+ <DropdownMenuItem
490
+ v-for="opt in ALIGN_OPTIONS"
491
+ :key="opt.value"
492
+ @select="value = { ...value, align: opt.value }"
493
+ >
494
+ <Icon :icon="opt.icon" />
495
+ {{ opt.label }}
496
+ </DropdownMenuItem>
497
+ </DropdownMenuContent>
498
+ </DropdownMenu>
499
+ </InputGroupAddon>
465
500
  <InputGroupNumberField
466
501
  :model-value="value.size"
467
502
  :disabled="value.grow"
@@ -480,27 +515,6 @@ const derivedModel = computed({
480
515
  </InputGroupAddon>
481
516
  </InputGroup>
482
517
  </Field>
483
- <Field orientation="vertical">
484
- <FieldLabel class="text-xs text-zinc-500">
485
- <template
486
- v-if="fieldDescription('hidden')"
487
- #tooltip
488
- >
489
- <Markdown
490
- :source="fieldDescription('hidden')"
491
- block
492
- class="prose prose-sm prose-zinc"
493
- />
494
- </template>
495
- {{ fieldTitle("hidden") }}
496
- </FieldLabel>
497
- <ExpressionEditor
498
- v-model="hiddenModel"
499
- placeholder="例:row.archived"
500
- result-type="bool"
501
- :extra-vars="ROW_VARS"
502
- />
503
- </Field>
504
518
  <Field orientation="vertical">
505
519
  <FieldLabel class="text-xs text-zinc-500">
506
520
  <template
@@ -712,6 +726,27 @@ const derivedModel = computed({
712
726
  </InputGroupAddon>
713
727
  </InputGroup>
714
728
  </Field>
729
+ <Field orientation="vertical">
730
+ <FieldLabel class="text-xs text-zinc-500">
731
+ <template
732
+ v-if="fieldDescription('hidden')"
733
+ #tooltip
734
+ >
735
+ <Markdown
736
+ :source="fieldDescription('hidden')"
737
+ block
738
+ class="prose prose-sm prose-zinc"
739
+ />
740
+ </template>
741
+ {{ fieldTitle("hidden") }}
742
+ </FieldLabel>
743
+ <div>
744
+ <Switch
745
+ :model-value="value.hidden ?? false"
746
+ @update:model-value="onHiddenChange"
747
+ />
748
+ </div>
749
+ </Field>
715
750
  </div>
716
751
  </div>
717
752
  </template>
@@ -9,6 +9,7 @@ import { useFormReadonly } from "../../../../form/utils/readonly";
9
9
  import { getLocalizedText } from "../../../../../share/locale";
10
10
  import { DATE_RANGE_PICKER_DEFAULT_FORMATS, DateRangePicker } from "../../../../ui/date-range-picker";
11
11
  import { useFormState } from "../../../../form/utils/state";
12
+ import { JUSTIFY_CLASS } from "../../../utils/runtime";
12
13
  defineOptions({ name: "ShwfedTableDateRangeInputRendererRuntime" });
13
14
  const props = defineProps({
14
15
  column: { type: null, required: true },
@@ -32,7 +33,6 @@ function evalBool(expression, label) {
32
33
  return false;
33
34
  }
34
35
  }
35
- const isHidden = computed(() => evalBool(props.column.hidden, "hidden"));
36
36
  const isDisabled = computed(() => evalBool(props.column.disabled, "disabled"));
37
37
  const formReadonly = useFormReadonly();
38
38
  const isReadonly = computed(
@@ -44,6 +44,7 @@ const effectiveReadonly = computed(
44
44
  const resolvedValueFormat = computed(
45
45
  () => props.column.valueFormat ?? DATE_RANGE_PICKER_DEFAULT_FORMATS.daterange.value
46
46
  );
47
+ const justifyClass = computed(() => JUSTIFY_CLASS[props.column.align ?? "left"] ?? JUSTIFY_CLASS.left);
47
48
  const shortcuts = computed(() => {
48
49
  const list = props.column.presets;
49
50
  if (!list || list.length === 0) return void 0;
@@ -103,24 +104,20 @@ const readonlyText = computed(() => {
103
104
  <template>
104
105
  <!--
105
106
  Row budget matches the editable input columns: 2px outer inset around a 28px
106
- (`h-7`) control — total 32px. Every branch (hidden / readonly / editable) is
107
+ (`h-7`) control — total 32px. Every branch (readonly / editable) is
107
108
  sized identically so rows do not jump when a CEL condition flips.
108
109
  -->
109
110
  <div class="p-[0.125rem] w-full">
110
- <span
111
- v-if="isHidden"
112
- class="block h-7 w-full"
113
- />
114
111
  <!--
115
112
  Readonly empty state mirrors the other editable columns: a centered, faded,
116
113
  non-selectable `-` so a readonly grid reads uniformly. A non-empty readonly
117
114
  range keeps left-aligned dark text joined by `~`.
118
115
  -->
119
116
  <span
120
- v-else-if="effectiveReadonly"
117
+ v-if="effectiveReadonly"
121
118
  :class="[
122
119
  'flex items-center h-7 w-full px-2 text-[0.75rem] truncate',
123
- readonlyText ? 'text-zinc-700' : 'justify-center font-mono text-zinc-300 select-none'
120
+ readonlyText ? ['text-zinc-700', justifyClass] : 'justify-center font-mono text-zinc-300 select-none'
124
121
  ]"
125
122
  >
126
123
  {{ readonlyText || "-" }}
@@ -21,6 +21,9 @@ export declare function presetSchema(configure: (env: Environment) => void): Sch
21
21
  end: Schema.Schema<string, string, never>;
22
22
  }>;
23
23
  export declare function schema(configure: (env: Environment) => void): Schema.Struct<{
24
+ align: Schema.optionalWith<Schema.Literal<["left", "center", "right"]>, {
25
+ default: () => "left";
26
+ }>;
24
27
  binding: Schema.Union<[Schema.filter<typeof Schema.String>, Schema.filter<Schema.Tuple2<Schema.filter<typeof Schema.String>, Schema.filter<typeof Schema.String>>>]>;
25
28
  startPlaceholder: Schema.optional<Schema.TupleType<readonly [Schema.Struct<{
26
29
  locale: Schema.Literal<["zh"]>;
@@ -36,7 +39,6 @@ export declare function schema(configure: (env: Environment) => void): Schema.St
36
39
  locale: Schema.Literal<["ja", "en", "ko"]>;
37
40
  message: Schema.SchemaClass<string, string, never>;
38
41
  }>]>>;
39
- hidden: Schema.optional<Schema.Schema<string, string, never>>;
40
42
  disabled: Schema.optional<Schema.Schema<string, string, never>>;
41
43
  readonly: Schema.optional<Schema.Schema<string, string, never>>;
42
44
  derived: Schema.optional<Schema.Struct<{
@@ -77,6 +79,7 @@ export declare function schema(configure: (env: Environment) => void): Schema.St
77
79
  locale: Schema.Literal<["ja", "en", "ko"]>;
78
80
  message: Schema.SchemaClass<string, string, never>;
79
81
  }>]>>;
82
+ hidden: Schema.optional<Schema.SchemaClass<boolean, boolean, never>>;
80
83
  id: Schema.refine<string, typeof Schema.String>;
81
84
  groupId: Schema.optional<typeof Schema.UUID>;
82
85
  type: Schema.Literal<["com.shwfed.table.column.date-range-input"]>;
@@ -1,7 +1,7 @@
1
1
  import { Schema } from "effect";
2
2
  import { getProperty } from "dot-prop";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
- import { CelRowAccess, derivedRowField, editableColumnFields, editableHeader } from "../../../utils/shared.js";
4
+ import { Align, CelRowAccess, derivedRowField, editableColumnFields, editableHeader } from "../../../utils/shared.js";
5
5
  export const type = "com.shwfed.table.column.date-range-input";
6
6
  export const compatibilityDate = "2026-06-22";
7
7
  export const metadata = {
@@ -45,6 +45,7 @@ export function schema(configure) {
45
45
  type: Schema.Literal(type),
46
46
  compatibilityDate: Schema.Literal(compatibilityDate),
47
47
  ...editableColumnFields(),
48
+ align: Schema.optionalWith(Align.annotations({ title: "\u5BF9\u9F50" }), { default: () => "left" }),
48
49
  // Swap the inherited single-string `binding` for the range union.
49
50
  binding: bindingSchema,
50
51
  startPlaceholder: Schema.optional(Locale.annotations({
@@ -55,10 +56,6 @@ export function schema(configure) {
55
56
  title: "\u7ED3\u675F\u5360\u4F4D\u7B26",
56
57
  description: "\u672A\u9009\u4E2D\u7ED3\u675F\u65E5\u671F\u65F6\u8F93\u5165\u6846\u4E2D\u7684\u5360\u4F4D\u6587\u672C"
57
58
  })),
58
- hidden: Schema.optional(CelBool.annotations({
59
- title: "\u9690\u85CF\u6761\u4EF6",
60
- description: "\u8FD4\u56DE `true` \u65F6\u8BE5\u884C\u7684\u8F93\u5165\u6846\u4E0D\u6E32\u67D3\uFF08\u5176\u4F59\u884C\u4E0D\u53D7\u5F71\u54CD\uFF09"
61
- })),
62
59
  disabled: Schema.optional(CelBool.annotations({
63
60
  title: "\u7981\u7528\u6761\u4EF6",
64
61
  description: "\u8FD4\u56DE `true` \u65F6\u8F93\u5165\u6846\u4ECD\u7136\u6E32\u67D3\u4F46\u4E0D\u53EF\u7F16\u8F91"
@@ -100,6 +100,34 @@ const { t, locale } = useI18n({
100
100
  const inheritedContext = injectCELContext();
101
101
  const containerRef = ref(null);
102
102
  const appliedInitialStateKey = ref("");
103
+ const frozenGrowColumns = ref(/* @__PURE__ */ new Set());
104
+ function isEffectiveGrow(column) {
105
+ return !!column.columnDef.meta?.grow && !frozenGrowColumns.value.has(column.id);
106
+ }
107
+ function freezeGrowColumns() {
108
+ const grows = tableApi.getVisibleLeafColumns().filter(isEffectiveGrow);
109
+ if (grows.length === 0) return;
110
+ const measured = {};
111
+ for (const column of grows) {
112
+ const el = containerRef.value?.querySelector(`thead [data-col-id="${column.id}"]`);
113
+ if (el) measured[column.id] = el.offsetWidth;
114
+ }
115
+ tableApi.setColumnSizing((prev) => ({ ...prev, ...measured }));
116
+ const next = new Set(frozenGrowColumns.value);
117
+ grows.forEach((column) => next.add(column.id));
118
+ frozenGrowColumns.value = next;
119
+ }
120
+ function onResizeMouseDown(header, event) {
121
+ freezeGrowColumns();
122
+ header.getResizeHandler()(event);
123
+ }
124
+ function growLeafCount(header) {
125
+ return header.getLeafHeaders().filter((h2) => isEffectiveGrow(h2.column)).length;
126
+ }
127
+ function headerGrowStyle(header) {
128
+ const n = growLeafCount(header);
129
+ return n > 0 ? { flex: `${n} 1 auto` } : {};
130
+ }
103
131
  const formReadonly = useFormReadonly();
104
132
  function isHeaderReadonly(readonlyExpr) {
105
133
  if (readonlyExpr == null) return formReadonly.value;
@@ -494,13 +522,19 @@ function getDisplayIndex(row) {
494
522
  watch(config, (config2) => {
495
523
  if (!config2) return;
496
524
  const initialState = config2.initialState;
497
- const nextKey = initialState ? JSON.stringify(initialState) : "";
498
- if (appliedInitialStateKey.value === nextKey || !initialState) {
525
+ const hiddenSeed = {};
526
+ for (const col of config2.columns) {
527
+ if (col.hidden) hiddenSeed[col.id] = false;
528
+ }
529
+ const hasSeed = Object.keys(hiddenSeed).length > 0;
530
+ const effective = initialState || hasSeed ? { ...initialState ?? {}, columnVisibility: { ...hiddenSeed, ...initialState?.columnVisibility ?? {} } } : void 0;
531
+ const nextKey = effective ? JSON.stringify(effective) : "";
532
+ if (appliedInitialStateKey.value === nextKey || !effective) {
499
533
  appliedInitialStateKey.value = nextKey;
500
534
  syncPaginationPageSize();
501
535
  return;
502
536
  }
503
- tableApi.initialState = mergeInitialState(tableApi.initialState, initialState);
537
+ tableApi.initialState = mergeInitialState(tableApi.initialState, effective);
504
538
  tableApi.reset();
505
539
  appliedInitialStateKey.value = nextKey;
506
540
  syncPaginationPageSize();
@@ -712,8 +746,8 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
712
746
  v-for="header in group.headers"
713
747
  :key="header.id"
714
748
  :colspan="header.colSpan"
749
+ :data-col-id="header.column.id"
715
750
  :class="[
716
- header.column.columnDef.meta?.grow && 'flex-1',
717
751
  'flex items-center gap-2 border-zinc-300 py-2 text-zinc-600',
718
752
  'text-xs flex items-center justify-center relative',
719
753
  'bg-[color-mix(in_srgb,var(--primary)_7%,white)] group',
@@ -722,7 +756,12 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
722
756
  shouldHaveLeftBorder(header.column) && 'border-l'
723
757
  ]"
724
758
  :style="{
759
+ // Grow until first resize (see freezeGrowColumns): fill the
760
+ // remaining space, with `width` as the flex-basis so the
761
+ // configured size acts as a floor. Group headers grow by
762
+ // the count of grow leaves they span (see headerGrowStyle).
725
763
  width: `${header.getSize()}px`,
764
+ ...headerGrowStyle(header),
726
765
  ...pinnedStyle(header.column)
727
766
  }"
728
767
  >
@@ -816,7 +855,7 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
816
855
  'hover:opacity-100',
817
856
  'cursor-col-resize'
818
857
  ]"
819
- @mousedown="header.getResizeHandler()($event)"
858
+ @mousedown="onResizeMouseDown(header, $event)"
820
859
  >
821
860
  <div class="w-2pt h-full translate-x-1pt transform-3d bg-[color-mix(in_srgb,var(--primary)_80%,white)]" />
822
861
  </div>
@@ -875,7 +914,7 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
875
914
  :key="cell.id"
876
915
  :class="[
877
916
  'border-zinc-300',
878
- cell.column.columnDef.meta?.grow && 'flex-1',
917
+ isEffectiveGrow(cell.column) && 'flex-[1_1_auto]',
879
918
  cell.column.getIsPinned() && 'sticky z-15',
880
919
  shouldHaveRightBorder(cell.column) && 'border-r',
881
920
  shouldHaveLeftBorder(cell.column) && 'border-l'
@@ -908,7 +947,6 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
908
947
  :key="header.id"
909
948
  :colspan="header.colSpan"
910
949
  :class="[
911
- header.column.columnDef.meta?.grow && 'flex-1',
912
950
  'flex items-center gap-2 border-zinc-300 text-zinc-600 p-0',
913
951
  'text-xs flex items-center justify-center relative',
914
952
  'bg-[color-mix(in_srgb,var(--primary)_7%,white)] group',
@@ -918,6 +956,7 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
918
956
  ]"
919
957
  :style="{
920
958
  width: `${header.getSize()}px`,
959
+ ...headerGrowStyle(header),
921
960
  ...pinnedStyle(header.column)
922
961
  }"
923
962
  >
@@ -1,5 +1,6 @@
1
1
  import type { Effect as EffectType } from 'effect';
2
2
  export declare const JUSTIFY_CLASS: Record<string, string>;
3
+ export declare const TEXT_ALIGN_CLASS: Record<string, string>;
3
4
  type CelEvaluator = <T>(expression: string, context?: Record<string, unknown>) => EffectType.Effect<T, any>;
4
5
  export declare function interpolateMarkdown(template: string, $cel: CelEvaluator, context: Record<string, unknown>): string;
5
6
  export declare function evaluateMarkdown(template: string, $cel: CelEvaluator, context: Record<string, unknown>): string;
@@ -5,6 +5,11 @@ export const JUSTIFY_CLASS = {
5
5
  center: "justify-center",
6
6
  right: "justify-end"
7
7
  };
8
+ export const TEXT_ALIGN_CLASS = {
9
+ left: "text-left",
10
+ center: "text-center",
11
+ right: "text-right"
12
+ };
8
13
  const INTERPOLATION_RE = /\{\{(.*?)\}\}/gs;
9
14
  function stringifyCelResult(value) {
10
15
  if (value === null || value === void 0) return "";