@jolly-pixel/ui 1.0.1 → 2.0.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 (117) hide show
  1. package/LICENSE +44 -44
  2. package/NOTICE +9 -0
  3. package/README.md +194 -194
  4. package/dist/containers/Dialog.js +11 -11
  5. package/dist/containers/Dialog.styles.js +48 -48
  6. package/dist/containers/Dock.js +11 -11
  7. package/dist/containers/Dock.styles.js +351 -351
  8. package/dist/containers/DockLayout.js +4 -4
  9. package/dist/containers/Floating.js +23 -23
  10. package/dist/containers/Floating.styles.js +116 -116
  11. package/dist/containers/Folder.js +28 -28
  12. package/dist/containers/Folder.styles.js +221 -221
  13. package/dist/containers/Pane.js +50 -50
  14. package/dist/containers/Pane.styles.js +186 -186
  15. package/dist/containers/Rail.js +18 -18
  16. package/dist/containers/Tab.js +10 -10
  17. package/dist/containers/Tabs.js +26 -26
  18. package/dist/containers/Tabs.styles.js +93 -93
  19. package/dist/containers/Toolbar.js +25 -25
  20. package/dist/containers/resize.js +5 -5
  21. package/dist/controls/Button.js +9 -9
  22. package/dist/controls/Button.styles.js +79 -79
  23. package/dist/controls/ButtonGroup.js +28 -28
  24. package/dist/controls/ButtonGroup.styles.js +98 -98
  25. package/dist/controls/Checkbox.js +14 -14
  26. package/dist/controls/Checkbox.styles.js +111 -111
  27. package/dist/controls/Color.js +51 -51
  28. package/dist/controls/Color.styles.js +83 -83
  29. package/dist/controls/ColorPicker.js +104 -104
  30. package/dist/controls/ColorPicker.styles.js +296 -296
  31. package/dist/controls/Control.js +33 -33
  32. package/dist/controls/Control.styles.js +102 -102
  33. package/dist/controls/Controls.js +11 -11
  34. package/dist/controls/Controls.styles.js +98 -98
  35. package/dist/controls/Flags.js +18 -18
  36. package/dist/controls/Flags.styles.js +59 -59
  37. package/dist/controls/Number.js +21 -21
  38. package/dist/controls/Number.styles.js +44 -44
  39. package/dist/controls/PropertyRow.js +13 -13
  40. package/dist/controls/PropertyRow.styles.js +105 -105
  41. package/dist/controls/Range.js +24 -24
  42. package/dist/controls/Range.styles.js +25 -25
  43. package/dist/controls/Select.js +23 -23
  44. package/dist/controls/Select.styles.js +47 -47
  45. package/dist/controls/Separator.js +11 -11
  46. package/dist/controls/Separator.styles.js +45 -45
  47. package/dist/controls/Slider.js +36 -36
  48. package/dist/controls/Slider.styles.js +161 -161
  49. package/dist/controls/Text.js +17 -17
  50. package/dist/data/Tree.d.ts +0 -14
  51. package/dist/data/Tree.d.ts.map +1 -1
  52. package/dist/data/Tree.js +90 -120
  53. package/dist/data/Tree.js.map +1 -1
  54. package/dist/data/Tree.styles.d.ts.map +1 -1
  55. package/dist/data/Tree.styles.js +220 -237
  56. package/dist/data/Tree.styles.js.map +1 -1
  57. package/dist/data/dropZone.d.ts +0 -10
  58. package/dist/data/dropZone.d.ts.map +1 -1
  59. package/dist/data/dropZone.js +0 -10
  60. package/dist/data/dropZone.js.map +1 -1
  61. package/dist/data/resolveRename.d.ts +0 -3
  62. package/dist/data/resolveRename.d.ts.map +1 -1
  63. package/dist/data/resolveRename.js +0 -3
  64. package/dist/data/resolveRename.js.map +1 -1
  65. package/dist/data/resolveReparent.d.ts +0 -7
  66. package/dist/data/resolveReparent.d.ts.map +1 -1
  67. package/dist/data/resolveReparent.js +0 -6
  68. package/dist/data/resolveReparent.js.map +1 -1
  69. package/dist/data/rowDragSession.d.ts +0 -8
  70. package/dist/data/rowDragSession.d.ts.map +1 -1
  71. package/dist/data/rowDragSession.js +0 -6
  72. package/dist/data/rowDragSession.js.map +1 -1
  73. package/dist/data/treeNodes.d.ts +0 -6
  74. package/dist/data/treeNodes.d.ts.map +1 -1
  75. package/dist/data/treeNodes.js +2 -7
  76. package/dist/data/treeNodes.js.map +1 -1
  77. package/dist/feedback/JollyPixelLogo.js +84 -84
  78. package/dist/feedback/Loading.js +29 -29
  79. package/dist/feedback/Loading.styles.js +230 -230
  80. package/dist/feedback/Log.js +8 -8
  81. package/dist/feedback/Log.styles.js +61 -61
  82. package/dist/feedback/Progress.js +17 -17
  83. package/dist/feedback/Progress.styles.js +146 -146
  84. package/dist/field/JollyField.js +51 -51
  85. package/dist/field/JollyField.styles.js +429 -429
  86. package/dist/icon/Icon.js +24 -24
  87. package/dist/icon/builtins.js +126 -126
  88. package/dist/interaction/drag/DragSession.js +6 -6
  89. package/dist/interaction/scrub/ScrubController.js +6 -6
  90. package/dist/math/AxisController.js +22 -22
  91. package/dist/math/Point2d.js +12 -12
  92. package/dist/math/Point2d.styles.js +49 -49
  93. package/dist/math/Quaternion.js +4 -4
  94. package/dist/math/Transform.js +40 -40
  95. package/dist/math/Transform.styles.js +17 -17
  96. package/dist/math/VectorField.js +4 -4
  97. package/dist/math/VectorField.styles.js +102 -102
  98. package/dist/monitors/Graph.js +8 -8
  99. package/dist/monitors/Graph.styles.js +42 -42
  100. package/dist/monitors/Monitor.js +5 -5
  101. package/dist/monitors/Monitor.styles.js +31 -31
  102. package/dist/peer/Presence.js +33 -33
  103. package/dist/peer/Presence.styles.js +82 -82
  104. package/dist/stats/Stats.js +6 -6
  105. package/dist/stats/Stats.styles.js +54 -54
  106. package/dist/theme/components/DensityControl.js +16 -16
  107. package/dist/theme/components/ThemeControl.js +16 -16
  108. package/dist/theme/components/ThemePreferences.js +18 -18
  109. package/dist/theme/font.js +9 -9
  110. package/dist/theme/styles/hiddenStyles.js +4 -4
  111. package/dist/theme/styles/mixins.js +16 -16
  112. package/dist/theme/styles/themeStyles.js +4 -4
  113. package/dist/theme/tokens/density.js +19 -19
  114. package/dist/theme/tokens/ramps.js +40 -40
  115. package/dist/theme/tokens/scales.js +56 -56
  116. package/dist/theme/tokens/semantic.js +184 -184
  117. package/package.json +6 -5
