@sigx/zero-daisyui 0.2.0-beta.5 → 0.2.0-beta.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sigx/zero-daisyui",
3
- "version": "0.2.0-beta.5",
3
+ "version": "0.2.0-beta.6",
4
4
  "description": "DaisyUI-flavored design system for SignalX Zero — daisy's token values and component look as a pure tokens+recipes skin over @sigx/zero primitives. No Tailwind, no daisyUI plugin required.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -44,12 +44,12 @@
44
44
  "url": "https://github.com/andtii/zero-wip/issues"
45
45
  },
46
46
  "peerDependencies": {
47
- "@sigx/zero": "^0.2.0-beta.5"
47
+ "@sigx/zero": "^0.2.0-beta.6"
48
48
  },
49
49
  "devDependencies": {
50
50
  "typescript": "^6.0.3",
51
- "@sigx/zero": "^0.2.0-beta.5",
52
- "@sigx/zero-kit": "^0.2.0-beta.5"
51
+ "@sigx/zero": "^0.2.0-beta.6",
52
+ "@sigx/zero-kit": "^0.2.0-beta.6"
53
53
  },
54
54
  "publishConfig": {
55
55
  "access": "public"
package/src/recipes.ts CHANGED
@@ -919,6 +919,26 @@ const btnSizes: Record<string, Record<string, PartStyles>> = {
919
919
  xl: { trigger: { base: { height: fieldHeight('xl'), paddingInline: 'calc(var(--size-field) * 6)', fontSize: 'var(--text-lg)' } } },
920
920
  };
921
921
 
922
+ /**
923
+ * `btn`'s inline padding restated physically, for the `targets.lynx`
924
+ * sections of every btn-wearing recipe: logical spellings resolve on iOS but
925
+ * not on Android (measured, signalxjs/lynx#1084), so the lynx emitter
926
+ * refuses `padding-inline`. Physical is that target's norm — lynx has no
927
+ * RTL flow for the logical spelling to flip with.
928
+ */
929
+ const lynxBtnPad = (mult: number): NonNullable<PartStyles['base']> => ({
930
+ paddingLeft: `calc(var(--size-field) * ${mult})`,
931
+ paddingRight: `calc(var(--size-field) * ${mult})`,
932
+ });
933
+
934
+ /** The btn size ramp's physical inline padding, for `targets.lynx.variants`. */
935
+ const lynxBtnSizes = (part: string): Record<string, Record<string, PartStyles>> => ({
936
+ xs: { [part]: { base: lynxBtnPad(2) } },
937
+ sm: { [part]: { base: lynxBtnPad(3) } },
938
+ lg: { [part]: { base: lynxBtnPad(5) } },
939
+ xl: { [part]: { base: lynxBtnPad(6) } },
940
+ });
941
+
922
942
  export const dialog: RecipeInput = {
923
943
  component: 'dialog',
924
944
  keyframes: {
@@ -999,6 +1019,19 @@ export const dialog: RecipeInput = {
999
1019
  // Trigger-carried axes — see `btnColors` for why the popup is out of
1000
1020
  // reach and the trigger is the whole story here.
1001
1021
  variants: { color: btnColors(), size: btnSizes },
1022
+ // The btn paddings and the footer's push-down, restated physically —
1023
+ // see `lynxBtnPad` for the #1084 verdict this answers.
1024
+ targets: {
1025
+ lynx: {
1026
+ parts: {
1027
+ trigger: { base: lynxBtnPad(4) },
1028
+ close: { base: lynxBtnPad(4) },
1029
+ cancel: { base: lynxBtnPad(4) },
1030
+ footer: { base: { marginTop: '1.5rem' } },
1031
+ },
1032
+ variants: { size: lynxBtnSizes('trigger') },
1033
+ },
1034
+ },
1002
1035
  };
1003
1036
 
1004
1037
  // daisy "dropdown-content"/card look for floating panels.
@@ -1041,6 +1074,16 @@ export const popover: RecipeInput = {
1041
1074
  },
1042
1075
  // Trigger-carried axes — same wiring as dialog, same reason.
1043
1076
  variants: { color: btnColors(), size: btnSizes },
1077
+ // The btn paddings, restated physically — see `lynxBtnPad` (#1084).
1078
+ targets: {
1079
+ lynx: {
1080
+ parts: {
1081
+ trigger: { base: lynxBtnPad(4) },
1082
+ close: { base: lynxBtnPad(3) },
1083
+ },
1084
+ variants: { size: lynxBtnSizes('trigger') },
1085
+ },
1086
+ },
1044
1087
  };
1045
1088
 
1046
1089
  export const tooltip: RecipeInput = {
@@ -1077,6 +1120,13 @@ export const tooltip: RecipeInput = {
1077
1120
  // Trigger-carried axes — same wiring as dialog, same reason. The bubble
1078
1121
  // stays daisy's neutral tooltip whatever the trigger's colour.
1079
1122
  variants: { color: btnColors(), size: btnSizes },
1123
+ // The btn paddings, restated physically — see `lynxBtnPad` (#1084).
1124
+ targets: {
1125
+ lynx: {
1126
+ parts: { trigger: { base: lynxBtnPad(4) } },
1127
+ variants: { size: lynxBtnSizes('trigger') },
1128
+ },
1129
+ },
1080
1130
  };
1081
1131
 
1082
1132
  // daisy "menu in a dropdown" look.
@@ -1223,6 +1273,13 @@ export const menu: RecipeInput = {
1223
1273
  // Trigger-carried axes — same wiring as dialog, same reason. The dropdown
1224
1274
  // and its items are top-layer siblings the donut cannot reach.
1225
1275
  variants: { color: btnColors(), size: btnSizes },
1276
+ // The btn paddings, restated physically — see `lynxBtnPad` (#1084).
1277
+ targets: {
1278
+ lynx: {
1279
+ parts: { trigger: { base: lynxBtnPad(4) } },
1280
+ variants: { size: lynxBtnSizes('trigger') },
1281
+ },
1282
+ },
1226
1283
  };
1227
1284
 
1228
1285
  export const field: RecipeInput = {
@@ -1510,7 +1567,23 @@ export const checkbox: RecipeInput = {
1510
1567
  // The tick's fill: the control's `color:` names
1511
1568
  // `--checkbox-on-accent`, and `currentColor` was that
1512
1569
  // ink by inheritance — spend it directly.
1513
- base: { backgroundColor: 'var(--checkbox-on-accent)' },
1570
+ //
1571
+ // The tick's motion, restated as `transform`: the
1572
+ // standalone `rotate`/`translate` properties resolve on
1573
+ // iOS but not on Android (measured, signalxjs/lynx#1084),
1574
+ // so the emitter refuses them. `transform` functions are
1575
+ // proven on both platforms — and the transition follows
1576
+ // the property that now moves.
1577
+ base: {
1578
+ backgroundColor: 'var(--checkbox-on-accent)',
1579
+ transform: 'rotate(45deg)',
1580
+ transition: 'clip-path var(--duration-slow) var(--ease-standard) var(--duration-instant), '
1581
+ + 'opacity var(--duration-instant) var(--ease-standard) var(--duration-instant), '
1582
+ + 'transform var(--duration-slow) var(--ease-standard) var(--duration-instant)',
1583
+ },
1584
+ // The order matches the standalone properties' fixed
1585
+ // apply order (translate, then rotate).
1586
+ states: { indeterminate: { transform: 'translateY(-35%) rotate(0deg)' } },
1514
1587
  },
1515
1588
  },
1516
1589
  },
@@ -1762,6 +1835,18 @@ export const progress: RecipeInput = {
1762
1835
  // other way.
1763
1836
  'zero-daisy-indeterminate': 'from { margin-inline-start: -40%; } to { margin-inline-start: 100%; }',
1764
1837
  },
1838
+ // The same sweep with a physical margin: logical spellings resolve on
1839
+ // iOS but not on Android (measured, signalxjs/lynx#1084), so the emitter
1840
+ // refuses the shared keyframes. Physical is the lynx target's norm — no
1841
+ // RTL flow there for the sweep to mirror with. Keyframes merge per name,
1842
+ // so this REPLACES the shared animation on lynx.
1843
+ targets: {
1844
+ lynx: {
1845
+ keyframes: {
1846
+ 'zero-daisy-indeterminate': 'from { margin-left: -40%; } to { margin-left: 100%; }',
1847
+ },
1848
+ },
1849
+ },
1765
1850
  };
1766
1851
 
1767
1852
  export const slider: RecipeInput = {
@@ -1887,6 +1972,22 @@ export const slider: RecipeInput = {
1887
1972
  targets: {
1888
1973
  lynx: {
1889
1974
  parts: {
1975
+ track: {
1976
+ // The web track's `margin-block` breathing room,
1977
+ // restated physically: logical spellings resolve on iOS
1978
+ // but not on Android (measured, signalxjs/lynx#1084), so
1979
+ // the emitter refuses them. Physical is the lynx
1980
+ // target's norm — no RTL flow there.
1981
+ base: {
1982
+ marginTop: 'calc(var(--size-selector) * 1.5)',
1983
+ marginBottom: 'calc(var(--size-selector) * 1.5)',
1984
+ },
1985
+ },
1986
+ mark: {
1987
+ // Same #1084 verdict: the tick labels hang below the
1988
+ // track off a physical padding.
1989
+ base: { paddingTop: 'calc(var(--size-selector) * 2 + var(--space-2xs))' },
1990
+ },
1890
1991
  range: {
1891
1992
  // The web fill deepens the accent 90/10 toward
1892
1993
  // base-content (`progressFill`'s recipe); the plain
@@ -1910,9 +2011,20 @@ export const slider: RecipeInput = {
1910
2011
  // thumb — a native-input trick with no lynx equivalent;
1911
2012
  // the composed `.zx-slider__range` box above IS that
1912
2013
  // fill here, so the knob only needs its own two paints.
2014
+ //
2015
+ // The centering geometry is restated physically beside
2016
+ // the paint: `inset-block-start`/`translate`/
2017
+ // `margin-inline-start` resolve on iOS but not on
2018
+ // Android (measured, signalxjs/lynx#1084 — the knob sat
2019
+ // off-center there), so the emitter refuses them.
2020
+ // `top` + `transform: translateY()` + `margin-left` are
2021
+ // proven on both platforms.
1913
2022
  base: {
1914
2023
  background: 'var(--color-base-100)',
1915
2024
  border: '0.25rem solid var(--slider-accent)',
2025
+ top: '50%',
2026
+ transform: 'translateY(-50%)',
2027
+ marginLeft: 'calc(var(--size-selector) * -2.5)',
1916
2028
  },
1917
2029
  },
1918
2030
  },
@@ -2133,6 +2245,17 @@ export const select: RecipeInput = {
2133
2245
  // Base equals the default (`tokens:` accent, `fieldControl`'s md height),
2134
2246
  // so the twins restate it; declared for the manifest (signalxjs/lynx#1070).
2135
2247
  defaultVariants: { color: 'primary', size: 'md' },
2248
+ // The btn paddings, restated physically — see `lynxBtnPad` (#1084).
2249
+ // The trigger ramp restates `md` too (unlike `btnSizes`), so its lynx
2250
+ // counterpart does as well.
2251
+ targets: {
2252
+ lynx: {
2253
+ parts: { trigger: { base: lynxBtnPad(4) } },
2254
+ variants: {
2255
+ size: { ...lynxBtnSizes('trigger'), md: { trigger: { base: lynxBtnPad(4) } } },
2256
+ },
2257
+ },
2258
+ },
2136
2259
  };
2137
2260
 
2138
2261
 
@@ -2362,6 +2485,17 @@ export const button: RecipeInput = {
2362
2485
  },
2363
2486
  defaultVariants: { color: 'primary', variant: 'solid', size: 'md' },
2364
2487
  keyframes: { 'zero-daisyui-btn-spin': 'to { transform: rotate(360deg) }' },
2488
+ // The icon chips' zeroed inline padding, restated physically: logical
2489
+ // spellings resolve on iOS but not on Android (measured,
2490
+ // signalxjs/lynx#1084), so the emitter refuses them.
2491
+ targets: {
2492
+ lynx: {
2493
+ modifiers: {
2494
+ square: { root: { base: { paddingLeft: '0', paddingRight: '0' } } },
2495
+ circle: { root: { base: { paddingLeft: '0', paddingRight: '0' } } },
2496
+ },
2497
+ },
2498
+ },
2365
2499
  };
2366
2500
 
2367
2501
  export const avatar: RecipeInput = {
@@ -2589,6 +2723,24 @@ export const toast: RecipeInput = {
2589
2723
  // signalxjs/lynx#1070. No `color` default: the un-attributed toast is a
2590
2724
  // neutral base-200 surface, outside the color vocabulary.
2591
2725
  defaultVariants: { size: 'md' },
2726
+ // The corner placements' physical anchors: logical inset spellings
2727
+ // resolve on iOS but not on Android (measured, signalxjs/lynx#1084), so
2728
+ // the emitter refuses them. Physical is the lynx target's norm — no RTL
2729
+ // flow there, so `start` IS left and `end` IS right.
2730
+ targets: {
2731
+ lynx: {
2732
+ parts: {
2733
+ viewport: {
2734
+ selectors: {
2735
+ '&[data-placement="top-start"]': { left: '0' },
2736
+ '&[data-placement="top-end"]': { right: '0' },
2737
+ '&[data-placement="bottom-start"]': { left: '0' },
2738
+ '&[data-placement="bottom-end"]': { right: '0' },
2739
+ },
2740
+ },
2741
+ },
2742
+ },
2743
+ },
2592
2744
  };
2593
2745
 
2594
2746
  export const combobox: RecipeInput = {
@@ -3071,6 +3223,17 @@ export const numberInput: RecipeInput = {
3071
3223
  xl: { control: { base: { height: fieldHeight('xl') } }, input: { base: { fontSize: 'var(--text-lg)', padding: 'var(--space-lg) var(--space-xl)' } } },
3072
3224
  },
3073
3225
  },
3226
+ // The steppers' inline padding, restated physically: logical spellings
3227
+ // resolve on iOS but not on Android (measured, signalxjs/lynx#1084), so
3228
+ // the emitter refuses them.
3229
+ targets: {
3230
+ lynx: {
3231
+ parts: {
3232
+ 'increment-trigger': { base: { paddingLeft: 'var(--space-lg)', paddingRight: 'var(--space-lg)' } },
3233
+ 'decrement-trigger': { base: { paddingLeft: 'var(--space-lg)', paddingRight: 'var(--space-lg)' } },
3234
+ },
3235
+ },
3236
+ },
3074
3237
  };
3075
3238
 
3076
3239
  /**
@@ -3368,6 +3531,16 @@ export const treeView: RecipeInput = {
3368
3531
  xl: { root: { base: { '--tree-text': 'var(--text-lg)' } } },
3369
3532
  },
3370
3533
  },
3534
+ // The indent, restated physically: logical spellings resolve on iOS but
3535
+ // not on Android (measured, signalxjs/lynx#1084), so the emitter refuses
3536
+ // them. Physical is the lynx target's norm — no RTL flow there.
3537
+ targets: {
3538
+ lynx: {
3539
+ parts: {
3540
+ 'branch-content': { base: { paddingLeft: 'var(--space-lg)' } },
3541
+ },
3542
+ },
3543
+ },
3371
3544
  };
3372
3545
 
3373
3546
  /**
@@ -3590,6 +3763,26 @@ export const nativeSelect: RecipeInput = {
3590
3763
  xl: { control: { base: { height: fieldHeight('xl'), fontSize: 'var(--text-lg)', padding: 'var(--space-lg) var(--space-xl)', paddingInlineEnd: 'calc(var(--space-xl) + 1.25em)' } } },
3591
3764
  },
3592
3765
  },
3766
+ // The chevron gutter and the indicator anchor, restated physically:
3767
+ // logical spellings resolve on iOS but not on Android (measured,
3768
+ // signalxjs/lynx#1084), so the emitter refuses them. Physical is the
3769
+ // lynx target's norm — no RTL flow there, so `end` IS right.
3770
+ targets: {
3771
+ lynx: {
3772
+ parts: {
3773
+ control: { base: { paddingRight: 'calc(var(--space-md) + 1.25em)' } },
3774
+ indicator: { base: { right: 'var(--space-md)' } },
3775
+ },
3776
+ variants: {
3777
+ size: {
3778
+ xs: { control: { base: { paddingRight: 'calc(var(--space-xs) + 1.25em)' } } },
3779
+ sm: { control: { base: { paddingRight: 'calc(var(--space-sm) + 1.25em)' } } },
3780
+ lg: { control: { base: { paddingRight: 'calc(var(--space-lg) + 1.25em)' } } },
3781
+ xl: { control: { base: { paddingRight: 'calc(var(--space-xl) + 1.25em)' } } },
3782
+ },
3783
+ },
3784
+ },
3785
+ },
3593
3786
  };
3594
3787
 
3595
3788
  // ── Content tier (#311) ───────────────────────────────────────────────────
@@ -4063,6 +4256,30 @@ export const indicator: RecipeInput = {
4063
4256
  xl: { item: { base: { fontSize: 'var(--text-lg)' } } },
4064
4257
  },
4065
4258
  },
4259
+ // The corner slots, restated physically: logical inset spellings and the
4260
+ // standalone `translate` property resolve on iOS but not on Android
4261
+ // (measured, signalxjs/lynx#1084), so the emitter refuses them. Physical
4262
+ // anchors plus `transform: translate()` are proven on both platforms,
4263
+ // and physical is the lynx target's norm — no RTL flow there, so the
4264
+ // hand-flipped RTL rules above have nothing to engage with either.
4265
+ targets: {
4266
+ lynx: {
4267
+ parts: {
4268
+ item: {
4269
+ selectors: {
4270
+ '&[data-placement="top-start"]': { top: '0', left: '0', transform: 'translate(-50%, -50%)' },
4271
+ '&[data-placement="top"]': { top: '0', left: '50%', transform: 'translate(-50%, -50%)' },
4272
+ '&[data-placement="top-end"]': { top: '0', right: '0', transform: 'translate(50%, -50%)' },
4273
+ '&[data-placement="start"]': { top: '50%', left: '0', transform: 'translate(-50%, -50%)' },
4274
+ '&[data-placement="end"]': { top: '50%', right: '0', transform: 'translate(50%, -50%)' },
4275
+ '&[data-placement="bottom-start"]': { bottom: '0', left: '0', transform: 'translate(-50%, 50%)' },
4276
+ '&[data-placement="bottom"]': { bottom: '0', left: '50%', transform: 'translate(-50%, 50%)' },
4277
+ '&[data-placement="bottom-end"]': { bottom: '0', right: '0', transform: 'translate(50%, 50%)' },
4278
+ },
4279
+ },
4280
+ },
4281
+ },
4282
+ },
4066
4283
  };
4067
4284
 
4068
4285
  /** daisy stats: the rounded base-100 panel with rule-thin item joins. */
@@ -4383,6 +4600,16 @@ export const chat: RecipeInput = {
4383
4600
  xl: { bubble: { base: { fontSize: 'var(--text-lg)', padding: 'var(--space-md) var(--space-xl)' } } },
4384
4601
  },
4385
4602
  },
4603
+ // The row's vertical padding, restated physically: logical spellings
4604
+ // resolve on iOS but not on Android (measured, signalxjs/lynx#1084), so
4605
+ // the emitter refuses them.
4606
+ targets: {
4607
+ lynx: {
4608
+ parts: {
4609
+ root: { base: { paddingTop: 'var(--space-2xs)', paddingBottom: 'var(--space-2xs)' } },
4610
+ },
4611
+ },
4612
+ },
4386
4613
  };
4387
4614
 
4388
4615
  /** daisy radial-progress: --value became --progress-percent; same ring. */
@@ -4839,6 +5066,16 @@ export const pagination: RecipeInput = {
4839
5066
  xl: { root: { base: { '--pg-size': 'calc(var(--size-field) * 14)', '--pg-font': 'var(--text-lg)' } } },
4840
5067
  },
4841
5068
  },
5069
+ // The cell's inline padding, restated physically: logical spellings
5070
+ // resolve on iOS but not on Android (measured, signalxjs/lynx#1084), so
5071
+ // the emitter refuses them.
5072
+ targets: {
5073
+ lynx: {
5074
+ parts: {
5075
+ item: { base: { paddingLeft: 'var(--space-2xs)', paddingRight: 'var(--space-2xs)' } },
5076
+ },
5077
+ },
5078
+ },
4842
5079
  };
4843
5080
 
4844
5081
  /**
@@ -4986,6 +5223,34 @@ export const steps: RecipeInput = {
4986
5223
  xl: { root: { base: { '--steps-ind': 'calc(var(--size-selector) * 9)', '--steps-font': 'var(--text-md)' } } },
4987
5224
  },
4988
5225
  },
5226
+ // The bridge's anchors and the vertical item's tail padding, restated
5227
+ // physically: logical spellings resolve on iOS but not on Android
5228
+ // (measured, signalxjs/lynx#1084), so the emitter refuses them. Physical
5229
+ // is the lynx target's norm — no RTL flow there to mirror with.
5230
+ targets: {
5231
+ lynx: {
5232
+ parts: {
5233
+ item: {
5234
+ selectors: {
5235
+ '&[data-orientation="vertical"]': { paddingBottom: 'var(--space-lg)' },
5236
+ },
5237
+ },
5238
+ separator: {
5239
+ selectors: {
5240
+ '&[data-orientation="horizontal"]': {
5241
+ top: 'calc(var(--space-xs) + var(--steps-ind) / 2)',
5242
+ left: '50%',
5243
+ },
5244
+ '&[data-orientation="vertical"]': {
5245
+ left: 'calc(var(--space-xs) + (var(--steps-ind) - var(--border)) / 2)',
5246
+ top: 'calc(var(--space-xs) + var(--steps-ind))',
5247
+ bottom: 'calc(var(--space-xs) * -1)',
5248
+ },
5249
+ },
5250
+ },
5251
+ },
5252
+ },
5253
+ },
4989
5254
  };
4990
5255
 
4991
5256
  /**
@@ -5059,6 +5324,16 @@ export const drawer: RecipeInput = {
5059
5324
  // Trigger-carried axes — see `btnColors` for why the panel is out of
5060
5325
  // reach and the trigger is the whole story here.
5061
5326
  variants: { color: btnColors(), size: btnSizes },
5327
+ // The btn paddings, restated physically — see `lynxBtnPad` (#1084).
5328
+ targets: {
5329
+ lynx: {
5330
+ parts: {
5331
+ trigger: { base: lynxBtnPad(4) },
5332
+ close: { base: lynxBtnPad(4) },
5333
+ },
5334
+ variants: { size: lynxBtnSizes('trigger') },
5335
+ },
5336
+ },
5062
5337
  };
5063
5338
 
5064
5339
  /**
@@ -5449,6 +5724,22 @@ export const carousel: RecipeInput = {
5449
5724
  xl: { root: { base: { '--carousel-dot': '0.875rem', '--carousel-nav': '3rem' } } },
5450
5725
  },
5451
5726
  },
5727
+ // The nav buttons' anchors, restated physically: logical inset
5728
+ // spellings resolve on iOS but not on Android (measured,
5729
+ // signalxjs/lynx#1084), so the emitter refuses them. Physical is the
5730
+ // lynx target's norm — no RTL flow there, so `start` IS left.
5731
+ targets: {
5732
+ lynx: {
5733
+ parts: {
5734
+ 'prev-trigger': {
5735
+ base: { top: 'calc(50% - var(--carousel-nav) / 2)', left: 'var(--space-sm)' },
5736
+ },
5737
+ 'next-trigger': {
5738
+ base: { top: 'calc(50% - var(--carousel-nav) / 2)', right: 'var(--space-sm)' },
5739
+ },
5740
+ },
5741
+ },
5742
+ },
5452
5743
  };
5453
5744
 
5454
5745
  /**
@@ -5693,6 +5984,21 @@ export const diff: RecipeInput = {
5693
5984
  },
5694
5985
  },
5695
5986
  },
5987
+ // The reveal pane's pin and the handle's centering margin, restated
5988
+ // physically: logical spellings resolve on iOS but not on Android
5989
+ // (measured, signalxjs/lynx#1084), so the emitter refuses them.
5990
+ // Physical is the lynx target's norm — no RTL flow there to mirror
5991
+ // with.
5992
+ lynx: {
5993
+ parts: {
5994
+ after: {
5995
+ base: { top: '0', bottom: '0', left: '0' },
5996
+ },
5997
+ handle: {
5998
+ base: { top: '0', bottom: '0', marginLeft: 'calc(var(--diff-hit) / -2)' },
5999
+ },
6000
+ },
6001
+ },
5696
6002
  },
5697
6003
  };
5698
6004