@frontpanel/vue 0.1.0 → 0.2.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.
@@ -0,0 +1,31 @@
1
+ export interface FpKnobProps {
2
+ /** The lowest value, at the knob's 7 o'clock stop. */
3
+ min?: number;
4
+ /** The highest value, at its 5 o'clock stop. */
5
+ max?: number;
6
+ /** The step values snap to. PageUp and PageDown move ten steps. */
7
+ step?: number;
8
+ /** A silkscreen label under the knob, which also names it. Without one, give it an `aria-label`. */
9
+ label?: string;
10
+ /** Turns the value into the words a screen reader says, such as `v => `${v} dB``. */
11
+ valueText?: (value: number) => string;
12
+ disabled?: boolean;
13
+ }
14
+ type __VLS_Props = FpKnobProps;
15
+ type __VLS_ModelProps = {
16
+ modelValue?: number;
17
+ };
18
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
19
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
20
+ valueCommit: (value: number) => any;
21
+ "update:modelValue": (value: number) => any;
22
+ }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
23
+ onValueCommit?: ((value: number) => any) | undefined;
24
+ "onUpdate:modelValue"?: ((value: number) => any) | undefined;
25
+ }>, {
26
+ min: number;
27
+ max: number;
28
+ step: number;
29
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
30
+ declare const _default: typeof __VLS_export;
31
+ export default _default;
@@ -1,3 +1,4 @@
1
+ import type { FpLens } from './lens';
1
2
  export type FpLedColor = 'green' | 'amber' | 'red';
2
3
  export interface FpLedProps {
3
4
  /** The colour it lights in. */
@@ -6,6 +7,8 @@ export interface FpLedProps {
6
7
  lit?: boolean;
7
8
  /** Blinks twice when it lights, then holds, to confirm an action. Re-key the LED to blink again. */
8
9
  blink?: boolean;
10
+ /** How its light spreads. Unset, it takes the lens set around it (`fp-lens-*`), else diffused. */
11
+ lens?: FpLens;
9
12
  /** Announces the LED as an image with this name. Without it the LED is decorative: say its state in text nearby. */
10
13
  label?: string;
11
14
  }
@@ -0,0 +1,32 @@
1
+ import type { FpLens } from './lens';
2
+ export interface FpMeterProps {
3
+ /** The level to show. Values past the ends light all or none of it. */
4
+ value?: number;
5
+ /** The level at the bottom (or the start, lying on its side). */
6
+ min?: number;
7
+ /** The level at the top (or the end). */
8
+ max?: number;
9
+ /** How many LED segments it has. A segment lights once the value reaches it. */
10
+ segments?: number;
11
+ /** Where amber begins, in the value's units. Defaults to 70 percent of the range. */
12
+ amberAt?: number;
13
+ /** Where red begins, in the value's units. Defaults to 90 percent of the range. */
14
+ redAt?: number;
15
+ /** Stands up, like a channel's level, or lies on its side. */
16
+ orientation?: 'vertical' | 'horizontal';
17
+ /** How its segments light. Unset, it takes the lens set around it (`fp-lens-*`), else diffused. */
18
+ lens?: FpLens;
19
+ /** A silkscreen label under the meter, which also names it. Without one, give it an `aria-label`. */
20
+ label?: string;
21
+ /** Turns the value into the words a screen reader says, such as `v => `${v} dB``. */
22
+ valueText?: (value: number) => string;
23
+ }
24
+ declare const __VLS_export: import("vue").DefineComponent<FpMeterProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FpMeterProps> & Readonly<{}>, {
25
+ value: number;
26
+ min: number;
27
+ max: number;
28
+ segments: number;
29
+ orientation: "vertical" | "horizontal";
30
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
31
+ declare const _default: typeof __VLS_export;
32
+ export default _default;
@@ -0,0 +1,22 @@
1
+ import type { FpLedColor } from './FpLed.vue';
2
+ import type { FpLens } from './lens';
3
+ export interface FpReadoutProps {
4
+ /**
5
+ * What it shows. Digits, a minus, a space and the letters a seven-segment display can draw; a `.`
6
+ * lights the decimal point of the digit before it, and a `:` adds a colon.
7
+ */
8
+ value: string | number;
9
+ /** How many digit cells it has, padded with dark cells on the left. Colons do not count. */
10
+ digits?: number;
11
+ /** The colour its segments light in. */
12
+ color?: FpLedColor;
13
+ /** How its segments light. Unset, it takes the lens set around it (`fp-lens-*`), else diffused. */
14
+ lens?: FpLens;
15
+ /** Turns the value into the words a screen reader says, such as `v => `${v} dB``. */
16
+ valueText?: (value: string) => string;
17
+ }
18
+ declare const __VLS_export: import("vue").DefineComponent<FpReadoutProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FpReadoutProps> & Readonly<{}>, {
19
+ color: FpLedColor;
20
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
21
+ declare const _default: typeof __VLS_export;
22
+ export default _default;
@@ -0,0 +1,34 @@
1
+ export interface FpSliderProps {
2
+ /** The lowest value, at the bottom (or the start, lying on its side). */
3
+ min?: number;
4
+ /** The highest value, at the top (or the end). */
5
+ max?: number;
6
+ /** The step values snap to. PageUp, PageDown and Shift with an arrow move ten steps. */
7
+ step?: number;
8
+ /** Stands up, like a mixer channel, or lies on its side. */
9
+ orientation?: 'vertical' | 'horizontal';
10
+ /** A silkscreen label under the fader, which also names it. Without one, give it an `aria-label`. */
11
+ label?: string;
12
+ /** Turns the value into the words a screen reader says, such as `v => `${v} dB``. */
13
+ valueText?: (value: number) => string;
14
+ disabled?: boolean;
15
+ }
16
+ type __VLS_Props = FpSliderProps;
17
+ type __VLS_ModelProps = {
18
+ modelValue?: number;
19
+ };
20
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
21
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
22
+ valueCommit: (value: number) => any;
23
+ "update:modelValue": (value: number) => any;
24
+ }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
25
+ onValueCommit?: ((value: number) => any) | undefined;
26
+ "onUpdate:modelValue"?: ((value: number) => any) | undefined;
27
+ }>, {
28
+ min: number;
29
+ max: number;
30
+ step: number;
31
+ orientation: "vertical" | "horizontal";
32
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
33
+ declare const _default: typeof __VLS_export;
34
+ export default _default;
@@ -1,4 +1,10 @@
1
+ import type { PrimitiveProps } from 'reka-ui';
1
2
  export interface FpWindowProps {
3
+ /**
4
+ * The window's element. A `section` or `aside` is a landmark named by the title; a `div` is not a
5
+ * landmark.
6
+ */
7
+ as?: PrimitiveProps['as'];
2
8
  /** The window's name, shown in the title bar; it also names the window for assistive tech. */
3
9
  title: string;
4
10
  /** The title's heading level. */
@@ -15,6 +21,8 @@ export interface FpWindowProps {
15
21
  * Position the sheet and choose when to use it yourself; wrap it in `<Transition name="fp-sheet">`.
16
22
  */
17
23
  sheet?: boolean;
24
+ /** Leaves the body unpadded, for contents that run edge to edge, like a list or a rack of rows. */
25
+ flush?: boolean;
18
26
  }
19
27
  type __VLS_Slots = {
20
28
  default?: () => unknown;
@@ -26,6 +34,7 @@ declare const __VLS_base: import("vue").DefineComponent<FpWindowProps, {}, {}, {
26
34
  }, string, import("vue").PublicProps, Readonly<FpWindowProps> & Readonly<{
27
35
  onClose?: (() => any) | undefined;
28
36
  }>, {
37
+ as: import("reka-ui").AsTag | import("vue").Component;
29
38
  level: 2 | 3 | 4 | 5 | 6;
30
39
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
31
40
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
package/dist/index.d.ts CHANGED
@@ -11,18 +11,28 @@ export { default as FpHousing } from './FpHousing.vue';
11
11
  export type { FpHousingProps } from './FpHousing.vue';
12
12
  export { default as FpIcon } from './FpIcon.vue';
13
13
  export type { FpIconProps } from './FpIcon.vue';
14
+ export { default as FpKnob } from './FpKnob.vue';
15
+ export type { FpKnobProps } from './FpKnob.vue';
14
16
  export { default as FpLcd } from './FpLcd.vue';
15
17
  export type { FpLcdProps } from './FpLcd.vue';
16
18
  export { default as FpLcdLine } from './FpLcdLine.vue';
17
19
  export type { FpLcdLineProps } from './FpLcdLine.vue';
18
20
  export { default as FpLed } from './FpLed.vue';
19
21
  export type { FpLedColor, FpLedProps } from './FpLed.vue';
22
+ export { default as FpMeter } from './FpMeter.vue';
23
+ export type { FpMeterProps } from './FpMeter.vue';
24
+ export { default as FpReadout } from './FpReadout.vue';
25
+ export type { FpReadoutProps } from './FpReadout.vue';
20
26
  export { default as FpScrew } from './FpScrew.vue';
21
27
  export { default as FpSilk } from './FpSilk.vue';
22
28
  export type { FpSilkProps } from './FpSilk.vue';
29
+ export { default as FpSlider } from './FpSlider.vue';
30
+ export type { FpSliderProps } from './FpSlider.vue';
23
31
  export { default as FpWell } from './FpWell.vue';
24
32
  export type { FpWellProps } from './FpWell.vue';
25
33
  export { default as FpWindow } from './FpWindow.vue';
26
34
  export type { FpWindowProps } from './FpWindow.vue';
27
35
  export { fpIconNames } from './icons';
28
36
  export type { FpIconName } from './icons';
37
+ export type { FpLens } from './lens';
38
+ export { fpReadoutGlyph } from './readout';
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { computed as e, createBlock as t, createCommentVNode as n, createElementBlock as r, createElementVNode as i, createTextVNode as a, createVNode as o, defineComponent as s, normalizeClass as c, normalizeStyle as l, openBlock as u, renderSlot as d, resolveDynamicComponent as f, shallowRef as p, toDisplayString as m, unref as h, useId as g, useTemplateRef as _, warn as v, watch as y, withCtx as b } from "vue";
2
- import { Primitive as x } from "reka-ui";
1
+ import { Fragment as e, computed as t, createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createTextVNode as o, createVNode as s, defineComponent as c, mergeModels as l, mergeProps as u, normalizeClass as d, normalizeStyle as f, openBlock as p, renderList as m, renderSlot as h, resolveDynamicComponent as g, shallowRef as _, toDisplayString as v, unref as y, useAttrs as b, useId as x, useModel as S, useTemplateRef as C, warn as w, watch as T, withCtx as E } from "vue";
2
+ import { Primitive as D, SliderRoot as O, SliderThumb as k, SliderTrack as A } from "reka-ui";
3
3
  //#endregion
4
4
  //#region src/FpButton.vue
5
- var S = /* @__PURE__ */ s({
5
+ var j = /* @__PURE__ */ c({
6
6
  __name: "FpButton",
7
7
  props: {
8
8
  pressed: {
@@ -13,15 +13,15 @@ var S = /* @__PURE__ */ s({
13
13
  as: { default: "button" }
14
14
  },
15
15
  setup(e) {
16
- let n = e;
17
- return (e, r) => (u(), t(h(x), {
18
- as: n.as,
19
- "as-child": n.asChild,
16
+ let t = e;
17
+ return (e, r) => (p(), n(y(D), {
18
+ as: t.as,
19
+ "as-child": t.asChild,
20
20
  class: "fp-chrome-btn",
21
- type: n.as === "button" && !n.asChild ? "button" : void 0,
22
- "aria-pressed": n.pressed
21
+ type: t.as === "button" && !t.asChild ? "button" : void 0,
22
+ "aria-pressed": t.pressed
23
23
  }, {
24
- default: b(() => [d(e.$slots, "default")]),
24
+ default: E(() => [h(e.$slots, "default")]),
25
25
  _: 3
26
26
  }, 8, [
27
27
  "as",
@@ -30,7 +30,7 @@ var S = /* @__PURE__ */ s({
30
30
  "aria-pressed"
31
31
  ]));
32
32
  }
33
- }), C = /* @__PURE__ */ s({
33
+ }), M = /* @__PURE__ */ c({
34
34
  __name: "FpCap",
35
35
  props: {
36
36
  color: { default: "white" },
@@ -42,21 +42,21 @@ var S = /* @__PURE__ */ s({
42
42
  as: { default: "button" }
43
43
  },
44
44
  setup(e) {
45
- let n = e, r = {
45
+ let t = e, r = {
46
46
  white: void 0,
47
47
  blue: "fp-cap-blue",
48
48
  amber: "fp-cap-amber",
49
49
  graphite: "fp-cap-graphite",
50
50
  berry: "fp-cap-berry"
51
51
  };
52
- return (e, i) => (u(), t(h(x), {
53
- as: n.as,
54
- "as-child": n.asChild,
55
- class: c(["fp-cap", r[n.color]]),
56
- type: n.as === "button" && !n.asChild ? "button" : void 0,
57
- "aria-pressed": n.pressed
52
+ return (e, i) => (p(), n(y(D), {
53
+ as: t.as,
54
+ "as-child": t.asChild,
55
+ class: d(["fp-cap", r[t.color]]),
56
+ type: t.as === "button" && !t.asChild ? "button" : void 0,
57
+ "aria-pressed": t.pressed
58
58
  }, {
59
- default: b(() => [d(e.$slots, "default")]),
59
+ default: E(() => [h(e.$slots, "default")]),
60
60
  _: 3
61
61
  }, 8, [
62
62
  "as",
@@ -69,7 +69,7 @@ var S = /* @__PURE__ */ s({
69
69
  });
70
70
  //#endregion
71
71
  //#region src/fit.ts
72
- function w(e, t, n, r) {
72
+ function ee(e, t, n, r) {
73
73
  if (t.width <= 0 || n.width <= 0) return null;
74
74
  let i = t.width / n.width;
75
75
  if (e === "contain") {
@@ -80,7 +80,7 @@ function w(e, t, n, r) {
80
80
  }
81
81
  //#endregion
82
82
  //#region src/FpDevice.vue?vue&type=script&setup=true&lang.ts
83
- var T = { class: "fp-device-body" }, E = /* @__PURE__ */ s({
83
+ var te = { class: "fp-device-body" }, ne = /* @__PURE__ */ c({
84
84
  __name: "FpDevice",
85
85
  props: {
86
86
  backdrop: {
@@ -96,85 +96,85 @@ var T = { class: "fp-device-body" }, E = /* @__PURE__ */ s({
96
96
  height: {},
97
97
  maxScale: { default: 1 }
98
98
  },
99
- setup(t) {
100
- let n = t, a = _("stage"), o = _("device"), s = p({
99
+ setup(e) {
100
+ let n = e, r = C("stage"), o = C("device"), s = _({
101
101
  width: 0,
102
102
  height: 0
103
- }), f = p(0), m = e(() => n.fit === "none" ? !1 : n.width !== void 0 || (v(`FpDevice: fit="${n.fit}" needs a design width; the device is not scaled.`), !1)), h = e(() => n.height ?? f.value), g = e(() => !m.value || n.fit === "none" ? null : w(n.fit, s.value, {
103
+ }), c = _(0), l = t(() => n.fit === "none" ? !1 : n.width !== void 0 || (w(`FpDevice: fit="${n.fit}" needs a design width; the device is not scaled.`), !1)), u = t(() => n.height ?? c.value), m = t(() => !l.value || n.fit === "none" ? null : ee(n.fit, s.value, {
104
104
  width: n.width,
105
- height: h.value
105
+ height: u.value
106
106
  }, n.maxScale));
107
- function b() {
108
- if (!a.value || !o.value) return;
109
- let e = getComputedStyle(a.value), t = (e) => Number.parseFloat(e) || 0;
107
+ function g() {
108
+ if (!r.value || !o.value) return;
109
+ let e = getComputedStyle(r.value), t = (e) => Number.parseFloat(e) || 0;
110
110
  s.value = {
111
- width: a.value.clientWidth - t(e.paddingLeft) - t(e.paddingRight),
112
- height: a.value.clientHeight - t(e.paddingTop) - t(e.paddingBottom)
113
- }, f.value = o.value.offsetHeight;
111
+ width: r.value.clientWidth - t(e.paddingLeft) - t(e.paddingRight),
112
+ height: r.value.clientHeight - t(e.paddingTop) - t(e.paddingBottom)
113
+ }, c.value = o.value.offsetHeight;
114
114
  }
115
- y([
116
- m,
117
- a,
115
+ T([
116
+ l,
117
+ r,
118
118
  o
119
119
  ], ([e, t, n], r, i) => {
120
120
  if (!e || !t || !n || typeof ResizeObserver > "u") return;
121
- let a = new ResizeObserver(b);
121
+ let a = new ResizeObserver(g);
122
122
  a.observe(t), a.observe(n), i(() => a.disconnect());
123
123
  }, {
124
124
  flush: "post",
125
125
  immediate: !0
126
126
  });
127
- let x = e(() => m.value ? { contain: "inline-size" } : void 0), S = e(() => {
128
- if (!m.value) return { display: "contents" };
129
- if (g.value !== null) return {
130
- width: `${n.width * g.value}px`,
131
- height: `${h.value * g.value}px`,
127
+ let v = t(() => l.value ? { contain: "inline-size" } : void 0), y = t(() => {
128
+ if (!l.value) return { display: "contents" };
129
+ if (m.value !== null) return {
130
+ width: `${n.width * m.value}px`,
131
+ height: `${u.value * m.value}px`,
132
132
  marginInline: "auto"
133
133
  };
134
- }), C = e(() => {
135
- if (m.value) return {
134
+ }), b = t(() => {
135
+ if (l.value) return {
136
136
  boxSizing: "border-box",
137
137
  width: `${n.width}px`,
138
138
  height: n.height === void 0 ? void 0 : `${n.height}px`,
139
- scale: g.value ?? void 0,
139
+ scale: m.value ?? void 0,
140
140
  transformOrigin: "0 0",
141
- visibility: g.value === null ? "hidden" : void 0
141
+ visibility: m.value === null ? "hidden" : void 0
142
142
  };
143
143
  });
144
- return (e, t) => (u(), r("div", {
144
+ return (e, t) => (p(), i("div", {
145
145
  ref_key: "stage",
146
- ref: a,
147
- class: c({ "fp-device-backdrop": n.backdrop }),
148
- style: l(x.value)
149
- }, [i("div", { style: l(S.value) }, [n.rim ? (u(), r("div", {
146
+ ref: r,
147
+ class: d({ "fp-device-backdrop": n.backdrop }),
148
+ style: f(v.value)
149
+ }, [a("div", { style: f(y.value) }, [n.rim ? (p(), i("div", {
150
150
  key: 0,
151
151
  ref_key: "device",
152
152
  ref: o,
153
153
  class: "fp-device-rim",
154
- style: l(C.value)
155
- }, [i("div", T, [d(e.$slots, "default")])], 4)) : (u(), r("div", {
154
+ style: f(b.value)
155
+ }, [a("div", te, [h(e.$slots, "default")])], 4)) : (p(), i("div", {
156
156
  key: 1,
157
157
  ref_key: "device",
158
158
  ref: o,
159
159
  class: "fp-device-body",
160
- style: l(C.value)
161
- }, [d(e.$slots, "default")], 4))], 4)], 6));
160
+ style: f(b.value)
161
+ }, [h(e.$slots, "default")], 4))], 4)], 6));
162
162
  }
163
- }), D = /* @__PURE__ */ s({
163
+ }), re = /* @__PURE__ */ c({
164
164
  __name: "FpGelButton",
165
165
  props: {
166
166
  asChild: { type: Boolean },
167
167
  as: { default: "button" }
168
168
  },
169
169
  setup(e) {
170
- let n = e;
171
- return (e, r) => (u(), t(h(x), {
172
- as: n.as,
173
- "as-child": n.asChild,
170
+ let t = e;
171
+ return (e, r) => (p(), n(y(D), {
172
+ as: t.as,
173
+ "as-child": t.asChild,
174
174
  class: "fp-gel",
175
- type: n.as === "button" && !n.asChild ? "button" : void 0
175
+ type: t.as === "button" && !t.asChild ? "button" : void 0
176
176
  }, {
177
- default: b(() => [d(e.$slots, "default")]),
177
+ default: E(() => [h(e.$slots, "default")]),
178
178
  _: 3
179
179
  }, 8, [
180
180
  "as",
@@ -182,24 +182,24 @@ var T = { class: "fp-device-body" }, E = /* @__PURE__ */ s({
182
182
  "type"
183
183
  ]));
184
184
  }
185
- }), O = /* @__PURE__ */ s({
185
+ }), N = /* @__PURE__ */ c({
186
186
  __name: "FpHousing",
187
187
  props: {
188
188
  asChild: { type: Boolean },
189
189
  as: { default: "span" }
190
190
  },
191
191
  setup(e) {
192
- let n = e;
193
- return (e, r) => (u(), t(h(x), {
194
- as: n.as,
195
- "as-child": n.asChild,
192
+ let t = e;
193
+ return (e, r) => (p(), n(y(D), {
194
+ as: t.as,
195
+ "as-child": t.asChild,
196
196
  class: "fp-housing"
197
197
  }, {
198
- default: b(() => [d(e.$slots, "default")]),
198
+ default: E(() => [h(e.$slots, "default")]),
199
199
  _: 3
200
200
  }, 8, ["as", "as-child"]));
201
201
  }
202
- }), k = [
202
+ }), P = [
203
203
  "................",
204
204
  "................",
205
205
  ".....#..........",
@@ -216,7 +216,7 @@ var T = { class: "fp-device-body" }, E = /* @__PURE__ */ s({
216
216
  "................",
217
217
  "................",
218
218
  "................"
219
- ], A = [
219
+ ], F = [
220
220
  "................",
221
221
  "................",
222
222
  ".........##.....",
@@ -233,7 +233,7 @@ var T = { class: "fp-device-body" }, E = /* @__PURE__ */ s({
233
233
  ".........##.....",
234
234
  "................",
235
235
  "................"
236
- ], j = (e) => e.map((e) => [...e].reverse().join("")), M = {
236
+ ], I = (e) => e.map((e) => [...e].reverse().join("")), L = {
237
237
  add: [
238
238
  "................",
239
239
  "................",
@@ -270,8 +270,8 @@ var T = { class: "fp-device-body" }, E = /* @__PURE__ */ s({
270
270
  "................",
271
271
  "................"
272
272
  ],
273
- left: A,
274
- right: j(A),
273
+ left: F,
274
+ right: I(F),
275
275
  go: [
276
276
  "................",
277
277
  "................",
@@ -290,8 +290,8 @@ var T = { class: "fp-device-body" }, E = /* @__PURE__ */ s({
290
290
  "................",
291
291
  "................"
292
292
  ],
293
- undo: k,
294
- redo: j(k),
293
+ undo: P,
294
+ redo: I(P),
295
295
  home: [
296
296
  "................",
297
297
  ".......##.......",
@@ -491,7 +491,7 @@ var T = { class: "fp-device-body" }, E = /* @__PURE__ */ s({
491
491
  "................"
492
492
  ]
493
493
  };
494
- function N(e) {
494
+ function ie(e) {
495
495
  let t = "";
496
496
  return e.forEach((e, n) => {
497
497
  let r = 0;
@@ -507,48 +507,153 @@ function N(e) {
507
507
  }
508
508
  }), t;
509
509
  }
510
- var P = Object.keys(M), F = Object.fromEntries(P.map((e) => [e, N(M[e])])), I = [
510
+ var R = Object.keys(L), z = Object.fromEntries(R.map((e) => [e, ie(L[e])])), B = [
511
511
  "role",
512
512
  "aria-label",
513
513
  "aria-hidden"
514
- ], L = ["d"], R = /* @__PURE__ */ s({
514
+ ], V = ["d"], H = /* @__PURE__ */ c({
515
515
  __name: "FpIcon",
516
516
  props: {
517
517
  name: {},
518
518
  label: {}
519
519
  },
520
- setup(t) {
521
- let n = t, a = e(() => F[n.name]);
522
- return (e, t) => (u(), r("svg", {
520
+ setup(e) {
521
+ let n = e, r = t(() => z[n.name]);
522
+ return (e, t) => (p(), i("svg", {
523
523
  viewBox: "0 0 16 16",
524
524
  class: "fp-icon",
525
525
  role: n.label ? "img" : void 0,
526
526
  "aria-label": n.label || void 0,
527
527
  "aria-hidden": n.label ? void 0 : "true"
528
- }, [i("path", { d: a.value }, null, 8, L)], 8, I));
528
+ }, [a("path", { d: r.value }, null, 8, V)], 8, B));
529
+ }
530
+ }), U = [
531
+ "tabindex",
532
+ "aria-valuemin",
533
+ "aria-valuemax",
534
+ "aria-valuenow",
535
+ "aria-valuetext",
536
+ "aria-labelledby",
537
+ "aria-disabled"
538
+ ], W = ["id"], G = 200, K = .1, q = 270, J = /* @__PURE__ */ c({
539
+ inheritAttrs: !1,
540
+ __name: "FpKnob",
541
+ props: /*@__PURE__*/ l({
542
+ min: { default: 0 },
543
+ max: { default: 100 },
544
+ step: { default: 1 },
545
+ label: {},
546
+ valueText: {},
547
+ disabled: { type: Boolean }
548
+ }, {
549
+ modelValue: { default: 0 },
550
+ modelModifiers: {}
551
+ }),
552
+ emits: /*@__PURE__*/ l(["valueCommit"], ["update:modelValue"]),
553
+ setup(e, { emit: n }) {
554
+ let o = e, s = n, c = S(e, "modelValue"), l = b(), d = t(() => ({
555
+ class: l.class,
556
+ style: l.style
557
+ })), m = t(() => {
558
+ let { class: e, style: t, ...n } = l;
559
+ return n;
560
+ }), h = x(), g = t(() => (String(o.step).split(".")[1] ?? "").length);
561
+ function _(e) {
562
+ let t = Math.round((e - o.min) / o.step) * o.step + o.min, n = Math.min(o.max, Math.max(o.min, t));
563
+ return Number(n.toFixed(g.value));
564
+ }
565
+ let C = t(() => _(c.value)), w = t(() => {
566
+ let e = o.max - o.min, t = e > 0 ? (C.value - o.min) / e : 0;
567
+ return Math.round(t * q - q / 2);
568
+ });
569
+ function T(e) {
570
+ let t = _(e);
571
+ return t !== C.value && (c.value = t, !0);
572
+ }
573
+ function E(e) {
574
+ if (o.disabled) return;
575
+ let t = o.step * 10, n = {
576
+ ArrowUp: C.value + o.step,
577
+ ArrowRight: C.value + o.step,
578
+ ArrowDown: C.value - o.step,
579
+ ArrowLeft: C.value - o.step,
580
+ PageUp: C.value + t,
581
+ PageDown: C.value - t,
582
+ Home: o.min,
583
+ End: o.max
584
+ }[e.key];
585
+ n !== void 0 && (e.preventDefault(), T(n) && s("valueCommit", _(n)));
586
+ }
587
+ let D;
588
+ function O(e) {
589
+ if (o.disabled || e.button !== 0) return;
590
+ let t = e.currentTarget;
591
+ t.setPointerCapture?.(e.pointerId), t.focus({
592
+ preventScroll: !0,
593
+ focusVisible: !1
594
+ }), D = {
595
+ pointerId: e.pointerId,
596
+ y: e.clientY,
597
+ raw: C.value,
598
+ start: C.value
599
+ };
600
+ }
601
+ function k(e) {
602
+ if (!D || e.pointerId !== D.pointerId) return;
603
+ let t = (o.max - o.min) / G * (e.shiftKey ? K : 1);
604
+ D.raw = Math.min(o.max, Math.max(o.min, D.raw + (D.y - e.clientY) * t)), D.y = e.clientY, T(D.raw);
605
+ }
606
+ function A(e) {
607
+ if (!D || e.pointerId !== D.pointerId) return;
608
+ let t = _(D.raw), n = t !== D.start;
609
+ D = void 0, n && s("valueCommit", t);
610
+ }
611
+ return (e, t) => (p(), i("div", u({ class: "fp-unit" }, d.value), [a("div", u(m.value, {
612
+ class: "fp-knob",
613
+ role: "slider",
614
+ tabindex: o.disabled ? void 0 : 0,
615
+ "aria-valuemin": o.min,
616
+ "aria-valuemax": o.max,
617
+ "aria-valuenow": C.value,
618
+ "aria-valuetext": o.valueText?.(C.value),
619
+ "aria-labelledby": o.label ? y(h) : void 0,
620
+ "aria-disabled": o.disabled || void 0,
621
+ onKeydown: E,
622
+ onPointerdown: O,
623
+ onPointermove: k,
624
+ onPointerup: A,
625
+ onPointercancel: A
626
+ }), [a("span", {
627
+ class: "fp-knob-mark",
628
+ style: f({ rotate: `${w.value}deg` })
629
+ }, null, 4)], 16, U), o.label ? (p(), i("span", {
630
+ key: 0,
631
+ id: y(h),
632
+ class: "fp-silk"
633
+ }, v(o.label), 9, W)) : r("", !0)], 16));
529
634
  }
530
- }), z = /* @__PURE__ */ s({
635
+ }), Y = /* @__PURE__ */ c({
531
636
  __name: "FpLcd",
532
637
  props: {
533
638
  asChild: { type: Boolean },
534
639
  as: { default: "div" }
535
640
  },
536
641
  setup(e) {
537
- let n = e;
538
- return (e, r) => (u(), t(h(x), {
539
- as: n.as,
540
- "as-child": n.asChild,
642
+ let t = e;
643
+ return (e, r) => (p(), n(y(D), {
644
+ as: t.as,
645
+ "as-child": t.asChild,
541
646
  class: "fp-lcd"
542
647
  }, {
543
- default: b(() => [d(e.$slots, "default")]),
648
+ default: E(() => [h(e.$slots, "default")]),
544
649
  _: 3
545
650
  }, 8, ["as", "as-child"]));
546
651
  }
547
- }), B = {
652
+ }), ae = {
548
653
  key: 0,
549
654
  class: "fp-lcd-ghost",
550
655
  "aria-hidden": "true"
551
- }, V = { key: 2 }, H = /* @__PURE__ */ s({
656
+ }, oe = { key: 2 }, se = /* @__PURE__ */ c({
552
657
  __name: "FpLcdLine",
553
658
  props: {
554
659
  text: {},
@@ -558,30 +663,35 @@ var P = Object.keys(M), F = Object.fromEntries(P.map((e) => [e, N(M[e])])), I =
558
663
  asChild: { type: Boolean },
559
664
  as: { default: "p" }
560
665
  },
561
- setup(i) {
562
- let a = i, o = e(() => "8".repeat(a.cells ?? a.text.length));
563
- return (e, i) => (u(), t(h(x), {
666
+ setup(e) {
667
+ let a = e, o = t(() => "8".repeat(a.cells ?? a.text.length));
668
+ return (e, t) => (p(), n(y(D), {
564
669
  as: a.as,
565
670
  "as-child": a.asChild,
566
671
  class: "fp-lcd-line"
567
672
  }, {
568
- default: b(() => [a.ghost ? (u(), r("span", B, m(o.value), 1)) : n("", !0), a.redraw ? (u(), r("span", {
673
+ default: E(() => [a.ghost ? (p(), i("span", ae, v(o.value), 1)) : r("", !0), a.redraw ? (p(), i("span", {
569
674
  key: a.text,
570
675
  class: "fp-lcd-redraw"
571
- }, m(a.text), 1)) : (u(), r("span", V, m(a.text), 1))]),
676
+ }, v(a.text), 1)) : (p(), i("span", oe, v(a.text), 1))]),
572
677
  _: 1
573
678
  }, 8, ["as", "as-child"]));
574
679
  }
575
- }), U = [
680
+ }), X = {
681
+ flat: "fp-lens-flat",
682
+ diffused: "fp-lens-diffused",
683
+ clear: "fp-lens-clear"
684
+ }, ce = [
576
685
  "role",
577
686
  "aria-label",
578
687
  "aria-hidden"
579
- ], W = /* @__PURE__ */ s({
688
+ ], le = /* @__PURE__ */ c({
580
689
  __name: "FpLed",
581
690
  props: {
582
691
  color: { default: "green" },
583
692
  lit: { type: Boolean },
584
693
  blink: { type: Boolean },
694
+ lens: {},
585
695
  label: {}
586
696
  },
587
697
  setup(e) {
@@ -590,92 +700,336 @@ var P = Object.keys(M), F = Object.fromEntries(P.map((e) => [e, N(M[e])])), I =
590
700
  amber: "fp-led-amber",
591
701
  red: "fp-led-red"
592
702
  };
593
- return (e, i) => (u(), r("span", {
594
- class: c(["fp-led", [n[t.color], {
595
- "fp-led-lit": t.lit,
596
- "fp-blink-twice": t.lit && t.blink
597
- }]]),
703
+ return (e, r) => (p(), i("span", {
704
+ class: d(["fp-led", [
705
+ n[t.color],
706
+ t.lens && y(X)[t.lens],
707
+ {
708
+ "fp-led-lit": t.lit,
709
+ "fp-blink-twice": t.lit && t.blink
710
+ }
711
+ ]]),
598
712
  role: t.label ? "img" : void 0,
599
713
  "aria-label": t.label || void 0,
600
714
  "aria-hidden": t.label ? void 0 : "true"
601
- }, null, 10, U));
715
+ }, null, 10, ce));
716
+ }
717
+ }), ue = [
718
+ "data-orientation",
719
+ "aria-valuemin",
720
+ "aria-valuemax",
721
+ "aria-valuenow",
722
+ "aria-valuetext",
723
+ "aria-labelledby"
724
+ ], de = ["id"], fe = /* @__PURE__ */ c({
725
+ inheritAttrs: !1,
726
+ __name: "FpMeter",
727
+ props: {
728
+ value: { default: 0 },
729
+ min: { default: 0 },
730
+ max: { default: 100 },
731
+ segments: { default: 12 },
732
+ amberAt: {},
733
+ redAt: {},
734
+ orientation: { default: "vertical" },
735
+ lens: {},
736
+ label: {},
737
+ valueText: {}
738
+ },
739
+ setup(e) {
740
+ let n = e, o = b(), s = t(() => ({
741
+ class: o.class,
742
+ style: o.style
743
+ })), c = t(() => {
744
+ let { class: e, style: t, ...n } = o;
745
+ return n;
746
+ }), l = x(), d = t(() => Math.min(n.max, Math.max(n.min, n.value)));
747
+ function f(e) {
748
+ let t = n.max - n.min;
749
+ return t > 0 ? Math.min(1, Math.max(0, (e - n.min) / t)) : 0;
750
+ }
751
+ function m(e, t) {
752
+ return t(f(e) * n.segments + 1e-9) / n.segments;
753
+ }
754
+ let h = t(() => {
755
+ let e = n.max - n.min;
756
+ return {
757
+ "--fp-meter-level": String(m(d.value, Math.floor)),
758
+ "--fp-meter-segments": String(n.segments),
759
+ "--fp-meter-amber": String(m(n.amberAt ?? n.min + e * .7, Math.round)),
760
+ "--fp-meter-red": String(m(n.redAt ?? n.min + e * .9, Math.round))
761
+ };
762
+ });
763
+ return (e, t) => (p(), i("div", u({ class: "fp-unit" }, s.value), [a("div", u(c.value, {
764
+ class: ["fp-meter", n.lens && y(X)[n.lens]],
765
+ role: "meter",
766
+ "data-orientation": n.orientation,
767
+ "aria-valuemin": n.min,
768
+ "aria-valuemax": n.max,
769
+ "aria-valuenow": d.value,
770
+ "aria-valuetext": n.valueText?.(d.value),
771
+ "aria-labelledby": n.label ? y(l) : void 0,
772
+ style: h.value
773
+ }), null, 16, ue), n.label ? (p(), i("span", {
774
+ key: 0,
775
+ id: y(l),
776
+ class: "fp-silk"
777
+ }, v(n.label), 9, de)) : r("", !0)], 16));
778
+ }
779
+ }), Z = {
780
+ 0: "abcdef",
781
+ 1: "bc",
782
+ 2: "abdeg",
783
+ 3: "abcdg",
784
+ 4: "bcfg",
785
+ 5: "acdfg",
786
+ 6: "acdefg",
787
+ 7: "abc",
788
+ 8: "abcdefg",
789
+ 9: "abcdfg",
790
+ "-": "g",
791
+ _: "d",
792
+ "°": "abfg",
793
+ " ": "",
794
+ A: "abcefg",
795
+ B: "cdefg",
796
+ C: "adef",
797
+ c: "deg",
798
+ D: "bcdeg",
799
+ E: "adefg",
800
+ F: "aefg",
801
+ G: "acdef",
802
+ H: "bcefg",
803
+ h: "cefg",
804
+ I: "ef",
805
+ J: "bcde",
806
+ L: "def",
807
+ N: "ceg",
808
+ O: "abcdef",
809
+ o: "cdeg",
810
+ P: "abefg",
811
+ R: "eg",
812
+ S: "acdfg",
813
+ T: "defg",
814
+ U: "bcdef",
815
+ u: "cde",
816
+ Y: "bcdfg"
817
+ };
818
+ function Q(e) {
819
+ return Z[e] ?? Z[e.toUpperCase()] ?? "";
820
+ }
821
+ //#endregion
822
+ //#region src/FpReadout.vue?vue&type=script&setup=true&lang.ts
823
+ var pe = { class: "fp-readout-text" }, me = ["data-colon"], he = { class: "fp-readout-lit" }, ge = ["data-segment"], _e = {
824
+ key: 0,
825
+ "data-segment": "dp"
826
+ }, ve = /* @__PURE__ */ c({
827
+ __name: "FpReadout",
828
+ props: {
829
+ value: {},
830
+ digits: {},
831
+ color: { default: "green" },
832
+ lens: {},
833
+ valueText: {}
834
+ },
835
+ setup(n) {
836
+ let o = n, s = {
837
+ green: "fp-led-green",
838
+ amber: "fp-led-amber",
839
+ red: "fp-led-red"
840
+ }, c = t(() => String(o.value)), l = t(() => {
841
+ let e = [];
842
+ for (let t of c.value) {
843
+ let n = e.at(-1);
844
+ t === ":" ? e.push({ colon: !0 }) : t === "." && n && !n.colon && !n.dot ? n.dot = !0 : t === "." ? e.push({
845
+ colon: !1,
846
+ lit: "",
847
+ dot: !0
848
+ }) : e.push({
849
+ colon: !1,
850
+ lit: Q(t),
851
+ dot: !1
852
+ });
853
+ }
854
+ let t = e.filter((e) => !e.colon).length;
855
+ return [...Array.from({ length: Math.max(0, (o.digits ?? 0) - t) }, () => ({
856
+ colon: !1,
857
+ lit: "",
858
+ dot: !1
859
+ })), ...e];
860
+ });
861
+ return (t, n) => (p(), i("span", { class: d(["fp-readout", [s[o.color], o.lens && y(X)[o.lens]]]) }, [a("span", pe, v(o.valueText ? o.valueText(c.value) : c.value), 1), (p(!0), i(e, null, m(l.value, (t, o) => (p(), i("span", {
862
+ key: o,
863
+ class: "fp-readout-cell",
864
+ "data-colon": t.colon ? "" : void 0,
865
+ "aria-hidden": "true"
866
+ }, [a("span", he, [t.colon ? (p(), i(e, { key: 0 }, [n[0] ||= a("span", { "data-segment": "colon-upper" }, null, -1), n[1] ||= a("span", { "data-segment": "colon-lower" }, null, -1)], 64)) : (p(), i(e, { key: 1 }, [(p(!0), i(e, null, m(t.lit, (e) => (p(), i("span", {
867
+ key: e,
868
+ "data-segment": e
869
+ }, null, 8, ge))), 128)), t.dot ? (p(), i("span", _e)) : r("", !0)], 64))])], 8, me))), 128))], 2));
602
870
  }
603
- }), G = {
871
+ }), $ = {
604
872
  class: "fp-screw",
605
873
  "aria-hidden": "true"
606
- }, K = /* @__PURE__ */ s({
874
+ }, ye = /* @__PURE__ */ c({
607
875
  __name: "FpScrew",
608
876
  setup(e) {
609
- return (e, t) => (u(), r("span", G));
877
+ return (e, t) => (p(), i("span", $));
610
878
  }
611
- }), q = /* @__PURE__ */ s({
879
+ }), be = /* @__PURE__ */ c({
612
880
  __name: "FpSilk",
613
881
  props: {
614
882
  asChild: { type: Boolean },
615
883
  as: { default: "span" }
616
884
  },
617
885
  setup(e) {
618
- let n = e;
619
- return (e, r) => (u(), t(h(x), {
620
- as: n.as,
621
- "as-child": n.asChild,
886
+ let t = e;
887
+ return (e, r) => (p(), n(y(D), {
888
+ as: t.as,
889
+ "as-child": t.asChild,
622
890
  class: "fp-silk"
623
891
  }, {
624
- default: b(() => [d(e.$slots, "default")]),
892
+ default: E(() => [h(e.$slots, "default")]),
625
893
  _: 3
626
894
  }, 8, ["as", "as-child"]));
627
895
  }
628
- }), J = /* @__PURE__ */ s({
896
+ }), xe = ["id"], Se = /* @__PURE__ */ c({
897
+ inheritAttrs: !1,
898
+ __name: "FpSlider",
899
+ props: /*@__PURE__*/ l({
900
+ min: { default: 0 },
901
+ max: { default: 100 },
902
+ step: { default: 1 },
903
+ orientation: { default: "vertical" },
904
+ label: {},
905
+ valueText: {},
906
+ disabled: { type: Boolean }
907
+ }, {
908
+ modelValue: { default: 0 },
909
+ modelModifiers: {}
910
+ }),
911
+ emits: /*@__PURE__*/ l(["valueCommit"], ["update:modelValue"]),
912
+ setup(e, { emit: n }) {
913
+ let a = e, o = n, c = S(e, "modelValue"), l = b(), d = t(() => ({
914
+ class: l.class,
915
+ style: l.style
916
+ })), f = t(() => {
917
+ let { class: e, style: t, ...n } = l;
918
+ return n;
919
+ }), m = x(), h = t(() => [c.value]);
920
+ function g(e) {
921
+ e?.[0] !== void 0 && (c.value = e[0]);
922
+ }
923
+ let _ = C("unit");
924
+ function w(e) {
925
+ a.disabled || e.button !== 0 || _.value?.querySelector("[role=\"slider\"]")?.focus({
926
+ preventScroll: !0,
927
+ focusVisible: !1
928
+ });
929
+ }
930
+ function T(e) {
931
+ e[0] !== void 0 && o("valueCommit", e[0]);
932
+ }
933
+ return (e, t) => (p(), i("div", u({
934
+ ref_key: "unit",
935
+ ref: _,
936
+ class: "fp-unit"
937
+ }, d.value, { onPointerdownCapture: w }), [s(y(O), {
938
+ class: "fp-fader",
939
+ "model-value": h.value,
940
+ min: a.min,
941
+ max: a.max,
942
+ step: a.step,
943
+ orientation: a.orientation,
944
+ disabled: a.disabled,
945
+ "onUpdate:modelValue": g,
946
+ onValueCommit: T
947
+ }, {
948
+ default: E(() => [s(y(A), { class: "fp-fader-slot" }), s(y(k), u(f.value, {
949
+ class: "fp-fader-cap",
950
+ "aria-valuetext": a.valueText?.(c.value),
951
+ "aria-labelledby": a.label ? y(m) : void 0,
952
+ "aria-disabled": a.disabled || void 0
953
+ }), null, 16, [
954
+ "aria-valuetext",
955
+ "aria-labelledby",
956
+ "aria-disabled"
957
+ ])]),
958
+ _: 1
959
+ }, 8, [
960
+ "model-value",
961
+ "min",
962
+ "max",
963
+ "step",
964
+ "orientation",
965
+ "disabled"
966
+ ]), a.label ? (p(), i("span", {
967
+ key: 0,
968
+ id: y(m),
969
+ class: "fp-silk"
970
+ }, v(a.label), 9, xe)) : r("", !0)], 16));
971
+ }
972
+ }), Ce = /* @__PURE__ */ c({
629
973
  __name: "FpWell",
630
974
  props: {
631
975
  asChild: { type: Boolean },
632
976
  as: { default: "div" }
633
977
  },
634
978
  setup(e) {
635
- let n = e;
636
- return (e, r) => (u(), t(h(x), {
637
- as: n.as,
638
- "as-child": n.asChild,
979
+ let t = e;
980
+ return (e, r) => (p(), n(y(D), {
981
+ as: t.as,
982
+ "as-child": t.asChild,
639
983
  class: "fp-well"
640
984
  }, {
641
- default: b(() => [d(e.$slots, "default")]),
985
+ default: E(() => [h(e.$slots, "default")]),
642
986
  _: 3
643
987
  }, 8, ["as", "as-child"]));
644
988
  }
645
- }), Y = ["aria-labelledby"], X = { class: "fp-module-title" }, Z = { class: "fp-window-body" }, Q = /* @__PURE__ */ s({
989
+ }), we = { class: "fp-module-title" }, Te = /* @__PURE__ */ c({
646
990
  __name: "FpWindow",
647
991
  props: {
992
+ as: { default: "section" },
648
993
  title: {},
649
994
  level: { default: 2 },
650
995
  closable: { type: Boolean },
651
996
  closeLabel: {},
652
- sheet: { type: Boolean }
997
+ sheet: { type: Boolean },
998
+ flush: { type: Boolean }
653
999
  },
654
1000
  emits: ["close"],
655
- setup(e, { emit: s }) {
656
- let l = e, p = s, _ = g();
657
- return (e, s) => (u(), r("section", {
658
- class: c(["fp-window", [l.sheet ? "fp-sheet-panel" : "fp-module"]]),
659
- "aria-labelledby": h(_)
660
- }, [i("div", X, [
661
- (u(), t(f(`h${l.level}`), {
662
- id: h(_),
663
- class: "fp-silk fp-window-title"
664
- }, {
665
- default: b(() => [a(m(l.title), 1)]),
666
- _: 1
667
- }, 8, ["id"])),
668
- d(e.$slots, "actions"),
669
- l.closable ? (u(), t(S, {
670
- key: 0,
671
- "aria-label": l.closeLabel ?? `Close ${l.title}`,
672
- onClick: s[0] ||= (e) => p("close")
673
- }, {
674
- default: b(() => [o(R, { name: "close" })]),
675
- _: 1
676
- }, 8, ["aria-label"])) : n("", !0)
677
- ]), i("div", Z, [d(e.$slots, "default")])], 10, Y));
1001
+ setup(e, { emit: t }) {
1002
+ let i = e, c = t, l = x();
1003
+ return (e, t) => (p(), n(y(D), {
1004
+ as: i.as,
1005
+ class: d(["fp-window", [i.sheet ? "fp-sheet-panel" : "fp-module"]]),
1006
+ "aria-labelledby": y(l)
1007
+ }, {
1008
+ default: E(() => [a("div", we, [
1009
+ (p(), n(g(`h${i.level}`), {
1010
+ id: y(l),
1011
+ class: "fp-silk fp-window-title"
1012
+ }, {
1013
+ default: E(() => [o(v(i.title), 1)]),
1014
+ _: 1
1015
+ }, 8, ["id"])),
1016
+ h(e.$slots, "actions"),
1017
+ i.closable ? (p(), n(j, {
1018
+ key: 0,
1019
+ "aria-label": i.closeLabel ?? `Close ${i.title}`,
1020
+ onClick: t[0] ||= (e) => c("close")
1021
+ }, {
1022
+ default: E(() => [s(H, { name: "close" })]),
1023
+ _: 1
1024
+ }, 8, ["aria-label"])) : r("", !0)
1025
+ ]), a("div", { class: d(i.flush ? void 0 : "fp-window-body") }, [h(e.$slots, "default")], 2)]),
1026
+ _: 3
1027
+ }, 8, [
1028
+ "as",
1029
+ "class",
1030
+ "aria-labelledby"
1031
+ ]));
678
1032
  }
679
1033
  });
680
1034
  //#endregion
681
- export { S as FpButton, C as FpCap, E as FpDevice, D as FpGelButton, O as FpHousing, R as FpIcon, z as FpLcd, H as FpLcdLine, W as FpLed, K as FpScrew, q as FpSilk, J as FpWell, Q as FpWindow, P as fpIconNames };
1035
+ export { j as FpButton, M as FpCap, ne as FpDevice, re as FpGelButton, N as FpHousing, H as FpIcon, J as FpKnob, Y as FpLcd, se as FpLcdLine, le as FpLed, fe as FpMeter, ve as FpReadout, ye as FpScrew, be as FpSilk, Se as FpSlider, Ce as FpWell, Te as FpWindow, R as fpIconNames, Q as fpReadoutGlyph };
package/dist/lens.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ /** How an LED's light spreads: an even fill, a soft hot spot over its chip, or a bright one. */
2
+ export type FpLens = 'flat' | 'diffused' | 'clear';
3
+ export declare const lensClass: Record<FpLens, string>;
@@ -0,0 +1,2 @@
1
+ /** The segments a character lights, as letters a to g; none for a character it cannot draw. */
2
+ export declare function fpReadoutGlyph(character: string): string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@frontpanel/vue",
3
3
  "type": "module",
4
- "version": "0.1.0",
4
+ "version": "0.2.0",
5
5
  "description": "Vue 3 components for the Frontpanel early-2000s hardware skin: a scale-to-fit device frame, windows, chrome and gel buttons, caps, LCDs and LEDs, built on Reka UI.",
6
6
  "author": "Dulan Katukurundage",
7
7
  "license": "MIT",
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "reka-ui": "^2.11.0",
39
- "@frontpanel/css": "^0.1.0"
39
+ "@frontpanel/css": "^0.2.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@tailwindcss/oxide": "^4.3.3",