Compare commits

...

No commits in common. "e14630ab42089c559cb5871bc267678b08c17c21" and "945cdf5202912d3cb1190be441de36cbe216432a" have entirely different histories.

56 changed files with 5796 additions and 6662 deletions

View File

@ -1,8 +0,0 @@
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
insert_final_newline = true

View File

@ -1 +0,0 @@
build/

View File

@ -1,3 +0,0 @@
{
"extends": "./node_modules/gts/"
}

12
.eslintrc.yml Normal file
View File

@ -0,0 +1,12 @@
env:
browser: true
es2021: true
extends:
- standard-with-typescript
- plugin:react/recommended
parserOptions:
ecmaVersion: latest
sourceType: module
plugins:
- react
rules: {}

5
.idea/.gitignore vendored
View File

@ -1,5 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@ -1,6 +1,15 @@
<component name="InspectionProjectProfileManager"> <component name="InspectionProjectProfileManager">
<profile version="1.0"> <profile version="1.0">
<option name="myName" value="Project Default" /> <option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" /> <inspection_tool class="HtmlUnknownAttribute" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues">
<value>
<list size="1">
<item index="0" class="java.lang.String" itemvalue="indeterminate" />
</list>
</value>
</option>
<option name="myCustomValuesEnabled" value="true" />
</inspection_tool>
</profile> </profile>
</component> </component>

View File

@ -2,7 +2,7 @@
<project version="4"> <project version="4">
<component name="ProjectModuleManager"> <component name="ProjectModuleManager">
<modules> <modules>
<module fileurl="file://$PROJECT_DIR$/.idea/google_m3_ui_kit.iml" filepath="$PROJECT_DIR$/.idea/google_m3_ui_kit.iml" /> <module fileurl="file://$PROJECT_DIR$/.idea/doryan-blog-next-turbo.iml" filepath="$PROJECT_DIR$/.idea/doryan-blog-next-turbo.iml" />
</modules> </modules>
</component> </component>
</project> </project>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,4 @@
<changelist name="Uncommitted_changes_before_Update_at_1_28_24,_7_04_PM_[Changes]" date="1706454282148" recycled="true" deleted="true">
<option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_1_28_24,_7_04_PM_[Changes]/shelved.patch" />
<option name="DESCRIPTION" value="Uncommitted changes before Update at 1/28/24, 7:04 PM [Changes]" />
</changelist>

25
.idea/watcherTasks.xml Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectTasksOptions">
<TaskOptions isEnabled="true">
<option name="arguments" value="$FileName$:$FileNameWithoutExtension$.css" />
<option name="checkSyntaxErrors" value="true" />
<option name="description" />
<option name="exitCodeBehavior" value="ERROR" />
<option name="fileExtension" value="sass" />
<option name="immediateSync" value="true" />
<option name="name" value="Sass" />
<option name="output" value="$FileNameWithoutExtension$.css:$FileNameWithoutExtension$.css.map" />
<option name="outputFilters">
<array />
</option>
<option name="outputFromStdout" value="false" />
<option name="program" value="sass" />
<option name="runOnExternalChanges" value="true" />
<option name="scopeName" value="Project Files" />
<option name="trackOnlyRoot" value="false" />
<option name="workingDir" value="$FileDir$" />
<envs />
</TaskOptions>
</component>
</project>

657
.idea/workspace.xml Normal file
View File

