@startlibs/form 1.1.3 → 1.2.0-rc.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 (112) hide show
  1. package/lib/AutoComplete.mjs +7 -7
  2. package/lib/AutoComplete.mjs.map +1 -1
  3. package/lib/Checkbox.mjs +4 -2
  4. package/lib/Checkbox.mjs.map +1 -1
  5. package/lib/Combobox.mjs +1 -1
  6. package/lib/Combobox.mjs.map +1 -1
  7. package/lib/DatePicker.mjs +25 -9
  8. package/lib/DatePicker.mjs.map +1 -1
  9. package/lib/Errors.mjs +20 -10
  10. package/lib/Errors.mjs.map +1 -1
  11. package/lib/ExpandableBox.mjs +1 -1
  12. package/lib/ExpandableBox.mjs.map +1 -1
  13. package/lib/Field.mjs +10 -5
  14. package/lib/Field.mjs.map +1 -1
  15. package/lib/FieldBox.mjs +3 -3
  16. package/lib/FieldBox.mjs.map +1 -1
  17. package/lib/InputboxGroup.mjs +1 -1
  18. package/lib/InputboxGroup.mjs.map +1 -1
  19. package/lib/RichText.mjs +11 -6
  20. package/lib/RichText.mjs.map +1 -1
  21. package/lib/TextInput.mjs +4 -4
  22. package/lib/TextInput.mjs.map +1 -1
  23. package/lib/alt/checkbox/SimpleCheckbox.mjs +1 -1
  24. package/lib/alt/checkbox/SimpleCheckbox.mjs.map +1 -1
  25. package/lib/alt/checkbox/ToggleCheckbox.mjs +4 -3
  26. package/lib/alt/checkbox/ToggleCheckbox.mjs.map +1 -1
  27. package/lib/alt/radiobox/CleanTabRadiobox.mjs +1 -1
  28. package/lib/alt/radiobox/CleanTabRadiobox.mjs.map +1 -1
  29. package/lib/alt/radiobox/SimpleRadiobox.mjs +2 -2
  30. package/lib/alt/radiobox/SimpleRadiobox.mjs.map +1 -1
  31. package/lib/alt/radiobox/TabRadiobox.mjs +1 -1
  32. package/lib/alt/radiobox/TabRadiobox.mjs.map +1 -1
  33. package/lib/index.cjs +94 -51
  34. package/lib/index.cjs.map +1 -1
  35. package/lib/index.mjs +2 -2
  36. package/lib/withFormImageInput.mjs +1 -1
  37. package/lib/withFormImageInput.mjs.map +1 -1
  38. package/lib-yak/AutoComplete.mjs +705 -0
  39. package/lib-yak/AutoComplete.mjs.map +1 -0
  40. package/lib-yak/Checkbox.mjs +80 -0
  41. package/lib-yak/Checkbox.mjs.map +1 -0
  42. package/lib-yak/Combobox.mjs +652 -0
  43. package/lib-yak/Combobox.mjs.map +1 -0
  44. package/lib-yak/ComboboxWithCustom.mjs +77 -0
  45. package/lib-yak/ComboboxWithCustom.mjs.map +1 -0
  46. package/lib-yak/DatePicker.mjs +774 -0
  47. package/lib-yak/DatePicker.mjs.map +1 -0
  48. package/lib-yak/EditableBox.mjs +495 -0
  49. package/lib-yak/EditableBox.mjs.map +1 -0
  50. package/lib-yak/Errors.mjs +226 -0
  51. package/lib-yak/Errors.mjs.map +1 -0
  52. package/lib-yak/ExpandableBox.mjs +247 -0
  53. package/lib-yak/ExpandableBox.mjs.map +1 -0
  54. package/lib-yak/Field.mjs +93 -0
  55. package/lib-yak/Field.mjs.map +1 -0
  56. package/lib-yak/FieldBox.mjs +173 -0
  57. package/lib-yak/FieldBox.mjs.map +1 -0
  58. package/lib-yak/Form.mjs +322 -0
  59. package/lib-yak/Form.mjs.map +1 -0
  60. package/lib-yak/FormValue.mjs +111 -0
  61. package/lib-yak/FormValue.mjs.map +1 -0
  62. package/lib-yak/InputboxGroup.mjs +146 -0
  63. package/lib-yak/InputboxGroup.mjs.map +1 -0
  64. package/lib-yak/Radiobox.mjs +69 -0
  65. package/lib-yak/Radiobox.mjs.map +1 -0
  66. package/lib-yak/RichText.mjs +776 -0
  67. package/lib-yak/RichText.mjs.map +1 -0
  68. package/lib-yak/TextInput.mjs +589 -0
  69. package/lib-yak/TextInput.mjs.map +1 -0
  70. package/lib-yak/alt/checkbox/SimpleCheckbox.mjs +225 -0
  71. package/lib-yak/alt/checkbox/SimpleCheckbox.mjs.map +1 -0
  72. package/lib-yak/alt/checkbox/ToggleCheckbox.mjs +173 -0
  73. package/lib-yak/alt/checkbox/ToggleCheckbox.mjs.map +1 -0
  74. package/lib-yak/alt/radiobox/CleanTabRadiobox.mjs +87 -0
  75. package/lib-yak/alt/radiobox/CleanTabRadiobox.mjs.map +1 -0
  76. package/lib-yak/alt/radiobox/IconRadioBox.mjs +138 -0
  77. package/lib-yak/alt/radiobox/IconRadioBox.mjs.map +1 -0
  78. package/lib-yak/alt/radiobox/SimpleRadiobox.mjs +203 -0
  79. package/lib-yak/alt/radiobox/SimpleRadiobox.mjs.map +1 -0
  80. package/lib-yak/alt/radiobox/TabRadiobox.mjs +117 -0
  81. package/lib-yak/alt/radiobox/TabRadiobox.mjs.map +1 -0
  82. package/lib-yak/enhanceInput.mjs +131 -0
  83. package/lib-yak/enhanceInput.mjs.map +1 -0
  84. package/lib-yak/index.mjs +28 -0
  85. package/lib-yak/index.mjs.map +1 -0
  86. package/lib-yak/useConfirmDialog.mjs +117 -0
  87. package/lib-yak/useConfirmDialog.mjs.map +1 -0
  88. package/lib-yak/useDraftConfirmation.mjs +56 -0
  89. package/lib-yak/useDraftConfirmation.mjs.map +1 -0
  90. package/lib-yak/validation.mjs +91 -0
  91. package/lib-yak/validation.mjs.map +1 -0
  92. package/lib-yak/withFormImageInput.mjs +298 -0
  93. package/lib-yak/withFormImageInput.mjs.map +1 -0
  94. package/package.json +13 -3
  95. package/src/AutoComplete.jsx +12 -12
  96. package/src/Checkbox.jsx +2 -2
  97. package/src/Combobox.jsx +1 -1
  98. package/src/DatePicker.jsx +25 -22
  99. package/src/Errors.jsx +18 -8
  100. package/src/ExpandableBox.jsx +3 -3
  101. package/src/Field.jsx +9 -4
  102. package/src/FieldBox.jsx +6 -6
  103. package/src/IconRadioBoxOldHubt.jsx +1 -1
  104. package/src/InputboxGroup.jsx +1 -1
  105. package/src/RichText.jsx +17 -13
  106. package/src/TextInput.jsx +37 -26
  107. package/src/alt/checkbox/SimpleCheckbox.jsx +5 -5
  108. package/src/alt/checkbox/ToggleCheckbox.jsx +9 -8
  109. package/src/alt/radiobox/CleanTabRadiobox.jsx +2 -2
  110. package/src/alt/radiobox/SimpleRadiobox.jsx +7 -7
  111. package/src/alt/radiobox/TabRadiobox.jsx +4 -4
  112. package/src/withFormImageInput.jsx +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withFormImageInput.mjs","sources":["../src/withFormImageInput.jsx"],"sourcesContent":["import React, {useContext, useState} from 'react'\nimport styled from 'styled-components'\nimport {FormContext, useFormValue} from './Form'\nimport {useToggle} from '@startlibs/core'\nimport {getUID, callIfFunction} from '@startlibs/utils'\nimport _ from 'lodash/fp'\n\nexport const FileInput = styled.input.attrs({type: 'file'})`\n z-index: 1;\n cursor: pointer;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n &::-webkit-file-upload-button {\n visibility: hidden;\n }\n &::file-upload-button {\n visibility: hidden;\n }\n `\n\n\nexport const WithImageInput = ({children, multiple, path = [\"image\"], preValidation = _.stubFalse, onChangeFile, onClose, onClick, uploadFetcher, onSuccess, onFailure, ajaxError, onTouchEnd, ...rest}) => {\n const form = useContext(FormContext)\n const loading = useToggle()\n const [tempImage, setTempImage] = useState()\n const getPath = (str,fileIndex = 0) => typeof path === 'function' ? [].concat(path(str,fileIndex)) : str !== 'image' ? [].concat(path).slice(0, -1).concat(str) : path\n\n const imagePath = getPath('image')\n const [formImage] = useFormValue(imagePath)\n const image = tempImage || formImage\n\n const validate = (files) => {\n const validations = files.map(preValidation).filter(Boolean)\n if (validations.length) {\n validations.forEach(v =>\n form.setError(getPath('image').join('.'), v)\n )\n return files.filter((file) => !preValidation(file))\n }\n return files\n }\n\n const handleFileEvent = (e) => {\n e.preventDefault()\n callIfFunction(onClose)\n const files = Array.from((e.nativeEvent.dataTransfer || e.nativeEvent.target).files)\n if (files.length > 0) {\n validate(files.slice(0,multiple ? undefined : 1)).forEach( (file,i) =>\n handleFile(file,e,i)\n )\n }\n }\n\n const handleFile = (file, eventTarget, fileIndex = 0) => {\n const getIndexedPath = (str) => getPath(str,fileIndex)\n const path = getIndexedPath()\n const oldUploadStatus = form.getMeta(getIndexedPath('uploadStatus'))\n const oldImage = form.getValue(getIndexedPath('image'))\n const oldImageHeight = form.getValue(getIndexedPath('imageHeight'))\n const oldImageWidth = form.getValue(getIndexedPath('imageWidth'))\n const oldFilename = form.getValue(getIndexedPath('fileName'))\n\n const objectUrl = URL.createObjectURL(file)\n const image = document.createElement('img')\n image.onload = () => {\n const {naturalWidth: imageWidth, naturalHeight: imageHeight} = image\n const newValues = {image: file, filename: file.name, imageWidth, imageHeight}\n form.setValues(_.flow(\n _.set(getIndexedPath('filename'), file.name),\n _.set(getIndexedPath('image'), file),\n _.set(getIndexedPath('imageWidth'), imageWidth),\n _.set(getIndexedPath('imageHeight'), imageHeight)\n ))\n form.setMeta(_.flow(\n _.update('submittingFiles', (v) => v ? v + 1 : 1),\n _.update('uploadingPaths', _.union([path.join(\".\")])),\n _.set(getIndexedPath('uploadStatus'), 'loading')\n ))\n setTempImage(objectUrl)\n callIfFunction(onChangeFile,file)\n loading.open()\n uploadFetcher(file, newValues)\n .then(({image, uploadStatus}) => {\n loading.close()\n if (form.getValue(getIndexedPath('image')) !== file) {\n form.setMeta(_.update(['submittingFiles'], (v) => v - 1))\n return\n }\n form.clearErrors()\n form.setValue(getIndexedPath('image'), image, false)\n form.setMeta(_.flow(\n _.update('uploadingPaths', _.difference(_,[path.join(\".\")])),\n _.update(['submittingFiles'], (v) => v - 1),\n _.update(['submittedFiles'], (v) => (v || []).concat([{path, file, image}])),\n _.set(getIndexedPath('uploadStatus'), uploadStatus)\n ))\n setTempImage(null)\n callIfFunction(onSuccess, {image, uploadStatus, imageWidth, imageHeight})\n }).catch((e) => {\n loading.close()\n if (form.getValue(getIndexedPath('image')) !== file) {\n form.setMeta(_.update(['submittingFiles'], (v) => v - 1))\n return\n }\n form.setError(getIndexedPath('image').join('.'), callIfFunction(ajaxError,_.get('[1].status',e)))\n form.setValues(_.flow(\n _.set(getIndexedPath('filename'), oldFilename),\n _.set(getIndexedPath('image'), oldImage),\n _.set(getIndexedPath('imageWidth'), oldImageWidth),\n _.set(getIndexedPath('imageHeight'), oldImageHeight)\n ),\n false\n )\n form.setMeta(_.flow(\n _.update('uploadingPaths', _.difference(_,[path.join(\".\")])),\n _.update(['submittingFiles'], (v) => v - 1),\n _.update(['submittedFiles'], (v) => (v || []).concat([{path, file, image}])),\n _.set(getIndexedPath('uploadStatus'), oldUploadStatus)\n ))\n setTempImage(null)\n callIfFunction(onFailure)\n })\n if (eventTarget && eventTarget.parentNode && typeof eventTarget.parentNode.click === 'function')\n eventTarget.parentNode.click()\n }\n image.src = objectUrl\n }\n\n const listenToClose = () => {\n }\n\n const handleClick = (e) => {\n callIfFunction(onClick,e)\n listenToClose()\n }\n const handleTouchEnd = (e) => {\n callIfFunction(onTouchEnd,e)\n listenToClose()\n }\n\n return children(\n <FileInput multiple={multiple} onChange={handleFileEvent} onClick={handleClick} tabIndex={-1} onTouchEnd={handleTouchEnd}/>,\n {\n image,\n isLoading: loading.isOpen,\n handleFile,\n handleFileEvent,\n Input: FileInput\n }\n )\n}\n\n\n\n\nexport const WithFileInput = ({children, multiple, path = [\"file\"], preValidation = _.stubFalse, onChangeFile, onClose, onClick, uploadFetcher, onSuccess, onFailure, ajaxError, onTouchEnd, maxFiles, ...rest}) => {\n const form = useContext(FormContext)\n const loading = useToggle()\n const [tempImage, setTempImage] = useState()\n const getPath = (str,fileIndex) => typeof path === 'function' ? [].concat(path(str,fileIndex)) : str !== 'file' ? [].concat(path).slice(0, -1).concat(str) : path\n\n const validate = (files) => {\n const validations = files.map(preValidation).filter(Boolean)\n if (validations.length) {\n validations.forEach(v =>\n form.setError(getPath('file',0).join('.'), v)\n )\n return files.filter((file) => !preValidation(file))\n }\n return files\n }\n\n const handleFileEvent = (e) => {\n e.preventDefault()\n callIfFunction(onClose)\n const files = Array.from((e.nativeEvent.dataTransfer || e.nativeEvent.target).files)\n if (files.length > 0) {\n validate(files.slice(0,multiple ? undefined : 1)).forEach( (file,i) =>\n handleFile(file,e,i)\n )\n }\n }\n\n const handleFile = (file, eventTarget) => {\n const currentFileIndex = (form.getValue(getPath()) || []).length\n if (currentFileIndex >= maxFiles) {\n form.setErrors({'': 'Número máximo de arquivos atingido'})\n return\n }\n const createGetIndexedPath = (index) => (str) => getPath(str,index)\n const getIndexedPath = createGetIndexedPath(currentFileIndex)\n const path = getIndexedPath()\n const oldUploadStatus = form.getMeta(getIndexedPath('uploadStatus'))\n const oldFile = form.getValue(getIndexedPath('file'))\n const oldFilename = form.getValue(getIndexedPath('fileName'))\n\n const uid = getUID()\n\n form.setValues(_.flow(\n _.set(getIndexedPath('filename'), file.name),\n _.set(getIndexedPath('file'), file),\n _.set(getIndexedPath('uid'), uid),\n ))\n form.setMeta(_.flow(\n _.update('submittingFiles', (v) => v ? v + 1 : 1),\n _.update('uploadingPaths', _.union([path.join(\".\")])),\n _.set(getIndexedPath('uploadStatus'), 'loading')\n ))\n callIfFunction(onChangeFile,file)\n\n loading.open()\n uploadFetcher(file)\n .then(({file, uploadStatus, response}) => {\n loading.close()\n const list = (form.getValue(getPath()) || [])\n const index = list.findIndex((f) => f.uid === uid)\n if (index < 0) {\n form.setMeta(_.update(['submittingFiles'], (v) => v - 1))\n return\n }\n const getIndexedPath = createGetIndexedPath(index)\n form.clearErrors()\n form.setValue(getIndexedPath('file'), response, false)\n form.setMeta(_.flow(\n _.update('uploadingPaths', _.difference(_,[path.join(\".\")])),\n _.update(['submittingFiles'], (v) => v - 1),\n _.update(['submittedFiles'], (v) => (v || []).concat([{path, file}])),\n _.set(getIndexedPath('uploadStatus'), uploadStatus)\n ))\n callIfFunction(onSuccess, {file, uploadStatus})\n }).catch((e) => {\n loading.close()\n const list = (form.getValue(getPath()) || [])\n const index = list.findIndex((f) => f.uid === uid)\n if (index < 0) {\n form.setMeta(_.update(['submittingFiles'], (v) => v - 1))\n return\n }\n const getIndexedPath = createGetIndexedPath(index)\n form.setError(getIndexedPath('file').join('.'), callIfFunction(ajaxError,_.get('[1].status',e)))\n if (oldFile) {\n form.setValues(\n _.flow(\n _.set(getIndexedPath('filename'), oldFilename),\n _.set(getIndexedPath('file'), oldFile),\n ),\n false\n )\n } else {\n form.setValues(\n _.update(getPath(), _.filter((f) => f.uid !== uid)),\n false\n )\n }\n form.setMeta(_.flow(\n _.update('uploadingPaths', _.difference(_,[path.join(\".\")])),\n _.update(['submittingFiles'], (v) => v - 1),\n _.update(['submittedFiles'], (v) => (v || []).concat([{path, file}])),\n _.set(getIndexedPath('uploadStatus'), oldUploadStatus)\n ))\n callIfFunction(onFailure)\n })\n if (eventTarget && eventTarget.parentNode && typeof eventTarget.parentNode.click === 'function')\n eventTarget.parentNode.click()\n }\n\n const listenToClose = () => {\n }\n\n const handleClick = (e) => {\n callIfFunction(onClick,e)\n listenToClose()\n }\n const handleTouchEnd = (e) => {\n callIfFunction(onTouchEnd,e)\n listenToClose()\n }\n\n return children(\n <FileInput multiple={multiple} onChange={handleFileEvent} onClick={handleClick} tabIndex={-1} onTouchEnd={handleTouchEnd}/>,\n {\n isLoading: loading.isOpen,\n handleFile,\n handleFileEvent,\n Input: FileInput\n }\n )\n}\n\n\n"],"names":["FileInput","styled","yakDomTag","attrs","type","className","WithImageInput","_ref","children","multiple","path","preValidation","_stubFalse","onChangeFile","onClose","onClick","uploadFetcher","onSuccess","onFailure","ajaxError","onTouchEnd","rest","_objectWithoutProperties","_excluded","form","useContext","FormContext","loading","useToggle","tempImage","setTempImage","useState","getPath","str","fileIndex","arguments","length","undefined","concat","slice","imagePath","formImage","useFormValue","image","validate","files","validations","map","filter","Boolean","forEach","v","setError","join","file","handleFileEvent","e","preventDefault","callIfFunction","Array","from","nativeEvent","dataTransfer","target","i","handleFile","eventTarget","getIndexedPath","oldUploadStatus","getMeta","oldImage","getValue","oldImageHeight","oldImageWidth","oldFilename","objectUrl","URL","createObjectURL","document","createElement","onload","naturalWidth","imageWidth","naturalHeight","imageHeight","newValues","filename","name","setValues","_flow","_set","setMeta","_update","_union","open","then","_ref2","uploadStatus","close","clearErrors","setValue","_difference","placeholder","catch","_get","parentNode","click","src","handleClick","handleTouchEnd","React","onChange","tabIndex","isLoading","isOpen","Input","WithFileInput","_ref3","maxFiles","_excluded2","currentFileIndex","setErrors","createGetIndexedPath","index","oldFile","uid","getUID","_ref4","response","list","findIndex","f","_filter"],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,20 @@
1
1
  {
2
2
  "name": "@startlibs/form",
3
- "version": "1.1.3",
3
+ "version": "1.2.0-rc.2",
4
+ "packageManager": "yarn@4.18.1",
4
5
  "description": "Startlibs Form",
5
6
  "main": "lib/index.cjs",
6
7
  "exports": {
7
8
  ".": {
8
9
  "source": "./src/index.js",
10
+ "yak": "./lib-yak/index.mjs",
9
11
  "require": "./lib/index.cjs",
10
12
  "import": "./lib/index.mjs",
11
13
  "default": "./lib/index.mjs"
12
14
  },
13
15
  "./package.json": "./package.json",
14
16
  "./*": {
17
+ "yak": "./lib-yak/*.mjs",
15
18
  "import": "./lib/*.mjs"
16
19
  }
17
20
  },
@@ -20,7 +23,8 @@
20
23
  "peerDependencies": {
21
24
  "@startlibs/components": "*",
22
25
  "@startlibs/core": "*",
23
- "@startlibs/utils": "*",
26
+ "@startlibs/utils": ">=1.2.0-rc.2",
27
+ "@yak/react": "10.0.0",
24
28
  "lodash": "^4.17.21",
25
29
  "polished": "^2.0.0 || ^3.0.0 || ^4.0.0",
26
30
  "react": ">=16.8",
@@ -28,6 +32,11 @@
28
32
  "reselect": "^4.0.0 || ^5.0.0",
29
33
  "styled-components": ">=5"
30
34
  },
35
+ "peerDependenciesMeta": {
36
+ "@yak/react": {
37
+ "optional": true
38
+ }
39
+ },
31
40
  "devDependencies": {
32
41
  "@babel/core": "^7.2.0",
33
42
  "@babel/plugin-transform-runtime": "^7.2.0",
@@ -50,7 +59,7 @@
50
59
  },
51
60
  "scripts": {
52
61
  "test": "echo \"Error: no test specified\" && exit 1",
53
- "build": "rollup -c",
62
+ "build": "rollup -c && rollup -c --environment YAK",
54
63
  "prepare": "patch-package"
55
64
  },
56
65
  "repository": {
@@ -73,6 +82,7 @@
73
82
  },
74
83
  "files": [
75
84
  "lib",
85
+ "lib-yak",
76
86
  "src"
77
87
  ],
78
88
  "module": "lib/index.mjs",
@@ -1,8 +1,8 @@
1
1
  import React, {useEffect, useRef, useState} from 'react'
2
2
  import ContentEditableModule from 'react-contenteditable'
3
3
  import {useRefState, useToggle, useEnsureRef} from '@startlibs/core'
4
- import {ContextMenu, Li, Loading, Icon} from '@startlibs/components'
5
- import {Errors, useProvideErrors} from './Errors'
4
+ import {ContextMenu, Li, ListItem, Loading, Icon} from '@startlibs/components'
5
+ import {Errors, ErrorsCloseIcon, ErrorsItem, useProvideErrors} from './Errors'
6
6
  import {Field} from './Field'
7
7
  import {useInput} from './enhanceInput'
8
8
  import _ from 'lodash/fp'
@@ -96,11 +96,11 @@ const AddedBox = styled.span`
96
96
  white-space: nowrap;
97
97
  overflow: hidden;
98
98
  text-overflow: ellipsis;
99
- ${isSafari ? `
100
- vertical-align: 2px;
101
- `:`
102
- vertical-align: -7px;
103
- `}
99
+ /* isSafari não depende de props; uma const de módulo com um css condicional (ternário)
100
+ não é um mixin válido pro yak ("not a valid css value or css mixin"). Em posição de
101
+ valor, uma arrow function comum (mesmo sem usar props) segue a mesma regra de qualquer
102
+ valor dinâmico (R3). */
103
+ vertical-align: ${() => isSafari ? '2px' : '-7px'};
104
104
  `
105
105
  const RemoveIcon = styled(Icon)`
106
106
  width: 20px;
@@ -116,7 +116,7 @@ const RemoveIcon = styled(Icon)`
116
116
  text-align: center;
117
117
  cursor: pointer;
118
118
  color: ${getColor('gray120')};
119
- :hover {
119
+ &:hover {
120
120
  background-color: ${getColor('gray210')};
121
121
  color: ${props => darken(0.05, getColor('alert')(props))};
122
122
  }
@@ -126,7 +126,7 @@ const AutoCompleteMenu = styled(ContextMenu)`
126
126
  box-shadow: 0 2px 3px 1px rgba(0,0,0,0.2),0 0px 0px 1px rgba(0,0,0,0.05);
127
127
  max-height: 22rem;
128
128
  overflow: auto;
129
- ${ContextMenu.ListItem} {
129
+ ${ListItem} {
130
130
  > * {
131
131
  padding: 11px;
132
132
  }
@@ -134,14 +134,14 @@ const AutoCompleteMenu = styled(ContextMenu)`
134
134
  `
135
135
 
136
136
  const AutoCompleteError = styled(Errors)`
137
- ${Errors.Item} {
137
+ ${ErrorsItem} {
138
138
  background: transparent;
139
139
  border: none;
140
140
  color: ${getColor('alert')};
141
141
  padding: 0;
142
142
  margin-top: 0.5rem;
143
143
  font-weight: 600;
144
- ${Errors.CloseIcon} {
144
+ ${ErrorsCloseIcon} {
145
145
  display: none;
146
146
  }
147
147
  }
@@ -170,7 +170,7 @@ const DropdownIconContainer = styled(Icon)`
170
170
  text-align: center;
171
171
  cursor: pointer;
172
172
  color: ${getColor('gray90')};
173
- :hover, :active {
173
+ &:hover, &:active {
174
174
  background: rgba(0,0,0,0.15);
175
175
  }
176
176
  }
package/src/Checkbox.jsx CHANGED
@@ -11,7 +11,7 @@ const HiddenInput = styled.input`
11
11
  pointer-events: none;
12
12
  `
13
13
 
14
- export const Checkbox = ({className, children, isChecked = _.identity, isList, onClick, disabled, inverted, path, tabIndex = 1, raw, ...rest}) => {
14
+ export const Checkbox = ({className, style, children, isChecked = _.identity, isList, onClick, disabled, inverted, path, tabIndex = 1, raw, ...rest}) => {
15
15
  const focused = useToggle()
16
16
  const [v, ,{name, toggle, toggleItem, hasErrors}] = useInput({ path, isChecked,...rest}, raw)
17
17
  const testInvert = (v) => inverted ? !v : v
@@ -27,7 +27,7 @@ export const Checkbox = ({className, children, isChecked = _.identity, isList, o
27
27
  e.preventDefault();
28
28
  }
29
29
  }
30
- return <label onClick={_onClick} data-drag="false" className={className}>
30
+ return <label onClick={_onClick} data-drag="false" className={className} style={style}>
31
31
  {
32
32
  !isTouchDevice() && <HiddenInput
33
33
  onFocus={focused.open}
package/src/Combobox.jsx CHANGED
@@ -74,7 +74,7 @@ export const ComboboxInput = styled.div `
74
74
  border-color: ${getColor('gray180')};
75
75
  box-shadow: 0px 0px 0px 2px rgba(0,0,0,0.1);
76
76
  `}
77
- :focus {
77
+ &:focus {
78
78
  border-color: ${getColor('gray180')};
79
79
  box-shadow: 0px 0px 0px 2px rgba(0,0,0,0.1);
80
80
  }
@@ -2,7 +2,7 @@ import React, {forwardRef, useContext, useEffect, useRef, useState} from 'react'
2
2
  import styled, {css} from 'styled-components'
3
3
  import _ from 'lodash/fp'
4
4
  import {StartlibsContext, useEnsureRef, usePopupToggle, usePrevious} from '@startlibs/core'
5
- import {formatDate, formatDateToPattern, getColor, getNumberInputType, ifProp, media, parseDate} from '@startlibs/utils'
5
+ import {formatDate, formatDateToPattern, getColor, getNumberInputType, ifProp, insertKeyframes, media, parseDate} from '@startlibs/utils'
6
6
  import {Icon} from '@startlibs/components'
7
7
  import {Field} from './Field'
8
8
  import {TextInput} from './TextInput'
@@ -16,7 +16,22 @@ export const CALENDAR_LEVEL_YEAR = 'year'
16
16
 
17
17
  const LEVELS = [CALENDAR_LEVEL_DAY, CALENDAR_LEVEL_MONTH, CALENDAR_LEVEL_YEAR]
18
18
 
19
- const DatePickerContainer = styled.div`
19
+ // Nome fixo do @keyframes preservado: um `keyframes` do styled-components geraria um nome
20
+ // com hash, diferente do atual "datePickerFadeInDown" (quebraria quem lê animationName). Por
21
+ // isso o bloco fica fora de um template styled/css/keyframes, registrado pelo CSSOM (sem
22
+ // nonce) no primeiro render do DatePickerContainer (mesmo padrão de components/src/Loading.jsx).
23
+ const injectDatePickerFadeInDownKeyframes = () => insertKeyframes('datePickerFadeInDown',
24
+ 'from { opacity: 0; transform: translateY(-10px); pointer-events: none; } to { opacity: 1; transform: none; pointer-events: none; }')
25
+
26
+ // styled(DatePickerContainerBase) mira num componente, não numa tag: ao contrário do antigo
27
+ // styled.div, o styled-components não filtra prop inválida pra <div> nesse caso. O template
28
+ // abaixo não lê nenhuma prop custom, então repassar tudo com {...props} é seguro.
29
+ const DatePickerContainerBase = React.forwardRef((props, ref) => {
30
+ injectDatePickerFadeInDownKeyframes()
31
+ return <div ref={ref} {...props}/>
32
+ })
33
+
34
+ const DatePickerContainer = styled(DatePickerContainerBase)`
20
35
  width: 20rem;
21
36
  position: absolute;
22
37
  z-index: 100;
@@ -38,18 +53,6 @@ const DatePickerContainer = styled.div`
38
53
  width: 2.5rem;
39
54
  `}
40
55
  }
41
- @keyframes datePickerFadeInDown {
42
- from {
43
- opacity: 0;
44
- transform: translateY(-10px);
45
- pointer-events: none;
46
- }
47
- to {
48
- opacity: 1;
49
- transform: none;
50
- pointer-events: none;
51
- }
52
- }
53
56
  `
54
57
 
55
58
  const CalendarHeader = styled.div`
@@ -75,7 +78,7 @@ const WeekHeader = styled(CalendarContentContainer)`
75
78
  `
76
79
 
77
80
  const CalendarClickable = styled.a`
78
- :hover, :focus {
81
+ &:hover, &:focus {
79
82
  background-color: rgba(0,0,0,0.1);
80
83
  cursor: pointer;
81
84
  }
@@ -115,12 +118,12 @@ const CalendarContent = styled(CalendarClickable)`
115
118
  )}
116
119
  ${ifProp('isCurrent', css`
117
120
  background: ${getColor('main')};
118
- color: #FFF;
119
- :hover {
121
+ color: #FFF;
122
+ &:hover {
120
123
  background-color: ${props => darken(0.075, getColor('main')(props))};
121
124
  }
122
125
  ${ifProp('isSelected', 'box-shadow: none;')}
123
- `)}
126
+ `)}
124
127
  `
125
128
 
126
129
  const DayItem = styled(CalendarContent)`
@@ -146,7 +149,7 @@ const DatePickerInputIcon = styled(Icon)`
146
149
  width: 2rem;
147
150
  cursor: pointer;
148
151
  color: ${getColor('gray150')};
149
- :hover {
152
+ &:hover {
150
153
  color: ${getColor('main')};
151
154
  }
152
155
  display: none;
@@ -173,7 +176,7 @@ const ClearButton = styled(Icon)`
173
176
  text-align: center;
174
177
  border-radius: 50%;
175
178
  background: rgba(0,0,0,0.1);
176
- :hover {
179
+ &:hover {
177
180
  background: #f7d3d4;
178
181
  color: ${getColor('alert')};
179
182
  }
@@ -199,10 +202,10 @@ const ShortcutsWrapper = styled.div`
199
202
  font-size: 13px;
200
203
  `}
201
204
 
202
- :hover {
205
+ &:hover {
203
206
  color: ${getColor('main')};
204
207
  }
205
-
208
+
206
209
  ${ifProp('disabled', css`
207
210
  pointer-events: none;
208
211
  opacity: 0.5;
package/src/Errors.jsx CHANGED
@@ -118,25 +118,31 @@ export const Errors = ({path,filter,className, autoScroll}) => {
118
118
  }
119
119
  },[uniqErrors])
120
120
 
121
- return <TransitionDiv block>{uniqErrors.length > 0 && <Errors.Container ref={ref} className={className}>
121
+ return <TransitionDiv block>{uniqErrors.length > 0 && <ErrorsContainer ref={ref} className={className}>
122
122
  {uniqErrors.map(([value]) => value && value !== true &&
123
- <Errors.Item key={value}>
123
+ <ErrorsItem key={value}>
124
124
  {value}
125
- <Errors.CloseIcon onClick={willRemoveError(value, path)}/>
126
- </Errors.Item>
125
+ <ErrorsCloseIcon onClick={willRemoveError(value, path)}/>
126
+ </ErrorsItem>
127
127
  )}
128
- </Errors.Container>}</TransitionDiv>
128
+ </ErrorsContainer>}</TransitionDiv>
129
129
  }
130
130
 
131
131
  Errors.displayName = 'Errors'
132
132
 
133
- Errors.Container = styled.ul`
133
+ // Nomes próprios (não `Errors.Container = ...`) porque o yak resolve `${Errors.Item}` num outro
134
+ // arquivo tentando avaliar o módulo inteiro de `Errors` (um componente React de verdade, com
135
+ // hooks) em tempo de build — e falha ("rename Errors.mjs so its exports run at build time (or
136
+ // replace Errors.Item with a literal value)"). Um export próprio resolve direto, sem depender do
137
+ // componente. `Errors.Container`/`Errors.Item`/`Errors.CloseIcon` continuam existindo (uso
138
+ // interno e compatibilidade de quem já importa `Errors` e lê essas propriedades).
139
+ export const ErrorsContainer = styled.ul`
134
140
  list-style-type: none;
135
141
  margin: 0;
136
142
  padding: 0;
137
143
  `
138
144
 
139
- Errors.Item = styled.li`
145
+ export const ErrorsItem = styled.li`
140
146
  background-color: ${props => lighten(0.42, props.theme.colors.alert)};
141
147
  padding: 1rem 3.5rem 1rem 1rem;
142
148
  border-radius: 8px;
@@ -151,7 +157,7 @@ Errors.Item = styled.li`
151
157
  }
152
158
  ${customTheme('ErrorItem')}
153
159
  `
154
- Errors.CloseIcon = styled(Icon).attrs({icon: 'x'})`
160
+ export const ErrorsCloseIcon = styled(Icon).attrs({icon: 'x'})`
155
161
  color: ${getColor('alert')};
156
162
  font-weight: 600;
157
163
  display: inline-block;
@@ -172,3 +178,7 @@ Errors.CloseIcon = styled(Icon).attrs({icon: 'x'})`
172
178
  }
173
179
  `
174
180
 
181
+ Errors.Container = ErrorsContainer
182
+ Errors.Item = ErrorsItem
183
+ Errors.CloseIcon = ErrorsCloseIcon
184
+
@@ -31,17 +31,17 @@ const ExpandableBoxStyled = styled.div`
31
31
  ${props => props.collapsed ? css`
32
32
  cursor: pointer;
33
33
  padding-right: 3.25rem;
34
- :hover {
34
+ &:hover {
35
35
  background: ${props => darken(0.035, getColor('lightBluishGray')(props))};
36
36
  }
37
- :active {
37
+ &:active {
38
38
  background: ${props => darken(0.05, getColor('lightBluishGray')(props))};
39
39
  transition: none;
40
40
  }
41
41
  `: css`
42
42
  padding: 1.5rem;
43
43
  ${media.max(340)`
44
- padding 1rem;
44
+ padding: 1rem;
45
45
  `}
46
46
  ${props => props.fixMarginBottom && `
47
47
  padding-bottom: 0.5rem !important;
package/src/Field.jsx CHANGED
@@ -16,7 +16,12 @@ const Container = styled.div`
16
16
  margin-bottom: ${props => getMargin(props.theme.Field.margins)(props)};
17
17
  text-align: left;
18
18
  `
19
- const Label = styled.label`
19
+ // Nome próprio (não só `Field.Label = ...`): TextInput.jsx usa `${Field.Label}` como seletor
20
+ // (FloatingFieldType) num ARQUIVO DIFERENTE, e o yak tenta resolver isso avaliando o módulo
21
+ // inteiro de `Field` (um componente React de verdade) em tempo de build — falha com um
22
+ // `undefined` na saída (mesmo problema do Errors.Item, ver Errors.jsx). `Field.Label` continua
23
+ // existindo (uso interno e compatibilidade).
24
+ export const FieldLabel = styled.label`
20
25
  font-weight: 550;
21
26
  display: inline-block;
22
27
  font-size: ${props => props.labelFontSize ? props.labelFontSize : '15'}px;
@@ -58,18 +63,18 @@ export const Field = React.forwardRef((
58
63
  <Container ref={ref} {...rest} className={className}>
59
64
  {
60
65
  label &&
61
- <Label {...rest} onClick={labelClick} labelFontSize={labelFontSize}>
66
+ <FieldLabel {...rest} onClick={labelClick} labelFontSize={labelFontSize}>
62
67
  {label}{mandatory && <Mandatory mandatory={mandatory}>*</Mandatory>}
63
68
  {helpText && <HelpText> {helpText}</HelpText>}
64
69
  {descText && <FieldDescription>{descText}</FieldDescription>}
65
- </Label>
70
+ </FieldLabel>
66
71
  }
67
72
  {children}
68
73
  {bellowDescText && <BellowFieldDescription>{bellowDescText}</BellowFieldDescription>}
69
74
  </Container>
70
75
  )
71
76
 
72
- Field.Label = Label
77
+ Field.Label = FieldLabel
73
78
  Field.Container = Container
74
79
  Field.HelpText = HelpText
75
80
  Field.Description = FieldDescription
package/src/FieldBox.jsx CHANGED
@@ -45,10 +45,10 @@ const DeleteButton = styled(Icon).attrs({icon: 'x'})`
45
45
  color: ${getColor('gray120')};
46
46
  background-color: rgba(0,0,0,0.08);
47
47
  flex-shrink: 0;
48
- :hover {
48
+ &:hover {
49
49
  background: rgba(0,0,0,0.11);
50
50
  }
51
- :active {
51
+ &:active {
52
52
  background: rgba(0,0,0,0.13);
53
53
  }
54
54
  `
@@ -66,10 +66,10 @@ const DropdownButton = styled(Icon).attrs({icon: 'arrow-down'})`
66
66
  background-color: rgba(0,0,0,0.08);
67
67
  flex-shrink: 0;
68
68
  position: relative;
69
- :hover {
69
+ &:hover {
70
70
  background: rgba(0,0,0,0.11);
71
71
  }
72
- :active {
72
+ &:active {
73
73
  background: rgba(0,0,0,0.13);
74
74
  }
75
75
  `
@@ -115,10 +115,10 @@ export const FieldBox = styled(({className,label,helpText,descText,actionLabel,r
115
115
  transition: border-radius 0.5s ease;
116
116
  ${props => props.onClick && css`
117
117
  cursor: pointer;
118
- :hover {
118
+ &:hover {
119
119
  background: ${props => darken(0.035, getColor('lightBluishGray')(props))};
120
120
  }
121
- :active {
121
+ &:active {
122
122
  background: ${props => darken(0.05, getColor('lightBluishGray')(props))};
123
123
  transition: none;
124
124
  }
@@ -55,7 +55,7 @@ export const StyledIconRadioBox = styled(({className, setFromField, name, tabInd
55
55
  color:#fff;
56
56
  }
57
57
  ` : css`
58
- :hover ${Text} {
58
+ &:hover ${Text} {
59
59
  background-color: ${getColor('gray150')};
60
60
  color: #fff;
61
61
  }
@@ -55,7 +55,7 @@ export const InputboxGroup = styled(({path, className, column, as = column ? Spl
55
55
  ` : `
56
56
  ${SimpleRadiobox}, ${SimpleCheckbox} {
57
57
  margin-bottom: 0.5rem;
58
- :last-child {
58
+ &:last-child {
59
59
  margin-bottom: 1.5rem;
60
60
  }
61
61
  }
package/src/RichText.jsx CHANGED
@@ -88,6 +88,23 @@ const FIX_STYLE = {
88
88
  }
89
89
  }
90
90
 
91
+ // Precisa vir antes de RichTextContainer: o yak resolve `${ToolsContainer}` (seletor dentro de
92
+ // props.showToolbar) estaticamente lendo o módulo de cima pra baixo — em tempo de execução
93
+ // (sc) a ordem nunca importou, já que o template só lê ToolsContainer dentro de um callback
94
+ // (props => ...), chamado bem depois do módulo inteiro já ter sido avaliado.
95
+ const ToolsContainer = styled.div`
96
+ background: ${getColor('lightBluishGray')};
97
+ padding: 0 0.125rem;
98
+ border-top-left-radius: 7px;
99
+ border-top-right-radius: 7px;
100
+ transition: 0.225s;
101
+ max-height: 0;
102
+ pointer-events: none;
103
+ overflow: hidden;
104
+ display: flex;
105
+ align-items: center;
106
+ `
107
+
91
108
  export const RichTextContainer = styled.div`
92
109
  position:relative;
93
110
  width: 100%;
@@ -159,19 +176,6 @@ export const RichTextInput = styled.div`
159
176
  `}
160
177
  `
161
178
 
162
- const ToolsContainer = styled.div`
163
- background: ${getColor('lightBluishGray')};
164
- padding: 0 0.125rem;
165
- border-top-left-radius: 7px;
166
- border-top-right-radius: 7px;
167
- transition: 0.225s;
168
- max-height: 0;
169
- pointer-events: none;
170
- overflow: hidden;
171
- display: flex;
172
- align-items: center;
173
- `
174
-
175
179
  const ToolButton = styled(Button)`
176
180
  min-height: 2rem;
177
181
  min-width: 2rem;