vira 33.3.0 → 33.4.1

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.
@@ -63,6 +63,10 @@ export declare const ViraForm: import("element-vir").DeclarativeElementDefinitio
63
63
  validChange: import("element-vir").DefineElementEvent<{
64
64
  allFieldsAreValid: boolean;
65
65
  }>;
66
+ /** Emitted when focus leaves a field entirely, not when it moves within the field. */
67
+ fieldBlur: import("element-vir").DefineElementEvent<{
68
+ key: string;
69
+ } & ViraFormField>;
66
70
  /** Every field key, hidden ones included, in the order the user dropped them. */
67
71
  fieldOrderChange: import("element-vir").DefineElementEvent<string[]>;
68
72
  }, "vira-form-", "vira-form-", readonly [], readonly ["dragHandle"]>;
@@ -30,6 +30,8 @@ export const ViraForm = defineViraElement()({
30
30
  events: {
31
31
  valueChange: defineElementEvent(),
32
32
  validChange: defineElementEvent(),
33
+ /** Emitted when focus leaves a field entirely, not when it moves within the field. */
34
+ fieldBlur: defineElementEvent(),
33
35
  /** Every field key, hidden ones included, in the order the user dropped them. */
34
36
  fieldOrderChange: defineElementEvent(),
35
37
  },
@@ -128,6 +130,10 @@ export const ViraForm = defineViraElement()({
128
130
  text-align: right;
129
131
  }
130
132
 
133
+ &.reorderable th {
134
+ text-align: left;
135
+ }
136
+
131
137
  & td {
132
138
  width: 100%;
133
139
  vertical-align: top;
@@ -175,6 +181,20 @@ export const ViraForm = defineViraElement()({
175
181
  }),
176
182
  }));
177
183
  }