@ -0,0 +1,657 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="dfedb2a6-20cd-4ce8-b2bd-3125f42708f3" name="Changes" comment="ADDED: opportunity align to the center ripple for all components that have ripple effect">
<change afterPath="$PROJECT_DIR$/src/primitive-components/checkbox-layout/checkbox-layout.types.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/primitive-components/icon/icon.tsx" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/primitive-components/icon/icon.types.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/primitive-components/text-field/text-field.types.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/styles/icon.sass" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/components/checkboxes.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/app/components/checkboxes.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/components/icon-buttons.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/app/components/icon-buttons.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/components/radios.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/app/components/radios.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/components/switches.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/app/components/switches.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/layout.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/app/layout.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/dist/output.css" beforeDir="false" afterPath="$PROJECT_DIR$/dist/output.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/dist/styles/styles.css" beforeDir="false" afterPath="$PROJECT_DIR$/dist/styles/styles.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/button-skeleton/button-layout.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/button-layout/button-layout.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/button-skeleton/button.types.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/button-layout/button.types.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/button/button.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/button/button.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/checkbox-skeleton/check-box-skeleton.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/checkbox-layout/check-box-skeleton.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/checkbox/checkbox.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/checkbox/checkbox.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/fab/fab.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/fab/fab.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/icon-button/icon-button.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/icon-button/icon-button.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/material-you-components.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/material-you-components.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/radio/radio.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/radio/radio.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/switch/switch.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/switch/switch.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/primitive-components/text-field/text-field.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/primitive-components/text-field/text-field.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/button.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/button.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/button.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/button.css.map" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/button.sass" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/button.sass" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/checkbox.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/checkbox.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/checkbox.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/checkbox.css.map" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/checkbox.sass" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/checkbox.sass" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/fabs.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/fabs.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/fabs.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/fabs.css.map" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/fonts.css" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/fonts.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/fonts.css.map" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/fonts.sass" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/fonts.sass" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/generics.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/generics.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/generics.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/generics.css.map" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/generics.sass" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/generics.sass" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/icon-button.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/icon-button.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/icon-button.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/icon-button.css.map" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/icon-button.sass" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/icon-button.sass" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/styles/mixins/m3-mixins.sass" beforeDir="false" afterPath="$PROJECT_DIR$/src/styles/mixins/m3-mixins.sass" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="TypeScript JSX File" />
<option value="Sass File" />
<option value="TypeScript File" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="HighlightingSettingsPerFile">
<setting file="file://$PROJECT_DIR$/node_modules/@material/web/checkbox/checkbox.d.ts" root0="SKIP_INSPECTION" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectColorInfo">{
&quot;customColor&quot;: &quot;&quot;,
&quot;associatedIndex&quot;: 2
}</component>
<component name="ProjectId" id="2aMzZwdBm9SBJKBvmCHBJPUs4Gu" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
&quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;last_opened_file_path&quot;: &quot;/home/drn04/material-you-react&quot;,
&quot;list.type.of.created.stylesheet&quot;: &quot;Sass&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;watcher.settings&quot;,
&quot;ts.external.directory.path&quot;: &quot;/home/doryan04/DoryanNetwork/doryan-blog-next-turbo/node_modules/typescript/lib&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
}
}</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src/styles" />
<recent name="$PROJECT_DIR$/src/styles/font" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src/primitive-components" />
</key>
</component>
<component name="RunManager" selected="npm.dev">
<configuration name="build" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="build" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
<configuration name="dev" type="js.build_tools.npm" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="dev" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
<configuration name="start" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="start" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="npm.start" />
<item itemvalue="npm.build" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="dfedb2a6-20cd-4ce8-b2bd-3125f42708f3" name="Changes" comment="" />
<created>1704143295326</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1704143295326</updated>
<workItem from="1704143297251" duration="2066000" />
<workItem from="1704145458812" duration="1333000" />
<workItem from="1704147434511" duration="2788000" />
<workItem from="1704179271846" duration="27334000" />
<workItem from="1704228987899" duration="62000" />
<workItem from="1704266465200" duration="4226000" />
<workItem from="1704303741925" duration="11908000" />
<workItem from="1704352985433" duration="28906000" />
<workItem from="1704441648986" duration="8737000" />
<workItem from="1704453712620" duration="34000" />
<workItem from="1704453866252" duration="4606000" />
<workItem from="1704470557960" duration="599000" />
<workItem from="1704482822622" duration="25572000" />
<workItem from="1704622017317" duration="1170000" />
<workItem from="1704624362614" duration="32454000" />
<workItem from="1704736262141" duration="16696000" />
<workItem from="1704788077373" duration="1228000" />
<workItem from="1704791818898" duration="8375000" />
<workItem from="1704833453490" duration="5101000" />
<workItem from="1704989132540" duration="9364000" />
<workItem from="1705064322484" duration="9060000" />
<workItem from="1705088474200" duration="6084000" />
<workItem from="1705095829356" duration="1674000" />
<workItem from="1705097515215" duration="1484000" />
<workItem from="1705144217658" duration="184000" />
<workItem from="1705175691296" duration="9914000" />
<workItem from="1705221294286" duration="3349000" />
<workItem from="1705225252401" duration="32000" />
<workItem from="1705225292674" duration="8000" />
<workItem from="1705225306474" duration="555000" />
<workItem from="1705446738426" duration="38000" />
<workItem from="1705483840463" duration="31000" />
<workItem from="1705521877221" duration="7923000" />
<workItem from="1705592136891" duration="692000" />
<workItem from="1705594003195" duration="6604000" />
<workItem from="1705603674262" duration="5421000" />
<workItem from="1705661083275" duration="4000" />
<workItem from="1705666401100" duration="1064000" />
<workItem from="1705667596747" duration="3042000" />
<workItem from="1705671414099" duration="1026000" />
<workItem from="1705695392779" duration="6092000" />
<workItem from="1705775936603" duration="80000" />
<workItem from="1705776495106" duration="3149000" />
<workItem from="1705784955475" duration="3244000" />
<workItem from="1705824814760" duration="3000" />
<workItem from="1705872118999" duration="5390000" />
<workItem from="1705911291566" duration="124000" />
<workItem from="1705937322215" duration="316000" />
<workItem from="1705937839794" duration="11116000" />
<workItem from="1706023242228" duration="822000" />
<workItem from="1706024195558" duration="6543000" />
<workItem from="1706212432785" duration="1892000" />
<workItem from="1706214971346" duration="611000" />
<workItem from="1706288977398" duration="4026000" />
<workItem from="1706338830405" duration="10157000" />
<workItem from="1706351565380" duration="805000" />
<workItem from="1706373080363" duration="1879000" />
<workItem from="1706426744715" duration="17520000" />
<workItem from="1706516378911" duration="15403000" />
<workItem from="1706552378046" duration="8738000" />
<workItem from="1706598284665" duration="4240000" />
<workItem from="1706617852695" duration="6530000" />
<workItem from="1706629691514" duration="13025000" />
</task>
<task id="LOCAL-00025" summary="added radio component">
<option name="closed" value="true" />
<created>1704577073405</created>
<option name="number" value="00025" />
<option name="presentableId" value="LOCAL-00025" />
<option name="project" value="LOCAL" />
<updated>1704577073405</updated>
</task>
<task id="LOCAL-00026" summary="added in preview page radio component">
<option name="closed" value="true" />
<created>1704577088372</created>
<option name="number" value="00026" />
<option name="presentableId" value="LOCAL-00026" />
<option name="project" value="LOCAL" />
<updated>1704577088372</updated>
</task>
<task id="LOCAL-00027" summary="I forgot, what I change">
<option name="closed" value="true" />
<created>1704577111494</created>
<option name="number" value="00027" />
<option name="presentableId" value="LOCAL-00027" />
<option name="project" value="LOCAL" />
<updated>1704577111494</updated>
</task>
<task id="LOCAL-00028" summary="I forgot, what I change">
<option name="closed" value="true" />
<created>1704577125154</created>
<option name="number" value="00028" />
<option name="presentableId" value="LOCAL-00028" />
<option name="project" value="LOCAL" />
<updated>1704577125154</updated>
</task>
<task id="LOCAL-00029" summary="added radio styles and mixins">
<option name="closed" value="true" />
<created>1704577139599</created>
<option name="number" value="00029" />
<option name="presentableId" value="LOCAL-00029" />
<option name="project" value="LOCAL" />
<updated>1704577139599</updated>
</task>
<task id="LOCAL-00030" summary="radio styles component update">
<option name="closed" value="true" />
<created>1704665181492</created>
<option name="number" value="00030" />
<option name="presentableId" value="LOCAL-00030" />
<option name="project" value="LOCAL" />
<updated>1704665181492</updated>
</task>
<task id="LOCAL-00031" summary="I forgot, what I changed">
<option name="closed" value="true" />
<created>1704665219291</created>
<option name="number" value="00031" />
<option name="presentableId" value="LOCAL-00031" />
<option name="project" value="LOCAL" />
<updated>1704665219291</updated>
</task>
<task id="LOCAL-00032" summary="Updated switch styles">
<option name="closed" value="true" />
<created>1704665235238</created>
<option name="number" value="00032" />
<option name="presentableId" value="LOCAL-00032" />
<option name="project" value="LOCAL" />
<updated>1704665235238</updated>
</task>
<task id="LOCAL-00033" summary="Updated preview page">
<option name="closed" value="true" />
<created>1704665243297</created>
<option name="number" value="00033" />
<option name="presentableId" value="LOCAL-00033" />
<option name="project" value="LOCAL" />
<updated>1704665243297</updated>
</task>
<task id="LOCAL-00034" summary="added mixins">
<option name="closed" value="true" />
<created>1704665255268</created>
<option name="number" value="00034" />
<option name="presentableId" value="LOCAL-00034" />
<option name="project" value="LOCAL" />
<updated>1704665255268</updated>
</task>
<task id="LOCAL-00035" summary="moved fonts to separated file">
<option name="closed" value="true" />
<created>1704665272238</created>
<option name="number" value="00035" />
<option name="presentableId" value="LOCAL-00035" />
<option name="project" value="LOCAL" />
<updated>1704665272238</updated>
</task>
<task id="LOCAL-00036" summary="added roboto fonts">
<option name="closed" value="true" />
<created>1704665285628</created>
<option name="number" value="00036" />
<option name="presentableId" value="LOCAL-00036" />
<option name="project" value="LOCAL" />
<updated>1704665285628</updated>
</task>
<task id="LOCAL-00037" summary="added roboto fonts, fabs and fonts style sheets after sass compiling">
<option name="closed" value="true" />
<created>1704665322221</created>
<option name="number" value="00037" />
<option name="presentableId" value="LOCAL-00037" />
<option name="project" value="LOCAL" />
<updated>1704665322221</updated>
</task>
<task id="LOCAL-00038" summary="added and updated some component (fabs, button, switch, radio, checkbox)">
<option name="closed" value="true" />
<created>1704665352879</created>
<option name="number" value="00038" />
<option name="presentableId" value="LOCAL-00038" />
<option name="project" value="LOCAL" />
<updated>1704665352879</updated>
</task>
<task id="LOCAL-00039" summary="added sass style sheet file for fabs">
<option name="closed" value="true" />
<created>1704665367142</created>
<option name="number" value="00039" />
<option name="presentableId" value="LOCAL-00039" />
<option name="project" value="LOCAL" />
<updated>1704665367142</updated>
</task>
<task id="LOCAL-00040" summary="updated button styles and renaming button component file">
<option name="closed" value="true" />
<created>1704665398936</created>
<option name="number" value="00040" />
<option name="presentableId" value="LOCAL-00040" />
<option name="project" value="LOCAL" />
<updated>1704665398936</updated>
</task>
<task id="LOCAL-00041" summary="updated checkbox styles">
<option name="closed" value="true" />
<created>1704665410733</created>
<option name="number" value="00041" />
<option name="presentableId" value="LOCAL-00041" />
<option name="project" value="LOCAL" />
<updated>1704665410733</updated>
</task>
<task id="LOCAL-00042" summary="updated styles for preview page">
<option name="closed" value="true" />
<created>1704748096828</created>
<option name="number" value="00042" />
<option name="presentableId" value="LOCAL-00042" />
<option name="project" value="LOCAL" />
<updated>1704748096828</updated>
</task>
<task id="LOCAL-00043" summary="switch styles completed">
<option name="closed" value="true" />
<created>1704748124500</created>
<option name="number" value="00043" />
<option name="presentableId" value="LOCAL-00043" />
<option name="project" value="LOCAL" />
<updated>1704748124500</updated>
</task>
<task id="LOCAL-00044" summary="updated preview page">
<option name="closed" value="true" />
<created>1704748135954</created>
<option name="number" value="00044" />
<option name="presentableId" value="LOCAL-00044" />
<option name="project" value="LOCAL" />
<updated>1704748135954</updated>
</task>
<task id="LOCAL-00045" summary="added attribute &quot;selected&quot; for icons">
<option name="closed" value="true" />
<created>1704748153364</created>
<option name="number" value="00045" />
<option name="presentableId" value="LOCAL-00045" />
<option name="project" value="LOCAL" />
<updated>1704748153364</updated>
</task>
<task id="LOCAL-00046" summary="switch styles hotfix">
<option name="closed" value="true" />
<created>1704751209333</created>
<option name="number" value="00046" />
<option name="presentableId" value="LOCAL-00046" />
<option name="project" value="LOCAL" />
<updated>1704751209333</updated>
</task>
<task id="LOCAL-00047" summary="switch styles hotfix">
<option name="closed" value="true" />
<created>1704751889114</created>
<option name="number" value="00047" />
<option name="presentableId" value="LOCAL-00047" />
<option name="project" value="LOCAL" />
<updated>1704751889114</updated>
</task>
<task id="LOCAL-00048" summary="added compiled sass styles for icon-buttons">
<option name="closed" value="true" />
<created>1704837754211</created>
<option name="number" value="00048" />
<option name="presentableId" value="LOCAL-00048" />
<option name="project" value="LOCAL" />
<updated>1704837754211</updated>
</task>
<task id="LOCAL-00049" summary="icon button styles completed">
<option name="closed" value="true" />
<created>1704837786812</created>
<option name="number" value="00049" />
<option name="presentableId" value="LOCAL-00049" />
<option name="project" value="LOCAL" />
<updated>1704837786812</updated>
</task>
<task id="LOCAL-00050" summary="separated components previews">
<option name="closed" value="true" />
<created>1704837827996</created>
<option name="number" value="00050" />
<option name="presentableId" value="LOCAL-00050" />
<option name="project" value="LOCAL" />
<updated>1704837827996</updated>
</task>
<task id="LOCAL-00051" summary="added m3 wrapper">
<option name="closed" value="true" />
<created>1704837841727</created>
<option name="number" value="00051" />
<option name="presentableId" value="LOCAL-00051" />
<option name="project" value="LOCAL" />
<updated>1704837841727</updated>
</task>
<task id="LOCAL-00052" summary="added icon button (wip)">
<option name="closed" value="true" />
<created>1704837855501</created>
<option name="number" value="00052" />
<option name="presentableId" value="LOCAL-00052" />
<option name="project" value="LOCAL" />
<updated>1704837855501</updated>
</task>
<task id="LOCAL-00053" summary="??? wtf bro">
<option name="closed" value="true" />
<created>1704837877968</created>
<option name="number" value="00053" />
<option name="presentableId" value="LOCAL-00053" />
<option name="project" value="LOCAL" />
<updated>1704837877968</updated>
</task>
<task id="LOCAL-00054" summary="??? wtf bro">
<option name="closed" value="true" />
<created>1704837881086</created>
<option name="number" value="00054" />
<option name="presentableId" value="LOCAL-00054" />
<option name="project" value="LOCAL" />
<updated>1704837881086</updated>
</task>
<task id="LOCAL-00055" summary="??? wtf bro">
<option name="closed" value="true" />
<created>1704837896608</created>
<option name="number" value="00055" />
<option name="presentableId" value="LOCAL-00055" />
<option name="project" value="LOCAL" />
<updated>1704837896608</updated>
</task>
<task id="LOCAL-00056" summary="updated styles">
<option name="closed" value="true" />
<created>1704837910534</created>
<option name="number" value="00056" />
<option name="presentableId" value="LOCAL-00056" />
<option name="project" value="LOCAL" />
<updated>1704837910534</updated>
</task>
<task id="LOCAL-00057" summary="added forward ref for further refs actions, added functionality for switchable icon buttons, added half of styles for icon buttons">
<option name="closed" value="true" />
<created>1705098993824</created>
<option name="number" value="00057" />
<option name="presentableId" value="LOCAL-00057" />
<option name="project" value="LOCAL" />
<updated>1705098993824</updated>
</task>
<task id="LOCAL-00058" summary="icon button styles completed">
<option name="closed" value="true" />
<created>1705187043022</created>
<option name="number" value="00058" />
<option name="presentableId" value="LOCAL-00058" />
<option name="project" value="LOCAL" />
<updated>1705187043022</updated>
</task>
<task id="LOCAL-00059" summary="icon button styles completed">
<option name="closed" value="true" />
<created>1705187047711</created>
<option name="number" value="00059" />
<option name="presentableId" value="LOCAL-00059" />
<option name="project" value="LOCAL" />
<updated>1705187047711</updated>
</task>
<task id="LOCAL-00060" summary="icon button styles completed">
<option name="closed" value="true" />
<created>1705187050731</created>
<option name="number" value="00060" />
<option name="presentableId" value="LOCAL-00060" />
<option name="project" value="LOCAL" />
<updated>1705187050731</updated>
</task>
<task id="LOCAL-00061" summary="added a few variation of icon button">
<option name="closed" value="true" />
<created>1705187070169</created>
<option name="number" value="00061" />
<option name="presentableId" value="LOCAL-00061" />
<option name="project" value="LOCAL" />
<updated>1705187070169</updated>
</task>
<task id="LOCAL-00062" summary="added support attribute &quot;selected&quot; for icon buttons">
<option name="closed" value="true" />
<created>1705187096566</created>
<option name="number" value="00062" />
<option name="presentableId" value="LOCAL-00062" />
<option name="project" value="LOCAL" />
<updated>1705187096567</updated>
</task>
<task id="LOCAL-00063" summary="improved file management">
<option name="closed" value="true" />
<created>1705446770845</created>
<option name="number" value="00063" />
<option name="presentableId" value="LOCAL-00063" />
<option name="project" value="LOCAL" />
<updated>1705446770846</updated>
</task>
<task id="LOCAL-00064" summary="TODO: complete supporting text&#10;ADDED: semi-complete filled text fields&#10;CHANGED: preview page and m3 color scheme">
<option name="closed" value="true" />
<created>1705788187457</created>
<option name="number" value="00064" />
<option name="presentableId" value="LOCAL-00064" />
<option name="project" value="LOCAL" />
<updated>1705788187457</updated>
</task>
<task id="LOCAL-00065" summary="TODO: complete supporting text&#10;ADDED: semi-complete filled text fields&#10;CHANGED: preview page and m3 color scheme">
<option name="closed" value="true" />
<created>1705788194219</created>
<option name="number" value="00065" />
<option name="presentableId" value="LOCAL-00065" />
<option name="project" value="LOCAL" />
<updated>1705788194219</updated>
</task>
<task id="LOCAL-00066" summary="TODO: before icon&#10;ADDED: semi-complete filled text fields">
<option name="closed" value="true" />
<created>1705877491483</created>
<option name="number" value="00066" />
<option name="presentableId" value="LOCAL-00066" />
<option name="project" value="LOCAL" />
<updated>1705877491483</updated>
</task>
<task id="LOCAL-00067" summary="TODO: placeholder&#10;ADDED: supported text, animation move for label, and etc">
<option name="closed" value="true" />
<created>1705955541881</created>
<option name="number" value="00067" />
<option name="presentableId" value="LOCAL-00067" />
<option name="project" value="LOCAL" />
<updated>1705955541881</updated>
</task>
<task id="LOCAL-00068" summary="DONE: I forget, what I do">
<option name="closed" value="true" />
<created>1706461771129</created>
<option name="number" value="00068" />
<option name="presentableId" value="LOCAL-00068" />
<option name="project" value="LOCAL" />
<updated>1706461771129</updated>
</task>
<task id="LOCAL-00069" summary="DONE: I forget, what I do">
<option name="closed" value="true" />
<created>1706461783505</created>
<option name="number" value="00069" />
<option name="presentableId" value="LOCAL-00069" />
<option name="project" value="LOCAL" />
<updated>1706461783505</updated>
</task>
<task id="LOCAL-00070" summary="DONE: Dividers, Badges, disable elevation state for FABS&#10;FIXED: Checkboxes, toggled icon-button style">
<option name="closed" value="true" />
<created>1706560991099</created>
<option name="number" value="00070" />
<option name="presentableId" value="LOCAL-00070" />
<option name="project" value="LOCAL" />
<updated>1706560991099</updated>
</task>
<task id="LOCAL-00071" summary="DONE: Dividers, Badges, disable elevation state for FABS&#10;FIXED: Checkboxes, toggled icon-button style">
<option name="closed" value="true" />
<created>1706561005869</created>
<option name="number" value="00071" />
<option name="presentableId" value="LOCAL-00071" />
<option name="project" value="LOCAL" />
<updated>1706561005869</updated>
</task>
<task id="LOCAL-00072" summary="UPDATE: README.md">
<option name="closed" value="true" />
<created>1706562164219</created>
<option name="number" value="00072" />
<option name="presentableId" value="LOCAL-00072" />
<option name="project" value="LOCAL" />
<updated>1706562164219</updated>
</task>
<task id="LOCAL-00073" summary="ADDED: opportunity align to the center ripple for all components that have ripple effect">
<option name="closed" value="true" />
<created>1706603599586</created>
<option name="number" value="00073" />
<option name="presentableId" value="LOCAL-00073" />
<option name="project" value="LOCAL" />
<updated>1706603599586</updated>
</task>
<option name="localTasksCounter" value="74" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="updated button styles and renaming button component file" />
<MESSAGE value="updated checkbox styles" />
<MESSAGE value="updated styles for preview page" />
<MESSAGE value="switch styles completed" />
<MESSAGE value="updated preview page" />
<MESSAGE value="added attribute &quot;selected&quot; for icons" />
<MESSAGE value="switch styles hotfix" />
<MESSAGE value="added compiled sass styles for icon-buttons" />
<MESSAGE value="separated components previews" />
<MESSAGE value="added m3 wrapper" />
<MESSAGE value="added icon button (wip)" />
<MESSAGE value="??? wtf bro" />
<MESSAGE value="updated styles" />
<MESSAGE value="added forward ref for further refs actions, added functionality for switchable icon buttons, added half of styles for icon buttons" />
<MESSAGE value="icon button styles completed" />
<MESSAGE value="added a few variation of icon button" />
<MESSAGE value="added support attribute &quot;selected&quot; for icon buttons" />
<MESSAGE value="improved file management" />
<MESSAGE value="TODO: complete supporting text&#10;ADDED: semi-complete filled text fields&#10;CHANGED: preview page and m3 color scheme" />
<MESSAGE value="TODO: before icon&#10;ADDED: semi-complete filled text fields" />
<MESSAGE value="TODO: placeholder&#10;ADDED: supported text, animation move for label, and etc" />
<MESSAGE value="DONE: I forget, what I do" />
<MESSAGE value="DONE: Dividers, Badges, disable elevation state for FABS&#10;FIXED: Checkboxes, toggled icon-button style" />
<MESSAGE value="UPDATE: README.md" />
<MESSAGE value="ADDED: opportunity align to the center ripple for all components that have ripple effect" />
<option name="LAST_COMMIT_MESSAGE" value="ADDED: opportunity align to the center ripple for all components that have ripple effect" />
</component>
</project>

View File

@ -1,3 +0,0 @@
module.exports = {
...require('gts/.prettierrc.json')
}

View File

@ -10,7 +10,6 @@ This repository is including and will be including components, enumerates in tab
- [x] Text fields - [x] Text fields
- [x] Switches - [x] Switches
- [ ] Chips - [ ] Chips
- [x] Icon
- [x] Ripple Effect - [x] Ripple Effect
- [x] Dividers - [x] Dividers
- [x] Badges - [x] Badges
@ -37,4 +36,4 @@ Nowadays, this UI kit have base kinds of components and you could make everythin
3. Custom theaming. 3. Custom theaming.
## Did you find the bug? Make sure to [leave an issue](https://github.com/doryan04/DSS/issues/new) in case of any problems. ## Did you find the bug? Make sure to [leave an issue](https://github.com/doryan04/DSS/issues/new) in case of any problems.
## If you want help to the project, please, advise your idea in Pull request and don't forget [send issue](https://github.com/doryan04/DSS/issues/new) ## If you want help to the project, please, advise your idea in Pull request and don't forget [send issue](https://github.com/doryan04/DSS/issues/new)
### Check out actual news on Telegram. [https://t.me/doryanProjects](https://t.me/doryanProjects) ### Check out actual news on Telegram. [https://t.me/doryanProjects](https://t.me/doryanProjects)

View File

