@nuralyui/timepicker 0.1.1 → 0.1.3
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.js +2747 -0
- package/index.js.map +1 -0
- package/package.json +6 -1
- package/timepicker.component.d.ts +2 -2
- package/timepicker.component.js +2 -2
- package/timepicker.component.js.map +1 -0
- package/timepicker.constants.js.map +1 -0
- package/timepicker.style.js +49 -127
- package/timepicker.style.js.map +1 -0
- package/timepicker.style.variables.d.ts +2 -0
- package/timepicker.style.variables.js +122 -0
- package/timepicker.style.variables.js.map +1 -0
- package/timepicker.types.js.map +1 -0
- package/timepicker.component.backup.d.ts +0 -165
- package/timepicker.component.backup.js +0 -890
- package/timepicker.component.clean.d.ts +0 -95
- package/timepicker.component.clean.js +0 -471
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/timepicker/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sCAAsC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nexport { NrTimePickerElement } from './timepicker.component.js';\nexport * from './timepicker.types.js';\nexport * from './timepicker.constants.js';\nexport * from './utils/time.utils.js';\nexport * from './controllers/index.js';\nexport * from './interfaces/timepicker.interface.js';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nuralyui/timepicker",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "NuralyUI TimePicker - A comprehensive time selection component with clock interface, multiple formats, and validation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
"types": "./index.d.ts",
|
|
12
12
|
"default": "./index.js"
|
|
13
13
|
},
|
|
14
|
+
"./bundle": {
|
|
15
|
+
"import": "./bundle.js"
|
|
16
|
+
},
|
|
14
17
|
"./timepicker.component.js": {
|
|
15
18
|
"types": "./timepicker.component.d.ts",
|
|
16
19
|
"default": "./timepicker.component.js"
|
|
@@ -19,6 +22,8 @@
|
|
|
19
22
|
"files": [
|
|
20
23
|
"*.js",
|
|
21
24
|
"*.d.ts",
|
|
25
|
+
"*.js.map",
|
|
26
|
+
"bundle.js",
|
|
22
27
|
"controllers/",
|
|
23
28
|
"interfaces/",
|
|
24
29
|
"utils/",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LitElement, TemplateResult } from 'lit';
|
|
2
2
|
import '../input/input.component.js';
|
|
3
3
|
import '../button/button.component.js';
|
|
4
|
-
import { DropdownHost } from '
|
|
4
|
+
import { DropdownHost } from '@nuralyui/common/controllers';
|
|
5
5
|
import { TimeValue, TimeFormat, TimePickerConfig, TimePickerPlacement } from './timepicker.types.js';
|
|
6
6
|
export interface TimePickerHost extends LitElement, DropdownHost {
|
|
7
7
|
getCurrentTime(): TimeValue;
|
|
@@ -12,7 +12,7 @@ export interface TimePickerHost extends LitElement, DropdownHost {
|
|
|
12
12
|
validateTime(time: TimeValue): boolean;
|
|
13
13
|
requestUpdate(): void;
|
|
14
14
|
}
|
|
15
|
-
declare const NrTimePickerElement_base: (new (...args: any[]) => import("
|
|
15
|
+
declare const NrTimePickerElement_base: (new (...args: any[]) => import("@nuralyui/common/mixins").DependencyAware) & (new (...args: any[]) => import("@nuralyui/common/mixins").ThemeAware) & (new (...args: any[]) => import("@nuralyui/common/mixins").EventHandlerCapable) & typeof LitElement;
|
|
16
16
|
/**
|
|
17
17
|
* A comprehensive time picker component that supports both 12-hour and 24-hour formats,
|
|
18
18
|
* with optional seconds display and extensive customization options.
|
package/timepicker.component.js
CHANGED
|
@@ -11,8 +11,8 @@ import { classMap } from 'lit/directives/class-map.js';
|
|
|
11
11
|
import '../input/input.component.js';
|
|
12
12
|
import '../button/button.component.js';
|
|
13
13
|
// Import base mixin and types
|
|
14
|
-
import { NuralyUIBaseMixin } from '
|
|
15
|
-
import { SharedDropdownController } from '
|
|
14
|
+
import { NuralyUIBaseMixin } from '@nuralyui/common/mixins';
|
|
15
|
+
import { SharedDropdownController } from '@nuralyui/common/controllers';
|
|
16
16
|
import { TimeFormat, TimePickerState, TimePickerPlacement, TimePeriod, TimeStep, EMPTY_TIME_VALUE, TIME_PICKER_EVENTS, } from './timepicker.types.js';
|
|
17
17
|
// Import controllers
|
|
18
18
|
import { TimePickerSelectionController } from './controllers/selection.controller.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timepicker.component.js","sourceRoot":"","sources":["../../../src/components/timepicker/timepicker.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAkB,OAAO,EAAE,MAAM,KAAK,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,uBAAuB;AACvB,OAAO,6BAA6B,CAAC;AACrC,OAAO,+BAA+B,CAAC;AAGvC,8BAA8B;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,EAEH,UAAU,EAEV,eAAe,EACf,mBAAmB,EAEnB,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,qBAAqB;AACrB,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAExF,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,gBAAgB;AAChB,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAanE;;;;;;;;;;;;;GAaG;AAEH,IAAa,mBAAmB,GAAhC,MAAa,mBAAoB,SAAQ,iBAAiB,CAAC,UAAU,CAAC;IAoCpE;QACE,KAAK,EAAE,CAAC;QAlCV,aAAa;QACe,UAAK,GAAG,EAAE,CAAC;QACX,SAAI,GAAG,EAAE,CAAC;QACV,gBAAW,GAAG,aAAa,CAAC;QAC5B,WAAM,GAAe,UAAU,CAAC,cAAc,CAAC;QACnB,gBAAW,GAAG,KAAK,CAAC;QAC/C,aAAQ,GAAG,KAAK,CAAC;QACjB,aAAQ,GAAG,KAAK,CAAC;QACjB,aAAQ,GAAG,KAAK,CAAC;QAKQ,eAAU,GAAG,EAAE,CAAC;QAC1C,UAAK,GAAG,EAAE,CAAC;QACX,SAAI,GAAiC,QAAQ,CAAC;QAC9C,YAAO,GAAuC,UAAU,CAAC;QACzD,cAAS,GAAwB,mBAAmB,CAAC,MAAM,CAAC;QAExF,2HAA2H;QACjE,mBAAc,GAAkC,SAAS,CAAC;QAEpH,QAAQ;QACS,eAAU,GAAG,EAAE,CAAC;QAChB,UAAK,GAAoB,eAAe,CAAC,OAAO,CAAC;QACjD,sBAAiB,GAAG,EAAE,CAAC;QAExC,cAAc;QACN,uBAAkB,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACxD,wBAAmB,GAAG,IAAI,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAC9D,yBAAoB,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC;QAChE,yBAAoB,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC;IAIxE,CAAC;IAEQ,iBAAiB;QACxB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACnC;QAED,oEAAoE;QACpE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC;IAEQ,oBAAoB;QAC3B,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,kCAAkC;QAClC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,CAAC;IAEQ,OAAO,CAAC,iBAAmC;QAClD,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAEjC,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,EAAE;YACpE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,8DAA8D;YAC9D,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;gBAClC,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;aACR;SACF;QAED,IAAI,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,EAAE;YACnD,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC1B;QAED,2BAA2B;QAC3B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAEO,qBAAqB;;QAC3B,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,wBAAwB,CAAgB,CAAC;QACzF,MAAM,OAAO,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,6BAA6B,CAAgB,CAAC;QAE7F,IAAI,QAAQ,IAAI,OAAO,EAAE;YACvB,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SACxD;IACH,CAAC;IAEQ,MAAM;QACb,MAAM,cAAc,GAAG;YACrB,aAAa,EAAE,IAAI;YACnB,mBAAmB,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM;YACnD,uBAAuB,EAAE,IAAI,CAAC,QAAQ;YACtC,uBAAuB,EAAE,IAAI,CAAC,QAAQ;YACtC,oBAAoB,EAAE,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,KAAK;SAC3D,CAAC;QAEF,OAAO,IAAI,CAAA;oBACK,QAAQ,CAAC,cAAc,CAAC,iBAAiB,IAAI,CAAC,YAAY;UACpE,IAAI,CAAC,WAAW,EAAE;UAClB,IAAI,CAAC,WAAW,EAAE;UAClB,IAAI,CAAC,cAAc,EAAE;UACrB,IAAI,CAAC,gBAAgB,EAAE;;KAE5B,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,IAAI;QACF,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAC/B,wDAAwD;QACxD,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IACD,KAAK,KAAW,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClD,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE,CAAC;IAC5C,CAAC;IAED,QAAQ;QACN,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;QACvC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,wDAAwD;QACxD,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAClC,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;SACR;IACH,CAAC;IAED,QAAQ;QACN,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,CAAC;QAChE,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACrE,CAAC;IAED,YAAY,CAAC,IAAe;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,sEAAsE;IAC9D,WAAW,CAAC,IAAY,EAAE,YAAuB;QACvD,MAAM,QAAQ,mCAAQ,YAAY,KAAE,KAAK,EAAE,IAAI,GAAE,CAAC;QAClD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAEO,aAAa,CAAC,MAAc,EAAE,YAAuB;QAC3D,MAAM,QAAQ,mCAAQ,YAAY,KAAE,OAAO,EAAE,MAAM,GAAE,CAAC;QACtD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAEO,aAAa,CAAC,MAAc,EAAE,YAAuB;QAC3D,MAAM,QAAQ,mCAAQ,YAAY,KAAE,OAAO,EAAE,MAAM,GAAE,CAAC;QACtD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,kBAAkB;IACV,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC;QAEhC,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,KAAK;UACV,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA,8CAA8C,CAAC,CAAC,CAAC,OAAO;;KAEjF,CAAC;IACJ,CAAC;IAEO,WAAW;QACjB,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAEtD,OAAO,IAAI,CAAA;;;;;;oBAMK,IAAI,CAAC,UAAU;yBACV,IAAI,CAAC,WAAW,IAAI,iBAAiB;uBACvC,IAAI,CAAC,QAAQ;uBACb,KAAK;uBACL,IAAI,CAAC,QAAQ;oBAChB,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,KAAK,CAAC,CAAC,iCAAmB,CAAC,oCAAoB;oBAC9E,IAAI,CAAC,gBAAgB;uBAClB,IAAI,CAAC,iBAAiB;sBACvB,IAAI,CAAC,eAAe;;;;KAIrC,CAAC;IACJ,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC;QAEpD,OAAO,IAAI,CAAA;;;;kBAIG,IAAI,CAAC,mBAAmB;;UAEhC,IAAI,CAAC,kBAAkB,EAAE;UACzB,IAAI,CAAC,aAAa,EAAE;;KAEzB,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC;UAC3C,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;UACrC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO;;KAEvE,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,YAA8B,EAAE,MAAwB;QAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,UAAU;YACnD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5C,MAAM,WAAW,GAAG,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,UAAU;YACzE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;YAC3D,CAAC,CAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC;QAExB,OAAO,IAAI,CAAA;;;YAGH,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACjB,qDAAqD;YACrD,IAAI,UAAU,GAAG,IAAI,CAAC;YACtB,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,UAAU,IAAI,YAAY,EAAE;gBAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC9E,IAAI,IAAI,KAAK,EAAE,EAAE;oBACf,UAAU,GAAG,aAAa,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvD;qBAAM;oBACL,UAAU,GAAG,aAAa,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;iBACjE;aACF;YAED,+DAA+D;YAC/D,MAAM,iBAAiB,GAAG,YAAY,IAAI,gBAAgB,CAAC;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YAChE,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;YAE/D,OAAO,IAAI,CAAA;;kDAE2B,UAAU,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,EAAE;0BACtI,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;;kBAEzE,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;;aAErC,CAAC;QACJ,CAAC,CAAC;;;KAGP,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,YAA8B;QACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAExD,OAAO,IAAI,CAAA;;;YAGH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACrB,+DAA+D;YAC/D,MAAM,iBAAiB,GAAG,YAAY,IAAI,gBAAgB,CAAC;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YAE1E,OAAO,IAAI,CAAA;;kDAE2B,UAAU,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,EAAE;0BACtI,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;;kBAE9D,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;;aAEvC,CAAC;QACJ,CAAC,CAAC;;;KAGP,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,YAA8B;QACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAExD,OAAO,IAAI,CAAA;;;YAGH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACrB,+DAA+D;YAC/D,MAAM,iBAAiB,GAAG,YAAY,IAAI,gBAAgB,CAAC;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YAE1E,OAAO,IAAI,CAAA;;kDAE2B,UAAU,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,EAAE;0BACtI,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;;kBAE9D,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;;aAEvC,CAAC;QACJ,CAAC,CAAC;;;KAGP,CAAC;IACJ,CAAC;IAEO,aAAa;QACnB,OAAO,IAAI,CAAA;;;;;oBAKK,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;;;;;;;oBAOrB,IAAI,CAAC,aAAa;;;;;KAKjC,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,UAAU,CAAC;QACvD,IAAI,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC;QAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAEjF,OAAO,IAAI,CAAA;6CAC8B,OAAO,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE;UACnF,IAAI;;KAET,CAAC;IACJ,CAAC;IAEO,oBAAoB;QAC1B,IAAI;YACF,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,CAAC;YAChE,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE1B,2CAA2C;YAC3C,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;YACxC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;aAC3C;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;SAC3D;IACH,CAAC;IAEO,oBAAoB,CAAC,YAAuB;;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,4DAA4D,CAAgB,CAAC;QAE/H,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,IAAI,WAAmB,CAAC;QACxB,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,UAAU,EAAE;YAC3C,oCAAoC;YACpC,IAAI,YAAY,CAAC,KAAK,KAAK,CAAC,IAAI,YAAY,CAAC,KAAK,KAAK,EAAE,EAAE;gBACzD,WAAW,GAAG,EAAE,CAAC;aAClB;iBAAM;gBACL,WAAW,GAAG,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC;aACtF;SACF;aAAM;YACL,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC;SAClC;QAED,iCAAiC;QACjC,MAAM,mBAAmB,GAAG,UAAU,CAAC,aAAa,CAAC,uCAAuC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAgB,CAAC;QAEjK,IAAI,mBAAmB,EAAE;YACvB,mBAAmB,CAAC,cAAc,CAAC;gBACjC,QAAQ,EAAE,IAAI,CAAC,cAAgC;gBAC/C,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;SACJ;IACH,CAAC;IAEO,sBAAsB,CAAC,YAAuB;;QACpD,MAAM,YAAY,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,6DAA6D,CAAgB,CAAC;QAElI,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,+EAA+E;QAC/E,MAAM,qBAAqB,GAAG,YAAY,CAAC,aAAa,CAAC,uCAAuC,YAAY,CAAC,OAAO,GAAG,CAAC,GAAG,CAAgB,CAAC;QAE5I,IAAI,qBAAqB,EAAE;YACzB,qBAAqB,CAAC,cAAc,CAAC;gBACnC,QAAQ,EAAE,IAAI,CAAC,cAAgC;gBAC/C,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;SACJ;IACH,CAAC;IAEO,sBAAsB,CAAC,YAAuB;;QACpD,MAAM,YAAY,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,6DAA6D,CAAgB,CAAC;QAElI,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,+EAA+E;QAC/E,MAAM,qBAAqB,GAAG,YAAY,CAAC,aAAa,CAAC,uCAAuC,YAAY,CAAC,OAAO,GAAG,CAAC,GAAG,CAAgB,CAAC;QAE5I,IAAI,qBAAqB,EAAE;YACzB,qBAAqB,CAAC,cAAc,CAAC;gBACnC,QAAQ,EAAE,IAAI,CAAC,cAAgC;gBAC/C,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;SACJ;IACH,CAAC;IAEO,YAAY,CAAC,WAAmB,EAAE,MAAkB;QAC1D,IAAI,MAAM,KAAK,UAAU,CAAC,UAAU,EAAE;YACpC,wCAAwC;YACxC,OAAO,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;SAC7C;aAAM;YACL,uCAAuC;YACvC,OAAO,WAAW,CAAC;SACpB;IACH,CAAC;IAED,iBAAiB;IACT,oBAAoB,CAAC,CAAQ;QACnC,iEAAiE;QACjE,CAAC,CAAC,eAAe,EAAE,CAAC;IACtB,CAAC;IAEO,mBAAmB,CAAC,CAAQ;;QAClC,qDAAqD;QACrD,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAClC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAiB,CAAC;YACnC,MAAM,sBAAsB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;iBACvB,MAAA,IAAI,CAAC,UAAU,0CAAE,QAAQ,CAAC,MAAM,CAAC,CAAA,CAAC;YAE/D,IAAI,CAAC,sBAAsB,EAAE;gBAC3B,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE;oBAC1D,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC,CAAC;aACL;SACF;IACH,CAAC;IAEO,mBAAmB,CAAC,CAAQ;QAClC,qDAAqD;QACrD,CAAC,CAAC,eAAe,EAAE,CAAC;IACtB,CAAC;IAEO,aAAa;QACnB,iDAAiD;QACjD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,CAAC;QAEhE,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,WAAW,EAAE;gBACjE,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;aAClD,CAAC,CAAC,CAAC;SACL;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE;YAC1D,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,eAAe;QACrB,wDAAwD;QACxD,UAAU,CAAC,GAAG,EAAE;;YACd,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;YAC7C,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;iBAC9B,MAAA,IAAI,CAAC,UAAU,0CAAE,QAAQ,CAAC,aAAa,CAAC,CAAA,CAAC;YAEjE,IAAI,CAAC,iBAAiB,EAAE;gBACtB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE;oBAC1D,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC,CAAC;aACL;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAEO,gBAAgB,CAAC,CAAQ;QAC/B,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QAEpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,wDAAwD;YACxD,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;gBACnC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;gBAC/B,+CAA+C;gBAC/C,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;gBACP,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,KAAK,EAAE;oBAC3D,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC,CAAC;aACL;SACF;IACH,CAAC;IAEO,iBAAiB,CAAC,CAAc;;QACtC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,MAAM,UAAU,GAAG,CAAA,MAAA,CAAC,CAAC,MAAM,0CAAE,KAAK,KAAI,EAAE,CAAC;QACzC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAE7B,sDAAsD;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACzE,IAAI,UAAU,EAAE;YACd,2BAA2B;YAC3B,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;gBACjC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBAClE,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC;gBAErC,wDAAwD;gBACxD,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;oBAClC,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;iBACR;gBAED,oBAAoB;gBACpB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,WAAW,EAAE;oBACjE,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE;iBAChD,CAAC,CAAC,CAAC;aACL;iBAAM;gBACL,4DAA4D;gBAC5D,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC;aACpC;SACF;aAAM,IAAI,UAAU,KAAK,EAAE,EAAE;YAC5B,oCAAoC;YACpC,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC;YAErC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,WAAW,EAAE;gBACjE,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;aAClC,CAAC,CAAC,CAAC;SACL;aAAM;YACL,oCAAoC;YACpC,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC;SACpC;QAED,6CAA6C;QAC7C,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,gBAAgB,CAAC,IAAY,EAAE,MAAkB;QACvD,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;QAC9F,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,IAAI,MAAM,KAAK,UAAU,CAAC,UAAU,EAAE;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC9E,IAAI,IAAI,KAAK,EAAE,EAAE;gBACf,YAAY,GAAG,aAAa,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aACzD;iBAAM;gBACL,YAAY,GAAG,aAAa,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;aACnE;SACF;QAED,MAAM,WAAW,mCAAQ,YAAY,KAAE,KAAK,EAAE,YAAY,GAAE,CAAC;QAC7D,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE;YAClC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,iDAAiD;SAClD;IACH,CAAC;IAEO,kBAAkB,CAAC,MAAc;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;QAC9F,MAAM,WAAW,mCAAQ,YAAY,KAAE,OAAO,EAAE,MAAM,GAAE,CAAC;QAEzD,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE;YAClC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,iDAAiD;SAClD;IACH,CAAC;IAEO,kBAAkB,CAAC,MAAc;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;QAC9F,MAAM,WAAW,mCAAQ,YAAY,KAAE,OAAO,EAAE,MAAM,GAAE,CAAC;QAEzD,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE;YAClC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,iDAAiD;SAClD;IACH,CAAC;IAED,kBAAkB;IACV,uBAAuB,CAAC,iBAAmC;QACjE,OAAO,CACL,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;YAChC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;YAChC,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC;YACtC,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,CACtC,CAAC;IACJ,CAAC;IAEO,iBAAiB;QACvB,MAAM,WAAW,GAAoB;YACnC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE;YACvC,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;QAEF,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;IAEO,gBAAgB,CAAC,KAAa;QACpC,IAAI,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;YACrD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,mEAAmE;YACnE,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;gBAClC,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;aACR;SACF;IACH,CAAC;IAEO,gBAAgB;QACtB,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,CAAC;QAChE,IAAI,YAAY,EAAE;YAChB,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAChF,IAAI,CAAC,UAAU,GAAG,cAAc,CAAC;YACjC,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC;YAE5B,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,CAAC,WAAW,EAAE;gBACjE,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE;gBACrD,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC,CAAC;SACL;IACH,CAAC;IAED,SAAS;QACP,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI,EAAE;gBACJ,KAAK,EAAE,QAAQ,CAAC,GAAG;gBACnB,OAAO,EAAE,QAAQ,CAAC,GAAG;gBACrB,OAAO,EAAE,QAAQ,CAAC,GAAG;aACtB;YACD,cAAc,EAAE,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,UAAU;YACrD,cAAc,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;SAClB,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,cAAc;QACZ,OAAO,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,gBAAgB,CAAC;IACxE,CAAC;IAED,OAAO,CAAC,IAAe;QACrB,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,wDAAwD;QACxD,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAClC,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;SACR;IACH,CAAC;IAED,UAAU,CAAC,IAAe;QACxB,OAAO,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,UAAU,EAAE;YACzC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC;SAC5D;aAAM;YACL,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;SAChD;IACH,CAAC;IAED,SAAS,CAAC,UAAkB;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC;CACF,CAAA;AA9sBiB,0BAAM,GAAG,CAAC,gBAAgB,CAAE,CAAA;AAGhB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDAAY;AACX;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDAAW;AACV;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDAA6B;AAC5B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDAAgD;AACnB;IAAvD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;wDAAqB;AAC/C;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;qDAAkB;AACjB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;qDAAkB;AACjB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;qDAAkB;AACK;IAAlD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;oDAAkB;AACjB;IAAlD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;oDAAkB;AACZ;IAAvD,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;0DAA0B;AAC1B;IAAtD,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;yDAAyB;AACzB;IAArD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;uDAAiB;AAC1C;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDAAY;AACX;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDAA+C;AAC9C;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDAA0D;AACzD;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDAA6D;AAG9B;IAAzD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;2DAA2D;AAG3G;IAAR,KAAK,EAAE;uDAAyB;AACxB;IAAR,KAAK,EAAE;kDAA0D;AACzD;IAAR,KAAK,EAAE;8DAAgC;AA5B7B,mBAAmB;IAD/B,aAAa,CAAC,eAAe,CAAC;GAClB,mBAAmB,CA+sB/B;SA/sBY,mBAAmB","sourcesContent":["import { LitElement, html, TemplateResult, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\n\n// Import UI components\nimport '../input/input.component.js';\nimport '../button/button.component.js';\nimport { INPUT_STATE } from '../input/input.types.js';\n\n// Import base mixin and types\nimport { NuralyUIBaseMixin } from '@nuralyui/common/mixins';\nimport { SharedDropdownController } from '@nuralyui/common/controllers';\nimport { DropdownHost } from '@nuralyui/common/controllers';\nimport {\n TimeValue,\n TimeFormat,\n TimePickerConfig,\n TimePickerState,\n TimePickerPlacement,\n TimeConstraints,\n TimePeriod,\n TimeStep,\n EMPTY_TIME_VALUE,\n TIME_PICKER_EVENTS,\n} from './timepicker.types.js';\n\n// Import controllers\nimport { TimePickerSelectionController } from './controllers/selection.controller.js';\nimport { TimePickerValidationController } from './controllers/validation.controller.js';\nimport { TimePickerFormattingController } from './controllers/formatting.controller.js';\n\n// Import utilities\nimport { TimeUtils } from './utils/time.utils.js';\n\n// Import styles\nimport { styles as timePickerStyles } from './timepicker.style.js';\n\n// Host interface for controllers\nexport interface TimePickerHost extends LitElement, DropdownHost {\n getCurrentTime(): TimeValue;\n setTime(time: TimeValue): void;\n formatTime(time: TimeValue): string;\n parseTime(timeString: string): TimeValue | null;\n getConfig(): TimePickerConfig;\n validateTime(time: TimeValue): boolean;\n requestUpdate(): void;\n}\n\n/**\n * A comprehensive time picker component that supports both 12-hour and 24-hour formats,\n * with optional seconds display and extensive customization options.\n * \n * @example\n * ```html\n * <nr-timepicker \n * value=\"14:30:00\" \n * format=\"24h\" \n * show-seconds\n * placeholder=\"Select time\">\n * </nr-timepicker>\n * ```\n */\n@customElement('nr-timepicker')\nexport class NrTimePickerElement extends NuralyUIBaseMixin(LitElement) implements TimePickerHost {\n static override styles = [timePickerStyles];\n\n // Properties\n @property({ type: String }) value = '';\n @property({ type: String }) name = '';\n @property({ type: String }) placeholder = 'Select time';\n @property({ type: String }) format: TimeFormat = TimeFormat.TwentyFourHour;\n @property({ type: Boolean, attribute: 'show-seconds' }) showSeconds = false;\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) readonly = false;\n @property({ type: Boolean }) required = false;\n @property({ type: String, attribute: 'min-time' }) minTime?: string;\n @property({ type: String, attribute: 'max-time' }) maxTime?: string;\n @property({ type: Array, attribute: 'disabled-times' }) disabledTimes?: string[];\n @property({ type: Array, attribute: 'enabled-times' }) enabledTimes?: string[];\n @property({ type: String, attribute: 'helper-text' }) helperText = '';\n @property({ type: String }) label = '';\n @property({ type: String }) size: 'small' | 'medium' | 'large' = 'medium';\n @property({ type: String }) variant: 'outlined' | 'filled' | 'standard' = 'outlined';\n @property({ type: String }) placement: TimePickerPlacement = TimePickerPlacement.Bottom;\n \n /** Scroll behavior for dropdown navigation - 'instant' for immediate, 'smooth' for animated, 'auto' for browser default */\n @property({ type: String, attribute: 'scroll-behavior' }) scrollBehavior: 'auto' | 'instant' | 'smooth' = 'instant';\n\n // State\n @state() private inputValue = '';\n @state() private state: TimePickerState = TimePickerState.Default;\n @state() private validationMessage = '';\n\n // Controllers\n private dropdownController = new SharedDropdownController(this);\n private selectionController = new TimePickerSelectionController(this);\n private validationController = new TimePickerValidationController(this);\n private formattingController = new TimePickerFormattingController(this);\n\n constructor() {\n super();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.updateConstraints();\n if (this.value) {\n this.setTimeFromValue(this.value);\n }\n \n // Add global click listener to close dropdown when clicking outside\n this.addEventListener('click', this.handleComponentClick.bind(this));\n document.addEventListener('click', this.handleDocumentClick.bind(this));\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n // Clean up global event listeners\n document.removeEventListener('click', this.handleDocumentClick.bind(this));\n }\n\n override updated(changedProperties: Map<string, any>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has('value') && this.value !== this.inputValue) {\n this.setTimeFromValue(this.value);\n // Scroll to the selected time when value changes from outside\n if (this.dropdownController.isOpen) {\n setTimeout(() => {\n this.scrollToSelectedTime();\n }, 50);\n }\n }\n\n if (this.shouldUpdateConstraints(changedProperties)) {\n this.updateConstraints();\n }\n\n // Set up dropdown elements\n this.setupDropdownElements();\n }\n\n private setupDropdownElements(): void {\n const dropdown = this.shadowRoot?.querySelector('.time-picker__dropdown') as HTMLElement;\n const trigger = this.shadowRoot?.querySelector('.time-picker__input-wrapper') as HTMLElement;\n \n if (dropdown && trigger) {\n this.dropdownController.setElements(dropdown, trigger);\n }\n }\n\n override render(): TemplateResult {\n const wrapperClasses = {\n 'time-picker': true,\n 'time-picker--open': this.dropdownController.isOpen,\n 'time-picker--disabled': this.disabled,\n 'time-picker--readonly': this.readonly,\n 'time-picker--error': this.state === TimePickerState.Error,\n };\n\n return html`\n <div class=\"${classMap(wrapperClasses)}\" data-theme=\"${this.currentTheme}\" part=\"wrapper\">\n ${this.renderLabel()}\n ${this.renderInput()}\n ${this.renderDropdown()}\n ${this.renderHelperText()}\n </div>\n `;\n }\n\n // Public API methods\n open(): void { \n this.dropdownController.open();\n // Scroll to selected time when opening programmatically\n setTimeout(() => {\n this.scrollToSelectedTime();\n }, 50);\n }\n close(): void { this.dropdownController.close(); }\n clear(): void { \n this.value = '';\n this.inputValue = '';\n this.selectionController.clearSelection();\n }\n \n setToNow(): void {\n const now = TimeUtils.getCurrentTime();\n this.selectionController.selectTime(now);\n this.updateInputValue();\n // Scroll to the newly selected time if dropdown is open\n if (this.dropdownController.isOpen) {\n setTimeout(() => {\n this.scrollToSelectedTime();\n }, 10);\n }\n }\n\n validate(): boolean {\n const selectedTime = this.selectionController.getSelectedTime();\n if (!selectedTime) return true;\n return this.validationController.validateConstraints(selectedTime);\n }\n\n validateTime(time: TimeValue): boolean {\n return this.validationController.validateConstraints(time);\n }\n\n // Helper methods for checking if individual time components are valid\n private isHourValid(hour: number, selectedTime: TimeValue): boolean {\n const testTime = { ...selectedTime, hours: hour };\n return this.validateTime(testTime);\n }\n\n private isMinuteValid(minute: number, selectedTime: TimeValue): boolean {\n const testTime = { ...selectedTime, minutes: minute };\n return this.validateTime(testTime);\n }\n\n private isSecondValid(second: number, selectedTime: TimeValue): boolean {\n const testTime = { ...selectedTime, seconds: second };\n return this.validateTime(testTime);\n }\n\n // Private methods\n private renderLabel(): TemplateResult | typeof nothing {\n if (!this.label) return nothing;\n\n return html`\n <label class=\"time-picker__label\" part=\"label\" for=\"time-input\">\n ${this.label}\n ${this.required ? html`<span class=\"time-picker__required\">*</span>` : nothing}\n </label>\n `;\n }\n\n private renderInput(): TemplateResult {\n const formatPlaceholder = this.getFormatPlaceholder();\n \n return html`\n <div class=\"time-picker__input-wrapper\" part=\"input-wrapper\">\n <nr-input\n id=\"time-input\"\n part=\"input\"\n type=\"calendar\"\n .value=\"${this.inputValue}\"\n placeholder=\"${this.placeholder || formatPlaceholder}\"\n ?disabled=\"${this.disabled}\"\n ?readonly=\"${false}\"\n ?required=\"${this.required}\"\n .state=\"${this.state === TimePickerState.Error ? INPUT_STATE.Error : INPUT_STATE.Default}\"\n @click=\"${this.handleInputClick}\"\n @nr-input=\"${this.handleInputChange}\"\n @nr-blur=\"${this.handleInputBlur}\"\n >\n </nr-input>\n </div>\n `;\n }\n\n private renderDropdown(): TemplateResult | typeof nothing {\n if (!this.dropdownController.isOpen) return nothing;\n\n return html`\n <div \n class=\"time-picker__dropdown time-picker__dropdown--open\" \n part=\"dropdown\"\n @click=\"${this.handleDropdownClick}\"\n >\n ${this.renderColumnPicker()}\n ${this.renderActions()}\n </div>\n `;\n }\n\n private renderColumnPicker(): TemplateResult {\n const selectedTime = this.selectionController.getSelectedTime();\n const config = this.getConfig();\n\n return html`\n <div class=\"time-picker__columns\" part=\"columns\">\n ${this.renderHourColumn(selectedTime, config)}\n ${this.renderMinuteColumn(selectedTime)}\n ${this.showSeconds ? this.renderSecondColumn(selectedTime) : nothing}\n </div>\n `;\n }\n\n private renderHourColumn(selectedTime: TimeValue | null, config: TimePickerConfig): TemplateResult {\n const hours = config.format === TimeFormat.TwelveHour \n ? Array.from({ length: 12 }, (_, i) => i === 0 ? 12 : i)\n : Array.from({ length: 24 }, (_, i) => i);\n\n const displayHour = selectedTime && config.format === TimeFormat.TwelveHour\n ? this.formattingController.formatHours(selectedTime.hours)\n : selectedTime?.hours;\n\n return html`\n <div class=\"time-picker__column\" part=\"hour-column\">\n <div class=\"time-picker__column-list\">\n ${hours.map(hour => {\n // Convert display hour to actual hour for validation\n let actualHour = hour;\n if (config.format === TimeFormat.TwelveHour && selectedTime) {\n const currentPeriod = this.formattingController.getPeriod(selectedTime.hours);\n if (hour === 12) {\n actualHour = currentPeriod === TimePeriod.AM ? 0 : 12;\n } else {\n actualHour = currentPeriod === TimePeriod.AM ? hour : hour + 12;\n }\n }\n \n // Use EMPTY_TIME_VALUE for validation when no time is selected\n const timeForValidation = selectedTime || EMPTY_TIME_VALUE;\n const isValid = this.isHourValid(actualHour, timeForValidation);\n const isSelected = selectedTime ? hour === displayHour : false;\n \n return html`\n <div\n class=\"time-picker__column-item ${isSelected ? 'time-picker__column-item--selected' : ''} ${!isValid ? 'time-picker__column-item--disabled' : ''}\"\n @click=\"${isValid ? () => this.handleHourSelect(hour, config.format) : null}\"\n >\n ${hour.toString().padStart(2, '0')}\n </div>\n `;\n })}\n </div>\n </div>\n `;\n }\n\n private renderMinuteColumn(selectedTime: TimeValue | null): TemplateResult {\n const minutes = Array.from({ length: 60 }, (_, i) => i);\n\n return html`\n <div class=\"time-picker__column\" part=\"minute-column\">\n <div class=\"time-picker__column-list\">\n ${minutes.map(minute => {\n // Use EMPTY_TIME_VALUE for validation when no time is selected\n const timeForValidation = selectedTime || EMPTY_TIME_VALUE;\n const isValid = this.isMinuteValid(minute, timeForValidation);\n const isSelected = selectedTime ? minute === selectedTime.minutes : false;\n \n return html`\n <div\n class=\"time-picker__column-item ${isSelected ? 'time-picker__column-item--selected' : ''} ${!isValid ? 'time-picker__column-item--disabled' : ''}\"\n @click=\"${isValid ? () => this.handleMinuteSelect(minute) : null}\"\n >\n ${minute.toString().padStart(2, '0')}\n </div>\n `;\n })}\n </div>\n </div>\n `;\n }\n\n private renderSecondColumn(selectedTime: TimeValue | null): TemplateResult {\n const seconds = Array.from({ length: 60 }, (_, i) => i);\n\n return html`\n <div class=\"time-picker__column\" part=\"second-column\">\n <div class=\"time-picker__column-list\">\n ${seconds.map(second => {\n // Use EMPTY_TIME_VALUE for validation when no time is selected\n const timeForValidation = selectedTime || EMPTY_TIME_VALUE;\n const isValid = this.isSecondValid(second, timeForValidation);\n const isSelected = selectedTime ? second === selectedTime.seconds : false;\n \n return html`\n <div\n class=\"time-picker__column-item ${isSelected ? 'time-picker__column-item--selected' : ''} ${!isValid ? 'time-picker__column-item--disabled' : ''}\"\n @click=\"${isValid ? () => this.handleSecondSelect(second) : null}\"\n >\n ${second.toString().padStart(2, '0')}\n </div>\n `;\n })}\n </div>\n </div>\n `;\n }\n\n private renderActions(): TemplateResult {\n return html`\n <div class=\"time-picker__actions\">\n <nr-button\n type=\"ghost\"\n size=\"small\"\n @click=\"${() => this.setToNow()}\"\n >\n Now\n </nr-button>\n <nr-button\n type=\"primary\"\n size=\"small\"\n @click=\"${this.handleOkClick}\"\n >\n OK\n </nr-button>\n </div>\n `;\n }\n\n private renderHelperText(): TemplateResult | typeof nothing {\n const text = this.validationMessage || this.helperText;\n if (!text) return nothing;\n\n const isError = this.state === TimePickerState.Error || !!this.validationMessage;\n\n return html`\n <div class=\"time-picker__helper-text ${isError ? 'time-picker__helper-text--error' : ''}\" part=\"helper-text\">\n ${text}\n </div>\n `;\n }\n\n private scrollToSelectedTime(): void {\n try {\n const selectedTime = this.selectionController.getSelectedTime();\n if (!selectedTime) return;\n\n // Scroll each column to the selected value\n this.scrollToSelectedHour(selectedTime);\n this.scrollToSelectedMinute(selectedTime);\n if (this.showSeconds) {\n this.scrollToSelectedSecond(selectedTime);\n }\n } catch (error) {\n console.warn('Failed to scroll to selected time:', error);\n }\n }\n\n private scrollToSelectedHour(selectedTime: TimeValue): void {\n const config = this.getConfig();\n const hourColumn = this.shadowRoot?.querySelector('.time-picker__column:first-child .time-picker__column-list') as HTMLElement;\n \n if (!hourColumn) return;\n\n let displayHour: number;\n if (config.format === TimeFormat.TwelveHour) {\n // Convert 24-hour to 12-hour format\n if (selectedTime.hours === 0 || selectedTime.hours === 12) {\n displayHour = 12;\n } else {\n displayHour = selectedTime.hours > 12 ? selectedTime.hours - 12 : selectedTime.hours;\n }\n } else {\n displayHour = selectedTime.hours;\n }\n\n // Find the selected hour element\n const selectedHourElement = hourColumn.querySelector(`.time-picker__column-item:nth-child(${this.getHourIndex(displayHour, config.format) + 1})`) as HTMLElement;\n \n if (selectedHourElement) {\n selectedHourElement.scrollIntoView({\n behavior: this.scrollBehavior as ScrollBehavior,\n block: 'center',\n inline: 'nearest'\n });\n }\n }\n\n private scrollToSelectedMinute(selectedTime: TimeValue): void {\n const minuteColumn = this.shadowRoot?.querySelector('.time-picker__column:nth-child(2) .time-picker__column-list') as HTMLElement;\n \n if (!minuteColumn) return;\n\n // Find the selected minute element (minute + 1 because nth-child is 1-indexed)\n const selectedMinuteElement = minuteColumn.querySelector(`.time-picker__column-item:nth-child(${selectedTime.minutes + 1})`) as HTMLElement;\n \n if (selectedMinuteElement) {\n selectedMinuteElement.scrollIntoView({\n behavior: this.scrollBehavior as ScrollBehavior,\n block: 'center',\n inline: 'nearest'\n });\n }\n }\n\n private scrollToSelectedSecond(selectedTime: TimeValue): void {\n const secondColumn = this.shadowRoot?.querySelector('.time-picker__column:nth-child(3) .time-picker__column-list') as HTMLElement;\n \n if (!secondColumn) return;\n\n // Find the selected second element (second + 1 because nth-child is 1-indexed)\n const selectedSecondElement = secondColumn.querySelector(`.time-picker__column-item:nth-child(${selectedTime.seconds + 1})`) as HTMLElement;\n \n if (selectedSecondElement) {\n selectedSecondElement.scrollIntoView({\n behavior: this.scrollBehavior as ScrollBehavior,\n block: 'center',\n inline: 'nearest'\n });\n }\n }\n\n private getHourIndex(displayHour: number, format: TimeFormat): number {\n if (format === TimeFormat.TwelveHour) {\n // For 12-hour format: 12, 1, 2, ..., 11\n return displayHour === 12 ? 0 : displayHour;\n } else {\n // For 24-hour format: 0, 1, 2, ..., 23\n return displayHour;\n }\n }\n\n // Event handlers\n private handleComponentClick(e: Event): void {\n // Stop propagation to prevent document click handler from firing\n e.stopPropagation();\n }\n\n private handleDocumentClick(e: Event): void {\n // Close dropdown when clicking outside the component\n if (this.dropdownController.isOpen) {\n const target = e.target as Element;\n const isClickInsideComponent = this.contains(target) || \n this.shadowRoot?.contains(target);\n \n if (!isClickInsideComponent) {\n this.dropdownController.close();\n this.dispatchEvent(new CustomEvent(TIME_PICKER_EVENTS.BLUR, {\n bubbles: true,\n composed: true,\n }));\n }\n }\n }\n\n private handleDropdownClick(e: Event): void {\n // Prevent dropdown from closing when clicking inside\n e.stopPropagation();\n }\n\n private handleOkClick(): void {\n // Close the dropdown and emit final change event\n this.dropdownController.close();\n const selectedTime = this.selectionController.getSelectedTime();\n \n if (selectedTime) {\n this.dispatchEvent(new CustomEvent(TIME_PICKER_EVENTS.TIME_CHANGE, {\n bubbles: true,\n composed: true,\n detail: { value: this.value, time: selectedTime }\n }));\n }\n \n this.dispatchEvent(new CustomEvent(TIME_PICKER_EVENTS.BLUR, {\n bubbles: true,\n composed: true,\n }));\n }\n\n private handleInputBlur(): void {\n // Only close dropdown if clicking outside the component\n setTimeout(() => {\n const activeElement = document.activeElement;\n const isWithinComponent = this.contains(activeElement) || \n this.shadowRoot?.contains(activeElement);\n \n if (!isWithinComponent) {\n this.dispatchEvent(new CustomEvent(TIME_PICKER_EVENTS.BLUR, {\n bubbles: true,\n composed: true,\n }));\n }\n }, 150);\n }\n\n private handleInputClick(e: Event): void {\n e.preventDefault();\n e.stopPropagation();\n \n if (!this.disabled) {\n // Only open if closed - don't close when clicking input\n if (!this.dropdownController.isOpen) {\n this.dropdownController.open();\n // Scroll to selected items when dropdown opens\n setTimeout(() => {\n this.scrollToSelectedTime();\n }, 50);\n this.dispatchEvent(new CustomEvent(TIME_PICKER_EVENTS.FOCUS, {\n bubbles: true,\n composed: true,\n }));\n }\n }\n }\n\n private handleInputChange(e: CustomEvent): void {\n if (this.disabled) return;\n \n const inputValue = e.detail?.value || '';\n this.inputValue = inputValue;\n \n // Parse the input value and update the time selection\n const parsedTime = this.formattingController.parseInputValue(inputValue);\n if (parsedTime) {\n // Validate the parsed time\n if (this.validateTime(parsedTime)) {\n this.selectionController.selectTime(parsedTime);\n this.value = this.formattingController.formatForInput(parsedTime);\n this.state = TimePickerState.Default;\n \n // Scroll to the newly selected time if dropdown is open\n if (this.dropdownController.isOpen) {\n setTimeout(() => {\n this.scrollToSelectedTime();\n }, 10);\n }\n \n // Emit change event\n this.dispatchEvent(new CustomEvent(TIME_PICKER_EVENTS.TIME_CHANGE, {\n bubbles: true,\n composed: true,\n detail: { value: this.value, time: parsedTime }\n }));\n } else {\n // Invalid time - show error state but don't clear the input\n this.state = TimePickerState.Error;\n }\n } else if (inputValue === '') {\n // Empty input - clear the selection\n this.selectionController.clearSelection();\n this.value = '';\n this.state = TimePickerState.Default;\n \n this.dispatchEvent(new CustomEvent(TIME_PICKER_EVENTS.TIME_CHANGE, {\n bubbles: true,\n composed: true,\n detail: { value: '', time: null }\n }));\n } else {\n // Invalid format - show error state\n this.state = TimePickerState.Error;\n }\n \n // Request update to re-render with new state\n this.requestUpdate();\n }\n\n private handleHourSelect(hour: number, format: TimeFormat): void {\n const selectedTime = this.selectionController.getSelectedTime() || TimeUtils.getCurrentTime();\n let adjustedHour = hour;\n \n if (format === TimeFormat.TwelveHour) {\n const currentPeriod = this.formattingController.getPeriod(selectedTime.hours);\n if (hour === 12) {\n adjustedHour = currentPeriod === TimePeriod.AM ? 0 : 12;\n } else {\n adjustedHour = currentPeriod === TimePeriod.AM ? hour : hour + 12;\n }\n }\n \n const updatedTime = { ...selectedTime, hours: adjustedHour };\n if (this.validateTime(updatedTime)) {\n this.selectionController.selectTime(updatedTime);\n this.updateInputValue();\n // No scrolling when clicking on individual items\n }\n }\n\n private handleMinuteSelect(minute: number): void {\n const selectedTime = this.selectionController.getSelectedTime() || TimeUtils.getCurrentTime();\n const updatedTime = { ...selectedTime, minutes: minute };\n \n if (this.validateTime(updatedTime)) {\n this.selectionController.selectTime(updatedTime);\n this.updateInputValue();\n // No scrolling when clicking on individual items\n }\n }\n\n private handleSecondSelect(second: number): void {\n const selectedTime = this.selectionController.getSelectedTime() || TimeUtils.getCurrentTime();\n const updatedTime = { ...selectedTime, seconds: second };\n \n if (this.validateTime(updatedTime)) {\n this.selectionController.selectTime(updatedTime);\n this.updateInputValue();\n // No scrolling when clicking on individual items\n }\n }\n\n // Utility methods\n private shouldUpdateConstraints(changedProperties: Map<string, any>): boolean {\n return (\n changedProperties.has('minTime') ||\n changedProperties.has('maxTime') ||\n changedProperties.has('disabledTimes') ||\n changedProperties.has('enabledTimes')\n );\n }\n\n private updateConstraints(): void {\n const constraints: TimeConstraints = {\n minTime: this.minTime,\n maxTime: this.maxTime,\n disabledTimes: this.disabledTimes || [],\n enabledTimes: this.enabledTimes,\n };\n\n this.validationController.setConstraints(constraints);\n }\n\n private setTimeFromValue(value: string): void {\n if (this.selectionController.setTimeFromString(value)) {\n this.inputValue = value;\n this.requestUpdate();\n // Scroll to the time when setting from value (if dropdown is open)\n if (this.dropdownController.isOpen) {\n setTimeout(() => {\n this.scrollToSelectedTime();\n }, 50);\n }\n }\n }\n\n private updateInputValue(): void {\n const selectedTime = this.selectionController.getSelectedTime();\n if (selectedTime) {\n const formattedValue = this.formattingController.formatForDisplay(selectedTime);\n this.inputValue = formattedValue;\n this.value = formattedValue;\n \n this.dispatchEvent(new CustomEvent(TIME_PICKER_EVENTS.TIME_CHANGE, {\n detail: { value: formattedValue, time: selectedTime },\n bubbles: true,\n composed: true,\n }));\n }\n }\n\n getConfig(): TimePickerConfig {\n return {\n format: this.format,\n showSeconds: this.showSeconds,\n step: {\n hours: TimeStep.One,\n minutes: TimeStep.One,\n seconds: TimeStep.One,\n },\n use12HourClock: this.format === TimeFormat.TwelveHour,\n minuteInterval: 1,\n secondInterval: 1,\n };\n }\n\n // TimePickerHost interface implementation\n getCurrentTime(): TimeValue {\n return this.selectionController.getSelectedTime() || EMPTY_TIME_VALUE;\n }\n\n setTime(time: TimeValue): void {\n this.selectionController.selectTime(time);\n this.updateInputValue();\n // Scroll to the newly selected time if dropdown is open\n if (this.dropdownController.isOpen) {\n setTimeout(() => {\n this.scrollToSelectedTime();\n }, 10);\n }\n }\n\n formatTime(time: TimeValue): string {\n return this.formattingController.formatForDisplay(time);\n }\n\n /**\n * Get appropriate placeholder text based on format\n */\n private getFormatPlaceholder(): string {\n if (this.format === TimeFormat.TwelveHour) {\n return this.showSeconds ? 'HH:MM:SS AM/PM' : 'HH:MM AM/PM';\n } else {\n return this.showSeconds ? 'HH:MM:SS' : 'HH:MM';\n }\n }\n\n parseTime(timeString: string): TimeValue | null {\n return this.formattingController.parseInputValue(timeString);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nr-timepicker': NrTimePickerElement;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timepicker.constants.js","sourceRoot":"","sources":["../../../src/components/timepicker/timepicker.constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAE,UAAU,CAAC,cAAc;IACjC,WAAW,EAAE,KAAK;IAClB,cAAc,EAAE,CAAC;IACjB,cAAc,EAAE,CAAC;IACjB,cAAc,EAAE,KAAK;CACb,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,gCAAgC,GAAG,UAAU,CAAC;AAC3D,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAS,CAAC;AACjD,MAAM,CAAC,MAAM,oCAAoC,GAAG,YAAY,CAAC;AAEjE;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,6BAA6B,CAAC;AAEnE;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,gBAAgB,EAAE,sDAAsD;IACxE,WAAW,EAAE,mEAAmE;CACxE,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,EAAE;IACf,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,EAAE;IACf,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,EAAE;CACN,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,QAAQ,CAAC,GAAG;IACnB,OAAO,EAAE,QAAQ,CAAC,GAAG;IACrB,OAAO,EAAE,QAAQ,CAAC,GAAG;CACb,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,SAAS,EAAE,aAAa;IACxB,KAAK,EAAE,oBAAoB;IAC3B,KAAK,EAAE,oBAAoB;IAC3B,QAAQ,EAAE,uBAAuB;IACjC,IAAI,EAAE,mBAAmB;IACzB,MAAM,EAAE,qBAAqB;IAC7B,MAAM,EAAE,qBAAqB;IAC7B,MAAM,EAAE,qBAAqB;IAC7B,MAAM,EAAE,qBAAqB;IAC7B,SAAS,EAAE,wBAAwB;CAC3B,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,EAAE;IACV,gBAAgB,EAAE,EAAE;IACpB,kBAAkB,EAAE,EAAE;IACtB,kBAAkB,EAAE,EAAE;CACd,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { TimeFormat, TimeStep } from './timepicker.types.js';\n\n/**\n * Default time picker configuration\n */\nexport const DEFAULT_TIME_CONFIG = {\n format: TimeFormat.TwentyFourHour,\n showSeconds: false,\n minuteInterval: 1,\n secondInterval: 1,\n use12HourClock: false,\n} as const;\n\n/**\n * Default time display formats\n */\nexport const DEFAULT_TIME_FORMAT = 'HH:mm';\nexport const DEFAULT_TIME_FORMAT_WITH_SECONDS = 'HH:mm:ss';\nexport const DEFAULT_12H_TIME_FORMAT = 'hh:mm A';\nexport const DEFAULT_12H_TIME_FORMAT_WITH_SECONDS = 'hh:mm:ss A';\n\n/**\n * Time input field ID\n */\nexport const TIME_INPUT_FIELD_ID = 'time-input-field';\n\n/**\n * Clock container CSS class\n */\nexport const CLOCK_CONTAINER_CLASS = 'time-picker-clock-container';\n\n/**\n * Time validation patterns\n */\nexport const TIME_VALIDATION_PATTERNS = {\n TWENTY_FOUR_HOUR: /^([01]?[0-9]|2[0-3]):([0-5]?[0-9])(:([0-5]?[0-9]))?$/,\n TWELVE_HOUR: /^(0?[1-9]|1[0-2]):([0-5]?[0-9])(:([0-5]?[0-9]))?\\s?(AM|PM|am|pm)$/,\n} as const;\n\n/**\n * Time boundaries\n */\nexport const TIME_BOUNDARIES = {\n MIN_HOUR_24: 0,\n MAX_HOUR_24: 23,\n MIN_HOUR_12: 1,\n MAX_HOUR_12: 12,\n MIN_MINUTE: 0,\n MAX_MINUTE: 59,\n MIN_SECOND: 0,\n MAX_SECOND: 59,\n} as const;\n\n/**\n * Default step values\n */\nexport const DEFAULT_STEPS = {\n HOURS: TimeStep.One,\n MINUTES: TimeStep.One,\n SECONDS: TimeStep.One,\n} as const;\n\n/**\n * Time picker CSS classes\n */\nexport const TIME_PICKER_CLASSES = {\n CONTAINER: 'time-picker',\n INPUT: 'time-picker__input',\n CLOCK: 'time-picker__clock',\n DROPDOWN: 'time-picker__dropdown',\n HOUR: 'time-picker__hour',\n MINUTE: 'time-picker__minute',\n SECOND: 'time-picker__second',\n PERIOD: 'time-picker__period',\n BUTTON: 'time-picker__button',\n SEPARATOR: 'time-picker__separator',\n} as const;\n\n/**\n * Clock face constants\n */\nexport const CLOCK_FACE = {\n RADIUS: 100,\n CENTER: 50,\n HOUR_HAND_LENGTH: 30,\n MINUTE_HAND_LENGTH: 40,\n SECOND_HAND_LENGTH: 45,\n} as const;\n"]}
|
package/timepicker.style.js
CHANGED
|
@@ -4,84 +4,20 @@
|
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
6
|
import { css } from 'lit';
|
|
7
|
+
import { styleVariables } from './timepicker.style.variables.js';
|
|
7
8
|
export const styles = css `
|
|
9
|
+
${styleVariables}
|
|
8
10
|
:host {
|
|
9
|
-
/* Ant Design inspired color palette - matching select component */
|
|
10
|
-
--timepicker-font-family: var(--hybrid-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif);
|
|
11
|
-
--timepicker-font-size: var(--hybrid-font-size-medium, 14px);
|
|
12
|
-
--timepicker-line-height: var(--hybrid-line-height-medium, 1.5715);
|
|
13
|
-
|
|
14
|
-
/* Color system matching select component exactly */
|
|
15
|
-
--timepicker-background-color: var(--hybrid-background-color, #ffffff);
|
|
16
|
-
--timepicker-text-color: var(--hybrid-text-color, #262626);
|
|
17
|
-
--timepicker-text-color-secondary: var(--hybrid-text-color-secondary, #8c8c8c);
|
|
18
|
-
--timepicker-text-color-disabled: var(--hybrid-text-color-disabled, #8c8c8c);
|
|
19
|
-
--timepicker-border-color: var(--hybrid-border-color, #d9d9d9);
|
|
20
|
-
--timepicker-border-color-hover: var(--hybrid-border-color-hover, #1677ff);
|
|
21
|
-
--timepicker-focus-color: var(--hybrid-focus-color, #1677ff);
|
|
22
|
-
--timepicker-error-color: var(--hybrid-error-color, #ff4d4f);
|
|
23
|
-
--timepicker-warning-color: var(--hybrid-warning-color, #faad14);
|
|
24
|
-
--timepicker-success-color: var(--hybrid-success-color, #52c41a);
|
|
25
|
-
--timepicker-disabled-bg: var(--hybrid-disabled-bg, #f5f5f5);
|
|
26
|
-
|
|
27
|
-
/* Select component matching colors */
|
|
28
|
-
--timepicker-primary-color: #1677ff;
|
|
29
|
-
--timepicker-primary-color-hover: #1677ff;
|
|
30
|
-
--timepicker-primary-color-active: #1677ff;
|
|
31
|
-
--timepicker-control-item-bg-hover: #f5f5f5;
|
|
32
|
-
--timepicker-control-item-bg-active: #e6f7ff;
|
|
33
|
-
|
|
34
|
-
/* Sizes following Ant Design */
|
|
35
|
-
--timepicker-border-radius: var(--hybrid-border-radius, 6px);
|
|
36
|
-
--timepicker-padding: var(--hybrid-padding-medium, 4px 11px);
|
|
37
|
-
--timepicker-height: var(--hybrid-input-height, 32px);
|
|
38
|
-
--timepicker-font-weight: 400;
|
|
39
|
-
|
|
40
|
-
/* Clock specific - Ant Design inspired */
|
|
41
|
-
--timepicker-clock-size: 224px;
|
|
42
|
-
--timepicker-clock-background: var(--hybrid-background-color, #ffffff);
|
|
43
|
-
--timepicker-clock-border: var(--hybrid-border-color, #f0f0f0);
|
|
44
|
-
--timepicker-clock-face-color: var(--hybrid-text-color-muted, rgba(0, 0, 0, 0.65));
|
|
45
|
-
--timepicker-clock-hand-color: var(--timepicker-primary-color);
|
|
46
|
-
--timepicker-clock-number-color: var(--hybrid-text-color, rgba(0, 0, 0, 0.88));
|
|
47
|
-
|
|
48
|
-
/* Shadows */
|
|
49
|
-
--timepicker-box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
|
|
50
|
-
--timepicker-box-shadow-secondary: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
51
|
-
|
|
52
11
|
display: block;
|
|
53
|
-
font-family: var(--timepicker-font-family);
|
|
54
|
-
font-size: var(--timepicker-font-size);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
--timepicker-background-color: #ffffff;
|
|
63
|
-
--timepicker-text-color: #262626;
|
|
64
|
-
--timepicker-text-color-secondary: #8c8c8c;
|
|
65
|
-
--timepicker-border-color: #d9d9d9;
|
|
66
|
-
--timepicker-border-color-hover: #1677ff;
|
|
67
|
-
--timepicker-focus-color: #1677ff;
|
|
68
|
-
--timepicker-primary-color: #1677ff;
|
|
69
|
-
--timepicker-control-item-bg-hover: #f5f5f5;
|
|
70
|
-
--timepicker-control-item-bg-active: #e6f7ff;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/* Dark theme styles using data-theme attribute */
|
|
74
|
-
.time-picker[data-theme="dark"] {
|
|
75
|
-
/* Override colors for dark theme */
|
|
76
|
-
--timepicker-background-color: #262626;
|
|
77
|
-
--timepicker-text-color: #ffffff;
|
|
78
|
-
--timepicker-text-color-secondary: #8c8c8c;
|
|
79
|
-
--timepicker-border-color: #424242;
|
|
80
|
-
--timepicker-border-color-hover: #4096ff;
|
|
81
|
-
--timepicker-focus-color: #4096ff;
|
|
82
|
-
--timepicker-primary-color: #4096ff;
|
|
83
|
-
--timepicker-control-item-bg-hover: #393939;
|
|
84
|
-
--timepicker-control-item-bg-active: #1e3a5f;
|
|
12
|
+
font-family: var(--nuraly-timepicker-local-font-family);
|
|
13
|
+
font-size: var(--nuraly-timepicker-local-font-size);
|
|
14
|
+
font-weight: var(--nuraly-timepicker-local-font-weight);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* Host attribute selectors for configuration */
|
|
18
|
+
:host([disabled]) {
|
|
19
|
+
opacity: var(--nuraly-timepicker-local-disabled-opacity);
|
|
20
|
+
pointer-events: none;
|
|
85
21
|
}
|
|
86
22
|
|
|
87
23
|
.time-picker {
|
|
@@ -92,21 +28,21 @@ export const styles = css `
|
|
|
92
28
|
|
|
93
29
|
/* Input wrapper hover and focus states matching select component */
|
|
94
30
|
.time-picker__input-wrapper:hover:not(.time-picker--disabled) nr-input {
|
|
95
|
-
--
|
|
31
|
+
--nuraly-input-border-color: var(--nuraly-timepicker-local-border-color-hover);
|
|
96
32
|
}
|
|
97
33
|
|
|
98
34
|
.time-picker__input-wrapper:focus-within nr-input,
|
|
99
35
|
.time-picker--open .time-picker__input-wrapper nr-input,
|
|
100
36
|
.time-picker__input-wrapper nr-input:focus {
|
|
101
|
-
--
|
|
102
|
-
--
|
|
37
|
+
--nuraly-input-border-color: var(--nuraly-timepicker-local-focus-color);
|
|
38
|
+
--nuraly-input-box-shadow: 0 0 0 2px var(--nuraly-timepicker-local-focus-color)33;
|
|
103
39
|
}
|
|
104
40
|
|
|
105
41
|
/* Disabled state styling */
|
|
106
42
|
.time-picker--disabled .time-picker__input-wrapper nr-input {
|
|
107
|
-
--
|
|
108
|
-
--
|
|
109
|
-
--
|
|
43
|
+
--nuraly-input-background-color: var(--nuraly-timepicker-local-disabled-bg);
|
|
44
|
+
--nuraly-input-border-color: var(--nuraly-timepicker-local-border-color);
|
|
45
|
+
--nuraly-input-text-color: var(--nuraly-timepicker-local-text-color-disabled);
|
|
110
46
|
cursor: not-allowed;
|
|
111
47
|
opacity: 0.6;
|
|
112
48
|
}
|
|
@@ -127,26 +63,26 @@ export const styles = css `
|
|
|
127
63
|
min-width: auto !important;
|
|
128
64
|
width: 24px !important;
|
|
129
65
|
height: 24px !important;
|
|
130
|
-
border-radius:
|
|
66
|
+
border-radius: var(--nuraly-timepicker-local-border-radius-sm) !important;
|
|
131
67
|
}
|
|
132
68
|
|
|
133
69
|
.time-picker__trigger svg {
|
|
134
70
|
width: 16px;
|
|
135
71
|
height: 16px;
|
|
136
|
-
color: var(--timepicker-text-color-secondary);
|
|
72
|
+
color: var(--nuraly-timepicker-local-text-color-secondary);
|
|
137
73
|
transition: color 0.2s ease;
|
|
138
74
|
}
|
|
139
75
|
|
|
140
76
|
.time-picker__trigger:hover svg {
|
|
141
|
-
color: var(--timepicker-primary-color);
|
|
77
|
+
color: var(--nuraly-timepicker-local-primary-color);
|
|
142
78
|
}
|
|
143
79
|
|
|
144
80
|
.time-picker__trigger:hover {
|
|
145
|
-
color: var(--timepicker-primary-color);
|
|
81
|
+
color: var(--nuraly-timepicker-local-primary-color);
|
|
146
82
|
}
|
|
147
83
|
|
|
148
84
|
.time-picker__trigger:disabled {
|
|
149
|
-
color: var(--timepicker-text-color-disabled);
|
|
85
|
+
color: var(--nuraly-timepicker-local-text-color-disabled);
|
|
150
86
|
cursor: not-allowed;
|
|
151
87
|
}
|
|
152
88
|
|
|
@@ -158,15 +94,12 @@ export const styles = css `
|
|
|
158
94
|
.time-picker__dropdown {
|
|
159
95
|
position: absolute;
|
|
160
96
|
z-index: 1000;
|
|
161
|
-
background-color: var(--timepicker-background-color);
|
|
97
|
+
background-color: var(--nuraly-timepicker-local-background-color);
|
|
162
98
|
backdrop-filter: blur(12px);
|
|
163
99
|
-webkit-backdrop-filter: blur(12px);
|
|
164
|
-
border: 1px solid var(--timepicker-border-color);
|
|
165
|
-
border-radius:
|
|
166
|
-
box-shadow:
|
|
167
|
-
0 6px 16px 0 rgba(0, 0, 0, 0.08),
|
|
168
|
-
0 3px 6px -4px rgba(0, 0, 0, 0.12),
|
|
169
|
-
0 9px 28px 8px rgba(0, 0, 0, 0.05);
|
|
100
|
+
border: 1px solid var(--nuraly-timepicker-local-border-color);
|
|
101
|
+
border-radius: var(--nuraly-timepicker-local-border-radius);
|
|
102
|
+
box-shadow: var(--nuraly-timepicker-local-box-shadow);
|
|
170
103
|
width: 100%;
|
|
171
104
|
min-width: 180px;
|
|
172
105
|
/* Animation and positioning - simplified to match select */
|
|
@@ -215,8 +148,8 @@ export const styles = css `
|
|
|
215
148
|
display: flex;
|
|
216
149
|
max-height: 216px;
|
|
217
150
|
overflow: hidden;
|
|
218
|
-
border-radius:
|
|
219
|
-
background: var(--timepicker-background-color);
|
|
151
|
+
border-radius: var(--nuraly-timepicker-local-border-radius);
|
|
152
|
+
background: var(--nuraly-timepicker-local-background-color);
|
|
220
153
|
padding: 4px 0;
|
|
221
154
|
}
|
|
222
155
|
|
|
@@ -255,12 +188,12 @@ export const styles = css `
|
|
|
255
188
|
.time-picker__column-list::-webkit-scrollbar-track {
|
|
256
189
|
background: rgba(0, 0, 0, 0.04);
|
|
257
190
|
margin: 8px 0;
|
|
258
|
-
border-radius:
|
|
191
|
+
border-radius: var(--nuraly-timepicker-local-border-radius-sm);
|
|
259
192
|
}
|
|
260
193
|
|
|
261
194
|
.time-picker__column-list::-webkit-scrollbar-thumb {
|
|
262
195
|
background-color: rgba(0, 0, 0, 0.2);
|
|
263
|
-
border-radius:
|
|
196
|
+
border-radius: var(--nuraly-timepicker-local-border-radius-sm);
|
|
264
197
|
transition: background-color 0.2s ease;
|
|
265
198
|
/* Ensure thumb is always visible */
|
|
266
199
|
min-height: 20px;
|
|
@@ -281,47 +214,47 @@ export const styles = css `
|
|
|
281
214
|
align-items: center;
|
|
282
215
|
justify-content: center;
|
|
283
216
|
padding: 4px 8px;
|
|
284
|
-
color: var(--timepicker-text-color);
|
|
285
|
-
font-size:
|
|
286
|
-
font-weight:
|
|
217
|
+
color: var(--nuraly-timepicker-local-text-color);
|
|
218
|
+
font-size: var(--nuraly-timepicker-local-font-size);
|
|
219
|
+
font-weight: var(--nuraly-timepicker-local-font-weight);
|
|
287
220
|
cursor: pointer;
|
|
288
221
|
transition: all 0.2s ease-in-out;
|
|
289
|
-
border-radius:
|
|
222
|
+
border-radius: var(--nuraly-timepicker-local-border-radius);
|
|
290
223
|
position: relative;
|
|
291
224
|
user-select: none;
|
|
292
|
-
line-height:
|
|
225
|
+
line-height: var(--nuraly-timepicker-local-line-height);
|
|
293
226
|
min-height: 28px;
|
|
294
227
|
margin: 1px 2px;
|
|
295
228
|
}
|
|
296
229
|
|
|
297
230
|
.time-picker__column-item:hover {
|
|
298
|
-
background-color: var(--timepicker-control-item-bg-hover);
|
|
299
|
-
color: var(--timepicker-primary-color);
|
|
231
|
+
background-color: var(--nuraly-timepicker-local-control-item-bg-hover);
|
|
232
|
+
color: var(--nuraly-timepicker-local-primary-color);
|
|
300
233
|
}
|
|
301
234
|
|
|
302
235
|
.time-picker__column-item:active {
|
|
303
|
-
background-color: var(--timepicker-control-item-bg-active);
|
|
304
|
-
color: var(--timepicker-primary-color);
|
|
236
|
+
background-color: var(--nuraly-timepicker-local-control-item-bg-active);
|
|
237
|
+
color: var(--nuraly-timepicker-local-primary-color);
|
|
305
238
|
}
|
|
306
239
|
|
|
307
240
|
.time-picker__column-item--selected {
|
|
308
|
-
background-color:
|
|
309
|
-
color:
|
|
241
|
+
background-color: var(--nuraly-timepicker-local-control-item-bg-active);
|
|
242
|
+
color: var(--nuraly-timepicker-local-primary-color);
|
|
310
243
|
font-weight: 600;
|
|
311
|
-
border-radius:
|
|
244
|
+
border-radius: var(--nuraly-timepicker-local-border-radius);
|
|
312
245
|
}
|
|
313
246
|
|
|
314
247
|
.time-picker__column-item--selected:hover {
|
|
315
|
-
background-color:
|
|
316
|
-
color:
|
|
248
|
+
background-color: var(--nuraly-timepicker-local-control-item-bg-active);
|
|
249
|
+
color: var(--nuraly-timepicker-local-primary-color);
|
|
317
250
|
}
|
|
318
251
|
|
|
319
252
|
.time-picker__column-item--focused {
|
|
320
|
-
background-color: var(--timepicker-control-item-bg-hover);
|
|
321
|
-
outline: 2px solid var(--timepicker-focus-color);
|
|
253
|
+
background-color: var(--nuraly-timepicker-local-control-item-bg-hover);
|
|
254
|
+
outline: 2px solid var(--nuraly-timepicker-local-focus-color);
|
|
322
255
|
outline-offset: -2px;
|
|
323
|
-
border-radius:
|
|
324
|
-
color: var(--timepicker-primary-color);
|
|
256
|
+
border-radius: var(--nuraly-timepicker-local-border-radius);
|
|
257
|
+
color: var(--nuraly-timepicker-local-primary-color);
|
|
325
258
|
}
|
|
326
259
|
|
|
327
260
|
.time-picker__column-item--disabled {
|
|
@@ -531,7 +464,7 @@ export const styles = css `
|
|
|
531
464
|
|
|
532
465
|
/* Style nr-button components in actions */
|
|
533
466
|
.time-picker__actions nr-button {
|
|
534
|
-
border-radius:
|
|
467
|
+
border-radius: var(--nuraly-timepicker-local-border-radius);
|
|
535
468
|
font-weight: 400;
|
|
536
469
|
font-size: 14px;
|
|
537
470
|
height: 28px;
|
|
@@ -595,17 +528,6 @@ export const styles = css `
|
|
|
595
528
|
opacity: 0.6;
|
|
596
529
|
}
|
|
597
530
|
|
|
598
|
-
/* Dark theme */
|
|
599
|
-
:host([data-theme="dark"]) {
|
|
600
|
-
--timepicker-background-color: var(--hybrid-dark-background-color, #1f2937);
|
|
601
|
-
--timepicker-text-color: var(--hybrid-dark-text-color, #f9fafb);
|
|
602
|
-
--timepicker-border-color: var(--hybrid-dark-border-color, #374151);
|
|
603
|
-
--timepicker-clock-background: var(--hybrid-dark-background-color, #1f2937);
|
|
604
|
-
--timepicker-clock-border: var(--hybrid-dark-border-color, #4b5563);
|
|
605
|
-
--timepicker-clock-face-color: var(--hybrid-dark-text-color-muted, #9ca3af);
|
|
606
|
-
--timepicker-clock-number-color: var(--hybrid-dark-text-color, #f9fafb);
|
|
607
|
-
}
|
|
608
|
-
|
|
609
531
|
/* Animation classes */
|
|
610
532
|
.time-picker__dropdown {
|
|
611
533
|
opacity: 0;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timepicker.style.js","sourceRoot":"","sources":["../../../src/components/timepicker/timepicker.style.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;IACrB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8iBjB,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { css } from 'lit';\nimport { styleVariables } from './timepicker.style.variables.js';\n\nexport const styles = css`\n ${styleVariables}\n :host {\n display: block;\n font-family: var(--nuraly-timepicker-local-font-family);\n font-size: var(--nuraly-timepicker-local-font-size);\n font-weight: var(--nuraly-timepicker-local-font-weight);\n }\n\n /* Host attribute selectors for configuration */\n :host([disabled]) {\n opacity: var(--nuraly-timepicker-local-disabled-opacity);\n pointer-events: none;\n }\n\n .time-picker {\n position: relative;\n display: inline-block;\n width: 100%;\n }\n\n /* Input wrapper hover and focus states matching select component */\n .time-picker__input-wrapper:hover:not(.time-picker--disabled) nr-input {\n --nuraly-input-border-color: var(--nuraly-timepicker-local-border-color-hover);\n }\n\n .time-picker__input-wrapper:focus-within nr-input,\n .time-picker--open .time-picker__input-wrapper nr-input,\n .time-picker__input-wrapper nr-input:focus {\n --nuraly-input-border-color: var(--nuraly-timepicker-local-focus-color);\n --nuraly-input-box-shadow: 0 0 0 2px var(--nuraly-timepicker-local-focus-color)33;\n }\n\n /* Disabled state styling */\n .time-picker--disabled .time-picker__input-wrapper nr-input {\n --nuraly-input-background-color: var(--nuraly-timepicker-local-disabled-bg);\n --nuraly-input-border-color: var(--nuraly-timepicker-local-border-color);\n --nuraly-input-text-color: var(--nuraly-timepicker-local-text-color-disabled);\n cursor: not-allowed;\n opacity: 0.6;\n }\n\n .time-picker__input-wrapper {\n position: relative;\n width: 100%;\n }\n\n /* Style the nr-input component */\n .time-picker__input-wrapper nr-input {\n width: 100%;\n }\n\n /* Style the trigger button inside nr-input */\n .time-picker__trigger {\n padding: 4px !important;\n min-width: auto !important;\n width: 24px !important;\n height: 24px !important;\n border-radius: var(--nuraly-timepicker-local-border-radius-sm) !important;\n }\n\n .time-picker__trigger svg {\n width: 16px;\n height: 16px;\n color: var(--nuraly-timepicker-local-text-color-secondary);\n transition: color 0.2s ease;\n }\n\n .time-picker__trigger:hover svg {\n color: var(--nuraly-timepicker-local-primary-color);\n }\n\n .time-picker__trigger:hover {\n color: var(--nuraly-timepicker-local-primary-color);\n }\n\n .time-picker__trigger:disabled {\n color: var(--nuraly-timepicker-local-text-color-disabled);\n cursor: not-allowed;\n }\n\n .time-picker__trigger svg {\n width: 14px;\n height: 14px;\n }\n\n .time-picker__dropdown {\n position: absolute;\n z-index: 1000;\n background-color: var(--nuraly-timepicker-local-background-color);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n border: 1px solid var(--nuraly-timepicker-local-border-color);\n border-radius: var(--nuraly-timepicker-local-border-radius);\n box-shadow: var(--nuraly-timepicker-local-box-shadow);\n width: 100%;\n min-width: 180px;\n /* Animation and positioning - simplified to match select */\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n transition: all 0.2s ease-in-out;\n /* Create new stacking context to prevent layering issues */\n isolation: isolate;\n /* Ensure solid background to prevent visual bleed-through */\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n /* Force above other elements */\n transform: translateZ(0);\n animation: dropdown-enter 0.15s ease-out;\n overflow: hidden;\n }\n\n .time-picker__dropdown.placement-top {\n animation: dropdown-enter-top 0.15s ease-out;\n }\n\n @keyframes dropdown-enter {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n @keyframes dropdown-enter-top {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .time-picker__columns {\n display: flex;\n max-height: 216px;\n overflow: hidden;\n border-radius: var(--nuraly-timepicker-local-border-radius);\n background: var(--nuraly-timepicker-local-background-color);\n padding: 4px 0;\n }\n\n .time-picker__column {\n flex: 1;\n border-right: 1px solid rgba(0, 0, 0, 0.06);\n background: transparent;\n overflow: hidden;\n position: relative;\n min-width: 60px;\n }\n\n .time-picker__column:last-child {\n border-right: none;\n }\n\n .time-picker__column-list {\n max-height: 216px;\n overflow-y: scroll;\n overflow-x: hidden;\n scrollbar-width: thin;\n scrollbar-color: rgba(0, 0, 0, 0.06) transparent;\n /* Custom scrollbar styling to match modern design */\n padding: 4px 2px;\n scroll-behavior: smooth;\n /* Force scrollbar to always be visible */\n -webkit-overflow-scrolling: touch;\n }\n\n .time-picker__column-list::-webkit-scrollbar {\n width: 6px;\n /* Always show scrollbar */\n -webkit-appearance: none;\n }\n\n .time-picker__column-list::-webkit-scrollbar-track {\n background: rgba(0, 0, 0, 0.04);\n margin: 8px 0;\n border-radius: var(--nuraly-timepicker-local-border-radius-sm);\n }\n\n .time-picker__column-list::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.2);\n border-radius: var(--nuraly-timepicker-local-border-radius-sm);\n transition: background-color 0.2s ease;\n /* Ensure thumb is always visible */\n min-height: 20px;\n }\n\n .time-picker__column-list::-webkit-scrollbar-thumb:hover {\n background-color: rgba(0, 0, 0, 0.3);\n }\n\n .time-picker__column-list {\n scrollbar-width: thin;\n scrollbar-color: rgba(0, 0, 0, 0.2) rgba(0, 0, 0, 0.04);\n scroll-behavior: smooth;\n }\n\n .time-picker__column-item {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px 8px;\n color: var(--nuraly-timepicker-local-text-color);\n font-size: var(--nuraly-timepicker-local-font-size);\n font-weight: var(--nuraly-timepicker-local-font-weight);\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n border-radius: var(--nuraly-timepicker-local-border-radius);\n position: relative;\n user-select: none;\n line-height: var(--nuraly-timepicker-local-line-height);\n min-height: 28px;\n margin: 1px 2px;\n }\n\n .time-picker__column-item:hover {\n background-color: var(--nuraly-timepicker-local-control-item-bg-hover);\n color: var(--nuraly-timepicker-local-primary-color);\n }\n\n .time-picker__column-item:active {\n background-color: var(--nuraly-timepicker-local-control-item-bg-active);\n color: var(--nuraly-timepicker-local-primary-color);\n }\n\n .time-picker__column-item--selected {\n background-color: var(--nuraly-timepicker-local-control-item-bg-active);\n color: var(--nuraly-timepicker-local-primary-color);\n font-weight: 600;\n border-radius: var(--nuraly-timepicker-local-border-radius);\n }\n\n .time-picker__column-item--selected:hover {\n background-color: var(--nuraly-timepicker-local-control-item-bg-active);\n color: var(--nuraly-timepicker-local-primary-color);\n }\n\n .time-picker__column-item--focused {\n background-color: var(--nuraly-timepicker-local-control-item-bg-hover);\n outline: 2px solid var(--nuraly-timepicker-local-focus-color);\n outline-offset: -2px;\n border-radius: var(--nuraly-timepicker-local-border-radius);\n color: var(--nuraly-timepicker-local-primary-color);\n }\n\n .time-picker__column-item--disabled {\n opacity: 0.4;\n cursor: not-allowed;\n color: var(--timepicker-text-color-disabled);\n }\n\n .time-picker__column-item--disabled:hover {\n background-color: transparent;\n color: var(--timepicker-text-color-disabled);\n }\n\n .time-picker__dropdown--top {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 4px;\n }\n\n .time-picker__clock-container {\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n background: var(--timepicker-background-color);\n }\n\n .time-picker__digital-inputs {\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--timepicker-border-color);\n }\n\n .time-picker__time-input {\n width: 56px;\n height: 32px;\n text-align: center;\n padding: 4px 8px;\n border: 1px solid var(--timepicker-border-color);\n border-radius: var(--timepicker-border-radius);\n font-size: 14px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n color: var(--timepicker-text-color);\n background-color: var(--timepicker-background-color);\n transition: all 0.3s;\n outline: none;\n }\n\n .time-picker__time-input:hover {\n border-color: var(--timepicker-primary-color-hover);\n }\n\n .time-picker__time-input:focus {\n border-color: var(--timepicker-primary-color);\n box-shadow: 0 0 0 2px var(--timepicker-primary-color-active);\n }\n\n .time-picker__separator {\n font-weight: 600;\n color: var(--timepicker-text-color);\n }\n\n .time-picker__period-toggle {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--timepicker-border-color);\n border-radius: var(--timepicker-border-radius);\n overflow: hidden;\n margin-left: 8px;\n }\n\n .time-picker__period-button {\n background: var(--timepicker-background-color);\n border: none;\n padding: 6px 12px;\n font-size: 12px;\n color: var(--timepicker-text-color);\n cursor: pointer;\n transition: all 0.3s;\n min-width: 44px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .time-picker__period-button:hover {\n background-color: var(--timepicker-item-hover-bg);\n color: var(--timepicker-text-color);\n }\n\n .time-picker__period-button--active {\n background-color: var(--timepicker-primary-color);\n color: #fff;\n }\n\n .time-picker__period-button + .time-picker__period-button {\n border-top: 1px solid var(--timepicker-border-color);\n }\n\n .time-picker__clock {\n width: var(--timepicker-clock-size);\n height: var(--timepicker-clock-size);\n border: 1px solid var(--timepicker-border-color);\n border-radius: 50%;\n background-color: var(--timepicker-background-color);\n position: relative;\n margin: 0 auto;\n user-select: none;\n }\n\n .time-picker__clock-face {\n width: 100%;\n height: 100%;\n position: relative;\n }\n\n .time-picker__clock-number {\n position: absolute;\n color: var(--timepicker-text-color);\n font-size: 14px;\n font-weight: 400;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n border-radius: 50%;\n transition: all 0.3s;\n transform: translate(-50%, -50%);\n }\n\n .time-picker__clock-number:hover {\n background-color: var(--timepicker-item-hover-bg);\n color: var(--timepicker-text-color);\n }\n\n .time-picker__clock-number--selected {\n background-color: var(--timepicker-primary-color);\n color: #fff;\n }\n\n .time-picker__clock-hand {\n position: absolute;\n background-color: var(--timepicker-primary-color);\n transform-origin: bottom center;\n border-radius: 2px 2px 0 0;\n }\n\n .time-picker__clock-center {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 6px;\n height: 6px;\n background-color: var(--timepicker-primary-color);\n border-radius: 50%;\n z-index: 10;\n }\n\n .time-picker__mode-buttons {\n display: flex;\n gap: 8px;\n justify-content: center;\n margin-bottom: 8px;\n }\n\n .time-picker__mode-button {\n padding: 6px 16px;\n border: 1px solid var(--timepicker-border-color);\n background: var(--timepicker-background-color);\n color: var(--timepicker-text-color);\n border-radius: var(--timepicker-border-radius);\n cursor: pointer;\n font-size: 14px;\n transition: all 0.3s;\n outline: none;\n }\n\n .time-picker__mode-button:hover {\n background-color: var(--timepicker-item-hover-bg);\n border-color: var(--timepicker-primary-color-hover);\n }\n\n .time-picker__mode-button--active {\n background-color: var(--timepicker-primary-color);\n color: #fff;\n border-color: var(--timepicker-primary-color);\n }\n\n .time-picker__actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n padding: 8px 12px;\n border-top: 1px solid rgba(0, 0, 0, 0.06);\n background: var(--timepicker-background-color);\n border-bottom-left-radius: 8px;\n border-bottom-right-radius: 8px;\n }\n\n /* Style nr-button components in actions */\n .time-picker__actions nr-button {\n border-radius: var(--nuraly-timepicker-local-border-radius);\n font-weight: 400;\n font-size: 14px;\n height: 28px;\n }\n\n \n\n .time-picker__label {\n display: block;\n margin-bottom: 8px;\n font-weight: 400;\n color: var(--timepicker-text-color);\n font-size: 14px;\n }\n\n .time-picker__helper-text {\n font-size: 14px;\n margin-top: 4px;\n color: var(--timepicker-text-color-secondary);\n }\n\n .time-picker__helper-text--error {\n color: var(--timepicker-error-color);\n }\n\n /* Size variants */\n :host([size=\"small\"]) {\n --timepicker-height: 32px;\n --timepicker-font-size: 12px;\n --timepicker-padding: 4px 8px;\n --timepicker-clock-size: 240px;\n }\n\n :host([size=\"large\"]) {\n --timepicker-height: 48px;\n --timepicker-font-size: 16px;\n --timepicker-padding: 12px 16px;\n --timepicker-clock-size: 320px;\n }\n\n /* Variant styles */\n :host([variant=\"outlined\"]) .time-picker__input {\n background-color: transparent;\n }\n\n :host([variant=\"filled\"]) .time-picker__input {\n border: none;\n background-color: var(--timepicker-border-color)33;\n border-bottom: 2px solid var(--timepicker-border-color);\n border-radius: var(--timepicker-border-radius) var(--timepicker-border-radius) 0 0;\n }\n\n :host([variant=\"filled\"]) .time-picker__input:focus {\n border-bottom-color: var(--timepicker-focus-color);\n box-shadow: none;\n }\n\n /* Disabled state */\n :host([disabled]) .time-picker {\n pointer-events: none;\n opacity: 0.6;\n }\n\n /* Animation classes */\n .time-picker__dropdown {\n opacity: 0;\n transform: translateY(-8px);\n transition: opacity 0.2s, transform 0.2s;\n }\n\n .time-picker__dropdown--open {\n opacity: 1;\n transform: translateY(0);\n }\n\n /* Hide scrollbars on time inputs */\n .time-picker__time-input::-webkit-outer-spin-button,\n .time-picker__time-input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n\n .time-picker__time-input[type=\"number\"] {\n -moz-appearance: textfield;\n }\n\n /* Responsive adjustments */\n @media (max-width: 480px) {\n .time-picker__clock {\n --timepicker-clock-size: 240px;\n }\n \n .time-picker__dropdown {\n left: 50%;\n transform: translateX(-50%);\n width: 90vw;\n max-width: 320px;\n }\n }\n`;\n"]}
|