@object-ui/plugin-timeline 17.6.0 → 18.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -62,7 +62,7 @@ This plugin automatically registers with ObjectUI's component registry when impo
62
62
  import '@object-ui/plugin-timeline';
63
63
 
64
64
  const schema = {
65
- component: 'timeline',
65
+ type: 'timeline',
66
66
  variant: 'vertical',
67
67
  items: [
68
68
  {
@@ -75,6 +75,62 @@ const schema = {
75
75
  };
76
76
  ```
77
77
 
78
+ ### Object-bound timeline (`object-timeline`)
79
+
80
+ `object-timeline` fetches records from `objectName` and draws one entry per
81
+ record, from the fields its `timeline` config names. An authored node takes its
82
+ props in the `properties` bag, where `@objectstack/spec`'s
83
+ `ComponentPropsMap['object-timeline']` row declares them:
84
+
85
+ ```json
86
+ {
87
+ "type": "object-timeline",
88
+ "properties": {
89
+ "objectName": "project_task",
90
+ "timeline": { "startDateField": "start_date", "titleField": "name" },
91
+ "navigation": { "mode": "drawer" }
92
+ }
93
+ }
94
+ ```
95
+
96
+ The first record source present wins: `items` (authored entries, drawn as
97
+ written), then `data` (pre-fetched records), then a `bind` path, then the query
98
+ on `objectName`. So `objectName` is optional: a timeline drawn from `items`,
99
+ `data` or a `bind` path needs none to draw (entry-click navigation still reads
100
+ it, below), and a node-level `dataSource` binding can supply the object instead. Records are composed into entries through the
101
+ `timeline` block's field bindings (`startDateField`, `endDateField`,
102
+ `titleField`, `groupByField`, `colorField`), each of which outranks the flat
103
+ key of the same binding; `mapping` (`{ title, date, description, variant }`)
104
+ is read where the block leaves a binding unset, and `descriptionField` names
105
+ the description field (`mapping.description` outranks it). `limit` caps the
106
+ query (`$top`, default 100), and `filter` / `sort` lower to `$filter` /
107
+ `$orderby` on it; the rail still draws composed entries by start date.
108
+ `dateFormat` is `short`, `long` or `iso`. Without a `groupByField`, entries
109
+ group into date buckets (Earlier, Today, Tomorrow, This week, Next week, Later,
110
+ No date), and "This week" starts on the first day of the week of the display
111
+ locale: Sunday under `en-US`, Monday under `en-GB` or `zh-CN`. `rowLabel`, `minDate`, `maxDate` and
112
+ `timeline.scale` are read by the gantt branch only, which on this block draws
113
+ authored `items`.
114
+
115
+ `navigation` is what an entry click opens — the spec's `NavigationConfig` by
116
+ reference, `ViewNavigationConfig` in `@object-ui/types`: `mode` (`page`,
117
+ `drawer`, `modal`, `split`, `popover`, `new_window` or `none`) with `size`,
118
+ `openNewTab` and `preventNavigation`. `drawer`, `modal` and `popover` open the
119
+ entry's record in that overlay, `new_window` and `openNewTab: true` open the
120
+ record page in a new tab, `preventNavigation: true` opens nothing, and `size`
121
+ sets the overlay width. `page`, and a block written without `mode` (it takes
122
+ the spec's `page` default), open the record page of the timeline's `objectName`
123
+ through the record navigator the host publishes (the console publishes one on
124
+ its custom pages, record pages and list views); under a host that publishes
125
+ none, such as an embedded renderer, or on a timeline that names no
126
+ `objectName`, the click opens nothing. On a timeline that names no
127
+ `objectName`, `new_window` and `openNewTab: true` open no record page either:
128
+ the tab opens at a slash and the entry's `id` alone (its `_id` when it has no
129
+ `id`, `undefined` when it has neither). A click handler from a parent view
130
+ outranks the whole key. ⚠️ With the key absent a click opens nothing: this renderer supplies no
131
+ drawer default. `split` opens nothing on this block either, because the
132
+ timeline gives the split shell no main panel.
133
+
78
134
  ## Links
79
135
 
80
136
  - 📚 [Documentation](https://www.objectui.org/docs/plugins/plugin-timeline)
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { DataSource, TimelineSchema, ListViewTimelineConfig } from '@object-ui/types';
2
+ import { DataSource, TimelineSchema, ListViewTimelineConfig, ViewNavigationConfig } from '@object-ui/types';
3
3
  /**
4
4
  * Rows fetched when the author declared no `limit`.
5
5
  *
@@ -14,11 +14,58 @@ export interface ObjectTimelineProps {
14
14
  schema: TimelineSchema & {
15
15
  objectName?: string;
16
16
  /**
17
- * Spec-compliant nested timeline config. Typed as `ListViewTimelineConfig`
18
- * — the spec shape plus the legacy `dateField` alias that `@object-ui/types`
19
- * has always declared on it, and that this renderer now actually reads.
17
+ * The nested timeline block. `ListViewTimelineConfig` is
18
+ * `NonNullable<ListViewSchema['timeline']>` since objectui#6152 round 12
19
+ * (seat answer Q2 → B): the `@objectstack/spec` list-view slot by reference,
20
+ * strict and `.partial()`, with the legacy `dateField` refused by name
21
+ * (write `startDateField`). It is what this component receives on both
22
+ * routes: an authored `object-timeline` node's block (judged by the spec's
23
+ * element row) and the block `ListView` builds, which can leave out
24
+ * `titleField` or `startDateField`. It was the spec's `TimelineConfig` plus
25
+ * `dateField?: string` and a string index signature of `any`.
20
26
  */
21
27
  timeline?: ListViewTimelineConfig;
28
+ /**
29
+ * Entry-click navigation — what a click on an entry opens (an overlay
30
+ * mode, the record page in a new tab, or nothing), with the overlay `size`
31
+ * and the `openNewTab` / `preventNavigation` flags. Handed to
32
+ * `useNavigationOverlay` below, which the composed `onItemClick` fires.
33
+ *
34
+ * DECLARED by objectui#8654, the timeline arm of the objectui#8652
35
+ * maintainer ruling, verbatim 「B」: the platform half is
36
+ * `@objectstack/spec` 17.5.0, whose `ComponentPropsMap['object-timeline']`
37
+ * row declares `navigation: NavigationConfigSchema.optional()` for this
38
+ * block standalone, with no enclosing view. So this member follows the
39
+ * installed spec rather than leading it. Before it, the read went through
40
+ * an `as any` cast, and without the cast it would have compiled only
41
+ * through `BaseSchema`'s `[key: string]: any`.
42
+ *
43
+ * Declared HERE, beside `objectName`, `timeline`, `filter` and `sort`,
44
+ * rather than on `TimelineSchema` in `@object-ui/types`, and that is the
45
+ * spec's own split: `TimelineSchema` is the presentational rail, whose
46
+ * renderer never reads this key, while the spec declares it on the
47
+ * object-bound `object-timeline` row only. That row's other members live
48
+ * on this half for the same reason. The zod face of the row is
49
+ * `ObjectTimelineBlockSchema`'s `properties` bag, which reads the spec row
50
+ * by reference and so judges this key already.
51
+ *
52
+ * Same spec type as `ObjectKanbanSchema.navigation` and
53
+ * `ObjectCalendarSchema.navigation` — aligned with `@objectstack/spec`
54
+ * `NavigationConfig` rather than restated, so the vocabulary cannot fork.
55
+ *
56
+ * ⚠️ Unlike the board and the calendar, this renderer supplies NO default
57
+ * for an ABSENT key, and an absent key is not a `page` block: the hook's
58
+ * no-config branch hands the click to an `onNavigate` alone, which this
59
+ * component never passes, and never reads the host's record navigator. So
60
+ * a click opens nothing, under a host that publishes a navigator too. A
61
+ * block written without `mode` (`{ size: 'lg' }`) is different: it takes
62
+ * the spec's `page` default and opens the record page through that
63
+ * navigator (objectui#11293). A parent's `onRowClick` / `onItemClick`
64
+ * outranks the whole key. The members are pinned in
65
+ * `__tests__/timelineNavigationMembers-8654.test.tsx`, and the absent key
66
+ * against the mode-less block in `__tests__/objectTimelineInputs-11168.test.tsx`.
67
+ */
68
+ navigation?: ViewNavigationConfig;
22
69
  /**
23
70
  * Query filter for the object fetch, in any shape `toFilterNode` accepts
24
71
  * (spec `ViewFilterRule[]`, ObjectQL AST nodes, or a MongoDB-style object).
@@ -31,10 +78,11 @@ export interface ObjectTimelineProps {
31
78
  */
32
79
  filter?: any[] | Record<string, any>;
33
80
  /**
34
- * Query ordering — the legacy `"name desc"` clause or the spec's
35
- * `SortConfig[]`, both lowered through `convertSortToQueryParams`.
81
+ * Query ordering — the spec's `SortConfig[]`, lowered through
82
+ * `convertSortToQueryParams`. The legacy `"name desc"` clause is RETIRED
83
+ * (objectui#8221) and that sink refuses it out loud.
36
84
  */
37
- sort?: string | Array<{
85
+ sort?: Array<{
38
86
  field?: string;
39
87
  order?: 'asc' | 'desc';
40
88
  }>;
@@ -68,8 +116,23 @@ export interface ObjectTimelineProps {
68
116
  };
69
117
  dataSource?: DataSource;
70
118
  className?: string;
71
- onRowClick?: (record: any) => void;
72
- onItemClick?: (record: any) => void;
119
+ /**
120
+ * TWO parameters since objectui#9357, and the second is not decoration: this
121
+ * prop reaches `useNavigationOverlay` as its `onRowClick`, and `handleClick`
122
+ * invokes it as `onRowClick(record, event)` — the modifier payload a host
123
+ * needs to implement Cmd/Ctrl/middle-click for itself. Declaring one
124
+ * parameter hid the second on the ONE line a host reads. Spelled `any` and
125
+ * not `HandleClickModifiers` for the reason objectui#9341 measured on
126
+ * `ObjectKanbanSchema.onCardClick`: that interface lives in
127
+ * `@object-ui/react`, the published twins in `@object-ui/types` may not name
128
+ * it, and a host that discovered the payload from the implementation
129
+ * annotated it `React.MouseEvent` — which a narrower declaration refuses
130
+ * contravariantly. `BaseSchema`'s own `onClick` / `onChange` / `onSubmit`
131
+ * already use this spelling for exactly this situation.
132
+ */
133
+ onRowClick?: (record: any, event?: any) => void;
134
+ /** The other arm of the same `??` that feeds the hook — see `onRowClick` above (objectui#9357). */
135
+ onItemClick?: (record: any, event?: any) => void;
73
136
  }
74
137
  export declare const ObjectTimeline: React.FC<ObjectTimelineProps>;
75
138
  //# sourceMappingURL=ObjectTimeline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectTimeline.d.ts","sourceRoot":"","sources":["../src/ObjectTimeline.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAoD,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAS3F;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAuB1C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,GAAG;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB;;;;WAIG;QACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;QAClC;;;;;;;;;WASG;QACH,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACrC;;;WAGG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;SAAE,CAAC,CAAC;QAClE;;;;WAIG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,sDAAsD;QACtD,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,sDAAsD;QACtD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,oDAAoD;QACpD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,oDAAoD;QACpD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,6CAA6C;QAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;QAE/D,OAAO,CAAC,EAAE;YACR,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAA;KACF,CAAC;IACF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA0WxD,CAAA"}
1
+ {"version":3,"file":"ObjectTimeline.d.ts","sourceRoot":"","sources":["../src/ObjectTimeline.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAWjH;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AA6I1C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,GAAG;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB;;;;;;;;;;WAUG;QACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;QAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAuCG;QACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;QAClC;;;;;;;;;WASG;QACH,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACrC;;;;WAIG;QACH,IAAI,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;SAAE,CAAC,CAAC;QACzD;;;;WAIG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,sDAAsD;QACtD,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,sDAAsD;QACtD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,oDAAoD;QACpD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,oDAAoD;QACpD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,6CAA6C;QAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;QAE/D,OAAO,CAAC,EAAE;YACR,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAA;KACF,CAAC;IACF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAChD,mGAAmG;IACnG,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CAClD;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA2wBxD,CAAA"}
package/dist/index.d.ts CHANGED
@@ -40,8 +40,8 @@ declare const TimelineGanttBar: React.ForwardRefExoticComponent<React.HTMLAttrib
40
40
  } & React.RefAttributes<HTMLDivElement>>;
41
41
  declare const TimelineGanttBarContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
42
42
  export { Timeline, TimelineItem, timelineItemVariants, TimelineMarker, timelineMarkerVariants, TimelineContent, TimelineTitle, TimelineTime, TimelineDescription, TimelineHorizontal, TimelineHorizontalItem, TimelineGantt, TimelineGanttHeader, TimelineGanttRowLabels, TimelineGanttGrid, TimelineGanttRow, TimelineGanttLabel, TimelineGanttBar, TimelineGanttBarContent, };
43
- export * from './renderer';
44
- export { ObjectTimeline } from './ObjectTimeline';
45
- export type { ObjectTimelineProps } from './ObjectTimeline';
43
+ export * from './renderer.js';
44
+ export { ObjectTimeline } from './ObjectTimeline.js';
45
+ export type { ObjectTimelineProps } from './ObjectTimeline.js';
46
46
  export declare const ObjectTimelineRenderer: React.FC<any>;
47
47
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,QAAA,MAAM,QAAQ,iHASZ,CAAA;AAGF,QAAA,MAAM,oBAAoB;;8EASxB,CAAA;AAEF,QAAA,MAAM,YAAY;;qHAShB,CAAA;AAGF,QAAA,MAAM,sBAAsB;;8EAiB3B,CAAA;AAED,KAAK,qBAAqB,GAAG,YAAY,CAAC,OAAO,sBAAsB,CAAC,CAAC,SAAS,CAAC,CAAA;AAEnF,QAAA,MAAM,cAAc;cAGN,qBAAqB;wCAUjC,CAAA;AAGF,QAAA,MAAM,eAAe,6GASnB,CAAA;AAGF,QAAA,MAAM,aAAa,qHASjB,CAAA;AAGF,QAAA,MAAM,YAAY,mHAShB,CAAA;AAGF,QAAA,MAAM,mBAAmB,yHASvB,CAAA;AAIF,QAAA,MAAM,kBAAkB,6GAStB,CAAA;AAGF,QAAA,MAAM,sBAAsB,6GAS1B,CAAA;AAIF,QAAA,MAAM,aAAa,6GASjB,CAAA;AAGF,QAAA,MAAM,mBAAmB,6GASvB,CAAA;AAGF,QAAA,MAAM,sBAAsB,6GAS1B,CAAA;AAGF,QAAA,MAAM,iBAAiB,6GASrB,CAAA;AAGF,QAAA,MAAM,gBAAgB,6GASpB,CAAA;AAGF,QAAA,MAAM,kBAAkB,6GAStB,CAAA;AAGF,QAAA,MAAM,gBAAgB;YAGV,MAAM;YACN,MAAM;cACJ,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM;wCA0BjE,CAAA;AAGF,QAAA,MAAM,uBAAuB,6GAS3B,CAAA;AAGF,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,GACxB,CAAA;AAGD,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAiC5D,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAiBhD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,QAAA,MAAM,QAAQ,iHASZ,CAAA;AAGF,QAAA,MAAM,oBAAoB;;8EASxB,CAAA;AAEF,QAAA,MAAM,YAAY;;qHAShB,CAAA;AAGF,QAAA,MAAM,sBAAsB;;8EAiB3B,CAAA;AAED,KAAK,qBAAqB,GAAG,YAAY,CAAC,OAAO,sBAAsB,CAAC,CAAC,SAAS,CAAC,CAAA;AAEnF,QAAA,MAAM,cAAc;cAGN,qBAAqB;wCAUjC,CAAA;AAGF,QAAA,MAAM,eAAe,6GASnB,CAAA;AAGF,QAAA,MAAM,aAAa,qHASjB,CAAA;AAGF,QAAA,MAAM,YAAY,mHAShB,CAAA;AAGF,QAAA,MAAM,mBAAmB,yHASvB,CAAA;AAIF,QAAA,MAAM,kBAAkB,6GAStB,CAAA;AAGF,QAAA,MAAM,sBAAsB,6GAS1B,CAAA;AAIF,QAAA,MAAM,aAAa,6GASjB,CAAA;AAGF,QAAA,MAAM,mBAAmB,6GASvB,CAAA;AAGF,QAAA,MAAM,sBAAsB,6GAS1B,CAAA;AAGF,QAAA,MAAM,iBAAiB,6GASrB,CAAA;AAGF,QAAA,MAAM,gBAAgB,6GASpB,CAAA;AAGF,QAAA,MAAM,kBAAkB,6GAStB,CAAA;AAGF,QAAA,MAAM,gBAAgB;YAGV,MAAM;YACN,MAAM;cACJ,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM;wCA0BjE,CAAA;AAGF,QAAA,MAAM,uBAAuB,6GAS3B,CAAA;AAGF,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,GACxB,CAAA;AAGD,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAmC5D,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAqB/C,CAAC"}