@ -1,92 +1,75 @@
import React from 'react'; import React from 'react';
import {Badge} from '../../src/primitive-components/badge/badge'; import {Badge} from "../../src/primitive-components/badge/badge";
import {Divider} from '../../src/primitive-components/divider/divider'; import {Divider} from "../../src/primitive-components/divider/divider";
export default function Badges() { export default function Badges() {
return ( return (
<div <div className={"m3 m3-wrapper"} style={{display:"flex", flexDirection:"row"}}>
className={'m3 m3-wrapper'}
style={{display: 'flex', flexDirection: 'row'}}
>
<div> <div>
<div <div style={{
style={{ display: "flex",
display: 'flex', flexDirection: "column",
flexDirection: 'column', gap: "0.5em",
gap: '0.5em', justifyContent: "center",
justifyContent: 'center', alignItems: "center"
alignItems: 'center', }}>
}} <div style={{
> width: "24px",
<div aspectRatio: 1,
style={{ display: "flex",
width: '24px', justifyContent: "center",
aspectRatio: 1, alignItems: "center"
display: 'flex', }}>
justifyContent: 'center', <Badge/>
alignItems: 'center',
}}
>
<Badge />
</div> </div>
<Divider /> <Divider/>
<div <div style={{
style={{ width: "24px",
width: '24px', aspectRatio: 1,
aspectRatio: 1, display: "flex",
display: 'flex', justifyContent: "center",
justifyContent: 'center', alignItems: "center"
alignItems: 'center', }}>
}} <Badge disableValue/>
>
<Badge disableValue />
</div> </div>
<Divider /> <Divider/>
<div <div style={{
style={{ width: "24px",
width: '24px', aspectRatio: 1,
aspectRatio: 1, display: "flex",
display: 'flex', justifyContent: "center",
justifyContent: 'center', alignItems: "center"
alignItems: 'center', }}>
}}
>
<Badge disableValue>3487</Badge> <Badge disableValue>3487</Badge>
</div> </div>
<Divider /> <Divider/>
<div <div style={{
style={{ width: "24px",
width: '24px', aspectRatio: 1,
aspectRatio: 1, display: "flex",
display: 'flex', justifyContent: "center",
justifyContent: 'center', alignItems: "center"
alignItems: 'center', }}>
}}
>
<Badge>5</Badge> <Badge>5</Badge>
</div> </div>
<Divider /> <Divider/>
<div <div style={{
style={{ width: "24px",
width: '24px', aspectRatio: 1,
aspectRatio: 1, display: "flex",
display: 'flex', justifyContent: "center",
justifyContent: 'center', alignItems: "center"
alignItems: 'center', }}>
}}
>
<Badge>32</Badge> <Badge>32</Badge>
</div> </div>
<Divider /> <Divider/>
<div <div style={{
style={{ width: "24px",
width: '24px', aspectRatio: 1,
aspectRatio: 1, display: "flex",
display: 'flex', justifyContent: "center",
justifyContent: 'center', alignItems: "center"
alignItems: 'center', }}>
}}
>
<Badge>322342</Badge> <Badge>322342</Badge>
</div> </div>
</div> </div>
@ -133,4 +116,4 @@ export default function Badges() {
{/*</div>*/} {/*</div>*/}
</div> </div>
); );
} }

View File

@ -1,66 +1,56 @@
'use client'; "use client"
import React, {useCallback, useState} from 'react'; import React, {useCallback, useState} from 'react';
import {Button} from '../../src/primitive-components/material-you-components'; import {Button} from "../../src/primitive-components/material-you-components";
export default function Buttons() { export default function Buttons() {
const [state, setState] = useState(1); const [state, setState] = useState(1);
const callback = useCallback( const callback = useCallback(() =>
() => setState(prevState => prevState + 1), setState(prevState => prevState + 1)
[state] , [state]);
);
return ( return (
<div className={'m3 m3-wrapper'}> <div className={"m3 m3-wrapper"}>
<h1> Buttons </h1> <h1> Buttons </h1>
<div style={{display: 'flex', flexDirection: 'row', gap: '2em'}}> <div style={{display: "flex", flexDirection: "row", gap: "2em"}}>
<div> <div>
<h2> Default buttons </h2> <h2> Default buttons </h2>
<div <div style={{display: "flex", flexDirection: "column", width: "150px", gap: "0.5em"}}>
style={{ <Button variant={"filled"} onClick={callback} centralRipple>
display: 'flex',
flexDirection: 'column',
width: '150px',
gap: '0.5em',
}}
>
<Button
variant={'filled'}
onClick={callback}
centralRipple
>
Label + {state} Label + {state}
</Button> </Button>
<Button variant={'elevated'} /> <Button variant={"outlined"}>
<Button variant={'tonal'}>Label</Button> Label
<Button variant={'elevated'}>Label</Button> </Button>
<Button variant={'text'}>Label</Button> <Button variant={"tonal"}>
Label
</Button>
<Button variant={"elevated"}>
Label
</Button>
<Button variant={"text"}>
Label
</Button>
</div> </div>
</div> </div>
<div> <div>
<h2> Buttons with icon </h2> <h2> Buttons with icon </h2>
<div <div style={{display: "flex", flexDirection: "column", width: "150px", gap: "0.5em"}}>
style={{ <Button variant={"filled"} icon={"add"}>
display: 'flex',
flexDirection: 'column',
width: '150px',
gap: '0.5em',
}}
>
<Button variant={'filled'} icon={'add'}>
Label Label
</Button> </Button>
<Button variant={'outlined'} icon={'add'}> <Button variant={"outlined"} icon={"add"}>
Label Label
</Button> </Button>
<Button variant={'tonal'} icon={'add'}> <Button variant={"tonal"} icon={"add"}>
Label Label
</Button> </Button>
<Button variant={'elevated'} icon={'add'}> <Button variant={"elevated"} icon={"add"}>
Label Label
</Button> </Button>
<Button variant={'text'} icon={'add'}> <Button variant={"text"} icon={"add"}>
Label Label
</Button> </Button>
</div> </div>
@ -68,4 +58,4 @@ export default function Buttons() {
</div> </div>
</div> </div>
); );
} }

View File

@ -1,87 +1,47 @@
'use client'; "use client"
import React from 'react'; import React from 'react';
import { import {Button, Checkbox } from '../../src/primitive-components/material-you-components';
Button,
Checkbox,
} from '../../src/primitive-components/material-you-components';
export default function Checkboxes() { export default function Checkboxes() {
return ( return (
<div className={'m3 m3-wrapper'}> <div className={"m3 m3-wrapper"}>
<h1> Checkboxes </h1> <h1> Checkboxes </h1>
<div <div style={{display: "flex", flexDirection: "row", width: "100%", gap: "5em", justifyContent:"center"}}>
style={{ <div style={{display: "flex", flexDirection: "column", gap: "2em"}}>
display: 'flex',
flexDirection: 'row',
width: '100%',
gap: '5em',
justifyContent: 'center',
}}
>
<div
style={{
display: 'flex',
flexDirection: 'column',
gap: '2em',
}}
>
<div> <div>
<h2> Default </h2> <h2> Default </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<Checkbox centralRipple /> <Checkbox centralRipple/>
<Checkbox defaultChecked /> <Checkbox defaultChecked/>
<Checkbox indeterminate={true} /> <Checkbox indeterminate={true}/>
</div> </div>
</div> </div>
<div> <div>
<h2> Disabled </h2> <h2> Disabled </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<Checkbox disabled /> <Checkbox disabled/>
<Checkbox disabled defaultChecked /> <Checkbox disabled defaultChecked/>
</div> </div>
</div> </div>
</div> </div>
<div> <div>
<h2> Errored </h2> <h2> Errored </h2>
<form <form style={{display: "flex", gap: "2em", flexDirection: "column"}}>
style={{ <div style={{display: "flex", gap: "2em", flexDirection: "row"}}>
display: 'flex', <Checkbox required/>
gap: '2em', <Checkbox required defaultChecked/>
flexDirection: 'column', <Checkbox required indeterminate={true}/>
}}
>
<div
style={{
display: 'flex',
gap: '2em',
flexDirection: 'row',
}}
>
<Checkbox required />
<Checkbox required defaultChecked />
<Checkbox required indeterminate={true} />
</div> </div>
<div <div style={{display: "flex", gap: "2em", flexDirection: "row"}}>
style={{ <Checkbox required className={"m3-error"}/>
display: 'flex', <Checkbox required defaultChecked className={"m3-error"}/>
gap: '2em', <Checkbox required indeterminate={true} className={"m3-error"}/>
flexDirection: 'row',
}}
>
<Checkbox required className={'m3-error'} />
<Checkbox
required
defaultChecked
className={'m3-error'}
/>
<Checkbox
required
indeterminate={true}
className={'m3-error'}
/>
</div> </div>
<Button type={'submit'}>Send</Button> <Button type={"submit"}>
Send
</Button>
</form> </form>
</div> </div>
</div> </div>

View File

@ -1,123 +1,103 @@
import React from 'react'; import React from 'react';
import {FAB} from '../../src/primitive-components/material-you-components'; import {FAB} from "../../src/primitive-components/material-you-components";
export default function Fabs() { export default function Fabs() {
return ( return (
<div className={'m3 m3-wrapper'}> <div className={"m3 m3-wrapper"}>
<div style={{display: 'flex', flexDirection: 'row', gap: '2em'}}> <div style={{display:"flex",flexDirection:"row",gap:"2em"}}>
<div> <div>
<h1> FABs with elevation</h1> <h1> FABs with elevation</h1>
<div <div style={{display: "flex", flexDirection: "column", width: "100%", gap: "2em"}}>
style={{
display: 'flex',
flexDirection: 'column',
width: '100%',
gap: '2em',
}}
>
<div> <div>
<h2> Small </h2> <h2> Small </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<FAB <FAB size={"small"}
size={'small'} icon={"edit"}
icon={'edit'} elevated
elevated centralRipple/>
centralRipple <FAB variant={"primary"}
/> size={"small"}
<FAB icon={"edit"}
variant={'primary'} elevated/>
size={'small'} <FAB variant={"secondary"}
icon={'edit'} size={"small"}
elevated icon={"edit"}
/> elevated/>
<FAB <FAB variant={"tertiary"}
variant={'secondary'} size={"small"}
size={'small'} icon={"edit"}
icon={'edit'} elevated/>
elevated
/>
<FAB
variant={'tertiary'}
size={'small'}
icon={'edit'}
elevated
/>
</div> </div>
</div> </div>
<div> <div>
<h2> Default </h2> <h2> Default </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<FAB icon={'edit'} elevated /> <FAB icon={"edit"}
<FAB elevated/>
variant={'primary'} <FAB variant={"primary"}
icon={'edit'} icon={"edit"}
elevated elevated/>
/> <FAB variant={"secondary"}
<FAB icon={"edit"}
variant={'secondary'} elevated/>
icon={'edit'} <FAB variant={"tertiary"}
elevated icon={"edit"}
/> elevated/>
<FAB
variant={'tertiary'}
icon={'edit'}
elevated
/>
</div> </div>
</div> </div>
<div> <div>
<h2> Large </h2> <h2> Large </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<FAB size={'large'} icon={'edit'} /> <FAB size={"large"}
<FAB icon={"edit"}
variant={'primary'} elevated/>
size={'large'} <FAB variant={"primary"}
icon={'edit'} size={"large"}
elevated icon={"edit"}
/> elevated/>
<FAB <FAB variant={"secondary"}
variant={'secondary'} size={"large"}
size={'large'} icon={"edit"}
icon={'edit'} elevated/>
elevated <FAB variant={"tertiary"}
/> size={"large"}
<FAB icon={"edit"}
variant={'tertiary'} elevated/>
size={'large'}
icon={'edit'}
elevated
/>
</div> </div>
</div> </div>
<div> <div>
<h2> Extended </h2> <h2> Extended </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<FAB size={'extended'} icon={'edit'} elevated> <FAB size={"extended"}
<span className={'label-large'}>Label</span> icon={"edit"}
elevated>
<span className={"label-large"}>
Label
</span>
</FAB> </FAB>
<FAB <FAB variant={"primary"}
variant={'primary'} size={"extended"}
size={'extended'} icon={"edit"}
icon={'edit'} elevated>
elevated <span className={"label-large"}>
> Label
<span className={'label-large'}>Label</span> </span>
</FAB> </FAB>
<FAB <FAB variant={"secondary"}
variant={'secondary'} size={"extended"}
size={'extended'} icon={"edit"}
icon={'edit'} elevated>
elevated <span className={"label-large"}>
> Label
<span className={'label-large'}>Label</span> </span>
</FAB> </FAB>
<FAB <FAB variant={"tertiary"}
variant={'tertiary'} size={"extended"}
size={'extended'} icon={"edit"}
icon={'edit'} elevated>
elevated <span className={"label-large"}>
> Label
<span className={'label-large'}>Label</span> </span>
</FAB> </FAB>
</div> </div>
</div> </div>
@ -125,90 +105,77 @@ export default function Fabs() {
</div> </div>
<div> <div>
<h1> FABs without elevation</h1> <h1> FABs without elevation</h1>
<div <div style={{display: "flex", flexDirection: "column", width: "100%", gap: "2em"}}>
style={{
display: 'flex',
flexDirection: 'column',
width: '100%',
gap: '2em',
}}
>
<div> <div>
<h2> Small </h2> <h2> Small </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<FAB <FAB size={"small"}
size={'small'} icon={"edit"}/>
icon={'edit'} <FAB variant={"primary"}
variant={'primary'} size={"small"}
/> icon={"edit"}/>
<FAB <FAB variant={"secondary"}
variant={'secondary'} size={"small"}
size={'small'} icon={"edit"}/>
icon={'edit'} <FAB variant={"tertiary"}
/> size={"small"}
<FAB icon={"edit"}/>
variant={'tertiary'}
size={'small'}
icon={'edit'}
/>
</div> </div>
</div> </div>
<div> <div>
<h2> Default </h2> <h2> Default </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<FAB icon={'edit'} /> <FAB icon={"edit"}/>
<FAB variant={'primary'} icon={'edit'} /> <FAB variant={"primary"} icon={"edit"}/>
<FAB variant={'secondary'} icon={'edit'} /> <FAB variant={"secondary"} icon={"edit"}/>
<FAB variant={'tertiary'} icon={'edit'} /> <FAB variant={"tertiary"} icon={"edit"}/>
</div> </div>
</div> </div>
<div> <div>
<h2> Large </h2> <h2> Large </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<FAB size={'large'} icon={'edit'} /> <FAB size={"large"}
<FAB icon={"edit"}/>
variant={'primary'} <FAB variant={"primary"}
size={'large'} size={"large"}
icon={'edit'} icon={"edit"}/>
/> <FAB variant={"secondary"}
<FAB size={"large"}
variant={'secondary'} icon={"edit"}/>
size={'large'} <FAB variant={"tertiary"}
icon={'edit'} size={"large"}
/> icon={"edit"}/>
<FAB
variant={'tertiary'}
size={'large'}
icon={'edit'}
/>
</div> </div>
</div> </div>
<div> <div>
<h2> Extended </h2> <h2> Extended </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<FAB size={'extended'} icon={'edit'}> <FAB size={"extended"}
<span className={'label-large'}>Label</span> icon={"edit"}>
<span className={"label-large"}>
Label
</span>
</FAB> </FAB>
<FAB <FAB variant={"primary"}
variant={'primary'} size={"extended"}
size={'extended'} icon={"edit"}>
icon={'edit'} <span className={"label-large"}>
> Label
<span className={'label-large'}>Label</span> </span>
</FAB> </FAB>
<FAB <FAB variant={"secondary"}
variant={'secondary'} size={"extended"}
size={'extended'} icon={"edit"}>
icon={'edit'} <span className={"label-large"}>
> Label
<span className={'label-large'}>Label</span> </span>
</FAB> </FAB>
<FAB <FAB variant={"tertiary"}
variant={'tertiary'} size={"extended"}
size={'extended'} icon={"edit"}>
icon={'edit'} <span className={"label-large"}>
> Label
<span className={'label-large'}>Label</span> </span>
</FAB> </FAB>
</div> </div>
</div> </div>
@ -217,4 +184,4 @@ export default function Fabs() {
</div> </div>
</div> </div>
); );
} }

View File

@ -1,185 +1,111 @@
'use client'; "use client"
import React from 'react'; import React from 'react';
import {IconButton} from '../../src/primitive-components/material-you-components'; import {IconButton} from "../../src/primitive-components/material-you-components";
function IconButtons() { function IconButtons() {
return ( return (
<div className={'m3 m3-wrapper'}> <div className={"m3 m3-wrapper"}>
<h1> Icon buttons </h1> <h1> Icon buttons </h1>
<div style={{display: 'flex', flexDirection: 'row', gap: '2em'}}> <div style={{display: "flex", flexDirection: "row", gap: "2em"}}>
<div> <div>
<h2> Default buttons </h2> <h2> Default buttons </h2>
<div <div style={{display: "flex", flexDirection: "row", gap: "0.5em"}}>
style={{ <IconButton icon={"settings"} centralRipple/>
display: 'flex', <IconButton icon={"settings"} variant={"filled"}/>
flexDirection: 'row', <IconButton icon={"settings"} variant={"tonal"}/>
gap: '0.5em', <IconButton icon={"settings"} variant={"outlined"}/>
}}
>
<IconButton icon={'settings'} centralRipple />
<IconButton icon={'settings'} variant={'filled'} />
<IconButton icon={'settings'} variant={'tonal'} />
<IconButton icon={'settings'} variant={'outlined'} />
</div> </div>
<h2> Disabled default buttons </h2> <h2> Disabled default buttons </h2>
<div <div style={{display: "flex", flexDirection: "row", gap: "0.5em"}}>
style={{ <IconButton icon={"settings"} disabled/>
display: 'flex', <IconButton icon={"settings"} variant={"filled"} disabled/>
flexDirection: 'row', <IconButton icon={"settings"} variant={"tonal"} disabled/>
gap: '0.5em', <IconButton icon={"settings"} variant={"outlined"} disabled/>
}}
>
<IconButton icon={'settings'} disabled />
<IconButton
icon={'settings'}
variant={'filled'}
disabled
/>
<IconButton
icon={'settings'}
variant={'tonal'}
disabled
/>
<IconButton
icon={'settings'}
variant={'outlined'}
disabled
/>
</div> </div>
</div> </div>
<div> <div>
<h2> Toggle buttons </h2> <h2> Toggle buttons </h2>
<div <div style={{display: "flex", flexDirection: "row", gap: "0.5em"}}>
style={{ <IconButton icon={"settings"} toggled={
display: 'flex', {
flexDirection: 'row', selected: "settings",
gap: '0.5em', unselected: "settings",
}} }
> }/>
<IconButton <IconButton icon={"settings"} variant={"filled"} toggled={
icon={'settings'} {
toggled={{ selected: "settings",
selected: 'settings', unselected: "settings",
unselected: 'settings', }
}} }/>
/> <IconButton icon={"settings"} variant={"tonal"} toggled={
<IconButton {
icon={'settings'} selected: "settings",
variant={'filled'} unselected: "settings",
toggled={{ }
selected: 'settings', }/>
unselected: 'settings', <IconButton icon={"settings"} variant={"outlined"} toggled={
}} {
/> selected: "settings",
<IconButton unselected: "settings",
icon={'settings'} }
variant={'tonal'} }/>
toggled={{
selected: 'settings',
unselected: 'settings',
}}
/>
<IconButton
icon={'settings'}
variant={'outlined'}
toggled={{
selected: 'settings',
unselected: 'settings',
}}
/>
</div> </div>
<h2> Disabled toggle buttons </h2> <h2> Disabled toggle buttons </h2>
<div <div style={{display: "flex", flexDirection: "row", gap: "0.5em"}}>
style={{ <IconButton icon={"settings"} toggled={
display: 'flex', {
flexDirection: 'row', selected: "settings",
gap: '0.5em', unselected: "settings",
}} }
> } disabled/>
<IconButton <IconButton icon={"settings"} variant={"filled"} toggled={
icon={'settings'} {
toggled={{ selected: "settings",
selected: 'settings', unselected: "settings",
unselected: 'settings', }
}} } disabled/>
disabled <IconButton icon={"settings"} variant={"tonal"} toggled={
/> {
<IconButton selected: "settings",
icon={'settings'} unselected: "settings",
variant={'filled'} }
toggled={{ } disabled/>
selected: 'settings', <IconButton icon={"settings"} variant={"outlined"} toggled={
unselected: 'settings', {
}} selected: "settings",
disabled unselected: "settings",
/> }
<IconButton } disabled/>
icon={'settings'}
variant={'tonal'}
toggled={{
selected: 'settings',
unselected: 'settings',
}}
disabled
/>
<IconButton
icon={'settings'}
variant={'outlined'}
toggled={{
selected: 'settings',
unselected: 'settings',
}}
disabled
/>
</div> </div>
<h2> Disabled selected toggle buttons </h2> <h2> Disabled selected toggle buttons </h2>
<div <div style={{display: "flex", flexDirection: "row", gap: "0.5em"}}>
style={{ <IconButton icon={"settings"} toggled={
display: 'flex', {
flexDirection: 'row', selected: "settings",
gap: '0.5em', unselected: "settings",
}} }
> } disabled selected/>
<IconButton <IconButton icon={"settings"} variant={"filled"} toggled={
icon={'settings'} {
toggled={{ selected: "settings",
selected: 'settings', unselected: "settings",
unselected: 'settings', }
}} } disabled selected/>
disabled <IconButton icon={"settings"} variant={"tonal"} toggled={
selected {
/> selected: "settings",
<IconButton unselected: "settings",
icon={'settings'} }
variant={'filled'} } disabled selected/>
toggled={{ <IconButton icon={"settings"} variant={"outlined"} toggled={
selected: 'settings', {
unselected: 'settings', selected: "settings",
}} unselected: "settings",
disabled }
selected } disabled selected/>
/>
<IconButton
icon={'settings'}
variant={'tonal'}
toggled={{
selected: 'settings',
unselected: 'settings',
}}
disabled
selected
/>
<IconButton
icon={'settings'}
variant={'outlined'}
toggled={{
selected: 'settings',
unselected: 'settings',
}}
disabled
selected
/>
</div> </div>
</div> </div>
</div> </div>
@ -187,4 +113,4 @@ function IconButtons() {
); );
} }
export default IconButtons; export default IconButtons;

View File

@ -1,34 +1,26 @@
import React from 'react'; import React from 'react';
import {Radio} from '../../src/primitive-components/material-you-components'; import { Radio } from '../../src/primitive-components/material-you-components';
export default function Radios() { export default function Radios() {
return ( return (
<div className={'m3 m3-wrapper'}> <div className={"m3 m3-wrapper"}>
<h1> Radio </h1> <h1> Radio </h1>
<div <div style={{display: "flex", flexDirection: "row", width: "100%", gap: "5em", justifyContent:"center"}}>
style={{
display: 'flex',
flexDirection: 'row',
width: '100%',
gap: '5em',
justifyContent: 'center',
}}
>
<div> <div>
<h2> Default </h2> <h2> Default </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<Radio centralRipple /> <Radio centralRipple/>
<Radio defaultChecked /> <Radio defaultChecked/>
</div> </div>
</div> </div>
<div> <div>
<h2> Disabled </h2> <h2> Disabled </h2>
<div style={{display: 'flex', gap: '2em'}}> <div style={{display: "flex", gap: "2em"}}>
<Radio disabled /> <Radio disabled/>
<Radio disabled defaultChecked /> <Radio disabled defaultChecked/>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
); );
} }

View File

@ -1,81 +1,57 @@
import React from 'react'; import React from 'react';
import {Switch} from '../../src/primitive-components/material-you-components'; import {Switch} from "../../src/primitive-components/material-you-components";
export default function Switches() { export default function Switches() {
return ( return (
<div <div className={"m3 m3-wrapper"} style={{display: "flex", flexDirection: "column", gap: "1.5em"}}>
className={'m3 m3-wrapper'}
style={{display: 'flex', flexDirection: 'column', gap: '1.5em'}}
>
<h1> Switches </h1> <h1> Switches </h1>
<div style={{display: 'flex', flexDirection: 'row', gap: '2em'}}> <div style={{display: "flex", flexDirection: "row", gap: "2em"}}>
<div style={{display: 'flex', flexDirection: 'column'}}> <div style={{display: "flex", flexDirection: "column"}}>
<h2 style={{margin: 0}}> Without icon </h2> <h2 style={{margin: 0}}> Without icon </h2>
<div <div style={{display: "flex", flexDirection: "row", width: "100%", gap: "2em"}}>
style={{
display: 'flex',
flexDirection: 'row',
width: '100%',
gap: '2em',
}}
>
<div> <div>
<h2> Default </h2> <h2> Default </h2>
<Switch /> <Switch/>
<Switch defaultChecked /> <Switch defaultChecked/>
</div> </div>
<div> <div>
<h2> Disabled </h2> <h2> Disabled </h2>
<Switch disabled /> <Switch disabled/>
<Switch disabled defaultChecked /> <Switch disabled defaultChecked/>
</div> </div>
</div> </div>
</div> </div>
<div style={{display: 'flex', flexDirection: 'column'}}> <div style={{display: "flex", flexDirection: "column"}}>
<h2 style={{margin: 0}}> With icon (both)</h2> <h2 style={{margin: 0}}> With icon (both)</h2>
<div <div style={{display: "flex", flexDirection: "row", width: "100%", gap: "2em"}}>
style={{
display: 'flex',
flexDirection: 'row',
width: '100%',
gap: '2em',
}}
>
<div> <div>
<h2> Default </h2> <h2> Default </h2>
<Switch icon /> <Switch icon/>
<Switch defaultChecked icon /> <Switch defaultChecked icon/>
</div> </div>
<div> <div>
<h2> Disabled </h2> <h2> Disabled </h2>
<Switch disabled icon /> <Switch disabled icon/>
<Switch disabled defaultChecked icon /> <Switch disabled defaultChecked icon/>
</div> </div>
</div> </div>
</div> </div>
<div style={{display: 'flex', flexDirection: 'column'}}> <div style={{display: "flex", flexDirection: "column"}}>
<h2 style={{margin: 0}}> With icon (selected)</h2> <h2 style={{margin: 0}}> With icon (selected)</h2>
<div <div style={{display: "flex", flexDirection: "row", width: "100%", gap: "2em"}}>
style={{
display: 'flex',
flexDirection: 'row',
width: '100%',
gap: '2em',
}}
>
<div> <div>
<h2> Default </h2> <h2> Default </h2>
<Switch selected icon /> <Switch selected icon/>
<Switch selected defaultChecked icon /> <Switch selected defaultChecked icon/>
</div> </div>
<div> <div>
<h2> Disabled </h2> <h2> Disabled </h2>
<Switch selected disabled icon /> <Switch selected disabled icon/>
<Switch selected disabled defaultChecked icon /> <Switch selected disabled defaultChecked icon/>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
); );
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,24 +1,30 @@
import '../src/styles/generics.css'; import "../src/styles/generics.css"
import '../src/styles/button.css'; import "../src/styles/button.css"
import '../src/styles/ripple.css'; import "../src/styles/ripple.css"
import {Metadata, Viewport} from 'next'; import {Metadata, Viewport} from "next";
export const metadata: Metadata = { export const metadata: Metadata = {
title: 'Create Next App', title: 'Create Next App',
description: 'Generated by create next app', description: 'Generated by create next app',
}; }
export const viewport: Viewport = { export const viewport: Viewport = {
width: 'device-width', width: 'device-width',
initialScale: 1, initialScale: 1,
maximumScale: 1, maximumScale: 1,
userScalable: false, userScalable: false,
}; }
export default function RootLayout({children}: {children: React.ReactNode}) { export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return ( return (
<html lang="en"> <html lang="en">
<body>{children}</body> <body>
{children}
</body>
</html> </html>
); )
} }

View File

@ -1,46 +1,42 @@
import {Fragment} from 'react'; import {Fragment} from "react";
import Fabs from './components/fabs'; import Fabs from "./components/fabs";
import Badges from './components/badges'; import Badges from "./components/badges";
import IconButtons from './components/icon-buttons'; import IconButtons from "./components/icon-buttons";
import Buttons from './components/buttons'; import Buttons from "./components/buttons";
import Switches from './components/switches'; import Switches from "./components/switches";
import Checkboxes from './components/checkboxes'; import Checkboxes from "./components/checkboxes";
import Radios from './components/radios'; import Radios from "./components/radios";
import {TextFields} from './components/text-fields'; import {TextFields} from "./components/text-fields";
export default function Page() { export default function Page() {
return ( return(
<Fragment> <Fragment>
<div <div style={{
style={{ display: "flex",
display: 'flex', flexDirection:"column",
flexDirection: 'column', justifyContent: "center",
justifyContent: 'center', alignItems: "center",
alignItems: 'center', overflowX: "auto",
overflowX: 'auto', gap: "0em"
gap: '0em', }}>
}}
>
<h1>Google Material You UI kit</h1> <h1>Google Material You UI kit</h1>
<div <div style={{
style={{ display: "flex",
display: 'flex', flexDirection: "column",
flexDirection: 'column', gap: "0.5em",
gap: '0.5em', justifyContent: "center",
justifyContent: 'center', alignItems: "center"
alignItems: 'center', }}>
}} <Buttons/>
> <IconButtons/>
<Buttons /> <Switches/>
<IconButtons /> <Checkboxes/>
<Switches /> <Radios/>
<Checkboxes /> <TextFields/>
<Radios /> <Fabs/>
<TextFields /> <Badges/>
<Fabs />
<Badges />
</div> </div>
</div> </div>
</Fragment> </Fragment>
); )
} }

541
dist/output.css vendored Normal file
View File

@ -0,0 +1,541 @@
/*
! tailwindcss v3.3.6 | MIT License | https://tailwindcss.com
*/
/*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
*/
*,
::before,
::after {
box-sizing: border-box;
/* 1 */
border-width: 0;
/* 2 */
border-style: solid;
/* 2 */
border-color: #e5e7eb;
/* 2 */
}
::before,
::after {
--tw-content: '';
}
/*
1. Use a consistent sensible line-height in all browsers.
2. Prevent adjustments of font size after orientation changes in iOS.
3. Use a more readable tab size.
4. Use the user's configured `sans` font-family by default.
5. Use the user's configured `sans` font-feature-settings by default.
6. Use the user's configured `sans` font-variation-settings by default.
*/
html {
line-height: 1.5;
/* 1 */
-webkit-text-size-adjust: 100%;
/* 2 */
-moz-tab-size: 4;
/* 3 */
-o-tab-size: 4;
tab-size: 4;
/* 3 */
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
/* 4 */
font-feature-settings: normal;
/* 5 */
font-variation-settings: normal;
/* 6 */
}
/*
1. Remove the margin in all browsers.
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
*/
body {
margin: 0;
/* 1 */
line-height: inherit;
/* 2 */
}
/*
1. Add the correct height in Firefox.
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
3. Ensure horizontal rules are visible by default.
*/
hr {
height: 0;
/* 1 */
color: inherit;
/* 2 */
border-top-width: 1px;
/* 3 */
}
/*
Add the correct text decoration in Chrome, Edge, and Safari.
*/
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
/*
Remove the default font size and weight for headings.
*/
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: inherit;
font-weight: inherit;
}
/*
Reset links to optimize for opt-in styling instead of opt-out.
*/
a {
color: inherit;
text-decoration: inherit;
}
/*
Add the correct font weight in Edge and Safari.
*/
b,
strong {
font-weight: bolder;
}
/*
1. Use the user's configured `mono` font-family by default.
2. Use the user's configured `mono` font-feature-settings by default.
3. Use the user's configured `mono` font-variation-settings by default.
4. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp,
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
/* 1 */
font-feature-settings: normal;
/* 2 */
font-variation-settings: normal;
/* 3 */
font-size: 1em;
/* 4 */
}
/*
Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/*
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/*
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
3. Remove gaps between table borders by default.
*/
table {
text-indent: 0;
/* 1 */
border-color: inherit;
/* 2 */
border-collapse: collapse;
/* 3 */
}
/*
1. Change the font styles in all browsers.
2. Remove the margin in Firefox and Safari.
3. Remove default padding in all browsers.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit;
/* 1 */
font-feature-settings: inherit;
/* 1 */
font-variation-settings: inherit;
/* 1 */
font-size: 100%;
/* 1 */
font-weight: inherit;
/* 1 */
line-height: inherit;
/* 1 */
color: inherit;
/* 1 */
margin: 0;
/* 2 */
padding: 0;
/* 3 */
}
/*
Remove the inheritance of text transform in Edge and Firefox.
*/
button,
select {
text-transform: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Remove default button-layout styles.
*/
button,
[type='button'],
[type='reset'],
[type='submit'] {
-webkit-appearance: button;
/* 1 */
background-color: transparent;
/* 2 */
background-image: none;
/* 2 */
}
/*
Use the modern Firefox focus style for all focusable elements.
*/
:-moz-focusring {
outline: auto;
}
/*
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
*/
:-moz-ui-invalid {
box-shadow: none;
}
/*
Add the correct vertical alignment in Chrome and Firefox.
*/
progress {
vertical-align: baseline;
}
/*
Correct the cursor style of increment and decrement buttons in Safari.
*/
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/*
1. Correct the odd appearance in Chrome and Safari.
2. Correct the outline style in Safari.
*/
[type='search'] {
-webkit-appearance: textfield;
/* 1 */
outline-offset: -2px;
/* 2 */
}
/*
Remove the inner padding in Chrome and Safari on macOS.
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button;
/* 1 */
font: inherit;
/* 2 */
}
/*
Add the correct display in Chrome and Safari.
*/
summary {
display: list-item;
}
/*
Removes the default spacing and border for appropriate elements.
*/
blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
margin: 0;
}
fieldset {
margin: 0;
padding: 0;
}
legend {
padding: 0;
}
ol,
ul,
menu {
list-style: none;
margin: 0;
padding: 0;
}
/*
Reset default styling for dialogs.
*/
dialog {
padding: 0;
}
/*
Prevent resizing textareas horizontally by default.
*/
textarea {
resize: vertical;
}
/*
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
2. Set the default placeholder color to the user's configured gray 400 color.
*/
input::-moz-placeholder, textarea::-moz-placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
input::placeholder,
textarea::placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
/*
Set the default cursor for buttons.
*/
button,
[role="button"] {
cursor: pointer;
}
/*
Make sure disabled buttons don't get the pointer cursor.
*/
:disabled {
cursor: default;
}
/*
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
This can trigger a poorly considered lint error in some tools but is included by design.
*/
img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
display: block;
/* 1 */
vertical-align: middle;
/* 2 */
}
/*
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
*/
img,
video {
max-width: 100%;
height: auto;
}
/* Make elements with the HTML hidden attribute stay hidden by default */
[hidden] {
display: none;
}
*, ::before, ::after {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ;
--tw-gradient-via-position: ;
--tw-gradient-to-position: ;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
}
::backdrop {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ;
--tw-gradient-via-position: ;
--tw-gradient-to-position: ;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
}

541
dist/styles/styles.css vendored Normal file
View File

@ -0,0 +1,541 @@
/*
! tailwindcss v3.3.6 | MIT License | https://tailwindcss.com
*/
/*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
*/
*,
::before,
::after {
box-sizing: border-box;
/* 1 */
border-width: 0;
/* 2 */
border-style: solid;
/* 2 */
border-color: #e5e7eb;
/* 2 */
}
::before,
::after {
--tw-content: '';
}
/*
1. Use a consistent sensible line-height in all browsers.
2. Prevent adjustments of font size after orientation changes in iOS.
3. Use a more readable tab size.
4. Use the user's configured `sans` font-family by default.
5. Use the user's configured `sans` font-feature-settings by default.
6. Use the user's configured `sans` font-variation-settings by default.
*/
html {
line-height: 1.5;
/* 1 */
-webkit-text-size-adjust: 100%;
/* 2 */
-moz-tab-size: 4;
/* 3 */
-o-tab-size: 4;
tab-size: 4;
/* 3 */
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
/* 4 */
font-feature-settings: normal;
/* 5 */
font-variation-settings: normal;
/* 6 */
}
/*
1. Remove the margin in all browsers.
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
*/
body {
margin: 0;
/* 1 */
line-height: inherit;
/* 2 */
}
/*
1. Add the correct height in Firefox.
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
3. Ensure horizontal rules are visible by default.
*/
hr {
height: 0;
/* 1 */
color: inherit;
/* 2 */
border-top-width: 1px;
/* 3 */
}
/*
Add the correct text decoration in Chrome, Edge, and Safari.
*/
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
/*
Remove the default font size and weight for headings.
*/
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: inherit;
font-weight: inherit;
}
/*
Reset links to optimize for opt-in styling instead of opt-out.
*/
a {
color: inherit;
text-decoration: inherit;
}
/*
Add the correct font weight in Edge and Safari.
*/
b,
strong {
font-weight: bolder;
}
/*
1. Use the user's configured `mono` font-family by default.
2. Use the user's configured `mono` font-feature-settings by default.
3. Use the user's configured `mono` font-variation-settings by default.
4. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp,
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
/* 1 */
font-feature-settings: normal;
/* 2 */
font-variation-settings: normal;
/* 3 */
font-size: 1em;
/* 4 */
}
/*
Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/*
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/*
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
3. Remove gaps between table borders by default.
*/
table {
text-indent: 0;
/* 1 */
border-color: inherit;
/* 2 */
border-collapse: collapse;
/* 3 */
}
/*
1. Change the font styles in all browsers.
2. Remove the margin in Firefox and Safari.
3. Remove default padding in all browsers.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit;
/* 1 */
font-feature-settings: inherit;
/* 1 */
font-variation-settings: inherit;
/* 1 */
font-size: 100%;
/* 1 */
font-weight: inherit;
/* 1 */
line-height: inherit;
/* 1 */
color: inherit;
/* 1 */
margin: 0;
/* 2 */
padding: 0;
/* 3 */
}
/*
Remove the inheritance of text transform in Edge and Firefox.
*/
button,
select {
text-transform: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Remove default button-layout styles.
*/
button,
[type='button'],
[type='reset'],
[type='submit'] {
-webkit-appearance: button;
/* 1 */
background-color: transparent;
/* 2 */
background-image: none;
/* 2 */
}
/*
Use the modern Firefox focus style for all focusable elements.
*/
:-moz-focusring {
outline: auto;
}
/*
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
*/
:-moz-ui-invalid {
box-shadow: none;
}
/*
Add the correct vertical alignment in Chrome and Firefox.
*/
progress {
vertical-align: baseline;
}
/*
Correct the cursor style of increment and decrement buttons in Safari.
*/
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/*
1. Correct the odd appearance in Chrome and Safari.
2. Correct the outline style in Safari.
*/
[type='search'] {
-webkit-appearance: textfield;
/* 1 */
outline-offset: -2px;
/* 2 */
}
/*
Remove the inner padding in Chrome and Safari on macOS.
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button;
/* 1 */
font: inherit;
/* 2 */
}
/*
Add the correct display in Chrome and Safari.
*/
summary {
display: list-item;
}
/*
Removes the default spacing and border for appropriate elements.
*/
blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
margin: 0;
}
fieldset {
margin: 0;
padding: 0;
}
legend {
padding: 0;
}
ol,
ul,
menu {
list-style: none;
margin: 0;
padding: 0;
}
/*
Reset default styling for dialogs.
*/
dialog {
padding: 0;
}
/*
Prevent resizing textareas horizontally by default.
*/
textarea {
resize: vertical;
}
/*
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
2. Set the default placeholder color to the user's configured gray 400 color.
*/
input::-moz-placeholder, textarea::-moz-placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
input::placeholder,
textarea::placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
/*
Set the default cursor for buttons.
*/
button,
[role="button"] {
cursor: pointer;
}
/*
Make sure disabled buttons don't get the pointer cursor.
*/
:disabled {
cursor: default;
}
/*
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
This can trigger a poorly considered lint error in some tools but is included by design.
*/
img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
display: block;
/* 1 */
vertical-align: middle;
/* 2 */
}
/*
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
*/
img,
video {
max-width: 100%;
height: auto;
}
/* Make elements with the HTML hidden attribute stay hidden by default */
[hidden] {
display: none;
}
*, ::before, ::after {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ;
--tw-gradient-via-position: ;
--tw-gradient-to-position: ;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
}
::backdrop {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ;
--tw-gradient-via-position: ;
--tw-gradient-to-position: ;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
}

