From 8510b8427f2f3830c08152409f41518ef78e54dc Mon Sep 17 00:00:00 2001 From: Hanna Date: Thu, 14 Nov 2024 15:38:15 +0200 Subject: [PATCH] merge try --- css/main.css | 141 +++++------ node_modules/uuid/README.md | 229 ++++++++++++------ node_modules/uuid/dist/esm-browser/parse.js | 41 +++- node_modules/uuid/dist/esm-browser/regex.js | 3 +- node_modules/uuid/dist/esm-browser/v35.js | 76 +++--- .../uuid/dist/esm-browser/validate.js | 5 +- node_modules/uuid/package.json | 122 +++++----- package.json | 4 +- sass/blocks/reviews.scss | 152 ++++++------ 9 files changed, 443 insertions(+), 330 deletions(-) diff --git a/css/main.css b/css/main.css index 080a7592..ead66805 100755 --- a/css/main.css +++ b/css/main.css @@ -2425,96 +2425,89 @@ header.main-header .menu-icon .line:last-child { transform: translateX(-10px); } -body { - font-family: Arial, sans-serif; - color: #333; - background-color: #f5f5f5; -} - -#reviews-container { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - gap: 20px; - margin: 40px auto; +/* Основні стилі для контейнера відгуків */ +#reviewsContainer { max-width: 800px; -} -#reviews-container .review-card { - background-color: #fff; - border: 1px solid #ccc; + margin: 0 auto; padding: 20px; - border-radius: 5px; - width: 100%; + background-color: #f9f9f9; + border-radius: 8px; -webkit-box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } -#reviews-container .review-card h3 { - margin: 0 0 10px; - color: #333; -} -#reviews-container .review-card p { - margin: 0; - color: #1a1a1a; -} -#reviews-container .review-card img { - max-width: 100px; - height: auto; - margin-top: 10px; -} -#add-review-section { +/* Стиль кожного окремого відгуку */ +.review { + border: 1px solid #ddd; + padding: 15px; + margin-bottom: 15px; + border-radius: 6px; background-color: #fff; - padding: 20px; - border-radius: 5px; - max-width: 800px; - margin: 20px auto; - -webkit-box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } -#add-review-section form { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - gap: 15px; + +/* Заголовок і текст відгуку */ +.review p { + margin: 5px 0; } -#add-review-section form label { + +.review strong { font-weight: bold; + color: #333; } -#add-review-section form input[type=text], -#add-review-section form textarea, -#add-review-section form input[type=file], -#add-review-section form button { - padding: 10px; - font-size: 16px; - border: 1px solid #ccc; - border-radius: 5px; - width: 100%; -} -#add-review-section form textarea { - resize: vertical; - min-height: 100px; -} -#add-review-section form button { - background-color: #333; - color: #fff; + +/* Додаткові стилі для кнопок в адмін-панелі */ +button { + background-color: #4CAF50; + color: white; border: none; + padding: 8px 12px; + border-radius: 4px; cursor: pointer; + font-size: 14px; -webkit-transition: background-color 0.3s; transition: background-color 0.3s; } -#add-review-section form button:hover { - background-color: #ffa500; + +button:hover { + background-color: #45a049; +} + +/* Стиль для заголовків сторінки */ +h1 { + text-align: center; + color: #333; + font-size: 24px; + margin-top: 20px; +} + +#successMessage { + text-align: center; + color: #4CAF50; + font-weight: bold; + display: none; /* Спочатку прихований */ + margin-bottom: 20px; +} + +/* Додаємо відступи для полів введення в формі (якщо форма є на сторінці) */ +input[type=text], textarea { + width: 100%; + padding: 8px; + margin-top: 5px; + margin-bottom: 10px; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +/* Стиль для кнопки відправки відгуку */ +button[type=submit] { + background-color: #008CBA; + color: white; +} + +button[type=submit]:hover { + background-color: #007B9A; } @media screen and (max-width: 1280px) { diff --git a/node_modules/uuid/README.md b/node_modules/uuid/README.md index 82349bfa..b9079b69 100644 --- a/node_modules/uuid/README.md +++ b/node_modules/uuid/README.md @@ -7,42 +7,43 @@ For the creation of [RFC9562](https://www.rfc-editor.org/rfc/rfc9562.html) (formally [RFC4122](https://www.rfc-editor.org/rfc/rfc4122.html)) UUIDs -- **Complete** - Support for all RFC9562 UUID versions +- **Complete** - Support for all RFC9562 (nee RFC4122) UUID versions - **Cross-platform** - Support for ... - - CommonJS, [ECMAScript Modules](#ecmascript-modules) + - CommonJS, [ECMAScript Modules](#ecmascript-modules) and [CDN builds](#cdn-builds) - NodeJS 16+ ([LTS releases](https://github.com/nodejs/Release)) - Chrome, Safari, Firefox, Edge browsers + - Webpack and rollup.js module bundlers - [React Native / Expo](#react-native--expo) - **Secure** - Cryptographically-strong random values -- **Compact** - No dependencies, [tree-shakable](https://developer.mozilla.org/en-US/docs/Glossary/Tree_shaking) +- **Small** - Zero-dependency, small footprint, plays nice with "tree shaking" packagers - **CLI** - Includes the [`uuid` command line](#command-line) utility -- **Typescript** - Types now included > [!NOTE] -w> `uuid@11` is now available: See the [CHANGELOG](./CHANGELOG.md) for details. TL;DR: -> * TypeScript support is now included (remove `@types/uuid` from your dependencies) -> * Subtle changes to how the `options` arg is interpreted for `v1()`, `v6()`, and `v7()`. [See details](#options-handling-for-timestamp-uuids) -> * Binary UUIDs are now `Uint8Array`s. (May impact callers of `parse()`, `stringify()`, or that pass an `option#buf` argument to `v1()`-`v7()`.) +> Upgrading from `uuid@3`? Your code is probably okay, but check out [Upgrading From `uuid@3`](#upgrading-from-uuid3) for details. + + +> [!NOTE] +> Only interested in creating a version 4 UUID? You might be able to use [`crypto.randomUUID()`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID), eliminating the need to install this library. ## Quickstart +To create a random UUID... + **1. Install** ```shell npm install uuid ``` -**2. Create a UUID** - -ESM-syntax (must use named exports): +**2. Create a UUID** (ES6 module syntax) ```javascript import { v4 as uuidv4 } from 'uuid'; uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' ``` -... CommonJS: +... or using CommonJS syntax: ```javascript const { v4: uuidv4 } = require('uuid'); @@ -117,12 +118,15 @@ Example: import { parse as uuidParse } from 'uuid'; // Parse a UUID -uuidParse('6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b'); // ⇨ - // Uint8Array(16) [ - // 110, 192, 189, 127, 17, - // 192, 67, 218, 151, 94, - // 42, 138, 217, 235, 174, - // 11 +const bytes = uuidParse('6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b'); + +// Convert to hex strings to show byte order (for documentation purposes) +[...bytes].map((v) => v.toString(16).padStart(2, '0')); // ⇨ + // [ + // '6e', 'c0', 'bd', '7f', + // '11', 'c0', '43', 'da', + // '97', '5e', '2a', '8a', + // 'd9', 'eb', 'ae', '0b' // ] ``` @@ -146,24 +150,9 @@ Example: ```javascript import { stringify as uuidStringify } from 'uuid'; -const uuidBytes = Uint8Array.of( - 0x6e, - 0xc0, - 0xbd, - 0x7f, - 0x11, - 0xc0, - 0x43, - 0xda, - 0x97, - 0x5e, - 0x2a, - 0x8a, - 0xd9, - 0xeb, - 0xae, - 0x0b -); +const uuidBytes = [ + 0x6e, 0xc0, 0xbd, 0x7f, 0x11, 0xc0, 0x43, 0xda, 0x97, 0x5e, 0x2a, 0x8a, 0xd9, 0xeb, 0xae, 0x0b, +]; uuidStringify(uuidBytes); // ⇨ '6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b' ``` @@ -175,11 +164,11 @@ Create an RFC version 1 (timestamp) UUID | | | | --- | --- | | [`options`] | `Object` with one or more of the following properties: | -| [`options.node = (random)` ] | RFC "node" field as an `Array[6]` of byte values (per 4.1.6) | -| [`options.clockseq = (random)`] | RFC "clock sequence" as a `Number` between 0 - 0x3fff | -| [`options.msecs = (current time)`] | RFC "timestamp" field (`Number` of milliseconds, unix epoch) | -| [`options.nsecs = 0`] | RFC "timestamp" field (`Number` of nanoseconds to add to `msecs`, should be 0-10,000) | -| [`options.random = (random)`] | `Array` of 16 random bytes (0-255) used to generate other fields, above | +| [`options.node` ] | RFC "node" field as an `Array[6]` of byte values (per 4.1.6) | +| [`options.clockseq`] | RFC "clock sequence" as a `Number` between 0 - 0x3fff | +| [`options.msecs`] | RFC "timestamp" field (`Number` of milliseconds, unix epoch) | +| [`options.nsecs`] | RFC "timestamp" field (`Number` of nanoseconds to add to `msecs`, should be 0-10,000) | +| [`options.random`] | `Array` of 16 random bytes (0-255) | | [`options.rng`] | Alternative to `options.random`, a `Function` that returns an `Array` of 16 random bytes (0-255) | | [`buffer`] | `Array \| Buffer` If specified, uuid will be written here in byte-form, starting at `offset` | | [`offset` = 0] | `Number` Index to start writing UUID bytes in `buffer` | @@ -199,7 +188,7 @@ Example: ```javascript import { v1 as uuidv1 } from 'uuid'; -uuidv1(); // ⇨ '2c5ea4c0-4067-11e9-9bdd-2b0d7b3dcb6d' +uuidv1(); // ⇨ '2c5ea4c0-4067-11e9-8bad-9b1deb4d3b7d' ``` Example using `options`: @@ -208,7 +197,7 @@ Example using `options`: import { v1 as uuidv1 } from 'uuid'; const options = { - node: Uint8Array.of(0x01, 0x23, 0x45, 0x67, 0x89, 0xab), + node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab], clockseq: 0x1234, msecs: new Date('2011-11-01').getTime(), nsecs: 5678, @@ -254,7 +243,7 @@ Example: ```javascript import { v4 as uuidv4 } from 'uuid'; -uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' +uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed' ``` Example using predefined `random` values: @@ -263,24 +252,9 @@ Example using predefined `random` values: import { v4 as uuidv4 } from 'uuid'; const v4options = { - random: Uint8Array.of( - 0x10, - 0x91, - 0x56, - 0xbe, - 0xc4, - 0xfb, - 0xc1, - 0xea, - 0x71, - 0xb4, - 0xef, - 0xe1, - 0x67, - 0x1c, - 0x58, - 0x36 - ), + random: [ + 0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea, 0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36, + ], }; uuidv4(v4options); // ⇨ '109156be-c4fb-41ea-b1b4-efe1671c5836' ``` @@ -330,7 +304,7 @@ This method takes the same arguments as uuid.v1(). ```javascript import { v6 as uuidv6 } from 'uuid'; -uuidv6(); // ⇨ '1e940672-c5ea-64c0-9b5d-ab8dfbbd4bed' +uuidv6(); // ⇨ '1e940672-c5ea-64c0-8bad-9b1deb4d3b7d' ``` Example using `options`: @@ -364,10 +338,10 @@ Create an RFC version 7 (random) UUID | | | | --- | --- | | [`options`] | `Object` with one or more of the following properties: | -| [`options.msecs = (current time)`] | RFC "timestamp" field (`Number` of milliseconds, unix epoch) | -| [`options.random = (random)`] | `Array` of 16 random bytes (0-255) used to generate other fields, above | +| [`options.msecs`] | RFC "timestamp" field (`Number` of milliseconds, unix epoch) | +| [`options.random`] | `Array` of 16 random bytes (0-255) | | [`options.rng`] | Alternative to `options.random`, a `Function` that returns an `Array` of 16 random bytes (0-255) | -| [`options.seq = (random)`] | 32-bit sequence `Number` between 0 - 0xffffffff. This may be provided to help insure uniqueness for UUIDs generated within the same millisecond time interval. Default = random value. | +| [`options.seq`] | 31 bit monotonic sequence counter as `Number` between 0 - 0x7fffffff | | [`buffer`] | `Array \| Buffer` If specified, uuid will be written here in byte-form, starting at `offset` | | [`offset` = 0] | `Number` Index to start writing UUID bytes in `buffer` | | _returns_ | UUID `String` if no `buffer` is specified, otherwise returns `buffer` | @@ -377,7 +351,7 @@ Example: ```javascript import { v7 as uuidv7 } from 'uuid'; -uuidv7(); // ⇨ '01695553-c90c-705a-b56d-778dfbbd4bed' +uuidv7(); // ⇨ '01695553-c90c-722d-9b5d-b38dfbbd4bed' ``` ### ~~uuid.v8()~~ @@ -473,15 +447,53 @@ Note: may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC9562 ``` -## `options` Handling for Timestamp UUIDs +## ECMAScript Modules + +This library comes with [ECMAScript Modules](https://www.ecma-international.org/ecma-262/6.0/#sec-modules) (ESM) support for Node.js versions that support it ([example](./examples/node-esmodules/)) as well as bundlers like [rollup.js](https://rollupjs.org/guide/en/#tree-shaking) ([example](./examples/browser-rollup/)) and [webpack](https://webpack.js.org/guides/tree-shaking/) ([example](./examples/browser-webpack/)) (targeting both, Node.js and browser environments). + +```javascript +import { v4 as uuidv4 } from 'uuid'; +uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed' +``` + +To run the examples you must first create a dist build of this library in the module root: + +```shell +npm run build +``` + +## CDN Builds + +### ECMAScript Modules + +To load this module directly into modern browsers that [support loading ECMAScript Modules](https://caniuse.com/#feat=es6-module) you can make use of [jspm](https://jspm.org/): + +```html + +``` + +### UMD -Prior to `uuid@11`, it was possible for `options` state to interfere with the internal state used to insure uniqueness of timestamp-based UUIDs (the `v1()`, `v6()`, and `v7()` methods). Starting with `uuid@11`, this issue has been addressed by using the presence of the `options` argument as a flag to select between two possible behaviors: +As of `uuid@9` [UMD (Universal Module Definition)](https://github.com/umdjs/umd) builds are no longer shipped with this library. -- Without `options`: Internal state is utilized to improve UUID uniqueness. -- With `options`: Internal state is **NOT** used and, instead, appropriate defaults are applied as needed. +If you need a UMD build of this library, use a bundler like Webpack or Rollup. Alternatively, refer to the documentation of [`uuid@8.3.2`](https://github.com/uuidjs/uuid/blob/v8.3.2/README.md#umd) which was the last version that shipped UMD builds. ## Known issues +### Duplicate UUIDs (Googlebot) + +This module may generate duplicate UUIDs when run in clients with _deterministic_ random number generators, such as [Googlebot crawlers](https://developers.google.com/search/docs/advanced/crawling/overview-google-crawlers). This can cause problems for apps that expect client-generated UUIDs to always be unique. Developers should be prepared for this and have a strategy for dealing with possible collisions, such as: + +- Check for duplicate UUIDs, fail gracefully +- Disable write operations for Googlebot clients + +### "getRandomValues() not supported" + +This error occurs in environments where the standard [`crypto.getRandomValues()`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues) API is not supported. This issue can be resolved by adding an appropriate polyfill: + ### React Native / Expo 1. Install [`react-native-get-random-values`](https://github.com/LinusU/react-native-get-random-values#readme) @@ -492,6 +504,81 @@ import 'react-native-get-random-values'; import { v4 as uuidv4 } from 'uuid'; ``` + +> [!NOTE] +> If you are using Expo, you must be using at least `react-native-get-random-values@1.5.0` and `expo@39.0.0`. + +### Web Workers / Service Workers (Edge <= 18) + +[In Edge <= 18, Web Crypto is not supported in Web Workers or Service Workers](https://caniuse.com/#feat=cryptography) and we are not aware of a polyfill (let us know if you find one, please). + +### IE 11 (Internet Explorer) + +Support for IE11 and other legacy browsers has been dropped as of `uuid@9`. If you need to support legacy browsers, you can always transpile the uuid module source yourself (e.g. using [Babel](https://babeljs.io/)). + +## Upgrading From `uuid@7` + +### Only Named Exports Supported When Using with Node.js ESM + +`uuid@7` did not come with native ECMAScript Module (ESM) support for Node.js. Importing it in Node.js ESM consequently imported the CommonJS source with a default export. This library now comes with true Node.js ESM support and only provides named exports. + +Instead of doing: + +```javascript +import uuid from 'uuid'; +uuid.v4(); +``` + +you will now have to use the named exports: + +```javascript +import { v4 as uuidv4 } from 'uuid'; +uuidv4(); +``` + +### Deep Requires No Longer Supported + +Deep requires like `require('uuid/v4')` [which have been deprecated in `uuid@7`](#deep-requires-now-deprecated) are no longer supported. + +## Upgrading From `uuid@3` + +"_Wait... what happened to `uuid@4` thru `uuid@6`?!?_" + +In order to avoid confusion with RFC [version 4](#uuidv4options-buffer-offset) and [version 5](#uuidv5name-namespace-buffer-offset) UUIDs, and a possible [version 6](http://gh.peabody.io/uuidv6/), releases 4 thru 6 of this module have been skipped. + +### Deep Requires Now Deprecated + +`uuid@3` encouraged the use of deep requires to minimize the bundle size of browser builds: + +```javascript +const uuidv4 = require('uuid/v4'); // <== NOW DEPRECATED! +uuidv4(); +``` + +As of `uuid@7` this library now provides ECMAScript modules builds, which allow packagers like Webpack and Rollup to do "tree-shaking" to remove dead code. Instead, use the `import` syntax: + +```javascript +import { v4 as uuidv4 } from 'uuid'; +uuidv4(); +``` + +... or for CommonJS: + +```javascript +const { v4: uuidv4 } = require('uuid'); +uuidv4(); +``` + +### Default Export Removed + +`uuid@3` was exporting the Version 4 UUID method as a default export: + +```javascript +const uuid = require('uuid'); // <== REMOVED! +``` + +This usage pattern was already discouraged in `uuid@3` and has been removed in `uuid@7`. + --- Markdown generated from [README_js.md](README_js.md) by diff --git a/node_modules/uuid/dist/esm-browser/parse.js b/node_modules/uuid/dist/esm-browser/parse.js index 0ac9e131..87588317 100644 --- a/node_modules/uuid/dist/esm-browser/parse.js +++ b/node_modules/uuid/dist/esm-browser/parse.js @@ -1,10 +1,37 @@ import validate from './validate.js'; function parse(uuid) { - if (!validate(uuid)) { - throw TypeError('Invalid UUID'); - } - let v; - return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff); + if (!validate(uuid)) { + throw TypeError('Invalid UUID'); + } + var v; + var arr = new Uint8Array(16); + + // Parse ########-....-....-....-............ + arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; + arr[1] = v >>> 16 & 0xff; + arr[2] = v >>> 8 & 0xff; + arr[3] = v & 0xff; + + // Parse ........-####-....-....-............ + arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; + arr[5] = v & 0xff; + + // Parse ........-....-####-....-............ + arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; + arr[7] = v & 0xff; + + // Parse ........-....-....-####-............ + arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; + arr[9] = v & 0xff; + + // Parse ........-....-....-....-############ + // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) + arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; + arr[11] = v / 0x100000000 & 0xff; + arr[12] = v >>> 24 & 0xff; + arr[13] = v >>> 16 & 0xff; + arr[14] = v >>> 8 & 0xff; + arr[15] = v & 0xff; + return arr; } -export default parse; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxRQUFRLE1BQU0sZUFBZSxDQUFDO0FBRXJDLFNBQVMsS0FBSyxDQUFDLElBQVk7SUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLENBQUMsQ0FBQztJQUNOLE9BQU8sVUFBVSxDQUFDLEVBQUUsQ0FDbEIsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUMzQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQ2pCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksRUFDaEIsQ0FBQyxHQUFHLElBQUksRUFHUixDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQzNDLENBQUMsR0FBRyxJQUFJLEVBR1IsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUM1QyxDQUFDLEdBQUcsSUFBSSxFQUdSLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFDNUMsQ0FBQyxHQUFHLElBQUksRUFJUixDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLElBQUksRUFDL0QsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsSUFBSSxFQUN4QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQ2pCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFDakIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUNoQixDQUFDLEdBQUcsSUFBSSxDQUNULENBQUM7QUFDSixDQUFDO0FBRUQsZUFBZSxLQUFLLENBQUMifQ== \ No newline at end of file +export default parse; \ No newline at end of file diff --git a/node_modules/uuid/dist/esm-browser/regex.js b/node_modules/uuid/dist/esm-browser/regex.js index efea2497..848a1fea 100644 --- a/node_modules/uuid/dist/esm-browser/regex.js +++ b/node_modules/uuid/dist/esm-browser/regex.js @@ -1,2 +1 @@ -export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSwwSkFBMEosQ0FBQyJ9 \ No newline at end of file +export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i; \ No newline at end of file diff --git a/node_modules/uuid/dist/esm-browser/v35.js b/node_modules/uuid/dist/esm-browser/v35.js index eb521626..e5fd93fb 100644 --- a/node_modules/uuid/dist/esm-browser/v35.js +++ b/node_modules/uuid/dist/esm-browser/v35.js @@ -1,37 +1,55 @@ -import parse from './parse.js'; import { unsafeStringify } from './stringify.js'; -export function stringToBytes(str) { - str = unescape(encodeURIComponent(str)); - const bytes = new Uint8Array(str.length); - for (let i = 0; i < str.length; ++i) { - bytes[i] = str.charCodeAt(i); - } - return bytes; +import parse from './parse.js'; +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + + var bytes = []; + for (var i = 0; i < str.length; ++i) { + bytes.push(str.charCodeAt(i)); + } + return bytes; } -export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; -export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; -export default function v35(version, hash, value, namespace, buf, offset) { - const valueBytes = typeof value === 'string' ? stringToBytes(value) : value; - const namespaceBytes = typeof namespace === 'string' ? parse(namespace) : namespace; +export var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +export var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +export default function v35(name, version, hashfunc) { + function generateUUID(value, namespace, buf, offset) { + var _namespace; + if (typeof value === 'string') { + value = stringToBytes(value); + } if (typeof namespace === 'string') { - namespace = parse(namespace); + namespace = parse(namespace); } - if (namespace?.length !== 16) { - throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); } - let bytes = new Uint8Array(16 + valueBytes.length); - bytes.set(namespaceBytes); - bytes.set(valueBytes, namespaceBytes.length); - bytes = hash(bytes); - bytes[6] = (bytes[6] & 0x0f) | version; - bytes[8] = (bytes[8] & 0x3f) | 0x80; + + // Compute hash of namespace and value, Per 4.3 + // Future: Use spread syntax when supported on all platforms, e.g. `bytes = + // hashfunc([...namespace, ... value])` + var bytes = new Uint8Array(16 + value.length); + bytes.set(namespace); + bytes.set(value, namespace.length); + bytes = hashfunc(bytes); + bytes[6] = bytes[6] & 0x0f | version; + bytes[8] = bytes[8] & 0x3f | 0x80; if (buf) { - offset = offset || 0; - for (let i = 0; i < 16; ++i) { - buf[offset + i] = bytes[i]; - } - return buf; + offset = offset || 0; + for (var i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + return buf; } return unsafeStringify(bytes); -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjM1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3YzNS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVztJQUV2QyxHQUFHLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXpDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDcEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxzQ0FBc0MsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsc0NBQXNDLENBQUM7QUFJMUQsTUFBTSxDQUFDLE9BQU8sVUFBVSxHQUFHLENBQ3pCLE9BQW9CLEVBQ3BCLElBQWtCLEVBQ2xCLEtBQTBCLEVBQzFCLFNBQW9CLEVBQ3BCLEdBQWdCLEVBQ2hCLE1BQWU7SUFFZixNQUFNLFVBQVUsR0FBZSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3hGLE1BQU0sY0FBYyxHQUFlLE9BQU8sU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFaEcsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLFNBQVMsRUFBRSxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxTQUFTLENBQUMsa0VBQWtFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBS0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuRCxLQUFLLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFCLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDdkMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUVwQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFFckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxDQUFDIn0= \ No newline at end of file + } + + // Function#name is not settable on some platforms (#270) + try { + generateUUID.name = name; + } catch (err) {} + + // For CommonJS default export support + generateUUID.DNS = DNS; + generateUUID.URL = URL; + return generateUUID; +} \ No newline at end of file diff --git a/node_modules/uuid/dist/esm-browser/validate.js b/node_modules/uuid/dist/esm-browser/validate.js index d14811a7..6e40fa58 100644 --- a/node_modules/uuid/dist/esm-browser/validate.js +++ b/node_modules/uuid/dist/esm-browser/validate.js @@ -1,6 +1,5 @@ import REGEX from './regex.js'; function validate(uuid) { - return typeof uuid === 'string' && REGEX.test(uuid); + return typeof uuid === 'string' && REGEX.test(uuid); } -export default validate; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRS9CLFNBQVMsUUFBUSxDQUFDLElBQWE7SUFDN0IsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsZUFBZSxRQUFRLENBQUMifQ== \ No newline at end of file +export default validate; \ No newline at end of file diff --git a/node_modules/uuid/package.json b/node_modules/uuid/package.json index 3bf0fdc4..dea12c6e 100644 --- a/node_modules/uuid/package.json +++ b/node_modules/uuid/package.json @@ -1,8 +1,7 @@ { "name": "uuid", - "version": "11.0.2", + "version": "10.0.0", "description": "RFC9562 UUIDs", - "type": "module", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -20,102 +19,111 @@ ], "license": "MIT", "bin": { - "uuid": "./dist/esm/bin/uuid" + "uuid": "dist/bin/uuid" }, "sideEffects": false, - "main": "./dist/cjs/index.js", + "main": "./dist/index.js", "exports": { ".": { "node": { - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js" + "module": "./dist/esm-node/index.js", + "require": "./dist/index.js", + "import": "./wrapper.mjs" }, "browser": { "import": "./dist/esm-browser/index.js", - "require": "./dist/cjs-browser/index.js" + "require": "./dist/commonjs-browser/index.js" }, "default": "./dist/esm-browser/index.js" }, "./package.json": "./package.json" }, - "module": "./dist/esm/index.js", + "module": "./dist/esm-node/index.js", "browser": { - "./dist/esm/index.js": "./dist/esm-browser/index.js", - "./dist/cjs/index.js": "./dist/cjs-browser/index.js" + "./dist/esm-node/index.js": "./dist/esm-browser/index.js", + "./dist/md5.js": "./dist/md5-browser.js", + "./dist/native.js": "./dist/native-browser.js", + "./dist/rng.js": "./dist/rng-browser.js", + "./dist/sha1.js": "./dist/sha1-browser.js" }, "files": [ "CHANGELOG.md", "CONTRIBUTING.md", "LICENSE.md", "README.md", - "dist" + "dist", + "wrapper.mjs" ], "devDependencies": { - "@babel/eslint-parser": "7.25.9", - "@commitlint/cli": "19.5.0", - "@commitlint/config-conventional": "19.5.0", - "@eslint/js": "9.13.0", - "@types/eslint__js": "8.42.3", - "bundlewatch": "0.4.0", - "eslint": "9.13.0", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-prettier": "5.2.1", - "globals": "15.11.0", - "husky": "9.1.6", + "@babel/cli": "7.24.6", + "@babel/core": "7.24.6", + "@babel/eslint-parser": "7.24.6", + "@babel/plugin-syntax-import-attributes": "7.24.6", + "@babel/preset-env": "7.24.6", + "@commitlint/cli": "19.3.0", + "@commitlint/config-conventional": "19.2.2", + "@wdio/browserstack-service": "7.16.10", + "@wdio/cli": "7.16.10", + "@wdio/jasmine-framework": "7.16.6", + "@wdio/local-runner": "7.16.10", + "@wdio/spec-reporter": "7.16.9", + "@wdio/static-server-service": "7.16.6", + "bundlewatch": "0.3.3", + "eslint": "9.4.0", + "eslint-plugin-prettier": "5.1.3", + "globals": "15.3.0", + "husky": "9.0.11", "jest": "29.7.0", - "lint-staged": "15.2.10", - "neostandard": "0.11.7", + "lint-staged": "15.2.5", + "neostandard": "0.5.1", "npm-run-all": "4.1.5", "optional-dev-dependency": "2.0.1", - "prettier": "3.3.3", - "release-please": "16.14.3", + "prettier": "3.3.0", + "random-seed": "0.3.0", "runmd": "1.3.9", - "standard-version": "9.5.0", - "typescript": "5.6.3", - "typescript-eslint": "8.11.0" + "standard-version": "9.5.0" }, "optionalDevDependencies": { - "@wdio/browserstack-service": "9.2.1", - "@wdio/cli": "9.2.1", - "@wdio/jasmine-framework": "9.2.1", - "@wdio/local-runner": "9.2.1", - "@wdio/spec-reporter": "9.1.3", - "@wdio/static-server-service": "9.1.3" + "@wdio/browserstack-service": "7.16.10", + "@wdio/cli": "7.16.10", + "@wdio/jasmine-framework": "7.16.6", + "@wdio/local-runner": "7.16.10", + "@wdio/spec-reporter": "7.16.9", + "@wdio/static-server-service": "7.16.6" }, "scripts": { - "build": "./scripts/build.sh", - "build:watch": "tsc --watch -p tsconfig.esm.json", - "bundlewatch": "npm run pretest:browser && bundlewatch --config bundlewatch.config.json", - "docs:diff": "npm run docs && git diff --quiet README.md", - "docs": "npm run build && npx runmd --output=README.md README_js.md", - "eslint:check": "eslint src/ test/ examples/ *.[jt]s", - "eslint:fix": "eslint --fix src/ test/ examples/ *.[jt]s", - "examples:browser:rollup:build": "cd examples/browser-rollup && npm install && npm run build", "examples:browser:webpack:build": "cd examples/browser-webpack && npm install && npm run build", + "examples:browser:rollup:build": "cd examples/browser-rollup && npm install && npm run build", "examples:node:commonjs:test": "cd examples/node-commonjs && npm install && npm test", "examples:node:esmodules:test": "cd examples/node-esmodules && npm install && npm test", "examples:node:jest:test": "cd examples/node-jest && npm install && npm test", + "prepare": "husky install", "lint": "npm run eslint:check && npm run prettier:check", - "md": "runmd --watch --output=README.md README_js.md", - "prepack": "npm run build", - "prepare": "husky", - "pretest:benchmark": "npm run build", - "pretest:browser": "optional-dev-dependency && npm run build && npm-run-all --parallel examples:browser:**", - "pretest:node": "npm run build", + "eslint:check": "eslint src/ test/ examples/ *.js", + "eslint:fix": "eslint --fix src/ test/ examples/ *.js", "pretest": "npm run build", - "prettier:check": "prettier --check .", - "prettier:fix": "prettier --write .", - "release": "standard-version --no-verify", - "test:benchmark": "cd examples/benchmark && HUSKY=0 npm install && npm test", + "test": "BABEL_ENV=commonjsNode node --throw-deprecation node_modules/.bin/jest test/unit/", + "test:matching": "BABEL_ENV=commonjsNode node --throw-deprecation node_modules/.bin/jest test/unit/ -t", + "pretest:browser": "optional-dev-dependency && npm run build && npm-run-all --parallel examples:browser:**", "test:browser": "wdio run ./wdio.conf.js", + "pretest:node": "npm run build", "test:node": "npm-run-all --parallel examples:node:**", "test:pack": "./scripts/testpack.sh", - "test:watch": "node --test --enable-source-maps --watch dist/esm/test/*.js", - "test": "node --test --enable-source-maps dist/esm/test/*.js" + "pretest:benchmark": "npm run build", + "test:benchmark": "cd examples/benchmark && HUSKY=0 npm install && npm test", + "prettier:check": "prettier --check .", + "prettier:fix": "prettier --write .", + "bundlewatch": "npm run pretest:browser && bundlewatch --config bundlewatch.config.json", + "md": "runmd --watch --output=README.md README_js.md", + "docs": "npm run build && npx runmd --output=README.md README_js.md", + "docs:diff": "npm run docs && git diff --quiet README.md", + "build": "./scripts/build.sh", + "prepack": "npm run build", + "release": "standard-version --no-verify" }, "repository": { "type": "git", - "url": "https://github.com/uuidjs/uuid.git" + "url": "git+https://github.com/uuidjs/uuid.git" }, "lint-staged": { "*": [ @@ -130,5 +138,5 @@ "postchangelog": "prettier --write CHANGELOG.md" } }, - "packageManager": "npm@10.9.0" + "packageManager": "npm@10.8.1+sha256.b8807aebb9656758e2872fa6e7c564b506aa2faa9297439a478d471d2fe32483" } diff --git a/package.json b/package.json index c0f3b06c..4329482c 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,10 @@ "dependencies": { "@google-cloud/storage": "^7.14.0", "cors": "^2.8.5", - "depd": "^2.0.0", "dotenv": "^16.4.5", "express": "^4.21.1", "firebase": "^11.0.1", "firebase-admin": "^12.7.0", - "multer": "^1.4.5-lts.1", - "uuid": "^11.0.2" + "multer": "^1.4.5-lts.1" } } diff --git a/sass/blocks/reviews.scss b/sass/blocks/reviews.scss index a4b5e706..3857b393 100644 --- a/sass/blocks/reviews.scss +++ b/sass/blocks/reviews.scss @@ -1,97 +1,81 @@ -// Основні налаштування -$primary-color: #333; -$secondary-color: #ffa500; -$background-color: #f5f5f5; -$text-color: #333; -$border-color: #ccc; -$shadow-color: rgba(0, 0, 0, 0.1); - -// Основні стилі сторінки -body { - font-family: Arial, sans-serif; - color: $text-color; - background-color: $background-color; +/* Основні стилі для контейнера відгуків */ +#reviewsContainer { + max-width: 800px; + margin: 0 auto; + padding: 20px; + background-color: #f9f9f9; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } -// Контейнер для відгуків -#reviews-container { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; - margin: 40px auto; - max-width: 800px; - - .review-card { - background-color: #fff; - border: 1px solid $border-color; - padding: 20px; - border-radius: 5px; - width: 100%; - box-shadow: 0 4px 8px $shadow-color; - - h3 { - margin: 0 0 10px; - color: $text-color; - } +/* Стиль кожного окремого відгуку */ +.review { + border: 1px solid #ddd; + padding: 15px; + margin-bottom: 15px; + border-radius: 6px; + background-color: #fff; +} - p { - margin: 0; - color: darken($text-color, 10%); - } +/* Заголовок і текст відгуку */ +.review p { + margin: 5px 0; +} - img { - max-width: 100px; - height: auto; - margin-top: 10px; - } - } +.review strong { + font-weight: bold; + color: #333; } -// Форма додавання відгуку -#add-review-section { - background-color: #fff; - padding: 20px; - border-radius: 5px; - max-width: 800px; - margin: 20px auto; - box-shadow: 0 4px 8px $shadow-color; +/* Додаткові стилі для кнопок в адмін-панелі */ +button { + background-color: #4CAF50; + color: white; + border: none; + padding: 8px 12px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; + transition: background-color 0.3s; +} - form { - display: flex; - flex-direction: column; - gap: 15px; +button:hover { + background-color: #45a049; +} - label { - font-weight: bold; - } +/* Стиль для заголовків сторінки */ +h1 { + text-align: center; + color: #333; + font-size: 24px; + margin-top: 20px; +} - input[type="text"], - textarea, - input[type="file"], - button { - padding: 10px; - font-size: 16px; - border: 1px solid $border-color; - border-radius: 5px; - width: 100%; - } +#successMessage { + text-align: center; + color: #4CAF50; + font-weight: bold; + display: none; /* Спочатку прихований */ + margin-bottom: 20px; +} - textarea { - resize: vertical; - min-height: 100px; - } +/* Додаємо відступи для полів введення в формі (якщо форма є на сторінці) */ +input[type="text"], textarea { + width: 100%; + padding: 8px; + margin-top: 5px; + margin-bottom: 10px; + border: 1px solid #ddd; + border-radius: 4px; + box-sizing: border-box; +} - button { - background-color: $primary-color; - color: #fff; - border: none; - cursor: pointer; - transition: background-color 0.3s; +/* Стиль для кнопки відправки відгуку */ +button[type="submit"] { + background-color: #008CBA; + color: white; +} - &:hover { - background-color: $secondary-color; - } - } - } +button[type="submit"]:hover { + background-color: #007B9A; }