@nar-bus/ui-kit 1.16.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/hooks/useAnchoredPanel.d.ts +5 -1
  2. package/dist/hooks/useAnchoredPanel.d.ts.map +1 -1
  3. package/dist/i18n/en.json.d.ts +28 -3
  4. package/dist/i18n/resources.d.ts +50 -0
  5. package/dist/i18n/resources.d.ts.map +1 -1
  6. package/dist/i18n/resources.js +1 -1
  7. package/dist/i18n/tr.json.d.ts +28 -3
  8. package/dist/index.d.ts +2 -2
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +3590 -3012
  11. package/dist/molecules/ConfirmDialog.d.ts.map +1 -1
  12. package/dist/molecules/DatePicker.d.ts +31 -1
  13. package/dist/molecules/DatePicker.d.ts.map +1 -1
  14. package/dist/molecules/DateRangePicker.d.ts +80 -2
  15. package/dist/molecules/DateRangePicker.d.ts.map +1 -1
  16. package/dist/molecules/DateTimeInput.d.ts.map +1 -1
  17. package/dist/molecules/index.d.ts +2 -2
  18. package/dist/molecules/index.d.ts.map +1 -1
  19. package/dist/organisms/Dialog.d.ts.map +1 -1
  20. package/dist/organisms/FilterPanel.d.ts +19 -3
  21. package/dist/organisms/FilterPanel.d.ts.map +1 -1
  22. package/dist/organisms/Sheet.d.ts +44 -3
  23. package/dist/organisms/Sheet.d.ts.map +1 -1
  24. package/dist/organisms/index.d.ts +1 -1
  25. package/dist/organisms/index.d.ts.map +1 -1
  26. package/dist/resources-fbNhK5VU.js +54 -0
  27. package/dist/utils/anchoredPanelPosition.d.ts +22 -0
  28. package/dist/utils/anchoredPanelPosition.d.ts.map +1 -1
  29. package/dist/utils/dateTime.d.ts +66 -0
  30. package/dist/utils/dateTime.d.ts.map +1 -0
  31. package/dist/utils/overlayStack.d.ts +41 -0
  32. package/dist/utils/overlayStack.d.ts.map +1 -0
  33. package/package.json +1 -1
  34. package/dist/resources-ft4nSl4f.js +0 -52
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../src/molecules/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAOtE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAmB,EACnB,OAAe,GAChB,EAAE,kBAAkB,sCAwFpB"}
1
+ {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../src/molecules/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AASjE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAmB,EACnB,OAAe,GAChB,EAAE,kBAAkB,sCAwIpB"}
@@ -1,12 +1,42 @@
1
+ import { ReactNode } from 'react';
2
+ export interface DatePickerPreset {
3
+ /** Button content. ReactNode so a caller can pass a badge/formatted fragment. */
4
+ label: ReactNode;
5
+ /** Fired on click/Enter. The caller applies its own state (single date OR a range). */
6
+ onSelect: () => void;
7
+ }
1
8
  export interface DatePickerProps {
2
9
  value?: Date | null;
3
10
  onChange?: (date: Date | null) => void;
4
11
  placeholder?: string;
12
+ /** Earliest selectable DAY — compared on day boundaries, so a time-of-day component never half-disables its own date. */
5
13
  min?: Date;
14
+ /** Latest selectable DAY — see `min`. */
6
15
  max?: Date;
7
16
  disabled?: boolean;
8
17
  error?: string;
9
18
  className?: string;
19
+ /** Shortcut buttons rendered as a left column inside the calendar popover. */
20
+ presets?: DatePickerPreset[];
21
+ /**
22
+ * Opens hour:minute selection — renders a time row INSIDE the calendar popover,
23
+ * under the day grid. The trigger field's own width and layout are unchanged, so
24
+ * a narrow filter rail is unaffected. @default false
25
+ *
26
+ * Off (the default) the emitted value is the raw day `Date` exactly as before.
27
+ * On, picking a day PRESERVES the currently selected time (00:00 when there is
28
+ * no value yet), seconds are always zeroed, and the result is clamped into
29
+ * `[min, max]` — the same semantics `DateTimeInput` already has, so the two
30
+ * layouts of the same idea cannot disagree. (NB-DATETIME-01)
31
+ */
32
+ showTime?: boolean;
33
+ /** `<input type="time">` step while `showTime` is on, in MINUTES. @default 1 */
34
+ minuteStep?: number;
35
+ /** ARIA forwarding — injected by FormField via cloneElement (mirrors Select) */
36
+ "aria-invalid"?: boolean | "true" | "false";
37
+ "aria-describedby"?: string;
38
+ "aria-required"?: boolean | "true" | "false";
39
+ id?: string;
10
40
  }
11
- export declare function DatePicker({ value, onChange, placeholder, min, max, disabled, error, className, }: DatePickerProps): import("react").JSX.Element;
41
+ export declare function DatePicker({ value, onChange, placeholder, min, max, disabled, error, className, presets, showTime, minuteStep, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedBy, "aria-required": ariaRequired, id, }: DatePickerProps): import("react").JSX.Element;
12
42
  //# sourceMappingURL=DatePicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../src/molecules/DatePicker.tsx"],"names":[],"mappings":"AAqBA,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,WAAW,EACX,GAAG,EACH,GAAG,EACH,QAAQ,EACR,KAAK,EACL,SAAS,GACV,EAAE,eAAe,+BA0RjB"}
1
+ {"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../src/molecules/DatePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAyBzG,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,KAAK,EAAE,SAAS,CAAC;IACjB,uFAAuF;IACvF,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yHAAyH;IACzH,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,yCAAyC;IACzC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,WAAW,EACX,GAAG,EACH,GAAG,EACH,QAAQ,EACR,KAAK,EACL,SAAS,EACT,OAAO,EACP,QAAgB,EAChB,UAAc,EACd,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,EACnC,eAAe,EAAE,YAAY,EAC7B,EAAE,GACH,EAAE,eAAe,+BAigBjB"}
@@ -1,13 +1,91 @@
1
+ import { ReactNode } from 'react';
1
2
  export interface DateRange {
2
3
  start: Date | null;
3
4
  end: Date | null;
4
5
  }
6
+ export interface DateRangePreset {
7
+ /** Button content. ReactNode so a caller can pass a badge/formatted fragment. */
8
+ label: ReactNode;
9
+ /** Produces the range to apply. Returns a value (unlike DatePickerPreset's
10
+ * `onSelect` callback) so the component can clamp it to min/max and jump the
11
+ * grid to it — a fire-and-forget callback could do neither. */
12
+ range: () => DateRange;
13
+ }
5
14
  export interface DateRangePickerProps {
6
15
  value: DateRange;
7
16
  onChange: (range: DateRange) => void;
8
- presets?: boolean;
17
+ /**
18
+ * `true` (default) renders the built-in proximity-ordered quick ranges,
19
+ * `false` renders no column, and an array supplies your own — so a consumer
20
+ * with a domain-specific shortcut ("Son 6 Ay", "Bu Çeyrek") extends the
21
+ * control through the API instead of forking it.
22
+ */
23
+ presets?: boolean | DateRangePreset[];
24
+ /**
25
+ * Earliest selectable DAY. Days before it are aria-disabled and presets clamp
26
+ * to it. Compared on day boundaries, so a time-of-day component never
27
+ * half-disables its own date.
28
+ */
29
+ min?: Date;
30
+ /** Latest selectable DAY. Days after it are aria-disabled; presets clamp to it. */
31
+ max?: Date;
32
+ /**
33
+ * Opens hour:minute selection for BOTH bounds — renders a two-box time row
34
+ * INSIDE the calendar popover, under the day grid. Deliberately not beside the
35
+ * trigger: this is one field carrying two bounds, and hanging two time boxes off
36
+ * it would break the combined control's layout (and the 280px filter rail).
37
+ * @default false
38
+ *
39
+ * Off (the default) a day click emits the raw day `Date` exactly as before. On,
40
+ * each bound KEEPS its own time across a re-pick (00:00 when unset) and seconds
41
+ * are always zeroed.
42
+ *
43
+ * NOTE: the end bound is NOT rounded to end-of-day, with or without `showTime`.
44
+ * Consumers compare these as plain instants, so a silent 23:59:59 would change
45
+ * what the value means; `showTime` lets the user set that themselves.
46
+ *
47
+ * An inverted pair is NOT auto-corrected on a time edit either. When both bounds
48
+ * fall on the SAME day the native inputs bound each other instead (start gets
49
+ * `max`, end gets `min`), so the invalid state is unreachable rather than
50
+ * silently rewritten. (NB-DATETIME-01)
51
+ */
52
+ showTime?: boolean;
53
+ /** `<input type="time">` step while `showTime` is on, in MINUTES. @default 1 */
54
+ minuteStep?: number;
9
55
  disabled?: boolean;
56
+ /** Marks the field invalid (chrome only — FormField renders the message). */
57
+ error?: string;
10
58
  className?: string;
59
+ /** ARIA forwarding — injected by FormField via cloneElement (mirrors Select) */
60
+ "aria-invalid"?: boolean | "true" | "false";
61
+ "aria-describedby"?: string;
62
+ "aria-required"?: boolean | "true" | "false";
63
+ id?: string;
11
64
  }
12
- export declare function DateRangePicker({ value, onChange, presets, disabled, className, }: DateRangePickerProps): import("react").JSX.Element;
65
+ /**
66
+ * DateRangePicker — ONE console-baseline input carrying BOTH bounds
67
+ * ("start — end"), backed by a single portaled calendar.
68
+ *
69
+ * It used to compose two DatePickers side by side with a preset button row
70
+ * underneath; both bounds now live in one field, and the shortcuts ride a
71
+ * proximity-ordered column INSIDE the popover (nearest range first), so the
72
+ * whole control fits a narrow filter rail.
73
+ *
74
+ * Selection is two-click: the first day drafts the start (and emits the
75
+ * half-open range immediately, since a start-only range is a legal filter),
76
+ * the second closes it — picked backwards, the bounds swap. Hovering between
77
+ * the two clicks previews the span.
78
+ *
79
+ * The panel portals to document.body (NB-POPOVER-01) so no overflow-y-auto
80
+ * ancestor can clip it, which also puts it OUTSIDE any enclosing focus-trap —
81
+ * hence it owns its own two-zone keyboard engine (preset column ↔ day grid),
82
+ * exactly like DatePicker's.
83
+ *
84
+ * `min`/`max`/`error` and array-valued `presets` mirror DatePicker's surface so
85
+ * a range field is as expressible as a single-date one: a consumer bounds the
86
+ * allowed window, flags the field invalid from its OWN validation (the rule
87
+ * stays in the consumer — the package only renders the invalid chrome), and
88
+ * supplies domain shortcuts, all without forking the component.
89
+ */
90
+ export declare function DateRangePicker({ value, onChange, presets, min, max, showTime, minuteStep, disabled, error, className, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedBy, "aria-required": ariaRequired, id, }: DateRangePickerProps): import("react").JSX.Element;
13
91
  //# sourceMappingURL=DateRangePicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangePicker.d.ts","sourceRoot":"","sources":["../../src/molecules/DateRangePicker.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,OAAc,EACd,QAAQ,EACR,SAAS,GACV,EAAE,oBAAoB,+BA+CtB"}
1
+ {"version":3,"file":"DateRangePicker.d.ts","sourceRoot":"","sources":["../../src/molecules/DateRangePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA6BzG,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,KAAK,EAAE,SAAS,CAAC;IACjB;;oEAEgE;IAChE,KAAK,EAAE,MAAM,SAAS,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,eAAe,EAAE,CAAC;IACtC;;;;OAIG;IACH,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,mFAAmF;IACnF,GAAG,CAAC,EAAE,IAAI,CAAC;IACX;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,OAAc,EACd,GAAG,EACH,GAAG,EACH,QAAgB,EAChB,UAAc,EACd,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,EACnC,eAAe,EAAE,YAAY,EAC7B,EAAE,GACH,EAAE,oBAAoB,+BAkwBtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"DateTimeInput.d.ts","sourceRoot":"","sources":["../../src/molecules/DateTimeInput.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;uFACmF;IACnF,GAAG,CAAC,EAAE,IAAI,CAAC;IACX;sCACkC;IAClC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,GAAG,EACH,GAAG,EACH,UAAc,EACd,QAAQ,EACR,KAAK,EACL,SAAS,GACV,EAAE,kBAAkB,+BA4DpB"}
1
+ {"version":3,"file":"DateTimeInput.d.ts","sourceRoot":"","sources":["../../src/molecules/DateTimeInput.tsx"],"names":[],"mappings":"AAgBA,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;uFACmF;IACnF,GAAG,CAAC,EAAE,IAAI,CAAC;IACX;sCACkC;IAClC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,GAAG,EACH,GAAG,EACH,UAAc,EACd,QAAQ,EACR,KAAK,EACL,SAAS,GACV,EAAE,kBAAkB,+BAoEpB"}
@@ -10,8 +10,8 @@ export { KpiCard, type KpiCardProps } from './KpiCard';
10
10
  export { EmptyState, type EmptyStateProps } from './EmptyState';
11
11
  export { ConfirmDialog, type ConfirmDialogProps } from './ConfirmDialog';
12
12
  export { EntityConfirmDialog, type EntityConfirmDialogProps } from './EntityConfirmDialog';
13
- export { DatePicker, type DatePickerProps } from './DatePicker';
14
- export { DateRangePicker, type DateRangePickerProps, type DateRange } from './DateRangePicker';
13
+ export { DatePicker, type DatePickerProps, type DatePickerPreset } from './DatePicker';
14
+ export { DateRangePicker, type DateRangePickerProps, type DateRange, type DateRangePreset } from './DateRangePicker';
15
15
  export { DateTimeInput, type DateTimeInputProps } from './DateTimeInput';
16
16
  export { ColorPicker, type ColorPickerProps, type ColorPreset } from './ColorPicker';
17
17
  export { Combobox, type ComboboxProps, type ComboboxOption } from './Combobox';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/molecules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACjI,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAClI,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/molecules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACjI,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrH,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAClI,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../src/organisms/Dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAyBjE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAClC;AASD,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAW,EAAE,EAAE,WAAW,sCA0GvG"}
1
+ {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../src/organisms/Dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA0BjE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAClC;AASD,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAW,EAAE,EAAE,WAAW,sCAgHvG"}
@@ -64,12 +64,28 @@ export interface FilterField {
64
64
  */
65
65
  toKey?: string;
66
66
  /**
67
- * For `type: "daterange"` — render the underlying `DateRangePicker`'s
68
- * quick-range preset row (Today / Last 7 days / …). Off by default: the 280px
69
- * filter rail is too narrow for the preset row to sit on one line.
67
+ * For `type: "daterange"` — offer the underlying `DateRangePicker`'s
68
+ * quick-range shortcuts (Today / Yesterday / Last 7 days / … / Last year).
69
+ * They render as a column INSIDE the portaled calendar popover, so the 280px
70
+ * rail's width no longer constrains them; the default stays off so an
71
+ * existing rail's popover keeps its current footprint unless opted in.
70
72
  * @default false
71
73
  */
72
74
  presets?: boolean;
75
+ /**
76
+ * For `type: "daterange"` and `type: "date"` — forwarded to the hosted
77
+ * `DateRangePicker` / `DatePicker`, opening hour:minute selection inside the
78
+ * calendar popover. The trigger field's own footprint is unchanged, so a 280px
79
+ * rail is unaffected.
80
+ *
81
+ * The WIRE CONTRACT DOES NOT CHANGE: a bound has always been emitted as full
82
+ * ISO 8601 (`toISOString()`), so it could always carry a time — there was just
83
+ * no control to set one, which pinned every bound to 00:00 and made a whole day
84
+ * the narrowest expressible range. (NB-DATETIME-01) @default false
85
+ */
86
+ showTime?: boolean;
87
+ /** Time step while `showTime` is on, in MINUTES. @default 1 */
88
+ minuteStep?: number;
73
89
  }
74
90
  export interface FilterValue {
75
91
  field: string;
@@ -1 +1 @@
1
- {"version":3,"file":"FilterPanel.d.ts","sourceRoot":"","sources":["../../src/organisms/FilterPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAwB5D,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,QAAQ,GACR,MAAM,GACN,WAAW,GACX,QAAQ,GACR,SAAS,GACT,UAAU,CAAC;AAEf,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,eAAe,CAAC;IACtB;;0FAEsF;IACtF,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;+EAC2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAiMD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAC/C;;;oEAGgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,MAAM,EAAE,cAAc,EACtB,OAAO,EACP,OAAO,EACP,OAAO,EACP,aAAa,EACb,aAAoB,GACrB,EAAE,gBAAgB,+BAuQlB"}
1
+ {"version":3,"file":"FilterPanel.d.ts","sourceRoot":"","sources":["../../src/organisms/FilterPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAwB5D,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,QAAQ,GACR,MAAM,GACN,WAAW,GACX,QAAQ,GACR,SAAS,GACT,UAAU,CAAC;AAEf,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,eAAe,CAAC;IACtB;;0FAEsF;IACtF,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;+EAC2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAiMD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAC/C;;;oEAGgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,MAAM,EAAE,cAAc,EACtB,OAAO,EACP,OAAO,EACP,OAAO,EACP,aAAa,EACb,aAAoB,GACrB,EAAE,gBAAgB,+BA0QlB"}
@@ -1,7 +1,25 @@
1
- import { CSSProperties, ReactNode } from 'react';
1
+ import { CSSProperties, MouseEvent as ReactMouseEvent, ReactNode } from 'react';
2
+ /**
3
+ * Which dismiss path asked the Sheet to close.
4
+ *
5
+ * - `"backdrop"` — click on the dimmed overlay behind the panel
6
+ * - `"escape"` — Escape key
7
+ * - `"close-button"` — the Sheet's own header ✕
8
+ */
9
+ export type SheetCloseReason = "backdrop" | "escape" | "close-button";
2
10
  export interface SheetProps {
3
11
  open: boolean;
4
- onClose: () => void;
12
+ /**
13
+ * Called when the Sheet asks to close, with the SOURCE of the request so a
14
+ * consumer can treat an accidental outside click differently from an explicit
15
+ * ✕ (e.g. confirm before discarding a dirty form on `"backdrop"`/`"escape"`,
16
+ * but close straight away on `"close-button"`).
17
+ *
18
+ * The argument is ADDITIVE: an existing `() => void` handler stays assignable
19
+ * (TypeScript allows a function to declare fewer parameters than its target
20
+ * type), so no call site breaks.
21
+ */
22
+ onClose: (reason: SheetCloseReason) => void;
5
23
  side?: "left" | "right";
6
24
  width?: string;
7
25
  title?: string;
@@ -32,6 +50,29 @@ export interface SheetProps {
32
50
  * when side="left" (left is always the opaque card surface).
33
51
  */
34
52
  surface?: "glass" | "solid";
53
+ /**
54
+ * Whether a backdrop click dismisses the Sheet. Default `true` (unchanged
55
+ * behaviour). `false` makes the overlay inert — `onInteractOutside` still
56
+ * fires, so a consumer can react (shake, toast) without closing.
57
+ */
58
+ closeOnBackdropClick?: boolean;
59
+ /**
60
+ * Whether the Escape key dismisses the Sheet. Default `true` (unchanged
61
+ * behaviour). `false` keeps the focus trap and scroll lock but ignores Escape;
62
+ * `onEscapeKeyDown` still fires.
63
+ */
64
+ closeOnEscape?: boolean;
65
+ /**
66
+ * Fired on a backdrop click BEFORE the Sheet closes. Call
67
+ * `event.preventDefault()` to cancel the dismissal and keep the Sheet open
68
+ * (e.g. to raise an "unsaved changes" confirmation instead).
69
+ */
70
+ onInteractOutside?: (event: ReactMouseEvent<HTMLDivElement>) => void;
71
+ /**
72
+ * Fired on Escape BEFORE the Sheet closes. Call `event.preventDefault()` to
73
+ * cancel the dismissal and keep the Sheet open.
74
+ */
75
+ onEscapeKeyDown?: (event: KeyboardEvent) => void;
35
76
  }
36
- export declare function Sheet({ open, onClose, side, width, title, description, className, children, footer, headerActions, headerClassName, headerStyle, closeButtonProminent, surface, }: SheetProps): import('react').ReactPortal | null;
77
+ export declare function Sheet({ open, onClose, side, width, title, description, className, children, footer, headerActions, headerClassName, headerStyle, closeButtonProminent, surface, closeOnBackdropClick, closeOnEscape, onInteractOutside, onEscapeKeyDown, }: SheetProps): import('react').ReactPortal | null;
37
78
  //# sourceMappingURL=Sheet.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Sheet.d.ts","sourceRoot":"","sources":["../../src/organisms/Sheet.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuD,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAqBhH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,yEAAyE;IACzE,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,gFAAgF;IAChF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC7B;AAED,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,IAAc,EACd,KAAK,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,QAAQ,EACR,MAAM,EACN,aAAa,EACb,eAAe,EACf,WAAW,EACX,oBAA4B,EAC5B,OAAiB,GAClB,EAAE,UAAU,sCAwJZ"}
1
+ {"version":3,"file":"Sheet.d.ts","sourceRoot":"","sources":["../../src/organisms/Sheet.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuD,KAAK,aAAa,EAAE,KAAK,UAAU,IAAI,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA6BpJ;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,QAAQ,GAAG,cAAc,CAAC;AAEtE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd;;;;;;;;;OASG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,yEAAyE;IACzE,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,gFAAgF;IAChF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACrE;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,IAAc,EACd,KAAK,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,QAAQ,EACR,MAAM,EACN,aAAa,EACb,eAAe,EACf,WAAW,EACX,oBAA4B,EAC5B,OAAiB,EACjB,oBAA2B,EAC3B,aAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,EAAE,UAAU,sCAmLZ"}
@@ -1,5 +1,5 @@
1
1
  export { Dialog, type DialogProps } from './Dialog';
2
- export { Sheet, type SheetProps } from './Sheet';
2
+ export { Sheet, type SheetProps, type SheetCloseReason } from './Sheet';
3
3
  export { Tabs, type TabsProps, type TabItem } from './Tabs';
4
4
  export { UnifiedTabs, UnifiedTabPanel, type UnifiedTabsProps, type UnifiedTabItem, type UnifiedTabPanelProps } from './UnifiedTabs';
5
5
  export { ToastProvider, toast } from './Toast';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organisms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACpI,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,KAAK,0BAA0B,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACvN,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,EACR,SAAS,EACT,SAAS,EACT,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7H,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,wBAAwB,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,OAAO,EACP,eAAe,EACf,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organisms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACpI,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,KAAK,0BAA0B,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACvN,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,EACR,SAAS,EACT,SAAS,EACT,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7H,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,wBAAwB,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,OAAO,EACP,eAAe,EACf,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,54 @@
1
+ const l = { ara: "Ara...", filtre: "Filtre", kaydet: "Kaydet", iptal: "İptal", sil: "Sil", duzenle: "Düzenle", ekle: "Ekle", kapat: "Kapat", daha_fazla: "Daha fazla", temizle: "Temizle", tamam: "Tamam", geri: "Geri", ileri: "İleri", devam: "Devam", calistir: "Çalıştır", onayla: "Onayla", gonder: "Gönder", yukle: "Yükle", indir: "İndir", kopyala: "Kopyala", kopyalandi: "Kopyalandı", yapistir: "Yapıştır", sec: "Seç", vazgec: "Vazgeç", detay: "Detay", detaya_git: "Detaya Git", yenile: "Yenile", disa_aktar: "Dışa Aktar", evet: "Evet", hayir: "Hayır", tumu: "Tümü", yok: "Yok", olustur: '"{{value}}" oluştur', modem: "Modem", meter: "Sayaç" }, s = { sayfa: "Sayfa", toplam: "Toplam", secili: "Seçili", kayit_bulunamadi: "Kayıt bulunamadı", siralama: "Sıralama", filtrele: "Filtrele", tumunu_sec: "Tümünü Seç", secimi_kaldir: "Seçimi Kaldır", satirlar: "satır", sayfa_basina: "sayfa başına", eylemler: "Eylemler" }, d = { zorunlu_alan: "Bu alan zorunludur", gecersiz_deger: "Geçersiz değer", min_karakter: "En az {{min}} karakter olmalıdır", max_karakter: "En fazla {{max}} karakter olmalıdır", email_gecersiz: "Geçerli bir e-posta adresi giriniz", sayi_gecersiz: "Geçerli bir sayı giriniz" }, m = { emin_misiniz: "Emin misiniz?", bu_islem_geri_alinamaz: "Bu işlem geri alınamaz.", onay: "Onayla", vazgec: "Vazgeç", silme_onay: "Bu kaydı silmek istediğinize emin misiniz?", silme_baslik: "Kaydı Sil", entity_silme_onay: "kalıcı olarak silinecek. Bu işlem geri alınamaz.", kaydedilmemis_baslik: "Kaydedilmemiş değişiklikler", kaydedilmemis_aciklama: "Girdiğiniz bilgiler kaybolacak. Kapatmak istediğinize emin misiniz?", kaydetmeden_kapat: "Kaydetmeden kapat" }, u = { detail: "Komut Detayı", statusTimeline: "Durum Akışı", target: "Hedef", traffic: "Trafik Bilgisi", createdAt: "Oluşturulma", sentAt: "Gönderilme", completedAt: "Tamamlanma", duration: "Süre", retryCount: "Deneme Sayısı", params: "Parametreler", modemResponse: "İş Emri İçeriği", responseLoadError: "Cevap yüklenemedi", retry: "Tekrar Dene", cancel: "İptal Et" }, y = { karanlik_mod: "Karanlık Mod", aydinlik_mod: "Aydınlık Mod", tema_degistir: "Tema Değiştir" }, c = { bugun: "Bugün", dun: "Dün", bu_hafta: "Bu Hafta", bu_ay: "Bu Ay", gecen_ay: "Geçen Ay", son_7_gun: "Son 7 Gün", son_30_gun: "Son 30 Gün", son_90_gun: "Son 90 Gün", bu_yil: "Bu Yıl", gecen_yil: "Geçen Yıl", baslangic: "Başlangıç", bitis: "Bitiş", tarih_sec: "Tarih Seçiniz", saat: "Saat", hazir_araliklar: "Hazır Aralıklar" }, k = { onceki_sayfa: "Önceki Sayfa", sonraki_sayfa: "Sonraki Sayfa", previous_page: "Önceki sayfa", next_page: "Sonraki sayfa", sayfa_x_y: "Sayfa {{current}} / {{total}}", kayit_gosteriliyor: "{{from}}-{{to}} / {{total}} kayıt gösteriliyor", ilk_sayfa: "İlk Sayfa", son_sayfa: "Son Sayfa" }, g = { kayit_bulunamadi: "Kayıt bulunamadı", henuz_veri_yok: "Henüz veri yok", sonuc_bulunamadi: "Aradığınız kriterlere uygun sonuç bulunamadı" }, p = { basarili: "Başarılı", hata: "Hata", uyari: "Uyarı", bilgi: "Bilgi", yukleniyor: "Yükleniyor...", kaydediliyor: "Kaydediliyor...", siliniyor: "Siliniyor..." }, _ = { status_pending: "Bekliyor", status_valid: "Geçerli", status_invalid: "Geçersiz" }, f = { filtre_uygula: "Filtreyi Uygula", filtreleri_temizle: "Filtreleri Temizle", aktif_filtre: "{{count}} aktif filtre", yes: "Evet", no: "Hayır", op_contains: "İçerir", op_equals: "Eşittir", op_not_equals: "Eşit Değil", op_starts_with: "Başlar", op_ends_with: "Biter", op_greater: "Büyüktür", op_less: "Küçüktür", op_greater_eq: "Büyük Eşit", op_less_eq: "Küçük Eşit", operator_sec: "Operatör seçin", secili: "Seçili" }, S = { ham_json: "Ham JSON", form_gorunumu: "Form Görünümü", formatla: "Formatla", gecersiz_json: "Geçersiz JSON formatı", kopyalandi: "Kopyalandı!", kopyala: "Kopyala", icerik: "JSON içeriği", duzenle: "Düzenle", goruntule: "Görüntüle" }, b = { bold: "Kalın", italic: "İtalik", strike: "Üstü çizili", h2: "Başlık 2", h3: "Başlık 3", bulletList: "Madde işaretli liste", orderedList: "Numaralı liste", link: "Bağlantı", unlink: "Bağlantıyı kaldır", blockquote: "Alıntı", code: "Kod", undo: "Geri al", redo: "Yinele", linkUrl: "https://…", linkApply: "Bağlantıyı uygula", linkCancel: "İptal", toolbar: "Biçimlendirme", editor: "Zengin metin editörü", linkInput: "Bağlantı adresi" }, h = { webglTitle: "WebGL kullanılamıyor", webglBody: "Bu harita yüzeyi render için WebGL gerektirir. Lütfen farklı bir tarayıcı deneyin veya yöneticinizle iletişime geçin.", layerControl: "Harita katmanları" }, A = { sifreyi_goster: "Şifreyi göster", sifreyi_gizle: "Şifreyi gizle", onceki_ay: "Önceki ay", sonraki_ay: "Sonraki ay", filtreyi_kaldir: "{{name}} filtresini kaldır", kopyala: "Kopyala", panel: "Panel", iletisim_kutusu: "İletişim kutusu", kaldir: "{{label}} seçimini kaldır", filtrele: "Seçenekleri filtrele", filtreler: "Filtreler", breadcrumb: "Yol haritası", pagination: "Sayfalama", detay_sayfasi: "Detay sayfası", filtreler_kenar: "Filtre kenar çubuğu", giris: "Giriş", rapor_kriterleri: "Rapor kriterleri" }, O = { lifecycle: { ACTIVE: "Aktif", INACTIVE: "Pasif", MAINTENANCE: "Bakımda", FAULTY: "Arızalı" }, power: { ON: "Enerjili", OFF: "Enerji Yok", UNKNOWN: "Bilinmiyor" }, disconnection: { ON: "Enerji Var", OFF: "Enerji Yok", UNKNOWN: "Bilinmiyor", OPENING: "Açılıyor", CLOSING: "Kapanıyor" } }, T = { hero: { live: "CANLI", fleetOnline: "AKTİF SAYAÇLAR", online: "aktif", vs1h: "vs 1s", fleet: { online: "AKTİF", offline: "PASİF", unknown: "ENERJİSİZ" }, readingSla24h: "OKUMA SLA · 24S", target: "hedef", activeOutages: "AKTİF KESİNTİLER", affectedMeters: "etkilenen sayaç", alarm: { crit: "KRİTİK", warn: "UYARI", viewDetails: "{{slug}} detaylarını görüntüle" }, tape: { ariaLabel: "Son sistem olayları" }, tapePrefix: "BANT", fleetActive: "Aktif Haberleşme Ünitesi · 24s", fleetTotal: "/ {{total}}", fleetOnlinePct: "%{{pct}}", fleetDeltaHourly: "+{{delta}} ↑ 1s", slaToday: "Okuma Oranı · Bugün", slaTargetCaption: "Hedef %{{target}}", outagesAffected: "{{count}} sayaç", outagesWorstRegion: "En kötü bölge: {{region}}", outagesWorstRegionLabel: "En kötü bölge:", ticker: { throughput: "İŞLEM/s", online: "ÇEVRİMİÇİ", outages: "KESİNTİ", dlq: "DLQ", parseRate: "ÇÖZÜM/s", queue: "KUYRUK" } }, zoneA: { mapTitle: "Coğrafi Komuta", mapSubtitle: "Türkiye · 81 il", mapLoading: "Yükleniyor...", popupLabels: { outage: "Kesinti", rssi: "RSSI", sla: "SLA %", simOperator: "SIM Op", reason: "Sebep" }, layerButton: { kesinti: "Kesinti", sinyal: "Sinyal", sim: "SIM Op", sla: "Okuma Oranı" }, layerHint: { outage: "kesinti yoğunluğu", rssi: "RSSI medyan", sim: "en iyi operatör", sla: "okuma yüzdesi" }, legend: { label: "Açıklama", noData: "Veri yok" }, popup: { dataMissing: "Veri bekleniyor (STORY-218)" }, panelHeader: { eyebrow: "BÖLGE", modemSuffix: "haberleşme ünitesi", meterSuffix: "sayaç", noDataCaption: "Veri bekleniyor — STORY-218 sonrası aktif" }, panelBody: { noDataPlaceholder: "Bu il için henüz veri yok." }, panelFooter: { bestSim: "{{operator}} en iyi — RSSI {{rssi}} dBm", bestSimNoSignal: "{{operator}} en iyi — RSSI veri yok", noWinner: "En iyi operatör verisi yok", cta: "Rapor Aç →" }, noValue: "—", kesinti: { activeLabel: "Aktif Kesinti", affectedSuffix: "etk.", affectedNoData: "etkilenen sayaç verisi yok", longestLabel: "En Uzun Kesinti", noOutage: "kesinti yok", trendTitle: "Kesinti Trend · 7 Gün", legendCount: "Adet", legendDuration: "Süre (dk)", activeListTitle: "Aktif En Uzun Kesintiler", emptyList: "{{province}} bölgesinde aktif kesinti yok." }, sinyal: { title: "SIM Operatör · Medyan Sinyal (dBm) · {{province}}", noData: "Sinyal verisi yok", footer: "Sinyal tab seçili — detaylı bölge RSSI dağılımı yakında" }, sim: { title: "En İyi SIM Operatör · {{province}}", noData: "SIM operatör verisi yok" }, sla: { todayLabel: "Okuma Oranı · 24s", targetCaption: "hedef %99,0", missingLabel: "Eksik Okuma", meterSuffix: "sayaç", noData: "Okuma oranı verisi yok", footer: "Okuma Oranı tab seçili — sayaç bazlı kırılım yakında" }, outageReason: { POWER_LOSS: "Güç Kaybı", NETWORK_OUTAGE: "Şebeke Kesintisi", HARDWARE_FAILURE: "Donanım Arızası", HIGH_TEMP: "Yüksek Sıcaklık", CONNECTION_LOST: "Bağlantı Kopması", noOutage: "Kesinti yok", noData: "Sebep bilinmiyor" }, webglFallback: { title: "Tarayıcınız WebGL desteklemiyor", body: "Coğrafi komuta yüzeyi 81-il çoklu-katman harita render etmek için WebGL gerektirir. Lütfen yöneticinizle iletişime geçin." } }, zones: { zoneAPlaceholder: "Zone A — Çok Katmanlı Harita (STORY-217)", pipelineFunnel: { title: "Veri Hattı · msg/s", empty: "Veri akışı bekleniyor", stage: { kalpAtisi: "Kalp Atışı", hamVeri: "Ham Veri", cozumleyici: "Çözümleyici", clickHouse: "ClickHouse" } }, parseErrors: { title: "Çözümleme Hataları", centerCaption: "HATA", empty: "Hata yok", ariaLabel: "Toplam {{count}} çözümleme hatası" }, simRanking: { title: "SIM Operatör TR · Çevrimiçi %", empty: "Operatör verisi yok" }, integrationHealth: { title: "Entegrasyon · Nabız", empty: "Servis verisi yok", status: { ok: "Sağlıklı", warn: "Uyarı", crit: "Kritik" } }, slaTopBottom: { title: "SLA · En Düşük 4 / En Yüksek 4", lowLabel: "▼ Düşük", highLabel: "▲ Yüksek", empty: "Veri yok" }, outageTrend24h: { title: "Kesinti · 24s Trend", hint: "bölgeye göre", empty: "Kesinti yok", regions: { marmara: "Marmara", ic: "İç Anadolu", karadeniz: "Karadeniz", ege: "Ege", akdeniz: "Akdeniz", diger: "Diğer" } }, calendarRings: { title: "Takvim · İlerleme", empty: "Veri yok" } } }, N = { serial: "Seri Numarası", protocol: "Protokol", port: "Port", firmware: "Firmware", type: "Tip", modem: "Modem", location: "Konum", lastReading: "son okuma", monthlySuccessRate: "Aylık başarı oranı", quickStatus: "Hızlı durum", meterCount: "Sayaç", activeAlarms: "Aktif Alarm", activeOrders: "Aktif İş Emri", uptime: "Uptime", signal: "Sinyal", readingRate: "Okuma Oranı", calendar: { title: "Okuma takvimi", prevMonth: "Önceki ay", nextMonth: "Sonraki ay", months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"], dayLabels: ["P", "S", "Ç", "P", "C", "C", "P"], status: { ok: "Okundu", warn: "Eksik okuma", crit: "Okuma hatası", noData: "Veri yok" }, legend: { ok: "Tam", warn: "Eksik", crit: "Hata", noData: "Veri yok" }, cellAria: "{{date}} — {{status}}, {{count}}/{{expected}} okuma" } }, r = {
2
+ common: l,
3
+ table: s,
4
+ form: d,
5
+ dialog: m,
6
+ order: u,
7
+ theme: y,
8
+ date: c,
9
+ pagination: k,
10
+ empty: g,
11
+ status: p,
12
+ editablegrid: _,
13
+ filter: f,
14
+ json_editor: S,
15
+ rich_text_editor: b,
16
+ map_shell: h,
17
+ aria: A,
18
+ detail_status: O,
19
+ dashboard: T,
20
+ detail_hero: N
21
+ }, v = { ara: "Search...", filtre: "Filter", kaydet: "Save", iptal: "Cancel", sil: "Delete", duzenle: "Edit", ekle: "Add", kapat: "Close", daha_fazla: "More", temizle: "Clear", tamam: "OK", geri: "Back", ileri: "Next", devam: "Continue", calistir: "Execute", onayla: "Confirm", gonder: "Send", yukle: "Upload", indir: "Download", kopyala: "Copy", kopyalandi: "Copied", yapistir: "Paste", sec: "Select", vazgec: "Cancel", detay: "Detail", detaya_git: "Go to Detail", yenile: "Refresh", disa_aktar: "Export", evet: "Yes", hayir: "No", tumu: "All", yok: "None", olustur: 'Create "{{value}}"', modem: "Modem", meter: "Meter" }, E = { sayfa: "Page", toplam: "Total", secili: "Selected", kayit_bulunamadi: "No records found", siralama: "Sort", filtrele: "Filter", tumunu_sec: "Select All", secimi_kaldir: "Deselect All", satirlar: "rows", sayfa_basina: "per page", eylemler: "Actions" }, R = { zorunlu_alan: "This field is required", gecersiz_deger: "Invalid value", min_karakter: "Must be at least {{min}} characters", max_karakter: "Must be at most {{max}} characters", email_gecersiz: "Please enter a valid email address", sayi_gecersiz: "Please enter a valid number" }, z = { emin_misiniz: "Are you sure?", bu_islem_geri_alinamaz: "This action cannot be undone.", onay: "Confirm", vazgec: "Cancel", silme_onay: "Are you sure you want to delete this record?", silme_baslik: "Delete Record", entity_silme_onay: "will be permanently deleted. This action cannot be undone.", kaydedilmemis_baslik: "Unsaved changes", kaydedilmemis_aciklama: "The information you entered will be lost. Are you sure you want to close?", kaydetmeden_kapat: "Close without saving" }, L = { detail: "Order Detail", statusTimeline: "Status Flow", target: "Target", traffic: "Traffic Info", createdAt: "Created", sentAt: "Sent", completedAt: "Completed", duration: "Duration", retryCount: "Retry Count", params: "Parameters", modemResponse: "Order Content", responseLoadError: "Could not load the response", retry: "Retry", cancel: "Cancel" }, C = { karanlik_mod: "Dark Mode", aydinlik_mod: "Light Mode", tema_degistir: "Toggle Theme" }, D = { bugun: "Today", dun: "Yesterday", bu_hafta: "This Week", bu_ay: "This Month", gecen_ay: "Last Month", son_7_gun: "Last 7 Days", son_30_gun: "Last 30 Days", son_90_gun: "Last 90 Days", bu_yil: "This Year", gecen_yil: "Last Year", baslangic: "Start", bitis: "End", tarih_sec: "Select Date", saat: "Time", hazir_araliklar: "Quick Ranges" }, w = { onceki_sayfa: "Previous Page", sonraki_sayfa: "Next Page", previous_page: "Previous page", next_page: "Next page", sayfa_x_y: "Page {{current}} / {{total}}", kayit_gosteriliyor: "Showing {{from}}-{{to}} of {{total}} records", ilk_sayfa: "First Page", son_sayfa: "Last Page" }, K = { kayit_bulunamadi: "No records found", henuz_veri_yok: "No data yet", sonuc_bulunamadi: "No results matching your criteria" }, M = { basarili: "Success", hata: "Error", uyari: "Warning", bilgi: "Info", yukleniyor: "Loading...", kaydediliyor: "Saving...", siliniyor: "Deleting..." }, I = { status_pending: "Pending", status_valid: "Valid", status_invalid: "Invalid" }, P = { filtre_uygula: "Apply Filter", filtreleri_temizle: "Clear Filters", aktif_filtre: "{{count}} active filter(s)", yes: "Yes", no: "No", op_contains: "Contains", op_equals: "Equals", op_not_equals: "Not Equals", op_starts_with: "Starts With", op_ends_with: "Ends With", op_greater: "Greater Than", op_less: "Less Than", op_greater_eq: "Greater or Equal", op_less_eq: "Less or Equal", operator_sec: "Select operator", secili: "Selected" }, B = { ham_json: "Raw JSON", form_gorunumu: "Form View", formatla: "Format", gecersiz_json: "Invalid JSON format", kopyalandi: "Copied!", kopyala: "Copy", icerik: "JSON content", duzenle: "Edit", goruntule: "View" }, F = { bold: "Bold", italic: "Italic", strike: "Strikethrough", h2: "Heading 2", h3: "Heading 3", bulletList: "Bullet list", orderedList: "Numbered list", link: "Link", unlink: "Remove link", blockquote: "Quote", code: "Code", undo: "Undo", redo: "Redo", linkUrl: "https://…", linkApply: "Apply link", linkCancel: "Cancel", toolbar: "Formatting", editor: "Rich text editor", linkInput: "Link URL" }, G = { webglTitle: "WebGL is not available", webglBody: "This map surface needs WebGL to render. Please try a different browser or contact your administrator.", layerControl: "Map layers" }, H = { sifreyi_goster: "Show password", sifreyi_gizle: "Hide password", onceki_ay: "Previous month", sonraki_ay: "Next month", filtreyi_kaldir: "Remove {{name}} filter", kopyala: "Copy", panel: "Panel", iletisim_kutusu: "Dialog", kaldir: "Remove {{label}}", filtrele: "Filter options", filtreler: "Filters", breadcrumb: "Breadcrumb", pagination: "Pagination", detay_sayfasi: "Detail page", filtreler_kenar: "Filter sidebar", giris: "Sign in", rapor_kriterleri: "Report criteria" }, U = { lifecycle: { ACTIVE: "Active", INACTIVE: "Inactive", MAINTENANCE: "Maintenance", FAULTY: "Faulty" }, power: { ON: "Energized", OFF: "No Energy", UNKNOWN: "Unknown" }, disconnection: { ON: "Power OK", OFF: "No Power", UNKNOWN: "Unknown", OPENING: "Opening", CLOSING: "Closing" } }, x = { hero: { live: "LIVE", fleetOnline: "FLEET ONLINE", online: "online", vs1h: "vs 1h", fleet: { online: "ONLINE", offline: "OFF", unknown: "UNK" }, readingSla24h: "READING SLA · 24h", target: "target", activeOutages: "ACTIVE OUTAGES", affectedMeters: "meters affected", alarm: { crit: "CRIT", warn: "WARN", viewDetails: "View {{slug}} details" }, tape: { ariaLabel: "Recent system events" }, tapePrefix: "TAPE", fleetActive: "Active Comm. Units · 24h", fleetTotal: "/ {{total}}", fleetOnlinePct: "{{pct}}%", fleetDeltaHourly: "+{{delta}} ↑ 1h", slaToday: "Read Rate · Today", slaTargetCaption: "Target {{target}}%", outagesAffected: "{{count}} meters", outagesWorstRegion: "Worst region: {{region}}", outagesWorstRegionLabel: "Worst region:", ticker: { throughput: "OPS/s", online: "ONLINE", outages: "OUTAGE", dlq: "DLQ", parseRate: "PARSE/s", queue: "QUEUE" } }, zoneA: { mapTitle: "Geographic Command", mapSubtitle: "Turkey · 81 provinces", mapLoading: "Loading...", popupLabels: { outage: "Outage", rssi: "RSSI", sla: "SLA %", simOperator: "SIM Op", reason: "Reason" }, layerButton: { kesinti: "Outage", sinyal: "Signal", sim: "SIM Op", sla: "Reading SLA" }, layerHint: { outage: "outage density", rssi: "RSSI median", sim: "best operator", sla: "reading percent" }, legend: { label: "Legend", noData: "No data" }, popup: { dataMissing: "Awaiting data (STORY-218)" }, panelHeader: { eyebrow: "REGION", modemSuffix: "communication unit", meterSuffix: "meter", noDataCaption: "Awaiting data — active after STORY-218" }, panelBody: { noDataPlaceholder: "No data for this province yet." }, panelFooter: { bestSim: "{{operator}} best — RSSI {{rssi}} dBm", bestSimNoSignal: "{{operator}} best — RSSI no data", noWinner: "No best-operator data", cta: "Open Report →" }, noValue: "—", kesinti: { activeLabel: "Active Outages", affectedSuffix: "affected", affectedNoData: "no affected-meter data", longestLabel: "Longest Outage", noOutage: "no outage", trendTitle: "Outage Trend · 7 Days", legendCount: "Count", legendDuration: "Duration (min)", activeListTitle: "Top Active Outages", emptyList: "No active outages in {{province}}." }, sinyal: { title: "SIM Operator · Median Signal (dBm) · {{province}}", noData: "No signal data", footer: "Signal tab selected — detailed regional RSSI breakdown coming soon" }, sim: { title: "Best SIM Operator · {{province}}", noData: "No SIM operator data" }, sla: { todayLabel: "Reading SLA · 24h", targetCaption: "target 99.0%", missingLabel: "Missing Reads", meterSuffix: "meter", noData: "No reading-rate data", footer: "Reading SLA tab selected — meter-level breakdown coming soon" }, outageReason: { POWER_LOSS: "Power Loss", NETWORK_OUTAGE: "Network Outage", HARDWARE_FAILURE: "Hardware Failure", HIGH_TEMP: "High Temperature", CONNECTION_LOST: "Connection Lost", noOutage: "No outage", noData: "Reason unknown" }, webglFallback: { title: "Your browser does not support WebGL", body: "The geographic command surface requires WebGL to render the 81-province multi-layer map. Please contact your administrator." } }, zones: { zoneAPlaceholder: "Zone A — Multi-Layer Map (STORY-217)", pipelineFunnel: { title: "Pipeline · msg/s", empty: "Waiting for data flow", stage: { kalpAtisi: "Heartbeat", hamVeri: "Raw Data", cozumleyici: "Parser", clickHouse: "ClickHouse" } }, parseErrors: { title: "Parse Errors", centerCaption: "ERRORS", empty: "No errors", ariaLabel: "Total {{count}} parse errors" }, simRanking: { title: "SIM Operator TR · Online %", empty: "No operator data" }, integrationHealth: { title: "Integration · Pulse", empty: "No service data", status: { ok: "Healthy", warn: "Warning", crit: "Critical" } }, slaTopBottom: { title: "SLA · Lowest 4 / Highest 4", lowLabel: "▼ Low", highLabel: "▲ High", empty: "No data" }, outageTrend24h: { title: "Outage · 24h Trend", hint: "by region", empty: "No outages", regions: { marmara: "Marmara", ic: "Central Anatolia", karadeniz: "Black Sea", ege: "Aegean", akdeniz: "Mediterranean", diger: "Other" } }, calendarRings: { title: "Calendar · Progress", empty: "No data" } } }, W = { serial: "Serial Number", protocol: "Protocol", port: "Port", firmware: "Firmware", type: "Type", modem: "Modem", location: "Location", lastReading: "last reading", monthlySuccessRate: "Monthly success rate", quickStatus: "Quick status", meterCount: "Meters", activeAlarms: "Active Alarms", activeOrders: "Active Orders", uptime: "Uptime", signal: "Signal", readingRate: "Reading Rate", calendar: { title: "Reading calendar", prevMonth: "Previous month", nextMonth: "Next month", months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], dayLabels: ["M", "T", "W", "T", "F", "S", "S"], status: { ok: "Read", warn: "Missing reading", crit: "Reading error", noData: "No data" }, legend: { ok: "Full", warn: "Missing", crit: "Error", noData: "No data" }, cellAria: "{{date}} — {{status}}, {{count}}/{{expected}} readings" } }, n = {
22
+ common: v,
23
+ table: E,
24
+ form: R,
25
+ dialog: z,
26
+ order: L,
27
+ theme: C,
28
+ date: D,
29
+ pagination: w,
30
+ empty: K,
31
+ status: M,
32
+ editablegrid: I,
33
+ filter: P,
34
+ json_editor: B,
35
+ rich_text_editor: F,
36
+ map_shell: G,
37
+ aria: H,
38
+ detail_status: U,
39
+ dashboard: x,
40
+ detail_hero: W
41
+ }, Y = {
42
+ tr: { common: r },
43
+ en: { common: n }
44
+ };
45
+ function V(e, o = {}) {
46
+ const { namespace: a = "common", overwrite: i = !1, deep: t = !0 } = o;
47
+ return e.addResourceBundle("tr", a, r, t, i), e.addResourceBundle("en", a, n, t, i), e;
48
+ }
49
+ export {
50
+ n as e,
51
+ V as r,
52
+ r as t,
53
+ Y as u
54
+ };
@@ -16,6 +16,28 @@ export interface AnchoredOptions {
16
16
  margin?: number;
17
17
  /** Pin the panel width to the trigger width (Select); else use the panel's own width (DatePicker). */
18
18
  matchTriggerWidth?: boolean;
19
+ /**
20
+ * Floor for `matchTriggerWidth` — the panel tracks the trigger but never
21
+ * shrinks below this (DateRangePicker: its calendar + preset column stop
22
+ * being usable under ~320px). Ignored when `matchTriggerWidth` is off.
23
+ * The clamp below uses the SAME floored width, so a panel widened by this
24
+ * floor is still kept inside the viewport.
25
+ */
26
+ minWidth?: number;
27
+ /**
28
+ * The panel carries its OWN CSS min-width (DateRangePicker's
29
+ * `min-w-[fit-content]`), so it can render WIDER than the width we pin on it —
30
+ * e.g. on `spacious` density, where `--space-8` grows the 7-cell grid, or with
31
+ * long custom preset labels. Clamp against the measured natural width in that
32
+ * case, or the surplus spills past the right viewport edge.
33
+ *
34
+ * OFF by default, and deliberately not unconditional: Select also pins its
35
+ * panel to the trigger, but it has no min-width and truncates long option
36
+ * labels, so its natural (max-content) width is NOT what it renders at.
37
+ * Clamping Select against that would shove its panel left of its own trigger
38
+ * for no reason.
39
+ */
40
+ clampToContentWidth?: boolean;
19
41
  }
20
42
  /**
21
43
  * Compute the fixed on-screen position for a dropdown panel anchored to a trigger.
@@ -1 +1 @@
1
- {"version":3,"file":"anchoredPanelPosition.d.ts","sourceRoot":"","sources":["../../src/utils/anchoredPanelPosition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE9D,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAErC,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC5B,uFAAuF;IACvF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,EACb,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,eAAoB,GACzB,iBAAiB,CAuCnB"}
1
+ {"version":3,"file":"anchoredPanelPosition.d.ts","sourceRoot":"","sources":["../../src/utils/anchoredPanelPosition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE9D,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAErC,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC5B,uFAAuF;IACvF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;OAYG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,EACb,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,eAAoB,GACzB,iBAAiB,CAsDnB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * dateTime.ts — time-of-day helpers shared by the date controls.
3
+ *
4
+ * `DatePicker`, `DateRangePicker` and `DateTimeInput` all have to answer the same
5
+ * questions once a time component enters the picture: what is this Date's "HH:mm",
6
+ * how do I put an "HH:mm" onto a picked day, and how do I keep the result inside
7
+ * [min, max]. Extracted so the three cannot drift apart — the same D-172 rationale
8
+ * that put the focus-trap helpers in their own module.
9
+ *
10
+ * INVARIANT across all of these: seconds and milliseconds are ALWAYS zeroed. The
11
+ * controls only ever expose HH:mm, so letting a stray second ride along would make
12
+ * two visually identical values compare unequal on the wire. Holding that through
13
+ * the clamp is what {@link minuteBounds} is for. (NB-DATETIME-01)
14
+ */
15
+ /** Inclusive [min,max] clamp; either bound optional.
16
+ *
17
+ * Returns the BOUND ITSELF when `d` falls outside it, so the seconds invariant
18
+ * above only survives if the bounds are already minute-aligned — pass them
19
+ * through {@link minuteBounds} first for a minute-granular control. */
20
+ export declare function clampToRange(d: Date, min?: Date, max?: Date): Date;
21
+ /** Smallest whole minute >= `d`. Already-aligned values are returned unchanged. */
22
+ export declare function minuteCeil(d: Date): Date;
23
+ /** Largest whole minute <= `d`. */
24
+ export declare function minuteFloor(d: Date): Date;
25
+ /**
26
+ * Minute-aligned bounds for a minute-granular control: `min` rounded UP, `max`
27
+ * rounded DOWN. Both moves are inward, so the aligned window is a subset of the
28
+ * caller's — a value that clamps to an aligned bound is still inside the original
29
+ * one, and it carries no stray seconds.
30
+ *
31
+ * Rounding OUTWARD would be the bug: clamping to a `max` of 17:00:45 emits
32
+ * 17:00:45 while the time input shows "17:00", so two values that look identical
33
+ * differ on the wire.
34
+ *
35
+ * A sub-minute window (e.g. min 17:00:10, max 17:00:50) contains no whole minute,
36
+ * so inward alignment would invert it to 17:01 > 17:00 and clamp a value to 17:01
37
+ * — OUTSIDE the caller's own max. The raw pair is returned unchanged instead: two
38
+ * invariants are in tension there and "never leaves [min,max]" is the one that
39
+ * matters, since a stray second is a cosmetic mismatch while an out-of-range
40
+ * instant is a wrong value on the wire.
41
+ */
42
+ export declare function minuteBounds(min?: Date, max?: Date): {
43
+ min?: Date;
44
+ max?: Date;
45
+ };
46
+ /** "HH:mm" for a Date, "" for null/undefined. */
47
+ export declare function toHhmm(d: Date | null | undefined): string;
48
+ /**
49
+ * `day` with the hours/minutes parsed out of an "HH:mm" string, or `null` when
50
+ * the string is not a valid time — callers no-op on `null`.
51
+ *
52
+ * The parse is STRICT (0-23 / 0-59) on purpose. A lenient `setHours` silently
53
+ * NORMALIZES out-of-range parts instead of rejecting them, so "25:99" would land
54
+ * on the FOLLOWING day at 02:39 — a day-shift the user never asked for, written
55
+ * straight to the wire. Partial garbage is just as bad: "12:xx" would quietly
56
+ * become 12:00. Refusing the value keeps the previous one, which is recoverable;
57
+ * a silently shifted date is not.
58
+ */
59
+ export declare function withTime(day: Date, hhmm: string): Date | null;
60
+ /**
61
+ * `day` carrying `previous`'s HH:mm — the "changing the date must not silently
62
+ * reset the time the user already picked" rule. No previous value means 00:00,
63
+ * which is exactly what a time-less picker emits today.
64
+ */
65
+ export declare function carryTime(day: Date, previous: Date | null | undefined): Date;
66
+ //# sourceMappingURL=dateTime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dateTime.d.ts","sourceRoot":"","sources":["../../src/utils/dateTime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;wEAIwE;AACxE,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAIlE;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAOxC;AAED,mCAAmC;AACnC,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAIzC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG;IAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,CAS/E;AAED,iDAAiD;AACjD,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKzD;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAS7D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAI5E"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * overlayStack.ts — which modal surface currently owns the keyboard.
3
+ *
4
+ * Every modal organism here (Sheet, Dialog, ConfirmDialog) listens for keydown on
5
+ * `document`, so when one is raised BY another — `OrderCreateSheet`'s discard guard
6
+ * opening a ConfirmDialog over its own Sheet — both handlers see the same key. Left
7
+ * alone, Escape dismisses two layers at once and the lower surface's `trapFocus`
8
+ * drags focus out of the upper one (`focusTrap.ts`'s FIX-466 clause pulls focus back
9
+ * in whenever the active element sits outside its container).
10
+ *
11
+ * WHY A STACK AND NOT `event.target.closest('[role=dialog]')`:
12
+ * that was the first attempt, and it has a real race. A modal moves initial focus on
13
+ * a `setTimeout(0)` (deferred so the portal paints first), so between "ConfirmDialog
14
+ * opened" and "focus arrived in it" the event target is still the Sheet underneath —
15
+ * and in that window BOTH handlers ran. Reproduced: one Escape produced
16
+ * `onCancel: 1` AND `onClose("escape")`. Ownership therefore cannot be derived from
17
+ * where focus happens to be; it has to be registered explicitly.
18
+ *
19
+ * Registration order IS stacking order: each surface registers from its `[open]`
20
+ * effect, so the most recently opened one is last and owns the keyboard until it
21
+ * unregisters. Non-modal anchored panels (Select/Combobox/DatePicker — `listbox`
22
+ * and `combobox` roles) deliberately do NOT register: they are not modal layers, so
23
+ * the Sheet keeps owning Tab while one is open and FIX-466's portaled-focusable
24
+ * wrap still applies.
25
+ *
26
+ * BEHAVIOUR NOTE: with two modals open at once, Escape now dismisses only the
27
+ * topmost. Previously both closed on a single press. (NB-SHEET-DISMISS-01)
28
+ */
29
+ /**
30
+ * Registers `el` as the topmost modal surface. Returns the matching unregister —
31
+ * call it from the same effect's cleanup.
32
+ */
33
+ export declare function registerOverlay(el: HTMLElement | null): () => void;
34
+ /**
35
+ * Whether `el` is the modal surface that should handle a keyboard event right now.
36
+ *
37
+ * An empty stack means nothing has registered — the caller handles the key, which
38
+ * keeps every pre-existing single-overlay case behaving exactly as before.
39
+ */
40
+ export declare function isTopmostOverlay(el: HTMLElement | null): boolean;
41
+ //# sourceMappingURL=overlayStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlayStack.d.ts","sourceRoot":"","sources":["../../src/utils/overlayStack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,IAAI,CAUlE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAGhE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nar-bus/ui-kit",
3
- "version": "1.16.0",
3
+ "version": "1.18.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",