6231
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,28 +3,32 @@
"scripts": { "scripts": {
"dev": "next dev --turbo", "dev": "next dev --turbo",
"build": "next build", "build": "next build",
"start": "next start", "start": "next start"
"lint": "gts lint",
"clean": "gts clean",
"compile": "tsc",
"fix": "gts fix",
"prepare": "npm run compile",
"pretest": "npm run compile",
"posttest": "npm run lint"
}, },
"dependencies": { "dependencies": {
"install": "^0.13.0", "axios": "^1.6.5",
"lodash": "^4.17.21",
"mui": "^0.0.1",
"next": "latest", "next": "latest",
"npm": "^10.4.0", "normalize.css": "^8.0.1",
"prop-types": "^15.8.1",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0" "react-dom": "^18.2.0",
"react-transition-group": "^4.4.5",
"styled-components": "^6.1.1"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "20.8.2", "@types/node": "20.8.10",
"@types/react": "18.2.33", "@types/react": "18.2.33",
"@types/react-dom": "18.2.14", "@types/react-dom": "18.2.14",
"gts": "^5.2.0", "@typescript-eslint/eslint-plugin": "^6.19.0",
"typescript": "~5.2.0" "autoprefixer": "^10.4.16",
"eslint": "^8.56.0",
"eslint-config-standard-with-typescript": "^43.0.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-n": "^16.6.2",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-react": "^7.33.2",
"postcss": "^8.4.32",
"typescript": "^5.3.3"
} }
} }

