diff --git a/app/Controllers/Http/Submitter/DatasetController.ts b/app/Controllers/Http/Submitter/DatasetController.ts index cda7da6..a308634 100644 --- a/app/Controllers/Http/Submitter/DatasetController.ts +++ b/app/Controllers/Http/Submitter/DatasetController.ts @@ -105,7 +105,6 @@ export default class DatasetController { 'reviewed', 'rejected_editor', 'rejected_reviewer', - 'rejected_to_reviewer', ]) .where('account_id', user.id) .preload('titles') diff --git a/app/validators/project.ts b/app/validators/project.ts index 7f3d1f8..bad6c7c 100644 --- a/app/validators/project.ts +++ b/app/validators/project.ts @@ -3,13 +3,13 @@ import vine from '@vinejs/vine'; export const createProjectValidator = vine.compile( vine.object({ - label: vine.string().trim().minLength(1).maxLength(50) .regex(/^[a-z0-9-]+$/), + label: vine.string().trim().minLength(1).maxLength(50), name: vine .string() .trim() .minLength(3) .maxLength(255) - .regex(/^[a-zA-Z0-9äöüßÄÖÜ\s-]+$/), + .regex(/^[a-z0-9-]+$/), description: vine.string().trim().maxLength(255).minLength(5).optional(), }), ); @@ -22,7 +22,7 @@ export const updateProjectValidator = vine.compile( .trim() .minLength(3) .maxLength(255) - .regex(/^[a-zA-Z0-9äöüßÄÖÜ\s-]+$/), + .regex(/^[a-z0-9-]+$/), description: vine.string().trim().maxLength(255).minLength(5).optional(), }), ); diff --git a/components.d.ts b/components.d.ts index 001762d..3834bf1 100644 --- a/components.d.ts +++ b/components.d.ts @@ -11,21 +11,3 @@ declare module '@vue/runtime-core' { NInput: (typeof import('naive-ui'))['NInput']; } } - -// types/leaflet-src-dom-DomEvent.d.ts -declare module 'leaflet/src/dom/DomEvent' { - export type DomEventHandler = (e?: any) => void; - - // Attach event listeners. `obj` can be any DOM node or object with event handling. - export function on(obj: any, types: string, fn: DomEventHandler, context?: any): void; - - // Detach event listeners. - export function off(obj: any, types: string, fn?: DomEventHandler, context?: any): void; - - // Prevent default on native events - export function preventDefault(ev?: Event | undefined): void; - - // Optional: other helpers you might need later - export function stopPropagation(ev?: Event | undefined): void; - export function stop(ev?: Event | undefined): void; -} \ No newline at end of file diff --git a/resources/js/Components/Map/MapOptions.ts b/resources/js/Components/Map/MapOptions.ts index ede8d87..8a2de5a 100644 --- a/resources/js/Components/Map/MapOptions.ts +++ b/resources/js/Components/Map/MapOptions.ts @@ -1,11 +1,7 @@ -// import type { LatLngBoundsExpression } from 'leaflet/src/geo/LatLngBounds'; -// import type { LatLngExpression } from 'leaflet/src/geo/LatLng'; -// import type { Layer } from 'leaflet/src/layer/Layer'; -// import type { CRS } from 'leaflet/src/geo/crs/CRS'; -import type { LatLngBoundsExpression } from 'leaflet'; -import type { LatLngExpression } from 'leaflet'; -import type { Layer } from 'leaflet'; -import type { CRS } from 'leaflet'; +import type { LatLngBoundsExpression } from 'leaflet/src/geo/LatLngBounds'; +import type { LatLngExpression } from 'leaflet/src/geo/LatLng'; +import type { Layer } from 'leaflet/src/layer/Layer'; +import type { CRS } from 'leaflet/src/geo/crs/CRS'; export interface MapOptions { preferCanvas?: boolean | undefined; diff --git a/resources/js/Components/Map/SearchMap.vue b/resources/js/Components/Map/SearchMap.vue index 7c02269..aac036e 100644 --- a/resources/js/Components/Map/SearchMap.vue +++ b/resources/js/Components/Map/SearchMap.vue @@ -8,6 +8,7 @@ import { svg } from 'leaflet/src/layer/vector/SVG'; import axios from 'axios'; import { LatLngBoundsExpression } from 'leaflet/src/geo/LatLngBounds'; import { tileLayerWMS } from 'leaflet/src/layer/tile/TileLayer.WMS'; +// import { TileLayer } from 'leaflet/src/layer/tile/TileLayer'; import { Attribution } from 'leaflet/src/control/Control.Attribution'; import DrawControlComponent from '@/Components/Map/draw.component.vue'; import ZoomControlComponent from '@/Components/Map/zoom.component.vue'; @@ -16,7 +17,14 @@ import { LayerGroup } from 'leaflet/src/layer/LayerGroup'; import { OpensearchDocument } from '@/Dataset'; Map.include({ + // @namespace Map; @method getRenderer(layer: Path): Renderer + // Returns the instance of `Renderer` that should be used to render the given + // `Path`. It will ensure that the `renderer` options of the map and paths + // are respected, and that the renderers do exist on the map. getRenderer: function (layer) { + // @namespace Path; @option renderer: Renderer + // Use this specific instance of `Renderer` for this path. Takes + // precedence over the map's [default renderer](#map-renderer). var renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer; if (!renderer) { @@ -43,18 +51,21 @@ Map.include({ }, _createRenderer: function (options) { + // @namespace Map; @option preferCanvas: Boolean = false + // Whether `Path`s should be rendered on a `Canvas` renderer. + // By default, all `Path`s are rendered in a `SVG` renderer. return (this.options.preferCanvas && canvas(options)) || svg(options); }, }); - const DEFAULT_BASE_LAYER_NAME = 'BaseLayer'; const DEFAULT_BASE_LAYER_ATTRIBUTION = '© OpenStreetMap contributors'; const OPENSEARCH_HOST = 'https://catalog.geosphere.at'; - +// const OPENSEARCH_HOST = `${process.env.OPENSEARCH_HOST}`; +// const OPENSEARCH_HOST = `http://${process.env.OPENSEARCH_PUBLIC_HOST}`; let map: Map; const props = defineProps({ - checkable: Boolean, + dheckable: Boolean, datasets: { type: Array, default: () => [], @@ -78,7 +89,10 @@ const items = computed({ get() { return props.datasets; }, + // setter set(value) { + // Note: we are using destructuring assignment syntax here. + props.datasets.length = 0; props.datasets.push(...value); }, @@ -89,13 +103,15 @@ const fitBounds: LatLngBoundsExpression = [ [49.0390742051, 16.9796667823], ]; +// const mapId = 'map'; const drawControl: Ref = ref(null); const southWest = ref(null); const northEast = ref(null); const mapService = MapService(); -const isLoading = ref(false); const filterLayerGroup = new LayerGroup(); +// Replace with your actual data +// const datasets: Ref = ref([]); onMounted(() => { initMap(); @@ -106,6 +122,7 @@ onUnmounted(() => { }); const initMap = async () => { + // init leaflet map map = new Map('map', props.mapOptions); mapService.setMap(props.mapId, map); map.scrollWheelZoom.disable(); @@ -123,6 +140,11 @@ const initMap = async () => { layers: 'OSM-WMS', }); + // let baseAt = new TileLayer('https://{s}.wien.gv.at/basemap/bmapgrau/normal/google3857/{z}/{y}/{x}.png', { + // subdomains: ['maps', 'maps1', 'maps2', 'maps3', 'maps4'], + // attribution: DEFAULT_BASE_LAYER_ATTRIBUTION, + // }); + let layerOptions = { label: DEFAULT_BASE_LAYER_NAME, visible: true, @@ -131,15 +153,62 @@ const initMap = async () => { layerOptions.layer.addTo(map); map.on('Draw.Event.CREATED', handleDrawEventCreated); + + // // const query = { + // // query: { + // // term: { + // // id: "103" + // // } + // // } + // // }; + // // to do : call extra method: + // const query = { + // // q: 'id:103' + // // q: 'author:"Iglseder, Christoph" OR title:"Datensatz"', + // // q: 'author:"Iglseder"', + // q: '*', + // _source: 'author,bbox_xmin,bbox_xmax,bbox_ymin,bbox_ymax,abstract,title', + // size: 1000 + // // qf:"title^3 author^2 subject^1", + // } + // try { + // let response = await axios({ + // method: 'GET', + // url: OPEN_SEARCH_HOST + '/tethys-records/_search', + // headers: { 'Content-Type': 'application/json' }, + // params: query + // }); + // // Loop through the hits in the response + // response.data.hits.hits.forEach(hit => { + // // Get the geo_location attribute + // // var geo_location = hit._source.geo_location; + // let xMin = hit._source.bbox_xmin; + // let xMax = hit._source.bbox_xmax; + // let yMin = hit._source.bbox_ymin; + // let yMax = hit._source.bbox_ymax; + // var bbox: LatLngBoundsExpression = [[yMin, xMin], [yMax, xMax]]; + // // Parse the WKT string to get the bounding box coordinates + // // var bbox = wktToBbox(geo_location); + + // // // Add the bounding box to the map as a rectangle + // new Rectangle(bbox, { color: "#ff7800", weight: 1 }).addTo(map); + // // console.log(hit._source); + // }); + // } catch (error) { + // console.error(error); + // } }; const handleDrawEventCreated = async (event) => { - isLoading.value = true; filterLayerGroup.clearLayers(); items.value = []; let layer = event.layer; let bounds = layer.getBounds(); + // coverage.x_min = bounds.getSouthWest().lng; + // coverage.y_min = bounds.getSouthWest().lat; + // coverage.x_max = bounds.getNorthEast().lng; + // coverage.y_max = bounds.getNorthEast().lat; try { let response = await axios({ @@ -156,6 +225,7 @@ const handleDrawEventCreated = async (event) => { filter: { geo_shape: { geo_location: { + // replace 'location' with your geo-point field name shape: { type: 'envelope', coordinates: [ @@ -167,12 +237,16 @@ const handleDrawEventCreated = async (event) => { }, }, }, + // _source: 'author,bbox_xmin,bbox_xmax,bbox_ymin,bbox_ymax,abstract,title', + // "size": 1000 }, }, }, }); - + // Loop through the hits in the response response.data.hits.hits.forEach((hit) => { + // Get the geo_location attribute + // var geo_location = hit._source.geo_location; let xMin = hit._source.bbox_xmin; let xMax = hit._source.bbox_xmax; let yMin = hit._source.bbox_ymin; @@ -181,255 +255,46 @@ const handleDrawEventCreated = async (event) => { [yMin, xMin], [yMax, xMax], ]; + // Parse the WKT string to get the bounding box coordinates + // var bbox = wktToBbox(geo_location); - let rect = new Rectangle(bbox, { - color: '#65DC21', - weight: 2, - fillColor: '#65DC21', - fillOpacity: 0.2, - className: 'animated-rectangle', - }); + // // Add the bounding box to the map as a rectangle + let rect = new Rectangle(bbox, { color: '#ff7800', weight: 1 }); filterLayerGroup.addLayer(rect); + // add to result list items.value.push(hit._source); }); } catch (error) { console.error(error); - } finally { - isLoading.value = false; } }; - + \ No newline at end of file diff --git a/resources/js/Components/Map/draw.component.vue b/resources/js/Components/Map/draw.component.vue index 2638213..1bfb9af 100644 --- a/resources/js/Components/Map/draw.component.vue +++ b/resources/js/Components/Map/draw.component.vue @@ -1,29 +1,14 @@ @@ -32,14 +17,16 @@ import { Component, Vue, Prop } from 'vue-facing-decorator'; import BaseIcon from '@/Components/BaseIcon.vue'; -import { mdiVectorRectangle, mdiClose } from '@mdi/js'; +import { mdiDrawPen } from '@mdi/js'; import { MapService } from '@/Stores/map.service'; -import { Map } from 'leaflet'; +import { Map } from 'leaflet/src/map/index'; +// import { LayerGroup } from 'leaflet/src/layer/LayerGroup'; +// import { LatLngBounds, Rectangle } from 'leaflet'; import { on, off, preventDefault } from 'leaflet/src/dom/DomEvent'; - -import { Rectangle } from 'leaflet'; -import { LatLngBounds } from 'leaflet'; +import { Rectangle } from 'leaflet/src/layer/vector/Rectangle'; +import { LatLngBounds } from 'leaflet/src/geo/LatLngBounds'; import { LatLng } from 'leaflet'; +import { LeafletMouseEvent } from 'leaflet'; @Component({ name: 'draw-control', @@ -47,19 +34,19 @@ import { LatLng } from 'leaflet'; BaseIcon, }, }) -export class DrawControlComponent extends Vue { +export default class DrawControlComponent extends Vue { public TYPE = 'rectangle'; - mdiVectorRectangle = mdiVectorRectangle; - mdiClose = mdiClose; + mdiDrawPen = mdiDrawPen; + // private featuresLayer; options = { shapeOptions: { stroke: true, - color: '#65DC21', + color: '#22C55E', weight: 4, opacity: 0.5, fill: true, - fillColor: '#65DC21', + fillColor: '#22C55E', //same as color by default fillOpacity: 0.2, clickable: true, }, @@ -69,6 +56,7 @@ export class DrawControlComponent extends Vue { }; @Prop() public mapId: string; + // @Prop() public map: Map; @Prop public southWest: LatLng; @Prop public northEast: LatLng; @Prop({ @@ -77,17 +65,13 @@ export class DrawControlComponent extends Vue { public preserve: boolean; mapService = MapService(); - private _enabled: boolean; + public _enabled: boolean; private _map: Map; private _isDrawing: boolean = false; private _startLatLng: LatLng; private _mapDraggable: boolean; private _shape: Rectangle | undefined; - get enabled() { - return this._enabled; - } - enable() { if (this._enabled) { return this; @@ -109,35 +93,49 @@ export class DrawControlComponent extends Vue { return this; } - // enabled() { - // return !!this._enabled; - // } + enabled() { + return !!this._enabled; + } + + // @Ref('inputDraw') private _inputDraw: HTMLElement; private addHooks() { + // L.Draw.Feature.prototype.addHooks.call(this); this._map = this.mapService.getMap(this.mapId); if (this._map) { this._mapDraggable = this._map.dragging.enabled(); if (this._mapDraggable) { this._map.dragging.disable(); } - this._map.getContainer().style.cursor = 'crosshair'; + //TODO refactor: move cursor to styles + // this._map.domElement.style.cursor = 'crosshair'; + this._map._container.style.cursor = 'crosshair'; + // this._tooltip.updateContent({text: this._initialLabelText}); this._map .on('mousedown', this._onMouseDown, this) .on('mousemove', this._onMouseMove, this) .on('touchstart', this._onMouseDown, this) - .on('touchmove', this._onMouseMove, this); - + .on('touchmove', this._onMouseMove, this); + // we should prevent default, otherwise default behavior (scrolling) will fire, + // and that will cause document.touchend to fire and will stop the drawing + // (circle, rectangle) in touch mode. + // (update): we have to send passive now to prevent scroll, because by default it is {passive: true} now, which means, + // handler can't event.preventDefault + // check the news https://developers.google.com/web/updates/2016/06/passive-event-listeners + // document.addEventListener('touchstart', preventDefault, { passive: false }); } } private removeHooks() { + // L.Draw.Feature.prototype.removeHooks.call(this); if (this._map) { if (this._mapDraggable) { this._map.dragging.enable(); } - this._map.getContainer().style.cursor = ''; + //TODO refactor: move cursor to styles + this._map._container.style.cursor = ''; this._map .off('mousedown', this._onMouseDown, this) @@ -148,36 +146,46 @@ export class DrawControlComponent extends Vue { off(document, 'mouseup', this._onMouseUp, this); off(document, 'touchend', this._onMouseUp, this); + // document.removeEventListener('touchstart', preventDefault); + + // If the box element doesn't exist they must not have moved the mouse, so don't need to destroy/return if (this._shape && this.preserve == false) { this._map.removeLayer(this._shape); + // delete this._shape; this._shape = undefined; } } this._isDrawing = false; } - // private _onMouseDown(e: LeafletMouseEvent) { - private _onMouseDown(e: any) { + private _onMouseDown(e: LeafletMouseEvent) { this._isDrawing = true; this._startLatLng = e.latlng; + // DomEvent.on(document, 'mouseup', this._onMouseUp, this) + // .on(document, 'touchend', this._onMouseUp, this) + // .preventDefault(e.originalEvent); on(document, 'mouseup', this._onMouseUp, this); on(document, 'touchend', this._onMouseUp, this); preventDefault(e.originalEvent); } - // private _onMouseMove(e: LeafletMouseEvent) { - private _onMouseMove(e: any) { + + private _onMouseMove(e: LeafletMouseEvent) { var latlng = e.latlng; + // this._tooltip.updatePosition(latlng); if (this._isDrawing) { + // this._tooltip.updateContent(this._getTooltipText()); this._drawShape(latlng); } } + private _onMouseUp() { if (this._shape) { this._fireCreatedEvent(this._shape); } + // this.removeHooks(); this.disable(); if (this.options.repeatMode) { this.enable(); @@ -186,12 +194,14 @@ export class DrawControlComponent extends Vue { private _fireCreatedEvent(shape: Rectangle) { var rectangle = new Rectangle(shape.getBounds(), this.options.shapeOptions); + // L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, rectangle); this._map.fire('Draw.Event.CREATED', { layer: rectangle, type: this.TYPE }); } public removeShape() { if (this._shape) { this._map.removeLayer(this._shape); + // delete this._shape; this._shape = undefined; } } @@ -200,6 +210,7 @@ export class DrawControlComponent extends Vue { if (!this._shape) { const bounds = new LatLngBounds(southWest, northEast); this._shape = new Rectangle(bounds, this.options.shapeOptions); + // this._map.addLayer(this._shape); this._map = this.mapService.getMap(this.mapId); this._shape.addTo(this._map); } else { @@ -207,10 +218,12 @@ export class DrawControlComponent extends Vue { } } + // from Draw Rectangle private _drawShape(latlng: LatLng) { if (!this._shape) { const bounds = new LatLngBounds(this._startLatLng, latlng); this._shape = new Rectangle(bounds, this.options.shapeOptions); + // this._map.addLayer(this._shape); this._shape.addTo(this._map); } else { this._shape.setBounds(new LatLngBounds(this._startLatLng, latlng)); @@ -224,336 +237,44 @@ export class DrawControlComponent extends Vue { this.enable(); } } + + // private enable() { + // //if (this.map.mapTool) this.map.mapTool.on('editable:drawing:start', this.disable.bind(this)); + // // dom.addClass(this.map.container, 'measure-enabled'); + // //this.fireAndForward('showmeasure'); + // this._startMarker(this.southWest, this.options); + // } + + // private disable() { + // //if (this.map.mapTool) this.map.mapTool.off('editable:drawing:start', this.disable.bind(this)); + // // dom.removeClass(this.map.container, 'measure-enabled'); + // // this.featuresLayer.clearLayers(); + // // //this.fireAndForward('hidemeasure'); + // // if (this._drawingEditor) { + // // this._drawingEditor.cancelDrawing(); + // // } + // } } -export default DrawControlComponent; - - - \ No newline at end of file diff --git a/resources/js/Components/Map/map.component.vue b/resources/js/Components/Map/map.component.vue index 353162b..d6d6f29 100644 --- a/resources/js/Components/Map/map.component.vue +++ b/resources/js/Components/Map/map.component.vue @@ -1,72 +1,21 @@ + + + \ No newline at end of file diff --git a/resources/js/Pages/Map.vue b/resources/js/Pages/Map.vue index 9d599f1..4c19625 100644 --- a/resources/js/Pages/Map.vue +++ b/resources/js/Pages/Map.vue @@ -1,15 +1,40 @@ \ No newline at end of file diff --git a/resources/js/Pages/Submitter/Dataset/Index.vue b/resources/js/Pages/Submitter/Dataset/Index.vue index 0d8ac47..5b01370 100644 --- a/resources/js/Pages/Submitter/Dataset/Index.vue +++ b/resources/js/Pages/Submitter/Dataset/Index.vue @@ -1,18 +1,17 @@ \ No newline at end of file + +/* .pure-table tr.inprogress { + padding: 0.8em; + background-color: rgb(94 234 212); + color: gray; +} */ + +/* .pure-table tr.editor_accepted { + background-color: rgb(125 211 252); + color: gray; +} */ + +/* .pure-table tr.rejected_reviewer { + padding: 0.8em; + background-color: orange; + color: gray; +} */ + +/* .pure-table tr.rejected_editor { + background-color: orange; + color: gray; +} */ + +/* .pure-table tr.reviewed { + background-color: yellow; + color: gray; +} */ + +/* .pure-table tr.approved { + background-color: rgb(86, 86, 241); + color: whitesmoke; + +}*/ + diff --git a/tailwind.config.js b/tailwind.config.js index 357ffee..e41b62d 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -12,66 +12,25 @@ module.exports = { gray: 'gray', }, extend: { - backgroundImage: { - 'radio-checked': - "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z' /%3E%3C/svg%3E\")", - 'checkbox-checked': - "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\")", - }, - backgroundColor: { - // Draft / In Progress - Light blue-gray - 'draft': 'rgb(224 242 254)', // sky-100 - 'draft-dark': 'rgb(12 74 110 / 0.3)', // sky-900/30 - 'inprogress': 'rgb(224 242 254)', // sky-100 - 'inprogress-dark': 'rgb(12 74 110 / 0.3)', // sky-900/30 - - // Released / Submitted - Bright blue - 'released': 'rgb(191 219 254)', // blue-200 - 'released-dark': 'rgb(30 58 138 / 0.3)', // blue-900/30 - - // Editor Accepted - Blue-green (teal) - 'editor-accepted': 'rgb(204 251 241)', // teal-100 - 'editor-accepted-dark': 'rgb(19 78 74 / 0.3)', // teal-900/30 - - // Rejected by Reviewer - Yellow-orange (amber) - 'rejected-reviewer': 'rgb(254 243 199)', // amber-100 - 'rejected-reviewer-dark': 'rgb(120 53 15 / 0.3)', // amber-900/30 - - // Rejected by Editor - Rose/Red (back to submitter) - 'rejected-editor': 'rgb(254 205 211)', // rose-200 - 'rejected-editor-dark': 'rgb(136 19 55 / 0.3)', // rose-900/30 - - // Approved / Ready for Review - Cyan (blue-green) - 'approved': 'rgb(207 250 254)', // cyan-100 - 'approved-dark': 'rgb(22 78 99 / 0.3)', // cyan-900/30 - - // Reviewer Accepted / In Review - Lime yellow-green - 'reviewer-accepted': 'rgb(236 252 203)', // lime-100 - 'reviewer-accepted-dark': 'rgb(54 83 20 / 0.3)', // lime-900/30 - - // Reviewed - Soft yellow - 'reviewed': 'rgb(254 240 138)', // yellow-200 - 'reviewed-dark': 'rgb(113 63 18 / 0.3)', // yellow-900/30 - - // Published - Fresh green - 'published': 'rgb(187 247 208)', // green-200 - 'published-dark': 'rgb(20 83 45 / 0.3)', // green-900/30 + backgroundImage: { + 'radio-checked': "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z' /%3E%3C/svg%3E\")", + 'checkbox-checked': "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E\")", }, colors: { - 'primary': '#22C55E', - 'inprogress': 'rgb(94 234 212)', + 'primary': '#22C55E', + 'inprogress': 'rgb(94 234 212)', 'released': 'rgb(52 211 153)', 'editor-accepted': 'rgb(125 211 252)', - 'approved': '#FFEB3B', //A lighter yellow, which is cheerful and can indicate that something is in a pending state. + 'approved': '#FFEB3B', //A lighter yellow, which is cheerful and can indicate that something is in a pending state. 'rejected-editor': '#f97316', 'rejected-reviewer': '#f97316', 'reviewed': '#FFC107', // warm amber, suggesting caution but still positive 'published': '#8BC34A', // lighter green, which is also fresh and positive - 'primary-dark': '#DCFCE7', - 'lime': { + 'primary-dark': '#DCFCE7', + 'lime': { DEFAULT: '#BFCE40', dark: 'rgba(5,46,55,0.7)', - 50: '#FBFCF7', + 50: '#FBFCF7', 100: '#F8FBE1', 200: '#EEF69E', 300: '#DCEC53', @@ -81,7 +40,7 @@ module.exports = { 700: '#357C06', 800: '#295B09', 900: '#20450A', - }, + }, }, fontFamily: { sans: ['Inter', ...defaultTheme.fontFamily.sans], @@ -147,7 +106,7 @@ module.exports = { { values: theme('asideScrollbars') }, ); }), - plugin(function ({ addUtilities }) { + plugin(function({ addUtilities }) { const newUtilities = { '.drag-none': { '-webkit-user-drag': 'none', @@ -156,10 +115,10 @@ module.exports = { '-o-user-drag': 'none', 'user-drag': 'none', }, - }; - addUtilities(newUtilities); + } + addUtilities(newUtilities) }), // As of Tailwind CSS v3.3, the `@tailwindcss/line-clamp` plugin is now included by default // require('@tailwindcss/line-clamp'), ], -}; +}; \ No newline at end of file