@ixfx/components 0.3.1 → 0.4.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.
- package/bundle/index.d.ts +1086 -603
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +16527 -14258
- package/bundle/index.js.map +1 -1
- package/bundle/style.css +14 -4
- package/dist/ac-text.d.ts.map +1 -1
- package/dist/ac-text.js +11 -6
- package/dist/ac-text.js.map +1 -1
- package/dist/{button-DMt5XWUK.js → button-C3fLMKUv.js} +4 -4
- package/dist/{button-DMt5XWUK.js.map → button-C3fLMKUv.js.map} +1 -1
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -1
- package/dist/checkbox.d.ts +2 -2
- package/dist/checkbox.d.ts.map +1 -1
- package/dist/checkbox.js +14 -8
- package/dist/checkbox.js.map +1 -1
- package/dist/{colour-C3MQIjFJ-BLXg8W3U.js → colour-C3MQIjFJ-vRCdr8W-.js} +146 -552
- package/dist/colour-C3MQIjFJ-vRCdr8W-.js.map +1 -0
- package/dist/{colour-picker-K6zu82lm.js → colour-picker-0sgAha1T.js} +14 -9
- package/dist/colour-picker-0sgAha1T.js.map +1 -0
- package/dist/colour-picker.d.ts +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +1 -1
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +11 -6
- package/dist/crumbs.js.map +1 -1
- package/dist/data-display.d.ts +9 -4
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +270 -43
- package/dist/data-display.js.map +1 -1
- package/dist/data-provider-DgI909FP.js +23 -0
- package/dist/data-provider-DgI909FP.js.map +1 -0
- package/dist/{decorate-D7rC1gLP.js → decorate-DdjvVHS-.js} +2 -2
- package/dist/{decorate-D7rC1gLP.js.map → decorate-DdjvVHS-.js.map} +1 -1
- package/dist/{defaults-C7elhuyJ.js → defaults-C3b9OWJD.js} +2 -2
- package/dist/{defaults-C7elhuyJ.js.map → defaults-C3b9OWJD.js.map} +1 -1
- package/dist/{dist-TAGYwaju.js → dist-CA13FvMn.js} +7 -66
- package/dist/dist-CA13FvMn.js.map +1 -0
- package/dist/editable-label.d.ts.map +1 -1
- package/dist/editable-label.js +3 -2
- package/dist/editable-label.js.map +1 -1
- package/dist/fallbacks-pNMOMx38.js +168 -0
- package/dist/fallbacks-pNMOMx38.js.map +1 -0
- package/dist/{hex-editor-DlfoA65y.d.ts → hex-editor-CMIxtNgT.d.ts} +1 -1
- package/dist/hex-editor-CMIxtNgT.d.ts.map +1 -0
- package/dist/{hex-editor-CsN_ySkH.js → hex-editor-WZrjRtvL.js} +3 -3
- package/dist/{hex-editor-CsN_ySkH.js.map → hex-editor-WZrjRtvL.js.map} +1 -1
- package/dist/hex.d.ts +1 -1
- package/dist/hex.js +1 -1
- package/dist/{highlight-TPbSHruI.js → highlight-B-eQrhhb.js} +1 -1
- package/dist/{highlight-TPbSHruI.js.map → highlight-B-eQrhhb.js.map} +1 -1
- package/dist/{icon-CeTDJhC7.d.ts → icon-Bd5BiU4b.d.ts} +2 -2
- package/dist/icon-Bd5BiU4b.d.ts.map +1 -0
- package/dist/{icon-9NWTXtE1.js → icon-Ndo40kNO.js} +6 -5
- package/dist/icon-Ndo40kNO.js.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +3 -3
- package/dist/{incr-search-DSKKsk6w.js → incr-search-CeERfijK.js} +2 -2
- package/dist/{incr-search-DSKKsk6w.js.map → incr-search-CeERfijK.js.map} +1 -1
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +2 -2
- package/dist/{index-hXFn14tM.d.ts → index-BMjri2-S.d.ts} +2 -2
- package/dist/{index-hXFn14tM.d.ts.map → index-BMjri2-S.d.ts.map} +1 -1
- package/dist/{index-DSlPeWLK.d.ts → index-CWpNcQKE.d.ts} +5 -5
- package/dist/index-CWpNcQKE.d.ts.map +1 -0
- package/dist/{index--hrxPBkQ.d.ts → index-CowKi2mo.d.ts} +2 -1
- package/dist/index-CowKi2mo.d.ts.map +1 -0
- package/dist/{index-B1hNR7Z9.d.ts → index-D87kRcEs.d.ts} +1 -1
- package/dist/{index-B1hNR7Z9.d.ts.map → index-D87kRcEs.d.ts.map} +1 -1
- package/dist/{index-CnL9krsH.d.ts → index-DgXpCg_G.d.ts} +32 -26
- package/dist/index-DgXpCg_G.d.ts.map +1 -0
- package/dist/{index-DrQjA8Gs.d.ts → index-s_IhSnwc.d.ts} +2 -2
- package/dist/index-s_IhSnwc.d.ts.map +1 -0
- package/dist/index.d.ts +432 -121
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2370 -1707
- package/dist/index.js.map +1 -1
- package/dist/interaction-D6efrBLo.js +1 -0
- package/dist/{keyboard-De_vOHLg.js → keyboard-CimiEskD.js} +1 -1
- package/dist/{keyboard-De_vOHLg.js.map → keyboard-CimiEskD.js.map} +1 -1
- package/dist/{labelled-input-base-CqPL5rKm.js → labelled-input-base-9K_w3oLj.js} +2 -2
- package/dist/{labelled-input-base-CqPL5rKm.js.map → labelled-input-base-9K_w3oLj.js.map} +1 -1
- package/dist/{labelled-input-base-D-Y7agky.d.ts → labelled-input-base-ORb1rGq6.d.ts} +1 -1
- package/dist/labelled-input-base-ORb1rGq6.d.ts.map +1 -0
- package/dist/labelled-radial-input.d.ts +2 -2
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-radial-input.js +7 -6
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +2 -2
- package/dist/led.d.ts +1 -1
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +2 -2
- package/dist/led.js.map +1 -1
- package/dist/{menu-item-CKRfP0pN.js → menu-item-BrIuORYD.js} +20 -10
- package/dist/menu-item-BrIuORYD.js.map +1 -0
- package/dist/{menu-item-ClQF2DKN.d.ts → menu-item-COx-Azgj.d.ts} +1 -1
- package/dist/menu-item-COx-Azgj.d.ts.map +1 -0
- package/dist/{menu-DJJuCm-5.js → menu-vjoiHZ13.js} +30 -17
- package/dist/menu-vjoiHZ13.js.map +1 -0
- package/dist/menu.d.ts +2 -2
- package/dist/menu.js +2 -2
- package/dist/miller.d.ts +2 -2
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +18 -11
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +7 -5
- package/dist/narrowed-text.js.map +1 -1
- package/dist/panel.d.ts +1 -1
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +5 -4
- package/dist/panel.js.map +1 -1
- package/dist/plots.d.ts +2 -2
- package/dist/plots.js +2 -2
- package/dist/polar-pad.d.ts +1 -1
- package/dist/polar-pad.d.ts.map +1 -1
- package/dist/polar-pad.js +10 -4
- package/dist/polar-pad.js.map +1 -1
- package/dist/{popup-ImtS9KnS.js → popup-DiWMxsWj.js} +1 -1
- package/dist/{popup-ImtS9KnS.js.map → popup-DiWMxsWj.js.map} +1 -1
- package/dist/prominence-DlFShic3.js +104 -0
- package/dist/prominence-DlFShic3.js.map +1 -0
- package/dist/{radial-input-LUSBEycd.d.ts → radial-input-CpQPs1Mp.d.ts} +1 -1
- package/dist/radial-input-CpQPs1Mp.d.ts.map +1 -0
- package/dist/{radial-input-DZA6WaFu.js → radial-input-DZ7eQCcM.js} +11 -6
- package/dist/radial-input-DZ7eQCcM.js.map +1 -0
- package/dist/radial-input.d.ts +1 -1
- package/dist/radial-input.js +1 -1
- package/dist/range-input.d.ts +1 -1
- package/dist/range-input.d.ts.map +1 -1
- package/dist/range-input.js +9 -4
- package/dist/range-input.js.map +1 -1
- package/dist/range.d.ts +1 -1
- package/dist/range.d.ts.map +1 -1
- package/dist/range.js +5 -3
- package/dist/range.js.map +1 -1
- package/dist/{registry-Q2gYQCHM.js → registry-CkW7q09Q.js} +1 -1
- package/dist/{registry-Q2gYQCHM.js.map → registry-CkW7q09Q.js.map} +1 -1
- package/dist/selecthorizontal.d.ts +1 -1
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +4 -3
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/snap-container.d.ts.map +1 -1
- package/dist/snap-container.js +1 -1
- package/dist/split-layout.d.ts +1 -1
- package/dist/split-layout.d.ts.map +1 -1
- package/dist/split-layout.js +6 -5
- package/dist/split-layout.js.map +1 -1
- package/dist/style.css +14 -4
- package/dist/swipe.d.ts.map +1 -1
- package/dist/swipe.js +9 -4
- package/dist/swipe.js.map +1 -1
- package/dist/{tab-list-BnqISNvO.d.ts → tab-list-DLzb-m-I.d.ts} +2 -2
- package/dist/tab-list-DLzb-m-I.d.ts.map +1 -0
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +10 -4
- package/dist/tabs.js.map +1 -1
- package/dist/{tickled-controller-Cq1Va0rR.d.ts → tickled-controller-BjYCzGrU.d.ts} +2 -2
- package/dist/tickled-controller-BjYCzGrU.d.ts.map +1 -0
- package/dist/{tickled-styles-Bg3QbcrD.js → tickled-styles-fNDdqf6l.js} +1 -17
- package/dist/{tickled-styles-Bg3QbcrD.js.map → tickled-styles-fNDdqf6l.js.map} +1 -1
- package/dist/{timeline-Cv75Th2U.js → timeline-2OFtN4Ta.js} +1437 -36
- package/dist/timeline-2OFtN4Ta.js.map +1 -0
- package/dist/timeline.d.ts +1 -1
- package/dist/timeline.js +1 -1
- package/dist/{tooltip-DMxmBNky.js → tooltip-CJt3WLmN.js} +1 -1
- package/dist/{tooltip-DMxmBNky.js.map → tooltip-CJt3WLmN.js.map} +1 -1
- package/dist/{tooltip-CwGfb4lp.d.ts → tooltip-RGVIwHrZ.d.ts} +1 -1
- package/dist/{tooltip-CwGfb4lp.d.ts.map → tooltip-RGVIwHrZ.d.ts.map} +1 -1
- package/dist/{tree-CvvKbO-f.js → tree-CJWpMUvD.js} +113 -103
- package/dist/tree-CJWpMUvD.js.map +1 -0
- package/dist/{tree-component-D8Bg48tt.d.ts → tree-component-BcO26Xvt.d.ts} +65 -3
- package/dist/tree-component-BcO26Xvt.d.ts.map +1 -0
- package/dist/tree.d.ts +15 -15
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1
- package/dist/{types-BKaqnpwx.d.ts → types-DSfbtHs3.d.ts} +1 -1
- package/dist/types-DSfbtHs3.d.ts.map +1 -0
- package/dist/{xy-axis-DL0tfJDr.js → xy-axis-CK64haaK.js} +1831 -359
- package/dist/xy-axis-CK64haaK.js.map +1 -0
- package/dist/{xy-axis-D9uwpGTT.d.ts → xy-axis-McdUpcYr.d.ts} +102 -3
- package/dist/xy-axis-McdUpcYr.d.ts.map +1 -0
- package/dist/xy-pad.d.ts +1 -1
- package/dist/xy-pad.d.ts.map +1 -1
- package/dist/xy-pad.js +11 -6
- package/dist/xy-pad.js.map +1 -1
- package/docs-user/README.md +45 -0
- package/docs-user/ac-text.md +67 -0
- package/docs-user/ac-token.md +187 -0
- package/docs-user/button.md +355 -0
- package/docs-user/checkbox.md +62 -0
- package/docs-user/colour-picker.md +237 -0
- package/docs-user/crumbs.md +66 -0
- package/docs-user/data-display.md +98 -0
- package/docs-user/editable-label.md +244 -0
- package/docs-user/grouped-item-lister.md +424 -0
- package/docs-user/icons.md +191 -0
- package/docs-user/incr-search.md +94 -0
- package/docs-user/labelled-radial-input.md +204 -0
- package/docs-user/labelled-range-input.md +194 -0
- package/docs-user/led.md +40 -0
- package/docs-user/menu.md +319 -0
- package/docs-user/miller.md +453 -0
- package/docs-user/narrowed-text.md +72 -0
- package/docs-user/panel.md +250 -0
- package/docs-user/plots.md +361 -0
- package/docs-user/polar-pad.md +228 -0
- package/docs-user/radial-input.md +559 -0
- package/docs-user/range-input.md +264 -0
- package/docs-user/range.md +12 -0
- package/docs-user/selecthorizontal.md +32 -0
- package/docs-user/snap-container.md +132 -0
- package/docs-user/split-layout.md +232 -0
- package/docs-user/swipe.md +44 -0
- package/docs-user/tabs.md +217 -0
- package/docs-user/timeline.md +116 -0
- package/docs-user/transitory-label.md +120 -0
- package/docs-user/tree.md +592 -0
- package/docs-user/user-catalog.md +165 -0
- package/docs-user/user-theming.md +379 -0
- package/docs-user/util.md +122 -0
- package/docs-user/vertical-list.md +351 -0
- package/docs-user/xy-pad.md +94 -0
- package/package.json +19 -18
- package/dist/colour-C3MQIjFJ-BLXg8W3U.js.map +0 -1
- package/dist/colour-picker-K6zu82lm.js.map +0 -1
- package/dist/dist-BX0OVIm7.js +0 -1290
- package/dist/dist-BX0OVIm7.js.map +0 -1
- package/dist/dist-TAGYwaju.js.map +0 -1
- package/dist/hex-editor-DlfoA65y.d.ts.map +0 -1
- package/dist/icon-9NWTXtE1.js.map +0 -1
- package/dist/icon-CeTDJhC7.d.ts.map +0 -1
- package/dist/index--hrxPBkQ.d.ts.map +0 -1
- package/dist/index-CnL9krsH.d.ts.map +0 -1
- package/dist/index-DSlPeWLK.d.ts.map +0 -1
- package/dist/index-DrQjA8Gs.d.ts.map +0 -1
- package/dist/interaction-DG7X1rhI.js +0 -1
- package/dist/labelled-input-base-D-Y7agky.d.ts.map +0 -1
- package/dist/menu-DJJuCm-5.js.map +0 -1
- package/dist/menu-item-CKRfP0pN.js.map +0 -1
- package/dist/menu-item-ClQF2DKN.d.ts.map +0 -1
- package/dist/prominence--ic9uWBl.js +0 -98
- package/dist/prominence--ic9uWBl.js.map +0 -1
- package/dist/radial-input-DZA6WaFu.js.map +0 -1
- package/dist/radial-input-LUSBEycd.d.ts.map +0 -1
- package/dist/tab-list-BnqISNvO.d.ts.map +0 -1
- package/dist/tickled-controller-Cq1Va0rR.d.ts.map +0 -1
- package/dist/timeline-Cv75Th2U.js.map +0 -1
- package/dist/tree-CvvKbO-f.js.map +0 -1
- package/dist/tree-component-D8Bg48tt.d.ts.map +0 -1
- package/dist/types-BKaqnpwx.d.ts.map +0 -1
- package/dist/xy-axis-D9uwpGTT.d.ts.map +0 -1
- package/dist/xy-axis-DL0tfJDr.js.map +0 -1
- /package/bundle/{chunk-pbuEa-1d.js → chunk-D7D4PA-g.js} +0 -0
- /package/dist/{chunk-pbuEa-1d.js → chunk-D7D4PA-g.js} +0 -0
package/dist/panel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel.d.ts","names":[],"sources":["../src/panel/panel.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"panel.d.ts","names":[],"sources":["../src/panel/panel.ts"],"mappings":";;;KAMY,gBAAA;AAAA,KACA,YAAA;AAAA,KACA,sBAAA;AAAA,UAEK,iBAAA;EAAA,SACN,SAAS;AAAA;AAAA,KAGR,gBAAA,GAAmB,WAAW,CAAC,iBAAA;AAAA,KAC/B,eAAA,GAAkB,WAAW;AAAA,UAExB,oBAAA;EACf,MAAA,EAAQ,gBAAA;EACR,KAAA,EAAO,eAAe;AAAA;AAAA,cAIX,YAAA,SAAqB,UAAA;EACY,SAAA;EACyB,WAAA,EAAa,gBAAA;EACrD,QAAA;EACD,KAAA;EACwB,QAAA;EACS,iBAAA,EAAmB,sBAAA;EACf,OAAA,EAAS,YAAA;EAAA,QAEzD,WAAA;EAAA,QAET,cAAA;EAAA,QAWA,aAAA;EAAA,QAUA,aAAA;EAAA,UAIW,OAAA,CAAQ,OAAA,EAAS,GAAA;EAAA,UAOjB,MAAA,kBAAM,cAAA;EAAA,OAyDT,MAAA,gBAAM,SAAA;AAAA;AAAA,QAkShB,MAAA;EAAA,UACI,qBAAA;IACR,YAAA,EAAc,YAAY;EAAA;AAAA;AAAA,UAIb,YAAA;EACf,gBAAA,oBAAoC,oBAAA,EAClC,IAAA,EAAM,CAAA,EACN,QAAA,GAAW,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,oBAAA,CAAqB,CAAA,YAC3D,OAAA,aAAoB,uBAAA,eAEpB,IAAA,UACA,QAAA,EAAU,kCAAA,EACV,OAAA,aAAoB,uBAAA;AAAA"}
|
package/dist/panel.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "./
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-pNMOMx38.js";
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
|
|
3
|
+
import "./icon-Ndo40kNO.js";
|
|
3
4
|
import { LitElement, css, html, nothing } from "lit";
|
|
4
5
|
import { property, state } from "lit/decorators.js";
|
|
5
6
|
//#region src/panel/panel.ts
|
|
@@ -86,7 +87,7 @@ let PanelElement = class PanelElement extends LitElement {
|
|
|
86
87
|
`;
|
|
87
88
|
}
|
|
88
89
|
static {
|
|
89
|
-
this.styles = css`
|
|
90
|
+
this.styles = [themeFallbacks, css`
|
|
90
91
|
:host {
|
|
91
92
|
display: flex;
|
|
92
93
|
flex-direction: column;
|
|
@@ -373,7 +374,7 @@ let PanelElement = class PanelElement extends LitElement {
|
|
|
373
374
|
:host([variant="midline"][orientation="vertical"]) .content-wrapper {
|
|
374
375
|
background: transparent;
|
|
375
376
|
}
|
|
376
|
-
|
|
377
|
+
`];
|
|
377
378
|
}
|
|
378
379
|
};
|
|
379
380
|
__decorate([property({
|
package/dist/panel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel.js","names":["customElement"],"sources":["../src/panel/panel.ts"],"sourcesContent":["import { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type PanelOrientation = `horizontal` | `vertical`;\nexport type PanelVariant = `titlebar` | `midline`;\nexport type PanelToggleInteraction = `implicit` | `explicit` | `disabled`;\n\nexport interface PanelToggleDetail {\n readonly collapsed: boolean;\n}\n\nexport type PanelToggleEvent = CustomEvent<PanelToggleDetail>;\nexport type PanelCloseEvent = CustomEvent<void>;\n\nexport interface PanelElementEventMap {\n toggle: PanelToggleEvent;\n close: PanelCloseEvent;\n}\n\n@customElement(`ixfx-panel`)\nexport class PanelElement extends LitElement {\n @property({ type: Boolean, reflect: true }) collapsed = false;\n @property({ type: String, attribute: `orientation`, reflect: true }) orientation: PanelOrientation = `horizontal`;\n @property({ type: Boolean }) closable = false;\n @property({ type: String }) title = ``;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ type: String, attribute: `toggle-interaction` }) toggleInteraction: PanelToggleInteraction = `implicit`;\n @property({ type: String, attribute: `variant`, reflect: true }) variant: PanelVariant = `titlebar`;\n\n @state() private _isVertical = false;\n\n private _onToggleClick() {\n this.collapsed = !this.collapsed;\n this.dispatchEvent(\n new CustomEvent<PanelToggleDetail>(`toggle`, {\n detail: { collapsed: this.collapsed },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _onCloseClick() {\n this.dispatchEvent(\n new CustomEvent<void>(`close`, {\n bubbles: true,\n composed: true,\n }),\n );\n this.remove();\n }\n\n private _getCaretIcon(): string {\n return `chevron-down`;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`orientation`)) {\n this._isVertical = this.orientation === `vertical`;\n }\n }\n\n protected override render() {\n const caretIcon = this._getCaretIcon();\n const showCaret = this.toggleInteraction !== `disabled`;\n const implicitToggle = this.toggleInteraction === `implicit`;\n\n const caretRotation = this._isVertical\n ? (this.collapsed ? `` : `-90deg`)\n : (this.collapsed ? `-90deg` : ``);\n\n return html`\n <div\n class=\"titlebar\"\n role=\"toolbar\"\n @click=${implicitToggle ? this._onToggleClick : nothing}\n >\n <div class=\"title-text-wrapper\">\n ${this.iconName ? html`<ixfx-icon class=\"title-icon\" name=${this.iconName}></ixfx-icon>` : nothing}\n <span class=\"title-text\">${this.title}</span>\n </div>\n\n <div class=\"toolbar\" @click=${(e: Event) => e.stopPropagation()}>\n <slot name=\"toolbar\"></slot>\n ${this.closable\n ? html`\n <button\n class=\"close-btn\"\n type=\"button\"\n aria-label=\"Close panel\"\n @click=${this._onCloseClick}\n >\n <ixfx-icon name=\"close\"></ixfx-icon>\n </button>\n `\n : nothing}\n ${showCaret\n ? html`\n <button\n class=\"caret-btn\"\n type=\"button\"\n aria-label=${this.collapsed ? `Expand panel` : `Collapse panel`}\n @click=${this._onToggleClick}\n >\n <ixfx-icon name=${caretIcon} prominence .rotate=${caretRotation.length > 0 ? caretRotation : nothing}></ixfx-icon>\n </button>\n `\n : nothing}\n </div>\n </div>\n\n <div class=\"content-wrapper\" ?expanded=${!this.collapsed}>\n <div class=\"content-inner\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n\n static override styles = css`\n :host {\n display: flex;\n flex-direction: column;\n background: var(--surface-3);\n border: var(--border-subtle);\n border-radius: var(--radius-m);\n overflow: hidden;\n box-sizing: border-box;\n }\n\n :host([orientation=\"vertical\"]) {\n flex-direction: row;\n align-self: flex-start;\n min-width: 0 !important;\n flex-shrink: 1;\n }\n\n .titlebar {\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: var(--space-s) var(--space-m);\n background: var(--surface-4);\n color: var(--surface-3-text);\n min-height: 2em;\n flex-shrink: 0;\n }\n\n :host([orientation=\"vertical\"]) .titlebar {\n flex-direction: row;\n min-width: 2em;\n writing-mode: vertical-rl;\n text-orientation: mixed;\n }\n\n .caret-btn,\n .close-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n padding: var(--space-xs);\n margin: 0;\n cursor: pointer;\n color: inherit;\n border-radius: var(--radius-s);\n transition: background var(--transition);\n opacity: var(--prominence-idle-opacity);\n }\n\n .caret-btn:hover,\n .close-btn:hover {\n background: var(--surface-5);\n opacity: var(--prominence-tickled-opacity);\n\n }\n\n .caret-btn:focus-visible,\n .close-btn:focus-visible {\n outline: 2px solid var(--accent);\n outline-offset: 1px;\n }\n\n ixfx-icon {\n width: 1.25em;\n height: 1.25em;\n transition: transform var(--transition);\n }\n\n .title-icon {\n flex-shrink: 0;\n }\n\n .title-text {\n flex: 1;\n padding-left: 1ch;\n font-family: var(--font-family);\n font-size: var(--text-m);\n font-weight: var(--font-weight-bold, 600);\n white-space: nowrap;\n overflow: hidden;\n align-self: center;\n text-overflow: ellipsis;\n user-select: none;\n -webkit-user-select: none;\n }\n\n :host([toggle-interaction=\"implicit\"]) .titlebar {\n cursor: pointer;\n }\n\n :host([orientation=\"vertical\"]) .title-text {\n writing-mode: vertical-rl;\n padding-left: 0;\n padding-bottom: 1ch;\n text-orientation: mixed;\n transform: rotate(180deg);\n }\n\n .toolbar {\n display: flex;\n align-items: center;\n gap: var(--space-xs);\n margin-left: auto;\n }\n\n :host([orientation=\"vertical\"]) .toolbar {\n flex-direction: column;\n margin-left: 0;\n margin-top: auto;\n writing-mode: horizontal-tb;\n }\n\n slot[name=\"toolbar\"] {\n display: contents;\n }\n\n ::slotted(slot[name=\"toolbar\"]) {\n display: contents;\n }\n\n .content-wrapper {\n interpolate-size: allow-keywords;\n overflow: hidden;\n height: 0;\n transition: height var(--transition, 0.2s ease-out);\n background: var(--surface-3);\n \n }\n\n .content-wrapper[expanded] {\n height: auto;\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper {\n height: unset;\n width: 0;\n transition: width var(--transition, 0.2s ease-out);\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper[expanded] {\n width: auto;\n }\n\n .content-inner {\n box-shadow: var(--deboss-3);\n\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n padding: var(--space-m);\n transform: translateY(-100%);\n transition: transform var(--transition, 0.2s ease-out);\n }\n\n .content-wrapper[expanded] .content-inner {\n transform: translateY(0);\n }\n\n :host([orientation=\"vertical\"]) .content-inner {\n width: max-content;\n height:100%;\n transform: translateX(-100%);\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper[expanded] .content-inner {\n transform: translateX(0);\n }\n\n .title-text-wrapper {\n display:flex;\n padding: 0 var(--space-s);\n }\n\n /* === Midline variant === */\n\n :host([variant=\"midline\"]) {\n border: none !important;\n border-radius: 0 !important;\n background: transparent;\n }\n\n :host([variant=\"midline\"][orientation=\"horizontal\"]) .titlebar,\n :host([variant=\"midline\"][orientation=\"vertical\"]) .titlebar {\n background: transparent;\n padding: var(--space-xs) var(--space-m);\n min-height: unset;\n position: relative;\n }\n\n :host([variant=\"midline\"][orientation=\"vertical\"]) .titlebar {\n padding: var(--space-m) var(--space-xs);\n min-width: unset;\n }\n\n :host([variant=\"midline\"]) .title-text-wrapper {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: var(--space-s);\n background: var(--surface-3);\n }\n\n :host([variant=\"midline\"]) .title-text {\n font-weight: normal;\n color: var(--surface-3-text);\n padding: 0 0.5ch 0 0.5ch;\n background: transparent;\n box-shadow: none;\n flex: unset;\n width: auto;\n white-space: nowrap;\n }\n\n :host([variant=\"midline\"]) .title-icon {\n background: transparent;\n flex-shrink: 0;\n }\n\n :host([variant=\"midline\"]) .caret-btn {\n position: relative;\n z-index: 1;\n background: var(--surface-3);\n opacity: 1;\n }\n\n :host([variant=\"midline\"][orientation=\"vertical\"]) .title-text {\n transform: rotate(180deg);\n padding: 0.5ch 0 0.5ch 0ch;\n }\n\n :host([variant=\"midline\"]) .toolbar {\n position: relative;\n z-index: 2;\n background: var(--surface-3);\n margin-left: 0;\n }\n\n :host([variant=\"midline\"][orientation=\"horizontal\"]) .toolbar {\n margin-left: auto;\n }\n\n /* Debossed line runs from after title-text to before toolbar */\n :host([variant=\"midline\"]) .titlebar::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 1px;\n transform: translateY(-50%);\n background: var(--surface-2);\n box-shadow:\n 0 -1px 0 var(--surface-5),\n 0 1px 0 var(--surface-1);\n z-index: 0;\n }\n\n /* For vertical midline, line runs vertically */\n :host([variant=\"midline\"][orientation=\"vertical\"]) .titlebar::after {\n top: 0;\n bottom: 0;\n left: 50%;\n right: unset;\n width: 1px;\n height: 100%;\n transform: translateX(-50%);\n box-shadow:\n -1px 0 0 var(--surface-5),\n 1px 0 0 var(--surface-1);\n }\n\n :host([variant=\"midline\"]) .content-inner {\n box-shadow: none;\n background: var(--surface-3);\n }\n\n :host([variant=\"midline\"]) .content-wrapper {\n background: transparent;\n }\n\n :host([variant=\"midline\"][orientation=\"vertical\"]) .content-wrapper {\n background: transparent;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-panel': PanelElement;\n }\n}\n\nexport interface PanelElement {\n addEventListener: (<K extends keyof PanelElementEventMap>(\n type: K,\n listener: (this: PanelElement, event: PanelElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":";;;;;AAsBO,IAAA,eAAA,MAAM,qBAAqB,WAAW;;;mBACa;qBAC6C;kBAC7D;eACJ;kBAC2B;2BAC0C;iBAChB;qBAE1D;;CAE/B,iBAAyB;EACvB,KAAK,YAAY,CAAC,KAAK;EACvB,KAAK,cACH,IAAI,YAA+B,UAAU;GAC3C,QAAQ,EAAE,WAAW,KAAK,UAAU;GACpC,SAAS;GACT,UAAU;EACZ,CAAC,CACH;CACF;CAEA,gBAAwB;EACtB,KAAK,cACH,IAAI,YAAkB,SAAS;GAC7B,SAAS;GACT,UAAU;EACZ,CAAC,CACH;EACA,KAAK,OAAO;CACd;CAEA,gBAAgC;EAC9B,OAAO;CACT;CAEA,QAA2B,SAAqC;EAC9D,MAAM,QAAQ,OAAO;EACrB,IAAI,QAAQ,IAAI,aAAa,GAC3B,KAAK,cAAc,KAAK,gBAAgB;CAE5C;CAEA,SAA4B;EAC1B,MAAM,YAAY,KAAK,cAAc;EACrC,MAAM,YAAY,KAAK,sBAAsB;EAC7C,MAAM,iBAAiB,KAAK,sBAAsB;EAElD,MAAM,gBAAgB,KAAK,cACtB,KAAK,YAAY,KAAK,WACtB,KAAK,YAAY,WAAW;EAEjC,OAAO,IAAI;;;;iBAIE,iBAAiB,KAAK,iBAAiB,QAAQ;;;YAGpD,KAAK,WAAW,IAAI,sCAAsC,KAAK,SAAS,iBAAiB,QAAQ;qCACxE,KAAK,MAAM;;;uCAGT,MAAa,EAAE,gBAAgB,EAAE;;YAE5D,KAAK,WACH,IAAI;;;;;uBAKK,KAAK,cAAc;;;;cAK5B,QAAQ;YACV,YACE,IAAI;;;;yBAIO,KAAK,YAAY,iBAAiB,iBAAiB;qBACvD,KAAK,eAAe;;8BAEX,UAAU,sBAAsB,cAAc,SAAS,IAAI,gBAAgB,QAAQ;;cAGnG,QAAQ;;;;+CAIyB,CAAC,KAAK,UAAU;;;;;;CAM7D;;gBAEyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgS9B;YAnYG,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,aAAA,KAAA,CAAA;YACzC,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;YAClE,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;YAC1B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,SAAA,KAAA,CAAA;YACzB,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAY,CAAC,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;YACjD,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAqB,CAAC,CAAA,GAAA,aAAA,WAAA,qBAAA,KAAA,CAAA;YAC1D,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAW,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,WAAA,KAAA,CAAA;YAE9D,MAAM,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;2BAVRA,kBAAc,YAAY,CAAA,GAAA,YAAA"}
|
|
1
|
+
{"version":3,"file":"panel.js","names":["customElement"],"sources":["../src/panel/panel.ts"],"sourcesContent":["import { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type PanelOrientation = `horizontal` | `vertical`;\nexport type PanelVariant = `titlebar` | `midline`;\nexport type PanelToggleInteraction = `implicit` | `explicit` | `disabled`;\n\nexport interface PanelToggleDetail {\n readonly collapsed: boolean;\n}\n\nexport type PanelToggleEvent = CustomEvent<PanelToggleDetail>;\nexport type PanelCloseEvent = CustomEvent<void>;\n\nexport interface PanelElementEventMap {\n toggle: PanelToggleEvent;\n close: PanelCloseEvent;\n}\n\n@customElement(`ixfx-panel`)\nexport class PanelElement extends LitElement {\n @property({ type: Boolean, reflect: true }) collapsed = false;\n @property({ type: String, attribute: `orientation`, reflect: true }) orientation: PanelOrientation = `horizontal`;\n @property({ type: Boolean }) closable = false;\n @property({ type: String }) title = ``;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ type: String, attribute: `toggle-interaction` }) toggleInteraction: PanelToggleInteraction = `implicit`;\n @property({ type: String, attribute: `variant`, reflect: true }) variant: PanelVariant = `titlebar`;\n\n @state() private _isVertical = false;\n\n private _onToggleClick() {\n this.collapsed = !this.collapsed;\n this.dispatchEvent(\n new CustomEvent<PanelToggleDetail>(`toggle`, {\n detail: { collapsed: this.collapsed },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _onCloseClick() {\n this.dispatchEvent(\n new CustomEvent<void>(`close`, {\n bubbles: true,\n composed: true,\n }),\n );\n this.remove();\n }\n\n private _getCaretIcon(): string {\n return `chevron-down`;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`orientation`)) {\n this._isVertical = this.orientation === `vertical`;\n }\n }\n\n protected override render() {\n const caretIcon = this._getCaretIcon();\n const showCaret = this.toggleInteraction !== `disabled`;\n const implicitToggle = this.toggleInteraction === `implicit`;\n\n const caretRotation = this._isVertical\n ? (this.collapsed ? `` : `-90deg`)\n : (this.collapsed ? `-90deg` : ``);\n\n return html`\n <div\n class=\"titlebar\"\n role=\"toolbar\"\n @click=${implicitToggle ? this._onToggleClick : nothing}\n >\n <div class=\"title-text-wrapper\">\n ${this.iconName ? html`<ixfx-icon class=\"title-icon\" name=${this.iconName}></ixfx-icon>` : nothing}\n <span class=\"title-text\">${this.title}</span>\n </div>\n\n <div class=\"toolbar\" @click=${(e: Event) => e.stopPropagation()}>\n <slot name=\"toolbar\"></slot>\n ${this.closable\n ? html`\n <button\n class=\"close-btn\"\n type=\"button\"\n aria-label=\"Close panel\"\n @click=${this._onCloseClick}\n >\n <ixfx-icon name=\"close\"></ixfx-icon>\n </button>\n `\n : nothing}\n ${showCaret\n ? html`\n <button\n class=\"caret-btn\"\n type=\"button\"\n aria-label=${this.collapsed ? `Expand panel` : `Collapse panel`}\n @click=${this._onToggleClick}\n >\n <ixfx-icon name=${caretIcon} prominence .rotate=${caretRotation.length > 0 ? caretRotation : nothing}></ixfx-icon>\n </button>\n `\n : nothing}\n </div>\n </div>\n\n <div class=\"content-wrapper\" ?expanded=${!this.collapsed}>\n <div class=\"content-inner\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n\n static override styles = [themeFallbacks, css`\n :host {\n display: flex;\n flex-direction: column;\n background: var(--surface-3);\n border: var(--border-subtle);\n border-radius: var(--radius-m);\n overflow: hidden;\n box-sizing: border-box;\n }\n\n :host([orientation=\"vertical\"]) {\n flex-direction: row;\n align-self: flex-start;\n min-width: 0 !important;\n flex-shrink: 1;\n }\n\n .titlebar {\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: var(--space-s) var(--space-m);\n background: var(--surface-4);\n color: var(--surface-3-text);\n min-height: 2em;\n flex-shrink: 0;\n }\n\n :host([orientation=\"vertical\"]) .titlebar {\n flex-direction: row;\n min-width: 2em;\n writing-mode: vertical-rl;\n text-orientation: mixed;\n }\n\n .caret-btn,\n .close-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n padding: var(--space-xs);\n margin: 0;\n cursor: pointer;\n color: inherit;\n border-radius: var(--radius-s);\n transition: background var(--transition);\n opacity: var(--prominence-idle-opacity);\n }\n\n .caret-btn:hover,\n .close-btn:hover {\n background: var(--surface-5);\n opacity: var(--prominence-tickled-opacity);\n\n }\n\n .caret-btn:focus-visible,\n .close-btn:focus-visible {\n outline: 2px solid var(--accent);\n outline-offset: 1px;\n }\n\n ixfx-icon {\n width: 1.25em;\n height: 1.25em;\n transition: transform var(--transition);\n }\n\n .title-icon {\n flex-shrink: 0;\n }\n\n .title-text {\n flex: 1;\n padding-left: 1ch;\n font-family: var(--font-family);\n font-size: var(--text-m);\n font-weight: var(--font-weight-bold, 600);\n white-space: nowrap;\n overflow: hidden;\n align-self: center;\n text-overflow: ellipsis;\n user-select: none;\n -webkit-user-select: none;\n }\n\n :host([toggle-interaction=\"implicit\"]) .titlebar {\n cursor: pointer;\n }\n\n :host([orientation=\"vertical\"]) .title-text {\n writing-mode: vertical-rl;\n padding-left: 0;\n padding-bottom: 1ch;\n text-orientation: mixed;\n transform: rotate(180deg);\n }\n\n .toolbar {\n display: flex;\n align-items: center;\n gap: var(--space-xs);\n margin-left: auto;\n }\n\n :host([orientation=\"vertical\"]) .toolbar {\n flex-direction: column;\n margin-left: 0;\n margin-top: auto;\n writing-mode: horizontal-tb;\n }\n\n slot[name=\"toolbar\"] {\n display: contents;\n }\n\n ::slotted(slot[name=\"toolbar\"]) {\n display: contents;\n }\n\n .content-wrapper {\n interpolate-size: allow-keywords;\n overflow: hidden;\n height: 0;\n transition: height var(--transition, 0.2s ease-out);\n background: var(--surface-3);\n \n }\n\n .content-wrapper[expanded] {\n height: auto;\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper {\n height: unset;\n width: 0;\n transition: width var(--transition, 0.2s ease-out);\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper[expanded] {\n width: auto;\n }\n\n .content-inner {\n box-shadow: var(--deboss-3);\n\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n padding: var(--space-m);\n transform: translateY(-100%);\n transition: transform var(--transition, 0.2s ease-out);\n }\n\n .content-wrapper[expanded] .content-inner {\n transform: translateY(0);\n }\n\n :host([orientation=\"vertical\"]) .content-inner {\n width: max-content;\n height:100%;\n transform: translateX(-100%);\n }\n\n :host([orientation=\"vertical\"]) .content-wrapper[expanded] .content-inner {\n transform: translateX(0);\n }\n\n .title-text-wrapper {\n display:flex;\n padding: 0 var(--space-s);\n }\n\n /* === Midline variant === */\n\n :host([variant=\"midline\"]) {\n border: none !important;\n border-radius: 0 !important;\n background: transparent;\n }\n\n :host([variant=\"midline\"][orientation=\"horizontal\"]) .titlebar,\n :host([variant=\"midline\"][orientation=\"vertical\"]) .titlebar {\n background: transparent;\n padding: var(--space-xs) var(--space-m);\n min-height: unset;\n position: relative;\n }\n\n :host([variant=\"midline\"][orientation=\"vertical\"]) .titlebar {\n padding: var(--space-m) var(--space-xs);\n min-width: unset;\n }\n\n :host([variant=\"midline\"]) .title-text-wrapper {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: var(--space-s);\n background: var(--surface-3);\n }\n\n :host([variant=\"midline\"]) .title-text {\n font-weight: normal;\n color: var(--surface-3-text);\n padding: 0 0.5ch 0 0.5ch;\n background: transparent;\n box-shadow: none;\n flex: unset;\n width: auto;\n white-space: nowrap;\n }\n\n :host([variant=\"midline\"]) .title-icon {\n background: transparent;\n flex-shrink: 0;\n }\n\n :host([variant=\"midline\"]) .caret-btn {\n position: relative;\n z-index: 1;\n background: var(--surface-3);\n opacity: 1;\n }\n\n :host([variant=\"midline\"][orientation=\"vertical\"]) .title-text {\n transform: rotate(180deg);\n padding: 0.5ch 0 0.5ch 0ch;\n }\n\n :host([variant=\"midline\"]) .toolbar {\n position: relative;\n z-index: 2;\n background: var(--surface-3);\n margin-left: 0;\n }\n\n :host([variant=\"midline\"][orientation=\"horizontal\"]) .toolbar {\n margin-left: auto;\n }\n\n /* Debossed line runs from after title-text to before toolbar */\n :host([variant=\"midline\"]) .titlebar::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 1px;\n transform: translateY(-50%);\n background: var(--surface-2);\n box-shadow:\n 0 -1px 0 var(--surface-5),\n 0 1px 0 var(--surface-1);\n z-index: 0;\n }\n\n /* For vertical midline, line runs vertically */\n :host([variant=\"midline\"][orientation=\"vertical\"]) .titlebar::after {\n top: 0;\n bottom: 0;\n left: 50%;\n right: unset;\n width: 1px;\n height: 100%;\n transform: translateX(-50%);\n box-shadow:\n -1px 0 0 var(--surface-5),\n 1px 0 0 var(--surface-1);\n }\n\n :host([variant=\"midline\"]) .content-inner {\n box-shadow: none;\n background: var(--surface-3);\n }\n\n :host([variant=\"midline\"]) .content-wrapper {\n background: transparent;\n }\n\n :host([variant=\"midline\"][orientation=\"vertical\"]) .content-wrapper {\n background: transparent;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-panel': PanelElement;\n }\n}\n\nexport interface PanelElement {\n addEventListener: (<K extends keyof PanelElementEventMap>(\n type: K,\n listener: (this: PanelElement, event: PanelElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":";;;;;;AAuBO,IAAA,eAAA,MAAM,qBAAqB,WAAW;;;mBACa;qBAC6C;kBAC7D;eACJ;kBAC2B;2BAC0C;iBAChB;qBAE1D;;CAE/B,iBAAyB;EACvB,KAAK,YAAY,CAAC,KAAK;EACvB,KAAK,cACH,IAAI,YAA+B,UAAU;GAC3C,QAAQ,EAAE,WAAW,KAAK,UAAU;GACpC,SAAS;GACT,UAAU;EACZ,CAAC,CACH;CACF;CAEA,gBAAwB;EACtB,KAAK,cACH,IAAI,YAAkB,SAAS;GAC7B,SAAS;GACT,UAAU;EACZ,CAAC,CACH;EACA,KAAK,OAAO;CACd;CAEA,gBAAgC;EAC9B,OAAO;CACT;CAEA,QAA2B,SAAqC;EAC9D,MAAM,QAAQ,OAAO;EACrB,IAAI,QAAQ,IAAI,aAAa,GAC3B,KAAK,cAAc,KAAK,gBAAgB;CAE5C;CAEA,SAA4B;EAC1B,MAAM,YAAY,KAAK,cAAc;EACrC,MAAM,YAAY,KAAK,sBAAsB;EAC7C,MAAM,iBAAiB,KAAK,sBAAsB;EAElD,MAAM,gBAAgB,KAAK,cACtB,KAAK,YAAY,KAAK,WACtB,KAAK,YAAY,WAAW;EAEjC,OAAO,IAAI;;;;iBAIE,iBAAiB,KAAK,iBAAiB,QAAQ;;;YAGpD,KAAK,WAAW,IAAI,sCAAsC,KAAK,SAAS,iBAAiB,QAAQ;qCACxE,KAAK,MAAM;;;uCAGT,MAAa,EAAE,gBAAgB,EAAE;;YAE5D,KAAK,WACH,IAAI;;;;;uBAKK,KAAK,cAAc;;;;cAK5B,QAAQ;YACV,YACE,IAAI;;;;yBAIO,KAAK,YAAY,iBAAiB,iBAAiB;qBACvD,KAAK,eAAe;;8BAEX,UAAU,sBAAsB,cAAc,SAAS,IAAI,gBAAgB,QAAQ;;cAGnG,QAAQ;;;;+CAIyB,CAAC,KAAK,UAAU;;;;;;CAM7D;;gBAEyB,CAAC,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+R5C;;AACH;YAnYG,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,aAAA,KAAA,CAAA;YACzC,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;YAClE,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;YAC1B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,aAAA,WAAA,SAAA,KAAA,CAAA;YACzB,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAY,CAAC,CAAA,GAAA,aAAA,WAAA,YAAA,KAAA,CAAA;YACjD,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAqB,CAAC,CAAA,GAAA,aAAA,WAAA,qBAAA,KAAA,CAAA;YAC1D,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAW,SAAS;AAAK,CAAC,CAAA,GAAA,aAAA,WAAA,WAAA,KAAA,CAAA;YAE9D,MAAM,CAAA,GAAA,aAAA,WAAA,eAAA,KAAA,CAAA;2BAVRA,kBAAc,YAAY,CAAA,GAAA,YAAA"}
|
package/dist/plots.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { ColourMapConfig, ColourMode, ColourResult, PlotDataSeries, PlotDataSeriesOptions, PlotSingleAxis, PlotXyAxis, SingleAxisAgeStyle, SingleAxisDrawStyle, XyAgeStyle, XyDrawStyle, applyAgeModification, computeColour, parseColourScaleAttr, readBaseColour };
|
|
1
|
+
import { C as ColourMode, D as parseColourScaleAttr, E as computeColour, O as readBaseColour, S as ColourMapConfig, T as applyAgeModification, _ as PlotMultiAxisDataPointClickEvent, a as PlotSingleAxisElementEventMap, b as PlotDataSeries, c as SingleAxisAgeStyle, d as PlotHistogramBucketClickDetail, f as PlotHistogramBucketClickEvent, g as PlotMultiAxisDataPointClickDetail, h as PlotMultiAxis, i as PlotSingleAxis, l as SingleAxisDrawStyle, m as PlotHistogramOrientation, n as XyAgeStyle, o as PlotSingleAxisPointerMoveDetail, p as PlotHistogramElementEventMap, r as XyDrawStyle, s as PlotSingleAxisPointerMoveEvent, t as PlotXyAxis, u as PlotHistogram, v as PlotMultiAxisElementEventMap, w as ColourResult, x as PlotDataSeriesOptions, y as PlotMultiAxisLayout } from "./xy-axis-McdUpcYr.js";
|
|
2
|
+
export { ColourMapConfig, ColourMode, ColourResult, PlotDataSeries, PlotDataSeriesOptions, PlotHistogram, PlotHistogramBucketClickDetail, PlotHistogramBucketClickEvent, PlotHistogramElementEventMap, PlotHistogramOrientation, PlotMultiAxis, PlotMultiAxisDataPointClickDetail, PlotMultiAxisDataPointClickEvent, PlotMultiAxisElementEventMap, PlotMultiAxisLayout, PlotSingleAxis, PlotSingleAxisElementEventMap, PlotSingleAxisPointerMoveDetail, PlotSingleAxisPointerMoveEvent, PlotXyAxis, SingleAxisAgeStyle, SingleAxisDrawStyle, XyAgeStyle, XyDrawStyle, applyAgeModification, computeColour, parseColourScaleAttr, readBaseColour };
|
package/dist/plots.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { PlotDataSeries, PlotSingleAxis, PlotXyAxis, applyAgeModification, computeColour, parseColourScaleAttr, readBaseColour };
|
|
1
|
+
import { a as PlotDataSeries, c as parseColourScaleAttr, i as PlotMultiAxis, l as readBaseColour, n as PlotSingleAxis, o as applyAgeModification, r as PlotHistogram, s as computeColour, t as PlotXyAxis } from "./xy-axis-CK64haaK.js";
|
|
2
|
+
export { PlotDataSeries, PlotHistogram, PlotMultiAxis, PlotSingleAxis, PlotXyAxis, applyAgeModification, computeColour, parseColourScaleAttr, readBaseColour };
|
package/dist/polar-pad.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { LitElement, PropertyValues, html } from "lit";
|
|
|
2
2
|
|
|
3
3
|
//#region src/polar-pad/polar-pad.d.ts
|
|
4
4
|
declare class PolarPad extends LitElement {
|
|
5
|
-
static styles: import("lit").CSSResult;
|
|
5
|
+
static styles: import("lit").CSSResult[];
|
|
6
6
|
/** Current angle in degrees. 0 = right, increases clockwise. */
|
|
7
7
|
angle: number;
|
|
8
8
|
/** Current radius 0–1. 0 = origin, 1 = edge. */
|
package/dist/polar-pad.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polar-pad.d.ts","names":[],"sources":["../src/polar-pad/polar-pad.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"polar-pad.d.ts","names":[],"sources":["../src/polar-pad/polar-pad.ts"],"mappings":";;;cAwKa,QAAA,SAAiB,UAAA;EAAA,OACZ,MAAA,gBAAM,SAAA;EAkdM;EA1UA,KAAA;EA0UA;EAvUA,MAAA;;EAGA,KAAA;;EAGA,IAAA;;EAGuC,OAAA;;EAGG,UAAA;;EAGA,UAAA;;EAGD,SAAA;;EAGzB,QAAA;;EAGhB,KAAA;;EAG0B,UAAA;;EAGC,WAAA;EAAA,QAE/C,SAAA;EAAA,QACA,eAAA;EAAA,QACA,gBAAA;EAAA,QACA,YAAA;EAAA,QACA,UAAA;EAAA,QACA,WAAA;EAAA,QAMA,cAAA;EAAA,QAgBA,cAAA;EAAA,QAOA,YAAA;EAAA,QAeA,kBAAA;EAAA,QAuCA,UAAA;EAAA,QAUA,QAAA;EAAA,QAIA,mBAAA;EAAA,QAiEA,WAAA;EAMC,OAAA,CAAQ,QAAA,EAAU,cAAA;EAKlB,oBAAA;EAAA,QAUD,YAAA;EAAA,QAWA,aAAA;EAAA,QAiBA,UAAA;EAAA,QAMA,aAAA;EAUC,MAAA,IAAU,UAAA,QAAkB,IAAA;;mBA+CpB,IAAA;AAAA;AAAA,KAOP,mBAAA;EAAA,SACD,KAAA;EAAA,SACA,MAAM;AAAA;AAAA,KAGL,kBAAA,GAAqB,WAAW,CAAC,mBAAA;AAAA,QAErC,MAAA;EAAA,UACI,qBAAA;IACR,gBAAA,EAAkB,QAAQ;EAAA;AAAA"}
|
package/dist/polar-pad.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-pNMOMx38.js";
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
|
|
3
|
+
import { t as prominenceStyles } from "./prominence-DlFShic3.js";
|
|
2
4
|
import { LitElement, css, html, svg } from "lit";
|
|
3
5
|
import { property } from "lit/decorators.js";
|
|
4
6
|
//#region src/polar-pad/polar-pad.ts
|
|
@@ -241,7 +243,10 @@ let PolarPad = class PolarPad extends LitElement {
|
|
|
241
243
|
this._uid = Math.random().toString(36).slice(2, 8);
|
|
242
244
|
}
|
|
243
245
|
static {
|
|
244
|
-
this.styles =
|
|
246
|
+
this.styles = [
|
|
247
|
+
prominenceStyles,
|
|
248
|
+
themeFallbacks,
|
|
249
|
+
css`
|
|
245
250
|
:host {
|
|
246
251
|
display: block;
|
|
247
252
|
width: 200px;
|
|
@@ -287,7 +292,7 @@ let PolarPad = class PolarPad extends LitElement {
|
|
|
287
292
|
}
|
|
288
293
|
|
|
289
294
|
:host([disabled]) {
|
|
290
|
-
opacity:
|
|
295
|
+
opacity: var(--prominence-disabled-opacity);
|
|
291
296
|
pointer-events: none;
|
|
292
297
|
}
|
|
293
298
|
|
|
@@ -374,7 +379,8 @@ let PolarPad = class PolarPad extends LitElement {
|
|
|
374
379
|
stroke: var(--accent);
|
|
375
380
|
stroke-width: 3;
|
|
376
381
|
}
|
|
377
|
-
|
|
382
|
+
`
|
|
383
|
+
];
|
|
378
384
|
}
|
|
379
385
|
_updateFromPointer(e) {
|
|
380
386
|
const area = this.renderRoot.querySelector(`.polar-pad-area`);
|
package/dist/polar-pad.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polar-pad.js","names":["customElement"],"sources":["../src/polar-pad/polar-pad.ts"],"sourcesContent":["import type { PropertyValues } from 'lit';\n/**\n * <ixfx-polar-pad> — circular pad for setting polar coordinates (angle + radius).\n *\n * The user clicks or drags within a circle to position a marker. The marker's\n * position encodes an angle (degrees, 0 = right, clockwise) and a radius (0–1).\n *\n * Properties / attributes\n * angle – current angle in degrees (0 = right, clockwise). Default: 0\n * radius – current radius 0–1 where 1 = edge. Default: 0.5\n * rings – number of concentric rings to draw (0 = none). Default: 0\n * rays – number of evenly-spaced radial spokes to draw (0 = none). Default: 0\n * show-ray – draw a line from the origin to the marker\n * show-origin – draw a dot at the centre\n * hide-cursor – hide cursor during drag and hover (default: false)\n * snap-value – when set, marker snaps to nearest ring/spoke depending on what's displayed\n * disabled – disable all interaction (default: false)\n *\n * Customisable CSS variables:\n *\n * Pad background\n * --pad-background – CSS `background` of the circular pad. Accepts any CSS background\n * value: solid colour, conic-gradient(), radial-gradient(), etc.\n * Dynamic CSS vars like --angle-deg / --radius-pct are available\n * so the gradient can track the current marker position.\n * Default: var(--surface-4)\n * --pad-border-color – stroke of the outer circle (default: --surface-6)\n * --pad-border-width – thickness of outer border (default: 1px)\n *\n * Marker\n * --marker-size – diameter of the draggable marker (default: 10cqb)\n * --marker-color – fill colour of the marker (default: --accent)\n * --marker-opacity – opacity of the marker (default: 1)\n * --marker-stroke – stroke colour of the marker (default: none)\n * --marker-stroke-width – stroke thickness of the marker (default: 0)\n *\n * Origin dot (show-origin)\n * --origin-size – diameter of the origin dot (default: 6cqb)\n * --origin-color – fill colour of the origin dot (default: --accent)\n * --origin-opacity – opacity of the origin dot (default: 1)\n *\n * Ray line (show-ray)\n * --ray-color – stroke colour (default: --surface-6)\n * --ray-width – thickness (default: 2px)\n * --ray-opacity – opacity (default: 1)\n * --ray-dash – stroke-dasharray value e.g. \"4 2\" (default: none)\n *\n * Concentric rings (rings > 0)\n * --ring-color – stroke colour (default: --surface-6)\n * --ring-width – thickness (default: 1px)\n * --ring-opacity – opacity (default: 1)\n * --ring-dash – stroke-dasharray e.g. \"4 2\" (default: none)\n *\n * Radial spokes (rays > 0)\n * --spoke-color – stroke colour (default: --surface-6)\n * --spoke-width – thickness (default: 1px)\n * --spoke-opacity – opacity (default: 1)\n * --spoke-dash – stroke-dasharray e.g. \"4 2\" (default: none)\n *\n * CSS variables set on host for external dynamic styling:\n * --angle-deg – current angle as unitless number in degrees\n * --angle-rad – current angle as unitless number in radians\n * --radius-pct – current radius as unitless number 0–100\n *\n * Events\n * input – CustomEvent<PolarPadInputDetail> { angle: number (deg), radius: number (0–1) }\n * bubbles + composed, fires continuously during drag\n * change – CustomEvent<PolarPadInputDetail> { angle: number (deg), radius: number (0–1) }\n * bubbles + composed, fires when drag ends\n */\nimport { css, html, LitElement, svg } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KEY_STEP_DIVISOR } from '../keyboard.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n// ---------------------------------------------------------------------------\n// Geometry helpers\n// ---------------------------------------------------------------------------\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\n/**\n * Convert polar (angle in radians, radius 0-1) to SVG coordinates.\n * SVG viewBox 0 0 100 100; origin at (50,50); full radius = 50.\n * Convention: 0 rad = right (+x), increases CLOCKWISE (+y = downward in SVG).\n */\nfunction polarToSvg(angleRad: number, radius: number): { x: number; y: number } {\n const r = radius * 50;\n return { x: 50 + Math.cos(angleRad) * r, y: 50 + Math.sin(angleRad) * r };\n}\n\n/**\n * Convert SVG coordinates back to polar (angle in radians 0..2π, radius 0-1).\n * SVG: Y increases downward. Convention: 0=right, CW positive.\n */\nfunction svgToPolar(svgX: number, svgY: number): { angleRad: number; radius: number } {\n const dx = svgX - 50;\n const dy = svgY - 50; // +dy = downward = clockwise\n const dist = Math.sqrt(dx * dx + dy * dy);\n const radius = Math.min(1, dist / 50);\n const raw = Math.atan2(dy, dx);\n const angleRad = ((raw % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI);\n return { angleRad, radius };\n}\n\nconst clamp01 = (v: number): number => Math.max(0, Math.min(1, v));\n\n// ---------------------------------------------------------------------------\n// Direction-aware snapping helpers\n// ---------------------------------------------------------------------------\n\nfunction snapAngle(angleDeg: number, prevAngleDeg: number, rays: number, snapEnabled: boolean): number {\n if (rays <= 0 || !snapEnabled)\n return angleDeg;\n const spokeDeg = 360 / rays;\n const normalized = ((angleDeg % 360) + 360) % 360;\n const nearest = Math.round(normalized / spokeDeg) * spokeDeg;\n const remainder = normalized % spokeDeg;\n const tie = Math.abs(remainder) < 0.0001 || Math.abs(spokeDeg - remainder) < 0.0001;\n if (tie) {\n let delta = angleDeg - prevAngleDeg;\n if (delta > 180)\n delta -= 360;\n if (delta < -180)\n delta += 360;\n const direction = delta >= 0 ? 1 : -1;\n return (nearest + direction * spokeDeg + 360) % 360;\n }\n return nearest;\n}\n\nfunction snapRadius(radius: number, prevRadius: number, rings: number, snapEnabled: boolean): number {\n if (rings <= 0 || !snapEnabled)\n return radius;\n const ringStep = 1 / rings;\n const nearest = Math.round(radius / ringStep) * ringStep;\n const remainder = radius % ringStep;\n const tie = Math.abs(remainder) < 0.0001 || Math.abs(ringStep - remainder) < 0.0001;\n if (tie) {\n const direction = radius >= prevRadius ? 1 : -1;\n return Math.max(0, Math.min(1, nearest + direction * ringStep));\n }\n return nearest;\n}\n\nfunction quantiseAngle(angleDeg: number, stops?: number): number {\n if (!stops || stops <= 1)\n return angleDeg;\n const stepDeg = 360 / stops;\n const normalized = ((angleDeg % 360) + 360) % 360;\n return Math.round(normalized / stepDeg) * stepDeg;\n}\n\nfunction quantiseRadius(radius: number, stops?: number): number {\n if (!stops || stops <= 1)\n return radius;\n const step = 1 / stops;\n return Math.round(radius / step) * step;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n@customElement(`ixfx-polar-pad`)\nexport class PolarPad extends LitElement {\n static override styles = css`\n :host {\n display: block;\n width: 200px;\n height: 200px;\n touch-action: none;\n user-select: none;\n container-type: size;\n\n /* Pad background */\n --pad-background: var(--surface-4, oklch(22% 0.02 240));\n --pad-border-color: var(--surface-6, oklch(35% 0.02 240));\n --pad-border-width: 1px;\n\n /* Marker */\n --marker-size: 10cqb;\n --marker-color: var(--accent, oklch(60% 0.15 140));\n --marker-opacity: 1;\n --marker-stroke: none;\n --marker-stroke-width: 0;\n\n /* Origin dot */\n --origin-size: 6cqb;\n --origin-color: var(--accent, oklch(60% 0.15 140));\n --origin-opacity: 1;\n\n /* Ray line */\n --ray-color: var(--surface-6, oklch(35% 0.02 240));\n --ray-width: 2px;\n --ray-opacity: 1;\n --ray-dash: none;\n\n /* Concentric rings */\n --ring-color: var(--surface-6, oklch(35% 0.02 240));\n --ring-width: 1px;\n --ring-opacity: 1;\n --ring-dash: none;\n\n /* Radial spokes */\n --spoke-color: var(--surface-6, oklch(35% 0.02 240));\n --spoke-width: 1px;\n --spoke-opacity: 1;\n --spoke-dash: none;\n }\n\n :host([disabled]) {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .polar-pad-area {\n position: relative;\n width: 100%;\n height: 100%;\n cursor: var(--cursor-display, crosshair);\n }\n\n :host([dragging]) .polar-pad-area {\n cursor: none;\n }\n\n svg {\n width: 100%;\n height: 100%;\n overflow: visible;\n }\n\n .pad-background {\n /* Used on the foreignObject div — accepts any CSS background value */\n width: 100%;\n height: 100%;\n background: var(--pad-background);\n }\n\n .pad-border {\n fill: none;\n stroke: var(--pad-border-color);\n stroke-width: var(--pad-border-width);\n vector-effect: non-scaling-stroke;\n }\n\n .ring {\n fill: none;\n stroke: var(--ring-color);\n stroke-width: var(--ring-width);\n stroke-dasharray: var(--ring-dash);\n opacity: var(--ring-opacity);\n vector-effect: non-scaling-stroke;\n }\n\n .spoke {\n fill: none;\n stroke: var(--spoke-color);\n stroke-width: var(--spoke-width);\n stroke-dasharray: var(--spoke-dash);\n opacity: var(--spoke-opacity);\n vector-effect: non-scaling-stroke;\n }\n\n .ray {\n fill: none;\n stroke: var(--ray-color);\n stroke-width: var(--ray-width);\n stroke-dasharray: var(--ray-dash);\n opacity: var(--ray-opacity);\n vector-effect: non-scaling-stroke;\n }\n\n .origin-dot {\n fill: var(--origin-color);\n opacity: var(--origin-opacity);\n }\n\n .marker {\n fill: var(--marker-color);\n opacity: var(--marker-opacity);\n stroke: var(--marker-stroke);\n stroke-width: var(--marker-stroke-width);\n cursor: grab;\n }\n\n .marker:active {\n cursor: grabbing;\n }\n\n svg:focus {\n outline: none;\n }\n\n svg:focus-visible .pad-border {\n stroke: var(--accent);\n stroke-width: 3;\n }\n `;\n\n /** Current angle in degrees. 0 = right, increases clockwise. */\n @property({ type: Number }) angle = 0;\n\n /** Current radius 0–1. 0 = origin, 1 = edge. */\n @property({ type: Number }) radius = 0.5;\n\n /** Number of concentric rings to display. 0 = none. */\n @property({ type: Number }) rings = 0;\n\n /** Number of evenly-spaced radial spoke lines to display. 0 = none. */\n @property({ type: Number }) rays = 0;\n\n /** Show a line from origin to the marker. */\n @property({ type: Boolean, reflect: true, attribute: `show-ray` }) showRay = false;\n\n /** Show a dot at the origin (centre). */\n @property({ type: Boolean, reflect: true, attribute: `show-origin` }) showOrigin = false;\n\n /** Hide cursor during drag and hover. */\n @property({ type: Boolean, reflect: true, attribute: `hide-cursor` }) hideCursor = false;\n\n /** When set, marker snaps to nearest ring/spoke depending on what's displayed. */\n @property({ type: Boolean, attribute: `snap-value`, reflect: true }) snapValue = false;\n\n /** Disable all interaction (pointer and keyboard). */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** Number of quantised stops for both angle and radius. Overridden by stops-angle/stops-radius if set. */\n @property({ type: Number }) stops?: number;\n\n /** Number of quantised stops for angle. If set, overrides the stops setting for angle. */\n @property({ type: Number, attribute: `stops-angle` }) stopsAngle?: number;\n\n /** Number of quantised stops for radius. If set, overrides the stops setting for radius. */\n @property({ type: Number, attribute: `stops-radius` }) stopsRadius?: number;\n\n private _dragging = false;\n private _dragStartAngle = 0;\n private _dragStartRadius = 0;\n private _pressedKeys = new Set<string>();\n private _prevAngle = 0;\n private _prevRadius = 0;\n\n // -------------------------------------------------------------------------\n // Pointer handling\n // -------------------------------------------------------------------------\n\n private _onPointerDown = (e: PointerEvent): void => {\n e.preventDefault();\n const svg = this.renderRoot.querySelector(`svg`) as SVGSVGElement | undefined;\n (svg as HTMLElement | undefined)?.focus();\n const area = this.renderRoot.querySelector(`.polar-pad-area`) as HTMLElement | undefined;\n if (area)\n area.setPointerCapture(e.pointerId);\n this._dragging = true;\n this._dragStartAngle = this.angle;\n this._dragStartRadius = this.radius;\n this.setAttribute(`dragging`, ``);\n this._updateFromPointer(e);\n globalThis.addEventListener(`pointermove`, this._onPointerMove);\n globalThis.addEventListener(`pointerup`, this._onPointerUp);\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._dragging)\n return;\n e.preventDefault();\n this._updateFromPointer(e);\n };\n\n private _onPointerUp = (): void => {\n const hasChanged = this.angle !== this._dragStartAngle || this.radius !== this._dragStartRadius;\n this._dragging = false;\n this.removeAttribute(`dragging`);\n globalThis.removeEventListener(`pointermove`, this._onPointerMove);\n globalThis.removeEventListener(`pointerup`, this._onPointerUp);\n if (hasChanged) {\n this.dispatchEvent(new CustomEvent<PolarPadInputDetail>(`change`, {\n detail: { angle: this.angle, radius: this.radius },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n private _updateFromPointer(e: PointerEvent): void {\n const area = this.renderRoot.querySelector(`.polar-pad-area`);\n if (!area)\n return;\n\n const rect = area.getBoundingClientRect();\n const size = Math.min(rect.width, rect.height);\n const svgX = ((e.clientX - rect.left) / size) * 100;\n const svgY = ((e.clientY - rect.top) / size) * 100;\n\n const { angleRad, radius } = svgToPolar(svgX, svgY);\n const newAngleDeg = angleRad * RAD_TO_DEG;\n const newRadius = clamp01(radius);\n\n this._prevAngle = this.angle;\n this._prevRadius = this.radius;\n\n const snappedAngle = snapAngle(newAngleDeg, this._prevAngle, this.rays, this.snapValue);\n const snappedRadius = snapRadius(newRadius, this._prevRadius, this.rings, this.snapValue);\n\n const effectiveStopsAngle = this.stopsAngle ?? this.stops;\n const effectiveStopsRadius = this.stopsRadius ?? this.stops;\n\n this.angle = quantiseAngle(snappedAngle, effectiveStopsAngle);\n this.radius = quantiseRadius(snappedRadius, effectiveStopsRadius);\n this._prevAngle = newAngleDeg;\n this._prevRadius = newRadius;\n\n this.dispatchEvent(new CustomEvent<PolarPadInputDetail>(`input`, {\n detail: { angle: this.angle, radius: this.radius },\n bubbles: true,\n composed: true,\n }));\n }\n\n // -------------------------------------------------------------------------\n // Keyboard handling\n // -------------------------------------------------------------------------\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this.disabled)\n return;\n if ([`ArrowLeft`, `ArrowRight`, `ArrowUp`, `ArrowDown`].includes(e.key)) {\n e.preventDefault();\n this._pressedKeys.add(e.key);\n this._handleKeyboardMove(e.shiftKey);\n }\n };\n\n private _onKeyUp = (e: KeyboardEvent): void => {\n this._pressedKeys.delete(e.key);\n };\n\n private _handleKeyboardMove = (shiftKey: boolean): void => {\n const shiftDivisor = shiftKey ? KEY_STEP_DIVISOR : 1;\n const effectiveStopsAngle = this.stopsAngle ?? this.stops;\n const effectiveStopsRadius = this.stopsRadius ?? this.stops;\n\n let angleStep: number;\n if (effectiveStopsAngle && effectiveStopsAngle > 1) {\n angleStep = 360 / effectiveStopsAngle;\n } else {\n const angleRange = this.rays > 0 && this.snapValue ? this.rays : 20;\n angleStep = 360 / angleRange;\n }\n\n let radiusStep: number;\n if (effectiveStopsRadius && effectiveStopsRadius > 1) {\n radiusStep = 1 / effectiveStopsRadius;\n } else {\n radiusStep = 1 / 20;\n }\n\n angleStep /= shiftDivisor;\n radiusStep /= shiftDivisor;\n\n this._prevAngle = this.angle;\n this._prevRadius = this.radius;\n\n let newAngle = this.angle;\n let newRadius = this.radius;\n\n if (this._pressedKeys.has(`ArrowLeft`)) {\n newAngle -= angleStep;\n }\n if (this._pressedKeys.has(`ArrowRight`)) {\n newAngle += angleStep;\n }\n if (this._pressedKeys.has(`ArrowUp`)) {\n newRadius = Math.min(1, newRadius + radiusStep);\n }\n if (this._pressedKeys.has(`ArrowDown`)) {\n newRadius = Math.max(0, newRadius - radiusStep);\n }\n\n newAngle = ((newAngle % 360) + 360) % 360;\n\n let finalAngle = snapAngle(newAngle, this._prevAngle, this.rays, this.snapValue);\n let finalRadius = snapRadius(newRadius, this._prevRadius, this.rings, this.snapValue);\n\n finalAngle = quantiseAngle(finalAngle, effectiveStopsAngle);\n finalRadius = quantiseRadius(finalRadius, effectiveStopsRadius);\n\n if (finalAngle !== this.angle || finalRadius !== this.radius) {\n this.angle = finalAngle;\n this.radius = finalRadius;\n this.dispatchEvent(new CustomEvent<PolarPadInputDetail>(`input`, {\n detail: { angle: this.angle, radius: this.radius },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n // -------------------------------------------------------------------------\n // CSS variable sync\n // -------------------------------------------------------------------------\n\n private _setCssVars(): void {\n this.style.setProperty(`--angle-deg`, `${this.angle}`);\n this.style.setProperty(`--angle-rad`, `${this.angle * DEG_TO_RAD}`);\n this.style.setProperty(`--radius-pct`, `${clamp01(this.radius) * 100}`);\n }\n\n override updated(_changed: PropertyValues): void {\n super.updated(_changed);\n this._setCssVars();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._onPointerUp();\n this._pressedKeys.clear();\n }\n\n // -------------------------------------------------------------------------\n // SVG helpers\n // -------------------------------------------------------------------------\n\n private _renderRings() {\n if (this.rings <= 0)\n return ``;\n const items = [];\n for (let i = 1; i <= this.rings; i++) {\n const r = (i / this.rings) * 50;\n items.push(svg`<circle class=\"ring\" cx=\"50\" cy=\"50\" r=\"${r}\" />`);\n }\n return items;\n }\n\n private _renderSpokes() {\n if (this.rays <= 0)\n return ``;\n const items = [];\n for (let i = 0; i < this.rays; i++) {\n const angleRad = (i / this.rays) * 2 * Math.PI;\n const cos = Math.cos(angleRad);\n const sin = Math.sin(angleRad); // SVG +y downward matches CW convention directly\n const x1 = 50 + cos * 50;\n const y1 = 50 + sin * 50;\n const x2 = 50 - cos * 50;\n const y2 = 50 - sin * 50;\n items.push(svg`<line class=\"spoke\" x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" />`);\n }\n return items;\n }\n\n private _renderRay(markerX: number, markerY: number) {\n if (!this.showRay)\n return ``;\n return svg`<line class=\"ray\" x1=\"50\" y1=\"50\" x2=\"${markerX}\" y2=\"${markerY}\" />`;\n }\n\n private _renderOrigin() {\n if (!this.showOrigin)\n return ``;\n return svg`<circle class=\"origin-dot\" cx=\"50\" cy=\"50\" r=\"3\" style=\"r: calc(var(--origin-size) / 2)\" />`;\n }\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n override render(): ReturnType<typeof html> {\n const angleRad = this.angle * DEG_TO_RAD;\n const { x: markerX, y: markerY } = polarToSvg(angleRad, clamp01(this.radius));\n\n return html`\n <div class=\"polar-pad-area\"\n @pointerdown=${this._onPointerDown}\n @keydown=${this._onKeyDown}\n @keyup=${this._onKeyUp}\n @blur=${() => this._pressedKeys.clear()}>\n <svg viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid meet\"\n tabindex=${this.disabled ? -1 : 0}>\n <defs>\n <clipPath id=\"circle-clip-${this._uid}\">\n <circle cx=\"50\" cy=\"50\" r=\"50\" />\n </clipPath>\n </defs>\n\n <!-- clipped group: background + rings + spokes -->\n <g clip-path=\"url(#circle-clip-${this._uid})\">\n <foreignObject x=\"0\" y=\"0\" width=\"100\" height=\"100\">\n <div class=\"pad-background\" xmlns=\"http://www.w3.org/1999/xhtml\"></div>\n </foreignObject>\n ${this._renderRings()}\n ${this._renderSpokes()}\n </g>\n\n <!-- border circle (on top of clip, non-scaling stroke) -->\n <circle class=\"pad-border\" cx=\"50\" cy=\"50\" r=\"49.75\" />\n\n <!-- ray + origin + marker -->\n ${this._renderRay(markerX, markerY)}\n ${this._renderOrigin()}\n <circle\n class=\"marker\"\n cx=\"${markerX}\"\n cy=\"${markerY}\"\n r=\"5\"\n style=\"r: calc(var(--marker-size) / 2)\"\n />\n </svg>\n </div>\n `;\n }\n\n /** Stable per-instance uid for SVG clipPath IDs. */\n private readonly _uid = Math.random().toString(36).slice(2, 8);\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type PolarPadInputDetail = {\n readonly angle: number; // degrees, 0 = right, clockwise\n readonly radius: number; // 0–1\n};\n\nexport type PolarPadInputEvent = CustomEvent<PolarPadInputDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-polar-pad': PolarPad;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"polar-pad.js","names":["customElement"],"sources":["../src/polar-pad/polar-pad.ts"],"sourcesContent":["import type { PropertyValues } from 'lit';\n/**\n * <ixfx-polar-pad> — circular pad for setting polar coordinates (angle + radius).\n *\n * The user clicks or drags within a circle to position a marker. The marker's\n * position encodes an angle (degrees, 0 = right, clockwise) and a radius (0–1).\n *\n * Properties / attributes\n * angle – current angle in degrees (0 = right, clockwise). Default: 0\n * radius – current radius 0–1 where 1 = edge. Default: 0.5\n * rings – number of concentric rings to draw (0 = none). Default: 0\n * rays – number of evenly-spaced radial spokes to draw (0 = none). Default: 0\n * show-ray – draw a line from the origin to the marker\n * show-origin – draw a dot at the centre\n * hide-cursor – hide cursor during drag and hover (default: false)\n * snap-value – when set, marker snaps to nearest ring/spoke depending on what's displayed\n * disabled – disable all interaction (default: false)\n *\n * Customisable CSS variables:\n *\n * Pad background\n * --pad-background – CSS `background` of the circular pad. Accepts any CSS background\n * value: solid colour, conic-gradient(), radial-gradient(), etc.\n * Dynamic CSS vars like --angle-deg / --radius-pct are available\n * so the gradient can track the current marker position.\n * Default: var(--surface-4)\n * --pad-border-color – stroke of the outer circle (default: --surface-6)\n * --pad-border-width – thickness of outer border (default: 1px)\n *\n * Marker\n * --marker-size – diameter of the draggable marker (default: 10cqb)\n * --marker-color – fill colour of the marker (default: --accent)\n * --marker-opacity – opacity of the marker (default: 1)\n * --marker-stroke – stroke colour of the marker (default: none)\n * --marker-stroke-width – stroke thickness of the marker (default: 0)\n *\n * Origin dot (show-origin)\n * --origin-size – diameter of the origin dot (default: 6cqb)\n * --origin-color – fill colour of the origin dot (default: --accent)\n * --origin-opacity – opacity of the origin dot (default: 1)\n *\n * Ray line (show-ray)\n * --ray-color – stroke colour (default: --surface-6)\n * --ray-width – thickness (default: 2px)\n * --ray-opacity – opacity (default: 1)\n * --ray-dash – stroke-dasharray value e.g. \"4 2\" (default: none)\n *\n * Concentric rings (rings > 0)\n * --ring-color – stroke colour (default: --surface-6)\n * --ring-width – thickness (default: 1px)\n * --ring-opacity – opacity (default: 1)\n * --ring-dash – stroke-dasharray e.g. \"4 2\" (default: none)\n *\n * Radial spokes (rays > 0)\n * --spoke-color – stroke colour (default: --surface-6)\n * --spoke-width – thickness (default: 1px)\n * --spoke-opacity – opacity (default: 1)\n * --spoke-dash – stroke-dasharray e.g. \"4 2\" (default: none)\n *\n * CSS variables set on host for external dynamic styling:\n * --angle-deg – current angle as unitless number in degrees\n * --angle-rad – current angle as unitless number in radians\n * --radius-pct – current radius as unitless number 0–100\n *\n * Events\n * input – CustomEvent<PolarPadInputDetail> { angle: number (deg), radius: number (0–1) }\n * bubbles + composed, fires continuously during drag\n * change – CustomEvent<PolarPadInputDetail> { angle: number (deg), radius: number (0–1) }\n * bubbles + composed, fires when drag ends\n */\nimport { css, html, LitElement, svg } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KEY_STEP_DIVISOR } from '../keyboard.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n// ---------------------------------------------------------------------------\n// Geometry helpers\n// ---------------------------------------------------------------------------\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\n/**\n * Convert polar (angle in radians, radius 0-1) to SVG coordinates.\n * SVG viewBox 0 0 100 100; origin at (50,50); full radius = 50.\n * Convention: 0 rad = right (+x), increases CLOCKWISE (+y = downward in SVG).\n */\nfunction polarToSvg(angleRad: number, radius: number): { x: number; y: number } {\n const r = radius * 50;\n return { x: 50 + Math.cos(angleRad) * r, y: 50 + Math.sin(angleRad) * r };\n}\n\n/**\n * Convert SVG coordinates back to polar (angle in radians 0..2π, radius 0-1).\n * SVG: Y increases downward. Convention: 0=right, CW positive.\n */\nfunction svgToPolar(svgX: number, svgY: number): { angleRad: number; radius: number } {\n const dx = svgX - 50;\n const dy = svgY - 50; // +dy = downward = clockwise\n const dist = Math.sqrt(dx * dx + dy * dy);\n const radius = Math.min(1, dist / 50);\n const raw = Math.atan2(dy, dx);\n const angleRad = ((raw % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI);\n return { angleRad, radius };\n}\n\nconst clamp01 = (v: number): number => Math.max(0, Math.min(1, v));\n\n// ---------------------------------------------------------------------------\n// Direction-aware snapping helpers\n// ---------------------------------------------------------------------------\n\nfunction snapAngle(angleDeg: number, prevAngleDeg: number, rays: number, snapEnabled: boolean): number {\n if (rays <= 0 || !snapEnabled)\n return angleDeg;\n const spokeDeg = 360 / rays;\n const normalized = ((angleDeg % 360) + 360) % 360;\n const nearest = Math.round(normalized / spokeDeg) * spokeDeg;\n const remainder = normalized % spokeDeg;\n const tie = Math.abs(remainder) < 0.0001 || Math.abs(spokeDeg - remainder) < 0.0001;\n if (tie) {\n let delta = angleDeg - prevAngleDeg;\n if (delta > 180)\n delta -= 360;\n if (delta < -180)\n delta += 360;\n const direction = delta >= 0 ? 1 : -1;\n return (nearest + direction * spokeDeg + 360) % 360;\n }\n return nearest;\n}\n\nfunction snapRadius(radius: number, prevRadius: number, rings: number, snapEnabled: boolean): number {\n if (rings <= 0 || !snapEnabled)\n return radius;\n const ringStep = 1 / rings;\n const nearest = Math.round(radius / ringStep) * ringStep;\n const remainder = radius % ringStep;\n const tie = Math.abs(remainder) < 0.0001 || Math.abs(ringStep - remainder) < 0.0001;\n if (tie) {\n const direction = radius >= prevRadius ? 1 : -1;\n return Math.max(0, Math.min(1, nearest + direction * ringStep));\n }\n return nearest;\n}\n\nfunction quantiseAngle(angleDeg: number, stops?: number): number {\n if (!stops || stops <= 1)\n return angleDeg;\n const stepDeg = 360 / stops;\n const normalized = ((angleDeg % 360) + 360) % 360;\n return Math.round(normalized / stepDeg) * stepDeg;\n}\n\nfunction quantiseRadius(radius: number, stops?: number): number {\n if (!stops || stops <= 1)\n return radius;\n const step = 1 / stops;\n return Math.round(radius / step) * step;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n@customElement(`ixfx-polar-pad`)\nexport class PolarPad extends LitElement {\n static override styles = [prominenceStyles, themeFallbacks, css`\n :host {\n display: block;\n width: 200px;\n height: 200px;\n touch-action: none;\n user-select: none;\n container-type: size;\n\n /* Pad background */\n --pad-background: var(--surface-4, oklch(22% 0.02 240));\n --pad-border-color: var(--surface-6, oklch(35% 0.02 240));\n --pad-border-width: 1px;\n\n /* Marker */\n --marker-size: 10cqb;\n --marker-color: var(--accent, oklch(60% 0.15 140));\n --marker-opacity: 1;\n --marker-stroke: none;\n --marker-stroke-width: 0;\n\n /* Origin dot */\n --origin-size: 6cqb;\n --origin-color: var(--accent, oklch(60% 0.15 140));\n --origin-opacity: 1;\n\n /* Ray line */\n --ray-color: var(--surface-6, oklch(35% 0.02 240));\n --ray-width: 2px;\n --ray-opacity: 1;\n --ray-dash: none;\n\n /* Concentric rings */\n --ring-color: var(--surface-6, oklch(35% 0.02 240));\n --ring-width: 1px;\n --ring-opacity: 1;\n --ring-dash: none;\n\n /* Radial spokes */\n --spoke-color: var(--surface-6, oklch(35% 0.02 240));\n --spoke-width: 1px;\n --spoke-opacity: 1;\n --spoke-dash: none;\n }\n\n :host([disabled]) {\n opacity: var(--prominence-disabled-opacity);\n pointer-events: none;\n }\n\n .polar-pad-area {\n position: relative;\n width: 100%;\n height: 100%;\n cursor: var(--cursor-display, crosshair);\n }\n\n :host([dragging]) .polar-pad-area {\n cursor: none;\n }\n\n svg {\n width: 100%;\n height: 100%;\n overflow: visible;\n }\n\n .pad-background {\n /* Used on the foreignObject div — accepts any CSS background value */\n width: 100%;\n height: 100%;\n background: var(--pad-background);\n }\n\n .pad-border {\n fill: none;\n stroke: var(--pad-border-color);\n stroke-width: var(--pad-border-width);\n vector-effect: non-scaling-stroke;\n }\n\n .ring {\n fill: none;\n stroke: var(--ring-color);\n stroke-width: var(--ring-width);\n stroke-dasharray: var(--ring-dash);\n opacity: var(--ring-opacity);\n vector-effect: non-scaling-stroke;\n }\n\n .spoke {\n fill: none;\n stroke: var(--spoke-color);\n stroke-width: var(--spoke-width);\n stroke-dasharray: var(--spoke-dash);\n opacity: var(--spoke-opacity);\n vector-effect: non-scaling-stroke;\n }\n\n .ray {\n fill: none;\n stroke: var(--ray-color);\n stroke-width: var(--ray-width);\n stroke-dasharray: var(--ray-dash);\n opacity: var(--ray-opacity);\n vector-effect: non-scaling-stroke;\n }\n\n .origin-dot {\n fill: var(--origin-color);\n opacity: var(--origin-opacity);\n }\n\n .marker {\n fill: var(--marker-color);\n opacity: var(--marker-opacity);\n stroke: var(--marker-stroke);\n stroke-width: var(--marker-stroke-width);\n cursor: grab;\n }\n\n .marker:active {\n cursor: grabbing;\n }\n\n svg:focus {\n outline: none;\n }\n\n svg:focus-visible .pad-border {\n stroke: var(--accent);\n stroke-width: 3;\n }\n `];\n\n /** Current angle in degrees. 0 = right, increases clockwise. */\n @property({ type: Number }) angle = 0;\n\n /** Current radius 0–1. 0 = origin, 1 = edge. */\n @property({ type: Number }) radius = 0.5;\n\n /** Number of concentric rings to display. 0 = none. */\n @property({ type: Number }) rings = 0;\n\n /** Number of evenly-spaced radial spoke lines to display. 0 = none. */\n @property({ type: Number }) rays = 0;\n\n /** Show a line from origin to the marker. */\n @property({ type: Boolean, reflect: true, attribute: `show-ray` }) showRay = false;\n\n /** Show a dot at the origin (centre). */\n @property({ type: Boolean, reflect: true, attribute: `show-origin` }) showOrigin = false;\n\n /** Hide cursor during drag and hover. */\n @property({ type: Boolean, reflect: true, attribute: `hide-cursor` }) hideCursor = false;\n\n /** When set, marker snaps to nearest ring/spoke depending on what's displayed. */\n @property({ type: Boolean, attribute: `snap-value`, reflect: true }) snapValue = false;\n\n /** Disable all interaction (pointer and keyboard). */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** Number of quantised stops for both angle and radius. Overridden by stops-angle/stops-radius if set. */\n @property({ type: Number }) stops?: number;\n\n /** Number of quantised stops for angle. If set, overrides the stops setting for angle. */\n @property({ type: Number, attribute: `stops-angle` }) stopsAngle?: number;\n\n /** Number of quantised stops for radius. If set, overrides the stops setting for radius. */\n @property({ type: Number, attribute: `stops-radius` }) stopsRadius?: number;\n\n private _dragging = false;\n private _dragStartAngle = 0;\n private _dragStartRadius = 0;\n private _pressedKeys = new Set<string>();\n private _prevAngle = 0;\n private _prevRadius = 0;\n\n // -------------------------------------------------------------------------\n // Pointer handling\n // -------------------------------------------------------------------------\n\n private _onPointerDown = (e: PointerEvent): void => {\n e.preventDefault();\n const svg = this.renderRoot.querySelector(`svg`) as SVGSVGElement | undefined;\n (svg as HTMLElement | undefined)?.focus();\n const area = this.renderRoot.querySelector(`.polar-pad-area`) as HTMLElement | undefined;\n if (area)\n area.setPointerCapture(e.pointerId);\n this._dragging = true;\n this._dragStartAngle = this.angle;\n this._dragStartRadius = this.radius;\n this.setAttribute(`dragging`, ``);\n this._updateFromPointer(e);\n globalThis.addEventListener(`pointermove`, this._onPointerMove);\n globalThis.addEventListener(`pointerup`, this._onPointerUp);\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._dragging)\n return;\n e.preventDefault();\n this._updateFromPointer(e);\n };\n\n private _onPointerUp = (): void => {\n const hasChanged = this.angle !== this._dragStartAngle || this.radius !== this._dragStartRadius;\n this._dragging = false;\n this.removeAttribute(`dragging`);\n globalThis.removeEventListener(`pointermove`, this._onPointerMove);\n globalThis.removeEventListener(`pointerup`, this._onPointerUp);\n if (hasChanged) {\n this.dispatchEvent(new CustomEvent<PolarPadInputDetail>(`change`, {\n detail: { angle: this.angle, radius: this.radius },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n private _updateFromPointer(e: PointerEvent): void {\n const area = this.renderRoot.querySelector(`.polar-pad-area`);\n if (!area)\n return;\n\n const rect = area.getBoundingClientRect();\n const size = Math.min(rect.width, rect.height);\n const svgX = ((e.clientX - rect.left) / size) * 100;\n const svgY = ((e.clientY - rect.top) / size) * 100;\n\n const { angleRad, radius } = svgToPolar(svgX, svgY);\n const newAngleDeg = angleRad * RAD_TO_DEG;\n const newRadius = clamp01(radius);\n\n this._prevAngle = this.angle;\n this._prevRadius = this.radius;\n\n const snappedAngle = snapAngle(newAngleDeg, this._prevAngle, this.rays, this.snapValue);\n const snappedRadius = snapRadius(newRadius, this._prevRadius, this.rings, this.snapValue);\n\n const effectiveStopsAngle = this.stopsAngle ?? this.stops;\n const effectiveStopsRadius = this.stopsRadius ?? this.stops;\n\n this.angle = quantiseAngle(snappedAngle, effectiveStopsAngle);\n this.radius = quantiseRadius(snappedRadius, effectiveStopsRadius);\n this._prevAngle = newAngleDeg;\n this._prevRadius = newRadius;\n\n this.dispatchEvent(new CustomEvent<PolarPadInputDetail>(`input`, {\n detail: { angle: this.angle, radius: this.radius },\n bubbles: true,\n composed: true,\n }));\n }\n\n // -------------------------------------------------------------------------\n // Keyboard handling\n // -------------------------------------------------------------------------\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this.disabled)\n return;\n if ([`ArrowLeft`, `ArrowRight`, `ArrowUp`, `ArrowDown`].includes(e.key)) {\n e.preventDefault();\n this._pressedKeys.add(e.key);\n this._handleKeyboardMove(e.shiftKey);\n }\n };\n\n private _onKeyUp = (e: KeyboardEvent): void => {\n this._pressedKeys.delete(e.key);\n };\n\n private _handleKeyboardMove = (shiftKey: boolean): void => {\n const shiftDivisor = shiftKey ? KEY_STEP_DIVISOR : 1;\n const effectiveStopsAngle = this.stopsAngle ?? this.stops;\n const effectiveStopsRadius = this.stopsRadius ?? this.stops;\n\n let angleStep: number;\n if (effectiveStopsAngle && effectiveStopsAngle > 1) {\n angleStep = 360 / effectiveStopsAngle;\n } else {\n const angleRange = this.rays > 0 && this.snapValue ? this.rays : 20;\n angleStep = 360 / angleRange;\n }\n\n let radiusStep: number;\n if (effectiveStopsRadius && effectiveStopsRadius > 1) {\n radiusStep = 1 / effectiveStopsRadius;\n } else {\n radiusStep = 1 / 20;\n }\n\n angleStep /= shiftDivisor;\n radiusStep /= shiftDivisor;\n\n this._prevAngle = this.angle;\n this._prevRadius = this.radius;\n\n let newAngle = this.angle;\n let newRadius = this.radius;\n\n if (this._pressedKeys.has(`ArrowLeft`)) {\n newAngle -= angleStep;\n }\n if (this._pressedKeys.has(`ArrowRight`)) {\n newAngle += angleStep;\n }\n if (this._pressedKeys.has(`ArrowUp`)) {\n newRadius = Math.min(1, newRadius + radiusStep);\n }\n if (this._pressedKeys.has(`ArrowDown`)) {\n newRadius = Math.max(0, newRadius - radiusStep);\n }\n\n newAngle = ((newAngle % 360) + 360) % 360;\n\n let finalAngle = snapAngle(newAngle, this._prevAngle, this.rays, this.snapValue);\n let finalRadius = snapRadius(newRadius, this._prevRadius, this.rings, this.snapValue);\n\n finalAngle = quantiseAngle(finalAngle, effectiveStopsAngle);\n finalRadius = quantiseRadius(finalRadius, effectiveStopsRadius);\n\n if (finalAngle !== this.angle || finalRadius !== this.radius) {\n this.angle = finalAngle;\n this.radius = finalRadius;\n this.dispatchEvent(new CustomEvent<PolarPadInputDetail>(`input`, {\n detail: { angle: this.angle, radius: this.radius },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n // -------------------------------------------------------------------------\n // CSS variable sync\n // -------------------------------------------------------------------------\n\n private _setCssVars(): void {\n this.style.setProperty(`--angle-deg`, `${this.angle}`);\n this.style.setProperty(`--angle-rad`, `${this.angle * DEG_TO_RAD}`);\n this.style.setProperty(`--radius-pct`, `${clamp01(this.radius) * 100}`);\n }\n\n override updated(_changed: PropertyValues): void {\n super.updated(_changed);\n this._setCssVars();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._onPointerUp();\n this._pressedKeys.clear();\n }\n\n // -------------------------------------------------------------------------\n // SVG helpers\n // -------------------------------------------------------------------------\n\n private _renderRings() {\n if (this.rings <= 0)\n return ``;\n const items = [];\n for (let i = 1; i <= this.rings; i++) {\n const r = (i / this.rings) * 50;\n items.push(svg`<circle class=\"ring\" cx=\"50\" cy=\"50\" r=\"${r}\" />`);\n }\n return items;\n }\n\n private _renderSpokes() {\n if (this.rays <= 0)\n return ``;\n const items = [];\n for (let i = 0; i < this.rays; i++) {\n const angleRad = (i / this.rays) * 2 * Math.PI;\n const cos = Math.cos(angleRad);\n const sin = Math.sin(angleRad); // SVG +y downward matches CW convention directly\n const x1 = 50 + cos * 50;\n const y1 = 50 + sin * 50;\n const x2 = 50 - cos * 50;\n const y2 = 50 - sin * 50;\n items.push(svg`<line class=\"spoke\" x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" />`);\n }\n return items;\n }\n\n private _renderRay(markerX: number, markerY: number) {\n if (!this.showRay)\n return ``;\n return svg`<line class=\"ray\" x1=\"50\" y1=\"50\" x2=\"${markerX}\" y2=\"${markerY}\" />`;\n }\n\n private _renderOrigin() {\n if (!this.showOrigin)\n return ``;\n return svg`<circle class=\"origin-dot\" cx=\"50\" cy=\"50\" r=\"3\" style=\"r: calc(var(--origin-size) / 2)\" />`;\n }\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n override render(): ReturnType<typeof html> {\n const angleRad = this.angle * DEG_TO_RAD;\n const { x: markerX, y: markerY } = polarToSvg(angleRad, clamp01(this.radius));\n\n return html`\n <div class=\"polar-pad-area\"\n @pointerdown=${this._onPointerDown}\n @keydown=${this._onKeyDown}\n @keyup=${this._onKeyUp}\n @blur=${() => this._pressedKeys.clear()}>\n <svg viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"xMidYMid meet\"\n tabindex=${this.disabled ? -1 : 0}>\n <defs>\n <clipPath id=\"circle-clip-${this._uid}\">\n <circle cx=\"50\" cy=\"50\" r=\"50\" />\n </clipPath>\n </defs>\n\n <!-- clipped group: background + rings + spokes -->\n <g clip-path=\"url(#circle-clip-${this._uid})\">\n <foreignObject x=\"0\" y=\"0\" width=\"100\" height=\"100\">\n <div class=\"pad-background\" xmlns=\"http://www.w3.org/1999/xhtml\"></div>\n </foreignObject>\n ${this._renderRings()}\n ${this._renderSpokes()}\n </g>\n\n <!-- border circle (on top of clip, non-scaling stroke) -->\n <circle class=\"pad-border\" cx=\"50\" cy=\"50\" r=\"49.75\" />\n\n <!-- ray + origin + marker -->\n ${this._renderRay(markerX, markerY)}\n ${this._renderOrigin()}\n <circle\n class=\"marker\"\n cx=\"${markerX}\"\n cy=\"${markerY}\"\n r=\"5\"\n style=\"r: calc(var(--marker-size) / 2)\"\n />\n </svg>\n </div>\n `;\n }\n\n /** Stable per-instance uid for SVG clipPath IDs. */\n private readonly _uid = Math.random().toString(36).slice(2, 8);\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type PolarPadInputDetail = {\n readonly angle: number; // degrees, 0 = right, clockwise\n readonly radius: number; // 0–1\n};\n\nexport type PolarPadInputEvent = CustomEvent<PolarPadInputDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-polar-pad': PolarPad;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popup-
|
|
1
|
+
{"version":3,"file":"popup-DiWMxsWj.js","names":[],"sources":["../src/styles/popup.ts"],"sourcesContent":["import { css } from \"lit\";\n\n/**\n * Canonical surface styles for floating popup elements (menus, dropdowns,\n * colour picker, tooltips). Apply by adding `popupSurfaceStyles` to a\n * component's `static styles` array and the class `popup-surface` to the\n * popup container element.\n *\n * Intentionally omitted (remain per-component): positioning, padding,\n * dimensions, z-index, and open/close animations.\n */\nexport const popupSurfaceStyles = css`\n .popup-surface {\n background: var(--surface-5);\n border: 1px solid var(--surface-6);\n border-radius: var(--radius-l);\n box-shadow: var(--shadow-m);\n color: var(--surface-5-text);\n }\n`;\n"],"mappings":";;;;;;;;;;;AAWA,MAAa,qBAAqB,GAAG"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { css } from "lit";
|
|
2
|
+
//#region src/styles/prominence.ts
|
|
3
|
+
/**
|
|
4
|
+
* Shared CSS variable defaults for prominence-based interaction feedback.
|
|
5
|
+
*
|
|
6
|
+
* Defines the `--prominence-*` variables on `:host`. Include this if you
|
|
7
|
+
* are building custom prominence selectors; otherwise use `prominenceStyles`
|
|
8
|
+
* or `prominenceSubStyles` which include these variables automatically.
|
|
9
|
+
*/
|
|
10
|
+
const prominenceVars = css`
|
|
11
|
+
:host {
|
|
12
|
+
--prominence-idle-opacity: 0.6;
|
|
13
|
+
--prominence-idle-saturate: 0.4;
|
|
14
|
+
--prominence-tickled-opacity: 0.85;
|
|
15
|
+
--prominence-tickled-saturate: 0.8;
|
|
16
|
+
--prominence-disabled-opacity: 0.3;
|
|
17
|
+
--prominence-disabled-saturate: 0.1;
|
|
18
|
+
}
|
|
19
|
+
`;
|
|
20
|
+
/**
|
|
21
|
+
* Host-based prominence interaction feedback.
|
|
22
|
+
*
|
|
23
|
+
* Applies CSS `filter` to **the whole component host** to convey state:
|
|
24
|
+
* - **Disabled** (`[disabled]` / `:disabled`): heavily muted
|
|
25
|
+
* - **Idle** (default): reduced opacity + desaturated
|
|
26
|
+
* - **Tickled** (`:hover` / `:focus-within`): elevated opacity + saturation
|
|
27
|
+
* - **Active** (`:active` / `[dragging]`): full vibrancy (filter removed)
|
|
28
|
+
*
|
|
29
|
+
* Defaults are defined on `:host` and can be overridden per-instance.
|
|
30
|
+
*
|
|
31
|
+
* Usage:
|
|
32
|
+
* ```ts
|
|
33
|
+
* import { prominenceStyles } from '../styles/prominence.js';
|
|
34
|
+
*
|
|
35
|
+
* class MyComponent extends LitElement {
|
|
36
|
+
* static styles = [prominenceStyles, css`...`];
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
const prominenceStyles = css`
|
|
41
|
+
${prominenceVars}
|
|
42
|
+
|
|
43
|
+
:host {
|
|
44
|
+
filter:
|
|
45
|
+
opacity(var(--prominence-idle-opacity))
|
|
46
|
+
saturate(var(--prominence-idle-saturate));
|
|
47
|
+
transition: filter var(--transition, 0.15s ease-out);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
:host(:hover),
|
|
51
|
+
:host(:focus-within) {
|
|
52
|
+
filter:
|
|
53
|
+
opacity(var(--prominence-tickled-opacity))
|
|
54
|
+
saturate(var(--prominence-tickled-saturate));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
:host(:active),
|
|
58
|
+
:host([dragging]) {
|
|
59
|
+
filter: none;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Disabled comes last to override tickled/active selectors of equal specificity */
|
|
63
|
+
:host([disabled]),
|
|
64
|
+
:host(:disabled) {
|
|
65
|
+
filter:
|
|
66
|
+
opacity(var(--prominence-disabled-opacity))
|
|
67
|
+
saturate(var(--prominence-disabled-saturate));
|
|
68
|
+
pointer-events: none;
|
|
69
|
+
}
|
|
70
|
+
`;
|
|
71
|
+
css`
|
|
72
|
+
${prominenceVars}
|
|
73
|
+
|
|
74
|
+
.prominence {
|
|
75
|
+
filter:
|
|
76
|
+
opacity(var(--prominence-idle-opacity))
|
|
77
|
+
saturate(var(--prominence-idle-saturate));
|
|
78
|
+
transition: filter var(--transition, 0.15s ease-out);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.prominence:hover,
|
|
82
|
+
.prominence:focus-within {
|
|
83
|
+
filter:
|
|
84
|
+
opacity(var(--prominence-tickled-opacity))
|
|
85
|
+
saturate(var(--prominence-tickled-saturate));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.prominence:active,
|
|
89
|
+
.prominence.dragging {
|
|
90
|
+
filter: none;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.prominence[disabled],
|
|
94
|
+
.prominence:disabled {
|
|
95
|
+
filter:
|
|
96
|
+
opacity(var(--prominence-disabled-opacity))
|
|
97
|
+
saturate(var(--prominence-disabled-saturate));
|
|
98
|
+
pointer-events: none;
|
|
99
|
+
}
|
|
100
|
+
`;
|
|
101
|
+
//#endregion
|
|
102
|
+
export { prominenceStyles as t };
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=prominence-DlFShic3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prominence-DlFShic3.js","names":[],"sources":["../src/styles/prominence.ts"],"sourcesContent":["import { css } from 'lit';\n\n/**\n * Shared CSS variable defaults for prominence-based interaction feedback.\n *\n * Defines the `--prominence-*` variables on `:host`. Include this if you\n * are building custom prominence selectors; otherwise use `prominenceStyles`\n * or `prominenceSubStyles` which include these variables automatically.\n */\nexport const prominenceVars = css`\n :host {\n --prominence-idle-opacity: 0.6;\n --prominence-idle-saturate: 0.4;\n --prominence-tickled-opacity: 0.85;\n --prominence-tickled-saturate: 0.8;\n --prominence-disabled-opacity: 0.3;\n --prominence-disabled-saturate: 0.1;\n }\n`;\n\n/**\n * Host-based prominence interaction feedback.\n *\n * Applies CSS `filter` to **the whole component host** to convey state:\n * - **Disabled** (`[disabled]` / `:disabled`): heavily muted\n * - **Idle** (default): reduced opacity + desaturated\n * - **Tickled** (`:hover` / `:focus-within`): elevated opacity + saturation\n * - **Active** (`:active` / `[dragging]`): full vibrancy (filter removed)\n *\n * Defaults are defined on `:host` and can be overridden per-instance.\n *\n * Usage:\n * ```ts\n * import { prominenceStyles } from '../styles/prominence.js';\n *\n * class MyComponent extends LitElement {\n * static styles = [prominenceStyles, css`...`];\n * }\n * ```\n */\nexport const prominenceStyles = css`\n ${prominenceVars}\n\n :host {\n filter:\n opacity(var(--prominence-idle-opacity))\n saturate(var(--prominence-idle-saturate));\n transition: filter var(--transition, 0.15s ease-out);\n }\n\n :host(:hover),\n :host(:focus-within) {\n filter:\n opacity(var(--prominence-tickled-opacity))\n saturate(var(--prominence-tickled-saturate));\n }\n\n :host(:active),\n :host([dragging]) {\n filter: none;\n }\n\n /* Disabled comes last to override tickled/active selectors of equal specificity */\n :host([disabled]),\n :host(:disabled) {\n filter:\n opacity(var(--prominence-disabled-opacity))\n saturate(var(--prominence-disabled-saturate));\n pointer-events: none;\n }\n`;\n\n/**\n * Sub-element prominence interaction feedback.\n *\n * Same prominence effect as `prominenceStyles`, but applied to **child\n * elements** via the `.prominence` class instead of `:host`. Use this when\n * you want prominence feedback on a specific sub-element rather than the\n * whole component.\n *\n * Usage:\n * ```ts\n * import { prominenceSubStyles } from '../styles/prominence.js';\n *\n * class MyComponent extends LitElement {\n * static styles = [prominenceSubStyles, css`\n * .thumb { }\n * `];\n *\n * render() {\n * return html`<div class=\"thumb prominence\"></div>`;\n * }\n * }\n * ```\n *\n * States are driven by pseudo-classes on the element itself:\n * - Default idle state applies the muted filter.\n * - `:hover` / `:focus-within` transitions to tickled.\n * - `:active` / `.dragging` removes the filter entirely.\n * - `[disabled]` / `:disabled` applies the disabled mute.\n */\nexport const prominenceSubStyles = css`\n ${prominenceVars}\n\n .prominence {\n filter:\n opacity(var(--prominence-idle-opacity))\n saturate(var(--prominence-idle-saturate));\n transition: filter var(--transition, 0.15s ease-out);\n }\n\n .prominence:hover,\n .prominence:focus-within {\n filter:\n opacity(var(--prominence-tickled-opacity))\n saturate(var(--prominence-tickled-saturate));\n }\n\n .prominence:active,\n .prominence.dragging {\n filter: none;\n }\n\n .prominence[disabled],\n .prominence:disabled {\n filter:\n opacity(var(--prominence-disabled-opacity))\n saturate(var(--prominence-disabled-saturate));\n pointer-events: none;\n }\n`;\n"],"mappings":";;;;;;;;;AASA,MAAa,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BjC,MAAa,mBAAmB,GAAG;IAC/B,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DgB,GAAG;IAClC,eAAe"}
|
|
@@ -66,4 +66,4 @@ declare global {
|
|
|
66
66
|
} //# sourceMappingURL=radial-input.d.ts.map
|
|
67
67
|
//#endregion
|
|
68
68
|
export { RadialInputChangeDetail as a, RadialInputInputEvent as c, MarkerStyle as i, ValueMode as l, LaneData as n, RadialInputChangeEvent as o, LaneType as r, RadialInputInputDetail as s, RadialInputElement as t };
|
|
69
|
-
//# sourceMappingURL=radial-input-
|
|
69
|
+
//# sourceMappingURL=radial-input-CpQPs1Mp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radial-input-CpQPs1Mp.d.ts","names":[],"sources":["../src/radial-input/types.ts","../src/radial-input/radial-input.ts"],"mappings":";;;;;;KAIY,SAAA;AAAA,KACA,WAAA;AAAA,KACA,QAAA;AAAA,UAEK,QAAA;EACf,GAAA;EACA,KAAA;EACA,IAAA,EAAM,QAAQ;EACd,MAAA;EACA,KAAA;AAAA;AAAA,UAGe,sBAAA;EACf,KAAA;EACA,aAAa;AAAA;AAAA,UAGE,uBAAA;EACf,KAAA;EACA,aAAA;EACA,aAAA;AAAA;AAAA,KAGU,qBAAA,GAAwB,WAAW,CAAC,sBAAA;AAAA,KACpC,sBAAA,GAAyB,WAAW,CAAC,uBAAA;;;cCQpC,kBAAA,SAA2B,UAAA;EAAA;MAMlC,MAAA;EAAA,IAIA,MAAA,CAAO,CAAA;EAMX,KAAA;EAGA,GAAA;EAGA,GAAA;EAGA,IAAA;EAGA,KAAA;EAIA,SAAA,EAAW,SAAA;EAIX,OAAA;EAGA,WAAA,EAAa,WAAA;EAGb,KAAA;EAIA,QAAA;;EA+BA,OAAA,CACE,GAAA,UACA,OAAA;IACE,KAAA;IACA,IAAA,GAAO,QAAA;IACP,MAAA;IACA,KAAA;EAAA;EAcJ,YAAA,CAAa,GAAA,UAAa,KAAA;EAQ1B,UAAA,CAAW,GAAA;EAKX,QAAA,IAAY,WAAA,SAAoB,QAAA;EAIhC,OAAA,CAAQ,GAAA,WAAc,QAAA;EAAA,UA4bH,UAAA,CAAW,OAAA,EAAS,cAAA;EAa9B,MAAA;EAAA,UAgDU,OAAA,CAAQ,OAAA,EAAS,cAAA;EA4B3B,oBAAA;EAQA,YAAA;EAAA,OAYO,MAAA,gBAAM,SAAA;AAAA;AAAA,QAwHhB,MAAA;EAAA,UACI,qBAAA;IACR,mBAAA,EAAqB,kBAAkB;EAAA;AAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as
|
|
3
|
-
import { t as
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-pNMOMx38.js";
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
|
|
3
|
+
import { t as prominenceStyles } from "./prominence-DlFShic3.js";
|
|
4
|
+
import { t as resolveStep } from "./keyboard-CimiEskD.js";
|
|
4
5
|
import { LitElement, css, html, svg } from "lit";
|
|
5
6
|
import { property } from "lit/decorators.js";
|
|
6
7
|
//#region src/radial-input/svg-utils.ts
|
|
@@ -702,7 +703,10 @@ let RadialInputElement = class RadialInputElement extends LitElement {
|
|
|
702
703
|
if (svg) svg.setAttribute(`viewBox`, `0 0 100 ${viewBoxHeight}`);
|
|
703
704
|
}
|
|
704
705
|
static {
|
|
705
|
-
this.styles = [
|
|
706
|
+
this.styles = [
|
|
707
|
+
themeFallbacks,
|
|
708
|
+
prominenceStyles,
|
|
709
|
+
css`
|
|
706
710
|
:host {
|
|
707
711
|
display: inline-block;
|
|
708
712
|
width: 100px;
|
|
@@ -819,7 +823,8 @@ let RadialInputElement = class RadialInputElement extends LitElement {
|
|
|
819
823
|
stroke-width: var(--midpoint-border-width, 0);
|
|
820
824
|
vector-effect: non-scaling-stroke;
|
|
821
825
|
}
|
|
822
|
-
`
|
|
826
|
+
`
|
|
827
|
+
];
|
|
823
828
|
}
|
|
824
829
|
};
|
|
825
830
|
__decorate([property({ type: Number })], RadialInputElement.prototype, "radius", null);
|
|
@@ -846,4 +851,4 @@ RadialInputElement = __decorate([safeCustomElement(`ixfx-radial-input`)], Radial
|
|
|
846
851
|
//#endregion
|
|
847
852
|
export { RadialInputElement as t };
|
|
848
853
|
|
|
849
|
-
//# sourceMappingURL=radial-input-
|
|
854
|
+
//# sourceMappingURL=radial-input-DZ7eQCcM.js.map
|