5
postcss.config.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
plugins: {
autoprefixer: {},
},
}

View File

@ -1,33 +0,0 @@
console.log('Try npm run lint/fix!');
const longString =
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ut aliquet diam.';
const trailing = 'Semicolon';
const why = {am: 'I tabbed?'};
const iWish = "I didn't have a trailing space...";
const sicilian = true;
const vizzini = sicilian ? !sicilian : sicilian;
const re = /foo {3}bar/;
export function doSomeStuff(
withThis: string,
andThat: string,
andThose: string[]
) {
//function on one line
if (!andThose.length) {
return false;
}
console.log(withThis);
console.log(andThat);
console.dir(andThose);
console.log(longString, trailing, why, iWish, vizzini, re);
return;
}
// TODO: more examples

View File

@ -1,43 +1,33 @@
import React, {ForwardedRef, forwardRef, PropsWithChildren} from 'react'; import React, {ForwardedRef, forwardRef, PropsWithChildren} from 'react';
import {bool, number, string} from 'prop-types'; import {bool, number, string} from "prop-types";
interface BadgeProps extends PropsWithChildren<any> { interface BadgeProps extends PropsWithChildren<any>{
disableValue?: boolean; disableValue?: boolean,
} }
const Badge = forwardRef( const Badge = forwardRef(function Badge({disableValue = false, ...props} : BadgeProps, ref : ForwardedRef<any>) {
({disableValue = false, ...props}: BadgeProps, ref: ForwardedRef<any>) => {
const digitLength = props.children
? 16 + (props.children.length - 1) * 6
: 6,
disableValueClassName =
disableValue || (!props.children ?? true)
? 'disable-value'
: '';
return ( let digitLength = props.children ? 16 + ((props.children.length - 1) * 6) : 6,
<svg disableValueClassName = (disableValue || (!props.children ?? true)) ? "disable-value" : "";
{...props}
ref={ref} return (
width={`${digitLength}px`} <svg {...props}
className={`m3 m3-badge ${ ref={ref}
'' ?? props.className width={`${digitLength}px`}
}${disableValueClassName}`.trimEnd()} className={`m3 m3-badge ${"" ?? props.className}${disableValueClassName}`.trimEnd()}>
> {props.children &&
{props.children && ( <text x={"50%"} y={"50%"}>
<text x={'50%'} y={'50%'}> {props.children}
{props.children} </text>
</text> }
)} </svg>
</svg> );
); })
}
);
Badge.propTypes = { Badge.propTypes = {
children: number, children: number,
className: string, className: string,
disableValue: bool, disableValue: bool,
}; }
export {Badge}; export {Badge};

View File

@ -1,53 +1,45 @@
'use client'; "use client"
import {RippleArea} from '../ripple/ripple-area'; import {RippleArea} from "../ripple/ripple-area";
import React, { import React, {forwardRef, PropsWithChildren, useId, useRef, useState} from "react";
forwardRef, import useRippleEffect from "../ripple/hooks/useRippleEffect";
PropsWithChildren, import {IRippleProps} from "../ripple/ripple.types";
useId,
useRef,
useState,
} from 'react';
import useRippleEffect from '../ripple/hooks/useRippleEffect';
import {IRippleProps} from '../ripple/ripple.types';
const ButtonLayout = forwardRef( const ButtonLayout = forwardRef(
(
{ function ButtonBase({centralRipple = false, ...props} : PropsWithChildren<any> & IRippleProps, ref){
centralRipple = false,
...props
}: PropsWithChildren<any> & IRippleProps,
ref
) => {
const [isActive, setIsActive] = useState<boolean>(false), const [isActive, setIsActive] = useState<boolean>(false),
ripplesRef = useRef(null), ripplesRef = useRef(null),
buttonId = useId(), buttonId = useId(),
events = useRippleEffect(ripplesRef, setIsActive); events = useRippleEffect(ripplesRef, setIsActive);
const {variant, disabled, className} = props; let {
variant,
disabled,
className
} = props;
const classes = className let classes = className ?
? `m3 ${className} ${variant}${isActive ? ' is-active' : ''}` `m3 ${className} ${variant}${isActive ? " is-active" : ""}` :
: `m3 ${variant}${isActive ? ' is-active' : ''}`; `m3 ${variant}${isActive ? " is-active" : ""}`;
return ( return (
<button <button {...props}
{...props} {...events}
{...events} ref={ref}
ref={ref} id={buttonId}
id={buttonId} className={classes}
className={classes} disabled={disabled}>
disabled={disabled}
>
{props.children} {props.children}
<RippleArea <RippleArea ref={ripplesRef}
ref={ripplesRef} central={centralRipple}
central={centralRipple} callback={setIsActive}/>
callback={setIsActive}
/>
</button> </button>
); )
}
);
export {ButtonLayout}; }
)
export {ButtonLayout};