184
+ function listenToFieldBlur(key, field) {
185
+ /**
186
+ * `blur` doesn't bubble out of the field's shadow root, but `focusout` does, and the
187
+ * browser skips it on the field's host when focus moves between elements inside it.
188
+ */
189
+ return listen('focusout', () => {
190
+ dispatch(new events.fieldBlur({
191
+ detail: {
192
+ key,
193
+ ...field,
194
+ },
195
+ }));
196
+ });
197
+ }
178
198
  function wrapFormField({ fieldTemplate, label, key, }) {
179
199
  const dropLine = state.dragReorder.readDropLine(visibleKeys.indexOf(key));
180
200
  const rowClasses = classMap({
@@ -239,6 +259,7 @@ export const ViraForm = defineViraElement()({
239
259
  fillWhenUnchecked: field.fillWhenUnchecked,
240
260
  })}
241
261
  ${field.testId ? testId(field.testId) : nothing}
262
+ ${listenToFieldBlur(key, field)}
242
263
  ${listen(ViraCheckbox.events.valueChange, (event) => {
243
264
  dispatch(new events.valueChange({
244
265
  detail: {
@@ -286,6 +307,7 @@ export const ViraForm = defineViraElement()({
286
307
  attributePassthrough: horizontalLabelAttributes,
287
308
  })}
288
309
  ${field.testId ? testId(field.testId) : nothing}
310
+ ${listenToFieldBlur(key, field)}
289
311
  ${listen(ViraDropdown.events.selectedValuesChange, (event) => {
290
312
  dispatch(new events.valueChange({
291
313
  detail: {
@@ -316,6 +338,7 @@ export const ViraForm = defineViraElement()({
316
338
  attributePassthrough: horizontalLabelAttributes,
317
339
  })}
318
340
  ${field.testId ? testId(field.testId) : nothing}
341
+ ${listenToFieldBlur(key, field)}
319
342
  ${listen(ViraTextArea.events.valueChange, (event) => {
320
343
  dispatch(new events.valueChange({
321
344
  detail: {
@@ -365,6 +388,7 @@ export const ViraForm = defineViraElement()({
365
388
  },
366
389
  })}
367
390
  ${field.testId ? testId(field.testId) : nothing}
391
+ ${listenToFieldBlur(key, field)}
368
392
  ${listen(ViraInput.events.valueChange, (event) => {
369
393
  const numericValue = event.detail === '' ? undefined : Number(event.detail);
370
394
  dispatch(new events.valueChange({
@@ -397,6 +421,7 @@ export const ViraForm = defineViraElement()({
397
421
  label: childLabel,
398
422
  })}
399
423
  ${field.testId ? testId(field.testId) : nothing}
424
+ ${listenToFieldBlur(key, field)}
400
425
  ${listen(ViraDateInput.events.valueChange, (event) => {
401
426
  dispatch(new events.valueChange({
402
427
  detail: {
@@ -455,6 +480,7 @@ export const ViraForm = defineViraElement()({
455
480
  : ViraInputType.Default,
456
481
  })}
457
482
  ${field.testId ? testId(field.testId) : nothing}
483
+ ${listenToFieldBlur(key, field)}
458
484
  ${listen(ViraInput.events.valueChange, (event) => {
459
485
  dispatch(new events.valueChange({
460
486
  detail: {
@@ -469,9 +495,13 @@ export const ViraForm = defineViraElement()({
469
495
  });
470
496
  }
471
497
  });
498
+ const horizontalTableClasses = classMap({
499
+ 'horizontal-fields': true,
500
+ reorderable: !!inputs.isReorderable,
501
+ });
472
502
  const formFieldsWrapper = inputs.useHorizontalLabels
473
503
  ? html `
474
- <table class="horizontal-fields">
504
+ <table class=${horizontalTableClasses}>
475
505
  <tbody ${dragReorderRows(state.dragReorder, dropField)}>
476
506
  ${formFieldTemplates}
477
507
  </tbody>
@@ -495,7 +525,7 @@ export const ViraForm = defineViraElement()({
495
525
  <div class="drag-ghost" ${dragReorderGhost(state.dragReorder)}>
496
526
  ${inputs.useHorizontalLabels
497
527
  ? html `
498
- <table class="horizontal-fields">
528
+ <table class=${horizontalTableClasses}>
499
529
  <colgroup>
500
530
  ${state.dragReorder.value.draggedCellWidths.map((cellWidth) => {
501
531
  return html `
@@ -472,7 +472,7 @@ export const ViraJsonForm = defineViraElement()({
472
472
  selected: toSelectedValues(selectedType),
473
473
  })}
474
474
  ${listen(ViraDropdown.events.selectedValuesChange, (event) => {
475
- setPendingType(pathKey, assertWrap.isDefined(event.detail[0]));
475
+ setPendingType(pathKey, assertWrap.isEnumValue(event.detail[0], ViraJsonType));
476
476
  })}
477
477
  ></${ViraDropdown}>
478
478
  ${renderPlusButton({
@@ -536,7 +536,7 @@ export const ViraJsonForm = defineViraElement()({
536
536
  selected: toSelectedValues(selectedType),
537
537
  })}
538
538
  ${listen(ViraDropdown.events.selectedValuesChange, (event) => {
539
- setPendingType(pathKey, assertWrap.isDefined(event.detail[0]));
539
+ setPendingType(pathKey, assertWrap.isEnumValue(event.detail[0], ViraJsonType));
540
540
  })}
541
541
  ></${ViraDropdown}>
542
542
  ${renderPlusButton({
@@ -849,7 +849,7 @@ export const ViraJsonForm = defineViraElement()({
849
849
  })}
850
850
  title="Choose from options or enter a custom value"
851
851
  ${listen(ViraDropdown.events.selectedValuesChange, (event) => {
852
- setStringMode(pathKey, assertWrap.isDefined(event.detail[0]));
852
+ setStringMode(pathKey, assertWrap.isEnumValue(event.detail[0], ViraJsonStringMode));
853
853
  })}
854
854
  ></${ViraDropdown}>
855
855
  </div>
@@ -904,7 +904,7 @@ export const ViraJsonForm = defineViraElement()({
904
904
  })}
905
905
  title="Change type"
906
906
  ${listen(ViraDropdown.events.selectedValuesChange, (event) => {
907
- const newType = assertWrap.isDefined(event.detail[0]);
907
+ const newType = assertWrap.isEnumValue(event.detail[0], ViraJsonType);
908
908
  emitReplaceAt(path, createDefaultForJsonType(newType));
909
909
  })}
910
910
  ></${ViraDropdown}>
@@ -5,8 +5,8 @@ import { type CSSResult } from 'element-vir';
5
5
  * @category Styles
6
6
  */
7
7
  export declare const shadowCssVars: import("lit-css-vars").CssVarDefinitions<{
8
- readonly 'menu-shadow-color': "#e2e2e2";
9
- readonly 'modal-shadow-color': "#4f4f4f";
8
+ readonly 'menu-shadow-color': "rgba(0, 0, 0, 0.11)";
9
+ readonly 'modal-shadow-color': "rgba(0, 0, 0, 0.69)";
10
10
  }>;
11
11
  /**
12
12
  * CSS chunks for default Vira shadow styles.
@@ -6,8 +6,8 @@ import { defineCssVars } from 'lit-css-vars';
6
6
  * @category Styles
7
7
  */
8
8
  export const shadowCssVars = defineCssVars({
9
- 'menu-shadow-color': '#e2e2e2',
10
- 'modal-shadow-color': '#4f4f4f',
9
+ 'menu-shadow-color': 'rgba(0, 0, 0, 0.11)',
10
+ 'modal-shadow-color': 'rgba(0, 0, 0, 0.69)',
11
11
  });
12
12
  /**
13
13
  * CSS chunks for default Vira shadow styles.
@@ -21,12 +21,11 @@ function doesMatch({ input, matcher }) {
21
21
  }
22
22
  function isAllowed({ value: rawValue, allowed, blocked }) {
23
23
  const value = String(rawValue);
24
- const isAllowedCharacter = allowed
25
- ? doesMatch({
24
+ const isAllowedCharacter = !allowed ||
25
+ doesMatch({
26
26
  input: value,
27
27
  matcher: allowed,
28
- })
29
- : true;
28
+ });
30
29
  const isBlockedCharacter = blocked
31
30
  ? doesMatch({
32
31
  input: value,
@@ -83,10 +83,7 @@ export function normalizeSchema(schema) {
83
83
  }
84
84
  }
85
85
  function jsonTypeFromSchemaType(type) {
86
- if (allJsonTypes.includes(type)) {
87
- return type;
88
- }
89
- return undefined;
86
+ return check.isEnumValue(type, ViraJsonType) ? type : undefined;
90
87
  }
91
88
  /** @category Internal */
92
89
  export function createResolveContext(schema) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vira",
3
- "version": "33.3.0",
3
+ "version": "33.4.1",
4
4
  "description": "A simple and highly versatile design system using element-vir.",
5
5
  "keywords": [
6
6
  "design",
@@ -38,24 +38,24 @@
38
38
  "test:docs": "virmator docs check"
39
39
  },
40
40
  "dependencies": {
41
- "@augment-vir/assert": "^32.3.1",
42
- "@augment-vir/common": "^32.3.1",
43
- "@augment-vir/web": "^32.3.1",
41
+ "@augment-vir/assert": "^32.5.0",
42
+ "@augment-vir/common": "^32.5.0",
43
+ "@augment-vir/web": "^32.5.0",
44
44
  "@electrovir/color": "^2.0.0",
45
45
  "@electrovir/local-storage-client": "^0.1.1",
46
- "date-vir": "^9.1.1",
46
+ "date-vir": "^9.4.0",
47
47
  "device-navigation": "^5.0.0",
48
48
  "json-schema-to-ts": "^3.1.1",
49
49
  "lit": "^3.3.3",
50
50
  "lit-css-vars": "^3.6.3",
51
- "object-shape-tester": "^6.15.0",
52
- "observavir": "^2.3.3",
51
+ "object-shape-tester": "^6.15.1",
52
+ "observavir": "^2.4.2",
53
53
  "page-active": "^1.0.4",
54
54
  "spa-router-vir": "^6.8.0",
55
55
  "typed-event-target": "^4.3.4"
56
56
  },
57
57
  "devDependencies": {
58
- "@augment-vir/test": "^32.3.1",
58
+ "@augment-vir/test": "^32.5.0",
59
59
  "@web/dev-server-esbuild": "^2.0.0",
60
60
  "@web/test-runner": "^1.0.0",
61
61
  "@web/test-runner-commands": "^1.0.1",
@@ -63,12 +63,12 @@
63
63
  "@web/test-runner-visual-regression": "^1.0.1",
64
64
  "esbuild": "^0.28.2",
65
65
  "istanbul-smart-text-reporter": "^1.1.5",
66
- "lucide-static": "^1.46.0",
67
- "markdown-code-example-inserter": "^3.0.6",
68
- "theme-vir": "^29.0.0",
66
+ "lucide-static": "^1.54.0",
67
+ "markdown-code-example-inserter": "^3.1.1",
68
+ "theme-vir": "^29.0.1",
69
69
  "typedoc": "^0.28.20",
70
70
  "typescript": "^6.0.3",
71
- "vite": "^8.3.0",
71
+ "vite": "^8.3.4",
72
72
  "vite-tsconfig-paths": "^6.1.1"
73
73
  },
74
74
  "peerDependencies": {