@wordpress-gcb/fields 0.2.0 → 0.2.2

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 (92) hide show
  1. package/README.md +51 -35
  2. package/dist/conditional-logic.js +83 -0
  3. package/{src → dist}/control-context.js +3 -2
  4. package/{src → dist}/controls/MediaCapabilityGate.js +12 -8
  5. package/dist/controls/MediaPicker.js +149 -0
  6. package/dist/controls/MediaTriggerBadges.js +35 -0
  7. package/{src → dist}/controls/PopoverOrModal.js +49 -43
  8. package/dist/controls/SortableItem.js +126 -0
  9. package/dist/controls/button-group.js +46 -0
  10. package/dist/controls/checkbox-group.js +65 -0
  11. package/dist/controls/checkbox.js +15 -0
  12. package/dist/controls/code.js +24 -0
  13. package/dist/controls/color.js +241 -0
  14. package/dist/controls/date.js +55 -0
  15. package/dist/controls/datetime.js +61 -0
  16. package/dist/controls/email.js +17 -0
  17. package/dist/controls/file.js +163 -0
  18. package/dist/controls/gallery.js +371 -0
  19. package/dist/controls/google-map.js +143 -0
  20. package/dist/controls/heading-level.js +93 -0
  21. package/dist/controls/icon.js +292 -0
  22. package/dist/controls/image.js +360 -0
  23. package/dist/controls/index.js +88 -0
  24. package/dist/controls/message.js +86 -0
  25. package/dist/controls/number.js +19 -0
  26. package/dist/controls/oembed.js +42 -0
  27. package/{src → dist}/controls/page-link.js +1 -2
  28. package/dist/controls/post-object.js +913 -0
  29. package/dist/controls/radio.js +19 -0
  30. package/dist/controls/range.js +108 -0
  31. package/{src → dist}/controls/relationship.js +12 -7
  32. package/dist/controls/repeater.js +277 -0
  33. package/dist/controls/richtext.js +494 -0
  34. package/dist/controls/select.js +144 -0
  35. package/dist/controls/size.js +59 -0
  36. package/dist/controls/spacing.js +141 -0
  37. package/dist/controls/taxonomy.js +569 -0
  38. package/dist/controls/text.js +16 -0
  39. package/dist/controls/textarea.js +17 -0
  40. package/dist/controls/toggle-group.js +28 -0
  41. package/dist/controls/toggle.js +15 -0
  42. package/dist/controls/url.js +235 -0
  43. package/dist/controls/user.js +383 -0
  44. package/{src → dist}/controls/wysiwyg.js +1 -1
  45. package/{src → dist}/hooks/useTokens.js +25 -21
  46. package/{src → dist}/index.js +2 -8
  47. package/dist/inspector.js +163 -0
  48. package/{src → dist}/provider.js +18 -17
  49. package/dist/utils/map-utils.js +54 -0
  50. package/dist/utils/token-helper.js +396 -0
  51. package/{src → dist}/validation-context.js +4 -4
  52. package/package.json +35 -13
  53. package/src/conditional-logic.js +0 -77
  54. package/src/controls/MediaPicker.js +0 -139
  55. package/src/controls/MediaTriggerBadges.js +0 -31
  56. package/src/controls/SortableItem.js +0 -110
  57. package/src/controls/button-group.js +0 -49
  58. package/src/controls/checkbox-group.js +0 -55
  59. package/src/controls/checkbox.js +0 -13
  60. package/src/controls/code.js +0 -21
  61. package/src/controls/color.js +0 -235
  62. package/src/controls/date.js +0 -37
  63. package/src/controls/datetime.js +0 -54
  64. package/src/controls/email.js +0 -15
  65. package/src/controls/file.js +0 -134
  66. package/src/controls/gallery.js +0 -338
  67. package/src/controls/google-map.js +0 -117
  68. package/src/controls/heading-level.js +0 -99
  69. package/src/controls/icon.js +0 -301
  70. package/src/controls/image.js +0 -334
  71. package/src/controls/index.js +0 -95
  72. package/src/controls/message.js +0 -56
  73. package/src/controls/number.js +0 -17
  74. package/src/controls/oembed.js +0 -32
  75. package/src/controls/post-object.js +0 -788
  76. package/src/controls/radio.js +0 -18
  77. package/src/controls/range.js +0 -110
  78. package/src/controls/repeater.js +0 -290
  79. package/src/controls/richtext.js +0 -505
  80. package/src/controls/select.js +0 -141
  81. package/src/controls/size.js +0 -49
  82. package/src/controls/spacing.js +0 -141
  83. package/src/controls/taxonomy.js +0 -488
  84. package/src/controls/text.js +0 -14
  85. package/src/controls/textarea.js +0 -15
  86. package/src/controls/toggle-group.js +0 -34
  87. package/src/controls/toggle.js +0 -13
  88. package/src/controls/url.js +0 -164
  89. package/src/controls/user.js +0 -343
  90. package/src/inspector.js +0 -174
  91. package/src/utils/map-utils.js +0 -51
  92. package/src/utils/token-helper.js +0 -243
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Registry of control type → React component.
3
+ *
4
+ * Each component receives `{ control, value, onChange, attributes }` and is
5
+ * responsible for its own UI. Some are thin wrappers around @wordpress/components;
6
+ * the richer ones (image, gallery, post-object, taxonomy, user, icon, google-map)
7
+ * carry full UI logic ported from the original plugin.
8
+ */
9
+
10
+ import TextField from './text';
11
+ import TextareaField from './textarea';
12
+ import NumberField from './number';
13
+ import EmailField from './email';
14
+ import UrlField from './url';
15
+ import CodeField from './code';
16
+ import SelectField from './select';
17
+ import RadioField from './radio';
18
+ import CheckboxField from './checkbox';
19
+ import CheckboxGroupField from './checkbox-group';
20
+ import ToggleField from './toggle';
21
+ import ToggleGroupField from './toggle-group';
22
+ import ButtonGroupField from './button-group';
23
+ import RangeField from './range';
24
+ import ColorField from './color';
25
+ import DateField from './date';
26
+ import DatetimeField from './datetime';
27
+ import SizeField from './size';
28
+ import SpacingField from './spacing';
29
+ import MessageField from './message';
30
+ import OembedField from './oembed';
31
+ import WysiwygField from './wysiwyg';
32
+ import ImageField from './image';
33
+ import GalleryField from './gallery';
34
+ import FileField from './file';
35
+ import IconField from './icon';
36
+ import GoogleMapField from './google-map';
37
+ import PostObjectField from './post-object';
38
+ import TaxonomyField from './taxonomy';
39
+ import UserField from './user';
40
+ import PageLinkField from './page-link';
41
+ import RelationshipField from './relationship';
42
+ import HeadingLevelField from './heading-level';
43
+ import RepeaterField from './repeater';
44
+ import RichtextField from './richtext';
45
+ export const controlComponents = {
46
+ // Text family
47
+ text: TextField,
48
+ textarea: TextareaField,
49
+ number: NumberField,
50
+ email: EmailField,
51
+ url: UrlField,
52
+ code: CodeField,
53
+ // Choice family
54
+ select: SelectField,
55
+ radio: RadioField,
56
+ checkbox: CheckboxField,
57
+ 'checkbox-group': CheckboxGroupField,
58
+ toggle: ToggleField,
59
+ 'toggle-group': ToggleGroupField,
60
+ 'button-group': ButtonGroupField,
61
+ // Numeric / visual
62
+ range: RangeField,
63
+ color: ColorField,
64
+ date: DateField,
65
+ datetime: DatetimeField,
66
+ size: SizeField,
67
+ spacing: SpacingField,
68
+ 'heading-level': HeadingLevelField,
69
+ // Display-only
70
+ message: MessageField,
71
+ wysiwyg: WysiwygField,
72
+ richtext: RichtextField,
73
+ oembed: OembedField,
74
+ // Media
75
+ image: ImageField,
76
+ gallery: GalleryField,
77
+ file: FileField,
78
+ icon: IconField,
79
+ // Reference
80
+ 'post-object': PostObjectField,
81
+ taxonomy: TaxonomyField,
82
+ user: UserField,
83
+ 'page-link': PageLinkField,
84
+ relationship: RelationshipField,
85
+ // Other
86
+ 'google-map': GoogleMapField,
87
+ repeater: RepeaterField
88
+ };
@@ -0,0 +1,86 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Message — informational note in the Inspector. No input.
4
+ *
5
+ * Variants: `neutral` (default) | `info` | `warning` | `danger` | `success`
6
+ * Pair with `conditionalLogic` to fire context-sensitive messages (e.g.
7
+ * a `danger` message that only shows when another field has an invalid
8
+ * value).
9
+ *
10
+ * Body source: `control.message` (preferred) or `control.helpText` fallback.
11
+ */
12
+
13
+ const VARIANTS = {
14
+ neutral: {
15
+ bg: '#f0f0f1',
16
+ border: '#dcdcde',
17
+ fg: '#1e1e1e',
18
+ glyph: null
19
+ },
20
+ info: {
21
+ bg: '#f0f6fc',
22
+ border: '#c5d9eb',
23
+ fg: '#0b3b6f',
24
+ glyph: 'ℹ'
25
+ },
26
+ warning: {
27
+ bg: '#fcf9e8',
28
+ border: '#f5e6a8',
29
+ fg: '#674e00',
30
+ glyph: '⚠'
31
+ },
32
+ danger: {
33
+ bg: '#fcf0f1',
34
+ border: '#facfd2',
35
+ fg: '#7c0c0c',
36
+ glyph: '✕'
37
+ },
38
+ success: {
39
+ bg: '#edfaef',
40
+ border: '#b8e6bf',
41
+ fg: '#0a4d12',
42
+ glyph: '✓'
43
+ }
44
+ };
45
+ export default function MessageField({
46
+ control
47
+ }) {
48
+ const variant = VARIANTS[control.variant] || VARIANTS.neutral;
49
+ const body = control.message || control.helpText || '';
50
+ return /*#__PURE__*/_jsx("div", {
51
+ className: `components-base-control gcb-message-control gcb-message-control--${control.variant || 'neutral'}`,
52
+ children: /*#__PURE__*/_jsxs("div", {
53
+ className: "components-base-control__field",
54
+ children: [control.label && /*#__PURE__*/_jsx("label", {
55
+ className: "components-base-control__label",
56
+ children: control.label
57
+ }), /*#__PURE__*/_jsxs("div", {
58
+ className: "gcb-message-control__content",
59
+ role: control.variant === 'danger' || control.variant === 'warning' ? 'alert' : undefined,
60
+ style: {
61
+ display: 'flex',
62
+ alignItems: 'flex-start',
63
+ gap: 8,
64
+ padding: '10px 12px',
65
+ backgroundColor: variant.bg,
66
+ border: `1px solid ${variant.border}`,
67
+ color: variant.fg,
68
+ borderRadius: 4,
69
+ fontSize: 13,
70
+ lineHeight: 1.5
71
+ },
72
+ children: [variant.glyph && /*#__PURE__*/_jsx("span", {
73
+ "aria-hidden": true,
74
+ style: {
75
+ flexShrink: 0,
76
+ fontWeight: 600,
77
+ lineHeight: 1.5
78
+ },
79
+ children: variant.glyph
80
+ }), /*#__PURE__*/_jsx("span", {
81
+ children: body
82
+ })]
83
+ })]
84
+ })
85
+ });
86
+ }
@@ -0,0 +1,19 @@
1
+ import { __experimentalNumberControl as NumberControl } from '@wordpress/components';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ export default function NumberField({
4
+ control,
5
+ value,
6
+ onChange
7
+ }) {
8
+ return /*#__PURE__*/_jsx(NumberControl, {
9
+ label: control.label,
10
+ help: control.helpText,
11
+ placeholder: control.placeholder,
12
+ value: value ?? 0,
13
+ onChange: next => onChange(next === '' ? 0 : Number(next)),
14
+ min: control.min,
15
+ max: control.max,
16
+ step: control.step ?? 1,
17
+ __nextHasNoMarginBottom: true
18
+ });
19
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * oEmbed — URL input with a quick preview underneath.
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { TextControl } from '@wordpress/components';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ export default function OembedField({
8
+ control,
9
+ value,
10
+ onChange
11
+ }) {
12
+ return /*#__PURE__*/_jsxs("div", {
13
+ className: "components-base-control gcb-oembed-control",
14
+ children: [/*#__PURE__*/_jsx("div", {
15
+ className: "components-base-control__field",
16
+ children: /*#__PURE__*/_jsx("label", {
17
+ className: "components-base-control__label",
18
+ children: control.label
19
+ })
20
+ }), control.helpText && /*#__PURE__*/_jsx("p", {
21
+ className: "components-base-control__help",
22
+ children: control.helpText
23
+ }), /*#__PURE__*/_jsx(TextControl, {
24
+ value: value || '',
25
+ onChange: onChange,
26
+ placeholder: __('Enter URL to embed (YouTube, Twitter, etc.)', 'gcblite'),
27
+ type: "url",
28
+ __nextHasNoMarginBottom: true
29
+ }), value && /*#__PURE__*/_jsx("div", {
30
+ style: {
31
+ marginTop: 12,
32
+ fontSize: 13
33
+ },
34
+ children: /*#__PURE__*/_jsx("wp-embed", {
35
+ children: /*#__PURE__*/_jsx("a", {
36
+ href: value,
37
+ children: value
38
+ })
39
+ })
40
+ })]
41
+ });
42
+ }
@@ -5,5 +5,4 @@
5
5
  * If you have real demand, replace this with a wp/v2/pages search dropdown.
6
6
  */
7
7
  import UrlField from './url';
8
-
9
- export default UrlField;
8
+ export default UrlField;