View File

@ -1,25 +1,25 @@
import {PropsWithChildren} from 'react'; import {PropsWithChildren} from "react";
type toggleButtonType = { type toggleButtonType = {
selected: string; selected: string,
unselected: string; unselected: string,
};
export interface buttonMainProps extends PropsWithChildren<any> {
disabled?: boolean;
variant?: 'filled' | 'outlined' | 'elevated' | 'tonal' | 'text';
} }
export interface FABMainProps extends PropsWithChildren<any> { export interface buttonMainProps extends PropsWithChildren<any>{
icon: string; disabled? : boolean,
disabled?: boolean; variant? : "filled" | "outlined" | "elevated" | "tonal" | "text",
size?: 'small' | 'default' | 'large' | 'extended';
variant?: 'surface' | 'primary' | 'secondary' | 'tertiary';
} }
export interface iconButtonMainProps extends PropsWithChildren<any> { export interface FABMainProps extends PropsWithChildren<any>{
icon: string; icon : string;
toggled?: false | toggleButtonType; disabled? : boolean;
disabled?: boolean; size? : "small" | "default" | "large" | "extended";
variant?: 'default' | 'filled' | 'tonal' | 'outlined'; variant? : "surface" | "primary" | "secondary" | "tertiary";
} }
export interface iconButtonMainProps extends PropsWithChildren<any>{
icon : string;
toggled? : false | toggleButtonType;
disabled? : boolean;
variant? : "default" | "filled" | "tonal" | "outlined";
}

View File

@ -1,8 +1,8 @@
import {forwardRef} from 'react'; import {forwardRef} from "react";
import {Icon} from '../material-you-components'; import {Icon} from "../material-you-components";
import {IRippleProps} from '../ripple/ripple.types'; import {IRippleProps} from "../ripple/ripple.types";
import {ButtonLayout} from '../button-layout/button-layout'; import {ButtonLayout} from "../button-layout/button-layout";
import {buttonMainProps} from '../button-layout/button.types'; import {buttonMainProps} from "../button-layout/button.types";
/** /**
* Button component * Button component
@ -10,25 +10,24 @@ import {buttonMainProps} from '../button-layout/button.types';
*/ */
export const Button = forwardRef( export const Button = forwardRef(
(
{ ({centralRipple = false, variant, disabled, icon, ...props} : buttonMainProps & IRippleProps, ref) => (
centralRipple = false, <ButtonLayout {...props}
variant, ref={ref}
disabled, disabled={props.disabled}
icon, centralRipple={centralRipple}
...props variant={variant ? variant : "filled"}>
}: buttonMainProps & IRippleProps, {
ref icon ?
) => ( <Icon iconSize={20}>
<ButtonLayout {icon}
{...props} </Icon>
ref={ref} : <></>
disabled={disabled} }
centralRipple={centralRipple} <span className={"label-large"}>
variant={variant ? variant : 'filled'} {props.children}
> </span>
{icon ? <Icon iconSize={20}>{icon}</Icon> : <></>}
<span className={'label-large'}>{props.children}</span>
</ButtonLayout> </ButtonLayout>
) )
);
)

View File

