@limonify/zest-ui 0.2.0 → 0.3.1
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/lib/checkbox/index.d.ts +1 -0
- package/lib/checkbox/index.d.ts.map +1 -1
- package/lib/checkbox/index.js +3 -1
- package/lib/checkbox/index.js.map +1 -1
- package/lib/collapsible/panel/useCollapsiblePanel.d.ts.map +1 -1
- package/lib/collapsible/panel/useCollapsiblePanel.js +9 -1
- package/lib/collapsible/panel/useCollapsiblePanel.js.map +1 -1
- package/lib/dialog/index.d.ts +1 -0
- package/lib/dialog/index.d.ts.map +1 -1
- package/lib/dialog/index.js +3 -1
- package/lib/dialog/index.js.map +1 -1
- package/lib/radio/index.d.ts +1 -0
- package/lib/radio/index.d.ts.map +1 -1
- package/lib/radio/index.js +3 -1
- package/lib/radio/index.js.map +1 -1
- package/lib/switch/index.d.ts +1 -0
- package/lib/switch/index.d.ts.map +1 -1
- package/lib/switch/index.js +3 -1
- package/lib/switch/index.js.map +1 -1
- package/package.json +1 -1
- package/src/checkbox/index.ts +1 -0
- package/src/collapsible/panel/useCollapsiblePanel.tsx +15 -2
- package/src/dialog/index.ts +1 -0
- package/src/radio/index.ts +1 -0
- package/src/switch/index.ts +1 -0
package/lib/checkbox/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,+BAA+B,CAAC"}
|
package/lib/checkbox/index.js
CHANGED
|
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.Checkbox = void 0;
|
|
36
|
+
exports.useCheckboxRootContext = exports.Checkbox = void 0;
|
|
37
37
|
exports.Checkbox = __importStar(require("./index.parts"));
|
|
38
|
+
var CheckboxRootContext_1 = require("./root/CheckboxRootContext");
|
|
39
|
+
Object.defineProperty(exports, "useCheckboxRootContext", { enumerable: true, get: function () { return CheckboxRootContext_1.useCheckboxRootContext; } });
|
|
38
40
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checkbox/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0DAA0C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checkbox/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0DAA0C;AAE1C,kEAAoE;AAA3D,6HAAA,sBAAsB,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCollapsiblePanel.d.ts","sourceRoot":"","sources":["../../../src/collapsible/panel/useCollapsiblePanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAID;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,6BAA6B;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"useCollapsiblePanel.d.ts","sourceRoot":"","sources":["../../../src/collapsible/panel/useCollapsiblePanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAID;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,6BAA6B;;;;;;;;;;;;;EAoE5E;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B"}
|
|
@@ -78,7 +78,15 @@ function useCollapsiblePanel(parameters) {
|
|
|
78
78
|
// be measured on an inner element that is never height-constrained.
|
|
79
79
|
// When `measurePadding` is set, it is applied to the inner measurement
|
|
80
80
|
// wrapper so the reported `height`/`width` reflect the padded content size.
|
|
81
|
-
const
|
|
81
|
+
const paddingStyle = React.useMemo(() => measurePadding
|
|
82
|
+
? {
|
|
83
|
+
paddingTop: measurePadding.top,
|
|
84
|
+
paddingRight: measurePadding.right,
|
|
85
|
+
paddingBottom: measurePadding.bottom,
|
|
86
|
+
paddingLeft: measurePadding.left,
|
|
87
|
+
}
|
|
88
|
+
: undefined, [measurePadding]);
|
|
89
|
+
const wrappedChildren = React.useMemo(() => ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: paddingStyle, onLayout: handleContentLayout, children: children })), [handleContentLayout, paddingStyle, children]);
|
|
82
90
|
return {
|
|
83
91
|
dimensions,
|
|
84
92
|
props,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCollapsiblePanel.js","sourceRoot":"","sources":["../../../src/collapsible/panel/useCollapsiblePanel.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBb,
|
|
1
|
+
{"version":3,"file":"useCollapsiblePanel.js","sourceRoot":"","sources":["../../../src/collapsible/panel/useCollapsiblePanel.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBb,kDAoEC;;AAvFD,6CAA+B;AAC/B,+CAA4D;AAC5D,uEAAoE;AACpE,2EAA2E;AAO3E,MAAM,gBAAgB,GAAe,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAE7E;;;;;;GAMG;AACH,SAAgB,mBAAmB,CAAC,UAAyC;IAC3E,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;IAE7D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAA,kDAAyB,GAAE,CAAC;IAE3E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAa,gBAAgB,CAAC,CAAC;IAEjF,8EAA8E;IAC9E,kDAAkD;IAClD,IAAA,uCAAkB,EAAC,GAAG,EAAE;QACtB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7C,MAAM,mBAAmB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAwB,EAAE,EAAE;QACzE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;QACnD,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO;QACxB,aAAa,CAAC,CAAC,QAAQ,EAAE,EAAE,CACzB,QAAQ,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CACtF,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CACzB,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE,OAAO;QACjB,yEAAyE;QACzE,2DAA2D;QAC3D,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAiB,EAAE;QACtC,aAAa,EAAE,CAAC,IAAI,IAAI,SAAS;QACjC,2BAA2B,EAAE,CAAC,IAAI;QAClC,yBAAyB,EAAE,IAAI,CAAC,CAAC,CAAE,MAAgB,CAAC,CAAC,CAAE,qBAA+B;KACvF,CAAC,EACF,CAAC,OAAO,EAAE,IAAI,CAAC,CAChB,CAAC;IAEF,8EAA8E;IAC9E,oEAAoE;IACpE,uEAAuE;IACvE,4EAA4E;IAC5E,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAChC,GAAG,EAAE,CACH,cAAc;QACZ,CAAC,CAAC;YACE,UAAU,EAAE,cAAc,CAAC,GAAG;YAC9B,YAAY,EAAE,cAAc,CAAC,KAAK;YAClC,aAAa,EAAE,cAAc,CAAC,MAAM;YACpC,WAAW,EAAE,cAAc,CAAC,IAAI;SACjC;QACH,CAAC,CAAC,SAAS,EACf,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CACnC,GAAG,EAAE,CAAC,CACJ,uBAAC,mBAAI,IAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,YACrD,QAAQ,GACJ,CACR,EACD,CAAC,mBAAmB,EAAE,YAAY,EAAE,QAAQ,CAAC,CAC9C,CAAC;IAEF,OAAO;QACL,UAAU;QACV,KAAK;QACL,YAAY,EAAE,WAAW,IAAI,OAAO;QACpC,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
package/lib/dialog/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * as Dialog from './index.parts';
|
|
2
2
|
export type * from './root/DialogRoot';
|
|
3
3
|
export { createDialogHandle, DialogHandle } from './store/DialogHandle';
|
|
4
|
+
export { useDialogRootContext } from './root/DialogRootContext';
|
|
4
5
|
export type * from './trigger/DialogTrigger';
|
|
5
6
|
export type * from './portal/DialogPortal';
|
|
6
7
|
export type * from './backdrop/DialogBackdrop';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,mBAAmB,mBAAmB,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,mBAAmB,yBAAyB,CAAC;AAC7C,mBAAmB,uBAAuB,CAAC;AAC3C,mBAAmB,2BAA2B,CAAC;AAC/C,mBAAmB,2BAA2B,CAAC;AAC/C,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,iCAAiC,CAAC;AACrD,mBAAmB,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,mBAAmB,mBAAmB,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,mBAAmB,yBAAyB,CAAC;AAC7C,mBAAmB,uBAAuB,CAAC;AAC3C,mBAAmB,2BAA2B,CAAC;AAC/C,mBAAmB,2BAA2B,CAAC;AAC/C,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,iCAAiC,CAAC;AACrD,mBAAmB,qBAAqB,CAAC"}
|
package/lib/dialog/index.js
CHANGED
|
@@ -33,9 +33,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.DialogHandle = exports.createDialogHandle = exports.Dialog = void 0;
|
|
36
|
+
exports.useDialogRootContext = exports.DialogHandle = exports.createDialogHandle = exports.Dialog = void 0;
|
|
37
37
|
exports.Dialog = __importStar(require("./index.parts"));
|
|
38
38
|
var DialogHandle_1 = require("./store/DialogHandle");
|
|
39
39
|
Object.defineProperty(exports, "createDialogHandle", { enumerable: true, get: function () { return DialogHandle_1.createDialogHandle; } });
|
|
40
40
|
Object.defineProperty(exports, "DialogHandle", { enumerable: true, get: function () { return DialogHandle_1.DialogHandle; } });
|
|
41
|
+
var DialogRootContext_1 = require("./root/DialogRootContext");
|
|
42
|
+
Object.defineProperty(exports, "useDialogRootContext", { enumerable: true, get: function () { return DialogRootContext_1.useDialogRootContext; } });
|
|
41
43
|
//# sourceMappingURL=index.js.map
|
package/lib/dialog/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dialog/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAAwC;AAGxC,qDAAwE;AAA/D,kHAAA,kBAAkB,OAAA;AAAE,4GAAA,YAAY,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dialog/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAAwC;AAGxC,qDAAwE;AAA/D,kHAAA,kBAAkB,OAAA;AAAE,4GAAA,YAAY,OAAA;AACzC,8DAAgE;AAAvD,yHAAA,oBAAoB,OAAA"}
|
package/lib/radio/index.d.ts
CHANGED
package/lib/radio/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/radio/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,eAAe,CAAC;AAEvC,mBAAmB,kBAAkB,CAAC;AACtC,mBAAmB,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/radio/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,mBAAmB,kBAAkB,CAAC;AACtC,mBAAmB,4BAA4B,CAAC"}
|
package/lib/radio/index.js
CHANGED
|
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.Radio = void 0;
|
|
36
|
+
exports.useRadioRootContext = exports.Radio = void 0;
|
|
37
37
|
exports.Radio = __importStar(require("./index.parts"));
|
|
38
|
+
var RadioRootContext_1 = require("./root/RadioRootContext");
|
|
39
|
+
Object.defineProperty(exports, "useRadioRootContext", { enumerable: true, get: function () { return RadioRootContext_1.useRadioRootContext; } });
|
|
38
40
|
//# sourceMappingURL=index.js.map
|
package/lib/radio/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/radio/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAAuC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/radio/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAAuC;AAEvC,4DAA8D;AAArD,uHAAA,mBAAmB,OAAA"}
|
package/lib/switch/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/switch/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/switch/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,qBAAqB,CAAC"}
|
package/lib/switch/index.js
CHANGED
|
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.Switch = void 0;
|
|
36
|
+
exports.useSwitchRootContext = exports.Switch = void 0;
|
|
37
37
|
exports.Switch = __importStar(require("./index.parts"));
|
|
38
|
+
var SwitchRootContext_1 = require("./root/SwitchRootContext");
|
|
39
|
+
Object.defineProperty(exports, "useSwitchRootContext", { enumerable: true, get: function () { return SwitchRootContext_1.useSwitchRootContext; } });
|
|
38
40
|
//# sourceMappingURL=index.js.map
|
package/lib/switch/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/switch/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAAwC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/switch/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAAwC;AAExC,8DAAgE;AAAvD,yHAAA,oBAAoB,OAAA"}
|
package/package.json
CHANGED
package/src/checkbox/index.ts
CHANGED
|
@@ -58,13 +58,26 @@ export function useCollapsiblePanel(parameters: UseCollapsiblePanelParameters) {
|
|
|
58
58
|
// be measured on an inner element that is never height-constrained.
|
|
59
59
|
// When `measurePadding` is set, it is applied to the inner measurement
|
|
60
60
|
// wrapper so the reported `height`/`width` reflect the padded content size.
|
|
61
|
+
const paddingStyle = React.useMemo(
|
|
62
|
+
() =>
|
|
63
|
+
measurePadding
|
|
64
|
+
? {
|
|
65
|
+
paddingTop: measurePadding.top,
|
|
66
|
+
paddingRight: measurePadding.right,
|
|
67
|
+
paddingBottom: measurePadding.bottom,
|
|
68
|
+
paddingLeft: measurePadding.left,
|
|
69
|
+
}
|
|
70
|
+
: undefined,
|
|
71
|
+
[measurePadding],
|
|
72
|
+
);
|
|
73
|
+
|
|
61
74
|
const wrappedChildren = React.useMemo(
|
|
62
75
|
() => (
|
|
63
|
-
<View style={
|
|
76
|
+
<View style={paddingStyle} onLayout={handleContentLayout}>
|
|
64
77
|
{children}
|
|
65
78
|
</View>
|
|
66
79
|
),
|
|
67
|
-
[handleContentLayout,
|
|
80
|
+
[handleContentLayout, paddingStyle, children],
|
|
68
81
|
);
|
|
69
82
|
|
|
70
83
|
return {
|
package/src/dialog/index.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * as Dialog from './index.parts';
|
|
|
2
2
|
|
|
3
3
|
export type * from './root/DialogRoot';
|
|
4
4
|
export { createDialogHandle, DialogHandle } from './store/DialogHandle';
|
|
5
|
+
export { useDialogRootContext } from './root/DialogRootContext';
|
|
5
6
|
export type * from './trigger/DialogTrigger';
|
|
6
7
|
export type * from './portal/DialogPortal';
|
|
7
8
|
export type * from './backdrop/DialogBackdrop';
|
package/src/radio/index.ts
CHANGED