@@ -2,107 +2,107 @@
2
2
  import { css } from "lit";
3
3
  // Import Internal Dependencies
4
4
  import { focusRing, truncate } from "../theme/styles/mixins.js";
5
- export const controlStyles = css `
6
- :host {
7
- display: grid;
8
- grid-template-columns: auto minmax(0, 1fr) auto;
9
- gap: calc(var(--jolly-controls-inset, 10px) / 2);
10
- align-items: center;
11
- min-inline-size: 0;
12
- min-block-size: var(--jolly-control-height);
13
- }
14
-
15
- .keys {
16
- display: inline-flex;
17
- flex-wrap: wrap;
18
- gap: 2px;
19
- }
20
-
21
- ::slotted(kbd) {
22
- box-sizing: border-box;
23
- min-inline-size: calc(var(--jolly-control-height) + 2px);
24
- min-block-size: calc(var(--jolly-control-height) + 2px);
25
- padding: 1px 6px;
26
- color: var(--jolly-text);
27
- font-family: inherit;
28
- font-size: calc(var(--jolly-font-size) + 1px);
29
- font-weight: 700;
30
- line-height: calc(var(--jolly-control-height) - 2px);
31
- text-align: center;
32
- letter-spacing: 0.02em;
33
- white-space: nowrap;
34
- background: color-mix(
35
- in oklab,
36
- var(--jolly-ink) 18%,
37
- var(--jolly-surface-raised)
38
- );
39
- border: 1px solid var(--jolly-border);
40
- border-radius: 3px;
41
- }
42
-
43
- .description {
44
- min-inline-size: 0;
45
- color: var(--jolly-text);
46
- ${truncate}
47
- }
48
-
49
- .details-button {
50
- display: grid;
51
- place-items: center;
52
- box-sizing: border-box;
53
- inline-size: var(--jolly-control-height);
54
- block-size: var(--jolly-control-height);
55
- padding: 0;
56
- color: var(--jolly-text-muted);
57
- background: transparent;
58
- border: 0;
59
- border-radius: 50%;
60
- cursor: pointer;
61
- }
62
-
63
- .details-button:hover {
64
- color: var(--jolly-text);
65
- background: var(--jolly-control-bg-hover);
66
- }
67
-
68
- .details-button:focus-visible {
69
- ${focusRing}
70
- outline-offset: 2px;
71
- }
72
-
73
- jolly-icon {
74
- inline-size: calc(var(--jolly-control-height) - 4px);
75
- block-size: calc(var(--jolly-control-height) - 4px);
76
- }
77
-
78
- .details {
79
- position: fixed;
80
- inset: auto;
81
- width: max-content;
82
- margin: 0;
83
- visibility: hidden;
84
- box-sizing: border-box;
85
- max-inline-size: min(20rem, calc(100vw - 2rem));
86
- padding: calc(var(--jolly-controls-inset, 10px) / 1.5);
87
- color: var(--jolly-text);
88
- font: inherit;
89
- line-height: 1.4;
90
- background: var(--jolly-surface-raised);
91
- border: 0;
92
- border-radius: 4px;
93
- box-shadow: var(--jolly-shadow-floating);
94
- }
95
-
96
- .details::backdrop {
97
- background: transparent;
98
- }
99
-
100
- @media (forced-colors: active) {
101
- ::slotted(kbd),
102
- .details {
103
- background: Canvas;
104
- border-color: CanvasText;
105
- }
106
- }
5
+ export const controlStyles = css `
6
+ :host {
7
+ display: grid;
8
+ grid-template-columns: auto minmax(0, 1fr) auto;
9
+ gap: calc(var(--jolly-controls-inset, 10px) / 2);
10
+ align-items: center;
11
+ min-inline-size: 0;
12
+ min-block-size: var(--jolly-control-height);
13
+ }
14
+
15
+ .keys {
16
+ display: inline-flex;
17
+ flex-wrap: wrap;
18
+ gap: 2px;
19
+ }
20
+
21
+ ::slotted(kbd) {
22
+ box-sizing: border-box;
23
+ min-inline-size: calc(var(--jolly-control-height) + 2px);
24
+ min-block-size: calc(var(--jolly-control-height) + 2px);
25
+ padding: 1px 6px;
26
+ color: var(--jolly-text);
27
+ font-family: inherit;
28
+ font-size: calc(var(--jolly-font-size) + 1px);
29
+ font-weight: 700;
30
+ line-height: calc(var(--jolly-control-height) - 2px);
31
+ text-align: center;
32
+ letter-spacing: 0.02em;
33
+ white-space: nowrap;
34
+ background: color-mix(
35
+ in oklab,
36
+ var(--jolly-ink) 18%,
37
+ var(--jolly-surface-raised)
38
+ );
39
+ border: 1px solid var(--jolly-border);
40
+ border-radius: 3px;
41
+ }
42
+
43
+ .description {
44
+ min-inline-size: 0;
45
+ color: var(--jolly-text);
46
+ ${truncate}
47
+ }
48
+
49
+ .details-button {
50
+ display: grid;
51
+ place-items: center;
52
+ box-sizing: border-box;
53
+ inline-size: var(--jolly-control-height);
54
+ block-size: var(--jolly-control-height);
55
+ padding: 0;
56
+ color: var(--jolly-text-muted);
57
+ background: transparent;
58
+ border: 0;
59
+ border-radius: 50%;
60
+ cursor: pointer;
61
+ }
62
+
63
+ .details-button:hover {
64
+ color: var(--jolly-text);
65
+ background: var(--jolly-control-bg-hover);
66
+ }
67
+
68
+ .details-button:focus-visible {
69
+ ${focusRing}
70
+ outline-offset: 2px;
71
+ }
72
+
73
+ jolly-icon {
74
+ inline-size: calc(var(--jolly-control-height) - 4px);
75
+ block-size: calc(var(--jolly-control-height) - 4px);
76
+ }
77
+
78
+ .details {
79
+ position: fixed;
80
+ inset: auto;
81
+ width: max-content;
82
+ margin: 0;
83
+ visibility: hidden;
84
+ box-sizing: border-box;
85
+ max-inline-size: min(20rem, calc(100vw - 2rem));
86
+ padding: calc(var(--jolly-controls-inset, 10px) / 1.5);
87
+ color: var(--jolly-text);
88
+ font: inherit;
89
+ line-height: 1.4;
90
+ background: var(--jolly-surface-raised);
91
+ border: 0;
92
+ border-radius: 4px;
93
+ box-shadow: var(--jolly-shadow-floating);
94
+ }
95
+
96
+ .details::backdrop {
97
+ background: transparent;
98
+ }
99
+
100
+ @media (forced-colors: active) {
101
+ ::slotted(kbd),
102
+ .details {
103
+ background: Canvas;
104
+ border-color: CanvasText;
105
+ }
106
+ }
107
107
  `;
108
108
  //# sourceMappingURL=Control.styles.js.map
@@ -33,19 +33,19 @@ let Controls = class Controls extends LitElement {
33
33
  render() {
34
34
  const maximum = Math.max(1, Math.floor(this.maxEntriesPerRow));
35
35
  const headingId = "heading";
36
- return html `
36
+ return html `
37
37
  ${this.heading === ""
38
38
  ? nothing
39
- : html `<h2 class="heading" id=${headingId}>${this.heading}</h2>`}
40
- <div
41
- class="entries"
42
- role="list"
43
- aria-label=${this.heading === "" ? "Controls" : nothing}
44
- aria-labelledby=${this.heading === "" ? nothing : headingId}
45
- style=${`--jolly-controls-max-entries-per-row:${maximum}`}
46
- >
47
- <slot></slot>
48
- </div>
39
+ : html `<h2 class="heading" id=${headingId}>${this.heading}</h2>`}
40
+ <div
41
+ class="entries"
42
+ role="list"
43
+ aria-label=${this.heading === "" ? "Controls" : nothing}
44
+ aria-labelledby=${this.heading === "" ? nothing : headingId}
45
+ style=${`--jolly-controls-max-entries-per-row:${maximum}`}
46
+ >
47
+ <slot></slot>
48
+ </div>
49
49
  `;