@ -1,13 +1,12 @@
'use client'; "use client"
import React, {forwardRef, useEffect, useImperativeHandle, useRef} from 'react'; import React, {forwardRef, useEffect, useImperativeHandle, useRef} from 'react';
import {CheckboxLayoutProps} from './checkbox-layout.types'; import {CheckboxLayoutProps} from "./checkbox-layout.types";
export const CheckBoxLayout = forwardRef( export const CheckBoxLayout = forwardRef(
(
{indeterminate, typeInput, type, ...props}: CheckboxLayoutProps, function CheckBoxBase({indeterminate, typeInput, type, ...props} : CheckboxLayoutProps, ref) : JSX.Element {
ref
): JSX.Element => {
const checkboxRef = useRef<any>(null); const checkboxRef = useRef<any>(null);
useEffect(() => { useEffect(() => {
@ -16,20 +15,18 @@ export const CheckBoxLayout = forwardRef(
useImperativeHandle(ref, () => checkboxRef.current); useImperativeHandle(ref, () => checkboxRef.current);
const classesType = typeInput || type; let classesType = typeInput || type;
const classes = const classes = props.className !== undefined ?
props.className !== undefined `m3 m3-${type} ${props.className}` : `m3 m3-${classesType}`
? `m3 m3-${type} ${props.className}`
: `m3 m3-${classesType}`;
return ( return (
<input <input ref={checkboxRef}
ref={checkboxRef} {...props}
{...props} type={type}
type={type} className={classes.trimEnd()}/>
className={classes.trimEnd()}
/>
); );
} }
);
);

View File

@ -1,7 +1,7 @@
import {PropsWithChildren} from 'react'; import {PropsWithChildren} from "react";
export interface CheckboxLayoutProps extends PropsWithChildren<any> { export interface CheckboxLayoutProps extends PropsWithChildren<any>{
indeterminate?: boolean; indeterminate?: boolean;
typeInput?: string; typeInput? : string;
type?: string; type? : string;
} }

View File

@ -1,14 +1,8 @@
import {RippleArea} from '../ripple/ripple-area'; import {RippleArea} from "../ripple/ripple-area";
import {IRippleProps} from '../ripple/ripple.types'; import {IRippleProps} from "../ripple/ripple.types";
import useRippleEffect from '../ripple/hooks/useRippleEffect'; import useRippleEffect from "../ripple/hooks/useRippleEffect";
import {CheckBoxLayout} from '../checkbox-layout/check-box-layout'; import {CheckBoxLayout} from "../checkbox-layout/check-box-layout";
import { import {forwardRef, useEffect, useImperativeHandle, useRef, useState} from "react";
forwardRef,
useEffect,
useImperativeHandle,
useRef,
useState,
} from 'react';
/** /**
* Checkbox component * Checkbox component
@ -16,41 +10,39 @@ import {
*/ */
export const Checkbox = forwardRef( export const Checkbox = forwardRef(
({centralRipple, ...props}: any & IRippleProps, ref) => { ({centralRipple, ...props} : any & IRippleProps, ref) => {
const [isActive, setIsActive] = useState<boolean>(false), const [isActive, setIsActive] = useState<boolean>(false),
[checked, setChecked] = useState<boolean>(props.checked ?? false), [checked, setChecked] = useState<boolean>(props.checked ?? false),
ripplesRef = useRef(null), ripplesRef = useRef(null),
checkboxRef = useRef(null), checkboxRef = useRef(null),
events = useRippleEffect(ripplesRef, setIsActive); events = useRippleEffect(ripplesRef, setIsActive);
const classes = `m3 m3-checkbox-label ${ const classes = `m3 m3-checkbox-label ${isActive === true ? "visible" : ""}`.trimEnd();
isActive === true ? 'visible' : ''
}`.trimEnd();
const indeterminate = (props.indeterminate === true).toString(); const indeterminate = (props.indeterminate === true).toString();
useImperativeHandle(ref, () => checkboxRef.current); useImperativeHandle(ref, () => checkboxRef.current)
useEffect(() => { useEffect(() => {
setChecked(!checked); setChecked(!checked)
}, [checkboxRef.current?.checked]); }, [checkboxRef.current?.checked]);
return ( return (
<label {...events} className={classes}> <label {...events}
<CheckBoxLayout className={classes}>
{...props} <CheckBoxLayout {...props}
ref={checkboxRef} ref={checkboxRef}
indeterminate={indeterminate} indeterminate={indeterminate}
type={'checkbox'} type={"checkbox"}/>
/> <span className={"m3 m3-checkbox-state-layer"}/>
<span className={'m3 m3-checkbox-state-layer'} /> <RippleArea className={"m3-checkbox-ripple-layer"}
<RippleArea ref={ripplesRef}
className={'m3-checkbox-ripple-layer'} central={centralRipple}
ref={ripplesRef} callback={setIsActive}/>
central={centralRipple}
callback={setIsActive}
/>
{props.children} {props.children}
</label> </label>
); )
} }
);
)

View File

@ -1,25 +1,16 @@
import React, {ForwardedRef, forwardRef, PropsWithChildren} from 'react'; import React, {ForwardedRef, forwardRef, PropsWithChildren} from 'react';
interface DividerProps extends PropsWithChildren<any> { interface DividerProps extends PropsWithChildren<any> {
orientation?: 'vertical' | 'horizontal'; orientation?: "vertical" | "horizontal";
variant?: 'full-width' | 'inset' | 'middle-inset'; variant?: "full-width" | "inset" | "middle-inset";
} }
const Divider = forwardRef( const Divider = forwardRef(function Divider({orientation, variant, ...props} : DividerProps, ref : ForwardedRef<any>) {
( return (
{orientation, variant, ...props}: DividerProps, <hr {...props}
ref: ForwardedRef<any> ref={ref}
) => { className={`m3 m3-divider ${orientation ?? "horizontal"} ${variant ?? "full-width"}`.trimEnd()}/>
return ( );
<hr })
{...props}
ref={ref}
className={`m3 m3-divider ${orientation ?? 'horizontal'} ${
variant ?? 'full-width'
}`.trimEnd()}
/>
);
}
);
export {Divider}; export {Divider};

View File

@ -1,8 +1,8 @@
import {forwardRef} from 'react'; import {forwardRef} from "react";
import {FABMainProps} from '../button-layout/button.types'; import {FABMainProps} from "../button-layout/button.types";
import {ButtonLayout} from '../button-layout/button-layout'; import {ButtonLayout} from "../button-layout/button-layout";
import {IRippleProps} from '../ripple/ripple.types'; import {IRippleProps} from "../ripple/ripple.types";
import {Icon} from '../material-you-components'; import {Icon} from "../material-you-components";
/** /**
* FABs component * FABs component
@ -10,42 +10,37 @@ import {Icon} from '../material-you-components';
*/ */
const sizes = { const sizes = {
small: 24, "small": 24,
default: 24, "default": 24,
large: 36, "large": 36,
extended: 24, "extended": 24,
}; }
export const FAB = forwardRef( export const FAB = forwardRef(
( ({
{
variant, variant,
disabled, disabled,
icon, icon,
centralRipple = false, centralRipple = false,
size = 'default', size = "default",
elevated, elevated,
...props ...props} : FABMainProps & IRippleProps, ref) => (
}: FABMainProps & IRippleProps, <ButtonLayout {...props}
ref ref={ref}
) => ( centralRipple={centralRipple}
<ButtonLayout variant={variant ? variant : "surface"}
{...props} className={`m3-fab m3-${size}-fab ${!(elevated ?? false) && "without-elevation"}`}>
ref={ref}
centralRipple={centralRipple}
variant={variant ? variant : 'surface'}
className={`m3-fab m3-${size}-fab ${
!(elevated ?? false) && 'without-elevation'
}`}
>
<Icon iconSize={sizes[size]} svgSize={sizes[size]}> <Icon iconSize={sizes[size]} svgSize={sizes[size]}>
{icon} {icon}
</Icon> </Icon>
{size === 'extended' ? ( {
<span className={'label-large'}>{props.children}</span> size === "extended" ? (
) : ( <span className={"label-large"}>
<></> {props.children}
)} </span>
) : <></>
}
</ButtonLayout> </ButtonLayout>
) )
); );

View File

@ -1,14 +1,8 @@
import {ButtonLayout} from '../button-layout/button-layout'; import {ButtonLayout} from "../button-layout/button-layout";
import {iconButtonMainProps} from '../button-layout/button.types'; import {iconButtonMainProps} from "../button-layout/button.types";
import { import {forwardRef, useCallback, useImperativeHandle, useRef, useState} from "react";
forwardRef, import {IRippleProps} from "../ripple/ripple.types";
useCallback, import {Icon} from "../material-you-components";
useImperativeHandle,
useRef,
useState,
} from 'react';
import {IRippleProps} from '../ripple/ripple.types';
import {Icon} from '../material-you-components';
/** /**
* Icon button-layout component * Icon button-layout component
@ -16,8 +10,8 @@ import {Icon} from '../material-you-components';
*/ */
export const IconButton = forwardRef( export const IconButton = forwardRef(
(
{ ({
icon, icon,
variant, variant,
disabled, disabled,
@ -25,54 +19,48 @@ export const IconButton = forwardRef(
toggled = false, toggled = false,
centralRipple, centralRipple,
...props ...props
}: iconButtonMainProps & IRippleProps, } : iconButtonMainProps & IRippleProps,
ref ref) => {
) => {
const [toggleIcon, setToggleIcon] = useState<any>({ const [toggleIcon, setToggleIcon] = useState<any>({
state: selected === true ? 'selected' : 'unselected', state : selected == true ? "selected" : "unselected",
icon: toggled ? toggled.unselected ?? 'add_circle' : 'add_circle', icon : toggled ? toggled.unselected ?? "add_circle" : "add_circle"
}); });
const toggle = (classes: string, icon: string) => { const toggle = (classes, icon) => {
setToggleIcon(() => ({ setToggleIcon(() => ({
state: classes, state : classes,
icon: icon, icon : icon,
})); }))
}; }
const buttonRef = useRef<HTMLButtonElement>(null); let buttonRef = useRef<HTMLButtonElement>(null);
const callback = useCallback(() => { const callback = useCallback(() => {
if (toggled) { if(toggled) {
if (toggleIcon.state === 'selected') if (toggleIcon.state === "selected") toggle("", toggled.unselected ?? "add_circle")
toggle('', toggled.unselected ?? 'add_circle'); else toggle("selected", toggled.selected ?? "add_circle")
else toggle('selected', toggled.selected ?? 'add_circle');
} }
if (props.onClick) props.onClick(); if(props.onClick) props.onClick();
}, [toggleIcon]); }, [toggleIcon])
useImperativeHandle(ref, () => buttonRef); useImperativeHandle(ref, () => buttonRef);
return ( return (
<ButtonLayout <ButtonLayout {...props}
{...props} ref={buttonRef}
ref={buttonRef} onClick={callback}
onClick={callback} centralRipple={centralRipple}
centralRipple={centralRipple} disabled={disabled}
disabled={disabled} className={`m3-icon-button ${toggleIcon.state} ${toggled ? "toggled" : ""}`.trimEnd()}
className={`m3-icon-button ${toggleIcon.state} ${ variant={variant ? variant : "default"}>
toggled ? 'toggled' : ''
}`.trimEnd()} <Icon svgSize={40} iconSize={28} fill={toggleIcon.state === "selected" ? 1 : 0}>
variant={variant ? variant : 'default'}
>
<Icon
svgSize={40}
iconSize={28}
fill={toggleIcon.state === 'selected' ? 1 : 0}
>
{toggled ? toggleIcon.icon : icon ? icon : undefined} {toggled ? toggleIcon.icon : icon ? icon : undefined}
</Icon> </Icon>
</ButtonLayout> </ButtonLayout>
); )
} }
);
)

View File

@ -1,59 +1,48 @@
import React, {ForwardedRef, forwardRef} from 'react'; import React, {ForwardedRef, forwardRef} from 'react';
import {IconProps} from './icon.types'; import {IconProps} from "./icon.types";
import {bool, number, string} from 'prop-types'; import {bool, number, string} from "prop-types";
const Icon = forwardRef( const Icon = forwardRef(function Icon(
( {
{ grade = 0,
grade = 0, weight = 500,
weight = 500, svgSize = 20,
svgSize = 20, fill = false,
fill = false, iconSize = 20,
iconSize = 20, opticalSize = 24,
opticalSize = 24, type = "outlined",
type = 'outlined', ...props
...props } : IconProps, ref : ForwardedRef<any>) {
}: IconProps,
ref: ForwardedRef<any>
) => {
const fontVariation = {
fontVariationSettings: `'FILL' ${
fill ? 1 : 0
}, 'wght' ${weight}, 'GRAD' ${grade}, 'optz' ${opticalSize}`,
};
return ( let fontVariation = {
<svg fontVariationSettings: `'FILL' ${fill ? 1 : 0}, 'wght' ${weight}, 'GRAD' ${grade}, 'optz' ${opticalSize}`
{...props} };
ref={ref}
className={`m3 m3-svg-icon ${props.className ?? ''}`.trim()} return (
width={svgSize} <svg {...props}
height={svgSize} ref={ref}
> className={`m3 m3-svg-icon ${props.className ?? ""}`.trim()}
<text width={svgSize}
className={`m3-${ height={svgSize}>
type[0].toUpperCase() + type.slice(1) <text className={`m3-${type[0].toUpperCase() + type.slice(1)} m3-size-${iconSize}px`}
} m3-size-${iconSize}px`} style={fontVariation}
style={fontVariation} x={"50%"}
x={'50%'} y={"50%"}>
y={'50%'} {props.children ?? "add_circle"}
> </text>
{props.children ?? 'add_circle'} </svg>
</text> );
</svg> })
);
}
);
Icon.propTypes = { Icon.propTypes = {
fill: bool, fill : bool,
type: string, type : string,
grade: number, grade : number,
weight: number, weight : number,
svgSize: number, svgSize : number,
iconSize: number, iconSize : number,
children: string, children : string,
opticalSize: number, opticalSize : number,
}; }
export {Icon}; export {Icon};

View File

@ -1,11 +1,11 @@
import {PropsWithChildren} from 'react'; import {PropsWithChildren} from "react";
export interface IconProps extends PropsWithChildren<any> { export interface IconProps extends PropsWithChildren<any>{
fill?: boolean; fill?: boolean;
grade?: number; grade?: number;
svgSize?: number; svgSize?: number;
iconSize?: number; iconSize?: number;
opticalSize?: number; opticalSize?: number;
type?: 'outlined' | 'rounded' | 'sharp'; type?: "outlined" | "rounded" | "sharp";
weight?: 100 | 200 | 300 | 400 | 500 | 600 | 700; weight?: 100 | 200 | 300 | 400 | 500 | 600 | 700;
} }

View File

@ -1,13 +1,15 @@
export {FAB} from './fab/fab'; "use client"
export {Icon} from './icon/icon';
export {Radio} from './radio/radio'; export {FAB} from "./fab/fab";
export {Badge} from './badge/badge'; export {Icon} from "./icon/icon";
export {Switch} from './switch/switch'; export {Radio} from "./radio/radio";
export {Button} from './button/button'; export {Badge} from "./badge/badge";
export {Divider} from './divider/divider'; export {Switch} from "./switch/switch";
export {Checkbox} from './checkbox/checkbox'; export {Button} from "./button/button";
export {RippleArea} from './ripple/ripple-area'; export {Divider} from "./divider/divider";
export {Ripples, Ripple} from './ripple/ripple'; export {Checkbox} from "./checkbox/checkbox";
export {TextField} from './text-field/text-field'; export {RippleArea} from "./ripple/ripple-area";
export {IconButton} from './icon-button/icon-button'; export {Ripples, Ripple} from "./ripple/ripple";
export {ButtonLayout} from './button-layout/button-layout'; export {TextField} from "./text-field/text-field";
export {IconButton} from "./icon-button/icon-button";
export {ButtonLayout} from "./button-layout/button-layout";

View File

@ -1,8 +1,8 @@
import {RippleArea} from '../ripple/ripple-area'; import {RippleArea} from "../ripple/ripple-area";
import {forwardRef, useRef, useState} from 'react'; import {forwardRef, useRef, useState} from "react";
import useRippleEffect from '../ripple/hooks/useRippleEffect'; import useRippleEffect from "../ripple/hooks/useRippleEffect";
import {CheckBoxLayout} from '../checkbox-layout/check-box-layout'; import {CheckBoxLayout} from "../checkbox-layout/check-box-layout";
import {IRippleProps} from '../ripple/ripple.types'; import {IRippleProps} from "../ripple/ripple.types";
/** /**
* Radio component * Radio component
@ -10,27 +10,30 @@ import {IRippleProps} from '../ripple/ripple.types';
*/ */
export const Radio = forwardRef( export const Radio = forwardRef(
({centralRipple, ...props}: any & IRippleProps, ref) => {
({centralRipple, ...props} : any & IRippleProps, ref) => {
const [isActive, setIsActive] = useState<boolean>(false), const [isActive, setIsActive] = useState<boolean>(false),
ripplesRef = useRef(null), ripplesRef = useRef(null),
events = useRippleEffect(ripplesRef, setIsActive); events = useRippleEffect(ripplesRef, setIsActive);
const classes = `m3 m3-radio-label ${ const classes = `m3 m3-radio-label ${isActive === true ? "visible" : ""}`.trimEnd();
isActive === true ? 'visible' : ''
}`.trimEnd();
return ( return (
<label {...events} className={classes}> <label {...events}
<CheckBoxLayout {...props} ref={ref} type={'radio'} /> className={classes}>
<span className={'m3 m3-radio-state-layer'} /> <CheckBoxLayout {...props}
<RippleArea ref={ref}
className={'m3-checkbox-ripple-layer'} type={"radio"}/>
ref={ripplesRef} <span className={"m3 m3-radio-state-layer"}/>
central={centralRipple} <RippleArea className={"m3-checkbox-ripple-layer"}
callback={setIsActive} ref={ripplesRef}
/> central={centralRipple}
callback={setIsActive}/>
{props.children} {props.children}
</label> </label>
); )
} }
);
)

View File

@ -12,44 +12,30 @@ interface RippleEventHandlers {
onTouchStart: React.TouchEventHandler; onTouchStart: React.TouchEventHandler;
} }
export type EventHandlerType<T> = const UseRippleEffect = (ref, callback) : undefined | RippleEventHandlers => {
| React.FocusEvent<T>
| React.DragEvent<T>
| React.MouseEvent<T>
| React.TouchEvent<T>;
interface RefImperativeType { const [mounted, setMounted] = useState<boolean>(false)
current: {
start: (event: EventHandlerType<Element>, callback: () => void) => void;
stop: (event: EventHandlerType<Element>, callback: () => void) => void;
};
}
const UseRippleEffect = (
ref: RefImperativeType,
callback: () => void
): undefined | RippleEventHandlers => {
const [mounted, setMounted] = useState<boolean>(false);
useEffect(() => { useEffect(() => {
if (!mounted) setMounted(true); if (!mounted) setMounted(true);
}); })
if (!mounted) return; if (!mounted) return;
const {start, stop} = ref.current; const {start, stop} = ref.current;
return { return {
onBlur: event => stop(event, callback), onBlur: (event) => stop(event, callback),
onContextMenu: event => start(event, callback), onContextMenu: (event) => start(event, callback),
onDragLeave: event => stop(event, callback), onDragLeave: (event) => stop(event, callback),
onMouseDown: event => start(event, callback), onMouseDown: (event) => start(event, callback),
onMouseLeave: event => stop(event, callback), onMouseLeave: (event) => stop(event, callback),
onMouseUp: event => stop(event, callback), onMouseUp: (event) => stop(event, callback),
onTouchEnd: event => stop(event, callback), onTouchEnd: (event) => stop(event, callback),
onTouchMove: event => stop(event, callback), onTouchMove: (event) => stop(event, callback),
onTouchStart: event => stop(event, callback), onTouchStart: (event) => stop(event, callback),
}; }
};
export default UseRippleEffect; }
export default UseRippleEffect;

View File

@ -1,4 +1,4 @@
'use client'; "use client"
import React, { import React, {
useId, useId,
@ -6,128 +6,109 @@ import React, {
useState, useState,
forwardRef, forwardRef,
useCallback, useCallback,
useImperativeHandle, useImperativeHandle
} from 'react'; } from 'react';
import {Ripple} from './ripple'; import {Ripple} from "./ripple";
import {Ripples} from './ripple'; import {Ripples} from "./ripple";
import {RippleAreaProps} from './ripple.types'; import {RippleAreaProps} from "./ripple.types";
const TIMEOUT = 550; const TIMEOUT : number = 550;
const rippleAreaContext = React.createContext(false); const rippleAreaContext = React.createContext(false);
const RippleArea = forwardRef( const RippleArea = forwardRef(
({central = false, callback, ...props}: RippleAreaProps, ref) => {
function RippleArea({central = false, callback, ...props} : RippleAreaProps, ref) {
const [ripples, setRipples] = useState<Array<JSX.Element>>([]), const [ripples, setRipples] = useState<Array<JSX.Element>>([]),
rippleDomain = useRef<any>(null), rippleDomain = useRef<any>(null),
clicked = useRef<boolean>(false), clicked = useRef<boolean>(false),
uniqueKey = useRef<number>(0), uniqueKey = useRef<number>(0),
uniqueId = useId(); uniqueId = useId();
const classes = props.className let classes = props.className ?
? `m3 m3-ripple-domain ${props.className}`.trimEnd() `m3 m3-ripple-domain ${props.className}`.trimEnd() :
: 'm3 m3-ripple-domain'; "m3 m3-ripple-domain";
const start = useCallback( const start = useCallback((event : any, cb : (state : boolean) => void) : void => {
(event: any, cb: (state: boolean) => void): void => {
clicked.current = true;
cb(clicked.current);
const rippleDomainChar = rippleDomain.current clicked.current = true;
? rippleDomain.current.getBoundingClientRect() cb(clicked.current);
: {
width: 0,
height: 0,
left: 0,
top: 0,
};
const rippleX: number = !central const rippleDomainChar = rippleDomain.current ? rippleDomain.current.getBoundingClientRect() : {
? event.clientX - rippleDomainChar.left width: 0,
: rippleDomainChar.width / 2, height: 0,
rippleY: number = !central left: 0,
? event.clientY - rippleDomainChar.top top: 0,
: rippleDomainChar.height / 2, }
rippleSizeX: number =
Math.max(
Math.abs(rippleDomainChar.width - rippleX),
rippleX
) *
2 +
2,
rippleSizeY: number =
Math.max(
Math.abs(rippleDomainChar.height - rippleY),
rippleY
) *
2 +
2,
rippleS: number =
(rippleSizeX ** 2 + rippleSizeY ** 2) ** 0.5;
setRipples((prevRipples: Array<JSX.Element>) => { let rippleX : number = !central ? event.clientX - rippleDomainChar.left : rippleDomainChar.width / 2,
if (prevRipples.length === 0) { rippleY : number = !central ? event.clientY - rippleDomainChar.top : rippleDomainChar.height / 2,
rippleSizeX : number = Math.max(Math.abs(rippleDomainChar.width - rippleX), rippleX) * 2 + 2,
rippleSizeY : number = Math.max(Math.abs(rippleDomainChar.height - rippleY), rippleY) * 2 + 2,
rippleS : number = (rippleSizeX ** 2 + rippleSizeY ** 2) ** 0.5;
setRipples((prevRipples : Array<JSX.Element>) => {
if(prevRipples.length === 0){
return [ return [
<Ripple <Ripple rippleX={rippleX}
rippleX={rippleX} rippleY={rippleY}
rippleY={rippleY} rippleS={rippleS}
rippleS={rippleS} key={uniqueKey.current}
key={uniqueKey.current} lifetime={TIMEOUT}/>
lifetime={TIMEOUT} ]
/>,
];
} else { } else {
const old = [...prevRipples]; let old = [...prevRipples];
old.push( old.push(
<Ripple <Ripple rippleX={rippleX}
rippleX={rippleX} rippleY={rippleY}
rippleY={rippleY} rippleS={rippleS}
rippleS={rippleS} key={uniqueKey.current}
key={uniqueKey.current} lifetime={TIMEOUT}/>
lifetime={TIMEOUT} )
/>
);
return old; return old;
} }
}); }
)
uniqueKey.current += 1; uniqueKey.current += 1;
},
[]
);
const stop = useCallback( }, []);
(_event: any, cb: (state: boolean) => void) => {
clicked.current = false;
cb(clicked.current);
setRipples((prevRipples: Array<JSX.Element>) => { const stop = useCallback((_event : any, cb : (state : boolean) => void) => {
if (prevRipples.length > 0) {
const old = [...prevRipples]; clicked.current = false;
old.shift(); cb(clicked.current);
return old;
} setRipples((prevRipples : Array<JSX.Element>) => {
return prevRipples; if(prevRipples.length > 0) {
}); let old = [...prevRipples];
}, old.shift();
[] return old;
); }
return prevRipples
});
},[]);
useImperativeHandle(ref, () => ({
start,
stop,
}), [start, stop]);
useImperativeHandle(
ref,
() => ({
start,
stop,
}),
[start, stop]
);
return ( return (
<span className={classes} id={uniqueId} ref={rippleDomain}> <span className={classes}
id={uniqueId}
ref={rippleDomain}>
<rippleAreaContext.Provider value={clicked.current}> <rippleAreaContext.Provider value={clicked.current}>
<Ripples>{ripples}</Ripples> <Ripples>
{ripples}
</Ripples>
</rippleAreaContext.Provider> </rippleAreaContext.Provider>
</span> </span>
); );
}
);
export {rippleAreaContext, RippleArea}; }
)
export {rippleAreaContext, RippleArea};

View File

@ -1,9 +1,9 @@
'use client'; "use client"
import isEmpty from './utils/utils'; import isEmpty from "./utils/utils";
import {rippleProps} from './ripple.types'; import {rippleProps} from "./ripple.types";
import {rippleAreaContext} from './ripple-area'; import {rippleAreaContext} from "./ripple-area";
import RippleEffectBuild from './utils/ripple-effect-builder'; import RippleEffectBuild from "./utils/ripple-effect-builder";
import React, { import React, {
useRef, useRef,
useState, useState,
@ -12,69 +12,82 @@ import React, {
useContext, useContext,
useCallback, useCallback,
ForwardedRef, ForwardedRef,
useTransition, useTransition, JSX
JSX,
} from 'react'; } from 'react';
const Ripples = forwardRef((props: any, ref: ForwardedRef<any>) => { const Ripples = forwardRef(function Ripples(props : any, ref : ForwardedRef<any>){
const [ripples, setRipples] = useState({}); const [ripples, setRipples] = useState({});
const firstRender = useRef<boolean>(true); const firstRender = useRef<boolean>(true);
const [pending, startTransition] = useTransition(); const [pending, startTransition] = useTransition();
const LifetimeEnd = useCallback((child: JSX.Element) => { const LifetimeEnd = useCallback((child : JSX.Element) => {
if (child.props.endLifetime) { if (child.props.endLifetime) {
child.props.endLifetime(); child.props.endLifetime();
} }
setRipples(state => { setRipples(state => {
const children = {...state}; let children = {...state};
delete children[child.key]; delete children[child.key];
return children; return children;
}); })
}, []); }, []);
useEffect(() => { useEffect(() => {
if (props.children.length > 0) {
if(props.children.length > 0){
startTransition(() => { startTransition(() => {
if (firstRender.current || isEmpty(ripples)) { if (firstRender.current || isEmpty(ripples)) {
setRipples(RippleEffectBuild(props.children, LifetimeEnd)); setRipples(RippleEffectBuild(props.children, LifetimeEnd));
firstRender.current = false; firstRender.current = false;
} else { } else {
setRipples( setRipples(RippleEffectBuild(props.children, LifetimeEnd, ripples))
RippleEffectBuild(props.children, LifetimeEnd, ripples)
);
} }
}); });
} }
}, [props.children]); }, [props.children]);
return <>{Object.values(ripples)}</>; return(
}); <>
{ Object.values(ripples) }
</>
)
const Ripple = forwardRef((props: rippleProps, ref: ForwardedRef<any>) => { })
const {rippleX, rippleY, rippleS, endLifetime, lifetime} = props;
const Ripple = forwardRef(function Ripple(props : rippleProps, ref : ForwardedRef<any>) {
const {
rippleX,
rippleY,
rippleS,
endLifetime,
lifetime
} = props;
const clicked = useContext<boolean>(rippleAreaContext); const clicked = useContext<boolean>(rippleAreaContext);
const [classes, setClasses] = useState<string>('m3 ripple visible'); const [classes, setClasses] = useState<string>("m3 ripple visible");
useEffect(() => { useEffect(() => {
if (endLifetime !== null && !clicked) { if(endLifetime !== null && !clicked) {
setClasses('m3 ripple'); setClasses("m3 ripple")
setTimeout(endLifetime, lifetime); setTimeout(endLifetime, lifetime);
} }
}, [clicked, endLifetime]); }, [clicked, endLifetime]);
return ( return (
<span <span className={classes} style={
className={classes} {
style={{
left: -(rippleS / 2) + rippleX, left: -(rippleS / 2) + rippleX,
top: -(rippleS / 2) + rippleY, top: -(rippleS / 2) + rippleY,
width: rippleS, width: rippleS,
aspectRatio: 1, aspectRatio: 1,
}} }
/> }/>
); );
});
})
export {Ripple, Ripples}; export {Ripple, Ripples};

View File

@ -1,19 +1,21 @@
import {Dispatch, SetStateAction, PropsWithChildren} from 'react'; import {Dispatch, SetStateAction} from "react";
export interface IRippleProps { export interface IRippleProps {
centralRipple?: boolean; centralRipple? : boolean
} }
export interface RippleAreaProps extends PropsWithChildren<any> { export interface RippleAreaProps extends PropsWithChildren<any>{
callback: Dispatch<SetStateAction<boolean>>; callback : Dispatch<SetStateAction<boolean>>,
central?: boolean; central? : boolean,
} }
export type rippleProps = { export type rippleProps = {
rippleX: number; rippleX : number,
rippleY: number; rippleY : number,
rippleS: number; rippleS : number,
endLifetime?: any; endLifetime? : any,
lifetime: number; lifetime : number,
key?: number; key? : number,
}; }
import {PropsWithChildren} from "react";

View File

@ -1,15 +1,18 @@
import {cloneElement, ReactElement} from 'react'; import {cloneElement, ReactElement} from "react";
export default function ArrayConvertToObj( export default function ArrayConvertToObj(
obj: Object, obj : Object,
nextChildren: ReactElement[], nextChildren : ReactElement[],
callback: (child: any) => void callback : (child: any) => void
): void { ) : void {
Object.values(nextChildren).forEach(
(child: JSX.Element) => Object
(obj[child.key] = cloneElement(child, { .values(nextChildren)
.forEach((child : JSX.Element) =>
obj[child.key] = cloneElement(child, {
...child.props, ...child.props,
endLifetime: callback.bind(null, child), endLifetime: callback.bind(null, child)
})) })
); );
}
}

View File

@ -1,17 +1,15 @@
import isEmpty from './utils'; import ArrayConvertToObj from "./array-convert-to-obj";
import {cloneElement, ReactElement} from 'react'; import {cloneElement, ReactElement} from "react";
import ArrayConvertToObj from './array-convert-to-obj'; import isEmpty from "./utils";
export default function RippleEffectBuild( export default function RippleEffectBuild(
nextRipples: ReactElement[], nextRipples : ReactElement[],
callback: (child: any) => void, callback : (child : any) => void,
prevRipples?: any | null prevRipples? : any | null
) { ) {
const next: object = {};
const empty: boolean = isEmpty(prevRipples);
const preparedRipples: object = empty ? {} : prevRipples;
console.log(preparedRipples); let empty : boolean = isEmpty(prevRipples);
let preparedRipples : object = empty ? {} : prevRipples;
switch (empty) { switch (empty) {
case true: case true:
@ -19,16 +17,20 @@ export default function RippleEffectBuild(
break; break;
case false: case false:
ArrayConvertToObj(next, nextRipples, callback); let next : object = {};
for (const rippleKey of Object.keys(next)) { ArrayConvertToObj(next, nextRipples, callback)
if (preparedRipples[rippleKey] === undefined) { for(let rippleKey of Object.keys(next)){
if(preparedRipples[rippleKey] == undefined){
preparedRipples[rippleKey] = cloneElement(next[rippleKey], { preparedRipples[rippleKey] = cloneElement(next[rippleKey], {
...next[rippleKey].props, ...next[rippleKey].props,
endLifetime: callback.bind(null, next[rippleKey]), endLifetime: callback.bind(null, next[rippleKey])
}); })
} }
} }
break; break;
} }
return preparedRipples; return preparedRipples;
}
}

View File

@ -1,4 +1,4 @@
export default function isEmpty(obj: Object): boolean { export default function isEmpty(obj : Object) : boolean{
for (const _i in obj) return false; for(let _i in obj) return false;
return true; return true;
} }

View File

@ -1,6 +1,6 @@
import React, {ForwardedRef, forwardRef} from 'react'; import React, {ForwardedRef, forwardRef} from "react";
import {switchMainProps} from './switch.types'; import {switchMainProps} from "./switch.types";
import {CheckBoxLayout} from '../checkbox-layout/check-box-layout'; import {CheckBoxLayout} from "../checkbox-layout/check-box-layout";
/** /**
* Switch component * Switch component
@ -8,31 +8,32 @@ import {CheckBoxLayout} from '../checkbox-layout/check-box-layout';
*/ */
export const Switch = forwardRef( export const Switch = forwardRef(
( ({icon, disabled, selected = false, ...props} : switchMainProps, ref : ForwardedRef<any>) => (
{icon, disabled, selected = false, ...props}: switchMainProps, <div className={"m3 m3-switch-exp"} ref={ref}>
ref: ForwardedRef<HTMLInputElement> <CheckBoxLayout {...props}
) => ( type={"checkbox"}
<div className={'m3 m3-switch-exp'}> disabled={disabled}
<CheckBoxLayout className={`m3 ${props.className ?? ""}`.trimEnd()}/>
{...props}
ref={ref}
type={'checkbox'}
disabled={disabled}
className={`m3 ${props.className ?? ''}`.trimEnd()}
/>
<svg> <svg>
<rect className={'m3 m3-switch-track'} /> <rect className={"m3 m3-switch-track"}/>
<circle className={'m3 m3-switch-handler'} /> <circle className={"m3 m3-switch-handler"}/>
<circle className={'m3 m3-switch-handler-state-layer'} /> <circle className={"m3 m3-switch-handler-state-layer"}/>
<g> <g>
{icon && !selected && ( {
<text className={'m3 m3-icon-unchecked'}>close</text> icon && !selected &&
)} <text className={"m3 m3-icon-unchecked"}>
{icon && ( close
<text className={'m3 m3-icon-checked'}>check</text> </text>
)} }
{
icon &&
<text className={"m3 m3-icon-checked"}>
check
</text>
}
</g> </g>
</svg> </svg>
</div> </div>
) )
);
)

View File

@ -1,7 +1,7 @@
import {PropsWithChildren} from 'react'; import {PropsWithChildren} from "react";
export interface switchMainProps extends PropsWithChildren<any> { export interface switchMainProps extends PropsWithChildren<any>{
disabled?: boolean; disabled? : boolean,
icon?: boolean; icon? : boolean,
selected?: boolean; selected? : boolean
} }

View File

@ -1,81 +1,64 @@
'use client'; "use client"
import React, {useState} from 'react'; import React, {useState} from 'react';
import {bool, string} from 'prop-types'; import {bool, string} from "prop-types";
import {type TextFieldInterface} from './text-field.types'; import {TextFieldInterface} from "./text-field.types";
export function TextField({variant = "filled", withAfterIcon, withBeforeIcon, supportingText, ...props} : TextFieldInterface) {
export function TextField({
variant = 'filled',
withAfterIcon,
withBeforeIcon,
supportingText,
...props
}: TextFieldInterface) {
const [raised, setRaised] = useState<boolean>(props.placeholder ?? false); const [raised, setRaised] = useState<boolean>(props.placeholder ?? false);
const callback = (e: any) => { const callback = (e : any) => {
if ( if(e.type === "blur" && e.target.value.length === 0 && !props.placeholder) setRaised(false);
e.type === 'blur' && else if(e.type === "focus") setRaised(true);
e.target.value.length === 0 && }
!props.placeholder
)
setRaised(false);
else if (e.type === 'focus') setRaised(true);
};
const iconStyles = const iconStyles = withBeforeIcon && withAfterIcon ? "with-before-icon with-after-icon" :
withBeforeIcon && withAfterIcon withBeforeIcon ? "with-before-icon" : withAfterIcon ? "with-after-icon" : ""
? 'with-before-icon with-after-icon'
: withBeforeIcon
? 'with-before-icon'
: withAfterIcon
? 'with-after-icon'
: '';
return ( return (
<span> <span>
<div className={`m3 m3-text-field ${variant}`.trimEnd()}> <div className={`m3 m3-text-field ${variant}`.trimEnd()}>
{variant === 'outlined' && ( {variant === "outlined" &&
<fieldset> <fieldset>
<legend className={raised && 'raised'}> <legend className={raised && "raised"}>
<span>Label</span> <span>Label</span>
</legend> </legend>
</fieldset> </fieldset>
)} }
{withBeforeIcon && ( {withBeforeIcon &&
<span className={'m3-icon icon-before'}> <span className={"m3-icon icon-before"}>
{withBeforeIcon && 'search'} {withBeforeIcon && "search"}
</span> </span>
)} }
<input <input {...props}
{...props} className={`${props.className ?? ""} ${iconStyles}`.trim()}
className={`${props.className ?? ''} ${iconStyles}`.trim()} onFocus={(event) => {
onFocus={event => { callback(event);
callback(event); if(props.onFocus) props.onFocus(event)
if (props.onFocus) props.onFocus(event); }}
}} onBlur={(event) => {
onBlur={event => { callback(event)
callback(event); if(props.onBlur) props.onBlur(event)
if (props.onBlur) props.onBlur(event); }}/>
}} <label className={raised ? "raised" : ""}>
/> {props.children ?? "Label"}
<label className={raised ? 'raised' : ''}>
{props.children ?? 'Label'}
</label> </label>
<span className={'m3-text-field-state-layer'} /> <span className={"m3-text-field-state-layer"}/>
{withAfterIcon && ( {withAfterIcon &&
<span className={'m3-icon'}> <span className={"m3-icon"}>
{withAfterIcon && 'cancel'} {withAfterIcon && "cancel"}
</span> </span>
)} }
</div> </div>
{supportingText && ( {supportingText &&
<span className={'m3-text-field-supporting-text'}> <span className={"m3-text-field-supporting-text"}>
{supportingText} {supportingText}
</span> </span>
)} }
</span> </span>
); );
} }
TextField.propTypes = { TextField.propTypes = {
@ -86,4 +69,4 @@ TextField.propTypes = {
variant: string, variant: string,
placeholder: string, placeholder: string,
supportingText: string, supportingText: string,
}; }

View File

@ -1,8 +1,8 @@
import {PropsWithChildren} from 'react'; import {PropsWithChildren} from "react";
export interface TextFieldInterface extends PropsWithChildren<any> { export interface TextFieldInterface extends PropsWithChildren<any>{
variant: 'filled' | 'outlined'; variant: "filled" | "outlined",
withAfterIcon?: boolean; withAfterIcon?: boolean,
withBeforeIcon?: boolean; withBeforeIcon?: boolean,
supportingText?: string; supportingText?: string,
} }

View File

@ -1,18 +1,23 @@
{ {
"extends": "./node_modules/gts/tsconfig-google.json",
"compilerOptions": { "compilerOptions": {
"rootDir": ".", "target": "es5",
"outDir": "build", "lib": [
"allowSyntheticDefaultImports": true, "dom",
"dom.iterable",
"esnext"
],
"allowJs": true, "allowJs": true,
"skipLibCheck": true, "skipLibCheck": true,
"strict": false,
"forceConsistentCasingInFileNames": true,
"noEmit": true, "noEmit": true,
"incremental": true,
"esModuleInterop": true, "esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node", "moduleResolution": "node",
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "isolatedModules": true,
"jsx": "preserve", "jsx": "preserve",
"incremental": true,
"plugins": [ "plugins": [
{ {
"name": "next" "name": "next"
@ -20,8 +25,12 @@
] ]
}, },
"include": [ "include": [
"src/**/*.ts", "next-env.d.ts",
"test/**/*.ts", "**/*.ts",
"**/*.tsx",
".next/types/**/*.ts" ".next/types/**/*.ts"
],
"exclude": [
"node_modules"
] ]
} }