50
50
  }
51
51
  };
@@ -1,102 +1,102 @@
1
1
  // Import Third-party Dependencies
2
2
  import { css } from "lit";
3
- export const controlsStyles = css `
4
- :host {
5
- --jolly-controls-inset: calc(var(--jolly-row-height) / 2);
6
- --jolly-controls-entry-min-width: 10rem;
7
-
8
- position: absolute;
9
- z-index: 1;
10
- display: block;
11
- box-sizing: border-box;
12
- max-inline-size: calc(100% - (var(--jolly-controls-inset) * 2));
13
- padding: var(--jolly-controls-inset);
14
- color: var(--jolly-text);
15
- font-family: var(--jolly-font-family);
16
- font-size: var(--jolly-font-size);
17
- line-height: 1.35;
18
- background: color-mix(in oklab, var(--jolly-surface-raised) 72%, transparent);
19
- border-radius: 4px;
20
- box-shadow: var(--jolly-shadow-overlay);
21
- backdrop-filter: blur(12px);
22
- }
23
-
24
- :host([position="top-left"]) {
25
- inset: var(--jolly-controls-inset) auto auto var(--jolly-controls-inset);
26
- }
27
-
28
- :host([position="top-middle"]) {
29
- inset: var(--jolly-controls-inset) auto auto 50%;
30
- transform: translateX(-50%);
31
- }
32
-
33
- :host([position="top-right"]) {
34
- inset: var(--jolly-controls-inset) var(--jolly-controls-inset) auto auto;
35
- }
36
-
37
- :host([position="middle-left"]) {
38
- inset: 50% auto auto var(--jolly-controls-inset);
39
- transform: translateY(-50%);
40
- }
41
-
42
- :host([position="middle"]) {
43
- inset: 50% auto auto 50%;
44
- transform: translate(-50%, -50%);
45
- }
46
-
47
- :host([position="middle-right"]) {
48
- inset: 50% var(--jolly-controls-inset) auto auto;
49
- transform: translateY(-50%);
50
- }
51
-
52
- :host([position="bottom-left"]) {
53
- inset: auto auto var(--jolly-controls-inset) var(--jolly-controls-inset);
54
- }
55
-
56
- :host([position="bottom-middle"]) {
57
- inset: auto auto var(--jolly-controls-inset) 50%;
58
- transform: translateX(-50%);
59
- }
60
-
61
- :host([position="bottom-right"]) {
62
- inset: auto var(--jolly-controls-inset) var(--jolly-controls-inset) auto;
63
- }
64
-
65
- .heading {
66
- margin: 0 0 calc(var(--jolly-controls-inset) / 2);
67
- color: var(--jolly-text-muted);
68
- font-size: inherit;
69
- font-weight: 600;
70
- text-transform: uppercase;
71
- letter-spacing: 0.06em;
72
- }
73
-
74
- .entries {
75
- display: grid;
76
- grid-template-columns: repeat(
77
- var(--jolly-controls-max-entries-per-row),
78
- minmax(var(--jolly-controls-entry-min-width), 1fr)
79
- );
80
- gap: calc(var(--jolly-controls-inset) / 2);
81
- }
82
-
83
- @media (max-width: 32rem) {
84
- .entries {
85
- grid-template-columns: repeat(2, minmax(0, 1fr));
86
- }
87
- }
88
-
89
- @media (max-width: 20rem) {
90
- .entries {
91
- grid-template-columns: minmax(0, 1fr);
92
- }
93
- }
94
-
95
- @media (forced-colors: active) {
96
- :host {
97
- background: Canvas;
98
- box-shadow: none;
99
- }
100
- }
3
+ export const controlsStyles = css `
4
+ :host {
5
+ --jolly-controls-inset: calc(var(--jolly-row-height) / 2);
6
+ --jolly-controls-entry-min-width: 10rem;
7
+
8
+ position: absolute;
9
+ z-index: 1;
10
+ display: block;
11
+ box-sizing: border-box;
12
+ max-inline-size: calc(100% - (var(--jolly-controls-inset) * 2));
13
+ padding: var(--jolly-controls-inset);
14
+ color: var(--jolly-text);
15
+ font-family: var(--jolly-font-family);
16
+ font-size: var(--jolly-font-size);
17
+ line-height: 1.35;
18
+ background: color-mix(in oklab, var(--jolly-surface-raised) 72%, transparent);
19
+ border-radius: 4px;
20
+ box-shadow: var(--jolly-shadow-overlay);
21
+ backdrop-filter: blur(12px);
22
+ }
23
+
24
+ :host([position="top-left"]) {
25
+ inset: var(--jolly-controls-inset) auto auto var(--jolly-controls-inset);
26
+ }
27
+
28
+ :host([position="top-middle"]) {
29
+ inset: var(--jolly-controls-inset) auto auto 50%;
30
+ transform: translateX(-50%);
31
+ }
32
+
33
+ :host([position="top-right"]) {
34
+ inset: var(--jolly-controls-inset) var(--jolly-controls-inset) auto auto;
35
+ }
36
+
37
+ :host([position="middle-left"]) {
38
+ inset: 50% auto auto var(--jolly-controls-inset);
39
+ transform: translateY(-50%);
40
+ }
41
+
42
+ :host([position="middle"]) {
43
+ inset: 50% auto auto 50%;
44
+ transform: translate(-50%, -50%);
45
+ }
46
+
47
+ :host([position="middle-right"]) {
48
+ inset: 50% var(--jolly-controls-inset) auto auto;
49
+ transform: translateY(-50%);
50
+ }
51
+
52
+ :host([position="bottom-left"]) {
53
+ inset: auto auto var(--jolly-controls-inset) var(--jolly-controls-inset);
54
+ }
55
+
56
+ :host([position="bottom-middle"]) {
57
+ inset: auto auto var(--jolly-controls-inset) 50%;
58
+ transform: translateX(-50%);
59
+ }
60
+
61
+ :host([position="bottom-right"]) {
62
+ inset: auto var(--jolly-controls-inset) var(--jolly-controls-inset) auto;
63
+ }
64
+
65
+ .heading {
66
+ margin: 0 0 calc(var(--jolly-controls-inset) / 2);
67
+ color: var(--jolly-text-muted);
68
+ font-size: inherit;
69
+ font-weight: 600;
70
+ text-transform: uppercase;
71
+ letter-spacing: 0.06em;
72
+ }
73
+
74
+ .entries {
75
+ display: grid;
76
+ grid-template-columns: repeat(
77
+ var(--jolly-controls-max-entries-per-row),
78
+ minmax(var(--jolly-controls-entry-min-width), 1fr)
79
+ );
80
+ gap: calc(var(--jolly-controls-inset) / 2);
81
+ }
82
+
83
+ @media (max-width: 32rem) {
84
+ .entries {
85
+ grid-template-columns: repeat(2, minmax(0, 1fr));
86
+ }
87
+ }
88
+
89
+ @media (max-width: 20rem) {
90
+ .entries {
91
+ grid-template-columns: minmax(0, 1fr);
92
+ }
93
+ }
94
+
95
+ @media (forced-colors: active) {
96
+ :host {
97
+ background: Canvas;
98
+ box-shadow: none;
99
+ }
100
+ }
101
101
  `;
102
102
  //# sourceMappingURL=Controls.styles.js.map
@@ -35,27 +35,27 @@ let Flags = class Flags extends JollyField {
35
35
  }
36
36
  renderValue() {
37
37
  const mask = this.concreteValue;
38
- return html `
39
- <div class="flags" role="group" aria-label=${this.label}>
40
- ${this.options.map((option) => this.#renderFlag(option, mask))}
41
- </div>
38
+ return html `
39
+ <div class="flags" role="group" aria-label=${this.label}>
40
+ ${this.options.map((option) => this.#renderFlag(option, mask))}
41
+ </div>
42
42
  `;
43
43
  }
44
44
  #renderFlag(option, mask) {
45
- return html `
46
- <label class="flag">
47
- <input
48
- type="checkbox"
49
- .checked=${mask === undefined ? false : hasFlag(mask, option.value)}
50
- .indeterminate=${mask === undefined}
51
- ?disabled=${this.disabled || option.disabled === true}
52
- aria-readonly=${this.readonlyAria}
53
- aria-disabled=${this.lockedAria}
54
- aria-description=${this.lockDescription}
55
- @click=${(event) => this.#onToggle(option, event)}
56
- >
57
- <span>${option.label}</span>
58
- </label>
45
+ return html `
46
+ <label class="flag">
47
+ <input
48
+ type="checkbox"
49
+ .checked=${mask === undefined ? false : hasFlag(mask, option.value)}
50
+ .indeterminate=${mask === undefined}
51
+ ?disabled=${this.disabled || option.disabled === true}
52
+ aria-readonly=${this.readonlyAria}
53
+ aria-disabled=${this.lockedAria}
54
+ aria-description=${this.lockDescription}
55
+ @click=${(event) => this.#onToggle(option, event)}
56
+ >
57
+ <span>${option.label}</span>
58
+ </label>
59
59
  `;
60
60
  }
61
61
  #onToggle(option, event) {
@@ -2,64 +2,64 @@
2
2
  import { css } from "lit";
3
3
  // Import Internal Dependencies
4
4
  import { fillTransition } from "../theme/styles/mixins.js";
5
- export const flagsStyles = css `
6
- .flags {
7
- display: flex;
8
- flex-wrap: wrap;
9
- flex: 1 1 auto;
10
- gap: var(--jolly-space-1, 4px);
11
- min-width: 0;
12
- padding: 2px 0;
13
- }
14
-
15
- /*
16
- * Each flag is its own filled pill, which gives the checkbox inside it
17
- * somewhere to show hover and focus.
18
- */
19
- .flag {
20
- display: inline-flex;
21
- align-items: center;
22
- gap: 4px;
23
- height: var(--jolly-control-height, 20px);
24
- padding-inline: var(--jolly-space-1, 4px);
25
- border-radius: var(--jolly-radius-sm, 2px);
26
- background: var(--jolly-control-bg);
27
- cursor: pointer;
28
- user-select: none;
29
- ${fillTransition}
30
- }
31
-
32
- .flag:hover {
33
- background: var(--jolly-control-bg-hover);
34
- }
35
-
36
- .flag:has(input:focus-visible) {
37
- background: var(--jolly-control-bg-focus);
38
- }
39
-
40
- :host([invalid]) .flag {
41
- background: var(--jolly-invalid-bg);
42
- }
43
-
44
- :host([readonly]) .flag {
45
- background: var(--jolly-control-bg-muted);
46
- }
47
-
48
- .value input[type="checkbox"] {
49
- flex: 0 0 auto;
50
- width: 13px;
51
- height: 13px;
52
- margin: 0;
53
- accent-color: var(--jolly-field-active-color);
54
- cursor: inherit;
55
- }
56
-
57
- .value input[type="checkbox"]:focus-visible {
58
- outline: none;
59
- }
60
-
61
- :host([disabled]) .flag {
62
- cursor: default;
63
- }
5
+ export const flagsStyles = css `
6
+ .flags {
7
+ display: flex;
8
+ flex-wrap: wrap;
9
+ flex: 1 1 auto;
10
+ gap: var(--jolly-space-1, 4px);
11
+ min-width: 0;
12
+ padding: 2px 0;
13
+ }
14
+
15
+ /*
16
+ * Each flag is its own filled pill, which gives the checkbox inside it
17
+ * somewhere to show hover and focus.
18
+ */
19
+ .flag {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ gap: 4px;
23
+ height: var(--jolly-control-height, 20px);
24
+ padding-inline: var(--jolly-space-1, 4px);
25
+ border-radius: var(--jolly-radius-sm, 2px);
26
+ background: var(--jolly-control-bg);
27
+ cursor: pointer;
28
+ user-select: none;
29
+ ${fillTransition}
30
+ }
31
+
32
+ .flag:hover {
33
+ background: var(--jolly-control-bg-hover);
34
+ }
35
+
36
+ .flag:has(input:focus-visible) {
37
+ background: var(--jolly-control-bg-focus);
38
+ }
39
+
40
+ :host([invalid]) .flag {
41
+ background: var(--jolly-invalid-bg);
42
+ }
43
+
44
+ :host([readonly]) .flag {
45
+ background: var(--jolly-control-bg-muted);
46
+ }
47
+
48
+ .value input[type="checkbox"] {
49
+ flex: 0 0 auto;
50
+ width: 13px;
51
+ height: 13px;
52
+ margin: 0;
53
+ accent-color: var(--jolly-field-active-color);
54
+ cursor: inherit;
55
+ }
56
+
57
+ .value input[type="checkbox"]:focus-visible {
58
+ outline: none;
59
+ }
60
+
61
+ :host([disabled]) .flag {
62
+ cursor: default;
63
+ }
64
64
  `;
65
65
  //# sourceMappingURL=Flags.styles.js.map
@@ -62,27 +62,27 @@ let NumberField = class NumberField extends JollyField {
62
62
  return this.editable && !this.mixed;
63
63
  }
64
64
  renderValue() {
65
- return html `
66
- <div class="wrap">
67
- <span class="scrub-handle" aria-hidden="true"></span>
68
- <input
69
- type="text"
70
- inputmode="decimal"
71
- .value=${this.draft ?? this.#displayed}
72
- placeholder=${this.mixed ? MIXED_PLACEHOLDER : ""}
73
- ?disabled=${this.disabled}
74
- ?readonly=${this.inputReadonly}
75
- ?data-pointer-focus=${this.#pointerFocus.active}
76
- aria-readonly=${this.readonlyAria}
77
- aria-disabled=${this.lockedAria}
78
- aria-description=${this.lockDescription}
79
- aria-invalid=${this.displayError === null ? nothing : "true"}
80
- @input=${this.onDraftInput}
81
- @focus=${this.#pointerFocus.onFocus}
82
- @keydown=${this.#onKeyDown}
83
- @blur=${this.#onBlur}
84
- >
85
- </div>
65
+ return html `
66
+ <div class="wrap">
67
+ <span class="scrub-handle" aria-hidden="true"></span>
68
+ <input
69
+ type="text"
70
+ inputmode="decimal"
71
+ .value=${this.draft ?? this.#displayed}
72
+ placeholder=${this.mixed ? MIXED_PLACEHOLDER : ""}
73
+ ?disabled=${this.disabled}
74
+ ?readonly=${this.inputReadonly}
75
+ ?data-pointer-focus=${this.#pointerFocus.active}
76
+ aria-readonly=${this.readonlyAria}
77
+ aria-disabled=${this.lockedAria}
78
+ aria-description=${this.lockDescription}
79
+ aria-invalid=${this.displayError === null ? nothing : "true"}
80
+ @input=${this.onDraftInput}
81
+ @focus=${this.#pointerFocus.onFocus}
82
+ @keydown=${this.#onKeyDown}
83
+ @blur=${this.#onBlur}
84
+ >
85
+ </div>
86
86
  `;
87
87
  }
88
88
  get #displayed() {